21 changed files with 1113 additions and 853 deletions
-
BINapp.db
-
4src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java
-
63src/main/java/a8k/hardware/A8kCanBusService.java
-
6src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java
-
79src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java
-
208src/main/java/a8k/service/app/devicedriver/calibration/PositionCalibration.java
-
250src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java
-
36src/main/java/a8k/service/app/devicedriver/ctrl/CodeScaner.java
-
6src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java
-
36src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java
-
89src/main/java/a8k/service/app/devicedriver/ctrl/basic/HbotModule.java
-
7src/main/java/a8k/service/app/devicedriver/ctrl/basic/PipetteCtrlModule.java
-
51src/main/java/a8k/service/app/devicedriver/ctrl/type/HbotRegIndex.java
-
2src/main/java/a8k/service/app/devicedriver/ctrl/type/PipetteRegIndex.java
-
200src/main/java/a8k/service/app/devicedriver/param/Hbot2DCodeScanPos.java
-
16src/main/java/a8k/service/app/devicedriver/status/DeviceStatus.java
-
96src/main/java/a8k/service/db/PosParameterDBService.java
-
9src/main/java/a8k/service/db/type/PosParameter.java
-
30src/main/java/a8k/service/db/utils/PosParameterReader.java
@ -0,0 +1,79 @@ |
|||
package a8k.service.app.devicedriver.calibration; |
|||
|
|||
|
|||
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; |
|||
import a8k.extapi_controler.utils.ExtApiFn; |
|||
import a8k.extapi_controler.utils.ExtApiTab; |
|||
import a8k.hardware.A8kCanBusService; |
|||
import a8k.service.app.devicedriver.ctrl.basic.PipetteCtrlModule; |
|||
import a8k.service.app.devicedriver.ctrl.CodeScaner; |
|||
import a8k.service.app.devicedriver.param.Hbot2DCodeScanPos; |
|||
import a8k.type.exception.AppException; |
|||
import com.fasterxml.jackson.databind.ObjectMapper; |
|||
import com.fasterxml.jackson.databind.node.ArrayNode; |
|||
import com.fasterxml.jackson.databind.node.ObjectNode; |
|||
import jakarta.annotation.Resource; |
|||
|
|||
@ExtApiTab(cfg = ExtApiTabConfig.Hbot2DCodeScanPosCalibration) |
|||
public class Hbot2DCodeScanPosCalibration { |
|||
|
|||
@Resource |
|||
Hbot2DCodeScanPos hbot2DCodeScanPos; |
|||
|
|||
@Resource |
|||
A8kCanBusService canBus; |
|||
@Resource |
|||
CodeScaner codeScaner; |
|||
@Resource |
|||
PipetteCtrlModule pipetteCtrlModule; |
|||
|
|||
|
|||
@ExtApiFn(name = "扫码测试(全部位置)", group = "测试工具", order = 0) |
|||
public void deviceReset() throws AppException { |
|||
pipetteCtrlModule.zMotorEnable(1); |
|||
} |
|||
|
|||
public void disableMotor() throws AppException { |
|||
|
|||
} |
|||
|
|||
@ExtApiFn(name = "扫码测试(当前位置)", group = "测试工具", order = 0) |
|||
public String openCodeTryScaner() throws AppException { |
|||
return codeScaner.pipetteModCodeScannerScanCode(); |
|||
} |
|||
|
|||
@ExtApiFn(name = "扫码测试(全部位置)", group = "测试工具", order = 0) |
|||
public String scanAll() throws AppException { |
|||
return codeScaner.pipetteModCodeScannerScanCode(); |
|||
} |
|||
|
|||
|
|||
@ExtApiFn(name = "获取所有坐标", order = 1) |
|||
public ObjectNode getPoss() throws AppException { |
|||
ObjectMapper mapper = new ObjectMapper(); |
|||
|
|||
ObjectNode node = new ObjectMapper().createObjectNode(); |
|||
ArrayNode PBScanPos = node.putArray("PBScanPos"); |
|||
ArrayNode LittBSScanPos = node.putArray("LittBSScanPos"); |
|||
ArrayNode LarBSScanPos = node.putArray("LarBSScanPos"); |
|||
|
|||
for (int i = 0; i < 6; i++) { |
|||
PBScanPos.add(mapper.valueToTree(hbot2DCodeScanPos.getPBScanPosX(i).toString())); |
|||
} |
|||
|
|||
for (int i = 0; i < 6; i++) { |
|||
LittBSScanPos.add(mapper.valueToTree(hbot2DCodeScanPos.getLittBSX(i).toString())); |
|||
} |
|||
|
|||
for (int i = 0; i < 6; i++) { |
|||
LarBSScanPos.add(mapper.valueToTree(hbot2DCodeScanPos.getLarBSX(i).toString())); |
|||
} |
|||
return node; |
|||
} |
|||
|
|||
@ExtApiFn(name = "扫码", order = 2) |
|||
public void scan(String pos) throws AppException { |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,36 @@ |
|||
package a8k.service.app.devicedriver.ctrl; |
|||
|
|||
import a8k.hardware.A8kCanBusService; |
|||
import a8k.hardware.type.a8kcanprotocol.MId; |
|||
import a8k.type.exception.AppException; |
|||
import jakarta.annotation.Resource; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
public class CodeScaner { |
|||
|
|||
@Resource |
|||
A8kCanBusService canBus; |
|||
|
|||
public String pipetteModCodeScannerScanCode() throws AppException { |
|||
try { |
|||
canBus.codeScanerStartScan(MId.PipetteModCodeScanner); |
|||
String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, 300); |
|||
canBus.codeScanerStopScan(MId.PipetteModCodeScanner); |
|||
return result; |
|||
} catch (AppException e) { |
|||
return ""; |
|||
} |
|||
} |
|||
|
|||
public String feedingModScannerModCodeScannerScanCode(Integer waittime) { |
|||
try { |
|||
canBus.codeScanerStartScan(MId.FeedingModScannerMod); |
|||
String result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, waittime); |
|||
canBus.codeScanerStopScan(MId.FeedingModScannerMod); |
|||
return result; |
|||
} catch (AppException e) { |
|||
return ""; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,89 @@ |
|||
package a8k.service.app.devicedriver.ctrl.basic; |
|||
|
|||
import a8k.hardware.A8kCanBusService; |
|||
import a8k.hardware.type.a8kcanprotocol.CmdId; |
|||
import a8k.hardware.type.a8kcanprotocol.MId; |
|||
import a8k.service.app.devicedriver.ctrl.type.HbotRegIndex; |
|||
import a8k.type.cfg.Pos2d; |
|||
import a8k.type.exception.AppException; |
|||
import jakarta.annotation.Resource; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
public class HbotModule { |
|||
|
|||
@Resource |
|||
A8kCanBusService canBus; |
|||
|
|||
public void enable(Integer enable) throws AppException { |
|||
canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_enable.toInt(), enable); |
|||
} |
|||
|
|||
public void moveBy(Integer x, Integer y) throws AppException { |
|||
canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_by.toInt(), x, y); |
|||
} |
|||
|
|||
public void moveByBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { |
|||
moveBy(x, y); |
|||
canBus.waitForMod(MId.HbotM, actionOvertime); |
|||
} |
|||
|
|||
public void moveTo(Integer x, Integer y) throws AppException { |
|||
canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to.toInt(), x, y); |
|||
} |
|||
|
|||
public void moveToBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { |
|||
moveTo(x, y); |
|||
canBus.waitForMod(MId.HbotM, actionOvertime); |
|||
} |
|||
|
|||
public void moveToZero() throws AppException { |
|||
canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to_zero.toInt()); |
|||
} |
|||
|
|||
public void moveToZeroBlock(Integer actionOvertime) throws AppException { |
|||
moveToZero(); |
|||
canBus.waitForMod(MId.HbotM, actionOvertime); |
|||
} |
|||
|
|||
public Pos2d readPos() throws AppException { |
|||
Pos2d pos = new Pos2d(0, 0); |
|||
var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_pos.toInt()); |
|||
pos.x = packet.getContentI32(0); |
|||
pos.y = packet.getContentI32(1); |
|||
return pos; |
|||
} |
|||
|
|||
public Boolean readInIO(Integer ioIndex) throws AppException { |
|||
var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_inio.toInt(), ioIndex); |
|||
return packet.getContentI32(0) != 0; |
|||
} |
|||
|
|||
public void setPos(Integer x, Integer y) throws AppException { |
|||
canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_set_pos.toInt(), x, y); |
|||
} |
|||
|
|||
public void moveByDirect(Integer motor1_dpos, Integer motor2_dpos) throws AppException { |
|||
canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_motor_move_by_direct.toInt(), motor1_dpos, motor2_dpos); |
|||
} |
|||
|
|||
public Integer readEncDirect() throws AppException { |
|||
var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_enc_direct.toInt()); |
|||
return packet.getContentI32(0); |
|||
} |
|||
|
|||
public Integer hbotReadInioIndexInStm32(Integer ioIndex) throws AppException { |
|||
var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_inio_index_in_stm32.toInt(), ioIndex); |
|||
return packet.getContentI32(0); |
|||
} |
|||
|
|||
public void setReg(HbotRegIndex regIndex, Integer value) throws AppException { |
|||
canBus.moduleSetReg(MId.HbotM, regIndex.regIndex, value); |
|||
} |
|||
|
|||
public Integer getReg(HbotRegIndex regIndex) throws AppException { |
|||
return canBus.moduleGetReg(MId.HbotM, regIndex.regIndex); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,51 @@ |
|||
package a8k.service.app.devicedriver.ctrl.type; |
|||
|
|||
import a8k.hardware.type.regindex.RegIndex; |
|||
|
|||
public enum HbotRegIndex { |
|||
kreg_module_version(RegIndex.kreg_module_version), // 模块版本 |
|||
kreg_module_type(RegIndex.kreg_module_type), // 模块类型 |
|||
kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error |
|||
kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag |
|||
kreg_extboard_resetflag(RegIndex.kreg_extboard_resetflag), |
|||
|
|||
kreg_xyrobot_io_state(RegIndex.kreg_xyrobot_io_state), // |
|||
kreg_xyrobot_is_enable(RegIndex.kreg_xyrobot_is_enable), // |
|||
kreg_xyrobot_robot_type(RegIndex.kreg_xyrobot_robot_type), // |
|||
kreg_xyrobot_one_circle_pulse(RegIndex.kreg_xyrobot_one_circle_pulse), // |
|||
kreg_xyrobot_one_circle_pulse_denominator(RegIndex.kreg_xyrobot_one_circle_pulse_denominator), // |
|||
kreg_xyrobot_ihold(RegIndex.kreg_xyrobot_ihold), // |
|||
kreg_xyrobot_irun(RegIndex.kreg_xyrobot_irun), // |
|||
kreg_xyrobot_iholddelay(RegIndex.kreg_xyrobot_iholddelay), // |
|||
kreg_xyrobot_iglobalscaler(RegIndex.kreg_xyrobot_iglobalscaler), // |
|||
kreg_xyrobot_vstart(RegIndex.kreg_xyrobot_vstart), // |
|||
kreg_xyrobot_a1(RegIndex.kreg_xyrobot_a1), // |
|||
kreg_xyrobot_amax(RegIndex.kreg_xyrobot_amax), // |
|||
kreg_xyrobot_v1(RegIndex.kreg_xyrobot_v1), // |
|||
kreg_xyrobot_dmax(RegIndex.kreg_xyrobot_dmax), // |
|||
kreg_xyrobot_d1(RegIndex.kreg_xyrobot_d1), // |
|||
kreg_xyrobot_vstop(RegIndex.kreg_xyrobot_vstop), // |
|||
kreg_xyrobot_tzerowait(RegIndex.kreg_xyrobot_tzerowait), // |
|||
kreg_xyrobot_enc_resolution(RegIndex.kreg_xyrobot_enc_resolution), // |
|||
kreg_xyrobot_enable_enc(RegIndex.kreg_xyrobot_enable_enc), // |
|||
kreg_xyrobot_x_shaft(RegIndex.kreg_xyrobot_x_shaft), // |
|||
kreg_xyrobot_y_shaft(RegIndex.kreg_xyrobot_y_shaft), // |
|||
kreg_xyrobot_min_x(RegIndex.kreg_xyrobot_min_x), // |
|||
kreg_xyrobot_min_y(RegIndex.kreg_xyrobot_min_y), // |
|||
kreg_xyrobot_max_x(RegIndex.kreg_xyrobot_max_x), // |
|||
kreg_xyrobot_max_y(RegIndex.kreg_xyrobot_max_y), // |
|||
kreg_xyrobot_run_to_zero_speed(RegIndex.kreg_xyrobot_run_to_zero_speed), // |
|||
kreg_xyrobot_look_zero_edge_speed(RegIndex.kreg_xyrobot_look_zero_edge_speed), // |
|||
kreg_xyrobot_shift_x(RegIndex.kreg_xyrobot_shift_x), // |
|||
kreg_xyrobot_shift_y(RegIndex.kreg_xyrobot_shift_y), // |
|||
kreg_xyrobot_pos_devi_tolerance(RegIndex.kreg_xyrobot_pos_devi_tolerance), // |
|||
kreg_xyrobot_io_trigger_append_distance(RegIndex.kreg_xyrobot_io_trigger_append_distance), // |
|||
kreg_xyrobot_default_velocity(RegIndex.kreg_xyrobot_default_velocity), // |
|||
; |
|||
|
|||
public final RegIndex regIndex; |
|||
HbotRegIndex(RegIndex regIndex) { |
|||
this.regIndex = regIndex; |
|||
} |
|||
|
|||
} |
@ -1,4 +1,4 @@ |
|||
package a8k.hardware.type.regindex; |
|||
package a8k.service.app.devicedriver.ctrl.type; |
|||
|
|||
public enum PipetteRegIndex { |
|||
kreg_module_version(0), // 模块版本 |
@ -0,0 +1,96 @@ |
|||
package a8k.service.db; |
|||
|
|||
import a8k.service.app.appdata.UtilsProjectColorAllocer; |
|||
import a8k.service.db.type.PosParameter; |
|||
import a8k.service.db.utils.PosParameterReader; |
|||
import a8k.service.debug.AppDebugHelperService; |
|||
import a8k.utils.ZSqliteJdbcHelper; |
|||
import com.fasterxml.jackson.core.JsonProcessingException; |
|||
import com.fasterxml.jackson.databind.ObjectMapper; |
|||
import com.fasterxml.jackson.datatype.jsr310.ser.ZoneIdSerializer; |
|||
import jakarta.annotation.PostConstruct; |
|||
import jakarta.annotation.Resource; |
|||
import lombok.SneakyThrows; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import org.springframework.jdbc.core.JdbcTemplate; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import java.sql.ResultSet; |
|||
import java.util.List; |
|||
|
|||
@Component |
|||
public class PosParameterDBService { |
|||
private static final Logger logger = LoggerFactory.getLogger(PosParameterDBService.class); |
|||
private static final String tableName = "zapp_a8k_pos_parameter"; |
|||
private static final Class<?> tClass = PosParameter.class; |
|||
|
|||
|
|||
@Resource |
|||
JdbcTemplate jdbcTemplate; |
|||
|
|||
@PostConstruct |
|||
void init() { |
|||
if (!ZSqliteJdbcHelper.isTableExist(jdbcTemplate, tableName)) { |
|||
ZSqliteJdbcHelper.createTable(jdbcTemplate, tableName, tClass); |
|||
} |
|||
} |
|||
|
|||
@SneakyThrows private PosParameter rowMapper(ResultSet rs, int rowNum) { |
|||
return (PosParameter) ZSqliteJdbcHelper.rowMapper(rs, tClass); |
|||
} |
|||
|
|||
|
|||
public <T> T getParam(String service, String key, Class<T> tClass) { |
|||
List<PosParameter> list = jdbcTemplate.query("select * from " + tableName + " where service = ? and key = ?;", this::rowMapper, service, key); |
|||
if (list.isEmpty()) { |
|||
return null; |
|||
} |
|||
|
|||
PosParameter posParameter = list.get(0); |
|||
try { |
|||
return new ObjectMapper().readValue(posParameter.val, tClass); |
|||
} catch (JsonProcessingException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
} |
|||
|
|||
public void updateParam(String service, String key, Object pos) { |
|||
try { |
|||
ObjectMapper objectMapper = new ObjectMapper(); |
|||
List<PosParameter> list = jdbcTemplate.query("select * from " + tableName + " where service = ? and key = ?;", this::rowMapper, service, key); |
|||
if (list.isEmpty()) { |
|||
PosParameter posParameter = new PosParameter(); |
|||
posParameter.service = service; |
|||
posParameter.key = key; |
|||
posParameter.val = objectMapper.writeValueAsString(pos); |
|||
posParameter.valType = pos.getClass().getSimpleName(); |
|||
ZSqliteJdbcHelper.addObj(jdbcTemplate, tableName, tClass, posParameter); |
|||
return; |
|||
} |
|||
|
|||
PosParameter posParameter = list.get(0); |
|||
posParameter.val = objectMapper.writeValueAsString(pos); |
|||
posParameter.service = service; |
|||
posParameter.key = key; |
|||
posParameter.valType = pos.getClass().getSimpleName(); |
|||
ZSqliteJdbcHelper.updateObj(jdbcTemplate, tableName, tClass, posParameter); |
|||
|
|||
} catch (JsonProcessingException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
} |
|||
|
|||
public Integer getParamVersion(String service) { |
|||
return getParam(service, "VERSION", Integer.class); |
|||
} |
|||
|
|||
public void setParamVersion(String service, Integer version) { |
|||
updateParam(service, "VERSION", 0); |
|||
} |
|||
|
|||
public PosParameterReader getReader(Class<?> type) { |
|||
return new PosParameterReader(this, type); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,9 @@ |
|||
package a8k.service.db.type; |
|||
|
|||
public class PosParameter { |
|||
public int id; |
|||
public String service; |
|||
public String key; |
|||
public String valType; |
|||
public String val; |
|||
} |
@ -0,0 +1,30 @@ |
|||
package a8k.service.db.utils; |
|||
|
|||
import a8k.service.db.PosParameterDBService; |
|||
import jakarta.annotation.Resource; |
|||
|
|||
public class PosParameterReader { |
|||
Class<?> tClass; |
|||
PosParameterDBService posParameterDBService; |
|||
|
|||
public PosParameterReader(PosParameterDBService dbservice, Class<?> tClass) { |
|||
posParameterDBService = dbservice; |
|||
this.tClass = tClass; |
|||
} |
|||
|
|||
public <T> T getPos(String key, Class<T> tClass) { |
|||
return posParameterDBService.getParam(tClass.getSimpleName(), key, tClass); |
|||
} |
|||
|
|||
public void updatePos(String key, Object pos) { |
|||
posParameterDBService.updateParam(tClass.getSimpleName(), key, pos); |
|||
} |
|||
|
|||
public Integer getVersion() { |
|||
return posParameterDBService.getParamVersion(tClass.getSimpleName()); |
|||
} |
|||
|
|||
public void setVersion(Integer version) { |
|||
posParameterDBService.setParamVersion(tClass.getSimpleName(), version); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue