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

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

Метки:
  1. ИгорьК

    ИгорьК Гуру

    Это то, что должно работать с последним коммитом для ESP32c6?

    Значит, ситуация получается такая (обобщая две ветки).

    Это не так - на другом компе все собралось. Тем более, чуть раньше вы сами указывали на вторую опцию USB Serial/JTAG Conrtoller

    Тем не менее VS Code Nodemcu Tools 4.1.2 модуль не видит, напрямую через com-port PuTTy модуль виден.

    В диспетчере COM7 выглядит так:
    upload_2024-5-26_15-52-38.png

    node.c и менял, и не менял - все одно. Железка у меня такая.


    ... и тут NodeMCU Tool 4.2.0 вылезло, а я и не заметил. Сколько времени погубил...

    -----------------------

    Итого. Через UART оно заработало. Через COM/USB - не получилось.

    upload_2024-5-26_17-8-48.png
     
    Последнее редактирование: 26 май 2024
    serg3295 нравится это.
  2. serg3295

    serg3295 Гуру

    Это хорошо, что заработало.
    node.c трогать больше не надо. Старые ветки гита можно поудалять с флагом --force, чтобы не мешались, и не путали картину.

    Я писал про USB CDC.
    У меня тогда была только esp s2, а у неё есть usb cdc. По этому порту она и пыталась соединиться. А пункта USB Serial/JTAG controller у неё вообще нет.
    Теперь у меня есть esp с6. Вот такая. У неё наоборот. Нет USB CDC, а есть USB Serial/JTAG controller. Но соединяется она через UART.

    [​IMG]
     
    ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Гуру

    То есть через USB соединение не ожидается? Невелика проблема, но если плата в устройстве то придётся делать разъём, без которого лучше бы обойтись.

    А что это за релиз NodeMCU Tool 4.2.0?
     
  4. serg3295

    serg3295 Гуру

    То же самое, что я выкладывал под временной версией 4.1.2. Вроде бы.
    Я просто увеличиваю сразу версию на единичку, чтобы разрабатываемая версия на моём компе не конфликтовала с предыдущим релизом.
    А в окончательном релизе поскольку была добавлена новая функция, то и номер версии релиза изменился на 4.2.0

    Ну, не то чтобы совсем не ожидается :)
    Вывод производится на вторичную консоль, то есть, в моём случае, на второй разъём USB.
    26-05-24_19-43.png

    Я подключил сразу два порта к плате. На первичной консоли USB to UART порт /dev/ttyACM0, и на вторичной ESP32-C6 USB порт /dev/ttyACM1. Во вторичную консоль дублируется вывод. Она похоже не поддерживает REPL. А вот должна ли она это делать, или нет, я не знаю. Надо будет код посмотреть.
    Даже в самом названии параметра явно указано, что вторичная консоль только для вывода.
    Иллюстрация:
    26-05-24_20-07.png

    Зато через этот порт можно приконнектится отладчиком OpenOCD без JTAG адаптера, если указать (x) No secondary console.
     
    Последнее редактирование: 27 май 2024
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Обновление?
     
  6. serg3295

    serg3295 Гуру

    Платы на современных чипах Espressif поддерживают различные интерфейсы для взаимодействия через консоль
    - UART0
    - USB CDC
    - USB Serial/JTAG Controller

    Канал только для вывода на вторичную консоль присутствует, но должен быть отключен при работе с расширением через основную консоль.

    Channel for console secondary output
    (X) No secondary console

    Для работы с некоторыми платами может потребоваться применение параметра connection-delay

    При подключении к ножкам UART0 на devboard через FTDI адаптер расширение работает со всеми типами плат как обычно.
    При подключении по USB: EDIT. см. примечание внизу сообщения
    - C3 super mini - jtag - работает
    - C6 - jtag - работает
    - S3 zero - jtag - частично работает; подробности тут (github)
    - S2 mini - cdc - не работает

    Других плат у меня нет, так что не проверял.

    Программное обеспечение nodemcu в настоящее время поддерживает не все интерфейсы чипов Espressif.
    Частично из-за недописанных драйверов, частично из-за ошибок в upstream esp-idf, касающихся непрерывного вывода двоичных данных из чипа в консоль.

    EDIT. Небольшое, но очень важное дополнение.
    Чтобы заработали чипы C3, C6 необходимо собрать прошивку на idf 5.2.2 и заменить оригинальный файл components/platform/platform.c на мою скорректированную версию (в приложении).
     

    Вложения:

    • platform.zip
      Размер файла:
      5,1 КБ
      Просмотров:
      17
    Последнее редактирование: 13 окт 2024
    ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    upload_2024-10-13_18-3-58.png

    5.2.2 находится где-то за пределами этого выбора?

    upload_2024-10-13_18-12-26.png
     
    Последнее редактирование: 13 окт 2024
  8. serg3295

    serg3295 Гуру

    За пределами.
    Первая картинка - это ветки самой nodemcu. Вторая- это то, чем мы сейчас займёмся :)

    esp-idf это rtos, которая подсовывается и в ардуино и в nodemcu и сама по себе может использоваться.
    Это просто субмодуль с точки зрения git и просто каталог с нашей точки зрения.
    Сейчас мы на версии esp-idf 5.1.2 Начинаем переходить на v5.2.2

    от последнего коммита dev-esp32 создаём новую ветку и переходим на неё
    git checkout -b v522
    cd sdk
    rm -rf esp32-esp-idf #сносим старый idf для надёжности
    git clone -b v5.2.2 --recursive https://github.com/espressif/esp-idf.git esp32-esp-idf
    тут качнули 1.5 Гб
    cd .. # поднялись в корневой каталог
    nodemcu-firmware> git add sdk/esp32-esp-idf
    git commit -m'use 5.2.2'
    подсунуть новый platform.c и потом его закоммитить
    git add и git commit

    должно получится что-то вроде этого:
    (я про последние два коммита)
    branches.png
    ## Начали собирать прошивку
    make fullclean
    make IDFPY_ARGS="set-target esp32s3" #ну, или другой чип

    Проверяем в портянке вывода наличие строчки про версию IDF, что мы удачно всё ей подсунули.

    -- Building ESP-IDF components for target esp32s3
    Processing 2 dependencies:
    [2/2] idf (5.2.2)

    далее как обычно

    make menuconfig
    проверить цель, установить канал вывода консоли в jtag
    make

    проверяем, что хоть что-то работает
    make monitor /dev/ttyACM0

    NodeMCU ESP32 build 2024-10-13 20:35 powered by Lua 5.3.5 [5.3-int32-singlefp] on IDF v5.2.2
    cannot open init.lua: No such file or directory
    >

    (выход оттуда ctrl+])


    Чтобы вернуть всё обратно, просто git checkout на последний коммит dev-esp32
    и
    git submodule update --recursive

    теперь можно шляться между ветками и собирать на разных idf, не забывая делать
    git submodule update --recursive
    make fullclean и другие заклинания.

    Обращаю внимание, что это исправление platform.c просто заплатка и не может быть оформлена в виде PR.
    Как то работает, и ладно.
     
    Последнее редактирование: 13 окт 2024
    ИгорьК нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Эээээммммм.... "Подождем твою мать"

    Есть проект пока на ESP32 обычной. Хотя лежит по одному экземпляру уж и не помню каких, но технической потребности в них не возникло.
     
    serg3295 нравится это.
  10. serg3295

    serg3295 Гуру

    Технически здесь удобство заключается в том, что ноги UART0 могут быть подключены к внешнему устройству, а консоль к USB.
    Отлаживаться удобно, если надо одновременно иметь подключенное внешнее устройство.
    Габариты и цена идут бонусом.
    Если такой задачи не стоит, то, действительно, не особо и нужно.
     
    ИгорьК нравится это.
  11. serg3295

    serg3295 Гуру

    IntelliSense для NodeMCU Lua.

    В редакторе VS Code для более комфортного написании кода для ESP8266 и ESP32 в среде NodeMCU Lua возможно использование IntelliSense. Эта возможность существует уже давно. Однако, в расширении LuaLS недавно были изменены конфигурационные параметры для подключения пользовательских библиотек. Поэтому я решил немного обновить информацию о методике установки и настройке пользовательского окружения в VS Code.

    Для того, чтобы IntelliSense заработало вам необходимо установить три вещи
    - расширение для VS Code Lua Language Server by Sumneko (LuaLS). Устанавливается стандартным способом.
    - файлы с определениями функций NodeMCU Lua.
    - систему контроля версий Git. Уверяю вас, в этом нет ничего страшного даже на Windows.

    Установить файлы определений можно через addon manager но этот способ может показаться кому-то сложным. Кроме того в репозитории LLS-Addons, откуда менеджер берёт файлы, содержатся не всегда актуальные версии nodemcu definitions. Я обновляю их там где-то раз в квартал, или даже реже.

    Самые свежие версии можно получить из моего оригинального репозитория nodeMCU-emmylua . Для этого необходимо на вашем компьютере выбрать место, куда вы хотите скачать репозиторий (это делается только один раз) и выполнить из консоли команду:
    git clone --depth=1 https://github.com/serg3295/nodeMCU-emmylua.git

    Будет создана директория nodeMCU-emmylua, и в неё склонируется репозиторий. Перейдя в эту вновь созданную директорию вы можете увидеть там несколько каталогов. Нас будут интересовать три, или даже два из них:
    - esp8266
    - esp32
    - esp32-idf3 (это определения для устаревшей ветки nodeMCU-firmware esp32. Но вдруг вы почему-то используете такую старую прошивку.)

    Итак, в каталогах esp32 и esp8266 содержатся файлы определений и конфигурации для соответствующих чипов. Именно эти каталоги мы и будем использовать в путях при конфигурировании.
    В дальнейшем, для периодического обновления файлов определений, достаточно будет перейти в директорию nodeMCU-emmylua и выполнить из консоли команду:
    git pull

    Переходим к настройкам.

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

    Эти параметры могут располагаться в разных местах. (Далее все пути указаны для Linux. Вариант для Windows @ИгорьК любезно добавил в сообщении ниже).
    - ~/.config/Code/User/settings.json (действуют на все ваши проекты)
    - ./.vscode/settings.json в папке вашего проекта (наивысший приоритет, то есть workspace settings переписывают совпадающие настройки из User/settings.json)

    Ещё настройки могут быть указаны в файле .luarc.json в каталоге проекта, но его мы подробно рассматривать не будем.

    В ~/.config/Code/User/settings.json прописываем следующие параметры:

    Код (Javascript):
    "Lua.workspace.userThirdParty": [ "<путь, куда мы скачали репозиторий с файлами определений>/nodeMCU-emmylua" ]
    "Lua.workspace.checkThirdParty": "Ask",
     
    Параметр workspace.userThirdParty укажет пути, где LuaLS будет искать пользовательские файлы определений. Это массив строк. Здесь мы указываем путь к директории nodeMCU-emmylua.

    Параметр workspace.checkThirdParty указывает, что нужно спрашивать пользователя о необходимости применения настроек при обнаружении кода для nodeMCU Lua.

    Для запуска автоматического конфигурирования необходимо в каталоге с проектом открыть файл .lua с кодом для esp32 или esp8266. Этот файл не должен попадать под действие .gitignore, иначе LLS его не проанализирует и автоконфигурирования не произойдёт.
    Затем LuaLS будет сделано предположение о назначении кода пользователя - для esp32 или для esp8266 и предложено обновить настройки.
    18-11-24_15-15.png
    Если автоматическое конфигурирование не предлагается, то нужно открыть файл .lua с кодом для esp32 или esp8266, и нажать ctrl+shift+p команда -> Developer: Reload Window

    Желательно провести автоматическое применение настроек хотя бы один раз, для того, чтобы посмотреть что будет сгенерировано в файле .vscode/settings.json. А именно, настройки для языка и встроенных библиотек. Для esp8266 и для esp32 эти настройки будут разными. Да и версию Lua вы можете использовать не 5.3, а 5.1.

    Пример сгенерированных настроек для esp32 и Lua 5.3:
    Код (Javascript):
    "Lua.runtime.version": "Lua 5.3",
    "Lua.runtime.builtin": {
    "utf8": "disable",
    "math": "disable",
    "bit32": "disable",
    "os": "disable",
    "bit": "disable"
    },
    "Lua.runtime.plugin": "<наш путь>/nodeMCU-emmylua/esp32/plugin.lua",
    "Lua.workspace.library": [ "<этот же путь>/nodeMCU-emmylua/esp32/library" ]
     
    В параметре workspace.library будет автоматически подставлен путь к подключенным файлам определений для конкретного чипа.
    Параметр Lua.runtime.plugin содержит путь к плагину, который нужен для того, чтобы работало автодополнение в некоторых модулях.

    Для отключения попыток автоматического конфигурирования необходимо установить параметр "Lua.workspace.checkThirdParty": "Disable" или в false.
    Это можно сделать в файле ~/.config/Code/User/settings.json (будет действовать для всех проектов), или в файле ./.vscode/settings.json для конкретного проекта.
     
    Последнее редактирование: 19 ноя 2024
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    В Windows можно открыть проводник и вставить следующее:
    Код (Bash):
    %APPDATA%\Code\User\settings.json
    upload_2024-11-19_8-36-55.png

    Файл откроется для редактирования в VSCode
     
    serg3295 нравится это.
  13. ИгорьК

    ИгорьК Гуру

    @serg3295, подниму вопрос о сборке lfs.img. Я собираю его через Terminal => Run Task...

    Эта последовательность определяется через файл tasks.json в папке .vscode.
    Как мне помнится, мы устанавливали Lua для того, чтобы через эту установку иметь доступ к файлу luac.cross.exe, который должен находиться в директории Lua. Причем самой этой Lua мы не пользуемся.

    Вместе с тем, при переходе от ESP32 к ESP8266 и обратно приходится в директории Lua менять и переименовывать luac.cross.exe.

    Изменилось ли что-то сейчас в порядке сборки lfs.img у вас?

    -------------------------------

    Нужен ли нам nodemcu-tool для чего-то, кроме непосредственной работы с ним самим, то есть, используется ли nodemcu-tool в системе еще чем-то?

    --------------------------------
     
    Последнее редактирование: 20 ноя 2024
  14. serg3295

    serg3295 Гуру

    Я постараюсь написать более подробно о методике сборки lfs в расширении. Скорее о практике применения.
    Пока на часть вопросов может ответить wiki на github'e.

    Если вкратце.
    Для сборки lfs расширению требуется только файл .nodemcutools в корне проекта.
    Из папки .vscode удалите всё, кроме файла settings.json.
     
    Последнее редактирование: 21 ноя 2024
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    Ну, Да! Это работает, работает замечательно! Чуть добавить: команду на компиляцию искать не в контекстном меню, а в Treminal=>Run Task=>NodeMCU=>... здесь выбор из пары значений.

    Отлично!!! Спасибо!
     
    serg3295 нравится это.
  16. ИгорьК

    ИгорьК Гуру

    Мои наблюдения для виндовс.

    Перед действом из поста об IntelliSence как сейчас он сделан @serg3295 необходимо:
    1. Удалить VS Code Lua Language Server by Sumneko и NodeMCU-Tools.

    Это можно и не делать, но с прошлых настроек/перенастроек наверняка сохранилось много противоречивых записей, и их надо внимательно вычищать.

    Почистить от любых упоминаний о Lua или внимательно все пересмотреть, оставить то что касается LLS (с учетом п. 1) три файла
    • общий settings.json
    • xxxx.code-workspace, что лежит в директории проекта
    • settings.json, что лежит в в папке .vscode в директории проекта.

    Устанавливать все что сказано в посте @serg3295
     
    serg3295 нравится это.
  17. serg3295

    serg3295 Гуру

    Ну, тогда, для полноты картины, приведу свои параметры в качестве примера. :)
    Оптимальный Универсальный, вот! (минимальный даже), на мой взгляд, наборчик.;)

    Код (Javascript):
      "Lua.workspace.checkThirdParty": "Ask",
      "Lua.workspace.userThirdParty": [ "/home/serg/Projects/lua/definitions/nodeMCU-emmylua" ],
      "nodemcu-tools.snippets": {
        "LFS state": "local s,p,n={},print,node.LFS;for _,k in ipairs{'lfs_base','lfs_mapped','lfs_size','lfs_used'}do s[#s+1]='%s = 0x%06x'%{k,n.config[k]}end;p('> LFS cfg:\\n{ %s }\\n> LFS list:'%table.concat(s,', '))for k,v in pairs(n.list())do p(k,v)end;collectgarbage()",
        "Get dummy strings": "local a=debug.getstrings('RAM')for b=1,#a do a[b]=('%q'):format(a[b])end;print('local preload='..table.concat(a,','))"
      },
      "nodemcu-tools.overwriteSnippets": false,
     
    Код (Javascript):

    {
      "nodemcu-tools.snippets": {
        "WiFi state": "print('ip: %s\\tmask: %s\\tgw: %s'%{wifi.sta.getip()}..'\\thostname: %s'%wifi.sta.gethostname())",
        "Set WiFi": "wifi.setmode(wifi.STATION,true)wifi.sta.config({ssid='Dacha',pwd='ide44D8E',auto=true,save=true})tmr.create():alarm(5000,tmr.ALARM_SINGLE,function()print('ip: %s\\tmask: %s\\tgw: %s'%{wifi.sta.getip()}..'\\thostname: %s'%wifi.sta.gethostname())end)"
      },
      "Lua.runtime.version": "Lua 5.3",
      "Lua.runtime.builtin": {
        "io": "disable",
        "utf8": "disable",
        "math": "disable",
        "bit32": "disable",
        "os": "disable",
        "bit": "disable"
      },
      "Lua.runtime.plugin": "/home/serg/Projects/lua/definitions/nodeMCU-emmylua/esp8266/plugin.lua",
      "Lua.workspace.library": [
        "/home/serg/Projects/lua/definitions/nodeMCU-emmylua/esp8266/library"
      ],
    }
     
    @ИгорьК, а зачем использовать файл code-workspace? Я сколько-то лет назад с этим поиграл и с тех пор нигде ни разу его не применял. Не зашла мне эта мелкомягкая концепция с multi workspaces
     
    Последнее редактирование: 21 ноя 2024
    ИгорьК нравится это.
  18. serg3295

    serg3295 Гуру

    Сборка LFS в расширении nodemcu-tools.

    Одной из целей доработки расширения было максимально повысить удобство пользователя при работе с экосистемой NodeMCU Lua. За прошедшие годы расширение эволюционировало, добавлялись новые функции. В частности, в версии 3.5.5 осуществился переход от системы сборки образа LFS с использованием команд из файла task.json к сборке LFS самим nodemcu-tools.

    Эта заметка дополняет информацию в wiki на github'e и содержит в основном советы, которым не обязательно следовать, так как они субъективны. Но поскольку интерфейс пользователя гибко настраивается, каждый может изменить структуру проекта, названия папок и файлов в соответствии со своими предпочтениями.

    Совет № 1
    Для начала разложим все файлы по "своим" каталогам. Например, структура корневого каталога для проекта на esp8266 может выглядеть так:
    root-folder.png

    Для сборки образа LFS требуется только наличие корректного файла конфигурации .nodemcutools в корневом каталоге проекта.

    Папка .vscode. Там в общем случае может лежать файл settings.json с настройками специфичными для данного проекта, но при сборке он не используется.

    В папке lfs находятся файлы, которые будут включены в образ LFS при сборке. Вы можете красиво разложить файлы по папкам, например lfs/http, lfs/mqtt, lfs/log. И затем указать в файле конфигурации каталоги для включения в сборку.
    Код (C++):
      "include": [
         "lfs/*.lua",
         "lfs/http/*.lua",
         "lfs/mqtt/*.lua",
         "lfs/log/*.lua"
    ],
    В папке spiffs находятся файлы, предназначенные для выгрузки на SPIFFS. Нахождение этих файлов внутри отдельной папки позволяет одним кликом мыши выгрузить сразу всё содержимое папки на устройство без выделения набора файлов. Как это сделать описано в wiki (команды Upload Folder to device и [ALT] Upload files under folder to device)

    В каталог out будут помещены результаты сборки
    out.png

    Папка resource.
    Если целью является esp8266, то при сборке дополнительно может использоваться механизм включения файлов ресурсов в образ LFS (документация на nodemcu file_lfs ). Расширение автоматически соберет файлы из каталога, указанного в файле конфигурации и поместит их в файл out/resourse.lua, который и будет включен в образ LFS. Никаких дополнительных скриптов, как этого требует официальная документация, запускать не надо. Имя файла resource.lua зарезервировано и не может быть изменено.

    Если целью является esp32, то эта опция не применима. Используйте eromfs. Я подробно описывал применение eromfs вот здесь.

    Совет № 2
    Для удобства пользования можно глобально назначить горячие клавиши для вызова меню задач и задачи сборки.
    • Tasks: Run Task: workbench.action.tasks.runTask (у меня Alt-T<ask>)
    • Tasks: Run Build Task: workbench.action.tasks.build (обычно уже назначено Ctrl+Shift+B)
    Поскольку в качестве задачи сборки по умолчанию является сборка lfs.img, то вызов Run Build Task приведёт к сборке проекта.

    Обновить список задач можно нажав ShowAllTasks... или NodeMCU.
    tasks.png

    Должно получиться вот так:
    tasks2.png

    Совет № 3

    Не копируйте файлы из своих библиотек в каждый проект. Просто укажите в "include" путь к конкретному библиотечному файлу, или целому каталогу. Он будет включен в сборку.
    Код (C++):
    "include": [
    "lfs/*.lua",
    "/home/serg/Projects/lua/nodemcu/esp8266/lib/file-lfs.lua"
    ],
     
    Последнее редактирование: 22 ноя 2024
    ИгорьК нравится это.
  19. ИгорьК

    ИгорьК Гуру

    Это вы у @serg3295 спросите. До его работы я на ESPLorer сидел и о VSCode знал только как об инструменте компиляции прошивок Marlin для 3D принтера. Да и потом на Klipper перешёл и перестал им пользоваться.

    А теперь уж дудки, к хорошему привыкаешь. Хотя сначала ESPLorer казался верхом совершенства :)
     
  20. serg3295

    serg3295 Гуру

    tl;dr. Если вы не используете multi-root workspaces, то этот файл можно удалить.

    Поскольку вопрос вернулся ко мне :D я поясню.
    У VSCode есть много разных функций, которые я сознательно не использую. Например, notebook, пользовательские профили, chatGPT и вот эти multi-root workspaces. А кто-то без всего этого жить не может, наверное.

    Я с трудом придумал модель применения для multi-root. Объединил два workspace, в одном был проект, в другом справочная информация по проекту. Всё работает, всё хорошо, но потом просто закинул эту информацию в папку doc в проекте, и прописал её в .gitignore. И больше к этим multi-root не возвращался. Фантазия на тему "как это применить" закончилась.
    Документация на сайте про multi-root большая и хорошая, но она отвечает на вопрос "как", а я не понимаю "зачем"!? Бывает, что не хватает для понимания общей картины какой-то маленькой детали.

    Поэтому я и подумал, вдруг вы познали дзен и вам открылась модель применения этой концепции ;)
    Но если нет, то и ладно. Без неё тоже всё хорошо.
     
    ИгорьК нравится это.