View difference between Paste ID: rKn9pYLi and mBmqA162
SHOW: | | - or go back to the newest paste.
1
local component = require("component")
2
local internet = require("internet")
3
local term = require ("term")
4
local json = require("json")
5
local serial = require("serialization")
6
local fs = require("filesystem")
7
local AllEntities = component.world_link.getLoadedEntities()
8
local entity = component.entity_link.getAPI("immersiverailroading:locomotivediesel")
9
local CONFIG_FILE = "/home/EngineCMDs.dat"
10
local DEFAULT_CONFIG = {}
11
local TcpIP = "84.65.32.30"
12
local TcpSendPort = 6667
13
local TcpRecvPort = 6667
14
local wait = 0.1
15
16
local modem = component.modem
17
local stocktypes = {
18
    "immersiverailroading:locomotivediesel",
19
    "immersiverailroading:locomotivesteam"
20
	}
21
22
function overArray()
23
    local b = {}
24-
    for i0, typeX in pairs(stocktypes) do
24+
25-
        AllofType = AllEntities.whereProperty("name", typeX).asList()
25+
    if entity ~= nil then
26-
        if AllofType ~= nil then
26+
        rollingstock = entity
27-
            for i1, entity in pairs(AllofType) do
27+
        local posit_array = {}
28-
                rollingstock = entity.getAPI("immersiverailroading:locomotive")
28+
        local a = {}
29-
                local posit_array = {}
29+
        uuid = rollingstock.getUUID()
30-
                local a = {}
30+
        position = rollingstock.getLocation()
31-
                uuid = rollingstock.getUUID()
31+
        xpos = position.getX()
32-
                position = rollingstock.getLocation()
32+
        ypos = position.getY()
33-
                xpos = position.getX()
33+
        zpos = position.getZ()
34-
                ypos = position.getY()
34+
        speed = rollingstock.getCurrentSpeed()
35-
                zpos = position.getZ()
35+
        if locotable[uuid] == nil then
36-
                speed = rollingstock.getCurrentSpeed()
36+
            setspeed = 0
37-
                if locotable[uuid] == nil then
37+
            method = "Manual"
38-
                    setspeed = 0
38+
        else
39-
                    method = "Manual"
39+
            setspeed = locotable[uuid].setspeed
40-
                    else
40+
            method = locotable[uuid].method
41-
                    setspeed = locotable[uuid].setspeed
41+
42-
                    method = locotable[uuid].method
42+
        tag = "" -- add later
43-
                	end
43+
        c = {["x"] = xpos, ["y"] = ypos, ["z"] = zpos}
44-
                tag = "" -- add later
44+
        a = {}
45-
                c = {["x"] = xpos, ["y"] = ypos, ["z"] = zpos}
45+
        a["uuid"] = uuid
46-
                a = {}
46+
        a["speed"] = speed
47-
                a["uuid"] = uuid
47+
        a["setspeed"] = setspeed
48-
                a["speed"] = speed
48+
        a["method"] = method
49-
                a["setspeed"] = setspeed
49+
        a["posit_array"] = c
50-
                a["method"] = method
50+
        a["name"] = rollingstock.getName()
51-
                a["posit_array"] = c
51+
        a["tag"] = "" --rollingstock.getTag()
52-
                a["name"] = rollingstock.getName()
52+
        table.insert(b,1,a)	
53-
                a["tag"] = "" --rollingstock.getTag()
53+
54-
                table.insert(b,1,a)	
54+
55
	if data ~= "" then
56
		con:write("#01,"..data.."\r\n")
57
        con:flush()
58
		end
59
end
60
61
function recvtcp()
62
    data = nil
63
    local decoded = nil
64
    local b = {}
65
    if (con) then 
66
        index = con:read(10)
67
        length = tonumber(index)
68
        data = con:read(length)
69
        if data ~= nil then
70
            decoded = json:decode(data)
71
			a = {}
72
            for i, v in pairs(decoded) do
73
                uuid = v.uuid
74
                v.uuid = nil
75
                a[uuid] = v
76
                end
77
            end
78
        end
79
    if a == {} then
80
        a = nil
81
        end
82
    return a
83
end
84
85
function parseResponse(data)
86
    for uuid, d in pairs(data) do
87
    	locotable[uuid] = d
88
        end
89
end
90
91
function changeloco(data)
92
    for i, loco in pairs(data) do
93
        tag = loco.tag
94
        method = loco.method
95
        horn = loco.horn
96
        setspeed = loco.setspeed
97
        uuid = loco.uuid
98
        a = AllEntities.whereProperty("uuid", uuid).asList()
99
        b = a[1]
100
        c = b.getAPI("immersiverailroading:locomotive")
101
        c.setTag(loco.tag)
102
        print(uuid, tag, method, horn, setspeed)
103
        end
104
    end
105
106
function saveConfig(file, cfg)
107
  local f = io.open(file, "w")
108
  if f == nil then error("Couldn't open " .. file .. " to write config.") end
109
  f:write(serial.serialize(cfg, 100000))
110
  f:close()
111
  --print("Saved to file")
112
end
113
 
114
function loadConfig()
115
  local f = io.open(CONFIG_FILE, "r")
116
  if f == nil then 
117
    print("Could not open " .. CONFIG_FILE .. ".")
118
    print("Loading default config")
119
    return DEFAULT_CONFIG
120
    else
121
    local config = serial.unserialize(f:read("*a"))
122
    f:close()
123
    return config
124
    end
125
end
126
127
local function broadcast(msg)
128
	print("broadcasting table")
129
  modem.broadcast(54421, serial.serialize({t = "STATUS",v = msg})) 
130
end
131
132
-- Main loop --
133
134
con = internet.open(TcpIP,TcpSendPort)
135
modem.open(54421)   
136
while true do
137
    if (con) then
138
        locotable = loadConfig()
139
        overArray()
140
        response = recvtcp()
141
        end
142
    if response ~= nil then
143
        parseResponse(response)
144
        saveConfig(CONFIG_FILE, locotable)
145
        end
146
    broadcast(locotable) 
147
    os.sleep(wait)
148
end
149
modem.close(54421)