From fa30d4300dad053f8d8888b371c0a69e7f22df6d Mon Sep 17 00:00:00 2001 From: Andrew Dunai Date: Wed, 24 Apr 2024 01:07:54 +0300 Subject: [PATCH] doc: add docs for sdcard, wifi & transforms (closes #107) keira: rename imageTransform to transforms, construct transform with transforms.new() keira: fix FTP app crashing when WiFi is down keira: lua: add gpio.INPUT_PULLDOWN keira: fix Lua sample scripts --- docs/keira/lua/reference/index.rst | 3 + docs/keira/lua/reference/sdcard.rst | 16 +++++ docs/keira/lua/reference/transform.rst | 18 +++++ docs/keira/lua/reference/wifi.rst | 18 +++++ firmware/keira/sdcard/sdcard_test.lua | 18 ++--- firmware/keira/sdcard/test_draw_image.lua | 2 +- firmware/keira/sdcard/wifi_test.lua | 12 ++-- firmware/keira/src/apps/ftp/ftp_server.cpp | 25 +++++++ .../keira/src/apps/lua/lualilka_display.cpp | 2 +- firmware/keira/src/apps/lua/lualilka_gpio.cpp | 2 + .../src/apps/lua/lualilka_imageTransform.cpp | 10 ++- .../src/apps/lua/lualilka_imageTransform.h | 2 +- .../keira/src/apps/lua/lualilka_sdcard.cpp | 8 +-- firmware/keira/src/apps/lua/lualilka_sdcard.h | 2 +- sdk/addons/lualilka/library/display.lua | 4 +- sdk/addons/lualilka/library/gpio.lua | 3 +- sdk/addons/lualilka/library/sdcard.lua | 72 +++++++++++++++++++ sdk/addons/lualilka/library/transforms.lua | 64 +++++++++++++++++ sdk/addons/lualilka/library/wifi.lua | 65 +++++++++++++++++ 19 files changed, 316 insertions(+), 30 deletions(-) create mode 100644 docs/keira/lua/reference/sdcard.rst create mode 100644 docs/keira/lua/reference/transform.rst create mode 100644 docs/keira/lua/reference/wifi.rst create mode 100644 sdk/addons/lualilka/library/sdcard.lua create mode 100644 sdk/addons/lualilka/library/transforms.lua create mode 100644 sdk/addons/lualilka/library/wifi.lua diff --git a/docs/keira/lua/reference/index.rst b/docs/keira/lua/reference/index.rst index d0000a20..4ca8b1c1 100644 --- a/docs/keira/lua/reference/index.rst +++ b/docs/keira/lua/reference/index.rst @@ -8,6 +8,7 @@ Lua API lilka display + transform controller resources math @@ -15,4 +16,6 @@ Lua API gpio util buzzer + sdcard state + wifi diff --git a/docs/keira/lua/reference/sdcard.rst b/docs/keira/lua/reference/sdcard.rst new file mode 100644 index 00000000..16c781c4 --- /dev/null +++ b/docs/keira/lua/reference/sdcard.rst @@ -0,0 +1,16 @@ +``sdcard`` - Робота з SD-картою +------------------------------- + +Функції для роботи читання/запису файлів на SD-карті. + +Приклад: + +.. code-block:: lua + :linenos: + + local file = sdcard.open("file.txt", "w") + file:write("Hello, world!") + +.. lua:autoclass:: sdcard + +.. lua:autoclass:: File diff --git a/docs/keira/lua/reference/transform.rst b/docs/keira/lua/reference/transform.rst new file mode 100644 index 00000000..001218d4 --- /dev/null +++ b/docs/keira/lua/reference/transform.rst @@ -0,0 +1,18 @@ +``transform`` - Перетворення зображень +-------------------------------------- + +Функції для обертання та масштабування зображень. + +Приклад: + +.. code-block:: lua + + local image = resource.load_image("face.bmp", display.color565(0, 0, 0)) + local transform = transforms.new() + transform = transform:scale(1.5, 0.5) + transform = transform:rotate(45) + display.draw_image(image, 50, 80, transform) -- малює зображення в точці (50, 80) з перетвореннями + +.. lua:autoclass:: transforms + +.. lua:autoclass:: Transform diff --git a/docs/keira/lua/reference/wifi.rst b/docs/keira/lua/reference/wifi.rst new file mode 100644 index 00000000..5d971b61 --- /dev/null +++ b/docs/keira/lua/reference/wifi.rst @@ -0,0 +1,18 @@ +``wifi`` - Робота з WiFi-мережами +--------------------------------- + +Функції для роботи з WiFi-мережами. + +Приклад: + +.. code-block:: lua + :linenos: + + local networks = wifi.scan() + for i = 0, #networks do + print(networks[i]) + print('Сила сигналу: ', wifi.get_rssi(i)) + print('Тип шифрування: ', wifi.get_encryption_type(i)) + end + +.. lua:autoclass:: wifi diff --git a/firmware/keira/sdcard/sdcard_test.lua b/firmware/keira/sdcard/sdcard_test.lua index f779201f..6da40017 100644 --- a/firmware/keira/sdcard/sdcard_test.lua +++ b/firmware/keira/sdcard/sdcard_test.lua @@ -1,19 +1,15 @@ local file_dir = sdcard.ls("/") print(#file_dir) - -for i = 0, #file_dir do - print(file_dir[i]) +for i = 0, #file_dir do + print('*', file_dir[i]) end -file = file("/test.txt", "a+") - -file:write("HELLOWORLD") +local file = sdcard.open("/test.txt", "a+") +file:write("HELLOWORLD") -text = file:read(5) +local text = file:read(5) +print(text) -print(text) - -size = file:size() +local size = file:size() print(size) - diff --git a/firmware/keira/sdcard/test_draw_image.lua b/firmware/keira/sdcard/test_draw_image.lua index 4ca7e4fe..27ce79e3 100644 --- a/firmware/keira/sdcard/test_draw_image.lua +++ b/firmware/keira/sdcard/test_draw_image.lua @@ -30,7 +30,7 @@ for i = 10, 1, -1 do local scaleX = math.min({ math.random(), 0.1 }) local scaleY = math.min({ math.random(), 0.1 }) - local transform = imageTransform() + local transform = transforms.new() transform = transform:rotate(rot) diff --git a/firmware/keira/sdcard/wifi_test.lua b/firmware/keira/sdcard/wifi_test.lua index 4794c43f..619fd5e0 100644 --- a/firmware/keira/sdcard/wifi_test.lua +++ b/firmware/keira/sdcard/wifi_test.lua @@ -1,4 +1,4 @@ -status = wifi.get_status() +local status = wifi.get_status() print(status) wifi.disconnect() @@ -6,13 +6,11 @@ wifi.disconnect() status = wifi.get_status() print(status) -scan = wifi.scan() +local scan = wifi.scan() print(#scan) for i = 1, #scan do -- This will cycle through and print each element of the array - print(scan[i]) - rssi = wifi.get_rssi(i) - print(rssi) - rssi = wifi.get_encryption_type(i) - print(rssi) + local rssi = wifi.get_rssi(i) + local enc_type = wifi.get_encryption_type(i) + print(scan[i], rssi, enc_type) end diff --git a/firmware/keira/src/apps/ftp/ftp_server.cpp b/firmware/keira/src/apps/ftp/ftp_server.cpp index bee3bb35..fc621e95 100644 --- a/firmware/keira/src/apps/ftp/ftp_server.cpp +++ b/firmware/keira/src/apps/ftp/ftp_server.cpp @@ -3,6 +3,8 @@ #include #include "ftp_server.h" +#include "servicemanager.h" +#include "services/network.h" FTPServerApp::FTPServerApp() : App("FTP Server") { } @@ -15,6 +17,29 @@ void FTPServerApp::run() { lilka::fileutils.initSD(); + NetworkService* networkService = ServiceManager::getInstance()->getService("network"); + + if (networkService->getNetworkState() != NETWORK_STATE_ONLINE) { + canvas->fillScreen(0); + canvas->setCursor(16, 16); + canvas->setTextBound(16, 16, canvas->width() - 32, canvas->height() - 32); + canvas->printf("WiFi не підключено\n" + "\n" + "Підключіться до мережі\n" + "та спробуйте ще раз\n" + "\n" + "Натисніть [A] для виходу"); + queueDraw(); + + while (true) { + lilka::State state = lilka::controller.getState(); + if (state.a.justPressed) { + return; + } + taskYIELD(); + } + } + FtpServer ftpSrv; ftpSrv.begin("lilka", password.c_str()); diff --git a/firmware/keira/src/apps/lua/lualilka_display.cpp b/firmware/keira/src/apps/lua/lualilka_display.cpp index a873407c..13ae4a56 100644 --- a/firmware/keira/src/apps/lua/lualilka_display.cpp +++ b/firmware/keira/src/apps/lua/lualilka_display.cpp @@ -257,7 +257,7 @@ int lualilka_display_drawImage(lua_State* L) { }; int lualilka_display_drawImageTransformed(lua_State* L) { - // Args are image table, X & Y, imageTransform object + // Args are image table, X & Y, Transform object // First argument is table that contains image width, height and pointer. We only need the pointer. lua_getfield(L, 1, "pointer"); diff --git a/firmware/keira/src/apps/lua/lualilka_gpio.cpp b/firmware/keira/src/apps/lua/lualilka_gpio.cpp index b0065f4f..17c344a8 100644 --- a/firmware/keira/src/apps/lua/lualilka_gpio.cpp +++ b/firmware/keira/src/apps/lua/lualilka_gpio.cpp @@ -50,6 +50,8 @@ int lualilka_gpio_register(lua_State* L) { lua_setfield(L, -2, "OUTPUT"); lua_pushinteger(L, INPUT_PULLUP); lua_setfield(L, -2, "INPUT_PULLUP"); + lua_pushinteger(L, INPUT_PULLDOWN); + lua_setfield(L, -2, "INPUT_PULLDOWN"); lua_setglobal(L, "gpio"); return 0; } diff --git a/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp b/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp index 5b3152b8..8c7d95c9 100644 --- a/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp +++ b/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp @@ -99,8 +99,15 @@ static int lualilka_imageTransform_set_matrix(lua_State* L) { return 0; } +static const luaL_Reg lualilka_transforms[] = { + {"new", lualilka_create_object_imageTransform}, + {nullptr, nullptr}, +}; + int lualilka_imageTransform_register(lua_State* L) { - lua_register(L, IMAGE_TRANSFORM, lualilka_create_object_imageTransform); + luaL_newlib(L, lualilka_transforms); + lua_setglobal(L, "transforms"); + luaL_newmetatable(L, IMAGE_TRANSFORM); lua_pushcfunction(L, lualilka_delete_object_imageTransform); lua_setfield(L, -2, "__gc"); @@ -124,5 +131,6 @@ int lualilka_imageTransform_register(lua_State* L) { lua_setfield(L, -2, "vtransform"); lua_pop(L, 1); + return 0; } diff --git a/firmware/keira/src/apps/lua/lualilka_imageTransform.h b/firmware/keira/src/apps/lua/lualilka_imageTransform.h index 9c3a3f95..f40e222f 100644 --- a/firmware/keira/src/apps/lua/lualilka_imageTransform.h +++ b/firmware/keira/src/apps/lua/lualilka_imageTransform.h @@ -3,6 +3,6 @@ #include #include -#define IMAGE_TRANSFORM "imageTransform" +#define IMAGE_TRANSFORM "Transform" int lualilka_imageTransform_register(lua_State* L); diff --git a/firmware/keira/src/apps/lua/lualilka_sdcard.cpp b/firmware/keira/src/apps/lua/lualilka_sdcard.cpp index befe1b5e..a453ba2e 100644 --- a/firmware/keira/src/apps/lua/lualilka_sdcard.cpp +++ b/firmware/keira/src/apps/lua/lualilka_sdcard.cpp @@ -160,11 +160,14 @@ static const luaL_Reg lualilka_sdcard[] = { {"ls", lualilka_sdcard_list_dir}, {"remove", lualilka_sdcard_remove}, {"rename", lualilka_sdcard_rename}, + {"open", lualilka_create_object_file}, {NULL, NULL}, }; int lualilka_sdcard_register(lua_State* L) { - lua_register(L, FILE_OBJECT, lualilka_create_object_file); + luaL_newlib(L, lualilka_sdcard); + lua_setglobal(L, "sdcard"); + luaL_newmetatable(L, FILE_OBJECT); lua_pushcfunction(L, lualilka_delete_object_file); lua_setfield(L, -2, "__gc"); @@ -182,8 +185,5 @@ int lualilka_sdcard_register(lua_State* L) { lua_pop(L, 1); - luaL_newlib(L, lualilka_sdcard); - lua_setglobal(L, "sdcard"); - return 0; } diff --git a/firmware/keira/src/apps/lua/lualilka_sdcard.h b/firmware/keira/src/apps/lua/lualilka_sdcard.h index b48f30c0..1449d0c1 100644 --- a/firmware/keira/src/apps/lua/lualilka_sdcard.h +++ b/firmware/keira/src/apps/lua/lualilka_sdcard.h @@ -3,6 +3,6 @@ #include #include #include -#define FILE_OBJECT "file" +#define FILE_OBJECT "File" int lualilka_sdcard_register(lua_State* L); diff --git a/sdk/addons/lualilka/library/display.lua b/sdk/addons/lualilka/library/display.lua index f0a35391..c1c8601b 100644 --- a/sdk/addons/lualilka/library/display.lua +++ b/sdk/addons/lualilka/library/display.lua @@ -186,10 +186,10 @@ function display.draw_image(image, x, y) end ---@param image table ідентифікатор зображення ---@param x integer координата x лівого верхнього кута зображення ---@param y integer координата y лівого верхнього кута зображення ----@param transform userdata перетворення (TODO: додати опис модуля imageTransform) +---@param transform Transform перетворення ---@usage --- local image = resource.load_image("face.bmp", display.color565(0, 0, 0)) ---- local transform = imageTransform() +--- local transform = transforms.new() -- transform = transform:scale(1.5, 0.5) --- transform = transform:rotate(45) --- display.draw_image(image, 50, 80, transform) -- малює зображення в точці (50, 80) з перетвореннями diff --git a/sdk/addons/lualilka/library/gpio.lua b/sdk/addons/lualilka/library/gpio.lua index c6de7316..204a98ba 100644 --- a/sdk/addons/lualilka/library/gpio.lua +++ b/sdk/addons/lualilka/library/gpio.lua @@ -6,11 +6,12 @@ ---@field INPUT integer режим введення ---@field OUTPUT integer режим виведення ---@field INPUT_PULLUP integer режим введення з підтяжкою вгору +---@field INPUT_PULLDOWN integer режим введення з підтяжкою вниз gpio = {} ---Налаштовує режим GPIO-піна. ---@param pin integer номер піна ----@param mode integer режим піна, може бути ``gpio.INPUT``, ``gpio.OUTPUT`` або ``gpio.INPUT_PULLUP`` +---@param mode integer режим піна, може бути ``gpio.INPUT``, ``gpio.OUTPUT``, ``gpio.INPUT_PULLUP`` або ``gpio.INPUT_PULLDOWN`` function gpio.set_mode(pin, mode) end ---Записує цифрове зрачення в GPIO-пін. diff --git a/sdk/addons/lualilka/library/sdcard.lua b/sdk/addons/lualilka/library/sdcard.lua new file mode 100644 index 00000000..cd28b25d --- /dev/null +++ b/sdk/addons/lualilka/library/sdcard.lua @@ -0,0 +1,72 @@ +---@meta + +---@class sdcard +sdcard = {} + +---Повернути таблицю зі списком файлів та директорій за вказаним шляхом. +--- +---@param path string шлях до директорії (відносно кореня SD-картки) +---@return table +---@usage +--- local entries = sdcard.ls("/folder") +--- for i = 0, #entries do +--- print(entries[i]) +--- end +function sdcard.ls(path) end + +---Видалити файл або директорію за вказаним шляхом. +--- +---@param path string шлях до файлу або директорії (відносно кореня SD-картки) +---@usage +--- sdcard.remove("/folder/file.txt") +function sdcard.remove(path) end + +---Перейменувати файл або директорію. +--- +---@param old_path string старий шлях до файлу або директорії (відносно кореня SD-картки) +---@param new_path string новий шлях до файлу або директорії (відносно кореня SD-картки) +--- +---@usage +--- sdcard.rename("/folder/file.txt", "/folder/file2.txt") +function sdcard.rename(old_path, new_path) end + +---@class File +File = {} + +---Відкрити файл за вказаним шляхом. +--- +---@param path string шлях до файлу (відносно кореня SD-картки) +---@param mode string режим відкриття файлу (див. функцію ``fopen`` у документації ANSI C) +---@return File +--- +---@usage +--- local file = sdcard.open("/file.txt", "a+") -- Відкриває файл для додавання тексту +--- file:write("Hello, world!\n") -- Дописує текст в кінець файлу +function sdcard.open(path, mode) end + +---Повернути розмір файлу. +--- +---@return integer +function File:size() end + +---Перемістити вказівник файлу на певну позицію. +--- +---@param pos integer позиція в файлі +function File:seek(pos) end + +---Прочитати з файлу. +--- +---@param count integer максимальна кількість байт, які потрібно прочитати +---@return string +function File:read(count) end + +---Записати у файл. +--- +---@param content string дані, які потрібно записати +---@usage +--- local file = sdcard.open("/file.txt", "w") -- Відкриває файл для запису +--- file:write("Hello, world!\n") -- Записує текст у файл +--- file:write("Привіт, світ!\n") -- Дописує текст у файл +function File:write(content) end + +return sdcard diff --git a/sdk/addons/lualilka/library/transforms.lua b/sdk/addons/lualilka/library/transforms.lua new file mode 100644 index 00000000..5c04ad8d --- /dev/null +++ b/sdk/addons/lualilka/library/transforms.lua @@ -0,0 +1,64 @@ +---@meta + +---@class transforms +transforms = {} + +---Створити нове афінне перетворення. +--- +---@return Transform +function transforms.new() end + +---@class Transform +Transform = {} + +---Масштабувати перетворення по обох осях та повернути нове перетворення. +--- +---@param x number масштаб по осі X +---@param y number масштаб по осі Y +---@return Transform +function Transform:scale(x, y) end + +---Обернути перетворення на певний кут та повернути нове перетворення. +--- +---@param angle number кут повороту (в градусах) +---@return Transform +function Transform:rotate(angle) end + +---Помножити перетворення на інше перетворення та повернути результат, не змінюючи поточне перетворення. +--- +---@param other Transform інше перетворення +---@return Transform +function Transform:multiply(other) end + +---Отримати перетворення, яке є оберненим до поточного. +--- +---@return Transform +function Transform:inverse() end + +---Застосувати перетворення до точки та повернути нові координати. +--- +---@param x number координата X +---@param y number координата Y +---@return number, number +---@usage +--- local transform = transforms.new():scale(2, 2):rotate(45) +--- local x, y = transform:transform(10, 10) +--- print(x, y) +function Transform:vtransform(x, y) end + +---Отримати матрицю перетворення. +--- +---@return table двовимірна таблиця 2x2 +function Transform:get() end + +---Встановити матрицю перетворення. +--- +---.. warning:: Ми не радимо вам використовувати цей метод, якщо ви не знаєте, що робите. Краще використовуйте методи ``scale`` та ``rotate``. +--- +---@param matrix table двовимірна таблиця 2x2 +---@usage +--- local transform = transforms.new() +--- transform:set({{1, 0}, {0, 1}}) +function Transform:set(matrix) end + +return transforms diff --git a/sdk/addons/lualilka/library/wifi.lua b/sdk/addons/lualilka/library/wifi.lua new file mode 100644 index 00000000..bc294822 --- /dev/null +++ b/sdk/addons/lualilka/library/wifi.lua @@ -0,0 +1,65 @@ +---@meta + +---@class wifi +wifi = {} + +---Під'єднатись до мережі Wi-Fi. +--- +---@param ssid string ім'я мережі +---@param password string пароль мережі +function wifi.connect(ssid, password) end + +---Від'єднатись від мережі Wi-Fi. +function wifi.disconnect() end + +---Отримати статус мережі Wi-Fi. +--- +---@return integer статус мережі (див. ``WiFi.status()`` у документації Arduino ESP32) +function wifi.get_status() end + +---Повернути таблицю з назвами доступних мереж Wi-Fi. +--- +---@return table +---@usage +--- local networks = wifi.scan() +--- for i = 0, #networks do +--- print(networks[i]) +--- print('Сила сигналу: ', wifi.get_rssi(i)) +--- print('Тип шифрування: ', wifi.get_encryption_type(i)) +--- end +function wifi.scan() end + +---Отримати силу сигналу відповідної мережі Wi-Fi. +--- +---@param index integer індекс мережі (порядковий номер у списку, отриманому функцією ``wifi.scan()``) +---@return integer +function wifi.get_rssi(index) end + +---Отримати тип шифрування відповідної мережі Wi-Fi. +--- +---@param index integer індекс мережі (порядковий номер у списку, отриманому функцією ``wifi.scan()``) +---@return integer +function wifi.get_encryption_type(index) end + +---Отримати MAC-адресу пристрою. +--- +---@return string +function wifi.get_mac() end + +---Отримати локальну IP-адресу пристрою. +--- +---@return string +function wifi.get_local_ip() end + +---Налаштувати параметри мережі Wi-Fi для статичної IP-адреси. +--- +---(Див. функцію ``WiFi.config()`` у документації Arduino ESP32) +--- +---@param ip string IP-адреса +---@param gateway string IP-адреса шлюзу +---@param subnet string маска підмережі +---@param dns1 string IP-адреса DNS-сервера 1 +---@param dns2 string IP-адреса DNS-сервера 2 +function wifi.set_config(ip, gateway, subnet, dns1, dns2) end + +return wifi