#pragma once
#include "env.h"
#include "p8-platform/util/buffer.h"
#include <map>
#include "adapter/AdapterCommunication.h"
extern "C" {
#include <interface/vmcs_host/vc_cecservice.h>
#include <interface/vchiq_arm/vchiq_if.h>
}
namespace CEC
{
class CRPiCECAdapterCommunication;
class CRPiCECAdapterMessageQueue;
class CRPiCECAdapterMessageQueueEntry
{
public:
CRPiCECAdapterMessageQueueEntry(CRPiCECAdapterMessageQueue *queue, const cec_command &command);
virtual ~CRPiCECAdapterMessageQueueEntry(void) {}
void Broadcast(void);
bool MessageReceived(cec_opcode opcode, cec_logical_address initiator, cec_logical_address destination, uint32_t response);
bool Wait(uint32_t iTimeout);
bool IsWaiting(void);
uint32_t Result() const;
const char *ToString(void) const { return "CEC transmission"; }
CRPiCECAdapterMessageQueue * m_queue;
bool m_bWaiting;
P8PLATFORM::CCondition<bool> m_condition;
P8PLATFORM::CMutex m_mutex;
cec_command m_command;
uint32_t m_retval;
bool m_bSucceeded;
};
class CRPiCECAdapterMessageQueue
{
friend class CRPiCECAdapterMessageQueueEntry;
public:
CRPiCECAdapterMessageQueue(CRPiCECAdapterCommunication *com) :
m_com(com),
m_iNextMessage(0)
{
}
virtual ~CRPiCECAdapterMessageQueue(void)
{
Clear();
}
void Clear(void);
void MessageReceived(cec_opcode opcode, cec_logical_address initiator, cec_logical_address destination, uint32_t response);
cec_adapter_message_state Write(const cec_command &command, bool &bRetry, uint32_t iLineTimeout, bool bIsReply, VC_CEC_ERROR_T &vcReply);
private:
CRPiCECAdapterCommunication * m_com;
P8PLATFORM::CMutex m_mutex;
std::map<uint64_t, CRPiCECAdapterMessageQueueEntry *> m_messages;
uint64_t m_iNextMessage;
};
};