Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MVZ = {
- FRONT_CHILD_NAME = "PozPH",
- REAR_CHILD_NAME = "PozZH",
- DISTANCE_TRIGGER = 10,
- --PUBLIC
- MESSAGE_IDS = {
- [800800] = true,
- [800801] = true,
- [800802] = true
- },
- output = {
- X1 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- },
- X2 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- },
- X3 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- },
- --PRIVATE
- BCD = {
- X1 = 0,
- X2 = 0,
- X3 = 0,
- X1last = 0,
- X2last = 0,
- X3last = 0
- }
- },
- input = {
- X1 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- },
- X2 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- },
- X3 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- },
- --PRIVATE
- table = {}
- },
- behind = false,
- ahead = false,
- Update = function(self)
- if self.consistChanged then
- self:_ConsistChanged()
- self.consistChanged = false
- end
- self.output.BCD.X1 = self:EncodeBCD(self.output.X1)
- self.output.BCD.X2 = self:EncodeBCD(self.output.X2)
- self.output.BCD.X3 = self:EncodeBCD(self.output.X3)
- if self.output.BCD.X1 ~= self.output.BCD.X1last then
- self:SendState("X1", self.output.BCD.X1)
- self.output.BCD.X1last = self.output.BCD.X1
- end
- if self.output.BCD.X2 ~= self.output.BCD.X2last then
- self:SendState("X2", self.output.BCD.X2)
- self.output.BCD.X2last = self.output.BCD.X2
- end
- if self.output.BCD.X3 ~= self.output.BCD.X3last then
- self:SendState("X3", self.output.BCD.X3)
- self.output.BCD.X3last = self.output.BCD.X3
- end
- self:ResetInputSum()
- for x=1,3 do
- for i=1,10 do
- for _,v in pairs(self.input.table) do
- if x > 2.5 then
- if v.X3[i] then
- self.input.X3[i] = true
- break
- end
- elseif x > 1.5 then
- if v.X2[i] then
- self.input.X2[i] = true
- break
- end
- else
- if v.X1[i] then
- self.input.X1[i] = true
- break
- end
- end
- end
- end
- end
- end,
- OnConsistChange = function(self)
- self.consistChanged = true
- end,
- OnMessageReceive = function(self, id, value, dir)
- if id == 800800 then
- self:ResetValues()
- remoteLoc = self:Split(value,":")
- childName = self.REAR_CHILD_NAME
- if dir > 0.5 then
- childName = self.FRONT_CHILD_NAME
- end
- x, _, y = Call(childName..":getNearPosition")
- if math.sqrt((x-tonumber(remoteLoc[1]))^2 + (y-tonumber(remoteLoc[2]))^2) < self.DISTANCE_TRIGGER then
- if dir > 0.5 then
- self.ahead = true
- xz, _, yz = Call(self.REAR_CHILD_NAME..":getNearPosition")
- Call("SendConsistMessage",800800,xz..":"..yz,1)
- Call("SendConsistMessage",800801,"TRUE",0)
- else
- xp, _, yp = Call(self.FRONT_CHILD_NAME..":getNearPosition")
- Call("SendConsistMessage",800800,xp..":"..yp,0)
- Call("SendConsistMessage",800801,"TRUE",1)
- self.behind = true
- end
- self.remoteConsistChange = true
- else
- if dir > 0.5 then
- self.ahead = false
- else
- self.behind = false
- end
- Call("SendConsistMessage",800801,"FALSE",1-dir)
- end
- elseif id == 800801 then
- if value == "TRUE" then
- if dir > 0.5 then
- self.ahead = true
- else
- self.behind = true
- end
- else
- if dir > 0.5 then
- self.ahead = false
- else
- self.behind = false
- end
- end
- elseif id == 800802 then
- self:ParseMessage(value, dir)
- if dir > 0.5 then
- if self.behind then
- Call("SendConsistMessage",800802,value,1)
- end
- elseif self.ahead then
- Call("SendConsistMessage",800802,value,0)
- end
- end
- end,
- IsMVZMessage = function(self, id, value, dir)
- if (self.MESSAGE_IDS[id]) then
- self:OnMessageReceive(id, value, dir)
- return true;
- end
- return false;
- end,
- --PRIVATE
- remoteConsistChange = false,
- consistChanged = true,
- uniqueID = "",
- ResetInputSum = function(self)
- self.input.X1 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- }
- self.input.X2 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- }
- self.input.X3 = {
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- }
- end,
- ResetValues = function(self)
- self:ResetInputSum()
- self.input.table = {}
- end,
- _ConsistChanged = function(self)
- self.uniqueID = Call("GetRVNumber")
- if not self.remoteConsistChange then
- self:ResetValues()
- xp, _, yp = Call(self.FRONT_CHILD_NAME..":getNearPosition")
- xz, _, yz = Call(self.REAR_CHILD_NAME..":getNearPosition")
- self.behind = false
- self.ahead = false
- Call("SendConsistMessage",800800,xp..":"..yp,0)
- Call("SendConsistMessage",800800,xz..":"..yz,1)
- end
- self.output.BCD.X1last = -1
- self.output.BCD.X2last = -1
- self.output.BCD.X3last = -1
- self.remoteConsistChange = false
- end,
- DecodeBCD = function(self, bcd)
- exp = 9
- num = 2^exp
- otable = {}
- while bcd > 0 do
- if num > bcd then
- otable[exp+1] = false
- else
- otable[exp+1] = true
- bcd = bcd - num
- end
- exp = exp - 1
- num = 2^exp
- end
- return otable
- end,
- EncodeBCD = function(self, itable)
- bcd = 0
- for i,v in pairs(itable) do
- if v then
- bcd = bcd + 2^(i-1)
- end
- end
- return bcd
- end,
- SendState = function(self, conn_id, conn_bcd)
- if self.ahead then
- out = conn_bcd
- if conn_id == "X2" then
- out = self:EncodeBCD(self:SwapWires(self.output.X2))
- end
- Call("SendConsistMessage",800802,self.uniqueID..":"..conn_id..":"..out,0)
- end
- if self.behind then
- Call("SendConsistMessage",800802,self.uniqueID..":"..conn_id..":"..conn_bcd,1)
- end
- end,
- Split = function(self, s, delimiter)
- local result = { }
- local from = 1
- local delim_from, delim_to = string.find( s, delimiter, from )
- while delim_from do
- table.insert( result, string.sub( s, from , delim_from-1 ) )
- from = delim_to + 1
- delim_from, delim_to = string.find( s, delimiter, from )
- end
- table.insert( result, string.sub( s, from ) )
- return result
- end,
- ParseMessage = function(self, data, dir)
- receivedData = self:Split(data, ":")
- if not self.input.table[receivedData[1]] then
- self.input.table[receivedData[1]] = {}
- end
- if receivedData[2] == "X1" then
- self.input.table[receivedData[1]].X1 = self:DecodeBCD(tonumber(receivedData[3]))
- elseif receivedData[2] == "X2" then
- --self.input.table[receivedData[1]].X2 = self:DecodeBCD(tonumber(receivedData[3]))
- if dir < 0.5 then
- self.input.table[receivedData[1]].X2 = self:SwapWires(self:DecodeBCD(tonumber(receivedData[3])))
- else
- self.input.table[receivedData[1]].X2 = self:DecodeBCD(tonumber(receivedData[3]))
- end
- elseif receivedData[2] == "X3" then
- self.input.table[receivedData[1]].X3 = self:DecodeBCD(tonumber(receivedData[3]))
- end
- end,
- CopyTable = function(self, tSource)
- tCopy = {}
- for k,v in pairs(tSource) do
- tCopy[k] = v
- end
- return tCopy
- end,
- SwapWires = function(self, tSource)
- tCopy = self:CopyTable(tSource)
- _5 = tCopy[5]
- _7 = tCopy[7]
- tCopy[5] = tCopy[6]
- tCopy[6] = _5
- tCopy[7] = tCopy[8]
- tCopy[8] = _7
- return tCopy
- end
- }
Add Comment
Please, Sign In to add comment