diff --git a/coordinator/coordinator.lua b/coordinator/coordinator.lua
index 93f39b1..2a20e06 100644
--- a/coordinator/coordinator.lua
+++ b/coordinator/coordinator.lua
@@ -17,8 +17,8 @@ local println = util.println
local PROTOCOL = comms.PROTOCOL
local DEVICE_TYPE = comms.DEVICE_TYPE
local ESTABLISH_ACK = comms.ESTABLISH_ACK
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
-local SCADA_CRDN_TYPE = comms.SCADA_CRDN_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
+local CRDN_TYPE = comms.CRDN_TYPE
local UNIT_COMMAND = comms.UNIT_COMMAND
local FAC_COMMAND = comms.FAC_COMMAND
@@ -279,7 +279,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
apisessions.init(nic)
-- send a packet to the supervisor
- ---@param msg_type SCADA_MGMT_TYPE|SCADA_CRDN_TYPE
+ ---@param msg_type MGMT_TYPE|CRDN_TYPE
---@param msg table
local function _send_sv(protocol, msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -307,7 +307,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
local s_pkt = comms.scada_packet()
local m_pkt = comms.mgmt_packet()
- m_pkt.make(SCADA_MGMT_TYPE.ESTABLISH, { ack })
+ m_pkt.make(MGMT_TYPE.ESTABLISH, { ack })
s_pkt.make(packet.src_addr(), packet.seq_num() + 1, PROTOCOL.SCADA_MGMT, m_pkt.raw_sendable())
nic.transmit(pkt_channel, crd_channel, s_pkt)
@@ -316,13 +316,13 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
-- attempt connection establishment
local function _send_establish()
- _send_sv(PROTOCOL.SCADA_MGMT, SCADA_MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.CRDN })
+ _send_sv(PROTOCOL.SCADA_MGMT, MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.CRDN })
end
-- keep alive ack
---@param srv_time integer
local function _send_keep_alive_ack(srv_time)
- _send_sv(PROTOCOL.SCADA_MGMT, SCADA_MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
+ _send_sv(PROTOCOL.SCADA_MGMT, MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
end
-- PUBLIC FUNCTIONS --
@@ -394,20 +394,20 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
self.sv_linked = false
self.sv_r_seq_num = nil
iocontrol.fp_link_state(types.PANEL_LINK_STATE.DISCONNECTED)
- _send_sv(PROTOCOL.SCADA_MGMT, SCADA_MGMT_TYPE.CLOSE, {})
+ _send_sv(PROTOCOL.SCADA_MGMT, MGMT_TYPE.CLOSE, {})
end
-- send a facility command
---@param cmd FAC_COMMAND command
---@param option any? optional option options for the optional options (like waste mode)
function public.send_fac_command(cmd, option)
- _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.FAC_CMD, { cmd, option })
+ _send_sv(PROTOCOL.SCADA_CRDN, CRDN_TYPE.FAC_CMD, { cmd, option })
end
-- send the auto process control configuration with a start command
---@param config coord_auto_config configuration
function public.send_auto_start(config)
- _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.FAC_CMD, {
+ _send_sv(PROTOCOL.SCADA_CRDN, CRDN_TYPE.FAC_CMD, {
FAC_COMMAND.START, config.mode, config.burn_target, config.charge_target, config.gen_target, config.limits
})
end
@@ -417,7 +417,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
---@param unit integer unit ID
---@param option any? optional option options for the optional options (like burn rate)
function public.send_unit_command(cmd, unit, option)
- _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.UNIT_CMD, { cmd, unit, option })
+ _send_sv(PROTOCOL.SCADA_CRDN, CRDN_TYPE.UNIT_CMD, { cmd, unit, option })
end
-- parse a packet
@@ -426,7 +426,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
---@param reply_to integer
---@param message any
---@param distance integer
- ---@return mgmt_frame|crdn_frame|capi_frame|nil packet
+ ---@return mgmt_frame|crdn_frame|nil packet
function public.parse_packet(side, sender, reply_to, message, distance)
local s_pkt = nic.receive(side, sender, reply_to, message, distance)
local pkt = nil
@@ -444,12 +444,6 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
if crdn_pkt.decode(s_pkt) then
pkt = crdn_pkt.get()
end
- -- get as coordinator API packet
- elseif s_pkt.protocol() == PROTOCOL.COORD_API then
- local capi_pkt = comms.capi_packet()
- if capi_pkt.decode(s_pkt) then
- pkt = capi_pkt.get()
- end
else
log.debug("attempted parse of illegal packet type " .. s_pkt.protocol(), true)
end
@@ -459,7 +453,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
end
-- handle a packet
- ---@param packet mgmt_frame|crdn_frame|capi_frame|nil
+ ---@param packet mgmt_frame|crdn_frame|nil
---@return boolean close_ui
function public.handle_packet(packet)
local was_linked = self.sv_linked
@@ -475,18 +469,18 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
elseif r_chan == pkt_channel then
if not self.sv_linked then
log.debug("discarding pocket API packet before linked to supervisor")
- elseif protocol == PROTOCOL.COORD_API then
- ---@cast packet capi_frame
+ elseif protocol == PROTOCOL.SCADA_CRDN then
+ ---@cast packet crdn_frame
-- look for an associated session
local session = apisessions.find_session(src_addr)
- -- API packet
+ -- coordinator packet
if session ~= nil then
-- pass the packet onto the session handler
session.in_queue.push_packet(packet)
else
-- any other packet should be session related, discard it
- log.debug("discarding COORD_API packet without a known session")
+ log.debug("discarding SCADA_CRDN packet without a known session")
end
elseif protocol == PROTOCOL.SCADA_MGMT then
---@cast packet mgmt_frame
@@ -497,7 +491,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
if session ~= nil then
-- pass the packet onto the session handler
session.in_queue.push_packet(packet)
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- establish a new session
-- validate packet and continue
if packet.length == 3 and type(packet.data[1]) == "string" and type(packet.data[2]) == "string" then
@@ -553,7 +547,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
if protocol == PROTOCOL.SCADA_CRDN then
---@cast packet crdn_frame
if self.sv_linked then
- if packet.type == SCADA_CRDN_TYPE.INITIAL_BUILDS then
+ if packet.type == CRDN_TYPE.INITIAL_BUILDS then
if packet.length == 2 then
-- record builds
local fac_builds = iocontrol.record_facility_builds(packet.data[1])
@@ -561,31 +555,31 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
if fac_builds and unit_builds then
-- acknowledge receipt of builds
- _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.INITIAL_BUILDS, {})
+ _send_sv(PROTOCOL.SCADA_CRDN, CRDN_TYPE.INITIAL_BUILDS, {})
else
log.debug("received invalid INITIAL_BUILDS packet")
end
else
log.debug("INITIAL_BUILDS packet length mismatch")
end
- elseif packet.type == SCADA_CRDN_TYPE.FAC_BUILDS then
+ elseif packet.type == CRDN_TYPE.FAC_BUILDS then
if packet.length == 1 then
-- record facility builds
if iocontrol.record_facility_builds(packet.data[1]) then
-- acknowledge receipt of builds
- _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.FAC_BUILDS, {})
+ _send_sv(PROTOCOL.SCADA_CRDN, CRDN_TYPE.FAC_BUILDS, {})
else
log.debug("received invalid FAC_BUILDS packet")
end
else
log.debug("FAC_BUILDS packet length mismatch")
end
- elseif packet.type == SCADA_CRDN_TYPE.FAC_STATUS then
+ elseif packet.type == CRDN_TYPE.FAC_STATUS then
-- update facility status
if not iocontrol.update_facility_status(packet.data) then
log.debug("received invalid FAC_STATUS packet")
end
- elseif packet.type == SCADA_CRDN_TYPE.FAC_CMD then
+ elseif packet.type == CRDN_TYPE.FAC_CMD then
-- facility command acknowledgement
if packet.length >= 2 then
local cmd = packet.data[1]
@@ -613,24 +607,24 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
else
log.debug("SCADA_CRDN facility command ack packet length mismatch")
end
- elseif packet.type == SCADA_CRDN_TYPE.UNIT_BUILDS then
+ elseif packet.type == CRDN_TYPE.UNIT_BUILDS then
-- record builds
if packet.length == 1 then
if iocontrol.record_unit_builds(packet.data[1]) then
-- acknowledge receipt of builds
- _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.UNIT_BUILDS, {})
+ _send_sv(PROTOCOL.SCADA_CRDN, CRDN_TYPE.UNIT_BUILDS, {})
else
log.debug("received invalid UNIT_BUILDS packet")
end
else
log.debug("UNIT_BUILDS packet length mismatch")
end
- elseif packet.type == SCADA_CRDN_TYPE.UNIT_STATUSES then
+ elseif packet.type == CRDN_TYPE.UNIT_STATUSES then
-- update statuses
if not iocontrol.update_unit_statuses(packet.data) then
log.debug("received invalid UNIT_STATUSES packet")
end
- elseif packet.type == SCADA_CRDN_TYPE.UNIT_CMD then
+ elseif packet.type == CRDN_TYPE.UNIT_CMD then
-- unit command acknowledgement
if packet.length == 3 then
local cmd = packet.data[1]
@@ -672,7 +666,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
elseif protocol == PROTOCOL.SCADA_MGMT then
---@cast packet mgmt_frame
if self.sv_linked then
- if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if packet.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive request received, echo back
if packet.length == 1 then
local timestamp = packet.data[1]
@@ -690,7 +684,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
else
log.debug("SCADA keep alive packet length mismatch")
end
- elseif packet.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif packet.type == MGMT_TYPE.CLOSE then
-- handle session close
sv_watchdog.cancel()
self.sv_addr = comms.BROADCAST
@@ -701,7 +695,7 @@ function coordinator.comms(version, nic, num_units, crd_channel, svr_channel, pk
else
log.debug("received unknown SCADA_MGMT packet type " .. packet.type)
end
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- connection with supervisor established
if packet.length == 2 then
local est_ack = packet.data[1]
diff --git a/coordinator/session/pocket.lua b/coordinator/session/pocket.lua
index f5211a7..a19f7c3 100644
--- a/coordinator/session/pocket.lua
+++ b/coordinator/session/pocket.lua
@@ -8,8 +8,8 @@ local iocontrol = require("coordinator.iocontrol")
local pocket = {}
local PROTOCOL = comms.PROTOCOL
--- local CAPI_TYPE = comms.CAPI_TYPE
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+-- local CRDN_TYPE = comms.CRDN_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
-- retry time constants in ms
-- local INITIAL_WAIT = 1500
@@ -72,22 +72,22 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout)
iocontrol.fp_pkt_disconnected(id)
end
- -- send a CAPI packet
- -----@param msg_type CAPI_TYPE
+ -- send a CRDN packet
+ -----@param msg_type CRDN_TYPE
-----@param msg table
-- local function _send(msg_type, msg)
-- local s_pkt = comms.scada_packet()
- -- local c_pkt = comms.capi_packet()
+ -- local c_pkt = comms.crdn_packet()
-- c_pkt.make(msg_type, msg)
- -- s_pkt.make(self.seq_num, PROTOCOL.COORD_API, c_pkt.raw_sendable())
+ -- s_pkt.make(self.seq_num, PROTOCOL.SCADA_CRDN, c_pkt.raw_sendable())
-- out_queue.push_packet(s_pkt)
-- self.seq_num = self.seq_num + 1
-- end
-- send a SCADA management packet
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_mgmt(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -101,7 +101,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout)
end
-- handle a packet
- ---@param pkt mgmt_frame|capi_frame
+ ---@param pkt mgmt_frame|crdn_frame
local function _handle_packet(pkt)
-- check sequence number
if self.r_seq_num == nil then
@@ -117,17 +117,17 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout)
self.conn_watchdog.feed()
-- process packet
- if pkt.scada_frame.protocol() == PROTOCOL.COORD_API then
- ---@cast pkt capi_frame
+ if pkt.scada_frame.protocol() == PROTOCOL.SCADA_CRDN then
+ ---@cast pkt crdn_frame
-- handle packet by type
if pkt.type == nil then
else
- log.debug(log_header .. "handler received unsupported CAPI packet type " .. pkt.type)
+ log.debug(log_header .. "handler received unsupported CRDN packet type " .. pkt.type)
end
elseif pkt.scada_frame.protocol() == PROTOCOL.SCADA_MGMT then
---@cast pkt mgmt_frame
- if pkt.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if pkt.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive reply
if pkt.length == 2 then
local srv_start = pkt.data[1]
@@ -146,7 +146,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout)
else
log.debug(log_header .. "SCADA keep alive packet length mismatch")
end
- elseif pkt.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif pkt.type == MGMT_TYPE.CLOSE then
-- close the session
_close()
else
@@ -174,7 +174,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout)
-- close the connection
function public.close()
_close()
- _send_mgmt(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_mgmt(MGMT_TYPE.CLOSE, {})
log.info(log_header .. "session closed by server")
end
@@ -229,7 +229,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout)
periodics.keep_alive = periodics.keep_alive + elapsed
if periodics.keep_alive >= PERIODICS.KEEP_ALIVE then
- _send_mgmt(SCADA_MGMT_TYPE.KEEP_ALIVE, { util.time() })
+ _send_mgmt(MGMT_TYPE.KEEP_ALIVE, { util.time() })
periodics.keep_alive = 0
end
diff --git a/coordinator/startup.lua b/coordinator/startup.lua
index b4f08ce..6363727 100644
--- a/coordinator/startup.lua
+++ b/coordinator/startup.lua
@@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder")
local apisessions = require("coordinator.session.apisessions")
-local COORDINATOR_VERSION = "v1.0.9"
+local COORDINATOR_VERSION = "v1.0.10"
local println = util.println
local println_ts = util.println_ts
diff --git a/pocket/pocket.lua b/pocket/pocket.lua
index 65b286a..b2da51d 100644
--- a/pocket/pocket.lua
+++ b/pocket/pocket.lua
@@ -7,7 +7,7 @@ local iocontrol = require("pocket.iocontrol")
local PROTOCOL = comms.PROTOCOL
local DEVICE_TYPE = comms.DEVICE_TYPE
local ESTABLISH_ACK = comms.ESTABLISH_ACK
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
local LINK_STATE = iocontrol.LINK_STATE
@@ -51,7 +51,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
nic.open(pkt_channel)
-- send a management packet to the supervisor
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_sv(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -65,7 +65,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
end
-- send a management packet to the coordinator
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_crd(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -80,24 +80,24 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
-- attempt supervisor connection establishment
local function _send_sv_establish()
- _send_sv(SCADA_MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.PKT })
+ _send_sv(MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.PKT })
end
-- attempt coordinator API connection establishment
local function _send_api_establish()
- _send_crd(SCADA_MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.PKT })
+ _send_crd(MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.PKT })
end
-- keep alive ack to supervisor
---@param srv_time integer
local function _send_sv_keep_alive_ack(srv_time)
- _send_sv(SCADA_MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
+ _send_sv(MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
end
-- keep alive ack to coordinator
---@param srv_time integer
local function _send_api_keep_alive_ack(srv_time)
- _send_crd(SCADA_MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
+ _send_crd(MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
end
-- PUBLIC FUNCTIONS --
@@ -111,7 +111,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
self.sv.linked = false
self.sv.r_seq_num = nil
self.sv.addr = comms.BROADCAST
- _send_sv(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_sv(MGMT_TYPE.CLOSE, {})
end
-- close connection to coordinator API server
@@ -120,7 +120,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
self.api.linked = false
self.api.r_seq_num = nil
self.api.addr = comms.BROADCAST
- _send_crd(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_crd(MGMT_TYPE.CLOSE, {})
end
-- close the connections to the servers
@@ -157,21 +157,21 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
-- supervisor get active alarm tones
function public.diag__get_alarm_tones()
- if self.sv.linked then _send_sv(SCADA_MGMT_TYPE.DIAG_TONE_GET, {}) end
+ if self.sv.linked then _send_sv(MGMT_TYPE.DIAG_TONE_GET, {}) end
end
-- supervisor test alarm tones by tone
---@param id TONE|0 tone ID, or 0 to stop all
---@param state boolean tone state
function public.diag__set_alarm_tone(id, state)
- if self.sv.linked then _send_sv(SCADA_MGMT_TYPE.DIAG_TONE_SET, { id, state }) end
+ if self.sv.linked then _send_sv(MGMT_TYPE.DIAG_TONE_SET, { id, state }) end
end
-- supervisor test alarm tones by alarm
---@param id ALARM|0 alarm ID, 0 to stop all
---@param state boolean alarm state
function public.diag__set_alarm(id, state)
- if self.sv.linked then _send_sv(SCADA_MGMT_TYPE.DIAG_ALARM_SET, { id, state }) end
+ if self.sv.linked then _send_sv(MGMT_TYPE.DIAG_ALARM_SET, { id, state }) end
end
-- parse a packet
@@ -180,7 +180,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
---@param reply_to integer
---@param message any
---@param distance integer
- ---@return mgmt_frame|capi_frame|nil packet
+ ---@return mgmt_frame|crdn_frame|nil packet
function public.parse_packet(side, sender, reply_to, message, distance)
local s_pkt = nic.receive(side, sender, reply_to, message, distance)
local pkt = nil
@@ -192,11 +192,11 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
if mgmt_pkt.decode(s_pkt) then
pkt = mgmt_pkt.get()
end
- -- get as coordinator API packet
- elseif s_pkt.protocol() == PROTOCOL.COORD_API then
- local capi_pkt = comms.capi_packet()
- if capi_pkt.decode(s_pkt) then
- pkt = capi_pkt.get()
+ -- get as coordinator packet
+ elseif s_pkt.protocol() == PROTOCOL.SCADA_CRDN then
+ local crdn_pkt = comms.crdn_packet()
+ if crdn_pkt.decode(s_pkt) then
+ pkt = crdn_pkt.get()
end
else
log.debug("attempted parse of illegal packet type " .. s_pkt.protocol(), true)
@@ -207,7 +207,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
end
-- handle a packet
- ---@param packet mgmt_frame|capi_frame|nil
+ ---@param packet mgmt_frame|crdn_frame|nil
function public.handle_packet(packet)
local diag = iocontrol.get_db().diag
@@ -240,7 +240,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
if protocol == PROTOCOL.SCADA_MGMT then
---@cast packet mgmt_frame
if self.api.linked then
- if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if packet.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive request received, echo back
if packet.length == 1 then
local timestamp = packet.data[1]
@@ -256,7 +256,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
else
log.debug("coordinator SCADA keep alive packet length mismatch")
end
- elseif packet.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif packet.type == MGMT_TYPE.CLOSE then
-- handle session close
api_watchdog.cancel()
self.api.linked = false
@@ -266,7 +266,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
else
log.debug("received unknown SCADA_MGMT packet type " .. packet.type .. " from coordinator")
end
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- connection with coordinator established
if packet.length == 1 then
local est_ack = packet.data[1]
@@ -330,7 +330,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
if protocol == PROTOCOL.SCADA_MGMT then
---@cast packet mgmt_frame
if self.sv.linked then
- if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if packet.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive request received, echo back
if packet.length == 1 then
local timestamp = packet.data[1]
@@ -346,14 +346,14 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
else
log.debug("supervisor SCADA keep alive packet length mismatch")
end
- elseif packet.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif packet.type == MGMT_TYPE.CLOSE then
-- handle session close
sv_watchdog.cancel()
self.sv.linked = false
self.sv.r_seq_num = nil
self.sv.addr = comms.BROADCAST
log.info("supervisor server connection closed by remote host")
- elseif packet.type == SCADA_MGMT_TYPE.DIAG_TONE_GET then
+ elseif packet.type == MGMT_TYPE.DIAG_TONE_GET then
if packet.length == 8 then
for i = 1, #packet.data do
diag.tone_test.tone_indicators[i].update(packet.data[i] == true)
@@ -361,7 +361,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
else
log.debug("supervisor SCADA diag alarm states packet length mismatch")
end
- elseif packet.type == SCADA_MGMT_TYPE.DIAG_TONE_SET then
+ elseif packet.type == MGMT_TYPE.DIAG_TONE_SET then
if packet.length == 1 and packet.data[1] == false then
diag.tone_test.ready_warn.set_value("testing denied")
log.debug("supervisor SCADA diag tone set failed")
@@ -380,7 +380,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
else
log.debug("supervisor SCADA diag tone set packet length/type mismatch")
end
- elseif packet.type == SCADA_MGMT_TYPE.DIAG_ALARM_SET then
+ elseif packet.type == MGMT_TYPE.DIAG_ALARM_SET then
if packet.length == 1 and packet.data[1] == false then
diag.tone_test.ready_warn.set_value("testing denied")
log.debug("supervisor SCADA diag alarm set failed")
@@ -401,7 +401,7 @@ function pocket.comms(version, nic, pkt_channel, svr_channel, crd_channel, range
else
log.debug("received unknown SCADA_MGMT packet type " .. packet.type .. " from supervisor")
end
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- connection with supervisor established
if packet.length == 1 then
local est_ack = packet.data[1]
diff --git a/pocket/startup.lua b/pocket/startup.lua
index 14ece9e..cfd792b 100644
--- a/pocket/startup.lua
+++ b/pocket/startup.lua
@@ -18,7 +18,7 @@ local iocontrol = require("pocket.iocontrol")
local pocket = require("pocket.pocket")
local renderer = require("pocket.renderer")
-local POCKET_VERSION = "v0.6.0-alpha"
+local POCKET_VERSION = "v0.6.1-alpha"
local println = util.println
local println_ts = util.println_ts
diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua
index acdc78b..bbb59ff 100644
--- a/reactor-plc/plc.lua
+++ b/reactor-plc/plc.lua
@@ -16,7 +16,7 @@ local PROTOCOL = comms.PROTOCOL
local DEVICE_TYPE = comms.DEVICE_TYPE
local ESTABLISH_ACK = comms.ESTABLISH_ACK
local RPLC_TYPE = comms.RPLC_TYPE
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
local AUTO_ACK = comms.PLC_AUTO_ACK
local RPS_LIMITS = const.RPS_LIMITS
@@ -489,7 +489,7 @@ function plc.comms(id, version, nic, plc_channel, svr_channel, range, reactor, r
end
-- send a SCADA management packet
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_mgmt(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -600,7 +600,7 @@ function plc.comms(id, version, nic, plc_channel, svr_channel, range, reactor, r
-- keep alive ack
---@param srv_time integer
local function _send_keep_alive_ack(srv_time)
- _send_mgmt(SCADA_MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
+ _send_mgmt(MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
end
-- general ack
@@ -668,12 +668,12 @@ function plc.comms(id, version, nic, plc_channel, svr_channel, range, reactor, r
function public.close()
conn_watchdog.cancel()
public.unlink()
- _send_mgmt(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_mgmt(MGMT_TYPE.CLOSE, {})
end
-- attempt to establish link with supervisor
function public.send_link_req()
- _send_mgmt(SCADA_MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.PLC, id })
+ _send_mgmt(MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.PLC, id })
end
-- send live status information
@@ -929,7 +929,7 @@ function plc.comms(id, version, nic, plc_channel, svr_channel, range, reactor, r
---@cast packet mgmt_frame
-- if linked, only accept packets from configured supervisor
if self.linked then
- if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if packet.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive request received, echo back
if packet.length == 1 and type(packet.data[1]) == "number" then
local timestamp = packet.data[1]
@@ -945,7 +945,7 @@ function plc.comms(id, version, nic, plc_channel, svr_channel, range, reactor, r
else
log.debug("SCADA_MGMT keep alive packet length/type mismatch")
end
- elseif packet.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif packet.type == MGMT_TYPE.CLOSE then
-- handle session close
conn_watchdog.cancel()
public.unlink()
@@ -954,7 +954,7 @@ function plc.comms(id, version, nic, plc_channel, svr_channel, range, reactor, r
else
log.debug("received unsupported SCADA_MGMT packet type " .. packet.type)
end
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- link request confirmation
if packet.length == 1 then
local est_ack = packet.data[1]
diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua
index 2c58637..ac20379 100644
--- a/reactor-plc/startup.lua
+++ b/reactor-plc/startup.lua
@@ -19,7 +19,7 @@ local plc = require("reactor-plc.plc")
local renderer = require("reactor-plc.renderer")
local threads = require("reactor-plc.threads")
-local R_PLC_VERSION = "v1.5.7"
+local R_PLC_VERSION = "v1.5.8"
local println = util.println
local println_ts = util.println_ts
diff --git a/rtu/rtu.lua b/rtu/rtu.lua
index 4c92afc..242bd18 100644
--- a/rtu/rtu.lua
+++ b/rtu/rtu.lua
@@ -14,7 +14,7 @@ local rtu = {}
local PROTOCOL = comms.PROTOCOL
local DEVICE_TYPE = comms.DEVICE_TYPE
local ESTABLISH_ACK = comms.ESTABLISH_ACK
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
-- create a new RTU unit
@@ -227,7 +227,7 @@ function rtu.comms(version, nic, rtu_channel, svr_channel, range, conn_watchdog)
nic.open(rtu_channel)
-- send a scada management packet
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -243,7 +243,7 @@ function rtu.comms(version, nic, rtu_channel, svr_channel, range, conn_watchdog)
-- keep alive ack
---@param srv_time integer
local function _send_keep_alive_ack(srv_time)
- _send(SCADA_MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
+ _send(MGMT_TYPE.KEEP_ALIVE, { srv_time, util.time() })
end
-- generate device advertisement table
@@ -298,25 +298,25 @@ function rtu.comms(version, nic, rtu_channel, svr_channel, range, conn_watchdog)
function public.close(rtu_state)
conn_watchdog.cancel()
public.unlink(rtu_state)
- _send(SCADA_MGMT_TYPE.CLOSE, {})
+ _send(MGMT_TYPE.CLOSE, {})
end
-- send establish request (includes advertisement)
---@param units table
function public.send_establish(units)
- _send(SCADA_MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.RTU, _generate_advertisement(units) })
+ _send(MGMT_TYPE.ESTABLISH, { comms.version, version, DEVICE_TYPE.RTU, _generate_advertisement(units) })
end
-- send capability advertisement
---@param units table
function public.send_advertisement(units)
- _send(SCADA_MGMT_TYPE.RTU_ADVERT, _generate_advertisement(units))
+ _send(MGMT_TYPE.RTU_ADVERT, _generate_advertisement(units))
end
-- notify that a peripheral was remounted
---@param unit_index integer RTU unit ID
function public.send_remounted(unit_index)
- _send(SCADA_MGMT_TYPE.RTU_DEV_REMOUNT, { unit_index })
+ _send(MGMT_TYPE.RTU_DEV_REMOUNT, { unit_index })
end
-- parse a MODBUS/SCADA packet
@@ -433,7 +433,7 @@ function rtu.comms(version, nic, rtu_channel, svr_channel, range, conn_watchdog)
---@cast packet mgmt_frame
-- SCADA management packet
if rtu_state.linked then
- if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if packet.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive request received, echo back
if packet.length == 1 and type(packet.data[1]) == "number" then
local timestamp = packet.data[1]
@@ -449,16 +449,16 @@ function rtu.comms(version, nic, rtu_channel, svr_channel, range, conn_watchdog)
else
log.debug("SCADA_MGMT keep alive packet length/type mismatch")
end
- elseif packet.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif packet.type == MGMT_TYPE.CLOSE then
-- close connection
conn_watchdog.cancel()
public.unlink(rtu_state)
println_ts("server connection closed by remote host")
log.warning("server connection closed by remote host")
- elseif packet.type == SCADA_MGMT_TYPE.RTU_ADVERT then
+ elseif packet.type == MGMT_TYPE.RTU_ADVERT then
-- request for capabilities again
public.send_advertisement(units)
- elseif packet.type == SCADA_MGMT_TYPE.RTU_TONE_ALARM then
+ elseif packet.type == MGMT_TYPE.RTU_TONE_ALARM then
-- alarm tone update from supervisor
if (packet.length == 1) and type(packet.data[1] == "table") and (#packet.data[1] == 8) then
local states = packet.data[1]
@@ -474,7 +474,7 @@ function rtu.comms(version, nic, rtu_channel, svr_channel, range, conn_watchdog)
-- not supported
log.debug("received unsupported SCADA_MGMT message type " .. packet.type)
end
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
if packet.length == 1 then
local est_ack = packet.data[1]
diff --git a/rtu/startup.lua b/rtu/startup.lua
index 02679c2..4bc3868 100644
--- a/rtu/startup.lua
+++ b/rtu/startup.lua
@@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu")
local sps_rtu = require("rtu.dev.sps_rtu")
local turbinev_rtu = require("rtu.dev.turbinev_rtu")
-local RTU_VERSION = "v1.6.2"
+local RTU_VERSION = "v1.6.3"
local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE
diff --git a/scada-common/comms.lua b/scada-common/comms.lua
index af049d7..f01a3e5 100644
--- a/scada-common/comms.lua
+++ b/scada-common/comms.lua
@@ -6,23 +6,25 @@ local log = require("scada-common.log")
local insert = table.insert
+---@type integer computer ID
---@diagnostic disable-next-line: undefined-field
-local COMPUTER_ID = os.getComputerID() ---@type integer computer ID
+local COMPUTER_ID = os.getComputerID()
-local max_distance = nil ---@type number|nil maximum acceptable transmission distance
+---@type number|nil maximum acceptable transmission distance
+local max_distance = nil
---@class comms
local comms = {}
-comms.version = "2.2.1"
+-- protocol version (non-protocol changes tracked by util.lua version)
+comms.version = "2.3.0"
---@enum PROTOCOL
local PROTOCOL = {
MODBUS_TCP = 0, -- our "MODBUS TCP"-esque protocol
RPLC = 1, -- reactor PLC protocol
SCADA_MGMT = 2, -- SCADA supervisor management, device advertisements, etc
- SCADA_CRDN = 3, -- data/control packets for coordinators to/from supervisory controllers
- COORD_API = 4 -- data/control packets for pocket computers to/from coordinators
+ SCADA_CRDN = 3 -- data/control packets for coordinators to/from supervisory controllers
}
---@enum RPLC_TYPE
@@ -40,8 +42,8 @@ local RPLC_TYPE = {
AUTO_BURN_RATE = 10 -- set an automatic burn rate, PLC will respond with status, enable toggle speed limited
}
----@enum SCADA_MGMT_TYPE
-local SCADA_MGMT_TYPE = {
+---@enum MGMT_TYPE
+local MGMT_TYPE = {
ESTABLISH = 0, -- establish new connection
KEEP_ALIVE = 1, -- keep alive packet w/ RTT
CLOSE = 2, -- close a connection
@@ -53,8 +55,8 @@ local SCADA_MGMT_TYPE = {
DIAG_ALARM_SET = 8 -- diagnostic: set alarm to simulate audio for
}
----@enum SCADA_CRDN_TYPE
-local SCADA_CRDN_TYPE = {
+---@enum CRDN_TYPE
+local CRDN_TYPE = {
INITIAL_BUILDS = 0, -- initial, complete builds packet to the coordinator
FAC_BUILDS = 1, -- facility RTU builds
FAC_STATUS = 2, -- state of facility and facility devices
@@ -64,10 +66,6 @@ local SCADA_CRDN_TYPE = {
UNIT_CMD = 6 -- command a reactor unit
}
----@enum CAPI_TYPE
-local CAPI_TYPE = {
-}
-
---@enum ESTABLISH_ACK
local ESTABLISH_ACK = {
ALLOW = 0, -- link approved
@@ -119,9 +117,8 @@ local UNIT_COMMAND = {
comms.PROTOCOL = PROTOCOL
comms.RPLC_TYPE = RPLC_TYPE
-comms.SCADA_MGMT_TYPE = SCADA_MGMT_TYPE
-comms.SCADA_CRDN_TYPE = SCADA_CRDN_TYPE
-comms.CAPI_TYPE = CAPI_TYPE
+comms.MGMT_TYPE = MGMT_TYPE
+comms.CRDN_TYPE = CRDN_TYPE
comms.ESTABLISH_ACK = ESTABLISH_ACK
comms.DEVICE_TYPE = DEVICE_TYPE
@@ -134,8 +131,8 @@ comms.FAC_COMMAND = FAC_COMMAND
-- destination broadcast address (to all devices)
comms.BROADCAST = -1
----@alias packet scada_packet|modbus_packet|rplc_packet|mgmt_packet|crdn_packet|capi_packet
----@alias frame modbus_frame|rplc_frame|mgmt_frame|crdn_frame|capi_frame
+---@alias packet scada_packet|modbus_packet|rplc_packet|mgmt_packet|crdn_packet
+---@alias frame modbus_frame|rplc_frame|mgmt_frame|crdn_frame
-- configure the maximum allowable message receive distance
-- packets received with distances greater than this will be silently discarded
@@ -144,7 +141,7 @@ function comms.set_trusted_range(distance)
if distance == 0 then max_distance = nil else max_distance = distance end
end
--- generic SCADA packet object
+-- generic SCADA packet
---@nodiscard
function comms.scada_packet()
local self = {
@@ -199,9 +196,9 @@ function comms.scada_packet()
self.valid = false
self.raw = self.modem_msg_in.msg
- if (type(max_distance) == "number") and (distance > max_distance) then
+ if (type(max_distance) == "number") and (type(distance) == "number") and (distance > max_distance) then
-- outside of maximum allowable transmission distance
- -- log.debug("comms.scada_packet.receive(): discarding packet with distance " .. distance .. " outside of trusted range")
+ -- log.debug("comms.scada_packet.receive(): discarding packet with distance " .. distance .. " (outside trusted range)")
else
if type(self.raw) == "table" then
if #self.raw == 5 then
@@ -227,12 +224,8 @@ function comms.scada_packet()
-- check if this packet is destined for this device
local is_destination = (self.dest_addr == comms.BROADCAST) or (self.dest_addr == COMPUTER_ID)
- self.valid = is_destination and
- type(self.src_addr) == "number" and
- type(self.dest_addr) == "number" and
- type(self.seq_num) == "number" and
- type(self.protocol) == "number" and
- type(self.payload) == "table"
+ self.valid = is_destination and type(self.src_addr) == "number" and type(self.dest_addr) == "number" and
+ type(self.seq_num) == "number" and type(self.protocol) == "number" and type(self.payload) == "table"
end
end
@@ -275,7 +268,7 @@ function comms.scada_packet()
return public
end
--- authenticated SCADA packet object
+-- authenticated SCADA packet
---@nodiscard
function comms.authd_packet()
local self = {
@@ -325,7 +318,7 @@ function comms.authd_packet()
if (type(max_distance) == "number") and (type(distance) == "number") and (distance > max_distance) then
-- outside of maximum allowable transmission distance
- -- log.debug("comms.authd_packet.receive(): discarding packet with distance " .. distance .. " outside of trusted range")
+ -- log.debug("comms.authd_packet.receive(): discarding packet with distance " .. distance .. " (outside trusted range)")
else
if type(self.raw) == "table" then
if #self.raw == 4 then
@@ -343,11 +336,8 @@ function comms.authd_packet()
-- check if this packet is destined for this device
local is_destination = (self.dest_addr == comms.BROADCAST) or (self.dest_addr == COMPUTER_ID)
- self.valid = is_destination and
- type(self.src_addr) == "number" and
- type(self.dest_addr) == "number" and
- type(self.mac) == "string" and
- type(self.payload) == "string"
+ self.valid = is_destination and type(self.src_addr) == "number" and type(self.dest_addr) == "number" and
+ type(self.mac) == "string" and type(self.payload) == "string"
end
end
@@ -381,8 +371,7 @@ function comms.authd_packet()
return public
end
--- MODBUS packet
--- modeled after MODBUS TCP packet
+-- MODBUS packet, modeled after MODBUS TCP
---@nodiscard
function comms.modbus_packet()
local self = {
@@ -436,9 +425,7 @@ function comms.modbus_packet()
public.make(data[1], data[2], data[3], { table.unpack(data, 4, #data) })
end
- local valid = type(self.txn_id) == "number" and
- type(self.unit_id) == "number" and
- type(self.func_code) == "number"
+ local valid = type(self.txn_id) == "number" and type(self.unit_id) == "number" and type(self.func_code) == "number"
return size_ok and valid
else
@@ -489,21 +476,6 @@ function comms.rplc_packet()
---@class rplc_packet
local public = {}
- -- check that type is known
- local function _rplc_type_valid()
- return self.type == RPLC_TYPE.STATUS or
- self.type == RPLC_TYPE.MEK_STRUCT or
- self.type == RPLC_TYPE.MEK_BURN_RATE or
- self.type == RPLC_TYPE.RPS_ENABLE or
- self.type == RPLC_TYPE.RPS_SCRAM or
- self.type == RPLC_TYPE.RPS_ASCRAM or
- self.type == RPLC_TYPE.RPS_STATUS or
- self.type == RPLC_TYPE.RPS_ALARM or
- self.type == RPLC_TYPE.RPS_RESET or
- self.type == RPLC_TYPE.RPS_AUTO_RESET or
- self.type == RPLC_TYPE.AUTO_BURN_RATE
- end
-
-- make an RPLC packet
---@param id integer
---@param packet_type RPLC_TYPE
@@ -539,7 +511,6 @@ function comms.rplc_packet()
if ok then
local data = frame.data()
public.make(data[1], data[2], { table.unpack(data, 3, #data) })
- ok = _rplc_type_valid()
end
ok = ok and type(self.id) == "number"
@@ -583,7 +554,7 @@ function comms.mgmt_packet()
local self = {
frame = nil,
raw = {},
- type = 0, ---@type SCADA_MGMT_TYPE
+ type = 0, ---@type MGMT_TYPE
length = 0,
data = {}
}
@@ -591,22 +562,8 @@ function comms.mgmt_packet()
---@class mgmt_packet
local public = {}
- -- check that type is known
- local function _scada_type_valid()
- return self.type == SCADA_MGMT_TYPE.ESTABLISH or
- self.type == SCADA_MGMT_TYPE.KEEP_ALIVE or
- self.type == SCADA_MGMT_TYPE.CLOSE or
- self.type == SCADA_MGMT_TYPE.REMOTE_LINKED or
- self.type == SCADA_MGMT_TYPE.RTU_ADVERT or
- self.type == SCADA_MGMT_TYPE.RTU_DEV_REMOUNT or
- self.type == SCADA_MGMT_TYPE.RTU_TONE_ALARM or
- self.type == SCADA_MGMT_TYPE.DIAG_TONE_GET or
- self.type == SCADA_MGMT_TYPE.DIAG_TONE_SET or
- self.type == SCADA_MGMT_TYPE.DIAG_ALARM_SET
- end
-
-- make a SCADA management packet
- ---@param packet_type SCADA_MGMT_TYPE
+ ---@param packet_type MGMT_TYPE
---@param data table
function public.make(packet_type, data)
if type(data) == "table" then
@@ -638,7 +595,6 @@ function comms.mgmt_packet()
if ok then
local data = frame.data()
public.make(data[1], { table.unpack(data, 2, #data) })
- ok = _scada_type_valid()
end
return ok
@@ -679,7 +635,7 @@ function comms.crdn_packet()
local self = {
frame = nil,
raw = {},
- type = 0, ---@type SCADA_CRDN_TYPE
+ type = 0, ---@type CRDN_TYPE
length = 0,
data = {}
}
@@ -687,20 +643,8 @@ function comms.crdn_packet()
---@class crdn_packet
local public = {}
- -- check that type is known
- ---@nodiscard
- local function _crdn_type_valid()
- return self.type == SCADA_CRDN_TYPE.INITIAL_BUILDS or
- self.type == SCADA_CRDN_TYPE.FAC_BUILDS or
- self.type == SCADA_CRDN_TYPE.FAC_STATUS or
- self.type == SCADA_CRDN_TYPE.FAC_CMD or
- self.type == SCADA_CRDN_TYPE.UNIT_BUILDS or
- self.type == SCADA_CRDN_TYPE.UNIT_STATUSES or
- self.type == SCADA_CRDN_TYPE.UNIT_CMD
- end
-
-- make a coordinator packet
- ---@param packet_type SCADA_CRDN_TYPE
+ ---@param packet_type CRDN_TYPE
---@param data table
function public.make(packet_type, data)
if type(data) == "table" then
@@ -732,7 +676,6 @@ function comms.crdn_packet()
if ok then
local data = frame.data()
public.make(data[1], { table.unpack(data, 2, #data) })
- ok = _crdn_type_valid()
end
return ok
@@ -767,92 +710,4 @@ function comms.crdn_packet()
return public
end
--- coordinator API (CAPI) packet
----@todo implement for pocket access, set enum type for self.type
----@nodiscard
-function comms.capi_packet()
- local self = {
- frame = nil,
- raw = {},
- type = 0,
- length = 0,
- data = {}
- }
-
- ---@class capi_packet
- local public = {}
-
- local function _capi_type_valid()
- ---@todo
- return false
- end
-
- -- make a coordinator API packet
- ---@param packet_type CAPI_TYPE
- ---@param data table
- function public.make(packet_type, data)
- if type(data) == "table" then
- -- packet accessor properties
- self.type = packet_type
- self.length = #data
- self.data = data
-
- -- populate raw array
- self.raw = { self.type }
- for i = 1, #data do
- insert(self.raw, data[i])
- end
- else
- log.error("comms.capi_packet.make(): data not table")
- end
- end
-
- -- decode a coordinator API packet from a SCADA frame
- ---@param frame scada_packet
- ---@return boolean success
- function public.decode(frame)
- if frame then
- self.frame = frame
-
- if frame.protocol() == PROTOCOL.COORD_API then
- local ok = frame.length() >= 1
-
- if ok then
- local data = frame.data()
- public.make(data[1], { table.unpack(data, 2, #data) })
- ok = _capi_type_valid()
- end
-
- return ok
- else
- log.debug("attempted COORD_API parse of incorrect protocol " .. frame.protocol(), true)
- return false
- end
- else
- log.debug("nil frame encountered", true)
- return false
- end
- end
-
- -- get raw to send
- ---@nodiscard
- function public.raw_sendable() return self.raw end
-
- -- get this packet as a frame with an immutable relation to this object
- ---@nodiscard
- function public.get()
- ---@class capi_frame
- local frame = {
- scada_frame = self.frame,
- type = self.type,
- length = self.length,
- data = self.data
- }
-
- return frame
- end
-
- return public
-end
-
return comms
diff --git a/scada-common/util.lua b/scada-common/util.lua
index ea53575..597ba69 100644
--- a/scada-common/util.lua
+++ b/scada-common/util.lua
@@ -8,7 +8,7 @@ local cc_strings = require("cc.strings")
local util = {}
-- scada-common version
-util.version = "1.0.2"
+util.version = "1.1.0"
-- ENVIRONMENT CONSTANTS --
diff --git a/supervisor/session/coordinator.lua b/supervisor/session/coordinator.lua
index aa64e17..98edaca 100644
--- a/supervisor/session/coordinator.lua
+++ b/supervisor/session/coordinator.lua
@@ -10,8 +10,8 @@ local svqtypes = require("supervisor.session.svqtypes")
local coordinator = {}
local PROTOCOL = comms.PROTOCOL
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
-local SCADA_CRDN_TYPE = comms.SCADA_CRDN_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
+local CRDN_TYPE = comms.CRDN_TYPE
local UNIT_COMMAND = comms.UNIT_COMMAND
local FAC_COMMAND = comms.FAC_COMMAND
@@ -94,7 +94,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
end
-- send a CRDN packet
- ---@param msg_type SCADA_CRDN_TYPE
+ ---@param msg_type CRDN_TYPE
---@param msg table
local function _send(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -108,7 +108,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
end
-- send a SCADA management packet
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_mgmt(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -130,12 +130,12 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
unit_builds[unit.get_id()] = unit.get_build()
end
- _send(SCADA_CRDN_TYPE.INITIAL_BUILDS, { facility.get_build(), unit_builds })
+ _send(CRDN_TYPE.INITIAL_BUILDS, { facility.get_build(), unit_builds })
end
-- send facility builds
local function _send_fac_builds()
- _send(SCADA_CRDN_TYPE.FAC_BUILDS, { facility.get_build() })
+ _send(CRDN_TYPE.FAC_BUILDS, { facility.get_build() })
end
-- send unit builds
@@ -147,7 +147,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
builds[unit.get_id()] = unit.get_build()
end
- _send(SCADA_CRDN_TYPE.UNIT_BUILDS, { builds })
+ _send(CRDN_TYPE.UNIT_BUILDS, { builds })
end
-- send facility status
@@ -158,7 +158,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
facility.get_alarm_tones()
}
- _send(SCADA_CRDN_TYPE.FAC_STATUS, status)
+ _send(CRDN_TYPE.FAC_STATUS, status)
end
-- send unit statuses
@@ -178,7 +178,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
}
end
- _send(SCADA_CRDN_TYPE.UNIT_STATUSES, status)
+ _send(CRDN_TYPE.UNIT_STATUSES, status)
end
-- handle a packet
@@ -200,7 +200,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
-- process packet
if pkt.scada_frame.protocol() == PROTOCOL.SCADA_MGMT then
---@cast pkt mgmt_frame
- if pkt.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if pkt.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive reply
if pkt.length == 2 then
local srv_start = pkt.data[1]
@@ -219,7 +219,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
else
log.debug(log_header .. "SCADA keep alive packet length mismatch")
end
- elseif pkt.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif pkt.type == MGMT_TYPE.CLOSE then
-- close the session
_close()
else
@@ -227,22 +227,22 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
end
elseif pkt.scada_frame.protocol() == PROTOCOL.SCADA_CRDN then
---@cast pkt crdn_frame
- if pkt.type == SCADA_CRDN_TYPE.INITIAL_BUILDS then
+ if pkt.type == CRDN_TYPE.INITIAL_BUILDS then
-- acknowledgement to coordinator receiving builds
self.acks.builds = true
- elseif pkt.type == SCADA_CRDN_TYPE.FAC_BUILDS then
+ elseif pkt.type == CRDN_TYPE.FAC_BUILDS then
-- acknowledgement to coordinator receiving builds
self.acks.fac_builds = true
- elseif pkt.type == SCADA_CRDN_TYPE.FAC_CMD then
+ elseif pkt.type == CRDN_TYPE.FAC_CMD then
if pkt.length >= 1 then
local cmd = pkt.data[1]
if cmd == FAC_COMMAND.SCRAM_ALL then
facility.scram_all()
- _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, true })
+ _send(CRDN_TYPE.FAC_CMD, { cmd, true })
elseif cmd == FAC_COMMAND.STOP then
facility.auto_stop()
- _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, true })
+ _send(CRDN_TYPE.FAC_CMD, { cmd, true })
elseif cmd == FAC_COMMAND.START then
if pkt.length == 6 then
---@type coord_auto_config
@@ -254,22 +254,22 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
limits = pkt.data[6]
}
- _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, table.unpack(facility.auto_start(config)) })
+ _send(CRDN_TYPE.FAC_CMD, { cmd, table.unpack(facility.auto_start(config)) })
else
log.debug(log_header .. "CRDN auto start (with configuration) packet length mismatch")
end
elseif cmd == FAC_COMMAND.ACK_ALL_ALARMS then
facility.ack_all()
- _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, true })
+ _send(CRDN_TYPE.FAC_CMD, { cmd, true })
elseif cmd == FAC_COMMAND.SET_WASTE_MODE then
if pkt.length == 2 then
- _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, facility.set_waste_product(pkt.data[2]) })
+ _send(CRDN_TYPE.FAC_CMD, { cmd, facility.set_waste_product(pkt.data[2]) })
else
log.debug(log_header .. "CRDN set waste mode packet length mismatch")
end
elseif cmd == FAC_COMMAND.SET_PU_FB then
if pkt.length == 2 then
- _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, facility.set_pu_fallback(pkt.data[2]) })
+ _send(CRDN_TYPE.FAC_CMD, { cmd, facility.set_pu_fallback(pkt.data[2]) })
else
log.debug(log_header .. "CRDN set pu fallback packet length mismatch")
end
@@ -279,10 +279,10 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
else
log.debug(log_header .. "CRDN facility command packet length mismatch")
end
- elseif pkt.type == SCADA_CRDN_TYPE.UNIT_BUILDS then
+ elseif pkt.type == CRDN_TYPE.UNIT_BUILDS then
-- acknowledgement to coordinator receiving builds
self.acks.unit_builds = true
- elseif pkt.type == SCADA_CRDN_TYPE.UNIT_CMD then
+ elseif pkt.type == CRDN_TYPE.UNIT_CMD then
if pkt.length >= 2 then
-- get command and unit id
local cmd = pkt.data[1]
@@ -315,7 +315,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
end
elseif cmd == UNIT_COMMAND.ACK_ALL_ALARMS then
unit.ack_all()
- _send(SCADA_CRDN_TYPE.UNIT_CMD, { cmd, uid, true })
+ _send(CRDN_TYPE.UNIT_CMD, { cmd, uid, true })
elseif cmd == UNIT_COMMAND.ACK_ALARM then
if pkt.length == 3 then
unit.ack_alarm(pkt.data[3])
@@ -331,7 +331,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
elseif cmd == UNIT_COMMAND.SET_GROUP then
if (pkt.length == 3) and (type(pkt.data[3]) == "number") and (pkt.data[3] >= 0) and (pkt.data[3] <= 4) then
facility.set_group(unit.get_id(), pkt.data[3])
- _send(SCADA_CRDN_TYPE.UNIT_CMD, { cmd, uid, pkt.data[3] })
+ _send(CRDN_TYPE.UNIT_CMD, { cmd, uid, pkt.data[3] })
else
log.debug(log_header .. "CRDN unit command set group missing group id")
end
@@ -374,7 +374,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
-- close the connection
function public.close()
_close()
- _send_mgmt(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_mgmt(MGMT_TYPE.CLOSE, {})
println("connection to coordinator " .. id .. " closed by server")
log.info(log_header .. "session closed by server")
end
@@ -406,7 +406,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
if cmd.key == CRD_S_DATA.CMD_ACK then
local ack = cmd.val ---@type coord_ack
- _send(SCADA_CRDN_TYPE.UNIT_CMD, { ack.cmd, ack.unit, ack.ack })
+ _send(CRDN_TYPE.UNIT_CMD, { ack.cmd, ack.unit, ack.ack })
elseif cmd.key == CRD_S_DATA.RESEND_PLC_BUILD then
-- re-send PLC build
-- retry logic will be kept as-is, so as long as no retry is needed, this will be a small update
@@ -419,7 +419,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
local unit = self.units[unit_id] ---@type reactor_unit
builds[unit_id] = unit.get_build(-1)
- _send(SCADA_CRDN_TYPE.UNIT_BUILDS, { builds })
+ _send(CRDN_TYPE.UNIT_BUILDS, { builds })
elseif cmd.key == CRD_S_DATA.RESEND_RTU_BUILD then
local unit_id = cmd.val.unit
if unit_id > 0 then
@@ -433,14 +433,14 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
local unit = self.units[unit_id] ---@type reactor_unit
builds[unit_id] = unit.get_build(cmd.val.type)
- _send(SCADA_CRDN_TYPE.UNIT_BUILDS, { builds })
+ _send(CRDN_TYPE.UNIT_BUILDS, { builds })
else
-- re-send facility RTU builds
-- retry logic will be kept as-is, so as long as no retry is needed, this will be a small update
self.retry_times.f_builds_packet = util.time() + PARTIAL_RETRY_PERIOD
self.acks.fac_builds = false
- _send(SCADA_CRDN_TYPE.FAC_BUILDS, { facility.get_build(cmd.val.type) })
+ _send(CRDN_TYPE.FAC_BUILDS, { facility.get_build(cmd.val.type) })
end
else
log.error(log_header .. "unsupported data command received in in_queue (this is a bug)", true)
@@ -474,7 +474,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil
periodics.keep_alive = periodics.keep_alive + elapsed
if periodics.keep_alive >= PERIODICS.KEEP_ALIVE then
- _send_mgmt(SCADA_MGMT_TYPE.KEEP_ALIVE, { util.time() })
+ _send_mgmt(MGMT_TYPE.KEEP_ALIVE, { util.time() })
periodics.keep_alive = 0
end
diff --git a/supervisor/session/plc.lua b/supervisor/session/plc.lua
index 8fac94f..654ca99 100644
--- a/supervisor/session/plc.lua
+++ b/supervisor/session/plc.lua
@@ -12,7 +12,7 @@ local plc = {}
local PROTOCOL = comms.PROTOCOL
local RPLC_TYPE = comms.RPLC_TYPE
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
local PLC_AUTO_ACK = comms.PLC_AUTO_ACK
local UNIT_COMMAND = comms.UNIT_COMMAND
@@ -258,7 +258,7 @@ function plc.new_session(id, s_addr, reactor_id, in_queue, out_queue, timeout, f
end
-- send a SCADA management packet
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_mgmt(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -482,7 +482,7 @@ function plc.new_session(id, s_addr, reactor_id, in_queue, out_queue, timeout, f
end
elseif pkt.scada_frame.protocol() == PROTOCOL.SCADA_MGMT then
---@cast pkt mgmt_frame
- if pkt.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if pkt.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive reply
if pkt.length == 2 then
local srv_start = pkt.data[1]
@@ -501,7 +501,7 @@ function plc.new_session(id, s_addr, reactor_id, in_queue, out_queue, timeout, f
else
log.debug(log_header .. "SCADA keep alive packet length mismatch")
end
- elseif pkt.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif pkt.type == MGMT_TYPE.CLOSE then
-- close the session
_close()
else
@@ -595,7 +595,7 @@ function plc.new_session(id, s_addr, reactor_id, in_queue, out_queue, timeout, f
-- close the connection
function public.close()
_close()
- _send_mgmt(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_mgmt(MGMT_TYPE.CLOSE, {})
println("connection to reactor " .. reactor_id .. " PLC closed by server")
log.info(log_header .. "session closed by server")
end
@@ -726,7 +726,7 @@ function plc.new_session(id, s_addr, reactor_id, in_queue, out_queue, timeout, f
periodics.keep_alive = periodics.keep_alive + elapsed
if periodics.keep_alive >= PERIODICS.KEEP_ALIVE then
- _send_mgmt(SCADA_MGMT_TYPE.KEEP_ALIVE, { util.time() })
+ _send_mgmt(MGMT_TYPE.KEEP_ALIVE, { util.time() })
periodics.keep_alive = 0
end
diff --git a/supervisor/session/pocket.lua b/supervisor/session/pocket.lua
index 30ca7eb..48756ea 100644
--- a/supervisor/session/pocket.lua
+++ b/supervisor/session/pocket.lua
@@ -7,7 +7,7 @@ local databus = require("supervisor.databus")
local pocket = {}
local PROTOCOL = comms.PROTOCOL
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
-- retry time constants in ms
-- local INITIAL_WAIT = 1500
@@ -76,7 +76,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
end
-- send a SCADA management packet
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_mgmt(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -108,7 +108,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
-- process packet
if pkt.scada_frame.protocol() == PROTOCOL.SCADA_MGMT then
---@cast pkt mgmt_frame
- if pkt.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if pkt.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive reply
if pkt.length == 2 then
local srv_start = pkt.data[1]
@@ -127,13 +127,13 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
else
log.debug(log_header .. "SCADA keep alive packet length mismatch")
end
- elseif pkt.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif pkt.type == MGMT_TYPE.CLOSE then
-- close the session
_close()
- elseif pkt.type == SCADA_MGMT_TYPE.DIAG_TONE_GET then
+ elseif pkt.type == MGMT_TYPE.DIAG_TONE_GET then
-- get the state of alarm tones
- _send_mgmt(SCADA_MGMT_TYPE.DIAG_TONE_GET, facility.get_alarm_tones())
- elseif pkt.type == SCADA_MGMT_TYPE.DIAG_TONE_SET then
+ _send_mgmt(MGMT_TYPE.DIAG_TONE_GET, facility.get_alarm_tones())
+ elseif pkt.type == MGMT_TYPE.DIAG_TONE_SET then
local valid = false
-- attempt to set a tone state
@@ -144,7 +144,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
-- try to set tone states, then send back if testing is allowed
local allow_testing, test_tone_states = facility.diag_set_test_tone(pkt.data[1], pkt.data[2])
- _send_mgmt(SCADA_MGMT_TYPE.DIAG_TONE_SET, { allow_testing, test_tone_states })
+ _send_mgmt(MGMT_TYPE.DIAG_TONE_SET, { allow_testing, test_tone_states })
else
log.debug(log_header .. "SCADA diag tone set packet data type mismatch")
end
@@ -155,8 +155,8 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
log.debug(log_header .. "DIAG_TONE_SET is blocked without HMAC for security")
end
- if not valid then _send_mgmt(SCADA_MGMT_TYPE.DIAG_TONE_SET, { false }) end
- elseif pkt.type == SCADA_MGMT_TYPE.DIAG_ALARM_SET then
+ if not valid then _send_mgmt(MGMT_TYPE.DIAG_TONE_SET, { false }) end
+ elseif pkt.type == MGMT_TYPE.DIAG_ALARM_SET then
local valid = false
-- attempt to set an alarm state
@@ -167,7 +167,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
-- try to set alarm states, then send back if testing is allowed
local allow_testing, test_alarm_states = facility.diag_set_test_alarm(pkt.data[1], pkt.data[2])
- _send_mgmt(SCADA_MGMT_TYPE.DIAG_ALARM_SET, { allow_testing, test_alarm_states })
+ _send_mgmt(MGMT_TYPE.DIAG_ALARM_SET, { allow_testing, test_alarm_states })
else
log.debug(log_header .. "SCADA diag alarm set packet data type mismatch")
end
@@ -178,7 +178,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
log.debug(log_header .. "DIAG_ALARM_SET is blocked without HMAC for security")
end
- if not valid then _send_mgmt(SCADA_MGMT_TYPE.DIAG_ALARM_SET, { false }) end
+ if not valid then _send_mgmt(MGMT_TYPE.DIAG_ALARM_SET, { false }) end
else
log.debug(log_header .. "handler received unsupported SCADA_MGMT packet type " .. pkt.type)
end
@@ -204,7 +204,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
-- close the connection
function public.close()
_close()
- _send_mgmt(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_mgmt(MGMT_TYPE.CLOSE, {})
println("connection to pocket diag session " .. id .. " closed by server")
log.info(log_header .. "session closed by server")
end
@@ -261,7 +261,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout, facility,
periodics.keep_alive = periodics.keep_alive + elapsed
if periodics.keep_alive >= PERIODICS.KEEP_ALIVE then
- _send_mgmt(SCADA_MGMT_TYPE.KEEP_ALIVE, { util.time() })
+ _send_mgmt(MGMT_TYPE.KEEP_ALIVE, { util.time() })
periodics.keep_alive = 0
end
diff --git a/supervisor/session/rtu.lua b/supervisor/session/rtu.lua
index 1e42f49..41c3373 100644
--- a/supervisor/session/rtu.lua
+++ b/supervisor/session/rtu.lua
@@ -22,7 +22,7 @@ local svrs_turbinev = require("supervisor.session.rtu.turbinev")
local rtu = {}
local PROTOCOL = comms.PROTOCOL
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
local PERIODICS = {
@@ -223,7 +223,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
end
-- send a SCADA management packet
- ---@param msg_type SCADA_MGMT_TYPE
+ ---@param msg_type MGMT_TYPE
---@param msg table
local function _send_mgmt(msg_type, msg)
local s_pkt = comms.scada_packet()
@@ -262,7 +262,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
elseif pkt.scada_frame.protocol() == PROTOCOL.SCADA_MGMT then
---@cast pkt mgmt_frame
-- handle management packet
- if pkt.type == SCADA_MGMT_TYPE.KEEP_ALIVE then
+ if pkt.type == MGMT_TYPE.KEEP_ALIVE then
-- keep alive reply
if pkt.length == 2 then
local srv_start = pkt.data[1]
@@ -281,17 +281,17 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
else
log.debug(log_header .. "SCADA keep alive packet length mismatch")
end
- elseif pkt.type == SCADA_MGMT_TYPE.CLOSE then
+ elseif pkt.type == MGMT_TYPE.CLOSE then
-- close the session
_close()
- elseif pkt.type == SCADA_MGMT_TYPE.RTU_ADVERT then
+ elseif pkt.type == MGMT_TYPE.RTU_ADVERT then
-- RTU unit advertisement
log.debug(log_header .. "received updated advertisement")
self.advert = pkt.data
-- handle advertisement; this will re-create all unit sub-sessions
_handle_advertisement()
- elseif pkt.type == SCADA_MGMT_TYPE.RTU_DEV_REMOUNT then
+ elseif pkt.type == MGMT_TYPE.RTU_DEV_REMOUNT then
if pkt.length == 1 then
local unit_id = pkt.data[1]
if self.units[unit_id] ~= nil then
@@ -322,7 +322,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
-- close the connection
function public.close()
_close()
- _send_mgmt(SCADA_MGMT_TYPE.CLOSE, {})
+ _send_mgmt(MGMT_TYPE.CLOSE, {})
println(log_header .. "connection to RTU closed by server")
log.info(log_header .. "session closed by server")
end
@@ -387,7 +387,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
periodics.keep_alive = periodics.keep_alive + elapsed
if periodics.keep_alive >= PERIODICS.KEEP_ALIVE then
- _send_mgmt(SCADA_MGMT_TYPE.KEEP_ALIVE, { util.time() })
+ _send_mgmt(MGMT_TYPE.KEEP_ALIVE, { util.time() })
periodics.keep_alive = 0
end
@@ -395,7 +395,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
periodics.alarm_tones = periodics.alarm_tones + elapsed
if periodics.alarm_tones >= PERIODICS.ALARM_TONES then
- _send_mgmt(SCADA_MGMT_TYPE.RTU_TONE_ALARM, { facility.get_alarm_tones() })
+ _send_mgmt(MGMT_TYPE.RTU_TONE_ALARM, { facility.get_alarm_tones() })
periodics.alarm_tones = 0
end
diff --git a/supervisor/startup.lua b/supervisor/startup.lua
index dbde074..3f0d966 100644
--- a/supervisor/startup.lua
+++ b/supervisor/startup.lua
@@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor")
local svsessions = require("supervisor.session.svsessions")
-local SUPERVISOR_VERSION = "v1.0.2"
+local SUPERVISOR_VERSION = "v1.0.3"
local println = util.println
local println_ts = util.println_ts
diff --git a/supervisor/supervisor.lua b/supervisor/supervisor.lua
index 37707a3..3c25110 100644
--- a/supervisor/supervisor.lua
+++ b/supervisor/supervisor.lua
@@ -11,7 +11,7 @@ local supervisor = {}
local PROTOCOL = comms.PROTOCOL
local DEVICE_TYPE = comms.DEVICE_TYPE
local ESTABLISH_ACK = comms.ESTABLISH_ACK
-local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE
+local MGMT_TYPE = comms.MGMT_TYPE
-- supervisory controller communications
---@nodiscard
@@ -58,7 +58,7 @@ function supervisor.comms(_version, nic, fp_ok)
local s_pkt = comms.scada_packet()
local m_pkt = comms.mgmt_packet()
- m_pkt.make(SCADA_MGMT_TYPE.ESTABLISH, { ack, data })
+ m_pkt.make(MGMT_TYPE.ESTABLISH, { ack, data })
s_pkt.make(packet.src_addr(), packet.seq_num() + 1, PROTOCOL.SCADA_MGMT, m_pkt.raw_sendable())
nic.transmit(packet.remote_channel(), svr_channel, s_pkt)
@@ -147,7 +147,7 @@ function supervisor.comms(_version, nic, fp_ok)
if session ~= nil then
-- pass the packet onto the session handler
session.in_queue.push_packet(packet)
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- establish a new session
local last_ack = self.last_est_acks[src_addr]
@@ -221,7 +221,7 @@ function supervisor.comms(_version, nic, fp_ok)
if session ~= nil then
-- pass the packet onto the session handler
session.in_queue.push_packet(packet)
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- establish a new session
local last_ack = self.last_est_acks[src_addr]
@@ -275,7 +275,7 @@ function supervisor.comms(_version, nic, fp_ok)
if session ~= nil then
-- pass the packet onto the session handler
session.in_queue.push_packet(packet)
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- establish a new session
local last_ack = self.last_est_acks[src_addr]
@@ -342,7 +342,7 @@ function supervisor.comms(_version, nic, fp_ok)
if session ~= nil then
-- pass the packet onto the session handler
session.in_queue.push_packet(packet)
- elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then
+ elseif packet.type == MGMT_TYPE.ESTABLISH then
-- establish a new session
local last_ack = self.last_est_acks[src_addr]