From ac5fe4a4249452d210621ab246ba676875659baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 8 Feb 2024 16:37:14 +0100 Subject: [PATCH] Add POSIX fbdev port --- include/hasp_conf.h | 8 +- src/dev/posix/hasp_posix.cpp | 44 ++++--- src/dev/posix/hasp_posix.h | 3 + src/dev/win32/hasp_win32.cpp | 48 ++++++-- src/dev/win32/hasp_win32.h | 35 +----- src/drv/tft/tft_driver.h | 3 + src/drv/tft/tft_driver_posix_fbdev.cpp | 117 +++++++++++++++++++ src/drv/tft/tft_driver_posix_fbdev.h | 44 +++++++ src/drv/tft/tft_driver_win32drv.cpp | 2 +- src/main_pc.cpp | 14 +-- user_setups/darwin_sdl/darwin_sdl_64bits.ini | 1 - user_setups/linux_sdl/linux_fbdev_64bits.ini | 98 ++++++++++++++++ user_setups/linux_sdl/linux_sdl_64bits.ini | 1 - user_setups/win32/windows_gdi_64bits.ini | 1 - user_setups/win32/windows_sdl_64bits.ini | 1 - 15 files changed, 352 insertions(+), 68 deletions(-) create mode 100644 src/drv/tft/tft_driver_posix_fbdev.cpp create mode 100644 src/drv/tft/tft_driver_posix_fbdev.h create mode 100644 user_setups/linux_sdl/linux_fbdev_64bits.ini diff --git a/include/hasp_conf.h b/include/hasp_conf.h index dece01d1..dc6eca52 100644 --- a/include/hasp_conf.h +++ b/include/hasp_conf.h @@ -377,7 +377,11 @@ static WiFiSpiClass WiFi; #endif #if defined(POSIX) +#ifdef USE_MONITOR #define delay SDL_Delay +#else +#define delay msleep +#endif #endif #if HASP_TARGET_PC @@ -398,8 +402,10 @@ static WiFiSpiClass WiFi; #define halRestartMcu() #if USE_MONITOR #define millis SDL_GetTicks -#elif USE_WIN32DRV +#elif defined(WINDOWS) #define millis Win32Millis +#elif defined(POSIX) +#define millis PosixMillis #endif #define DEC 10 diff --git a/src/dev/posix/hasp_posix.cpp b/src/dev/posix/hasp_posix.cpp index af392e62..ef4fc10b 100644 --- a/src/dev/posix/hasp_posix.cpp +++ b/src/dev/posix/hasp_posix.cpp @@ -19,7 +19,13 @@ #include "hasp_conf.h" #include "hasp_debug.h" +#ifdef USE_MONITOR #include "display/monitor.h" +#elif USE_FBDEV +#include "display/fbdev.h" +#endif + +#include // extern monitor_t monitor; @@ -35,12 +41,6 @@ PosixDevice::PosixDevice() _core_version = "unknown"; _chip_model = "unknown"; } else { - // LOG_VERBOSE(0,"Sysname: %s", uts.sysname); - // LOG_VERBOSE(0,"Nodename: %s", uts.nodename); - // LOG_VERBOSE(0,"Release: %s", uts.release); - // LOG_VERBOSE(0,"Version: %s", uts.version); - // LOG_VERBOSE(0,"Machine: %s", uts.machine); - char version[256]; snprintf(version, sizeof(version), "%s %s", uts.sysname, uts.release); _core_version = version; @@ -69,8 +69,9 @@ void PosixDevice::show_info() LOG_VERBOSE(0, "Machine : %s", uts.machine); } - LOG_VERBOSE(0, "Processor : %s", "unknown"); - LOG_VERBOSE(0, "CPU freq. : %i MHz", 0); + LOG_VERBOSE(0, "Processor : %s", get_chip_model()); + LOG_VERBOSE(0, "CPU freq. : %i MHz", get_cpu_frequency()); + LOG_VERBOSE(0, "OS Version : %s", get_core_version()); } const char* PosixDevice::get_hostname() @@ -81,8 +82,11 @@ const char* PosixDevice::get_hostname() void PosixDevice::set_hostname(const char* hostname) { _hostname = hostname; +#if USE_MONITOR monitor_title(hostname); - // SDL_SetWindowTitle(monitor.window, hostname); +#elif USE_FBDEV + // fbdev doesn't really have a title bar +#endif } const char* PosixDevice::get_core_version() @@ -146,13 +150,11 @@ void PosixDevice::update_backlight() { uint8_t level = _backlight_power ? _backlight_level : 0; if(_backlight_invert) level = 255 - level; +#if USE_MONITOR monitor_backlight(level); - // SDL_SetTextureColorMod(monitor.texture, level, level, level); - // window_update(&monitor); - // monitor.sdl_refr_qry = true; - // monitor_sdl_refr(NULL); - // const lv_area_t area = {1,1,0,0}; - // monitor_flush(NULL,&area,NULL); +#elif USE_FBDEV + // set display backlight, if possible +#endif } size_t PosixDevice::get_free_max_block() @@ -221,6 +223,18 @@ long PosixDevice::get_uptime() } // namespace dev +long PosixMillis() +{ + struct timespec spec; + clock_gettime(CLOCK_REALTIME, &spec); + return (spec.tv_sec) * 1000 + (spec.tv_nsec) / 1e6; +} + +void msleep(unsigned long millis) +{ + usleep(millis * 1000); +} + dev::PosixDevice haspDevice; #endif // POSIX diff --git a/src/dev/posix/hasp_posix.h b/src/dev/posix/hasp_posix.h index 9dc8ad9f..73a8a49c 100644 --- a/src/dev/posix/hasp_posix.h +++ b/src/dev/posix/hasp_posix.h @@ -71,6 +71,9 @@ class PosixDevice : public BaseDevice { } // namespace dev +extern long PosixMillis(); +extern void msleep(unsigned long millis); + using dev::PosixDevice; extern dev::PosixDevice haspDevice; diff --git a/src/dev/win32/hasp_win32.cpp b/src/dev/win32/hasp_win32.cpp index 213b8801..6f7576de 100644 --- a/src/dev/win32/hasp_win32.cpp +++ b/src/dev/win32/hasp_win32.cpp @@ -25,11 +25,33 @@ static inline void native_cpuid(unsigned int* eax, unsigned int* ebx, unsigned i asm volatile("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "0"(*eax), "2"(*ecx) : "memory"); } -void Win32Device::reboot() -{} - -void Win32Device::show_info() +Win32Device::Win32Device() { + char buffer[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD length = sizeof(buffer); + + if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNameNetBIOS, buffer, &length)) { + _hostname = buffer; + } else if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNameDnsHostname, buffer, &length)) { + _hostname = buffer; + } else if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNamePhysicalDnsHostname, buffer, &length)) { + _hostname = buffer; + } else if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNamePhysicalDnsDomain, buffer, &length)) { + _hostname = buffer; + } else { + _hostname = "localhost"; + } + + // Get the Windows version. + DWORD dwBuild = 0; + DWORD dwVersion = GetVersion(); + DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); + DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); + if(dwVersion < 0x80000000) dwBuild = (DWORD)(HIWORD(dwVersion)); + + char version[128]; + snprintf(version, sizeof(version), "Windows %d.%d.%d", dwMajorVersion, dwMinorVersion, dwBuild); + _core_version = version; unsigned int eax, ebx, ecx, edx; eax = 0; @@ -39,9 +61,21 @@ void Win32Device::show_info() memcpy(vendor, &ebx, 4); memcpy(vendor + 4, &edx, 4); memcpy(vendor + 8, &ecx, 4); - vendor[12] = '\0'; + vendor[12] = '\0'; + _chip_model = vendor; - LOG_VERBOSE(0, F("Processor : %s"), vendor); + // _backlight_pin = -1; + _backlight_power = 1; + _backlight_invert = 0; + _backlight_level = 255; +} + +void Win32Device::reboot() +{} + +void Win32Device::show_info() +{ + LOG_VERBOSE(0, F("Processor : %s"), get_chip_model()); LOG_VERBOSE(0, F("CPU freq. : %i MHz"), get_cpu_frequency()); LOG_VERBOSE(0, F("OS Version : %s"), get_core_version()); } @@ -66,7 +100,7 @@ const char* Win32Device::get_core_version() const char* Win32Device::get_chip_model() { - return "SDL2"; + return _chip_model.c_str(); } const char* Win32Device::get_hardware_id() diff --git a/src/dev/win32/hasp_win32.h b/src/dev/win32/hasp_win32.h index e4b11746..1a25106d 100644 --- a/src/dev/win32/hasp_win32.h +++ b/src/dev/win32/hasp_win32.h @@ -18,39 +18,7 @@ namespace dev { class Win32Device : public BaseDevice { public: - Win32Device() - { - char buffer[MAX_COMPUTERNAME_LENGTH + 1]; - DWORD length = sizeof(buffer); - - if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNameNetBIOS, buffer, &length)) { - _hostname = buffer; - } else if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNameDnsHostname, buffer, &length)) { - _hostname = buffer; - } else if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNamePhysicalDnsHostname, buffer, &length)) { - _hostname = buffer; - } else if(GetComputerNameExA((COMPUTER_NAME_FORMAT)ComputerNamePhysicalDnsDomain, buffer, &length)) { - _hostname = buffer; - } else { - _hostname = "localhost"; - } - - // Get the Windows version. - DWORD dwBuild = 0; - DWORD dwVersion = GetVersion(); - DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); - DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); - if(dwVersion < 0x80000000) dwBuild = (DWORD)(HIWORD(dwVersion)); - - char version[128]; - snprintf(version, sizeof(version), "Windows %d.%d.%d", dwMajorVersion, dwMinorVersion, dwBuild); - _core_version = version; - - // _backlight_pin = -1; - _backlight_power = 1; - _backlight_invert = 0; - _backlight_level = 255; - } + Win32Device(); void reboot() override; void show_info() override; @@ -80,6 +48,7 @@ class Win32Device : public BaseDevice { private: std::string _hostname; std::string _core_version; + std::string _chip_model; uint8_t _backlight_pin; uint8_t _backlight_level; diff --git a/src/drv/tft/tft_driver.h b/src/drv/tft/tft_driver.h index 914597a8..4a9dff48 100644 --- a/src/drv/tft/tft_driver.h +++ b/src/drv/tft/tft_driver.h @@ -83,6 +83,9 @@ class BaseTft { #elif USE_WIN32DRV && HASP_TARGET_PC // #warning Building for Win32Drv #include "tft_driver_win32drv.h" +#elif USE_FBDEV && HASP_TARGET_PC +// #warning Building for POSIX fbdev +#include "tft_driver_posix_fbdev.h" #else // #warning Building for Generic Tfts using dev::BaseTft; diff --git a/src/drv/tft/tft_driver_posix_fbdev.cpp b/src/drv/tft/tft_driver_posix_fbdev.cpp new file mode 100644 index 00000000..ba584b01 --- /dev/null +++ b/src/drv/tft/tft_driver_posix_fbdev.cpp @@ -0,0 +1,117 @@ +/* MIT License - Copyright (c) 2019-2022 Francis Van Roie + For full license information read the LICENSE file in the project folder */ + +#if USE_FBDEV && HASP_TARGET_PC + +#include "hasplib.h" +#include "lvgl.h" + +#include "display/fbdev.h" + +#include "drv/tft/tft_driver.h" +#include "tft_driver_posix_fbdev.h" + +#include "dev/device.h" +#include "hasp_debug.h" +#include "hasp_gui.h" + +#ifdef HASP_CUSTOMIZE_BOOTLOGO +#include "custom/bootlogo.h" // Sketch tab header for xbm images +#else +#include "custom/bootlogo_template.h" // Sketch tab header for xbm images +#endif + +#include + +namespace dev { + +/** + * A task to measure the elapsed time for LittlevGL + * @param data unused + * @return never return + */ +static void* tick_thread(void* data) +{ + (void)data; + + while(1) { + usleep(5000); /*Sleep for 5 millisecond*/ + lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/ + } + + return 0; +} + +int32_t TftFbdevDrv::width() +{ + return _width; +} +int32_t TftFbdevDrv::height() +{ + return _height; +} + +static void* gui_entrypoint(void* arg) +{ +#if HASP_USE_LVGL_TASK +#error "fbdev LVGL task is not implemented" +#else + // create a LVGL tick thread + pthread_t thread; + pthread_create(&thread, 0, tick_thread, NULL); +#endif + return 0; +} + +void TftFbdevDrv::init(int32_t w, int h) +{ + /* Add a display + * Use the 'fbdev' driver which uses POSIX framebuffer device as a display + * The following input devices are handled: mouse, keyboard, mousewheel */ + fbdev_init(); + fbdev_get_sizes((uint32_t*)&_width, (uint32_t*)&_height); + +#if HASP_USE_LVGL_TASK +#error "fbdev LVGL task is not implemented" +#else + // do not use the gui_task(), just init the GUI and return + gui_entrypoint(NULL); +#endif +} +void TftFbdevDrv::show_info() +{ + splashscreen(); + + LOG_VERBOSE(TAG_TFT, F("Driver : %s"), get_tft_model()); +} + +void TftFbdevDrv::splashscreen() +{ + uint8_t fg[] = logoFgColor; + uint8_t bg[] = logoBgColor; + lv_color_t fgColor = lv_color_make(fg[0], fg[1], fg[2]); + lv_color_t bgColor = lv_color_make(bg[0], bg[1], bg[2]); + // TODO show splashscreen +} +void TftFbdevDrv::set_rotation(uint8_t rotation) +{} +void TftFbdevDrv::set_invert(bool invert) +{} +void TftFbdevDrv::flush_pixels(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p) +{ + fbdev_flush(disp, area, color_p); +} +bool TftFbdevDrv::is_driver_pin(uint8_t pin) +{ + return false; +} +const char* TftFbdevDrv::get_tft_model() +{ + return "POSIX fbdev"; +} + +} // namespace dev + +dev::TftFbdevDrv haspTft; + +#endif // WINDOWS || POSIX diff --git a/src/drv/tft/tft_driver_posix_fbdev.h b/src/drv/tft/tft_driver_posix_fbdev.h new file mode 100644 index 00000000..5856f892 --- /dev/null +++ b/src/drv/tft/tft_driver_posix_fbdev.h @@ -0,0 +1,44 @@ +/* MIT License - Copyright (c) 2019-2022 Francis Van Roie + For full license information read the LICENSE file in the project folder */ + +#ifndef HASP_FBDEV_DRIVER_H +#define HASP_FBDEV_DRIVER_H + +#include "tft_driver.h" + +#if USE_FBDEV && HASP_TARGET_PC +// #warning Building H driver FBDEV + +#include "lvgl.h" + +namespace dev { + +class TftFbdevDrv : BaseTft { + public: + void init(int w, int h); + void show_info(); + void splashscreen(); + + void set_rotation(uint8_t rotation); + void set_invert(bool invert); + + void flush_pixels(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p); + bool is_driver_pin(uint8_t pin); + + const char* get_tft_model(); + + int32_t width(); + int32_t height(); + + private: + int32_t _width, _height; +}; + +} // namespace dev + +using dev::TftFbdevDrv; +extern dev::TftFbdevDrv haspTft; + +#endif // HASP_TARGET_PC + +#endif // HASP_FBDEV_DRIVER_H diff --git a/src/drv/tft/tft_driver_win32drv.cpp b/src/drv/tft/tft_driver_win32drv.cpp index 25a85747..9e32cb59 100644 --- a/src/drv/tft/tft_driver_win32drv.cpp +++ b/src/drv/tft/tft_driver_win32drv.cpp @@ -114,7 +114,7 @@ void TftWin32Drv::show_info() { splashscreen(); - LOG_VERBOSE(TAG_TFT, F("Driver : Win32Drv")); + LOG_VERBOSE(TAG_TFT, F("Driver : %s"), get_tft_model()); } void TftWin32Drv::splashscreen() diff --git a/src/main_pc.cpp b/src/main_pc.cpp index 50690677..c6190c7a 100644 --- a/src/main_pc.cpp +++ b/src/main_pc.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #define cwd getcwd #define cd chdir #endif @@ -178,25 +180,23 @@ int main(int argc, char* argv[]) SDL_Init(0); // Needs to be initialized for GetPerfPath strcpy(config, SDL_GetPrefPath("hasp", "hasp")); SDL_Quit(); // We'll properly init later -#elif USE_WIN32DRV +#elif defined(WINDOWS) if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, config))) { PathAppendA(config, "hasp"); PathAppendA(config, "hasp"); } +#elif defined(POSIX) + struct passwd* pw = getpwuid(getuid()); + strcpy(config, pw->pw_dir); + strcat(config, "/.local/share/hasp/hasp"); #endif } cd(config); setup(); -#if USE_MONITOR - while(1) { - loop(); - } -#elif USE_WIN32DRV while(haspDevice.pc_is_running) { loop(); } -#endif end: #if defined(WINDOWS) diff --git a/user_setups/darwin_sdl/darwin_sdl_64bits.ini b/user_setups/darwin_sdl/darwin_sdl_64bits.ini index 1003bc6f..4a1962c0 100644 --- a/user_setups/darwin_sdl/darwin_sdl_64bits.ini +++ b/user_setups/darwin_sdl/darwin_sdl_64bits.ini @@ -85,7 +85,6 @@ lib_ignore = build_src_filter = +<*> -<*.h> - +<../hal/sdl2> +<../.pio/libdeps/darwin_sdl_64bits/paho/src/*.c> +<../.pio/libdeps/darwin_sdl_64bits/paho/src/MQTTClient.c> +<../.pio/libdeps/darwin_sdl_64bits/paho/src/MQTTClient.h> diff --git a/user_setups/linux_sdl/linux_fbdev_64bits.ini b/user_setups/linux_sdl/linux_fbdev_64bits.ini new file mode 100644 index 00000000..624d3de6 --- /dev/null +++ b/user_setups/linux_sdl/linux_fbdev_64bits.ini @@ -0,0 +1,98 @@ +[env:linux_fbdev_64bits] +platform = native@^1.1.4 +extra_scripts = + tools/linux_build_extra.py +build_flags = + ${env.build_flags} + -D HASP_MODEL="Linux App" + -D HASP_TARGET_PC=1 + + ; ----- Monitor + -D TFT_WIDTH=240 + -D TFT_HEIGHT=320 + ; SDL drivers options + ;-D LV_LVGL_H_INCLUDE_SIMPLE + ;-D LV_DRV_NO_CONF + -D USE_FBDEV + ; ----- ArduinoJson + -D ARDUINOJSON_DECODE_UNICODE=1 + -D HASP_NUM_PAGES=12 + -D HASP_USE_SPIFFS=0 + -D HASP_USE_LITTLEFS=0 + -D LV_USE_FS_IF=1 + -D HASP_USE_EEPROM=0 + -D HASP_USE_GPIO=0 + -D HASP_USE_CONFIG=1 + -D HASP_USE_DEBUG=1 + -D HASP_USE_PNGDECODE=1 + -D HASP_USE_BMPDECODE=1 + -D HASP_USE_GIFDECODE=0 + -D HASP_USE_JPGDECODE=0 + -D HASP_USE_MQTT=1 + -D MQTT_MAX_PACKET_SIZE=2048 + -D HASP_ATTRIBUTE_FAST_MEM= + -D IRAM_ATTR= ; No IRAM_ATTR available + -D PROGMEM= ; No PROGMEM available + ;-D LV_LOG_LEVEL=LV_LOG_LEVEL_INFO + ;-D LV_LOG_PRINTF=1 + ; Add recursive dirs for hal headers search + -D POSIX + -D PAHO_MQTT_STATIC + -DPAHO_WITH_SSL=TRUE + -DPAHO_BUILD_DOCUMENTATION=FALSE + -DPAHO_BUILD_SAMPLES=FALSE + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_VERBOSE_MAKEFILE=TRUE + ;-D NO_PERSISTENCE + -I.pio/libdeps/linux_fbdev_64bits/paho/src + -I.pio/libdeps/linux_fbdev_64bits/ArduinoJson/src + + ; ----- Statically linked libraries -------------------- + -lm + -lpthread + +lib_deps = + ${env.lib_deps} + ;lv_drivers@~7.9.0 + ;lv_drivers=https://github.com/littlevgl/lv_drivers/archive/7d71907c1d6b02797d066f50984b866e080ebeed.zip + https://github.com/eclipse/paho.mqtt.c.git + bblanchon/ArduinoJson@^6.21.4 ; Json(l) parser + https://github.com/fvanroie/lv_drivers + +lib_ignore = + paho + AXP192 + ArduinoLog + lv_lib_qrcode + ETHSPI + +build_src_filter = + +<*> + -<*.h> + +<../.pio/libdeps/linux_fbdev_64bits/paho/src/*.c> + +<../.pio/libdeps/linux_fbdev_64bits/paho/src/MQTTClient.c> + -<../.pio/libdeps/linux_fbdev_64bits/paho/src/MQTTAsync.c> + -<../.pio/libdeps/linux_fbdev_64bits/paho/src/MQTTAsyncUtils.c> + -<../.pio/libdeps/linux_fbdev_64bits/paho/src/MQTTVersion.c> + -<../.pio/libdeps/linux_fbdev_64bits/paho/src/SSLSocket.c> + + + - + - + - + - + - + + + - + + + - + + + + + - + - + - + + + + + + + - + + + +<../.pio/libdeps/linux_fbdev_64bits/ArduinoJson/src/ArduinoJson.h> diff --git a/user_setups/linux_sdl/linux_sdl_64bits.ini b/user_setups/linux_sdl/linux_sdl_64bits.ini index c1e8d8dc..432c9814 100644 --- a/user_setups/linux_sdl/linux_sdl_64bits.ini +++ b/user_setups/linux_sdl/linux_sdl_64bits.ini @@ -76,7 +76,6 @@ lib_ignore = build_src_filter = +<*> -<*.h> - +<../hal/sdl2> +<../.pio/libdeps/linux_sdl_64bits/paho/src/*.c> +<../.pio/libdeps/linux_sdl_64bits/paho/src/MQTTClient.c> -<../.pio/libdeps/linux_sdl_64bits/paho/src/MQTTAsync.c> diff --git a/user_setups/win32/windows_gdi_64bits.ini b/user_setups/win32/windows_gdi_64bits.ini index 039c4004..d2657df5 100644 --- a/user_setups/win32/windows_gdi_64bits.ini +++ b/user_setups/win32/windows_gdi_64bits.ini @@ -100,7 +100,6 @@ lib_ignore = build_src_filter = +<*> -<*.h> - +<../hal/sdl2> +<../.pio/libdeps/windows_gdi_64bits/paho/src/*.c> +<../.pio/libdeps/windows_gdi_64bits/paho/src/MQTTClient.c> -<../.pio/libdeps/windows_gdi_64bits/paho/src/MQTTAsync.c> diff --git a/user_setups/win32/windows_sdl_64bits.ini b/user_setups/win32/windows_sdl_64bits.ini index a4a131e2..3c6957bb 100644 --- a/user_setups/win32/windows_sdl_64bits.ini +++ b/user_setups/win32/windows_sdl_64bits.ini @@ -106,7 +106,6 @@ lib_ignore = build_src_filter = +<*> -<*.h> - +<../hal/sdl2> +<../.pio/libdeps/windows_sdl_64bits/paho/src/*.c> +<../.pio/libdeps/windows_sdl_64bits/paho/src/MQTTClient.c> -<../.pio/libdeps/windows_sdl_64bits/paho/src/MQTTAsync.c>