47 changed files with 417 additions and 629 deletions
-
15src/main/java/a8k/OS.java
-
15src/main/java/a8k/controler/api/v1/app/assistant/ApiRetTestControler.java
-
1src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java
-
9src/main/java/a8k/hardware/A8kCanBusService.java
-
163src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java
-
20src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java
-
4src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java
-
4src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java
-
2src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
-
11src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java
-
32src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java
-
6src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java
-
25src/main/java/a8k/service/app/appstate/statemgr/IncubationPlateStateMgrService.java
-
24src/main/java/a8k/service/app/appstate/statemgr/ProjectContextMgrService.java
-
7src/main/java/a8k/service/app/appstate/statemgr/TubeStateMgrService.java
-
10src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java
-
4src/main/java/a8k/service/app/appstate/type/ProjectTaskContext.java
-
1src/main/java/a8k/service/app/devicectrl/ctrlservice/ConsumablesScanCtrlService.java
-
5src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java
-
2src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java
-
3src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java
-
6src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java
-
4src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java
-
6src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java
-
2src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java
-
4src/main/java/a8k/service/app/devicectrl/exdriver/TubeTransportExDriver.java
-
5src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java
-
2src/main/java/a8k/service/app/devicectrl/param/calibration/PipetteGunLLDParamCalibration.java
-
6src/main/java/a8k/service/app/devicectrl/param/ext_param_mgr/PipetteGunParamExMgr.java
-
20src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java
-
26src/main/java/a8k/service/app/erroranalyzer/ErrorAnalyzer.java
-
123src/main/java/a8k/service/bases/ActionReactorService.java
-
2src/main/java/a8k/service/test/MainflowCtrlTestService.java
-
2src/main/java/a8k/service/test/PipetteGunTest.java
-
4src/main/java/a8k/type/appret/ApiV1Ret.java
-
4src/main/java/a8k/type/appret/AppRetV1.java
-
28src/main/java/a8k/type/ecode/AECodeError.java
-
13src/main/java/a8k/type/ecode/AECommonError.java
-
22src/main/java/a8k/type/ecode/AEUnkownExceptionError.java
-
16src/main/java/a8k/type/exception/AppException.java
-
22src/main/java/a8k/type/exception/MutiAppException.java
-
7src/main/java/a8k/type/exception/ZAppInterruptException.java
-
53src/main/java/a8k/utils/ActionParallerExceutor.java
-
1src/main/java/a8k/utils/AppExceptionBuilder.java
-
22src/main/java/a8k/utils/ProjProcessContextUtils.java
-
9src/main/java/a8k/utils/ZJsonHelper.java
@ -0,0 +1,26 @@ |
|||
package a8k.service.app.erroranalyzer; |
|||
|
|||
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
|||
import a8k.type.ecode.AppError; |
|||
|
|||
import java.util.List; |
|||
|
|||
public class ErrorAnalyzer { |
|||
static public Boolean isFatalError(A8kEcode ecode) { |
|||
if (ecode.index >= A8kEcode.LOW_ERROR_HARDWARE_ERROR_START.index) { |
|||
//部分底层错误,属于非必须停机的错误 |
|||
return !ecode.equals(A8kEcode.LOW_ERROR_PIPETTE_ERROR_TIP_POP_ERROR) |
|||
&& !ecode.equals(A8kEcode.LOW_ERROR_PIPETTE_ERROR_LLD_ERROR); |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
static public Boolean isContainFatalError(List<AppError> errors) { |
|||
for (AppError error : errors) { |
|||
if (isFatalError(error.code)) { |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
} |
@ -1,123 +0,0 @@ |
|||
package a8k.service.bases; |
|||
|
|||
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; |
|||
import a8k.extapi_controler.utils.ExtApiStatu; |
|||
import a8k.extapi_controler.utils.ExtApiFn; |
|||
import a8k.extapi_controler.utils.ExtApiTab; |
|||
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
|||
import a8k.type.ZFunction; |
|||
import a8k.type.exception.AppException; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
/** |
|||
* 动作单步调试服务, |
|||
* 所有使用dosome接口的动作都可以被单步调试 |
|||
*/ |
|||
@Component |
|||
@ExtApiTab(cfg = ExtApiTabConfig.ActionReactorService) |
|||
public class ActionReactorService { |
|||
public enum DoWhatNext { |
|||
DoNextAction, |
|||
ReDoAction, |
|||
} |
|||
|
|||
static Logger logger = LoggerFactory.getLogger(ActionReactorService.class); |
|||
|
|||
static class ORDER { |
|||
static final int doNextStep = 1; |
|||
static final int reDoStep = 2; |
|||
static final int breakAction = 3; |
|||
static final int fullSpeedRun = 6; |
|||
static final int singleStepRun = 7; |
|||
|
|||
} |
|||
|
|||
Boolean reDo = false; |
|||
Boolean doNext = false; |
|||
Boolean breakAction = false; |
|||
Boolean fullSpeedRun = true; |
|||
String curStep; |
|||
|
|||
|
|||
DoWhatNext breakpoint() throws AppException { |
|||
while (true) { |
|||
if (reDo) { |
|||
reDo = false; |
|||
return DoWhatNext.ReDoAction; |
|||
} |
|||
if (doNext) { |
|||
doNext = false; |
|||
return DoWhatNext.DoNextAction; |
|||
} |
|||
|
|||
if (breakAction) { |
|||
breakAction = false; |
|||
throw new AppException(A8kEcode.ACTION_REACTOR_SERVICE_BREAKBYUSR); |
|||
} |
|||
|
|||
if (fullSpeedRun) { |
|||
return DoWhatNext.DoNextAction; |
|||
} |
|||
|
|||
try { |
|||
Thread.sleep(100); |
|||
} catch (InterruptedException e) { |
|||
throw new AppException(A8kEcode.ACTION_REACTOR_SERVICE_BREAKBYUSR); |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
public void dosome(String mark, ZFunction action) throws AppException{ |
|||
while (true) { |
|||
logger.info("do {}", mark); |
|||
curStep = mark; |
|||
action.fn(); |
|||
DoWhatNext next = breakpoint(); |
|||
if (next == DoWhatNext.DoNextAction) { |
|||
break; |
|||
} |
|||
} |
|||
|
|||
curStep = ""; |
|||
} |
|||
|
|||
@ExtApiFn(name = "下一步", order = ORDER.doNextStep) |
|||
public void doNextStep() { |
|||
doNext = true; |
|||
} |
|||
|
|||
@ExtApiFn(name = "重新执行当前步骤", order = ORDER.reDoStep) |
|||
public void reDoStep() { |
|||
reDo = true; |
|||
} |
|||
|
|||
@ExtApiFn(name = "中断动作", order = ORDER.breakAction) |
|||
public void breakAction() { |
|||
breakAction = true; |
|||
} |
|||
|
|||
|
|||
@ExtApiFn(name = "全速模式", order = ORDER.fullSpeedRun) |
|||
public void fullSpeedRun() { |
|||
fullSpeedRun = true; |
|||
} |
|||
|
|||
@ExtApiFn(name = "单步模式", order = ORDER.singleStepRun) |
|||
public void singleStepRun() { |
|||
fullSpeedRun = false; |
|||
} |
|||
|
|||
@ExtApiStatu(name = "全速运行") |
|||
public Boolean getFullSpeedRun() { |
|||
return fullSpeedRun; |
|||
} |
|||
|
|||
@ExtApiStatu(name = "当前步骤") |
|||
public String getCurStep() { |
|||
return curStep; |
|||
} |
|||
|
|||
} |
@ -1,17 +1,39 @@ |
|||
package a8k.type.ecode; |
|||
|
|||
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
|||
import a8k.type.exception.AppException; |
|||
import a8k.utils.ZJsonHelper; |
|||
import io.swagger.v3.oas.annotations.media.Schema; |
|||
|
|||
public class AECodeError extends AppError { |
|||
@Schema(description = "异常栈信息") |
|||
public StackTraceElement[] stackTraceElements; |
|||
|
|||
public AECodeError(String exmsg) { |
|||
super(A8kEcode.CODEERROR); |
|||
this.exmsg = exmsg; |
|||
stackTraceElements = Thread.currentThread().getStackTrace(); |
|||
} |
|||
|
|||
public AECodeError(A8kEcode ecode, String exmsg) { |
|||
super(ecode); |
|||
this.exmsg = exmsg; |
|||
public AECodeError(String fmt, Object... args) { |
|||
super(A8kEcode.CODEERROR); |
|||
this.exmsg = String.format(fmt, args); |
|||
stackTraceElements = Thread.currentThread().getStackTrace(); |
|||
} |
|||
|
|||
public AECodeError(Exception e) { |
|||
super(A8kEcode.CODEERROR); |
|||
this.exmsg = e.getMessage(); |
|||
stackTraceElements = e.getStackTrace(); |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
try { |
|||
throw new Exception("test"); |
|||
} catch (Exception e) { |
|||
AECodeError aeCodeError = new AECodeError(e); |
|||
System.out.println(ZJsonHelper.objToPrettyJson(aeCodeError)); |
|||
} |
|||
|
|||
} |
|||
} |
@ -1,13 +0,0 @@ |
|||
package a8k.type.ecode; |
|||
|
|||
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
|||
import io.swagger.v3.oas.annotations.media.Schema; |
|||
|
|||
public class AECommonError extends AppError { |
|||
public AECommonError(String exmsg) { |
|||
super(A8kEcode.COMMON_ERROR); |
|||
this.exmsg = exmsg; |
|||
} |
|||
|
|||
|
|||
} |
@ -1,22 +0,0 @@ |
|||
package a8k.type.ecode; |
|||
|
|||
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
|||
import io.swagger.v3.oas.annotations.media.Schema; |
|||
|
|||
import java.util.Arrays; |
|||
|
|||
public class AEUnkownExceptionError extends AppError { |
|||
@Schema(description = "异常描述") |
|||
public String decription; |
|||
@Schema(description = "异常栈信息") |
|||
public String stackTrace; |
|||
Exception exception; |
|||
|
|||
|
|||
public AEUnkownExceptionError(Exception exception) { |
|||
super(A8kEcode.CODEERROR_UNKOWN_EXCEPTION); |
|||
this.decription = exception.getMessage(); |
|||
this.stackTrace = Arrays.toString(exception.getStackTrace()); |
|||
this.exception = exception; |
|||
} |
|||
} |
@ -1,22 +0,0 @@ |
|||
package a8k.type.exception; |
|||
|
|||
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
|||
import a8k.type.ecode.AppError; |
|||
import a8k.utils.AppExceptionUtils; |
|||
import com.fasterxml.jackson.annotation.JsonIgnore; |
|||
|
|||
import java.util.List; |
|||
|
|||
public class MutiAppException extends AppException { |
|||
public List<AppException> bindExceptions; |
|||
|
|||
public MutiAppException(List<AppException> exceptions) { |
|||
super(A8kEcode.MUTI_APPEXCEPTIONS); |
|||
bindExceptions = exceptions; |
|||
} |
|||
|
|||
@JsonIgnore |
|||
public List<AppError> getErrors() { |
|||
return AppExceptionUtils.toAppErrorList(bindExceptions); |
|||
} |
|||
} |
@ -1,53 +0,0 @@ |
|||
package a8k.utils; |
|||
|
|||
import a8k.OS; |
|||
import a8k.type.exception.AppException; |
|||
import a8k.type.exception.MutiAppException; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.Objects; |
|||
import java.util.concurrent.*; |
|||
|
|||
public class ActionParallerExceutor { |
|||
ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10)); |
|||
List<Future<AppException>> futures = new ArrayList<>(); |
|||
|
|||
// var doPrepareReactionPlateFuture = executor.submit(() -> ZFnCall.callfn(this::prepareReactionPlate)); |
|||
//摇匀并取盖 |
|||
// var doShakeAndTakeCapFuture = executor.submit(() -> ZFnCall.callfn(this::shakeAndTakeCap)); |
|||
//准备Hbot Tip |
|||
// var doHbotPrepareTipFuture = executor.submit(() -> ZFnCall.callfn(this::hbotPrepareTip)); |
|||
|
|||
|
|||
public void submit(ZFnCall.Fn fn) { |
|||
var future = executor.submit(() -> ZFnCall.callfn(fn)); |
|||
futures.add(future); |
|||
} |
|||
|
|||
public MutiAppException waitAll() { |
|||
futures.forEach(this::wait); |
|||
List<AppException> exceptions = new java.util.ArrayList<>(List.of()); |
|||
try { |
|||
for (Future<AppException> future : futures) { |
|||
exceptions.add(future.get()); |
|||
} |
|||
} catch (InterruptedException | ExecutionException ignored) { |
|||
} |
|||
exceptions.removeIf(Objects::isNull); |
|||
if (exceptions.isEmpty()) { |
|||
return null; |
|||
} |
|||
return new MutiAppException(exceptions); |
|||
// List<AppError> errors = new java.util.ArrayList<>(List.of()); |
|||
// exceptions.forEach(e -> errors.add(e.getError())); |
|||
} |
|||
|
|||
|
|||
void wait(Future<?> future) { |
|||
while (!future.isDone()) { |
|||
OS.forceSleep(100); |
|||
} |
|||
} |
|||
|
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue