|
|
@ -1,7 +1,12 @@ |
|
|
|
package com.iflytop.digester.deviceinstance; |
|
|
|
import com.iflytop.digester.model.MdbRuntimeLog; |
|
|
|
import com.iflytop.digester.underframework.UfActuatorCmdExecutor; |
|
|
|
import com.iflytop.digester.underframework.UfApplication; |
|
|
|
import com.iflytop.digester.underframework.UfCmdSnippetExecutor; |
|
|
|
import com.iflytop.digester.underframework.dao.model.UfMdbNotification; |
|
|
|
import com.iflytop.digester.underframework.dao.model.UfMdbOption; |
|
|
|
import com.iflytop.digester.underframework.dao.model.UfMdbRuntimeVariable; |
|
|
|
import com.iflytop.digester.underframework.util.UfCommon; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
@ -10,6 +15,8 @@ import java.util.Map; |
|
|
|
public class LiquidAdditionInstance { |
|
|
|
// list of liquids |
|
|
|
private List<LiquidAdditionLiquid> liquids; |
|
|
|
// lock for bucket empty |
|
|
|
private final Object bucketEmptyLock = new Object(); |
|
|
|
|
|
|
|
// setup |
|
|
|
public void setup() { |
|
|
@ -38,9 +45,7 @@ public class LiquidAdditionInstance { |
|
|
|
public void addLiquidToTubes(List<Integer> tubes, List<Integer> pumpIndexes, int volume ) { |
|
|
|
var pumpGroupOutIndex = pumpIndexes.get(0); |
|
|
|
var pumpGroupInIndex = pumpIndexes.get(1); |
|
|
|
var liquid = liquids.get(pumpGroupOutIndex/2); |
|
|
|
var type = liquids.get(pumpGroupOutIndex/2).type; |
|
|
|
var rotateDistance = this.convertVolumeToPumpRotationDistance(type, volume); |
|
|
|
this.bucketVolumeCheck(pumpGroupOutIndex); |
|
|
|
|
|
|
|
for ( int batchIndex=0; batchIndex<4; batchIndex++ ) { |
|
|
|
// 外圈 |
|
|
@ -49,16 +54,10 @@ public class LiquidAdditionInstance { |
|
|
|
if ( hasGoutTout || hasGoutTin ) { |
|
|
|
UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.Out." + batchIndex); |
|
|
|
if ( hasGoutTout ) { |
|
|
|
var snippetKey = "LiquidAdditionPump." + pumpGroupOutIndex; |
|
|
|
Map<String,Object> snippetParams = Map.of("volume", rotateDistance); |
|
|
|
UfCmdSnippetExecutor.execute(snippetKey, snippetParams); |
|
|
|
liquid.volume -= volume; |
|
|
|
this.pump(pumpGroupOutIndex, volume); |
|
|
|
} |
|
|
|
if ( hasGoutTin ) { |
|
|
|
var snippetKey = "LiquidAdditionPump." + pumpGroupInIndex; |
|
|
|
Map<String,Object> snippetParams = Map.of("volume", rotateDistance); |
|
|
|
UfCmdSnippetExecutor.execute(snippetKey, snippetParams); |
|
|
|
liquid.volume -= volume; |
|
|
|
this.pump(pumpGroupInIndex, volume); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -68,16 +67,10 @@ public class LiquidAdditionInstance { |
|
|
|
if ( hasGinTout || hasGinTin ) { |
|
|
|
UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.In." + batchIndex); |
|
|
|
if ( hasGinTout ) { |
|
|
|
var snippetKey = "LiquidAdditionPump." + pumpGroupOutIndex; |
|
|
|
Map<String,Object> snippetParams = Map.of("volume", rotateDistance); |
|
|
|
UfCmdSnippetExecutor.execute(snippetKey, snippetParams); |
|
|
|
liquid.volume -= volume; |
|
|
|
this.pump(pumpGroupOutIndex, volume); |
|
|
|
} |
|
|
|
if ( hasGinTin ) { |
|
|
|
var snippetKey = "LiquidAdditionPump." + pumpGroupInIndex; |
|
|
|
Map<String,Object> snippetParams = Map.of("volume", rotateDistance); |
|
|
|
UfCmdSnippetExecutor.execute(snippetKey, snippetParams); |
|
|
|
liquid.volume -= volume; |
|
|
|
this.pump(pumpGroupInIndex, volume); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -85,6 +78,68 @@ public class LiquidAdditionInstance { |
|
|
|
UfCmdSnippetExecutor.execute("LiquidAdditionReset"); |
|
|
|
} |
|
|
|
|
|
|
|
// add liquid to tubes by given pump indexes |
|
|
|
private void pump( Integer pumpIndex, Integer volume ) { |
|
|
|
var liquid = liquids.get((0==pumpIndex%2) ? pumpIndex/2 : (pumpIndex-1)/2); |
|
|
|
var type = liquid.type; |
|
|
|
|
|
|
|
var snippetKey = "LiquidAdditionPump." + pumpIndex; |
|
|
|
var rotateDistance = this.convertVolumeToPumpRotationDistance(type, volume); |
|
|
|
Map<String,Object> snippetParams = Map.of("volume", rotateDistance); |
|
|
|
UfCmdSnippetExecutor.execute(snippetKey, snippetParams); |
|
|
|
|
|
|
|
// update liquid volume |
|
|
|
liquid.setVolumeByConsumed(volume); |
|
|
|
MdbRuntimeLog.log("LiquidAdd", "酸液消耗:%s - %d [%d/%d]", type, volume, liquid.volume, liquid.totalVolume); |
|
|
|
} |
|
|
|
|
|
|
|
// 检查液体量 |
|
|
|
private void bucketVolumeCheck( Integer pumpIndex ) { |
|
|
|
var liquid = liquids.get((0==pumpIndex%2) ? pumpIndex/2 : (pumpIndex-1)/2); |
|
|
|
var stateStr = UfActuatorCmdExecutor.execute("LiquidBucketVolumeIO", "module_readio"); |
|
|
|
var state = Integer.parseInt(stateStr); |
|
|
|
MdbRuntimeLog.log("LiquidBucketVolumeIO", "液桶状态:[%s]", Integer.toString(state, 2)); |
|
|
|
var bucketState = state >> liquid.bucketIndex & 1; |
|
|
|
if ( 1 == bucketState ) { // 酸液足够 |
|
|
|
return ; |
|
|
|
} |
|
|
|
|
|
|
|
// 如果缺少的液体不是水, 则需要发送通知手动补充 |
|
|
|
var env = UfApplication.getApp().getEnv(); |
|
|
|
Integer waterBucketIndex = env.getProperty("app.liquidWaterBucketIndex", Integer.class); |
|
|
|
assert waterBucketIndex != null; |
|
|
|
if (!waterBucketIndex.equals(liquid.bucketIndex)) { |
|
|
|
UfMdbNotification.action("LiquidBucketEmpty", Map.of("liquid", liquid)); |
|
|
|
MdbRuntimeLog.log("LiquidBucketEmpty", "酸液不足,等待手动补充完成 : %s", liquid.type); |
|
|
|
synchronized ( this.bucketEmptyLock ) { |
|
|
|
try { |
|
|
|
this.bucketEmptyLock.wait(); |
|
|
|
MdbRuntimeLog.log("LiquidBucketEmpty", "酸液补充完成"); |
|
|
|
} catch (InterruptedException e) { |
|
|
|
throw new RuntimeException(e); |
|
|
|
} |
|
|
|
} |
|
|
|
this.bucketVolumeCheck(pumpIndex); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// 水桶液位不足,自动补充 |
|
|
|
MdbRuntimeLog.log("WaterBucketEmpty", "水桶液位不足,自动补充"); |
|
|
|
UfActuatorCmdExecutor.execute("LiquidBucketVolumeIO", "module_writeio", "8,1"); |
|
|
|
do { |
|
|
|
// 检查上限位是否达到 |
|
|
|
var waterStateStr = UfActuatorCmdExecutor.execute("LiquidBucketVolumeIO", "module_readio"); |
|
|
|
var waterState = Integer.parseInt(waterStateStr); |
|
|
|
boolean isBucketFull = 1 == (waterState >> 12 & 1); |
|
|
|
if ( isBucketFull ) { |
|
|
|
break; |
|
|
|
} |
|
|
|
UfCommon.delay(100); |
|
|
|
} while ( true ); |
|
|
|
UfActuatorCmdExecutor.execute("LiquidBucketVolumeIO", "module_writeio", "8,0"); |
|
|
|
MdbRuntimeLog.log("WaterBucketEmpty", "水桶液位补充完成"); |
|
|
|
} |
|
|
|
|
|
|
|
// 针对试管加液 |
|
|
|
public void addLiquidToTubes(List<Integer> tubes, String type, int volume ) { |
|
|
|
var pumpIndexes = this.getPumpIndexForGroupOutAndIn(type); |
|
|
@ -132,4 +187,13 @@ public class LiquidAdditionInstance { |
|
|
|
} |
|
|
|
UfCmdSnippetExecutor.execute("LiquidAddShakeStop"); |
|
|
|
} |
|
|
|
|
|
|
|
// 酸液更换完成 |
|
|
|
public void liquidNewBucket( Integer index ) { |
|
|
|
var liquid = liquids.get(index); |
|
|
|
liquid.setVolume(liquid.totalVolume); |
|
|
|
synchronized ( this.bucketEmptyLock ) { |
|
|
|
this.bucketEmptyLock.notify(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |