Popstas

Записки о Linux

23 May 2017, 21:20 - 4 мин читать

Интеграция NodeMCU и JetBrains IDE на примере IDEA или как я чуть не написал свою IDE

Я в последнее время делаю себе домашние девайсы на ESP-8266, использую прошивку nodemcu-firmware, а значит Lua.

Самый простой способ писать код на Lua под ESP-8266 - ESPlorer. У меня есть ряд претензий к этому редактору:

  • нет структуры проекта (можно только открывать вкладки по одной через File - Open)
  • простой редактор без автодополнения, мультиредактирования и т.д.
  • нельзя загружать файл по хоткею
  • нет git

TL;DR: написал свой велосипед, работает, но не без проблем.

Как это работает:

В девайс загружается файл с ota.lua. После этого можно отправлять POST запросы на /ota, указывая filename (имя файла) и content (содержимое файла), если его размер помещается в доступную оперативку, он будет загружен.

Как я пришел к тому, что получилось

Кому интересен результат, тот может перейти сразу к 4-й части.

1. Web Клиент

Теперь нужен удобный клиент, чтобы загружать файлы. Сначала я не думал про JetBrains, решил написать веб-клиент, как раз на неделе услышал, что vscode легко встраивать в веб. Так и оказалось. Получился примитивный клиент без доступа к локальной файловой системе, но с крутым редактором. Клиент можно посмотреть здесь. Перед тем, как смотреть, надо установить зависимости через npm install. Эта часть интересна только интеграцией vscode (если точнее, monaco-editor):

2. Web IDE

Написав первый клиент, я начал думать дальше в эту сторону, уже задумал взять Electron, завернуть приложение в него, добавить вкладки, доступ к файлам… К счастью, меня довольно быстро отпустило, я понял, что собираюсь писать свою IDE, это, мягко говоря, не укладывалось в 2 вечера, которые я решил потратить на OTA upload.

Тогда я подумал, что особенного в моем решении и понял: все уже написано, кроме той части, которая загружает файл в устройство. Ок, подумал я, значит надо взять редактор, где уже все есть и написать к нему плагин, который по Ctrl+S отправляет файл куда надо.

3. Atom

Следующим подопытным был Atom, которым я не очень-то пользуюсь, но иногда открываю. Плагины пишутся на CoffeeScript, который я не знаю… что-то тут опять не так…

4. nodemcu-ota-uploader.py

Тогда я подумал еще и понял, что плагин можно и не писать: в моем любимом PhpStorm можно добавить произвольный скрипт, передать ему через переменные путь до текущего файла и повесить на хоткей.

Это показалось мне очень разумным, по сравнению с прошлыми идеями, поэтому в этом месте я сел и написал простой загрузчик на питоне, который принимает имя файла, отправляет запрос по жестко зашитому урлу и больше ничего не умеет, он лежит здесь - nodemcu-ota-uploader.py

5. PhpStorm

Пошел в PhpStorm, поставил плагин Lua, перезапустил, но код так и не раскрасился, в настройках Lua тоже никак не проявился. Я сижу на PhpStorm EAP, думаю, что плагин просто не успели подправить под новую версию, я почти уверен, что раньше он работал.

Но самое главное, что идея работает! Зашел в Settings - Tools - External Tools, добавил свой тул:

  • Name: nodemcu-ota-uploader
  • Program: /usr/local/bin/nodemcu-ota-uploader.py
  • Parameters: $FilePath$

Нажал OK, Apply, после этого сразу пошел в Settings - Keymap, нашел его там и повесил на Ctrl+Shift+S.

Осталось решить проблему с поддержкой Lua.

6. IDEA

Проблему я решил, сменив в очередной раз редактор. У меня стояла IDEA EAP чуть старее, чем PhpStorm, поставил плагин туда - работает!

Добавил тул тем же способом, что и в PhpStorm - работает!

Минусы

Минусов хватает:

  • нет REPL
  • нет сниппетов
  • нет вывода от NodeMCU

По этому поводу пока не парюсь, держу открытым ESPlorer. Теоретически можно решить, дописав telnet сервер в железку.

  • нельзя загрузить большой файл, даже средний нельзя

Подопытная железка запускает датчик движения, отправляет данные через MQTT. На момент загрузки всех скриптов print(node.heap()) говорит, что свободно около 30 000 байт. Этого хватает, чтобы залить скрипт в 1.5 кб, но на 2 кб железка уже падает с unprotected error in call to Lua API (not enough memory).

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

Альтернативы

Конечно, я не первый, кто написал кастомную загружалку. Думаю, стоит обратить внимание на https://github.com/NodeUSB/nodemcu-ide

Итог

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

Теги: nodemcu jetbrains idea phpstorm python atom vscode lua

Packer: создаем свои vagrant box и docker image из одного конфига Ext4 vs XFS

comments powered by Disqus