33 changed files with 648 additions and 113 deletions
-
5src/pom.xml
-
6src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java
-
2src/src/main/java/com/my/graphiteDigesterBg/MyDevice.java
-
7src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuator.java
-
88src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java
-
1src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApplicationRunner.java
-
7src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommand.java
-
2src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommandRequest.java
-
4src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommandResponse.java
-
143src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java
-
11src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceRegister.java
-
52src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceRegisterManager.java
-
70src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceResourceManager.java
-
3src/src/main/java/com/my/graphiteDigesterBg/diframe/DiResourceManager.java
-
4src/src/main/java/com/my/graphiteDigesterBg/diframe/DiResourceManagerBase.java
-
19src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java
-
4src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java
-
2src/src/main/java/com/my/graphiteDigesterBg/diframe/ResourceManager.java
-
10src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActMotor.java
-
5src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActServo.java
-
12src/src/main/java/com/my/graphiteDigesterBg/diframe/connection/DiConSerialPort.java
-
26src/src/main/java/com/my/graphiteDigesterBg/diframe/util/DiByteBuffer.java
-
6src/src/main/java/com/my/graphiteDigesterBg/diframe/util/DiClassHelper.java
-
24src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlot.java
-
24src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java
-
24src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java
-
24src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java
-
18src/src/main/resources/application.yml
-
18src/src/main/resources/device.yml
-
106src/web/package-lock.json
-
3src/web/package.json
-
28src/web/src/pages/main/contents/Operation.vue
@ -1,5 +1,12 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
public interface DiActuator { |
|||
static Integer MODULE_STATUS_IDLE = 0; |
|||
static Integer MODULE_STATUS_BUSY = 1; |
|||
static Integer MODULE_STATUS_ERROR = 2; |
|||
|
|||
// set device |
|||
void setDevice( DiDevice device ); |
|||
|
|||
// get mid |
|||
Integer getMid(); |
|||
} |
@ -1,2 +1,11 @@ |
|||
package com.my.graphiteDigesterBg.diframe;public class DiDeviceRegister { |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
public class DiDeviceRegister { |
|||
// key |
|||
public String key; |
|||
// module id |
|||
public Integer mid; |
|||
// index |
|||
public Integer index; |
|||
// default value |
|||
public Integer defaultValue; |
|||
} |
@ -1,2 +1,52 @@ |
|||
package com.my.graphiteDigesterBg.diframe;public class DiDeviceRegisterManager { |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
public class DiDeviceRegisterManager { |
|||
// device instance |
|||
private final DiDevice device; |
|||
// id => actuator |
|||
private final Map<String, DiDeviceRegister> registers; |
|||
|
|||
// constructor |
|||
public DiDeviceRegisterManager(DiDevice device ) { |
|||
this.device = device; |
|||
this.registers = new HashMap<String, DiDeviceRegister>(); |
|||
} |
|||
|
|||
// setup |
|||
public void setup() { |
|||
Object config = this.device.getConfig().get("registers"); |
|||
if ( config == null ) { |
|||
return; |
|||
} |
|||
|
|||
if ( !(config instanceof List) ) { |
|||
throw new RuntimeException("Invalid registers config"); |
|||
} |
|||
|
|||
List<Map<String,Object>> registers = (List<Map<String, Object>>) config; |
|||
for ( Map<String,Object> register : registers ) { |
|||
DiDeviceRegister reg = new DiDeviceRegister(); |
|||
reg.key = (String)register.get("key"); |
|||
reg.mid = (Integer)register.get("mid"); |
|||
reg.index = (Integer)register.get("index"); |
|||
reg.defaultValue = (Integer)register.get("defaultValue"); |
|||
this.registers.put(reg.key, reg); |
|||
} |
|||
} |
|||
|
|||
// reset register to default value |
|||
public void resetAllByModuleId( Integer mid ) { |
|||
for ( DiDeviceRegister register : this.registers.values() ) { |
|||
if ( register.mid.equals(mid) ) { |
|||
this.device.call(DiCommand.MODULE_SET_REG, register.mid, register.index, register.defaultValue); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// get actuator |
|||
public void get( String id ) { |
|||
this.registers.get(id); |
|||
} |
|||
} |
@ -1,4 +1,72 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
public class DiResourceManager { |
|||
import com.my.graphiteDigesterBg.diframe.util.DiClassHelper; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import java.lang.reflect.Constructor; |
|||
import java.lang.reflect.InvocationTargetException; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
public class DiDeviceResourceManager { |
|||
// logger |
|||
public static final Logger LOG = LoggerFactory.getLogger(DiTaskManager.class); |
|||
// device |
|||
private DiDevice device; |
|||
// resource managers |
|||
private final Map<String, DiResourceManager> managersNameMap; |
|||
// resource managers |
|||
private final Map<Class<?>, DiResourceManager> managersClassMap; |
|||
|
|||
// constructor |
|||
public DiDeviceResourceManager(DiDevice device) { |
|||
this.device = device; |
|||
this.managersNameMap = new HashMap<>(); |
|||
this.managersClassMap = new HashMap<>(); |
|||
} |
|||
|
|||
// get scan task classes |
|||
public void scanResourceManagerClasses( String packageName ) { |
|||
List<Class<?>> resManClasses = DiClassHelper.getAllClassesInPackage(packageName); |
|||
for ( Class<?> resManClass : resManClasses ) { |
|||
if ( DiResourceManagerBase.class.isAssignableFrom(resManClass) ) { |
|||
ResourceManager manAnnotation = resManClass.getAnnotation(ResourceManager.class); |
|||
if ( manAnnotation == null ) { |
|||
continue; |
|||
} |
|||
|
|||
LOG.info("(Resource) {} => {}", manAnnotation.name(), resManClass.getName()); |
|||
DiResourceManager man = this.getDiResourceManagerInstance(resManClass); |
|||
this.managersNameMap.put(manAnnotation.name(), man); |
|||
this.managersClassMap.put(resManClass, man); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// get instance of resource manager |
|||
private DiResourceManager getDiResourceManagerInstance(Class<?> resManClass) { |
|||
Constructor<?> manConstructor = null; |
|||
try { |
|||
manConstructor = resManClass.getDeclaredConstructor(); |
|||
} catch (NoSuchMethodException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
|
|||
DiResourceManager man = null; |
|||
try { |
|||
man = (DiResourceManager) manConstructor.newInstance(); |
|||
} catch (InvocationTargetException | InstantiationException | IllegalAccessException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
return man; |
|||
} |
|||
|
|||
// get manager |
|||
public DiResourceManager getManager( String resourceType ) { |
|||
return this.managersNameMap.get(resourceType); |
|||
} |
|||
|
|||
// get manager |
|||
public <T extends DiResourceManagerBase> T getManager( Class<T> clazz ) { |
|||
return (T)this.managersClassMap.get(clazz); |
|||
} |
|||
} |
@ -1,2 +1,3 @@ |
|||
package com.my.graphiteDigesterBg.diframe;public interface DiResourceManager { |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
public interface DiResourceManager { |
|||
} |
@ -1,2 +1,4 @@ |
|||
package com.my.graphiteDigesterBg.diframe;public class DiResourceManagerBase { |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
abstract public class DiResourceManagerBase implements DiResourceManager { |
|||
|
|||
} |
@ -1,11 +1,15 @@ |
|||
package com.my.graphiteDigesterBg.diframe.actuator; |
|||
|
|||
import com.my.graphiteDigesterBg.diframe.DiActuatorBase; |
|||
|
|||
import com.my.graphiteDigesterBg.diframe.DiCommand; |
|||
public class DiActMotor extends DiActuatorBase { |
|||
// reset motor to zero position |
|||
public void reset() { |
|||
this.call(DiCommand.MOTOR_EASY_MOVE_TO_ZERO, -1); |
|||
this.waitForFinish(); |
|||
} |
|||
|
|||
public void moveTo( Integer pos ) {} |
|||
public void moveBy( Integer delta ) {} |
|||
public void rotate( Integer direction ) {} |
|||
public void stop() {} |
|||
public void reset() {} |
|||
} |
@ -1,4 +1,26 @@ |
|||
package com.my.graphiteDigesterBg.diframe.util; |
|||
public class MyByteBuffer { |
|||
|
|||
import java.nio.ByteBuffer; |
|||
public class DiByteBuffer { |
|||
// convert byte buffer to hex string |
|||
public static String toHex ( ByteBuffer buffer ) { |
|||
StringBuilder sb = new StringBuilder(); |
|||
for (int i = 0; i < buffer.limit(); i++) { |
|||
sb.append(String.format("%02X ", buffer.get(i))); |
|||
} |
|||
return sb.toString(); |
|||
} |
|||
|
|||
// convert hex string to byte buffer |
|||
public static ByteBuffer fromHex ( String hex ) { |
|||
// remove space |
|||
hex = hex.replaceAll(" ", ""); |
|||
// convert hex string to byte array |
|||
byte[] bytes = new byte[hex.length() / 2]; |
|||
for (int i = 0; i < hex.length(); i += 2) { |
|||
String sub = hex.substring(i, i + 2); |
|||
bytes[i / 2] = (byte) Integer.parseInt(sub, 16); |
|||
} |
|||
// convert byte array to byte buffer |
|||
return ByteBuffer.wrap(bytes); |
|||
} |
|||
} |
@ -1,4 +1,26 @@ |
|||
package com.my.graphiteDigesterBg.resource; |
|||
public class HeatingTubeRackSlot { |
|||
public class ResHeatingTubeRackSlot { |
|||
// index of slot |
|||
public Integer index; |
|||
// is slot locked |
|||
private Boolean isLocked; |
|||
|
|||
public Integer getOperationWindowLocation() { |
|||
return 0; |
|||
} |
|||
|
|||
// get is slot locked |
|||
public Boolean getIsLocked() { |
|||
return this.isLocked; |
|||
} |
|||
|
|||
// lock slot |
|||
public void lock() { |
|||
this.isLocked = true; |
|||
} |
|||
|
|||
// unlock slot |
|||
public void unlock() { |
|||
this.isLocked = false; |
|||
} |
|||
} |
@ -1,10 +1,26 @@ |
|||
package com.my.graphiteDigesterBg.resource; |
|||
import com.my.graphiteDigesterBg.diframe.DiResourceManagerBase; |
|||
import com.my.graphiteDigesterBg.diframe.util.ResourceManager; |
|||
import com.my.graphiteDigesterBg.diframe.ResourceManager; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
@ResourceManager(name="HeatingTubeRackSlot") |
|||
public class HeatingTubeRackSlotManager extends DiResourceManagerBase { |
|||
public class ResHeatingTubeRackSlotManager extends DiResourceManagerBase { |
|||
// slots |
|||
private List<ResHeatingTubeRackSlot> slots; |
|||
|
|||
public ResHeatingTubeRackSlotManager() { |
|||
this.slots = new ArrayList<>(); |
|||
} |
|||
|
|||
// get free slot |
|||
public HeatingTubeRackSlot getFreeSlot() { |
|||
return null; |
|||
public ResHeatingTubeRackSlot allocFreeSlot() { |
|||
for (ResHeatingTubeRackSlot slot : this.slots) { |
|||
if (!slot.getIsLocked()) { |
|||
slot.lock(); |
|||
return slot; |
|||
} |
|||
} |
|||
throw new RuntimeException("No free slot"); |
|||
} |
|||
} |
@ -1,2 +1,24 @@ |
|||
package com.my.graphiteDigesterBg.task;public class TaskSampleAdd { |
|||
package com.my.graphiteDigesterBg.task; |
|||
import com.my.graphiteDigesterBg.MyDevice; |
|||
import com.my.graphiteDigesterBg.diframe.DiTaskBase; |
|||
import com.my.graphiteDigesterBg.diframe.Task; |
|||
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; |
|||
import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; |
|||
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; |
|||
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; |
|||
@Task(name="SampleAdd") |
|||
public class TaskSampleAdd extends DiTaskBase { |
|||
@Override |
|||
public void run() { |
|||
ResHeatingTubeRackSlotManager slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); |
|||
ResHeatingTubeRackSlot slot = slotMan.allocFreeSlot(); |
|||
|
|||
DiActMotor heatPlateMotor = (DiActMotor)this.getActuator(MyDevice.ACT_HEAT_PLATE_MOTOR); |
|||
heatPlateMotor.moveTo(slot.getOperationWindowLocation()); |
|||
|
|||
DiActServo coverServo = (DiActServo)this.getActuator(MyDevice.ACT_HEAT_SLOT_01_COVER_SERVO); |
|||
coverServo.moveTo(1000); |
|||
|
|||
this.setStatus(TaskStatus.FINISHED); |
|||
} |
|||
} |
@ -1,2 +1,24 @@ |
|||
package com.my.graphiteDigesterBg.task;public class TaskStartReset { |
|||
package com.my.graphiteDigesterBg.task; |
|||
import com.my.graphiteDigesterBg.MyDevice; |
|||
import com.my.graphiteDigesterBg.diframe.DiDeviceRegisterManager; |
|||
import com.my.graphiteDigesterBg.diframe.DiTaskBase; |
|||
import com.my.graphiteDigesterBg.diframe.Task; |
|||
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; |
|||
@Task(name="StartReset") |
|||
public class TaskStartReset extends DiTaskBase { |
|||
@Override |
|||
public void run() { |
|||
DiDeviceRegisterManager registers = this.getDevice().getRegisters(); |
|||
|
|||
// 加液机械臂启用并复位 |
|||
DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class); |
|||
liquidMotor.setEnable(true); |
|||
registers.resetAllByModuleId(liquidMotor.getMid()); |
|||
liquidMotor.activeConfig(); |
|||
liquidMotor.reset(); |
|||
|
|||
|
|||
|
|||
this.setStatus(TaskStatus.FINISHED); |
|||
} |
|||
} |
@ -1,7 +1,19 @@ |
|||
device : |
|||
connection : |
|||
class : com.my.graphiteDigesterBg.diframe.connection.DiConSerialPort |
|||
path : COM1 |
|||
baudRate : 9600 |
|||
path : COM7 |
|||
baudRate : 921600 |
|||
frameTimeout : 1000 |
|||
mode : binary # text | hex | binary |
|||
mode : binary # text | hex | binary |
|||
# device registers |
|||
registers : ["1", "2"] |
|||
# - {name: "LiquidMotorShaft" , mid : 41, index : 1051, defaultValue : 1} |
|||
# - {name: "LiquidMotorOneCirclePulse" , mid : 41, index : 1052, defaultValue : 10000} |
|||
# - {name: "LiquidMotorOneCirclePulseDenominator" , mid : 41, index : 1053, defaultValue : 18} |
|||
# - {name: "LiquidMotorDefaultVelocity" , mid : 41, index : 1054, defaultValue : 40} |
|||
# - {name: "LiquidMotorDefaultAcc" , mid : 41, index : 1055, defaultValue : 2} |
|||
# - {name: "LiquidMotorDefaultDec" , mid : 41, index : 1056, defaultValue : 2} |
|||
# - {name: "LiquidMotorRunToZeroSpeed" , mid : 41, index : 1073, defaultValue : 50} |
|||
# - {name: "LiquidMotorRunToZeroDec" , mid : 41, index : 1074, defaultValue : 30} |
|||
# - {name: "LiquidMotorLookZeroEdgeSpeed" , mid : 41, index : 1075, defaultValue : 25} |
|||
# - {name: "LiquidMotorLookZeroEdgeDec" , mid : 41, index : 1076, defaultValue : 30} |
@ -0,0 +1,18 @@ |
|||
connection : |
|||
class : com.my.graphiteDigesterBg.diframe.connection.DiConSerialPort |
|||
path : COM7 |
|||
baudRate : 921600 |
|||
frameTimeout : 1000 |
|||
mode : binary # text | hex | binary |
|||
# device registers |
|||
registers : |
|||
- {key: "LiquidMotorShaft" , mid : 41, index : 1051, defaultValue : 1} |
|||
- {key: "LiquidMotorOneCirclePulse" , mid : 41, index : 1052, defaultValue : 10000} |
|||
- {key: "LiquidMotorOneCirclePulseDenominator" , mid : 41, index : 1053, defaultValue : 18} |
|||
- {key: "LiquidMotorDefaultVelocity" , mid : 41, index : 1054, defaultValue : 40} |
|||
- {key: "LiquidMotorDefaultAcc" , mid : 41, index : 1055, defaultValue : 2} |
|||
- {key: "LiquidMotorDefaultDec" , mid : 41, index : 1056, defaultValue : 2} |
|||
- {key: "LiquidMotorRunToZeroSpeed" , mid : 41, index : 1073, defaultValue : 50} |
|||
- {key: "LiquidMotorRunToZeroDec" , mid : 41, index : 1074, defaultValue : 30} |
|||
- {key: "LiquidMotorLookZeroEdgeSpeed" , mid : 41, index : 1075, defaultValue : 25} |
|||
- {key: "LiquidMotorLookZeroEdgeDec" , mid : 41, index : 1076, defaultValue : 30} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue