/* * Video On Demand Samples * * Copyright (C) 2015 Microchip Technology Germany II GmbH & Co. KG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * You may also obtain this software under a propriety license from Microchip. * Please contact Microchip for further information. * */ /*----------------------------------------------------------*/ /*! \file * \brief This file contains the CMostIpc class. */ /*----------------------------------------------------------*/ #ifndef IPC_H #define IPC_H #include #include #include #include "SafeVector.h" #include "MsgAddr.h" #include "MostMsgTx.h" #include "MsgAddr.h" #include "MsgFilter.h" class CMostIpc; /*! \cond PRIVATE */ typedef struct { pthread_t workerThread; CMostIpc *ipc; int clientSock; char clientIP[46]; uint32_t clientPort; } TcpClientInfo_t; /*! \endcond */ /*----------------------------------------------------------*/ /*! * \brief Inter Process Communication * 1. sends messages using MOST protocol over UDP * 2. receives messages and forwards them to their * handlers */ /*----------------------------------------------------------*/ class CMostIpc { private: bool isServer; bool allowThreadRun; bool udpRxThreadIsRunning; bool txThreadIsRunning; bool acceptThreadIsRunning; CSafeVector m_MsgTxQueue; CSafeVector m_MsgFilterQueue; CSafeVector m_TcpClientConnections; pthread_mutex_t critical_mutex_rx; pthread_mutex_t critical_mutex_tcp; sem_t semTx; int udpSock; int tcpSock; /*----------------------------------------------------------*/ /*! \brief TCP accept thread * \note Never call this method directly! */ /*----------------------------------------------------------*/ static void *TcpAcceptThread( void *pInst ); /*----------------------------------------------------------*/ /*! \brief TCP read / write thread * \note Never call this method directly! */ /*----------------------------------------------------------*/ static void *TcpWorkerThread( void *pInst ); /*----------------------------------------------------------*/ /*! \brief UDP receiving thread * \note Never call this method directly! */ /*----------------------------------------------------------*/ static void *UdpWorkerRXThread( void *pInst ); /*----------------------------------------------------------*/ /*! \brief Sending thread * \note Never call this method directly! */ /*----------------------------------------------------------*/ static void *TXThread( void *pInst ); /*----------------------------------------------------------*/ /*! \brief handle a received message */ /*----------------------------------------------------------*/ void OnMsgReceived( CMsgAddr *Addr, CMostMsg *msg ); bool SendUdp( const char *ipAddress, uint32_t port, const uint8_t *buffer, uint32_t bufferLen ); bool SendTcp( const char *ipAddress, uint32_t port, const uint8_t *buffer, uint32_t bufferLen ); public: /*----------------------------------------------------------*/ /*! \brief constructs Inter Process Communication, which acts as Server * \param port - If set to server by isServer=true, this value is the server port which the UDP and TCP sockets are listening. * If set to client by isServer=false, this is the client socket port. If set to 0 or below, a random port will be chosen. * Otherwise the given port will be used as source port of the connection. The server always can handle random and fixed client port connections. * \param isServer - true, if this component shall act as "the" server. false, if this component shall act as one of many clients. */ /*----------------------------------------------------------*/ CMostIpc( int port, bool isServer ); /*----------------------------------------------------------*/ /*! \brief Deletes every resources used by Inter Process Communication */ /*----------------------------------------------------------*/ ~CMostIpc(); /*----------------------------------------------------------*/ /*! \brief send a MOST message */ /*----------------------------------------------------------*/ void SendMsg( CMostMsgTx *Msg ); /*----------------------------------------------------------*/ /*! \brief adds a message handler */ /*----------------------------------------------------------*/ void RegisterMessageHandler( CMsgFilter *Filter ); /*----------------------------------------------------------*/ /*! \brief removes a message handler */ /*----------------------------------------------------------*/ void UnregisterMessageHandler( CMsgFilter *Filter ); }; #endif //IPC_H