summaryrefslogtreecommitdiffstats
path: root/Src/VodXml.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/VodXml.cpp')
-rw-r--r--Src/VodXml.cpp1112
1 files changed, 1112 insertions, 0 deletions
diff --git a/Src/VodXml.cpp b/Src/VodXml.cpp
new file mode 100644
index 0000000..edf27c5
--- /dev/null
+++ b/Src/VodXml.cpp
@@ -0,0 +1,1112 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * You may also obtain this software under a propriety license from Microchip.
+ * Please contact Microchip for further information.
+ *
+ */
+
+#include "SafeVector.h"
+#include "Console.h"
+#include "VodXml.h"
+
+#define TAG_ADDRESS ((xmlChar *)"channel_addr")
+#define TAG_ADDRESS_HEX ((xmlChar *)"channel_addr_hex")
+#define TAG_ASYNC_BANDWIDTH ((xmlChar *)"async_bandwidth")
+#define TAG_BLOCKWIDTH ((xmlChar *)"blockwidth")
+#define TAG_OFFSET ((xmlChar *)"offset")
+#define TAG_BUFFER_SIZE ((xmlChar *)"buffer_size")
+#define TAG_CHANNEL ((xmlChar *)"channel")
+#define TAG_CHANNEL_ID ((xmlChar *)"channel_id")
+#define TAG_DATA_TYPE ((xmlChar *)"data_type")
+#define TAG_AIM_TYPE ((xmlChar *)"aim_type")
+#define TAG_DEVICE ((xmlChar *)"device")
+#define TAG_DEVICE_API_VERSION ((xmlChar *)"device_api_ver")
+#define TAG_DEVICE_MLB_SPEED ((xmlChar *)"open_mlb_port_speed")
+#define TAG_DEVICE_TYPE ((xmlChar *)"device_type")
+#define TAG_DEVICE_TYPE_HEX ((xmlChar *)"device_type_hex")
+#define TAG_DIR ((xmlChar *)"dir")
+#define TAG_ENDPOINT ((xmlChar *)"endpoint")
+#define TAG_TSI_PORT_ID ((xmlChar *)"tsi_port_id")
+#define TAG_TSI_PORT_MODE ((xmlChar *)"tsi_port_mode")
+#define TAG_I2S_V1_CLKDRIVEMODE ((xmlChar *)"i2s_v1_clock_drive_mode")
+#define TAG_I2S_V1_OPTION ((xmlChar *)"i2s_v1_option")
+#define TAG_I2S_V1_DATAFORMAT ((xmlChar *)"i2s_v1_data_format")
+#define TAG_I2S_V1_PIN ((xmlChar *)"i2s_v1_pin")
+#define TAG_I2S_OPTION ((xmlChar *)"i2s_option")
+#define TAG_I2S_CLOCK_DIR ((xmlChar *)"i2s_clock_dir")
+#define TAG_I2S_CLOCK_DELAY ((xmlChar *)"i2s_clock_delay")
+#define TAG_I2S_FS_SPEED ((xmlChar *)"i2s_fs_speed")
+#define TAG_I2S_ALIGN ((xmlChar *)"i2s_align")
+#define TAG_I2S_PIN ((xmlChar *)"i2s_pin")
+#define TAG_INSTANCE ((xmlChar *)"instance")
+#define TAG_LOCAL_CONNECTION ((xmlChar *)"local_connection")
+#define TAG_NETWORK_CONFIG ((xmlChar *)"network_config")
+#define TAG_NETWORK_MANAGER ((xmlChar *)"network_manager")
+#define TAG_NUMBER_OF_BUFFERS ((xmlChar *)"number_of_buffers")
+#define TAG_PACKETS_XACT ((xmlChar *)"packets_per_xact")
+#define TAG_PACKETS_XACT_HEX ((xmlChar *)"packets_per_xact_hex")
+#define TAG_PORT_ID ((xmlChar *)"port_id")
+#define TAG_ROUTE ((xmlChar *)"route")
+#define TAG_SCRIPT ((xmlChar *)"script")
+#define TAG_SOCKET ((xmlChar *)"socket")
+#define TAG_SUBBUFFER_SIZE ((xmlChar *)"subbuffer_size")
+#define TAG_TERMINAL ((xmlChar *)"terminal")
+#define TAG_TIMING_MASTER ((xmlChar *)"timing_master")
+
+#define VAL_AIM_TYPE_CDEV ((char*)"CDEV")
+#define VAL_AIM_TYPE_AUDIO ((char*)"AUDIO")
+#define VAL_AIM_TYPE_V4L ((char*)"V4L")
+
+#define VAL_PORT_MLB ((char*)"MLB")
+#define VAL_PORT_TSI ((char*)"TSI")
+#define VAL_PORT_I2S ((char*)"I2S")
+#define VAL_PORT_I2C ((char*)"I2C")
+#define VAL_PORT_USB ((char*)"USB")
+#define VAL_PORT_PCIE ((char*)"PCIE")
+#define VAL_PORT_MOST ((char*)"MOST")
+
+#define VAL_DATATYPE_SYNC ((char*)"SYNC")
+#define VAL_DATATYPE_ISOC ((char*)"ISOC")
+#define VAL_DATATYPE_ASYNC ((char*)"ASYNC")
+#define VAL_DATATYPE_CTRL ((char*)"CTRL")
+
+#define VAL_DIR_IN ((char*)"IN")
+#define VAL_DIR_OUT ((char*)"OUT")
+
+#define VAL_TSI_V1_PORT_0 ((char*)"TSI_PORT0")
+#define VAL_TSI_V1_PORT_1 ((char*)"TSI_PORT1")
+
+#define VAL_TSI_V1_SLAVE ((char*)"TSI_SLAVE")
+#define VAL_TSI_V1_MASTER ((char*)"TSI_MASTER")
+
+#define VAL_I2S_V1_CLK_OUTPUT ((char*)"Output")
+#define VAL_I2S_V1_CLK_INPUT ((char*)"Input")
+#define VAL_I2S_V1_CLK_ISOCOUT ((char*)"IsocOutput")
+#define VAL_I2S_V1_CLK_ISOCIN ((char*)"IsocInput")
+
+#define VAL_I2S_V1_OPTION_INOUT ((char*)"InOut")
+#define VAL_I2S_V1_OPTION_DUALIN ((char*)"DualIn")
+#define VAL_I2S_V1_OPTION_DUALOUT ((char*)"DualOut")
+#define VAL_I2S_V1_OPTION_FULL ((char*)"FullStream")
+#define VAL_I2S_V1_OPTION_WILDCARD ((char*)"Wildcard")
+
+#define VAL_I2S_V1_FMT_D64Fs16 ((char*)"Delay64Fs16Bit")
+#define VAL_I2S_V1_FMT_D64Fs24 ((char*)"Delay64Fs24Bit")
+#define VAL_I2S_V1_FMT_D64FsSeq ((char*)"Delay64FsSeq")
+#define VAL_I2S_V1_FMT_D128FsSeq ((char*)"Delay128FsSeq")
+#define VAL_I2S_V1_FMT_D256FsSeq ((char*)"Delay256FsSeq")
+#define VAL_I2S_V1_FMT_R64Fs16 ((char*)"Right64Fs16Bit")
+#define VAL_I2S_V1_FMT_R64Fs24 ((char*)"Right64Fs24Bit")
+#define VAL_I2S_V1_FMT_Seq64Fs ((char*)"Seq64Fs")
+#define VAL_I2S_V1_FMT_Seq128Fs ((char*)"Seq128Fs")
+#define VAL_I2S_V1_FMT_Seq256Fs ((char*)"Seq256Fs")
+#define VAL_I2S_V1_FMT_L64Fs16 ((char*)"Left64Fs16Bit")
+#define VAL_I2S_V1_FMT_L64Fs24 ((char*)"Left64Fs24Bit")
+#define VAL_I2S_V1_FMT_D512FsSeq ((char*)"Delay512FsSeq")
+#define VAL_I2S_V1_FMT_Seq512Fs ((char*)"Seq512Fs")
+
+#define VAL_I2S_V1_PIN_SR0 ((char*)"SR0Pin")
+#define VAL_I2S_V1_PIN_SX0 ((char*)"SX0Pin")
+#define VAL_I2S_V1_PIN_SR1 ((char*)"SR1Pin")
+#define VAL_I2S_V1_PIN_SX1 ((char*)"SX1Pin")
+#define VAL_I2S_V1_PIN_SR2 ((char*)"SR2Pin")
+#define VAL_I2S_V1_PIN_SX2 ((char*)"SX2Pin")
+#define VAL_I2S_V1_PIN_SR3 ((char*)"SR3Pin")
+#define VAL_I2S_V1_PIN_SX3 ((char*)"SX3Pin")
+#define VAL_I2S_V1_PIN_FSY_SCK ((char*)"FSY_SCK_Pins")
+
+#define VAL_I2S_OPTION_INOUT ((char*)"InOut")
+#define VAL_I2S_OPTION_DUALIN ((char*)"DualIn")
+#define VAL_I2S_OPTION_DUALOUT ((char*)"DualOut")
+#define VAL_I2S_OPTION_WILDCARD ((char*)"Wildcard")
+
+#define VAL_I2S_CLOCK_OUTPUT ((char*)"Output")
+#define VAL_I2S_CLOCK_INPUT ((char*)"Input")
+#define VAL_I2S_CLOCK_WILDCARD ((char*)"Wildcard")
+
+#define VAL_I2S_ALIGNMENT_L16 ((char*)"Left16")
+#define VAL_I2S_ALIGNMENT_L24 ((char*)"Left24")
+#define VAL_I2S_ALIGNMENT_R16 ((char*)"Right16")
+#define VAL_I2S_ALIGNMENT_R24 ((char*)"Right24")
+#define VAL_I2S_SEQUENTIAL ((char*)"Seq")
+
+#define VAL_I2S_PIN_SRXA0 ((char*)"SRXA0")
+#define VAL_I2S_PIN_SRXA1 ((char*)"SRXA1")
+#define VAL_I2S_PIN_SRXB0 ((char*)"SRXB0")
+#define VAL_I2S_PIN_SRXB1 ((char*)"SRXB1")
+
+#define UNKNOWN_ENDPOINT_ADDR 0xFF
+
+#define XML_STRCMP(x,y) (strcmp(reinterpret_cast< const char* >(x), reinterpret_cast< const char* >(y)) == 0)
+
+CVodXml::CVodXml( const char *szFile ) : CXml( szFile )
+{
+
+}
+
+bool CVodXml::GetLocalInicConfigurations( uint8_t *rxEndpoint, uint8_t *txEndpoint )
+{
+ if( NULL == rxEndpoint || NULL == txEndpoint )
+ return false;
+ *rxEndpoint = UNKNOWN_ENDPOINT_ADDR;
+ *txEndpoint = UNKNOWN_ENDPOINT_ADDR;
+ CXml rootXml( *( ( CXml * )this ) );
+ bool success = rootXml.SetToTopNode();
+ if( success && rootXml.FindNode( TAG_NETWORK_MANAGER ) )
+ {
+ CXml xmlNWM( rootXml );
+ success = xmlNWM.FindFirstChildNode();
+ while( success && xmlNWM.FindNode( TAG_ENDPOINT ) )
+ {
+ ConsolePrintf( PRIO_LOW, "NETWORK_MANAGER\r\n" );
+ xmlChar interface[XML_DEFAULT_VALUE_LEN];
+ if( xmlNWM.GetChildValue( TAG_PORT_ID, interface ) )
+ {
+ if( XML_STRCMP(interface, VAL_PORT_I2C) )
+ {
+ ConsolePrintf( PRIO_LOW,
+ "GetLocalInicConfigurations found I2C, returning without channel addresses\r\n" );
+ return true;
+ }
+ }
+ xmlChar dataType[XML_DEFAULT_VALUE_LEN];
+ xmlChar direction[XML_DEFAULT_VALUE_LEN];
+ dataType[0] = '\0';
+ direction[0] = '\0';
+ int epAddress;
+ success &= xmlNWM.GetChildValue( TAG_DATA_TYPE, dataType );
+ ConsolePrintf( PRIO_LOW, " Type:%s\r\n", dataType );
+ success &= xmlNWM.GetChildValue( TAG_DIR, direction );
+ ConsolePrintf( PRIO_LOW, " Direction:%s\r\n", direction );
+ if( !xmlNWM.GetChildValueInt( TAG_ADDRESS, epAddress ) )
+ {
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( xmlNWM.GetChildValue( TAG_ADDRESS_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ epAddress = ConvertToInt( szTmp );
+ }
+ ConsolePrintf( PRIO_LOW, " Address:%d\r\n", epAddress );
+
+ if( success )
+ {
+ if( XML_STRCMP(dataType, VAL_DATATYPE_CTRL) )
+ {
+ if( XML_STRCMP(direction, VAL_DIR_IN) )
+ {
+ *rxEndpoint = epAddress;
+ }
+ else if( XML_STRCMP(direction, VAL_DIR_OUT) )
+ {
+ *txEndpoint = epAddress;
+ }
+ }
+ }
+ else
+ {
+ ConsolePrintf( PRIO_ERROR, "Failed to retrieve Endpoint config\n" );
+ }
+ xmlNWM.FindNextNode();
+ }
+ }
+ return success && ( 0xFF != *rxEndpoint ) && ( 0xFF != *txEndpoint );
+}
+
+bool CVodXml::GetMostParameters(bool *isTimingMaster, uint32_t *asyncBandwidth)
+{
+ if( NULL == isTimingMaster || NULL == asyncBandwidth )
+ {
+ ConsolePrintf( PRIO_ERROR, RED"GetMostParameters was"\
+ " called with wrong parameters"RESETCOLOR"\n" );
+ return false;
+ }
+ uint8_t serverNum = 0;
+ CXml xmlNWM( *( ( CXml * )this ) );
+ bool success = xmlNWM.SetToTopNode();
+ if( success && xmlNWM.FindNode( TAG_NETWORK_MANAGER ) )
+ {
+ success = xmlNWM.FindFirstChildNode();
+ while( success && xmlNWM.FindNode( TAG_LOCAL_CONNECTION ) )
+ {
+ serverNum += 1;
+ xmlNWM.FindNextNode();
+ }
+ }
+ //Be compatible to old XML API
+ if( !success || 0 == serverNum )
+ {
+ success = GetNetworkConfiguration( isTimingMaster, asyncBandwidth );
+ return success;
+ }
+
+ if( success )
+ success = xmlNWM.SetToTopNode();
+ if( success )
+ success = xmlNWM.FindNode( TAG_NETWORK_MANAGER );
+ if( success )
+ success = xmlNWM.FindFirstChildNode();
+
+ if( success && xmlNWM.FindNode( TAG_LOCAL_CONNECTION ) )
+ {
+ CXml xmlLC( xmlNWM );
+ int bw;
+ int tm = true;
+ success &= xmlNWM.GetChildValueInt( TAG_TIMING_MASTER, tm );
+ if (success)
+ {
+ ConsolePrintf( PRIO_LOW, " Timing Master:%d\r\n", tm );
+ success &= xmlNWM.GetChildValueInt( TAG_ASYNC_BANDWIDTH, bw );
+ if (success)
+ {
+ *isTimingMaster = tm;
+ *asyncBandwidth = bw;
+ ConsolePrintf( PRIO_LOW, "Asynchronous Bandwidth:%d\r\n", bw );
+ }
+ }
+ }
+ return success;
+}
+
+bool CVodXml::GetLocalInicConfigurations( uint8_t *rxEndpoint[], uint8_t *txEndpoint[], uint32_t *apiVersion[],
+ SocketPort_t *hwPort[], bool *isTimingMaster[], uint32_t *asyncBandwidth[], uint8_t *serverNum )
+{
+ if( NULL == rxEndpoint || NULL == txEndpoint || NULL == serverNum ||
+ NULL == apiVersion || NULL == hwPort || NULL == isTimingMaster ||
+ NULL == asyncBandwidth )
+ {
+ ConsolePrintf( PRIO_ERROR, RED"GetLocalInicConfigurations was"\
+ " called with wrong parameters"RESETCOLOR"\n" );
+ return false;
+ }
+ *rxEndpoint = NULL;
+ *txEndpoint = NULL;
+ *apiVersion = NULL;
+ *hwPort = NULL;
+ *isTimingMaster = NULL;
+ *asyncBandwidth = NULL;
+ *serverNum = 0;
+ CXml xmlNWM( *( ( CXml * )this ) );
+ bool success = xmlNWM.SetToTopNode();
+ if( success && xmlNWM.FindNode( TAG_NETWORK_MANAGER ) )
+ {
+ success = xmlNWM.FindFirstChildNode();
+ while( success && xmlNWM.FindNode( TAG_LOCAL_CONNECTION ) )
+ {
+ *serverNum = *serverNum + 1;
+ xmlNWM.FindNextNode();
+ }
+ }
+ //Be compatible to old XML API
+ if( !success || 0 == *serverNum )
+ {
+ uint8_t rxEP;
+ uint8_t txEP;
+ bool tm;
+ uint32_t bw;
+ success = GetLocalInicConfigurations( &rxEP, &txEP );
+ if( success )
+ success = GetNetworkConfiguration( &tm, &bw );
+
+ if( success )
+ {
+ *rxEndpoint = ( uint8_t * )calloc( 1, sizeof( uint8_t ) );
+ *txEndpoint = ( uint8_t * )calloc( 1, sizeof( uint8_t ) );
+ *apiVersion = ( uint32_t * )calloc( 1, sizeof( uint32_t ) );
+ *hwPort = ( SocketPort_t * )calloc( 1, sizeof( SocketPort_t ) );
+ *isTimingMaster = ( bool * )calloc( 1, sizeof( bool ) );
+ *asyncBandwidth = ( uint32_t * )calloc( 1, sizeof( uint32_t ) );
+ ( *rxEndpoint )[0] = rxEP;
+ ( *txEndpoint )[0] = txEP;
+ ( *apiVersion )[0] = GetServerDeviceApi();
+ ( *hwPort )[0] = GetServerHardwareInterface();
+ ( *isTimingMaster )[0] = tm;
+ ( *asyncBandwidth )[0] = bw;
+ *serverNum = 1;
+ }
+ return success;
+ }
+ //New method to get multiple instances of local configurations
+ *rxEndpoint = ( uint8_t * )calloc( *serverNum, sizeof( uint8_t ) );
+ *txEndpoint = ( uint8_t * )calloc( *serverNum, sizeof( uint8_t ) );
+ *apiVersion = ( uint32_t * )calloc( *serverNum, sizeof( uint32_t ) );
+ *hwPort = ( SocketPort_t * )calloc( *serverNum, sizeof( SocketPort_t ) );
+ *isTimingMaster = ( bool * )calloc( *serverNum, sizeof( bool ) );
+ *asyncBandwidth = ( uint32_t * )calloc( *serverNum, sizeof( uint32_t ) );
+
+ if( success )
+ success = xmlNWM.SetToTopNode();
+ if( success )
+ success = xmlNWM.FindNode( TAG_NETWORK_MANAGER );
+ if( success )
+ success = xmlNWM.FindFirstChildNode();
+
+ uint8_t currentCon = 0;
+ while( success && xmlNWM.FindNode( TAG_LOCAL_CONNECTION ) && currentCon < *serverNum )
+ {
+ int apiVer = -1;
+ CXml xmlLC( xmlNWM );
+ if( xmlLC.GetChildValueInt( TAG_DEVICE_API_VERSION, apiVer ) )
+ {
+ ( *apiVersion )[currentCon] = ( uint32_t )apiVer;
+ ConsolePrintf( PRIO_LOW, "[Con:%d] API Version: %d\r\n", currentCon, apiVer );
+ }
+ ( *hwPort )[currentCon] = PORT_UNKNOWN;
+ xmlChar interface[XML_DEFAULT_VALUE_LEN];
+ if( xmlLC.GetChildValue( TAG_PORT_ID, interface ) )
+ {
+ ConsolePrintf( PRIO_LOW, "[Con:%d] HW Type: %s\r\n", currentCon, interface );
+
+ if( XML_STRCMP(interface, VAL_PORT_MLB) )
+ ( *hwPort )[currentCon] = PORT_MLB;
+ else if( XML_STRCMP(interface, VAL_PORT_TSI) )
+ ( *hwPort )[currentCon] = PORT_TSI;
+ else if( XML_STRCMP(interface, VAL_PORT_USB) )
+ ( *hwPort )[currentCon] = PORT_USB;
+ else if( XML_STRCMP(interface, VAL_PORT_I2C) )
+ ( *hwPort )[currentCon] = PORT_I2C;
+ }
+ int isMaster = true;
+ int bw = 40;
+ success &= xmlNWM.GetChildValueInt( TAG_TIMING_MASTER, isMaster );
+ ConsolePrintf( PRIO_LOW, "[Con:%d] Timing Master:%d\r\n", currentCon, isMaster );
+ success &= xmlNWM.GetChildValueInt( TAG_ASYNC_BANDWIDTH, bw );
+ ConsolePrintf( PRIO_LOW, "[Con:%d] Asynchronous Bandwidth:%d\r\n", currentCon, bw );
+ ( *isTimingMaster )[currentCon] = isMaster;
+ ( *asyncBandwidth )[currentCon] = bw;
+ success = xmlLC.FindFirstChildNode();
+ while( success && xmlLC.FindNode( TAG_ENDPOINT ) )
+ {
+ xmlChar dataType[XML_DEFAULT_VALUE_LEN];
+ xmlChar direction[XML_DEFAULT_VALUE_LEN];
+ dataType[0] = '\0';
+ direction[0] = '\0';
+ int epAddress;
+ success &= xmlLC.GetChildValue( TAG_DATA_TYPE, dataType );
+ ConsolePrintf( PRIO_LOW, "[Con:%d] Type:%s\r\n", currentCon, dataType );
+ success &= xmlLC.GetChildValue( TAG_DIR, direction );
+ ConsolePrintf( PRIO_LOW, "[Con:%d] Direction:%s\r\n", currentCon, direction );
+ if( !xmlLC.GetChildValueInt( TAG_ADDRESS, epAddress ) )
+ {
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( xmlLC.GetChildValue( TAG_ADDRESS_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ epAddress = ConvertToInt( szTmp );
+ }
+ ConsolePrintf( PRIO_LOW, "[Con:%d] Address:%d\r\n", currentCon, epAddress );
+
+ if( success )
+ {
+ if( XML_STRCMP(dataType, VAL_DATATYPE_CTRL) )
+ {
+ if( XML_STRCMP(direction, VAL_DIR_IN) )
+ {
+ ( *rxEndpoint )[currentCon] = epAddress;
+ }
+ else if( XML_STRCMP(direction, VAL_DIR_OUT) )
+ {
+ ( *txEndpoint )[currentCon] = epAddress;
+ }
+ }
+ }
+ else
+ {
+ ConsolePrintf( PRIO_ERROR, "Failed to retrieve Endpoint config\n" );
+ }
+ xmlLC.FindNextNode();
+ }
+ currentCon++;
+ xmlNWM.FindNextNode();
+ }
+ return success;
+}
+
+SocketPort_t CVodXml::GetServerHardwareInterface()
+{
+ //Be compatible to old configurations, which had no interface declaration
+ SocketPort_t hwInterface = PORT_USB;
+ CXml rootXml( *( ( CXml * )this ) );
+ bool success = rootXml.SetToTopNode();
+ if( success && rootXml.FindNode( TAG_NETWORK_MANAGER ) )
+ {
+ CXml xmlNWM( rootXml );
+ success = xmlNWM.FindFirstChildNode();
+ if( success && xmlNWM.FindNode( TAG_ENDPOINT ) )
+ {
+ xmlChar interface[XML_DEFAULT_VALUE_LEN];
+
+ if( xmlNWM.GetChildValue( TAG_PORT_ID, interface ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Port ID : %s\r\n", interface );
+ if( XML_STRCMP(interface, VAL_PORT_MLB) )
+ hwInterface = PORT_MLB;
+ else if( XML_STRCMP(interface, VAL_PORT_USB) )
+ hwInterface = PORT_USB;
+ else if( XML_STRCMP(interface, VAL_PORT_I2C) )
+ hwInterface = PORT_I2C;
+ }
+ }
+ }
+ return hwInterface;
+}
+
+uint32_t CVodXml::GetServerDeviceApi()
+{
+ //Be compatible to old configurations, which had no API declaration
+ uint32_t deviceApi = 2;
+ CXml rootXml( *( ( CXml * )this ) );
+ bool success = rootXml.SetToTopNode();
+ if( success && rootXml.FindNode( TAG_NETWORK_MANAGER ) )
+ {
+ CXml xmlNWM( rootXml );
+ success = xmlNWM.FindFirstChildNode();
+ if( success && xmlNWM.FindNode( TAG_ENDPOINT ) )
+ {
+ ConsolePrintf( PRIO_LOW, "NETWORK_MANAGER\r\n" );
+ int apiVer;
+ if( xmlNWM.GetChildValueInt( TAG_DEVICE_API_VERSION, apiVer ) )
+ {
+ deviceApi = apiVer;
+ ConsolePrintf( PRIO_LOW, " - Device API Version: %d\r\n", apiVer );
+ }
+ }
+ }
+ return deviceApi;
+}
+
+uint32_t CVodXml::GetDeviceApi( uint32_t deviceType )
+{
+ uint32_t deviceApi = 0xFFFFFFFF;
+ bool success = true;
+ CXml Xml( *( ( CXml * )this ) );
+ success = Xml.SetToTopNode();
+ success &= Xml.FindNode( TAG_NETWORK_MANAGER );
+ success &= Xml.FindFirstChildNode();
+
+ while( success && Xml.FindNode( TAG_DEVICE ) )
+ {
+ int xmlDeviceType = -1;
+ int xmlDeviceApiVer = -1;
+ if( !Xml.GetChildValueInt( TAG_DEVICE_TYPE, xmlDeviceType ) )
+ {
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( Xml.GetChildValue( TAG_DEVICE_TYPE_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ xmlDeviceType = ConvertToInt( szTmp );
+ }
+ if( ( uint32_t )xmlDeviceType == deviceType )
+ {
+ success &= Xml.GetChildValueInt( TAG_DEVICE_API_VERSION, xmlDeviceApiVer );
+ if( success )
+ {
+ ConsolePrintf( PRIO_LOW, "Device API Version %d for device type: 0x%X\r\n", xmlDeviceApiVer,
+ xmlDeviceType );
+ deviceApi = xmlDeviceApiVer;
+ break;
+ }
+ }
+ Xml.FindNextNode();
+ }
+ return deviceApi;
+}
+
+MlbPortSpeed_t CVodXml::GetDeviceMlbPortSpeed( uint32_t deviceType )
+{
+ MlbPortSpeed_t mlbSpeed = MlbSpeedNotSet;
+ bool success = true;
+ CXml Xml( *( ( CXml * )this ) );
+ success = Xml.SetToTopNode();
+ success &= Xml.FindNode( TAG_NETWORK_MANAGER );
+ success &= Xml.FindFirstChildNode();
+
+ while( success && Xml.FindNode( TAG_DEVICE ) )
+ {
+ int xmlDeviceType;
+ int xmlDeviceMlbPortSpeed = -1;
+ if( !Xml.GetChildValueInt( TAG_DEVICE_TYPE, xmlDeviceType ) )
+ {
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( Xml.GetChildValue( TAG_DEVICE_TYPE_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ xmlDeviceType = ConvertToInt( szTmp );
+ }
+ ConsolePrintf( PRIO_LOW, "DeviceType: %d\r\n", xmlDeviceType );
+ if( ( uint32_t )xmlDeviceType == deviceType )
+ {
+ success &= Xml.GetChildValueInt( TAG_DEVICE_MLB_SPEED, xmlDeviceMlbPortSpeed );
+ if( success )
+ {
+ ConsolePrintf( PRIO_LOW, "Device MLB speed %d for device type: 0x%X\r\n", xmlDeviceMlbPortSpeed,
+ xmlDeviceType );
+ switch( xmlDeviceMlbPortSpeed )
+ {
+ case 256:
+ mlbSpeed = MlbSpeed256FS;
+ break;
+ case 512:
+ mlbSpeed = MlbSpeed512FS;
+ break;
+ case 1024:
+ mlbSpeed = MlbSpeed1024FS;
+ break;
+ case 2048:
+ mlbSpeed = MlbSpeed2048FS;
+ break;
+ case 3072:
+ mlbSpeed = MlbSpeed3072FS;
+ break;
+ case 4096:
+ mlbSpeed = MlbSpeed4096FS;
+ break;
+ case 6144:
+ mlbSpeed = MlbSpeed6144FS;
+ break;
+ case 8192:
+ mlbSpeed = MlbSpeed8192FS;
+ break;
+ default:
+ mlbSpeed = MlbSpeedNotSet;
+ break;
+ }
+ break;
+ }
+ }
+ Xml.FindNextNode();
+ }
+ return mlbSpeed;
+}
+
+bool CVodXml::GetNetworkConfiguration( bool *isTimingMaster, uint32_t *asyncBandwidth )
+{
+ if( NULL == isTimingMaster || NULL == asyncBandwidth )
+ return false;
+ *isTimingMaster = true;
+ *asyncBandwidth = 40;
+ CXml rootXml( *( ( CXml * )this ) );
+ bool success = rootXml.SetToTopNode();
+ if( success && rootXml.FindNode( TAG_NETWORK_MANAGER ) )
+ {
+ CXml xmlNWM( rootXml );
+ success = xmlNWM.FindFirstChildNode();
+ while( success && xmlNWM.FindNode( TAG_NETWORK_CONFIG ) )
+ {
+ ConsolePrintf( PRIO_LOW, "NETWORK_MANAGER\r\n" );
+ int isMaster;
+ int bw;
+ success &= xmlNWM.GetChildValueInt( TAG_TIMING_MASTER, isMaster );
+ ConsolePrintf( PRIO_LOW, " Is Timing Master:%d\r\n", isMaster );
+ success &= xmlNWM.GetChildValueInt( TAG_ASYNC_BANDWIDTH, bw );
+ ConsolePrintf( PRIO_LOW, " Asynchronous Bandwidth:%d\r\n", bw );
+ if( success )
+ {
+ *isTimingMaster = isMaster;
+ *asyncBandwidth = bw;
+ break;
+ }
+ else
+ {
+ ConsolePrintf( PRIO_ERROR, "Failed to retrieve Network config\n" );
+ }
+ xmlNWM.FindNextNode();
+ }
+ }
+ return success;
+}
+
+
+bool CVodXml::GetChannelConfigurations( uint32_t deviceType, CSafeVector<CChannelConfiguration *> &allChannels )
+{
+ bool success = false;
+ bool found = false;
+ CXml Xml( *( ( CXml * )this ) );
+ success = Xml.SetToTopNode();
+ success &= Xml.FindNode( TAG_NETWORK_MANAGER );
+ success &= Xml.FindFirstChildNode();
+
+ while( !found && Xml.FindNode( TAG_DEVICE ) )
+ {
+ int xmlDeviceType = -1;
+ char *externalScript = NULL;
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( !Xml.GetChildValueInt( TAG_DEVICE_TYPE, xmlDeviceType ) )
+ {
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( Xml.GetChildValue( TAG_DEVICE_TYPE_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ xmlDeviceType = ConvertToInt( szTmp );
+ }
+ if( ( uint32_t )xmlDeviceType != deviceType )
+ {
+ Xml.FindNextNode();
+ continue;
+ }
+ ConsolePrintf( PRIO_LOW, "DeviceType: %d (0x%X)\r\n", xmlDeviceType, xmlDeviceType );
+ szTmp[0] = '\0';
+ if( Xml.GetChildValue( TAG_SCRIPT, szTmp ) )
+ {
+ int scriptLen = xmlStrlen( szTmp );
+ externalScript = ( char * )malloc( scriptLen + 1 );
+ if( NULL != externalScript )
+ {
+ memcpy( externalScript, szTmp, scriptLen );
+ externalScript[scriptLen] = '\0';
+ }
+ ConsolePrintf( PRIO_LOW, "External script:'%s'\r\n", externalScript );
+ }
+ found = true;
+ CXml Channel( Xml );
+ success = Channel.FindFirstChildNode();
+
+ while( success && Channel.FindNode( TAG_CHANNEL ) )
+ {
+ int channelId;
+ success &= Channel.GetChildValueInt( TAG_CHANNEL_ID, channelId );
+ if( success )
+ {
+ ConsolePrintf( PRIO_LOW, " Channel: %u\r\n", channelId );
+ CChannelConfiguration *channelConfig = new CChannelConfiguration();
+ allChannels.PushBack( channelConfig );
+ channelConfig->deviceType = xmlDeviceType;
+ channelConfig->channelId = channelId;
+ channelConfig->externalScipt = externalScript;
+ CXml Socket( Channel );
+ success = Socket.FindFirstChildNode();
+ while( Socket.FindNode( TAG_SOCKET ) )
+ {
+ ConsolePrintf( PRIO_LOW, " Socket:\r\n" );
+ int nTmp;
+ CSocketConfiguration *sockConfig = NULL;
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_DIR, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Direction : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_DIR_IN) )
+ sockConfig = &channelConfig->inSocket;
+ else if( XML_STRCMP(szTmp, VAL_DIR_OUT) )
+ sockConfig = &channelConfig->outSocket;
+ }
+ if( NULL == sockConfig )
+ {
+ ConsolePrintf( PRIO_ERROR, RED"VodXml can not detect socket direction"RESETCOLOR"\n" );
+ return false; //unknown target socket
+ }
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_PORT_ID, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Port ID : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_PORT_MLB) )
+ sockConfig->port = PORT_MLB;
+ else if( XML_STRCMP(szTmp, VAL_PORT_TSI) )
+ sockConfig->port = PORT_TSI;
+ else if( XML_STRCMP(szTmp, VAL_PORT_I2S) )
+ sockConfig->port = PORT_I2S;
+ else if( XML_STRCMP(szTmp, VAL_PORT_USB) )
+ sockConfig->port = PORT_USB;
+ else if( XML_STRCMP(szTmp, VAL_PORT_PCIE) )
+ sockConfig->port = PORT_PCIE;
+ else if( XML_STRCMP(szTmp, VAL_PORT_MOST) )
+ sockConfig->port = PORT_MOST;
+ else
+ sockConfig->port = PORT_UNKNOWN;
+ }
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_DATA_TYPE, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Data Type : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_DATATYPE_SYNC) )
+ sockConfig->type = EP_Synchron;
+ else if( XML_STRCMP(szTmp, VAL_DATATYPE_ISOC) )
+ sockConfig->type = EP_Isochron;
+ else if( XML_STRCMP(szTmp, VAL_DATATYPE_ASYNC) )
+ sockConfig->type = EP_Asynchron;
+ else if( XML_STRCMP(szTmp, VAL_DATATYPE_CTRL) )
+ sockConfig->type = EP_Control;
+ else
+ sockConfig->type = EP_Unknown;
+ }
+
+ if( Socket.GetChildValueInt( TAG_OFFSET, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Splitted Offset: %d\r\n", nTmp );
+ sockConfig->splittedOffset = nTmp;
+ }
+
+ if( Socket.GetChildValueInt( TAG_BLOCKWIDTH, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Blockwidth: %d\r\n", nTmp );
+ sockConfig->blockWidth = nTmp;
+ }
+
+ if( Socket.GetChildValueInt( TAG_ADDRESS, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Channel Address: 0x%X\r\n", nTmp );
+ sockConfig->address = nTmp;
+ }
+ else if( Socket.GetChildValue( TAG_ADDRESS_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Channel Address (hex): 0x%X\r\n", nTmp );
+ sockConfig->address = ConvertToInt( szTmp );
+ }
+
+ if( Socket.GetChildValueInt( TAG_NUMBER_OF_BUFFERS, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Number of Buffers: %d\r\n", nTmp );
+ sockConfig->amountOfBuffers = nTmp;
+ }
+
+ if( Socket.GetChildValueInt( TAG_BUFFER_SIZE, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Buffer Size: %d\r\n", nTmp );
+ sockConfig->bufferSize = nTmp;
+ }
+
+ if( Socket.GetChildValueInt( TAG_PACKETS_XACT, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Packets per Transaction: %d\r\n", nTmp );
+ sockConfig->packetsPerTransaction = nTmp;
+ }
+ else
+ {
+ if( Socket.GetChildValue( TAG_PACKETS_XACT_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ {
+ sockConfig->packetsPerTransaction = ConvertToInt( szTmp );
+ ConsolePrintf( PRIO_LOW, " - Packets per Transaction: 0x%X\r\n", sockConfig->packetsPerTransaction );
+ }
+ }
+
+ if( Socket.GetChildValueInt( TAG_SUBBUFFER_SIZE, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - Subbuffer Size: %d\r\n", nTmp );
+ sockConfig->subbufferSize = nTmp;
+ }
+
+ if( Socket.GetChildValue( TAG_AIM_TYPE, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - TAG_AIM_TYPE : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_AIM_TYPE_CDEV) )
+ sockConfig->aimType = AIM_CDEV;
+ else if( XML_STRCMP(szTmp, VAL_AIM_TYPE_AUDIO) )
+ sockConfig->aimType = AIM_AUDIO;
+ else if( XML_STRCMP(szTmp, VAL_AIM_TYPE_V4L) )
+ sockConfig->aimType = AIM_V4L;
+ else
+ sockConfig->aimType = AIM_UNKNOWN;
+ }
+
+ if( PORT_TSI == sockConfig->port )
+ {
+ if( Socket.GetChildValue( TAG_TSI_PORT_ID, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - TSI Port ID : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_TSI_V1_PORT_0) )
+ sockConfig->tsiConfig.tsiPortInstance = V1TsiPortInstance0;
+ else if( XML_STRCMP(szTmp, VAL_TSI_V1_PORT_1) )
+ sockConfig->tsiConfig.tsiPortInstance = V1TsiPortInstance1;
+ }
+ if( Socket.GetChildValue( TAG_TSI_PORT_MODE, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - TSI Port Mode : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_TSI_V1_SLAVE) )
+ sockConfig->tsiConfig.tsiPortMode = V1TsiPortModeSlave;
+ else if( XML_STRCMP(szTmp, VAL_TSI_V1_MASTER) )
+ sockConfig->tsiConfig.tsiPortMode = V1TsiPortModeMaster;
+ }
+ }
+ else if( PORT_I2S == sockConfig->port )
+ {
+ sockConfig->i2sConfig.portClkDriveModeV1 = V1I2sClockModeUnknown;
+ sockConfig->i2sConfig.portOptionV1 = V1I2sStreamingPortWildcard; //Be backward compatible
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sDataFormatUnknown;
+ sockConfig->i2sConfig.pinV1 = V1I2sInvalidPin;
+ sockConfig->i2sConfig.portOption = V3I2SOptionUnknown;
+ sockConfig->i2sConfig.clockMode = V3I2SClockModeUnknown;
+ sockConfig->i2sConfig.delayMode = V3I2SDelayUnknown;
+ sockConfig->i2sConfig.portSpeed = V3I2SSpeedUnknown;
+ sockConfig->i2sConfig.alignment = V3I2SAlignUnknown;
+ sockConfig->i2sConfig.pin = V3I2SInvalidPin;
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_I2S_V1_CLKDRIVEMODE, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S V1 clock drive mode : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_V1_CLK_OUTPUT) )
+ sockConfig->i2sConfig.portClkDriveModeV1 = V1I2sClockModeOutput;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_CLK_INPUT) )
+ sockConfig->i2sConfig.portClkDriveModeV1 = V1I2sClockModeInput;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_CLK_ISOCOUT) )
+ sockConfig->i2sConfig.portClkDriveModeV1 = V1I2sClockModeIsocOutput;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_CLK_ISOCIN) )
+ sockConfig->i2sConfig.portClkDriveModeV1 = V1I2sClockModeIsocInput;
+ }
+
+ if( Socket.GetChildValue( TAG_I2S_V1_OPTION, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S V1 port option : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_V1_OPTION_INOUT ) )
+ sockConfig->i2sConfig.portOptionV1 = V1I2sStreamingPortInOut;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_OPTION_DUALIN ) )
+ sockConfig->i2sConfig.portOptionV1 = V1I2sStreamingPortDualIn;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_OPTION_DUALOUT ) )
+ sockConfig->i2sConfig.portOptionV1 = V1I2sStreamingPortDualOut;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_OPTION_FULL ) )
+ sockConfig->i2sConfig.portOptionV1 = V1I2sStreamingPortFullStream;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_OPTION_WILDCARD ) )
+ sockConfig->i2sConfig.portOptionV1 = V1I2sStreamingPortWildcard;
+ }
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_I2S_V1_DATAFORMAT, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S V1 data format : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_D64Fs16) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sDelay64Fs16Bit;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_D64Fs24) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sDelay64Fs24Bit;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_D64FsSeq) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sDelay64FsSeq;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_D128FsSeq) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sDelay128FsSeq;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_D256FsSeq) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sDelay256FsSeq;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_R64Fs16) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sRight64Fs16Bit;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_R64Fs24) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sRight64Fs24Bit;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_Seq64Fs) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sSeq64Fs;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_Seq128Fs) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sSeq128Fs;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_Seq256Fs) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sSeq256Fs;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_L64Fs16) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sLeft64Fs16Bit;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_L64Fs24) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sLeft64Fs24Bit;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_D512FsSeq) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sDelay512FsSeq;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_FMT_Seq512Fs) )
+ sockConfig->i2sConfig.streamingDataFormatV1 = V1I2sSeq512Fs;
+ }
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_I2S_V1_PIN, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S V1 pin : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SR0) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSR0Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SX0) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSX0Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SR1) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSR1Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SX1) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSX1Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SR2) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSR2Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SX2) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSX2Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SR3) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSR3Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_SX3) )
+ sockConfig->i2sConfig.pinV1 = V1I2sSX3Pin;
+ else if( XML_STRCMP(szTmp, VAL_I2S_V1_PIN_FSY_SCK) )
+ sockConfig->i2sConfig.pinV1 = V1I2sFSYSCKPins;
+ }
+
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_I2S_OPTION, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S OPTION : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_OPTION_INOUT) )
+ sockConfig->i2sConfig.portOption = V3I2SOptionInOut;
+ else if( XML_STRCMP(szTmp, VAL_I2S_OPTION_DUALIN) )
+ sockConfig->i2sConfig.portOption = V3I2SOptionDualIn;
+ else if( XML_STRCMP(szTmp, VAL_I2S_OPTION_DUALOUT) )
+ sockConfig->i2sConfig.portOption = V3I2SOptionDualOut;
+ }
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_I2S_CLOCK_DIR, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S clock direction : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_CLOCK_OUTPUT) )
+ sockConfig->i2sConfig.clockMode = V3I2SClockModeOutput;
+ else if( XML_STRCMP(szTmp, VAL_I2S_CLOCK_INPUT) )
+ sockConfig->i2sConfig.clockMode = V3I2SClockModeInput;
+ else if( XML_STRCMP(szTmp, VAL_I2S_OPTION_WILDCARD) )
+ sockConfig->i2sConfig.clockMode = V3I2SClockModeWildcard;
+ }
+
+ if( Socket.GetChildValueInt( TAG_I2S_CLOCK_DELAY, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S clock delay: %d\r\n", nTmp );
+ if( 0 == nTmp )
+ sockConfig->i2sConfig.delayMode = V3I2SDelayOff;
+ else if( 1 == nTmp )
+ sockConfig->i2sConfig.delayMode = V3I2SDelayEnabled;
+ else if( 2 == nTmp )
+ sockConfig->i2sConfig.delayMode = V3I2SDelayWildcard;
+ }
+
+ if( Socket.GetChildValueInt( TAG_I2S_FS_SPEED, nTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S FS speed: %d\r\n", nTmp );
+ switch( nTmp )
+ {
+ case 64:
+ sockConfig->i2sConfig.portSpeed = V3I2SSpeed64FS;
+ break;
+ case 128:
+ sockConfig->i2sConfig.portSpeed = V3I2SSpeed128FS;
+ break;
+ case 256:
+ sockConfig->i2sConfig.portSpeed = V3I2SSpeed256FS;
+ break;
+ case 512:
+ sockConfig->i2sConfig.portSpeed = V3I2SSpeed512FS;
+ break;
+ case 0:
+ sockConfig->i2sConfig.portSpeed = V3I2SSpeedWildcard;
+ break;
+ }
+ }
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_I2S_ALIGN, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S alignment : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_ALIGNMENT_L16) )
+ sockConfig->i2sConfig.alignment = V3I2SAlignLeft16;
+ else if( XML_STRCMP(szTmp, VAL_I2S_ALIGNMENT_L24) )
+ sockConfig->i2sConfig.alignment = V3I2SAlignLeft24;
+ else if( XML_STRCMP(szTmp, VAL_I2S_ALIGNMENT_R16) )
+ sockConfig->i2sConfig.alignment = V3I2SAlignRight16;
+ else if( XML_STRCMP(szTmp, VAL_I2S_ALIGNMENT_R24) )
+ sockConfig->i2sConfig.alignment = V3I2SAlignRight24;
+ else if( XML_STRCMP(szTmp, VAL_I2S_SEQUENTIAL) )
+ sockConfig->i2sConfig.alignment = V3I2SAlignSeq;
+ }
+
+ szTmp[0] = '\0';
+ if( Socket.GetChildValue( TAG_I2S_PIN, szTmp ) )
+ {
+ ConsolePrintf( PRIO_LOW, " - I2S Pin : %s\r\n", szTmp );
+ if( XML_STRCMP(szTmp, VAL_I2S_PIN_SRXA0) )
+ sockConfig->i2sConfig.pin = V3I2SSRXA0;
+ else if( XML_STRCMP(szTmp, VAL_I2S_PIN_SRXA1) )
+ sockConfig->i2sConfig.pin = V3I2SSRXA1;
+ else if( XML_STRCMP(szTmp, VAL_I2S_PIN_SRXB0) )
+ sockConfig->i2sConfig.pin = V3I2SSRXB0;
+ else if( XML_STRCMP(szTmp, VAL_I2S_PIN_SRXB1) )
+ sockConfig->i2sConfig.pin = V3I2SSRXB1;
+ }
+ }
+
+ Socket.FindNextNode();
+ }
+ }
+ Channel.FindNextNode();
+ }
+ Xml.FindNextNode();
+ }
+ return success && found;
+}
+
+bool CVodXml::GetRouteTerminals( CRouteTerminal *routeTerminal, CSafeVector<CRouteTerminal *> &allRouteTerminals )
+{
+ bool success = false;
+ bool found = false;
+ CXml Xml( *( ( CXml * )this ) );
+ success = Xml.SetToTopNode();
+ success &= Xml.FindNode( TAG_NETWORK_MANAGER );
+ success &= Xml.FindFirstChildNode();
+
+ while( success && Xml.FindNode( TAG_ROUTE ) )
+ {
+ CXml t1( Xml );
+ t1.FindFirstChildNode();
+
+ int deviceType = -1;
+ int instance = -1;
+ int channelId = -1;
+
+ while( t1.FindNode( TAG_TERMINAL ) &&
+ t1.GetChildValueInt( TAG_CHANNEL_ID, channelId ) &&
+ t1.GetChildValueInt( TAG_INSTANCE, instance ) )
+ {
+ if( !t1.GetChildValueInt( TAG_DEVICE_TYPE, deviceType ) )
+ {
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( t1.GetChildValue( TAG_DEVICE_TYPE_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ deviceType = ConvertToInt( szTmp );
+ }
+ if( routeTerminal->deviceType != ( uint32_t )deviceType ||
+ routeTerminal->channelId != ( uint32_t )channelId ||
+ routeTerminal->instance != ( uint32_t )instance )
+ {
+ t1.FindNextNode();
+ continue;
+ }
+
+ CXml t2( Xml );
+ t2.FindFirstChildNode();
+
+ while( t2.FindNode( TAG_TERMINAL ) )
+ {
+ deviceType = -1;
+ if( !t2.GetChildValueInt( TAG_DEVICE_TYPE, deviceType ) )
+ {
+ xmlChar szTmp[XML_DEFAULT_VALUE_LEN];
+ if( t2.GetChildValue( TAG_DEVICE_TYPE_HEX, szTmp, XML_DEFAULT_VALUE_LEN ) )
+ deviceType = ConvertToInt( szTmp );
+ }
+ if( !t2.GetChildValueInt( TAG_CHANNEL_ID, channelId ) ||
+ !t2.GetChildValueInt( TAG_INSTANCE, instance ) ||
+ ( routeTerminal->deviceType == ( uint32_t )deviceType &&
+ routeTerminal->channelId == ( uint32_t )channelId &&
+ routeTerminal->instance == ( uint32_t )instance ) )
+ {
+ t2.FindNextNode();
+ continue;
+ }
+ bool alreadyStored = false;
+ for( uint32_t i = 0; found && i < allRouteTerminals.Size(); i++ )
+ {
+ if( allRouteTerminals[i]->deviceType == ( uint32_t )deviceType &&
+ allRouteTerminals[i]->channelId == ( uint32_t )channelId &&
+ allRouteTerminals[i]->instance == ( uint32_t )instance )
+ {
+ alreadyStored = true;
+ break;
+ }
+ }
+ if( !alreadyStored )
+ {
+ CRouteTerminal *terminal = new CRouteTerminal();
+ if( NULL != terminal )
+ {
+ terminal->deviceType = deviceType;
+ terminal->channelId = channelId;
+ terminal->instance = instance;
+ allRouteTerminals.PushBack( terminal );
+ found = true;
+ }
+ }
+ t2.FindNextNode();
+ }
+ t1.FindNextNode();
+ }
+ Xml.FindNextNode();
+ }
+ return success && found;
+}