GyverLibs / GyverPortal

Простой конструктор веб интерфейса для esp8266 и ESP32
MIT License
302 stars 26 forks source link

Отладка без прошивки #62

Closed d-a-v closed 1 year ago

d-a-v commented 1 year ago

Отладка без прошивки

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

Предлагаются мелкие исправления:

(translated from:)

Debugging without flashing

This small addition shows how to use esp8266 Arduino core's ability to run / test / debug this nice library on host without flashing on micro-controller.

Minor fixes are proposed:

GyverLibs commented 1 year ago

Хоссподи спасибо, я уже собирался писать Serial-интерпретатор для отладки интерфейса через порт)

а можно гайд для чайников, как и чем запустить скрипт, что для этого нужно и по какому адресу искать вебморду?

d-a-v commented 1 year ago

../../onhost единственная команда для запуска

затем http://localhost:9080

~/dev/proj/arduino/libraries/GyverPortal/examples/demos/demoAllComponents$ ls -l
total 16
-rw-r--r-- 1 d-a-v d-a-v 1858 Jan 15 23:54 demoAllComponents.ino

~/dev/proj/arduino/libraries/GyverPortal/examples/demos/demoAllComponents$ ../../onhost
+ [ -z /home/d-a-v/dev/esp8266/esp8266 ]
+ [  = clean ]
+ [ ! -r ../../onhost ]
+ VALGRIND=valgrind
+ code=demoAllComponents
+ cd /home/d-a-v/dev/esp8266/esp8266/tests/host
+ make -j 8 V=1 FORCE32=0 ULIBDIRS=/home/d-a-v/dev/proj/arduino/libraries/GyverPortal/examples/demos/demoAllComponents/../../.. /home/d-a-v/dev/proj/arduino/libraries/GyverPortal/examples/demos/demoAllComponents/demoAllComponents
Makefile:21: using /usr/bin/g++ and /usr/bin/gcc
Makefile:47: compiling in native mode
[...]
----> /home/d-a-v/dev/esp8266/esp8266/tests/host/bin/demoAllComponents/demoAllComponents <----
+ valgrind /home/d-a-v/dev/esp8266/esp8266/tests/host/bin/demoAllComponents/demoAllComponents
==501212== Memcheck, a memory error detector
==501212== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==501212== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==501212== Command: /home/d-a-v/dev/esp8266/esp8266/tests/host/bin/demoAllComponents/demoAllComponents
==501212== 
SPIFFS: 1048576 bytes
SPIFFS: loading 1048576 bytes from '/home/d-a-v/dev/esp8266/esp8266/tests/host/bin/demoAllComponents/demoAllComponents-spiffs1024KB'
LittleFS: 1048576 bytes
LittleFS: loading 1048576 bytes from '/home/d-a-v/dev/esp8266/esp8266/tests/host/bin/demoAllComponents/demoAllComponents-littlefs1024KB'
10.0.1.7
(mock) =====> WiFiServer port: 80 shifted to 9080 (use option -s) <=====
GyverLibs commented 1 year ago

Создать батник в папке с ино файлом с командой ../../onhost? Нужен гайд для чайников)

d-a-v commented 1 year ago

Вам нужно клонировать ядро ​​Arduino esp8266 и указать переменную среды ESP8266 на его каталог.

$ echo $ESP8266
/home/d-a-v/dev/esp8266/esp8266
GyverLibs commented 1 year ago

Понял, будет проще написать парсер чем с этим разобраться) печально

d-a-v commented 1 year ago

Мне пришлось бы создать пакетный файл в каждом отдельном каталоге примера. Я думал, что печатать ./onhost — это то же самое, что и ../../onhost. Вы действительно хотите использовать один и тот же командный файл в каждом отдельном примере?

GyverLibs commented 1 year ago

Мне бы инструкцию подробную как это запустить)

d-a-v commented 1 year ago

Мне не ясно, нужна ли вам помощь, чтобы попробовать сейчас, или вы хотите получить более подробные инструкции в документации, чтобы завершить запрос на извлечение.

Перевод не помогает четко понять.

GyverLibs commented 1 year ago

Ok, I need step by step instructions how to run this debugging "simulation" on Windows 😅

d-a-v commented 1 year ago

Ah windows it is. Did you happen to install WSL2 ?

d-a-v commented 1 year ago

I have never tried and I know no-one who has already been running this "emulation-on-host" facility on Windows. I am not using windows. What is necessary is gcc and the posix API which is not native with windows but used by linux and esp8266. Native gcc and posix can be provided by cygwin, or WSL2 which is more modern.

GyverLibs commented 1 year ago

cygwin and WSL2 are new words for me)

d-a-v commented 1 year ago

cygwin brings gcc and the posix standard (used by linux and esp) to windows. Windows only follows the ANSI standard.

