Browse Source

update

master
zhaohe 8 months ago
parent
commit
fe3b3dc19b
  1. 4
      .settings/language.settings.xml
  2. 2
      a8000_protocol
  3. 1
      build.bat
  4. 2
      flush.bat
  5. 12
      sdk/chip/basic/logger.hpp
  6. 291
      sdk/components/pipette_module/pipette_ctrl_module_v2.cpp
  7. 60
      sdk/components/pipette_module/pipette_ctrl_module_v2.hpp
  8. 26
      sdk/components/sensors/smtp2_v2/smtp2_v2.cpp
  9. 38
      sdk/components/sensors/smtp2_v2/smtp2_v2.hpp
  10. 71
      sdk/components/zcancmder/zcan_protocol_parser.cpp
  11. 8
      sdk/components/zcancmder/zcan_protocol_parser.hpp
  12. 10
      sdk/os/zoslogger.hpp
  13. 2
      usrc/project_configs.h
  14. 22
      usrc/sysmgr/sys_mgr.cpp

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1355509092133304966" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="357012465717748611" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1428578042024860473" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="430081415609304118" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

2
a8000_protocol

@ -1 +1 @@
Subproject commit ba614e601a4ec166fa2d6511f2fe0b4c14f60f85
Subproject commit 5d083e13b654460d9de05192ce9446c9b1d62069

1
build.bat

@ -0,0 +1 @@
C:\ST\STM32CubeIDE_1.15.0\STM32CubeIDE\headless-build.bat -data ../ -build a8000_subboard/Debug

2
flush.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 -w Debug\a8000_subboard.hex -rst

12
sdk/chip/basic/logger.hpp

