#include #include #include #include #include #include #include "threads.h" #include "comms.h" #include "msgtypes.h" Semaphore outQueueSl(0); Semaphore outQueueSu(30); Semaphore inQueueS(0); Mutex outQueueM; Mutex inQueueM; std::queue outQueue; std::queue inQueue; Packet::Packet(uint8_t i, DataPayloadPtr p) : index(i), data(p) { } void sendPacket(PacketPtr p) { outQueueSu.wait(); outQueueSl.post(); AutoMutex am(outQueueM); outQueue.push(p); } void packetSender(FILE * host) { while (1) { outQueueSl.wait(); AutoMutex am(outQueueM); // We can indicate an exit request by posting the semaphore without putting // anything in the queue if (outQueue.size() == 0) { break; } outQueue.front()->write(host); outQueueSu.post(); } } Packet::Packet(FILE * host) { if (fread(&index, sizeof(index), 1, host) != 1) { // error } DataPayload::TypeID t = 0; if (fread(&t, sizeof(t), 1, host) != 1) { // error } data = MsgFacs()[t](); data->Read(host); } void Packet::write(FILE * host) const { if (fwrite(&index, sizeof(index), 1, host) != 1) { // error } DataPayload::TypeID t = data->dataTypeID(); if (fwrite(&t, sizeof(t), 1, host) != 1) { // error } data->Send(host); if (fflush(host) != 0) { // } } PacketPtr recvPacket() { inQueueS.wait(); AutoMutex am(inQueueM); PacketPtr rtn = inQueue.front(); inQueue.pop(); return rtn; } ContentBase::~ContentBase() { }