WSL2 is windows emulating the linux kernel API. It allows to install any linux distribution on top of windows. For example ubuntu would believe to be running on top of a linux kernel but windows is acting instead. WSL2 is made by microsoft and after it is installed , you need to install a linux distribution like Ubuntu on top of it.

Any of the two is needed for the esp8266 Arduino core emulation, because windows is not compatible with posix.

d-a-v commented 1 year ago

Closing per too old and probably unwanted.

GyverLibs commented 1 year ago

it's wanted thing, I just don't have time to test it

Prizrakost commented 1 year ago

Мне бы инструкцию подробную как это запустить)

  1. Установить WSL2 по инструкции
  2. В открытой консоли команда wsl запустит дистрибутив linux
  3. Установить нужные для сборки пакеты
    sudo apt update && sudo apt install build-essential git -y
  4. Можно создать папку для репозиториевmkdir repos && cd repos
  5. Клонировать нужные репозитории
    git clone --recursive https://github.com/esp8266/Arduino.git \
    git clone -b emulationOnHost https://github.com/d-a-v/GyverPortal.git
  6. Перейти в папку cd Arduino/tests/host/
  7. Можно почитать cat README.txt
  8. Компилируем коммандой
    make clean \
    ULIBDIRS=../../../GyverPortal/src make D=1 FORCE32=0 ../../../GyverPortal/examples/demos/demoAllComponents/demoAllComponents -j$(nproc)
  9. Запуск
    ./bin/demoAllComponents/demoAllComponents -s 8000
  10. Теперь в браузере можно зайти на http://localhost:8080, где и будет нужная страница
d-a-v commented 1 year ago

In case this is still relevant, merge conflict has been fixed.

aromprg commented 1 year ago

