#ifndef FRAMEWORK_OSAL_LINUX_TCSOCKETPOLLINGTASK_H_ #define FRAMEWORK_OSAL_LINUX_TCSOCKETPOLLINGTASK_H_ #include "../../objectmanager/SystemObject.h" #include "../../osal/linux/TmTcUnixUdpBridge.h" #include "../../tasks/ExecutableObjectIF.h" #include #include /** * @brief This class can be used to implement the polling of a Unix socket, * using UDP for now. * @details * The task will be blocked while the specified number of bytes has not been * received, so TC reception is handled inside a separate task. * This class caches the IP address of the sender. It is assumed there * is only one sender for now. */ class TcUnixUdpPollingTask: public SystemObject, public ExecutableObjectIF { friend class TmTcUnixUdpBridge; public: static constexpr size_t DEFAULT_MAX_FRAME_SIZE = 2048; //! 0.5 default milliseconds timeout for now. static constexpr timeval DEFAULT_TIMEOUT = {.tv_sec = 0, .tv_usec = 500}; TcUnixUdpPollingTask(object_id_t objectId, object_id_t tmtcUnixUdpBridge, size_t frameSize = 0, double timeoutSeconds = -1); virtual~ TcUnixUdpPollingTask(); /** * Turn on optional timeout for UDP polling. In the default mode, * the receive function will block until a packet is received. * @param timeoutSeconds */ void setTimeout(double timeoutSeconds); virtual ReturnValue_t performOperation(uint8_t opCode) override; virtual ReturnValue_t initialize() override; virtual ReturnValue_t initializeAfterTaskCreation() override; protected: StorageManagerIF* tcStore = nullptr; private: //! TMTC bridge is cached. object_id_t tmtcBridgeId = objects::NO_OBJECT; TmTcUnixUdpBridge* tmtcBridge = nullptr; MessageQueueId_t targetTcDestination = MessageQueueIF::NO_QUEUE; //! Reception flags: https://linux.die.net/man/2/recvfrom. int receptionFlags = 0; //! Server socket, which is member of TMTC bridge and is assigned in //! constructor int serverUdpSocket = 0; std::vector receptionBuffer; size_t frameSize = 0; timeval receptionTimeout; ReturnValue_t handleSuccessfullTcRead(size_t bytesRead); }; #endif /* FRAMEWORK_OSAL_LINUX_TCSOCKETPOLLINGTASK_H_ */