diff --git a/doc/A5000plus说明书_200922.pdf b/doc/A5000plus说明书_200922.pdf new file mode 100644 index 0000000..8a24e20 Binary files /dev/null and b/doc/A5000plus说明书_200922.pdf differ diff --git a/src/main/java/com/dreamworks/boditech/controller/DeviceController.java b/src/main/java/com/dreamworks/boditech/controller/DeviceController.java index bb96753..c424ab8 100644 --- a/src/main/java/com/dreamworks/boditech/controller/DeviceController.java +++ b/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") diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java index bb0bd49..0c9a8ec 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java +++ b/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 : - *
  • - EMPTY - *
  • - READY + *
  • - OK + *
  • - NOT_EXIST *
  • - QR_CODE_INVALID *
  • - ID_CHIP_INFO_NOT_FOUND */ - public String status = "EMPTY"; + public String status = "NOT_EXIST"; } diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java index 2559c14..24b2e5d 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java +++ b/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 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; } diff --git a/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java b/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java new file mode 100644 index 0000000..a085943 --- /dev/null +++ b/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(); + } +} diff --git a/src/main/java/com/dreamworks/boditech/entity/IdChip.java b/src/main/java/com/dreamworks/boditech/entity/IdChip.java index 8bf6f27..f1c8c4c 100644 --- a/src/main/java/com/dreamworks/boditech/entity/IdChip.java +++ b/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; } diff --git a/src/main/java/com/dreamworks/boditech/entity/Project.java b/src/main/java/com/dreamworks/boditech/entity/Project.java index dd24ade..5e66beb 100644 --- a/src/main/java/com/dreamworks/boditech/entity/Project.java +++ b/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; } diff --git a/src/main/java/com/dreamworks/boditech/mapper/IdChipMapper.java b/src/main/java/com/dreamworks/boditech/mapper/IdChipMapper.java index 3d60164..c1a6bb6 100644 --- a/src/main/java/com/dreamworks/boditech/mapper/IdChipMapper.java +++ b/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); } diff --git a/src/main/java/com/dreamworks/boditech/service/DeviceService.java b/src/main/java/com/dreamworks/boditech/service/DeviceService.java index 98d6452..c6ecb5c 100644 --- a/src/main/java/com/dreamworks/boditech/service/DeviceService.java +++ b/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(); diff --git a/src/main/java/com/dreamworks/boditech/service/ProjectService.java b/src/main/java/com/dreamworks/boditech/service/ProjectService.java index 4dc9222..1c7cf72 100644 --- a/src/main/java/com/dreamworks/boditech/service/ProjectService.java +++ b/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 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); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 98b0712..3e399f0 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -7,6 +7,7 @@ spring: app: device: + enable : true debug : true connectionType : SerialPort # SerialPort, WebSocket path : COM3 diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 75e9346..0c27b90 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -7,6 +7,7 @@ spring: app: device: + enable : false debug : true connectionType : WebSocket # SerialPort, WebSocket path : COM3