Browse Source

结果扫描异步执行

tags/v0
sige 1 year ago
parent
commit
bf41bcf83e
  1. BIN
      app.db
  2. 16
      src/main/java/com/iflytop/a800/device/DeviceComponent.java
  3. 11
      src/main/java/com/iflytop/a800/device/Incubator.java
  4. 3
      src/main/java/com/iflytop/a800/device/Scanner.java
  5. 41
      src/main/java/com/iflytop/a800/task/TubeTestTask.java

BIN
app.db

16
src/main/java/com/iflytop/a800/device/DeviceComponent.java

@ -16,7 +16,8 @@ abstract public class DeviceComponent {
// lock // lock
public DeviceComponentLock lock( String name ) { public DeviceComponentLock lock( String name ) {
LOG.info("LOCK : {}", name);
var comName = this.getClass().getSimpleName();
LOG.info("[Device:{}] LOCK => {}", comName, name);
var lock = new DeviceComponentLock(); var lock = new DeviceComponentLock();
lock.name = name; lock.name = name;
@ -27,28 +28,33 @@ abstract public class DeviceComponent {
} }
} }
LOG.info("LOCK WAITING : {}", name);
LOG.info("[Device:{}] LOCK WAITING => {}", comName, name);
synchronized ( lock ) {
try { try {
lock.wait(); lock.wait();
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
}
LOG.info("LOCK DONE : {}", name);
LOG.info("[Device:{}] LOCK DONE => {}", comName, name);
return lock; return lock;
} }
// unlock // unlock
public void unlock( DeviceComponentLock lock ) { public void unlock( DeviceComponentLock lock ) {
var comName = this.getClass().getSimpleName();
synchronized ( this.locks ) { synchronized ( this.locks ) {
LOG.info("UNLOCK : {}", lock.name);
LOG.info("[Device:{}] UNLOCK => {}", comName, lock.name);
this.locks.remove(lock); this.locks.remove(lock);
if ( this.locks.isEmpty() ) { if ( this.locks.isEmpty() ) {
return ; return ;
} }
}
var next = this.locks.get(0); var next = this.locks.get(0);
LOG.info("NOTIFY NEXT : {}", next.name);
LOG.info("[Device:{}] NOTIFY NEXT => {}", comName, next.name);
synchronized ( next ) {
next.notifyAll(); next.notifyAll();
} }
} }

11
src/main/java/com/iflytop/a800/device/Incubator.java

