OC-KittenOS/repository/apps/app-nprt2018.lua

142 lines
3.6 KiB
Lua

-- Copyright (C) 2018-2021 by KittenOS NEO contributors
--
-- Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-- THIS SOFTWARE.
-- app-nprt2018.lua : 3D printing application
-- Authors: 20kdc
local callerPkg, callerPid, sentModel = ...
local event = require("event")(neo)
local neoux = require("neoux")(event, neo)
local tp = neo.requireAccess("c.printer3d", "")
local running = true
local window, genCurrent
local function regen()
window.reset(genCurrent())
end
local function runModel(mdl, printers, rep)
if not mdl then return end
for _, v in ipairs(printers) do
v.reset()
v.setLabel(mdl.label or "Block")
v.setTooltip(mdl.tooltip or "A 3D-printed block.")
v.setRedstoneEmitter(mdl.emitRedstore or false)
v.setButtonMode(mdl.buttonMode or false)
for _, vs in ipairs(mdl.shapes) do
v.addShape(vs[1], vs[2], vs[3], vs[4], vs[5], vs[6], vs.texture or "", vs.state or false, vs.tint or 0xFFFFFF)
end
v.commit(rep)
end
end
local function gaugeProgress(printers)
local avg = 0
local busy = false
for _, v in ipairs(printers) do
local state, substate = v.status()
if state == "idle" then
avg = avg + 100
else
busy = true
avg = avg + substate
end
end
if not busy then return end
-- if busy, #printers cannot be 0
return math.ceil(avg / #printers)
end
local function engagePS2(printers, rep)
window.close()
local model = sentModel
if not model then
local m = neoux.fileDialog(false)
if m then
model = require("serial").deserialize("return " .. m.read("*a"))
m.close()
end
end
if not model then
genCurrent = genMain
window = neoux.create(genCurrent())
return
end
local percent = 0
genCurrent = function ()
local str = "Printing... " .. percent .. "%"
local tx = "printing"
return #str, 1, tx, function (w, ev, t)
if ev == "close" then
for _, v in ipairs(printers) do
v.reset()
end
end
if ev == "line" then
if t == 1 then
w.span(1, 1, str, 0xFFFFFF, 0)
end
end
end
end
window = neoux.create(genCurrent())
runModel(model, printers, rep)
while true do
percent = gaugeProgress(printers)
if not percent then break end
regen()
event.sleepTo(os.uptime() + 1)
end
window.close()
if sentModel then
running = false
else
genCurrent = genMain
window = neoux.create(genCurrent())
end
end
function genMain()
local rep = 1
local elems = {
neoux.tcrawview(1, 1, {
"Repeats: ",
"Choose Printer: "
}),
neoux.tcfield(9, 1, 7, function (tx)
if tx then rep = math.max(0, math.floor(tonumber(tx) or 0)) end
return tostring(rep)
end)
}
local max = 16
local all = {}
for v in tp.list() do
table.insert(all, v)
local us = unicode.safeTextFormat(v.address)
table.insert(elems, neoux.tcbutton(1, #elems + 1, us, function (w)
engagePS2({v}, rep)
end))
max = math.max(max, unicode.len(us) + 2)
end
table.insert(elems, neoux.tcbutton(1, #elems + 1, "All", function (w)
engagePS2(all, rep)
end))
return max, #elems, nil, neoux.tcwindow(max, #elems, elems, function (w)
running = false
w.close()
end, 0xFFFFFF, 0)
end
genCurrent = genMain
window = neoux.create(genCurrent())
while running do
event.pull()
end