@ -9,30 +9,30 @@ extern "C" {
extern bool g_enable_log;
#define ZEARLY_LOG_RELEASE(TAG, fmt, ...) \
if (g_enable_log) { \
zchip_log(TAG "" fmt "\n", ##__VA_ARGS__); \
zchip_log(TAG "" fmt "\r\n", ##__VA_ARGS__); \
}
#define ZEARLY_LOGI(TAG, fmt, ...) \
if (g_enable_log) { \
zchip_log("%08lu INFO [%-8s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zchip_log("%08lu INFO [%-8s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZEARLY_LOGD(TAG, fmt, ...) \
if (g_enable_log) { \
zchip_log("%08lu DEBU [%-8s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zchip_log("%08lu DEBU [%-8s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZEARLY_LOGE(TAG, fmt, ...) \
if (g_enable_log) { \
zchip_log("%08lu ERRO [%-8s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zchip_log("%08lu ERRO [%-8s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZEARLY_LOGW(TAG, fmt, ...) \
if (g_enable_log) { \
zchip_log("%08lu WARN [%-8s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zchip_log("%08lu WARN [%-8s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZEARLY_ASSERT(cond) \
if (!(cond)) { \
while (1) { \
zchip_log("ASSERT: %s [%s:%d]\n", #cond, __FILE__, __LINE__); \
zchip_log("ASSERT: %s [%s:%d]\r\n", #cond, __FILE__, __LINE__); \
zchip_clock_early_delayus(1000 * 1000); \
} \
}

291
sdk/components/pipette_module/pipette_ctrl_module_v2.cpp

@ -66,22 +66,24 @@ void PipetteModuleV2::initialize(int32_t id, config_t *config, hardward_config_t
m_zm->getGState(); // 读取状态,清空下复位标识
module_active_cfg();
// m_smtp2.dumpparam();
}
void PipetteModuleV2::create_default_cfg(config_t *defaultcfg) {
// defaultcfg->limit_ul = 250;
defaultcfg->pump_acc = 18;
defaultcfg->pump_dec = 18;
defaultcfg->pump_vstart = 200;
defaultcfg->pump_vstop = 300;
defaultcfg->aspirate_pump_vel = 500; //
defaultcfg->distribu_pump_vel = 1000; //
defaultcfg->pump_vmax = 1000; // 1000已经是最大速度
defaultcfg->lld_pump_vel = 30; // lld推荐使用速度为50->200,这里
defaultcfg->lld_motor_vel_rpm = 80;
defaultcfg->lld_detect_period_ms = 1; // 100ms
defaultcfg->lld_prepare_pos = PIPETTE_PREPARE_POS;
defaultcfg->lld_prepare_pre_distribut_ul = LLD_PREPARE_DISTRIBUT_POS;
// defaultcfg->pump_acc = 18;
// defaultcfg->pump_dec = 18;
// defaultcfg->pump_vstart = 200;
// defaultcfg->pump_vstop = 300;
// defaultcfg->aspirate_pump_vel = 500; //
// defaultcfg->distribu_pump_vel = 1000; //
// defaultcfg->pump_vmax = 8000; // 8000已经是最大速度
// defaultcfg->lld_pump_vel = 30; // lld推荐使用速度为50->200,这里
// defaultcfg->lld_motor_vel_rpm = 80;
// defaultcfg->lld_detect_period_ms = 1; // 100ms
// defaultcfg->lld_prepare_pos = PIPETTE_PREPARE_POS;
// defaultcfg->lld_prepare_pre_distribut_ul = LLD_PREPARE_DISTRIBUT_POS;
defaultcfg->zm_one_circle_pulse = 10000;
defaultcfg->zm_one_circle_pulse_denominator = 1;
@ -101,9 +103,9 @@ int32_t PipetteModuleV2::module_stop() {
return 0;
}
int32_t PipetteModuleV2::module_active_cfg() {
m_smtp2.pump_set_acc_and_dec(m_cfg.pump_acc, m_cfg.pump_dec);
m_smtp2.pump_set_vstart(m_cfg.pump_vstart);
m_smtp2.pump_set_vstop(m_cfg.pump_vstop);
// m_smtp2.pump_set_acc_and_dec(m_cfg.pump_acc, m_cfg.pump_dec);
// m_smtp2.pump_set_vstart(m_cfg.pump_vstart);
// m_smtp2.pump_set_vstop(m_cfg.pump_vstop);
m_zm->enable(false);
m_zm->setIHOLD_IRUN(m_cfg.zm_ihold, m_cfg.zm_irun, m_cfg.zm_iholddelay);
@ -155,21 +157,6 @@ int32_t PipetteModuleV2::module_xxx_reg_impl(int32_t param_id, bool read, int32_
/***********************************************************************************************************************
* CFG *
***********************************************************************************************************************/
// XXX_CFG_REG(limit_ul);
XXX_CFG_REG(pump_acc);
XXX_CFG_REG(pump_dec);
XXX_CFG_REG(pump_vstart);
XXX_CFG_REG(pump_vstop);
XXX_CFG_REG(pump_vmax);
XXX_CFG_REG(aspirate_pump_vel);
XXX_CFG_REG(lld_pump_vel);
XXX_CFG_REG(lld_motor_vel_rpm);
XXX_CFG_REG(lld_detect_period_ms);
XXX_CFG_REG(lld_prepare_pos);
XXX_CFG_REG(lld_prepare_pre_distribut_ul);
XXX_CFG_REG(lld_enable_record_data);
XXX_CFG_REG(distribu_pump_vel);
XXX_CFG_REG(zm_shaft);
XXX_CFG_REG(zm_one_circle_pulse);
XXX_CFG_REG(zm_one_circle_pulse_denominator);
@ -312,20 +299,84 @@ int32_t PipetteModuleV2::pipette_zmotor_move_to_zero_point_quick() {
return 0;
}
/***********************************************************************************************************************
* PUMP *
***********************************************************************************************************************/
int32_t PipetteModuleV2::liquid_operation_clear_params() {
memset(&liquid_operation_runparam, 0, sizeof(liquid_operation_runparam));
return 0;
}
/**
* @brief -
*
* @param acc 1->20 deafault 14 datasheet:page-29
* @param dec 1->20 deafault 14 datasheet:page-29
* @param vstart 0->1000 default 0
* @param vstop 0->1000 default 900
* @param vmax 0->8000 default 1400
* @return int32_t
*/
int32_t PipetteModuleV2::liquid_operation_set_gun_runparams(int32_t acc, int32_t dec, int32_t vstart, int32_t vstop, int32_t vmax) {
liquid_operation_runparam.pump_acc = acc;
liquid_operation_runparam.pump_dec = dec;
liquid_operation_runparam.pump_vstart = vstart;
liquid_operation_runparam.pump_vstop = vstop;
liquid_operation_runparam.pump_vmax = vmax;
return 0;
}
/**
* @brief -
*
* @param posmin z轴运动范围最小值
* @param posmax z轴运动范围最大值
* @param vmax z轴运动最大速度
* @return int32_t
*/
int32_t PipetteModuleV2::liquid_operation_set_zmotor_runparams(int32_t posmin, int32_t posmax, int32_t vmax) {
liquid_operation_runparam.zmotor_posmin = posmin;
liquid_operation_runparam.zmotor_posmax = posmax;
liquid_operation_runparam.zmotor_vmax = vmax;
return 0;
}
int32_t PipetteModuleV2::liquid_operation_enable_lld_record() {
liquid_operation_runparam.lld_enable_record_data = 1;
return 0;
}
/**
* @brief
*
* @return int32_t
*/
int32_t PipetteModuleV2::liquid_operation_fresh_params() {
ZLOGI(TAG, "liquid_operation_runparam:");
ZLOGI(TAG, "pump_acc :%d", liquid_operation_runparam.pump_acc);
ZLOGI(TAG, "pump_dec :%d", liquid_operation_runparam.pump_dec);
ZLOGI(TAG, "pump_vstart :%d", liquid_operation_runparam.pump_vstart);
ZLOGI(TAG, "pump_vstop :%d", liquid_operation_runparam.pump_vstop);
ZLOGI(TAG, "pump_vmax :%d", liquid_operation_runparam.pump_vmax);
ZLOGI(TAG, "zmotor_posmin :%d", liquid_operation_runparam.zmotor_posmin);
ZLOGI(TAG, "zmotor_posmax :%d", liquid_operation_runparam.zmotor_posmax);
ZLOGI(TAG, "zmotor_vmax :%d", liquid_operation_runparam.zmotor_vmax);
ZLOGI(TAG, "lld_enable_record_data :%d", liquid_operation_runparam.lld_enable_record_data);
DO(m_smtp2.pump_set_acc_and_dec(liquid_operation_runparam.pump_acc, liquid_operation_runparam.pump_dec));
DO(m_smtp2.pump_set_vstart(liquid_operation_runparam.pump_vstart));
DO(m_smtp2.pump_set_vstop(liquid_operation_runparam.pump_vstop));
DO(m_smtp2.pump_set_io1_mode(0)); // lld输入高
DO(m_smtp2.pump_set_io2_mode(0)); // 通用输入
DO(m_smtp2.pump_set_tip_size(1)); // 250ul
DO(m_smtp2.pump_enable_temp_compensation(0)); // 关闭温度补偿
DO(m_smtp2.write_cmd("/1K0R\r")); // 设置背隙为0
return 0;
}
int32_t PipetteModuleV2::pipette_init_device() {
THREAD_START_WORK([this]() {
DO_IN_THREAD(m_smtp2.pump_init(m_cfg.pump_vmax));
DO_IN_THREAD(m_smtp2.pump_init(liquid_operation_runparam.pump_vmax));
pump_waitfor_stop();
DO_IN_THREAD(m_smtp2.pump_set_io1_mode(0)); // lld输入高
DO_IN_THREAD(m_smtp2.pump_set_io2_mode(0)); // 通用输入
DO_IN_THREAD(m_smtp2.pump_set_tip_size(1)); // 250ul
DO_IN_THREAD(m_smtp2.pump_enable_temp_compensation(0)); // 温度补偿
//
// m_state.load_val_ul = 0;
// m_state.lld_prepared = 0;
m_state.pipette_is_inited = 1;
});
return 0;
}
@ -333,14 +384,14 @@ int32_t PipetteModuleV2::pipette_init_device() {
int32_t PipetteModuleV2::pipette_put_tip() {
THREAD_START_WORK([this]() {
DO_IN_THREAD(m_smtp2.pump_put_tip());
// m_state.lld_prepared = 0;
pump_waitfor_stop();
});
return 0;
}
int32_t PipetteModuleV2::pipette_pump_move_to(int32_t pumpv, int32_t nl) {
THREAD_START_WORK([this, pumpv, nl]() {
int32_t PipetteModuleV2::pipette_pump_move_to(int32_t nl) {
THREAD_START_WORK([this, nl]() {
int32_t pumpv = liquid_operation_runparam.pump_vmax;
DO_IN_THREAD(m_smtp2.pump_move_to_nl(pumpv, nl));
pump_waitfor_stop();
m_smtp2.pump_stop();
@ -348,7 +399,7 @@ int32_t PipetteModuleV2::pipette_pump_move_to(int32_t pumpv, int32_t nl) {
return 0;
}
int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c_threshold, int32_t p_threshold) {
int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t c_threshold, int32_t p_threshold) {
// 检查泵机是否初始化过
if (lldtype < 0 || lldtype > klldtypemax) {
return err::kparam_out_of_range;
@ -364,17 +415,12 @@ int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c
return err::kpipette_error_no_tip_when_lld;
}
int32_t recorddata = m_cfg.lld_enable_record_data;
THREAD_START_WORK([this, recorddata, lldtype, maxzpos, c_threshold, p_threshold]() { //
int32_t recorddata = liquid_operation_runparam.lld_enable_record_data;
thread_start_work(__FUNCTION__, [this, recorddata, lldtype, c_threshold, p_threshold]() { //
int32_t start_capacitance = 0; // 启动时电容数值
int32_t start_pressure = 0; // 启动时压力数值
int32_t start_motor_pos = 0; // 启动时电机位置
// 1. 泵机移动到0位
DO_IN_THREAD(m_smtp2.pump_distribut_all(m_cfg.pump_vmax));
pump_waitfor_stop();
// 2. 读取初值
DO_IN_THREAD(m_smtp2.pump_get_capacitance(&start_capacitance));
DO_IN_THREAD(m_smtp2.pump_get_pressure(&start_pressure));
start_motor_pos = m_zm->getXACTUAL();
@ -383,10 +429,10 @@ int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c
if (lldtype == kclld) {
DO_IN_THREAD(m_smtp2.pump_clld(c_threshold));
} else if (lldtype == kplld) {
DO_IN_THREAD(m_smtp2.pump_distribut_plld(m_cfg.lld_pump_vel, p_threshold));
DO_IN_THREAD(m_smtp2.pump_aspirate_plld(liquid_operation_runparam.pump_vmax, p_threshold));
}
osDelay(110);
zm_move_to(maxzpos, m_cfg.lld_motor_vel_rpm);
zm_move_to(liquid_operation_runparam.zmotor_posmax, liquid_operation_runparam.zmotor_vmax);
while (true) {
bool motorstoped = false;
@ -408,7 +454,7 @@ int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c
if (lldtype == kclld) {
DO_IN_THREAD(m_smtp2.pump_clld_get_state(&detect_liquid));
} else if (lldtype == kplld) {
DO_IN_THREAD(m_smtp2.pump_distribut_plld_get_state(&detect_liquid));
DO_IN_THREAD(m_smtp2.pump_aspirate_plld_get_state(&detect_liquid));
}
// 探测到液面
@ -429,7 +475,7 @@ int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c
}
if (recorddata) push_snesor_sample_data(motorpos, capacitance, pressure);
m_thread.sleep(m_cfg.lld_detect_period_ms);
m_thread.sleep(2);
}
});
@ -441,14 +487,18 @@ int32_t PipetteModuleV2::pipette_lld_is_detect_liquid(int32_t *detect) {
return 0;
}
int32_t PipetteModuleV2::pipette_aspirate(int32_t llfrpm, int32_t llftpos, int32_t pumpv, int32_t nl) {
int32_t PipetteModuleV2::pipette_aspirate(int32_t nl) {
// pipette_aspirate
if (nl < 0) {
ZLOGE(TAG, "pipette_aspirate %d fail , ul < 0", nl);
return err::kparam_out_of_range;
}
THREAD_START_WORK([this, llfrpm, llftpos, pumpv, nl]() {
THREAD_START_WORK([this, nl]() {
int32_t llfrpm = liquid_operation_runparam.zmotor_vmax;
int32_t llftpos = liquid_operation_runparam.zmotor_posmax;
int32_t pumpv = liquid_operation_runparam.pump_vmax;
DO_IN_THREAD(m_smtp2.pump_aspirate_nl(pumpv, nl));
if (llfrpm != 0) zm_move_to(llftpos, llfrpm);
@ -460,17 +510,20 @@ int32_t PipetteModuleV2::pipette_aspirate(int32_t llfrpm, int32_t llftpos, int32
});
return 0;
}
int32_t PipetteModuleV2::pipette_distribu(int32_t llfrpm, int32_t pumpv, int32_t nl) {
int32_t PipetteModuleV2::pipette_distribu(int32_t nl) {
// pipette_aspirate
if (nl < 0) {
ZLOGE(TAG, "pipette_distribu %d fail , nl < 0", nl);
return err::kparam_out_of_range;
}
THREAD_START_WORK([this, llfrpm, pumpv, nl]() {
THREAD_START_WORK([this, nl]() {
int32_t llfrpm = liquid_operation_runparam.zmotor_vmax;
int32_t pumpv = liquid_operation_runparam.pump_vmax;
DO_IN_THREAD(m_smtp2.pump_aspirate_nl(pumpv, -nl));
if (llfrpm != 0) zm_move_to(0, llfrpm);
if (llfrpm != 0) zm_move_to(liquid_operation_runparam.zmotor_posmin, llfrpm);
pump_waitfor_stop();
@ -479,14 +532,18 @@ int32_t PipetteModuleV2::pipette_distribu(int32_t llfrpm, int32_t pumpv, int32_t
});
return 0;
}
int32_t PipetteModuleV2::pipette_shake_up(int32_t llfrpm, int32_t maxzpos, int32_t pumpv, int32_t nl, int32_t times) {
THREAD_START_WORK([this, llfrpm, maxzpos, pumpv, nl, times]() {
int32_t PipetteModuleV2::pipette_shake_up(int32_t nl, int32_t times) {
thread_start_work(__FUNCTION__, [this, nl, times]() {
//
int32_t dpos = 0;
int32_t startpos = m_zm->getXACTUAL();
int32_t endpos = 0;
int32_t llfrpm = liquid_operation_runparam.zmotor_vmax;
int32_t maxzpos = liquid_operation_runparam.zmotor_posmax;
int32_t pumpv = liquid_operation_runparam.pump_vmax;
if (llfrpm != 0) zm_move_to(maxzpos, llfrpm);
DO_IN_THREAD(m_smtp2.pump_aspirate_nl(pumpv, nl));
@ -521,16 +578,8 @@ int32_t PipetteModuleV2::pipette_shake_up(int32_t llfrpm, int32_t maxzpos, int32
int32_t PipetteModuleV2::pipette_clear_hanging_liquid(int32_t repeat_times) {
// llf_startz
// llf_endz
THREAD_START_WORK([this, repeat_times]() {
for (int i = 0; i < repeat_times; i++) {
m_smtp2.pump_move_to_nl(m_cfg.pump_vmax, 0);
pump_waitfor_stop();
thread_start_work(__FUNCTION__, [this, repeat_times]() {
m_smtp2.pump_move_to_nl(m_cfg.pump_vmax, 100 * 1000);
pump_waitfor_stop();
}
m_smtp2.pump_move_to_nl(m_cfg.pump_vmax, 0);
pump_waitfor_stop();
});
return 0;
}
@ -591,104 +640,6 @@ void PipetteModuleV2::do_pipette_zmotor_move_to_zero_point_quick() {
throw zapp_exception(err::kstep_motor_lost_step);
}
}
#if 0
int32_t PipetteModuleV2::do_pipette_lld(bool recorddata, int32_t lldtype, int32_t startpos, int32_t zdpos, int32_t c_threshold, int32_t p_threshold) {
// 检查泵机是否初始化过
if (lldtype < 0 || lldtype > klldtypemax) {
return err::kparam_out_of_range;
}
THREAD_START_WORK([this, recorddata, lldtype, startpos, zdpos, c_threshold, p_threshold]() { //
m_state.lld_prepared = 0; // 失效m_state.lld_prepared
int32_t start_capacitance = 0; // 启动时电容数值
int32_t start_pressure = 0; // 启动时压力数值
int32_t start_motor_pos = 0; // 启动时电机位置
// 准备
capturedata_num = 0;
// 读取初值
DO_IN_THREAD(m_smtp2.pump_get_capacitance(&start_capacitance));
DO_IN_THREAD(m_smtp2.pump_get_pressure(&start_pressure));
start_motor_pos = m_zm->getXACTUAL();
// 先分配一点体积,消除一些误差。
ZLOGI(TAG, "start lld before distribut %d ul", m_cfg.lld_prepare_pre_distribut_ul);
DO_IN_THREAD(m_smtp2.pump_aspirate(m_cfg.pump_vmax, -m_cfg.lld_prepare_pre_distribut_ul));
pump_waitfor_stop();
ZLOGI(TAG, "lld before distribut ok");
ZLOGI(TAG, "start lld");
bool moveToStartPos = false;
zm_move_to(startpos, m_cfg.zm_default_velocity);
osDelay(10);
if (lldtype == kclld) {
DO_IN_THREAD(m_smtp2.pump_clld(c_threshold));
} else if (lldtype == kplld) {
DO_IN_THREAD(m_smtp2.pump_distribut_plld(m_cfg.lld_pump_vel, p_threshold));
} else if (lldtype == kmixlld) {
DO_IN_THREAD(m_smtp2.pump_distribut_mlld(m_cfg.lld_pump_vel, c_threshold, p_threshold));
}
while (true) {
bool motorstoped = false;
int32_t motorerror = 0;
int32_t motorpos = 0;
int32_t capacitance = 0;
int32_t pressure = 0;
// 获取状态
if (recorddata) {
DO_IN_THREAD(m_smtp2.pump_get_capacitance(&capacitance));
DO_IN_THREAD(m_smtp2.pump_get_pressure(&pressure));
motorpos = m_zm->getXACTUAL() - start_motor_pos;
}
// 液面探测检测
int32_t detect_liquid = 0;
if (lldtype == kclld) {
DO_IN_THREAD(m_smtp2.pump_clld_get_state(&detect_liquid));
} else if (lldtype == kplld) {
DO_IN_THREAD(m_smtp2.pump_distribut_plld_get_state(&detect_liquid));
} else if (lldtype == kmixlld) {
DO_IN_THREAD(m_smtp2.pump_distribut_mlld_get_state(&detect_liquid));
}
// 探测到液面
if (detect_liquid == 1) {
ZLOGI(TAG, "detect liquid");
m_state.detected_liquid = 1;
if (recorddata) push_snesor_sample_data(motorpos, capacitance, pressure);
break;
}
// 电机停了也没有探测到液面
if (m_zm->isStoped()) {
if (!moveToStartPos) {
zm_move_by(zdpos, m_cfg.lld_motor_vel_rpm);
moveToStartPos = true;
} else {
ZLOGI(TAG, "motorstoped,but not detect liquid");
creg.module_errorcode = 0;
m_state.detected_liquid = 0;
if (recorddata) push_snesor_sample_data(motorpos, capacitance, pressure);
break;
}
}
if (recorddata) push_snesor_sample_data(motorpos, capacitance, pressure);
m_thread.sleep(m_cfg.lld_detect_period_ms);
}
});
return 0;
}
#endif
int32_t PipetteModuleV2::pipette_zmotor_read_zero_point_state(int32_t *state) {
*state = zm0p_is_trigger();

60
sdk/components/pipette_module/pipette_ctrl_module_v2.hpp

@ -52,24 +52,6 @@ class PipetteModuleV2 : public ZIModule {
} snesor_sample_data_t;
typedef struct {
// int32_t limit_ul; // 泵机限制
int32_t pump_acc; // 泵机速度参数
int32_t pump_dec; // 泵机速度参数
int32_t pump_vstart; // 泵机速度参数
int32_t pump_vstop; // 泵机速度参数
int32_t pump_vmax; // 泵机速度参数
int32_t aspirate_pump_vel; // 吸吐泵机速度
int32_t distribu_pump_vel; // 吸吐泵机速度
// int32_t aspirate_zmotor_max_move_by; // 吸液Z轴最大移动距离 //TODO add config index to set it
int32_t lld_pump_vel; // lld,泵机吸吐速度
int32_t lld_motor_vel_rpm; // lld,z轴电机移动速度
int32_t lld_detect_period_ms; // lld,探测周期
int32_t lld_prepare_pos; // lld,页面探测准备位置
int32_t lld_prepare_pre_distribut_ul; // lld前,预分配位置
int32_t lld_enable_record_data; //
int32_t llf_area2rpm; // 液面跟随,电机运动速度和容器截面积比例关系
int32_t zm_shaft;
int32_t zm_one_circle_pulse; //
int32_t zm_one_circle_pulse_denominator; //
@ -98,8 +80,22 @@ class PipetteModuleV2 : public ZIModule {
} config_t;
typedef struct {
int32_t pump_acc;
int32_t pump_dec;
int32_t pump_vstart;
int32_t pump_vstop;
int32_t pump_vmax;
int32_t zmotor_posmin;
int32_t zmotor_posmax;
int32_t zmotor_vmax;
int32_t lld_enable_record_data;
} liquid_operation_runparam_t;
typedef struct {
int32_t enable; // 电机使能
int32_t pipette_is_inited; // 泵机是否初始化
int32_t dul; // 吸吐变化量
int32_t detected_liquid; // 检测到液面
int32_t dpos;
@ -123,6 +119,7 @@ class PipetteModuleV2 : public ZIModule {
int32_t m_id = 0;
config_t m_cfg = {0};
bool m_config_update = false;
/***********************************************************************************************************************
@ -130,6 +127,8 @@ class PipetteModuleV2 : public ZIModule {
***********************************************************************************************************************/
state_t m_state = {0};
liquid_operation_runparam_t liquid_operation_runparam;
/***********************************************************************************************************************
* run_thread *
***********************************************************************************************************************/
@ -169,15 +168,28 @@ class PipetteModuleV2 : public ZIModule {
/***********************************************************************************************************************
* PUMP *
***********************************************************************************************************************/
/**
* @brief
*
* @param enable
* @return int32_t
*/
virtual int32_t liquid_operation_clear_params();
virtual int32_t liquid_operation_set_gun_runparams(int32_t acc, int32_t dec, int32_t vstart, int32_t vstop, int32_t vmax);
virtual int32_t liquid_operation_set_zmotor_runparams(int32_t posmin, int32_t posmax, int32_t vmax);
virtual int32_t liquid_operation_enable_lld_record();
virtual int32_t liquid_operation_fresh_params();
virtual int32_t pipette_init_device();
virtual int32_t pipette_put_tip();
virtual int32_t pipette_pump_move_to(int32_t pumpv, int32_t ul);
virtual int32_t pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c_threshold, int32_t p_threshold);
virtual int32_t pipette_pump_move_to(int32_t ul);
virtual int32_t pipette_lld(int32_t lldtype, int32_t c_threshold, int32_t p_threshold);
virtual int32_t pipette_lld_is_detect_liquid(int32_t *detect);
virtual int32_t pipette_aspirate(int32_t llfrpm, int32_t llftpos, int32_t pumpv, int32_t ul);
virtual int32_t pipette_distribu(int32_t llfrpm, int32_t pumpv, int32_t ul);
virtual int32_t pipette_shake_up(int32_t llfrpm, int32_t maxzpos, int32_t pumpv, int32_t ul, int32_t times);
virtual int32_t pipette_aspirate(int32_t nl);
virtual int32_t pipette_distribu(int32_t nl);
virtual int32_t pipette_shake_up(int32_t nl, int32_t times);
virtual int32_t pipette_clear_hanging_liquid(int32_t repeat_times);
/***********************************************************************************************************************
* READ_STATE *

26
sdk/components/sensors/smtp2_v2/smtp2_v2.cpp

@ -58,7 +58,6 @@ int32_t SMTP2V2::pump_get_pressure(int32_t* pressure) { //
int32_t SMTP2V2::pump_get_tip_state(int32_t* tipison) { return pump_get_state_as_int(kstate_tip_state, tipison); }
int32_t SMTP2V2::pump_get_nl(int32_t* nl) {
int32_t ret = pump_get_state_as_int(kstate_pump_pos_nl, nl);
if (ret != 0) return ret;
return ret;
@ -125,7 +124,6 @@ int32_t SMTP2V2::pump_aspirate_nl(int32_t v, int32_t nl) {
}
int32_t SMTP2V2::pump_distribut_nl(int32_t v, int32_t nl) { return pump_aspirate_nl(v, -nl); }
int32_t SMTP2V2::pump_distribut_all(int32_t v) { return pump_aspirate_nl(v, -1000 * 1000); }
// int32_t SMTP2V2::pump_distribut(int32_t v, int32_t ul) {
// ZLOGI(TAG, "pump_distribut %d", ul);
@ -241,14 +239,14 @@ int32_t SMTP2V2::pump_aspirate_and_verf(int32_t v, int32_t ul, int32_t p_thro, i
}
#endif
int32_t SMTP2V2::pump_distribut_plld(int32_t pumpv, int32_t pressure_threshold) {
int32_t SMTP2V2::pump_aspirate_plld(int32_t pumpv, int32_t pressure_threshold) {
// M100V100t50,0R
ZLOGI(TAG, "pump_distribut_plld %d %d", pumpv, pressure_threshold);
ZLOGI(TAG, "pump_aspirate_plld %d %d", pumpv, pressure_threshold);
// return runaction(true, "/1V%dt%d,0R\r", pumpv * 319, pressure_threshold);
return runaction(true, "/1V%dt%d,1R\r", pumpv * 319, pressure_threshold); // 6.14.1 t<n1>,<n2>压力液面检测(pLLD),吸取或分配
}
int32_t SMTP2V2::pump_distribut_plld_get_state(int32_t* detected) {
int32_t SMTP2V2::pump_aspirate_plld_get_state(int32_t* detected) {
int32_t isbusy = 0;
int32_t ret = pump_get_state(&isbusy);
if (isbusy != 0) {
@ -308,6 +306,24 @@ void SMTP2V2::getack(char* rx, int32_t* rxbufsize) {
memcpy(rx, m_rxbuf, m_rxNum - 2);
rx[*rxbufsize - 1] = 0;
}
void SMTP2V2::dumpparam() {
static char rxbuf[128];
static int32_t rxbufsize = 0;
// write_cmd("/1K0R\r");
// memset(rxbuf, 0, sizeof(rxbuf));
// write_cmd("/1?4\r");
// getack(rxbuf, &rxbufsize);
// ZLOGI(TAG, "K(r): %s", rxbuf);
// memset(rxbuf, 0, sizeof(rxbuf));
// write_cmd("/1?53\r");
// getack(rxbuf, &rxbufsize);
// ZLOGI(TAG, "K(r): %s", rxbuf);
}
/***********************************************************************************************************************
* BASIC *
***********************************************************************************************************************/

38
sdk/components/sensors/smtp2_v2/smtp2_v2.hpp

@ -40,7 +40,6 @@ typedef enum {
} cmd_t;
typedef enum {
kcfg_pump_limit_ul = 1, // 最大行程(Tip尺寸) 1...3500 default:3143
kcfg_baudrate = 2, // 0:9600 1:38400 default:1
kcfg_communication_protocol = 3,
@ -158,18 +157,6 @@ class SMTP2V2 {
bool pump_ping();
/***********************************************************************************************************************
* STATE *
***********************************************************************************************************************/
int32_t pump_get_state(int32_t* isbusy);
int32_t pump_get_capacitance(int32_t* capacitance);
int32_t pump_get_pressure(int32_t* pressure);
int32_t pump_get_tip_state(int32_t* tipison);
int32_t pump_get_nl(int32_t* nl);
int32_t pump_get_state_as_int(int32_t state_index, int32_t* val);
// pump_get_state_as_int(kstate_pump_pos_nl, &nownl);
/***********************************************************************************************************************
* CONFIG *
@ -179,13 +166,24 @@ class SMTP2V2 {
int32_t pump_set_vmax(int32_t vel);
int32_t pump_set_acc_and_dec(int32_t acc, int32_t dec);
int32_t pump_set_plld_start_delay(int32_t delay_ms);
int32_t pump_set_io1_mode(int32_t mode); // 0LLD输出高 1LLD输出低 2通用输出
int32_t pump_set_io2_mode(int32_t mode); // 0通用输入 1紧急制动 2Tip脱落输出高 3Tip脱落输出低
int32_t pump_set_tip_size(int32_t size); // Tip大小 0:1ml 1:200ul(max:250ul) 2:50ul(max:62ul) 3=20ul(max:40ul)
int32_t pump_enable_temp_compensation(int32_t enable); // 0:关闭 1:开启
/***********************************************************************************************************************
* STATE *
***********************************************************************************************************************/
int32_t pump_get_state(int32_t* isbusy);
int32_t pump_get_capacitance(int32_t* capacitance);
int32_t pump_get_pressure(int32_t* pressure);
int32_t pump_get_tip_state(int32_t* tipison);
int32_t pump_get_nl(int32_t* nl);
int32_t pump_get_state_as_int(int32_t state_index, int32_t* val);
// pump_get_state_as_int(kstate_pump_pos_nl, &nownl);
/***********************************************************************************************************************
* ACTION *
***********************************************************************************************************************/
int32_t pump_init(int32_t v); // 泵机初始化(归零)
@ -194,9 +192,8 @@ class SMTP2V2 {
int32_t pump_put_tip(); // 丢弃TIP
int32_t pump_move_to_nl(int32_t v, int32_t nl); //
int32_t pump_distribut_plld(int32_t pumpv, int32_t pressure_threshold); // plld,分配探测
int32_t pump_distribut_plld_get_state(int32_t* detected);
int32_t pump_aspirate_plld(int32_t pumpv, int32_t pressure_threshold); // plld,分配探测
int32_t pump_aspirate_plld_get_state(int32_t* detected);
int32_t pump_clld(int32_t c_threshold); // clld 0...130
int32_t pump_clld_get_state(int32_t* detected);
@ -206,11 +203,14 @@ class SMTP2V2 {
int32_t pump_aspirate_nl(int32_t v, int32_t nl);
int32_t pump_distribut_nl(int32_t v, int32_t nl);
int32_t pump_distribut_all(int32_t v);
int32_t pump_aspirate_and_verify(int32_t v, int32_t ul, int32_t eigen_time, int32_t p_thre, int32_t tolerance);
// int32_t pump_distribut(int32_t v, int32_t ul);
/***********************************************************************************************************************
* infer *
***********************************************************************************************************************/
int32_t pump_aspirate_infer_pressure(int32_t v, int32_t ul);
int32_t pump_get_infer_pressure(int32_t* p_thre);
@ -223,6 +223,8 @@ class SMTP2V2 {
bool write_cmd(const char* cmd);
void getack(char* rx, int32_t* rxbufsize);
void dumpparam();
private:
int32_t runaction(bool dump, const char* format, ...);
int32_t _runaction(bool dump, const char* cmd);

71
sdk/components/zcancmder/zcan_protocol_parser.cpp

@ -74,26 +74,6 @@ void ZCanProtocolParser::initialize(IZCanReceiver* cancmder) {
REGFN(code_scaner_get_result_length);
REGFN(code_scaner_read_scaner_result);
// REGFN(pipette_ctrl_init_device);
// REGFN(pipette_ctrl_put_tip);
// REGFN(pipette_ctrl_move_to_ul);
// REGFN(pipette_lld_prepare);
// REGFN(pipette_plld);
// REGFN(pipette_clld);
// REGFN(pipette_mlld);
// REGFN(pipette_lld_is_detect_liquid);
// REGFN(pipette_aspirate);
// REGFN(pipette_distribut);
// REGFN(pipette_shake_up);
// REGFN(pipette_aspirate_llf);
// REGFN(pipette_distribut_llf);
// REGFN(pipette_shake_up_llf);
// REGFN(pipette_enable_zmotor);
// REGFN(pipette_write_cmd_direct);
// REGFN(pipette_get_sensor_sample_data);
// REGFN(pipette_get_sensor_sample_data_num);
REGFN(temp_controler_start_hearting);
REGFN(temp_controler_stop_hearting);
REGFN(temp_controler_set_peltier_power_level);
@ -159,6 +139,12 @@ void ZCanProtocolParser::initialize(IZCanReceiver* cancmder) {
REGFN(pipette_zmotor_move_by);
REGFN(pipette_zmotor_move_to);
REGFN(liquid_operation_clear_params);
REGFN(liquid_operation_set_gun_runparams);
REGFN(liquid_operation_set_zmotor_runparams);
REGFN(liquid_operation_enable_lld_record);
REGFN(liquid_operation_fresh_params);
REGFN(pipette_init_device);
REGFN(pipette_put_tip);
REGFN(pipette_pump_move_to);
@ -861,6 +847,31 @@ int32_t ZCanProtocolParser::pipette_zmotor_move_to(cmdcontxt_t* cxt) {
return module->pipette_zmotor_move_to(cxt->params[0]);
}
int32_t ZCanProtocolParser::liquid_operation_clear_params(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(0);
return module->liquid_operation_clear_params();
}
int32_t ZCanProtocolParser::liquid_operation_set_gun_runparams(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(5);
return module->liquid_operation_set_gun_runparams(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3], cxt->params[4]);
}
int32_t ZCanProtocolParser::liquid_operation_set_zmotor_runparams(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(3);
return module->liquid_operation_set_zmotor_runparams(cxt->params[0], cxt->params[1], cxt->params[2]);
}
int32_t ZCanProtocolParser::liquid_operation_enable_lld_record(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(0);
return module->liquid_operation_enable_lld_record();
}
int32_t ZCanProtocolParser::liquid_operation_fresh_params(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(0);
return module->liquid_operation_fresh_params();
}
int32_t ZCanProtocolParser::pipette_init_device(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(0);
return module->pipette_init_device();
@ -870,24 +881,24 @@ int32_t ZCanProtocolParser::pipette_put_tip(cmdcontxt_t* cxt) {
return module->pipette_put_tip();
}
int32_t ZCanProtocolParser::pipette_pump_move_to(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(2);
return module->pipette_pump_move_to(cxt->params[0], cxt->params[1]);
CHECK_AND_GET_MODULE(1);
return module->pipette_pump_move_to(cxt->params[0]);
}
int32_t ZCanProtocolParser::pipette_lld(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(4);
return module->pipette_lld(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3]);
CHECK_AND_GET_MODULE(3);
return module->pipette_lld(cxt->params[0], cxt->params[1], cxt->params[2]);
}
int32_t ZCanProtocolParser::pipette_aspirate(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(4);
return module->pipette_aspirate(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3]);
CHECK_AND_GET_MODULE(1);
return module->pipette_aspirate(cxt->params[0]);
}
int32_t ZCanProtocolParser::pipette_distribu(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(3);
return module->pipette_distribu(cxt->params[0], cxt->params[1], cxt->params[2]);
CHECK_AND_GET_MODULE(1);
return module->pipette_distribu(cxt->params[0]);
}
int32_t ZCanProtocolParser::pipette_shake_up(cmdcontxt_t* cxt) {
CHECK_AND_GET_MODULE(5);
return module->pipette_shake_up(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3], cxt->params[4]);
CHECK_AND_GET_MODULE(2);
return module->pipette_shake_up(cxt->params[0], cxt->params[1]);
}
/***********************************************************************************************************************

8
sdk/components/zcancmder/zcan_protocol_parser.hpp

@ -173,6 +173,14 @@ 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);
CMDFN(liquid_operation_enable_lld_record);
CMDFN(liquid_operation_fresh_params);
CMDFN(pipette_init_device);
CMDFN(pipette_put_tip);
CMDFN(pipette_pump_move_to);

10
sdk/os/zoslogger.hpp

@ -11,11 +11,11 @@ extern bool g_enable_log;
#define ZLOG_RELEASE(TAG, fmt, ...) \
if (g_enable_log) { \
zos_log(TAG "" fmt "\n", ##__VA_ARGS__); \
zos_log(TAG "" fmt "\r\n", ##__VA_ARGS__); \
}
#define ZLOGI(TAG, fmt, ...) \
if (g_enable_log) { \
zos_log("%08lu INFO [%-10s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zos_log("%08lu INFO [%-10s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZLOGI_NOT_END_LINE(TAG, fmt, ...) \
if (g_enable_log) { \
@ -24,16 +24,16 @@ extern bool g_enable_log;
#define ZLOGD(TAG, fmt, ...) \
if (g_enable_log) { \
zos_log("%08lu DEBU [%-10s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zos_log("%08lu DEBU [%-10s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZLOGE(TAG, fmt, ...) \
if (g_enable_log) { \
zos_log("%08lu ERRO [%-10s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zos_log("%08lu ERRO [%-10s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZLOGW(TAG, fmt, ...) \
if (g_enable_log) { \
zos_log("%08lu WARN [%-10s] " fmt "\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
zos_log("%08lu WARN [%-10s] " fmt "\r\n", zchip_clock_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZASSERT(cond) \

2
usrc/project_configs.h

@ -1,5 +1,5 @@
#pragma once
#define PC_VERSION 604
#define PC_VERSION 605
#define PC_MANUFACTURER "http://www.iflytop.com/"
#define PC_PROJECT_NAME "a8000_subboard"
#define PC_IFLYTOP_ENABLE_OS 1

22
usrc/sysmgr/sys_mgr.cpp

@ -16,13 +16,13 @@ extern "C" {
* STM32_CODE_ERROR *
***********************************************************************************************************************/
void SysMgr_on_Error_Handler() {
ZLOGE(TAG, "Error_Handler\n");
ZLOGE(TAG, "Error_Handler\r\n");
while (1) {
}
}
void SysMgr_on_assert_failed(uint8_t* file, uint32_t line) {
ZLOGE(TAG, "ASSERT: %s [%s:%d]\n", file, line);
ZLOGE(TAG, "ASSERT: %s [%s:%d]\r\n", file, line);
while (1) {
}
}
@ -40,13 +40,13 @@ void SysMgr_on_UsageFault_Handler(void) { ZLOGI(TAG, "on UsageFault_Handler"); }
* FREERTOS_ERROR *
***********************************************************************************************************************/
void vApplicationStackOverflowHook(xTaskHandle xTask, signed char* pcTaskName) {
ZLOGE(TAG, "StackOverflowHook: %s\n", pcTaskName);
ZLOGE(TAG, "StackOverflowHook: %s\r\n", pcTaskName);
__disable_irq();
while (1) {
}
}
void vApplicationMallocFailedHook(void) {
ZLOGE(TAG, "MallocFailedHook\n");
ZLOGE(TAG, "MallocFailedHook\r\n");
__disable_irq();
while (1) {
}
@ -80,18 +80,18 @@ size_t SysMgr::osGetTotalHeapSize() { return configTOTAL_HEAP_SIZE; }
int32_t SysMgr::getTaskNum() { return m_ntask; }
void SysMgr::dumpSysInfo() {
zos_log("---------------Heap Info--------------\n");
zos_log("MinimumEverFreeHeapSize: %d\n", osGetMinimumEverFreeHeapSize());
zos_log("FreeHeapSize : %d\n", osGetFreeHeapSize());
zos_log("TotalHeapSize : %d\n", osGetTotalHeapSize());
zos_log("---------------Heap Info--------------\r\n");
zos_log("MinimumEverFreeHeapSize: %d\r\n", osGetMinimumEverFreeHeapSize());
zos_log("FreeHeapSize : %d\r\n", osGetFreeHeapSize());
zos_log("TotalHeapSize : %d\r\n", osGetTotalHeapSize());
zos_log("");
zos_log("---------------Task Info--------------\n");
zos_log("---------------Task Info--------------\r\n");
static char buf[40 * SDK_MAX_TASK]; // 40一个任务,最多支持10个任务
vTaskList(buf);
zos_log("Name State Priority Stack Num\n");
zos_log("Name State Priority Stack Num\r\n");
zlog_raw(buf);
zos_log("- TaskInfoEnd -\n");
zos_log("- TaskInfoEnd -\r\n");
}
uint32_t SysMgr::osTaskStackRemainingSize(osThreadId id) { return uxTaskGetStackHighWaterMark(id); }

Loading…
Cancel
Save