Перейти к содержимому

Asummonster

Пользователи
  • Публикации

    420
  • Зарегистрирован

  • Посещение

  • Победитель дней

    12

Сообщения, опубликованные пользователем Asummonster


  1. Всем привет!

    В этой теме я расскажу о своей программе "Bluetooth" на плате проводной или беспроводной сети.

    Что же она делает?

    Всё очень просто=) Отправляет файлы через модем.

    Рассмотрим её получше.

    Я на планшете открываю файл с произвольным именем.Пишу в него всякую ерунду: http://joxi.ru/gmv6e07IDRy4ma

    Сохраняю его и пишу bluetooth: http://joxi.ru/DmB1EQxhlYd0rP

    Мне надо отправить этот файл.

    Я подхожу к компьютеру и пишу : "bluetooth -get testTheBlue.lua 25" http://joxi.ru/823nja5FYl64mO

    Теперь выполняю команду на планшете: "bluetooth -send testTheBlue.lua 25" http://joxi.ru/RmzKg0zcDKW42O

    Нажимаю Enter!

    Компьютер получил код с планшета и вышел из программы: http://joxi.ru/gmv6e07IDRx4ma

    Запускаю программу и... ура! Вот,что написал компьютер: http://joxi.ru/xAeNen5hKqpPry

    Вот код:

    com=require("component")
    if com.isAvailable("modem") then modem=com.modem
    else error("Нет модема!")
    end
    event=require("event")
    term=require("term")
    fs=require("filesystem")
    args={...}
    func=args[1]
    fileNAME=args[2]
    PORT=tonumber(args[3])
    ENDOFGETTHEFILE=true
    if func==nil or fileNAME==nil or PORT==nil then print("Использование: -get <filename> <port> для получения файла\n -send <filename> <port> для отправки")
    end
    function sendFile(filename, port)
        modem.open(port)
        for line in io.lines(filename) do 
             modem.broadcast(port, line)
        end
        modem.broadcast(port, "ENDOFTHECURRENTLYFILE")
        modem.close(port)
     end
     function getFile(filename, port)
        modem.open(port)
    	getted=io.open(filename, "w")
    	while ENDOFGETTHEFILE do
    	     _, _, _, _, _, LINE = event.pull("modem_message")
    		 if LINE=="ENDOFTHECURRENTLYFILE" then getted:flush()
    		     getted:close()
    			 ENDOFGETTHEFILE=false
    		else
    		print(LINE)
    		getted:write(LINE.."\n")
    		end
    	end
    end
    if func=="-get" then
        if fs.exists(fileNAME) then print("Данный файл уже существует! Задайте другое имя!"); error()
        else getFile(fileNAME, PORT)
    	end
    elseif func=="-send" then
        if not fs.exists(fileNAME) then print("Такой файл не найден!"); error()
    	else sendFile(fileNAME, PORT)
        end
    end
    
    
    • Нравится 5

  2. Монстрик, программка может и замечательная, очень нужная. Сам люблю минимализм и простоту, дешевизну и с максимальным КПД. Актуально на ИТ сейчас. Робот 1 уровня без харда и уже чего-то там копает. НО ОФОРМЛЕНИЕ ОТВРАТИТЕЛЬНОЕ. :) Это не годится никуда. Не читабельно совершенно. http://puu.sh/imZX3/6ebe1c7219.png

     

    Есть же уже десятки постов с оформлением таким как нужно, со вставками кода и отступами. Примером использования и настройки, последовательность сборки и прошивки, комментарии в коде.  Буду удалять такие посты пока нормально не научитесь вставлять спойлеры и код с отступами в тег < > 

     

     

    П.С. отредактировал по человечески пост Монстрика.

    Спасибо=)Буду отступы делать, скриншотики выкладывать=)


  3. Нормально же пишет)) Я тоже так писал, когда учился, а когда начал писать что-то более двадцати строк, то понял зачем нужен стиль и комментарии))А вообще, ни на кого не жалуюсь - скопировал в notepad++, включил подсветку, отформатировал и читаю себе на здоровье.

    Сам в ноутпаде пишу=)


  4. И ещё. Вот тебе код, как узнать аддресс модема:

     

    for address in pairs(component.list()) do

    if component.list()[address]=='modem' then modemAddress=address

    break

    end

    end

     

     

     

     

     

    чтобы более опытные прогеры (Totoro, Fingercomp)

    Айайай! А если зеро увидит?

    • Нравится 1

  5. Всем привет!

    Представляю вашему вниманию простую программу-карьер для робота.

    В чём её плюс? В том, что робот, выполняющий эту программу, очень дешёвый.

     

     

     

    Комплектация робота:

    • корпус первого уровня
    • процессор первого уровня
    • 2 планки памяти 1-го уровня
    • улучшение "Инвентарь"
    • EEPROM с этой программой

    Всё=)

     

    С первого по третий слот надо класть ненужные вам ресурсы (к примеру, булыжник,земля,песок).

    Робот копает карьер 10x10.

    Сейчас на новом ИТ с ресурсами туго,что и вынудило написать простенький карьер.

     

     

     

    Код программы :

    --==========Простой дешевый робот-карьер на EEPROM =======
    --======http://computercraft.ru,  2015. Asummmonster(c) =====
      
    robot=component.proxy(component.list("robot")())
    function robot.turnRight()
        robot.turn(true)
    end
    function robot.turnLeft()
        robot.turn(false)
    end
    function robot.turnAround()
        robot.turn(true)
        robot.turn(true)
    end
    what2up=1
    function stolb()
    	what2up=1
    	for i=1, 75 do
    			robot.swing(0)
    			if robot.move(0) then
    				what2up=what2up+1
    				for inv=1, 3 do
    					if robot.count()==64 then 
    					 	robot.drop(63)
    					end
    				end
    			end
    	end
    
    	for b=1, what2up do
    		robot.move(1)
    	end
    end
    
    function lepexa()
    	for i=1, 10 do
    		stolb()
    		robot.swing(3)
    		robot.move(3)
    	end
    end
    
    for i=1, 10 do
    	lepexa()
    	robot.turnRight()
    	robot.turnRight()
    		for i=1, 10 do
    			robot.swing(3)
    			robot.move(3)
    		end
    	robot.turnRight()
    	robot.move(3)
    	robot.turnLeft()
    end
    
    • Нравится 2

  6. То есть она не пытаеться прийти по определённым координатам, а идёт по уже известной карте?Так скучно=(Я уже на твоей программе распечатал лабиринт, а она оказывается только по известной карте ходит=(


  7. я хотел написать программу для микроконтролера и я это сделал а как известно в них нельзя запихнуть жесткий диск потому я писал данные в код программы

    сейчас я понял что добавив в нее все желаемое она просто не поместится в eeprom по этому я переписываю ее под openos

    А зачем переписывать? Почему бы просто не вставить биос в комп с д.ж.?


  8. Типа, че за фигня, зачееем???? :)

     

     

    П.С. Кстати, когда поутихла шумиха с грегом, больше стали игроки писать последнее время на форум и чат, вопросы по луа, программки и прочее.

    Фингер, Монстрик, Леха, Артем404, Зед, Фолдер и МайнЛинукс и многие многие, всех не вспомню сразу, очень часто в чате вопросы по коду и .т.д, что радует.

    Я только начал спрашивать потому, что только начал играть (печкитрубыимэ не в счёт)


  9. Сколько повторять нужно об удалении картинок в цитатах?

    Было лень ссылки искать. А я вот сейчвс работаю над https файфаем и файфаем по ключу доступа

    Она третьего уровня и жрёт дофига энергии. Для некоторых комп третьего уровня -- дорогое удовольствие, и они не могут крафтить их пачками.

    Давай вместе заниматься https и session ключами?


  10. Итак, первая версия программы готова!

    Для её работы нужен стандартный компьютер с беспроводным модемом, а также робот с модемом и апгрейдами: верстак и контроллер инвентаря.

    Затем ставим МЭ-интерфейс, адаптер, зарядник и робота как на картинке:

    BcwcOPd.png

    После этого берём апгрейд-базу данных и настраиваем её на те предметы, которые используются в крафте (пока что у меня только один рецепт):5oBSv9j.png

    Базу кладём в адаптер.

    Затем на компьютер закидываем два файла: ME.lua и recipes.lua

    ME.lua

     

     

    local component=require('component')
    local event=require('event')
    local interface=component.me_interface
    local base=component.database
    local modem=component.modem
    
    local recipes=require('recipes')
    local robAddr="d9c29b1f-d308-4fb7-bf69-d7291346cef6"
    local baseSize=81
    modem.open(1337)
    
    function readyInterface(name)
      needItems=recipes[name]
      for i=1,#needItems do
        needItem=needItems[i]
        print('Recipe item number '..tostring(i)..' is '..tostring(needItem['name'])..' : '..tostring(needItem['tag']))
        n=0
        found=false
        while not(found) and n<baseSize do
          n=n+1
          local baseItem=base.get(n)
          if baseItem then
            print('Base item number '..tostring(n)..' is '..tostring(baseItem['name'])..' : '..tostring(baseItem['damage']))
            if needItem['name']==baseItem['name'] and needItem['tag']==baseItem['damage'] then
              print('Was found!')
              found=true
              interface.setInterfaceConfiguration(i,base.address,n)
            end
          end
        end
      end
    end
    
    function convertRecipe(recipe)
      line=''
      for n=1,#recipe do
        for i=1,#recipe[n]['slots'] do
          line=line..tostring(recipe[n]['slots'][i])
        end
        if n~=#recipe then line=line..':' end
      end
      return line
    end
    
    readyInterface('IC2:itemPartCircuit')
    r=convertRecipe(recipes['IC2:itemPartCircuit'])
    cont=true
    repeats=0
    while cont do
      repeats=repeats+1
      modem.send(robAddr,1337,r)
      _, _, sender, _, _, text=event.pull(3,'modem_message')
      if sender==robAddr and text=='ok' then
        print('Робот принял заказ')
        os.sleep(0.5)
        _, _, sender, _, _, text=event.pull(30,'modem_message')
        print(text)
        if sender==robAddr and text=='crafted' then
          print('Предмет создан')
        elseif sender==robAddr and text=='error' then
          print('Ошибка во время создания')
        end
        cont=false
      end
      if repeats==5 then
        cont=false
        print('Ошибка: робот не работает')
      end
    end
    modem.close()

     

    recipes.lua

     

     

    recipes={}
    recipes['IC2:itemPartCircuit']={
        {name='IC2:itemCable',
         tag=0,
         slots={1,2,3,7,8,9}
        },
        {name='minecraft:redstone',
         tag=0,
         slots={4,6}
        },
        {name='IC2:itemPlates',
         tag=4,
         slots={5}
        }
    }
    
    return recipes

     

    На робота скидываем файл crafter.lua :

     

     

    local component=require('component')
    local event=require('event')
    local inv_c=component.inventory_controller
    local modem=component.modem
    local robot=require('robot')
    local crafting=component.crafting
    
    local owner="5e07230a-17bb-4c20-b518-a2986093f86f"
    modem.open(1337)
    
    function craft(recipe)
      n=1
      for i=1,#recipe do
        s=string.sub(recipe,i,i)
        if ':'==s then
          n=n+1
        else
          s=tonumber(s)
          if s>3 and s<7 then s=s+1 elseif s>6 then s=s+2 end
          robot.select(s)
          inv_c.suckFromSlot(0,n)
        end
      end
      robot.select(4)
      toReturn=crafting.craft()
      robot.dropDown()
      return toReturn
    end
    a='123789:46:5'
    while true do
      _, _, sender, _, _, text=event.pull(2,'modem_message')
      if sender==owner then
        print('receive, ',text)
        os.sleep(0.5)
        modem.send(owner,1337,'ok')
        print('send ok')
        os.sleep(0.5)
        if craft(text) then modem.send(owner,1337,'crafted') else modem.send(owner,1337,'error') end
      end
    end
    craft(a)

     

    В файле ME.lua измените переменные: robAddr -- адрес модема робота, baseSize -- размер базы. В файле crafter.lua измените переменную owner -- адрес модема компа.

    Приступим к запуску. На роботе запустим файл crafter.lua, после чего наш раб робот будет ждать сообщения.

    После этого на компе запустим файл ME.lua. Сейчас программа настроена так, чтобы сделать одну базовую электросхему IC2. Данная версия не проверяет МЭ сеть на наличие предметов, поэтому положите их заранее.

    Если вы всё сделали правильно и я не допустил косяков при написании этого сообщения, в вашей МЭ сети появится одна электросхема. Тестируйте на здоровье!

    Класс! Только меня смутила переменная robAddr...Почему бы не просто computer.address?


  11. Имею эмулятор СС, но не имею эмулятора ОС. Может быть можно, написав несколько подобных функций, сэмулировать ОС на эмуляторе СС? Вот require мы уже имеем. Теперь надо создать библиотеки computer, component, event  и т.д и будем иметь полновесный эмулятор ОС.

    А зачем эмулировать event? os.pullEvent есть, os.listen сделать просто на параллели и os.pullEvent

    Зачем эмулировать компонент? Есть же peripheral.wrap и peripheral.call

    А функции computer api выполняет os


  12. Код хороший, но подожди ка, а где же таблица и функции package? Это ведь специальный инструмент, что бы не забивать оперативную память, и ускорить работу программы при нескольких одинаковых вызовах require().

    Больше об этом написано здесь http://ilovelua.narod.ru/about_lua.html#Module_loaders

    Можешь посмотреть как require и package реализовано в ОС https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/assets/opencomputers/loot/OpenOS/lib/package.lua

    Спасибо!Теперь засуну в прогруженные таблицы computer и component

×
×
  • Создать...