From 3c7e1bc26c09c711e93cedd4ffffda7db1fd2eb9 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 25 Jul 2024 10:24:01 +0800 Subject: [PATCH] update --- README.md | 6 +- src/main/java/a8k/a8k_can_protocol/A8kEcode.java | 135 ---- src/main/java/a8k/a8k_can_protocol/A8kPacket.java | 130 ---- src/main/java/a8k/a8k_can_protocol/CmdId.java | 210 ------- src/main/java/a8k/a8k_can_protocol/IOId.java | 38 -- src/main/java/a8k/a8k_can_protocol/MId.java | 89 --- .../java/a8k/a8k_can_protocol/ModuleStatus.java | 24 - src/main/java/a8k/a8k_can_protocol/ModuleType.java | 27 - src/main/java/a8k/a8k_can_protocol/RegIndex.java | 183 ------ .../app_eventbus/A8kDebugTaskExecutorService.java | 43 ++ .../java/a8k/app_eventbus/AppEventBusService.java | 56 ++ .../app_eventbus/appevent/A8kHardwareReport.java | 21 + .../java/a8k/app_eventbus/appevent/AppEvent.java | 6 + .../app_eventbus/appevent/AppStepNotifyEvent.java | 13 + .../appevent/AppWarningNotifyEvent.java | 14 + src/main/java/a8k/appbean/AppEventListener.java | 2 +- src/main/java/a8k/appbean/HardwareException.java | 6 +- .../a8k/appbean/appevent/A8kHardwareReport.java | 21 - src/main/java/a8k/appbean/appevent/AppEvent.java | 6 - .../a8k/appbean/appevent/AppStepNotifyEvent.java | 13 - .../appbean/appevent/AppWarningNotifyEvent.java | 14 - src/main/java/a8k/appbean/ecode/AppRet.java | 6 +- .../java/a8k/appbean/ecode/AppRetEcodeInfo.java | 6 +- .../java/a8k/base_hardware/A8kCanBusService.java | 663 -------------------- src/main/java/a8k/canbus/A8kCanBusService.java | 693 +++++++++++++++++++++ .../java/a8k/canbus/A8kModParamInitializer.java | 16 + .../canbus/custom_param_mgr/A8kModCustomParam.java | 7 + .../custom_param_mgr/A8kModCustomParamId.java | 14 + .../custom_param_mgr/A8kModCustomParamMgr.java | 25 + src/main/java/a8k/canbus/protocol/A8kEcode.java | 135 ++++ src/main/java/a8k/canbus/protocol/A8kPacket.java | 130 ++++ src/main/java/a8k/canbus/protocol/CmdId.java | 211 +++++++ src/main/java/a8k/canbus/protocol/IOId.java | 38 ++ src/main/java/a8k/canbus/protocol/MId.java | 89 +++ .../java/a8k/canbus/protocol/ModuleStatus.java | 24 + src/main/java/a8k/canbus/protocol/ModuleType.java | 27 + src/main/java/a8k/canbus/protocol/RegIndex.java | 183 ++++++ .../a8k/service/A8kDebugTaskExecutorService.java | 43 -- src/main/java/a8k/service/AppEventBusService.java | 56 -- .../DeviceInitializationCtrlService.java | 8 +- .../a8k/service/data_service/UsrMgrService.java | 2 +- .../service/hardware/CommonHardwareOpeartion.java | 4 +- .../a8k/service/hardware/HbotControlService.java | 2 +- .../hardware/MotorTubeRackMoveCtrlService.java | 11 +- .../ReactionPlatesTransmitCtrlService.java | 8 +- .../SamplesPreProcessModuleCtrlService.java | 10 +- 46 files changed, 1781 insertions(+), 1687 deletions(-) delete mode 100644 src/main/java/a8k/a8k_can_protocol/A8kEcode.java delete mode 100644 src/main/java/a8k/a8k_can_protocol/A8kPacket.java delete mode 100644 src/main/java/a8k/a8k_can_protocol/CmdId.java delete mode 100644 src/main/java/a8k/a8k_can_protocol/IOId.java delete mode 100644 src/main/java/a8k/a8k_can_protocol/MId.java delete mode 100644 src/main/java/a8k/a8k_can_protocol/ModuleStatus.java delete mode 100644 src/main/java/a8k/a8k_can_protocol/ModuleType.java delete mode 100644 src/main/java/a8k/a8k_can_protocol/RegIndex.java create mode 100644 src/main/java/a8k/app_eventbus/A8kDebugTaskExecutorService.java create mode 100644 src/main/java/a8k/app_eventbus/AppEventBusService.java create mode 100644 src/main/java/a8k/app_eventbus/appevent/A8kHardwareReport.java create mode 100644 src/main/java/a8k/app_eventbus/appevent/AppEvent.java create mode 100644 src/main/java/a8k/app_eventbus/appevent/AppStepNotifyEvent.java create mode 100644 src/main/java/a8k/app_eventbus/appevent/AppWarningNotifyEvent.java delete mode 100644 src/main/java/a8k/appbean/appevent/A8kHardwareReport.java delete mode 100644 src/main/java/a8k/appbean/appevent/AppEvent.java delete mode 100644 src/main/java/a8k/appbean/appevent/AppStepNotifyEvent.java delete mode 100644 src/main/java/a8k/appbean/appevent/AppWarningNotifyEvent.java delete mode 100644 src/main/java/a8k/base_hardware/A8kCanBusService.java create mode 100644 src/main/java/a8k/canbus/A8kCanBusService.java create mode 100644 src/main/java/a8k/canbus/A8kModParamInitializer.java create mode 100644 src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java create mode 100644 src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java create mode 100644 src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java create mode 100644 src/main/java/a8k/canbus/protocol/A8kEcode.java create mode 100644 src/main/java/a8k/canbus/protocol/A8kPacket.java create mode 100644 src/main/java/a8k/canbus/protocol/CmdId.java create mode 100644 src/main/java/a8k/canbus/protocol/IOId.java create mode 100644 src/main/java/a8k/canbus/protocol/MId.java create mode 100644 src/main/java/a8k/canbus/protocol/ModuleStatus.java create mode 100644 src/main/java/a8k/canbus/protocol/ModuleType.java create mode 100644 src/main/java/a8k/canbus/protocol/RegIndex.java delete mode 100644 src/main/java/a8k/service/A8kDebugTaskExecutorService.java delete mode 100644 src/main/java/a8k/service/AppEventBusService.java diff --git a/README.md b/README.md index 9aa560e..a74a834 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,11 @@ 4. 出料口没有试管架 5. 进出料位置没有试管 -逻辑漏洞 +逻辑漏洞 + 1.高试管如果脱帽,会被识别成低试管。 + +TODO: + 1.想办法解决 ``` diff --git a/src/main/java/a8k/a8k_can_protocol/A8kEcode.java b/src/main/java/a8k/a8k_can_protocol/A8kEcode.java deleted file mode 100644 index 1c00edf..0000000 --- a/src/main/java/a8k/a8k_can_protocol/A8kEcode.java +++ /dev/null @@ -1,135 +0,0 @@ -package a8k.a8k_can_protocol; - -public enum A8kEcode { - // - // FOR APP - // - Success(0, "成功"), // - TubeNotHasHat(1, "全血试管未盖帽"), // - SampleLiquidLevelWasNotDetected(2, "取样时未探测到液面"),// - LargeBufferNotEnough(3, "大瓶缓冲液不足"), // - PasswdError(4, "密码错误"), // - UserDoesNotExist(5, "用户不存在"), // - GripperMPosError(6, "抓手舵机位置异常"), // - GripperZMPosError(8, "抓手升降电机位置异常"), // - GripperYMPosError(9, "抓手前后移动舵机位置异常"),// - TubesInShakeModule(10, "摇匀模组位置有试管"),// - PlateStuckDetectorSensorTrigger(11, "卡板检查光电触发"),// - PlateBoxNotCover(12, "板夹仓盖子未关闭"),// - PullerMInitPosError(13, "板夹钩爪电机没有处于转盘中央"),// - PusherMInitPosError(14, "板夹仓推杆电机没有处于零点位置"),// - RecycleBinOverflow(15, "回收仓满"),// - MotorLostStep(16, "电机丢步"),// - ActionOvertime(17, "动作执行超时"),// - CodeException(18, "代码异常"),// - ShakeModGripperZMNotInZeroPos(19, "抓手升降电机没有在零位"),// - MNotInZeroPos(20, "电机没有在零点"),// - TubeXChannelIsNotEmpty(21, "试管架平移通道不为空"),// - TubeTypeNotSupport(22, "试管类型不支持"),// - CmdIdNotSupport(23, "不支持指令"),// - // - // FOR HARDWARE - // - - HardwareError(1001, "HardwareError"),// - ParamOutOfRange(1102, "ParamOutOfRange"),// - CmdNotSupport(1103, "CmdNotSupport"),// - DeviceIsBusy(1104, "DeviceIsBusy"),// - DeviceIsOffline(1105, "DeviceIsOffline"),// - Overtime(1106, "Overtime"),// - Noack(1107, "Noack"),// - Errorack(1108, "Errorack"),// - DeviceOffline(1109, "DeviceOffline"),// - SubdeviceOvertime(1111, "SubdeviceOvertime"),// - BufferNotEnough(1112, "BufferNotEnough"),// - CmdParamNumError(1114, "CmdParamNumError"),// - CheckcodeIsError(1115, "CheckcodeIsError"),// - IllegalOperation(1116, "IllegalOperation"),// - ModuleOpeationBreakByUser(1202, "ModuleOpeationBreakByUser"),// - ModuleNotFindReg(1207, "ModuleNotFindReg"),// - XYMotorXFindZeroEdgeFail(1306, "XYMotorXFindZeroEdgeFail"),// - XYMotorYFindZeroEdgeFail(1307, "XYMotorYFindZeroEdgeFail"),// - XYMotorNotEnable(1308, "XYMotorNotEnable"),// - XYMotorTargetPosOutofRange(1309, "XYMotorTargetPosOutofRange"),// - PipetteErrorNoerror(1400, "PipetteErrorNoerror"),// - PipetteErrorInitfail(1401, "PipetteErrorInitfail"),// - PipetteErrorInvalidcmd(1402, "PipetteErrorInvalidcmd"),// - PipetteErrorInvalidarg(1403, "PipetteErrorInvalidarg"),// - PipetteErrorPressuresensorerror(1404, "PipetteErrorPressuresensorerror"),// - PipetteErrorOverpressure(1405, "PipetteErrorOverpressure"),// - PipetteErrorLlderror(1406, "PipetteErrorLlderror"),// - PipetteErrorDevicenotinit(1407, "PipetteErrorDevicenotinit"),// - PipetteErrorTippoperror(1408, "PipetteErrorTippoperror"),// - PipetteErrorPumpoverload(1409, "PipetteErrorPumpoverload"),// - PipetteErrorTipdrop(1410, "PipetteErrorTipdrop"),// - PipetteErrorCanbuserror(1411, "PipetteErrorCanbuserror"),// - PipetteErrorInvalidchecksum(1412, "PipetteErrorInvalidchecksum"),// - PipetteErrorEepromerror(1413, "PipetteErrorEepromerror"),// - PipetteErrorCmdbufferempty(1414, "PipetteErrorCmdbufferempty"),// - PipetteErrorCmdbufferoverflow(1415, "PipetteErrorCmdbufferoverflow"),// - PipetteErrorTipblock(1416, "PipetteErrorTipblock"),// - PipetteErrorAirsuction(1417, "PipetteErrorAirsuction"),// - PipetteErrorBubble(1418, "PipetteErrorBubble"),// - PipetteErrorVolumeerror(1419, "PipetteErrorVolumeerror"),// - PipetteErrorTipalreadyload(1420, "PipetteErrorTipalreadyload"),// - PipetteErrorTiploadfail(1421, "PipetteErrorTiploadfail"),// - PipetteErrorUninited(1501, "PipetteErrorUninited"),// - PipetteErrorNotLldPrepare(1502, "PipetteErrorNotLldPrepare"),// - PipetteErrorTipisloadWhenLldPrepare(1500, "PipetteErrorTipisloadWhenLldPrepare"),// - PipetteErrorPumpLoadValIsNotEmpty(1503, "PipetteErrorPumpLoadValIsNotEmpty"),// - StepMotorNotFoundZeroPoint(1600, "StepMotorNotFoundZeroPoint"),// - StepMotorNotGoZero(1601, "StepMotorNotGoZero"),// - StepMotorOverTemperature(1602, "StepMotorOverTemperature"),// - StepMotorOverVoltage(1603, "StepMotorOverVoltage"),// - StepMotorRunOvertime(1604, "StepMotorRunOvertime"),// - StepMotorNotEnable(1605, "StepMotorNotEnable"),// - StepMotorIoindexOutOfRange(1606, "StepMotorIoindexOutOfRange"),// - StepMotorSubicReset(1607, "StepMotorSubicReset"),// - StepMotorDrvErr(1608, "StepMotorDrvErr"),// - StepMotorUvCp(1609, "StepMotorUvCp"),// - StepMotorNotFoundPointEdge(1610, "StepMotorNotFoundPointEdge"),// - StepMotorLostStep(1611, "StepMotorLostStep"),// - MiniServoNotEnable(1700, "MiniServoNotEnable"),// - MiniServoModeNotSupport(1701, "MiniServoModeNotSupport"),// - FanHardwareFault(1800, "FanHardwareFault"),// - WaterCoolingFanError(1900, "WaterCoolingFanError"),// - WaterCoolingTemperatureSensorError(1902, "WaterCoolingTemperatureSensorError"),// - WaterCoolingPumpIsError(1903, "WaterCoolingPumpIsError"),// - WaterCoolingPelterIsError(1904, "WaterCoolingPelterIsError"), - ; - - public int index; - public String chname; - - A8kEcode(int index, String chname) { - this.index = index; - this.chname = chname; - } - - public int toInt() { - return index; - } - - public static A8kEcode valueOf(int val) { - A8kEcode[] values = A8kEcode.values(); - for (A8kEcode e : values) { - if (e.toInt() == val) - return e; - } - return null; - } - - public static String toString(int val) { - A8kEcode[] values = A8kEcode.values(); - for (A8kEcode e : values) { - if (e.toInt() == val) { - return e.toString(); - } - } - return "unkown(" + val + ")"; - } - - public String getChname() { - return chname; - } -} diff --git a/src/main/java/a8k/a8k_can_protocol/A8kPacket.java b/src/main/java/a8k/a8k_can_protocol/A8kPacket.java deleted file mode 100644 index a68c118..0000000 --- a/src/main/java/a8k/a8k_can_protocol/A8kPacket.java +++ /dev/null @@ -1,130 +0,0 @@ -package a8k.a8k_can_protocol; - -import a8k.utils.ByteArray; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class A8kPacket { - /** - * typedef struct { - * uint16_t packetindex; // 0: - * uint16_t cmdMainId; // 2: - * uint8_t cmdSubId; // 4: - * uint8_t packetType; // 5: - * uint16_t moduleid; // 6: - * uint8_t data[]; // 8: - * } zcr_cmd_header_t; - *

- * kptv2_cmd = 0, - * kptv2_ack = 1, - * kptv2_error_ack = 2, - * kptv2_event = 3, - */ - public static final Logger logger = LoggerFactory.getLogger(A8kPacket.class); - - - byte[] raw; - - public static final int PACKET_MIN_LEN = 8; - - public static final int PACKET_INDEX_OFF = 0; - public static final int CMD_ID_OFF = 2; - public static final int PACKET_TYPE_OFF = 5; - public static final int MODULE_ID_OFF = 6; - public static final int DATA_BEGIN_OFF = 8; - - - public static final int PACKET_TYPE_CMD = 0; - public static final int PACKET_TYPE_ACK = 1; - public static final int PACKET_TYPE_ERROR_ACK = 2; - public static final int PACKET_TYPE_EVENT = 3; - - public static final int CMD_OVERTIME = 2000; - - public A8kPacket(byte[] cmd) { - raw = new byte[cmd.length]; - System.arraycopy(cmd, 0, raw, 0, cmd.length); - } - - public void setPacketIndex(int packetIndex) { - ByteArray.setU16bit(raw, 0, packetIndex); - } - - public int getPacketIndex() { - return ByteArray.readU16bit(raw, 0); - } - - public int getCmdId() { - return ByteArray.readU16bit((raw), 2) * 256 + ByteArray.readU8bit(raw, 4); - } - - public int getPacketType() { - return ByteArray.readU8bit(raw, 5); - } - - public int getModuleId() { - return ByteArray.readU16bit(raw, 6); - } - - public byte[] getCmdContent() { - if (raw.length < 8) { - return new byte[0]; - } - byte[] cmdcontent = new byte[raw.length - 8]; - System.arraycopy(raw, 8, cmdcontent, 0, raw.length - 8); - return cmdcontent; - } - - public int getContentI32(int index) { - return ByteArray.read32bit(raw, 8 + index * 4); - } - - public String toByteString() { - return ByteArray.toByteString(raw); - } - - public String toString() { - int packetType = getPacketType(); - String ret = ""; - - CmdId cmdId = CmdId.valueOf(getCmdId()); - assert cmdId != null; - if (packetType == PACKET_TYPE_CMD) { - if (cmdId.cmdAttachType == CmdId.ATTACH_IS_INT32) { - ret = String.format("[CMD ] index:[%d] (%s %s(%d) :param:[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), formatInt32ATTACH(getCmdContent())); - } else { - ret = String.format("[CMD ] index:[%d] (%s %s(%d) :param:[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), ByteArray.toByteString(getCmdContent())); - } - } else if (packetType == PACKET_TYPE_ACK) { - if (cmdId.receiptAttachType == CmdId.ATTACH_IS_INT32) { - ret = String.format("[ACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, formatInt32ATTACH(getCmdContent())); - } else { - ret = String.format("[ACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, ByteArray.toByteString(getCmdContent())); - } - } else if (packetType == PACKET_TYPE_ERROR_ACK) { - ret = String.format("[EACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, A8kEcode.toString(getContentI32(0))); - } else if (packetType == PACKET_TYPE_EVENT) { - if (cmdId.cmdAttachType == CmdId.ATTACH_IS_INT32) { - ret = String.format("[EVENT] index:[%d] (%s %s(%d) :[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), formatInt32ATTACH(getCmdContent())); - } else { - ret = String.format("[EVENT] index:[%d] (%s %s(%d) :[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), ByteArray.toByteString(getCmdContent())); - } - } else { - ret = String.format("Unknown packet type: %d", packetType); - } - return ret; - } - - private String formatInt32ATTACH(byte[] attach) { - StringBuilder ret = new StringBuilder(); - for (int i = 0; i < attach.length; i += 4) { - if (i + 3 >= attach.length) - break; - if (i != 0) - ret.append(","); - ret.append(String.format("%d", ByteArray.read32bit(attach, i))); - } - return ret.toString(); - } - -} diff --git a/src/main/java/a8k/a8k_can_protocol/CmdId.java b/src/main/java/a8k/a8k_can_protocol/CmdId.java deleted file mode 100644 index 05f1570..0000000 --- a/src/main/java/a8k/a8k_can_protocol/CmdId.java +++ /dev/null @@ -1,210 +0,0 @@ -package a8k.a8k_can_protocol; - -public enum CmdId { - - - NotSet(0xFFFF, "noAction"),// - - board_reset(0x0000, "board_reset"),// - event_bus_reg_change_report(0x0064, "event_bus_reg_change_report"),// - // - module_ping(0x0100, "module_ping"),// - module_get_status(0x0104, "module_get_status", false),// - module_stop(0x0101, "module_stop"),// - module_set_reg(0x0105, "module_set_reg"),// - module_get_reg(0x0106, "module_get_reg"),// - module_get_error(0x010a, "module_get_error", true),// - module_clear_error(0x010b, "module_clear_error"),// - module_active_cfg(0x0110, "module_active_cfg"),// - // - xymotor_enable(0x0301, "xymotor_enable"),// - xymotor_move_by(0x0302, "xymotor_move_by"),// - xymotor_move_to(0x0303, "xymotor_move_to"),// - xymotor_move_to_zero(0x0304, "xymotor_move_to_zero"),// - xymotor_read_pos(0x0306, "xymotor_read_pos"),// - xymotor_read_inio_index_in_stm32(0x0307, "xymotor_read_inio_index_in_stm32"),// - xymotor_read_inio(0x0308, "xymotor_read_inio", true),// - xymotor_set_pos(0x0309, "xymotor_set_pos"),// - xymotor_motor_move_by_direct(0x030a, "xymotor_motor_move_by_direct"),// - xymotor_read_enc_direct(0x030b, "xymotor_read_enc_direct"),// - // - pipette_ctrl_init_device(0x7201, "pipette_ctrl_init_device"),// - pipette_ctrl_put_tip(0x7202, "pipette_ctrl_put_tip"),// - pipette_ctrl_move_to_ul(0x7203, "pipette_ctrl_move_to_ul"),// - pipette_lld_prepare(0x7204, "pipette_lld_prepare"),// - pipette_plld(0x7205, "pipette_plld"),// - pipette_clld(0x7206, "pipette_clld"),// - pipette_mlld(0x7207, "pipette_mlld"),// - pipette_lld_is_detect_liquid(0x7208, "pipette_lld_is_detect_liquid"),// - pipette_aspirate(0x7209, "pipette_aspirate"),// - pipette_distribut(0x720a, "pipette_distribut"),// - pipette_shake_up(0x720b, "pipette_shake_up"),// - pipette_enable_zmotor(0x7214, "pipette_enable_zmotor"),// - pipette_write_cmd_direct(0x7215, "pipette_write_cmd_direct"),// - pipette_get_sensor_sample_data(0x7216, "pipette_get_sensor_sample_data"),// - pipette_get_sensor_sample_data_num(0x7217, "pipette_get_sensor_sample_data_num"),// - pipette_sensor_sample_data_report(0x7232, "pipette_sensor_sample_data_report"),// - pipette_aspirate_llf(0x720c, "pipette_aspirate_llf"),// - pipette_distribut_llf(0x720d, "pipette_distribut_llf"),// - pipette_shake_up_llf(0x720e, "pipette_shake_up_llf"),// - // - a8000_optical_module_power_ctrl(0x0600, "a8000_optical_module_power_ctrl"),// - a8000_optical_open_laser(0x0601, "a8000_optical_open_laser"),// - a8000_optical_close_laser(0x0602, "a8000_optical_close_laser"),// - a8000_optical_set_laster_gain(0x0603, "a8000_optical_set_laster_gain"),// - a8000_optical_set_scan_amp_gain(0x0604, "a8000_optical_set_scan_amp_gain"),// - a8000_optical_read_scanner_adc_val(0x0605, "a8000_optical_read_scanner_adc_val"),// - a8000_optical_read_laster_adc_val(0x0606, "a8000_optical_read_laster_adc_val"),// - a8000_optical_scan_current_point_amp_adc_val(0x0607, "a8000_optical_scan_current_point_amp_adc_val"),// - a8000_optical_start_capture(0x0608, "a8000_optical_start_capture"),// - a8000_optical_read_raw(0x0609, "a8000_optical_read_raw", CmdId.ATTACH_IS_INT32, CmdId.ATTACH_IS_BYTES),// - // - a8k_opt_v2_t_start_scan(0x0700, "a8k_opt_v2_t_start_scan"),// - a8k_opt_v2_f_start_scan(0x0701, "a8k_opt_v2_f_start_scan"),// - a8k_opt_v2_t_open_laster(0x070a, "a8k_opt_v2_t_open_laster"),// - a8k_opt_v2_t_close_laster(0x070b, "a8k_opt_v2_t_close_laster"),// - a8k_opt_v2_t_readVal(0x070c, "a8k_opt_v2_t_readVal"),// - a8k_opt_v2_f_open_laster(0x070d, "a8k_opt_v2_f_open_laster"),// - a8k_opt_v2_f_close_laster(0x070e, "a8k_opt_v2_f_close_laster"),// - a8k_opt_v2_f_readVal(0x070f, "a8k_opt_v2_f_readVal"),// - // - step_motor_enable(0x0201, "step_motor_enable"),// - step_motor_read_pos(0x020b, "step_motor_read_pos"),// - step_motor_easy_rotate(0x0211, "step_motor_easy_rotate"),// - step_motor_easy_move_by(0x0212, "step_motor_easy_move_by"),// - step_motor_easy_move_to(0x0213, "step_motor_easy_move_to"),// - step_motor_easy_move_to_zero(0x0214, "step_motor_easy_move_to_zero"),// - step_motor_easy_set_current_pos(0x0215, "step_motor_easy_set_current_pos"),// - step_motor_easy_move_to_io(0x0216, "step_motor_easy_move_to_io"),// - step_motor_stop(0x0228, "step_motor_stop"),// - step_motor_active_cfg(0x0229, "step_motor_active_cfg"),// - step_motor_read_io_state(0x022a, "step_motor_read_io_state", true),// - step_motor_easy_move_to_end_point(0x022c, "step_motor_easy_move_to_end_point"),// - step_motor_read_tmc5130_status(0x0232, "step_motor_read_tmc5130_status"),// - step_motor_read_tmc5130_state(0x0233, "step_motor_read_tmc5130_state"),// - step_motor_read_io_index_in_stm32(0x0238, "step_motor_read_io_index_in_stm32"),// - step_motor_set_subdevice_reg(0x0239, "step_motor_set_subdevice_reg"),// - step_motor_get_subdevice_reg(0x023a, "step_motor_get_subdevice_reg"),// - step_motor_easy_reciprocating_motion(0x022d, "step_motor_easy_reciprocating_motion"),// - // - mini_servo_enable(0x6601, "mini_servo_enable"),// - mini_servo_read_pos(0x6602, "mini_servo_read_pos"),// - mini_servo_active_cfg(0x6603, "mini_servo_active_cfg"),// - mini_servo_stop(0x6604, "mini_servo_stop"),// - mini_servo_set_mid_point(0x6607, "mini_servo_set_mid_point"),// - mini_servo_read_io_state(0x6608, "mini_servo_read_io_state"),// - mini_servo_move_to(0x6609, "mini_servo_move_to"),// - mini_servo_rotate(0x660a, "mini_servo_rotate"),// - mini_servo_rotate_with_torque(0x660b, "mini_servo_rotate_with_torque"),// - mini_servo_set_cur_pos(0x660c, "mini_servo_set_cur_pos"),// - // - extboard_read_inio(0x6701, "extboard_read_inio", true),// - extboard_write_outio(0x6702, "extboard_write_outio"),// - extboard_read_muti_inio(0x6703, "extboard_read_muti_inio", true),// - extboard_read_inio_index_in_stm32(0x6704, "extboard_read_inio_index_in_stm32"),// - extboard_read_outio_index_in_stm32(0x6705, "extboard_read_outio_index_in_stm32"),// - extboard_read_outio(0x6706, "extboard_read_outio"),// - code_scaner_start_scan(0x6801, "code_scaner_start_scan"),// - code_scaner_stop_scan(0x6802, "code_scaner_stop_scan"),// - code_scaner_result_is_ready(0x6803, "code_scaner_result_is_ready"),// - code_scaner_read_scaner_result(0x6804, "code_scaner_read_scaner_result"),// - code_scaner_get_result_length(0x6805, "code_scaner_get_result_length"),// - // - fan_controler_set_speed(0x6900, "fan_controler_set_speed"),// - // - temp_controler_start_hearting(0x7000, "temp_controler_start_hearting"),// - temp_controler_stop_hearting(0x7001, "temp_controler_stop_hearting"),// - temp_controler_set_peltier_power_level(0x7002, "temp_controler_set_peltier_power_level"),// - temp_controler_set_pump_level(0x7003, "temp_controler_set_pump_level"),// - temp_controler_set_fan_level(0x7004, "temp_controler_set_fan_level"),// - temp_controler_enable_log(0x7005, "temp_controler_enable_log"),// - // - a8000_idcard_reader_read_raw(0x7100, "a8000_idcard_reader_read_raw", CmdId.ATTACH_IS_INT32, CmdId.ATTACH_IS_BYTES),// - a8000_idcard_write_raw(0x7101, "a8000_idcard_write_raw", CmdId.ATTACH_IS_BYTES, CmdId.ATTACH_IS_INT32),// - a8000_idcard_erase(0x7102, "a8000_idcard_erase"),// - a8000_idcard_earse_unlock(0x7103, "a8000_idcard_earse_unlock"),// - // - event_a8000_idcard_online(0x71c8, "event_a8000_idcard_online"),// - event_a8000_idcard_offline(0x71c9, "event_a8000_idcard_offline"),// - // - plate_code_scaner_push_card_and_scan(0x7301, "plate_code_scaner_push_card_and_scan"),// - plate_code_scaner_stop_scan(0x7302, "plate_code_scaner_stop_scan"),// - plate_code_scaner_read_result(0x7303, "plate_code_scaner_read_result"),// - plate_code_scaner_read_result_point_num(0x7304, "plate_code_scaner_read_result_point_num"),// - plate_code_scaner_read_code(0x7305, "plate_code_scaner_read_code"),// - plate_code_scaner_adc_readraw(0x7306, "plate_code_scaner_adc_readraw"),// - plate_code_scaner_open_laser(0x7307, "plate_code_scaner_open_laser"),// - plate_code_scaner_close_laser(0x7308, "plate_code_scaner_close_laser"),// - ; - - public final static int ATTACH_IS_BYTES = 1; - public final static int ATTACH_IS_INT32 = 2; - - public int index; - public String chName; - public int cmdAttachType = ATTACH_IS_INT32; - public int receiptAttachType = ATTACH_IS_INT32; - public boolean notTrace = false; - public boolean actionCmd = true; - - CmdId(int index, String chname) { - this.index = index; - this.chName = chname; - } - - CmdId(int index, String chname, boolean notTrace) { - this.index = index; - this.chName = chname; - this.notTrace = notTrace; - this.actionCmd = !notTrace; - } - - CmdId(int index, String chname, int cmdAttachType, int receiptAttachType) { - this.index = index; - this.chName = chname; - this.cmdAttachType = cmdAttachType; - this.receiptAttachType = receiptAttachType; - } - - CmdId(int index, String chname, int cmdAttachType, int receiptAttachType, boolean notTrace) { - this.index = index; - this.chName = chname; - this.cmdAttachType = cmdAttachType; - this.receiptAttachType = receiptAttachType; - this.notTrace = notTrace; - } - - - public int toInt() { - return index; - } - - public static CmdId valueOf(int val) { - CmdId[] values = CmdId.values(); - for (CmdId e : values) { - if (e.toInt() == val) - return e; - } - return null; - } - - public static String toString(int val) { - CmdId[] values = CmdId.values(); - for (CmdId e : values) { - if (e.toInt() == val) { - return e.toString(); - } - } - return "unkown(" + val + ")"; - } - - public String getChname() { - return chName; - } - - public Boolean eq(Integer index) { - return this.index == index; - } - - -} diff --git a/src/main/java/a8k/a8k_can_protocol/IOId.java b/src/main/java/a8k/a8k_can_protocol/IOId.java deleted file mode 100644 index d35ad28..0000000 --- a/src/main/java/a8k/a8k_can_protocol/IOId.java +++ /dev/null @@ -1,38 +0,0 @@ -package a8k.a8k_can_protocol; - -public enum IOId { - TubeHeightPPS(ModuleType.kboard, MId.FeedingModBoard, 0), //高低试管检测IO - THChOuterPPS(ModuleType.kboard, MId.FeedingModBoard, 1),//试管架转移通道有无检测 外 - THChInterPPS(ModuleType.kboard, MId.FeedingModBoard, 2),//试管架转移通道有无检测 内 - OutfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 3),//试管出料位置 试管架有无检测 - TubeExistPPS(ModuleType.kboard, MId.FeedingModBoard, 4),//试管有无光电 - InfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 5),//试管架入料位置 试管架有无检测 - - RecycleBinOverflowPPS(ModuleType.kboard, MId.PlatesBoxTCMBoard, 2),//废料桶满溢检测 - RecycleBinOverflowPPSPowerCtrl(ModuleType.kboard, MId.PlatesBoxTCMBoard, 0),//废料桶光栅电源 - - PlateBoxCoverClosurePPS(ModuleType.kboard, MId.PlatesBoxBoard, 0),//板夹仓舱盖闭合检测 - PlateBoxPlateStuckPPS(ModuleType.kboard, MId.PlatesBoxBoard, 1),//板夹仓卡板检测 - - //转盘逻辑相关光电 - //钩板电机,零点光电,终点光电 - PullerMZeroPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 0),// - PullerMEndPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 1),// - //推板电机,零点光电,终点光电 - PusherMZeroPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 0),// - PusherMEndPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 1),// - - ; - - - final public ModuleType mtype; - final public MId mid; - final public int ioIndex; - - IOId(ModuleType mtype, MId mid, int ioIndex) { - this.mtype = mtype; - this.mid = mid; - this.ioIndex = ioIndex; - } - -} diff --git a/src/main/java/a8k/a8k_can_protocol/MId.java b/src/main/java/a8k/a8k_can_protocol/MId.java deleted file mode 100644 index 8b02e4b..0000000 --- a/src/main/java/a8k/a8k_can_protocol/MId.java +++ /dev/null @@ -1,89 +0,0 @@ -package a8k.a8k_can_protocol; - -public enum MId { - NotSet(0, "未设置"),// - HbotBoard(10, "机械臂板模块"),// - HbotM(11, "机械臂XY"),// - // - PlatesBoxBoard(20, "板夹仓模块"),// - PlatesBoxYM(21, "板夹仓移动电机"),// - PlatesBoxPusherM(22, "板夹仓推杆电机"),// - PlatesBoxScanner(23, "板夹仓扫码模组"),// - // - ShakeModBoard(30, "摇匀模组板"),// - ShakeModClampingM(31, "试管固定夹爪电机"),// - ShakeModGripperZM(32, "摇匀升降电机"),// - ShakeModShakeM(33, "试管摇匀电机"),// - ShakeModGripperYSV(34, "摇匀前后移动舵机"),// - ShakeModGripperSV(35, "摇匀试管帽夹爪舵机"),// - ShakeModTubeScanerClampingSV(36, "试管架扫码夹紧舵机"),// - ShakeModTubeScanerRotateSV(37, "试管架旋转舵机"),// - // - PlatesBoxTCMBoard(40, "反应板夹温度控制板"),// - PlatesBoxTCM(41, "反应板夹温度控制模块"),// - WbTubeFanMod(42, "气溶胶风扇"),// - // - IncubatorTCMBoard(50, "温度控制"),// - IncubatorTCM(51, "温度控制"),// - // - FeedingModBoard(60, "出入料模块"),// - FeedingModInfeedM(61, "入料电机"),// - FeedingModXM(62, "试管架平移电机"),// - FeedingModOutfeedM(63, "出料电机"),// - FeedingModScannerMod(64, "试管架扫码器"),// - // - IncubatorRotateBoard(70, "孵育盘旋转板"),// - IncubatorRotateCtrlM(71, "孵育盘旋转"),// - // - PipetteModBoard(80, "机械臂Z轴板"),// - PipetteModZM(81, "机械臂Z"),// - PipetteMod(82, "移液枪"),// - PipetteModCodeScanner(83, "物料扫码器"),// - // - OptModBoard(90, "光学模组板"),// - OptModScannerM(91, "板卡扫描电机"),// - OptModPullM(92, "板卡推杆电机"),// - OptMod(93, "扫描仪"),// - // - A8kIdCardReaderBoard(100, "A8K读卡器板"),// - A8kIdCardReader(101, "A8K读卡器"),// - ; - - - final public String chname; - final public int index; - - MId(int index, String chname) { - this.chname = chname; - this.index = index; - } - - public int toInt() { - return index; - } - - - public static MId valueOf(Integer val) { - return valueOf(val.intValue()); - } - - public static MId valueOf(int val) { - MId[] values = MId.values(); - for (MId e : values) { - if (e.toInt() == val) - return e; - } - return null; - } - - public static String toString(int val) { - MId[] values = MId.values(); - for (MId e : values) { - if (e.toInt() == val) { - return e.toString(); - } - } - return "unkown(" + val + ")"; - } - -} diff --git a/src/main/java/a8k/a8k_can_protocol/ModuleStatus.java b/src/main/java/a8k/a8k_can_protocol/ModuleStatus.java deleted file mode 100644 index ff301d0..0000000 --- a/src/main/java/a8k/a8k_can_protocol/ModuleStatus.java +++ /dev/null @@ -1,24 +0,0 @@ -package a8k.a8k_can_protocol; - -public enum ModuleStatus { - IDLE(0), // - BUSY(1), // - ERROR(2),// - ; - - final public int index; - - ModuleStatus(int index) { - this.index = index; - } - - public int getIndex() { - return index; - } - - public static ModuleStatus valueOf(int value) { // 手写的从int到enum的转换函数 - assert (value >= 0 && value < 2); - return values()[value]; - } - -} diff --git a/src/main/java/a8k/a8k_can_protocol/ModuleType.java b/src/main/java/a8k/a8k_can_protocol/ModuleType.java deleted file mode 100644 index 053057c..0000000 --- a/src/main/java/a8k/a8k_can_protocol/ModuleType.java +++ /dev/null @@ -1,27 +0,0 @@ -package a8k.a8k_can_protocol; - -public enum ModuleType { - khbot_module(1), // hbot模块 - ktemperature_ctrl_module(3), // 温度控制 - kfan_ctrl_module(5), // 风扇控制 - kcode_scaner(6), // 扫码器 - kpipette_ctrl_module(7), // 移液体枪控制 - ka8000_optical_module(8), // a8000光学模组 - ktmc_step_motor(10), // 步进电机 - kmini_servo_motor_module(11), // 舵机 - kboard(12), // 板子 - ka8000_idcard_reader(13), // id卡读卡器 - ka8000_plate_code_scaner(14); // 反应板条扫码器 - - final private int val; - - ModuleType(int val) { - this.val = val; - } - - public int getVal() { - return val; - } - - -} diff --git a/src/main/java/a8k/a8k_can_protocol/RegIndex.java b/src/main/java/a8k/a8k_can_protocol/RegIndex.java deleted file mode 100644 index 3c8dc37..0000000 --- a/src/main/java/a8k/a8k_can_protocol/RegIndex.java +++ /dev/null @@ -1,183 +0,0 @@ -package a8k.a8k_can_protocol; - -public enum RegIndex { - - /******************************************************************************* - * 模块通用配置和状态 * - *******************************************************************************/ - kreg_module_version(0), // 模块版本 - kreg_module_type(1), // 模块类型 - kreg_module_status(2), // 0idle,1busy,2error - kreg_module_errorcode(3), // inited_flag - - /*********************************************************************************************************************** - * 水冷温度控制器 * - ***********************************************************************************************************************/ - kreg_water_cooling_tmp_controler_pid_target(3000), // 目标数值 - kreg_water_cooling_tmp_controler_pid_nowoutput(3001), // 当前输出 - kreg_water_cooling_tmp_controler_pid_feedbackval(3002), // 当前输出 - kreg_water_cooling_tmp_controler_temp0(3003), // 温度1 - kreg_water_cooling_tmp_controler_temp1(3004), // 温度2 - kreg_water_cooling_tmp_controler_temp2(3005), // 温度3 - kreg_water_cooling_tmp_controler_temp3(3006), // 温度4 - - kreg_water_cooling_tmp_controler_pid_kp(3050), // kp - kreg_water_cooling_tmp_controler_pid_ki(3051), // ki - kreg_water_cooling_tmp_controler_pid_kd(3052), // kd - kreg_water_cooling_tmp_controler_pid_max_output(3053), // 最大输出 - kreg_water_cooling_tmp_controler_pid_min_output(3054), // 最小输出 - kreg_water_cooling_tmp_controler_pid_max_integral(3055), // 最大积分 - kreg_water_cooling_tmp_controler_pid_min_integral(3056), // 最小积分 - kreg_water_cooling_tmp_controler_pid_error_limit(3057), // 误差限制 - kreg_water_cooling_tmp_controler_pid_compute_interval(3058), // 计算间隔 - - /******************************************************************************* - * 移液枪状态 * - *******************************************************************************/ - kreg_pipette_pos_ul(4000), // 移液枪位置 - kreg_pipette_capactitance_val(4001), // 移液枪电容值 - kreg_pipette_tip_state(4002), // 移动液枪tip状态 - - kreg_pipette_limit_ul(4051), // - kreg_pipette_pump_acc(4052), // - kreg_pipette_pump_dec(4053), // - kreg_pipette_pump_vstart(4054), // - kreg_pipette_pump_vstop(4055), // - kreg_pipette_pump_vmax(4056), // - kreg_pipette_aspirate_distribut_pump_vel(4057), // - kreg_pipette_lld_pump_vel(4058), // - kreg_pipette_lld_motor_vel_rpm(4059), // - kreg_pipette_lld_detect_period_ms(4060), // - kreg_pipette_lld_prepare_pos(4061), // - kreg_pipette_lld_prepare_distribut_pos(4062), // - - /** - * @brief - * - * ------------------------------------------------------ - * - * - * 扫描零点偏移:(F光学向左扫描的起始位置) - * 扫描方向:1:板卡箭头方向,-1板卡箭头反方向 - * 扫描点数:固定为1200 - * 扫描步距:固定为1 - * - * 返回点数:(1200) - * - * - */ - // 坐标参数 - - kreg_a8k_opt_t_pos_offset(4501), // T光学正向扫描,扫描起始位距离零点的偏移 - kreg_a8k_opt_f_pos_offset(4502), // F光学正向扫描,扫描起始位距离零点的偏移 - kreg_a8k_opt_t_reverse_scan_pos_offset(4503), // T光学逆向扫描,扫描起始位距离零点的偏移 - kreg_a8k_opt_f_reverse_scan_pos_offset(4504), // F光学逆向扫描,扫描起始位距离零点的偏移 - kreg_a8k_opt_scan_step_interval(4505), // 参数固定:为1 - kreg_a8k_opt_scan_pointnum(4506), // 参数固定:为1200个点 - - /*********************************************************************************************************************** - * XYROBOT * - ***********************************************************************************************************************/ - - kreg_xyrobot_io_state(9900), // - kreg_xyrobot_robot_type(9950), // - kreg_xyrobot_one_circle_pulse(9951), // - kreg_xyrobot_one_circle_pulse_denominator(9952), // - kreg_xyrobot_ihold(9954), // - kreg_xyrobot_irun(9955), // - kreg_xyrobot_iholddelay(9956), // - kreg_xyrobot_iglobalscaler(9957), // - kreg_xyrobot_vstart(9958), // - kreg_xyrobot_a1(9959), // - kreg_xyrobot_amax(9960), // - kreg_xyrobot_v1(9961), // - kreg_xyrobot_dmax(9962), // - kreg_xyrobot_d1(9963), // - kreg_xyrobot_vstop(9964), // - kreg_xyrobot_tzerowait(9965), // - kreg_xyrobot_enc_resolution(9966), // - kreg_xyrobot_enable_enc(9967), // - kreg_xyrobot_x_shaft(9968), // - kreg_xyrobot_y_shaft(9969), // - kreg_xyrobot_min_x(9972), // - kreg_xyrobot_min_y(9973), // - kreg_xyrobot_max_x(9974), // - kreg_xyrobot_max_y(9975), // - kreg_xyrobot_run_to_zero_speed(9976), // - kreg_xyrobot_look_zero_edge_speed(9977), // - kreg_xyrobot_shift_x(9978), // - kreg_xyrobot_shift_y(9979), // - kreg_xyrobot_default_velocity(10000), // - - /*********************************************************************************************************************** - * step_motor * - ***********************************************************************************************************************/ - - kreg_step_motor_pos(10101), // 机器人x坐标 - kreg_step_motor_dpos(10103), // 执行完上一条指令后的相对位移 - kreg_step_motor_shift(10150), // x偏移 - kreg_step_motor_shaft(10151), // x轴是否反转 - kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数 - kreg_step_motor_one_circle_pulse_denominator(10153), // 设置一圈脉冲数的分母 - kreg_step_motor_default_velocity(10154), // 默认速度 - kreg_step_motor_ihold(10158), // 步进电机电流配置 - kreg_step_motor_irun(10159), // 步进电机电流配置 - kreg_step_motor_iholddelay(10160), // 步进电机电流配置 - kreg_step_motor_iglobalscaler(10161), // 步进电机电流配置 - kreg_step_motor_run_to_zero_speed(10173), // 回零速度 - kreg_step_motor_look_zero_edge_speed(10175), // 找零边缘速度 - kreg_step_motor_max_d(10178), // 最大限制距离 - kreg_step_motor_min_d(10179), // 最小限制距离 - kreg_step_motor_in_debug_mode(10180), // 驱动器处于调试模式 - kreg_step_motor_vstart(10181), // a1起作用的速度 - kreg_step_motor_a1(10182), // - kreg_step_motor_amax(10183), // - kreg_step_motor_v1(10184), // - kreg_step_motor_dmax(10185), // - kreg_step_motor_d1(10186), // - kreg_step_motor_vstop(10187), // - kreg_step_motor_tzerowait(10188), // - kreg_step_motor_enc_resolution(10189), // 编码器分辨率 1000,1024,4000,4096,16384 - kreg_step_motor_enable_enc(10190), // - kreg_step_motor_dzero_pos(10191), // 驱动器处于调试模式 - - /*********************************************************************************************************************** - * step_motor * - ***********************************************************************************************************************/ - - kreg_mini_servo_pos(10201), // 位置 - kreg_mini_servo_limit_velocity(10251), // 限制速度 - kreg_mini_servo_limit_torque(10252), // 限制扭矩 - kreg_mini_servo_protective_torque(10253), // 保护扭矩 - kreg_mini_servo_is_move(10254), // 是否在运动 - /*********************************************************************************************************************** - * ID_CARD_READER * - ***********************************************************************************************************************/ - - kreg_id_card_reader_raw_sector_size(10301), // - kreg_id_card_reader_raw_sector_num(10302), // - kreg_id_card_reader_is_online(10303), // - - /*********************************************************************************************************************** - * 板夹仓扫码 * - ***********************************************************************************************************************/ - - kreg_plate_code_scaner_laster_intensity(10401), // - kreg_plate_code_scaner_scan_gain(10402), // - kreg_plate_code_scaner_scan_velocity(10403), // - kreg_plate_code_scaner_scan_start_pos(10404), // - kreg_plate_code_scaner_final_stop_pos(10405), // - kreg_plate_code_scaner_code_judgment_threshold(10406), // - kreg_plate_code_scaner_item(10407), // - kreg_plate_code_scaner_lot(10408), // - kreg_plate_code_scaner_rawcode(10409), // - kreg_plate_code_scaner_code_legal(10410); // - - public final int index; - - RegIndex(int regIndex) { - this.index = regIndex; - } - - -} diff --git a/src/main/java/a8k/app_eventbus/A8kDebugTaskExecutorService.java b/src/main/java/a8k/app_eventbus/A8kDebugTaskExecutorService.java new file mode 100644 index 0000000..4f2339b --- /dev/null +++ b/src/main/java/a8k/app_eventbus/A8kDebugTaskExecutorService.java @@ -0,0 +1,43 @@ +package a8k.app_eventbus; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class A8kDebugTaskExecutorService { + public static final Logger logger = LoggerFactory.getLogger(A8kDebugTaskExecutorService.class); + + Thread task; + + synchronized void exec(Runnable runnable) { + if (task != null) { + task.interrupt(); + try { + task.join(); + } catch (InterruptedException ignored) { + return; + } + } + + task = new Thread(runnable); + task.start(); + } + + synchronized void stop() { + try { + task.join(); + task = null; + } catch (InterruptedException e) { + logger.error(e.getMessage()); + } + } + + synchronized boolean isRunning() { + if (task == null) { + return false; + } + return task.isAlive(); + } + +} diff --git a/src/main/java/a8k/app_eventbus/AppEventBusService.java b/src/main/java/a8k/app_eventbus/AppEventBusService.java new file mode 100644 index 0000000..7448d6f --- /dev/null +++ b/src/main/java/a8k/app_eventbus/AppEventBusService.java @@ -0,0 +1,56 @@ +package a8k.app_eventbus; + +import a8k.appbean.AppEventListener; +import a8k.app_eventbus.appevent.AppEvent; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +@Component +public class AppEventBusService { + public static final Logger logger = LoggerFactory.getLogger(AppEventBusService.class); + + Thread eventProcessorThread; + BlockingQueue eventQueue; + List listeners; + + @PostConstruct + public void init() { + eventQueue = new LinkedBlockingQueue(); + eventProcessorThread = new Thread(new Runnable() { + public void run() { + eventBusSchedule(); + } + }); + } + + public void regListener(AppEventListener listener) { + listeners.add(listener); + } + + public void pushEvent(AppEvent event) { + logger.info("pushEvent: {}", event); + eventQueue.add(event); + } + + private void eventBusSchedule() { + while (!Thread.currentThread().isInterrupted()) { + try { + AppEvent event = eventQueue.take(); + } catch (InterruptedException ignored) { + } + } + } + + private void callOnEvent(AppEvent event) { + logger.info("Processing event: {}", event); + for (AppEventListener listener : listeners) { + listener.onAppEvent(event); + } + } +} diff --git a/src/main/java/a8k/app_eventbus/appevent/A8kHardwareReport.java b/src/main/java/a8k/app_eventbus/appevent/A8kHardwareReport.java new file mode 100644 index 0000000..f7e41ef --- /dev/null +++ b/src/main/java/a8k/app_eventbus/appevent/A8kHardwareReport.java @@ -0,0 +1,21 @@ +package a8k.app_eventbus.appevent; + +import a8k.canbus.protocol.A8kPacket; +import org.springframework.lang.NonNull; + +/** + * A8k底层硬件上报事件 + */ +public class A8kHardwareReport extends AppEvent{ + + A8kPacket reportPacket; + public A8kHardwareReport(@NonNull A8kPacket packet) {} + + A8kPacket getReportPacket(){ + return reportPacket; + } + + public String toString(){ + return String.format("|Event A8kHardwareReport :%s|", reportPacket.toString()); + } +} diff --git a/src/main/java/a8k/app_eventbus/appevent/AppEvent.java b/src/main/java/a8k/app_eventbus/appevent/AppEvent.java new file mode 100644 index 0000000..72fb054 --- /dev/null +++ b/src/main/java/a8k/app_eventbus/appevent/AppEvent.java @@ -0,0 +1,6 @@ +package a8k.app_eventbus.appevent; + +public class AppEvent { + + +} diff --git a/src/main/java/a8k/app_eventbus/appevent/AppStepNotifyEvent.java b/src/main/java/a8k/app_eventbus/appevent/AppStepNotifyEvent.java new file mode 100644 index 0000000..f0107c9 --- /dev/null +++ b/src/main/java/a8k/app_eventbus/appevent/AppStepNotifyEvent.java @@ -0,0 +1,13 @@ +package a8k.app_eventbus.appevent; + +public class AppStepNotifyEvent extends AppEvent { + String displayInfo; + + AppStepNotifyEvent(String displayInfo) { + this.displayInfo = displayInfo; + } + + public String getDisplayInfo() { + return displayInfo; + } +} diff --git a/src/main/java/a8k/app_eventbus/appevent/AppWarningNotifyEvent.java b/src/main/java/a8k/app_eventbus/appevent/AppWarningNotifyEvent.java new file mode 100644 index 0000000..f0b3dc9 --- /dev/null +++ b/src/main/java/a8k/app_eventbus/appevent/AppWarningNotifyEvent.java @@ -0,0 +1,14 @@ +package a8k.app_eventbus.appevent; + +public class AppWarningNotifyEvent extends AppEvent { + String displayInfo; + + AppWarningNotifyEvent(String displayInfo) { + this.displayInfo = displayInfo; + } + + public String getDisplayInfo() { + return displayInfo; + } + +} diff --git a/src/main/java/a8k/appbean/AppEventListener.java b/src/main/java/a8k/appbean/AppEventListener.java index b28c6e7..bbd36b8 100644 --- a/src/main/java/a8k/appbean/AppEventListener.java +++ b/src/main/java/a8k/appbean/AppEventListener.java @@ -1,6 +1,6 @@ package a8k.appbean; -import a8k.appbean.appevent.AppEvent; +import a8k.app_eventbus.appevent.AppEvent; public interface AppEventListener { public void onAppEvent(AppEvent event); diff --git a/src/main/java/a8k/appbean/HardwareException.java b/src/main/java/a8k/appbean/HardwareException.java index 45bef87..bd0019b 100644 --- a/src/main/java/a8k/appbean/HardwareException.java +++ b/src/main/java/a8k/appbean/HardwareException.java @@ -1,8 +1,8 @@ package a8k.appbean; -import a8k.a8k_can_protocol.A8kEcode; -import a8k.a8k_can_protocol.CmdId; -import a8k.a8k_can_protocol.MId; +import a8k.canbus.protocol.A8kEcode; +import a8k.canbus.protocol.CmdId; +import a8k.canbus.protocol.MId; public class HardwareException extends Exception { // 构造函数 diff --git a/src/main/java/a8k/appbean/appevent/A8kHardwareReport.java b/src/main/java/a8k/appbean/appevent/A8kHardwareReport.java deleted file mode 100644 index c5fc697..0000000 --- a/src/main/java/a8k/appbean/appevent/A8kHardwareReport.java +++ /dev/null @@ -1,21 +0,0 @@ -package a8k.appbean.appevent; - -import a8k.a8k_can_protocol.A8kPacket; -import org.springframework.lang.NonNull; - -/** - * A8k底层硬件上报事件 - */ -public class A8kHardwareReport extends AppEvent{ - - A8kPacket reportPacket; - public A8kHardwareReport(@NonNull A8kPacket packet) {} - - A8kPacket getReportPacket(){ - return reportPacket; - } - - public String toString(){ - return String.format("|Event A8kHardwareReport :%s|", reportPacket.toString()); - } -} diff --git a/src/main/java/a8k/appbean/appevent/AppEvent.java b/src/main/java/a8k/appbean/appevent/AppEvent.java deleted file mode 100644 index 80d77f1..0000000 --- a/src/main/java/a8k/appbean/appevent/AppEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package a8k.appbean.appevent; - -public class AppEvent { - - -} diff --git a/src/main/java/a8k/appbean/appevent/AppStepNotifyEvent.java b/src/main/java/a8k/appbean/appevent/AppStepNotifyEvent.java deleted file mode 100644 index d17f708..0000000 --- a/src/main/java/a8k/appbean/appevent/AppStepNotifyEvent.java +++ /dev/null @@ -1,13 +0,0 @@ -package a8k.appbean.appevent; - -public class AppStepNotifyEvent extends AppEvent { - String displayInfo; - - AppStepNotifyEvent(String displayInfo) { - this.displayInfo = displayInfo; - } - - public String getDisplayInfo() { - return displayInfo; - } -} diff --git a/src/main/java/a8k/appbean/appevent/AppWarningNotifyEvent.java b/src/main/java/a8k/appbean/appevent/AppWarningNotifyEvent.java deleted file mode 100644 index a9084d2..0000000 --- a/src/main/java/a8k/appbean/appevent/AppWarningNotifyEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package a8k.appbean.appevent; - -public class AppWarningNotifyEvent extends AppEvent { - String displayInfo; - - AppWarningNotifyEvent(String displayInfo) { - this.displayInfo = displayInfo; - } - - public String getDisplayInfo() { - return displayInfo; - } - -} diff --git a/src/main/java/a8k/appbean/ecode/AppRet.java b/src/main/java/a8k/appbean/ecode/AppRet.java index 9c215d8..a7fa13b 100644 --- a/src/main/java/a8k/appbean/ecode/AppRet.java +++ b/src/main/java/a8k/appbean/ecode/AppRet.java @@ -1,8 +1,8 @@ package a8k.appbean.ecode; -import a8k.a8k_can_protocol.CmdId; -import a8k.a8k_can_protocol.MId; -import a8k.a8k_can_protocol.A8kEcode; +import a8k.canbus.protocol.CmdId; +import a8k.canbus.protocol.MId; +import a8k.canbus.protocol.A8kEcode; import a8k.appbean.HardwareException; public class AppRet { diff --git a/src/main/java/a8k/appbean/ecode/AppRetEcodeInfo.java b/src/main/java/a8k/appbean/ecode/AppRetEcodeInfo.java index 7d09018..7c42975 100644 --- a/src/main/java/a8k/appbean/ecode/AppRetEcodeInfo.java +++ b/src/main/java/a8k/appbean/ecode/AppRetEcodeInfo.java @@ -1,8 +1,8 @@ package a8k.appbean.ecode; -import a8k.a8k_can_protocol.A8kEcode; -import a8k.a8k_can_protocol.CmdId; -import a8k.a8k_can_protocol.MId; +import a8k.canbus.protocol.A8kEcode; +import a8k.canbus.protocol.CmdId; +import a8k.canbus.protocol.MId; public class AppRetEcodeInfo { A8kEcode errorCode; diff --git a/src/main/java/a8k/base_hardware/A8kCanBusService.java b/src/main/java/a8k/base_hardware/A8kCanBusService.java deleted file mode 100644 index 46fec5e..0000000 --- a/src/main/java/a8k/base_hardware/A8kCanBusService.java +++ /dev/null @@ -1,663 +0,0 @@ -package a8k.base_hardware; - -import a8k.a8k_can_protocol.*; -import a8k.a8k_can_protocol.MId; -import a8k.appbean.HardwareException; -import a8k.appbean.cfg.Pos2d; -import a8k.appbean.appevent.A8kHardwareReport; -import a8k.service.AppEventBusService; -import a8k.utils.ByteArray; -import jakarta.annotation.PostConstruct; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.enums.ReadyState; -import org.java_websocket.handshake.ServerHandshake; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.HashMap; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; - -@Component -public class A8kCanBusService { - public static final Logger logger = LoggerFactory.getLogger(A8kCanBusService.class); - - /** - * receiptQueue - * waittingReceiptIndex - * - * onPacket - * if(receipt) - * send_receipt_queue - * - * - * sendcmd - * send cmd - * waiting for receipt - * for(){ - * if(receipt.packetIndex == receiptIndex){ - * return; - * } - * wait - * } - * - */ - - @Autowired - private AppEventBusService eventBusService; - - public String uri; // assign by application.yml - private WebSocketClient client; - - // 接收回执上下文 - public BlockingQueue receiptQueue = new LinkedBlockingQueue(); // - boolean isWaitingReceipt = false; // - int waitingReceiptIndex = 0;// - - // 发送包的packetIndex - int packetIndex = 0;// - - // 调试标志位 - boolean debugFlag = true;// - // websocket自动重连时间 - Timer autoConnectTimer = new Timer();// - - - Map lastCmdMap = new HashMap<>(); - - @PostConstruct - public void init() throws URISyntaxException { - - logger.info("BaseHardwareService initilized"); - packetIndex = 0; - if (this.uri == null) { - // this.uri = "ws://127.0.0.1:19005"; - this.uri = "ws://192.168.8.10:19005"; - } - - URI uri = new URI(this.uri); - client = new WebSocketClient(uri) { - @Override - public void onOpen(ServerHandshake serverHandshake) { - logger.info("onOpen"); - } - - @Override - public void onMessage(String s) { - processMessage(s); - } - - @Override - public void onClose(int i, String s, boolean b) { - logger.info("onClose"); - } - - @Override - public void onError(Exception e) { - logger.info("onError"); - } - }; - client.connect(); - - autoConnectTimer.schedule(new TimerTask() { - @Override - public void run() { - if (!client.isOpen()) { - if (client.getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { - try { - client.connect(); - } catch (IllegalStateException e) { - } - } else if (client.getReadyState().equals(ReadyState.CLOSING) || client.getReadyState().equals(ReadyState.CLOSED)) { - client.reconnect(); - } - } - } - }, 0, 1000); - } - - - private A8kPacket packParamsToPacket(Integer moduleId, Integer cmdId, Integer[] params) { - int subCmdId = cmdId & 0xFF; - int mainCmdId = (cmdId >> 8) & 0xFFFF; - int bufferSize = 2 + 2 + 1 + 1 + 2 + 4 * params.length; // PacketIndex - MainCmdId - SubCmdId - CmdType - - // ModuleId - Parameters - ByteBuffer buffer = ByteBuffer.allocate(bufferSize); - buffer.order(ByteOrder.LITTLE_ENDIAN); - buffer.putShort((short) 0); // PacketIndex - buffer.putShort((short) mainCmdId); // MainCmdId - buffer.put((byte) subCmdId); // SubCmdId - buffer.put((byte) 0); // CmdType - buffer.putShort(moduleId.shortValue()); // ModuleId - for (int value : params) { - buffer.putInt(value); - } - return new A8kPacket(buffer.array()); - } - // fan_controler_set_speed - - public void fanControlerSetSpeed(MId id, int speed) throws HardwareException, InterruptedException { - callcmd(id.toInt(), CmdId.fan_controler_set_speed.toInt(), speed); - } - - - //code_scaner_start_scan - //code_scaner_stop_scan - //code_scaner_result_is_ready - //code_scaner_read_scaner_result - - public void codeScanerStartScan(MId id) throws HardwareException, InterruptedException { - callcmd(id.toInt(), CmdId.code_scaner_start_scan.toInt()); - } - - public void codeScanerStopScan(MId id) throws HardwareException, InterruptedException { - callcmd(id.toInt(), CmdId.code_scaner_stop_scan.toInt()); - } - - public String codeScanerReadScanerResult(MId id) throws HardwareException, InterruptedException { - A8kPacket ack = callcmd(id.toInt(), CmdId.code_scaner_read_scaner_result.toInt()); - var contentBytes = ack.getCmdContent(); - return new String(contentBytes); - } - - public Boolean codeScanerResultIsReady(MId id) throws HardwareException, InterruptedException { - var packet = callcmd(id.toInt(), CmdId.code_scaner_result_is_ready.toInt()); - return packet.getContentI32(0) != 0; - } - - public String codeScanerWaittingForResult(MId mid, Integer acitionOvertime) throws HardwareException, InterruptedException { - long startedAt = System.currentTimeMillis(); - do { - if (codeScanerResultIsReady(mid)) - break; - long now = System.currentTimeMillis(); - if (now - startedAt > acitionOvertime) { - codeScanerStopScan(mid); - return null; - } - Thread.sleep(100); - } while (true); - codeScanerStopScan(mid); - return codeScanerReadScanerResult(mid); - } - - // - // module opeation - // - public void modulePing(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.module_ping.toInt()); - } - - public void moduleStop(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.module_stop.toInt()); - } - - public ModuleStatus getModuleStatus(MId id) throws HardwareException { - var packet = callcmd(id.toInt(), CmdId.module_get_status.toInt()); - return ModuleStatus.valueOf(packet.getContentI32(0)); - - } - - public void moduleSetReg(MId id, RegIndex regindex, Integer reg) throws HardwareException { - callcmd(id.toInt(), CmdId.module_set_reg.toInt(), regindex.index, reg); - } - - public Integer moduleGetReg(MId id, RegIndex regindex) throws HardwareException { - var packet = callcmd(id.toInt(), CmdId.module_get_reg.toInt(), regindex.index); - return packet.getContentI32(0); - } - - public A8kEcode moduleGetError(MId id) throws HardwareException { - var packet = callcmd(id.toInt(), CmdId.module_get_error.toInt()); - return A8kEcode.valueOf(packet.getContentI32(0)); - } - - public void moduleClearError(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.module_clear_error.toInt()); - } - - public void moduleActiveCfg(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.module_active_cfg.toInt()); - } - - - public void hbotEnable(MId mid, int enable) throws HardwareException { - callcmd(mid.toInt(), CmdId.xymotor_enable.toInt(), enable); - } - - public void hbotMoveBy(MId mid, int x, int y) throws HardwareException { - callcmd(mid.toInt(), CmdId.xymotor_move_by.toInt(), x, y); - } - - public void hbotMoveTo(MId mid, int x, int y) throws HardwareException { - callcmd(mid.toInt(), CmdId.xymotor_move_to.toInt(), x, y); - } - - public void hbotMoveToZero(MId mid) throws HardwareException { - callcmd(mid.toInt(), CmdId.xymotor_move_to_zero.toInt()); - } - - public Pos2d hbotReadPos(MId mid) throws HardwareException { - Pos2d pos = new Pos2d(0, 0); - var packet = callcmd(mid.toInt(), CmdId.xymotor_read_pos.toInt()); - pos.x = packet.getContentI32(0); - pos.y = packet.getContentI32(1); - return pos; - } - - public int hbotReadInio(MId mid) throws HardwareException { - var packet = callcmd(mid.toInt(), CmdId.xymotor_read_inio.toInt()); - return packet.getContentI32(0); - } - - public void hbotSetPos(MId mid, int x, int y) throws HardwareException { - callcmd(mid.toInt(), CmdId.xymotor_set_pos.toInt(), x, y); - } - - - public void hbotMoveByDirect(MId mid, int motor1_dpos, int motor2_dpos) throws HardwareException { - callcmd(mid.toInt(), CmdId.xymotor_motor_move_by_direct.toInt(), motor1_dpos, motor2_dpos); - } - - public int hbotReadEncDirect(MId mid) throws HardwareException { - var packet = callcmd(mid.toInt(), CmdId.xymotor_read_enc_direct.toInt()); - return packet.getContentI32(0); - } - - public int hbotReadInioIndexInStm32(MId mid, int ioIndex) throws HardwareException { - var packet = callcmd(mid.toInt(), CmdId.xymotor_read_inio_index_in_stm32.toInt(), ioIndex); - return packet.getContentI32(0); - } - - - // - // stepMotor - // - public void stepMotorEnable(MId mid, int enable) throws HardwareException { - callcmd(mid.toInt(), CmdId.step_motor_enable.toInt(), enable); - } - - public int stepMotorReadPos(MId id) throws HardwareException { - A8kPacket packet = callcmd(id.toInt(), CmdId.step_motor_read_pos.toInt()); - return packet.getContentI32(0); - } - - public void stepMotorEasyRotate(MId id, int direction) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_rotate.toInt(), direction); - } - - public void stepMotorEasyMoveBy(MId id, int dpos) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_move_by.toInt(), dpos); - } - - public void stepMotorEasyMoveTo(MId id, int pos) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_move_to.toInt(), pos); - } - - public void stepMotorEasyMoveToZero(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_move_to_zero.toInt()); - } - - public void stepMotorEasySetCurrentPos(MId id, int pos) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_set_current_pos.toInt(), pos); - } - - public void stepMotorEasyMoveToIo(MId id, int io) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_move_to_io.toInt(), io); - } - - public void stepMotorStop(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_stop.toInt()); - } - - public void stepMotorActiveCfg(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_active_cfg.toInt()); - } - - public Boolean stepMotorReadIoState(MId id, int ioindex) throws HardwareException { - var packet = callcmd(id.toInt(), CmdId.step_motor_read_io_state.toInt(), ioindex); - return packet.getContentI32(0) != 0; - } - - public void stepMotorEasyMoveToEndPoint(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_move_to_end_point.toInt()); - } - - public void stepMotorEasyReciprocatingMotion(MId id, int startpos, int endpos, int times) throws HardwareException { - callcmd(id.toInt(), CmdId.step_motor_easy_reciprocating_motion.toInt(), startpos, endpos, times); - } - - // - // MINI_SERVO - // - - public void miniServoEnable(MId id, int enable) throws HardwareException { - callcmd(id.toInt(), CmdId.mini_servo_enable.toInt(), enable); - } - - public int miniServoReadPos(MId id) throws HardwareException { - var packet = callcmd(id.toInt(), CmdId.mini_servo_read_pos.toInt()); - return packet.getContentI32(0); - } - - public void miniServoActiveCfg(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.mini_servo_active_cfg.toInt()); - } - - public void miniServoStop(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.mini_servo_stop.toInt()); - } - - public void miniServoSetMidPoint(MId id) throws HardwareException { - callcmd(id.toInt(), CmdId.mini_servo_set_mid_point.toInt()); - } - - public int miniServoReadIoState(MId id) throws HardwareException { - var packet = callcmd(id.toInt(), CmdId.mini_servo_read_io_state.toInt()); - return packet.getContentI32(0); - } - - public void miniServoMoveTo(MId id, int pos) throws HardwareException { - callcmd(id.toInt(), CmdId.mini_servo_move_to.toInt(), pos); - } - - public void miniServoRotate(MId id, int direction) throws HardwareException { - callcmd(id.toInt(), CmdId.mini_servo_rotate.toInt(), direction); - } - - public void miniServoRotateWithTorque(MId id, int torque) throws HardwareException { - callcmd(id.toInt(), CmdId.mini_servo_rotate_with_torque.toInt(), torque); - } - - public void miniServoWaitIsNotMove(MId id, int acitionOvertime) throws HardwareException, InterruptedException { - long startedAt = System.currentTimeMillis(); - do { - var isMove = moduleGetReg(id, RegIndex.kreg_mini_servo_is_move); - if (isMove != 0) { - break; - } - long now = System.currentTimeMillis(); - if (now - startedAt > acitionOvertime) { - throw new HardwareException(id, A8kEcode.Overtime); - } - - } while (true); - } - - public Boolean getIOState(IOId ioid) throws HardwareException { - if (ioid.mtype == ModuleType.kboard) { - return callcmd(ioid.mid.toInt(), CmdId.extboard_read_inio.toInt(), ioid.ioIndex).getContentI32(0) != 0; - } else if (ioid.mtype == ModuleType.ktmc_step_motor) { - return callcmd(ioid.mid.toInt(), CmdId.step_motor_read_io_state.toInt(), ioid.ioIndex).getContentI32(0) != 0; - } else if (ioid.mtype == ModuleType.kmini_servo_motor_module) { - return callcmd(ioid.mid.toInt(), CmdId.mini_servo_read_io_state.toInt(), ioid.ioIndex).getContentI32(0) != 0; - } else { - throw new HardwareException(ioid.mid, A8kEcode.IllegalOperation); - } - } - - public void setIOState(IOId ioid, boolean val) throws HardwareException { - if (ioid.mtype == ModuleType.kboard) { - callcmd(ioid.mid.toInt(), CmdId.extboard_write_outio.toInt(), ioid.ioIndex, val ? 1 : 0); - } else { - throw new HardwareException(ioid.mid, A8kEcode.IllegalOperation); - } - } - - public void waitForAction(MId mid, int cmdId, Integer acitionOvertime) throws InterruptedException, HardwareException { - long startedAt = System.currentTimeMillis(); - do { - try { - var status = getModuleStatus(mid); - if (status == ModuleStatus.IDLE) { - break; - } else if (status == ModuleStatus.ERROR) { - throw new HardwareException(mid, moduleGetError(mid)); - } - } catch (HardwareException ignored) { - } - long now = System.currentTimeMillis(); - if (now - startedAt > acitionOvertime) { - throw new HardwareException(mid, A8kEcode.Overtime); - } - - Thread.sleep(100); - } while (true); - - } - - public void waitForMods(MId[] mids, Integer acitionOvertime) throws InterruptedException, HardwareException { - for (MId mid : mids) { - waitForMod(mid, acitionOvertime); - } - } - - public void waitForMod(MId mid, Integer acitionOvertime) throws InterruptedException, HardwareException { - long startedAt = System.currentTimeMillis(); -// Thread.sleep(300); - // CmdId action = lastCmdMap.get(mid); - CmdId action = lastCmdMapGet(mid); - do { - - try { - var status = getModuleStatus(mid); - if (status == ModuleStatus.IDLE) { - break; - } else if (status == ModuleStatus.ERROR) { - logger.error("{} waitting for action {} , catch error {}", mid, action, moduleGetError(mid)); - throw new HardwareException(mid, moduleGetError(mid)); - } - } catch (HardwareException ignored) { - } - long now = System.currentTimeMillis(); - if (now - startedAt > acitionOvertime) { - logger.error("{} waitting for action {} overtime", mid, action); - try {moduleStop(mid);} catch (HardwareException ignored) {} - throw new HardwareException(mid, A8kEcode.ActionOvertime); - } - Thread.sleep(100); - } while (true); - } - - public A8kPacket callcmd(Integer moduleId, Integer cmdId) throws HardwareException { - return this.callcmd(moduleId, cmdId, new Integer[]{}); - } - - public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0) throws HardwareException { - return this.callcmd(moduleId, cmdId, new Integer[]{p0}); - } - - public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1) throws HardwareException { - return this.callcmd(moduleId, cmdId, new Integer[]{p0, p1}); - } - - public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2) throws HardwareException { - return this.callcmd(moduleId, cmdId, new Integer[]{p0, p1, p2}); - } - - public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2, Integer p3) throws HardwareException { - return this.callcmd(moduleId, cmdId, new Integer[]{p0, p1, p2, p3}); - } - - - public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer[] params) throws HardwareException { - var packet = packParamsToPacket(moduleId, cmdId, params); - return sendCmdAutoResend(packet, A8kPacket.CMD_OVERTIME); - } - - public A8kPacket sendCmdAutoResend(A8kPacket pack, int overtime) throws HardwareException { - // 调用sendCmd, - // 如果捕获到超时异常,则重发,最多重发三次 - // 如果是其他异常,则直接抛出异常。 - for (int i = 0; i < 5; i++) { - try { - return this.sendCmd(pack, A8kPacket.CMD_OVERTIME); - } catch (HardwareException e) { - if (e.getErrorCode() != A8kEcode.Overtime) { - throw e; - } - } - try { - Thread.sleep(100); - } catch (InterruptedException ignore) { - } - } - throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); - } - - public void callblockcmd(Integer moduleId, Integer cmdId, Integer[] params, int acitionOvertime) throws HardwareException, InterruptedException { - var packet = this.packParamsToPacket(moduleId, cmdId, params); - this.sendCmdAutoResend(packet, A8kPacket.CMD_OVERTIME); - - // 调用sendCmdAutoResend - // 通过kmodule_get_status判断指令是否完成,超时未完成则报错,则调用module_stop,同时抛出异常 - // - - long startedAt = System.currentTimeMillis(); - do { - var pack = this.callcmd(moduleId, CmdId.module_get_status.toInt(), new Integer[]{}); - var status = pack.getContentI32(0); - if (0 == status) { - break; - } - - long now = System.currentTimeMillis(); - if (now - startedAt > acitionOvertime) { - throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); - } - - Thread.sleep(100); - } while (true); - } - - private A8kPacket sendCmd(A8kPacket pack, int overtime) throws HardwareException { - pack.setPacketIndex(packetIndex); - waitingReceiptIndex = packetIndex; - packetIndex = packetIndex + 1; - if (packetIndex > 10000) { - packetIndex = 1; - } - receiptQueue.clear(); - isWaitingReceipt = true; - String txpacket = pack.toByteString(); - - CmdId cmdid = CmdId.valueOf(pack.getCmdId()); - if (cmdid == null) { - throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.CmdIdNotSupport); - } - if (debugFlag && !cmdid.notTrace) { - String packstr = pack.toString(); - logger.info("Tx:|RAW:{}| {}", txpacket, packstr); - } - - if (cmdid.actionCmd) { - lastCmdMapPut(MId.valueOf(pack.getModuleId()), CmdId.valueOf(pack.getCmdId())); - } - - - client.send(txpacket); - A8kPacket receipt; - try { - receipt = receiptQueue.poll(overtime, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - isWaitingReceipt = false; - throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); - } - isWaitingReceipt = false; - if (receipt == null) { - throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); - } - - if (receipt.getPacketType() == A8kPacket.PACKET_TYPE_ERROR_ACK) { - throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.valueOf(receipt.getContentI32(0))); - } - try { - Thread.sleep(10); - } catch (InterruptedException ignored) { - } - return receipt; - } - - /** - * - */ - private void processMessage(String s) { - byte[] rx = ByteArray.hexStringToBytes(s); - if (rx == null || rx.length == 0) { - logger.warn("rx is empty"); - return; - } - - if (rx.length < A8kPacket.PACKET_MIN_LEN) { - logger.warn("rx is too short"); - return; - } - - A8kPacket packet = new A8kPacket(rx); - - CmdId cmdid = CmdId.valueOf(packet.getCmdId()); - if (cmdid == null) { - logger.warn("Rx packet cmdid not support: {}", packet.getCmdId()); - return; - } - - if (debugFlag && !cmdid.notTrace) { - logger.info("RX |RAW:{}| {}", s, packet); - } - - if (packet.getPacketType() == A8kPacket.PACKET_TYPE_ACK || packet.getPacketType() == A8kPacket.PACKET_TYPE_ERROR_ACK) { - if (isWaitingReceipt) { - if (waitingReceiptIndex == packet.getPacketIndex()) { - receiptQueue.add(packet); - } - } - } - - if (packet.getPacketType() == A8kPacket.PACKET_TYPE_EVENT) { - if (eventBusService != null) { - eventBusService.pushEvent(new A8kHardwareReport(packet)); - } - } - } - - synchronized void lastCmdMapPut(MId mid, CmdId cmdId) { - lastCmdMap.put(mid, cmdId); - } - - synchronized CmdId lastCmdMapGet(MId mid) { - return lastCmdMap.get(mid); - } - // - // public static void main(String[] args) { - // A8kCanBusService service = new A8kCanBusService(); - // try { - // service.init(); - // } catch (URISyntaxException e) { - // logger.error(e.getMessage()); - // } - // - // Thread thread = new Thread(() -> { - // while (true) { - // A8kPacket packet = null; - // try { - // packet = service.receiptQueue.take(); - // logger.info("poll receipt {}", packet); - // } catch (InterruptedException e) { - // throw new RuntimeException(e); - // } - // } - // }); - // thread.start(); - // } - -} diff --git a/src/main/java/a8k/canbus/A8kCanBusService.java b/src/main/java/a8k/canbus/A8kCanBusService.java new file mode 100644 index 0000000..915d403 --- /dev/null +++ b/src/main/java/a8k/canbus/A8kCanBusService.java @@ -0,0 +1,693 @@ +package a8k.canbus; + +import a8k.canbus.protocol.*; +import a8k.canbus.protocol.MId; +import a8k.appbean.HardwareException; +import a8k.appbean.cfg.Pos2d; +import a8k.app_eventbus.appevent.A8kHardwareReport; +import a8k.app_eventbus.AppEventBusService; +import a8k.utils.ByteArray; +import jakarta.annotation.PostConstruct; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.enums.ReadyState; +import org.java_websocket.handshake.ServerHandshake; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +@Component +public class A8kCanBusService { + public static final Logger logger = LoggerFactory.getLogger(A8kCanBusService.class); + + /** + * receiptQueue + * waittingReceiptIndex + * + * onPacket + * if(receipt) + * send_receipt_queue + * + * + * sendcmd + * send cmd + * waiting for receipt + * for(){ + * if(receipt.packetIndex == receiptIndex){ + * return; + * } + * wait + * } + * + */ + + @Autowired + private AppEventBusService eventBusService; + + public String uri; // assign by application.yml + private WebSocketClient client; + + // 接收回执上下文 + public BlockingQueue receiptQueue = new LinkedBlockingQueue(); // + boolean isWaitingReceipt = false; // + int waitingReceiptIndex = 0;// + + // 发送包的packetIndex + int packetIndex = 0;// + + // 调试标志位 + boolean debugFlag = true;// + // websocket自动重连时间 + Timer autoConnectTimer = new Timer();// + + + Map lastCmdMap = new HashMap<>(); + + @PostConstruct + public void init() throws URISyntaxException { + + logger.info("BaseHardwareService initilized"); + packetIndex = 0; + if (this.uri == null) { + // this.uri = "ws://127.0.0.1:19005"; + this.uri = "ws://192.168.8.10:19005"; + } + + URI uri = new URI(this.uri); + client = new WebSocketClient(uri) { + @Override + public void onOpen(ServerHandshake serverHandshake) { + logger.info("onOpen"); + } + + @Override + public void onMessage(String s) { + processMessage(s); + } + + @Override + public void onClose(int i, String s, boolean b) { + logger.info("onClose"); + } + + @Override + public void onError(Exception e) { + logger.info("onError"); + } + }; + client.connect(); + + autoConnectTimer.schedule(new TimerTask() { + @Override + public void run() { + if (!client.isOpen()) { + if (client.getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { + try { + client.connect(); + } catch (IllegalStateException e) { + } + } else if (client.getReadyState().equals(ReadyState.CLOSING) || client.getReadyState().equals(ReadyState.CLOSED)) { + client.reconnect(); + } + } + } + }, 0, 1000); + } + + + private A8kPacket packParamsToPacket(Integer moduleId, Integer cmdId, Integer[] params) { + int subCmdId = cmdId & 0xFF; + int mainCmdId = (cmdId >> 8) & 0xFFFF; + int bufferSize = 2 + 2 + 1 + 1 + 2 + 4 * params.length; // PacketIndex - MainCmdId - SubCmdId - CmdType - + // ModuleId - Parameters + ByteBuffer buffer = ByteBuffer.allocate(bufferSize); + buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.putShort((short) 0); // PacketIndex + buffer.putShort((short) mainCmdId); // MainCmdId + buffer.put((byte) subCmdId); // SubCmdId + buffer.put((byte) 0); // CmdType + buffer.putShort(moduleId.shortValue()); // ModuleId + for (int value : params) { + buffer.putInt(value); + } + return new A8kPacket(buffer.array()); + } + // fan_controler_set_speed + + public void fanControlerSetSpeed(MId id, int speed) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.fan_controler_set_speed.toInt(), speed); + } + + + //code_scaner_start_scan + //code_scaner_stop_scan + //code_scaner_result_is_ready + //code_scaner_read_scaner_result + + public void codeScanerStartScan(MId id) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.code_scaner_start_scan.toInt()); + } + + public void codeScanerStopScan(MId id) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.code_scaner_stop_scan.toInt()); + } + + public String codeScanerReadScanerResult(MId id) throws HardwareException, InterruptedException { + A8kPacket ack = callcmd(id.toInt(), CmdId.code_scaner_read_scaner_result.toInt()); + var contentBytes = ack.getCmdContent(); + return new String(contentBytes); + } + + public Boolean codeScanerResultIsReady(MId id) throws HardwareException, InterruptedException { + var packet = callcmd(id.toInt(), CmdId.code_scaner_result_is_ready.toInt()); + return packet.getContentI32(0) != 0; + } + + public String codeScanerWaittingForResult(MId mid, Integer acitionOvertime) throws HardwareException, InterruptedException { + long startedAt = System.currentTimeMillis(); + do { + if (codeScanerResultIsReady(mid)) + break; + long now = System.currentTimeMillis(); + if (now - startedAt > acitionOvertime) { + codeScanerStopScan(mid); + return null; + } + Thread.sleep(100); + } while (true); + codeScanerStopScan(mid); + return codeScanerReadScanerResult(mid); + } + + // + // module opeation + // + public void modulePing(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.module_ping.toInt()); + } + + public void moduleStop(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.module_stop.toInt()); + } + + public ModuleStatus getModuleStatus(MId id) throws HardwareException { + var packet = callcmd(id.toInt(), CmdId.module_get_status.toInt()); + return ModuleStatus.valueOf(packet.getContentI32(0)); + + } + + public void moduleSetReg(MId id, RegIndex regindex, Integer reg) throws HardwareException { + callcmd(id.toInt(), CmdId.module_set_reg.toInt(), regindex.index, reg); + } + + public Integer moduleGetReg(MId id, RegIndex regindex) throws HardwareException { + var packet = callcmd(id.toInt(), CmdId.module_get_reg.toInt(), regindex.index); + return packet.getContentI32(0); + } + + public A8kEcode moduleGetError(MId id) throws HardwareException { + var packet = callcmd(id.toInt(), CmdId.module_get_error.toInt()); + return A8kEcode.valueOf(packet.getContentI32(0)); + } + + public void moduleClearError(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.module_clear_error.toInt()); + } + + public void moduleActiveCfg(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.module_active_cfg.toInt()); + } + + + public void hbotEnable(MId mid, int enable) throws HardwareException { + callcmd(mid.toInt(), CmdId.xymotor_enable.toInt(), enable); + } + + public void hbotMoveBy(MId mid, int x, int y) throws HardwareException { + callcmd(mid.toInt(), CmdId.xymotor_move_by.toInt(), x, y); + } + + public void hbotMoveTo(MId mid, int x, int y) throws HardwareException { + callcmd(mid.toInt(), CmdId.xymotor_move_to.toInt(), x, y); + } + + public void hbotMoveToZero(MId mid) throws HardwareException { + callcmd(mid.toInt(), CmdId.xymotor_move_to_zero.toInt()); + } + + public Pos2d hbotReadPos(MId mid) throws HardwareException { + Pos2d pos = new Pos2d(0, 0); + var packet = callcmd(mid.toInt(), CmdId.xymotor_read_pos.toInt()); + pos.x = packet.getContentI32(0); + pos.y = packet.getContentI32(1); + return pos; + } + + public int hbotReadInio(MId mid) throws HardwareException { + var packet = callcmd(mid.toInt(), CmdId.xymotor_read_inio.toInt()); + return packet.getContentI32(0); + } + + public void hbotSetPos(MId mid, int x, int y) throws HardwareException { + callcmd(mid.toInt(), CmdId.xymotor_set_pos.toInt(), x, y); + } + + + public void hbotMoveByDirect(MId mid, int motor1_dpos, int motor2_dpos) throws HardwareException { + callcmd(mid.toInt(), CmdId.xymotor_motor_move_by_direct.toInt(), motor1_dpos, motor2_dpos); + } + + public int hbotReadEncDirect(MId mid) throws HardwareException { + var packet = callcmd(mid.toInt(), CmdId.xymotor_read_enc_direct.toInt()); + return packet.getContentI32(0); + } + + public int hbotReadInioIndexInStm32(MId mid, int ioIndex) throws HardwareException { + var packet = callcmd(mid.toInt(), CmdId.xymotor_read_inio_index_in_stm32.toInt(), ioIndex); + return packet.getContentI32(0); + } + + + // + // stepMotor + // + public void stepMotorEnable(MId mid, int enable) throws HardwareException { + callcmd(mid.toInt(), CmdId.step_motor_enable.toInt(), enable); + } + + public int stepMotorReadPos(MId id) throws HardwareException { + A8kPacket packet = callcmd(id.toInt(), CmdId.step_motor_read_pos.toInt()); + return packet.getContentI32(0); + } + + public void stepMotorEasyRotate(MId id, int direction) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_rotate.toInt(), direction); + } + + public void stepMotorEasyMoveBy(MId id, int dpos) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_move_by.toInt(), dpos); + } + + public void stepMotorEasyMoveByBlock(MId id, int dpos, Integer actionOvertime) throws HardwareException, InterruptedException { + stepMotorEasyMoveBy(id, dpos); + waitForMod(id, actionOvertime); + } + + public void stepMotorEasyMoveTo(MId id, int pos) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_move_to.toInt(), pos); + } + + public void stepMotorEasyMoveToBlock(MId id, int pos, Integer actionOvertime) throws HardwareException, InterruptedException { + stepMotorEasyMoveTo(id, pos); + waitForMod(id, actionOvertime); + } + + public void stepMotorEasyMoveToZero(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_move_to_zero.toInt()); + } + + public void stepMotorEasyMoveToZeroBlock(MId id, Integer actionOvertime) throws HardwareException, InterruptedException { + stepMotorEasyMoveToZero(id); + waitForMod(id, actionOvertime); + } + + public void stepMotorEasySetCurrentPos(MId id, int pos) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_set_current_pos.toInt(), pos); + } + + public void stepMotorEasyMoveToIo(MId id, int io) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_move_to_io.toInt(), io); + } + + // step_motor_easy_move_to_zero_point_quick + + public void stepMotorEasyMoveToZeroPointQuick(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_move_to_zero_point_quick.toInt()); + } + + public void stepMotorEasyMoveToZeroPointQuickBlock(MId id, Integer actionOvertime) throws HardwareException, InterruptedException { + stepMotorEasyMoveToZeroPointQuick(id); + waitForMod(id, actionOvertime); + } + + public void stepMotorStop(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_stop.toInt()); + } + + public void stepMotorActiveCfg(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_active_cfg.toInt()); + } + + public Boolean stepMotorReadIoState(MId id, int ioindex) throws HardwareException { + var packet = callcmd(id.toInt(), CmdId.step_motor_read_io_state.toInt(), ioindex); + return packet.getContentI32(0) != 0; + } + + public void stepMotorEasyMoveToEndPoint(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_move_to_end_point.toInt()); + } + + public void stepMotorEasyMoveToEndPointBlock(MId id, Integer actionOvertime) throws HardwareException, InterruptedException { + stepMotorEasyMoveToEndPoint(id); + waitForMod(id, actionOvertime); + } + + public void stepMotorEasyReciprocatingMotion(MId id, int startpos, int endpos, int times) throws HardwareException { + callcmd(id.toInt(), CmdId.step_motor_easy_reciprocating_motion.toInt(), startpos, endpos, times); + } + + public void stepMotorEasyReciprocatingMotionBlock(MId id, int startpos, int endpos, int times, Integer actionOvertime) throws HardwareException, InterruptedException { + stepMotorEasyReciprocatingMotion(id, startpos, endpos, times); + waitForMod(id, actionOvertime); + } + // + // MINI_SERVO + // + + public void miniServoEnable(MId id, int enable) throws HardwareException { + callcmd(id.toInt(), CmdId.mini_servo_enable.toInt(), enable); + } + + public int miniServoReadPos(MId id) throws HardwareException { + var packet = callcmd(id.toInt(), CmdId.mini_servo_read_pos.toInt()); + return packet.getContentI32(0); + } + + + public void miniServoActiveCfg(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.mini_servo_active_cfg.toInt()); + } + + public void miniServoStop(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.mini_servo_stop.toInt()); + } + + public void miniServoSetMidPoint(MId id) throws HardwareException { + callcmd(id.toInt(), CmdId.mini_servo_set_mid_point.toInt()); + } + + public int miniServoReadIoState(MId id) throws HardwareException { + var packet = callcmd(id.toInt(), CmdId.mini_servo_read_io_state.toInt()); + return packet.getContentI32(0); + } + + public void miniServoMoveTo(MId id, int pos) throws HardwareException { + callcmd(id.toInt(), CmdId.mini_servo_move_to.toInt(), pos); + } + + public void miniServoMoveToBlock(MId id, int pos, Integer actionOvertime) throws HardwareException, InterruptedException { + miniServoMoveTo(id, pos); + waitForMod(id, actionOvertime); + } + + public void miniServoRotate(MId id, int direction) throws HardwareException { + callcmd(id.toInt(), CmdId.mini_servo_rotate.toInt(), direction); + } + + public void miniServoRotateBlock(MId id, int direction, Integer actionOvertime) throws HardwareException, InterruptedException { + miniServoRotate(id, direction); + waitForMod(id, actionOvertime); + } + + public void miniServoRotateWithTorque(MId id, int torque) throws HardwareException { + callcmd(id.toInt(), CmdId.mini_servo_rotate_with_torque.toInt(), torque); + } + + public void miniServoRotateWithTorqueBlock(MId id, int torque, Integer actionOvertime) throws HardwareException, InterruptedException { + miniServoRotateWithTorque(id, torque); + miniServoWaitIsNotMove(id, actionOvertime); + } + + public void miniServoWaitIsNotMove(MId id, int acitionOvertime) throws HardwareException, InterruptedException { + long startedAt = System.currentTimeMillis(); + do { + var isMove = moduleGetReg(id, RegIndex.kreg_mini_servo_is_move); + if (isMove != 0) { + break; + } + long now = System.currentTimeMillis(); + if (now - startedAt > acitionOvertime) { + throw new HardwareException(id, A8kEcode.Overtime); + } + + } while (true); + } + + public Boolean getIOState(IOId ioid) throws HardwareException { + if (ioid.mtype == ModuleType.kboard) { + return callcmd(ioid.mid.toInt(), CmdId.extboard_read_inio.toInt(), ioid.ioIndex).getContentI32(0) != 0; + } else if (ioid.mtype == ModuleType.ktmc_step_motor) { + return callcmd(ioid.mid.toInt(), CmdId.step_motor_read_io_state.toInt(), ioid.ioIndex).getContentI32(0) != 0; + } else if (ioid.mtype == ModuleType.kmini_servo_motor_module) { + return callcmd(ioid.mid.toInt(), CmdId.mini_servo_read_io_state.toInt(), ioid.ioIndex).getContentI32(0) != 0; + } else { + throw new HardwareException(ioid.mid, A8kEcode.IllegalOperation); + } + } + + public void setIOState(IOId ioid, boolean val) throws HardwareException { + if (ioid.mtype == ModuleType.kboard) { + callcmd(ioid.mid.toInt(), CmdId.extboard_write_outio.toInt(), ioid.ioIndex, val ? 1 : 0); + } else { + throw new HardwareException(ioid.mid, A8kEcode.IllegalOperation); + } + } + + + public void waitForMods(MId[] mids, Integer acitionOvertime) throws InterruptedException, HardwareException { + for (MId mid : mids) { + waitForMod(mid, acitionOvertime); + } + } + + public void waitForMod(MId mid, Integer acitionOvertime) throws InterruptedException, HardwareException { + long startedAt = System.currentTimeMillis(); + // Thread.sleep(300); + // CmdId action = lastCmdMap.get(mid); + CmdId action = lastCmdMapGet(mid); + do { + + try { + var status = getModuleStatus(mid); + if (status == ModuleStatus.IDLE) { + break; + } else if (status == ModuleStatus.ERROR) { + logger.error("{} waitting for action {} , catch error {}", mid, action, moduleGetError(mid)); + throw new HardwareException(mid, moduleGetError(mid)); + } + } catch (HardwareException ignored) { + } + long now = System.currentTimeMillis(); + if (now - startedAt > acitionOvertime) { + logger.error("{} waitting for action {} overtime", mid, action); + try {moduleStop(mid);} catch (HardwareException ignored) {} + throw new HardwareException(mid, A8kEcode.ActionOvertime); + } + Thread.sleep(100); + } while (true); + } + + public A8kPacket callcmd(Integer moduleId, Integer cmdId) throws HardwareException { + return this.callcmd(moduleId, cmdId, new Integer[]{}); + } + + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0) throws HardwareException { + return this.callcmd(moduleId, cmdId, new Integer[]{p0}); + } + + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1) throws HardwareException { + return this.callcmd(moduleId, cmdId, new Integer[]{p0, p1}); + } + + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2) throws HardwareException { + return this.callcmd(moduleId, cmdId, new Integer[]{p0, p1, p2}); + } + + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer p0, Integer p1, Integer p2, Integer p3) throws HardwareException { + return this.callcmd(moduleId, cmdId, new Integer[]{p0, p1, p2, p3}); + } + + + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer[] params) throws HardwareException { + var packet = packParamsToPacket(moduleId, cmdId, params); + return sendCmdAutoResend(packet, A8kPacket.CMD_OVERTIME); + } + + public A8kPacket sendCmdAutoResend(A8kPacket pack, int overtime) throws HardwareException { + // 调用sendCmd, + // 如果捕获到超时异常,则重发,最多重发三次 + // 如果是其他异常,则直接抛出异常。 + for (int i = 0; i < 5; i++) { + try { + return this.sendCmd(pack, A8kPacket.CMD_OVERTIME); + } catch (HardwareException e) { + if (e.getErrorCode() != A8kEcode.Overtime) { + throw e; + } + } + try { + Thread.sleep(100); + } catch (InterruptedException ignore) { + } + } + throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); + } + + public void callblockcmd(Integer moduleId, Integer cmdId, Integer[] params, int acitionOvertime) throws HardwareException, InterruptedException { + var packet = this.packParamsToPacket(moduleId, cmdId, params); + this.sendCmdAutoResend(packet, A8kPacket.CMD_OVERTIME); + + // 调用sendCmdAutoResend + // 通过kmodule_get_status判断指令是否完成,超时未完成则报错,则调用module_stop,同时抛出异常 + // + + long startedAt = System.currentTimeMillis(); + do { + var pack = this.callcmd(moduleId, CmdId.module_get_status.toInt(), new Integer[]{}); + var status = pack.getContentI32(0); + if (0 == status) { + break; + } + + long now = System.currentTimeMillis(); + if (now - startedAt > acitionOvertime) { + throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); + } + + Thread.sleep(100); + } while (true); + } + + private A8kPacket sendCmd(A8kPacket pack, int overtime) throws HardwareException { + pack.setPacketIndex(packetIndex); + waitingReceiptIndex = packetIndex; + packetIndex = packetIndex + 1; + if (packetIndex > 10000) { + packetIndex = 1; + } + receiptQueue.clear(); + isWaitingReceipt = true; + String txpacket = pack.toByteString(); + + CmdId cmdid = CmdId.valueOf(pack.getCmdId()); + if (cmdid == null) { + throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.CmdIdNotSupport); + } + if (debugFlag && !cmdid.notTrace) { + String packstr = pack.toString(); + logger.info("Tx:|RAW:{}| {}", txpacket, packstr); + } + + if (cmdid.actionCmd) { + lastCmdMapPut(MId.valueOf(pack.getModuleId()), CmdId.valueOf(pack.getCmdId())); + } + + + client.send(txpacket); + A8kPacket receipt; + try { + receipt = receiptQueue.poll(overtime, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + isWaitingReceipt = false; + throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); + } + isWaitingReceipt = false; + if (receipt == null) { + throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); + } + + if (receipt.getPacketType() == A8kPacket.PACKET_TYPE_ERROR_ACK) { + throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.valueOf(receipt.getContentI32(0))); + } + try { + Thread.sleep(10); + } catch (InterruptedException ignored) { + } + return receipt; + } + + /** + * + */ + private void processMessage(String s) { + byte[] rx = ByteArray.hexStringToBytes(s); + if (rx == null || rx.length == 0) { + logger.warn("rx is empty"); + return; + } + + if (rx.length < A8kPacket.PACKET_MIN_LEN) { + logger.warn("rx is too short"); + return; + } + + A8kPacket packet = new A8kPacket(rx); + + CmdId cmdid = CmdId.valueOf(packet.getCmdId()); + if (cmdid == null) { + logger.warn("Rx packet cmdid not support: {}", packet.getCmdId()); + return; + } + + if (debugFlag && !cmdid.notTrace) { + logger.info("RX |RAW:{}| {}", s, packet); + } + + if (packet.getPacketType() == A8kPacket.PACKET_TYPE_ACK || packet.getPacketType() == A8kPacket.PACKET_TYPE_ERROR_ACK) { + if (isWaitingReceipt) { + if (waitingReceiptIndex == packet.getPacketIndex()) { + receiptQueue.add(packet); + } + } + } + + if (packet.getPacketType() == A8kPacket.PACKET_TYPE_EVENT) { + if (eventBusService != null) { + eventBusService.pushEvent(new A8kHardwareReport(packet)); + } + } + } + + synchronized void lastCmdMapPut(MId mid, CmdId cmdId) { + lastCmdMap.put(mid, cmdId); + } + + synchronized CmdId lastCmdMapGet(MId mid) { + return lastCmdMap.get(mid); + } + // + // public static void main(String[] args) { + // A8kCanBusService service = new A8kCanBusService(); + // try { + // service.init(); + // } catch (URISyntaxException e) { + // logger.error(e.getMessage()); + // } + // + // Thread thread = new Thread(() -> { + // while (true) { + // A8kPacket packet = null; + // try { + // packet = service.receiptQueue.take(); + // logger.info("poll receipt {}", packet); + // } catch (InterruptedException e) { + // throw new RuntimeException(e); + // } + // } + // }); + // thread.start(); + // } + +} diff --git a/src/main/java/a8k/canbus/A8kModParamInitializer.java b/src/main/java/a8k/canbus/A8kModParamInitializer.java new file mode 100644 index 0000000..f60f2d7 --- /dev/null +++ b/src/main/java/a8k/canbus/A8kModParamInitializer.java @@ -0,0 +1,16 @@ +package a8k.canbus; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class A8kModParamInitializer { + static Logger logger = LoggerFactory.getLogger(A8kModParamInitializer.class); + + public void init() { + logger.info("A8kModInitializer init"); + } + + +} diff --git a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java new file mode 100644 index 0000000..484cde6 --- /dev/null +++ b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java @@ -0,0 +1,7 @@ +package a8k.canbus.custom_param_mgr; + +public class A8kModCustomParam { + public A8kModCustomParamId id; + public Integer value; + +} diff --git a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java new file mode 100644 index 0000000..e4efea0 --- /dev/null +++ b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java @@ -0,0 +1,14 @@ +package a8k.canbus.custom_param_mgr; + +public enum A8kModCustomParamId { + + MOTOR_STANDY_POS_COMPENSATE("电机待机位置零点补偿"),//待机位置 = 零点- 零点补偿 + ; + public final String desc; + public final Integer defaultVal; + + A8kModCustomParamId(String desc) { + this.desc = desc; + this.defaultVal = 0; + } +} diff --git a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java new file mode 100644 index 0000000..3b703f3 --- /dev/null +++ b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java @@ -0,0 +1,25 @@ +package a8k.canbus.custom_param_mgr; + +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +public class A8kModCustomParamMgr { + + Map customParamMap; + + public Integer getCustomParam(A8kModCustomParamId id) { + var vaule = customParamMap.get(id); + if (vaule != null) { + return vaule.value; + } else { + return id.defaultVal; + } + + } + + public void setCustomParam(A8kModCustomParam param) { + customParamMap.put(param.id, param); + } +} diff --git a/src/main/java/a8k/canbus/protocol/A8kEcode.java b/src/main/java/a8k/canbus/protocol/A8kEcode.java new file mode 100644 index 0000000..609374b --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/A8kEcode.java @@ -0,0 +1,135 @@ +package a8k.canbus.protocol; + +public enum A8kEcode { + // + // FOR APP + // + Success(0, "成功"), // + TubeNotHasHat(1, "全血试管未盖帽"), // + SampleLiquidLevelWasNotDetected(2, "取样时未探测到液面"),// + LargeBufferNotEnough(3, "大瓶缓冲液不足"), // + PasswdError(4, "密码错误"), // + UserDoesNotExist(5, "用户不存在"), // + GripperMPosError(6, "抓手舵机位置异常"), // + GripperZMPosError(8, "抓手升降电机位置异常"), // + GripperYMPosError(9, "抓手前后移动舵机位置异常"),// + TubesInShakeModule(10, "摇匀模组位置有试管"),// + PlateStuckDetectorSensorTrigger(11, "卡板检查光电触发"),// + PlateBoxNotCover(12, "板夹仓盖子未关闭"),// + PullerMInitPosError(13, "板夹钩爪电机没有处于转盘中央"),// + PusherMInitPosError(14, "板夹仓推杆电机没有处于零点位置"),// + RecycleBinOverflow(15, "回收仓满"),// + MotorLostStep(16, "电机丢步"),// + ActionOvertime(17, "动作执行超时"),// + CodeException(18, "代码异常"),// + ShakeModGripperZMNotInZeroPos(19, "抓手升降电机没有在零位"),// + MNotInZeroPos(20, "电机没有在零点"),// + TubeXChannelIsNotEmpty(21, "试管架平移通道不为空"),// + TubeTypeNotSupport(22, "试管类型不支持"),// + CmdIdNotSupport(23, "不支持指令"),// + // + // FOR HARDWARE + // + + HardwareError(1001, "HardwareError"),// + ParamOutOfRange(1102, "ParamOutOfRange"),// + CmdNotSupport(1103, "CmdNotSupport"),// + DeviceIsBusy(1104, "DeviceIsBusy"),// + DeviceIsOffline(1105, "DeviceIsOffline"),// + Overtime(1106, "Overtime"),// + Noack(1107, "Noack"),// + Errorack(1108, "Errorack"),// + DeviceOffline(1109, "DeviceOffline"),// + SubdeviceOvertime(1111, "SubdeviceOvertime"),// + BufferNotEnough(1112, "BufferNotEnough"),// + CmdParamNumError(1114, "CmdParamNumError"),// + CheckcodeIsError(1115, "CheckcodeIsError"),// + IllegalOperation(1116, "IllegalOperation"),// + ModuleOpeationBreakByUser(1202, "ModuleOpeationBreakByUser"),// + ModuleNotFindReg(1207, "ModuleNotFindReg"),// + XYMotorXFindZeroEdgeFail(1306, "XYMotorXFindZeroEdgeFail"),// + XYMotorYFindZeroEdgeFail(1307, "XYMotorYFindZeroEdgeFail"),// + XYMotorNotEnable(1308, "XYMotorNotEnable"),// + XYMotorTargetPosOutofRange(1309, "XYMotorTargetPosOutofRange"),// + PipetteErrorNoerror(1400, "PipetteErrorNoerror"),// + PipetteErrorInitfail(1401, "PipetteErrorInitfail"),// + PipetteErrorInvalidcmd(1402, "PipetteErrorInvalidcmd"),// + PipetteErrorInvalidarg(1403, "PipetteErrorInvalidarg"),// + PipetteErrorPressuresensorerror(1404, "PipetteErrorPressuresensorerror"),// + PipetteErrorOverpressure(1405, "PipetteErrorOverpressure"),// + PipetteErrorLlderror(1406, "PipetteErrorLlderror"),// + PipetteErrorDevicenotinit(1407, "PipetteErrorDevicenotinit"),// + PipetteErrorTippoperror(1408, "PipetteErrorTippoperror"),// + PipetteErrorPumpoverload(1409, "PipetteErrorPumpoverload"),// + PipetteErrorTipdrop(1410, "PipetteErrorTipdrop"),// + PipetteErrorCanbuserror(1411, "PipetteErrorCanbuserror"),// + PipetteErrorInvalidchecksum(1412, "PipetteErrorInvalidchecksum"),// + PipetteErrorEepromerror(1413, "PipetteErrorEepromerror"),// + PipetteErrorCmdbufferempty(1414, "PipetteErrorCmdbufferempty"),// + PipetteErrorCmdbufferoverflow(1415, "PipetteErrorCmdbufferoverflow"),// + PipetteErrorTipblock(1416, "PipetteErrorTipblock"),// + PipetteErrorAirsuction(1417, "PipetteErrorAirsuction"),// + PipetteErrorBubble(1418, "PipetteErrorBubble"),// + PipetteErrorVolumeerror(1419, "PipetteErrorVolumeerror"),// + PipetteErrorTipalreadyload(1420, "PipetteErrorTipalreadyload"),// + PipetteErrorTiploadfail(1421, "PipetteErrorTiploadfail"),// + PipetteErrorUninited(1501, "PipetteErrorUninited"),// + PipetteErrorNotLldPrepare(1502, "PipetteErrorNotLldPrepare"),// + PipetteErrorTipisloadWhenLldPrepare(1500, "PipetteErrorTipisloadWhenLldPrepare"),// + PipetteErrorPumpLoadValIsNotEmpty(1503, "PipetteErrorPumpLoadValIsNotEmpty"),// + StepMotorNotFoundZeroPoint(1600, "StepMotorNotFoundZeroPoint"),// + StepMotorNotGoZero(1601, "StepMotorNotGoZero"),// + StepMotorOverTemperature(1602, "StepMotorOverTemperature"),// + StepMotorOverVoltage(1603, "StepMotorOverVoltage"),// + StepMotorRunOvertime(1604, "StepMotorRunOvertime"),// + StepMotorNotEnable(1605, "StepMotorNotEnable"),// + StepMotorIoindexOutOfRange(1606, "StepMotorIoindexOutOfRange"),// + StepMotorSubicReset(1607, "StepMotorSubicReset"),// + StepMotorDrvErr(1608, "StepMotorDrvErr"),// + StepMotorUvCp(1609, "StepMotorUvCp"),// + StepMotorNotFoundPointEdge(1610, "StepMotorNotFoundPointEdge"),// + StepMotorLostStep(1611, "StepMotorLostStep"),// + MiniServoNotEnable(1700, "MiniServoNotEnable"),// + MiniServoModeNotSupport(1701, "MiniServoModeNotSupport"),// + FanHardwareFault(1800, "FanHardwareFault"),// + WaterCoolingFanError(1900, "WaterCoolingFanError"),// + WaterCoolingTemperatureSensorError(1902, "WaterCoolingTemperatureSensorError"),// + WaterCoolingPumpIsError(1903, "WaterCoolingPumpIsError"),// + WaterCoolingPelterIsError(1904, "WaterCoolingPelterIsError"), + ; + + public int index; + public String chname; + + A8kEcode(int index, String chname) { + this.index = index; + this.chname = chname; + } + + public int toInt() { + return index; + } + + public static A8kEcode valueOf(int val) { + A8kEcode[] values = A8kEcode.values(); + for (A8kEcode e : values) { + if (e.toInt() == val) + return e; + } + return null; + } + + public static String toString(int val) { + A8kEcode[] values = A8kEcode.values(); + for (A8kEcode e : values) { + if (e.toInt() == val) { + return e.toString(); + } + } + return "unkown(" + val + ")"; + } + + public String getChname() { + return chname; + } +} diff --git a/src/main/java/a8k/canbus/protocol/A8kPacket.java b/src/main/java/a8k/canbus/protocol/A8kPacket.java new file mode 100644 index 0000000..e90a980 --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/A8kPacket.java @@ -0,0 +1,130 @@ +package a8k.canbus.protocol; + +import a8k.utils.ByteArray; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class A8kPacket { + /** + * typedef struct { + * uint16_t packetindex; // 0: + * uint16_t cmdMainId; // 2: + * uint8_t cmdSubId; // 4: + * uint8_t packetType; // 5: + * uint16_t moduleid; // 6: + * uint8_t data[]; // 8: + * } zcr_cmd_header_t; + *

+ * kptv2_cmd = 0, + * kptv2_ack = 1, + * kptv2_error_ack = 2, + * kptv2_event = 3, + */ + public static final Logger logger = LoggerFactory.getLogger(A8kPacket.class); + + + byte[] raw; + + public static final int PACKET_MIN_LEN = 8; + + public static final int PACKET_INDEX_OFF = 0; + public static final int CMD_ID_OFF = 2; + public static final int PACKET_TYPE_OFF = 5; + public static final int MODULE_ID_OFF = 6; + public static final int DATA_BEGIN_OFF = 8; + + + public static final int PACKET_TYPE_CMD = 0; + public static final int PACKET_TYPE_ACK = 1; + public static final int PACKET_TYPE_ERROR_ACK = 2; + public static final int PACKET_TYPE_EVENT = 3; + + public static final int CMD_OVERTIME = 2000; + + public A8kPacket(byte[] cmd) { + raw = new byte[cmd.length]; + System.arraycopy(cmd, 0, raw, 0, cmd.length); + } + + public void setPacketIndex(int packetIndex) { + ByteArray.setU16bit(raw, 0, packetIndex); + } + + public int getPacketIndex() { + return ByteArray.readU16bit(raw, 0); + } + + public int getCmdId() { + return ByteArray.readU16bit((raw), 2) * 256 + ByteArray.readU8bit(raw, 4); + } + + public int getPacketType() { + return ByteArray.readU8bit(raw, 5); + } + + public int getModuleId() { + return ByteArray.readU16bit(raw, 6); + } + + public byte[] getCmdContent() { + if (raw.length < 8) { + return new byte[0]; + } + byte[] cmdcontent = new byte[raw.length - 8]; + System.arraycopy(raw, 8, cmdcontent, 0, raw.length - 8); + return cmdcontent; + } + + public int getContentI32(int index) { + return ByteArray.read32bit(raw, 8 + index * 4); + } + + public String toByteString() { + return ByteArray.toByteString(raw); + } + + public String toString() { + int packetType = getPacketType(); + String ret = ""; + + CmdId cmdId = CmdId.valueOf(getCmdId()); + assert cmdId != null; + if (packetType == PACKET_TYPE_CMD) { + if (cmdId.cmdAttachType == CmdId.ATTACH_IS_INT32) { + ret = String.format("[CMD ] index:[%d] (%s %s(%d) :param:[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), formatInt32ATTACH(getCmdContent())); + } else { + ret = String.format("[CMD ] index:[%d] (%s %s(%d) :param:[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), ByteArray.toByteString(getCmdContent())); + } + } else if (packetType == PACKET_TYPE_ACK) { + if (cmdId.receiptAttachType == CmdId.ATTACH_IS_INT32) { + ret = String.format("[ACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, formatInt32ATTACH(getCmdContent())); + } else { + ret = String.format("[ACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, ByteArray.toByteString(getCmdContent())); + } + } else if (packetType == PACKET_TYPE_ERROR_ACK) { + ret = String.format("[EACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, A8kEcode.toString(getContentI32(0))); + } else if (packetType == PACKET_TYPE_EVENT) { + if (cmdId.cmdAttachType == CmdId.ATTACH_IS_INT32) { + ret = String.format("[EVENT] index:[%d] (%s %s(%d) :[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), formatInt32ATTACH(getCmdContent())); + } else { + ret = String.format("[EVENT] index:[%d] (%s %s(%d) :[%s])", getPacketIndex(), cmdId, MId.valueOf(getModuleId()), getModuleId(), ByteArray.toByteString(getCmdContent())); + } + } else { + ret = String.format("Unknown packet type: %d", packetType); + } + return ret; + } + + private String formatInt32ATTACH(byte[] attach) { + StringBuilder ret = new StringBuilder(); + for (int i = 0; i < attach.length; i += 4) { + if (i + 3 >= attach.length) + break; + if (i != 0) + ret.append(","); + ret.append(String.format("%d", ByteArray.read32bit(attach, i))); + } + return ret.toString(); + } + +} diff --git a/src/main/java/a8k/canbus/protocol/CmdId.java b/src/main/java/a8k/canbus/protocol/CmdId.java new file mode 100644 index 0000000..1964d5c --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/CmdId.java @@ -0,0 +1,211 @@ +package a8k.canbus.protocol; + +public enum CmdId { + + + NotSet(0xFFFF, "noAction"),// + + board_reset(0x0000, "board_reset"),// + event_bus_reg_change_report(0x0064, "event_bus_reg_change_report"),// + // + module_ping(0x0100, "module_ping"),// + module_get_status(0x0104, "module_get_status", false),// + module_stop(0x0101, "module_stop"),// + module_set_reg(0x0105, "module_set_reg"),// + module_get_reg(0x0106, "module_get_reg"),// + module_get_error(0x010a, "module_get_error", true),// + module_clear_error(0x010b, "module_clear_error"),// + module_active_cfg(0x0110, "module_active_cfg"),// + // + xymotor_enable(0x0301, "xymotor_enable"),// + xymotor_move_by(0x0302, "xymotor_move_by"),// + xymotor_move_to(0x0303, "xymotor_move_to"),// + xymotor_move_to_zero(0x0304, "xymotor_move_to_zero"),// + xymotor_read_pos(0x0306, "xymotor_read_pos"),// + xymotor_read_inio_index_in_stm32(0x0307, "xymotor_read_inio_index_in_stm32"),// + xymotor_read_inio(0x0308, "xymotor_read_inio", true),// + xymotor_set_pos(0x0309, "xymotor_set_pos"),// + xymotor_motor_move_by_direct(0x030a, "xymotor_motor_move_by_direct"),// + xymotor_read_enc_direct(0x030b, "xymotor_read_enc_direct"),// + // + pipette_ctrl_init_device(0x7201, "pipette_ctrl_init_device"),// + pipette_ctrl_put_tip(0x7202, "pipette_ctrl_put_tip"),// + pipette_ctrl_move_to_ul(0x7203, "pipette_ctrl_move_to_ul"),// + pipette_lld_prepare(0x7204, "pipette_lld_prepare"),// + pipette_plld(0x7205, "pipette_plld"),// + pipette_clld(0x7206, "pipette_clld"),// + pipette_mlld(0x7207, "pipette_mlld"),// + pipette_lld_is_detect_liquid(0x7208, "pipette_lld_is_detect_liquid"),// + pipette_aspirate(0x7209, "pipette_aspirate"),// + pipette_distribut(0x720a, "pipette_distribut"),// + pipette_shake_up(0x720b, "pipette_shake_up"),// + pipette_enable_zmotor(0x7214, "pipette_enable_zmotor"),// + pipette_write_cmd_direct(0x7215, "pipette_write_cmd_direct"),// + pipette_get_sensor_sample_data(0x7216, "pipette_get_sensor_sample_data"),// + pipette_get_sensor_sample_data_num(0x7217, "pipette_get_sensor_sample_data_num"),// + pipette_sensor_sample_data_report(0x7232, "pipette_sensor_sample_data_report"),// + pipette_aspirate_llf(0x720c, "pipette_aspirate_llf"),// + pipette_distribut_llf(0x720d, "pipette_distribut_llf"),// + pipette_shake_up_llf(0x720e, "pipette_shake_up_llf"),// + // + a8000_optical_module_power_ctrl(0x0600, "a8000_optical_module_power_ctrl"),// + a8000_optical_open_laser(0x0601, "a8000_optical_open_laser"),// + a8000_optical_close_laser(0x0602, "a8000_optical_close_laser"),// + a8000_optical_set_laster_gain(0x0603, "a8000_optical_set_laster_gain"),// + a8000_optical_set_scan_amp_gain(0x0604, "a8000_optical_set_scan_amp_gain"),// + a8000_optical_read_scanner_adc_val(0x0605, "a8000_optical_read_scanner_adc_val"),// + a8000_optical_read_laster_adc_val(0x0606, "a8000_optical_read_laster_adc_val"),// + a8000_optical_scan_current_point_amp_adc_val(0x0607, "a8000_optical_scan_current_point_amp_adc_val"),// + a8000_optical_start_capture(0x0608, "a8000_optical_start_capture"),// + a8000_optical_read_raw(0x0609, "a8000_optical_read_raw", CmdId.ATTACH_IS_INT32, CmdId.ATTACH_IS_BYTES),// + // + a8k_opt_v2_t_start_scan(0x0700, "a8k_opt_v2_t_start_scan"),// + a8k_opt_v2_f_start_scan(0x0701, "a8k_opt_v2_f_start_scan"),// + a8k_opt_v2_t_open_laster(0x070a, "a8k_opt_v2_t_open_laster"),// + a8k_opt_v2_t_close_laster(0x070b, "a8k_opt_v2_t_close_laster"),// + a8k_opt_v2_t_readVal(0x070c, "a8k_opt_v2_t_readVal"),// + a8k_opt_v2_f_open_laster(0x070d, "a8k_opt_v2_f_open_laster"),// + a8k_opt_v2_f_close_laster(0x070e, "a8k_opt_v2_f_close_laster"),// + a8k_opt_v2_f_readVal(0x070f, "a8k_opt_v2_f_readVal"),// + // + step_motor_enable(0x0201, "step_motor_enable"),// + step_motor_read_pos(0x020b, "step_motor_read_pos"),// + step_motor_easy_rotate(0x0211, "step_motor_easy_rotate"),// + step_motor_easy_move_by(0x0212, "step_motor_easy_move_by"),// + step_motor_easy_move_to(0x0213, "step_motor_easy_move_to"),// + step_motor_easy_move_to_zero(0x0214, "step_motor_easy_move_to_zero"),// + step_motor_easy_set_current_pos(0x0215, "step_motor_easy_set_current_pos"),// + step_motor_easy_move_to_io(0x0216, "step_motor_easy_move_to_io"),// + step_motor_stop(0x0228, "step_motor_stop"),// + step_motor_active_cfg(0x0229, "step_motor_active_cfg"),// + step_motor_read_io_state(0x022a, "step_motor_read_io_state", true),// + step_motor_easy_move_to_end_point(0x022c, "step_motor_easy_move_to_end_point"),// + step_motor_read_tmc5130_status(0x0232, "step_motor_read_tmc5130_status"),// + step_motor_read_tmc5130_state(0x0233, "step_motor_read_tmc5130_state"),// + step_motor_read_io_index_in_stm32(0x0238, "step_motor_read_io_index_in_stm32"),// + step_motor_set_subdevice_reg(0x0239, "step_motor_set_subdevice_reg"),// + step_motor_get_subdevice_reg(0x023a, "step_motor_get_subdevice_reg"),// + step_motor_easy_reciprocating_motion(0x022d, "step_motor_easy_reciprocating_motion"),// + step_motor_easy_move_to_zero_point_quick(0x022e, "step_motor_easy_move_to_zero_point_quick"),// + // + mini_servo_enable(0x6601, "mini_servo_enable"),// + mini_servo_read_pos(0x6602, "mini_servo_read_pos"),// + mini_servo_active_cfg(0x6603, "mini_servo_active_cfg"),// + mini_servo_stop(0x6604, "mini_servo_stop"),// + mini_servo_set_mid_point(0x6607, "mini_servo_set_mid_point"),// + mini_servo_read_io_state(0x6608, "mini_servo_read_io_state"),// + mini_servo_move_to(0x6609, "mini_servo_move_to"),// + mini_servo_rotate(0x660a, "mini_servo_rotate"),// + mini_servo_rotate_with_torque(0x660b, "mini_servo_rotate_with_torque"),// + mini_servo_set_cur_pos(0x660c, "mini_servo_set_cur_pos"),// + // + extboard_read_inio(0x6701, "extboard_read_inio", true),// + extboard_write_outio(0x6702, "extboard_write_outio"),// + extboard_read_muti_inio(0x6703, "extboard_read_muti_inio", true),// + extboard_read_inio_index_in_stm32(0x6704, "extboard_read_inio_index_in_stm32"),// + extboard_read_outio_index_in_stm32(0x6705, "extboard_read_outio_index_in_stm32"),// + extboard_read_outio(0x6706, "extboard_read_outio"),// + code_scaner_start_scan(0x6801, "code_scaner_start_scan"),// + code_scaner_stop_scan(0x6802, "code_scaner_stop_scan"),// + code_scaner_result_is_ready(0x6803, "code_scaner_result_is_ready"),// + code_scaner_read_scaner_result(0x6804, "code_scaner_read_scaner_result"),// + code_scaner_get_result_length(0x6805, "code_scaner_get_result_length"),// + // + fan_controler_set_speed(0x6900, "fan_controler_set_speed"),// + // + temp_controler_start_hearting(0x7000, "temp_controler_start_hearting"),// + temp_controler_stop_hearting(0x7001, "temp_controler_stop_hearting"),// + temp_controler_set_peltier_power_level(0x7002, "temp_controler_set_peltier_power_level"),// + temp_controler_set_pump_level(0x7003, "temp_controler_set_pump_level"),// + temp_controler_set_fan_level(0x7004, "temp_controler_set_fan_level"),// + temp_controler_enable_log(0x7005, "temp_controler_enable_log"),// + // + a8000_idcard_reader_read_raw(0x7100, "a8000_idcard_reader_read_raw", CmdId.ATTACH_IS_INT32, CmdId.ATTACH_IS_BYTES),// + a8000_idcard_write_raw(0x7101, "a8000_idcard_write_raw", CmdId.ATTACH_IS_BYTES, CmdId.ATTACH_IS_INT32),// + a8000_idcard_erase(0x7102, "a8000_idcard_erase"),// + a8000_idcard_earse_unlock(0x7103, "a8000_idcard_earse_unlock"),// + // + event_a8000_idcard_online(0x71c8, "event_a8000_idcard_online"),// + event_a8000_idcard_offline(0x71c9, "event_a8000_idcard_offline"),// + // + plate_code_scaner_push_card_and_scan(0x7301, "plate_code_scaner_push_card_and_scan"),// + plate_code_scaner_stop_scan(0x7302, "plate_code_scaner_stop_scan"),// + plate_code_scaner_read_result(0x7303, "plate_code_scaner_read_result"),// + plate_code_scaner_read_result_point_num(0x7304, "plate_code_scaner_read_result_point_num"),// + plate_code_scaner_read_code(0x7305, "plate_code_scaner_read_code"),// + plate_code_scaner_adc_readraw(0x7306, "plate_code_scaner_adc_readraw"),// + plate_code_scaner_open_laser(0x7307, "plate_code_scaner_open_laser"),// + plate_code_scaner_close_laser(0x7308, "plate_code_scaner_close_laser"),// + ; + + public final static int ATTACH_IS_BYTES = 1; + public final static int ATTACH_IS_INT32 = 2; + + public int index; + public String chName; + public int cmdAttachType = ATTACH_IS_INT32; + public int receiptAttachType = ATTACH_IS_INT32; + public boolean notTrace = false; + public boolean actionCmd = true; + + CmdId(int index, String chname) { + this.index = index; + this.chName = chname; + } + + CmdId(int index, String chname, boolean notTrace) { + this.index = index; + this.chName = chname; + this.notTrace = notTrace; + this.actionCmd = !notTrace; + } + + CmdId(int index, String chname, int cmdAttachType, int receiptAttachType) { + this.index = index; + this.chName = chname; + this.cmdAttachType = cmdAttachType; + this.receiptAttachType = receiptAttachType; + } + + CmdId(int index, String chname, int cmdAttachType, int receiptAttachType, boolean notTrace) { + this.index = index; + this.chName = chname; + this.cmdAttachType = cmdAttachType; + this.receiptAttachType = receiptAttachType; + this.notTrace = notTrace; + } + + + public int toInt() { + return index; + } + + public static CmdId valueOf(int val) { + CmdId[] values = CmdId.values(); + for (CmdId e : values) { + if (e.toInt() == val) + return e; + } + return null; + } + + public static String toString(int val) { + CmdId[] values = CmdId.values(); + for (CmdId e : values) { + if (e.toInt() == val) { + return e.toString(); + } + } + return "unkown(" + val + ")"; + } + + public String getChname() { + return chName; + } + + public Boolean eq(Integer index) { + return this.index == index; + } + + +} diff --git a/src/main/java/a8k/canbus/protocol/IOId.java b/src/main/java/a8k/canbus/protocol/IOId.java new file mode 100644 index 0000000..e619741 --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/IOId.java @@ -0,0 +1,38 @@ +package a8k.canbus.protocol; + +public enum IOId { + TubeHeightPPS(ModuleType.kboard, MId.FeedingModBoard, 0), //高低试管检测IO + THChOuterPPS(ModuleType.kboard, MId.FeedingModBoard, 1),//试管架转移通道有无检测 外 + THChInterPPS(ModuleType.kboard, MId.FeedingModBoard, 2),//试管架转移通道有无检测 内 + OutfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 3),//试管出料位置 试管架有无检测 + TubeExistPPS(ModuleType.kboard, MId.FeedingModBoard, 4),//试管有无光电 + InfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 5),//试管架入料位置 试管架有无检测 + + RecycleBinOverflowPPS(ModuleType.kboard, MId.PlatesBoxTCMBoard, 2),//废料桶满溢检测 + RecycleBinOverflowPPSPowerCtrl(ModuleType.kboard, MId.PlatesBoxTCMBoard, 0),//废料桶光栅电源 + + PlateBoxCoverClosurePPS(ModuleType.kboard, MId.PlatesBoxBoard, 0),//板夹仓舱盖闭合检测 + PlateBoxPlateStuckPPS(ModuleType.kboard, MId.PlatesBoxBoard, 1),//板夹仓卡板检测 + + //转盘逻辑相关光电 + //钩板电机,零点光电,终点光电 + PullerMZeroPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 0),// + PullerMEndPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 1),// + //推板电机,零点光电,终点光电 + PusherMZeroPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 0),// + PusherMEndPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 1),// + + ; + + + final public ModuleType mtype; + final public MId mid; + final public int ioIndex; + + IOId(ModuleType mtype, MId mid, int ioIndex) { + this.mtype = mtype; + this.mid = mid; + this.ioIndex = ioIndex; + } + +} diff --git a/src/main/java/a8k/canbus/protocol/MId.java b/src/main/java/a8k/canbus/protocol/MId.java new file mode 100644 index 0000000..bbd800a --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/MId.java @@ -0,0 +1,89 @@ +package a8k.canbus.protocol; + +public enum MId { + NotSet(0, "未设置"),// + HbotBoard(10, "机械臂板模块"),// + HbotM(11, "机械臂XY"),// + // + PlatesBoxBoard(20, "板夹仓模块"),// + PlatesBoxYM(21, "板夹仓移动电机"),// + PlatesBoxPusherM(22, "板夹仓推杆电机"),// + PlatesBoxScanner(23, "板夹仓扫码模组"),// + // + ShakeModBoard(30, "摇匀模组板"),// + ShakeModClampingM(31, "试管固定夹爪电机"),// + ShakeModGripperZM(32, "摇匀升降电机"),// + ShakeModShakeM(33, "试管摇匀电机"),// + ShakeModGripperYSV(34, "摇匀前后移动舵机"),// + ShakeModGripperSV(35, "摇匀试管帽夹爪舵机"),// + ShakeModTubeScanerClampingSV(36, "试管架扫码夹紧舵机"),// + ShakeModTubeScanerRotateSV(37, "试管架旋转舵机"),// + // + PlatesBoxTCMBoard(40, "反应板夹温度控制板"),// + PlatesBoxTCM(41, "反应板夹温度控制模块"),// + WbTubeFanMod(42, "气溶胶风扇"),// + // + IncubatorTCMBoard(50, "温度控制"),// + IncubatorTCM(51, "温度控制"),// + // + FeedingModBoard(60, "出入料模块"),// + FeedingModInfeedM(61, "入料电机"),// + FeedingModXM(62, "试管架平移电机"),// + FeedingModOutfeedM(63, "出料电机"),// + FeedingModScannerMod(64, "试管架扫码器"),// + // + IncubatorRotateBoard(70, "孵育盘旋转板"),// + IncubatorRotateCtrlM(71, "孵育盘旋转"),// + // + PipetteModBoard(80, "机械臂Z轴板"),// + PipetteModZM(81, "机械臂Z"),// + PipetteMod(82, "移液枪"),// + PipetteModCodeScanner(83, "物料扫码器"),// + // + OptModBoard(90, "光学模组板"),// + OptModScannerM(91, "板卡扫描电机"),// + OptModPullM(92, "板卡推杆电机"),// + OptMod(93, "扫描仪"),// + // + A8kIdCardReaderBoard(100, "A8K读卡器板"),// + A8kIdCardReader(101, "A8K读卡器"),// + ; + + + final public String chname; + final public int index; + + MId(int index, String chname) { + this.chname = chname; + this.index = index; + } + + public int toInt() { + return index; + } + + + public static MId valueOf(Integer val) { + return valueOf(val.intValue()); + } + + public static MId valueOf(int val) { + MId[] values = MId.values(); + for (MId e : values) { + if (e.toInt() == val) + return e; + } + return null; + } + + public static String toString(int val) { + MId[] values = MId.values(); + for (MId e : values) { + if (e.toInt() == val) { + return e.toString(); + } + } + return "unkown(" + val + ")"; + } + +} diff --git a/src/main/java/a8k/canbus/protocol/ModuleStatus.java b/src/main/java/a8k/canbus/protocol/ModuleStatus.java new file mode 100644 index 0000000..8f95d20 --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/ModuleStatus.java @@ -0,0 +1,24 @@ +package a8k.canbus.protocol; + +public enum ModuleStatus { + IDLE(0), // + BUSY(1), // + ERROR(2),// + ; + + final public int index; + + ModuleStatus(int index) { + this.index = index; + } + + public int getIndex() { + return index; + } + + public static ModuleStatus valueOf(int value) { // 手写的从int到enum的转换函数 + assert (value >= 0 && value < 2); + return values()[value]; + } + +} diff --git a/src/main/java/a8k/canbus/protocol/ModuleType.java b/src/main/java/a8k/canbus/protocol/ModuleType.java new file mode 100644 index 0000000..94cf400 --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/ModuleType.java @@ -0,0 +1,27 @@ +package a8k.canbus.protocol; + +public enum ModuleType { + khbot_module(1), // hbot模块 + ktemperature_ctrl_module(3), // 温度控制 + kfan_ctrl_module(5), // 风扇控制 + kcode_scaner(6), // 扫码器 + kpipette_ctrl_module(7), // 移液体枪控制 + ka8000_optical_module(8), // a8000光学模组 + ktmc_step_motor(10), // 步进电机 + kmini_servo_motor_module(11), // 舵机 + kboard(12), // 板子 + ka8000_idcard_reader(13), // id卡读卡器 + ka8000_plate_code_scaner(14); // 反应板条扫码器 + + final private int val; + + ModuleType(int val) { + this.val = val; + } + + public int getVal() { + return val; + } + + +} diff --git a/src/main/java/a8k/canbus/protocol/RegIndex.java b/src/main/java/a8k/canbus/protocol/RegIndex.java new file mode 100644 index 0000000..b9f8514 --- /dev/null +++ b/src/main/java/a8k/canbus/protocol/RegIndex.java @@ -0,0 +1,183 @@ +package a8k.canbus.protocol; + +public enum RegIndex { + + /******************************************************************************* + * 模块通用配置和状态 * + *******************************************************************************/ + kreg_module_version(0), // 模块版本 + kreg_module_type(1), // 模块类型 + kreg_module_status(2), // 0idle,1busy,2error + kreg_module_errorcode(3), // inited_flag + + /*********************************************************************************************************************** + * 水冷温度控制器 * + ***********************************************************************************************************************/ + kreg_water_cooling_tmp_controler_pid_target(3000), // 目标数值 + kreg_water_cooling_tmp_controler_pid_nowoutput(3001), // 当前输出 + kreg_water_cooling_tmp_controler_pid_feedbackval(3002), // 当前输出 + kreg_water_cooling_tmp_controler_temp0(3003), // 温度1 + kreg_water_cooling_tmp_controler_temp1(3004), // 温度2 + kreg_water_cooling_tmp_controler_temp2(3005), // 温度3 + kreg_water_cooling_tmp_controler_temp3(3006), // 温度4 + + kreg_water_cooling_tmp_controler_pid_kp(3050), // kp + kreg_water_cooling_tmp_controler_pid_ki(3051), // ki + kreg_water_cooling_tmp_controler_pid_kd(3052), // kd + kreg_water_cooling_tmp_controler_pid_max_output(3053), // 最大输出 + kreg_water_cooling_tmp_controler_pid_min_output(3054), // 最小输出 + kreg_water_cooling_tmp_controler_pid_max_integral(3055), // 最大积分 + kreg_water_cooling_tmp_controler_pid_min_integral(3056), // 最小积分 + kreg_water_cooling_tmp_controler_pid_error_limit(3057), // 误差限制 + kreg_water_cooling_tmp_controler_pid_compute_interval(3058), // 计算间隔 + + /******************************************************************************* + * 移液枪状态 * + *******************************************************************************/ + kreg_pipette_pos_ul(4000), // 移液枪位置 + kreg_pipette_capactitance_val(4001), // 移液枪电容值 + kreg_pipette_tip_state(4002), // 移动液枪tip状态 + + kreg_pipette_limit_ul(4051), // + kreg_pipette_pump_acc(4052), // + kreg_pipette_pump_dec(4053), // + kreg_pipette_pump_vstart(4054), // + kreg_pipette_pump_vstop(4055), // + kreg_pipette_pump_vmax(4056), // + kreg_pipette_aspirate_distribut_pump_vel(4057), // + kreg_pipette_lld_pump_vel(4058), // + kreg_pipette_lld_motor_vel_rpm(4059), // + kreg_pipette_lld_detect_period_ms(4060), // + kreg_pipette_lld_prepare_pos(4061), // + kreg_pipette_lld_prepare_distribut_pos(4062), // + + /** + * @brief + * + * ------------------------------------------------------ + * + * + * 扫描零点偏移:(F光学向左扫描的起始位置) + * 扫描方向:1:板卡箭头方向,-1板卡箭头反方向 + * 扫描点数:固定为1200 + * 扫描步距:固定为1 + * + * 返回点数:(1200) + * + * + */ + // 坐标参数 + + kreg_a8k_opt_t_pos_offset(4501), // T光学正向扫描,扫描起始位距离零点的偏移 + kreg_a8k_opt_f_pos_offset(4502), // F光学正向扫描,扫描起始位距离零点的偏移 + kreg_a8k_opt_t_reverse_scan_pos_offset(4503), // T光学逆向扫描,扫描起始位距离零点的偏移 + kreg_a8k_opt_f_reverse_scan_pos_offset(4504), // F光学逆向扫描,扫描起始位距离零点的偏移 + kreg_a8k_opt_scan_step_interval(4505), // 参数固定:为1 + kreg_a8k_opt_scan_pointnum(4506), // 参数固定:为1200个点 + + /*********************************************************************************************************************** + * XYROBOT * + ***********************************************************************************************************************/ + + kreg_xyrobot_io_state(9900), // + kreg_xyrobot_robot_type(9950), // + kreg_xyrobot_one_circle_pulse(9951), // + kreg_xyrobot_one_circle_pulse_denominator(9952), // + kreg_xyrobot_ihold(9954), // + kreg_xyrobot_irun(9955), // + kreg_xyrobot_iholddelay(9956), // + kreg_xyrobot_iglobalscaler(9957), // + kreg_xyrobot_vstart(9958), // + kreg_xyrobot_a1(9959), // + kreg_xyrobot_amax(9960), // + kreg_xyrobot_v1(9961), // + kreg_xyrobot_dmax(9962), // + kreg_xyrobot_d1(9963), // + kreg_xyrobot_vstop(9964), // + kreg_xyrobot_tzerowait(9965), // + kreg_xyrobot_enc_resolution(9966), // + kreg_xyrobot_enable_enc(9967), // + kreg_xyrobot_x_shaft(9968), // + kreg_xyrobot_y_shaft(9969), // + kreg_xyrobot_min_x(9972), // + kreg_xyrobot_min_y(9973), // + kreg_xyrobot_max_x(9974), // + kreg_xyrobot_max_y(9975), // + kreg_xyrobot_run_to_zero_speed(9976), // + kreg_xyrobot_look_zero_edge_speed(9977), // + kreg_xyrobot_shift_x(9978), // + kreg_xyrobot_shift_y(9979), // + kreg_xyrobot_default_velocity(10000), // + + /*********************************************************************************************************************** + * step_motor * + ***********************************************************************************************************************/ + + kreg_step_motor_pos(10101), // 机器人x坐标 + kreg_step_motor_dpos(10103), // 执行完上一条指令后的相对位移 + kreg_step_motor_shift(10150), // x偏移 + kreg_step_motor_shaft(10151), // x轴是否反转 + kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数 + kreg_step_motor_one_circle_pulse_denominator(10153), // 设置一圈脉冲数的分母 + kreg_step_motor_default_velocity(10154), // 默认速度 + kreg_step_motor_ihold(10158), // 步进电机电流配置 + kreg_step_motor_irun(10159), // 步进电机电流配置 + kreg_step_motor_iholddelay(10160), // 步进电机电流配置 + kreg_step_motor_iglobalscaler(10161), // 步进电机电流配置 + kreg_step_motor_run_to_zero_speed(10173), // 回零速度 + kreg_step_motor_look_zero_edge_speed(10175), // 找零边缘速度 + kreg_step_motor_max_d(10178), // 最大限制距离 + kreg_step_motor_min_d(10179), // 最小限制距离 + kreg_step_motor_in_debug_mode(10180), // 驱动器处于调试模式 + kreg_step_motor_vstart(10181), // a1起作用的速度 + kreg_step_motor_a1(10182), // + kreg_step_motor_amax(10183), // + kreg_step_motor_v1(10184), // + kreg_step_motor_dmax(10185), // + kreg_step_motor_d1(10186), // + kreg_step_motor_vstop(10187), // + kreg_step_motor_tzerowait(10188), // + kreg_step_motor_enc_resolution(10189), // 编码器分辨率 1000,1024,4000,4096,16384 + kreg_step_motor_enable_enc(10190), // + kreg_step_motor_dzero_pos(10191), // 驱动器处于调试模式 + + /*********************************************************************************************************************** + * step_motor * + ***********************************************************************************************************************/ + + kreg_mini_servo_pos(10201), // 位置 + kreg_mini_servo_limit_velocity(10251), // 限制速度 + kreg_mini_servo_limit_torque(10252), // 限制扭矩 + kreg_mini_servo_protective_torque(10253), // 保护扭矩 + kreg_mini_servo_is_move(10254), // 是否在运动 + /*********************************************************************************************************************** + * ID_CARD_READER * + ***********************************************************************************************************************/ + + kreg_id_card_reader_raw_sector_size(10301), // + kreg_id_card_reader_raw_sector_num(10302), // + kreg_id_card_reader_is_online(10303), // + + /*********************************************************************************************************************** + * 板夹仓扫码 * + ***********************************************************************************************************************/ + + kreg_plate_code_scaner_laster_intensity(10401), // + kreg_plate_code_scaner_scan_gain(10402), // + kreg_plate_code_scaner_scan_velocity(10403), // + kreg_plate_code_scaner_scan_start_pos(10404), // + kreg_plate_code_scaner_final_stop_pos(10405), // + kreg_plate_code_scaner_code_judgment_threshold(10406), // + kreg_plate_code_scaner_item(10407), // + kreg_plate_code_scaner_lot(10408), // + kreg_plate_code_scaner_rawcode(10409), // + kreg_plate_code_scaner_code_legal(10410); // + + public final int index; + + RegIndex(int regIndex) { + this.index = regIndex; + } + + +} diff --git a/src/main/java/a8k/service/A8kDebugTaskExecutorService.java b/src/main/java/a8k/service/A8kDebugTaskExecutorService.java deleted file mode 100644 index 9603e1e..0000000 --- a/src/main/java/a8k/service/A8kDebugTaskExecutorService.java +++ /dev/null @@ -1,43 +0,0 @@ -package a8k.service; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -public class A8kDebugTaskExecutorService { - public static final Logger logger = LoggerFactory.getLogger(A8kDebugTaskExecutorService.class); - - Thread task; - - synchronized void exec(Runnable runnable) { - if (task != null) { - task.interrupt(); - try { - task.join(); - } catch (InterruptedException ignored) { - return; - } - } - - task = new Thread(runnable); - task.start(); - } - - synchronized void stop() { - try { - task.join(); - task = null; - } catch (InterruptedException e) { - logger.error(e.getMessage()); - } - } - - synchronized boolean isRunning() { - if (task == null) { - return false; - } - return task.isAlive(); - } - -} diff --git a/src/main/java/a8k/service/AppEventBusService.java b/src/main/java/a8k/service/AppEventBusService.java deleted file mode 100644 index bb25ec9..0000000 --- a/src/main/java/a8k/service/AppEventBusService.java +++ /dev/null @@ -1,56 +0,0 @@ -package a8k.service; - -import a8k.appbean.AppEventListener; -import a8k.appbean.appevent.AppEvent; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; - -@Component -public class AppEventBusService { - public static final Logger logger = LoggerFactory.getLogger(AppEventBusService.class); - - Thread eventProcessorThread; - BlockingQueue eventQueue; - List listeners; - - @PostConstruct - public void init() { - eventQueue = new LinkedBlockingQueue(); - eventProcessorThread = new Thread(new Runnable() { - public void run() { - eventBusSchedule(); - } - }); - } - - public void regListener(AppEventListener listener) { - listeners.add(listener); - } - - public void pushEvent(AppEvent event) { - logger.info("pushEvent: {}", event); - eventQueue.add(event); - } - - private void eventBusSchedule() { - while (!Thread.currentThread().isInterrupted()) { - try { - AppEvent event = eventQueue.take(); - } catch (InterruptedException ignored) { - } - } - } - - private void callOnEvent(AppEvent event) { - logger.info("Processing event: {}", event); - for (AppEventListener listener : listeners) { - listener.onAppEvent(event); - } - } -} diff --git a/src/main/java/a8k/service/ctrl_service/DeviceInitializationCtrlService.java b/src/main/java/a8k/service/ctrl_service/DeviceInitializationCtrlService.java index 3f29c9e..bf99325 100644 --- a/src/main/java/a8k/service/ctrl_service/DeviceInitializationCtrlService.java +++ b/src/main/java/a8k/service/ctrl_service/DeviceInitializationCtrlService.java @@ -1,11 +1,11 @@ package a8k.service.ctrl_service; -import a8k.a8k_can_protocol.A8kEcode; -import a8k.a8k_can_protocol.IOId; -import a8k.a8k_can_protocol.MId; +import a8k.canbus.protocol.A8kEcode; +import a8k.canbus.protocol.IOId; +import a8k.canbus.protocol.MId; import a8k.appbean.HardwareException; import a8k.appbean.ecode.AppRet; -import a8k.base_hardware.A8kCanBusService; +import a8k.canbus.A8kCanBusService; import a8k.service.hardware.CommonHardwareOpeartion; import a8k.service.hardware.SamplesPreProcessModuleCtrlService; import jakarta.annotation.Resource; diff --git a/src/main/java/a8k/service/data_service/UsrMgrService.java b/src/main/java/a8k/service/data_service/UsrMgrService.java index 5a6a8a3..c5919ab 100644 --- a/src/main/java/a8k/service/data_service/UsrMgrService.java +++ b/src/main/java/a8k/service/data_service/UsrMgrService.java @@ -1,6 +1,6 @@ package a8k.service.data_service; -import a8k.a8k_can_protocol.A8kEcode; +import a8k.canbus.protocol.A8kEcode; import a8k.service.appdb.dao.AppUsrDao; import a8k.service.appdb.entity.AppUsr; import a8k.service.state_service.A8kStateMgrService; diff --git a/src/main/java/a8k/service/hardware/CommonHardwareOpeartion.java b/src/main/java/a8k/service/hardware/CommonHardwareOpeartion.java index 184540a..44b0887 100644 --- a/src/main/java/a8k/service/hardware/CommonHardwareOpeartion.java +++ b/src/main/java/a8k/service/hardware/CommonHardwareOpeartion.java @@ -1,9 +1,9 @@ package a8k.service.hardware; -import a8k.a8k_can_protocol.MId; +import a8k.canbus.protocol.MId; import a8k.appbean.HardwareException; import a8k.appbean.ecode.AppRet; -import a8k.base_hardware.A8kCanBusService; +import a8k.canbus.A8kCanBusService; import jakarta.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; diff --git a/src/main/java/a8k/service/hardware/HbotControlService.java b/src/main/java/a8k/service/hardware/HbotControlService.java index 6f82194..5003133 100644 --- a/src/main/java/a8k/service/hardware/HbotControlService.java +++ b/src/main/java/a8k/service/hardware/HbotControlService.java @@ -1,6 +1,6 @@ package a8k.service.hardware; -import a8k.a8k_can_protocol.A8kEcode; +import a8k.canbus.protocol.A8kEcode; import a8k.utils.HardwareService; import org.springframework.stereotype.Component; diff --git a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java index f9a3721..88c2ef6 100644 --- a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java +++ b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java @@ -1,9 +1,9 @@ package a8k.service.hardware; -import a8k.a8k_can_protocol.*; +import a8k.canbus.protocol.*; import a8k.appbean.HardwareException; import a8k.appbean.ecode.AppRet; -import a8k.base_hardware.A8kCanBusService; +import a8k.canbus.A8kCanBusService; import a8k.utils.*; import jakarta.annotation.Resource; import org.slf4j.Logger; @@ -160,9 +160,9 @@ public class MotorTubeRackMoveCtrlService implements HardwareCtrlModule { */ @HardwareServiceAction(name = "移动到X", group = "模块基础动作") public void moveTubeRackTo(Integer pos) throws HardwareException, InterruptedException { - // if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { - // throw new HardwareException(A8kEcode.ShakeModGripperZMNotInZeroPos); - // } + if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { + throw new HardwareException(A8kEcode.ShakeModGripperZMNotInZeroPos); + } scanClampModRelease(); canBus.stepMotorEnable(MId.FeedingModXM, 1); canBus.stepMotorEasyMoveTo(MId.FeedingModXM, pos); @@ -238,6 +238,7 @@ public class MotorTubeRackMoveCtrlService implements HardwareCtrlModule { */ @HardwareServiceAction(name = "移动<试管架>到入口位置", group = "片段") public void tubeRackMoveToEnterPos() throws HardwareException, InterruptedException { + moveTubeRackTo(getTREnterXPos()); } diff --git a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java index 87bfe1b..8610fa6 100644 --- a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java +++ b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java @@ -1,11 +1,11 @@ package a8k.service.hardware; -import a8k.a8k_can_protocol.A8kEcode; -import a8k.a8k_can_protocol.IOId; -import a8k.a8k_can_protocol.MId; +import a8k.canbus.protocol.A8kEcode; +import a8k.canbus.protocol.IOId; +import a8k.canbus.protocol.MId; import a8k.appbean.HardwareException; import a8k.appbean.ecode.AppRet; -import a8k.base_hardware.A8kCanBusService; +import a8k.canbus.A8kCanBusService; import a8k.service.db.dao.ReactionPlatesTransmitCtrlParamDao; import a8k.utils.HardwareService; import jakarta.annotation.Resource; diff --git a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java index 7eb3ae5..1487ffa 100644 --- a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java +++ b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java @@ -1,20 +1,16 @@ package a8k.service.hardware; -import a8k.a8k_can_protocol.A8kEcode; -import a8k.a8k_can_protocol.MId; +import a8k.canbus.protocol.A8kEcode; +import a8k.canbus.protocol.MId; import a8k.appbean.A8kTubeType; import a8k.appbean.HardwareException; import a8k.appbean.ecode.AppRet; -import a8k.base_hardware.A8kCanBusService; +import a8k.canbus.A8kCanBusService; import a8k.utils.*; -import com.iflytop.uf.util.UfCommon; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; @Component @HardwareService(name = "样本预处理模块")