Browse Source

update

tags/v0
zhaohe 8 months ago
parent
commit
1505e00ae3
  1. 18
      src/main/java/a8k/config/CorsConfig.java
  2. 10
      src/main/java/a8k/extapi/service/ExtApiTabCfgService.java
  3. 4
      src/main/java/a8k/hardware/A8kModParamInitializer.java
  4. 1
      src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java
  5. 44
      src/main/java/a8k/service/app/background/TemperatureCtrlService.java
  6. 10
      src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java
  7. 6
      src/main/java/a8k/service/verification/A8kOptVerification.java
  8. 70
      src/main/java/a8k/service/verification/A8kTemperaturaVerfication.java
  9. 52
      src/main/java/a8k/service/verification/A8kVerificationUtils.java
  10. 202
      src/main/java/a8k/service/verification/PipetteGunVerificationV2.java

18
src/main/java/a8k/config/CorsConfig.java

@ -0,0 +1,18 @@
package a8k.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 允许所有域名进行跨域访问实际使用时应根据需要进行配置
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}
}

10
src/main/java/a8k/extapi/service/ExtApiTabCfgService.java

@ -7,12 +7,11 @@ import a8k.service.app.background.BackgroudProcessCtrlService;
import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService;
import a8k.service.app.devicectrl.driver.PipetteCtrlDriver;
import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver;
import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver;
import a8k.service.app.devicectrl.init.MiniServoReferencePointIniter;
import a8k.service.app.devicectrl.param.LowerDeviceParamMgr;
import a8k.service.app.devicectrl.param.calibration.*;
import a8k.service.test.*;
import a8k.service.verification.PipetteGunVerification;
import a8k.service.verification.*;
import jakarta.annotation.PostConstruct;
import lombok.Data;
import org.springframework.stereotype.Component;
@ -85,13 +84,16 @@ public class ExtApiTabCfgService {
cfgList.add(new Config(PipetteGunTest.class, "测试.PipetteGun", TabType.LowLevelApiTest));
cfgList.add(new Config(PosMeasureUtils.class, "测试.坐标测量", TabType.LowLevelApiTest));
cfgList.add(new Config(A8kOptTest.class, "测试.光学测试", TabType.LowLevelApiTest));
cfgList.add(new Config(PipetteCtrlDriver.class, "硬件驱动.移液枪测试", TabType.LowLevelApiTest));
cfgList.add(new Config(StepMotorCtrlDriver.class, "硬件驱动.步进电机测试", TabType.LowLevelApiTest));
cfgList.add(new Config(TubeFeedingCtrlService.class, "硬件控制.入料模块", TabType.LowLevelApiTest));
cfgList.add(new Config(PipetteGunVerification.class, "验证.移液枪验证", TabType.Verify));
cfgList.add(new Config(A8kVerificationUtils.class, "验证.工具", TabType.Verify));
cfgList.add(new Config(PipetteGunVerificationV2.class, "验证.移液枪验证", TabType.Verify));
cfgList.add(new Config(A8kTemperaturaVerfication.class, "验证.温度控制验证", TabType.Verify));
cfgList.add(new Config(A8kOptVerification.class, "验证.光学模组", TabType.Verify));
for (Config cfg : cfgList) {

4
src/main/java/a8k/hardware/A8kModParamInitializer.java

@ -118,10 +118,10 @@ public class A8kModParamInitializer {
canBus.moduleSetReg(MId.HbotM, RegIndex.kreg_xyrobot_look_zero_edge_speed, 10);
canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 3000);
canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 6000);
canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_ki, 100);
canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_compute_interval, 9000);
canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 3000);
canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 6000);
canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_ki, 100);
canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_compute_interval, 9000);

1
src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java

@ -82,4 +82,5 @@ public class AppDeviceCtrlService {
}
}

44
src/main/java/a8k/service/app/background/TemperatureCtrlService.java

