#64 util code cleanup

This commit is contained in:
Mikayla Fischler 2022-05-31 16:09:06 -04:00
parent 341df1a739
commit 3bb95eb441
12 changed files with 147 additions and 148 deletions

View File

@ -12,7 +12,7 @@ local config = require("coordinator.config")
local coordinator = require("coordinator.coordinator")
local renderer = require("coordinator.renderer")
local COORDINATOR_VERSION = "alpha-v0.1.2"
local COORDINATOR_VERSION = "alpha-v0.1.3"
local print = util.print
local println = util.println

View File

@ -13,7 +13,7 @@ local config = require("reactor-plc.config")
local plc = require("reactor-plc.plc")
local threads = require("reactor-plc.threads")
local R_PLC_VERSION = "beta-v0.7.4"
local R_PLC_VERSION = "beta-v0.7.5"
local print = util.print
local println = util.println

View File

@ -24,7 +24,7 @@ local imatrix_rtu = require("rtu.dev.imatrix_rtu")
local turbine_rtu = require("rtu.dev.turbine_rtu")
local turbinev_rtu = require("rtu.dev.turbinev_rtu")
local RTU_VERSION = "beta-v0.7.3"
local RTU_VERSION = "beta-v0.7.4"
local rtu_t = types.rtu_t

View File

@ -17,7 +17,7 @@ alarm.SEVERITY = SEVERITY
-- severity integer to string
---@param severity SEVERITY
alarm.severity_to_string = function (severity)
function alarm.severity_to_string(severity)
if severity == SEVERITY.INFO then
return "INFO"
elseif severity == SEVERITY.WARNING then
@ -39,7 +39,7 @@ end
---@param severity SEVERITY
---@param device string
---@param message string
alarm.scada_alarm = function (severity, device, message)
function alarm.scada_alarm(severity, device, message)
local self = {
time = util.time(),
ts_string = os.date("[%H:%M:%S]"),
@ -53,12 +53,12 @@ alarm.scada_alarm = function (severity, device, message)
-- format the alarm as a string
---@return string message
public.format = function ()
return self.ts_string .. " [" .. alarm.severity_to_string(self.severity) .. "] (" .. self.device ") >> " .. self.message
function public.format()
return self.ts_string .. " [" .. alarm.severity_to_string(self.severity) .. "] (" .. self.device .. ") >> " .. self.message
end
-- get alarm properties
public.properties = function ()
function public.properties()
return {
time = self.time,
severity = self.severity,

View File

@ -2,7 +2,7 @@
-- Communications
--
local log = require("scada-common.log")
local log = require("scada-common.log")
local types = require("scada-common.types")
---@class comms
@ -66,7 +66,7 @@ comms.SCADA_MGMT_TYPES = SCADA_MGMT_TYPES
comms.RTU_UNIT_TYPES = RTU_UNIT_TYPES
-- generic SCADA packet object
comms.scada_packet = function ()
function comms.scada_packet()
local self = {
modem_msg_in = nil,
valid = false,
@ -84,7 +84,7 @@ comms.scada_packet = function ()
---@param seq_num integer
---@param protocol PROTOCOLS
---@param payload table
public.make = function (seq_num, protocol, payload)
function public.make(seq_num, protocol, payload)
self.valid = true
self.seq_num = seq_num
self.protocol = protocol
@ -99,7 +99,7 @@ comms.scada_packet = function ()
---@param reply_to integer
---@param message any
---@param distance integer
public.receive = function (side, sender, reply_to, message, distance)
function public.receive(side, sender, reply_to, message, distance)
self.modem_msg_in = {
iface = side,
s_port = sender,
@ -125,25 +125,25 @@ comms.scada_packet = function ()
-- public accessors --
public.modem_event = function () return self.modem_msg_in end
public.raw_sendable = function () return self.raw end
function public.modem_event() return self.modem_msg_in end
function public.raw_sendable() return self.raw end
public.local_port = function () return self.modem_msg_in.s_port end
public.remote_port = function () return self.modem_msg_in.r_port end
function public.local_port() return self.modem_msg_in.s_port end
function public.remote_port() return self.modem_msg_in.r_port end
public.is_valid = function () return self.valid end
function public.is_valid() return self.valid end
public.seq_num = function () return self.seq_num end
public.protocol = function () return self.protocol end
public.length = function () return self.length end
public.data = function () return self.payload end
function public.seq_num() return self.seq_num end
function public.protocol() return self.protocol end
function public.length() return self.length end
function public.data() return self.payload end
return public
end
-- MODBUS packet
-- modeled after MODBUS TCP packet
comms.modbus_packet = function ()
function comms.modbus_packet()
local self = {
frame = nil,
raw = nil,
@ -162,7 +162,7 @@ comms.modbus_packet = function ()
---@param unit_id integer
---@param func_code MODBUS_FCODE
---@param data table
public.make = function (txn_id, unit_id, func_code, data)
function public.make(txn_id, unit_id, func_code, data)
self.txn_id = txn_id
self.length = #data
self.unit_id = unit_id
@ -179,7 +179,7 @@ comms.modbus_packet = function ()
-- decode a MODBUS packet from a SCADA frame
---@param frame scada_packet
---@return boolean success
public.decode = function (frame)
function public.decode(frame)
if frame then
self.frame = frame
@ -203,10 +203,10 @@ comms.modbus_packet = function ()
end
-- get raw to send
public.raw_sendable = function () return self.raw end
function public.raw_sendable() return self.raw end
-- get this packet as a frame with an immutable relation to this object
public.get = function ()
function public.get()
---@class modbus_frame
local frame = {
scada_frame = self.frame,
@ -224,7 +224,7 @@ comms.modbus_packet = function ()
end
-- reactor PLC packet
comms.rplc_packet = function ()
function comms.rplc_packet()
local self = {
frame = nil,
raw = nil,
@ -238,7 +238,7 @@ comms.rplc_packet = function ()
local public = {}
-- check that type is known
local _rplc_type_valid = function ()
local function _rplc_type_valid()
return self.type == RPLC_TYPES.LINK_REQ or
self.type == RPLC_TYPES.STATUS or
self.type == RPLC_TYPES.MEK_STRUCT or
@ -254,7 +254,7 @@ comms.rplc_packet = function ()
---@param id integer
---@param packet_type RPLC_TYPES
---@param data table
public.make = function (id, packet_type, data)
function public.make(id, packet_type, data)
-- packet accessor properties
self.id = id
self.type = packet_type
@ -271,7 +271,7 @@ comms.rplc_packet = function ()
-- decode an RPLC packet from a SCADA frame
---@param frame scada_packet
---@return boolean success
public.decode = function (frame)
function public.decode(frame)
if frame then
self.frame = frame
@ -296,10 +296,10 @@ comms.rplc_packet = function ()
end
-- get raw to send
public.raw_sendable = function () return self.raw end
function public.raw_sendable() return self.raw end
-- get this packet as a frame with an immutable relation to this object
public.get = function ()
function public.get()
---@class rplc_frame
local frame = {
scada_frame = self.frame,
@ -316,7 +316,7 @@ comms.rplc_packet = function ()
end
-- SCADA management packet
comms.mgmt_packet = function ()
function comms.mgmt_packet()
local self = {
frame = nil,
raw = nil,
@ -329,7 +329,7 @@ comms.mgmt_packet = function ()
local public = {}
-- check that type is known
local _scada_type_valid = function ()
local function _scada_type_valid()
return self.type == SCADA_MGMT_TYPES.KEEP_ALIVE or
self.type == SCADA_MGMT_TYPES.CLOSE or
self.type == SCADA_MGMT_TYPES.REMOTE_LINKED or
@ -339,7 +339,7 @@ comms.mgmt_packet = function ()
-- make a SCADA management packet
---@param packet_type SCADA_MGMT_TYPES
---@param data table
public.make = function (packet_type, data)
function public.make(packet_type, data)
-- packet accessor properties
self.type = packet_type
self.length = #data
@ -355,7 +355,7 @@ comms.mgmt_packet = function ()
-- decode a SCADA management packet from a SCADA frame
---@param frame scada_packet
---@return boolean success
public.decode = function (frame)
function public.decode(frame)
if frame then
self.frame = frame
@ -380,10 +380,10 @@ comms.mgmt_packet = function ()
end
-- get raw to send
public.raw_sendable = function () return self.raw end
function public.raw_sendable() return self.raw end
-- get this packet as a frame with an immutable relation to this object
public.get = function ()
function public.get()
---@class mgmt_frame
local frame = {
scada_frame = self.frame,
@ -400,7 +400,7 @@ end
-- SCADA coordinator packet
-- @todo
comms.coord_packet = function ()
function comms.coord_packet()
local self = {
frame = nil,
raw = nil,
@ -412,7 +412,7 @@ comms.coord_packet = function ()
---@class coord_packet
local public = {}
local _coord_type_valid = function ()
local function _coord_type_valid()
-- @todo
return false
end
@ -420,7 +420,7 @@ comms.coord_packet = function ()
-- make a coordinator packet
---@param packet_type any
---@param data table
public.make = function (packet_type, data)
function public.make(packet_type, data)
-- packet accessor properties
self.type = packet_type
self.length = #data
@ -436,7 +436,7 @@ comms.coord_packet = function ()
-- decode a coordinator packet from a SCADA frame
---@param frame scada_packet
---@return boolean success
public.decode = function (frame)
function public.decode(frame)
if frame then
self.frame = frame
@ -461,10 +461,10 @@ comms.coord_packet = function ()
end
-- get raw to send
public.raw_sendable = function () return self.raw end
function public.raw_sendable() return self.raw end
-- get this packet as a frame with an immutable relation to this object
public.get = function ()
function public.get()
---@class coord_frame
local frame = {
scada_frame = self.frame,
@ -481,7 +481,7 @@ end
-- coordinator API (CAPI) packet
-- @todo
comms.capi_packet = function ()
function comms.capi_packet()
local self = {
frame = nil,
raw = nil,
@ -493,7 +493,7 @@ comms.capi_packet = function ()
---@class capi_packet
local public = {}
local _coord_type_valid = function ()
local function _coord_type_valid()
-- @todo
return false
end
@ -501,7 +501,7 @@ comms.capi_packet = function ()
-- make a coordinator API packet
---@param packet_type any
---@param data table
public.make = function (packet_type, data)
function public.make(packet_type, data)
-- packet accessor properties
self.type = packet_type
self.length = #data
@ -517,7 +517,7 @@ comms.capi_packet = function ()
-- decode a coordinator API packet from a SCADA frame
---@param frame scada_packet
---@return boolean success
public.decode = function (frame)
function public.decode(frame)
if frame then
self.frame = frame
@ -542,10 +542,10 @@ comms.capi_packet = function ()
end
-- get raw to send
public.raw_sendable = function () return self.raw end
function public.raw_sendable() return self.raw end
-- get this packet as a frame with an immutable relation to this object
public.get = function ()
function public.get()
---@class capi_frame
local frame = {
scada_frame = self.frame,
@ -563,7 +563,7 @@ end
-- convert rtu_t to RTU unit type
---@param type rtu_t
---@return RTU_UNIT_TYPES|nil
comms.rtu_t_to_unit_type = function (type)
function comms.rtu_t_to_unit_type(type)
if type == rtu_t.redstone then
return RTU_UNIT_TYPES.REDSTONE
elseif type == rtu_t.boiler then
@ -586,7 +586,7 @@ end
-- convert RTU unit type to rtu_t
---@param utype RTU_UNIT_TYPES
---@return rtu_t|nil
comms.advert_type_to_rtu_t = function (utype)
function comms.advert_type_to_rtu_t(utype)
if utype == RTU_UNIT_TYPES.REDSTONE then
return rtu_t.redstone
elseif utype == RTU_UNIT_TYPES.BOILER then

View File

@ -1,20 +1,19 @@
local aes128 = require("lockbox.cipher.aes128")
local ctr_mode = require("lockbox.cipher.mode.ctr");
--
-- Cryptographic Communications Engine
--
local sha1 = require("lockbox.digest.sha1");
local aes128 = require("lockbox.cipher.aes128")
local ctr_mode = require("lockbox.cipher.mode.ctr");
local sha1 = require("lockbox.digest.sha1");
local sha2_224 = require("lockbox.digest.sha2_224");
local sha2_256 = require("lockbox.digest.sha2_256");
local pbkdf2 = require("lockbox.kdf.pbkdf2")
local hmac = require("lockbox.mac.hmac")
local pbkdf2 = require("lockbox.kdf.pbkdf2")
local hmac = require("lockbox.mac.hmac")
local zero_pad = require("lockbox.padding.zero");
local stream = require("lockbox.util.stream")
local array = require("lockbox.util.array")
local stream = require("lockbox.util.stream")
local array = require("lockbox.util.array")
local log = require("scada-common.log")
local log = require("scada-common.log")
local util = require("scada-common.util")
local crypto = {}

View File

@ -1,9 +1,9 @@
local util = require("scada-common.util")
--
-- File System Logger
--
local util = require("scada-common.util")
---@class log
local log = {}
@ -32,7 +32,7 @@ local free_space = fs.getFreeSpace
---@param path string file path
---@param write_mode MODE
---@param dmesg_redirect? table terminal/window to direct dmesg to
log.init = function (path, write_mode, dmesg_redirect)
function log.init(path, write_mode, dmesg_redirect)
_log_sys.path = path
_log_sys.mode = write_mode
@ -51,13 +51,13 @@ end
-- direct dmesg output to a monitor/window
---@param window table window or terminal reference
log.direct_dmesg = function (window)
function log.direct_dmesg(window)
_log_sys.dmesg_out = window
end
-- private log write function
---@param msg string
local _log = function (msg)
local function _log(msg)
local time_stamp = os.date("[%c] ")
local stamped = time_stamp .. util.strval(msg)
@ -94,7 +94,7 @@ end
---@param msg string message
---@param tag? string log tag
---@param tag_color? integer log tag color
log.dmesg = function (msg, tag, tag_color)
function log.dmesg(msg, tag, tag_color)
msg = util.strval(msg)
tag = tag or ""
tag = util.strval(tag)
@ -183,7 +183,7 @@ end
-- log debug messages
---@param msg string message
---@param trace? boolean include file trace
log.debug = function (msg, trace)
function log.debug(msg, trace)
if LOG_DEBUG then
local dbg_info = ""
@ -204,20 +204,20 @@ end
-- log info messages
---@param msg string message
log.info = function (msg)
function log.info(msg)
_log("[INF] " .. util.strval(msg))
end
-- log warning messages
---@param msg string message
log.warning = function (msg)
function log.warning(msg)
_log("[WRN] " .. util.strval(msg))
end
-- log error messages
---@param msg string message
---@param trace? boolean include file trace
log.error = function (msg, trace)
function log.error(msg, trace)
local dbg_info = ""
if trace then
@ -236,7 +236,7 @@ end
-- log fatal errors
---@param msg string message
log.fatal = function (msg)
function log.fatal(msg)
_log("[FTL] " .. util.strval(msg))
end

View File

@ -14,7 +14,7 @@ local TYPE = {
mqueue.TYPE = TYPE
-- create a new message queue
mqueue.new = function ()
function mqueue.new()
local queue = {}
local insert = table.insert
@ -32,44 +32,44 @@ mqueue.new = function ()
local public = {}
-- get queue length
public.length = function () return #queue end
function public.length() return #queue end
-- check if queue is empty
---@return boolean is_empty
public.empty = function () return #queue == 0 end
function public.empty() return #queue == 0 end
-- check if queue has contents
public.ready = function () return #queue ~= 0 end
function public.ready() return #queue ~= 0 end
-- push a new item onto the queue
---@param qtype TYPE
---@param message string
local _push = function (qtype, message)
local function _push(qtype, message)
insert(queue, { qtype = qtype, message = message })
end
-- push a command onto the queue
---@param message any
public.push_command = function (message)
function public.push_command(message)
_push(TYPE.COMMAND, message)
end
-- push data onto the queue
---@param key any
---@param value any
public.push_data = function (key, value)
function public.push_data(key, value)
_push(TYPE.DATA, { key = key, val = value })
end
-- push a packet onto the queue
---@param packet scada_packet|modbus_packet|rplc_packet|coord_packet|capi_packet
public.push_packet = function (packet)
function public.push_packet(packet)
_push(TYPE.PACKET, packet)
end
-- get an item off the queue
---@return queue_item|nil
public.pop = function ()
function public.pop()
if #queue > 0 then
return remove(queue, 1)
else

View File

@ -1,9 +1,9 @@
local log = require("scada-common.log")
--
-- Protected Peripheral Manager
--
local log = require("scada-common.log")
---@class ppm
local ppm = {}
@ -32,7 +32,7 @@ local _ppm_sys = {
---
---assumes iface is a valid peripheral
---@param iface string CC peripheral interface
local peri_init = function (iface)
local function peri_init(iface)
local self = {
faulted = false,
last_fault = "",
@ -92,13 +92,13 @@ local peri_init = function (iface)
-- fault management functions
local clear_fault = function () self.faulted = false end
local get_last_fault = function () return self.last_fault end
local is_faulted = function () return self.faulted end
local is_ok = function () return not self.faulted end
local function clear_fault() self.faulted = false end
local function get_last_fault() return self.last_fault end
local function is_faulted() return self.faulted end
local function is_ok() return not self.faulted end
local enable_afc = function () self.auto_cf = true end
local disable_afc = function () self.auto_cf = false end
local function enable_afc() self.auto_cf = true end
local function disable_afc() self.auto_cf = false end
-- append to device functions
@ -122,53 +122,53 @@ end
-- REPORTING --
-- silence error prints
ppm.disable_reporting = function ()
function ppm.disable_reporting()
_ppm_sys.mute = true
end
-- allow error prints
ppm.enable_reporting = function ()
function ppm.enable_reporting()
_ppm_sys.mute = false
end
-- FAULT MEMORY --
-- enable automatically clearing fault flag
ppm.enable_afc = function ()
function ppm.enable_afc()
_ppm_sys.auto_cf = true
end
-- disable automatically clearing fault flag
ppm.disable_afc = function ()
function ppm.disable_afc()
_ppm_sys.auto_cf = false
end
-- clear fault flag
ppm.clear_fault = function ()
function ppm.clear_fault()
_ppm_sys.faulted = false
end
-- check fault flag
ppm.is_faulted = function ()
function ppm.is_faulted()
return _ppm_sys.faulted
end
-- get the last fault message
ppm.get_last_fault = function ()
function ppm.get_last_fault()
return _ppm_sys.last_fault
end
-- TERMINATION --
-- if a caught error was a termination request
ppm.should_terminate = function ()
function ppm.should_terminate()
return _ppm_sys.terminate
end
-- MOUNTING --
-- mount all available peripherals (clears mounts first)
ppm.mount_all = function ()
function ppm.mount_all()
local ifaces = peripheral.getNames()
_ppm_sys.mounts = {}
@ -187,7 +187,7 @@ end
-- mount a particular device
---@param iface string CC peripheral interface
---@return string|nil type, table|nil device
ppm.mount = function (iface)
function ppm.mount(iface)
local ifaces = peripheral.getNames()
local pm_dev = nil
local pm_type = nil
@ -210,7 +210,7 @@ end
-- handle peripheral_detach event
---@param iface string CC peripheral interface
---@return string|nil type, table|nil device
ppm.handle_unmount = function (iface)
function ppm.handle_unmount(iface)
local pm_dev = nil
local pm_type = nil
@ -233,20 +233,20 @@ end
-- list all available peripherals
---@return table names
ppm.list_avail = function ()
function ppm.list_avail()
return peripheral.getNames()
end
-- list mounted peripherals
---@return table mounts
ppm.list_mounts = function ()
function ppm.list_mounts()
return _ppm_sys.mounts
end
-- get a mounted peripheral by side/interface
---@param iface string CC peripheral interface
---@return table|nil device function table
ppm.get_periph = function (iface)
function ppm.get_periph(iface)
if _ppm_sys.mounts[iface] then
return _ppm_sys.mounts[iface].dev
else return nil end
@ -255,7 +255,7 @@ end
-- get a mounted peripheral type by side/interface
---@param iface string CC peripheral interface
---@return string|nil type
ppm.get_type = function (iface)
function ppm.get_type(iface)
if _ppm_sys.mounts[iface] then
return _ppm_sys.mounts[iface].type
else return nil end
@ -264,7 +264,7 @@ end
-- get all mounted peripherals by type
---@param name string type name
---@return table devices device function tables
ppm.get_all_devices = function (name)
function ppm.get_all_devices(name)
local devices = {}
for _, data in pairs(_ppm_sys.mounts) do
@ -279,7 +279,7 @@ end
-- get a mounted peripheral by type (if multiple, returns the first)
---@param name string type name
---@return table|nil device function table
ppm.get_device = function (name)
function ppm.get_device(name)
local device = nil
for side, data in pairs(_ppm_sys.mounts) do
@ -296,13 +296,13 @@ end
-- get the fission reactor (if multiple, returns the first)
---@return table|nil reactor function table
ppm.get_fission_reactor = function ()
function ppm.get_fission_reactor()
return ppm.get_device("fissionReactor")
end
-- get the wireless modem (if multiple, returns the first)
---@return table|nil modem function table
ppm.get_wireless_modem = function ()
function ppm.get_wireless_modem()
local w_modem = nil
for _, device in pairs(_ppm_sys.mounts) do
@ -317,7 +317,7 @@ end
-- list all connected monitors
---@return table monitors
ppm.get_monitor_list = function ()
function ppm.get_monitor_list()
local list = {}
for iface, device in pairs(_ppm_sys.mounts) do

View File

@ -77,7 +77,7 @@ rsio.IO = RS_IO
-- channel to string
---@param channel RS_IO
rsio.to_string = function (channel)
function rsio.to_string(channel)
local names = {
"F_SCRAM",
"R_SCRAM",
@ -160,7 +160,7 @@ local RS_DIO_MAP = {
-- get the mode of a channel
---@param channel RS_IO
---@return IO_MODE
rsio.get_io_mode = function (channel)
function rsio.get_io_mode(channel)
local modes = {
IO_MODE.DIGITAL_IN, -- F_SCRAM
IO_MODE.DIGITAL_IN, -- R_SCRAM
@ -200,14 +200,14 @@ local RS_SIDES = rs.getSides()
-- check if a channel is valid
---@param channel RS_IO
---@return boolean valid
rsio.is_valid_channel = function (channel)
function rsio.is_valid_channel(channel)
return (type(channel) == "number") and (channel > 0) and (channel <= RS_IO.R_PLC_TIMEOUT)
end
-- check if a side is valid
---@param side string
---@return boolean valid
rsio.is_valid_side = function (side)
function rsio.is_valid_side(side)
if side ~= nil then
for i = 0, #RS_SIDES do
if RS_SIDES[i] == side then return true end
@ -219,7 +219,7 @@ end
-- check if a color is a valid single color
---@param color integer
---@return boolean valid
rsio.is_color = function (color)
function rsio.is_color(color)
return (type(color) == "number") and (color > 0) and (_B_AND(color, (color - 1)) == 0);
end
@ -230,7 +230,7 @@ end
-- get digital IO level reading
---@param rs_value boolean
---@return IO_LVL
rsio.digital_read = function (rs_value)
function rsio.digital_read(rs_value)
if rs_value then
return IO_LVL.HIGH
else
@ -242,7 +242,7 @@ end
---@param channel RS_IO
---@param level IO_LVL
---@return boolean
rsio.digital_write = function (channel, level)
function rsio.digital_write(channel, level)
if type(channel) ~= "number" or channel < RS_IO.F_ALARM or channel > RS_IO.R_PLC_TIMEOUT then
return false
else
@ -254,7 +254,7 @@ end
---@param channel RS_IO
---@param level IO_LVL
---@return boolean
rsio.digital_is_active = function (channel, level)
function rsio.digital_is_active(channel, level)
if type(channel) ~= "number" or channel > RS_IO.R_ENABLE then
return false
else
@ -271,7 +271,7 @@ end
---@param min number minimum of range
---@param max number maximum of range
---@return number value scaled reading (min to max)
rsio.analog_read = function (rs_value, min, max)
function rsio.analog_read(rs_value, min, max)
local value = rs_value / 15
return (value * (max - min)) + min
end
@ -281,7 +281,7 @@ end
---@param min number minimum of range
---@param max number maximum of range
---@return number rs_value scaled redstone reading (0 to 15)
rsio.analog_write = function (value, min, max)
function rsio.analog_write(value, min, max)
local scaled_value = (value - min) / (max - min)
return scaled_value * 15
end

View File

@ -12,7 +12,7 @@ local util = {}
---@param a any return if true
---@param b any return if false
---@return any value
util.trinary = function (cond, a, b)
function util.trinary(cond, a, b)
if cond then return a else return b end
end
@ -20,25 +20,25 @@ end
-- print
---@param message any
util.print = function (message)
function util.print(message)
term.write(tostring(message))
end
-- print line
---@param message any
util.println = function (message)
function util.println(message)
print(tostring(message))
end
-- timestamped print
---@param message any
util.print_ts = function (message)
function util.print_ts(message)
term.write(os.date("[%H:%M:%S] ") .. tostring(message))
end
-- timestamped print line
---@param message any
util.println_ts = function (message)
function util.println_ts(message)
print(os.date("[%H:%M:%S] ") .. tostring(message))
end
@ -47,7 +47,7 @@ end
-- get a value as a string
---@param val any
---@return string
util.strval = function (val)
function util.strval(val)
local t = type(val)
if t == "table" or t == "function" then
return "[" .. tostring(val) .. "]"
@ -59,7 +59,7 @@ end
-- concatenation with built-in to string
---@vararg any
---@return string
util.concat = function (...)
function util.concat(...)
local str = ""
for _, v in ipairs(arg) do
str = str .. util.strval(v)
@ -73,7 +73,7 @@ util.c = util.concat
-- sprintf implementation
---@param format string
---@vararg any
util.sprintf = function (format, ...)
function util.sprintf(format, ...)
return string.format(format, table.unpack(arg))
end
@ -81,7 +81,7 @@ end
-- round a number to an integer
---@return integer rounded
util.round = function (x)
function util.round(x)
return math.floor(x + 0.5)
end
@ -89,21 +89,21 @@ end
-- current time
---@return integer milliseconds
util.time_ms = function ()
function util.time_ms()
---@diagnostic disable-next-line: undefined-field
return os.epoch('local')
end
-- current time
---@return number seconds
util.time_s = function ()
function util.time_s()
---@diagnostic disable-next-line: undefined-field
return os.epoch('local') / 1000.0
end
-- current time
---@return integer milliseconds
util.time = function ()
function util.time()
return util.time_ms()
end
@ -112,7 +112,7 @@ end
-- protected sleep call so we still are in charge of catching termination
---@param t integer seconds
--- EVENT_CONSUMER: this function consumes events
util.psleep = function (t)
function util.psleep(t)
---@diagnostic disable-next-line: undefined-field
pcall(os.sleep, t)
end
@ -120,7 +120,7 @@ end
-- no-op to provide a brief pause (1 tick) to yield
---
--- EVENT_CONSUMER: this function consumes events
util.nop = function ()
function util.nop()
util.psleep(0.05)
end
@ -129,7 +129,7 @@ end
---@param last_update integer millisecond time of last update
---@return integer time_now
-- EVENT_CONSUMER: this function consumes events
util.adaptive_delay = function (target_timing, last_update)
function util.adaptive_delay(target_timing, last_update)
local sleep_for = target_timing - (util.time() - last_update)
-- only if >50ms since worker loops already yield 0.05s
if sleep_for >= 50 then
@ -146,7 +146,7 @@ end
---@param t table table to remove elements from
---@param f function should return false to delete an element when passed the element: f(elem) = true|false
---@param on_delete? function optional function to execute on deletion, passed the table element to be deleted as the parameter
util.filter_table = function (t, f, on_delete)
function util.filter_table(t, f, on_delete)
local move_to = 1
for i = 1, #t do
local element = t[i]
@ -168,7 +168,7 @@ end
-- check if a table contains the provided element
---@param t table table to check
---@param element any element to check for
util.table_contains = function (t, element)
function util.table_contains(t, element)
for i = 1, #t do
if t[i] == element then return true end
end
@ -213,7 +213,7 @@ end
---@param timeout number timeout duration
---
--- triggers a timer event if not fed within 'timeout' seconds
util.new_watchdog = function (timeout)
function util.new_watchdog(timeout)
---@diagnostic disable-next-line: undefined-field
local start_timer = os.startTimer
---@diagnostic disable-next-line: undefined-field
@ -228,12 +228,12 @@ util.new_watchdog = function (timeout)
local public = {}
---@param timer number timer event timer ID
public.is_timer = function (timer)
function public.is_timer(timer)
return self.wd_timer == timer
end
-- satiate the beast
public.feed = function ()
function public.feed()
if self.wd_timer ~= nil then
cancel_timer(self.wd_timer)
end
@ -241,7 +241,7 @@ util.new_watchdog = function (timeout)
end
-- cancel the watchdog
public.cancel = function ()
function public.cancel()
if self.wd_timer ~= nil then
cancel_timer(self.wd_timer)
end
@ -256,7 +256,7 @@ end
---@param period number clock period
---
--- fires a timer event at the specified period, does not start at construct time
util.new_clock = function (period)
function util.new_clock(period)
---@diagnostic disable-next-line: undefined-field
local start_timer = os.startTimer
@ -269,12 +269,12 @@ util.new_clock = function (period)
local public = {}
---@param timer number timer event timer ID
public.is_clock = function (timer)
function public.is_clock(timer)
return self.timer == timer
end
-- start the clock
public.start = function ()
function public.start()
self.timer = start_timer(self.period)
end

View File

@ -13,7 +13,7 @@ local svsessions = require("supervisor.session.svsessions")
local config = require("supervisor.config")
local supervisor = require("supervisor.supervisor")
local SUPERVISOR_VERSION = "beta-v0.4.3"
local SUPERVISOR_VERSION = "beta-v0.4.4"
local print = util.print
local println = util.println