From 2fd7bd311ea0c88aa9ae78b4954ab8412180b7d8 Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Thu, 14 Jan 2021 19:29:48 -0300 Subject: [PATCH] Integrating power widget with it's datasource --- Programs/monitor-system/api/gui/page/init.lua | 25 +++++--- Programs/monitor-system/api/gui/widget.lua | 64 +++++++++++++++---- .../data/datasource/machines.lua | 27 ++++++++ .../data/mock/mock-energy-provider.lua | 12 +++- .../energy/get-energy-status-usecase.lua | 19 +++--- Programs/monitor-system/init.lua | 15 ++--- 6 files changed, 121 insertions(+), 41 deletions(-) create mode 100644 Programs/monitor-system/data/datasource/machines.lua diff --git a/Programs/monitor-system/api/gui/page/init.lua b/Programs/monitor-system/api/gui/page/init.lua index eeab951..d6ec4ed 100644 --- a/Programs/monitor-system/api/gui/page/init.lua +++ b/Programs/monitor-system/api/gui/page/init.lua @@ -26,6 +26,8 @@ Widget = require("api.gui.widget") | e | w | w | w | | l | power |b|f| --]] +local page = {} + local pages = { glasses = require("api.gui.page.glasses"), widgets = require("api.gui.page.widgets"), @@ -41,11 +43,8 @@ pages[4] = pages.stock pages[5] = pages.notifications pages[6] = pages.overview -local page = {} - local elements = { machineWidgets = {}, - powerWidgets = {}, panelSections = {}, navigationButtons = {} } @@ -182,8 +181,8 @@ function page.create(element) elements[15] = elements.machineWidgets.active[8] elements[16] = elements.machineWidgets.active[9] - elements[18] = elements.powerWidgets[1] - elements[19] = elements.powerWidgets[1] + elements[18] = elements.powerWidget + elements[19] = elements.powerWidget elements[1] = elements.panelSections[1] elements[5] = elements.panelSections[2] @@ -197,7 +196,13 @@ end function page.fake() elements.machineWidgets = Widget.fakeWidgets() - elements.powerWidgets = Widget.fakePowerWidget() + elements.powerWidget = Widget.fakePowerWidget() + page.create(pages.overview) +end + +function page.setup(energyBufferAddress) + elements.machineWidgets = Widget.fakeWidgets() + elements.powerWidget = Widget.createPowerWidget(energyBufferAddress) page.create(pages.overview) end @@ -208,10 +213,10 @@ function page.update() for index, activeMachineWidget in ipairs(elements.machineWidgets.active) do activeMachineWidget.draw(activeMachineWidget, index) end - for index, powerWidget in ipairs(elements.powerWidgets) do - powerWidget:update() - powerWidget:draw(index) - end + + elements.powerWidget:update() + elements.powerWidget:draw() + for index, navigationButton in ipairs(elements.navigationButtons) do navigationButton:update() navigationButton:draw(index) diff --git a/Programs/monitor-system/api/gui/widget.lua b/Programs/monitor-system/api/gui/widget.lua index 19f38e8..0ff8cd6 100644 --- a/Programs/monitor-system/api/gui/widget.lua +++ b/Programs/monitor-system/api/gui/widget.lua @@ -3,6 +3,7 @@ Unicode = require("unicode") DoubleBuffer = require("graphics.doubleBuffering") Constants = require("api.gui.constants") Colors = require("graphics.colors") +Utility = require("utils.utility") local widget = {} @@ -13,6 +14,11 @@ local states = { {name = "BROKEN", color = Colors.errorColor} } +local types = { + power = "power", + machine = "machine" +} + local function drawProgress(x, y, width, height, progress, maxProgress, color) progress = math.floor(progress * (width + height - 2) / (maxProgress ~= 0 and maxProgress or 1)) @@ -64,7 +70,7 @@ function widget.drawBaseWidget(x, y, width, height, title) end local function draw(self, index) - if self.type == "power" then + if self.type == types.power then index = 10 end local scale = self.scale or 1 @@ -83,13 +89,23 @@ local function draw(self, index) else local middleInfo = self:getMiddleString() if middleInfo then - DoubleBuffer.drawText(x + 3 + 3 + Unicode.len("IDLE"), y + height - 3, Colors.textColor, middleInfo) + DoubleBuffer.drawText( + x - 3 - 3 + width - Unicode.len(middleInfo) - + Unicode.len( + Utility.splitNumber(self.progress) .. " / " .. Utility.splitNumber(self.maxProgress) .. " s" + ), + y + height - 3, + Colors.textColor, + middleInfo + ) end DoubleBuffer.drawText( - x + width - Unicode.len(self.progress .. "/" .. self.maxProgress .. " s") - 3, + x + width - + Unicode.len(Utility.splitNumber(self.progress) .. " / " .. Utility.splitNumber(self.maxProgress) .. " s") - + 3, y + height - 3, Colors.accentA, - self.progress .. "/" .. self.maxProgress .. " s" + Utility.splitNumber(self.progress) .. " / " .. Utility.splitNumber(self.maxProgress) .. " s" ) end end @@ -198,7 +214,8 @@ end function fake.powerWidget:getMiddleString() local remaining = self.dProgress > 0 and self.maxProgress - self.progress or -self.progress return (self.dProgress > 0 and "+" or "") .. - self.dProgress .. "EU/s. " .. (self.dProgress > 0 and "Full in: " or "Empty in: ") .. remaining / self.dProgress + self.dProgress .. + "EU/s. " .. (self.dProgress > 0 and " Full in: " or "Empty in: ") .. remaining / self.dProgress end function fake.powerWidget.create() @@ -207,9 +224,9 @@ function fake.powerWidget.create() state = states[1], progress = math.random(16000000), maxProgress = 16000000, - scale = 2, - type = "power", dProgress = 1, + scale = 2, + type = types.power, update = fake.powerWidget.update, onClick = fake.powerWidget.onClick, getMiddleString = fake.powerWidget.getMiddleString, @@ -228,12 +245,37 @@ function widget.fakeWidgets() end function widget.fakePowerWidget() - local fakePowerWidgets = {} + return fake.powerWidget.create() +end - table.insert(fakePowerWidgets, fake.powerWidget.create()) - fakePowerWidgets[11] = fakePowerWidgets[10] +function widget.createPowerWidget(address) + local getPowerStatus = require("domain.energy.get-energy-status-usecase") + local function update(self) + for key, value in pairs(getPowerStatus(address, "power")) do + self[key] = value + end + end - return fakePowerWidgets + local function getMiddleString(self) + local time = self.timeToFull or self.timeToEmpty .. " s" + return (self.dProgress > 0 and "+" or "") .. + self.dProgress .. + " EU/s. " .. (self.dProgress > 0 and " Full in: " or "Empty in: ") .. Utility.splitNumber(time) + end + + local powerWidget = { + name = "Power", + scale = 2, + type = types.power, + update = update, + onClick = function() + end, + getMiddleString = getMiddleString, + draw = draw + } + powerWidget:update() + + return powerWidget end return widget diff --git a/Programs/monitor-system/data/datasource/machines.lua b/Programs/monitor-system/data/datasource/machines.lua new file mode 100644 index 0000000..c83fcf9 --- /dev/null +++ b/Programs/monitor-system/data/datasource/machines.lua @@ -0,0 +1,27 @@ +-- Import section +local mock = require("data.mock.mock-energy-provider") +EnergyProvider = require("data.datasource.energy-provider") +Inherits = require("utils.inherits") +-- + +local machine = + Inherits( + EnergyProvider, + { + mock = mock, + name = "Generic Machine" + } +) +local machines = {} + +function machine.getMachine(address, name) + if machines[address] then + return machines[address] + else + local mach = machine:new(address, name) + machines[address] = mach + return mach + end +end + +return machine diff --git a/Programs/monitor-system/data/mock/mock-energy-provider.lua b/Programs/monitor-system/data/mock/mock-energy-provider.lua index 0cd29a3..bb2d3d6 100755 --- a/Programs/monitor-system/data/mock/mock-energy-provider.lua +++ b/Programs/monitor-system/data/mock/mock-energy-provider.lua @@ -1,6 +1,7 @@ -- Import section Inherits = require("utils.inherits") MockSingleBlock = require("data.mock.mock-single-block") +Utility = require("utils.utility") -- local MockEnergyProvider = @@ -11,15 +12,20 @@ local MockEnergyProvider = } ) +local progress = math.random(1608388608) +local input = math.random(16000) +local output = math.random(16000) function MockEnergyProvider.getSensorInformation() + input = input + math.random(-100, 100) + output = input + math.random(-100, 100) return { "§9Insane Voltage Battery Buffer§r", "Stored Items:", - "§a1,608,383,129§r EU / §e1,608,388,608§r EU", + "§a" .. Utility.splitNumber(progress + input - output) .. "§r EU / §e1,608,388,608§r EU", "Average input:", - "11,396 EU/t", + Utility.splitNumber(input) .. " EU/t", "Average output:", - "11,158 EU/t", + Utility.splitNumber(output) .. " EU/t", n = 7 } end diff --git a/Programs/monitor-system/domain/energy/get-energy-status-usecase.lua b/Programs/monitor-system/domain/energy/get-energy-status-usecase.lua index b08630d..e6e4634 100755 --- a/Programs/monitor-system/domain/energy/get-energy-status-usecase.lua +++ b/Programs/monitor-system/domain/energy/get-energy-status-usecase.lua @@ -1,13 +1,14 @@ -- Import section -local getConsumption = require("domain.energy.get-consumption-usecase") -local getProduction = require("domain.energy.get-production-usecase") +Machine = require("data.datasource.machines") -- -local function exec(energyBuffer) +local function exec(address, name) + local energyBuffer = Machine.getMachine(address, name) -- local comsumption = getConsumption(energyBuffer) -- local production = getProduction(energyBuffer) local consumption = energyBuffer:getAverageInput() local production = energyBuffer:getAverageOutput() + local state = {name = "ON", color = Colors.workingColor} local changeRate = production - consumption @@ -17,14 +18,16 @@ local function exec(energyBuffer) local energyLimit = changeRate > 0 and maximumEnergy or 0 - local timeToFull = changeRate > 0 and (energyLimit - currentEnergy) / changeRate or nil - local timeToEmpty = changeRate < 0 and (energyLimit - currentEnergy) / changeRate or nil + local timeToFull = changeRate > 0 and math.floor((energyLimit - currentEnergy) / changeRate) or nil + local timeToEmpty = changeRate < 0 and math.floor((energyLimit - currentEnergy) / changeRate) or nil return { - consumption = consumption, - production = production, + progress = currentEnergy, + maxProgress = maximumEnergy, + dProgress = changeRate, timeToFull = timeToFull, - timeToEmpty = timeToEmpty + timeToEmpty = timeToEmpty, + state = state } end diff --git a/Programs/monitor-system/init.lua b/Programs/monitor-system/init.lua index 5e186c3..70d9d96 100755 --- a/Programs/monitor-system/init.lua +++ b/Programs/monitor-system/init.lua @@ -1,16 +1,14 @@ -- Import section --- Event = require("event") --- Colors = require("graphics.colors") --- Widget = require("api.gui.widget") + Page = require("api.gui.page") --- Graphics = require("graphics.graphics") + -- MultiBlock = require("data.datasource.multi-block") -- SingleBlock = require("data.datasource.single-block") --- EnergyProvider = require("data.datasource.energy-provider") +EnergyProvider = require("data.datasource.energy-provider") -- local cleanroomAddresses = require("config.addresses.cleanroom") -- local multiBlockAddresses = require("config.addresses.multi-blocks") --- local energyBufferAddresses = require("config.addresses.energy-buffers") +local energyBufferAddresses = require("config.addresses.energy-buffers") -- local protectCleanroomRecipes = require("domain.cleanroom.protect-recipes-usecase") -- local getMultiblockStatuses = require("domain.multiblock.get-multiblock-status-usecase") @@ -64,12 +62,11 @@ end require("api.sound.zelda-secret")() --]] - -Page.fake() +Page.setup(energyBufferAddresses.batteryBuffer1) while true do Page.update() - os.sleep(0) + os.sleep(0.2) end --[[