Библиотека для неблокирующего вывода телеметрии в реальном времени с помощью последовательного порта.
- Возможность вывода и переключения до 10 различных экранов с информацией
- Управление и навигация по клавишам hjkl+space
- Возможность добавления функций обработчиков нажатия кнопок
- Использование не более 10% времени процессора для отображения информации
- Автоматическая подстройка под
void loop()с любым временем выполнения
Для использования библиотеки необходимо использование PlatformIO.
Чтобы установить библиотеку в проект добавьте в файл конфигурации проекта platformio.ini:
lib_deps =
arsenier/argviz@^x.x.x
Актуальную версию библиотеки можно найти в регистре пакетов PlatformIO: https://registry.platformio.org/libraries/arsenier/argviz/installation
Минимальный пример использования библиотеки, использующий все функции:
#include <Arduino.h>
#include <argviz.h>
uint8_t counter = 0;
SCREEN(screen0,
{
ROW("counter [us]: %lu", micros());
ROW("counter [ms]: %lu", millis());
CLICK_ROW([](CLICK_STATE state)
{
switch(state)
{
case CLICK_LEFT:
counter--;
break;
case CLICK_RIGHT:
counter++;
break;
case CLICK_DOWN:
counter = 0;
break;
default:
break;
} }, "click me (h|l|space): %3u", counter);
ROW("HINT:")
ROW("control with hjkl+space")
})
void setup()
{
Serial.begin(115200);
argviz_init(Serial);
argviz_registerScreen(0, screen0);
argviz_start();
}
void loop()
{
static uint32_t timer = 0;
while (micros() - timer < 500)
;
timer = micros();
}В этом примере используются все основные функции библиотеки.
После загрузки примера необходимо также добавить некоторые настройки в файл platformio.ini:
monitor_speed = 115200
monitor_raw = true
При запуске монитора последовательного порта будет виден следующий экран:
+-------------------------+
|0123456789|23fs| 332| 508|
|-------------------------|
|counter [us]: 151957700 |
|counter [ms]: 151960 |
|click me (h|l|space): 0|
|HINT: |
|control with hjkl+space |
| |
+-------------------------+
Белым выделением показано положение курсора в экране. Управление курсором происходит с помощью клавиш hjkl как в vim.
↑
k Hint: The `h`{normal} key is at the left and moves left.
← h l → The `l`{normal} key is at the right and moves right.
j The `j`{normal} key looks like a down arrow.
↓
В argviz есть два примитива из которых формируется экран:
ROW- просто текстCLICK_ROW- текст с "кнопками"
Обычные строки ROW оторбражаются обычным текстом и могут быть выделены, но не кликнуты. В примере это все строки кроме третьей (click me (h|l|space): 0).
Третья строка является примером кликабельной строки CLICK_ROW. Если она выделена, то при нажатии клавиш управления (влево-вправо-пробел) выполняются действия, прописанные функцией обработчика нажатия.
В примере это изменение значения счетчика и его сброс.
Для нового экрана используется макрос SCREEN. Пример создания простейшего экрана:
SCREEN(screen0,
{
ROW("Hello world!");
})Для отображения этого экрана в интерфейсе необходимо зарегистрировать его с помощью функции argviz_registerScreen:
void setup()
{
Serial.begin(115200);
argviz_init(Serial);
argviz_registerScreen(0, screen0);
argviz_start();
}Это добавит экран в список.
Для работы argviz необходимо выполнить следующие действия:
- Инициализировать последовательный порт (
Serial.begin(115200)) - Инициализировать argviz, указав последовательный порт, который будет использоваться для вывода информации на экране (
argviz_init(Serial)) - Зарегистрировать все необходимые экраны с помощью функции
argviz_registerScreen(argviz_registerScreen(0, screen0)) - Запустить argviz (
argviz_start())
После этого argviz будет работать параллельно с void loop() и выводить информацию на экране.
Warning
программа в void loop() не должна блокировать выполнение программы, в противном случае argviz не будет выводить информацию на экране
В строках можно выводить любую информацию, до тех пор пока она помещается в 25 символов. Для вывода переменных используется форматирование строки с помощью printf-подобного формата.
Пример использования синтаксиса строк:
SCREEN(screen0,
{
ROW("counter [us]: %lu", micros());
ROW("counter [ms]: %lu", millis());
})Справку по этому синтаксису можно найти в интернете (например https://codelessons.dev/ru/printf-in-c-cplusplus/)
Кликабельные строки позволяют выделить строку и при нажатии клавиш управления выполнять действия.
Для создания кликабельной строки используется макрос CLICK_ROW. Пример создания кликабельной строки:
SCREEN(screen0,
{
CLICK_ROW([](CLICK_STATE state)
{
switch(state)
{
case CLICK_LEFT:
counter--;
break;
case CLICK_RIGHT:
counter++;
break;
case CLICK_DOWN:
counter = 0;
break;
default:
break;
} }, "click me (h|l|space): %3u", counter);
})В данном примере функция обработчик задана прямо в теле макроса CLICK_ROW. Кроме такого способа можно ее задать как отдельную функцию:
void clickHandler(CLICK_STATE state)
{
switch(state)
{
case CLICK_LEFT:
counter--;
break;
case CLICK_RIGHT:
counter++;
break;
case CLICK_DOWN:
counter = 0;
break;
default:
break;
} }
SCREEN(screen0,
{
CLICK_ROW(clickHandler, "click me (h|l|space): %3u", counter);
})Оба варианта эквивалентны.
+-------------------------+
|0123456789|23fs| 332| 508|
|-------------------------|
|\________/ \__/ \__/ \__/|
| | | | `период вызова void loop() в микросекундах
| | | `время выполнения void loop() в микросекундах
| | `частота обновления интерфейса (кадры в секунду, fps)
| `список всех экранов; выделением показан текущий экран
| |
+-------------------------+