diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApiControllerBase.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApiControllerBase.java new file mode 100644 index 0000000..222ad43 --- /dev/null +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApiControllerBase.java @@ -0,0 +1,54 @@ +package com.my.graphiteDigesterBg.diframe; +abstract public class DiApiControllerBase { + /** + * success response + * @return ApiResponse + */ + protected DiApiResponse success() { + DiApiResponse response = new DiApiResponse(); + response.success = true; + response.message = "OK"; + response.code = "OK"; + return response; + } + + /** + * success response with data + * @param data - data to be returned + * @return ApiResponse + */ + protected DiApiResponse success(Object data) { + DiApiResponse response = new DiApiResponse(); + response.success = true; + response.message = "OK"; + response.code = "OK"; + response.data = data; + return response; + } + + /** + * error response + * @param message - error message + * @return ApiResponse + */ + protected DiApiResponse error(String message) { + DiApiResponse response = new DiApiResponse(); + response.success = false; + response.message = message; + return response; + } + + /** + * error response with code + * @param message - error message + * @param code - error code + * @return ApiResponse + */ + protected DiApiResponse error(String message, String code ) { + DiApiResponse response = new DiApiResponse(); + response.success = false; + response.message = message; + response.code = code; + return response; + } +} diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApiResponse.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApiResponse.java new file mode 100644 index 0000000..491a036 --- /dev/null +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApiResponse.java @@ -0,0 +1,11 @@ +package com.my.graphiteDigesterBg.diframe; +public class DiApiResponse { + // success or not + public boolean success; + // error code + public String code; + // message + public String message; + // data + public Object data; +} diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java index f8f8109..dbaabdf 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java @@ -9,15 +9,12 @@ public class DiDevice { private DiDeviceActuatorManager actuators; // task manager private DiTaskManager taskManager; - // task executor - private DiTaskExecutor taskExecutor; @PostConstruct public void init() { this.io = new DiDeviceIOManager(this); this.actuators = new DiDeviceActuatorManager(this); - this.taskManager = new DiTaskManager(); - this.taskExecutor = new DiTaskExecutor(this); + this.taskManager = new DiTaskManager(this); } // get io manager @@ -30,11 +27,6 @@ public class DiDevice { return this.actuators; } - // get task executor - public DiTaskExecutor getTaskExecutor() { - return this.taskExecutor; - } - // get task manager public DiTaskManager getTaskManager() { return this.taskManager; diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java index 30bf956..db125ad 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java @@ -1,10 +1,55 @@ package com.my.graphiteDigesterBg.diframe; -public class DiTaskExecutor { +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +public class DiTaskExecutor implements Runnable { + // logger + public static final Logger LOG = LoggerFactory.getLogger(DiTaskExecutor.class); // device instance - private DiDevice device; + private final DiDevice device; + // stop request lock + private final Object stopRequestLock; + // stop request flag + private boolean isStopRequested; // constructor public DiTaskExecutor(DiDevice device) { this.device = device; + this.stopRequestLock = new Object(); + this.isStopRequested = false; } + + @Override + public void run() { + LOG.info("Task executor started"); + while ( !this.isStopRequested ) { + LOG.info("Task executor running"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + LOG.error("Task executor interrupted"); + break; + } + } + LOG.info("Task executor stopped"); + synchronized (this.stopRequestLock) { + this.stopRequestLock.notifyAll(); + } + } + + // stop executor + public void stop() { + LOG.info("Task executor stop requested"); + synchronized (this.stopRequestLock) { + this.isStopRequested = true; + try { + this.stopRequestLock.wait(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + LOG.info("Task executor stop completed"); + } + + public void pause() {} + public void resume() {} } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java index 38d5c16..3d0c0af 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java @@ -10,12 +10,34 @@ import java.util.Map; public class DiTaskManager { // logger public static final Logger LOG = LoggerFactory.getLogger(DiTaskManager.class); + // device + private DiDevice device; // task classes private Map> taskClasses; + // task executor + private DiTaskExecutor executor; + // executor thread + private Thread executorThread; // constructor - public DiTaskManager() { + public DiTaskManager(DiDevice device) { + this.device = device; this.taskClasses = new HashMap<>(); + this.executor = null; + this.executorThread = null; + } + + // start executor + public void executorStart() { + this.executor = new DiTaskExecutor(this.device); + this.executorThread = new Thread(this.executor); + this.executorThread.setName("task-executor"); + this.executorThread.start(); + } + + // get executor + public DiTaskExecutor getExecutor() { + return this.executor; } // get scan task classes diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiDevice.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiDevice.java index d9461b2..19364f9 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiDevice.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/ApiDevice.java @@ -1,8 +1,36 @@ package com.my.graphiteDigesterBg.diframe.api; -public class ApiDevice { - public void init() {} - public void start() {} - public void stop() {} +import com.my.graphiteDigesterBg.diframe.DiApiControllerBase; +import com.my.graphiteDigesterBg.diframe.DiApiResponse; +import com.my.graphiteDigesterBg.diframe.DiDevice; +import jakarta.annotation.Resource; +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 { + @Resource + private DiDevice device; + + /** + * start device to execute tasks + */ + @ResponseBody + @PostMapping("/api/device/start") + public DiApiResponse start() { + this.device.getTaskManager().executorStart(); + return this.success(); + } + + /** + * stop device to execute tasks + */ + @ResponseBody + @PostMapping("/api/device/stop") + public DiApiResponse stop() { + this.device.getTaskManager().getExecutor().stop(); + return this.success(); + } + public void pause() {} public void resume() {} }