26 changed files with 594 additions and 388 deletions
-
13src/main/java/a8k/app/engineer/service/qatest/ExperimentConsistencyTestingService.java
-
4src/main/java/a8k/app/engineer/service/qatest/LiquidAbsorptionAndDistributionTestService.java
-
42src/main/java/a8k/app/hardware/driver/PipetteCtrlDriverV2.java
-
11src/main/java/a8k/app/hardware/type/pipette_module/DistribuType.java
-
1src/main/java/a8k/app/hardware/type/pipette_module/cfg/PipetteCommonConfigIndex.java
-
1src/main/java/a8k/app/hardware/type/pipette_module/cfgbean/PipetteCommonConfig.java
-
1src/main/java/a8k/app/hardware/type/pipette_module/cpyidx/ContainerCpyId.java
-
2src/main/java/a8k/app/hardware/type/pipette_module/cpyidx/LiquidConfigCpyIdx.java
-
22src/main/java/a8k/app/hardware/type/pipette_module/cpyidx/PlatInfoCpyIdx.java
-
30src/main/java/a8k/app/hardware/type/pipette_module/param/AspirationParam.java
-
25src/main/java/a8k/app/hardware/type/pipette_module/param/DistribuAllParam.java
-
8src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java
-
22src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java
-
269src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java
-
5src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java
-
18src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java
-
383src/main/java/a8k/app/service/module/LiquidOperationCtrlModule.java
-
18src/main/java/a8k/app/service/module/TipMgrModule.java
-
4src/main/java/a8k/app/service/param/exparam/HbotConsumableExParamMgr.java
-
12src/main/java/a8k/app/service/param/hbotpos/HbotLittleBSPosMgr.java
-
4src/main/java/a8k/app/service/param/hbotpos/HbotProbeSubstancePosMgr.java
-
2src/main/java/a8k/app/type/a8k/state/ProjectTaskContext.java
-
8src/main/java/a8k/extui/page/driver/pipette_module/PipetteGunCommonConfigPage.java
-
12src/main/java/a8k/extui/page/driver/pipette_module/PipetteGunOperationCtrlPage.java
-
2src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java
-
47src/main/java/a8k/extui/page/test/verification/P34LiquidOperationTestPage.java
@ -0,0 +1,11 @@ |
|||||
|
package a8k.app.hardware.type.pipette_module; |
||||
|
|
||||
|
public enum DistribuType { |
||||
|
JET_DIST, //液面上分配 |
||||
|
SURFACE_DIST, //液体表面分配 |
||||
|
; |
||||
|
|
||||
|
public Integer toInteger() { |
||||
|
return this.ordinal(); |
||||
|
} |
||||
|
} |
@ -1,269 +0,0 @@ |
|||||
package a8k.app.service.lowerctrl; |
|
||||
|
|
||||
|
|
||||
import a8k.app.dao.type.combination.ProjBuildinInfo; |
|
||||
import a8k.app.dao.type.db.ProjExtInfoCard; |
|
||||
import a8k.app.hardware.driver.PipetteCtrlDriverV2; |
|
||||
import a8k.app.hardware.type.A8kEcode; |
|
||||
import a8k.app.service.param.exparam.HbotConsumableExParamMgr; |
|
||||
import a8k.app.service.param.hbotpos.HbotSamplePosParamMgr; |
|
||||
import a8k.app.service.statemgr.ConsumablesMgrService; |
|
||||
import a8k.app.service.statemgr.GStateMgrService; |
|
||||
import a8k.app.service.utils.ZAppChecker; |
|
||||
import a8k.app.type.DeviceRunMode; |
|
||||
import a8k.app.type.JudgeFn; |
|
||||
import a8k.app.type.a8k.ConsumableType; |
|
||||
import a8k.app.type.a8k.Pos3d; |
|
||||
import a8k.app.type.a8k.pos.LargeBufferPos; |
|
||||
import a8k.app.type.a8k.pos.PreReactionPos; |
|
||||
import a8k.app.type.a8k.pos.TipGroupPos; |
|
||||
import a8k.app.type.a8k.pos.TipPos; |
|
||||
import a8k.app.type.exception.AppException; |
|
||||
import a8k.app.type.param.type.A8kSamplePos; |
|
||||
import lombok.RequiredArgsConstructor; |
|
||||
import lombok.extern.slf4j.Slf4j; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
@Component |
|
||||
@Slf4j |
|
||||
@RequiredArgsConstructor |
|
||||
public class LiquidOperationCtrlService { |
|
||||
static public final Integer MIX_VOLUME_UL = 200; |
|
||||
|
|
||||
|
|
||||
private final GStateMgrService gstate; |
|
||||
|
|
||||
/* |
|
||||
* CTRL-SERVICE |
|
||||
*/ |
|
||||
private final HbotMoveExCtrlService hbotMoveExCtrlService; |
|
||||
private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; |
|
||||
|
|
||||
/* |
|
||||
* PARAM-MGR |
|
||||
*/ |
|
||||
private final HbotConsumableExParamMgr hbotConsumableExParamMgr; |
|
||||
/** |
|
||||
* StateMgr |
|
||||
*/ |
|
||||
private final ConsumablesMgrService consumablesMgrService; |
|
||||
private final HbotSamplePosParamMgr hbotSamplePosParamMgr; |
|
||||
|
|
||||
|
|
||||
ProjBuildinInfo projBuildinInfo; |
|
||||
ProjExtInfoCard projExtInfo; |
|
||||
|
|
||||
|
|
||||
synchronized public void setProjContext(ProjBuildinInfo projBuildinInfo, ProjExtInfoCard projExtInfo) { |
|
||||
this.projBuildinInfo = projBuildinInfo; |
|
||||
this.projExtInfo = projExtInfo; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
/** |
|
||||
* 取大瓶缓冲液到探测物质位置 |
|
||||
* @param from 大瓶缓冲液 |
|
||||
* @param topos 探测物质位置 |
|
||||
* @param ul 吸取量 |
|
||||
*/ |
|
||||
public void takeLargeBottleBufferLiquidToProbeSubstance(LargeBufferPos from, PreReactionPos topos, Integer ul) throws AppException { |
|
||||
// 取TIP |
|
||||
// forceTakeTip(); |
|
||||
|
|
||||
// 检查是否有TIP |
|
||||
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
|
||||
// Pos3d largeBottleEndPos = hbotConsumableExParamMgr.getLargeBufferSamplePosEnd(from.group); |
|
||||
// Pos3d largeBottlePos = hbotConsumableExParamMgr.getLargeBufferSamplePos(from.group); |
|
||||
Integer liquidLevel = 0; |
|
||||
|
|
||||
|
|
||||
// |
|
||||
// 刺破探测物质 |
|
||||
// |
|
||||
Pos3d piercePos = hbotConsumableExParamMgr.getProbeSubstancePiercePos(topos.group, topos.index); |
|
||||
hbotMoveExCtrlService.moveTo(piercePos); |
|
||||
pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|
||||
|
|
||||
|
|
||||
// |
|
||||
// 移动到取样位 |
|
||||
// |
|
||||
// hbotMoveExCtrlService.moveToXY(largeBottlePos); |
|
||||
|
|
||||
// |
|
||||
//取样 |
|
||||
// |
|
||||
//清空tip中的液体和空气,同时预先吸入部分空气,以便后续清空由于lld吸入的液体,提高lld的准确性 |
|
||||
{ |
|
||||
//TODO: 取样 |
|
||||
|
|
||||
} |
|
||||
// lddprepare(); |
|
||||
// ldd(largeBottlePos.z, largeBottleEndPos.z, LLD_P_THRESHOLD); |
|
||||
// if (!pipetteCtrlDriverV2.lldIsDetectLiquid() && gstate.isInMode(DeviceRunMode.RealMode)) { |
|
||||
// throw AppException.of(A8kEcode.APPE_TAKE_LARGE_BUFFER_LIQUID_FAIL); |
|
||||
// } |
|
||||
// liquidLevel = pipetteCtrlDriverV2.getReg(PipetteRegIndex.kreg_pipette_zm_pos); |
|
||||
// pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|
||||
// pumpMoveTo(8000, 0.0); |
|
||||
// |
|
||||
// // |
|
||||
// //取样 |
|
||||
// // |
|
||||
// pipetteCtrlDriverV2.zMotorMoveToBlock(liquidLevel); |
|
||||
// if (ul < 100) { |
|
||||
// pumpMoveTo(8000, 50.0);//预先吸入部分空气 |
|
||||
// } else { |
|
||||
// pumpMoveTo(8000, 25.0);//预先吸入部分空气 |
|
||||
// } |
|
||||
// |
|
||||
// aspirate(largeBottleEndPos.z, pipetteGunExParamMgr.getLargeBSBottleLlfVel(), ul * 1.0); |
|
||||
// pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|
||||
|
|
||||
// |
|
||||
// 移动到探测物质的位置 |
|
||||
// |
|
||||
Pos3d toCPos = hbotConsumableExParamMgr.getProbeSubstanceSamplePos(topos.group, topos.index); |
|
||||
hbotMoveExCtrlService.moveTo(toCPos); |
|
||||
// pumpMoveTo(8000, 0.0); |
|
||||
pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|
||||
|
|
||||
// |
|
||||
// 丢弃TIP |
|
||||
// |
|
||||
hbotMoveExCtrlService.initPipetterGun(); |
|
||||
hbotMoveExCtrlService.moveQuickToZero(); |
|
||||
} |
|
||||
|
|
||||
private Pos3d getPreReactionPos(PreReactionPos pos) { |
|
||||
Pos3d toCPos = null; |
|
||||
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
|
||||
toCPos = hbotConsumableExParamMgr.getProbeSubstanceSamplePos(pos.group, pos.index); |
|
||||
} else { |
|
||||
toCPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
|
||||
} |
|
||||
return toCPos; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 取样本 |
|
||||
* @param from 样本位置 |
|
||||
* @param ul 吸取量 |
|
||||
* @throws AppException 异常 |
|
||||
*/ |
|
||||
public void takeSampleOnly(A8kSamplePos from, Integer ul) throws AppException { |
|
||||
log.info("takeSampleOnly: from={},ul={}ul", from, ul); |
|
||||
|
|
||||
// 取TIP |
|
||||
// forceTakeTip(); |
|
||||
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
|
||||
|
|
||||
// |
|
||||
// 取样位 |
|
||||
// |
|
||||
|
|
||||
// 取样 |
|
||||
// Pos3d sampleStartPos = hbotSamplePosParamMgr.getSampleStartPos(from); |
|
||||
// Integer sampleEndZPos = hbotSamplePosParamMgr.getSampleEndPos(from); |
|
||||
Integer liquidLevel = 0; |
|
||||
// 移动到取样位 |
|
||||
// hbotMoveExCtrlService.moveToXY(sampleStartPos); |
|
||||
|
|
||||
//TODO:取样 |
|
||||
{ |
|
||||
|
|
||||
} |
|
||||
//lld |
|
||||
//清空tip中的液体和空气,同时预先吸入部分空气,以便后续清空由于lld吸入的液体,提高lld的准确性 |
|
||||
// lddprepare(); |
|
||||
// ldd(sampleStartPos.z, sampleEndZPos, LLD_P_THRESHOLD); |
|
||||
// if (!pipetteCtrlDriverV2.lldIsDetectLiquid() && gstate.isInMode(DeviceRunMode.RealMode)) { |
|
||||
// throw AppException.of(A8kEcode.APPE_TAKE_SAMPLE_FAIL); |
|
||||
// } |
|
||||
// |
|
||||
// //获取当前液面高度 |
|
||||
// liquidLevel = pipetteCtrlDriverV2.getReg(PipetteRegIndex.kreg_pipette_zm_pos); |
|
||||
// liquidLevel += 10;//保证液面高度 |
|
||||
// |
|
||||
// //取样准备 |
|
||||
// pipetteCtrlDriverV2.zMotorMoveToBlock(sampleStartPos.z); //回到0 |
|
||||
// pumpMoveTo(8000, 0.0); //排空 |
|
||||
// pumpMoveTo(PRE_ASPIRATE_PUMP_VMAX, ASPIRATE_PRE_TAKE); //预先吸入部分空气 |
|
||||
// |
|
||||
// //取样 |
|
||||
// pipetteCtrlDriverV2.zMotorMoveToBlock(liquidLevel); |
|
||||
// aspirate(sampleEndZPos, pipetteGunExParamMgr.getSampleLLFVel(ul * 1.0, from), ul * 1.0); |
|
||||
// pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|
||||
|
|
||||
|
|
||||
} |
|
||||
|
|
||||
|
|
||||
/** |
|
||||
* 取样本到探测物质 |
|
||||
* @param from 样本位置 |
|
||||
* @param pos 预先反应位置P |
|
||||
* @param ul 吸取量 |
|
||||
* @throws AppException 异常 |
|
||||
*/ |
|
||||
public void takeSample(A8kSamplePos from, PreReactionPos pos, Integer ul) throws AppException { |
|
||||
log.info("takeSampleToPreReactionPos: from={}, pos={}, ul={}ul", from, pos, ul); |
|
||||
|
|
||||
takeSampleOnly(from, ul); |
|
||||
|
|
||||
|
|
||||
// |
|
||||
// 移动到反应位 |
|
||||
// |
|
||||
log.info("move to pre reaction pos: {}", pos); |
|
||||
hbotMoveExCtrlService.moveTo(getPreReactionPos(pos)); |
|
||||
|
|
||||
Integer shakeUl = MIX_VOLUME_UL; |
|
||||
Integer shakeTimes = 5; |
|
||||
if (projBuildinInfo != null) { |
|
||||
shakeUl = projBuildinInfo.mixedLiquidMixingVolUl; |
|
||||
shakeTimes = projBuildinInfo.mixedLiquidMixingTimes; |
|
||||
} |
|
||||
//TODO: 吐样&&摇匀 |
|
||||
{ |
|
||||
|
|
||||
} |
|
||||
|
|
||||
//z轴回0 |
|
||||
pipetteCtrlDriverV2.zMotorMoveToZeroPointQuickBlock(); |
|
||||
} |
|
||||
|
|
||||
public void pirceLittleBuffer(PreReactionPos pos) throws AppException { |
|
||||
// forceTakeTip(); |
|
||||
|
|
||||
hbotMoveExCtrlService.moveToLittleBufferPiercePos(pos.group, pos.index); |
|
||||
pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
/** |
|
||||
* 取反应液到反应板上 |
|
||||
* @param pos 反应板位置 |
|
||||
* @throws AppException 异常 |
|
||||
*/ |
|
||||
public void takePreReactionLiquidToReation(PreReactionPos pos) throws AppException { |
|
||||
log.info("takePreReactionLiquidToReactionPos: from pos={}", pos); |
|
||||
// forceTakeTip(); |
|
||||
// Pos3d reactionPos = getPreReactionPos(pos); |
|
||||
// |
|
||||
// hbotMoveExCtrlService.moveToXY(reactionPos); |
|
||||
// pipetteCtrlDriverV2.zMotorMoveByBlock(0); |
|
||||
// makeReserveAir(100); |
|
||||
// |
|
||||
// hbotMoveExCtrlService.moveToZ(reactionPos); |
|
||||
// aspirate(reactionPos.z, 0, (double) REACTION_VOLUME_UL); |
|
||||
// |
|
||||
// hbotMoveExCtrlService.moveToDropLiquidPos(); |
|
||||
// pumpMoveTo(8000, 0.0); |
|
||||
// |
|
||||
// hbotMoveExCtrlService.initPipetterGun(); |
|
||||
// hbotMoveExCtrlService.moveQuickToZero(); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
} |
|
@ -0,0 +1,383 @@ |
|||||
|
package a8k.app.service.module; |
||||
|
|
||||
|
|
||||
|
import a8k.app.dao.type.combination.ProjBuildinInfo; |
||||
|
import a8k.app.dao.type.db.ProjExtInfoCard; |
||||
|
import a8k.app.hardware.driver.PipetteCtrlDriverV2; |
||||
|
import a8k.app.hardware.type.A8kEcode; |
||||
|
import a8k.app.hardware.type.pipette_module.DistribuType; |
||||
|
import a8k.app.hardware.type.pipette_module.cpyidx.ContainerCpyId; |
||||
|
import a8k.app.hardware.type.pipette_module.cpyidx.LiquidConfigCpyIdx; |
||||
|
import a8k.app.hardware.type.pipette_module.param.AspirationParam; |
||||
|
import a8k.app.hardware.type.pipette_module.param.DistribuAllParam; |
||||
|
import a8k.app.service.lowerctrl.HbotMoveExCtrlService; |
||||
|
import a8k.app.service.param.exparam.HbotConsumableExParamMgr; |
||||
|
import a8k.app.service.param.hbotpos.HbotFixedPosParamMgr; |
||||
|
import a8k.app.service.param.hbotpos.HbotSamplePosParamMgr; |
||||
|
import a8k.app.service.statemgr.ConsumablesMgrService; |
||||
|
import a8k.app.service.statemgr.GStateMgrService; |
||||
|
import a8k.app.service.utils.UISender; |
||||
|
import a8k.app.service.utils.ZAppChecker; |
||||
|
import a8k.app.type.a8k.ConsumableType; |
||||
|
import a8k.app.type.a8k.Pos3d; |
||||
|
import a8k.app.type.a8k.pos.LargeBufferPos; |
||||
|
import a8k.app.type.a8k.pos.PreReactionPos; |
||||
|
import a8k.app.type.exception.AppException; |
||||
|
import a8k.app.type.param.type.A8kSamplePos; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
@Slf4j |
||||
|
@RequiredArgsConstructor |
||||
|
public class LiquidOperationCtrlModule { |
||||
|
static public final Integer MIX_VOLUME_UL = 200; |
||||
|
|
||||
|
|
||||
|
private final GStateMgrService gstate; |
||||
|
|
||||
|
/* |
||||
|
* CTRL-SERVICE |
||||
|
*/ |
||||
|
private final HbotMoveExCtrlService hbotMoveExCtrlService; |
||||
|
private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; |
||||
|
|
||||
|
/* |
||||
|
* PARAM-MGR |
||||
|
*/ |
||||
|
private final HbotConsumableExParamMgr hbotConsumableExParamMgr; |
||||
|
/** |
||||
|
* StateMgr |
||||
|
*/ |
||||
|
private final ConsumablesMgrService consumablesMgrService; |
||||
|
private final HbotSamplePosParamMgr hbotSamplePosParamMgr; |
||||
|
private final HbotFixedPosParamMgr hbotFixedPosParamMgr; |
||||
|
|
||||
|
private final TipMgrModule tipMgrModule; |
||||
|
|
||||
|
|
||||
|
ProjBuildinInfo projBuildinInfo; |
||||
|
ProjExtInfoCard projExtInfo; |
||||
|
|
||||
|
|
||||
|
synchronized public void setProjContext(ProjBuildinInfo projBuildinInfo, ProjExtInfoCard projExtInfo) { |
||||
|
this.projBuildinInfo = projBuildinInfo; |
||||
|
this.projExtInfo = projExtInfo; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 取大瓶缓冲液到探测物质位置 |
||||
|
* @param from 大瓶缓冲液 |
||||
|
* @param topos 探测物质位置 |
||||
|
* @param ul 吸取量 |
||||
|
*/ |
||||
|
public void takeLargeBottleBufferLiquidToProbeSubstance(LargeBufferPos from, PreReactionPos topos, Integer ul) throws AppException { |
||||
|
// 取TIP |
||||
|
tipMgrModule.tryTakeTip(); |
||||
|
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
||||
|
|
||||
|
Pos3d largeBSContainerPos = hbotConsumableExParamMgr.getLargeBuffer(from.group);//大瓶缓冲液位置 |
||||
|
Pos3d probeSubstanceContainerPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(topos.group, topos.index);//探测物质位置 |
||||
|
Pos3d probeSubstancePiercePos = hbotConsumableExParamMgr.getProbeSubstancePiercePos(topos.group, topos.index);//探测物质刺破位置 |
||||
|
|
||||
|
|
||||
|
// 刺破探测物质 |
||||
|
UISender.txInfoMsg(log, "刺破探测物质:%s" + topos); |
||||
|
hbotMoveExCtrlService.moveToXY(probeSubstancePiercePos); |
||||
|
pipetteCtrlDriverV2.pierceThroughBlock(ContainerCpyId.DetectSubstancesCup, probeSubstanceContainerPos.z); |
||||
|
|
||||
|
// 移动到取样位 && 取样 |
||||
|
UISender.txInfoMsg(log, "移动到大瓶缓冲液位置:%s", largeBSContainerPos); |
||||
|
hbotMoveExCtrlService.moveToXY(largeBSContainerPos); |
||||
|
// 预吸取 |
||||
|
UISender.txInfoMsg(log, "预吸取大瓶缓冲液:%dul", ul); |
||||
|
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
||||
|
ul * 10, |
||||
|
largeBSContainerPos.z, |
||||
|
ContainerCpyId.LargeBufferCup, |
||||
|
LiquidConfigCpyIdx.BufferSolution, |
||||
|
0, |
||||
|
1, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0 |
||||
|
)); |
||||
|
|
||||
|
// 移动到探测物质位置,吐液 |
||||
|
|
||||
|
|
||||
|
// 移动到取样位 |
||||
|
UISender.txInfoMsg(log, "移动到探测物质位置:%s", probeSubstanceContainerPos); |
||||
|
hbotMoveExCtrlService.moveToXY(probeSubstanceContainerPos); |
||||
|
// 吐液 |
||||
|
UISender.txInfoMsg(log, "吐液到探测物质位置:%dul", ul); |
||||
|
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
||||
|
probeSubstanceContainerPos.z, |
||||
|
ContainerCpyId.DetectSubstancesCup, |
||||
|
LiquidConfigCpyIdx.NotSet, |
||||
|
true, |
||||
|
DistribuType.JET_DIST, |
||||
|
0, |
||||
|
0, |
||||
|
true |
||||
|
)); |
||||
|
// 丢弃TIP |
||||
|
UISender.txInfoMsg(log, "丢弃TIP"); |
||||
|
tipMgrModule.dropTip(); |
||||
|
|
||||
|
hbotMoveExCtrlService.moveQuickToZero(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
ContainerCpyId a8kSamplePosToContainerCpyId(A8kSamplePos a8kSamplePos) { |
||||
|
return switch (a8kSamplePos) { |
||||
|
case EmergencyTubePos, BloodSTubePos -> ContainerCpyId.ShortWholeBufferTube; |
||||
|
case BloodHTubePos -> ContainerCpyId.HighWholeBufferTube; |
||||
|
case MiniBloodPos -> ContainerCpyId.MiniBlood; |
||||
|
case Bulltube1P5Pos -> ContainerCpyId.BulletTube1P5; |
||||
|
case Bulltube0P5Pos -> ContainerCpyId.BulletTube0P5; |
||||
|
case StoolTestTubePos -> ContainerCpyId.StoolTestTube; |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 取样本 |
||||
|
* @param from 样本位置 |
||||
|
* @param ul 吸取量 |
||||
|
* @throws AppException 异常 |
||||
|
*/ |
||||
|
public void takeSampleOnly(A8kSamplePos from, Integer ul) throws AppException { |
||||
|
log.info("takeSampleOnly: from={},ul={}ul", from, ul); |
||||
|
|
||||
|
Pos3d sampleContainerPos = hbotSamplePosParamMgr.getSampleContainerPos(from);//样本位置 |
||||
|
|
||||
|
|
||||
|
// 取TIP |
||||
|
tipMgrModule.tryTakeTip(); |
||||
|
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
||||
|
|
||||
|
//移动到取样位 |
||||
|
UISender.txInfoMsg(log, "移动到样本位置:%s", sampleContainerPos); |
||||
|
hbotMoveExCtrlService.moveToXY(sampleContainerPos); |
||||
|
|
||||
|
//取样 |
||||
|
UISender.txInfoMsg(log, "取样:%dul", ul); |
||||
|
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
||||
|
ul * 10, |
||||
|
sampleContainerPos.z, |
||||
|
a8kSamplePosToContainerCpyId(from), |
||||
|
LiquidConfigCpyIdx.NotSet, |
||||
|
0, |
||||
|
1, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0 |
||||
|
)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public void pirceLittleBuffer(PreReactionPos pos) throws AppException { |
||||
|
// 取TIP |
||||
|
tipMgrModule.tryTakeTip(); |
||||
|
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
||||
|
|
||||
|
Pos3d pircePos; |
||||
|
ContainerCpyId containerCpyId; |
||||
|
|
||||
|
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
||||
|
pircePos = hbotConsumableExParamMgr.getProbeSubstancePiercePos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
||||
|
} else { |
||||
|
pircePos = hbotConsumableExParamMgr.getLittleBufferPiercePos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.LittleBufferCup; |
||||
|
} |
||||
|
|
||||
|
pipetteCtrlDriverV2.pierceThroughBlock(containerCpyId, pircePos.z); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 取样本到探测物质 |
||||
|
* @param from 样本位置 |
||||
|
* @param pos 预先反应位置P |
||||
|
* @param ul 吸取量 |
||||
|
* @throws AppException 异常 |
||||
|
*/ |
||||
|
public void takeSampleToPreReactionPos(A8kSamplePos from, PreReactionPos pos, Integer ul) throws AppException { |
||||
|
log.info("takeSampleToPreReactionPos: from={}, pos={}, ul={}ul", from, pos, ul); |
||||
|
takeSampleOnly(from, ul); |
||||
|
|
||||
|
Pos3d reactionPos; |
||||
|
ContainerCpyId containerCpyId; |
||||
|
Integer shakeUl = MIX_VOLUME_UL; |
||||
|
Integer shakeTimes = 5; |
||||
|
|
||||
|
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
||||
|
reactionPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
||||
|
} else { |
||||
|
reactionPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.LittleBufferCup; |
||||
|
} |
||||
|
if (projBuildinInfo != null) { |
||||
|
shakeUl = projBuildinInfo.mixedLiquidMixingVolUl; |
||||
|
shakeTimes = projBuildinInfo.mixedLiquidMixingTimes; |
||||
|
} |
||||
|
|
||||
|
// 移动到反应位 |
||||
|
UISender.txInfoMsg(log, "移动到预先反应位置:%s", reactionPos); |
||||
|
hbotMoveExCtrlService.moveToXY(reactionPos); |
||||
|
|
||||
|
//z轴移动到反应位 |
||||
|
UISender.txInfoMsg(log, "分配样本"); |
||||
|
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
||||
|
reactionPos.z, |
||||
|
containerCpyId, |
||||
|
LiquidConfigCpyIdx.BufferSolution, |
||||
|
false, |
||||
|
DistribuType.SURFACE_DIST, |
||||
|
shakeUl * 10, // 预先反应位置的液体量 |
||||
|
shakeTimes, |
||||
|
true |
||||
|
)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 取样本液到预反应位,混合后,再取样 |
||||
|
* @param from |
||||
|
* @param pos |
||||
|
* @param ul |
||||
|
* @throws AppException |
||||
|
*/ |
||||
|
public void takeSampleToPreReactionPosAndAspirate(A8kSamplePos from, PreReactionPos pos, Integer ul) throws AppException { |
||||
|
log.info("takeSampleToPreReactionPosAndTakeToReactionPlate: from={}, pos={}, ul={}ul", from, pos, ul); |
||||
|
takeSampleOnly(from, ul); |
||||
|
|
||||
|
Pos3d reactionPos; |
||||
|
ContainerCpyId containerCpyId; |
||||
|
Integer shakeUl = MIX_VOLUME_UL; |
||||
|
Integer shakeTimes = 5; |
||||
|
|
||||
|
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
||||
|
reactionPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
||||
|
} else { |
||||
|
reactionPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.LittleBufferCup; |
||||
|
} |
||||
|
if (projBuildinInfo != null) { |
||||
|
shakeUl = projBuildinInfo.mixedLiquidMixingVolUl; |
||||
|
shakeTimes = projBuildinInfo.mixedLiquidMixingTimes; |
||||
|
} |
||||
|
|
||||
|
// 移动到反应位 |
||||
|
UISender.txInfoMsg(log, "移动到预先反应位置:%s", reactionPos); |
||||
|
hbotMoveExCtrlService.moveToXY(reactionPos); |
||||
|
|
||||
|
//z轴移动到反应位 |
||||
|
UISender.txInfoMsg(log, "分配样本"); |
||||
|
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
||||
|
reactionPos.z, |
||||
|
containerCpyId, |
||||
|
LiquidConfigCpyIdx.BufferSolution, |
||||
|
false, |
||||
|
DistribuType.SURFACE_DIST, |
||||
|
shakeUl * 10, // 预先反应位置的液体量 |
||||
|
shakeTimes, |
||||
|
false |
||||
|
)); |
||||
|
|
||||
|
UISender.txInfoMsg(log, "取混合液"); |
||||
|
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
||||
|
750, // 预先反应位置的液体量 |
||||
|
reactionPos.z, |
||||
|
containerCpyId, |
||||
|
LiquidConfigCpyIdx.BufferSolution, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0 |
||||
|
)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 取反应液到反应板上 |
||||
|
* @param pos 反应板位置 |
||||
|
* @throws AppException 异常 |
||||
|
*/ |
||||
|
public void takePreReactionLiquid(PreReactionPos pos) throws AppException { |
||||
|
log.info("takePreReactionLiquidToReactionPos: from pos={}", pos); |
||||
|
|
||||
|
tipMgrModule.tryTakeTip(); |
||||
|
|
||||
|
Pos3d reactionPos; |
||||
|
ContainerCpyId containerCpyId; |
||||
|
|
||||
|
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
||||
|
reactionPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
||||
|
} else { |
||||
|
reactionPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
||||
|
containerCpyId = ContainerCpyId.LittleBufferCup; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
UISender.txInfoMsg(log, "移动到预先反应位置:%s", reactionPos); |
||||
|
hbotMoveExCtrlService.moveToXY(reactionPos); |
||||
|
|
||||
|
UISender.txInfoMsg(log, "取混合液"); |
||||
|
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
||||
|
750, // 预先反应位置的液体量 |
||||
|
reactionPos.z, |
||||
|
containerCpyId, |
||||
|
LiquidConfigCpyIdx.BufferSolution, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0, |
||||
|
0 |
||||
|
)); |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
public void dropLiquidToReactionPlate() throws AppException { |
||||
|
log.info("dropLiquidToReactionPlate"); |
||||
|
|
||||
|
Pos3d dropLiquidPos = hbotFixedPosParamMgr.getDropLiquidPos(); |
||||
|
|
||||
|
|
||||
|
UISender.txInfoMsg(log, "移动到预先反应位置:%s", dropLiquidPos); |
||||
|
hbotMoveExCtrlService.moveToXY(dropLiquidPos); |
||||
|
|
||||
|
UISender.txInfoMsg(log, "分配到反应板位置"); |
||||
|
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
||||
|
dropLiquidPos.z, |
||||
|
ContainerCpyId.ReactionPlate, |
||||
|
LiquidConfigCpyIdx.BufferSolution, |
||||
|
false, |
||||
|
DistribuType.JET_DIST, |
||||
|
0, |
||||
|
0, |
||||
|
true |
||||
|
)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue