diff --git a/src/main/java/a8k/controller/MotorTubeRackMoveCtrlController.java b/src/main/java/a8k/controller/MotorTubeRackMoveCtrlController.java new file mode 100644 index 0000000..d4b1136 --- /dev/null +++ b/src/main/java/a8k/controller/MotorTubeRackMoveCtrlController.java @@ -0,0 +1,52 @@ +package a8k.controller; +import a8k.service.db.dao.MotorTubeRackMoveCtrlServiceParameterDao; +import a8k.service.hardware.MotorTubeRackMoveCtrlService; +import com.iflytop.uf.controller.UfApiControllerBase; +import com.iflytop.uf.controller.UfApiResponse; +import com.iflytop.uf.util.UfClassHelper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import java.lang.reflect.InvocationTargetException; +import java.util.List; +import java.util.Map; +@Controller +public class MotorTubeRackMoveCtrlController extends UfApiControllerBase { + @Resource + private MotorTubeRackMoveCtrlService motorTubeRackMoveCtrlService; + @Resource + private MotorTubeRackMoveCtrlServiceParameterDao motorTubeRackMoveCtrlServiceParameterDao; + + @PostMapping("/api/motor-tube-rack-move-ctrl/execute-service-method") + @ResponseBody + public UfApiResponse executeServiceMethod( @RequestBody Map params ) + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Object service = this.motorTubeRackMoveCtrlService; + String methodName = (String)params.get("method"); + List methodArgs = (List)params.get("params"); + Object result = UfClassHelper.invokeMethod(service, methodName, methodArgs); + return this.success(result); + } + + @PostMapping("/api/motor-tube-rack-move-ctrl/list-options") + @ResponseBody + public UfApiResponse listAllOptions() throws NoSuchMethodException { + var list = this.motorTubeRackMoveCtrlServiceParameterDao.listOptions(); + return this.success(list); + } + + @PostMapping("/api/motor-tube-rack-move-ctrl/update-options") + @ResponseBody + public UfApiResponse updateOptions(@RequestBody Map params ) throws Exception { + var options = (List>)params.get("options"); + for (Map item : options) { + var name = (String)item.get("name"); + var option = this.motorTubeRackMoveCtrlServiceParameterDao.getOption(name); + option.setValue(item.get("value")); + option.save(); + } + return this.success(); + } +} diff --git a/src/main/java/a8k/controller/SamplesPreProcessModuleCtrlController.java b/src/main/java/a8k/controller/SamplesPreProcessModuleCtrlController.java index c0a536f..5d83e3e 100644 --- a/src/main/java/a8k/controller/SamplesPreProcessModuleCtrlController.java +++ b/src/main/java/a8k/controller/SamplesPreProcessModuleCtrlController.java @@ -9,7 +9,6 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; - import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; diff --git a/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java b/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java index 0c68036..bb2fed4 100644 --- a/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java +++ b/src/main/java/a8k/service/db/dao/MotorTubeRackMoveCtrlServiceParameterDao.java @@ -1,13 +1,92 @@ package a8k.service.db.dao; +import a8k.service.db.entity.HardwareServiceSetting; import a8k.service.db.entity.MotorTubeRackMoveCtrlServiceParameter; +import com.iflytop.uf.UfActiveRecord; +import com.iflytop.uf.UfActiveRecordField; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.Map; + @Component public class MotorTubeRackMoveCtrlServiceParameterDao { + /** + * 参数存放在HardwareServiceSetting中, + * 每个参数,依赖于Key+serviceName进行索引 + */ + public final String serviceName = "MotorTubeRackMoveCtrlServiceParameterDao"; + + public List listOptions() { + return UfActiveRecord.find(HardwareServiceSetting.class, Map.of("serviceName", this.serviceName)); + } + + public HardwareServiceSetting getOption(String optionName) { + return HardwareServiceSetting.getOption(this.serviceName, optionName); + } + + // 回零超时时间 + public int getMoveToZeroOvertime() { + return HardwareServiceSetting.getInteger(this.serviceName, "MoveToZeroOvertime", 0); + } + + // 执行动作的超时时间,该超时时间适用于当前模块在当前产品中所有动作的最大时间 + public int getActionOvertime() { + return HardwareServiceSetting.getInteger(this.serviceName, "ActionOvertime", 0); + } + + //试管扫码位置 + public int getTubeScanPos() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubeScanPos", 0); + } + + //高低试管判断位置 + public Integer getTubeHeighJudgmentPos() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubeHeighJudgmentPos", 0); + } + + //试管预处理位置 + public Integer getTubePreProcessPos() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubePreProcessPos", 0); + } + + //入料位置 + public Integer getTubeExistJudgmentPos() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubeExistJudgmentPos", 0); + } + + //出料位置 + public Integer getTubeRackEnterPos() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubeRackEnterPos", 0); + } + + //出料位置 + public Integer getTubeRackExitPos() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubeRackExitPos", 0); + } + + //试管架扫码位置 + public Integer getTubeRackScanCodePos() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubeRackScanCodePos", 0); + } + + //水平电机丢步判断 + public Integer getHorizontalMotorLostStepThresholdVal() { + return HardwareServiceSetting.getInteger(this.serviceName, "HorizontalMotorLostStepThresholdVal", 0); + } + + //试管扫码夹紧位置 + public Integer getScanCodeClampPos() { + return HardwareServiceSetting.getInteger(this.serviceName, "ScanCodeClampPos", 0); + } + + //试管扫码释放位置 + public Integer getScanCodeReleasePos() { + return HardwareServiceSetting.getInteger(this.serviceName, "ScanCodeReleasePos", 0); + } - public MotorTubeRackMoveCtrlServiceParameter getParameter() { - //TODO: - return null; + // + public Integer getTubeSpacing() { + return HardwareServiceSetting.getInteger(this.serviceName, "TubeSpacing", 0); } } diff --git a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java index 30ec32a..d31081b 100644 --- a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java +++ b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java @@ -45,30 +45,70 @@ public class MotorTubeRackMoveCtrlService { @Resource MotorTubeRackMoveCtrlServiceParameterDao serviceParameterDao; + public void setEnable( Boolean enable ) throws HardwareException { + this.a8kCanBusService.callcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_enable, + enable ? 1 : 0 + ); + this.a8kCanBusService.callcmd( + ModId.FeedingModInfeedM, + CmdId.kstep_motor_enable, + enable ? 1 : 0 + ); + this.a8kCanBusService.callcmd( + ModId.FeedingModOutfeedM, + CmdId.kstep_motor_enable, + enable ? 1 : 0 + ); + } + + public void stop() throws HardwareException { + this.a8kCanBusService.callcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_stop, + 1 + ); + this.a8kCanBusService.callcmd( + ModId.FeedingModInfeedM, + CmdId.kstep_motor_stop, + 1 + ); + this.a8kCanBusService.callcmd( + ModId.FeedingModOutfeedM, + CmdId.kstep_motor_stop, + 1 + ); + } + // // 电机基础控制 // public void moveToZeroWhenDeviceSetup() throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to_zero, new Integer[]{}, params.moveToZeroOvertime); + var params = this.serviceParameterDao; + this.a8kCanBusService.callblockcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); } public void moveToZero() throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - var beforePosResponse = this.a8kCanBusService.callcmd(ModId.FeedingModXM, CmdId.kstep_motor_read_pos, new Integer[]{0}); + var params = this.serviceParameterDao; + var beforePosResponse = this.a8kCanBusService.callcmd(ModId.FeedingModXM, CmdId.kstep_motor_read_pos); var beforePos = beforePosResponse.getContentI32(0); - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to_zero, new Integer[]{}, params.moveToZeroOvertime); - var afterPosResponse = this.a8kCanBusService.callcmd(ModId.FeedingModXM, CmdId.kstep_motor_read_pos, new Integer[]{0}); + this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to_zero, params.getMoveToZeroOvertime()); + var afterPosResponse = this.a8kCanBusService.callcmd(ModId.FeedingModXM, CmdId.kstep_motor_read_pos); var afterPos = afterPosResponse.getContentI32(0); var distance = beforePos - afterPos; var dval = a8kCanBusService.module_read_reg(ModId.FeedingModXM, RegIndex.kreg_step_motor_dpos); - if (Math.abs(dval - distance) > params.horizontalMotorLostStepThresholdVal) { + if (Math.abs(dval - distance) > params.getHorizontalMotorLostStepThresholdVal() ) { throw new HardwareException(ModId.FeedingModXM, A8kEcode.MotorLostStep.toInt()); } @@ -91,24 +131,39 @@ public class MotorTubeRackMoveCtrlService { * 移动试管架到入口位置 */ public void moveTubeRackToEnterPos() throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{params.tubeRackEnterPos}, params.actionOvertime); + var params = this.serviceParameterDao; + this.a8kCanBusService.callblockcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_easy_move_to, + params.getTubeRackEnterPos(), + params.getActionOvertime() + ); } /** * 移动试管架到出口位置 */ public void moveTubeRackToExitPos() throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{params.tubeExistJudgmentPos}, params.actionOvertime); + var params = this.serviceParameterDao; + this.a8kCanBusService.callblockcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_easy_move_to, + params.getTubeRackExitPos(), + params.getActionOvertime() + ); } /** * 移动试管架到试管架扫码位置 */ public void moveTubeRackToScanPos() throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{params.tubeRackScanCodePos}, params.actionOvertime); + var params = this.serviceParameterDao; + this.a8kCanBusService.callblockcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_easy_move_to, + params.getTubeRackScanCodePos(), + params.getActionOvertime() + ); } /** @@ -116,10 +171,10 @@ public class MotorTubeRackMoveCtrlService { */ public String moveTubeRackToScanPosAndScan() throws HardwareException, InterruptedException { this.moveTubeRackToScanPos(); - this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_start_scan, new Integer[]{}); - Thread.sleep(500); - var response = this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_read_scaner_result, new Integer[]{}); - this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_stop_scan, new Integer[]{}); + this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_start_scan); + Thread.sleep(5000); + var response = this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_read_scaner_result); + this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_stop_scan); var contentBytes = response.getCmdContent(); return new String(contentBytes); } @@ -135,10 +190,14 @@ public class MotorTubeRackMoveCtrlService { * @param tubeIndex */ public void moveTubeToScanPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); - var scanPos = params.tubeScanPos + tubeIndex * tubeInfo.tubeSpacing; - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{scanPos}, params.actionOvertime); + var params = this.serviceParameterDao; + var scanPos = params.getTubeScanPos() + tubeIndex * params.getTubeSpacing(); + this.a8kCanBusService.callblockcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_easy_move_to, + scanPos, + params.getActionOvertime() + ); } /** @@ -149,10 +208,10 @@ public class MotorTubeRackMoveCtrlService { public String moveTubeToScanPosAndScan(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { this.moveTubeToScanPos(tubeType, tubeIndex); - this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_start_scan, new Integer[]{}); - Thread.sleep(500); - var response = this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_read_scaner_result, new Integer[]{}); - this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_stop_scan, new Integer[]{}); + this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_start_scan); + Thread.sleep(5000); + var response = this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_read_scaner_result); + this.a8kCanBusService.callcmd(ModId.FeedingModScannerMod, CmdId.kcode_scaner_stop_scan); var contentBytes = response.getCmdContent(); return new String(contentBytes); } @@ -163,10 +222,14 @@ public class MotorTubeRackMoveCtrlService { * @param tubeIndex */ public void moveTubeToHeighJudgmentPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); - var detectPos = params.tubeHeighJudgmentPos + tubeIndex * tubeInfo.tubeSpacing; - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{detectPos}, params.actionOvertime); + var params = this.serviceParameterDao; + var detectPos = params.getTubeHeighJudgmentPos() + tubeIndex * params.getTubeSpacing(); + this.a8kCanBusService.callblockcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_easy_move_to, + detectPos, + params.getActionOvertime() + ); } /** @@ -175,10 +238,14 @@ public class MotorTubeRackMoveCtrlService { * @param tubeIndex */ public void moveTubeToPreProcessPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); - var pos = params.tubePreProcessPos + tubeIndex * tubeInfo.tubeSpacing; - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{pos}, params.actionOvertime); + var params = this.serviceParameterDao; + var pos = params.getTubePreProcessPos() + tubeIndex * params.getTubeSpacing(); + this.a8kCanBusService.callblockcmd( + ModId.FeedingModXM, + CmdId.kstep_motor_easy_move_to, + pos, + params.getActionOvertime() + ); } // @@ -191,20 +258,17 @@ public class MotorTubeRackMoveCtrlService { * @param tubeIndex */ public void moveTubeToExistJudgmentPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); - var pos = params.tubeRackExitPos + tubeIndex * tubeInfo.tubeSpacing; - this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{pos}, params.actionOvertime); + var params = this.serviceParameterDao; + var pos = params.getTubeRackExitPos() + tubeIndex * params.getTubeSpacing(); + this.a8kCanBusService.callblockcmd(ModId.FeedingModXM, CmdId.kstep_motor_easy_move_to, new Integer[]{pos}, params.getActionOvertime()); } public boolean isTubeRackInEnterPos() throws HardwareException { - var response = this.a8kCanBusService.callcmd(ModId.FeedingModBoard, CmdId.kxymotor_read_inio, new Integer[]{3}); - return response.getContentI32(0) == 1; + return this.a8kCanBusService.getIOState(IOId.InfeedPPS); } public boolean isTubeRackInExitPos() throws HardwareException { - var response = this.a8kCanBusService.callcmd(ModId.FeedingModBoard, CmdId.kxymotor_read_inio, new Integer[]{5}); - return response.getContentI32(0) == 1; + return this.a8kCanBusService.getIOState(IOId.OutfeedPPS); } /** @@ -212,10 +276,9 @@ public class MotorTubeRackMoveCtrlService { * @param photoelectricIndex 0:里光电,1:外光电 * @return true, 光电触发 false,光电没有触发 */ - public boolean getMoveChannelPhotoelectricState(int photoelectricIndex) throws HardwareException { - var index = 0 == photoelectricIndex ? 2 : 1; - var response = this.a8kCanBusService.callcmd(ModId.FeedingModBoard, CmdId.kxymotor_read_inio, new Integer[]{index}); - return response.getContentI32(0) == 1; + public boolean getMoveChannelPhotoelectricState(Integer photoelectricIndex) throws HardwareException { + var io = 0 == photoelectricIndex ? IOId.THChOuterPPS : IOId.THChInterPPS; + return this.a8kCanBusService.getIOState(io); } // @@ -227,16 +290,26 @@ public class MotorTubeRackMoveCtrlService { * 扫描夹紧机构夹紧 */ public void scanClampModuleCompress() throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - this.a8kCanBusService.callblockcmd(ModId.ShakeModTubeScanerClampingSV, CmdId.kmini_servo_move_to, new Integer[]{params.scanCodeClampPos}, params.actionOvertime); + var params = this.serviceParameterDao; + this.a8kCanBusService.callblockcmd( + ModId.ShakeModTubeScanerClampingSV, + CmdId.kmini_servo_move_to, + new Integer[]{params.getScanCodeClampPos()}, + params.getActionOvertime() + ); } /** * 扫描夹紧机构复位 */ public void scanClampModuleReset() throws HardwareException, InterruptedException { - var params = this.serviceParameterDao.getParameter(); - this.a8kCanBusService.callblockcmd(ModId.ShakeModTubeScanerClampingSV, CmdId.kmini_servo_move_to, new Integer[]{params.scanCodeReleasePos}, params.actionOvertime); + var params = this.serviceParameterDao; + this.a8kCanBusService.callblockcmd( + ModId.ShakeModTubeScanerClampingSV, + CmdId.kmini_servo_move_to, + new Integer[]{params.getScanCodeReleasePos()}, + params.getActionOvertime() + ); }