fix: build PIP on Pico and arbitrary flag combinations
- guard console subsystem (PIScreen/PIScreenTile/tiles/PITerminal/ PIKbdListener) by PIP_HAS_THREADS plus a TTY or Windows console (new PIP_HAS_TTY platform macro) - termios is not available on bare-metal newlib - guard cloud subsystem (PICloudBase/Client/Server/TCP) by PIP_HAS_SOCKET and PIP_HAS_THREADS - add PIP_BUILD_CONSOLE/PIP_BUILD_CLOUD to the auto-disable flag dependencies in CMake - PIP_CAN (SocketCAN) is Linux-only, exclude other platforms - on Pico keep sockets/MQTT off by default: pico-sdk lwip provides only a partial POSIX socket layer (no netinet/in.h, poll.h) - PITranslator: inline no-op definitions when PIP_HAS_FILESYSTEM is off so the _tr literal links - PIIODevice: guard read_func/write_func EVENT_HANDLERs (no-threads) - piwaitevent_p.cpp: drop unused sys/ioctl.h include (missing on arm-none-eabi, broke Pico builds)
This commit is contained in:
+17
-4
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<PIVector<PIScreenTypes::Cell>> cells;
|
||||
};
|
||||
#endif // PIP_HAS_THREADS
|
||||
|
||||
|
||||
#endif // PITERMINAL_H
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#else
|
||||
# include <errno.h>
|
||||
# include <fcntl.h>
|
||||
# include <sys/ioctl.h>
|
||||
#endif
|
||||
#include "pistring.h"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -59,20 +59,26 @@ typedef std::function<bool(const uchar *, int, void *)> 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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user