From 7a5c4b2e9ecd62926cbdbc7681f00a41462d7d8b Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 26 Jul 2024 13:19:02 +0800 Subject: [PATCH 1/3] update --- README.md | 4 ++ .../java/a8k/canbus/A8kModParamInitializer.java | 12 ++++++ src/main/java/a8k/canbus/protocol/A8kEcode.java | 1 + .../ReactionPlatesTransmitCtrlService.java | 44 +++++++++++++++------- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index a74a834..40b253e 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,10 @@ TODO: 1.想办法解决 + +4:号仓位退不出 +14 + ``` diff --git a/src/main/java/a8k/canbus/A8kModParamInitializer.java b/src/main/java/a8k/canbus/A8kModParamInitializer.java index 922aedc..4948ea6 100644 --- a/src/main/java/a8k/canbus/A8kModParamInitializer.java +++ b/src/main/java/a8k/canbus/A8kModParamInitializer.java @@ -70,6 +70,18 @@ public class A8kModParamInitializer implements AppEventListener { // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_run_to_zero_speed, 500); + canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_default_velocity, 2200); + // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_a1, 50); + // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_amax, 100); + canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_irun, 31); + + canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kreg_step_motor_default_velocity, 1500); + canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kreg_step_motor_irun, 31); + + canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kreg_step_motor_default_velocity, 1500); + canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kreg_step_motor_irun, 25); + + // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_run_to_zero_speed, 500); } diff --git a/src/main/java/a8k/canbus/protocol/A8kEcode.java b/src/main/java/a8k/canbus/protocol/A8kEcode.java index 609374b..bbebce5 100644 --- a/src/main/java/a8k/canbus/protocol/A8kEcode.java +++ b/src/main/java/a8k/canbus/protocol/A8kEcode.java @@ -27,6 +27,7 @@ public enum A8kEcode { TubeXChannelIsNotEmpty(21, "试管架平移通道不为空"),// TubeTypeNotSupport(22, "试管类型不支持"),// CmdIdNotSupport(23, "不支持指令"),// + PullPlateFail(24, "钩板卡板"),// // // FOR HARDWARE // diff --git a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java index 2a5b2fe..5cf14ac 100644 --- a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java +++ b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java @@ -28,7 +28,7 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { @HardwareServiceParam(name = "动作超时时间", group = "基础参数") public Integer getActionOvertime() { - return hpReader.getInteger("actionOvertime", 10000); + return hpReader.getInteger("actionOvertime", 7000); } @HardwareServiceParam(name = "板夹仓通道0位置", group = "板夹仓参数") @@ -62,7 +62,7 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { @HardwareServiceParam(name = "仓位0出板位置", group = "转盘参数") public Integer getTurntablePullPos0() { - return hpReader.getInteger("TurntablePullPos0", 1650 + 18000); + return hpReader.getInteger("TurntablePullPos0", 19700); } @HardwareServiceParam(name = "仓位0点滴位", group = "转盘参数") @@ -89,7 +89,7 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { @HardwareServiceParam(name = "扫描待机位", group = "光学模组参数") public Integer getOptScanScandbyPos() { - return hpReader.getInteger("OptScanScandbyPos", 580); + return hpReader.getInteger("OptScanScandbyPos", 305); } /** @@ -247,12 +247,24 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { return AppRet.success(canBus.plateCodeScannerReadCode(MId.PlatesBoxScanner)); } + public void pushPlateQuick(PlateBoxCh PBCh, IncubatorPos turntablePosIndex) throws HardwareException, InterruptedException { + trunableMoveToPushPos(turntablePosIndex); + canBus.stepMotorEasyMoveToBlock(MId.PlatesBoxYM, getPBCh0Pos() + PBCh.off * getPBChSpacing(), getActionOvertime()); + canBus.stepMotorEasyMoveToBlock(MId.PlatesBoxPusherM, getPusherEndPos(), getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PlatesBoxPusherM, getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PlatesBoxYM, getActionOvertime()); + } + @HardwareServiceAction(name = "拉板", group = "单步操作") public void pullPlate(IncubatorPos turntablePosIndex) throws HardwareException, InterruptedException { trunableMoveToPullPos(turntablePosIndex); canBus.stepMotorEasyMoveToBlock(MId.OptModScannerM, getOptScanScandbyPos(), getActionOvertime()); canBus.stepMotorEasyMoveToBlock(MId.OptModPullM, getPullerTargetPos(), getActionOvertime()); + if (!canBus.getIOState(IOId.PullerMEndPPS)) { + logger.error("pull plate fail"); + throw new HardwareException(A8kEcode.PullPlateFail); + } canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.OptModPullM, getActionOvertime()); } @@ -263,29 +275,33 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { canBus.stepMotorEasyMoveToBlock(MId.OptModScannerM, getOptScanScandbyPos(), getActionOvertime()); } - private Boolean breakDropAllPlateFlag = false; + Boolean pushAllPlateAndDropBreakFlag = false; - @HardwareServiceAction(name = "丢弃全部板", group = "测试") - public void dropAllPlate() throws HardwareException, InterruptedException { - breakDropAllPlateFlag = false; + @HardwareServiceAction(name = "推全部板同时丢弃", group = "位置测试") + public void pushAllPlateAndDrop(PlateBoxCh PBCh, IncubatorPos startPos) throws HardwareException, InterruptedException { + pushAllPlateAndDropBreakFlag = false; checkBeforeMoveTrunable(); checkBeforeMovePlateBox(); modGroupMoveToZeroQuick(); + dropPlate(); for (IncubatorPos index : IncubatorPos.values()) { + if (index.compareTo(startPos) < 0) { + continue; + } + pushPlateQuick(PBCh, index); + if (pushAllPlateAndDropBreakFlag) {break;} pullPlate(index); + if (pushAllPlateAndDropBreakFlag) {break;} dropPlate(); - if (breakDropAllPlateFlag) { - break; - } + if (pushAllPlateAndDropBreakFlag) {break;} } } - @HardwareServiceAction(name = "打断-丢弃全部板", group = "测试") - public void breakDropAllPlate() throws HardwareException, InterruptedException { - breakDropAllPlateFlag = true; + @HardwareServiceAction(name = "推全部板同时丢弃中断", group = "位置测试") + public void pushAllPlateAndDropBreak() { + pushAllPlateAndDropBreakFlag = true; } - @HardwareServiceAction(name = "显示板夹扫码原始曲线", group = "辅助调试") public AppRet readPlateScanCurve() throws HardwareException, InterruptedException { List scanDataCurve = canBus.plateCodeScanerReadRawResult(MId.PlatesBoxScanner); From 76e2082e1ac10eefce5f4ef434297bedf82efd00 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 26 Jul 2024 13:34:12 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B8=BB=E8=BD=AC?= =?UTF-8?q?=E7=9B=98=E9=BD=BF=E8=BD=AE=E9=97=B4=E9=9A=99=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/canbus/A8kModParamInitializer.java | 6 ++---- src/main/java/a8k/canbus/protocol/CmdId.java | 2 +- .../hardware/ReactionPlatesTransmitCtrlService.java | 19 ++++++++++++++++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/a8k/canbus/A8kModParamInitializer.java b/src/main/java/a8k/canbus/A8kModParamInitializer.java index 4948ea6..fb589a6 100644 --- a/src/main/java/a8k/canbus/A8kModParamInitializer.java +++ b/src/main/java/a8k/canbus/A8kModParamInitializer.java @@ -71,14 +71,12 @@ public class A8kModParamInitializer implements AppEventListener { // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_run_to_zero_speed, 500); canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_default_velocity, 2200); - // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_a1, 50); - // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_amax, 100); canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_irun, 31); - canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kreg_step_motor_default_velocity, 1500); + canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kreg_step_motor_default_velocity, 1800); canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kreg_step_motor_irun, 31); - canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kreg_step_motor_default_velocity, 1500); + canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kreg_step_motor_default_velocity, 1800); canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kreg_step_motor_irun, 25); // canBus.moduleSetReg(MId.OptModPullM, RegIndex.kreg_step_motor_run_to_zero_speed, 500); diff --git a/src/main/java/a8k/canbus/protocol/CmdId.java b/src/main/java/a8k/canbus/protocol/CmdId.java index 1964d5c..258b209 100644 --- a/src/main/java/a8k/canbus/protocol/CmdId.java +++ b/src/main/java/a8k/canbus/protocol/CmdId.java @@ -9,7 +9,7 @@ public enum CmdId { 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_get_status(0x0104, "module_get_status", true),// module_stop(0x0101, "module_stop"),// module_set_reg(0x0105, "module_set_reg"),// module_get_reg(0x0106, "module_get_reg"),// diff --git a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java index 5cf14ac..96fb549 100644 --- a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java +++ b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java @@ -216,7 +216,22 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { //限制pos在 0--> 36000之间 pos = pos % 36000; if (pos < 0) {pos += 36000;} - canBus.stepMotorEasyMoveToBlock(MId.IncubatorRotateCtrlM, pos, getActionOvertime()); + + //先移动半个间距,用来检测是否发生卡板 + Integer nowPos = canBus.stepMotorReadPos(MId.IncubatorRotateCtrlM); + if (nowPos < pos) { + canBus.stepMotorEasyMoveByBlock(MId.IncubatorRotateCtrlM, getTurntablePosSpacing(), getActionOvertime()); + } else if (nowPos > pos) { + canBus.stepMotorEasyMoveByBlock(MId.IncubatorRotateCtrlM, -getTurntablePosSpacing(), getActionOvertime()); + } + + //解决齿轮间隙的问题 + if (nowPos < pos) { + canBus.stepMotorEasyMoveToBlock(MId.IncubatorRotateCtrlM, pos, getActionOvertime()); + } else { + canBus.stepMotorEasyMoveToBlock(MId.IncubatorRotateCtrlM, pos - 300/**/, getActionOvertime()); + canBus.stepMotorEasyMoveToBlock(MId.IncubatorRotateCtrlM, pos, getActionOvertime()); + } } @@ -289,9 +304,7 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { continue; } pushPlateQuick(PBCh, index); - if (pushAllPlateAndDropBreakFlag) {break;} pullPlate(index); - if (pushAllPlateAndDropBreakFlag) {break;} dropPlate(); if (pushAllPlateAndDropBreakFlag) {break;} } From 1752a4cd5b1bccd2fa3c178e8dca566406cb848b Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 26 Jul 2024 15:12:10 +0800 Subject: [PATCH 3/3] update --- src/main/java/a8k/appbean/OptScanDirection.java | 9 +++ src/main/java/a8k/canbus/A8kCanBusService.java | 49 ++++++++++++- src/main/java/a8k/canbus/protocol/CmdId.java | 13 +--- src/main/java/a8k/opt_algo/A8kOptAlgo.java | 77 +++++++++++++++++++++ .../ReactionPlatesTransmitCtrlService.java | 53 ++++++++++++++ zhaohe_app.db | Bin 487424 -> 487424 bytes 6 files changed, 189 insertions(+), 12 deletions(-) create mode 100644 src/main/java/a8k/appbean/OptScanDirection.java create mode 100644 src/main/java/a8k/opt_algo/A8kOptAlgo.java diff --git a/src/main/java/a8k/appbean/OptScanDirection.java b/src/main/java/a8k/appbean/OptScanDirection.java new file mode 100644 index 0000000..12b5614 --- /dev/null +++ b/src/main/java/a8k/appbean/OptScanDirection.java @@ -0,0 +1,9 @@ +package a8k.appbean; + +public enum OptScanDirection { + POSITIVE, NEGATIVE; + + public Integer getInteger() { + return this == POSITIVE ? 1 : -1; + } +} diff --git a/src/main/java/a8k/canbus/A8kCanBusService.java b/src/main/java/a8k/canbus/A8kCanBusService.java index a7c6543..5cc2733 100644 --- a/src/main/java/a8k/canbus/A8kCanBusService.java +++ b/src/main/java/a8k/canbus/A8kCanBusService.java @@ -1,6 +1,7 @@ package a8k.canbus; import a8k.app_eventbus.appevent.A8kCanBusOnConnectEvent; +import a8k.appbean.OptScanDirection; import a8k.appbean.PlateInfo; import a8k.canbus.custom_param_mgr.A8kModCustomParamMgr; import a8k.canbus.protocol.*; @@ -154,7 +155,53 @@ public class A8kCanBusService { } - //plate_code_scaner_adc_readraw + // ka8k_opt_v2_t_start_scan = CMDID(7, 0), //(int32_t scanDirection, int32_t lasterGain,int32_t scanGain) + // ka8k_opt_v2_f_start_scan = CMDID(7, 1), //(int32_t scanDirection, int32_t lasterGain,int32_t scanGain) + // ka8k_opt_v2_f_readVal = CMDID(7, 15), //(int32_t *val0,int32_t *val1) for_debug + + // 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"),// + + //a8k_opt_v2_read_raw + + + public void optTStartScan(MId id, OptScanDirection scanDirection, Integer lasterGain, Integer scanGain) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.a8k_opt_v2_t_start_scan.toInt(), scanDirection.getInteger(), lasterGain, scanGain); + } + + public void optTStartScanBlock(MId id, OptScanDirection scanDirection, Integer lasterGain, Integer scanGain, Integer actionOvertime) throws HardwareException, InterruptedException { + optTStartScan(id, scanDirection, lasterGain, scanGain); + waitForMod(id, actionOvertime); + } + + public void optFStartScan(MId id, OptScanDirection scanDirection, Integer lasterGain, Integer scanGain) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.a8k_opt_v2_f_start_scan.toInt(), scanDirection.getInteger(), lasterGain, scanGain); + } + + public void optFStartScanBlock(MId id, OptScanDirection scanDirection, Integer lasterGain, Integer scanGain, Integer actionOvertime) throws HardwareException, InterruptedException { + optFStartScan(id, scanDirection, lasterGain, scanGain); + waitForMod(id, actionOvertime); + } + + public List optReadRaw(MId id) throws HardwareException, InterruptedException { + int i = 0; + List result = new ArrayList<>(); + while (true) { + var rxPacket = callcmd(id.toInt(), CmdId.a8k_opt_v2_read_raw.toInt(), i++); + if (rxPacket.getCmdContent().length == 0) { + break; + } + var rawdata = ByteArray.readU16bitArray(rxPacket.getCmdContent()); + result.addAll(Arrays.asList(rawdata)); + } + return result; + } public void plateCodeScanerPushCardAndScan(MId id, Integer finalStopPos) throws HardwareException, InterruptedException { diff --git a/src/main/java/a8k/canbus/protocol/CmdId.java b/src/main/java/a8k/canbus/protocol/CmdId.java index 258b209..43f9c62 100644 --- a/src/main/java/a8k/canbus/protocol/CmdId.java +++ b/src/main/java/a8k/canbus/protocol/CmdId.java @@ -47,17 +47,8 @@ public enum CmdId { 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_read_raw(0x0609, "a8k_opt_v2_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"),// diff --git a/src/main/java/a8k/opt_algo/A8kOptAlgo.java b/src/main/java/a8k/opt_algo/A8kOptAlgo.java new file mode 100644 index 0000000..40d803e --- /dev/null +++ b/src/main/java/a8k/opt_algo/A8kOptAlgo.java @@ -0,0 +1,77 @@ +package a8k.opt_algo; + +import java.util.ArrayList; +import java.util.List; + +public class A8kOptAlgo { + + static private List createDoubleList(int size) { + List list = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + list.add(0.0); + } + return list; + } + + static private List integerToDouble(List input) { + List output = new ArrayList<>(input.size()); + for (Integer i : input) { + output.add(i.doubleValue()); + } + return output; + } + + static private List doubleToInteger(List input) { + List output = new ArrayList<>(input.size()); + for (Double i : input) { + output.add(i.intValue()); + } + return output; + } + + static public List preProcessOptData(List input) { + List inputRaw = integerToDouble(input); + List upSamplingRaw = superSampling(inputRaw, 24); + List subSamplingRaw = subSampling(upSamplingRaw, 5); + return doubleToInteger(subSamplingRaw); + } + + + static public List superSampling(List input, Integer factor) { + int outputLength = input.size() * factor; + List upSamplingRaw = createDoubleList(outputLength); + + for (int si = 0, di = 0; si < input.size() - 1; di++) { + Double a = upSamplingRaw.set(di * factor, input.get(si)); + Double b = upSamplingRaw.set((di + 1) * factor, input.get(++si)); + + Double slope = (b - a) / factor; + + for (int i = 0; i < factor - 1; i++) { + int baseIndex = (di * factor) + i; + upSamplingRaw.set(baseIndex + 1, upSamplingRaw.get(baseIndex) + slope); + } + } + return upSamplingRaw; + } + + static public List subSampling(List inputRaw, Integer nSubSampleRate) { + int nSum = 0; + double fAvg = 0.0; + int subIndex = 0; + int nOutputLength = inputRaw.size() / nSubSampleRate; + + List subSampledRaw = createDoubleList(nOutputLength); + + for (int index = 0; index < inputRaw.size(); index++) { + if (index % nSubSampleRate == 0 && index > 0) { + fAvg = (double) nSum / nSubSampleRate; + subSampledRaw.set(subIndex++, fAvg); + nSum = 0; + } + nSum += inputRaw.get(index); + } + subSampledRaw.set(nOutputLength - 1, subSampledRaw.get(nOutputLength - 2)); + return subSampledRaw; + } +} diff --git a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java index 96fb549..cc081d8 100644 --- a/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java +++ b/src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java @@ -6,6 +6,7 @@ import a8k.canbus.protocol.IOId; import a8k.canbus.protocol.MId; import a8k.appbean.ecode.AppRet; import a8k.canbus.A8kCanBusService; +import a8k.opt_algo.A8kOptAlgo; import a8k.utils.*; import jakarta.annotation.Resource; import org.slf4j.Logger; @@ -31,6 +32,11 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { return hpReader.getInteger("actionOvertime", 7000); } + @HardwareServiceParam(name = "光学扫描超时时间", group = "基础参数") + public Integer getOptScanOvertime() { + return hpReader.getInteger("optScanOvertime", 10000); + } + @HardwareServiceParam(name = "板夹仓通道0位置", group = "板夹仓参数") public Integer getPBCh0Pos() { return hpReader.getInteger("PBCh0Pos", -17); @@ -92,6 +98,27 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { return hpReader.getInteger("OptScanScandbyPos", 305); } + @HardwareServiceParam(name = "T光学扫描起始坐标", group = "光学模组参数") + public Integer getTOptPosOffset() { + return hpReader.getInteger("TOptPosOffset", 3723); + } + + @HardwareServiceParam(name = "F光学扫描起始坐标", group = "光学模组参数") + public Integer getFOptPosOffset() { + return hpReader.getInteger("FOptPosOffset", 2559); + } + + @HardwareServiceParam(name = "T光学发光增益", group = "光学模组参数") + public Integer getOptTLasterGain() { + return hpReader.getInteger("OptTLasterGain", 0); + } + + @HardwareServiceParam(name = "F光学发光增益", group = "光学模组参数") + public Integer getOptFLasterGain() { + return hpReader.getInteger("OptFLasterGain", 0); + } + + /** * ZERO_DPOS */ @@ -325,6 +352,32 @@ public class ReactionPlatesTransmitCtrlService implements HardwareCtrlModule { return AppRet.success(new A8kScanCurve(scanDataCurve, refLine)); } + private AppRet packetOptDisplayScanCurve(List scanDataCurve) { + A8kScanCurve scanCurve = new A8kScanCurve(); + scanCurve.scanDataCurve = A8kOptAlgo.preProcessOptData(scanDataCurve); + scanCurve.refCurve = A8kOptAlgo.preProcessOptData(scanDataCurve); + scanCurve.refLine = new ArrayList<>(); + for (int i = 1; i < 6; i++) { + scanCurve.refLine.add(40 * i); + } + return AppRet.success(scanCurve); + } + + @HardwareServiceAction(name = "T光学扫码", group = "光学调试") + public AppRet optTScan(OptScanDirection direction, Integer scanerGain) throws HardwareException, InterruptedException { + canBus.optTStartScanBlock(MId.OptMod, direction, getOptTLasterGain(), scanerGain, getOptScanOvertime()); + return packetOptDisplayScanCurve(canBus.optReadRaw(MId.OptMod)); + } + + @HardwareServiceAction(name = "F光学扫码", group = "光学调试") + public AppRet optFScan(OptScanDirection direction, Integer scanerGain) throws HardwareException, InterruptedException { + canBus.optFStartScanBlock(MId.OptMod, direction, getOptTLasterGain(), scanerGain, getOptScanOvertime()); + return packetOptDisplayScanCurve(canBus.optReadRaw(MId.OptMod)); + } + + // + // 状态 + // @HardwareServiceAction(name = "读取<转盘>位置", group = "位置测量") public AppRet readTrunablePos() throws HardwareException, InterruptedException { diff --git a/zhaohe_app.db b/zhaohe_app.db index 11ba095d39535eb9bf339c131e752282da8242fe..e7d9ec37461d760d248d30f212b012c0f5ead012 100644 GIT binary patch delta 4393 zcmcInZ)_Ar6yMuxw=KQvH6aa&p)G|LXvyfz?(EF221LO4ms}}5uoCfRXJ?_YwB>rO ze}FEM7!yB1qHH97&`3y(20x$>zo8_?1RFnUVwCC!6B81RiTK3?-`+u`6ncxuZT9jq z`|{qr_vZcHZw}A4AD(SLdY^vehhxh(!T+np*NUl6i~7m2u(fGM%SE~STQ0T)Evf7~ z+4Y(4GEoko2{F! z>qvi@9!|IDAL&n~eo9TJy0p)=q6WX``;5W^d2K1NO{M&RA<9h$QOrE#Do-Fc2ts1o z#G}~b`SJ30DMsVh_g?NFn;1|+mWRhi`$t4sO$?UA=)}I^^5$}BWVf2v@Gp3H6wx1}96SW#NseI1ccDYvzZz9OFH!jlx5*3nfjDN`kns6r!#r zk;iNjBH>fdr-6$lv*&!oQ9M1oe{$GQ<_R;5i#?TUx7n^~Gb#couOg5t7gD7-L!Puf z)AX?IaXIHG?4O+2o6HBZak1MdkoZ7RimB~W#2m|nat9bWuHz#|(!f&!j#^;HhE=I@ zq{^c7Z^h@=B%F7mT!x2M8HH8gLb{Szt^tq<_=qz1zoy z93I_Mvlu3`cde|RC5PF*W5$QoGD9f0&j@m{OCU|u5nkXzL&)m(A03SgP}4Xe4DaYN z3hl6QhjL4DNV>x-t-v5Hj_V`aWG-}+4SnLr8^;yHVT~SxBe;7-CFwa6>W7uXk!eG5 zsm(d$Mqs3vusI2Y%eVtgymicvlRm0STepnY+Gt4xNgV6bWIrD}eXxBw5kIw~-cqnw%n2jiZJ0Vbpugvh}hqOq_q9gEtO z(rOHGmnF5{UbSvIO1VM`1hs`z2~mI_lOrB@)N!QiGFiol3E2No)p%G7UHYsAoa4NLLaDSajl zf0l9fu%7CFu4RMP+I(8e3}ibq2eKzJz0Ieymoqb&D=lr=$D6;+oXlRxXxaVo1H<7C zpEF&p=NrSd=|T!)6)+cy!CZg{iWM}Rg*l*iAerYAW>Rlm%LaYVA~R%eg!F;ph9sk) z7ZlsVB$&RoWkc$65_nz%iWhDJvhy%@H7K5lF*2+Ll0BfgKMB-zgW}^!0BaQ}c3y{{ zFvg$T!Ou#l|CJY(N4PJgc-)$24Z^+oj1LA|@a8N|1v7k<=x;>Gdk&1=$QQT`BoZiK~-=$GoE_Ggs4 zR8iEvjX=;w#5PSWCm&wrDUGbr9D^AA@*mR>zImjHR_2nih48>s?_H zSk#?9$ynE1$1Fy=!rQX0j8*^eU9qnDGkD$zj!9R>s=L&a5APA{0_#VTkgo79SQq%{ zT!eMa1B5v)bQ9^SIT}dJx-wS!EJSl>tSb@e3S*8xS?7OZO_l;47Mg^OPPAOP(`Y&{A7&#}g9tg9yJ0^@;q?^xFjq{}j3tfXfmeo)^L zOB2ztgZi_v)E51AP=5v_{j=z)L;650$>=?hVCLxARgY>*<7v|!bx!Mj@G*5R+B#kN zm=eA5N0>U@(Zy*U#UC4^zo+$nkhD*t{!rf;OGD9zp+01!a_?%nch7XKIG!u+US||~ z;kuZFmpxLsp691jsXV+-)xM-)_?^P(-;Zx>FzOb%R5oR<57!l;;GRuQ4tID{#B7?! vL%j?eb znx~h?cshpwv*KoDfrG5u#F&lQSR%ODLZ_R{Fo&_kZ~<8pWtgK_qBw!9_cF{8EFl~~ zmbWZ(5K9OEiDUw@0_2&)S;85Ctkv?&k=t1snEv|PGB7YmbFX9IkL6#_H-RUJ zSDvSuZzu08{u_LDJeu6=c;E1x<@v@Z%FoSj!k5nXh`){3gZnzq65hi+47`P#6$J{o zx39a+G=YglgE^FOy0r|m3M)65nSGB*6(TqV&hnQ9N^^jvpTPxzo`EV1lmkk$f~A3; zfCx^L2Z}L+#X>+#CUxde>uc%w-Rl47M`{u>Y5z{Qo`cb`}HXKkv5-1h9XQ2ay5- jZ2>H80j%2s*o+_W8Uwv)1jOY)T(()!-~j(J2X+GhM;vy~