#pragma once
#include "env.h"
#include "p8-platform/threads/threads.h"
#include "p8-platform/util/buffer.h"
#include "p8-platform/util/timeutils.h"
#include <map>
#include "USBCECAdapterMessage.h"
namespace CEC
{
class CUSBCECAdapterCommunication;
class CCECAdapterMessageQueue;
class CCECAdapterMessage;
class CCECAdapterMessageQueueEntry
{
public:
CCECAdapterMessageQueueEntry(CCECAdapterMessageQueue *queue, CCECAdapterMessage *message);
virtual ~CCECAdapterMessageQueueEntry(void);
void Broadcast(void);
bool MessageReceived(const CCECAdapterMessage &message);
bool Wait(uint32_t iTimeout);
bool IsWaiting(void);
cec_adapter_messagecode MessageCode(void);
bool IsResponse(const CCECAdapterMessage &msg);
bool IsResponseOld(const CCECAdapterMessage &msg);
const char *ToString(void) const;
bool MessageReceivedCommandAccepted(const CCECAdapterMessage &message);
bool MessageReceivedTransmitSucceeded(const CCECAdapterMessage &message);
bool MessageReceivedResponse(const CCECAdapterMessage &message);
void Signal(void);
bool ProvidesExtendedResponse(void);
bool TimedOutOrSucceeded(void) const;
CCECAdapterMessageQueue * m_queue;
CCECAdapterMessage * m_message;
uint8_t m_iPacketsLeft;
bool m_bSucceeded;
bool m_bWaiting;
P8PLATFORM::CCondition<bool> m_condition;
P8PLATFORM::CMutex m_mutex;
P8PLATFORM::CTimeout m_queueTimeout;
};
class CCECAdapterMessageQueue : public P8PLATFORM::CThread
{
friend class CUSBCECAdapterCommunication;
friend class CCECAdapterMessageQueueEntry;
public:
CCECAdapterMessageQueue(CUSBCECAdapterCommunication *com);
virtual ~CCECAdapterMessageQueue(void);
void Clear(void);
void MessageReceived(const CCECAdapterMessage &msg);
void AddData(uint8_t *data, size_t iLen);
bool Write(CCECAdapterMessage *msg);
bool ProvidesExtendedResponse(void);
virtual void *Process(void);
void CheckTimedOutMessages(void);
private:
CUSBCECAdapterCommunication * m_com;
P8PLATFORM::CMutex m_mutex;
std::map<uint64_t, CCECAdapterMessageQueueEntry *> m_messages;
P8PLATFORM::SyncedBuffer<CCECAdapterMessageQueueEntry *> m_writeQueue;
uint64_t m_iNextMessage;
CCECAdapterMessage * m_incomingAdapterMessage;
cec_command m_currentCECFrame;
};
}