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

нету компонента eeprom

Вопрос

в openos есть библиотека component (которой нет в файлах ос) но мне нужно получить код биоса из своей ос но компонента eeprom не существует

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

"сomponent" - библиотека, существующая вне OpenOS (как и "computer"). Насколько я помню - оська только расширяет функционал. Но базовые функции "зашиты" в компьютер и вполне спокойно дергаются при выполнении кода в голой системе.

 

Вот например данная демка при запуске из EEPROM спокойно выплевывает на экран (в сыром виде) собственное содержимое и зависает в цикле (дабы пк не отключался сразу после вывода).

local eeprom = component.proxy(component.list("eeprom")())
local gpu = component.proxy(component.list("gpu")())

local firm = eeprom.get()

gpu.set(1, 1, firm)

while true do
    computer.pullSignal()
end

 

0UPffdX.png

Изменено пользователем Bs0Dd

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

flash -r

 

А, пардон. 'Из своей ос' :-)

Изменено пользователем Taoshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, ItsMakar сказал:

в openos есть библиотека component (которой нет в файлах ос) но мне нужно получить код биоса из своей ос но компонента eeprom не существует

В дополнение к инфе от @Bs0Dd поясню, что если ты кодишь под биос, то работаешь на самом низком уровне, доступном в моде. Следовательно, фича component.имяКомпонента.метод(...) из OpenOS доступна не будет, т.к. она добавляется на более позднем этапе во время инициализации самой ОС:

 

https://github.com/MightyPirates/OpenComputers/blob/af2db43c53b9690fceabfb813987572bf2258db5/src/main/resources/assets/opencomputers/loot/openos/boot/04_component.lua#L10-L32

 

Поэтому для обращения к компоненту из-под биоса есть 2 варианта:

-- Чтобы обратиться к компоненту, нам нужно знать его уникальный адрес
-- Список адресов всех доступных компонентов с указанным типом можно получить через метод component.list("имя")
-- В одном компьтере может быть установлено несколько компонентов одного типа, поэтому метод list 
-- возвращает функцию-итератор, при каждом вызове которой возвращается адрес следующего компонента
local gpuIterator = component.list("gpu")
local gpu1Address = gpuIterator()
local gpu2Address = gpuIterator()

-- Конструкцию выше можно скомпоновать в цикл
for address in component.list("gpu") do
  -- Делаем что угодно с каждой имеющейся GPU
end

-- В случае EEPROM все несколько проще. Поскольку в 1-ом компьютере может быть только 1 EEPROM, то нам
-- следует вызвать функцию-итератор хотя бы 1 раз, чтобы получить адрес 1-го (и единственного) EEPROM
local eepromAddress = component.list("eeprom")()

-- Раз адрес компонента EEPROM нам известен, теперь мы можем обратиться к нему и вызвать
-- какой-нибудь метод. Сделать это можно двумя путями. Первый более линейный, его следует
-- использовать для каких-то разовых операций "в лоб":
local data = component.invoke(eepromAddress, "getData")
component.invoke(eepromAddress, "setData", "sample text")

-- Второй более универсальный, и позволяет создать так называемый прокси компонента, то есть
-- таблицу в памяти, содержащую все доступные методы компонента. Разумеется, он расходует больше ОЗУ,
-- однако работать с ним в разы удобнее:
local eepromProxy = component.proxy(eepromAddress)
local data = eepromProxy.getData()
eepromProxy.setData("sample text")

Кроме того, "чистые" компьютеры без ОС имеют глобальные переменные component, computer и unicode, которые всегда доступны в биосе, и в случае OpenOS "вырезаются", становясь частью глобальной библиотеки package:

 

https://github.com/MightyPirates/OpenComputers/blob/af2db43c53b9690fceabfb813987572bf2258db5/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua#L94-L112

 

По этой причине в биосе ты должен обращаться к глобальной библиотеке component, а в OpenOS для этого уже требуется конструкция require("component"). Почему авторы так поступили? Да хрен знает, их ОС - их правила. Но путаницу это вносит знатную

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, ECS сказал:

В дополнение к инфе от @Bs0Dd поясню, что если ты кодишь под биос, то работаешь на самом низком уровне, доступном в моде. Следовательно, фича component.имяКомпонента.метод(...) из OpenOS доступна не будет, т.к. она добавляется на более позднем этапе во время инициализации самой ОС:

 

https://github.com/MightyPirates/OpenComputers/blob/af2db43c53b9690fceabfb813987572bf2258db5/src/main/resources/assets/opencomputers/loot/openos/boot/04_component.lua#L10-L32

 

