Backup McuManager module.

This commit is contained in:
Fancy code 2024-02-06 09:59:23 -08:00
parent c91ddb6456
commit f6ee22a2d1
12 changed files with 154 additions and 27 deletions

View File

@ -6,15 +6,15 @@
* lvgl_common * lvgl_common
   lvgl引擎接口封装的公共源码。    lvgl引擎接口二次封装的公共源码目的是把lvgl开源库的接口解耦合避免lvgl接口兼容导致的迭代困难
* lvgl_board * lvgl_board
   交叉编译源码目录,对接fb驱动    交叉编译源码目录,含fb驱动。lvgl源码版本和模拟器一致
* lvgl_x86 * lvgl_x86
   ubuntu系统模拟器对接源码。    ubuntu系统模拟器源码。
## 1.2. 编译静态链接 ## 1.2. 编译静态链接

View File

@ -65,3 +65,5 @@ add_custom_command(
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
) )
endif() endif()
define_file_name(${TARGET_NAME})

View File

@ -97,6 +97,7 @@ void McuDevice::DeviceRecvThread(void)
LogError("malloc failed, DeviceRecvThread return.\n"); LogError("malloc failed, DeviceRecvThread return.\n");
return; return;
} }
memset(keyHeadBuf, 0, keyHeadLength);
mThreadRuning = true; mThreadRuning = true;
while (mThreadRuning) { while (mThreadRuning) {
ssize_t recvLength = ssize_t recvLength =
@ -131,13 +132,15 @@ void McuDevice::DeviceRecvData(const char *keyHead, const size_t headLength)
LogError("malloc failed, DeviceRecvData return.\n"); LogError("malloc failed, DeviceRecvData return.\n");
return; return;
} }
LogInfo("dataLength = %d\n", dataLength);
memset(dataBuf, 0, dataLength); memset(dataBuf, 0, dataLength);
memcpy(dataBuf, keyHead, headLength); memcpy(dataBuf, keyHead, headLength);
while (mThreadRuning) { while (mThreadRuning) {
size_t recvLength = IUartRecv(mUartDevice, ssize_t recvLength = IUartRecv(mUartDevice,
dataBuf + headLength + recvTotalLength, dataBuf + headLength + recvTotalLength,
dataLength - headLength - recvTotalLength, dataLength - headLength - recvTotalLength,
RECV_TIMEOUT_MS); RECV_TIMEOUT_MS);
LogInfo("recv data length = %d\n", recvLength);
recvTotalLength += recvLength; recvTotalLength += recvLength;
if (dataLength - headLength == recvTotalLength) { if (dataLength - headLength == recvTotalLength) {
PushMcuData(dataBuf, dataLength); PushMcuData(dataBuf, dataLength);

View File

@ -16,6 +16,8 @@
#define MCU_PROTOCOL_TEST_TOOL_H #define MCU_PROTOCOL_TEST_TOOL_H
#include "LinuxApiMock.h" #include "LinuxApiMock.h"
#include "UartDeviceTestTool.h" #include "UartDeviceTestTool.h"
constexpr int READ_PRINT = 0;
constexpr int WRITE_PRINT = 1;
class McuProtocolTestTool : virtual public UartDeviceTestTool class McuProtocolTestTool : virtual public UartDeviceTestTool
{ {
public: public:
@ -25,6 +27,6 @@ public:
void UnInit(void); void UnInit(void);
private: private:
static void PrintHexadecimalData(const void *buf, const size_t &bufLength); static void PrintHexadecimalData(const void *buf, const size_t &bufLength, const int event);
}; };
#endif #endif

View File

@ -25,7 +25,7 @@ void McuProtocolTestTool::Init(std::shared_ptr<LinuxTest> &mock, const UartInfo
int uartFd = GetDeviceMockFd(uart); int uartFd = GetDeviceMockFd(uart);
static size_t WRITE_COUNT = -1; static size_t WRITE_COUNT = -1;
auto api_write = [=, &mock](int fd, const void *buf, size_t count) { auto api_write = [=, &mock](int fd, const void *buf, size_t count) {
McuProtocolTestTool::PrintHexadecimalData(buf, count); McuProtocolTestTool::PrintHexadecimalData(buf, count, WRITE_PRINT);
if (sizeof(ASK_IPC_MISSION) == count && memcmp(ASK_IPC_MISSION, buf, count) == 0) { if (sizeof(ASK_IPC_MISSION) == count && memcmp(ASK_IPC_MISSION, buf, count) == 0) {
LogInfo("Set REPLY_IPC_MISSION\n"); LogInfo("Set REPLY_IPC_MISSION\n");
auto selectReadable = auto selectReadable =
@ -44,11 +44,12 @@ void McuProtocolTestTool::Init(std::shared_ptr<LinuxTest> &mock, const UartInfo
.WillRepeatedly(DoAll(WithArgs<0, 1, 2, 3, 4>(Invoke(selectTimeOut)), Return(MOCK_SELECT_TIME_OUT))); .WillRepeatedly(DoAll(WithArgs<0, 1, 2, 3, 4>(Invoke(selectTimeOut)), Return(MOCK_SELECT_TIME_OUT)));
constexpr int LEFT_DATA_LENGTH = sizeof(REPLY_IPC_MISSION) - PROTOCOL_DATA_KEY_HEAD_LENGTH; constexpr int LEFT_DATA_LENGTH = sizeof(REPLY_IPC_MISSION) - PROTOCOL_DATA_KEY_HEAD_LENGTH;
auto apiReadKeyHead = [=](int fd, void *buf, size_t count) { auto apiReadKeyHead = [=](int fd, void *buf, size_t count) {
LogInfo("apiReadKeyHead count = %d\n", count);
memcpy(buf, REPLY_IPC_MISSION, PROTOCOL_DATA_KEY_HEAD_LENGTH); memcpy(buf, REPLY_IPC_MISSION, PROTOCOL_DATA_KEY_HEAD_LENGTH);
McuProtocolTestTool::PrintHexadecimalData(buf, PROTOCOL_DATA_KEY_HEAD_LENGTH, READ_PRINT);
}; };
auto apiReadLeftData = [=](int fd, void *buf, size_t count) { auto apiReadLeftData = [=](int fd, void *buf, size_t count) {
memcpy(buf, REPLY_IPC_MISSION + PROTOCOL_DATA_KEY_HEAD_LENGTH, LEFT_DATA_LENGTH); memcpy(buf, REPLY_IPC_MISSION + PROTOCOL_DATA_KEY_HEAD_LENGTH, LEFT_DATA_LENGTH);
McuProtocolTestTool::PrintHexadecimalData(buf, LEFT_DATA_LENGTH, READ_PRINT);
}; };
EXPECT_CALL(*mock.get(), fx_read(uartFd, _, _)) EXPECT_CALL(*mock.get(), fx_read(uartFd, _, _))
.WillOnce(DoAll(WithArgs<0, 1, 2>(Invoke(apiReadKeyHead)), Return(PROTOCOL_DATA_KEY_HEAD_LENGTH))) .WillOnce(DoAll(WithArgs<0, 1, 2>(Invoke(apiReadKeyHead)), Return(PROTOCOL_DATA_KEY_HEAD_LENGTH)))
@ -64,9 +65,14 @@ void McuProtocolTestTool::UnInit(void)
{ {
// //
} }
void McuProtocolTestTool::PrintHexadecimalData(const void *buf, const size_t &bufLength) void McuProtocolTestTool::PrintHexadecimalData(const void *buf, const size_t &bufLength, const int event)
{ {
printf("write buf = { 0x%02X", *(unsigned char *)buf); if (WRITE_PRINT == event) {
printf("TEST write buf = { 0x%02X", *(unsigned char *)buf);
}
if (READ_PRINT == event) {
printf("TEST read buf = { 0x%02X", *(unsigned char *)buf);
}
for (size_t i = 1; i < bufLength; i++) { for (size_t i = 1; i < bufLength; i++) {
printf(", 0x%02X", *((unsigned char *)buf + i)); printf(", 0x%02X", *((unsigned char *)buf + i));
} }

View File

@ -20,18 +20,23 @@ LittleEndianHandle::LittleEndianHandle(const std::shared_ptr<VProtocolParam> &pa
{ {
// //
} }
LittleEndianHandle::LittleEndianHandle(const void *data, const size_t &length) : ProtocolHandle(data, length)
{
//
}
void LittleEndianHandle::BigEndianConversion(ProtocolPacket &packet) void LittleEndianHandle::BigEndianConversion(ProtocolPacket &packet)
{ {
// LogInfo("packet.mHead = 0x%02x\n", packet.mHead);
// LogInfo("packet.mCommand = 0x%02x\n", packet.mCommand);
// LogInfo("packet.mLength = %d\n", packet.mLength);
// LogInfo("packet.mCheckCode = 0x%02x\n", packet.mCheckCode);
// LogInfo("packet.mSerialNumber = %d\n", packet.mSerialNumber);
// ProtocolPacket packetBigEndian;
packet.mHead = htons(packet.mHead); packet.mHead = htons(packet.mHead);
packet.mCommand = htons(packet.mCommand); packet.mCommand = htons(packet.mCommand);
packet.mLength = htons(packet.mLength); packet.mLength = htons(packet.mLength);
packet.mCheckCode = htons(packet.mCheckCode); packet.mCheckCode = htons(packet.mCheckCode);
packet.mSerialNumber = htonl(packet.mSerialNumber); packet.mSerialNumber = htonl(packet.mSerialNumber);
// memcpy(&packet, &packetBigEndian, sizeof(ProtocolPacket)); }
void LittleEndianHandle::HostByteOrderConversion(ProtocolPacket &packet)
{
packet.mHead = ntohs(packet.mHead);
packet.mCommand = ntohs(packet.mCommand);
packet.mLength = ntohs(packet.mLength);
packet.mCheckCode = ntohs(packet.mCheckCode);
packet.mSerialNumber = ntohl(packet.mSerialNumber);
} }

View File

@ -19,9 +19,11 @@ class LittleEndianHandle : public ProtocolHandle
{ {
public: public:
LittleEndianHandle(const std::shared_ptr<VProtocolParam> &param); LittleEndianHandle(const std::shared_ptr<VProtocolParam> &param);
LittleEndianHandle(const void *data, const size_t &length);
virtual ~LittleEndianHandle() = default; virtual ~LittleEndianHandle() = default;
private: private:
void BigEndianConversion(ProtocolPacket &packet) override; void BigEndianConversion(ProtocolPacket &packet) override;
void HostByteOrderConversion(ProtocolPacket &packet) override;
}; };
#endif #endif

View File

@ -55,14 +55,15 @@ void McuProtocol::DataHandleThread(void)
mThreadRuning = true; mThreadRuning = true;
while (mThreadRuning) { while (mThreadRuning) {
sem_wait(&mSem); sem_wait(&mSem);
mMutex.lock();
if (mMcuDataList.size() == 0) { if (mMcuDataList.size() == 0) {
mMutex.unlock();
continue; continue;
} }
mMutex.lock();
SingleMcuPacket packet = mMcuDataList.front(); SingleMcuPacket packet = mMcuDataList.front();
mMcuDataList.pop_front();
mMutex.unlock(); mMutex.unlock();
ProtocolHandle::ProtocolAnalysis(packet.mBuf, packet.mLength); ProtocolHandle::ProtocolAnalysis(packet.mBuf, packet.mLength);
mMcuDataList.pop_front();
free((void *)packet.mBuf); free((void *)packet.mBuf);
} }
} }
@ -78,6 +79,9 @@ void McuProtocol::PushMcuData(const void *buf, const size_t &length)
LogError("malloc failed, PushMcuData failed.\n"); LogError("malloc failed, PushMcuData failed.\n");
return; return;
} }
LogInfo("PushMcuData\n");
memcpy(data, buf, length);
ProtocolHandle::PrintHexadecimalData(data, length);
std::lock_guard<std::mutex> locker(mMutex); std::lock_guard<std::mutex> locker(mMutex);
SingleMcuPacket packet(data, length); SingleMcuPacket packet(data, length);
mMcuDataList.push_back(packet); mMcuDataList.push_back(packet);

View File

@ -39,3 +39,17 @@ const StatusCode McuProtocolMakePtr::CreateProtocolHandle(std::shared_ptr<Protoc
impl = tmp; impl = tmp;
return CreateStatusCode(STATUS_CODE_OK); return CreateStatusCode(STATUS_CODE_OK);
} }
const StatusCode McuProtocolMakePtr::CreateProtocolHandle(std::shared_ptr<ProtocolHandle> &impl, const void *data,
const size_t &length)
{
std::shared_ptr<ProtocolHandle> tmp;
char byteOrder = ProtocolHandle::GetByteOrder();
if (ORDER_BIG_ENDIAN == byteOrder) {
tmp = std::make_shared<ProtocolHandle>(data, length);
}
else {
tmp = std::make_shared<LittleEndianHandle>(data, length);
}
impl = tmp;
return CreateStatusCode(STATUS_CODE_OK);
}

View File

@ -25,6 +25,8 @@ public:
static std::shared_ptr<McuProtocolMakePtr> &GetInstance(std::shared_ptr<McuProtocolMakePtr> *impl = nullptr); static std::shared_ptr<McuProtocolMakePtr> &GetInstance(std::shared_ptr<McuProtocolMakePtr> *impl = nullptr);
virtual const StatusCode CreateProtocolHandle(std::shared_ptr<ProtocolHandle> &impl, virtual const StatusCode CreateProtocolHandle(std::shared_ptr<ProtocolHandle> &impl,
const std::shared_ptr<VProtocolParam> &param); const std::shared_ptr<VProtocolParam> &param);
virtual const StatusCode CreateProtocolHandle(std::shared_ptr<ProtocolHandle> &impl, const void *data,
const size_t &length);
private: private:
char mByteOrder; char mByteOrder;

View File

@ -28,6 +28,16 @@ ProtocolHandle::ProtocolHandle(const std::shared_ptr<VProtocolParam> &param) : m
mSerialNumber = 0; mSerialNumber = 0;
mMakePacketFunc[ASK_IPC_MISSION] = std::bind(&ProtocolHandle::MakeAskIpcMissionPacket, this, std::placeholders::_1); mMakePacketFunc[ASK_IPC_MISSION] = std::bind(&ProtocolHandle::MakeAskIpcMissionPacket, this, std::placeholders::_1);
} }
ProtocolHandle::ProtocolHandle(const void *data, const size_t &length)
{
mProtocolData = (unsigned char *)malloc(length);
if (nullptr != mProtocolData) {
memcpy(mProtocolData, data, length);
}
mProtocolDataLength = length;
mAnalyzePacketFunc[REPLY_IPC_MISSION] =
std::bind(&ProtocolHandle::AnalyzeReplyIpcMissionPacket, this, std::placeholders::_1);
}
ProtocolHandle::~ProtocolHandle() ProtocolHandle::~ProtocolHandle()
{ {
if (nullptr != mProtocolData) { if (nullptr != mProtocolData) {
@ -42,6 +52,9 @@ void ProtocolHandle::MakeProtocolPacket(const std::shared_ptr<VProtocolParam> &p
if (iter != mMakePacketFunc.end()) { if (iter != mMakePacketFunc.end()) {
mMakePacketFunc[param->mCommand](param); mMakePacketFunc[param->mCommand](param);
} }
else {
LogError("Unknown command.\n");
}
} }
void ProtocolHandle::MakeAskIpcMissionPacket(const std::shared_ptr<VProtocolParam> &param) void ProtocolHandle::MakeAskIpcMissionPacket(const std::shared_ptr<VProtocolParam> &param)
{ {
@ -67,16 +80,51 @@ void ProtocolHandle::MakeAskIpcMissionPacket(const std::shared_ptr<VProtocolPara
memcpy(mProtocolData + KEY_HEAD_LENGTH, &packet.mCheckCode, sizeof(short)); memcpy(mProtocolData + KEY_HEAD_LENGTH, &packet.mCheckCode, sizeof(short));
mProtocolDataLength = dataLength; mProtocolDataLength = dataLength;
} }
void ProtocolHandle::AnalyzeProtocolPacket(void)
{
ProtocolPacket packet = {0};
memcpy(&packet, mProtocolData, KEY_HEAD_LENGTH);
memcpy(&packet.mCheckCode,
(unsigned char *)mProtocolData + mProtocolDataLength - sizeof(unsigned short),
sizeof(unsigned short));
HostByteOrderConversion(packet);
LogInfo("AnalyzeProtocolPacket, command = 0x%04X\n", packet.mCommand);
PROTOCOL_COMMAND command = static_cast<PROTOCOL_COMMAND>(packet.mCommand);
std::map<PROTOCOL_COMMAND, AnalyzePacketFunc>::iterator iter;
iter = mAnalyzePacketFunc.find(command);
if (iter != mAnalyzePacketFunc.end()) {
mAnalyzePacketFunc[command](packet);
}
else {
LogError("Unknown command.\n");
}
}
void ProtocolHandle::AnalyzeReplyIpcMissionPacket(const ProtocolPacket &packet)
{
LogInfo("AnalyzeReplyIpcMissionPacket\n");
constexpr unsigned char UNKNOWN_MISSION = 0xFF;
constexpr unsigned int PROTOCOL_DATA_START_ADDRESS = KEY_HEAD_LENGTH;
unsigned char ipcMission = UNKNOWN_MISSION;
ipcMission = mProtocolData[PROTOCOL_DATA_START_ADDRESS];
LogInfo("ipc mission = 0x%02X\n", ipcMission);
}
std::shared_ptr<ProtocolHandle> ProtocolHandle::CreateProtocolData(const std::shared_ptr<VProtocolParam> &param) std::shared_ptr<ProtocolHandle> ProtocolHandle::CreateProtocolData(const std::shared_ptr<VProtocolParam> &param)
{ {
std::shared_ptr<ProtocolHandle> handle; std::shared_ptr<ProtocolHandle> handle;
McuProtocolMakePtr::GetInstance()->CreateProtocolHandle(handle, param); McuProtocolMakePtr::GetInstance()->CreateProtocolHandle(handle, param);
if (handle) {
handle->MakeProtocolPacket(param); handle->MakeProtocolPacket(param);
}
return handle; return handle;
} }
void ProtocolHandle::ProtocolAnalysis(const void *data, const size_t &length) void ProtocolHandle::ProtocolAnalysis(const void *data, const size_t &length)
{ {
// LogInfo("ProtocolAnalysis\n");
std::shared_ptr<ProtocolHandle> handle;
McuProtocolMakePtr::GetInstance()->CreateProtocolHandle(handle, data, length);
if (handle) {
handle->AnalyzeProtocolPacket();
}
} }
size_t ProtocolHandle::GetKeyHeadLength(void) { return KEY_HEAD_LENGTH; } size_t ProtocolHandle::GetKeyHeadLength(void) { return KEY_HEAD_LENGTH; }
StatusCode ProtocolHandle::GetDataLength(const void *keyHead, const size_t &headLength, size_t &dataLength) StatusCode ProtocolHandle::GetDataLength(const void *keyHead, const size_t &headLength, size_t &dataLength)
@ -85,12 +133,23 @@ StatusCode ProtocolHandle::GetDataLength(const void *keyHead, const size_t &head
LogError("key head buf error.\n"); LogError("key head buf error.\n");
return CreateStatusCode(STATUS_CODE_NOT_OK); return CreateStatusCode(STATUS_CODE_NOT_OK);
} }
ProtocolPacket packet = {0}; ProtocolHandle::PrintHexadecimalData(keyHead, headLength);
memcpy(&packet, keyHead, headLength); unsigned short headNum = PROTOCOL_HEAD;
if (PROTOCOL_HEAD != packet.mHead) { char byteOrder = ProtocolHandle::GetByteOrder();
if (ORDER_LITTLE_ENDIAN == byteOrder) {
headNum = htons(PROTOCOL_HEAD);
}
unsigned char head[3] = {0};
memcpy(head, &headNum, sizeof(unsigned short));
if (strstr((const char *)keyHead, (const char *)head) == nullptr) {
LogError("Protocol head unmatch.\n"); LogError("Protocol head unmatch.\n");
return CreateStatusCode(STATUS_CODE_NOT_OK); return CreateStatusCode(STATUS_CODE_NOT_OK);
} }
ProtocolPacket packet = {0};
memcpy(&packet, keyHead, headLength);
if (ORDER_LITTLE_ENDIAN == byteOrder) {
packet.mLength = htons(packet.mLength);
}
dataLength = packet.mLength; dataLength = packet.mLength;
return CreateStatusCode(STATUS_CODE_OK); return CreateStatusCode(STATUS_CODE_OK);
} }
@ -112,3 +171,14 @@ char ProtocolHandle::GetByteOrder(void)
} }
return byteOrder; return byteOrder;
} }
void ProtocolHandle::PrintHexadecimalData(const void *buf, const size_t &bufLength, const char *log)
{
if (log) {
printf("%s", log);
}
printf(" {0x%02X", *(unsigned char *)buf);
for (size_t i = 1; i < bufLength; i++) {
printf(", 0x%02X", *((unsigned char *)buf + i));
}
printf("}\n");
}

View File

@ -60,25 +60,41 @@ public:
T mData; T mData;
}; };
using MakePacketFunc = std::function<void(const std::shared_ptr<VProtocolParam> &)>; using MakePacketFunc = std::function<void(const std::shared_ptr<VProtocolParam> &)>;
using AnalyzePacketFunc = std::function<void(const ProtocolPacket &)>;
class ProtocolHandle class ProtocolHandle
{ {
public: public:
ProtocolHandle(const std::shared_ptr<VProtocolParam> &param); ProtocolHandle(const std::shared_ptr<VProtocolParam> &param);
ProtocolHandle(const void *data, const size_t &length);
virtual ~ProtocolHandle(); virtual ~ProtocolHandle();
void *GetProtocolDataBuff(void) { return mProtocolData; } void *GetProtocolDataBuff(void) { return mProtocolData; }
size_t GetProtocolDataLength(void) { return mProtocolDataLength; } size_t GetProtocolDataLength(void) { return mProtocolDataLength; }
unsigned int GetSerialNumber(void) { return mProtocolSerialNumber; } unsigned int GetSerialNumber(void) { return mProtocolSerialNumber; }
/**
* @brief These functions assemble scattered data into continuous memory protocol packets and complete the sending
* of protocol packets.
*/
private: private:
void MakeProtocolPacket(const std::shared_ptr<VProtocolParam> &param); void MakeProtocolPacket(const std::shared_ptr<VProtocolParam> &param);
void MakeAskIpcMissionPacket(const std::shared_ptr<VProtocolParam> &param); void MakeAskIpcMissionPacket(const std::shared_ptr<VProtocolParam> &param);
/**
* @brief These function implementations parse the received frame by frame continuous data into the data required by
* the application, completing the protocol unpacking.
*/
private:
void AnalyzeProtocolPacket(void);
void AnalyzeReplyIpcMissionPacket(const ProtocolPacket &packet);
private: private:
virtual void BigEndianConversion(ProtocolPacket &packet) {} virtual void BigEndianConversion(ProtocolPacket &packet) {}
virtual void HostByteOrderConversion(ProtocolPacket &packet) {}
private: private:
std::shared_ptr<VProtocolParam> mParam; std::shared_ptr<VProtocolParam> mParam;
std::map<PROTOCOL_COMMAND, MakePacketFunc> mMakePacketFunc; std::map<PROTOCOL_COMMAND, MakePacketFunc> mMakePacketFunc;
std::map<PROTOCOL_COMMAND, AnalyzePacketFunc> mAnalyzePacketFunc;
unsigned char *mProtocolData; unsigned char *mProtocolData;
size_t mProtocolDataLength; size_t mProtocolDataLength;
/** /**
@ -99,5 +115,6 @@ public:
static size_t GetKeyHeadLength(void); static size_t GetKeyHeadLength(void);
static StatusCode GetDataLength(const void *keyHead, const size_t &headLength, size_t &dataLength); static StatusCode GetDataLength(const void *keyHead, const size_t &headLength, size_t &dataLength);
static char GetByteOrder(void); static char GetByteOrder(void);
static void PrintHexadecimalData(const void *buf, const size_t &bufLength, const char *log = nullptr);
}; };
#endif #endif