Расширение для vs code, обеспечивающее работу с nodemcu lua

Тема в разделе "ESP8266, ESP32", создана пользователем serg3295, 2 апр 2023.

Метки:
  1. serg3295

    serg3295 Гуру

    В этой теме речь пойдёт о расширении для Visual Studio Code, которое обеспечивает взаимодействие с NodeMCU, прошивкой на базе Lua для чипов ESP8266 и ESP32.

    Большинство пользователей при работе с esp8266 и esp32 используют широко известное приложение Esplorer для загрузки и выгрузки файлов, а также для интерактивной отладки скриптов. Однако, возможности встроенного редактора Esplorer'a существенно меньше, чем целого ряда современных редакторов кода, например, VS Code. Пользователям приходится редактировать скрипты в своём любимом редакторе, копировать, или сохранять в файл фрагменты кода. Затем, переключаться между приложениями для записи файлов на esp, или для отладки фрагмента кода. То есть, рабочий процесс необоснованно усложняется.

    Для того, чтобы исключить Esplorer из рабочего процесса можно использовать замечательное кроссплатформенное расширение для VS Code boressoft.nodemcu-tools, реализующее следующие функции:
    • подключение к нескольким устройствам одновременно, и отображение их в виде дерева в панели VS Code;
    • использование выделенного терминала для каждого подключенного устройства и отправка команд в устройство из командной строки терминала;
    • загрузку и выгрузку файлов на/в устройство
    • компиляцию, удаление, запуск Lua файлов на устройстве.
    Однако, текущая версия 3.5.0 данного расширения не поддерживает работу с esp32 с прошивкой на базе IDFv4.4 и IDFv5.0. Также отсутствуют функции отправки на устройство строки кода непосредственно из открытого окна файла с программой (без копирования в командную строку терминала) и отправки выделенного фрагмента кода на устройство. Такие возможности есть в Esplorer'e и удобны при отладке скриптов.

    Я сделал модификацию расширения boressoft.nodemcu-tools (далее по тексту я буду употреблять термин "мод" для краткости). В моде добавлены следующие вещи:
    • поддержка работы с esp32 с прошивкой на базе IDFv4.4 и IDFv5.0;
    • команда "отправка строки" nodemcu-tools.sendLine для отправки строки кода из окна редактора в устройство. Длина строки должна быть менее 254 байт;
    • команда "отправка блока" nodemcu-tools.sendBlock для отправки выделенного фрагмента кода из окна редактора в устройство. Размер фрагмента может превышать 254 байта;
    Команды становятся активными только при установленном соединении с устройством и фокусе на окне редактора. Команда может быть выполнена либо нажатием на пиктограмму в правом верхнем углу активного окна редактора, либо из контекстного меню, выпадающего по нажатию правой клавиши мыши. Также на эти команды могут быть назначены горячие клавиши обычным для VS Code образом.

    Версия VS Code должна быть минимум 1.75

    Так как изменения, произведённые в моде незначительны, мод не будет опубликован на Visual Studio Marketplace и все авторские атрибуты оригинального расширения не были изменены. В моде будет меняться только Changelog и номер версии выпущенного расширения, причём только в поле PATCH. Это несколько противоречит требованиям семантического версионирования, но позволяет минимизировать вероятность конфликта с возможными новыми версиями авторского расширения.

    Свежую версию мода можно скачать по этой ссылке.

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

    Рекомендация. Для реализации автодополнения функций NodeMCU в редакторе VS Code предлагается использовать расширение sumneko's LuaLS с подключенными addons nodemcu-esp32 и nodemcu-esp8266.
     
    ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Маленький вклад в синие кнопочки:
    Код (Bash):
        "nodemcu-tools.snippets": {
            "Restart": "node.restart()",
            "Rename init": "dofile('_renameinit.lua')",
            "__init": "dofile('__init.lua')",
            "Heap": "=node.heap()",
            "Reload LFS": "node.LFS.reload('lfs.img')",
            "Del lfs.img": "file.remove('fs.img')",
            "ChipID": "=node.chipid()",
            "WiFi Status": "local wifista=wifi.sta.status();for k,v in pairs(wifi) do if v==wifista and string.sub(k,1,4)=='STA_' then print(k) end end",
            "WiFi IP": "=wifi.sta.getip()",
            "WiFi APs": "wifi.sta.getap({show_hidden=1},1,function(t) for k,v in pairs(t) do print(k..':'..v) end end)",
            "WiFi 8266": "do wifi.setmode(wifi.STATION) cfg={} cfg.ssid='AP_Home' cfg.pwd='superpassword' cfg.save=true cfg.auto=true wifi.sta.config(cfg) wifi.sta.connect() end"
        },
     
    Последнее редактирование: 5 апр 2023
    serg3295 нравится это.
  3. serg3295

    serg3295 Гуру

    Спасибо за набор сниппетов!

    Некоторые комментарии к предложенным командам.
    • Reload LFS
      если в дереве на имеющемся файле с расширением .img щёлкнуть правым глазом мыши, то можно будет выполнить команду Upload to device and set as LFS она выгрузит и сделает node.LFS.reload("${name}")
    • ChipID
      мне было жалко на неё тратить кнопку. Я думал потом сделать индикацию chipid в tooltips'e при наведении на тип чипа в status bar. То есть, в строке под кнопками сниппетов.
    • команды, зависящие от архитектуры лучше запихивать в Workspace setting.
     
    ИгорьК нравится это.
  4. serg3295

    serg3295 Гуру

    Работа со сниппетами

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

    По умолчанию установлены сниппеты для отправки общеупотребительных команд, которые могут выполняться как на esp8266, так и на esp32.

    Однако, команды для esp8266 и для esp32 отличаются, поэтому пользователь имеет возможность создать свой набор сниппетов, учитывая архитектуру устройства, с которым он работает в данном Workspace.
    Для этого необходимо использовать опцию Nodemcu-tools: Snippets в Settings. С её помощью можно задать различные наборы сниппетов, индивидуальных для User и для каждого рабочего пространства Workspace.
    Сниппеты в рабочем пространстве будут переопределять наборы сниппетов в User и сниппетов по умолчанию. Это даст возможность пользователям даже удалять предустановленные сниппеты.

    Устанавливаемая опция "nodemcu-tools.snippets" представляет собой объект, каждое из свойств которого представляет один сниппет в формате
    "Имя, отображаемое на кнопке": "Текст команды"
    Код (Javascript):
    "nodemcu-tools.snippets": {
       "Restart": "node.restart()",
       "workspace snippet": "print'workspace snippet'"
    }
    Длина посылаемой команды ограничена 254-мя символами. Если вы захотите выполнить более длинную команду, и вам не хватит немного байт, вы можете воспользоваться утилитой luamin. Она сожмёт написанную вами команду до максимально возможного состояния, и полученный с помощью неё сжатый код, вы сможете внести в сниппет. Если, конечно, удалось сжать до 254 и менее символов, без учёта CRLF.
     
    Последнее редактирование: 5 апр 2023
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Насколько я ухватил и пользуюсь, LFS файл образуется через меню Terminal - Run Task - LFS собрать, выгрузить и flashreload.

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

    С данным расширением такой путь не оптимален. Полагаю, через Terminal - Run Task нужно только собирать LFS, а выгружать указанным здесь способом. Согласны?
    Либо еще какой-то подход. Хотя все прекрасно работает с учетом сказанного,
     
    serg3295 нравится это.
  6. serg3295

    serg3295 Гуру

    Да, всё верно.
    Я уже давно переписал командные файлы auto.sh и tasks.json но только для Linux.
    Всё руки не доходят привести их в порядок и выложить на github.
    В планах интегрировать, насколько это возможно, эти командные файлы с модифицируемым расширением.

    Что касается LFS, предлагаю немного сменить порядок сборки. Файлы, подлежащие выгрузке в LFS, помещать в каталог lfs в текущем Workspace.
    Это позволяет более точно контролировать состав файлов в LFS, а то в корневой папке обычно появляется много всякого мусора.
    У меня сделано вот так:
    Код (Bash):

    # файл tasks.json
      {
      "label": "build LFS",
      "type": "shell",
      "command": "./.vscode/auto.sh 11 ./.output/lfs.img ./.output/lfs.log",
      "presentation": {
      "reveal": "silent",
      "showReuseMessage": false,
      "clear": true
      }
      },

    # файл auto.sh
    #--- command - build LFS using files under lfs folder ---
      11)
      fpath=$2
      rmFile $fpath
      $luacCross -o $fpath -f -l ./lfs/*.lua > $3
      if [ -f $fpath ]; then
      echo "\033[33mLFS was created\033[0m"
      else
      echo "\033[31mError. LFS was not created\033[0m"
      fi
      ;;
     
     
    ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Лучше каталог _lfs или __lfs, чтобы висел сверху и было легче искать.
     
  8. serg3295

    serg3295 Гуру

    Да, можно будет попробовать с одним подчёркиванием.
     
  9. serg3295

    serg3295 Гуру

    Выпущена версия 3.5.2
    • Добавлена опция nodemcu.minify.enable. По умолчанию установлена в false;
    • Снижено требование к минимальной версии VS Code до 1.74.0;
    • Исправлены некоторые ошибки.
    При отправке кода из окна редактора в устройство с использованием команд nodemcu-tools.sendline и nodemcu-tools.sendblock можно включить сжатие отправляемого Lua кода утилитой luamin, установив опцию nodemcu.minify.enable в true.
    При включенной опции код будет преобразован в одну сжатую строку перед отправкой на устройство.
    Если в отправляемом фрагменте кода присутствует синтаксическая ошибка, то код не будет отправлен, и появится всплывающее окно предупреждения с кратким описанием найденной ошибки.

    Данная опция может потребоваться, если вам нужно загрузить достаточно большой фрагмент файла, а на устройстве осталось мало свободной памяти. Однако, при этом будут сложно локализовать возможные ошибки при выполнении кода, так как весь отправляемый код был преобразован в одну строку.
    В обычных условиях удобнее сохранять номера строк для отладки, поэтому опция сжатия выключена по умолчанию.
    Рекомендуется устанавливать эту опцию локально в Workspace, тогда её можно будет менять "на лету", не перегружая окно редактора и не разрывая соединения с устройством.
     
    ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Гуру

    Отлично!
    И если следующая версия будет загружать в модуль файлы пакетом - это будет шикарное Extension.
     
  11. serg3295

    serg3295 Гуру

    Я не нашёл в официальном API VS Code функции для получения пользователем выбранной в Explorer view группы файлов. Можно попробовать получить список выбранных файлов кривым способом через реализованные для multiple selection системные функции, но решение выглядит так себе...

    Если есть необходимость выгружать все 100500 файлов за раз, то может имеет смысл записать их один раз в файл конфигурации, например, .epspack, или ещё какой-нибудь pack по аналогии с файлом сборки проекта, и положить его в workspace. Чем каждый раз мышью выбирать файлы в дереве. А файл конфигурации легче прочитать и можно выгружать из него по списку.
     
  12. ИгорьК

    ИгорьК Гуру

    upload_2023-4-7_21-56-55.png

    Это - часы. Реальный проект. Там и в LFS 100500 файлов и просто вне LFS еще столько же.
    Надо все закинуть в часы сначала. C LFS все ок. А эту жуть приходится по одному. Не, ну конечно не по одному, а через ESPlorer. И вот эта фича - чтобы от него избавиться полностью.
     
  13. serg3295

    serg3295 Гуру

    Да, файлов много.
    Я подумаю как можно реализовать такую функцию.
     
  14. serg3295

    serg3295 Гуру

    Выпущена версия 3.5.3
    • Добавлена загрузка нескольких выбранных файлов на устройство;
    Теперь файлы могут быть выгружены пакетом. Для этого необходимо выделить несколько файлов и выполнить команду из контекстного меню 'Upload to device'.
    В выделение могут быть включены любые файлы и каталоги, но на устройство будут выгружены только файлы с расширением .lua, включая файлы, находящиеся в подкаталогах.
    Необходимо следить, чтобы после выделения группы файлов и каталогов курсор в момент нажатия на правую клавишу мыши находился на файле, а не на каталоге. В противном случае команда 'Upload to device' будет неактивна в контекстном меню.
    • Добавлено отображение chipID в tooltip при наведении курсора на chipArch в StatusBar.
     
    Последнее редактирование: 12 апр 2023
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    Теперь идеально :)

    Добавлю копейку. Для обычной сборки LFS в среде Windows то что в посте 6 пишу так:

    Код (Bash):
    // tasks.json:
           {
                "label": "COM: LFS собрать",
                "type": "shell",
                "command": "Set-ExecutionPolicy RemoteSigned -Scope Process ;./.vscode/auto.ps1 5 ./.output/lfs.img  ./.output/LFS_image-float.log",
                "problemMatcher": [],
                "presentation": {
                    "focus": true,
                    "clear": true
                }
            },

    // aito.ps1:
        5 {
            $fpath = "./.output/lfs.img"
            $varinp = "./_lfs/*.lua"
            $isFile = Test-Path $fpath
            if($isfile) {
                Remove-Item -Path $fpath
            }
            luac.cross.exe -o $args[1] -f -m $lfsSize -l $varinp | Out-file $args[2]
            $isFile = Test-Path $fpath
            if($isfile) {
                Write-Output("Compiled Now!")
            }
            else {
                Write-Warning("Compile error now")
            }
           break
        }
    }
     
    serg3295 нравится это.
  16. ИгорьК

    ИгорьК Гуру

    По теме, не по теме... Делаю захват. Захват абсолютно рабочий, правильный. Но VS Code не признает за своего красит файл красным. Со всеми криками на тему.

    Не сталкивались? Не знаете как принудить его согласиться:

    upload_2023-4-12_13-20-28.png

    upload_2023-4-12_13-26-10.png

    Код (Lua):
    timezone, nowt, d  =  string.match(e,  'timezone>(%d+)<.*temperature value="(%p*%d+\.-%d*).*weather number="(%d+)"' )
     
  17. ИгорьК

    ИгорьК Гуру

    Ни разу не сталкивался с необходимостью где-то его применять. Почему ему столько внимания?
     
  18. serg3295

    serg3295 Гуру

    backslash используется для \a \b \f \n \r \t \v \\ \" \' \[ \] \ddd decimal
    а тут точка.
    Если мы ловим точку, то тогда %.
    В Esplorer'e этот сниппет был, да и было у меня получено это значение по-любому. Надо же было его куда-то засунуть.
    Сейчас ещё кнопку Format приделал, потому что была в Esplorer'e. Хотя в строке терминала можно набрать file.format()
     
    ИгорьК нравится это.
  19. ИгорьК

    ИгорьК Гуру

    Перегрелся я :) Сильно перегрелся :)
     
    serg3295 нравится это.
  20. serg3295

    serg3295 Гуру

    Выпущена версия 3.5.4
    • Добавлена команда сборки образа lfs и выгрузки его на устройство по последовательному порту;
    • Добавлена кнопка "Format" на панель терминала для форматирования ESP;
    • Улучшен пользовательский интерфейс
      - добавлены tooltips на кнопки терминала;
      - увеличена задержка до показа tooltips на кнопках выполнения команд.
    В настоящей версии добавлена возможность сборки образа LFS и выгрузки его по последовательному порту через уже установленное соединение с устройством. Данная функция реализована через стандартный интерфейс VS Code -> Run Task. Добавление новой встроенной команды никак не влияет на остальные команды, находящиеся в файле tasks.json.

    Необходимым условием работы этой дополнительной команды является наличие файла .nodemcutools в корне рабочей директории (workspace), который содержит конфигурацию для работы команды. (Обратите внимание на точку в начале имени файла!) Если этот файл отсутствует, то команда просто не появится в выпадающем списке доступных для выполнения команд.
    Файл конфигурации представляет собой обычный файл формата json в котором пользователь может менять некоторые параметры, подставляемые в командную строку кросс-компилятора.

    Второе необходимое условие, это наличие кросс-компилятора luac.cross (для Windows - luac.cross.exe). Так как этот файл непосредственно связан с форматом прошивки, которая находится у вас в ESP, то пользователь должен следить за правильностью выбора соответствующей версии кросс-компилятора. В частности, учитывать архитектуру чипа и версию Lua.

    Файл конфигурации .nodemcutools

    Файл конфигурации может содержать всего четыре параметра, причём, обязательным является только один - compilerExecutable. Если этот параметр не будет указан, или указан неверно, то расширение сообщит об ошибке, и команда не будет выполняться. При отсутствии в файле конфигурации остальных параметров, им будут автоматически присвоены значения по умолчанию.
    Правильность заполнения файла .nodemcutools автоматически проверяется программой, поэтому пользователю будут выдаваться подсказки при ручном заполнении этого файла. При наличии критических ошибок на панели Problems VS Code появится соответствующее уведомление.

    Допустимые параметры следующие:
    • "compilerExecutable" - Обязательный. Указание абсолютного пути к исполняемому файлу кросс-компилятора плюс полное имя самого файла;
    • "include" - Опциональный. Шаблоны для файлов, подлежащих сборке в LFS. Каждая строка в массиве представляет собой шаблон. Пути могут указываться как в относительном формате (относительно корневого директория workspace), так и в абсолютном. Допускается задавать явное имя файла, а также, при указании абсолютного пути, файлы вне рабочего пространства открытой директории. Последнее дает возможность собирать библиотеки без копирования их в рабочий проект каждый раз. Значение по умолчанию "./lfs/*.lua";
    • "outDir" - Опциональный. Имя каталога в который будет осуществляться вывод всех файлов, производимых кросс-компилятором. Должен находится в корневой папке workspace. Если заданный каталог не существует, то программа создаст его. Значение по умолчанию "./out";
    • "outFile" - Опциональный. Имя файла образа LFS. Значение по умолчанию "lfs.img".

    Примеры файла конфигурации
    Код (Javascript):
    // Для Linux
    {
      "compilerExecutable": "/opt/lua/esp8266/5.3/luac.cross",
      "include": [
        "lfs/*.lua",
        "/home/serg/Projects/lua/lib8266/ntp/ntp.lua"
      ],
      "outDir": "./tmp",
      "outFile": "luac.out"
    }

    // Для Windows
    {
      "compilerExecutable": "c:\\temp\\luac.cross.exe",
      "include": [
        "f.lua"
      ]
    }

    Минимальный файл конфигурации. Для всех остальных параметров будут подставлены значения по умолчанию.
    Код (Javascript):
    {
       "compilerExecutable": "/opt/lua/esp8266/5.3/luac.cross"
    }
    // или
    {
       "compilerExecutable": "c:\\temp\\luac.cross.exe"
    }
    Использование

    Для вызова команды необходимо использовать стандартный механизм Terminal -> Run Task (или назначить вызов Run Task на горячую клавишу). При корректно заполненном файле конфигурации .nodemcutools в выпадающем списке команд появится пункт NodeMCU. Если нажать на него, то появится окошко с нашей новой командой
    NodeMCU: Builds LFS and upload to device
    runTask2.png

    При выборе этой команды будет произведена компиляция и, если устройство подключено по последовательному порту, выгрузка файла образа lfs, с последующим рестартом ESP. Если вы забыли подключиться к устройству, то будет просто произведена компиляция, а выгрузка не произойдёт. Никаких дополнительных сообщений при этом не появится. В каталоге, который пользователь указал в качестве выходного, появятся файлы, произведённые компилятором.

    При каждом изменении файла конфигурации, в системе будет регистрироваться новая команда со своими параметрами. Это может привести к появлению в окне выбора команд нескольких команд одинаковых на вид, но с разными параметрами. Рекомендуется удалять их из списка recently used путём нажатия на крестик справа от команды. Для получения в списке команды, соответствующей текущим параметрам в файле конфигурации, надо выбрать пункт меню Show All Tasks... или NodeMCU.
    Данная ситуация возникает только при первоначальной настройке команды. Затем, если файл конфигурации не меняется, можно просто пользоваться командой из списка recently used.
    runTask.png
     
    Последнее редактирование: 27 апр 2023
    ИгорьК нравится это.