@ -1,6 +1,7 @@
package com.iflytop.a800.device; package com.iflytop.a800.device;
import com.iflytop.a800.resource.IncubatorSlot; import com.iflytop.a800.resource.IncubatorSlot;
import com.iflytop.a800.resource.TestCard; import com.iflytop.a800.resource.TestCard;
import com.iflytop.uf.UfActuatorCmdExecutor;
import com.iflytop.uf.UfCmdSnippetExecutor; import com.iflytop.uf.UfCmdSnippetExecutor;
import com.iflytop.uf.model.UfMdbOption; import com.iflytop.uf.model.UfMdbOption;
import java.util.ArrayList; import java.util.ArrayList;
@ -23,6 +24,14 @@ public class Incubator extends DeviceComponent {
} }
} }
// 移动至提交位置
public void moveToCommitPos( IncubatorSlot slot ) {
Integer commitStartPos = UfMdbOption.getInteger("IncubatorSlotCommitStartPos");
Integer commitDistance = UfMdbOption.getInteger("IncubatorSlotCommitDistance");
int commitPos = commitStartPos + commitDistance * slot.index;
UfActuatorCmdExecutor.execute("MotorIncubatorRotate", "motor_easy_move_to", Integer.toString(commitPos));
}
// 推送新卡片 // 推送新卡片
public IncubatorSlot pushNewCard(TestCard card) { public IncubatorSlot pushNewCard(TestCard card) {
var lock = this.lock("PushNewCard"); var lock = this.lock("PushNewCard");
@ -63,13 +72,11 @@ public class Incubator extends DeviceComponent {
// 退出到扫描 // 退出到扫描
public void exitCardToScanner( IncubatorSlot slot ) { public void exitCardToScanner( IncubatorSlot slot ) {
var lock = this.lock("ExitCardToScanner");
Integer startPos = UfMdbOption.getInteger("IncubatorSlotExitStartPos"); Integer startPos = UfMdbOption.getInteger("IncubatorSlotExitStartPos");
Integer distance = UfMdbOption.getInteger("IncubatorSlotExitDistance"); Integer distance = UfMdbOption.getInteger("IncubatorSlotExitDistance");
Integer slotPos = startPos + distance * slot.index; Integer slotPos = startPos + distance * slot.index;
Map<String,Object> params = Map.of("slot", slotPos); Map<String,Object> params = Map.of("slot", slotPos);
UfCmdSnippetExecutor.execute("IncubatorTestCardExitToScanner", params); UfCmdSnippetExecutor.execute("IncubatorTestCardExitToScanner", params);
slot.card = null; slot.card = null;
this.unlock(lock);
} }
} }

3
src/main/java/com/iflytop/a800/device/Scanner.java

@ -2,13 +2,12 @@ package com.iflytop.a800.device;
import com.iflytop.uf.UfActuatorCmdExecutor; import com.iflytop.uf.UfActuatorCmdExecutor;
import com.iflytop.uf.UfCmdSnippetExecutor; import com.iflytop.uf.UfCmdSnippetExecutor;
import com.iflytop.uf.util.UfCommon; import com.iflytop.uf.util.UfCommon;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
public class Scanner {
public class Scanner extends DeviceComponent {
// 扫描类型F // 扫描类型F
public void scanTypeF() { public void scanTypeF() {
UfCmdSnippetExecutor.execute("SampleResultAnalysisTypeF"); UfCmdSnippetExecutor.execute("SampleResultAnalysisTypeF");

41
src/main/java/com/iflytop/a800/task/TubeTestTask.java

@ -164,7 +164,6 @@ public class TubeTestTask extends TaskBase {
case "mixing" : this.executeStepMixing(stepNode); break; case "mixing" : this.executeStepMixing(stepNode); break;
case "drop-tip" : this.executeStepDropTip(stepNode); break; case "drop-tip" : this.executeStepDropTip(stepNode); break;
case "incubate" : this.executeStepIncubate(stepNode); break; case "incubate" : this.executeStepIncubate(stepNode); break;
case "analysis" : this.executeStepAnalysis(stepNode); break;
case "sampling-done" : this.executeStepSamplingDone(stepNode); break; case "sampling-done" : this.executeStepSamplingDone(stepNode); break;
} }
} catch ( InterruptedException e ) { } catch ( InterruptedException e ) {
@ -172,7 +171,9 @@ public class TubeTestTask extends TaskBase {
} }
} }
this.analysis();
this.taskFinish(); this.taskFinish();
this.log("项目测试结束");
} }
// 采样完成 // 采样完成
@ -305,6 +306,7 @@ public class TubeTestTask extends TaskBase {
// 提交样本至孵育盘测试卡 // 提交样本至孵育盘测试卡
var incubatorLock = device.incubator.lock("SampleCommit"); var incubatorLock = device.incubator.lock("SampleCommit");
device.incubator.moveToCommitPos(this.incubatorSlot);
Integer volume = stepNode.get("volume").asInt(); Integer volume = stepNode.get("volume").asInt();
pipette.aspirateFromBufferTubeAndDispenseToTestCard(this.bufferTube, volume); pipette.aspirateFromBufferTubeAndDispenseToTestCard(this.bufferTube, volume);
device.incubator.unlock(incubatorLock); device.incubator.unlock(incubatorLock);
@ -327,16 +329,40 @@ public class TubeTestTask extends TaskBase {
this.log("孵育完成,等待扫描结果"); this.log("孵育完成,等待扫描结果");
} }
// 扫描
private void executeStepAnalysis( JsonNode stepNode ) {
this.log("扫描结果");
// 扫描分析结果
private void analysis() {
var asyncEnable = UfMdbOption.getBoolean("AnalysisAsyncEnable", false);
if ( !asyncEnable ) {
this.executeAnalysis();
this.log("结果分析完成");
return ;
}
var thread = new Thread(this::executeAnalysis);
thread.start();
this.taskWait("AnalysisDone");
this.log("结果分析完成");
}
/**
* 执行扫描分析操作
*/
private void executeAnalysis() {
this.log("结果扫描");
Device device = Device.getInstance(); Device device = Device.getInstance();
device.incubator.exitCardToScanner(this.incubatorSlot);
var scanner = device.scanner; var scanner = device.scanner;
var scannerLock = scanner.lock("ScanResult");
var incubator = device.incubator;
var exitCardLock = incubator.lock("ExitCard");
incubator.exitCardToScanner(this.incubatorSlot);
incubator.unlock(exitCardLock);
scanner.scanTypeF(); scanner.scanTypeF();
var scanResult = scanner.readResult(); var scanResult = scanner.readResult();
scanner.dropCard(); scanner.dropCard();
scanner.unlock(scannerLock);
// 计算 // 计算
var algo = new ScanResultAnalysisAlgo(); var algo = new ScanResultAnalysisAlgo();
@ -395,6 +421,11 @@ public class TubeTestTask extends TaskBase {
this.test.result = UfJsonHelper.objectToJson(results); this.test.result = UfJsonHelper.objectToJson(results);
this.test.save(); this.test.save();
var asyncEnable = UfMdbOption.getBoolean("AnalysisAsyncEnable", false);
if ( asyncEnable ) {
this.setStatus("READY");
}
} }
/** /**

Loading…
Cancel
Save