diff --git a/CMakeLists.txt b/CMakeLists.txt index 55f80932..3ecab55a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -248,10 +248,11 @@ if(DEFINED PICO_BOARD OR PIP_FREERTOS) if(NOT DEFINED PICO_FREERTOS) set(PIP_HAS_THREADS OFF CACHE BOOL "" FORCE) endif() - if(NOT DEFINED PICO_LWIP) - set(PIP_HAS_SOCKET OFF CACHE BOOL "" FORCE) - set(PIP_BUILD_MQTT_CLIENT OFF CACHE BOOL "" FORCE) - endif() + # pico-sdk lwip provides only a partial POSIX socket layer (no netinet/in.h, + # poll.h), so PIEthernet/PICAN and the paho.mqtt.c library cannot be built + # on Pico yet; keep sockets off by default + set(PIP_HAS_SOCKET OFF CACHE BOOL "" FORCE) + set(PIP_BUILD_MQTT_CLIENT OFF CACHE BOOL "" FORCE) message(STATUS "Building PIP for Pi Pico SDK ${PICO_SDK_VERSION_STRING}") else() if(NOT DEFINED LWIP) @@ -278,6 +279,18 @@ if(NOT PIP_HAS_THREADS) message(STATUS "INTROSPECTION requires PIP_HAS_THREADS, disabling INTROSPECTION") set(INTROSPECTION OFF CACHE BOOL "" FORCE) endif() + if(PIP_BUILD_CONSOLE) + message(STATUS "PIP_BUILD_CONSOLE requires PIP_HAS_THREADS, disabling PIP_BUILD_CONSOLE") + set(PIP_BUILD_CONSOLE OFF CACHE BOOL "" FORCE) + endif() + if(PIP_BUILD_CLOUD) + message(STATUS "PIP_BUILD_CLOUD requires PIP_HAS_THREADS and PIP_HAS_SOCKET, disabling PIP_BUILD_CLOUD") + set(PIP_BUILD_CLOUD OFF CACHE BOOL "" FORCE) + endif() +endif() +if(PIP_BUILD_CLOUD AND NOT PIP_HAS_SOCKET) + message(STATUS "PIP_BUILD_CLOUD requires PIP_HAS_SOCKET, disabling PIP_BUILD_CLOUD") + set(PIP_BUILD_CLOUD OFF CACHE BOOL "" FORCE) endif() if(PIP_HAS_FILESYSTEM) diff --git a/libs/main/application/pitranslator.h b/libs/main/application/pitranslator.h index 432b1f79..c611e49e 100644 --- a/libs/main/application/pitranslator.h +++ b/libs/main/application/pitranslator.h @@ -5,7 +5,7 @@ //! \~russian Поддержка перевода /* PIP - Platform Independent Primitives - Translation support + Translation support Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify @@ -107,6 +107,22 @@ private: static PITranslator * instance(); }; +#ifndef PIP_HAS_FILESYSTEM +// no-filesystem build: translations cannot be loaded from disk, all strings pass through unchanged +inline PIString PITranslator::tr(const PIString & in, const PIString &) { + return in; +} +inline void PITranslator::clear() {} +inline void PITranslator::loadLang(const PIString &, PIString) {} +inline void PITranslator::loadConfig(const PIString &) {} +inline bool PITranslator::load(const PIByteArray &) { + return false; +} +inline bool PITranslator::loadFile(const PIString &) { + return false; +} +#endif // PIP_HAS_FILESYSTEM + //! \~\ingroup Application //! \~\brief diff --git a/libs/main/cloud/picloudbase.h b/libs/main/cloud/picloudbase.h index 6525348b..4d0c4086 100644 --- a/libs/main/cloud/picloudbase.h +++ b/libs/main/cloud/picloudbase.h @@ -33,6 +33,7 @@ //! \brief //! \~english Base class for cloud client and server. //! \~russian Базовый класс для облачного клиента и сервера. +#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS) class PIP_CLOUD_EXPORT PICloudBase { public: //! \~english Constructs the shared PICloud transport state. @@ -48,5 +49,6 @@ protected: PIStreamPacker streampacker; PICloud::TCP tcp; }; +#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS #endif // PICLOUDBASE_H diff --git a/libs/main/cloud/picloudclient.h b/libs/main/cloud/picloudclient.h index 5214324c..96f317fa 100644 --- a/libs/main/cloud/picloudclient.h +++ b/libs/main/cloud/picloudclient.h @@ -32,6 +32,7 @@ //! \~\brief //! \~english %PIIODevice implementation for a logical PICloud client. //! \~russian Реализация %PIIODevice для логического клиента PICloud. +#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS) class PIP_CLOUD_EXPORT PICloudClient : public PIIODevice , public PICloudBase { @@ -102,5 +103,6 @@ private: std::atomic_bool is_connected; std::atomic_bool is_deleted; }; +#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS #endif // PICLOUDCLIENT_H diff --git a/libs/main/cloud/picloudserver.h b/libs/main/cloud/picloudserver.h index 7b97fa16..13ec48ec 100644 --- a/libs/main/cloud/picloudserver.h +++ b/libs/main/cloud/picloudserver.h @@ -32,6 +32,7 @@ //! \~\brief //! \~english %PIIODevice implementation for a logical PICloud server. //! \~russian Реализация %PIIODevice для логического сервера PICloud. +#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS) class PIP_CLOUD_EXPORT PICloudServer : public PIIODevice , public PICloudBase { @@ -127,5 +128,6 @@ private: mutable PIMutex clients_mutex; std::atomic_bool is_deleted; }; +#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS #endif // PICLOUDSERVER_H diff --git a/libs/main/cloud/picloudtcp.h b/libs/main/cloud/picloudtcp.h index a0e0563a..1ae5149e 100644 --- a/libs/main/cloud/picloudtcp.h +++ b/libs/main/cloud/picloudtcp.h @@ -43,13 +43,14 @@ namespace PICloud { //! \~\brief //! \~english Builds and parses PICloud frames on top of %PIStreamPacker. //! \~russian Формирует и разбирает кадры PICloud поверх %PIStreamPacker. +#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS) class PIP_CLOUD_EXPORT TCP { public: //! \~english Supported PICloud frame versions. //! \~russian Поддерживаемые версии кадров PICloud. enum Version { Version_1 = 1 /** \~english First protocol version \~russian Первая версия протокола */, - Version_2 = 2 /** \~english Current protocol version \~russian Текущая версия протокола */ + Version_2 = 2 /** \~english Current protocol version \~russian Текущая версия протокола */ }; //! \~english Logical destination role of a PICloud frame. @@ -64,10 +65,10 @@ public: //! \~russian Вид полезной нагрузки кадра PICloud. enum Type { InvalidType = 0 /** \~english Invalid or unknown frame \~russian Некорректный или неизвестный кадр */, - Connect = 1 /** \~english Connect or registration frame \~russian Кадр подключения или регистрации */, - Disconnect = 2 /** \~english Disconnect notification frame \~russian Кадр уведомления об отключении */, - Data = 3 /** \~english Payload data frame \~russian Кадр с полезными данными */, - Ping = 4 /** \~english Keepalive frame \~russian Кадр поддержания соединения */ + Connect = 1 /** \~english Connect or registration frame \~russian Кадр подключения или регистрации */, + Disconnect = 2 /** \~english Disconnect notification frame \~russian Кадр уведомления об отключении */, + Data = 3 /** \~english Payload data frame \~russian Кадр с полезными данными */, + Ping = 4 /** \~english Keepalive frame \~russian Кадр поддержания соединения */ }; @@ -154,6 +155,7 @@ private: PIStreamPacker * streampacker; PIMutex mutex_send; }; +#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS } // namespace PICloud diff --git a/libs/main/console/pikbdlistener.cpp b/libs/main/console/pikbdlistener.cpp index 7ebefe6b..1b339db9 100644 --- a/libs/main/console/pikbdlistener.cpp +++ b/libs/main/console/pikbdlistener.cpp @@ -18,7 +18,7 @@ */ #include "pikbdlistener.h" -#ifdef PIP_HAS_THREADS +#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY)) # include "piincludes_p.h" # include "piliterals.h" diff --git a/libs/main/console/pikbdlistener.h b/libs/main/console/pikbdlistener.h index 42987a61..b278192b 100644 --- a/libs/main/console/pikbdlistener.h +++ b/libs/main/console/pikbdlistener.h @@ -27,7 +27,7 @@ #include "pibase.h" -#ifdef PIP_HAS_THREADS +#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY)) # include "pithread.h" # include "pitime.h" diff --git a/libs/main/console/piscreen.h b/libs/main/console/piscreen.h index f55a7a6c..5d54a9f1 100644 --- a/libs/main/console/piscreen.h +++ b/libs/main/console/piscreen.h @@ -34,6 +34,7 @@ //! \~\brief //! \~english Console screen manager with tile layout, drawing, and input routing. //! \~russian Менеджер консольного экрана с раскладкой тайлов, отрисовкой и маршрутизацией ввода. +#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY)) class PIP_CONSOLE_EXPORT PIScreen : public PIThread , public PIScreenTypes::PIScreenBase { @@ -214,6 +215,7 @@ private: PIScreenTile root; PIScreenTile *tile_focus, *tile_dialog; }; +#endif // PIP_HAS_THREADS #endif // PISCREEN_H diff --git a/libs/main/console/piscreentile.h b/libs/main/console/piscreentile.h index 235fb809..8de21559 100644 --- a/libs/main/console/piscreentile.h +++ b/libs/main/console/piscreentile.h @@ -38,6 +38,7 @@ class PIScreenDrawer; //! \details //! \~english Base class for all screen tiles providing layout and event handling. //! \~russian Базовый класс для всех экранных тайлов, обеспечивающий компоновку и обработку событий. +#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY)) class PIP_CONSOLE_EXPORT PIScreenTile: public PIObject { friend class PIScreen; PIOBJECT_SUBCLASS(PIScreenTile, PIObject); @@ -237,6 +238,7 @@ protected: private: int pw, ph; }; +#endif // PIP_HAS_THREADS #endif // PISCREENTILE_H diff --git a/libs/main/console/piscreentiles.h b/libs/main/console/piscreentiles.h index 2bc31f8d..d4b36473 100644 --- a/libs/main/console/piscreentiles.h +++ b/libs/main/console/piscreentiles.h @@ -36,6 +36,7 @@ //! \~\brief //! \~english Simple text tile with per-row formatting. //! \~russian Простой текстовый тайл с форматированием по строкам. +#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY)) class PIP_CONSOLE_EXPORT TileSimple: public PIScreenTile { PIOBJECT_SUBCLASS(TileSimple, PIScreenTile); @@ -147,7 +148,8 @@ public: //! \~russian События, генерируемые тайлом списка. enum EventType { SelectionChanged /** \~english Selection set changed. \~russian Изменился набор выбранных строк. */, - RowPressed /** \~english Current row was activated; event data stores the row index. \~russian Текущая строка была активирована; данные события содержат индекс строки. */ + RowPressed /** \~english Current row was activated; event data stores the row index. \~russian Текущая строка была активирована; + данные события содержат индекс строки. */ }; //! \~english Constructs a list tile with the specified selection mode. @@ -259,7 +261,8 @@ public: //! \~english Events emitted by the button group. //! \~russian События, генерируемые группой кнопок. enum EventType { - ButtonSelected /** \~english A button was selected; event data stores the button index. \~russian Кнопка была выбрана; данные события содержат индекс кнопки. */ + ButtonSelected /** \~english A button was selected; event data stores the button index. \~russian Кнопка была выбрана; данные + события содержат индекс кнопки. */ }; //! \~english Button caption with cell format. @@ -310,7 +313,8 @@ public: //! \~english Events emitted by the check box. //! \~russian События, генерируемые флажком. enum EventType { - Toggled /** \~english Check state changed; event data stores the new boolean value. \~russian Состояние флажка изменилось; данные события содержат новое логическое значение. */ + Toggled /** \~english Check state changed; event data stores the new boolean value. \~russian Состояние флажка изменилось; данные + события содержат новое логическое значение. */ }; //! \~english Text format of the caption. @@ -442,6 +446,7 @@ protected: bool inv; PITimeMeasurer tm_blink; }; +#endif // PIP_HAS_THREADS #endif // PISCREENTILES_H diff --git a/libs/main/console/piterminal.h b/libs/main/console/piterminal.h index 71aec0ca..6bf7f70b 100644 --- a/libs/main/console/piterminal.h +++ b/libs/main/console/piterminal.h @@ -39,6 +39,7 @@ //! and text formatting. //! \~russian Обеспечивает эмуляцию терминала для чтения ввода и вывода консоли. Поддерживает ANSI escape-последовательности для перемещения //! курсора, цветов и форматирования текста. +#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY)) class PIP_CONSOLE_EXPORT PITerminal: public PIThread { PIOBJECT_SUBCLASS(PITerminal, PIThread); @@ -97,13 +98,13 @@ private: void getCursor(int & x, int & y); uchar invertColor(uchar c); void run() override; -#ifndef WINDOWS +# ifndef WINDOWS void parseInput(const PIString & s); bool isCompleteEscSeq(const PIString & es); void applyEscSeq(PIString es); void moveCursor(int dx, int dy); int termType(const PIString & t); -#endif +# endif PRIVATE_DECLARATION(PIP_CONSOLE_EXPORT) int dsize_x, dsize_y; @@ -112,6 +113,7 @@ private: PITimeMeasurer cursor_tm; PIVector> cells; }; +#endif // PIP_HAS_THREADS #endif // PITERMINAL_H diff --git a/libs/main/core/piwaitevent_p.cpp b/libs/main/core/piwaitevent_p.cpp index 36ec80bc..773b28e2 100644 --- a/libs/main/core/piwaitevent_p.cpp +++ b/libs/main/core/piwaitevent_p.cpp @@ -27,7 +27,6 @@ #else # include # include -# include #endif #include "pistring.h" diff --git a/libs/main/io_devices/pican.cpp b/libs/main/io_devices/pican.cpp index 92d345f7..15ed3279 100644 --- a/libs/main/io_devices/pican.cpp +++ b/libs/main/io_devices/pican.cpp @@ -20,7 +20,7 @@ #include "pipropertystorage.h" #include "piwaitevent_p.h" -#if !defined(WINDOWS) && !defined(MAC_OS) && defined(PIP_HAS_SOCKET) +#if defined(LINUX) && defined(PIP_HAS_SOCKET) # define PIP_CAN #endif #ifdef PIP_CAN diff --git a/libs/main/io_devices/piiodevice.h b/libs/main/io_devices/piiodevice.h index a339016b..3f5e6a84 100644 --- a/libs/main/io_devices/piiodevice.h +++ b/libs/main/io_devices/piiodevice.h @@ -59,20 +59,26 @@ typedef std::function ReadRetFunc; #else -# define REGISTER_DEVICE(name) \ - STATIC_INITIALIZER_BEGIN \ - PIIODevice::registerDevice(name::fullPathPrefixS(), #name, []() -> PIIODevice * { return new name(); }); \ - STATIC_INITIALIZER_END +# define REGISTER_DEVICE(name) \ + STATIC_INITIALIZER_BEGIN \ + PIIODevice::registerDevice(name::fullPathPrefixS(), #name, []() -> PIIODevice * { return new name(); }); \ + STATIC_INITIALIZER_END -# define PIIODEVICE(name, prefix) \ - PIOBJECT_SUBCLASS(name, PIIODevice) \ - PIIODevice * copy() const override { return new name(); } \ - \ -public: \ - PIConstChars fullPathPrefix() const override { return prefix; } \ - static PIConstChars fullPathPrefixS() { return prefix; } \ - \ -private: +# define PIIODEVICE(name, prefix) \ + PIOBJECT_SUBCLASS(name, PIIODevice) \ + PIIODevice * copy() const override { \ + return new name(); \ + } \ + \ + public: \ + PIConstChars fullPathPrefix() const override { \ + return prefix; \ + } \ + static PIConstChars fullPathPrefixS() { \ + return prefix; \ + } \ + \ + private: #endif @@ -598,8 +604,10 @@ protected: void * ret_data_ = nullptr; private: +#ifdef PIP_HAS_THREADS EVENT_HANDLER(void, read_func); EVENT_HANDLER(void, write_func); +#endif virtual PIIODevice * copy() const { return nullptr; } PIString fullPathOptions() const; diff --git a/libs/main/piplatform.h b/libs/main/piplatform.h index f35d43b3..a5e75dcd 100644 --- a/libs/main/piplatform.h +++ b/libs/main/piplatform.h @@ -205,4 +205,9 @@ # define POSIX_SIGNALS #endif +// Platform provides a text terminal (termios TTY) for console keyboard I/O +#if defined(LINUX) || defined(MAC_OS) || defined(ANDROID) || defined(QNX) || defined(FREE_BSD) +# define PIP_HAS_TTY +#endif + #endif // PIPLATFORM_H