Files
2026-02-01 22:23:06 +08:00

97 lines
3.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef CommunicationManager_H
#define CommunicationManager_H
#include <string>
#include <memory>
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <mutex>
#include "SimpleQueue.h"
typedef struct COMMUNICATION_DATA
{
/// 需扩展
char strSource[20];
char byteArray[1024];///数据
char strExtra[50];
COMMUNICATION_DATA()
{
strSource[0] = '\0';
byteArray[0] = '\0';
strExtra[0] = '\0';
}
} SimpleData, *pSimpleData;
class RouterTable;
class CCommonication;
class CommunicationManager : public std::enable_shared_from_this<CommunicationManager>
{
public:
CommunicationManager();
~CommunicationManager();
CommunicationManager(const CommunicationManager& other) = delete;
const CommunicationManager& operator=(const CommunicationManager& other) = delete;
public:
static CommunicationManager* Instance();
void Initialize(const std::string& config);
bool Start();
bool Stop();
// 程序发送命令唯一接口 json接口需变动
void PushSendData(const SimpleData& stSimpleData);
// 程序内部获取数据唯一接口 json接口需变动
const SimpleData& GetRecvData();
protected:
void initCommunication(const std::string& strName);
/*
/// \brief onCallBackMessage
/// \param source 接收通信名称MQTT CAN TCP UDP 等实例)
/// \param moudle 发送模块名称(本机模块、制冷红外模块、非制冷红外模块、可见光模块......
/// \param pData 数据
*/
static void __stdcall onCallBackMessage(const char* source, const char* extra, unsigned char* stData,
int nLen, void* pUser/*const std::string& source, const std::string& moudle, char* pData*/);
///
/// \brief onPushReciveData 处理接收的函数 将数据放置在队列中
/// \param source
/// \param stData
/// \param nLen
///
void onPushReciveData(const char* source, const char* extra, unsigned char* stData, int nLen);
///
/// \brief doDealWithSendData //在线程中间处理发送数据须在Transform里面协议需转换一下
/// \param stSimpleData
///
void doDealWithSendData(const SimpleData& stSimpleData);
void doDealWithRouterTableSendData(const SimpleData& stSimpleData);
///
/// \brief doDealWithReciveData //在线程中间处理接收数据须在Transform里面协议需转换一下
/// \param stSimpleData
///
void doDealWithReciveData(const SimpleData& stSimpleData);
protected:
void ThreadFunLoop();
typedef void (CommunicationManager::*ThreadRunFunPtr)();
static void ThreadEntry(ThreadRunFunPtr pRunFun, void* pOwner);
private:
bool m_bSetup;
SimpleQueue<SimpleData> m_DataRecvQueue; //数据接收处理队列
SimpleQueue<SimpleData> m_DataSendQueue;
std::recursive_mutex m_mRecursive;
/// 通信唯一ID名称 通信实例
std::unordered_map<std::string, CCommonication*> m_mMapDatas;
bool m_bThreadRunningLoop;
std::thread* m_pFutureThreadRunLoop;
};
#endif // CommunicationManager_H