А что такое EEPROM и где оно живет?

Totoro 2014-12-24   4 минуты на чтение

В последних версиях OpenComputers обрастает всякими загадочными вещами.

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

"А пошло оно все!" - думают игроки, и уходят на версию 1.3.6, или переучиваются на ComputerCraft, который проще, и не требует непонятного.

А одна из самых загадочных - неведомый EEPROM.

Это такая мелкая хрень, без которой не работает ни один компьютер, или даже робот. Хорошо еще, что есть стандартный EEPROM который называется Lua BIOS. Он легко крафтится и заставляет работать компьютеры как и раньше.

Но найдем задачку посложнее, где Lua BIOS не поможет.
Попробуем собрать микроконтроллер, который будет управлять входными дверями.

1. План

Представим, как оно должно работать.

Слева от двери (если входить) - микроконтроллер.

Ради понтов, возьмем Микроконтроллер 2-ого уровня и поставим в него беспроводную сетевую плату. Кроме того добавим красную плату, чтобы управлять дверью.

  1. Если контроллер принимает сигнал "open" - он открывает дверь.
  2. Если примет сигнал "close" - он закрывает дверь.
  3. Если примет посторонний сигнал - взрывает динамит. Дабы сокровища не достались хакерам.

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

2. Крафтим контроллер

С этим проблем не возникнет. Потому, что я играю в креативе. :P

Открываем NEI и берем нужные детали. В последний слот положим пока пустой EEPROM. Потом поставим на него прошивку, а пока - не важно.

Нажимаем кнопку "Старт" и достаем готовый блок.

3. Готовим прошивку

Теперь, когда все готово, мы построили сокровищницу и скрафтили контроллер - осталось самое главное.

Программирование EEPROM'а отличается от программирования обычной программы. Потому, что обычно, наши программы выполняются в OpenOS, которая заботливо загружает нужные библиотеки, предоставляет всякие удобные фичи и прочее.

Тем не менее писать мы будем именно в OpenOS. Запустим компьютер, напишем edit bios и введем следующие строки:

red = component.proxy(component.list("redstone")())

while true do
  red.setOutput(5, 0)
  computer.pullSignal(1)
  red.setOutput(5, 15)
  computer.pullSignal(1)
end

Дело в том, что большая часть библиотек, которые мы использовали - это библиотеки OpenOS. А значит мы не можем ими пользоваться в BIOS. Однако кое-что нам доступно. Это библиотеки computer и component, и соответственно все установленные в целевом агрегате (микроконтроллер) компоненты.

Более чем достаточно для наших задач.

Вышеприведенный код делает следующее:

Преследуем двоякую цель: во-первых проверить, что EEPROM вообще работает так про него написано на Вики. Кто его знает? А во-вторых: убедиться, что сторона 5 это именно та сторона, где дверь. А не какая-нибудь другая.

Нажмем Ctrl+S, чтобы сохраниться и Ctrl+W, чтобы закрыть редактор.

Вставим пустой EEPROM (еще один) в слот нашего компьютера, вместо лежащего там Lua BIOS. И напишем в консоль такую команду:

flash -q bios MCBios

Программа flash предназначена для прошивки чипов. Флаг -q говорит ей, чтобы не задавала лишних вопросов, затем идет имя файла с нашим кодом (bios) и метка, которую программа шлепнет на чип (MCBios).

Все. Доставайте. Lua BIOS на место класть не обязательно, ибо этот слот нам еще потребуется. (Но не забудьте его вернуть, если будете перезагружать компьютер)

Чтобы заменить пустой EEPROM в контроллере на наш MCBios, надо положить контроллер и MCBios на верстак. При этом пустой чип вылетит, а новый встанет на его место.

Поставим контроллер на пол и протестируем.

После клика ПКМ на контроллере - замигала правая лампа. Значит все работает как нужно.

4. Теперь - серьезно

Извлеките чип с MCBios обратно (так же как и вставляли, только наоборот). Или приготовьте новый пустой чип. Главное - не запутайтесь в них.

Пишем клиент для контроллера. У меня он выглядит примерно так:

red = component.proxy(component.list("redstone")())
modem = component.proxy(component.list('modem')())

modem.open(27)
red.setOutput(5, 0)
red.setOutput(2, 0)  -- пока никаких взрывов =)

while true do
  name, _, sender, _, _, message = computer.pullSignal(2)
  if name == 'modem_message' then
    if message == 'open' then
      red.setOutput(5, 15)
    elseif message == 'close' then
      red.setOutput(5, 0)
    else
      -- хакер пытается пробраться внутрь?
      red.setOutput(2, 15)
      -- огонь!!!
    end
  end
end

modem.close()

Все согласно плану.

Прошиваем чип, вставляем в контроллер, а контроллер ставим слева от дверей. Сзади к контроллеру осторожно прилаживаем запал.

ПКМ!

Теперь открываем новый файл на компьютере:

edit send

И пишем в него такой код:

local com = require('component')
local modem = com.modem

local args = {...}

modem.broadcast(27, args[1])

print("Собщение '"..args[1].."' отправлено!")

Сохраняем, и закрываем. Это будет программка для тестирования контроллера.

5. Тест!

Пишем в консоль send open. Дверь открылась!

Пишем send close. Дверь закрылась!

Пишем send ooen

Упс! Опечатка.

О_О