ItsMakar 1 Опубликовано: 21 января, 2022 в openos есть библиотека component (которой нет в файлах ос) но мне нужно получить код биоса из своей ос но компонента eeprom не существует Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Bs0Dd 206 Опубликовано: 22 января, 2022 (изменено) "с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 Изменено 22 января, 2022 пользователем Bs0Dd 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi 55 Опубликовано: 22 января, 2022 (изменено) flash -r А, пардон. 'Из своей ос' :-) Изменено 22 января, 2022 пользователем Taoshi Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 22 января, 2022 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"). Почему авторы так поступили? Да хрен знает, их ОС - их правила. Но путаницу это вносит знатную 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ItsMakar Автор вопроса 1 Опубликовано: 22 января, 2022 Только что, 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") это вообще что за библиотека? я не нашел ее в файлах опенос Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Bs0Dd 206 Опубликовано: 22 января, 2022 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 22 января, 2022 1 час назад, Bs0Dd сказал: Я не в курсе почему ее вынесли отдельно, но значит так надо Вероятно, для соответствия "ванильной" версии луа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ItsMakar Автор вопроса 1 Опубликовано: 22 января, 2022 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Bs0Dd 206 Опубликовано: 22 января, 2022 2 минуты назад, ItsMakar сказал: я имею ввиду component Фуууух, уже же было сказано. В компьютер вшиты три библиотеки: component, computer и unicode. Они существуют сами по себе и OpenOS при загрузке только добавляет в component (и в computer вроде тоже) свои, программные функции. Потому луа файла этих библиотек и нету. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ItsMakar Автор вопроса 1 Опубликовано: 22 января, 2022 Только что, Bs0Dd сказал: Фуууух, уже же было сказано. В компьютер вшиты три библиотеки: component, computer и unicode. Они существуют сами по себе и OpenOS при загрузке только добавляет в component (и в computer вроде тоже) свои, программные функции. Потому луа файла этих библиотек и нету. ясно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
в openos есть библиотека component (которой нет в файлах ос) но мне нужно получить код биоса из своей ос но компонента eeprom не существует
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах