From afe52fc8cf298b9de360800cb4dd9cac5d2f9846 Mon Sep 17 00:00:00 2001 From: sige Date: Sat, 20 Jul 2024 14:26:23 +0800 Subject: [PATCH] 1 --- .../SamplesPreProcessModuleCtrlService.java | 384 +++++++++++++++++++-- 1 file changed, 356 insertions(+), 28 deletions(-) diff --git a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java index 539bd86..d9cc057 100644 --- a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java +++ b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java @@ -1,12 +1,28 @@ package a8k.service.hardware; +import a8k.a8k_can_protocol.CmdId; +import a8k.a8k_can_protocol.Errorcode; +import a8k.a8k_can_protocol.ModuleId; +import a8k.appbean.A8kTubeType; import a8k.appbean.AppErrorCode; +import a8k.appbean.HardwareException; import a8k.appbean.SampleTubeState; +import a8k.base_hardware.A8kCanBusService; +import a8k.service.db.dao.A8kTubeInfoDao; +import a8k.service.db.dao.SamplesPreProcessModuleCtrlParamsService; +import com.iflytop.uf.UfActuatorCmdExecutor; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class SamplesPreProcessModuleCtrlService { - + @Resource + A8kTubeInfoDao tubeInfoDao; + @Resource + private A8kCanBusService a8kCanBusService; + @Resource + private SamplesPreProcessModuleCtrlParamsService samplesPreProcessModuleCtrlParamsService; /* 样品预处理模块 主要负责样品预处理的相关操作 @@ -20,7 +36,40 @@ public class SamplesPreProcessModuleCtrlService { /** * 按照一定顺序归零设备 */ - public void moveToZero() { + public void moveToZero() throws HardwareException, InterruptedException { + var params = this.samplesPreProcessModuleCtrlParamsService; + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kmini_servo_move_to, + params.getGripperServo_standbyPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kmini_servo_move_to, + params.getHorizontalMotor_standbyPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeShakeModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeScanClampModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); + /* 1. 假设没有试管在当前设备上的前提下归零设备 2. 舵机虽然没有零位,但需要将其移动到待机位置 @@ -31,8 +80,32 @@ public class SamplesPreProcessModuleCtrlService { * 使能模组 * @param enable 是否使能模组 */ - public void enableModule(boolean enable) { - + public void enableModule(boolean enable) throws HardwareException { + this.a8kCanBusService.callcmd( + ModuleId.MotorTubeShakeModule, + CmdId.kstep_motor_enable, + enable ? 1 : 0 + ); + this.a8kCanBusService.callcmd( + ModuleId.MotorTubeScanClampModule, + CmdId.kstep_motor_enable, + enable ? 1 : 0 + ); + this.a8kCanBusService.callcmd( + ModuleId.MotorTubeScanClampModule, + CmdId.kstep_motor_enable, + enable ? 1 : 0 + ); + this.a8kCanBusService.callcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kmini_servo_enable, + enable ? 1 : 0 + ); + this.a8kCanBusService.callcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kmini_servo_enable, + enable ? 1 : 0 + ); } @@ -49,14 +122,103 @@ public class SamplesPreProcessModuleCtrlService { * @param tubeType TubeType_HighBlood,TubeType_ShortBlood,TubeType_Mini,TubeType_MiniBlood,TubeType_BulletTube1P5,TubeType_BulletTube0P5 * @param judgeCapExist 是否判断试管帽子存在与否 */ - public AppErrorCode takeTube(String tubeType,boolean judgeCapExist) { + public AppErrorCode takeTube(String tubeType,boolean judgeCapExist) throws HardwareException, InterruptedException { + var params = this.samplesPreProcessModuleCtrlParamsService; + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kstep_motor_easy_move_to, + params.getHorizontalMotor_takeCapPos(), + params.getActionOvertime() + ); + + var motorUdTubeTaskPos = params.getZMotor_ShortBloodTakeCapHeight(); + var tubeTypeValue = A8kTubeType.valueOf(tubeType); + if ( tubeTypeValue.equals(A8kTubeType.HighBlood) ) { + motorUdTubeTaskPos = params.getZMotor_HighBloodTakeCapHeight(); + } + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + motorUdTubeTaskPos, + params.getActionOvertime() + ); + + if ( judgeCapExist ) { + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeScanClampModule, + CmdId.kmini_servo_rotate_with_torque, + params.getGripperServo_takeCapTorque(), + params.getActionOvertime() + ); + this.a8kCanBusService.callcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kmini_servo_stop + ); + var pos = this.a8kCanBusService.callcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kmini_servo_read_pos + ); + if ( pos.getContentI32(0) > params.getGripperServo_hatDeterminesPosThres() ) { + return AppErrorCode.TubeNotHasHat; + } + } + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kmini_servo_rotate_with_torque, + params.getGripperServo_takeCapTorque(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + 0, + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kmini_servo_move_to, + params.getHorizontalMotor_takePushCapPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + params.getZMotor_placeShakeHeight(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kstep_motor_easy_move_to, + params.getGripperServo_standbyPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + 0, + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kstep_motor_easy_move_to, + params.getHorizontalMotor_standbyPos(), + params.getActionOvertime() + ); + + /* 注意事项: 1. 取试管并将试管放在试管夹紧位置,同时升降电机和平移电机移动到待机位 2. 试管放置的水平高度和其在试管架中的高度保持一直 3. 取试管前,先通过试管夹紧功能判断一下试管帽是否存在(在试管没帽的边沿位置,抓手扭矩抓紧,如果等待一定时间后,抓手位置接近极限位置,则认为没有帽子,返回TubeNotHasHat错误) 4. 无论是否抓取成功,只要不向外抛出异常,方法结束时,该模块涉及到组件均需要返回待机位置。 - */ return AppErrorCode.Success; @@ -65,22 +227,108 @@ public class SamplesPreProcessModuleCtrlService { /** * 取试管帽 */ - public AppErrorCode takeTubeCap() { - // - // - // - // - + public AppErrorCode takeTubeCap( String tubeType ) throws HardwareException, InterruptedException { + var params = this.samplesPreProcessModuleCtrlParamsService; + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kstep_motor_easy_move_to, + params.getHorizontalMotor_takePushCapPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kstep_motor_easy_move_to, + params.getGripperServo_standbyPos(), + params.getActionOvertime() + ); + + var motorUdTakeCapPos = params.getZMotor_ShortBloodTakeCapHeight(); + var tubeTypeValue = A8kTubeType.valueOf(tubeType); + if ( tubeTypeValue.equals(A8kTubeType.HighBlood) ) { + motorUdTakeCapPos = params.getZMotor_HighBloodTakeCapHeight(); + } + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + motorUdTakeCapPos, + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kstep_motor_easy_move_to, + params.getGripperServo_standbyPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + 0, + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kstep_motor_easy_move_to, + params.getHorizontalMotor_standbyPos(), + params.getActionOvertime() + ); return AppErrorCode.Success; } /** * 盖试管帽,并将试管移动回试管架中 */ - public void pushBackTubeCapAndTakeBakTube(String tubeType) { - // - // - // + public void pushBackTubeCapAndTakeBakTube(String tubeType) throws HardwareException, InterruptedException { + var params = this.samplesPreProcessModuleCtrlParamsService; + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kstep_motor_easy_move_to, + params.getHorizontalMotor_takePushCapPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kstep_motor_easy_move_to, + params.getGripperServo_standbyPos(), + params.getActionOvertime() + ); + + var motorUdTakeCapPos = params.getZMotor_ShortBloodTakeCapHeight(); + var tubeTypeValue = A8kTubeType.valueOf(tubeType); + if ( tubeTypeValue.equals(A8kTubeType.HighBlood) ) { + motorUdTakeCapPos = params.getZMotor_HighBloodTakeCapHeight(); + } + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + motorUdTakeCapPos, + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kstep_motor_easy_move_to, + params.getGripperServo_standbyPos(), + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + 0, + params.getActionOvertime() + ); + + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kstep_motor_easy_move_to, + params.getHorizontalMotor_standbyPos(), + params.getActionOvertime() + ); } @@ -94,37 +342,117 @@ public class SamplesPreProcessModuleCtrlService { * @param times 摇匀次数 * @param shakeDegree 摇匀角度 */ - public void ShakeTube(String tubeType, int times, int shakeDegree) { - + public void ShakeTube(String tubeType, int times, int shakeDegree) throws HardwareException, InterruptedException { + var params = this.samplesPreProcessModuleCtrlParamsService; + var standByPos = params.getShakeMotor_standbyPos(); + var startPos = standByPos - shakeDegree/2; + var endPos = standByPos + shakeDegree/2; + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeShakeModule, + CmdId.kstep_motor_easy_reciprocating_motion, + startPos, + endPos, + times, + params.getActionOvertime() + ); } /** * 打开气溶胶风扇 */ - public void openAerosolFan() { - + public void openAerosolFan() throws HardwareException { + var params = this.samplesPreProcessModuleCtrlParamsService; + this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to_zero, params.getAerosolFanLevel()); } /** * 关闭气溶胶风扇 */ - public void closeAerosolFan() { - + public void closeAerosolFan() throws HardwareException { + this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to_zero, 0); } /** * 设备初始化时复位 */ - public void moduleResetWhenPowerOn() { - + public void moduleResetWhenPowerOn() throws HardwareException, InterruptedException { + var params = this.samplesPreProcessModuleCtrlParamsService; + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kmini_servo_move_to, + params.getTubeClampMotor_standbyPos() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kmini_servo_move_to, + params.getHorizontalMotor_standbyPos(), + params.getActionOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeScanClampModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeShakeModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); } /** * 设备运行时复位 */ - public void moduleRuntimeReset() { - + public void moduleRuntimeReset() throws HardwareException, InterruptedException { + var params = this.samplesPreProcessModuleCtrlParamsService; + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeCapClipModule, + CmdId.kmini_servo_move_to, + params.getTubeClampMotor_standbyPos() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to, + 0, + params.getMoveToZeroOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeMoveUpDownModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeMoveFrontBackModule, + CmdId.kmini_servo_move_to, + params.getHorizontalMotor_standbyPos(), + params.getActionOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeScanClampModule, + CmdId.kstep_motor_easy_move_to, + 0, + params.getMoveToZeroOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeScanClampModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeShakeModule, + CmdId.kstep_motor_easy_move_to, + 0, + params.getMoveToZeroOvertime() + ); + this.a8kCanBusService.callblockcmd( + ModuleId.MotorTubeShakeModule, + CmdId.kstep_motor_easy_move_to_zero, + params.getMoveToZeroOvertime() + ); } - - }