diff options
author | cheapie <no-email-for-you@example.com> | 2024-04-19 11:24:33 -0500 |
---|---|---|
committer | cheapie <no-email-for-you@example.com> | 2024-04-19 11:24:33 -0500 |
commit | c3d04606a3b4da5181ce3467cb9e77d6a4e61b04 (patch) | |
tree | 15c8277c9a9ed0bddf2f419d24a93bcdc74ad19d /dispatcherfw.lua | |
parent | 52821fcc17d7b17c5bb9f6ccbb1c13cbdddf71b2 (diff) | |
download | celevator-c3d04606a3b4da5181ce3467cb9e77d6a4e61b04.tar celevator-c3d04606a3b4da5181ce3467cb9e77d6a4e61b04.tar.gz celevator-c3d04606a3b4da5181ce3467cb9e77d6a4e61b04.tar.bz2 celevator-c3d04606a3b4da5181ce3467cb9e77d6a4e61b04.tar.xz celevator-c3d04606a3b4da5181ce3467cb9e77d6a4e61b04.zip |
Initial dispatcher work (not yet functional)
Diffstat (limited to 'dispatcherfw.lua')
-rw-r--r-- | dispatcherfw.lua | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/dispatcherfw.lua b/dispatcherfw.lua new file mode 100644 index 0000000..15650df --- /dev/null +++ b/dispatcherfw.lua @@ -0,0 +1,281 @@ +local pos,event,mem = ... + +local changedinterrupts = {} + +local function interrupt(time,iid) + mem.interrupts[iid] = time + changedinterrupts[iid] = true +end + +mem.messages = {} + +local function send(carid,channel,message) + table.insert(mem.messages,{ + carid = carid, + channel = channel, + message = message, + }) +end + +mem.formspec = "" + +local function fs(element) + mem.formspec = mem.formspec..element +end + +if event.type == "program" then + mem.carstatus = {} + mem.screenstate = "oobe_welcome" + mem.editingfloor = 1 + mem.screenpage = 1 + mem.editingconnection = 1 + mem.newconncarid = 0 + if not mem.params then + mem.params = { + carids = {}, + floorheights = {5,5,5}, + floornames = {"1","2","3"}, + floorsserved = {}, + } + end +elseif event.type == "ui" then + local fields = event.fields + if mem.screenstate == "oobe_welcome" then + if fields.license then + mem.screenstate = "oobe_license" + elseif fields.next then + mem.screenstate = "oobe_floortable" + end + elseif mem.screenstate == "oobe_license" then + if fields.back then + mem.screenstate = "oobe_welcome" + end + elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" then + local exp = event.fields.floor and minetest.explode_textlist_event(event.fields.floor) or {} + if event.fields.back then + mem.screenstate = "oobe_welcome" + elseif event.fields.next then + mem.screenstate = (mem.screenstate == "oobe_floortable" and "oobe_connections" or "parameters") + mem.screenpage = 1 + elseif exp.type == "CHG" then + mem.editingfloor = #mem.params.floornames-exp.index+1 + elseif exp.type == "DCL" then + mem.editingfloor = #mem.params.floornames-exp.index+1 + mem.screenstate = (mem.screenstate == "oobe_floortable" and "oobe_floortable_edit" or "floortable_edit") + elseif event.fields.edit then + mem.screenstate = (mem.screenstate == "oobe_floortable" and "oobe_floortable_edit" or "floortable_edit") + elseif event.fields.add then + table.insert(mem.params.floorheights,5) + table.insert(mem.params.floornames,tostring(#mem.params.floornames+1)) + elseif event.fields.remove then + table.remove(mem.params.floorheights,mem.editingfloor) + table.remove(mem.params.floornames,mem.editingfloor) + mem.editingfloor = math.max(1,mem.editingfloor-1) + elseif event.fields.moveup then + local height = mem.params.floorheights[mem.editingfloor] + local name = mem.params.floornames[mem.editingfloor] + table.remove(mem.params.floorheights,mem.editingfloor) + table.remove(mem.params.floornames,mem.editingfloor) + table.insert(mem.params.floorheights,mem.editingfloor+1,height) + table.insert(mem.params.floornames,mem.editingfloor+1,name) + mem.editingfloor = mem.editingfloor + 1 + elseif event.fields.movedown then + local height = mem.params.floorheights[mem.editingfloor] + local name = mem.params.floornames[mem.editingfloor] + table.remove(mem.params.floorheights,mem.editingfloor) + table.remove(mem.params.floornames,mem.editingfloor) + table.insert(mem.params.floorheights,mem.editingfloor-1,height) + table.insert(mem.params.floornames,mem.editingfloor-1,name) + mem.editingfloor = mem.editingfloor - 1 + end + elseif mem.screenstate == "oobe_floortable_edit" or mem.screenstate == "floortable_edit" then + if event.fields.back or event.fields.save then + mem.screenstate = (mem.screenstate == "oobe_floortable_edit" and "oobe_floortable" or "floortable") + local height = tonumber(event.fields.height) + if height then + height = math.floor(height+0.5) + mem.params.floorheights[mem.editingfloor] = math.max(0,height) + end + mem.params.floornames[mem.editingfloor] = string.sub(event.fields.name,1,256) + end + elseif mem.screenstate == "oobe_connections" or mem.screenstate == "connections" then + local exp = event.fields.connection and minetest.explode_textlist_event(event.fields.connection) or {} + if event.fields.back then + mem.screenstate = "oobe_floortable" + elseif event.fields.next and #mem.params.carids > 0 then + mem.screenstate = (mem.screenstate == "oobe_connections" and "status" or "parameters") + mem.screenpage = 1 + elseif exp.type == "CHG" then + mem.editingconnection = #mem.params.carids-exp.index+1 + elseif exp.type == "DCL" then + mem.editingconnection = #mem.params.carids-exp.index+1 + mem.screenstate = (mem.screenstate == "oobe_connections" and "oobe_connection" or "connection") + elseif event.fields.edit then + mem.screenstate = (mem.screenstate == "oobe_connections" and "oobe_connection" or "connection") + elseif event.fields.add then + mem.newconnfloors = {} + for i in ipairs(mem.params.floornames) do + mem.newconnfloors[i] = true + end + mem.screenstate = (mem.screenstate == "oobe_connections" and "oobe_newconnection" or "newconnection") + elseif event.fields.remove then + mem.carstatus[mem.params.carids[mem.editingconnection]] = nil + table.remove(mem.params.carids,mem.editingconnection) + mem.editingconnection = math.max(1,mem.editingconnection-1) + end + elseif mem.screenstate == "oobe_newconnection" or mem.screenstate == "newconnection" then + local exp = event.fields.floors and minetest.explode_textlist_event(event.fields.floors) or {} + if event.fields.back then + mem.screenstate = (mem.screenstate == "oobe_newconnection" and "oobe_connections" or "connections") + elseif event.fields.connect and fields.carid and tonumber(fields.carid) then + mem.screenstate = (mem.screenstate == "oobe_newconnection" and "oobe_connecting" or "connecting") + local floornames = {} + local floorheights = {} + for i=1,#mem.params.floornames,1 do + if mem.newconnfloors[i] then + table.insert(floornames,mem.params.floornames[i]) + table.insert(floorheights,mem.params.floorheights[i]) + elseif #floornames > 0 then + floorheights[#floorheights] = floorheights[#floorheights]+mem.params.floorheights[i] + end + end + send(tonumber(fields.carid),"pairrequest",{ + dispatcherid = mem.carid, + floornames = floornames, + floorheights = floorheights, + }) + interrupt(3,"connecttimeout") + elseif exp.type == "CHG" then + local floor = #mem.params.floornames-exp.index+1 + mem.newconnfloors[floor] = not mem.newconnfloors[floor] + end + elseif mem.screenstate == "oobe_connectionfailed" or mem.screenstate == "connectionfailed" then + if fields.back then + mem.screenstate = (mem.screenstate == "oobe_connectionfailed" and "oobe_newconnection" or "newconnection") + end + end +elseif event.iid == "connecttimeout" then + if mem.screenstate == "oobe_connecting" then + mem.screenstate = "oobe_connectionfailed" + elseif mem.screenstate == "connecting" then + mem.screenstate = "connectionfailed" + end +elseif event.channel == "pairok" then + if mem.screenstate == "oobe_connecting" or mem.screenstate == "connecting" then + interrupt(nil,"connecttimeout") + mem.screenstate = (mem.screenstate == "oobe_connecting" and "oobe_connections" or "connections") + mem.carstatus[event.source] = { + upcalls = {}, + dncalls = {}, + carcalls = {}, + position = event.msg.drive.status.apos or 0, + state = event.msg.carstate, + } + mem.params.floorsserved[event.source] = mem.newconnfloors + table.insert(mem.params.carids,event.source) + end +end + +fs("formspec_version[6]") +fs("size[16,12]") +fs("background9[0,0;16,12;celevator_fs_bg.png;true;3]") + +if mem.screenstate == "oobe_welcome" then + fs("image[6,1;4,2;celevator_logo.png]") + fs("label[1,4;Welcome to your new MTronic XT elevator dispatcher!]") + fs("label[1,4.5;Before continuing, make sure you have at least two controllers in group operation mode and ready to connect.]") + fs("label[1,5.5;Press Next to begin.]") + fs("button[1,10;2,1;license;License Info]") + fs("button[13,10;2,1;next;Next >]") +elseif mem.screenstate == "oobe_license" then + local licensefile = io.open(minetest.get_modpath("celevator")..DIR_DELIM.."COPYING") + local license = minetest.formspec_escape(licensefile:read("*all")) + licensefile:close() + fs("textarea[1,1;14,8;license;This applies to the whole celevator mod\\, not just this dispatcher:;"..license.."]") + fs("button[7,10.5;2,1;back;OK]") +elseif mem.screenstate == "oobe_floortable" or mem.screenstate == "floortable" then + if mem.screenstate == "oobe_floortable" then + fs("label[1,1;Enter details of all floors this group will serve, then press Next.]") + fs("label[1,1.3;Include all floors served by any car in the group, even if not served by all cars.]") + fs("button[1,10;2,1;back;< Back]") + fs("button[13,10;2,1;next;Next >]") + else + fs("label[1,1;EDIT FLOOR TABLE]") + fs("button[1,10;2,1;next;Done]") + end + fs("textlist[1,2;6,7;floor;") + for i=#mem.params.floornames,1,-1 do + fs(minetest.formspec_escape(string.format("%d - Height: %d - PI: %s",i,mem.params.floorheights[i],mem.params.floornames[i]))..(i==1 and "" or ",")) + end + fs(";"..tostring(#mem.params.floornames-mem.editingfloor+1)..";false]") + if #mem.params.floornames < 100 then fs("button[8,2;2,1;add;New Floor]") end + fs("button[8,3.5;2,1;edit;Edit Floor]") + if #mem.params.floornames > 2 then fs("button[8,5;2,1;remove;Remove Floor]") end + if mem.editingfloor < #mem.params.floornames then fs("button[8,6.5;2,1;moveup;Move Up]") end + if mem.editingfloor > 1 then fs("button[8,8;2,1;movedown;Move Down") end +elseif mem.screenstate == "oobe_floortable_edit" or mem.screenstate == "floortable_edit" then + if mem.screenstate == "oobe_floortable_edit" then + fs("button[7,10.5;2,1;back;OK]") + fs("label[1,5;The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.]") + fs("label[1,5.5;(not used at the highest floor)]") + fs("label[1,6.5;The Floor Name is how the floor will be displayed on the position indicators.]") + else + fs("button[7,10.5;2,1;save;Save]") + end + fs("label[1,1;Editing floor "..tostring(mem.editingfloor).."]") + fs("field[1,3;3,1;height;Floor Height;"..tostring(mem.params.floorheights[mem.editingfloor]).."]") + fs("field[5,3;3,1;name;Floor Name;"..minetest.formspec_escape(mem.params.floornames[mem.editingfloor]).."]") +elseif mem.screenstate == "oobe_connections" or mem.screenstate == "connections" then + if mem.screenstate == "oobe_connections" then + fs("label[1,1;Connect to each car in the group, then click Done.]") + fs("button[1,10;2,1;back;< Back]") + if #mem.params.carids > 0 then fs("button[13,10;2,1;next;Done >]") end + else + fs("label[1,1;EDIT CONNECTIONS]") + if #mem.params.carids > 0 then fs("button[1,10;2,1;next;Done]") end + end + if #mem.params.carids > 0 then + fs("textlist[1,2;6,7;connection;") + for i=#mem.params.carids,1,-1 do + fs(string.format("Car %d - ID #%d",i,mem.params.carids[i])..(i==1 and "" or ",")) + end + fs(";"..tostring(#mem.params.floornames-mem.editingfloor+1)..";false]") + else + fs("label[1,2;No Connections]") + end + if #mem.params.carids < 16 then fs("button[8,2;2,1;add;New Connection]") end + if #mem.params.carids > 0 then fs("button[8,3.5;2,1;edit;Edit Connection]") end + if #mem.params.carids > 0 then fs("button[8,5;2,1;remove;Remove Connection]") end +elseif mem.screenstate == "oobe_newconnection" or mem.screenstate == "newconnection" then + local numfloors = 0 + for _,v in ipairs(mem.newconnfloors) do + if v then numfloors = numfloors + 1 end + end + if mem.screenstate == "oobe_newconnection" then + fs("label[1,1;Enter the car ID and select the floors served (click them to toggle), then click Connect.]") + fs("label[1,1.3;You must select at least two floors.]") + fs("button[1,10;2,1;back;< Back]") + if numfloors >= 2 then fs("button[13,10;2,1;connect;Connect >]") end + else + fs("label[1,1;NEW CONNECTION]") + fs("button[1,10;2,1;back;< Back]") + if numfloors >= 2 then fs("button[13,10;2,1;connect;Connect >]") end + end + fs("textlist[8,2;6,7;floors;") + for i=#mem.params.floornames,1,-1 do + fs(string.format("%s - %s",minetest.formspec_escape(mem.params.floornames[i]),mem.newconnfloors[i] and "YES" or "NO")..(i==1 and "" or ",")) + end + fs(";0;false]") + fs("field[2,3;4,1;carid;Car ID;]") +elseif mem.screenstate == "oobe_connecting" or mem.screenstate == "connecting" then + fs("label[1,1;Connecting to controller...]") +elseif mem.screenstate == "oobe_connectionfailed" or mem.screenstate == "connectionfailed" then + fs("label[4,4;Connection timed out!]") + fs("label[4,5;Make sure the car ID is correct and]") + fs("label[4,5.5;that the controller is ready to pair.]") + fs("button[1,10;2,1;back;< Back]") +end + +mem.infotext = string.format("ID: %d",mem.carid) + +return pos,mem,changedinterrupts |