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

Дрон и Load

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

Всем доброго дня.

 

Для управления дроном хотел использовать систему, передающую ему команды, а в его eeprom разместить только программу на прием и исполнение внешних команд.

 

На дроне использовал следующее:

 

local modem = component.proxy(component.list('modem')())
local drone = component.proxy(component.list('drone')())

modem.open(4455)

while true do
local rnd, _, _, _, _, any = computer.pullSignal()
if rnd == "modem_message" then
pcall(load(any))
end
end

 

Передаю с компьютера сообщение "drone.move(0,1,0)", однако дрон на нее никак не реагирует.

 

Пробовал ради дебага заменить pcall(load(any)) на drone.setStatusText(any), и на дисплее дрона отобразилось отправленное  сообщение (сколько влезло, разумеется).

 

Пришел к выводу, что не выполняется load(?).

 

Поясните, пожалуйста, в чем я не прав?

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


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

 

Для управления дроном хотел использовать систему, передающую ему команды, а в его eeprom разместить только программу на прием и исполнение внешних команд.

 

На дроне использовал следующее:

 

local modem = component.proxy(component.list('modem')())

local drone = component.proxy(component.list('drone')())

modem.open(4455)

while true do

local rnd, _, _, _, _, any = computer.pullSignal()

if rnd == "modem_message" then

pcall(load(any))

end

end

 

Передаю с компьютера сообщение "drone.move(0,1,0)", однако дрон на нее никак не реагирует.

 

Пробовал ради дебага заменить pcall(load(any)) на drone.setStatusText(any), и на дисплее дрона отобразилось отправленное  сообщение (сколько влезло, разумеется).

 

Пришел к выводу, что не выполняется load(?).

 

Поясните, пожалуйста, в чем я не прав?

Я бы посоветовал использовать event.pull для реагирования на событие

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


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

Я бы посоветовал использовать event.pull для реагирования на событие

В eeprom где 4кб памяти? :smile3:

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


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

Пришел к выводу, что не выполняется load(?).

 

Поясните, пожалуйста, в чем я не прав?

 

Загляни в конфиг мода. Там должны быть такие строчки:

# Whether to allow loading precompiled bytecode via Lua's `load`
# function, or related functions (`loadfile`, `dofile`). Enable this
# only if you absolutely trust all users on your server and all Lua
# code you run. This can be a MASSIVE SECURITY RISK, since precompiled
# code can easily be used for exploits, running arbitrary code on the
# real server! I cannot stress this enough: only enable this is you
# know what you're doing.
allowBytecode: false

В переводе:

# Разрешен ли запуск прекомпилированного байткода функцией 'load'
# (и аналогичными функциями 'loadfile', 'dofile'). Включайте
# только если абсолютно доверяете всем пользователям вашего сервера,
# и всему запускаемому коду. Это может быть БОЛЬШОЙ УЯЗВИМОСТЬЮ, поскольку
# прекомпилированный код может быть с легкостью использован для эксплойтов
# и запуска произвольного кода на настоящем сервере!
# Еще раз: включайте эту опцию, только если вы знаете, что делаете.
allowBytecode: false

Если значение равно false то функция отключена.

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


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

Загляни в конфиг мода. Там должны быть такие строчки:

Если значение равно false то функция отключена.

Не не, в конфиге идет речь именно про байт-код. load(string) будет работать.

 

А теперь автору:

попробуй так (скобочки добавь)

 

pcall(load(any)())
Изменено пользователем Jet

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


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

Всех благодарю за участие, решение оказалось в ином - убрать все local, в итоге работает с:

 

modem = component.proxy(component.list('modem')())
drone = component.proxy(component.list('drone')())

modem.open(4455)

while true do
rnd, _, _, _, _, any = computer.pullSignal()
if rnd == "modem_message" then
pcall(load(any))
end
end

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


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

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

a=11
local b=12
load("print(a,b)")() --> 11     nil

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


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

 

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

a=11
local b=12
load("print(a,b)")() --> 11     nil

Вероятно, так и есть :)

 

Отдельно уточнить хотел, как можно вывести результат в броадкаст? Попробовал :

 

res=pcall(load(any))

 

Но броадкаст передал nil.

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


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

Вероятно, так и есть :)

 

Отдельно уточнить хотел, как можно вывести результат в броадкаст? Попробовал :

 

res=pcall(load(any))

 

Но броадкаст передал nil.

На сколько я понял,pcall возвращает результат выполнения(true/false) и ответ от load

И надо прикрепить return

Что то вроде result, res = pcall(load("return "..any))

post-14173-0-96600400-1463594458_thumb.png

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


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

На сколько я понял,pcall возвращает результат выполнения(true/false) и ответ от load

И надо прикрепить return

Что то вроде result, res = pcall(load("return "..any))

Здесь в переменную запишется только то, что функция выполнится, т.е. true в примере на скриншоте. Хотелось бы получить именно результат выполнения (из скриншота - 80 и 25).

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


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

Здесь в переменную запишется только то, что функция выполнится, т.е. true в примере на скриншоте. Хотелось бы получить именно результат выполнения (из скриншота - 80 и 25).

res={pcall(load("return "..any))}

res[1]>>true

res[2]>>80

res[3]>>25

res={pcall(load("return "..any))}
tmp=""
for id=2, #res do
  tmp=tmp.." | "..res[id]
end
modem.broadcast(port, tmp)
Изменено пользователем Asummonster

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


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

 

res={pcall(load("return "..any))}

res[1]>>true

res[2]>>80

res[3]>>25

res={pcall(load("return "..any))}
tmp=""
for id=2, #res do
  tmp=tmp.." | "..res[id]
end
modem.broadcast(port, tmp)

Вот теперь дошло - в фигурные скобки заключить pcall(load.. забыл.

 

Спасибо за пояснения, вопрос закрыт.

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


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

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

http://computercraft.ru/topic/833-oc-bios-net-dlia-tcentralizovannogo-upravleniia-setiu-kont/

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


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

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

http://computercraft.ru/topic/833-oc-bios-net-dlia-tcentralizovannogo-upravleniia-setiu-kont/

Видел эту тему, но тогда не обратил внимания на отсутствие local в объявлении переменных. К тому же не очень хорошо пока разбираю чужой однострочный код.

 

Впредь буду внимательней к деталям.

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


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

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

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

Гость
Ответить в тему...

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

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

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

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

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


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