|
@ -1,16 +1,15 @@ |
|
|
#include "zimodule_impl_v2.hpp"
|
|
|
#include "zimodule_impl_v2.hpp"
|
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
#include <stdint.h>
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
#include <functional>
|
|
|
|
|
|
|
|
|
|
|
|
#include "sdk/os/zos.hpp"
|
|
|
#include "sdk\components\zprotocols\zcancmder_v2\api\reg_index.hpp"
|
|
|
#include "sdk\components\zprotocols\zcancmder_v2\api\reg_index.hpp"
|
|
|
#include "sdk\components\zprotocols\zcancmder_v2\api\zi_module.hpp"
|
|
|
#include "sdk\components\zprotocols\zcancmder_v2\api\zi_module.hpp"
|
|
|
|
|
|
|
|
|
using namespace iflytop; |
|
|
using namespace iflytop; |
|
|
|
|
|
|
|
|
ZIModuleImplV2::ZIModuleImplV2(int32_t id) { m_id = id; } |
|
|
|
|
|
|
|
|
|
|
|
int32_t ZIModuleImplV2::getid(int32_t *id) { |
|
|
int32_t ZIModuleImplV2::getid(int32_t *id) { |
|
|
*id = m_id; |
|
|
*id = m_id; |
|
|
return 0; |
|
|
return 0; |
|
@ -21,26 +20,150 @@ int32_t ZIModuleImplV2::module_get_status(int32_t *status) { return module_get_r |
|
|
int32_t ZIModuleImplV2::module_get_error(int32_t *iserror) { return module_get_reg(kreg_module_errorcode, iserror); } |
|
|
int32_t ZIModuleImplV2::module_get_error(int32_t *iserror) { return module_get_reg(kreg_module_errorcode, iserror); } |
|
|
int32_t ZIModuleImplV2::module_clear_error() { return module_set_reg(kreg_module_errorcode, 0); } |
|
|
int32_t ZIModuleImplV2::module_clear_error() { return module_set_reg(kreg_module_errorcode, 0); } |
|
|
int32_t ZIModuleImplV2::module_enable(int32_t enable) { return module_set_reg(kreg_module_enableflag, enable); } |
|
|
int32_t ZIModuleImplV2::module_enable(int32_t enable) { return module_set_reg(kreg_module_enableflag, enable); } |
|
|
// int32_t ZIModuleImplV2::module_readio(int32_t *io) { return module_get_reg(kreg_module_input_state, io); }
|
|
|
|
|
|
// int32_t ZIModuleImplV2::module_writeio(int32_t idindex, int32_t io) { return module_set_reg(kreg_module_output_state, io); }
|
|
|
|
|
|
int32_t ZIModuleImplV2::module_factory_reset() { return 0; } |
|
|
int32_t ZIModuleImplV2::module_factory_reset() { return 0; } |
|
|
int32_t ZIModuleImplV2::module_flush_cfg() { return 0; } |
|
|
int32_t ZIModuleImplV2::module_flush_cfg() { return 0; } |
|
|
int32_t ZIModuleImplV2::module_active_cfg() { return 0; } |
|
|
int32_t ZIModuleImplV2::module_active_cfg() { return 0; } |
|
|
|
|
|
int32_t ZIModuleImplV2::module_readio(int32_t *io) { return module_get_reg(kreg_module_input_state, io); } |
|
|
|
|
|
int32_t ZIModuleImplV2::module_writeio(int32_t idindex, int32_t io) { return module_set_reg(kreg_module_output_state, io); } |
|
|
|
|
|
|
|
|
|
|
|
void ZIModuleImplV2::_initialize(int32_t moduleid, int32_t module_type, int32_t sf_version) { |
|
|
|
|
|
m_id = moduleid; |
|
|
|
|
|
m_regtable = NULL; |
|
|
|
|
|
m_regNum = 0; |
|
|
|
|
|
|
|
|
|
|
|
_addRegItem(kreg_module_version, sf_version, kreg_flag_ronly); // 模块版本
|
|
|
|
|
|
_addRegItem(kreg_module_type, module_type, kreg_flag_ronly); // 模块类型
|
|
|
|
|
|
_addRegItem(kreg_module_status, 0, kreg_flag_rw_limit, 0, 2); // 模块限制
|
|
|
|
|
|
_addRegItem(kreg_module_errorcode, 0, kreg_flag_rw); // 模块错误码
|
|
|
|
|
|
_addRegItem(kreg_module_initflag, 0, kreg_flag_rw); // 复位标志位,上电自动置0,上位机可以通过将这个寄存器置1,来判断单片机是否发生复位
|
|
|
|
|
|
_addRegItem(kreg_module_enableflag, 0, kreg_flag_rw); // 模块使能标志位,一般用于电机控制
|
|
|
|
|
|
_addRegItem(kreg_module_errorbitflag0, 0, kreg_flag_rw); // 详细的错误状态
|
|
|
|
|
|
_addRegItem(kreg_module_errorbitflag1, 0, kreg_flag_rw); // 详细的错误状态
|
|
|
|
|
|
_addRegItem(kreg_module_input_state, 0, kreg_flag_rw); // 输入IO状态
|
|
|
|
|
|
_addRegItem(kreg_module_output_state, 0, kreg_flag_rw); // 输出IO状态
|
|
|
|
|
|
_addRegItem(kreg_module_raw_sector_size, 0, kreg_flag_ronly); // 用于辅助module_read_raw方法
|
|
|
|
|
|
_addRegItem(kreg_module_raw_sector_num, 0, kreg_flag_ronly); // 用于辅助module_read_raw方法
|
|
|
|
|
|
_addRegItem(kreg_module_is_online, 0, kreg_flag_ronly); // 如果模块存在下属传感器,可以通过这个寄存器判断传感器是否在线
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ZIModuleImplV2::_regRegChangeListener(reg_operation_event_listener_t onregchange) { //
|
|
|
|
|
|
m_reg_operation_event_listener = onregchange; |
|
|
|
|
|
} |
|
|
|
|
|
void ZIModuleImplV2::_addRegItem(int32_t index, int32_t value, int32_t regflag, int32_t minval, int32_t maxval) { |
|
|
|
|
|
reg_iterm_t *iterm = (reg_iterm_t *)realloc(m_regtable, sizeof(reg_iterm_t) * (m_regNum + 1)); |
|
|
|
|
|
ZASSERT(iterm != NULL); |
|
|
|
|
|
|
|
|
|
|
|
iterm[m_regNum].index = index; |
|
|
|
|
|
iterm[m_regNum].value = value; |
|
|
|
|
|
iterm[m_regNum].flag = regflag; |
|
|
|
|
|
iterm[m_regNum].minval = minval; |
|
|
|
|
|
iterm[m_regNum].maxval = maxval; |
|
|
|
|
|
|
|
|
|
|
|
m_regtable = iterm; |
|
|
|
|
|
m_regNum++; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
int32_t ZIModuleImplV2::module_set_reg(int32_t param_id, int32_t param_value) { |
|
|
int32_t ZIModuleImplV2::module_set_reg(int32_t param_id, int32_t param_value) { |
|
|
int32_t retVal = 0; |
|
|
int32_t retVal = 0; |
|
|
// if (m_reg_change_listener) {
|
|
|
|
|
|
// m_reg_change_listener(param_id, param_value);
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reg_iterm_t *regitem = _findreg(param_id); |
|
|
|
|
|
|
|
|
|
|
|
if (regitem == NULL) { |
|
|
|
|
|
return err::kreg_not_find_error; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ((regitem->flag & kreg_flag_writeable) == 0) { |
|
|
|
|
|
return err::koperation_not_support; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ((regitem->flag & kreg_flag_limit) != 0) { |
|
|
|
|
|
if (param_value < regitem->minval || param_value > regitem->maxval) { |
|
|
|
|
|
return err::kparam_out_of_range; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (m_reg_operation_event_listener) { |
|
|
|
|
|
retVal = m_reg_operation_event_listener(kon_reg_write, param_id, param_value); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (retVal == 0) { |
|
|
|
|
|
return retVal; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
regitem->value = param_value; |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
int32_t ZIModuleImplV2::module_get_reg(int32_t param_id, int32_t *param_value) { |
|
|
int32_t ZIModuleImplV2::module_get_reg(int32_t param_id, int32_t *param_value) { |
|
|
|
|
|
reg_iterm_t *regitem = _findreg(param_id); |
|
|
|
|
|
|
|
|
|
|
|
if (regitem == NULL) { |
|
|
|
|
|
return err::kreg_not_find_error; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ((regitem->flag & kreg_flag_readable) == 0) { |
|
|
|
|
|
return err::koperation_not_support; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (m_reg_operation_event_listener) { |
|
|
|
|
|
int32_t retVal = m_reg_operation_event_listener(kon_reg_read, param_id, regitem->value); |
|
|
|
|
|
if (retVal != 0) { |
|
|
|
|
|
return retVal; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
*param_value = regitem->value; |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
int32_t ZIModuleImplV2::module_get_regbit(int32_t param_id, int32_t bitoffset, int32_t *param_value) { |
|
|
|
|
|
int32_t regval = 0; |
|
|
|
|
|
int32_t retVal = module_get_reg(param_id, ®val); |
|
|
|
|
|
|
|
|
|
|
|
if (retVal != 0) { |
|
|
|
|
|
return retVal; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
*param_value = (regval >> bitoffset) & 0x01; |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
int32_t ZIModuleImplV2::module_set_regbit(int32_t param_id, int32_t bitoffset, int32_t bitval) { |
|
|
|
|
|
int32_t regval = 0; |
|
|
|
|
|
int32_t retVal = _module_get_reg_internal(param_id, ®val); |
|
|
|
|
|
|
|
|
|
|
|
if (retVal != 0) { |
|
|
|
|
|
return retVal; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
regval &= ~(0x01 << bitoffset); |
|
|
|
|
|
regval |= (bitval & 0x01) << bitoffset; |
|
|
|
|
|
|
|
|
|
|
|
return module_set_reg(param_id, regval); |
|
|
|
|
|
} |
|
|
|
|
|
int32_t ZIModuleImplV2::_module_set_reg_internal(int32_t index, int32_t value) { |
|
|
|
|
|
reg_iterm_t *regitem = _findreg(index); |
|
|
|
|
|
|
|
|
|
|
|
if (regitem == NULL) { |
|
|
|
|
|
return err::kreg_not_find_error; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
regitem->value = value; |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
int32_t ZIModuleImplV2::_module_get_reg_internal(int32_t param_id, int32_t *param_value) { |
|
|
|
|
|
reg_iterm_t *regitem = _findreg(param_id); |
|
|
|
|
|
|
|
|
|
|
|
if (regitem == NULL) { |
|
|
|
|
|
return err::kreg_not_find_error; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
*param_value = regitem->value; |
|
|
|
|
|
return 0; |
|
|
} |
|
|
} |
|
|
int32_t ZIModuleImplV2::module_get_regbit(int32_t param_id, int32_t bitoffset, int32_t *param_value) {} |
|
|
|
|
|
int32_t ZIModuleImplV2::module_set_regbit(int32_t param_id, int32_t bitoffset, int32_t bitval) {} |
|
|
|
|
|
|
|
|
|
|
|
void ZIModuleImplV2::_regRegChangeListener(reg_change_listener_t onregchange) { //
|
|
|
|
|
|
m_reg_change_listener = onregchange; |
|
|
|
|
|
|
|
|
ZIModuleImplV2::reg_iterm_t *ZIModuleImplV2::_findreg(int32_t index) { |
|
|
|
|
|
for (int i = 0; i < m_regNum; i++) { |
|
|
|
|
|
if (m_regtable[i].index == index) { |
|
|
|
|
|
return &m_regtable[i]; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return NULL; |
|
|
} |
|
|
} |
|
|
void ZIModuleImplV2::_allocRegTable(int32_t regNum) {} |
|
|
|