#include "zmodule_device_manager.hpp" #include #include using namespace iflytop; using namespace std; #define PROXY_IMPL(type, functionName, ...) \ type *module = nullptr; \ int32_t ecode = findModule(id, &module); \ if (ecode != 0) { \ return ecode; \ } \ return module->functionName(__VA_ARGS__); void ZModuleDeviceManager::initialize(IZcanCmderMaster *cancmder) { m_cancmder = cancmder; // assert(m_cancmder != nullptr); if (m_cancmder) { m_cancmder->regEventPacketListener([this](int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen) { if (CMDID(packet->cmdmoduleid, packet->subcmdid) == zcr::kevent_bus_reg_change_report) { int32_t *pdata = (int32_t *)packet->data; int32_t regindex = pdata[0]; int32_t regold = pdata[1]; int32_t regnew = pdata[2]; callOnRegValChangeEvent(packet->cmdmoduleid, regindex, regold, regnew); } }); } } void ZModuleDeviceManager::registerModule(ZIModule *module) { assert(module != nullptr); int32_t id = 0; module->getid(&id); uint16_t id16 = id; m_modulers[id16] = module; } /******************************************************************************* * ZIModule * *******************************************************************************/ int32_t ZModuleDeviceManager::module_ping(uint16_t id) { PROXY_IMPL(ZIModule, module_ping); } int32_t ZModuleDeviceManager::module_stop(uint16_t id) { PROXY_IMPL(ZIModule, module_stop); } int32_t ZModuleDeviceManager::module_break(uint16_t id) { PROXY_IMPL(ZIModule, module_break); } int32_t ZModuleDeviceManager::module_get_last_exec_status(uint16_t id, int32_t *ack0) { PROXY_IMPL(ZIModule, module_get_last_exec_status, ack0); } int32_t ZModuleDeviceManager::module_get_status(uint16_t id, int32_t *status) { PROXY_IMPL(ZIModule, module_get_status, status); } int32_t ZModuleDeviceManager::module_set_reg(uint16_t id, int32_t param_id, int32_t param_value) { PROXY_IMPL(ZIModule, module_set_reg, param_id, param_value); } int32_t ZModuleDeviceManager::module_get_reg(uint16_t id, int32_t param_id, int32_t *param_value) { PROXY_IMPL(ZIModule, module_get_reg, param_id, param_value); } int32_t ZModuleDeviceManager::module_readio(uint16_t id, int32_t *io) { PROXY_IMPL(ZIModule, module_readio, io); } int32_t ZModuleDeviceManager::module_writeio(uint16_t id, int32_t ioindex, int32_t io) { PROXY_IMPL(ZIModule, module_writeio, ioindex, io); } int32_t ZModuleDeviceManager::module_read_adc(uint16_t id, int32_t adcindex, int32_t *adc) { PROXY_IMPL(ZIModule, module_read_adc, adcindex, adc); } int32_t ZModuleDeviceManager::module_get_error(uint16_t id, int32_t *iserror) { PROXY_IMPL(ZIModule, module_get_error, iserror); } int32_t ZModuleDeviceManager::module_clear_error(uint16_t id) { PROXY_IMPL(ZIModule, module_clear_error); } int32_t ZModuleDeviceManager::module_set_inited_flag(uint16_t id, int32_t flag) { PROXY_IMPL(ZIModule, module_set_inited_flag, flag); } int32_t ZModuleDeviceManager::module_get_inited_flag(uint16_t id, int32_t *flag) { PROXY_IMPL(ZIModule, module_get_inited_flag, flag); } int32_t ZModuleDeviceManager::module_factory_reset(uint16_t id) { PROXY_IMPL(ZIModule, module_factory_reset); } int32_t ZModuleDeviceManager::module_flush_cfg(uint16_t id) { PROXY_IMPL(ZIModule, module_flush_cfg); } int32_t ZModuleDeviceManager::module_active_cfg(uint16_t id) { PROXY_IMPL(ZIModule, module_active_cfg); } int32_t ZModuleDeviceManager::module_read_raw(uint16_t id, int32_t startadd, uint8_t *data, int32_t *len) { PROXY_IMPL(ZIModule, module_read_raw, startadd, data, len); } int32_t ZModuleDeviceManager::module_enable(uint16_t id, int32_t enable) { PROXY_IMPL(ZIModule, module_enable, enable); } int32_t ZModuleDeviceManager::module_start(uint16_t id) { PROXY_IMPL(ZIModule, module_start); } /******************************************************************************* * ZIMotor * *******************************************************************************/ #if 0 virtual int32_t motor_enable(int32_t enable) { return err::koperation_not_support; } virtual int32_t motor_rotate(int32_t direction, int32_t motor_velocity, int32_t acc) { return err::koperation_not_support; } virtual int32_t motor_move_by(int32_t distance, int32_t motor_velocity, int32_t acc) { return err::koperation_not_support; } virtual int32_t motor_move_to(int32_t position, int32_t motor_velocity, int32_t acc) { return err::koperation_not_support; } virtual int32_t motor_rotate_acctime(int32_t direction, int32_t motor_velocity, int32_t acctime) { return err::koperation_not_support; } virtual int32_t motor_move_by_acctime(int32_t distance, int32_t motor_velocity, int32_t acctime) { return err::koperation_not_support; } virtual int32_t motor_move_to_acctime(int32_t position, int32_t motor_velocity, int32_t acctime) { return err::koperation_not_support; } virtual int32_t motor_rotate_with_torque(int32_t direction, int32_t torque) { return err::koperation_not_support; } virtual int32_t motor_move_to_torque(int32_t pos, int32_t torque, int32_t overtime) { return err::koperation_not_support; } virtual int32_t motor_move_to_zero_forward(int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { return err::koperation_not_support; } virtual int32_t motor_move_to_zero_backward(int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { return err::koperation_not_support; } virtual int32_t motor_move_to_zero_forward_and_calculated_shift(int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { return err::koperation_not_support; } virtual int32_t motor_move_to_zero_backward_and_calculated_shift(int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { return err::koperation_not_support; } virtual int32_t motor_read_pos(int32_t* pos) { return err::koperation_not_support; } virtual int32_t motor_set_current_pos_by_change_shift(int32_t pos) { return err::koperation_not_support; } // һ�����ڶ�� virtual int32_t motor_calculated_pos_by_move_to_zero() { return err::koperation_not_support; } virtual int32_t motor_easy_rotate(uint16_t id, int32_t direction); virtual int32_t motor_easy_move_by(uint16_t id, int32_t distance); virtual int32_t motor_easy_move_to(uint16_t id, int32_t position); virtual int32_t motor_easy_move_to_zero(uint16_t id, int32_t direction); virtual int32_t motor_easy_set_current_pos(int32_t pos) { return err::koperation_not_support; }; #endif int32_t ZModuleDeviceManager::motor_enable(uint16_t id, int32_t enable) { PROXY_IMPL(ZIMotor, motor_enable, enable); } int32_t ZModuleDeviceManager::motor_rotate(uint16_t id, int32_t direction, int32_t motor_velocity, int32_t acc) { PROXY_IMPL(ZIMotor, motor_rotate, direction, motor_velocity, acc); } int32_t ZModuleDeviceManager::motor_move_by(uint16_t id, int32_t distance, int32_t motor_velocity, int32_t acc) { PROXY_IMPL(ZIMotor, motor_move_by, distance, motor_velocity, acc); } int32_t ZModuleDeviceManager::motor_move_to(uint16_t id, int32_t position, int32_t motor_velocity, int32_t acc) { PROXY_IMPL(ZIMotor, motor_move_to, position, motor_velocity, acc); } int32_t ZModuleDeviceManager::motor_rotate_with_torque(uint16_t id, int32_t direction, int32_t torque) { PROXY_IMPL(ZIMotor, motor_rotate_with_torque, direction, torque); } int32_t ZModuleDeviceManager::motor_rotate_acctime(uint16_t id, int32_t direction, int32_t motor_velocity, int32_t acctime) { PROXY_IMPL(ZIMotor, motor_rotate_acctime, direction, motor_velocity, acctime); } int32_t ZModuleDeviceManager::motor_move_by_acctime(uint16_t id, int32_t distance, int32_t motor_velocity, int32_t acctime) { PROXY_IMPL(ZIMotor, motor_move_by_acctime, distance, motor_velocity, acctime); } int32_t ZModuleDeviceManager::motor_move_to_acctime(uint16_t id, int32_t position, int32_t motor_velocity, int32_t acctime) { PROXY_IMPL(ZIMotor, motor_move_to_acctime, position, motor_velocity, acctime); } int32_t ZModuleDeviceManager::motor_move_to_zero_forward(uint16_t id, int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { PROXY_IMPL(ZIMotor, motor_move_to_zero_forward, findzerospeed, findzeroedge_speed, acc, overtime); } int32_t ZModuleDeviceManager::motor_move_to_zero_backward(uint16_t id, int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { PROXY_IMPL(ZIMotor, motor_move_to_zero_backward, findzerospeed, findzeroedge_speed, acc, overtime); } int32_t ZModuleDeviceManager::motor_read_pos(uint16_t id, int32_t *pos) { PROXY_IMPL(ZIMotor, motor_read_pos, pos); } int32_t ZModuleDeviceManager::motor_set_current_pos_by_change_shift(uint16_t id, int32_t pos) { PROXY_IMPL(ZIMotor, motor_set_current_pos_by_change_shift, pos); } int32_t ZModuleDeviceManager::motor_move_to_zero_forward_and_calculated_shift(uint16_t id, int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { PROXY_IMPL(ZIMotor, motor_move_to_zero_forward_and_calculated_shift, findzerospeed, findzeroedge_speed, acc, overtime); } int32_t ZModuleDeviceManager::motor_move_to_zero_backward_and_calculated_shift(uint16_t id, int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) { PROXY_IMPL(ZIMotor, motor_move_to_zero_backward_and_calculated_shift, findzerospeed, findzeroedge_speed, acc, overtime); } int32_t ZModuleDeviceManager::motor_move_to_torque(uint16_t id, int32_t pos, int32_t torque, int32_t overtime) { PROXY_IMPL(ZIMotor, motor_move_to_torque, pos, torque, overtime); } int32_t ZModuleDeviceManager::motor_calculated_pos_by_move_to_zero(uint16_t id) { PROXY_IMPL(ZIMotor, motor_calculated_pos_by_move_to_zero); } int32_t ZModuleDeviceManager::motor_easy_rotate(uint16_t id, int32_t direction) { PROXY_IMPL(ZIMotor, motor_easy_rotate, direction); } int32_t ZModuleDeviceManager::motor_easy_move_by(uint16_t id, int32_t distance) { PROXY_IMPL(ZIMotor, motor_easy_move_by, distance); } int32_t ZModuleDeviceManager::motor_easy_move_to(uint16_t id, int32_t position) { PROXY_IMPL(ZIMotor, motor_easy_move_to, position); } int32_t ZModuleDeviceManager::motor_easy_move_to_zero(uint16_t id, int32_t direction) { PROXY_IMPL(ZIMotor, motor_easy_move_to_zero, direction); } int32_t ZModuleDeviceManager::motor_easy_set_current_pos(uint16_t id, int32_t pos) { PROXY_IMPL(ZIMotor, motor_easy_set_current_pos, pos); } /******************************************************************************* * ZIXYMotor * *******************************************************************************/ #if 0 virtual int32_t xymotor_enable(int32_t enable) { return err::koperation_not_support; } virtual int32_t xymotor_move_by(int32_t dx, int32_t dy, int32_t motor_velocity) { return err::koperation_not_support; } virtual int32_t xymotor_move_to(int32_t x, int32_t y, int32_t motor_velocity) { return err::koperation_not_support; } virtual int32_t xymotor_move_to_zero() { return err::koperation_not_support; } virtual int32_t xymotor_move_to_zero_and_calculated_shift() { return err::koperation_not_support; } virtual int32_t xymotor_read_pos(int32_t *x, int32_t *y) { return err::koperation_not_support; } #endif int32_t ZModuleDeviceManager::xymotor_enable(uint16_t id, int32_t enable) { PROXY_IMPL(ZIXYMotor, xymotor_enable, enable); } int32_t ZModuleDeviceManager::xymotor_move_by(uint16_t id, int32_t dx, int32_t dy, int32_t motor_velocity) { PROXY_IMPL(ZIXYMotor, xymotor_move_by, dx, dy, motor_velocity); } int32_t ZModuleDeviceManager::xymotor_move_to(uint16_t id, int32_t x, int32_t y, int32_t motor_velocity) { PROXY_IMPL(ZIXYMotor, xymotor_move_to, x, y, motor_velocity); } int32_t ZModuleDeviceManager::xymotor_move_to_zero(uint16_t id) { PROXY_IMPL(ZIXYMotor, xymotor_move_to_zero); } int32_t ZModuleDeviceManager::xymotor_move_to_zero_and_calculated_shift(uint16_t id) { PROXY_IMPL(ZIXYMotor, xymotor_move_to_zero_and_calculated_shift); } int32_t ZModuleDeviceManager::xymotor_read_pos(uint16_t id, int32_t *x, int32_t *y) { PROXY_IMPL(ZIXYMotor, xymotor_read_pos, x, y); } int32_t ZModuleDeviceManager::xymotor_calculated_pos_by_move_to_zero(uint16_t id) { PROXY_IMPL(ZIXYMotor, xymotor_calculated_pos_by_move_to_zero); } #if 0 virtual int32_t code_scaner_start_scan(uint16_t id); virtual int32_t code_scaner_stop_scan(uint16_t id); virtual int32_t code_scaner_read_scaner_result(uint16_t id, int32_t startadd, uint8_t *data, int32_t *len); int32_t ZModuleDeviceManager::code_scaner_start_scan(uint16_t id) { PROXY_IMPL(ZICodeScaner, code_scaner_start_scan); } int32_t ZModuleDeviceManager::code_scaner_stop_scan(uint16_t id) { PROXY_IMPL(ZICodeScaner, code_scaner_stop_scan); } int32_t ZModuleDeviceManager::code_scaner_read_scaner_result(uint16_t id, int32_t startadd, uint8_t *data, int32_t *len) { PROXY_IMPL(ZICodeScaner, code_scaner_read_scaner_result, startadd, data, len); } #endif #if 0 virtual int32_t pipette_ctrl_init_device() { return err::koperation_not_support; }; virtual int32_t pipette_ctrl_put_tip() { return err::koperation_not_support; }; virtual int32_t pipette_ctrl_move_to_ul(int32_t ul) { return err::koperation_not_support; }; #endif int32_t ZModuleDeviceManager::pipette_ctrl_init_device(uint16_t id) { PROXY_IMPL(ZIPipetteCtrlModule, pipette_ctrl_init_device); } int32_t ZModuleDeviceManager::pipette_ctrl_put_tip(uint16_t id) { PROXY_IMPL(ZIPipetteCtrlModule, pipette_ctrl_put_tip); } int32_t ZModuleDeviceManager::pipette_ctrl_move_to_ul(uint16_t id, int32_t ul) { PROXY_IMPL(ZIPipetteCtrlModule, pipette_ctrl_move_to_ul, ul); } #if 0 virtual int32_t a8000_optical_module_power_ctrl(int32_t state) = 0; virtual int32_t a8000_optical_open_laser(int32_t type) = 0; virtual int32_t a8000_optical_close_laser(int32_t type) = 0; virtual int32_t a8000_optical_set_laster_gain(int32_t type, int32_t gain) = 0; virtual int32_t a8000_optical_set_scan_amp_gain(int32_t type, int32_t gain) = 0; virtual int32_t a8000_optical_read_scanner_adc_val(int32_t type, int32_t* adcval) = 0; virtual int32_t a8000_optical_read_laster_adc_val(int32_t type, int32_t* adcval) = 0; virtual int32_t a8000_optical_scan_current_point_amp_adc_val(int32_t type, int32_t lastergain, int32_t ampgain, int32_t* laster_fb_val, int32_t* adcval) = 0; #endif int32_t ZModuleDeviceManager::a8000_optical_module_power_ctrl(uint16_t id, int32_t state) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_module_power_ctrl, state); } int32_t ZModuleDeviceManager::a8000_optical_open_laser(uint16_t id, int32_t type) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_open_laser, type); } int32_t ZModuleDeviceManager::a8000_optical_close_laser(uint16_t id, int32_t type) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_close_laser, type); } int32_t ZModuleDeviceManager::a8000_optical_set_laster_gain(uint16_t id, int32_t type, int32_t gain) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_set_laster_gain, type, gain); } int32_t ZModuleDeviceManager::a8000_optical_set_scan_amp_gain(uint16_t id, int32_t type, int32_t gain) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_set_scan_amp_gain, type, gain); } int32_t ZModuleDeviceManager::a8000_optical_read_scanner_adc_val(uint16_t id, int32_t type, int32_t *adcval) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_read_scanner_adc_val, type, adcval); } int32_t ZModuleDeviceManager::a8000_optical_read_laster_adc_val(uint16_t id, int32_t type, int32_t *adcval) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_read_laster_adc_val, type, adcval); } int32_t ZModuleDeviceManager::a8000_optical_scan_current_point_amp_adc_val(uint16_t id, int32_t type, int32_t lastergain, int32_t ampgain, int32_t *laster_fb_val, int32_t *adcval) { PROXY_IMPL(ZIA8000OpticalModule, a8000_optical_scan_current_point_amp_adc_val, type, lastergain, ampgain, laster_fb_val, adcval); }