Browse Source

测试板夹加载

master
sige 2 years ago
parent
commit
815ffc01f9
  1. BIN
      doc/A5000plus说明书_200922.pdf
  2. 76
      src/main/java/com/dreamworks/boditech/controller/DeviceController.java
  3. 9
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java
  4. 18
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java
  5. 47
      src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java
  6. 2
      src/main/java/com/dreamworks/boditech/entity/IdChip.java
  7. 2
      src/main/java/com/dreamworks/boditech/entity/Project.java
  8. 2
      src/main/java/com/dreamworks/boditech/mapper/IdChipMapper.java
  9. 12
      src/main/java/com/dreamworks/boditech/service/DeviceService.java
  10. 41
      src/main/java/com/dreamworks/boditech/service/ProjectService.java
  11. 1
      src/main/resources/application-dev.yml
  12. 1
      src/main/resources/application-test.yml

BIN
doc/A5000plus说明书_200922.pdf

76
src/main/java/com/dreamworks/boditech/controller/DeviceController.java

@ -12,6 +12,7 @@ import com.dreamworks.boditech.entity.ParamTestEmergencyAppend;
import com.dreamworks.boditech.entity.ParamTestRegularAppend;
import com.dreamworks.boditech.service.DeviceService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -27,6 +28,75 @@ import java.util.Map;
public class DeviceController extends BaseController {
@Resource
private DeviceService deviceService;
@Value("${app.device.enable}")
private Boolean deviceEnable;
@ResponseBody
@PostMapping("/api/device/load")
public ApiResponse load() {
if ( !this.deviceEnable ) { // @TODO: 测试完成后删除
return this.success();
}
this.deviceService.load();
return this.success();
}
@ResponseBody
@PostMapping("/api/device/test-card-load")
@ -169,11 +239,7 @@ public class DeviceController extends BaseController {
return this.success();
}
@ResponseBody
@PostMapping("/api/device/load")
public ApiResponse load() {
return this.success();
}
@ResponseBody
@PostMapping("/api/device/unload")

9
src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java

@ -1,5 +1,8 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmTestCardBox {
// status of test card box : OK
public static final String STATUS_OK = "OK";
/**
* index of test card box : 0 - 5
*/
@ -14,10 +17,10 @@ public class CsmTestCardBox {
/**
* status of test card box :
* <li>- EMPTY
* <li>- READY
* <li>- OK
* <li>- NOT_EXIST
* <li>- QR_CODE_INVALID
* <li>- ID_CHIP_INFO_NOT_FOUND
*/
public String status = "EMPTY";
public String status = "NOT_EXIST";
}

18
src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java

@ -10,6 +10,8 @@ public class CsmTestCardManager {
private final Device device;
// list of test card boxes
private final List<CsmTestCardBox> testCardBoxes = new ArrayList<>();
// list of project colors
private final String[] colors = new String[]{"red", "green", "blue", "yellow", "purple", "orange"};
// constructor
public CsmTestCardManager(Device device) {
@ -50,7 +52,7 @@ public class CsmTestCardManager {
}
/**
* append test card by box code
* append test card by box code string
* code example : 1||CAGGB66U||2024.03.26||1279||06
* code format : projectCodeNum||lotCode||expireDate||unknown||unknown
* @param index position of test card in cell
@ -61,23 +63,25 @@ public class CsmTestCardManager {
String[] parts = code.split("\\|\\|");
if (parts.length != 5) {
box.status = "QR_CODE_INVALID";
return;
throw new RuntimeException("QR_CODE_INVALID");
}
box.lotCode = parts[1];
IdChip idChip = this.device.idChipService.findByLotCode(box.lotCode);
if ( null == idChip ) {
box.status = "ID_CHIP_INFO_NOT_FOUND";
return;
throw new RuntimeException("ID_CHIP_INFO_NOT_FOUND");
}
if ( idChip.expiredDate < System.currentTimeMillis() / 1000 ) {
throw new RuntimeException("ID_CHIP_EXPIRED");
}
Integer projectCodeNum = Integer.parseInt(parts[0]);
Project project = this.device.projectService.findByCodeNum(projectCodeNum);
Project project = this.device.projectService.activeProjectByCodeNum(projectCodeNum);
box.projectId = project.id;
box.projectName = project.name;
box.projectColor = project.color;
box.cardAmount = 25;
box.status = "READY";
box.status = CsmTestCardBox.STATUS_OK;
}

47
src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java

@ -0,0 +1,47 @@
package com.dreamworks.boditech.driver.task;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.actuator.ActArmXY;
import com.dreamworks.boditech.driver.actuator.ActCodeScanner;
import com.dreamworks.boditech.driver.actuator.ActModuleTestCardBoxCase;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;
public class TaskLoad extends TaskBase {
@Override
public void execute(Executor executor) {
Device device = executor.getDevice();
ActArmXY armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
try {
this.testCardLoad(executor);
} catch (RuntimeException e) {
armXY.reset();
throw e;
}
}
// load test card
private void testCardLoad(Executor executor) {
Device device = executor.getDevice();
ActArmXY armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
ActCodeScanner codeScanner = (ActCodeScanner)device.getActuator(ActuatorModule.ARM_Z_SCANNER);
// 检查试卡盒仓盖是否关闭
ActModuleTestCardBoxCase testCardBoxCase = (ActModuleTestCardBoxCase)device.getActuator(ActuatorModule.TEST_CARD_BOX_CASE);
if ( 1 == testCardBoxCase.readIO(ActModuleTestCardBoxCase.IO_CASE_COVER_CLOSED) ) {
throw new RuntimeException("TEST_CARD_BOX_CASE_COVER_NOT_CLOSED");
}
Integer scanStartX = device.getLocationByName("testCardScanStart.x");
Integer scanStartY = device.getLocationByName("testCardScanStart.y");
Integer scanDistance = device.getLocationByName("testCardBoxScanDistance");
for ( int i=0; i<6; i++ ) {
armXY.moveTo(scanStartX, scanStartY + i * scanDistance);
String code = codeScanner.scan(500);
if ( "".equals(code) ) {
continue ;
}
device.testCards.appendByBoxCode(i, code);
}
armXY.reset();
}
}

2
src/main/java/com/dreamworks/boditech/entity/IdChip.java

@ -3,5 +3,5 @@ public class IdChip {
// lot code
public String lotCode;
// expire date
public String expiredDate;
public Integer expiredDate;
}

2
src/main/java/com/dreamworks/boditech/entity/Project.java

@ -4,5 +4,7 @@ public class Project {
public String name;
public String code;
public Integer codeNum;
// color of project
public String color;
public String steps;
}

2
src/main/java/com/dreamworks/boditech/mapper/IdChipMapper.java

@ -4,6 +4,6 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface IdChipMapper {
@Select("SELECT * FROM id_chip WHERE lot_code = #{lotCode}")
@Select("SELECT * FROM bdt_id_chips WHERE lotCode = #{lotCode}")
IdChip findByLotCode(String lotCode);
}

12
src/main/java/com/dreamworks/boditech/service/DeviceService.java

@ -24,6 +24,18 @@ public class DeviceService {
// task executor thread
private Thread taskExecutorThread;
/**
* load consumable resources
*/
public void load() {
TaskLoad task = new TaskLoad();
Executor.executeTask(this.device, task);
}
// scan and load test cards
public void testCardLoad() {
TaskTestCardLoad task = new TaskTestCardLoad();

41
src/main/java/com/dreamworks/boditech/service/ProjectService.java

@ -1,20 +1,57 @@
package com.dreamworks.boditech.service;
import com.dreamworks.boditech.entity.Project;
import com.dreamworks.boditech.mapper.ProjectMapper;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class ProjectService {
@Resource
private ProjectMapper projectMapper;
// list of projects
private List<Project> projects;
// project colors
private final String[] colors = new String[]{"red", "green", "blue", "yellow", "orange", "pink"};
// project color index
private Integer colorIndex = 0;
@PostConstruct
public void init() {
this.projects = new ArrayList<>();
}
// active project
public Project activeProjectByCodeNum(Integer codeNum) {
Project project = this.findByCodeNum(codeNum);
if ( project == null ) {
throw new RuntimeException("PROJECT_CODE_NOT_AVAILABLE");
}
project.color = this.colors[this.colorIndex % this.colors.length];
this.projects.add(project);
this.colorIndex++;
return project;
}
// find by id
public Project findById(Integer id) {
return projectMapper.findById(id);
}
// find by code number
public Project findByCodeNum(Integer codeNum) {
return projectMapper.findByCodeNum(codeNum);

1
src/main/resources/application-dev.yml

@ -7,6 +7,7 @@ spring:
app:
device:
enable : true
debug : true
connectionType : SerialPort # SerialPort, WebSocket
path : COM3

1
src/main/resources/application-test.yml

@ -7,6 +7,7 @@ spring:
app:
device:
enable : false
debug : true
connectionType : WebSocket # SerialPort, WebSocket
path : COM3

Loading…
Cancel
Save