diff --git a/.cproject b/.cproject index 2fb2360..5d86c67 100644 --- a/.cproject +++ b/.cproject @@ -40,7 +40,7 @@ - + @@ -66,7 +66,7 @@ - + @@ -101,7 +101,7 @@ - + diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index ea042dc..20fbfa7 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h b/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h index f53a132..5388d35 100644 --- a/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h +++ b/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h @@ -26,7 +26,7 @@ * *---------------------------------------------------------------------------- * - * Portions Copyright 2016 STMicroelectronics International N.V. All rights reserved. + * Portions Copyright � 2016 STMicroelectronics International N.V. All rights reserved. * Portions Copyright (c) 2013 ARM LIMITED * All rights reserved. * Redistribution and use in source and binary forms, with or without @@ -278,7 +278,7 @@ typedef StaticQueue_t osStaticMessageQDef_t; /// Thread Definition structure contains startup information of a thread. /// \note CAN BE CHANGED: \b os_thread_def is implementation specific in every CMSIS-RTOS. typedef struct os_thread_def { - char *name; ///< Thread name + const char *name; ///< Thread name os_pthread pthread; ///< start address of thread function osPriority tpriority; ///< initial thread priority uint32_t instances; ///< maximum number of instances of that thread function diff --git a/a8000_protocol b/a8000_protocol index 5d083e1..38aa5a4 160000 --- a/a8000_protocol +++ b/a8000_protocol @@ -1 +1 @@ -Subproject commit 5d083e13b654460d9de05192ce9446c9b1d62069 +Subproject commit 38aa5a4b096eee25b062a6f9f49dded87289cb5f diff --git a/a8000_subboard.launch b/a8000_subboard.launch index a42d881..71bce7d 100644 --- a/a8000_subboard.launch +++ b/a8000_subboard.launch @@ -5,7 +5,7 @@ - + diff --git a/rst.bat b/rst.bat new file mode 100644 index 0000000..02bd566 --- /dev/null +++ b/rst.bat @@ -0,0 +1,2 @@ +C:\ST\STM32CubeIDE_1.15.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.1.200.202311302303\tools\bin\STM32_Programmer_CLI.exe ^ +-c port=SWD -rst \ No newline at end of file diff --git a/sdk/components/tmc/ic/ztmc5130.cpp b/sdk/components/tmc/ic/ztmc5130.cpp index f19e55f..f34d0b0 100644 --- a/sdk/components/tmc/ic/ztmc5130.cpp +++ b/sdk/components/tmc/ic/ztmc5130.cpp @@ -330,7 +330,7 @@ int32_t TMC51X0::to_user_vel(int32_t vel) { // void TMC51X0::readMotorState(bool *stoped, int32_t *error) { auto state = getGState(); - auto devStatus = getDevStatus(); + // auto devStatus = getDevStatus(); if (state.reset) { *error = (int32_t)err::kstep_motor_subic_reset; } else if (state.uv_cp) { diff --git a/sdk/components/zcancmder/basic.cpp b/sdk/components/zcancmder/basic.cpp index c6a76d2..c724da7 100644 --- a/sdk/components/zcancmder/basic.cpp +++ b/sdk/components/zcancmder/basic.cpp @@ -7,29 +7,29 @@ using namespace iflytop; using namespace std; uint16_t CanPacketRxBuffer::get_packetindex() { zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; - return cmdheader->packetindex; + return cmdheader->index; } uint16_t CanPacketRxBuffer::get_cmdid() { zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; - return CMDID(cmdheader->cmdMainId, cmdheader->cmdSubId); -} -uint8_t CanPacketRxBuffer::get_cmdSubId() { - zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; - return cmdheader->cmdSubId; + return cmdheader->cmdid; } + uint8_t CanPacketRxBuffer::get_packetType() { zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; return cmdheader->packetType; } uint8_t *CanPacketRxBuffer::get_params() { zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; - return cmdheader->data; + return (cmdheader->data); +} +uint16_t CanPacketRxBuffer::get_params_len() { + zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; + return cmdheader->datalen; } -uint16_t CanPacketRxBuffer::get_params_len() { return rxdataSize - sizeof(zcr_cmd_header_t); } -void CanPacketRxBuffer::clear() { +void CanPacketRxBuffer::clear() { id = 0; - memset(&m_canPacket, 0, sizeof(m_canPacket)); //fix + memset(&m_canPacket, 0, sizeof(m_canPacket)); // fix m_canPacketNum = 0; m_npacket = 0; memset(rxdata, 0, sizeof(rxdata)); @@ -43,9 +43,7 @@ void CanPacketRxBuffer::clear() { bool CanPacketRxBuffer::iscmd(int32_t id) { zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; - uint16_t maincmdid = ((uint32_t)id >> 8) & 0xFFFF; - uint8_t cmdSubId = ((uint32_t)id) & 0xFF; - return cmdheader->cmdMainId == maincmdid && cmdheader->cmdSubId == cmdSubId; + return cmdheader->cmdid == id; } zcr_cmd_header_t *CanPacketRxBuffer::get_cmdheader() { zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata; diff --git a/sdk/components/zcancmder/basic.hpp b/sdk/components/zcancmder/basic.hpp index 9152b5c..b08e4e7 100644 --- a/sdk/components/zcancmder/basic.hpp +++ b/sdk/components/zcancmder/basic.hpp @@ -3,8 +3,8 @@ // #pragma once -#include "sdk/os/zos.hpp" #include "a8000_protocol\protocol.hpp" +#include "sdk/os/zos.hpp" namespace iflytop { namespace zcr { @@ -25,12 +25,12 @@ using namespace zcr; class CanPacketRxBuffer { public: - uint16_t id = 0; - CANPacket m_canPacket[100] = {0}; // 用于接收can消息 - uint8_t m_canPacketNum = 0; - uint8_t m_npacket = 0; - uint8_t rxdata[1000] = {0}; - int rxdataSize = 0; + uint16_t id = 0; + CANPacket m_canPacket[20] = {0}; // 用于接收can消息 + uint8_t m_canPacketNum = 0; + uint8_t m_npacket = 0; + uint8_t rxdata[256] = {0}; + int rxdataSize = 0; bool dataIsReady = false; bool isOnReceive = false; @@ -42,13 +42,12 @@ class CanPacketRxBuffer { public: uint16_t get_packetindex(); uint16_t get_cmdid(); - uint8_t get_cmdSubId(); uint8_t get_packetType(); uint8_t *get_params(); uint16_t get_params_len(); void clear(); - uint8_t* get_rx_raw(); + uint8_t *get_rx_raw(); uint16_t get_rx_raw_len(); zcr_cmd_header_t *get_cmdheader(); diff --git a/sdk/components/zcancmder/protocol_event_bus_sender.cpp b/sdk/components/zcancmder/protocol_event_bus_sender.cpp index c11034a..865445b 100644 --- a/sdk/components/zcancmder/protocol_event_bus_sender.cpp +++ b/sdk/components/zcancmder/protocol_event_bus_sender.cpp @@ -12,9 +12,8 @@ void ProtocolEventBusSender::push_reg_state_change_event(int32_t moduleid, int32 zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf; int32_t* data = (int32_t*)cmd_header->data; - cmd_header->moduleid = moduleid; - cmd_header->cmdMainId = zcr::kevent_bus_reg_change_report >> 8; - cmd_header->cmdSubId = zcr::kevent_bus_reg_change_report & 0xff; + cmd_header->moduleId = moduleid; + cmd_header->cmdid = zcr::kevent_bus_reg_change_report; data[0] = regindex; data[1] = oldval; @@ -27,9 +26,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex) { zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf; int32_t* data = (int32_t*)cmd_header->data; - cmd_header->moduleid = moduleid; - cmd_header->cmdMainId = cmdindex >> 8; - cmd_header->cmdSubId = cmdindex & 0xff; + cmd_header->moduleId = moduleid; + cmd_header->cmdid = cmdindex; + m_zcanreceiver->triggerEvent(cmd_header, (uint8_t*)data, 0); } @@ -39,9 +38,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex, int32_t zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf; int32_t* data = (int32_t*)cmd_header->data; - cmd_header->moduleid = moduleid; - cmd_header->cmdMainId = cmdindex >> 8; - cmd_header->cmdSubId = cmdindex & 0xff; + cmd_header->moduleId = moduleid; + cmd_header->cmdid = cmdindex; + data[0] = data0; m_zcanreceiver->triggerEvent(cmd_header, (uint8_t*)data, 4 * 1); @@ -51,9 +50,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex, int32_t zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf; int32_t* data = (int32_t*)cmd_header->data; - cmd_header->moduleid = moduleid; - cmd_header->cmdMainId = cmdindex >> 8; - cmd_header->cmdSubId = cmdindex & 0xff; + cmd_header->moduleId = moduleid; + cmd_header->cmdid = cmdindex; + data[0] = data0; data[1] = data1; @@ -64,9 +63,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex, int32_t zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf; int32_t* data = (int32_t*)cmd_header->data; - cmd_header->moduleid = moduleid; - cmd_header->cmdMainId = cmdindex >> 8; - cmd_header->cmdSubId = cmdindex & 0xff; + cmd_header->moduleId = moduleid; + cmd_header->cmdid = cmdindex; + data[0] = data0; data[1] = data1; diff --git a/sdk/components/zcancmder/zcan_protocol_parser.cpp b/sdk/components/zcancmder/zcan_protocol_parser.cpp index 593c0a2..f90164a 100644 --- a/sdk/components/zcancmder/zcan_protocol_parser.cpp +++ b/sdk/components/zcancmder/zcan_protocol_parser.cpp @@ -16,6 +16,15 @@ using namespace std; #define REGFN(fn) regCmdFn(k##fn, fn); +static const char* hex2str(const char* hex, size_t len) { + static char buf[256]; + memset(buf, 0, sizeof(buf)); + for (size_t i = 0; i < len; i++) { + sprintf(buf + i * 2, "%02X", hex[i]); + } + return buf; +} + void ZCanProtocolParser::initialize(IZCanReceiver* cancmder) { m_cancmder = cancmder; m_cancmder->registerListener(this); @@ -167,17 +176,17 @@ void ZCanProtocolParser::registerModule(ZIModule* module) { _registerModule(id, module); } -void ZCanProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, uint8_t* data, int32_t len) { - // printf("onRceivePacket cmdid:%d moduleid:%d cmdSubId:%d\n", rxcmd->cmdMainId, rxcmd->moduleid, rxcmd->cmdSubId); - uint16_t moduleid = rxcmd->moduleid; +void ZCanProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, int32_t len) { + // printf("onRceivePacket cmdid:%d moduleid:%d\n", rxcmd->cmdid, rxcmd->moduleId); + uint16_t moduleid = rxcmd->moduleId; auto it = m_modulers.find(moduleid); if (it == m_modulers.end()) { return; } ZIModule* module = it->second; - int32_t cmdid = CMDID(rxcmd->cmdMainId, rxcmd->cmdSubId); - _onRceivePacket(module, rxcmd, cmdid, rxcmd->data, len); + int32_t cmdid = rxcmd->cmdid; + _onRceivePacket(module, rxcmd, len); } void ZCanProtocolParser::regCmdFn(int32_t cmdid, cmdcb_t cb) { @@ -194,30 +203,58 @@ ZCanProtocolParser::cmdfn_t* ZCanProtocolParser::findcmdfn(int32_t cmdid) { return nullptr; } -void ZCanProtocolParser::_onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t cmdid, uint8_t* param, int32_t len) { +static bool checkpacket(const zcr_cmd_header_t* header, int len) { + if (len < sizeof(zcr_cmd_header_t)) { + return false; + } + if ((header->datalen + sizeof(zcr_cmd_header_t) + 1) != len) { + return false; + } + + uint8_t* rawpacket = (uint8_t*)header; + uint8_t checksum = 0; + for (int i = 0; i < len - 1; i++) { + checksum += rawpacket[i]; + } + + if (checksum != rawpacket[len - 1]) { + return false; + } + + return true; +} + +void ZCanProtocolParser::_onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len) { int paramNum = (len) / sizeof(int32_t); int32_t* ack = (int32_t*)&ackbuf[0]; - cmdfn_t* fn = findcmdfn(cmdid); + cmdfn_t* fn = findcmdfn(rxcmd->cmdid); if (!fn) { + ZLOGE(TAG, "cmd not support:%d,rx:%s", rxcmd->cmdid, hex2str((const char*)rxcmd, len)); m_cancmder->sendErrorAck(rxcmd, err::kcmd_not_support); return; } + + if (!checkpacket(rxcmd, len)) { + ZLOGE(TAG, "check sum error,rx:%s(%d)", hex2str((const char*)rxcmd, len), len); + m_cancmder->sendErrorAck(rxcmd, err::kcheck_sum_error); + return; + } + cmdcontxt_t cxt = {0}; cxt.module = module; cxt.rxcmd = rxcmd; - cxt.cmdid = cmdid; - cxt.params = (int32_t*)param; - cxt.paramRaw = param; - cxt.paramlen = len; + cxt.cmdid = rxcmd->cmdid; + cxt.params = (int32_t*)rxcmd->data; + cxt.paramRaw = rxcmd->data; + cxt.paramlen = rxcmd->datalen; cxt.acklen = 0; cxt.ackbuf = ackbuf; memset(ackbuf, 0, sizeof(ackbuf)); - - int32_t ecode = module->bfcall(cmdid, param, len); + int32_t ecode = module->bfcall(cxt.cmdid, cxt.paramRaw, cxt.paramlen); if (ecode == 0) ecode = fn->cb(&cxt); - module->aftercall(cmdid, param, len, cxt.ackbuf, cxt.acklen, ecode); + module->aftercall(cxt.cmdid, cxt.paramRaw, cxt.paramlen, cxt.ackbuf, cxt.acklen, ecode); if (ecode != 0) { m_cancmder->sendErrorAck(rxcmd, ecode); @@ -940,4 +977,4 @@ int32_t ZCanProtocolParser::pipette_lld_is_detect_liquid(cmdcontxt_t* cxt) { return module->pipette_lld_is_detect_liquid(&ack[0]); } -#undef MODULE_CLASS \ No newline at end of file +#undef MODULE_CLASS diff --git a/sdk/components/zcancmder/zcan_protocol_parser.hpp b/sdk/components/zcancmder/zcan_protocol_parser.hpp index 674bf7b..fd41a48 100644 --- a/sdk/components/zcancmder/zcan_protocol_parser.hpp +++ b/sdk/components/zcancmder/zcan_protocol_parser.hpp @@ -40,13 +40,13 @@ class ZCanProtocolParser : public IZCanReceiverListener { public: void initialize(IZCanReceiver* cancmder); - virtual void onRceivePacket(zcr_cmd_header_t* rxcmd, uint8_t* data, int32_t len); + virtual void onRceivePacket(zcr_cmd_header_t* rxcmd, int32_t len); void registerModule(ZIModule* module); ZIModule* getModule(int id) { return m_modulers[id]; } private: void _registerModule(uint16_t id, ZIModule* module); - void _onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t cmdid, uint8_t* param, int32_t len); + void _onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len); void regCmdFn(int32_t cmdid, cmdcb_t cb); cmdfn_t* findcmdfn(int32_t cmdid); @@ -173,8 +173,6 @@ class ZCanProtocolParser : public IZCanReceiverListener { CMDFN(pipette_zmotor_move_by); CMDFN(pipette_zmotor_move_to); - - CMDFN(liquid_operation_clear_params); CMDFN(liquid_operation_set_gun_runparams); CMDFN(liquid_operation_set_zmotor_runparams); diff --git a/sdk/components/zcancmder/zcanreceiver.cpp b/sdk/components/zcancmder/zcanreceiver.cpp index 581e398..dd3c26e 100644 --- a/sdk/components/zcancmder/zcanreceiver.cpp +++ b/sdk/components/zcancmder/zcanreceiver.cpp @@ -11,6 +11,14 @@ using namespace zcr; #define OVER_TIME_MS 5 +static void assign_packet_checksum(uint8_t *packet, int len) { + uint8_t checksum = 0; + for (int i = 0; i < len - 1; i++) { + checksum += packet[i]; + } + packet[len - 1] = checksum; +} + ZCanReceiver::CFG *ZCanReceiver::createCFG(uint8_t deviceId) { CFG *cfg = new CFG(); ZASSERT(cfg != NULL); @@ -71,10 +79,6 @@ void ZCanReceiver::initialize(CFG *cfg) { HAL_StatusTypeDef ZCanReceiver::initializeFilter() { /** * @brief ID区帧格式 - * [ 27:0 ] - * [ STDID ] [ EXTID ] - * [11 :9] [8:6] [5:0] [17:16] [15:8] [7:0] - * 优先级 属性 帧类型 目标ID 源ID */ HAL_StatusTypeDef HAL_Status; CAN_FilterTypeDef sFilterConfig; @@ -118,23 +122,34 @@ void ZCanReceiver::registerListener(IZCanReceiverListener *listener) { m_listene // } // return buf; // } + +static const char* hex2str(const char* hex, size_t len) { + static char buf[256]; + memset(buf, 0, sizeof(buf)); + for (size_t i = 0; i < len; i++) { + sprintf(buf + i * 2, "%02X", hex[i]); + } + return buf; +} + void ZCanReceiver::sendPacket(uint8_t *packet, size_t len) { + ZLOGI(TAG, "sendPacket %s(%d)", hex2str((const char *)packet, len), len); /** * @brief */ - int npacket = len / 8 + (len % 8 == 0 ? 0 : 1); + int npacket = len / 7 + (len % 7 == 0 ? 0 : 1); if (npacket > 255) { ZLOGE(TAG, "sendPacket fail, len:%d", len); return; } - int finalpacketlen = len % 8 == 0 ? 8 : len % 8; + int finalpacketlen = len % 7 == 0 ? 7 : len % 7; for (uint8_t i = 0; i < npacket; i++) { bool suc = false; if (i == npacket - 1) { - suc = sendPacketSub(npacket, i, packet + i * 8, finalpacketlen, OVER_TIME_MS); + suc = sendPacketSub(npacket, i, packet + i * 7, finalpacketlen, OVER_TIME_MS); } else { - suc = sendPacketSub(npacket, i, packet + i * 8, 8, OVER_TIME_MS); + suc = sendPacketSub(npacket, i, packet + i * 7, 7, OVER_TIME_MS); } if (!suc) { ZLOGE(TAG, "sendPacket fail, packet(%d:%d)", npacket, i); @@ -142,93 +157,74 @@ void ZCanReceiver::sendPacket(uint8_t *packet, size_t len) { } } } -#if 0 -void ZCanReceiver::sendAck(zcr_cmd_header_t *cmdheader, uint8_t *data, size_t len) { - zlock_guard l(m_lock); - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; - memcpy(txheader, cmdheader, sizeof(zcr_cmd_header_t)); - txheader->packetType = kptv2_ack; - memcpy(txheader->data, data, len); - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len); -} -void ZCanReceiver::sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode) { - zlock_guard l(m_lock); - - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; - memcpy(txheader, cmdheader, sizeof(zcr_cmd_header_t)); - txheader->packetType = kptv2_error_ack; - zcanreceiver_error_ack_t *error_ack = (zcanreceiver_error_ack_t *)txheader->data; - error_ack->id = id; - error_ack->errorcode = errcode; - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(zcanreceiver_error_ack_t)); -} -void ZCanReceiver::sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len) { - zlock_guard l(m_lock); +int32_t ZCanReceiver::sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) { + zlock_guard l(m_lock); + zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; + int packetlen = sizeof(zcr_cmd_header_t) + len + 1; - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; - memcpy(txheader, rxcmdheader, sizeof(zcr_cmd_header_t)); - txheader->packetType = kptv2_cmd_exec_status_report; - memcpy(txheader->data, data, len); - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len); -} -void ZCanReceiver::sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len) { - zlock_guard l(m_lock); + ZASSERT(sizeof(txbuff) > packetlen); - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; - memcpy(txheader, rxcmdheader, sizeof(zcr_cmd_header_t)); - txheader->packetType = kptv2_report; - memcpy(txheader->data, data, len); - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len); -} -#endif -int32_t ZCanReceiver::sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) { - zlock_guard l(m_lock); - ZASSERT(sizeof(txbuff) > sizeof(zcr_cmd_header_t) + len); - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t)); txheader->packetType = kptv2_ack; + txheader->datalen = len; memcpy(txheader->data, data, len); - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len); + assign_packet_checksum(txbuff, packetlen); + + sendPacket(txbuff, packetlen); return 0; } int32_t ZCanReceiver::triggerEvent(zcr_cmd_header_t *cmd_header, uint8_t *data, int32_t len) { - zlock_guard l(m_lock); - m_reportIndex++; - ZASSERT(sizeof(txbuff) > sizeof(zcr_cmd_header_t) + len); - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; + zlock_guard l(m_lock); + zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; + int packetlen = sizeof(zcr_cmd_header_t) + len + 1; + + ZASSERT(sizeof(txbuff) > packetlen); + memcpy(txheader, cmd_header, sizeof(zcr_cmd_header_t)); - txheader->packetType = kptv2_event; - txheader->packetindex = m_reportIndex; + txheader->packetType = kptv2_event; + txheader->index = m_reportIndex; + txheader->datalen = len; memcpy(txheader->data, data, len); - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len); + assign_packet_checksum(txbuff, packetlen); + + sendPacket(txbuff, packetlen); + + m_reportIndex++; return 0; } int32_t ZCanReceiver::sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) { - zlock_guard l(m_lock); - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; + zlock_guard l(m_lock); + + zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; + int packetlen = sizeof(zcr_cmd_header_t) + sizeof(int32_t) * nack + 1; + memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t)); txheader->packetType = kptv2_ack; - - int32_t *txackcache = (int32_t *)txheader->data; + int32_t *txackcache = (int32_t *)txheader->data; + txheader->datalen = nack * sizeof(int32_t); for (int i = 0; i < nack; i++) { txackcache[i] = ackvar[i]; } + assign_packet_checksum(txbuff, packetlen); - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(int32_t) * nack); + sendPacket(txbuff, packetlen); return 0; } int32_t ZCanReceiver::sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) { zlock_guard l(m_lock); - zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; + zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; + int32_t *txackcache = (int32_t *)txheader->data; + int packetlen = sizeof(zcr_cmd_header_t) + sizeof(int32_t) * 1 + 1; + memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t)); txheader->packetType = kptv2_error_ack; + txheader->datalen = sizeof(int32_t); + txackcache[0] = errorcode; - int32_t *txackcache = (int32_t *)txheader->data; - txackcache[0] = errorcode; - - sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(int32_t)); + assign_packet_checksum(txbuff, packetlen); + sendPacket(txbuff, packetlen); return 0; } @@ -244,14 +240,15 @@ bool ZCanReceiver::sendPacketSub(int npacket, int packetIndex, uint8_t *packet, memset(&pHeader, 0, sizeof(pHeader)); memset(aData, 0, sizeof(aData)); - pHeader.StdId = 0x00; - pHeader.ExtId = (m_config->deviceId << 16) | (npacket << 8) | packetIndex; - pHeader.IDE = CAN_ID_EXT; + pHeader.StdId = m_config->deviceId; + pHeader.ExtId = 0; + pHeader.IDE = CAN_ID_STD; pHeader.RTR = CAN_RTR_DATA; - pHeader.DLC = len; + pHeader.DLC = len + 1; pHeader.TransmitGlobalTime = DISABLE; - memcpy(aData, packet, len); + aData[0] = (npacket << 4) | packetIndex; + memcpy(aData + 1, packet, len); m_lastTransmitStatus = HAL_CAN_AddTxMessage(m_config->canHandle, &pHeader, aData, &txMailBox); if (m_lastTransmitStatus != HAL_OK) { @@ -266,6 +263,7 @@ bool ZCanReceiver::sendPacketSub(int npacket, int packetIndex, uint8_t *packet, return false; } // m_os->sleepMS(1); + osDelay(1); } if (txPacketInterval_ms > 0) { osDelay(txPacketInterval_ms); @@ -294,7 +292,6 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl * @brief 中断上下文 */ // ZLOG_INFO("%s\n", __FUNCTION__); - // printf("------------------%s\n", __FUNCTION__); if (canHandle != m_config->canHandle) { return; } @@ -302,45 +299,46 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl * @brief 处理can接收到消息 */ CAN_RxHeaderTypeDef pHeader; - uint8_t aData[8] /*8byte table*/; + uint8_t aData[8] = {0}; + CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer[0]; while (getRxMessage(&pHeader, aData)) { - /** - * @brief 消息格式 - * - * [2] [3bit] [8bit] [8bit] [8bit] - * , from frameNum frameId - */ - uint8_t from = (pHeader.ExtId >> 16 & 0xFF); - uint8_t nframe = (pHeader.ExtId & 0xFF00) >> 8; - uint8_t frameId = (pHeader.ExtId & 0x00FF); - CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer[0]; - if (from != rxbuf->id) { - // 目前只接收来自主机的消息 - continue; - } + // 过滤掉非标准帧和远程帧,和DLC为0的帧 + if (pHeader.RTR != CAN_RTR_DATA || pHeader.IDE != CAN_ID_STD) continue; + if (pHeader.DLC == 0) continue; + + // 上次接收到的消息还没有来的急处理 + if (rxbuf->dataIsReady) continue; - if (rxbuf->dataIsReady) { - // 上次接收到的消息还没有来的急处理 - continue; - } /** - * @TODO:判断是否丢包 + * @brief 处理接收到的数据 */ - if (frameId == 0) { + + uint8_t from = (pHeader.StdId & 0xFF); + uint8_t nframe = (aData[0] & 0xF0) >> 4; + uint8_t frameoff = (aData[0] & 0x0F); + + // 只接收来自主机的消息 + if (from != rxbuf->id) continue; + + // 当frameoff==0,重置接收缓存 + if (frameoff == 0) { rxbuf->m_canPacketNum = 0; } - if (rxbuf->m_canPacketNum != frameId) { + // 当接收到非期望frameoff的数据时,说明发生了丢包,重置接收缓存 + if (rxbuf->m_canPacketNum != frameoff) { rxbuf->m_canPacketNum = 0; continue; } + // 接收到有效包 if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) { rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC; memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8); rxbuf->m_canPacketNum++; } - if (nframe == frameId + 1) { + + if (nframe == frameoff + 1) { rxbuf->m_npacket = nframe; rxbuf->dataIsReady = true; } @@ -362,13 +360,15 @@ void ZCanReceiver::loop() { } else { int dataoff = 0; for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) { - memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].dlc); - dataoff += rxbuf->m_canPacket[i].dlc; + if (rxbuf->m_canPacket[i].dlc == 0) continue; + + memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData + 1, rxbuf->m_canPacket[i].dlc - 1); + dataoff += rxbuf->m_canPacket[i].dlc - 1; } rxbuf->rxdataSize = dataoff; // ZLOGI(TAG,"rx packet"); for (auto &var : m_listenerList) { - if (var) var->onRceivePacket(rxbuf->get_cmdheader(), rxbuf->get_params(), rxbuf->get_params_len()); + if (var) var->onRceivePacket(rxbuf->get_cmdheader(), rxbuf->get_rx_raw_len()); } } diff --git a/sdk/components/zcancmder/zcanreceiver.hpp b/sdk/components/zcancmder/zcanreceiver.hpp index 0a9fc09..e0df792 100644 --- a/sdk/components/zcancmder/zcanreceiver.hpp +++ b/sdk/components/zcancmder/zcanreceiver.hpp @@ -3,14 +3,13 @@ // #pragma once +#include "a8000_protocol\protocol.hpp" #include "basic.hpp" #include "sdk/os/zos.hpp" -#include "a8000_protocol\protocol.hpp" #ifdef HAL_CAN_MODULE_ENABLED namespace iflytop { using namespace zcr; - typedef function zcanreceiver_listener_t; class ZCanReceiver : public ZCanIRQListener, public IZCanReceiver { @@ -28,7 +27,7 @@ class ZCanReceiver : public ZCanIRQListener, public IZCanReceiver { int packetRxOvertime_ms; // }; - uint8_t txbuff[2100]; + uint8_t txbuff[128]; public: class LoopJobContext { @@ -43,24 +42,18 @@ class ZCanReceiver : public ZCanIRQListener, public IZCanReceiver { HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值 list m_listenerList; - CanPacketRxBuffer m_canPacketRxBuffer[1]; + CanPacketRxBuffer m_canPacketRxBuffer[1]; int txPacketInterval_ms = 0; zmutex m_lock; - int32_t m_reportIndex = 0; + int8_t m_reportIndex = 0; public: ZCanReceiver() {} CFG *createCFG(uint8_t deviceId); void initialize(CFG *cfg); -#if 0 - void sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len); - void sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len); - void sendAck(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len); - void sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode); -#endif uint8_t getDeviceId() { return m_config->deviceId; } void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; } diff --git a/usrc/public_service/stm32irq.c b/usrc/public_service/stm32irq.c index ce4456f..8c36be4 100644 --- a/usrc/public_service/stm32irq.c +++ b/usrc/public_service/stm32irq.c @@ -3,13 +3,13 @@ #include "gins.h" #include "main.h" #include "stm32f4xx_it.h" -static stm32_irq_cb_t irqcb[100]; +extern void SysMgr_on_NMI_Handler(void); +extern void SysMgr_on_HardFault_Handler(void); +extern void SysMgr_on_MemManage_Handler(void); +extern void SysMgr_on_BusFault_Handler(void); +extern void SysMgr_on_UsageFault_Handler(void); + -static void callirqcb(stm32irq_type_t type) { - if (irqcb[type] != NULL) { - irqcb[type](); - } -} void NMI_Handler(void) { SysMgr_on_NMI_Handler(); while (1) { @@ -86,4 +86,3 @@ void UART4_IRQHandler(void) { HAL_UART_IRQHandler(&huart4); } * EXT * ***********************************************************************************************************************/ -void stm32irq_reg(stm32irq_type_t type, stm32_irq_cb_t cb) { irqcb[type] = cb; } diff --git a/usrc/public_service/stm32irq.h b/usrc/public_service/stm32irq.h index ed094b2..ca3e57d 100644 --- a/usrc/public_service/stm32irq.h +++ b/usrc/public_service/stm32irq.h @@ -3,21 +3,3 @@ // typedef // void stm32irq_reg(); - -typedef void (*stm32_irq_cb_t)(); - -typedef enum { - kDMA1_Stream1_IRQ, - kDMA1_Stream3_IRQ, - kDMA2_Stream2_IRQ, - kCAN1_TX_IRQ, - kCAN1_RX0_IRQ, - kCAN1_RX1_IRQ, - kCAN1_SCE_IRQ, - kTIM1_TRG_COM_TIM11_IRQ, - kUSART1_IRQ, - kTIM6_DAC_IRQ, - kTIM7_IRQ, -} stm32irq_type_t; - -void stm32irq_reg(stm32irq_type_t type, stm32_irq_cb_t cb); diff --git a/usrc/subboards/subboard40_and_50_temperature_ctrl/subboard40_and_50_temperature_ctrl_board.c b/usrc/subboards/subboard40_and_50_temperature_ctrl/subboard40_and_50_temperature_ctrl_board.c index c63facc..70c8672 100644 --- a/usrc/subboards/subboard40_and_50_temperature_ctrl/subboard40_and_50_temperature_ctrl_board.c +++ b/usrc/subboards/subboard40_and_50_temperature_ctrl/subboard40_and_50_temperature_ctrl_board.c @@ -1,5 +1,6 @@ #include "main.h" #include "public_service/public_service.h" +#include /* TIM2 init function */ void MX_TIM2_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE();