Browse Source

fix protocol parser bug

master
zhaohe 2 years ago
parent
commit
d3c111f03e
  1. 1
      components/zcancmder/zcanreceiver.cpp
  2. 75
      components/zcancmder_module/zcan_basic_order_module.cpp
  3. 54
      components/zcancmder_module/zcan_basic_order_module.hpp
  4. 33
      components/zcancmder_module/zcan_eeprom_module.cpp
  5. 21
      components/zcancmder_module/zcan_eeprom_module.hpp
  6. 74
      components/zcancmder_module/zcan_fan_ctrl_module.cpp
  7. 56
      components/zcancmder_module/zcan_fan_ctrl_module.hpp
  8. 5
      components/zcancmder_module/zcan_mini_servo_ctrl_module.cpp
  9. 6
      components/zcancmder_module/zcan_mini_servo_ctrl_module.hpp
  10. 2
      components/zprotocols/zcancmder_v2

1
components/zcancmder/zcanreceiver.cpp

@ -348,6 +348,7 @@ void ZCanCmder::loop() {
dataoff += rxbuf->m_canPacket[i].dlc;
}
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());

75
components/zcancmder_module/zcan_basic_order_module.cpp

@ -1,75 +0,0 @@
#include "zcan_basic_order_module.hpp"
#include <stdio.h>
#include <string.h>
#ifdef HAL_CAN_MODULE_ENABLED
using namespace iflytop;
using namespace zcr;
#if 0
void ZCanBasicOrderModule::initialize(ZCanCmder* zcanReceiver) {
zcanReceiver->registerListener(this);
m_zcanReceiver = zcanReceiver;
}
#if 0
void ZCanBasicOrderModule::reg_read_io(readfn_t fn) { m_readfn = fn; }
void ZCanBasicOrderModule::reg_set_io(writefn_t fn) { m_writefn = fn; }
void ZCanBasicOrderModule::reg_read_adc(readadcval_t fn) { m_readadcval = fn; }
#endif
void ZCanBasicOrderModule::reg_read_io(uint8_t id, readfn_t fn) { m_inputCtlMap[id] = fn; }
void ZCanBasicOrderModule::reg_set_io(uint8_t id, writefn_t fn) { m_outCtlMap[id] = fn; }
void ZCanBasicOrderModule::reg_read_adc(uint8_t id, readadcval_t fn) { m_readAdcValMap[id] = fn; }
void ZCanBasicOrderModule::onRceivePacket(CanPacketRxBuffer* rxbuf) {
if (rxbuf->iscmd(kcmd_ping)) {
kcmd_ping_cmd_t* pingcmd = rxbuf->get_param_as<kcmd_ping_cmd_t>();
kcmd_ping_ack_t* ack = (kcmd_ping_ack_t*)txbuff;
if (pingcmd->boardid == m_zcanReceiver->getDeviceId()) {
ack->boardid = pingcmd->boardid;
m_zcanReceiver->sendAck(rxbuf->get_cmdheader(), txbuff, sizeof(kcmd_ping_ack_t));
return;
}
} else if (rxbuf->iscmd(kcmd_read_io)) {
kcmd_read_io_cmd_t* cmd = rxbuf->get_param_as<kcmd_read_io_cmd_t>();
kcmd_read_io_ack_t* ack = (kcmd_read_io_ack_t*)txbuff;
bool val = false;
if (m_inputCtlMap.find(cmd->ioid) != m_inputCtlMap.end()) {
val = m_inputCtlMap[cmd->ioid]();
ack->ioid = cmd->ioid;
ack->val = val;
m_zcanReceiver->sendAck(rxbuf->get_cmdheader(), txbuff, sizeof(kcmd_read_io_ack_t));
}
} else if (rxbuf->iscmd(kcmd_set_io)) {
kcmd_set_io_cmd_t* cmd = rxbuf->get_param_as<kcmd_set_io_cmd_t>();
kcmd_set_io_ack_t ack;
bool val = cmd->val;
if (m_outCtlMap.find(cmd->ioid) != m_outCtlMap.end()) {
m_outCtlMap[cmd->ioid](val);
ack.ioid = cmd->ioid;
ack.val = val;
m_zcanReceiver->sendAck(rxbuf->get_cmdheader(), (uint8_t*)&ack, sizeof(ack));
return;
}
} else if (rxbuf->iscmd(kcmd_readadc_raw)) {
kcmd_readadc_raw_cmd_t* cmd = rxbuf->get_param_as<kcmd_readadc_raw_cmd_t>();
kcmd_readadc_raw_ack_t ack;
int32_t val = 0;
if (m_readAdcValMap.find(cmd->sensorid) != m_readAdcValMap.end()) {
val = m_readAdcValMap[cmd->sensorid]();
ack.sensorid = cmd->sensorid;
ack.val = val;
m_zcanReceiver->sendAck(rxbuf->get_cmdheader(), (uint8_t*)&ack, sizeof(ack));
return;
}
}
}
void ZCanBasicOrderModule::loop() {}
#endif
#endif

54
components/zcancmder_module/zcan_basic_order_module.hpp

@ -1,54 +0,0 @@
//
// Created by zwsd
//
#pragma once
//
#include "sdk/os/zos.hpp"
#include "sdk\components\zcancmder\zcanreceiver.hpp"
#ifdef HAL_CAN_MODULE_ENABLED
#include <map>
namespace iflytop {
using namespace std;
#if 0
class ZCanBasicOrderModule : public ZCanCmderListener {
public:
private:
ZCanCmder* m_zcanReceiver;
typedef function<bool()> readfn_t;
typedef function<void(bool val)> writefn_t;
typedef function<int32_t()> readadcval_t;
// readfn_t m_readfn;
// writefn_t m_writefn;
// readadcval_t m_readadcval;
uint8_t txbuff[32];
map<int, readfn_t> m_inputCtlMap;
map<int, writefn_t> m_outCtlMap;
map<int, readadcval_t> m_readAdcValMap;
public:
ZCanBasicOrderModule(/* args */) {}
~ZCanBasicOrderModule() {}
public:
void initialize(ZCanCmder* zcanReceiver);
void reg_read_io(uint8_t id, readfn_t fn);
void reg_set_io(uint8_t id, writefn_t fn);
void reg_read_adc(uint8_t id, readadcval_t fn);
public:
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf);
private:
void loop();
};
#endif
} // namespace iflytop
#endif

33
components/zcancmder_module/zcan_eeprom_module.cpp

@ -1,33 +0,0 @@
#include "zcan_eeprom_module.hpp"
using namespace iflytop;
#define TAG "ZCanEepromModule"
#if 0
void ZCanEepromModule::initialize(ZCanCmder* cancmder, int id, I_EEPROMModule* module) {
m_cancmder = cancmder;
m_id = id;
m_module = module;
m_lock.init();
cancmder->registerListener(this);
}
void ZCanEepromModule::onRceivePacket(CanPacketRxBuffer* rxcmd) { //
PROCESS_PACKET(kcmd_eeprom_start_monitor_status, m_id) {
errorcode = m_module->start_monitor_status([this, cmdheader](I_EEPROMModule::eeprom_status_t& status) { //
auto* report = (kcmd_eeprom_start_monitor_status_report_t*)m_txbuf;
static_assert(sizeof(*report) < sizeof(m_txbuf), "report size too large");
ZLOGI(TAG, "kcmd_eeprom_start_monitor_status exec_status:%d", status);
report->status = status;
m_cancmder->sendStatusReport(cmdheader, (uint8_t*)report, sizeof(*report));
});
};
END_PP();
PROCESS_PACKET(kcmd_eeprom_stop_monitor_status, m_id) { errorcode = m_module->stop_monitor_status(); };
END_PP();
PROCESS_PACKET(kcmd_eeprom_read_block, m_id) { errorcode = m_module->read(cmd->sector_index, cmd->sector_size, ack->ack); };
END_PP();
}
#endif

21
components/zcancmder_module/zcan_eeprom_module.hpp

@ -1,21 +0,0 @@
#pragma once
// #include "sdk/components/zprotocols/zcancmder/api/i_step_motor_ctrl_module.hpp"
#include "sdk/components/zprotocols/zcancmder/api/i_eeprom.hpp"
#include "sdk\components\zcancmder\zcanreceiver.hpp"
namespace iflytop {
#if 0
class ZCanEepromModule : public ZCanCmderListener {
ZCanCmder* m_cancmder = nullptr;
int m_id = 0;
I_EEPROMModule* m_module;
uint8_t m_txbuf[300] = {0};
zmutex m_lock;
public:
void initialize(ZCanCmder* cancmder, int id, I_EEPROMModule* module);
virtual void onRceivePacket(CanPacketRxBuffer* rxcmd);
};
#endif
} // namespace iflytop

74
components/zcancmder_module/zcan_fan_ctrl_module.cpp

