Doob

connections manager [OpenComputers]

Jun 19th, 2015
341
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local tArgs = {...}
  2.  
  3. local port = 42
  4. local myName = 'Bob'
  5. local lofc = 'lc.txt' --list of connections
  6. local timer = (math.random(1, 7)/7)
  7.  
  8. if #tArgs == 2 then
  9.   port = tonumber(tArgs[1])
  10.   myName = tostring(tArgs[2])
  11. elseif #tArgs > 2 then
  12.   print('usage: cm <port> <MyName>')
  13.   os.sleep(3)
  14.   os.exit()
  15. end
  16.  
  17. local component = require('component')
  18. local event = require('event')
  19. local term = require('term')
  20. local ser = require('serialization')
  21. local modem = component.modem
  22. local tList = {} --{'name', 'address', 'port', 'distance'}
  23. local tList1 = {}
  24.  
  25. --сохраниение таблицы в файл
  26. local function saveList(tbl, fl)
  27.   file = io.open(fl, 'w')
  28.   file:write(ser.serialize(tbl))
  29.   file:close()
  30. end
  31.  
  32. --загрузка таблицы из файла
  33. local function loadList(fl)
  34.   file = io.open(fl, 'r')
  35.   if not file then
  36.     file = io.open(fl, 'a')
  37.   else
  38.     return ser.unserialize(file:read('*a'))
  39.   end
  40.   file:close()
  41. end
  42.  
  43. --сообщение своего id и поиск устройств
  44. local function beacon(addTime)
  45.   while addTime > 0 do
  46.     modem.broadcast(port, myName) --сообщаеи свое имя
  47.     os.sleep(timer)
  48.     modem.open(port)
  49.     e, r, s, p, d, n = event.pull(timer, 'modem_message')
  50.     if p == port then --если получили сигнал с нужного порта
  51.       c = 1
  52.       for i = 1, #tList do --проходимся по таблице адресов
  53.         if s == tList[i][2] then --если нашли адрес из списка
  54.           tList[i] = {n, s, p, math.floor(d)} --обновляем его данные
  55.         else
  56.           c = c+1
  57.         end
  58.       end
  59.       if c > #tList then --если адреса нет в списке
  60.         tList[#tList+1] = {n, s, p, math.floor(d)} --добавляем новй адрес
  61.       end
  62.     end
  63.     modem.close(port)
  64.     os.sleep(0.5)
  65.     addTime = addTime-1
  66.   end
  67. end
  68.  
  69. if loadList(lofc) ~= nil then
  70.   tList1 = loadList(lofc)
  71.   tList = tList1
  72. end
  73.  
  74. while true do
  75.   term.clear()
  76.   local y = 9
  77.   term.setCursor(1, y) term.write('[№]')
  78.   term.setCursor(5, y) term.write('[Name]')
  79.   term.setCursor(15, y) term.write('[Address]')
  80.   term.setCursor(25, y) term.write('[Port]')
  81.   term.setCursor(32, y) term.write('[Distance]')
  82.   for z = 1, #tList do
  83.     term.setCursor(1, y+1+z) term.write('['..z..']') --номер
  84.     term.setCursor(5, y+1+z) term.write('['..tList[z][1]..']') --имя
  85.     term.setCursor(15, y+1+z) term.write('['..string.sub(tList[z][2], 1, 8)..']') --адрес
  86.     term.setCursor(25, y+1+z) term.write('['..tList[z][3]..']') --порт
  87.     term.setCursor(32, y+1+z) term.write('['..tList[z][4]..']') --расстояние
  88.   end
  89.   term.setCursor(1, 1)
  90.   print('Введите [-r n], для поиска новых устройсв, где - n время ожидания в секундах')
  91.   print('Введите [-s n], для сохранения адреса, где n - номер в списке')
  92.   print('Введите [-d n], для для удаления адреса')
  93.   print('Введите [-q], для выхода из программы')
  94.   local arg = io.read()
  95.   arg_o = string.sub(arg, 1, 2)
  96.   if arg_o == '-s' then
  97.     tList1[#tList1+1] = tList[tonumber(string.sub(arg, 4, string.len(arg)))] --копируем адрес из tList в tList1
  98.     saveList(tList1, lofc) --сохраняем все адреса
  99.   elseif arg_o == '-d' then
  100.     table.remove(tList1, tonumber(string.sub(arg, 4, string.len(arg)))) --удляем адрес из tList1
  101.     saveList(tList1, lofc) --сохраняем все адреса
  102.   elseif arg_o == '-r' then
  103.     t = tonumber(string.sub(arg, 4, string.len(arg)))
  104.     if t ~= nil then
  105.       beacon(t)
  106.     else
  107.       beacon(5)
  108.     end
  109.   elseif arg_o == '-q' then
  110.     term.clear()
  111.     os.exit()
  112.   else
  113.     print('ЕГГОГ!')
  114.     os.sleep(1)
  115.   end
  116. end
RAW Paste Data