From 3dd5ce81c99b1e3dba0862ede11ef07b050691ee Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Fri, 3 Nov 2023 15:31:11 +0300 Subject: [PATCH] progress --- config/database.config.js | 1 + controllers/modbus.controller.js | 22 +++--- data.db | Bin 20480 -> 20480 bytes public/css/dist.css | 12 +++ public/index.html | 120 ++++++++++++++++++++++++++--- public/js/app.js | 43 +++++++++++ routes/api/modbus.router.js | 3 +- validators/display-value.schema.js | 7 +- 8 files changed, 186 insertions(+), 22 deletions(-) diff --git a/config/database.config.js b/config/database.config.js index 778d678..adb729c 100644 --- a/config/database.config.js +++ b/config/database.config.js @@ -5,5 +5,6 @@ import { open } from "sqlite"; const sqlite = process.env.NODE_ENV == "development" ? sqlite3.verbose() : sqlite3; const db = await open({ filename: "./data.db", driver: sqlite.Database }); +await db.run(`PRAGMA foreign_keys = ON`); export default db; diff --git a/controllers/modbus.controller.js b/controllers/modbus.controller.js index 7d69ae0..7eaffe2 100644 --- a/controllers/modbus.controller.js +++ b/controllers/modbus.controller.js @@ -116,7 +116,19 @@ export const modbusController = { * @param {import('express').Response} res * @param {import('express').NextFunction} next */ - async createDisplayValue(req, res, next) {}, + async createDisplayValue(req, res, next) { + try { + const { name, slave_id, reg_addr, reg_format, reg_type } = req.body + await db.run(`INSERT INTO "display_values" + ("name", "slave_id", "reg_addr", "reg_format", "reg_type") + VALUES (?, ?, ?, ?, ?) + `, [name, slave_id, reg_addr, reg_format, reg_type] + ); + return res.status(200).json({ message: 'Created.' }); + } catch (error) { + next(error); + } + }, /** * Remove display value from modbus slave device @@ -133,14 +145,6 @@ export const modbusController = { } }, - /** - * Get latest data log from modbus slave device - * @param {import('express').Request} req - * @param {import('express').Response} res - * @param {import('express').NextFunction} next - */ - async getLatestLog(req, res, next) {}, - /** * Creates event stream aboud modbus connection status * @param {import('express').Request} req diff --git a/data.db b/data.db index e469ca15a1829573566e6c0a9a1101d6919a02b6..bdf8a2fe655a33081caed91669888f2e3b5aa398 100644 GIT binary patch delta 177 zcmZozz}T>Wae_4Cw}~>&jNdjUERk2?<2%Q||CawY|4IIB{EPV~@YnEX@Q3mn@r&|( z=X=C=j&BFw%FT)jEqvZ0!b}{3q9MT{4EH=47#PIF85spdOHzwVjF}}}{GI&$eT4Yf z8AO4i!XQy*e$OCJLo;Dsh!|KUvz&`3Na5!1dXj=n{5hKi4PyDlBt;nnMR~Wae_4Cp@}lijE6QRERmPt;rq_O|CawY|4IIB{EPV~@YnEX@Q3mn@r&|( X-z;cwop1AZJxM_ztCW9otA8~B9I_Wa diff --git a/public/css/dist.css b/public/css/dist.css index cd4f58e..62fb05d 100644 --- a/public/css/dist.css +++ b/public/css/dist.css @@ -610,6 +610,10 @@ video { visibility: collapse; } +.fixed { + position: fixed; +} + .absolute { position: absolute; } @@ -995,6 +999,14 @@ video { padding-top: 1.25rem; } +.pl-\[250px\] { + padding-left: 250px; +} + +.pl-\[260px\] { + padding-left: 260px; +} + .text-left { text-align: left; } diff --git a/public/index.html b/public/index.html index c5bc604..f0da556 100644 --- a/public/index.html +++ b/public/index.html @@ -21,7 +21,7 @@ - -
+
+ + + diff --git a/public/js/app.js b/public/js/app.js index fa48c6e..4e02844 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -107,6 +107,49 @@ document.addEventListener("alpine:init", async () => { }, })); + Alpine.data('displayValueModal', () => ({ + isOpen: false, + isLoading: false, + error: null, + data: { + name: '', + reg_addr: 0, + reg_type: 'IR', + reg_format: 'UI16' + }, + resetDataFields() { + this.data.name = ''; + this.data.reg_addr = 0; + this.data.reg_type = 'IR'; + this.data.reg_format = 'UI16'; + }, + async create(selectedDevice) { + try { + this.isLoading = true; + const data = { + ...this.data, + slave_id: selectedDevice.id + } + await api.post('/modbus/create_display-value', data); + selectedDevice?.display_values?.push(this.data); + this.resetDataFields(); + this.close(); + } catch (error) { + this.error = error; + console.error(error); + } finally { + this.isLoading = false; + } + }, + open() { + this.isOpen = true; + }, + close() { + this.isOpen = false; + this.resetDataFields(); + }, + })) + Alpine.data("monitoringPage", () => ({ selectedDevice: null, devices: [], diff --git a/routes/api/modbus.router.js b/routes/api/modbus.router.js index aafb682..9ebb288 100644 --- a/routes/api/modbus.router.js +++ b/routes/api/modbus.router.js @@ -1,6 +1,6 @@ import express from "express"; import { modbusController } from "#root/controllers/index.js" -import { modbusDeviceSchema, removeDisplayValueSchema, removeModbusDeviceSchema } from "#root/validators/index.js"; +import { createDisplayValueSchema, displayValueSchema, modbusDeviceSchema, removeDisplayValueSchema, removeModbusDeviceSchema } from "#root/validators/index.js"; import { validateBodyMiddleware } from "#root/middlewares/index.js"; const modbusRouter = express.Router(); @@ -9,6 +9,7 @@ modbusRouter.get("/devices", modbusController.list); modbusRouter.post("/create_device", validateBodyMiddleware(modbusDeviceSchema), modbusController.createDevice) modbusRouter.post('/remove_device', validateBodyMiddleware(removeModbusDeviceSchema), modbusController.removeDevice); modbusRouter.post('/update_device', validateBodyMiddleware(modbusDeviceSchema), modbusController.updateDevice); +modbusRouter.post('/create_display-value', validateBodyMiddleware(createDisplayValueSchema), modbusController.createDisplayValue); modbusRouter.post('/remove_display-value', validateBodyMiddleware(removeDisplayValueSchema), modbusController.removeDisplayValue); modbusRouter.post("/connect", modbusController.connect); modbusRouter.post("/close", modbusController.close); diff --git a/validators/display-value.schema.js b/validators/display-value.schema.js index e2e13e6..1470801 100644 --- a/validators/display-value.schema.js +++ b/validators/display-value.schema.js @@ -1,4 +1,4 @@ -import { object, number, boolean, string } from 'yup'; +import { object, number, string } from 'yup'; export const displayValueSchema = object({ id: number().required(), @@ -9,4 +9,7 @@ export const displayValueSchema = object({ reg_type: string().oneOf(["HR", "IR", "DI", "DO"]).required() }) -export const removeDisplayValueSchema = displayValueSchema.pick(['id']); \ No newline at end of file +export const removeDisplayValueSchema = displayValueSchema.pick(['id']); + +// TODO: On creating "reg_format" can be BOOL if "reg_type" is "DI" or "DO" +export const createDisplayValueSchema = displayValueSchema.omit(['id']) \ No newline at end of file