@ -1,74 +0,0 @@
#include "zcan_fan_ctrl_module.hpp"
using namespace iflytop;
using namespace std;
#if 1
#define TAG "ZcanFanCtrlModule"
void ZcanFanCtrlModule::initialize(int32_t id, ZIPWMFanCtrlModule* fanmodule, int32_t default_speed) {
m_id = id;
m_fanmodule = fanmodule;
ZASSERT(m_fanmodule != nullptr);
OSDefaultSchduler::getInstance()->regPeriodJob(
[this](OSDefaultSchduler::Context& context) { //
if (m_isworking && m_com_reg.module_errorcode == 0) {
if (m_fanmodule->isError()) {
ZLOGE(TAG, "detect fan error,stop fan");
m_com_reg.module_errorcode = err::khwardware_error;
m_fanmodule->clearError();
module_stop();
}
}
},
10);
}
int32_t ZcanFanCtrlModule::getid(int32_t* id) {
*id = m_id;
return 0;
}
int32_t ZcanFanCtrlModule::module_get_status(int32_t* status) {
if (m_com_reg.module_errorcode != 0) {
*status = 2;
} else if (m_isworking) {
*status = 1;
} else {
*status = 0;
}
return 0;
}
int32_t ZcanFanCtrlModule::set_fan_default_speed(int32_t default_speed) {
m_default_speed = default_speed;
if (m_isworking) m_fanmodule->setFanSpeed(default_speed);
return 0;
}
int32_t ZcanFanCtrlModule::module_xxx_reg(int32_t param_id, bool read, int32_t& val) {
switch (param_id) {
MODULE_COMMON_PROCESS_REG_CB();
PROCESS_REG(kreg_fan0_ctrl_speed_level, REG_GET(m_default_speed), set_fan_default_speed(val));
break;
default:
return err::kmodule_not_find_config_index;
}
return err::kmodule_not_find_config_index;
}
int32_t ZcanFanCtrlModule::module_stop() {
m_isworking = false;
m_fanmodule->stop();
return 0;
}
int32_t ZcanFanCtrlModule::module_start() {
module_clear_error();
if (m_default_speed == 0) {
module_stop();
}
m_isworking = true;
m_fanmodule->setFanSpeed(m_default_speed);
return 0;
}
int32_t ZcanFanCtrlModule::do_action(int32_t actioncode) { return 0; }
#endif

56
components/zcancmder_module/zcan_fan_ctrl_module.hpp

@ -1,56 +0,0 @@
#pragma once
/**
* @file tmp117.hpp
* @author zhaohe (h_zhaohe@163.com)
* @brief
* @version 0.1
* @date 2023-04-14
*
* @copyright Copyright (c) 2023
*
*
* 1. :https://github.com/rkiyak/TMP117.git
* 2. datasheet
*/
#include <stdint.h>
#include "sdk/os/zos.hpp"
//
#include "sdk\components\api\zi_pwm_fan_ctrl_module.hpp"
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
namespace iflytop {
/**
* @brief
*
*/
class ZcanFanCtrlModule : public ZIModule {
ENABLE_MODULE(ZcanFanCtrlModule, kfan_ctrl_module, 1);
public:
ZIPWMFanCtrlModule* m_fanmodule = nullptr;
int32_t m_id = 0;
bool m_isworking = false;
int32_t m_default_speed = 50;
public:
ZcanFanCtrlModule(){};
virtual ~ZcanFanCtrlModule(){};
void initialize(int32_t id, ZIPWMFanCtrlModule* fanmodule, int32_t default_speed);
virtual int32_t getid(int32_t* id) override;
virtual int32_t module_get_status(int32_t* status) override;
virtual int32_t module_start() override;
virtual int32_t module_stop() override;
virtual int32_t module_xxx_reg(int32_t param_id, bool read, int32_t& val) override;
public:
virtual int32_t set_fan_default_speed(int32_t default_speed);
virtual int32_t do_action(int32_t actioncode) override;
};
} // namespace iflytop

5
components/zcancmder_module/zcan_mini_servo_ctrl_module.cpp

@ -1,5 +0,0 @@
#include "zcan_mini_servo_ctrl_module.hpp"
using namespace iflytop;
#if 0
#endif

6
components/zcancmder_module/zcan_mini_servo_ctrl_module.hpp

@ -1,6 +0,0 @@
#pragma once
#include "sdk/components/zprotocols/zcancmder/api/i_mini_servo_module.hpp"
#include "sdk\components\zcancmder\zcanreceiver.hpp"
namespace iflytop {
} // namespace iflytop

2
components/zprotocols/zcancmder_v2

@ -1 +1 @@
Subproject commit 7201808ad36b90b7036e397875ebdef9820f0047
Subproject commit a7f08c437c511fee6176ebd704ae24464d23917f
Loading…
Cancel
Save