Примите его PR - реально полезная штука. Или хотя-бы его часть, где человек просит изменить название переменных "unix" на "unixx" (т.к. может быть #define) и ввести 64-битный указатель src/builder.h *_GPP += ((unsigned long)style) & 0xFFFF; вместо *_GPP += ((uint32_t)style) & 0xFFFF; Различий не так много: diff PS: Может я чего не понимаю - зачем вообще обрезать указатели *_GPP += FPSTR(style); ?

@d-a-v (UPD: Not actual) You could describe the emulation process in more detail (or give link example https://github.com/esp8266/Arduino/tree/master/tests/host) in the Readme (aka @Prizrakost) and clarify that it requires running on a Linux environment. Also question: Host emulation support ESP32 or only esp8266? (UPD: Not supported)

GyverLibs commented 1 year ago

Окей. Про обрезание указателя не понял

aromprg commented 1 year ago
void THEME(PGM_P style) {
    *_GPP += F("<link rel='stylesheet' href='/GP_STYLE.css?v" GP_VERSION "=");
    *_GPP += ((uint32_t)style) & 0xFFFF;   <---  здесь возможно надо использовать *_GPP += FPSTR(style); ? или я не понял задумку
    *_GPP += "'";
    *_GPP += ">\n";
    _gp_style = style;
}
GyverLibs commented 1 year ago

((uint32_t)style) & 0xFFFF выводит младшие два байта адреса переменной style, в итоге формируется строка /GP_STYLE.css?vX.X.X=адрес Честно - я не помню зачем, но оно неспроста =)

GyverLibs commented 1 year ago

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

aromprg commented 1 year ago

Все понятно. Спасибо!!!

aromprg commented 1 year ago

Реально работающая штука!!! Даже перенаправляет ввод/вывод Serial в терминал - для отладки ОГОНЬ! screen Тестировалось все на чистых системах в VirtualBox.

  1. Запустить на win10 (enterprise_ltsc_2021_x64 19044) через WSL не смог - ошибка valgrind (error calling PR_SET_PTRACER, vgdb might block). UPD: Скорее всего не заработало т.к. использовалась WSL1. Включить WSL2 не получается на виртуальной машине - windows sandbox недоступна (двойная паравиртуализация не работает, во всяком случае на моей конфигурации).
  2. Установил ubuntu-23.04-desktop-amd64. После установки в терминале вводим

В VirtualBox можно настроить общие папки с host-системой, а в них сделать simlink (HardLinkShellExt) на папку в Windows в которой разрабатываете.

GyverLibs commented 1 year ago

Спасибо, я добавлю гайд в ридми. А лучше сделай PR с максимально подробным описанием того что делать. Хотя лучше это добавить в wiki 🤔

А вообще по секрету portal будет не нужен, ему на замену идёт более мощная система GyverHUB https://github.com/GyverLibs/GyverHUB и там отладка без прошивки будет прямо в браузере, даже без подключения к esp

aromprg commented 1 year ago

Мне кажется лучше в вики. Попробую здесь описать как себе представляю.

Отладка на хосте без прошивки контроллера

[опциональный скриншот]
Начиная с версии 3.6.6 библиотеки, появилась возможность отлаживать скетчи на компьютере, без необходимости программирования платы. В настоящий момент поддерживается эмуляция контроллеров esp8266 c ограничениями на аппаратные функции. Более подробно как это работает https://github.com/esp8266/Arduino/blob/master/tests/host/README.txt.
Эмуляция работает только в Linux-окружении, для запуска введите в терминале ../../onhost из любого каталога примеров.

Для пользователей Windows возможно использовать:

После установки Linux-based системы необходимо:

  1. Установить нужные для сборки пакеты
    sudo apt update && sudo apt install build-essential git && sudo apt install valgrind
  2. Cоздать папку для репозиториев (напр. папка repos на рабочем столе текущего пользователя)
    mkdir /home/$USER/Desktop/repos && cd /home/$USER/Desktop/repos
  3. Клонировать нужные репозитории
    git clone --recursive https://github.com/esp8266/Arduino.git && git clone --recursive https://github.com/GyverLibs/GyverPortal.git
  4. Установить переменную окружения ESP8266. Потребуется вводить каждый раз при открытии нового сеанса терминала, или добавить в файл ~/.profile пользователя.
    export ESP8266=/home/$USER/Desktop/repos/Arduino
  5. Перейти в папку с отлаживаемым скетчем
    cd /home/$USER/Desktop/repos/GyverPortal/examples/demos/demoAllComponents
  6. Запустить скрипт, который скомпилирует код и запустит web-server на http://localhost:9080/
    ../../onhost

    Чтобы остановить работу скрипта нажать в терминале Ctrl+C.

    Примечание

    Скрипт при компиляции скетчей *.ino рассматривает их как обычные *.cpp -файлы, поэтому необходимо указывать объявления функций, расположенных вне области видимости текущего вызова.

    Example
void action(); // function declaration

void setup() {
  action(); // call function
}

// function definition
void action() {
  // todo
}

MARKDOWN

# Отладка на хосте без прошивки контроллера  
[опциональный скриншот]  
Начиная с версии 3.6.6 библиотеки, появилась возможность отлаживать скетчи на компьютере, без необходимости программирования платы. В настоящий момент поддерживается эмуляция контроллеров esp8266 c ограничениями на аппаратные функции. Более подробно как это работает https://github.com/esp8266/Arduino/blob/master/tests/host/README.txt.  
Эмуляция работает **только в Linux-окружении**, для запуска введите в терминале `../../onhost` из любого каталога примеров.

Для пользователей Windows возможно использовать:

- Виртуальную систему (напр. [VirtualBox](https://www.virtualbox.org/))
- Windows Subsystem for Linux ([WSL v2](https://learn.microsoft.com/windows/wsl/install))

После установки Linux-based системы необходимо:

1. Установить нужные для сборки пакеты 
```shell
sudo apt update && sudo apt install build-essential git && sudo apt install valgrind
  1. Cоздать папку для репозиториев (напр. папка repos на рабочем столе текущего пользователя)
    mkdir /home/$USER/Desktop/repos && cd /home/$USER/Desktop/repos
  2. Клонировать нужные репозитории
    git clone --recursive https://github.com/esp8266/Arduino.git && git clone --recursive https://github.com/GyverLibs/GyverPortal.git
  3. Установить переменную окружения ESP8266. Потребуется вводить каждый раз при открытии нового сеанса терминала, или добавить в файл ~/.profile пользователя.
    export ESP8266=/home/$USER/Desktop/repos/Arduino
  4. Перейти в папку с отлаживаемым скетчем
    cd /home/$USER/Desktop/repos/GyverPortal/examples/demos/demoAllComponents
  5. Запустить скрипт, который скомпилирует код и запустит web-server на http://localhost:9080/
    ../../onhost

    Чтобы остановить работу скрипта нажать в терминале Ctrl+C.

    Примечание

    Скрипт при компиляции скетчей *.ino рассматривает их как обычные *.cpp -файлы, поэтому необходимо указывать объявления функций, расположенных вне области видимости текущего вызова.

    Example
void action(); // function declaration

void setup() {
  action(); // call function
}

// function definition
void action() {
  // todo
}

d-a-v commented 1 year ago

@aromprg

@d-a-v (UPD: Not actual) You could describe the emulation process in more detail (or give link example https://github.com/esp8266/Arduino/tree/master/tests/host) in the Readme (aka @Prizrakost) and clarify that it requires running on a Linux environment. Also question: Host emulation support ESP32 or only esp8266? (UPD: Not supported)

It should be working on windows with the WSL2 environment but I have not tested it myself.

Emulation on host is specific to the esp8266 environment. However if an application is both compilable on esp8266/Arduino and esp32/Arduino, then this environment is useful for esp32 to. Note: one can also use this:

#if CORE_MOCK
// this part is compiled on emulation environment only - not on hardware
#else
// this part is compiled on hardware only - not in the emulation environment
#endif