summaryrefslogtreecommitdiff
path: root/dispatcherfw.lua
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2024-04-19 11:24:33 -0500
committercheapie <no-email-for-you@example.com>2024-04-19 11:24:33 -0500
commitc3d04606a3b4da5181ce3467cb9e77d6a4e61b04 (patch)
tree15c8277c9a9ed0bddf2f419d24a93bcdc74ad19d /dispatcherfw.lua
parent52821fcc17d7b17c5bb9f6ccbb1c13cbdddf71b2 (diff)
downloadcelevator-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.lua281
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