/* * 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. * */ #include #include #include "Console.h" #include "NodeDatabase.h" CSafeVector CNodeEntry::allNodes; CNodeConnectionEntry::CNodeConnectionEntry( CNodeEntry *parent ) : parentNode( parent ), channelConfig( NULL ), channelId( 0xFFFFFFFF ), inHandle( 0xFFFFFFFF ), outHandle( 0xFFFFFFFF ), connectHandle( 0xFFFFFFFF ), splittedSourceHandle( 0xFFFFFFFF ), mostConnectionLabel( 0xFFFFFFFF ), inSocketState( NodeConnection_NotUsed ), outSocketState( NodeConnection_NotUsed ), connectedSocketState( NodeConnection_NotUsed ), bufferSize( -1 ) { memset( deviceName, 0, sizeof( deviceName ) ); }; CNodeConnectionEntry::~CNodeConnectionEntry() { if( NULL != channelConfig ) { delete channelConfig; channelConfig = NULL; } } CNodeEntry::CNodeEntry() : deviceInstance( 0xFF ), nodeAddress( 0xFFFF ), deviceType( 0xFFFF ), macAddress( NULL ), isTsiPortOpened(false), isMlbPortOpened( false ), isUsbPortOpened( false ), isI2SPortOpened( false ) { } CNodeEntry::~CNodeEntry() { if( NULL != macAddress ) delete macAddress; } uint16_t CNodeEntry::GetAmountOfNodeEntries() { return allNodes.Size(); } CNodeEntry *CNodeEntry::GetNodeEntry( uint16_t index ) { return allNodes[index]; } CNodeEntry *CNodeEntry::GetNodeEntry( uint8_t deviceInstance, uint16_t nodeAddress ) { CNodeEntry *entry = NULL; for( uint32_t i = 0; i < allNodes.Size(); i++ ) { if( ( allNodes[i]->deviceInstance == deviceInstance ) && ( allNodes[i]->nodeAddress == nodeAddress ) ) { entry = allNodes[i]; break; } } if( NULL == entry ) { entry = new CNodeEntry(); entry->deviceInstance = deviceInstance; entry->nodeAddress = nodeAddress; allNodes.PushBack( entry ); } return entry; } CNodeEntry *CNodeEntry::GetNodeEntry( CMacAddr *macAddress ) { if( NULL == macAddress ) return NULL; CNodeEntry *entry = NULL; for( uint32_t i = 0; i < allNodes.Size(); i++ ) { CNodeEntry *node = allNodes[i]; if( ( NULL != node->macAddress ) && ( *node->macAddress == *macAddress ) ) { entry = node; break; } } return entry; } CNodeEntry *CNodeEntry::GetNodeEntry( uint8_t deviceInstance, uint32_t deviceType, uint32_t terminalInstance ) { uint32_t inst = 0; CNodeEntry *entry = NULL; for( uint32_t i = 0; i < allNodes.Size(); i++ ) { CNodeEntry *node = allNodes[i]; if( ( allNodes[i]->deviceInstance == deviceInstance ) && ( allNodes[i]->deviceType == deviceType ) ) { if( inst == terminalInstance ) { entry = node; break; } else { ++inst; } } } return entry; } uint32_t CNodeEntry::GetTerminalInstance( uint8_t deviceInstance, uint16_t nodeAddress, uint32_t deviceType ) { uint32_t terminalInst = 0; for( uint32_t i = 0; i < allNodes.Size(); i++ ) { if( ( allNodes[i]->deviceInstance == deviceInstance ) && ( allNodes[i]->deviceType == deviceType ) ) { if( ( allNodes[i]->nodeAddress == nodeAddress ) ) break; else ++terminalInst; } } return terminalInst; } void CNodeEntry::DeleteAllNodeEntries() { allNodes.RemoveAll(true); } void CNodeEntry::DeleteNodeEntry( uint16_t index ) { CNodeEntry *ent = allNodes[index]; if( NULL == ent ) return; allNodes.Remove(ent); delete ent; } const char *CNodeEntry::GetConnectionStateString( NodeConnectionState_t conState ) { switch( conState ) { case NodeConnection_NotUsed: return "Idle"; case NodeConnection_Pending_Up: return "Pending-Up"; case NodeConnection_Pending_Down: return "Pending-Down"; case NodeConnection_Used: return "Established"; default: return "Unknown State"; } } void CNodeEntry::PrintAllInformations() { ConsolePrintfStart( PRIO_LOW, "==================================================================\n" ); for( uint32_t i = 0; i < allNodes.Size(); i++ ) { CNodeEntry *entry = allNodes[i]; ; if( NULL != entry ) { ConsolePrintfContinue( "Inst:%d, NodeAddr:0x%X, DevType:0x%X, MAC:%s, open:%d\n", entry->deviceInstance, entry->nodeAddress, entry->deviceType, ( NULL != entry->macAddress ? entry->macAddress->ToString() : "None" ), ( entry->isUsbPortOpened || entry->isMlbPortOpened ) ); for( uint32_t j = 0; j < entry->GetAmountOfConnections(); j++ ) { CNodeConnectionEntry *con = entry->GetConnectionByIndex( j ); ConsolePrintfContinue( "Id:%d, inHandle:0x%X, outHandle:0x%X, conHandle:0x%X, conLabel:0x%X, inState:%s, outState:%s, conState:%s, bufferSize:%d, name:%s\n", con->channelId, con->inHandle, con->outHandle, con->connectHandle, con->mostConnectionLabel, GetConnectionStateString( con->inSocketState ), GetConnectionStateString( con->outSocketState ), GetConnectionStateString( con->connectedSocketState ), con->bufferSize, con->deviceName ); } } if( i < allNodes.Size() - 1 ) ConsolePrintfContinue( "------------------------------------------------------------------\n" ); } ConsolePrintfExit( "==================================================================\n" ); } uint16_t CNodeEntry::GetAmountOfConnections() { return allConnections.Size(); } CNodeConnectionEntry *CNodeEntry::GetConnectionByIndex( uint16_t index ) { return allConnections[index]; } CNodeConnectionEntry *CNodeEntry::GetConnectionByChannelId( uint32_t channelId, bool createNewIfUnknown ) { CNodeConnectionEntry *entry = NULL; for( uint32_t i = 0; i < allConnections.Size(); i++ ) { if( allConnections[i]->channelId == channelId ) { entry = allConnections[i]; break; } } if( createNewIfUnknown && NULL == entry ) { entry = new CNodeConnectionEntry( this ); entry->channelId = channelId; allConnections.PushBack( entry ); } return entry; } CNodeConnectionEntry *CNodeEntry::GetConflictingConnection( uint32_t channelId, CNodeEntry *opposite ) { if( NULL == opposite ) return NULL; if( opposite->deviceInstance != deviceInstance ) return NULL; CNodeConnectionEntry *entry = NULL; uint32_t connectionLabel = 0xFFFFFFFF; for( uint32_t i = 0; i < allConnections.Size(); i++ ) { if( allConnections[i]->channelId == channelId ) { connectionLabel = allConnections[i]->mostConnectionLabel; break; } } if( 0xFFFFFFFF != connectionLabel ) { for( uint32_t i = 0; i < opposite->allConnections.Size(); i++ ) { if( opposite->allConnections[i]->mostConnectionLabel == connectionLabel ) { entry = opposite->allConnections[i]; break; } } } return entry; } void CNodeEntry::DeleteConnection( uint32_t channelId ) { uint32_t index = 0xFFFFFFFF; for( uint32_t i = 0; i < allConnections.Size(); i++ ) { if( allConnections[i]->channelId == channelId ) { index = i; } } if( index >= allNodes.Size() ) return; CNodeConnectionEntry *ent = allConnections[index]; allConnections.Remove(ent); delete ent; }