diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index d5ed440..e5a47bb 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/README.md b/README.md index 6904c60..e993f2c 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,8 @@ ``` - -subboard20_plate_clamp_case OK -subboard30_shake_module OK -subboard60_inlet_and_outlet_module OK -subboard70_incubation_turntable -subboard80_cliptip -subboard90_optical_module +V602 + 1. 修复移液枪Z轴控制部分BUG ``` @@ -22,14 +17,14 @@ subboard90_optical_module ID地址: 0x080E0000 10 :A -20 :14 板夹仓 +20 :14 30 :1E 40 :28 50 :32 60 :3C 70 :46 80 :50 -90 :5A 光学模组 +90 :5A 100:64 110:6E 200:CB @@ -40,18 +35,6 @@ ID地址: ``` -# 公板IO资源分配 - PA12 CAN1_TX - PA11 CAN1_RX - PA10 USART1_RX - PA9 USART1_TX - - PC9 RCC_MCO_2 --> 16MHZ - PA14 SYS_JTCK_SWCLK - PA13 SYS_JTCK_SWDIO - - PE2 调试指示灯 - ``` @@ -63,58 +46,7 @@ ID地址: ``` ``` -~吸吐 - 此时探头中没有液体 - 1.液面探测(max_dpos)(混合液体探测) - 2.吸液且液面跟随(step_motor_v) - - -移液枪动作 - 刺破: - Z轴电机移动 - - - 大瓶缓冲液+探测物质 - 1. 刺破探测物质 - 取tip - 移动Z轴 - 丢tip(应该可以不丢) - 2. 取大瓶子缓冲液(PS:1,2步应该可以使用同一个tip) - 取tip - 液面探测复位 - 移动z轴 - 液面探测(maxdpos,) - 液体跟随&&取液体(v,ul) - 3. 滴入探测物质 - 移动z轴 - 排空液体 - 丢tip - 4. 取血液体 - 取tip - 移动Z轴 - 液面探测 - 吸液&&液面跟随 - 5. 血液滴入探测物质(此过程中没有液面探测,没有液面跟随) - 移动z轴(固定位置) - 排空液体 - 吸吐混匀(液面跟随V) - - 小瓶缓冲液 - 1. 刺破小瓶缓冲液 - 取tip - 移动Z轴(刺破) - 丢tip(可以不丢弃) - 2. 取血液 - 取tip - 移动Z轴 - 液面探测 - 吸液&&液面跟随 - 3. 血液滴入探测物质(此过程中没有液面探测,没有液面跟随) - 移动z轴(固定位置) - 排空液体 - 吸吐混匀 - 排空液体 - 丢tip + diff --git a/a8000_protocol b/a8000_protocol index 6c53aa3..51da893 160000 --- a/a8000_protocol +++ b/a8000_protocol @@ -1 +1 @@ -Subproject commit 6c53aa3ab6e9888e39bcc92f7956d9fc6ad135a9 +Subproject commit 51da893d74468dd8ae898e97936a2357a6120eb0 diff --git a/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp b/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp index 62cfcc4..763925e 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp +++ b/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp @@ -323,7 +323,10 @@ int32_t PipetteModuleV2::pipette_init_device() { } int32_t PipetteModuleV2::pipette_put_tip() { - THREAD_START_WORK([this]() { DO_IN_THREAD(m_smtp2.pump_put_tip()); }); + THREAD_START_WORK([this]() { + DO_IN_THREAD(m_smtp2.pump_put_tip()); + pump_waitfor_stop(); + }); return 0; } @@ -345,12 +348,12 @@ int32_t PipetteModuleV2::pipette_lld_prepare() { return 0; } -int32_t PipetteModuleV2::pipette_lld_test(int32_t startpos, int32_t zdpos) { // - return do_pipette_lld(true, kplld, startpos, zdpos, 100, 1000); +int32_t PipetteModuleV2::pipette_lld_test() { // + return do_pipette_lld(true, kplld, m_state.pipette_startz, m_state.pipette_endz, 100, 1000); } -int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t startpos, int32_t zdpos, int32_t c_threshold, int32_t p_threshold) { // - return do_pipette_lld(false, lldtype, startpos, zdpos, c_threshold, p_threshold); +int32_t PipetteModuleV2::pipette_lld() { // + return do_pipette_lld(false, m_state.lld_type, m_state.pipette_startz, m_state.pipette_endz - m_state.pipette_startz, m_state.lld_c_threshold, m_state.lld_p_threshold); } int32_t PipetteModuleV2::pipette_lld_is_detect_liquid(int32_t *detect) { @@ -361,12 +364,9 @@ int32_t PipetteModuleV2::pipette_lld_is_detect_liquid(int32_t *detect) { int32_t PipetteModuleV2::pipette_aspirate_prepare() { THREAD_START_WORK([this]() { // ZLOGI(TAG, "pipette_aspirate_prepare"); - m_state.aspirate_cfg_eigen_time = 0; - m_state.aspirate_cfg_p_thre = 0; - m_state.aspirate_cfg_llf_zm_rpm = 0; - m_state.load_val_ul = 0; - int32_t nowpos = zm_get_now_pos(); - int32_t bak = nowpos - 100; + m_state.load_val_ul = 0; + int32_t nowpos = zm_get_now_pos(); + int32_t bak = nowpos - 100; if (bak < 0) bak = 0; zm_move_to(bak, m_cfg.zm_default_velocity); @@ -385,25 +385,52 @@ int32_t PipetteModuleV2::pipette_aspirate_prepare() { return 0; } -int32_t PipetteModuleV2::pipette_aspirate_set_llf_velocity(int32_t llf_zm_rpm) { +int32_t PipetteModuleV2::pipette_set_startz(int32_t startz) { + ZLOGI(TAG, "pipette_set_startz %d", startz); + m_state.pipette_startz = startz; + return 0; +} +int32_t PipetteModuleV2::pipette_set_endz(int32_t endz) { + ZLOGI(TAG, "pipette_set_endz %d", endz); + m_state.pipette_endz = endz; + return 0; +} + +int32_t PipetteModuleV2::pipette_set_lld_type(int32_t lld_type) { + ZLOGI(TAG, "pipette_set_lld_type %d", lld_type); + m_state.lld_type = lld_type; + return 0; +} +int32_t PipetteModuleV2::pipette_set_lld_c_threshold(int32_t c_threshold) { + ZLOGI(TAG, "pipette_set_lld_c_threshold %d", c_threshold); + m_state.lld_c_threshold = c_threshold; + return 0; +} +int32_t PipetteModuleV2::pipette_set_lld_p_threshold(int32_t p_threshold) { + ZLOGI(TAG, "pipette_set_lld_p_threshold %d", p_threshold); + m_state.lld_p_threshold = p_threshold; + return 0; +} + +int32_t PipetteModuleV2::pipette_set_llf_velocity(int32_t llf_zm_rpm) { m_state.aspirate_cfg_llf_zm_rpm = llf_zm_rpm; - ZLOGI(TAG, "pipette_aspirate_set_llf_velocity %d", llf_zm_rpm); + ZLOGI(TAG, "pipette_set_llf_velocity %d", llf_zm_rpm); return 0; } -int32_t PipetteModuleV2::pipette_aspirate_set_operation_verifi_p_thre(int32_t p_thre) { +int32_t PipetteModuleV2::pipette_set_aspirate_operation_verifi_p_thre(int32_t p_thre) { m_state.aspirate_cfg_p_thre = p_thre; - ZLOGI(TAG, "pipette_aspirate_set_operation_verifi_p_thre %d", p_thre); + ZLOGI(TAG, "pipette_set_aspirate_operation_verifi_p_thre %d", p_thre); return 0; } -int32_t PipetteModuleV2::pipette_aspirate_set_operation_verifi_eigen_time(int32_t characteristic_time) { +int32_t PipetteModuleV2::pipette_set_aspirate_operation_verifi_eigen_time(int32_t characteristic_time) { m_state.aspirate_cfg_eigen_time = characteristic_time; - ZLOGI(TAG, "pipette_aspirate_set_operation_verifi_eigen_time %d", characteristic_time); + ZLOGI(TAG, "pipette_set_aspirate_operation_verifi_eigen_time %d", characteristic_time); return 0; } -int32_t PipetteModuleV2::pipette_aspirate_set_operation_verifi_tolerance(int32_t tolerance) { +int32_t PipetteModuleV2::pipette_set_aspirate_operation_verifi_tolerance(int32_t tolerance) { m_state.aspirate_cfg_tolerance = tolerance; - ZLOGI(TAG, "pipette_aspirate_set_operation_verifi_tolerance %d", tolerance); + ZLOGI(TAG, "pipette_set_aspirate_operation_verifi_tolerance %d", tolerance); return 0; } @@ -614,6 +641,10 @@ void PipetteModuleV2::do_pipette_zmotor_move_to_zero_point_quick() { // 校验偏差 int32_t dpos = zm_get_now_pos() - startpos; + // 设置零点 + zm_set_now_pos(0 + m_cfg.zm_dzero - m_cfg.zm_io_trigger_append_distance); + m_state.has_move_to_zero = 1; + if (m_cfg.zm_pos_devi_tolerance != 0 && (abs(expectation_dpos - dpos) > m_cfg.zm_pos_devi_tolerance)) { throw zapp_exception(err::kstep_motor_lost_step); } @@ -769,7 +800,14 @@ void PipetteModuleV2::zm_update_dzero(int32_t dzero) { bool PipetteModuleV2::zm0p_is_trigger() { return m_zm0p->getState(); } void PipetteModuleV2::zm_waitfor_zm0p_trigger_and_stop_motor() { - while (!zm0p_is_trigger() && !m_zm->isStoped()) thread_delay(2); + while (!zm0p_is_trigger()) { + if (m_zm->isStoped()) { + ZLOGI(TAG, "motor stop first....."); + break; + } + thread_delay(2); + } + // 停止电机 m_zm->stop(); // 等待电机停止 @@ -777,6 +815,23 @@ void PipetteModuleV2::zm_waitfor_zm0p_trigger_and_stop_motor() { thread_delay(10); } } + +void PipetteModuleV2::zm_waitfor_zm0p_not_trigger_and_stop_motor() { + // 等待触发 + while (zm0p_is_trigger()) { + if (m_zm->isStoped()) { + ZLOGI(TAG, "motor stop first....."); + break; + } + thread_delay(2); + } + + // 停止电机 + m_zm->stop(); + // 等待电机停止 + while (!m_zm->isStoped()) thread_delay(10); +} + void PipetteModuleV2::pump_waitfor_stop() { while (true) { int32_t isbusy = 0; @@ -801,15 +856,6 @@ int32_t PipetteModuleV2::pump_read_tip_state(int32_t *val) { return 0; } -void PipetteModuleV2::zm_waitfor_zm0p_not_trigger_and_stop_motor() { - // 等待触发 - while (zm0p_is_trigger()) thread_delay(2); - // 停止电机 - m_zm->stop(); - // 等待电机停止 - while (!m_zm->isStoped()) thread_delay(10); -} - void PipetteModuleV2::zm_waitfor_stop() { while (!m_zm->isStoped()) thread_delay(10); } @@ -873,11 +919,11 @@ int32_t PipetteModuleV2::bfcall(int32_t cmdid, uint8_t *param, int32_t len) { if (cmdid == kpipette_zmotor_move_by) goto check_motor_is_enable; if (cmdid == kpipette_zmotor_move_to_zero_point_quick) goto check_motor_has_moveto_zero; - if (cmdid == kpipette_zmotor_measure_distance) goto check_motor_has_moveto_zero; + if (cmdid == kpipette_zmotor_measure_distance) goto check_motor_is_enable; if (cmdid == kpipette_zmotor_move_to) goto check_motor_has_moveto_zero; - if (cmdid == kpipette_init_device) goto check_motor_has_moveto_zero; - if (cmdid == kpipette_put_tip) goto check_motor_has_moveto_zero; + if (cmdid == kpipette_init_device) goto suc; + if (cmdid == kpipette_put_tip) goto suc; if (cmdid == kpipette_lld_prepare) goto check_motor_has_moveto_zero; if (cmdid == kpipette_lld) goto check_motor_has_moveto_zero; if (cmdid == kpipette_lld_test) goto check_motor_has_moveto_zero; @@ -912,6 +958,7 @@ check: */ return 0; } +suc: return 0; } void PipetteModuleV2::aftercall(int32_t cmdid, uint8_t *param, int32_t len, uint8_t *ack, int32_t acklen, int32_t ret) { diff --git a/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp b/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp index 3b2a9e0..fa8bb4b 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp +++ b/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp @@ -103,6 +103,13 @@ class PipetteModuleV2 : public ZIModule { int32_t detected_liquid; // 检测到液面 int32_t dpos; + // setting + int32_t pipette_startz; // lld探测起始位 + int32_t pipette_endz; // lld探测结束位置, llf液面跟随限制位 + int32_t lld_type; // lld类型 + int32_t lld_c_threshold; // lld c_threshold + int32_t lld_p_threshold; // lld p_threshold + int32_t aspirate_cfg_llf_zm_rpm; // 液面跟随速度 int32_t aspirate_cfg_p_thre; // 吸液操作验证,压力阈值,用来检测tip阻塞问题 int32_t aspirate_cfg_eigen_time; // 吸液操作验证,特征时间,用来检测气泡,吸空检测 @@ -169,19 +176,29 @@ class PipetteModuleV2 : public ZIModule { virtual int32_t pipette_init_device(); virtual int32_t pipette_put_tip(); + + virtual int32_t pipette_set_startz(int32_t startz); + virtual int32_t pipette_set_endz(int32_t maxz); + + virtual int32_t pipette_set_lld_type(int32_t lld_type); + virtual int32_t pipette_set_lld_c_threshold(int32_t c_threshold); + virtual int32_t pipette_set_lld_p_threshold(int32_t p_threshold); + + virtual int32_t pipette_set_llf_velocity(int32_t llf_zm_rpm); + virtual int32_t pipette_set_aspirate_operation_verifi_p_thre(int32_t p_thre); + virtual int32_t pipette_set_aspirate_operation_verifi_eigen_time(int32_t eigen_time); + virtual int32_t pipette_set_aspirate_operation_verifi_tolerance(int32_t tolerance); + virtual int32_t pipette_lld_prepare(); - virtual int32_t pipette_lld(int32_t lldtype /*kclld = 0,kplld = 1, kmixlld = 2, */, int32_t startpos, int32_t zdpos, int32_t c_threshold, int32_t p_threshold); - virtual int32_t pipette_lld_test(int32_t startpos, int32_t zdpos); + virtual int32_t pipette_lld(); + virtual int32_t pipette_lld_test(); virtual int32_t pipette_lld_is_detect_liquid(int32_t *detect); virtual int32_t pipette_aspirate_prepare(); - virtual int32_t pipette_aspirate_set_llf_velocity(int32_t llf_zm_rpm); - virtual int32_t pipette_aspirate_set_operation_verifi_p_thre(int32_t p_thre); - virtual int32_t pipette_aspirate_set_operation_verifi_eigen_time(int32_t eigen_time); - virtual int32_t pipette_aspirate_set_operation_verifi_tolerance(int32_t tolerance); virtual int32_t pipette_aspirate(int32_t ul); virtual int32_t pipette_aspirate_and_verify(int32_t ul); virtual int32_t pipette_shake_up(int32_t ul, int32_t times); + virtual int32_t pipette_aspirate_infer_pressure(int32_t ul); virtual int32_t pipette_aspirate_infer_eigen_time(int32_t ul); virtual int32_t pipette_get_aspirate_infer_pressure_result(int32_t *result); @@ -217,6 +234,7 @@ class PipetteModuleV2 : public ZIModule { void zm_waitfor_zm0p_trigger_and_stop_motor(); void zm_waitfor_zm0p_not_trigger_and_stop_motor(); + void zm_waitfor_stop(); int32_t pump_read_pos_ul(int32_t *val); diff --git a/sdk/components/zcancmder/zcan_protocol_parser.cpp b/sdk/components/zcancmder/zcan_protocol_parser.cpp index b7c4965..11a128f 100644 --- a/sdk/components/zcancmder/zcan_protocol_parser.cpp +++ b/sdk/components/zcancmder/zcan_protocol_parser.cpp @@ -163,10 +163,10 @@ void ZCanProtocolParser::initialize(IZCanReceiver* cancmder) { REGFN(pipette_lld_prepare); REGFN(pipette_lld); REGFN(pipette_aspirate_prepare); - REGFN(pipette_aspirate_set_llf_velocity); - REGFN(pipette_aspirate_set_operation_verifi_p_thre); - REGFN(pipette_aspirate_set_operation_verifi_eigen_time); - REGFN(pipette_aspirate_set_operation_verifi_tolerance); + REGFN(pipette_set_llf_velocity); + REGFN(pipette_set_aspirate_operation_verifi_p_thre); + REGFN(pipette_set_aspirate_operation_verifi_eigen_time); + REGFN(pipette_set_aspirate_operation_verifi_tolerance); REGFN(pipette_aspirate); REGFN(pipette_aspirate_and_verify); REGFN(pipette_shake_up); @@ -180,6 +180,12 @@ void ZCanProtocolParser::initialize(IZCanReceiver* cancmder) { REGFN(pipette_zmotor_read_dev_status_cache); REGFN(pipette_lld_is_detect_liquid); REGFN(pipette_lld_test); + + REGFN(pipette_set_startz); + REGFN(pipette_set_endz); + REGFN(pipette_set_lld_type); + REGFN(pipette_set_lld_c_threshold); + REGFN(pipette_set_lld_p_threshold); } void ZCanProtocolParser::_registerModule(uint16_t id, ZIModule* module) { m_modulers[id] = module; } void ZCanProtocolParser::registerModule(ZIModule* module) { @@ -986,28 +992,28 @@ int32_t ZCanProtocolParser::pipette_lld_prepare(cmdcontxt_t* cxt) { return module->pipette_lld_prepare(); } int32_t ZCanProtocolParser::pipette_lld(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(5); - return module->pipette_lld(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3], cxt->params[4]); + CHECK_AND_GET_MODULE(0); + return module->pipette_lld(); } int32_t ZCanProtocolParser::pipette_aspirate_prepare(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(0); return module->pipette_aspirate_prepare(); } -int32_t ZCanProtocolParser::pipette_aspirate_set_llf_velocity(cmdcontxt_t* cxt) { +int32_t ZCanProtocolParser::pipette_set_llf_velocity(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate_set_llf_velocity(cxt->params[0]); + return module->pipette_set_llf_velocity(cxt->params[0]); } -int32_t ZCanProtocolParser::pipette_aspirate_set_operation_verifi_p_thre(cmdcontxt_t* cxt) { +int32_t ZCanProtocolParser::pipette_set_aspirate_operation_verifi_p_thre(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate_set_operation_verifi_p_thre(cxt->params[0]); + return module->pipette_set_aspirate_operation_verifi_p_thre(cxt->params[0]); } -int32_t ZCanProtocolParser::pipette_aspirate_set_operation_verifi_eigen_time(cmdcontxt_t* cxt) { +int32_t ZCanProtocolParser::pipette_set_aspirate_operation_verifi_eigen_time(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate_set_operation_verifi_eigen_time(cxt->params[0]); + return module->pipette_set_aspirate_operation_verifi_eigen_time(cxt->params[0]); } -int32_t ZCanProtocolParser::pipette_aspirate_set_operation_verifi_tolerance(cmdcontxt_t* cxt) { +int32_t ZCanProtocolParser::pipette_set_aspirate_operation_verifi_tolerance(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate_set_operation_verifi_tolerance(cxt->params[0]); + return module->pipette_set_aspirate_operation_verifi_tolerance(cxt->params[0]); } int32_t ZCanProtocolParser::pipette_aspirate(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(1); @@ -1073,8 +1079,33 @@ int32_t ZCanProtocolParser::pipette_lld_is_detect_liquid(cmdcontxt_t* cxt) { } // pipette_lld_test int32_t ZCanProtocolParser::pipette_lld_test(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->pipette_lld_test(cxt->params[0],cxt->params[1]); + CHECK_AND_GET_MODULE(0); + return module->pipette_lld_test(); +} + +int32_t ZCanProtocolParser::pipette_set_startz(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_set_startz(cxt->params[0]); +} + +int32_t ZCanProtocolParser::pipette_set_endz(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_set_endz(cxt->params[0]); +} + +int32_t ZCanProtocolParser::pipette_set_lld_type(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_set_lld_type(cxt->params[0]); +} + +int32_t ZCanProtocolParser::pipette_set_lld_c_threshold(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_set_lld_c_threshold(cxt->params[0]); +} + +int32_t ZCanProtocolParser::pipette_set_lld_p_threshold(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_set_lld_p_threshold(cxt->params[0]); } #undef MODULE_CLASS \ No newline at end of file diff --git a/sdk/components/zcancmder/zcan_protocol_parser.hpp b/sdk/components/zcancmder/zcan_protocol_parser.hpp index cc6a798..79b7e06 100644 --- a/sdk/components/zcancmder/zcan_protocol_parser.hpp +++ b/sdk/components/zcancmder/zcan_protocol_parser.hpp @@ -197,10 +197,10 @@ class ZCanProtocolParser : public IZCanReceiverListener { CMDFN(pipette_lld_prepare); CMDFN(pipette_lld); CMDFN(pipette_aspirate_prepare); - CMDFN(pipette_aspirate_set_llf_velocity); - CMDFN(pipette_aspirate_set_operation_verifi_p_thre); - CMDFN(pipette_aspirate_set_operation_verifi_eigen_time); - CMDFN(pipette_aspirate_set_operation_verifi_tolerance); + CMDFN(pipette_set_llf_velocity); + CMDFN(pipette_set_aspirate_operation_verifi_p_thre); + CMDFN(pipette_set_aspirate_operation_verifi_eigen_time); + CMDFN(pipette_set_aspirate_operation_verifi_tolerance); CMDFN(pipette_aspirate); CMDFN(pipette_aspirate_and_verify); CMDFN(pipette_shake_up); @@ -214,7 +214,11 @@ class ZCanProtocolParser : public IZCanReceiverListener { CMDFN(pipette_zmotor_read_dev_status_cache); CMDFN(pipette_lld_is_detect_liquid); CMDFN(pipette_lld_test); - + CMDFN(pipette_set_startz); + CMDFN(pipette_set_endz); + CMDFN(pipette_set_lld_type); + CMDFN(pipette_set_lld_c_threshold); + CMDFN(pipette_set_lld_p_threshold); }; } // namespace iflytop \ No newline at end of file diff --git a/usrc/project_configs.h b/usrc/project_configs.h index a32adcc..61f8985 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -1,5 +1,5 @@ #pragma once -#define PC_VERSION 601 +#define PC_VERSION 602 #define PC_MANUFACTURER "http://www.iflytop.com/" #define PC_PROJECT_NAME "a8000_subboard" #define PC_IFLYTOP_ENABLE_OS 1