2018-04-22 20:54:47 +10:00
|
|
|
-- This is released into the public domain.
|
|
|
|
-- No warranty is provided, implied or otherwise.
|
|
|
|
|
|
|
|
-- 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
|