@ -15,6 +15,11 @@ import org.springframework.stereotype.Component;
@Slf4j
public class TemperatureCtrlService {
enum TemperaControlMode {
kFixTemperature,
kAutoChangeFromAppSetting
}
@Resource
TemperatureControlDriver temperatureControlDriver;
@ -24,8 +29,9 @@ public class TemperatureCtrlService {
@Resource
AppSettingsMgrService appSettingsMgrService;
Integer temperature = 0;
Thread temperatureCtrlThread = null;
Integer targetTemperature = 0;
TemperaControlMode controlMode = TemperaControlMode.kFixTemperature;
Thread temperatureCtrlThread = null;
@PostConstruct
public void init() {
@ -33,6 +39,21 @@ public class TemperatureCtrlService {
}
public void startTemperatureControl() throws AppException {
stopTemperatureControl();
controlMode = TemperaControlMode.kAutoChangeFromAppSetting;
targetTemperature = 0;
startTemperatureControlInternal();
}
public void startTemperatureControl(Integer tem) throws AppException {
stopTemperatureControl();
controlMode = TemperaControlMode.kFixTemperature;
targetTemperature = tem;
startTemperatureControlInternal();
}
public void startTemperatureControlInternal() throws AppException {
if (virtualDevice.isEnable()) {
return;
}
@ -41,9 +62,12 @@ public class TemperatureCtrlService {
return;
}
AppSetting setting = appSettingsMgrService.getAppSettings();
temperature = setting.getTemperature();
temperatureControlDriver.startCtrlTemperature(temperature.doubleValue());
if (controlMode.equals(TemperaControlMode.kAutoChangeFromAppSetting)) {
AppSetting setting = appSettingsMgrService.getAppSettings();
targetTemperature = setting.getTemperature();
}
temperatureControlDriver.startCtrlTemperature(targetTemperature.doubleValue());
/*
* 启动线程定时检查温度设定值如果发生变化则调用温度控制器
@ -53,10 +77,12 @@ public class TemperatureCtrlService {
try {
Thread.sleep(1000);
Integer targetTemperature = appSettingsMgrService.getAppSettings().getTemperature();
if (!targetTemperature.equals(temperature)) {
temperature = targetTemperature;
temperatureControlDriver.startCtrlTemperature(temperature.doubleValue());
if (controlMode.equals(TemperaControlMode.kAutoChangeFromAppSetting)) {
Integer settingTem = appSettingsMgrService.getAppSettings().getTemperature();
if (!targetTemperature.equals(settingTem)) {
targetTemperature = settingTem;
temperatureControlDriver.startCtrlTemperature(targetTemperature.doubleValue());
}
}
} catch (InterruptedException e) {

10
src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java

@ -62,6 +62,16 @@ public class HbotCtrlService {
checker.checkTakeTip((pipetteCtrlDriver.isHasTip()));
}
public Boolean takeTipNoCheck(TipGroup tipGroup, Integer index) throws AppException {
log.info("takeTipNoCheck groupId:{} index:{}", tipGroup.ordinal(), index);
checkTipIndex(tipGroup, index);
Pos3d tipPos = hbotConsumableParamMgr.getTipPos(tipGroup, index);
hbotBaseMoveExDriver.hbotMoveTo(tipPos);
pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock();
return pipetteCtrlDriver.isHasTip();
}
public void takeTip(TipPos pos) throws AppException {
Assert.isTrue(pos != null, "TipPos is null");
takeTip(pos.group, pos.index);

6
src/main/java/a8k/service/test/A8kOptTest.java → src/main/java/a8k/service/verification/A8kOptVerification.java

@ -1,4 +1,4 @@
package a8k.service.test;
package a8k.service.verification;
import a8k.a8kproj.optalgo.type.OptScanResult;
import a8k.extapi.utils.ExtApiFn;
@ -31,7 +31,7 @@ import java.util.List;
*/
@ExtApiTab()
@Component
public class A8kOptTest {
public class A8kOptVerification {
Integer actionOvertime = 5000;
@ -142,7 +142,7 @@ public class A8kOptTest {
@ExtApiFn(name = "获取光学报告", group = "光学测试", order = 202)
public String getOptReport(Integer subProjIndex) {
return "http://127.0.0.1/filemgr/index.html";
return "http://127.0.0.1/optfilemgr/";
}
@ExtApiFn(name = "读取项目信息", group = "光学测试", order = 203)

70
src/main/java/a8k/service/verification/A8kTemperaturaVerfication.java

@ -0,0 +1,70 @@
package a8k.service.verification;
import a8k.a8kproj.optalgo.type.OptScanResult;
import a8k.extapi.utils.ExtApiFn;
import a8k.extapi.utils.ExtApiStatu;
import a8k.extapi.utils.ExtApiTab;
import a8k.service.app.appdata.FileMgrService;
import a8k.service.app.appdata.ProjIdCardInfoMgrService;
import a8k.service.app.appdata.ProjInfoMgrService;
import a8k.service.app.background.SensorDataUpdateService;
import a8k.service.app.background.TemperatureCtrlService;
import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService;
import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService;
import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver;
import a8k.service.app.devicectrl.driver.TemperatureControlDriver;
import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver;
import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr;
import a8k.type.A8kScanCurve;
import a8k.type.ConsumableGroup;
import a8k.type.IncubatorPos;
import a8k.type.exception.AppException;
import a8k.utils.ProjBuildinInfo;
import a8k.utils.ZList;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
*
*
*/
@ExtApiTab()
@Component
public class A8kTemperaturaVerfication {
@Resource
TemperatureCtrlService temperatureCtrlService;
@Resource
TemperatureControlDriver temperatureControlDriver;
@ExtApiFn(name = "启动温度控制", group = "温度控制", order = 1)
synchronized public void startCtrl(Integer targetTemperature) throws AppException {
temperatureCtrlService.startTemperatureControl(targetTemperature);
}
@ExtApiFn(name = "停止温度控制", group = "温度控制", order = 2)
synchronized public void stopCtrl() throws AppException {
temperatureCtrlService.stopTemperatureControl();
}
@ExtApiStatu(name = "孵育盘温度", group = "", order = 3)
public Double readIncubateBoxTemperature() throws AppException {
Double incubateBoxTemp = temperatureControlDriver.readIncubateBoxTemperature();
return (incubateBoxTemp);
}
@ExtApiStatu(name = "板夹仓温度", group = "", order = 4)
public Double readPlateBoxTemperature() throws AppException {
Double pbtemp = temperatureControlDriver.readPlateBoxTemperature();
return pbtemp ;
}
}

52
src/main/java/a8k/service/verification/A8kVerificationUtils.java

@ -0,0 +1,52 @@
package a8k.service.verification;
import a8k.a8kproj.optalgo.type.OptScanResult;
import a8k.controler.api.v1.app.ctrl.DeviceInit;
import a8k.extapi.utils.ExtApiFn;
import a8k.extapi.utils.ExtApiTab;
import a8k.service.app.appdata.FileMgrService;
import a8k.service.app.appdata.ProjInfoMgrService;
import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService;
import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService;
import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService;
import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver;
import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver;
import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr;
import a8k.type.A8kScanCurve;
import a8k.type.ConsumableGroup;
import a8k.type.IncubatorPos;
import a8k.type.checkpoint.CheckResult;
import a8k.type.exception.AppException;
import a8k.utils.ProjBuildinInfo;
import a8k.utils.ZList;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
*
*
*/
@ExtApiTab()
@Component
public class A8kVerificationUtils {
@Resource
DeviceInitCtrlService deviceInitializationModule;
@ExtApiFn(name = "初始化设备", group = "测试工具", order = 11)
public List<CheckResult> initDevice() throws AppException {
List<CheckResult> checkResult = deviceInitializationModule.deviceMoveToZero();
for (CheckResult result : checkResult) {
if (!result.pass) {
return checkResult;
}
}
return checkResult;
}
}

202
src/main/java/a8k/service/verification/PipetteGunVerificationV2.java

@ -0,0 +1,202 @@
package a8k.service.verification;
import a8k.constant.AppConstant;
import a8k.extapi.utils.ExtApiFn;
import a8k.extapi.utils.ExtApiStatu;
import a8k.extapi.utils.ExtApiTab;
import a8k.hardware.type.LldType;
import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService;
import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService;
import a8k.service.app.devicectrl.driver.HbotDriver;
import a8k.service.app.devicectrl.driver.PipetteCtrlDriver;
import a8k.service.app.devicectrl.driver.type.PipetteRegIndex;
import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver;
import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver;
import a8k.service.app.devicectrl.param.ext_param_mgr.HbotConsumableParamMgr;
import a8k.service.app.devicectrl.param.ext_param_mgr.PipetteGunParamExMgr;
import a8k.service.app.devicectrl.param.param_mgr.*;
import a8k.service.app.devicectrl.param.param_mgr.base.ParamMgr;
import a8k.service.dao.type.Parameter;
import a8k.type.ConsumableGroup;
import a8k.type.cfg.Pos3d;
import a8k.type.checkpoint.CheckResult;
import a8k.type.exception.AppException;
import a8k.type.pos.TipPos;
import a8k.type.type.TipGroup;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
@ExtApiTab()
@Component
@Slf4j
public class PipetteGunVerificationV2 {
@Resource
HbotFixedPosParamMgr hbotFixedPosParamMgr;
@Resource
HbotSamplePosParamMgr hbotSamplePosParamMgr;
@Resource
HbotConsumableParamMgr hbotConsumableParamMgr;
@Resource
HbotTipPosMgr hbotTipPosMgr;
@Resource
PipetteGunLLDParamMgr pipetteGunLLDParamMgr;
@Resource
PipetteGunLLFParamMgr pipetteGunLLFParamMgr;
@Resource
HbotLargeBottleBSPosMgr hbotLargeBottleBSPosMgr;
@Resource
PipetteCtrlDriver pipetteCtrlDriver;
@Resource
HbotBaseMoveExDriver hbotBaseMoveExDriver;
@Resource
HbotDriver hbotDriver;
@Resource
HbotCtrlService hbotCtrlService;
@Resource
PipetteGunParamExMgr pipetteGunParamExMgr;
@Resource
DeviceInitCtrlService deviceInitializationModule;
Integer tipNum = 0;
Integer loadUl = 0;
Integer lldpThreshold = 20;
@PostConstruct
void initialize() {
}
@ExtApiFn(name = "初始化设备", group = "测试准备工作", order = 11)
public List<CheckResult> initDevice() throws AppException {
List<CheckResult> checkResult = deviceInitializationModule.deviceMoveToZero();
for (CheckResult result : checkResult) {
if (!result.pass) {
return checkResult;
}
}
return checkResult;
}
@ExtApiFn(name = "加载tip头", group = "测试准备工作", order = 12)
public void loadTip() throws AppException {
tipNum = AppConstant.TIP_NUM;
}
@ExtApiFn(name = "设置吸液量", group = "测试准备工作", order = 13)
public void setLoadUl(Integer loadUl) {
this.loadUl = loadUl;
}
@ExtApiFn(name = "设置LLD P阈值(建议20)", group = "测试准备工作", order = 14)
public void setLldpThreshold(Integer lldpThreshold) {
this.lldpThreshold = lldpThreshold;
}
Boolean takeOneTip() throws AppException {
hbotBaseMoveExDriver.hbotMoveTo(hbotTipPosMgr.getDropTipPos());
pipetteCtrlDriver.pipetteInitDeviceBlock();
pipetteCtrlDriver.lldPrepareBlock();
TipPos tipPos = new TipPos();
tipPos.group = TipGroup.GROUP0;
if (tipNum == 0) {
throw AppException.ofAECodeError("Tip已经用完");
}
tipPos.index = AppConstant.TIP_NUM - tipNum;
tipNum--;
log.info(" 取TIP {}", tipPos);
return hbotCtrlService.takeTipNoCheck(tipPos.group, tipPos.index);//取tip
}
@ExtApiFn(name = "吸取并释放一次", group = "测试", order = 21)
public void aspirateAndDistruptOnce() throws AppException {
if (loadUl == 0) {
throw AppException.ofAECodeError("吸液量为0");
}
//
// param
//
Integer startZPos = hbotConsumableParamMgr.getLargeBufferSamplePos(ConsumableGroup.GROUP0).z;
Integer endZPos = hbotConsumableParamMgr.getLargeBufferSamplePosEnd(ConsumableGroup.GROUP0).z;
Integer llfv = pipetteGunLLFParamMgr.getLargeBSBottleLlfVel();
//
//1. Init pipette gun and take tip
//2. lld prepare
//
if (!pipetteCtrlDriver.isHasTip()) {
while (true) {
if (takeOneTip()) {
break;
}
}
} else {
pipetteCtrlDriver.lldPrepareBlock();
}
//
// lld
//
hbotCtrlService.moveToLargeBSSamplePos(ConsumableGroup.GROUP0);
pipetteCtrlDriver.setStartZ(startZPos);
pipetteCtrlDriver.setEndZ(endZPos);
pipetteCtrlDriver.setLldType(LldType.kplld);
pipetteCtrlDriver.setLldCThreshold(15);
pipetteCtrlDriver.setLldPThreshold(lldpThreshold);
pipetteCtrlDriver.lldBlock();
if (!pipetteCtrlDriver.lldIsDetectLiquid()) {
throw AppException.ofAECodeError("没有液体");
}
//
// aspirate
//
pipetteCtrlDriver.setLlfStartZ(pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos));
pipetteCtrlDriver.setLlfStartZ(endZPos);
pipetteCtrlDriver.aspirateSetLlfVelocity(llfv);
pipetteCtrlDriver.aspiratePrepareBlock();
pipetteCtrlDriver.aspirateBlock(loadUl);
pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock();
//
// move to distrube pos
//
hbotCtrlService.moveToLargeBSSamplePos(ConsumableGroup.GROUP1);
pipetteCtrlDriver.aspirateBlock(-loadUl);
pipetteCtrlDriver.clearHangingLiquid(3);
hbotCtrlService.moveQuickToZero();
}
@ExtApiStatu(name = "val", group = "tipNum", order = 100)
public Integer readTipNum() throws AppException {
return tipNum;
}
@ExtApiStatu(name = "val", group = "loadUl", order = 101)
public Integer readLoadUl() throws AppException {
return loadUl;
}
@ExtApiStatu(name = "val", group = "lldpThreshold", order = 102)
public Integer readLldpThreshold() throws AppException {
return lldpThreshold;
}
}
Loading…
Cancel
Save