empty inside
parent
0c8065f390
commit
6e9ba1091f
Binary file not shown.
|
@ -73,3 +73,7 @@
|
|||
1177 1269 1699239246742802185 AssignmentProject b2c28a88f620cb6b
|
||||
1 1215 1699239290003321502 CMakeFiles/AssignmentProject.dir/src/main.cpp.o 2b6a871f4782c17
|
||||
1215 1306 1699239290095322610 AssignmentProject b2c28a88f620cb6b
|
||||
1 332 1699249408404357031 libraries/BLT/CMakeFiles/BLT.dir/src/blt/std/filesystem.cpp.o 9cc43f95baec43fd
|
||||
1 1078 1699249409148366620 CMakeFiles/AssignmentProject.dir/src/main.cpp.o 2b6a871f4782c17
|
||||
333 1522 1699249409584372239 libraries/BLT/libBLT.a fff5a821b8ed7db
|
||||
1522 1615 1699249409684373529 AssignmentProject b2c28a88f620cb6b
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,3 +1,3 @@
|
|||
Start testing: Nov 05 21:54 EST
|
||||
Start testing: Nov 06 00:43 EST
|
||||
----------------------------------------------------------
|
||||
End testing: Nov 05 21:54 EST
|
||||
End testing: Nov 06 00:43 EST
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 288076ed02c7735cef394d10e923a246ef9a769c
|
||||
Subproject commit 1a72728aeb9299d168868bb1c79f319031d9d8a1
|
100
src/main.cpp
100
src/main.cpp
|
@ -35,63 +35,55 @@
|
|||
|
||||
constexpr size_t PACKET_SIZE = 512;
|
||||
|
||||
// header:
|
||||
// 1 byte type
|
||||
// 0: data send
|
||||
// 1: data ack
|
||||
// 2: data resend
|
||||
// 3:
|
||||
// 8 bytes send_id
|
||||
// 8 bytes recv_id
|
||||
|
||||
constexpr size_t HEADER_SIZE = 32;
|
||||
|
||||
class packet
|
||||
{
|
||||
private:
|
||||
std::uint8_t* buffer = new std::uint8_t[PACKET_SIZE];
|
||||
protected:
|
||||
blt::scoped_buffer<std::uint8_t> buffer;
|
||||
public:
|
||||
packet(): buffer(PACKET_SIZE)
|
||||
{}
|
||||
|
||||
explicit packet(size_t size): buffer(size)
|
||||
{}
|
||||
|
||||
size_t used = 0;
|
||||
|
||||
packet() = default;
|
||||
packet(const packet& copy) = default;
|
||||
|
||||
packet(const packet& copy)
|
||||
{
|
||||
for (size_t i = 0; i < PACKET_SIZE; i++)
|
||||
buffer[i] = copy[i];
|
||||
used = copy.used;
|
||||
}
|
||||
packet(packet&& move) noexcept = default;
|
||||
|
||||
packet(packet&& move) noexcept
|
||||
{
|
||||
delete[] buffer;
|
||||
buffer = move.buffer;
|
||||
used = move.used;
|
||||
move.buffer = nullptr;
|
||||
}
|
||||
packet& operator=(const packet& copy) = default;
|
||||
|
||||
packet& operator=(const packet& copy)
|
||||
{
|
||||
if (© == this)
|
||||
return *this;
|
||||
for (size_t i = 0; i < PACKET_SIZE; i++)
|
||||
buffer[i] = copy[i];
|
||||
used = copy.used;
|
||||
return *this;
|
||||
}
|
||||
|
||||
packet& operator=(packet&& move) noexcept
|
||||
{
|
||||
delete[] buffer;
|
||||
buffer = move.buffer;
|
||||
move.buffer = nullptr;
|
||||
used = move.used;
|
||||
return *this;
|
||||
}
|
||||
packet& operator=(packet&& move) noexcept = default;
|
||||
|
||||
std::uint8_t* data()
|
||||
{
|
||||
return buffer;
|
||||
return buffer.data();
|
||||
}
|
||||
|
||||
[[nodiscard]] const std::uint8_t* data() const
|
||||
{
|
||||
return buffer.data();
|
||||
}
|
||||
|
||||
std::uint8_t& operator[](size_t index)
|
||||
{
|
||||
BLT_ASSERT(index < PACKET_SIZE);
|
||||
return buffer[index];
|
||||
}
|
||||
|
||||
[[nodiscard]] const std::uint8_t& operator[](size_t index) const
|
||||
{
|
||||
BLT_ASSERT(index < PACKET_SIZE);
|
||||
return buffer[index];
|
||||
}
|
||||
|
||||
|
@ -100,10 +92,7 @@ class packet
|
|||
return used;
|
||||
}
|
||||
|
||||
~packet()
|
||||
{
|
||||
delete[] buffer;
|
||||
}
|
||||
~packet() = default;
|
||||
};
|
||||
|
||||
void mangle(packet& packet)
|
||||
|
@ -164,7 +153,7 @@ class pipe
|
|||
{
|
||||
// wait until the receiver has received
|
||||
std::unique_lock lock(mutex);
|
||||
cv.wait(lock, [this]{return !is_written.load(std::memory_order::memory_order_acquire); });
|
||||
cv.wait(lock, [this] { return !is_written.load(std::memory_order::memory_order_acquire); });
|
||||
// we now own the backing memory and can write to it
|
||||
// RAII is fun, we should use it here due to including a return statement
|
||||
predicator pred{[&]() -> void {
|
||||
|
@ -190,7 +179,7 @@ class pipe
|
|||
void receive(packet& out)
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
cv.wait(lock, [this]{return is_written.load(std::memory_order::memory_order_acquire); });
|
||||
cv.wait(lock, [this] { return is_written.load(std::memory_order::memory_order_acquire); });
|
||||
|
||||
out = packet(buffer);
|
||||
|
||||
|
@ -203,6 +192,31 @@ class pipe
|
|||
}
|
||||
};
|
||||
|
||||
class transceiver
|
||||
{
|
||||
private:
|
||||
// the pipe to send on
|
||||
pipe& uplink;
|
||||
// the pipe to receive on
|
||||
pipe& downlink;
|
||||
public:
|
||||
transceiver(pipe& uplink, pipe& downlink): uplink(uplink), downlink(downlink)
|
||||
{}
|
||||
|
||||
void send(const packet& p)
|
||||
{
|
||||
packet datagram{PACKET_SIZE + HEADER_SIZE};
|
||||
std::memcpy(&datagram.data()[HEADER_SIZE], p.data(), PACKET_SIZE);
|
||||
|
||||
uplink.send(datagram);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Load a file and split it into data segments
|
||||
* @param path
|
||||
* @param packets
|
||||
*/
|
||||
void load_packets(const std::string& path, std::vector<packet>& packets)
|
||||
{
|
||||
std::ifstream file(path);
|
||||
|
|
Loading…
Reference in New Issue