Browse Source

设备连接

master
sige 2 years ago
parent
commit
fd851f5fa4
  1. 6
      src/pom.xml
  2. 3
      src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java
  3. 3
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuator.java
  4. 36
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java
  5. 25
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommand.java
  6. 16
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommandResponse.java
  7. 48
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java
  8. 7
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java
  9. 10
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceConnection.java
  10. 2
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java
  11. 13
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java
  12. 5
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java
  13. 6
      src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java
  14. 2
      src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiConsumable.java
  15. 2
      src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiDevice.java
  16. 2
      src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java
  17. 2
      src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiUser.java
  18. 72
      src/src/main/java/com/my/graphiteDigesterBg/diframe/connection/DiConSerialPort.java
  19. 6
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java
  20. 1
      src/src/main/resources/application.properties
  21. 7
      src/src/main/resources/application.yml

6
src/pom.xml

@ -27,6 +27,12 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
<build>

3
src/src/main/java/com/my/graphiteDigesterBg/MyApplicationRunner.java

@ -4,6 +4,7 @@ import com.my.graphiteDigesterBg.diframe.DiDeviceActuatorManager;
import com.my.graphiteDigesterBg.diframe.DiDeviceIO;
import com.my.graphiteDigesterBg.diframe.DiDeviceIOManager;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump;
import jakarta.annotation.Resource;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
@ -70,7 +71,7 @@ public class MyApplicationRunner implements ApplicationRunner {
actuators.register(MyDevice.ACT_LIQUID_PLATE_MOTOR, new DiActMotor(){{
mid = 51;
}});
actuators.register(MyDevice.ACT_LIQUID_PERISTALTIC_PUMP, new DiActMotor(){{
actuators.register(MyDevice.ACT_LIQUID_PERISTALTIC_PUMP, new DiActPeristalticPump(){{
mid = 61;
}});
}

3
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuator.java

@ -1,4 +1,5 @@
package com.my.graphiteDigesterBg.diframe;
public interface DiActuator {
// set device
void setDevice( DiDevice device );
}

36
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActuatorBase.java

@ -1,8 +1,40 @@
package com.my.graphiteDigesterBg.diframe;
import com.my.graphiteDigesterBg.diframe.DiActuator;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
abstract public class DiActuatorBase implements DiActuator {
// device
private DiDevice device;
// mid
protected Integer mid;
@Override
public void setDevice( DiDevice device ) {
this.device = device;
}
// execute device command
protected DiCommandResponse call( DiCommand cmd, Object... args ) {
ByteBuffer buffer = null;
String cmdMode = this.device.getEnv().getProperty("device.command.mode");
if ("text".equals(cmdMode)) {
buffer = this.buildCommandBufferForTextMode(cmd, args);
} else {
throw new RuntimeException("Unknown command mode: " + cmdMode);
}
ByteBuffer response = this.device.getConnection().call(buffer);
return new DiCommandResponse(response);
}
// build command buffer for text mode
private ByteBuffer buildCommandBufferForTextMode(DiCommand cmd, Object... args) {
List<String> parts = new ArrayList<>();
parts.add(cmd.getName());
for ( Object arg : args ) {
parts.add(arg.toString());
}
String command = String.join(" ", parts);
return ByteBuffer.wrap(command.getBytes());
}
}

25
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommand.java

@ -0,0 +1,25 @@
package com.my.graphiteDigesterBg.diframe;
public enum DiCommand {
MOTOR_EASY_MOVE_BY("motor_easy_move_by", 0x0212);
// command name
private final String name;
// command id
private final int cmdId;
// constructor
DiCommand(String name, int cmdId) {
this.name = name;
this.cmdId = cmdId;
}
// get command name
public String getName() {
return this.name;
}
// get command id
public int getCmdId() {
return this.cmdId;
}
}

16
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommandResponse.java

@ -0,0 +1,16 @@
package com.my.graphiteDigesterBg.diframe;
import java.nio.ByteBuffer;
public class DiCommandResponse {
// response
private final ByteBuffer response;
// constructor
public DiCommandResponse(ByteBuffer response) {
this.response = response;
}
// read integer
public Integer readInteger( Integer index ) {
return this.response.getInt(index);
}
}

48
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java

@ -1,8 +1,19 @@
package com.my.graphiteDigesterBg.diframe;
import com.my.graphiteDigesterBg.diframe.connection.DiConSerialPort;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@Component
public class DiDevice {
@Resource
private Environment env;
// connection
private DiDeviceConnection connection;
// io manager
private DiDeviceIOManager io;
// actuator manager
@ -12,11 +23,38 @@ public class DiDevice {
@PostConstruct
public void init() {
this.setupConnection();
this.io = new DiDeviceIOManager(this);
this.actuators = new DiDeviceActuatorManager(this);
this.taskManager = new DiTaskManager(this);
}
// setup connection
private void setupConnection() {
String connectionClassName = this.env.getProperty("device.connection.class");
Class<?> connectionClass = null;
try {
connectionClass = Class.forName(connectionClassName);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
Constructor<?> connectionConstructor = null;
try {
connectionConstructor = connectionClass.getDeclaredConstructor();
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
try {
this.connection = (DiDeviceConnection) connectionConstructor.newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
this.connection.setDevice(this);
this.connection.connect();
}
// get io manager
public DiDeviceIOManager getIO() {
return this.io;
@ -31,4 +69,14 @@ public class DiDevice {
public DiTaskManager getTaskManager() {
return this.taskManager;
}
// get connection
public DiDeviceConnection getConnection() {
return this.connection;
}
// get env
public Environment getEnv() {
return this.env;
}
}

7
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceActuatorManager.java

@ -15,11 +15,12 @@ public class DiDeviceActuatorManager {
// register actuator
public void register( String id, DiActuator actuator ) {
this.actuators.put( id, actuator );
actuator.setDevice(this.device);
this.actuators.put(id, actuator);
}
// get actuator
public void get( String id ) {
this.actuators.get( id );
public DiActuator get( String id ) {
return this.actuators.get( id );
}
}

10
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDeviceConnection.java

@ -0,0 +1,10 @@
package com.my.graphiteDigesterBg.diframe;
import java.nio.ByteBuffer;
public interface DiDeviceConnection {
// set device
void setDevice(DiDevice device);
// connect to device
void connect();
// call device with parameter and return result
ByteBuffer call(ByteBuffer parameter);
}

2
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java

@ -6,6 +6,8 @@ public interface DiTask {
TaskStatus getStatus();
// get UUID
String getUUID();
// set device
void setDevice(DiDevice device);
// set parameter
void setParameter(Object parameter);
// run

13
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java

@ -1,8 +1,9 @@
package com.my.graphiteDigesterBg.diframe;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
abstract public class DiTaskBase implements DiTask {
// device
private DiDevice device;
// uuid
private final String uuid;
// status
@ -27,6 +28,11 @@ abstract public class DiTaskBase implements DiTask {
this.status = status;
}
// get device
protected DiDevice getDevice() {
return this.device;
}
@Override
public String getUUID() {
return this.uuid;
@ -38,6 +44,11 @@ abstract public class DiTaskBase implements DiTask {
}
@Override
public void setDevice(DiDevice device) {
this.device = device;
}
@Override
public void setParameter(Object parameter) {
this.parameter = parameter;
}

5
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java

@ -11,9 +11,9 @@ public class DiTaskManager {
// logger
public static final Logger LOG = LoggerFactory.getLogger(DiTaskManager.class);
// device
private DiDevice device;
private final DiDevice device;
// task classes
private Map<String, Class<?>> taskClasses;
private final Map<String, Class<?>> taskClasses;
// task executor
private DiTaskExecutor executor;
// executor thread
@ -75,6 +75,7 @@ public class DiTaskManager {
throw new RuntimeException(e);
}
task.setDevice(this.device);
task.setParameter(parameter);
return task;
}

6
src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java

@ -1,6 +1,8 @@
package com.my.graphiteDigesterBg.diframe.actuator;
import com.my.graphiteDigesterBg.diframe.DiActuatorBase;
import com.my.graphiteDigesterBg.diframe.DiCommand;
public class DiActPeristalticPump extends DiActuatorBase {
public void rotate() {
this.call(DiCommand.MOTOR_EASY_MOVE_BY, 1);
}
}

2
src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiConsumable.java → src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiConsumable.java

@ -1,4 +1,4 @@
package com.my.graphiteDigesterBg.diframe.api;
public class ApiConsumable {
public class DiApiConsumable {
}

2
src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiDevice.java → src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiDevice.java

@ -7,7 +7,7 @@ import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ApiDevice extends DiApiControllerBase {
public class DiApiDevice extends DiApiControllerBase {
@Resource
private DiDevice device;

2
src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiTask.java → src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java

@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Map;
@Controller
public class ApiTask extends DiApiControllerBase {
public class DiApiTask extends DiApiControllerBase {
@Resource
private DiDevice device;

2
src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiUser.java → src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiUser.java

@ -1,5 +1,5 @@
package com.my.graphiteDigesterBg.diframe.api;
public class ApiUser {
public class DiApiUser {
public void login() {}
public void logout() {}
}

72
src/src/main/java/com/my/graphiteDigesterBg/diframe/connection/DiConSerialPort.java

@ -0,0 +1,72 @@
package com.my.graphiteDigesterBg.diframe.connection;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import com.my.graphiteDigesterBg.diframe.DiDevice;
import com.my.graphiteDigesterBg.diframe.DiDeviceConnection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
import java.nio.ByteBuffer;
public class DiConSerialPort implements DiDeviceConnection {
// logger
public static final Logger LOG = LoggerFactory.getLogger(DiConSerialPort.class);
// device
private DiDevice device;
// serial port connection
private SerialPort connection;
@Override
public void setDevice(DiDevice device) {
this.device = device;
}
@Override
public void connect() {
Environment env = this.device.getEnv();
String path = env.getProperty("device.connection.path");
if ( null == path ) {
throw new RuntimeException("device option 'device.connection.path' is required.");
}
Integer baudRate = env.getProperty("device.connection.baudRate", Integer.class);
if ( null == baudRate ) {
throw new RuntimeException("device option 'device.connection.baudRate' is required.");
}
this.connection = SerialPort.getCommPort(path);
this.connection.openPort();
if ( !this.connection.isOpen() ) {
throw new RuntimeException("Failed to open serial port");
}
this.connection.setBaudRate(baudRate);
this.connection.addDataListener(new SerialPortDataListener() {
@Override
public int getListeningEvents() {
return SerialPort.LISTENING_EVENT_DATA_RECEIVED;
}
@Override
public void serialEvent(SerialPortEvent serialPortEvent) {
DiConSerialPort.this.handleOnData(serialPortEvent);
}
});
LOG.info("Connecting to device: {}@{}", path, baudRate);
}
// handle on data
private void handleOnData(SerialPortEvent serialPortEvent) {
byte[] data = serialPortEvent.getReceivedData();
System.out.println("Received data of size: " + data.length);
for (byte b : data) {
System.out.print((char)b);
}
System.out.println("\n");
}
@Override
public ByteBuffer call(ByteBuffer parameter) {
byte[] data = parameter.array();
this.connection.writeBytes(data, data.length);
return null;
}
}

6
src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java

@ -1,10 +1,16 @@
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.DiActPeristalticPump;
@Task(name="digestion")
public class TaskDigestion extends DiTaskBase {
@Override
public void run() {
DiActPeristalticPump peristalticPump = (DiActPeristalticPump)this.getDevice().getActuators().get(MyDevice.ACT_LIQUID_PERISTALTIC_PUMP);
peristalticPump.rotate();
System.out.println("TaskDigestion.run()");
this.setStatus(TaskStatus.FINISHED);
}

1
src/src/main/resources/application.properties

@ -1 +0,0 @@

7
src/src/main/resources/application.yml

@ -0,0 +1,7 @@
device :
connection :
class : com.my.graphiteDigesterBg.diframe.connection.DiConSerialPort
path : COM1
baudRate : 9600
command :
mode : text # text | hex | binary
Loading…
Cancel
Save