diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index 07479e0..95a3e6f 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -495,6 +495,49 @@ end --#region Statuses +-- generate the text string for the induction matrix charge/discharge ETA +---@param eta_ms number eta in milliseconds +local function gen_eta_text(eta_ms) + local str, pre = "", util.trinary(eta_ms >= 0, "Full in ", "Empty in ") + + local seconds = math.abs(eta_ms) / 1000 + local minutes = seconds / 60 + local hours = minutes / 60 + local days = hours / 24 + + if math.abs(eta_ms) < 1000 or (eta_ms ~= eta_ms) then + -- really small or NaN + str = "No ETA" + elseif days < 1000 then + days = math.floor(days) + hours = math.floor(hours % 24) + minutes = math.floor(minutes % 60) + seconds = math.floor(seconds % 60) + + if days > 0 then + str = days .. "d" + elseif hours > 0 then + str = hours .. "h " .. minutes .. "m" + elseif minutes > 0 then + str = minutes .. "m " .. seconds .. "s" + elseif seconds > 0 then + str = seconds .. "s" + end + + str = pre .. str + else + local years = math.floor(days / 365.25) + + if years <= 99999999 then + str = pre .. years .. "y" + else + str = pre .. "eras" + end + end + + return str +end + -- record and publish multiblock status data ---@param entry any ---@param data imatrix_session_db|sps_session_db|dynamicv_session_db|turbinev_session_db|boilerv_session_db @@ -616,6 +659,7 @@ function iocontrol.update_facility_status(status) ps.publish("avg_inflow", in_f) ps.publish("avg_outflow", out_f) ps.publish("eta_ms", eta) + ps.publish("eta_string", gen_eta_text(eta or 0)) ps.publish("is_charging", in_f > out_f) ps.publish("is_discharging", out_f > in_f) diff --git a/coordinator/ui/components/imatrix.lua b/coordinator/ui/components/imatrix.lua index 1f053a8..c6fd21d 100644 --- a/coordinator/ui/components/imatrix.lua +++ b/coordinator/ui/components/imatrix.lua @@ -105,46 +105,7 @@ local function new_view(root, x, y, ps, id) local eta = TextBox{parent=rect,x=11,y=20,width=20,text="ETA Unknown",alignment=ALIGN.CENTER,fg_bg=style.theme.field_box} - eta.register(ps, "eta_ms", function (eta_ms) - local str, pre = "", util.trinary(eta_ms >= 0, "Full in ", "Empty in ") - - local seconds = math.abs(eta_ms) / 1000 - local minutes = seconds / 60 - local hours = minutes / 60 - local days = hours / 24 - - if math.abs(eta_ms) < 1000 or (eta_ms ~= eta_ms) then - -- really small or NaN - str = "No ETA" - elseif days < 1000 then - days = math.floor(days) - hours = math.floor(hours % 24) - minutes = math.floor(minutes % 60) - seconds = math.floor(seconds % 60) - - if days > 0 then - str = days .. "d" - elseif hours > 0 then - str = hours .. "h " .. minutes .. "m" - elseif minutes > 0 then - str = minutes .. "m " .. seconds .. "s" - elseif seconds > 0 then - str = seconds .. "s" - end - - str = pre .. str - else - local years = math.floor(days / 365.25) - - if years <= 99999999 then - str = pre .. years .. "y" - else - str = pre .. "eras" - end - end - - eta.set_value(str) - end) + eta.register(ps, "eta_string", eta.set_value) end return new_view diff --git a/pocket/ui/apps/facility.lua b/pocket/ui/apps/facility.lua index 039c39b..8e338da 100644 --- a/pocket/ui/apps/facility.lua +++ b/pocket/ui/apps/facility.lua @@ -98,46 +98,7 @@ local function new_view(root) local eta = TextBox{parent=f_div,x=1,y=17,text="ETA Unknown",alignment=ALIGN.CENTER,fg_bg=cpair(colors.white,colors.gray)} - eta.register(fac.induction_ps_tbl[1], "eta_ms", function (eta_ms) - local str, pre = "", util.trinary(eta_ms >= 0, "Full in ", "Empty in ") - - local seconds = math.abs(eta_ms) / 1000 - local minutes = seconds / 60 - local hours = minutes / 60 - local days = hours / 24 - - if math.abs(eta_ms) < 1000 or (eta_ms ~= eta_ms) then - -- really small or NaN - str = "No ETA" - elseif days < 1000 then - days = math.floor(days) - hours = math.floor(hours % 24) - minutes = math.floor(minutes % 60) - seconds = math.floor(seconds % 60) - - if days > 0 then - str = days .. "d" - elseif hours > 0 then - str = hours .. "h " .. minutes .. "m" - elseif minutes > 0 then - str = minutes .. "m " .. seconds .. "s" - elseif seconds > 0 then - str = seconds .. "s" - end - - str = pre .. str - else - local years = math.floor(days / 365.25) - - if years <= 99999999 then - str = pre .. years .. "y" - else - str = pre .. "eras" - end - end - - eta.set_value(str) - end) + eta.register(fac.induction_ps_tbl[1], "eta_string", eta.set_value) --#endregion