Поэтому для обращения к компоненту из-под биоса есть 2 варианта:


-- Чтобы обратиться к компоненту, нам нужно знать его уникальный адрес
-- Список адресов всех доступных компонентов с указанным типом можно получить через метод component.list("имя")
-- В одном компьтере может быть установлено несколько компонентов одного типа, поэтому метод list 
-- возвращает функцию-итератор, при каждом вызове которой возвращается адрес следующего компонента
local gpuIterator = component.list("gpu")
local gpu1Address = gpuIterator()
local gpu2Address = gpuIterator()

-- Конструкцию выше можно скомпоновать в цикл
for address in component.list("gpu") do
  -- Делаем что угодно с каждой имеющейся GPU
end

-- В случае EEPROM все несколько проще. Поскольку в 1-ом компьютере может быть только 1 EEPROM, то нам
-- следует вызвать функцию-итератор хотя бы 1 раз, чтобы получить адрес 1-го (и единственного) EEPROM
local eepromAddress = component.list("eeprom")()

-- Раз адрес компонента EEPROM нам известен, теперь мы можем обратиться к нему и вызвать
-- какой-нибудь метод. Сделать это можно двумя путями. Первый более линейный, его следует
-- использовать для каких-то разовых операций "в лоб":
local data = component.invoke(eepromAddress, "getData")
component.invoke(eepromAddress, "setData", "sample text")

-- Второй более универсальный, и позволяет создать так называемый прокси компонента, то есть
-- таблицу в памяти, содержащую все доступные методы компонента. Разумеется, он расходует больше ОЗУ,
-- однако работать с ним в разы удобнее:
local eepromProxy = component.proxy(eepromAddress)
local data = eepromProxy.getData()
eepromProxy.setData("sample text")

Кроме того, "чистые" компьютеры без ОС имеют глобальные переменные component, computer и unicode, которые всегда доступны в биосе, и в случае OpenOS "вырезаются", становясь частью глобальной библиотеки package:

 

https://github.com/MightyPirates/OpenComputers/blob/af2db43c53b9690fceabfb813987572bf2258db5/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua#L94-L112

 

По этой причине в биосе ты должен обращаться к глобальной библиотеке component, а в OpenOS для этого уже требуется конструкция require("component"). Почему авторы так поступили? Да хрен знает, их ОС - их правила. Но путаницу это вносит знатную

я знаю это и я просто забыл что component.proxy работает не по названию а по аддрессу то есть я пытался сделать так component.proxy("eeprom") и про require("component") это вообще что за библиотека? я не нашел ее в файлах опенос

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, ECS сказал:

фича component.имяКомпонента.метод(...) из OpenOS доступна не будет, т.к. она добавляется на более позднем этапе во время инициализации самой ОС

Вот, именно про это расширение я и говорил. Поскольку это уже программная фича, реализованная на уровне OpenOS.

 

1 час назад, ItsMakar сказал:

require("component") это вообще что за библиотека? я не нашел ее в файлах опенос

require? Она хоть с виду и является самостоятельной функцией, но на самом деле входит в вышеупомянутую либу package:

 

https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua#L45-L70

 

Я не в курсе почему ее вынесли отдельно, но значит так надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Bs0Dd сказал:

Я не в курсе почему ее вынесли отдельно, но значит так надо

Вероятно, для соответствия "ванильной" версии луа

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
52 минуты назад, Bs0Dd сказал:

Вот, именно про это расширение я и говорил. Поскольку это уже программная фича, реализованная на уровне OpenOS.

 

require? Она хоть с виду и является самостоятельной функцией, но на самом деле входит в вышеупомянутую либу package:

 

https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua#L45-L70

 

Я не в курсе почему ее вынесли отдельно, но значит так надо.

я имею ввиду component

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, ItsMakar сказал:

я имею ввиду component

Фуууух, уже же было сказано. В компьютер вшиты три библиотеки: component, computer и unicode. Они существуют сами по себе и OpenOS при загрузке только добавляет в component (и в computer вроде тоже) свои, программные функции. Потому луа файла этих библиотек и нету.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, Bs0Dd сказал:

Фуууух, уже же было сказано. В компьютер вшиты три библиотеки: component, computer и unicode. Они существуют сами по себе и OpenOS при загрузке только добавляет в component (и в computer вроде тоже) свои, программные функции. Потому луа файла этих библиотек и нету.

ясно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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