From 74a9705d9746e26a4e89688bd2b22c16dced268f Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Sat, 10 Feb 2024 18:08:01 -0800 Subject: [PATCH] Add:McuManager set data and time. --- middleware/McuManager/include/IMcuManager.h | 47 +++++----- middleware/McuManager/src/IMcuManager.cpp | 27 ++++++ middleware/McuManager/src/McuDevice.cpp | 16 ++++ middleware/McuManager/src/McuDevice.h | 1 + middleware/McuManager/src/McuManagerImpl.cpp | 6 ++ middleware/McuManager/src/McuManagerImpl.h | 1 + .../src_mock/McuManager_Mock_Test.cpp | 45 +++++++++- .../tool/include/McuProtocolTestTool.h | 2 + .../tool/src/McuProtocolTestTool.cpp | 51 +++++++++++ utils/McuProtocol/include/McuProtocol.h | 4 + utils/McuProtocol/src/McuProtocol.cpp | 12 +++ utils/McuProtocol/src/ProtocolHandle.cpp | 87 ++++++++++++------- utils/McuProtocol/src/ProtocolHandle.h | 45 ++++++++-- 13 files changed, 283 insertions(+), 61 deletions(-) diff --git a/middleware/McuManager/include/IMcuManager.h b/middleware/McuManager/include/IMcuManager.h index c3908ad..be18239 100644 --- a/middleware/McuManager/include/IMcuManager.h +++ b/middleware/McuManager/include/IMcuManager.h @@ -30,13 +30,26 @@ enum class ASK_RESULT TIMEOUT, END }; +typedef struct mcu_ask_date_time +{ + const unsigned short mYear; + const unsigned char mMon; + const unsigned char mDay; + const unsigned char mHour; + const unsigned char mMin; + const unsigned char mSecond; + mcu_ask_date_time(const unsigned short year, const unsigned char mon, const unsigned char day, + const unsigned char hour, const unsigned char min, const unsigned char second) + : mYear(year), mMon(mon), mDay(day), mHour(hour), mMin(min), mSecond(second) + { + } +} McuAskDateTime; class VMcuAsk { public: VMcuAsk() { mSerialNumber = 0; } virtual ~VMcuAsk() = default; virtual ASK_RESULT Blocking(void) { return ASK_RESULT::END; } - // virtual void StopBlocking(void) {} virtual bool NeedReply(void) { return false; } virtual void ReplyFinished(const bool result) {} virtual bool IfTimeout(const unsigned int &integrationTimeMs) { return false; } @@ -53,7 +66,7 @@ class McuAsk : virtual public VMcuAsk { public: - McuAsk() {} + McuAsk() = default; virtual ~McuAsk() = default; public: @@ -71,28 +84,14 @@ public: IMcuManager() = default; virtual ~IMcuManager() = default; static std::shared_ptr &GetInstance(std::shared_ptr *impl = nullptr); - virtual const StatusCode Init(void) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } - virtual const StatusCode UnInit(void) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } - virtual const StatusCode SetMcuMonitor(std::shared_ptr &monitor) - { - return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); - } - virtual const StatusCode GetIpcMission(std::shared_ptr &ask) - { - return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); - } - virtual const StatusCode CutOffPowerSupply(std::shared_ptr &ask) - { - return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); - } - virtual const StatusCode FeedWatchDog(std::shared_ptr &ask) - { - return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); - } + virtual const StatusCode Init(void); + virtual const StatusCode UnInit(void); + virtual const StatusCode SetMcuMonitor(std::shared_ptr &monitor); + virtual const StatusCode GetIpcMission(std::shared_ptr &ask); + virtual const StatusCode CutOffPowerSupply(std::shared_ptr &ask); + virtual const StatusCode FeedWatchDog(std::shared_ptr &ask); virtual const StatusCode SetFeedingCycleForWatchDog(std::shared_ptr &ask, const unsigned char &hour, - const unsigned char &min, const unsigned char &second) - { - return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); - } + const unsigned char &min, const unsigned char &second); + virtual const StatusCode SetDateTime(std::shared_ptr &ask, const McuAskDateTime &value); }; #endif \ No newline at end of file diff --git a/middleware/McuManager/src/IMcuManager.cpp b/middleware/McuManager/src/IMcuManager.cpp index 4a423cb..5e919c3 100644 --- a/middleware/McuManager/src/IMcuManager.cpp +++ b/middleware/McuManager/src/IMcuManager.cpp @@ -27,4 +27,31 @@ std::shared_ptr &IMcuManager::GetInstance(std::shared_ptr &monitor) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +const StatusCode IMcuManager::GetIpcMission(std::shared_ptr &ask) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +const StatusCode IMcuManager::CutOffPowerSupply(std::shared_ptr &ask) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +const StatusCode IMcuManager::FeedWatchDog(std::shared_ptr &ask) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +const StatusCode IMcuManager::SetFeedingCycleForWatchDog(std::shared_ptr &ask, const unsigned char &hour, + const unsigned char &min, const unsigned char &second) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +const StatusCode IMcuManager::SetDateTime(std::shared_ptr &ask, const McuAskDateTime &value) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } \ No newline at end of file diff --git a/middleware/McuManager/src/McuDevice.cpp b/middleware/McuManager/src/McuDevice.cpp index dd2b6c9..b9cca4a 100644 --- a/middleware/McuManager/src/McuDevice.cpp +++ b/middleware/McuManager/src/McuDevice.cpp @@ -109,6 +109,22 @@ void McuDevice::GetIpcMissionReply(const unsigned int &serialNumber, const unsig DeleteMcuAsk(ask); } } +void McuDevice::OnlyResultReply(const unsigned int &serialNumber, const ReplyResult &result) +{ + std::shared_ptr ask; + SearchMcuAsk(serialNumber, ask); + if (ask) { + std::shared_ptr> realAsk = std::dynamic_pointer_cast>(ask); + if (realAsk) { + realAsk->mDataReply = static_cast(result); + ask->ReplyFinished(true); + } + else { + ask->ReplyFinished(false); + } + DeleteMcuAsk(ask); + } +} void McuDevice::SetFeedingCycleForWatchDogReply(const unsigned int &serialNumber, const ReplyResult &result) { std::shared_ptr ask; diff --git a/middleware/McuManager/src/McuDevice.h b/middleware/McuManager/src/McuDevice.h index 71321c9..7149a87 100644 --- a/middleware/McuManager/src/McuDevice.h +++ b/middleware/McuManager/src/McuDevice.h @@ -34,6 +34,7 @@ public: public: void GetIpcMissionReply(const unsigned int &serialNumber, const unsigned char &mission) override; + void OnlyResultReply(const unsigned int &serialNumber, const ReplyResult &result) override; void SetFeedingCycleForWatchDogReply(const unsigned int &serialNumber, const ReplyResult &result) override; public: diff --git a/middleware/McuManager/src/McuManagerImpl.cpp b/middleware/McuManager/src/McuManagerImpl.cpp index 4f2cddd..4828557 100644 --- a/middleware/McuManager/src/McuManagerImpl.cpp +++ b/middleware/McuManager/src/McuManagerImpl.cpp @@ -46,4 +46,10 @@ const StatusCode McuManagerImpl::SetFeedingCycleForWatchDog(std::shared_ptr context = std::make_shared>>(ask); return McuProtocol::SetFeedingCycleForWatchDog(hour, min, second, context); +} +const StatusCode McuManagerImpl::SetDateTime(std::shared_ptr &ask, const McuAskDateTime &value) +{ + std::shared_ptr context = std::make_shared>>(ask); + return McuProtocol::McuSetDateTime( + value.mYear, value.mMon, value.mDay, value.mHour, value.mMin, value.mSecond, context); } \ No newline at end of file diff --git a/middleware/McuManager/src/McuManagerImpl.h b/middleware/McuManager/src/McuManagerImpl.h index def9b78..d50569e 100644 --- a/middleware/McuManager/src/McuManagerImpl.h +++ b/middleware/McuManager/src/McuManagerImpl.h @@ -30,5 +30,6 @@ public: const StatusCode FeedWatchDog(std::shared_ptr &ask) override; const StatusCode SetFeedingCycleForWatchDog(std::shared_ptr &ask, const unsigned char &hour, const unsigned char &min, const unsigned char &second) override; + const StatusCode SetDateTime(std::shared_ptr &ask, const McuAskDateTime &value) override; }; #endif \ No newline at end of file diff --git a/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp b/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp index 84551c8..74fa1c3 100644 --- a/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp +++ b/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp @@ -162,11 +162,22 @@ TEST_F(McuManagerMockTest, INTEGRATION_McuManager_EXAMPLE_FeedWatchDog) // --gtest_filter=McuManagerMockTest.INTEGRATION_McuManager_EXAMPLE_SetFeedingCycleForWatchDog TEST_F(McuManagerMockTest, INTEGRATION_McuManager_EXAMPLE_SetFeedingCycleForWatchDog) { - class McuAskTest : public McuAskBase + class McuAskTest : public McuAsk, public McuAskBase { public: McuAskTest() : McuAskBase(McuAskBlock::BLOCK, McuAskReply::NEED_REPLY) {} // using McuAskBlock::BLOCK virtual ~McuAskTest() = default; + void ReplyFinished(const bool result) override + { + McuAskBase::ReplyFinished(result); + if (result) { + LogInfo("Ask data succeed, mDataReply = %d.\n", static_cast(mDataReply)); + // Do something here. + } + else { + LogError("Ask data falied.\n"); + } + } }; IMcuManager::GetInstance()->Init(); std::shared_ptr ask = std::make_shared(); @@ -178,6 +189,38 @@ TEST_F(McuManagerMockTest, INTEGRATION_McuManager_EXAMPLE_SetFeedingCycleForWatc IMcuManager::GetInstance()->UnInit(); } // ../output_files/test/bin/McuManagerTest +// --gtest_filter=McuManagerMockTest.INTEGRATION_McuManager_EXAMPLE_SetDateTime +TEST_F(McuManagerMockTest, INTEGRATION_McuManager_EXAMPLE_SetDateTime) +{ + /** + * @brief The user needs to derive a subclass of McuAskBase and add the business code after obtaining data in the + * abstract interface. + */ + class McuAskTest : public McuAsk, public McuAskBase + { + public: + McuAskTest() : McuAskBase(McuAskBlock::NOT_BLOCK, McuAskReply::NEED_REPLY) {} // using McuAskBlock::NOT_BLOCK + virtual ~McuAskTest() = default; + void ReplyFinished(const bool result) override + { + McuAskBase::ReplyFinished(result); + if (result) { + LogInfo("Ask data succeed, mDataReply = %d.\n", static_cast(mDataReply)); + // Do something here. + } + else { + LogError("Ask data falied.\n"); + } + } + }; + IMcuManager::GetInstance()->Init(); + std::shared_ptr ask = std::make_shared(); + McuAskDateTime value(2014, 1, 15, 0, 0, 0); + IMcuManager::GetInstance()->SetDateTime(ask, value); + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + IMcuManager::GetInstance()->UnInit(); +} +// ../output_files/test/bin/McuManagerTest // --gtest_filter=McuManagerMockTest.INTEGRATION_McuManager_AUTO_GetIpcMission TEST_F(McuManagerMockTest, INTEGRATION_McuManager_AUTO_GetIpcMission) { diff --git a/test/utils/McuProtocol/tool/include/McuProtocolTestTool.h b/test/utils/McuProtocol/tool/include/McuProtocolTestTool.h index 551c32c..a800f67 100644 --- a/test/utils/McuProtocol/tool/include/McuProtocolTestTool.h +++ b/test/utils/McuProtocol/tool/include/McuProtocolTestTool.h @@ -44,6 +44,8 @@ private: bool FeedWatchDogProtocolHandle(std::shared_ptr &mock, const int &uartFd, const void *buf, size_t count); bool FeedingCycleProtocolHandle(std::shared_ptr &mock, const int &uartFd, const void *buf, size_t count); void FeedingCycleProtocolInit(std::shared_ptr &mock, const int &uartFd, const void *buf, size_t count); + bool SetDataTimeProtocolHandle(std::shared_ptr &mock, const int &uartFd, const void *buf, size_t count); + void SetDataTimeProtocolInit(std::shared_ptr &mock, const int &uartFd, const void *buf, size_t count); void LockProtocolHandle(void); void UnlockProtocolHandle(void); void UnlockThread(void); diff --git a/test/utils/McuProtocol/tool/src/McuProtocolTestTool.cpp b/test/utils/McuProtocol/tool/src/McuProtocolTestTool.cpp index 790a06a..b8b772a 100644 --- a/test/utils/McuProtocol/tool/src/McuProtocolTestTool.cpp +++ b/test/utils/McuProtocol/tool/src/McuProtocolTestTool.cpp @@ -38,6 +38,9 @@ unsigned char ASK_SET_FEEDING_CYCLE[] = { 0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x0F, 0x01, 0x01, 0x01, 0xA7, 0x9A}; unsigned char REPLY_SET_FEEDING_CYCLE[] = { 0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x0D, 0x01, 0x52, 0x26}; +unsigned char ASK_SET_DATE_TIME[] = { + 0xFA, 0xC1, 0x00, 0x00, 0x00, 0x01, 0x81, 0x07, 0x00, 0x13, 0xDE, 0x07, 0x01, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0xFF}; +unsigned char REPLY_SET_DATE_TIME[] = {0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x0D, 0x01, 0xFF, 0xFF}; McuProtocolTestTool::McuProtocolTestTool() { mThreadRuning = false; @@ -48,6 +51,7 @@ McuProtocolTestTool::McuProtocolTestTool() mProtocolHandle.push_back(std::bind(&McuProtocolTestTool::CutOffPowerSupplyProtocolHandle, this, _1, _2, _3, _4)); mProtocolHandle.push_back(std::bind(&McuProtocolTestTool::FeedWatchDogProtocolHandle, this, _1, _2, _3, _4)); mProtocolHandle.push_back(std::bind(&McuProtocolTestTool::FeedingCycleProtocolHandle, this, _1, _2, _3, _4)); + mProtocolHandle.push_back(std::bind(&McuProtocolTestTool::SetDataTimeProtocolHandle, this, _1, _2, _3, _4)); } void McuProtocolTestTool::Init(std::shared_ptr &mock, const UartInfo &uart) { @@ -278,6 +282,53 @@ void McuProtocolTestTool::FeedingCycleProtocolInit(std::shared_ptr &m .WillOnce(DoAll(WithArgs<0, 1, 2>(Invoke(apiReadLeftData)), Return(LEFT_DATA_LENGTH))) .WillRepeatedly(DoAll(Return(UART_DEVICE_READ_NOTHING))); } +bool McuProtocolTestTool::SetDataTimeProtocolHandle(std::shared_ptr &mock, const int &uartFd, + const void *buf, size_t count) +{ + if (sizeof(ASK_SET_DATE_TIME) == count && + memcmp(ASK_SET_DATE_TIME + PROTOCOL_COMMAND_LENGTH, (unsigned char *)buf + PROTOCOL_COMMAND_LENGTH, 2) == 0) { + short replyCheckCode = + calculate_check_sum(REPLY_SET_DATE_TIME, sizeof(REPLY_SET_DATE_TIME) - PROTOCOL_CHECK_CODE_LENGTH); + replyCheckCode = htons(replyCheckCode); + LogInfo("Set ASK_SET_DATE_TIME, reply data check code = 0x%x\n", replyCheckCode); + short askCheckCode = calculate_check_sum((unsigned char *)buf, count - PROTOCOL_CHECK_CODE_LENGTH); + // askCheckCode = htons(askCheckCode); + int result = memcmp( + (unsigned char *)buf + count - PROTOCOL_CHECK_CODE_LENGTH, &askCheckCode, PROTOCOL_CHECK_CODE_LENGTH); + EXPECT_EQ(result, 0) << "ask protocol data errer, check code isn't right."; + auto handle = [=, &mock](McuProtocolTestTool *testTool) { + testTool->SetDataTimeProtocolInit(mock, uartFd, buf, count); + }; + if (mLockThread.joinable()) { + mLockThread.join(); + } + mLockThread = std::thread(handle, this); + return PROTOCOL_HANDLED; + } + return PROTOCOL_NOT_HANDLED; +} +void McuProtocolTestTool::SetDataTimeProtocolInit(std::shared_ptr &mock, const int &uartFd, const void *buf, + size_t count) +{ + LockProtocolHandle(); + memcpy(REPLY_SET_DATE_TIME + 2, (unsigned char *)buf + 2, PROTOCOL_SERIAL_NUMBER_LENGTH); + ResetCheckCode(REPLY_SET_DATE_TIME, sizeof(REPLY_SET_DATE_TIME)); + ReplySelectSucceed(mock, uartFd); + constexpr int LEFT_DATA_LENGTH = sizeof(REPLY_SET_DATE_TIME) - PROTOCOL_DATA_KEY_HEAD_LENGTH; + auto apiReadKeyHead = [=](int fd, void *buf, size_t count) { + memcpy(buf, REPLY_SET_DATE_TIME, PROTOCOL_DATA_KEY_HEAD_LENGTH); + McuProtocolTestTool::PrintHexadecimalData(buf, PROTOCOL_DATA_KEY_HEAD_LENGTH, READ_PRINT); + }; + auto apiReadLeftData = [=](int fd, void *buf, size_t count) { + memcpy(buf, REPLY_SET_DATE_TIME + PROTOCOL_DATA_KEY_HEAD_LENGTH, LEFT_DATA_LENGTH); + McuProtocolTestTool::PrintHexadecimalData(buf, LEFT_DATA_LENGTH, READ_PRINT); + UnlockProtocolHandle(); + }; + 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(apiReadLeftData)), Return(LEFT_DATA_LENGTH))) + .WillRepeatedly(DoAll(Return(UART_DEVICE_READ_NOTHING))); +} void McuProtocolTestTool::UnlockProtocolHandle(void) { auto unlockThread = [=](McuProtocolTestTool *testTool) { testTool->UnlockThread(); }; diff --git a/utils/McuProtocol/include/McuProtocol.h b/utils/McuProtocol/include/McuProtocol.h index cf89163..f6359ef 100644 --- a/utils/McuProtocol/include/McuProtocol.h +++ b/utils/McuProtocol/include/McuProtocol.h @@ -88,6 +88,7 @@ public: virtual ~VProtocolRecv() = default; static std::shared_ptr &GetInstance(std::shared_ptr *impl = nullptr); virtual void GetIpcMissionReply(const unsigned int &serialNumber, const unsigned char &mission) {} + virtual void OnlyResultReply(const unsigned int &serialNumber, const ReplyResult &result) {} virtual void SetFeedingCycleForWatchDogReply(const unsigned int &serialNumber, const ReplyResult &result) {} }; class McuProtocol : virtual public VProtocolBase @@ -103,6 +104,9 @@ public: const StatusCode SetFeedingCycleForWatchDog(const unsigned char &hour, const unsigned char &min, const unsigned char &second, std::shared_ptr &context); + const StatusCode McuSetDateTime(const unsigned short &year, const unsigned char &mon, const unsigned char &day, + const unsigned char &hour, const unsigned char &min, const unsigned char &second, + std::shared_ptr &context); void DataHandleThread(void); protected: diff --git a/utils/McuProtocol/src/McuProtocol.cpp b/utils/McuProtocol/src/McuProtocol.cpp index 4842225..7201f86 100644 --- a/utils/McuProtocol/src/McuProtocol.cpp +++ b/utils/McuProtocol/src/McuProtocol.cpp @@ -88,6 +88,18 @@ const StatusCode McuProtocol::SetFeedingCycleForWatchDog(const unsigned char &ho return WriteProtocolData( handle->GetProtocolDataBuff(), handle->GetProtocolDataLength(), context, handle->GetSerialNumber()); } +const StatusCode McuProtocol::McuSetDateTime(const unsigned short &year, const unsigned char &mon, + const unsigned char &day, const unsigned char &hour, + const unsigned char &min, const unsigned char &second, + std::shared_ptr &context) +{ + SetDateTime dateTime(year, mon, day, hour, min, second); + std::shared_ptr param = + std::make_shared>(PROTOCOL_COMMAND::ASK_SET_DATE_TIME, dateTime); + std::shared_ptr handle = ProtocolHandle::CreateProtocolData(param); + return WriteProtocolData( + handle->GetProtocolDataBuff(), handle->GetProtocolDataLength(), context, handle->GetSerialNumber()); +} void McuProtocol::DataHandleThread(void) { mThreadRuning = true; diff --git a/utils/McuProtocol/src/ProtocolHandle.cpp b/utils/McuProtocol/src/ProtocolHandle.cpp index 1b28508..97fb1cb 100644 --- a/utils/McuProtocol/src/ProtocolHandle.cpp +++ b/utils/McuProtocol/src/ProtocolHandle.cpp @@ -19,21 +19,22 @@ #include "ModBusCRC16.h" #include #include +using std::placeholders::_1; +// using std::placeholders::_2; +// using std::placeholders::_3; +// using std::placeholders::_4; unsigned int ProtocolHandle::mSerialNumber = 1; std::mutex ProtocolHandle::mMutex; constexpr unsigned short PROTOCOL_HEAD = 0xFAC1; -constexpr size_t KEY_HEAD_LENGTH = sizeof(short) + sizeof(unsigned int) + sizeof(short) + sizeof(short); ProtocolHandle::ProtocolHandle(const std::shared_ptr ¶m) : mParam(param) { mProtocolData = nullptr; mProtocolDataLength = 0; - mMakePacketFunc[ASK_IPC_MISSION] = std::bind(&ProtocolHandle::MakeAskIpcMissionPacket, this, std::placeholders::_1); - mMakePacketFunc[ASK_CUT_OFF_PWOER_SUPPLY] = - std::bind(&ProtocolHandle::MakeAskCutOffPowerSupplyPacket, this, std::placeholders::_1); - mMakePacketFunc[ASK_FEED_WATCH_DOG] = - std::bind(&ProtocolHandle::MakeAskFeedWatchDogPacket, this, std::placeholders::_1); - mMakePacketFunc[ASK_SET_FEEDING_CYCLE] = - std::bind(&ProtocolHandle::MakeAskSetFeedingCyclePacket, this, std::placeholders::_1); + mMakePacketFunc[ASK_IPC_MISSION] = std::bind(&ProtocolHandle::MakeAskIpcMissionPacket, this, _1); + mMakePacketFunc[ASK_CUT_OFF_PWOER_SUPPLY] = std::bind(&ProtocolHandle::MakeAskCutOffPowerSupplyPacket, this, _1); + mMakePacketFunc[ASK_FEED_WATCH_DOG] = std::bind(&ProtocolHandle::MakeAskFeedWatchDogPacket, this, _1); + mMakePacketFunc[ASK_SET_FEEDING_CYCLE] = std::bind(&ProtocolHandle::MakeAskSetFeedingCyclePacket, this, _1); + mMakePacketFunc[ASK_SET_DATE_TIME] = std::bind(&ProtocolHandle::MakeAskSetDateTimePacket, this, _1); } ProtocolHandle::ProtocolHandle(const void *data, const size_t &length) { @@ -42,10 +43,10 @@ ProtocolHandle::ProtocolHandle(const void *data, const size_t &length) memcpy(mProtocolData, data, length); } mProtocolDataLength = length; - mAnalyzePacketFunc[REPLY_IPC_MISSION] = - std::bind(&ProtocolHandle::AnalyzeReplyIpcMissionPacket, this, std::placeholders::_1); + mAnalyzePacketFunc[REPLY_IPC_MISSION] = std::bind(&ProtocolHandle::AnalyzeReplyIpcMissionPacket, this, _1); mAnalyzePacketFunc[REPLY_SET_FEEDING_CYCLE] = - std::bind(&ProtocolHandle::AnalyzeReplySetFeedingCyclePacket, this, std::placeholders::_1); + std::bind(&ProtocolHandle::AnalyzeReplySetFeedingCyclePacket, this, _1); + mAnalyzePacketFunc[REPLY_SET_DATE_TIME] = std::bind(&ProtocolHandle::AnalyzeReplyResultPacket, this, _1); } ProtocolHandle::~ProtocolHandle() { @@ -64,6 +65,26 @@ ProtocolPacket ProtocolHandle::CreatePocketWithSerialNumber(void) mSerialNumber++; return packet; } +void ProtocolHandle::MallocPacketDataBuff(const void *data, const size_t dataLength, const short &command) +{ + size_t packetLength = KEY_HEAD_LENGTH + dataLength + CHECK_CODE_LENGTH; + mProtocolData = (unsigned char *)malloc(packetLength); + if (nullptr == mProtocolData) { + LogError("malloc failed, MakeAskIpcMissionPacket return.\n"); + return; + } + ProtocolPacket packet = CreatePocketWithSerialNumber(); + packet.mHead = PROTOCOL_HEAD; + packet.mCommand = command; + packet.mLength = packetLength; + BigEndianConversion(packet); + memcpy(mProtocolData, &packet, KEY_HEAD_LENGTH); + memcpy(mProtocolData + KEY_HEAD_LENGTH, data, dataLength); + packet.mCheckCode = calculate_check_sum(mProtocolData, packetLength - CHECK_CODE_LENGTH); + // packet.mCheckCode = BigEndianConversion(packet.mCheckCode); + memcpy(mProtocolData + packetLength - CHECK_CODE_LENGTH, &packet.mCheckCode, CHECK_CODE_LENGTH); + mProtocolDataLength = packetLength; +} void ProtocolHandle::MakeProtocolPacket(const std::shared_ptr ¶m) { if (mProtocolData != nullptr) { @@ -81,8 +102,8 @@ void ProtocolHandle::MakeProtocolPacket(const std::shared_ptr &p } void ProtocolHandle::MakeNoUserDataPacket(const std::shared_ptr ¶m) { - size_t dataLength = KEY_HEAD_LENGTH + sizeof(short); - mProtocolData = (unsigned char *)malloc(dataLength); + size_t packetLength = KEY_HEAD_LENGTH + CHECK_CODE_LENGTH; + mProtocolData = (unsigned char *)malloc(packetLength); if (nullptr == mProtocolData) { LogError("malloc failed, MakeAskIpcMissionPacket return.\n"); return; @@ -90,13 +111,13 @@ void ProtocolHandle::MakeNoUserDataPacket(const std::shared_ptr ProtocolPacket packet = CreatePocketWithSerialNumber(); packet.mHead = PROTOCOL_HEAD; packet.mCommand = param->mCommand; - packet.mLength = dataLength; + packet.mLength = packetLength; BigEndianConversion(packet); memcpy(mProtocolData, &packet, KEY_HEAD_LENGTH); - packet.mCheckCode = calculate_check_sum(mProtocolData, dataLength - sizeof(short)); + packet.mCheckCode = calculate_check_sum(mProtocolData, packetLength - CHECK_CODE_LENGTH); // packet.mCheckCode = BigEndianConversion(packet.mCheckCode); - memcpy(mProtocolData + KEY_HEAD_LENGTH, &packet.mCheckCode, sizeof(short)); - mProtocolDataLength = dataLength; + memcpy(mProtocolData + KEY_HEAD_LENGTH, &packet.mCheckCode, CHECK_CODE_LENGTH); + mProtocolDataLength = packetLength; } void ProtocolHandle::MakeAskIpcMissionPacket(const std::shared_ptr ¶m) { @@ -112,9 +133,9 @@ void ProtocolHandle::MakeAskFeedWatchDogPacket(const std::shared_ptr ¶m) { - constexpr int PARAM_DATA_LENGTH = 3; - size_t dataLength = KEY_HEAD_LENGTH + PARAM_DATA_LENGTH + sizeof(short); - mProtocolData = (unsigned char *)malloc(dataLength); + constexpr int PARAM_DATA_LENGTH = sizeof(WatchDogParam); + size_t packetLength = KEY_HEAD_LENGTH + PARAM_DATA_LENGTH + CHECK_CODE_LENGTH; + mProtocolData = (unsigned char *)malloc(packetLength); if (nullptr == mProtocolData) { LogError("malloc failed, MakeAskIpcMissionPacket return.\n"); return; @@ -125,21 +146,21 @@ void ProtocolHandle::MakeAskSetFeedingCyclePacket(const std::shared_ptrmData.mHour; - feedingCycle[1] = SetParam->mData.mMin; - feedingCycle[2] = SetParam->mData.mSecond; ProtocolPacket packet = CreatePocketWithSerialNumber(); packet.mHead = PROTOCOL_HEAD; packet.mCommand = param->mCommand; - packet.mLength = dataLength; + packet.mLength = packetLength; BigEndianConversion(packet); memcpy(mProtocolData, &packet, KEY_HEAD_LENGTH); - memcpy(mProtocolData + KEY_HEAD_LENGTH, feedingCycle, PARAM_DATA_LENGTH); - packet.mCheckCode = calculate_check_sum(mProtocolData, dataLength - sizeof(short)); + memcpy(mProtocolData + KEY_HEAD_LENGTH, &(SetParam->mData), PARAM_DATA_LENGTH); + packet.mCheckCode = calculate_check_sum(mProtocolData, packetLength - CHECK_CODE_LENGTH); // packet.mCheckCode = BigEndianConversion(packet.mCheckCode); - memcpy(mProtocolData + dataLength - sizeof(short), &packet.mCheckCode, sizeof(short)); - mProtocolDataLength = dataLength; + memcpy(mProtocolData + packetLength - CHECK_CODE_LENGTH, &packet.mCheckCode, CHECK_CODE_LENGTH); + mProtocolDataLength = packetLength; +} +void ProtocolHandle::MakeAskSetDateTimePacket(const std::shared_ptr ¶m) +{ + MakeProtocolData(param); } void ProtocolHandle::AnalyzeProtocolPacket(void) { @@ -179,6 +200,12 @@ unsigned char ProtocolHandle::ReplyOneBytePacketResult(const ProtocolPacket &pac LogInfo("reply result = 0x%02X\n", replyResult); return replyResult; } +void ProtocolHandle::AnalyzeReplyResultPacket(const ProtocolPacket &packet) +{ + LogInfo("AnalyzeReplyResultPacket\n"); + unsigned char replyResult = ReplyOneBytePacketResult(packet); + VProtocolRecv::GetInstance()->OnlyResultReply(mProtocolSerialNumber, static_cast(replyResult)); +} void ProtocolHandle::AnalyzeReplyIpcMissionPacket(const ProtocolPacket &packet) { LogInfo("AnalyzeReplyIpcMissionPacket\n"); @@ -194,7 +221,7 @@ void ProtocolHandle::AnalyzeReplySetFeedingCyclePacket(const ProtocolPacket &pac } bool ProtocolHandle::CheckoutTheCheckCode(const ProtocolPacket &packet) { - short code = calculate_check_sum(mProtocolData, mProtocolDataLength - sizeof(short)); + short code = calculate_check_sum(mProtocolData, mProtocolDataLength - CHECK_CODE_LENGTH); // short packetCode = BigEndianConversion(code); if (code == packet.mCheckCode) { return true; diff --git a/utils/McuProtocol/src/ProtocolHandle.h b/utils/McuProtocol/src/ProtocolHandle.h index b7da52f..d735b09 100644 --- a/utils/McuProtocol/src/ProtocolHandle.h +++ b/utils/McuProtocol/src/ProtocolHandle.h @@ -14,6 +14,7 @@ */ #ifndef PROTOCOL_HANDLE_H #define PROTOCOL_HANDLE_H +#include "ILog.h" #include "StatusCode.h" #include #include @@ -21,6 +22,8 @@ #include constexpr char ORDER_BIG_ENDIAN = 0x01; constexpr char ORDER_LITTLE_ENDIAN = 0x02; +constexpr size_t KEY_HEAD_LENGTH = sizeof(short) + sizeof(unsigned int) + sizeof(short) + sizeof(short); +constexpr size_t CHECK_CODE_LENGTH = sizeof(short); #pragma pack(1) typedef struct protocol_packet { @@ -40,21 +43,37 @@ enum PROTOCOL_COMMAND ASK_FEED_WATCH_DOG = 0x8103, ASK_SET_FEEDING_CYCLE = 0x8104, REPLY_SET_FEEDING_CYCLE = 0x0104, + ASK_SET_DATE_TIME = 0x8107, + REPLY_SET_DATE_TIME = 0x0107, PROTOCOL_COMMAND_END }; constexpr unsigned char ZERO_MEANS_SHUTDOWN_WATCH_DOG = 0x00; -class WatchDogParam +#pragma pack(1) +typedef struct watch_dog_param { -public: - WatchDogParam(const unsigned char &hour, const unsigned char &min, const unsigned char &second) + watch_dog_param(const unsigned char &hour, const unsigned char &min, const unsigned char &second) : mHour(hour), mMin(min), mSecond(second) { } - ~WatchDogParam() = default; const unsigned char mHour; const unsigned char mMin; const unsigned char mSecond; -}; +} WatchDogParam; +typedef struct set_date_time +{ + set_date_time(const unsigned short &year, const unsigned char &mon, const unsigned char &day, + const unsigned char &hour, const unsigned char &min, const unsigned char &second) + : mYear(year), mMon(mon), mDay(day), mHour(hour), mMin(min), mSecond(second) + { + } + const unsigned short mYear; + const unsigned char mMon; + const unsigned char mDay; + const unsigned char mHour; + const unsigned char mMin; + const unsigned char mSecond; +} SetDateTime; +#pragma pack() class VProtocolParam { public: @@ -99,20 +118,34 @@ public: */ private: ProtocolPacket CreatePocketWithSerialNumber(void); + void MallocPacketDataBuff(const void *data, const size_t dataLength, const short &command); void MakeProtocolPacket(const std::shared_ptr ¶m); void MakeNoUserDataPacket(const std::shared_ptr ¶m); void MakeAskIpcMissionPacket(const std::shared_ptr ¶m); void MakeAskCutOffPowerSupplyPacket(const std::shared_ptr ¶m); void MakeAskFeedWatchDogPacket(const std::shared_ptr ¶m); void MakeAskSetFeedingCyclePacket(const std::shared_ptr ¶m); + void MakeAskSetDateTimePacket(const std::shared_ptr ¶m); + template + void MakeProtocolData(const std::shared_ptr ¶m) + { + constexpr int PARAM_DATA_LENGTH = sizeof(T); + std::shared_ptr> SetParam = std::dynamic_pointer_cast>(param); + if (!SetParam) { + LogError("Invalid param.\n"); + return; + } + MallocPacketDataBuff(&(SetParam->mData), PARAM_DATA_LENGTH, param->mCommand); + } +private: /** * @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); unsigned char ReplyOneBytePacketResult(const ProtocolPacket &packet); + void AnalyzeReplyResultPacket(const ProtocolPacket &packet); void AnalyzeReplyIpcMissionPacket(const ProtocolPacket &packet); void AnalyzeReplySetFeedingCyclePacket(const ProtocolPacket &packet);