JachyHm

Mezivozová zásuvka

Mar 1st, 2021 (edited)
992
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.77 KB | None | 0 0
  1. MVZ = {
  2.     FRONT_CHILD_NAME = "PozPH",
  3.     REAR_CHILD_NAME = "PozZH",
  4.     DISTANCE_TRIGGER = 10,
  5.     --PUBLIC
  6.         MESSAGE_IDS = {
  7.             [800800] = true,
  8.             [800801] = true,
  9.             [800802] = true
  10.         },
  11.         output = {
  12.             X1 = {
  13.                 false,
  14.                 false,
  15.                 false,
  16.                 false,
  17.                 false,
  18.                 false,
  19.                 false,
  20.                 false,
  21.                 false,
  22.                 false
  23.             },
  24.             X2 = {
  25.                 false,
  26.                 false,
  27.                 false,
  28.                 false,
  29.                 false,
  30.                 false,
  31.                 false,
  32.                 false,
  33.                 false,
  34.                 false
  35.             },
  36.             X3 = {
  37.                 false,
  38.                 false,
  39.                 false,
  40.                 false,
  41.                 false,
  42.                 false,
  43.                 false,
  44.                 false,
  45.                 false,
  46.                 false
  47.             },
  48.             --PRIVATE
  49.                 BCD = {
  50.                     X1 = 0,
  51.                     X2 = 0,
  52.                     X3 = 0,
  53.                     X1last = 0,
  54.                     X2last = 0,
  55.                     X3last = 0
  56.                 }
  57.         },
  58.         input = {
  59.             X1 = {
  60.                 false,
  61.                 false,
  62.                 false,
  63.                 false,
  64.                 false,
  65.                 false,
  66.                 false,
  67.                 false,
  68.                 false,
  69.                 false
  70.             },
  71.             X2 = {
  72.                 false,
  73.                 false,
  74.                 false,
  75.                 false,
  76.                 false,
  77.                 false,
  78.                 false,
  79.                 false,
  80.                 false,
  81.                 false
  82.             },
  83.             X3 = {
  84.                 false,
  85.                 false,
  86.                 false,
  87.                 false,
  88.                 false,
  89.                 false,
  90.                 false,
  91.                 false,
  92.                 false,
  93.                 false
  94.             },
  95.             --PRIVATE
  96.                 table = {}
  97.         },
  98.         behind = false,
  99.         ahead = false,
  100.         Update = function(self)
  101.             if self.consistChanged then
  102.                 self:_ConsistChanged()
  103.                 self.consistChanged = false
  104.             end
  105.             self.output.BCD.X1 = self:EncodeBCD(self.output.X1)
  106.             self.output.BCD.X2 = self:EncodeBCD(self.output.X2)
  107.             self.output.BCD.X3 = self:EncodeBCD(self.output.X3)
  108.  
  109.             if self.output.BCD.X1 ~= self.output.BCD.X1last then
  110.                 self:SendState("X1", self.output.BCD.X1)
  111.                 self.output.BCD.X1last = self.output.BCD.X1
  112.             end
  113.  
  114.             if self.output.BCD.X2 ~= self.output.BCD.X2last then
  115.                 self:SendState("X2", self.output.BCD.X2)
  116.                 self.output.BCD.X2last = self.output.BCD.X2
  117.             end
  118.  
  119.             if self.output.BCD.X3 ~= self.output.BCD.X3last then
  120.                 self:SendState("X3", self.output.BCD.X3)
  121.                 self.output.BCD.X3last = self.output.BCD.X3
  122.             end
  123.  
  124.             self:ResetInputSum()
  125.             for x=1,3 do
  126.                 for i=1,10 do
  127.                     for _,v in pairs(self.input.table) do
  128.                         if x > 2.5 then
  129.                             if v.X3[i] then
  130.                                 self.input.X3[i] = true
  131.                                 break
  132.                             end
  133.                         elseif x > 1.5 then
  134.                             if v.X2[i] then
  135.                                 self.input.X2[i] = true
  136.                                 break
  137.                             end
  138.                         else
  139.                             if v.X1[i] then
  140.                                 self.input.X1[i] = true
  141.                                 break
  142.                             end
  143.                         end
  144.                     end
  145.                 end
  146.             end
  147.         end,
  148.         OnConsistChange = function(self)
  149.             self.consistChanged = true
  150.         end,
  151.         OnMessageReceive = function(self, id, value, dir)
  152.             if id == 800800 then
  153.                 self:ResetValues()
  154.                 remoteLoc = self:Split(value,":")
  155.                 childName = self.REAR_CHILD_NAME
  156.                 if dir > 0.5 then
  157.                     childName = self.FRONT_CHILD_NAME
  158.                 end
  159.                 x, _, y = Call(childName..":getNearPosition")
  160.                 if math.sqrt((x-tonumber(remoteLoc[1]))^2 + (y-tonumber(remoteLoc[2]))^2) < self.DISTANCE_TRIGGER then
  161.                     if dir > 0.5 then
  162.                         self.ahead = true
  163.                         xz, _, yz = Call(self.REAR_CHILD_NAME..":getNearPosition")
  164.                         Call("SendConsistMessage",800800,xz..":"..yz,1)
  165.                         Call("SendConsistMessage",800801,"TRUE",0)
  166.                     else
  167.                         xp, _, yp = Call(self.FRONT_CHILD_NAME..":getNearPosition")
  168.                         Call("SendConsistMessage",800800,xp..":"..yp,0)
  169.                         Call("SendConsistMessage",800801,"TRUE",1)
  170.                         self.behind = true
  171.                     end
  172.                     self.remoteConsistChange = true
  173.                 else
  174.                     if dir > 0.5 then
  175.                         self.ahead = false
  176.                     else
  177.                         self.behind = false
  178.                     end
  179.                     Call("SendConsistMessage",800801,"FALSE",1-dir)
  180.                 end
  181.             elseif id == 800801 then
  182.                 if value == "TRUE" then
  183.                     if dir > 0.5 then
  184.                         self.ahead = true
  185.                     else
  186.                         self.behind = true
  187.                     end
  188.                 else
  189.                     if dir > 0.5 then
  190.                         self.ahead = false
  191.                     else
  192.                         self.behind = false
  193.                     end
  194.                 end
  195.             elseif id == 800802 then
  196.                 self:ParseMessage(value, dir)
  197.                 if dir > 0.5 then
  198.                     if self.behind then
  199.                         Call("SendConsistMessage",800802,value,1)
  200.                     end
  201.                 elseif self.ahead then
  202.                     Call("SendConsistMessage",800802,value,0)
  203.                 end
  204.             end
  205.         end,
  206.         IsMVZMessage = function(self, id, value, dir)
  207.             if (self.MESSAGE_IDS[id]) then
  208.                 self:OnMessageReceive(id, value, dir)
  209.                 return true;
  210.             end
  211.             return false;
  212.         end,
  213.     --PRIVATE
  214.         remoteConsistChange = false,
  215.         consistChanged = true,
  216.         uniqueID = "",
  217.         ResetInputSum = function(self)
  218.             self.input.X1 = {
  219.                 false,
  220.                 false,
  221.                 false,
  222.                 false,
  223.                 false,
  224.                 false,
  225.                 false,
  226.                 false,
  227.                 false,
  228.                 false
  229.             }
  230.             self.input.X2 = {
  231.                 false,
  232.                 false,
  233.                 false,
  234.                 false,
  235.                 false,
  236.                 false,
  237.                 false,
  238.                 false,
  239.                 false,
  240.                 false
  241.             }
  242.             self.input.X3 = {
  243.                 false,
  244.                 false,
  245.                 false,
  246.                 false,
  247.                 false,
  248.                 false,
  249.                 false,
  250.                 false,
  251.                 false,
  252.                 false
  253.             }
  254.         end,
  255.         ResetValues = function(self)
  256.             self:ResetInputSum()
  257.             self.input.table = {}
  258.         end,
  259.         _ConsistChanged = function(self)
  260.             self.uniqueID = Call("GetRVNumber")
  261.             if not self.remoteConsistChange then
  262.                 self:ResetValues()
  263.                 xp, _, yp = Call(self.FRONT_CHILD_NAME..":getNearPosition")
  264.                 xz, _, yz = Call(self.REAR_CHILD_NAME..":getNearPosition")
  265.                 self.behind = false
  266.                 self.ahead = false
  267.                 Call("SendConsistMessage",800800,xp..":"..yp,0)
  268.                 Call("SendConsistMessage",800800,xz..":"..yz,1)
  269.             end
  270.             self.output.BCD.X1last = -1
  271.             self.output.BCD.X2last = -1
  272.             self.output.BCD.X3last = -1
  273.             self.remoteConsistChange = false
  274.         end,
  275.         DecodeBCD = function(self, bcd)
  276.             exp = 9
  277.             num = 2^exp
  278.             otable = {}
  279.             while bcd > 0 do
  280.                 if num > bcd then
  281.                     otable[exp+1] = false
  282.                 else
  283.                     otable[exp+1] = true
  284.                     bcd = bcd - num
  285.                 end
  286.                 exp = exp - 1
  287.                 num = 2^exp
  288.             end
  289.             return otable
  290.         end,
  291.         EncodeBCD = function(self, itable)
  292.             bcd = 0
  293.             for i,v in pairs(itable) do
  294.                 if v then
  295.                     bcd = bcd + 2^(i-1)
  296.                 end
  297.             end
  298.             return bcd
  299.         end,
  300.         SendState = function(self, conn_id, conn_bcd)
  301.             if self.ahead then
  302.                 out = conn_bcd
  303.                 if conn_id == "X2" then
  304.                     out = self:EncodeBCD(self:SwapWires(self.output.X2))
  305.                 end
  306.                 Call("SendConsistMessage",800802,self.uniqueID..":"..conn_id..":"..out,0)
  307.             end
  308.             if self.behind then
  309.                 Call("SendConsistMessage",800802,self.uniqueID..":"..conn_id..":"..conn_bcd,1)
  310.             end
  311.         end,
  312.         Split = function(self, s, delimiter)
  313.             local result = { }
  314.             local from  = 1
  315.             local delim_from, delim_to = string.find( s, delimiter, from  )
  316.             while delim_from do
  317.                 table.insert( result, string.sub( s, from , delim_from-1 ) )
  318.                 from  = delim_to + 1
  319.                 delim_from, delim_to = string.find( s, delimiter, from  )
  320.             end
  321.             table.insert( result, string.sub( s, from  ) )
  322.             return result
  323.         end,
  324.         ParseMessage = function(self, data, dir)
  325.             receivedData = self:Split(data, ":")
  326.             if not self.input.table[receivedData[1]] then
  327.                 self.input.table[receivedData[1]] = {}
  328.             end
  329.             if receivedData[2] == "X1" then
  330.                 self.input.table[receivedData[1]].X1 = self:DecodeBCD(tonumber(receivedData[3]))
  331.             elseif receivedData[2] == "X2" then
  332.                 --self.input.table[receivedData[1]].X2 = self:DecodeBCD(tonumber(receivedData[3]))
  333.                 if dir < 0.5 then
  334.                     self.input.table[receivedData[1]].X2 = self:SwapWires(self:DecodeBCD(tonumber(receivedData[3])))
  335.                 else
  336.                     self.input.table[receivedData[1]].X2 = self:DecodeBCD(tonumber(receivedData[3]))
  337.                 end
  338.             elseif receivedData[2] == "X3" then
  339.                 self.input.table[receivedData[1]].X3 = self:DecodeBCD(tonumber(receivedData[3]))
  340.             end
  341.         end,
  342.         CopyTable = function(self, tSource)
  343.             tCopy = {}
  344.  
  345.             for k,v in pairs(tSource) do
  346.                 tCopy[k] = v
  347.             end
  348.  
  349.             return tCopy
  350.         end,
  351.         SwapWires = function(self, tSource)
  352.             tCopy = self:CopyTable(tSource)
  353.  
  354.             _5 = tCopy[5]
  355.             _7 = tCopy[7]
  356.  
  357.             tCopy[5] = tCopy[6]
  358.             tCopy[6] = _5
  359.             tCopy[7] = tCopy[8]
  360.             tCopy[8] = _7
  361.  
  362.             return tCopy
  363.         end
  364. }
Add Comment
Please, Sign In to add comment