/*
* 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 2 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 a helper class to store MOST connections
*/
/*----------------------------------------------------------*/
#ifndef CONNECTIONINFO_H
#define CONNECTIONINFO_H
#include
#include
#include
#include "SafeVector.h"
#include "Types.h"
#include "MacAddr.h"
/*!
* \brief This is a helper class for the CNetworkManagerHandler. It keeps track of the reported connections
* and the instanced CMultiplexer classes.
*/
class CConnectionInfo
{
public:
CConnectionInfo();
CConnectionInfo( CMacAddr *macAddr, TChannelId channelId, uint8_t mostInstance, bool isTx );
~CConnectionInfo();
///The Ethernet MAC address of this connection.
CMacAddr *macAddr;
///The device type as specified in XML file and configured in the config string (Group-Address)
TDeviceId deviceType;
///The instance count of this device class. Starting at 0 for the first instance. Incremented with every occurrence.
uint8_t deviceInstance;
///The channel ID as declared in the configuration XML file.
TChannelId channelId;
///The MOST ring instance. Starting at 0 for the first MOST ring, on the first OS81110.
TMostInstace mostInstance;
///The MOST data used by this channel.
EPDataType_t dataType;
///The reserved MOST bandwidth in bytes for this channel.
TBlockwidth reservedBandwidth;
///The amount of bytes reserved for this channel in Driver. If no buffers were allocated, this value is -1.
int32_t bufferSize;
///In case this is a local connection, the path of the character device is stored in this variable. (e.g. /dev/mdev0).
char deviceName[64];
///TRUE if this connections is a source. FALSE if this connection is a sink,
bool isTX;
//TRUE, if the input socket of this connection was successfully created.
bool inSocketCreated;
//TRUE, if the output socket of this connection was successfully created.
bool outSocketCreated;
//TRUE, if the input socket and the output socket of this connection were successfully connected.
bool socketsConnected;
///The MOST connection label.
uint32_t mostConnectionLabel;
///If this socket is a splitted / combined socket, this value holds the offset in byte. -1 if this is a normal socket.
int16_t splittedOffset;
///If this socket is a splitted / combined socket, this value holds the maximum bandwidth of all splitted sockets in byte. -1 if this is a normal socket.
int16_t splittedMaxBandwidth;
///This is USB specific. It describes how many sub-frames are concatenated into a single USB microframe.
uint16_t packetsPerXact;
};
/*!
* \brief This is a storage class holding multiple CConnectionInfo in a container.
* It supports adding, removing, serializing and deserializing
*/
class CConnectionInfoContainer
{
private:
CSafeVector allInfos;
bool Compare( CConnectionInfo *c, CConnectionInfo *t );
public:
/*----------------------------------------------------------*/
/*! \brief Default Constructor of CConnectionInfoContainer
*/
/*----------------------------------------------------------*/
CConnectionInfoContainer();
/*----------------------------------------------------------*/
/*! \brief Default Destructor of CConnectionInfoContainer
*/
/*----------------------------------------------------------*/
~CConnectionInfoContainer();
/*----------------------------------------------------------*/
/*! \brief Gets the amount of entries stored in the whole database.
* \return The amount of entries.
*/
/*----------------------------------------------------------*/
uint32_t GetAllInfoAmount();
/*----------------------------------------------------------*/
/*! \brief Gets the information at the corresponding position.
* \param index - the position inside the database
* \note Use GetAllInfoAmount() to get the max index (n-1).
* \return The information if found, NULL if out of range
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetInfo( uint32_t index );
/*----------------------------------------------------------*/
/*! \brief Compares to container.
* \param containerToCompare - The container to compare.
* \return true, if both containers stores the same information. false, otherwise.
*/
/*----------------------------------------------------------*/
bool Compare( CConnectionInfoContainer *containerToCompare );
/*----------------------------------------------------------*/
/*! \brief Checks if the given information is already stored inside the database.
* \param checkInfo - the information object to be checked
* \return true, if the information is already stored inside the database. false, otherwise.
*/
/*----------------------------------------------------------*/
bool ExistsEntry( CConnectionInfo *checkInfo );
/*----------------------------------------------------------*/
/*! \brief Gets an info object with the given parameters
* \param macAddr - The MAC address of the device
* \param channelId - The channel identifier as used in the XML file.
* \param mostInstance - The MOST ring instance, starting 0 for the first MOST instance.
* \return The info object if found. NULL, otherwise.
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetInfo( CMacAddr *macAddr, TChannelId channelId, uint8_t mostInstance );
/*----------------------------------------------------------*/
/*! \brief Gets the amount of devices with the same
* \param mostInstance - The MOST ring instance. Starting at 0 for the first MOST ring.
* \param deviceId - The device ID as declared in the configuration XML file.
* \return The Amount of devices found, with the given deviceId
*/
/*----------------------------------------------------------*/
uint8_t GetAmountOfDevices( TMostInstace mostInstance, TDeviceId deviceId );
/*----------------------------------------------------------*/
/*! \brief Helper function, which delivers a CConnectionInfo object to the given search parameters.
* \param macAddr - Searches for the given MAC address.
* \param channelId - Search for the given Channel address.
* \param mostInstance - Search on the given MOST ring instance.
* \param isTx - true, search for a transmission connection. false, search for a reception connection.
* \return An pointer to the matching CConnectionInfo object if found. NULL otherwise.
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetInfo( CMacAddr *macAddr, TChannelId channelId, uint8_t mostInstance, bool isTx );
/*----------------------------------------------------------*/
/*! \brief Stores the given information inside the database.
* \param info - The information to be stored.
*/
/*----------------------------------------------------------*/
void AddInfo( CConnectionInfo *info );
/*----------------------------------------------------------*/
/*! \brief Helper function, which deletes all stored informations retrieved so far.
*/
/*----------------------------------------------------------*/
void DestroyAllInfos();
/*----------------------------------------------------------*/
/*! \brief Helper function, which delete the information matching to the given parameters.
* \param macAddr - Searches for the given MAC address.
* \param channelId - Search for the given Channel address.
* \param mostInstance - Search on the given MOST ring instance.
*/
/*----------------------------------------------------------*/
void DestroyInfo( CMacAddr *macAddr, TChannelId channelId, uint8_t mostInstance );
/*----------------------------------------------------------*/
/*! \brief Helper function, which prints all available information to the console.
* \param hideTx - true, when transmission connections shall not be shown in the table.
* \param hideRx - true, when reception connections shall not be shown in the table.
*/
/*----------------------------------------------------------*/
void PrintTable( bool hideTx, bool hideRx );
/*----------------------------------------------------------*/
/*! \brief Serializes all connection informations to multi line string.
* \param pBuffer, buffer which then will hold the serialized string.
* \param bufferLen, the size of the given buffer.
* \return The amount of bytes used from the given buffer.
*/
/*----------------------------------------------------------*/
uint32_t SerializeToString( char *pBuffer, uint32_t bufferLen );
/*----------------------------------------------------------*/
/*! \brief Deserializes all connection informations to multi line string.
* \param pBuffer, buffer which will read of the serialized string.
* \return True, if the string could be used to deserialize all data. False, error occurred.
* \note The given buffer will be manipulated by strtok operation!
*/
/*----------------------------------------------------------*/
bool DeserializeFromString( char *pBuffer );
/*----------------------------------------------------------*/
/*! \brief Returns the amount of entries, which contains a CDEV device name
* \return The amount of devices.
*/
/*----------------------------------------------------------*/
uint32_t GetAmountOfCDevs();
/*----------------------------------------------------------*/
/*! \brief Retrieves the information of the specific CDEV.
* \param cdevInst - The index of the CDEV device, starting with 0 for the first device.
* \note Use GetAmountOfCDevs() the get the maximum possible index (n-1).
* \return The information object, if found. NULL, otherwise.
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetConnectionInfoOfCdev( uint32_t cdevInst );
/*----------------------------------------------------------*/
/*! \brief Retrieves the information of the specific CDEV.
* \param cdevInst - The index of the CDEV device, starting with 0 for the first device.
* \param splittedIndex - Index of splitted socket entry, starting with 0 for the first splitted entry which has an offset greater than zero.
* \note Use GetAmountOfCDevs() the get the maximum possible index (n-1).
* \return The information object, if found. NULL, otherwise.
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetConnectionInfoOfCdev( uint32_t cdevInst, uint32_t splittedIndex );
/*----------------------------------------------------------*/
/*! \brief Returns the amount of entries, which acts as a sink channel.
* \return The amount of devices.
*/
/*----------------------------------------------------------*/
uint32_t GetAmountOfSinks();
/*----------------------------------------------------------*/
/*! \brief Retrieves the information of the specific sink.
* \param cdevInst - The index of the sink, starting with 0 for the sink.
* \note Use GetAmountOfSinks() the get the maximum possible index (n-1).
* \return The information object, if found. NULL, otherwise.
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetConnectionInfoOfSink( uint32_t sinkInst );
/*----------------------------------------------------------*/
/*! \brief Gets the information object by the given MAC address.
* \param mac - The MAC address of the searched device.
* \return The information object, if found. NULL, otherwise.
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetConnectionInfoByMacAddress( const uint8_t *mac );
/*----------------------------------------------------------*/
/*! \brief Gets the opposite device information connected with given MAC address.
* \param mac - The MAC address of the device, which then the information of connected opposite device is returned.
* \return The information object, if found. NULL, otherwise.
*/
/*----------------------------------------------------------*/
CConnectionInfo *GetRemoteConnectionInfoByMacAddress( const uint8_t *mac );
};
#endif //CONNECTIONINFO_H