diff --git a/ds/audioOutputPortConfig.cpp b/ds/audioOutputPortConfig.cpp index c3ab1cc6..fdf6ebe5 100644 --- a/ds/audioOutputPortConfig.cpp +++ b/ds/audioOutputPortConfig.cpp @@ -34,6 +34,17 @@ #include "dsUtl.h" #include "stdlib.h" #include "dslogger.h" +#include +#include "manager.hpp" + + +typedef struct audioConfigs +{ + const dsAudioTypeConfig_t *pKConfigs; + const dsAudioPortConfig_t *pKPorts; + int *pKConfigSize; + int *pKPortSize; +}audioConfigs_t; namespace device { @@ -108,8 +119,56 @@ List AudioOutputPortConfig::getSupportedTypes() return supportedTypes; } -void AudioOutputPortConfig::load() +void dumpconfig(audioConfigs_t *config) { + INT_INFO("\n\n=========================================================================================================================\n\n"); + if(config->pKConfigs != NULL && *(config->pKConfigSize) != -1) + { + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + INT_INFO("%d:%s: pKConfigs = %p\n", __LINE__, __func__, config->pKConfigs); + INT_INFO("%d:%s: pKPorts = %p\n", __LINE__, __func__, config->pKPorts); + INT_INFO("%d:%s: pKConfigSize addr =%p \n", __LINE__, __func__, config->pKConfigSize); + INT_INFO("%d:%s: pKConfigSize value = %d \n", __LINE__, __func__, *(config->pKConfigSize)); + + for (size_t i = 0; i < *(config->pKConfigSize); i++) { + const dsAudioTypeConfig_t *typeCfg = &(config->pKConfigs[i]); + INT_INFO("%d:%s: typeCfg->typeId = %d\n", __LINE__, __func__, typeCfg->typeId); + INT_INFO("%d:%s: typeCfg->name = %s\n", __LINE__, __func__, typeCfg->name); + INT_INFO("%d:%s: typeCfg->numSupportedEncodings = %zu\n", __LINE__, __func__, typeCfg->numSupportedEncodings); + INT_INFO("%d:%s: typeCfg->numSupportedCompressions = %zu\n", __LINE__, __func__, typeCfg->numSupportedCompressions); + INT_INFO("%d:%s: typeCfg->numSupportedStereoModes = %zu\n", __LINE__, __func__, typeCfg->numSupportedStereoModes); + } + } + else + { + INT_ERROR("%d:%s: kAudioConfigs is NULL and *(config->pKConfigSize) is -1\n", __LINE__, __func__); + } + if(config->pKPorts != NULL && *(config->pKPortSize) != -1) + { + INT_INFO("%d:%s: pKPortSize addr = %p \n", __LINE__, __func__, config->pKPortSize); + INT_INFO("%d:%s: pKPortSize value = %d \n", __LINE__, __func__, *(config->pKPortSize)); + for (size_t i = 0; i < *(config->pKPortSize); i++) { + const dsAudioPortConfig_t *port = &(config->pKPorts[i]); + INT_INFO("%d:%s: port->id.type = %d\n", __LINE__, __func__, port->id.type); + INT_INFO("%d:%s: port->id.index = %d\n", __LINE__, __func__, port->id.index); + } + } + else + { + INT_ERROR("%d:%s: kAudioPorts is NULL and *(config->pKPortSize) is -1\n", __LINE__, __func__); + } + INT_INFO("\n\n=========================================================================================================================\n\n"); + INT_INFO("%d:%s: Exit function\n", __LINE__, __func__); +} + + +void AudioOutputPortConfig::load(void* pDLHandle) +{ + static int configSize, portSize, invalidSize = -1; + static audioConfigs_t configuration = {0}; + bool isDynamicConfigLoad = false; + + INT_INFO("Enter function\n"); try { /* * Load Constants First. @@ -133,43 +192,103 @@ void AudioOutputPortConfig::load() } + if ( nullptr != pDLHandle ) { + const char* searchVaribles[] = { + "kAudioConfigs", + "kAudioPorts", + "kAudioConfigs_size", + "kAudioPorts_size" + }; + bool ret = false; + + INT_INFO("%d:%s: Using dynamic library handle for config loading\n", __LINE__, __func__); + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(pDLHandle, searchVaribles[0], (void **)&configuration.pKConfigs); + if(ret == true) + { + // Considering Dynamic config loading is enabled since 1st symbol got + isDynamicConfigLoad = true; + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[2]); + ret = searchConfigs(pDLHandle, searchVaribles[2], (void **)&configuration.pKConfigSize); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[2]); + configuration.pKConfigSize = &invalidSize; + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(pDLHandle, searchVaribles[1], (void **)&configuration.pKPorts); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[1]); + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[3]); + ret = searchConfigs(pDLHandle, searchVaribles[3], (void **)&configuration.pKPortSize); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[3]); + configuration.pKPortSize = &invalidSize; + } + } + } + if ( false == isDynamicConfigLoad) + { + INT_INFO("%d:%s: Using OLD config loading\n", __LINE__, __func__); + configuration.pKConfigs = kConfigs; + configSize = dsUTL_DIM(kConfigs); + configuration.pKConfigSize = &configSize; + configuration.pKPorts = kPorts; + portSize = dsUTL_DIM(kPorts); + configuration.pKPortSize = &portSize; + INT_INFO("configuration.pKConfigs =%p, configuration.pKPorts =%p, *(configuration.pKConfigSize) = %d, *(configuration.pKPortSize) = %d\n", configuration.pKConfigs, configuration.pKPorts, *(configuration.pKConfigSize), *(configuration.pKPortSize)); + } /* - * Initialize Audio portTypes (encodings, compressions etc.) - * and its port instances (db, level etc) + * Check if configs are loaded properly */ - for (size_t i = 0; i < dsUTL_DIM(kConfigs); i++) { - const dsAudioTypeConfig_t *typeCfg = &kConfigs[i]; - AudioOutputPortType &aPortType = AudioOutputPortType::getInstance(typeCfg->typeId); - aPortType.enable(); - for (size_t j = 0; j < typeCfg->numSupportedEncodings; j++) { - aPortType.addEncoding(AudioEncoding::getInstance(typeCfg->encodings[j])); - _aEncodings.at(typeCfg->encodings[j]).enable(); - } - for (size_t j = 0; j < typeCfg->numSupportedCompressions; j++) { - aPortType.addCompression(typeCfg->compressions[j]); - _aCompressions.at(typeCfg->compressions[j]).enable(); - + if ( configuration.pKConfigs != NULL && configuration.pKPorts != NULL && + configuration.pKConfigSize != NULL && configuration.pKPortSize != NULL) + { + dumpconfig(&configuration); + //INT_INFO("disable the dumpconfig()\n"); + /* + * Initialize Audio portTypes (encodings, compressions etc.) + * and its port instances (db, level etc) + */ + for (size_t i = 0; i < *(configuration.pKConfigSize); i++) { + const dsAudioTypeConfig_t *typeCfg = &(configuration.pKConfigs[i]); + AudioOutputPortType &aPortType = AudioOutputPortType::getInstance(typeCfg->typeId); + aPortType.enable(); + for (size_t j = 0; j < typeCfg->numSupportedEncodings; j++) { + aPortType.addEncoding(AudioEncoding::getInstance(typeCfg->encodings[j])); + _aEncodings.at(typeCfg->encodings[j]).enable(); + } + for (size_t j = 0; j < typeCfg->numSupportedCompressions; j++) { + aPortType.addCompression(typeCfg->compressions[j]); + _aCompressions.at(typeCfg->compressions[j]).enable(); + } + for (size_t j = 0; j < typeCfg->numSupportedStereoModes; j++) { + aPortType.addStereoMode(typeCfg->stereoModes[j]); + _aStereoModes.at(typeCfg->stereoModes[j]).enable(); + } } - for (size_t j = 0; j < typeCfg->numSupportedStereoModes; j++) { - aPortType.addStereoMode(typeCfg->stereoModes[j]); - _aStereoModes.at(typeCfg->stereoModes[j]).enable(); + /* + * set up ports based on kPorts[] + */ + for (size_t i = 0; i < *(configuration.pKPortSize); i++) { + const dsAudioPortConfig_t *port = &configuration.pKPorts[i]; + _aPorts.push_back(AudioOutputPort((port->id.type), port->id.index, i)); + _aPortTypes.at(port->id.type).addPort(_aPorts.at(i)); } + INT_INFO("%d:%s: Audio Configs loaded successfully\n", __LINE__, __func__); } - - /* - * set up ports based on kPorts[] - */ - for (size_t i = 0; i < dsUTL_DIM(kPorts); i++) { - const dsAudioPortConfig_t *port = &kPorts[i]; - _aPorts.push_back(AudioOutputPort((port->id.type), port->id.index, i)); - _aPortTypes.at(port->id.type).addPort(_aPorts.at(i)); + else { + INT_ERROR("%d:%s: Audio Configs loading failed\n", __LINE__, __func__); } - } catch(const Exception &e) { throw e; } + INT_INFO("Exit funcation\n"); } void AudioOutputPortConfig::release() diff --git a/ds/audioOutputPortConfig.hpp b/ds/audioOutputPortConfig.hpp index 90526b99..6370df40 100644 --- a/ds/audioOutputPortConfig.hpp +++ b/ds/audioOutputPortConfig.hpp @@ -66,7 +66,7 @@ class AudioOutputPortConfig { List getPorts(); List getSupportedTypes(); - void load(); + void load(void* pDLHandle); void release(); }; diff --git a/ds/frontPanelConfig.cpp b/ds/frontPanelConfig.cpp index e8c932b2..36bc3c63 100644 --- a/ds/frontPanelConfig.cpp +++ b/ds/frontPanelConfig.cpp @@ -41,9 +41,22 @@ #include "frontPanelSettings.hpp" #include "illegalArgumentException.hpp" #include "dslogger.h" +#include "manager.hpp" + +#define DEBUG 1 // Using for dumpconfig using namespace std; +typedef struct fpdConfigs +{ + const dsFPDColorConfig_t *pKFPDIndicatorColors; + const dsFPDIndicatorConfig_t *pKIndicators; + const dsFPDTextDisplayConfig_t *pKTextDisplays; + int *pKFPDIndicatorColors_size; + int *pKIndicators_size; + int *pKTextDisplays_size; +}fpdConfigs_t; + namespace device { /** @@ -56,6 +69,7 @@ namespace device { FrontPanelConfig::FrontPanelConfig() { m_isFPInitialized = false; + m_isFPConfigLoaded = false; } @@ -69,6 +83,7 @@ FrontPanelConfig::~FrontPanelConfig() { //dsFPTerm(); m_isFPInitialized = false; + m_isFPConfigLoaded = false; } @@ -92,7 +107,6 @@ FrontPanelConfig & FrontPanelConfig::getInstance() errorCode = dsFPInit(); if (dsERR_NONE == errorCode) { - _singleton.load(); _singleton.m_isFPInitialized = true; INT_INFO("dsFPInit success\n"); } @@ -337,6 +351,54 @@ List FrontPanelConfig::getTextDisplays() return rTexts; } +void dumpconfig(fpdConfigs_t *configuration) +{ + // Dump the configuration details + INT_INFO("\n\n===========================================================================\n\n"); + INT_INFO("Start of Front Panel Configuration Details:\n"); + if((configuration->pKFPDIndicatorColors !=NULL) && *(configuration->pKFPDIndicatorColors_size) != -1 && (configuration->pKIndicators != NULL) && *(configuration->pKIndicators_size) != -1) + { + INT_INFO("configuration->pKFPDIndicatorColors_size addr: %p\n", (configuration->pKFPDIndicatorColors_size)); + INT_INFO("configuration->pKFPDIndicatorColors_size data: %d\n", *(configuration->pKFPDIndicatorColors_size)); + INT_INFO("configuration->pKIndicators_size addr: %p\n", (configuration->pKIndicators_size)); + INT_INFO("configuration->pKIndicators_size data: %d\n", *(configuration->pKIndicators_size)); + for (size_t i = 0; i < *(configuration->pKFPDIndicatorColors_size); i++) { + INT_INFO(" Color ID: %d, color: %d\n", + configuration->pKFPDIndicatorColors[i].id, + configuration->pKFPDIndicatorColors[i].color); + } + INT_INFO("Indicators:\n"); + for (size_t i = 0; i < *(configuration->pKIndicators_size); i++) { + INT_INFO(" Indicator ID: %d, Max Brightness: %d, Max Cycle Rate: %d, Levels: %d, Color Mode: %d\n", + configuration->pKIndicators[i].id, + configuration->pKIndicators[i].maxBrightness, + configuration->pKIndicators[i].maxCycleRate, + configuration->pKIndicators[i].levels, + configuration->pKIndicators[i].colorMode); + } + } + + if(configuration->pKTextDisplays != NULL && configuration->pKTextDisplays_size != NULL){ + INT_INFO("configuration->pKTextDisplays_size: %p\n", configuration->pKTextDisplays_size); + INT_INFO("Text Displays:*(configuration->pKTextDisplays_size) =%d\n", *(configuration->pKTextDisplays_size)); + for (size_t i = 0; i < *(configuration->pKTextDisplays_size); i++) { + INT_INFO(" Text Display ID: %d, Max Brightness: %d, Max Cycle Rate: %d, Levels: %d, Max Horizontal Iterations: %d, Max Vertical Iterations: %d, Supported Characters: %s, Color Mode: %d\n", + configuration->pKTextDisplays[i].id, + configuration->pKTextDisplays[i].maxBrightness, + configuration->pKTextDisplays[i].maxCycleRate, + configuration->pKTextDisplays[i].levels, + configuration->pKTextDisplays[i].maxHorizontalIterations, + configuration->pKTextDisplays[i].maxVerticalIterations, + configuration->pKTextDisplays[i].supportedCharacters, + configuration->pKTextDisplays[i].colorMode); + } + } + else { + INT_INFO(" No Text Displays configured.\n"); + } + INT_INFO("End of Front Panel Configuration Details.\n"); + INT_INFO("\n\n===========================================================================\n\n"); +} /** * @fn FrontPanelConfig::load() @@ -345,51 +407,154 @@ List FrontPanelConfig::getTextDisplays() * * @return None */ -void FrontPanelConfig::load() +void FrontPanelConfig::load(void* pDLHandle) { /* * Create Indicators * 1. Create Supported Colors. * 2. Create Indicators. */ - { - for (size_t i = 0; i < dsUTL_DIM(kIndicatorColors); i++) { - _colors.push_back(FrontPanelIndicator::Color(kIndicatorColors[i].id)); - } + static int indicatorSize, indicatorColorSize, textDisplaySize, invalid_size = -1; + static fpdConfigs_t configuration = {0}; + bool isDynamicConfigLoad = false; + INT_INFO("Enter function\n"); + if (( false == m_isFPInitialized) || (true == m_isFPConfigLoaded)) { + INT_ERROR("%d:%s: '%s'\n", __LINE__, __func__, (!m_isFPInitialized) ? "Front Panel not initialized" : "Front Panel Config already loaded"); + return; + } - for (size_t i = 0; i < dsUTL_DIM(kIndicators); i++) { - /* All indicators support a same set of colors */ - _indicators.push_back(FrontPanelIndicator(kIndicators[i].id, - kIndicators[i].maxBrightness, - kIndicators[i].maxCycleRate, - kIndicators[i].levels, - kIndicators[i].colorMode)); - } + if (pDLHandle) + { + const char* searchVaribles[] = { + "kFPDIndicatorColors", + "kFPDIndicatorColors_size", + "kIndicators", + "kIndicators_size", + "kFPDTextDisplays", + "kFPDTextDisplays_size" + }; + bool ret = false; + INT_INFO("%d:%s: Using dynamic library handle for config loading\n", __LINE__, __func__); + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(pDLHandle, searchVaribles[0], (void **)&configuration.pKFPDIndicatorColors ); + if(ret == true) + { + // Considering Dynamic config loading is enabled since 1st symbol got + isDynamicConfigLoad = true; + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(pDLHandle, searchVaribles[1], (void **)&configuration.pKFPDIndicatorColors_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[1]); + configuration.pKFPDIndicatorColors_size = &invalid_size; + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[2]); + ret = searchConfigs(pDLHandle, searchVaribles[2], (void **)&configuration.pKIndicators); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[2]); + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[3]); + ret = searchConfigs(pDLHandle, searchVaribles[3], (void **)&configuration.pKIndicators_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[3]); + configuration.pKIndicators_size = &invalid_size; + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[4]); + ret = searchConfigs(pDLHandle, searchVaribles[4], (void **)&configuration.pKTextDisplays); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[4]); + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[5]); + ret = searchConfigs(pDLHandle, searchVaribles[5], (void **)&configuration.pKTextDisplays_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[5]); + configuration.pKTextDisplays_size = &invalid_size; + } + } + } - } + if ( false == isDynamicConfigLoad) + { + INT_INFO("%d:%s: Using OLD config loading\n", __LINE__, __func__); + configuration.pKFPDIndicatorColors = kIndicatorColors; + indicatorColorSize = dsUTL_DIM(kIndicatorColors); + configuration.pKFPDIndicatorColors_size = &indicatorColorSize; + configuration.pKIndicators = kIndicators; + indicatorSize = dsUTL_DIM(kIndicators); + configuration.pKIndicators_size = &indicatorSize; + configuration.pKTextDisplays = kTextDisplays; + textDisplaySize = dsUTL_DIM(kTextDisplays); + configuration.pKTextDisplays_size = &textDisplaySize; + + INT_INFO("configuration.pKFPDIndicatorColors =%p, *(configuration.pKFPDIndicatorColors_size) = %d\n", configuration.pKFPDIndicatorColors, *(configuration.pKFPDIndicatorColors_size)); + INT_INFO("configuration.pKIndicators =%p, *(configuration.pKIndicators_size) = %d\n", configuration.pKIndicators, *(configuration.pKIndicators_size)); + INT_INFO("configuration.pKTextDisplays =%p, *(configuration.pKTextDisplays_size) = %d\n", configuration.pKTextDisplays, *(configuration.pKTextDisplays_size)); + } - { - /* - * Create TextDisplays - * 1. Use Supported Colors created for indicators. - * 2. Create Text Displays. - */ - for (size_t i = 0; i < dsUTL_DIM(kTextDisplays); i++) { - _textDisplays.push_back( - FrontPanelTextDisplay(kTextDisplays[i].id, - kTextDisplays[i].maxBrightness, - kTextDisplays[i].maxCycleRate, - kTextDisplays[i].levels, - kTextDisplays[i].maxHorizontalIterations, - kTextDisplays[i].maxVerticalIterations, - kTextDisplays[i].supportedCharacters, - kTextDisplays[i].colorMode)); - } - } -} + if (configuration.pKFPDIndicatorColors != NULL && configuration.pKFPDIndicatorColors_size != NULL && + *(configuration.pKFPDIndicatorColors_size) > 0 && + configuration.pKIndicators != NULL && configuration.pKIndicators_size != NULL && + *(configuration.pKIndicators_size) > 0) + { + #if DEBUG + dumpconfig(&configuration); + //INT_INFO("disable the dumpconfig()\n"); + #endif + { + for (size_t i = 0; i < *(configuration.pKFPDIndicatorColors_size); i++) { + _colors.push_back(FrontPanelIndicator::Color(configuration.pKFPDIndicatorColors[i].id)); + } + + for (size_t i = 0; i < *(configuration.pKIndicators_size); i++) { + /* All indicators support a same set of colors */ + _indicators.push_back(FrontPanelIndicator(configuration.pKIndicators[i].id, + configuration.pKIndicators[i].maxBrightness, + configuration.pKIndicators[i].maxCycleRate, + configuration.pKIndicators[i].levels, + configuration.pKIndicators[i].colorMode)); + } + } + + if(configuration.pKTextDisplays != NULL && configuration.pKTextDisplays_size != NULL) + { + /* + * Create TextDisplays + * 1. Use Supported Colors created for indicators. + * 2. Create Text Displays. + */ + INT_DEBUG("Text Displays \n"); + for (size_t i = 0; i < *(configuration.pKTextDisplays_size); i++) { + _textDisplays.push_back( + FrontPanelTextDisplay(configuration.pKTextDisplays[i].id, + configuration.pKTextDisplays[i].maxBrightness, + configuration.pKTextDisplays[i].maxCycleRate, + configuration.pKTextDisplays[i].levels, + configuration.pKTextDisplays[i].maxHorizontalIterations, + configuration.pKTextDisplays[i].maxVerticalIterations, + configuration.pKTextDisplays[i].supportedCharacters, + configuration.pKTextDisplays[i].colorMode)); + } + } + else + { + INT_ERROR("No valid text display configuration found\n"); + } + } + else + { + INT_ERROR("No valid front panel configuration found\n"); + } + m_isFPConfigLoaded = true; + INT_INFO("Exit function\n"); + return; } +} /** @} */ /** @} */ diff --git a/ds/include/frontPanelConfig.hpp b/ds/include/frontPanelConfig.hpp index 77c243ba..be82ae60 100644 --- a/ds/include/frontPanelConfig.hpp +++ b/ds/include/frontPanelConfig.hpp @@ -59,12 +59,11 @@ class FrontPanelConfig { std::vector _textDisplays; //!< Container to hold all the FrontPanelTextDisplay instances. std::vector _colors; //!< Container to hold all the Color instances. bool m_isFPInitialized; + bool m_isFPConfigLoaded; FrontPanelConfig(); virtual ~FrontPanelConfig(); - void load(); - public: static FrontPanelConfig & getInstance(); @@ -80,11 +79,12 @@ class FrontPanelConfig { List getIndicators(); List getTextDisplays(); - /* Initialize Front Panel */ - void fPInit(); - /* Terminate Front Panel */ - void fPTerm(); + /* Initialize Front Panel */ + void fPInit(); + /* Terminate Front Panel */ + void fPTerm(); + void load(void* pDLHandle); }; } diff --git a/ds/include/manager.hpp b/ds/include/manager.hpp index 2539569a..e65ff68f 100644 --- a/ds/include/manager.hpp +++ b/ds/include/manager.hpp @@ -149,6 +149,9 @@ #ifndef _DS_MANAGER_HPP_ #define _DS_MANAGER_HPP_ +#include + +using namespace std; /** * @file manager.hpp @@ -156,6 +159,8 @@ */ namespace device { +// Forward declaration for searchConfigs function +bool searchConfigs(void* pDLHandle, const char *searchConfigStr, void **pConfigVar); /** * @class Manager diff --git a/ds/manager.cpp b/ds/manager.cpp index eedcd8b2..dcad6adf 100644 --- a/ds/manager.cpp +++ b/ds/manager.cpp @@ -43,6 +43,13 @@ #include "exception.hpp" #include #include +#include +#include +#include "dsHALConfig.h" +#include "frontPanelConfig.hpp" + +//static pthread_mutex_t dsLock = PTHREAD_MUTEX_INITIALIZER; + /** * @file manager.cpp @@ -62,6 +69,52 @@ namespace device { int Manager::IsInitialized = 0; //!< Indicates the application has initialized with devicettings modules. static std::mutex gManagerInitMutex; +static std::mutex gDLMutex; +static void* gDLHandle = nullptr; + +void* getDLInstance() +{ + std::lock_guard lock(gDLMutex); + dlerror(); // clear old error + if (nullptr == gDLHandle){ + gDLHandle = dlopen(RDK_DSHAL_NAME, RTLD_LAZY); + } + INT_INFO("%d:%s: DL Instance '%s'\n", __LINE__, __func__, (nullptr == gDLHandle ? "NULL" : "Valid")); + return gDLHandle; +} + +void releaseDLInstance() +{ + std::lock_guard lock(gDLMutex); + if (nullptr != gDLHandle) { + dlclose(gDLHandle); + gDLHandle = nullptr; + } +} + +bool searchConfigs(void* pDLHandle, const char *searchConfigStr, void **pConfigVar) +{ + bool returnValue = false; + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + if ((nullptr == searchConfigStr) || (nullptr == pConfigVar) || (nullptr == pDLHandle)) { + INT_ERROR("%d:%s: Invalid parameters passed\n", __LINE__, __func__); + } + else { + INT_INFO("%d:%s: searchConfigStr = %s\n", __LINE__, __func__, searchConfigStr); + INT_INFO("%d:%s: RDK_DSHAL_NAME = %s\n", __LINE__, __func__, RDK_DSHAL_NAME); + + *pConfigVar = (void *) dlsym(pDLHandle, searchConfigStr); + if (*pConfigVar != NULL) { + INT_INFO("%s is defined and loaded pConfigVar= %p\r\n", searchConfigStr, *pConfigVar); + returnValue = true; + } + else { + INT_ERROR("%d:%s: %s is not defined\n", __LINE__, __func__, searchConfigStr); + } + } + INT_INFO("%d:%s: Exit function\n", __LINE__, __func__); + return returnValue; +} Manager::Manager() { // TODO Auto-generated constructor stub @@ -106,6 +159,7 @@ Manager::~Manager() { void Manager::Initialize() { {std::lock_guard lock(gManagerInitMutex); + printf("Entering %s count %d with thread id %lu\n",__FUNCTION__,IsInitialized,pthread_self()); try { @@ -131,9 +185,14 @@ void Manager::Initialize() CHECK_RET_VAL(err); err = dsVideoDeviceInit(); CHECK_RET_VAL(err); - AudioOutputPortConfig::getInstance().load(); - VideoOutputPortConfig::getInstance().load(); - VideoDeviceConfig::getInstance().load(); + void* pDLHandle = getDLInstance(); + AudioOutputPortConfig::getInstance().load(pDLHandle); + VideoOutputPortConfig::getInstance().load(pDLHandle); + VideoDeviceConfig::getInstance().load(pDLHandle); + FrontPanelConfig::getInstance().load(pDLHandle); + if ( nullptr != pDLHandle ) { + releaseDLInstance(); + } } IsInitialized++; } @@ -148,9 +207,13 @@ void Manager::Initialize() void Manager::load() { printf("%d:%s load start\n", __LINE__, __FUNCTION__); - device::AudioOutputPortConfig::getInstance().load(); - device::VideoOutputPortConfig::getInstance().load(); - device::VideoDeviceConfig::getInstance().load(); + void* pDLHandle = getDLInstance(); + device::AudioOutputPortConfig::getInstance().load(pDLHandle); + device::VideoOutputPortConfig::getInstance().load(pDLHandle); + device::VideoDeviceConfig::getInstance().load(pDLHandle); + if ( nullptr != pDLHandle ) { + releaseDLInstance(); + } printf("%d:%s load completed\n", __LINE__, __FUNCTION__); } diff --git a/ds/videoDeviceConfig.cpp b/ds/videoDeviceConfig.cpp index 0a25b478..055ad2a9 100644 --- a/ds/videoDeviceConfig.cpp +++ b/ds/videoDeviceConfig.cpp @@ -33,7 +33,9 @@ #include "videoDFC.hpp" #include #include "dslogger.h" +#include "manager.hpp" +#define DEBUG 1 // Using for dumpconfig namespace device { @@ -86,8 +88,45 @@ VideoDFC & VideoDeviceConfig::getDefaultDFC() return _vDFCs.back(); } -void VideoDeviceConfig::load() + +void dumpconfig(dsVideoConfig_t *pKVideoDeviceConfigs, int videoDeviceConfigs_size) +{ + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + + INT_INFO("\n\n=========================================================================================================================\n\n"); + if(pKVideoDeviceConfigs != NULL && videoDeviceConfigs_size != -1) + { + INT_INFO("%d:%s: pKVideoDeviceConfigs = %p\n", __LINE__, __func__, pKVideoDeviceConfigs); + INT_INFO("%d:%s: videoDeviceConfigs_size = %d\n", __LINE__, __func__, videoDeviceConfigs_size); + for (int i = 0; i < videoDeviceConfigs_size; i++) { + INT_INFO("pKVideoDeviceConfigs[%d].numSupportedDFCs = %lu\n ", i, pKVideoDeviceConfigs[i].numSupportedDFCs); + for (int j = 0; j < pKVideoDeviceConfigs[i].numSupportedDFCs; j++) { + INT_INFO(" Address of pKVideoDeviceConfigs[%d].supportedDFCs[%d] = %d", i, j, pKVideoDeviceConfigs[i].supportedDFCs[j]); + } + } + } + else + { + INT_ERROR("%d:%s: kVideoDeviceConfigs is NULL and videoDeviceConfigs_size is -1\n", __LINE__, __func__); + } + + INT_INFO("\n\n=========================================================================================================================\n\n"); + INT_INFO("%d:%s: Exit function\n", __LINE__, __func__); +} + +typedef struct videoDeviceConfig { + dsVideoConfig_t *pKVideoDeviceConfigs; + int *pKVideoDeviceConfigs_size; +}videoDeviceConfig_t; + +void VideoDeviceConfig::load(void* pDLHandle) +{ + int configSize, invalid_size = -1; + static videoDeviceConfig_t videoDeviceConfig = {0}; + bool isDynamicConfigLoad = false; + + INT_INFO("Enter function\n"); /* * Load Constants First. */ @@ -95,16 +134,61 @@ void VideoDeviceConfig::load() _vDFCs.push_back(VideoDFC(i)); } + if ( nullptr != pDLHandle ) + { + const char* searchVaribles[] = { + "kVideoDeviceConfigs", + "kVideoDeviceConfigs_size", + }; + bool ret = false; + + INT_INFO("%d:%s: Using dynamic library handle for config loading\n", __LINE__, __func__); + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(pDLHandle, searchVaribles[0], (void **)&(videoDeviceConfig.pKVideoDeviceConfigs)); + if(ret == true) + { + // Considering Dynamic config loading is enabled since 1st symbol got + isDynamicConfigLoad = true; + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(pDLHandle, searchVaribles[1], (void **)&(videoDeviceConfig.pKVideoDeviceConfigs_size)); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[1]); + videoDeviceConfig.pKVideoDeviceConfigs_size = &invalid_size; + } + } + } + + if ( false == isDynamicConfigLoad) + { + INT_INFO("Read Old Configs\n"); + videoDeviceConfig.pKVideoDeviceConfigs = (dsVideoConfig_t *)kConfigs; + configSize = dsUTL_DIM(kConfigs); + videoDeviceConfig.pKVideoDeviceConfigs_size = &configSize; + } + /* * Initialize Video Devices (supported DFCs etc.) */ - for (size_t i = 0; i < dsUTL_DIM(kConfigs); i++) { - _vDevices.push_back(VideoDevice(i)); - - for (size_t j = 0; j < kConfigs[i].numSupportedDFCs; j++) { - _vDevices.at(i).addDFC(VideoDFC::getInstance(kConfigs[i].supportedDFCs[j])); + if (videoDeviceConfig.pKVideoDeviceConfigs != NULL && videoDeviceConfig.pKVideoDeviceConfigs_size != NULL) + { + #if DEBUG + dumpconfig(videoDeviceConfig.pKVideoDeviceConfigs, *(videoDeviceConfig.pKVideoDeviceConfigs_size)); + //INT_INFO("disable the dumpconfig()\n"); + #endif + for (size_t i = 0; i < *(videoDeviceConfig.pKVideoDeviceConfigs_size); i++) { + _vDevices.push_back(VideoDevice(i)); + + for (size_t j = 0; j < videoDeviceConfig.pKVideoDeviceConfigs[i].numSupportedDFCs; j++) { + _vDevices.at(i).addDFC(VideoDFC::getInstance(videoDeviceConfig.pKVideoDeviceConfigs[i].supportedDFCs[j])); + } } } + else + { + INT_ERROR("%d:%s: Congigs are NULL and config size are -1\n", __LINE__, __func__); + } + INT_INFO("Exit function\n"); } void VideoDeviceConfig::release() diff --git a/ds/videoDeviceConfig.hpp b/ds/videoDeviceConfig.hpp index 65fcf791..0673c9e3 100644 --- a/ds/videoDeviceConfig.hpp +++ b/ds/videoDeviceConfig.hpp @@ -55,7 +55,7 @@ class VideoDeviceConfig { VideoDFC & getDFC(int id); VideoDFC & getDefaultDFC(); - void load(); + void load(void* pDLHandle); void release(); }; diff --git a/ds/videoOutputPortConfig.cpp b/ds/videoOutputPortConfig.cpp index 8f1e475c..0010ba63 100644 --- a/ds/videoOutputPortConfig.cpp +++ b/ds/videoOutputPortConfig.cpp @@ -42,6 +42,7 @@ #include "videoResolution.hpp" #include "dslogger.h" #include "host.hpp" +#include "manager.hpp" #include @@ -50,6 +51,18 @@ #include using namespace std; +#define DEBUG 1 // Using for dumpconfig + +typedef struct videoPortConfigs +{ + const dsVideoPortTypeConfig_t *pKConfigs; + int *pKVideoPortConfigs_size; + const dsVideoPortPortConfig_t *pKPorts; + int *pKVideoPortPorts_size; + dsVideoPortResolution_t *pKResolutionsSettings; + int *pKResolutionsSettings_size; +}videoPortConfigs_t; + namespace device { static VideoResolution* defaultVideoResolution; @@ -264,9 +277,84 @@ List VideoOutputPortConfig::getSupportedResolutions(bool isIgn } +void dumpconfig(videoPortConfigs_t *config) +{ + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + INT_INFO("\n\n=========================================================================================================================\n\n"); + if(config->pKConfigs != NULL && *(config->pKVideoPortConfigs_size) != -1 && + config->pKPorts != NULL && *(config->pKVideoPortPorts_size) != -1 && + config->pKResolutionsSettings != NULL && *(config->pKResolutionsSettings_size) != -1 ) + { + INT_INFO("\n\n####################################################################### \n\n"); + INT_INFO("%d:%s: Dumping Resolutions Settings\n", __LINE__, __func__); + INT_INFO("%d:%s: pKConfigs = %p\n", __LINE__, __func__, config->pKConfigs); + INT_INFO("%d:%s: pKConfigSize pointer %p = %d\n", __LINE__, __func__, config->pKVideoPortConfigs_size, *(config->pKVideoPortConfigs_size)); + INT_INFO("%d:%s: pKPorts = %p\n", __LINE__, __func__, config->pKPorts); + INT_INFO("%d:%s: pKPortSize pointer %p = %d\n", __LINE__, __func__, config->pKVideoPortPorts_size, *(config->pKVideoPortPorts_size)); + INT_INFO("%d:%s: pKResolutionsSettings = %p\n", __LINE__, __func__, config->pKResolutionsSettings); + INT_INFO("%d:%s: pKResolutionsSettingsSize pointer %p = %d\n", __LINE__, __func__, config->pKResolutionsSettings_size, *(config->pKResolutionsSettings_size)); + + for (size_t i = 0; i < *(config->pKResolutionsSettings_size); i++) { + dsVideoPortResolution_t *resolution = &(config->pKResolutionsSettings[i]); + INT_INFO("%d:%s: resolution->name = %s\n", __LINE__, __func__, resolution->name); + INT_INFO("%d:%s: resolution->pixelResolution= %d\n", __LINE__, __func__, resolution->pixelResolution); + INT_INFO("%d:%s: resolution->aspectRatio= %d\n", __LINE__, __func__, resolution->aspectRatio); + INT_INFO("%d:%s: resolution->stereoScopicMode= %d\n", __LINE__, __func__, resolution->stereoScopicMode); + INT_INFO("%d:%s: resolution->frameRate= %d\n", __LINE__, __func__, resolution->frameRate); + INT_INFO("%d:%s: resolution->interlaced= %d\n", __LINE__, __func__, resolution->interlaced); -void VideoOutputPortConfig::load() + } + INT_INFO("\n\n####################################################################### \n\n"); + INT_INFO("\n\n####################################################################### \n\n"); + INT_INFO("%d:%s: Dumping Video Port Configurations\n", __LINE__, __func__); + for (size_t i = 0; i < *(config->pKVideoPortConfigs_size); i++) + { + const dsVideoPortTypeConfig_t *typeCfg = &(config->pKConfigs[i]); + + INT_INFO("%d:%s: typeCfg->typeId = %d\n", __LINE__, __func__, typeCfg->typeId); + INT_INFO("%d:%s: typeCfg->name = %s\n", __LINE__, __func__, typeCfg->name); + INT_INFO("%d:%s: typeCfg->dtcpSupported= %d\n", __LINE__, __func__, typeCfg->dtcpSupported); + INT_INFO("%d:%s: typeCfg->hdcpSupported = %d\n", __LINE__, __func__, typeCfg->hdcpSupported); + INT_INFO("%d:%s: typeCfg->restrictedResollution = %d\n", __LINE__, __func__, typeCfg->restrictedResollution); + INT_INFO("%d:%s: typeCfg->numSupportedResolutions= %lu\n", __LINE__, __func__, typeCfg->numSupportedResolutions); + + INT_INFO("%d:%s: typeCfg->supportedResolutions = %p\n", __LINE__, __func__, typeCfg->supportedResolutions); + INT_INFO("%d:%s: typeCfg->supportedResolutions->name = %s\n", __LINE__, __func__, typeCfg->supportedResolutions->name); + INT_INFO("%d:%s: typeCfg->supportedResolutions->pixelResolution= %d\n", __LINE__, __func__, typeCfg->supportedResolutions->pixelResolution); + INT_INFO("%d:%s: typeCfg->supportedResolutions->aspectRatio= %d\n", __LINE__, __func__, typeCfg->supportedResolutions->aspectRatio); + INT_INFO("%d:%s: typeCfg->supportedResolutions->stereoScopicMode= %d\n", __LINE__, __func__, typeCfg->supportedResolutions->stereoScopicMode); + INT_INFO("%d:%s: typeCfg->supportedResolutions->frameRate= %d\n", __LINE__, __func__, typeCfg->supportedResolutions->frameRate); + INT_INFO("%d:%s: typeCfg->supportedResolutions->interlaced= %d\n", __LINE__, __func__, typeCfg->supportedResolutions->interlaced); + } + INT_INFO("\n\n####################################################################### \n\n"); + + INT_INFO("\n\n####################################################################### \n\n"); + INT_INFO("%d:%s: Dumping Video Port Connections\n", __LINE__, __func__); + for (size_t i = 0; i < *(config->pKVideoPortPorts_size); i++) { + const dsVideoPortPortConfig_t *port = &(config->pKPorts[i]); + INT_INFO("%d:%s: port->id.type = %d\n", __LINE__, __func__, port->id.type); + INT_INFO("%d:%s: port->id.index = %d\n", __LINE__, __func__, port->id.index); + INT_INFO("%d:%s: port->connectedAOP.type = %d\n", __LINE__, __func__, port->connectedAOP.type); + INT_INFO("%d:%s: port->connectedAOP.index = %d\n", __LINE__, __func__, port->connectedAOP.index); + INT_INFO("%d:%s: port->defaultResolution = %s\n", __LINE__, __func__, port->defaultResolution); + } + INT_INFO("\n\n####################################################################### \n\n"); + } + else + { + INT_ERROR("%d:%s: pKConfigs or pKPorts or pKResolutionsSettings is NULL, and pKVideoPortConfigs_size or pKVideoPortPorts_size or pKResolutionsSettings_size is -1\n", __LINE__, __func__); + } + INT_INFO("\n\n=========================================================================================================================\n\n"); + INT_INFO("%d:%s: Exit function\n", __LINE__, __func__); +} + +void VideoOutputPortConfig::load(void* pDLHandle) { + static int configSize, portSize, resolutionSize, invalid_size = -1; + static videoPortConfigs_t configuration = {0}; + bool isDynamicConfigLoad = false; + + INT_INFO("Enter function\n"); try { /* * Load Constants First. @@ -288,58 +376,139 @@ void VideoOutputPortConfig::load() _vPortTypes.push_back(VideoOutputPortType((int)i)); } - /* Initialize a set of supported resolutions - * - */ - size_t numResolutions = dsUTL_DIM(kResolutions); - for (size_t i = 0; i < numResolutions; i++) { - dsVideoPortResolution_t *resolution = &kResolutions[i]; - {std::lock_guard lock(gSupportedResolutionsMutex); - _supportedResolutions.push_back( - VideoResolution( - i, /* id */ - std::string(resolution->name), - resolution->pixelResolution, - resolution->aspectRatio, - resolution->stereoScopicMode, - resolution->frameRate, - resolution->interlaced)); - } + if (nullptr != pDLHandle) { + const char* searchVaribles[] = { + "kVideoPortConfigs", + "kVideoPortConfigs_size", + "kVideoPortPorts", + "kVideoPortPorts_size", + "kResolutionsSettings", + "kResolutionsSettings_size" + }; + bool ret = false; + + INT_INFO("%d:%s: Using dynamic library handle for config loading\n", __LINE__, __func__); + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(pDLHandle, searchVaribles[0], (void **)&configuration.pKConfigs); + if(ret == true) + { + // Considering Dynamic config loading is enabled since 1st symbol got + isDynamicConfigLoad = true; + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(pDLHandle, searchVaribles[1], (void **)&configuration.pKVideoPortConfigs_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[1]); + configuration.pKVideoPortConfigs_size = &invalid_size; + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[2]); + ret = searchConfigs(pDLHandle, searchVaribles[2], (void **)&configuration.pKPorts); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[2]); + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[3]); + ret = searchConfigs(pDLHandle, searchVaribles[3], (void **)&configuration.pKVideoPortPorts_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[3]); + configuration.pKVideoPortPorts_size = &invalid_size; + } + // Resolutions + ret = searchConfigs(pDLHandle, searchVaribles[4], (void **)&configuration.pKResolutionsSettings); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[4]); + } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[5]); + ret = searchConfigs(pDLHandle, searchVaribles[5], (void **)&configuration.pKResolutionsSettings_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[5]); + configuration.pKResolutionsSettings_size = &invalid_size; + } + } + } + + if ( false == isDynamicConfigLoad ) + { + INT_INFO("%d:%s: Using OLD config loading\n", __LINE__, __func__); + configuration.pKConfigs = kConfigs; + configSize = dsUTL_DIM(kConfigs); + configuration.pKVideoPortConfigs_size = &configSize; + configuration.pKPorts = kPorts; + portSize = dsUTL_DIM(kPorts); + configuration.pKVideoPortPorts_size = &portSize; + configuration.pKResolutionsSettings = kResolutions; + resolutionSize = dsUTL_DIM(kResolutions); + configuration.pKResolutionsSettings_size = &resolutionSize; + INT_INFO("configuration.pKConfigs =%p, *(configuration.pKVideoPortConfigs_size) = %d\n", configuration.pKConfigs, *(configuration.pKVideoPortConfigs_size)); + INT_INFO("configuration.pKPorts =%p, *(configuration.pKVideoPortPorts_size) = %d\n", configuration.pKPorts, *(configuration.pKVideoPortPorts_size)); + INT_INFO("configuration.pKResolutionsSettings =%p, *(configuration.pKResolutionsSettings_size) = %d\n", configuration.pKResolutionsSettings, *(configuration.pKResolutionsSettings_size)); } - - /* - * Initialize Video portTypes (Only Enable POrts) - * and its port instances (curr resolution) - */ - for (size_t i = 0; i < dsUTL_DIM(kConfigs); i++) + if((configuration.pKConfigs != NULL) && (configuration.pKVideoPortConfigs_size != NULL) && + (configuration.pKPorts != NULL) && (configuration.pKVideoPortPorts_size != NULL) && + (configuration.pKResolutionsSettings != NULL) && (configuration.pKResolutionsSettings_size != NULL)) { - const dsVideoPortTypeConfig_t *typeCfg = &kConfigs[i]; - VideoOutputPortType &vPortType = VideoOutputPortType::getInstance(typeCfg->typeId); - vPortType.enable(); - vPortType.setRestrictedResolution(typeCfg->restrictedResollution); - } + dumpconfig(&configuration); + /* Initialize a set of supported resolutions + * + */ + for (size_t i = 0; i < *(configuration.pKResolutionsSettings_size); i++) { + dsVideoPortResolution_t *resolution = &(configuration.pKResolutionsSettings[i]); + {std::lock_guard lock(gSupportedResolutionsMutex); + _supportedResolutions.push_back( + VideoResolution( + i, /* id */ + std::string(resolution->name), + resolution->pixelResolution, + resolution->aspectRatio, + resolution->stereoScopicMode, + resolution->frameRate, + resolution->interlaced)); + } + } - /* - * set up ports based on kPorts[] - */ - for (size_t i = 0; i < dsUTL_DIM(kPorts); i++) { - const dsVideoPortPortConfig_t *port = &kPorts[i]; - _vPorts.push_back( - VideoOutputPort((port->id.type), port->id.index, i, - AudioOutputPortType::getInstance(kPorts[i].connectedAOP.type).getPort(kPorts[i].connectedAOP.index).getId(), - std::string(port->defaultResolution))); + /* + * Initialize Video portTypes (Only Enable POrts) + * and its port instances (curr resolution) + */ + for (size_t i = 0; i < *(configuration.pKVideoPortConfigs_size); i++) + { + const dsVideoPortTypeConfig_t *typeCfg = &(configuration.pKConfigs[i]); + VideoOutputPortType &vPortType = VideoOutputPortType::getInstance(typeCfg->typeId); + vPortType.enable(); + vPortType.setRestrictedResolution(typeCfg->restrictedResollution); + } - _vPortTypes.at(port->id.type).addPort(_vPorts.at(i)); + /* + * set up ports based on kPorts[] + */ + for (size_t i = 0; i < *(configuration.pKVideoPortPorts_size); i++) { + const dsVideoPortPortConfig_t *port = &(configuration.pKPorts[i]); - } + _vPorts.push_back( + VideoOutputPort((port->id.type), port->id.index, i, + AudioOutputPortType::getInstance(configuration.pKPorts[i].connectedAOP.type).getPort(configuration.pKPorts[i].connectedAOP.index).getId(), + std::string(port->defaultResolution))); + + _vPortTypes.at(port->id.type).addPort(_vPorts.at(i)); + } + } + else + { + cout << "Video Outport Configs or Ports or Resolutions is NULL. ..."< getSupportedTypes(); List getSupportedResolutions(bool isIgnoreEdid=false); - void load(); + void load(void* pDLHandle); void release(); }; diff --git a/sample/dsMgr-test.c b/sample/dsMgr-test.c new file mode 100644 index 00000000..467a75ec --- /dev/null +++ b/sample/dsMgr-test.c @@ -0,0 +1,31 @@ + +#include +#include +#include +#include +#include "exception.hpp" +#include "host.hpp" +#include "manager.hpp" + + +int main(int argc, char *argv[]) +{ + printf("%d:%s: enter\n", __LINE__, __func__); + try { + device::Manager::Initialize(); + } catch (const device::Exception& e) { + printf("Exception caught %s", e.what()); + } catch (const std::exception& e) { + printf("Exception caught %s", e.what()); + } catch (...) { + printf("Exception caught unknown"); + } + printf("%d:%s: Exit\n", __LINE__, __func__); + return 0; +} + + + + +/** @} */ +/** @} */