diff --git a/ds/audioOutputPortConfig.cpp b/ds/audioOutputPortConfig.cpp index c3ab1cc6..3fc5dfae 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,65 @@ List AudioOutputPortConfig::getSupportedTypes() return supportedTypes; } +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() { + static int configSize, portSize, invalidSize = -1; + static audioConfigs_t configuration = {0}; + + const char* searchVaribles[] = { + "kAudioConfigs", + "kAudioPorts", + "kAudioConfigs_size", + "kAudioPorts_size" + }; + bool ret = false; + + INT_INFO("Enter function\n"); + //startLoad(); + try { /* * Load Constants First. @@ -133,43 +201,91 @@ void AudioOutputPortConfig::load() } - /* - * Initialize Audio portTypes (encodings, compressions etc.) - * and its port instances (db, level etc) - */ - 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(); + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(searchVaribles[0], (void **)&configuration.pKConfigs); + if(ret == true) + { + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[2]); + ret = searchConfigs(searchVaribles[2], (void **)&configuration.pKConfigSize); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[2]); + configuration.pKConfigSize = &invalidSize; } - for (size_t j = 0; j < typeCfg->numSupportedCompressions; j++) { - aPortType.addCompression(typeCfg->compressions[j]); - _aCompressions.at(typeCfg->compressions[j]).enable(); - + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(searchVaribles[1], (void **)&configuration.pKPorts); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[1]); } - for (size_t j = 0; j < typeCfg->numSupportedStereoModes; j++) { - aPortType.addStereoMode(typeCfg->stereoModes[j]); - _aStereoModes.at(typeCfg->stereoModes[j]).enable(); - + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[3]); + ret = searchConfigs(searchVaribles[3], (void **)&configuration.pKPortSize); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[3]); + configuration.pKPortSize = &invalidSize; } } - + else + { + INT_ERROR("Read Old Configs\n"); + 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)); + } /* - * set up ports based on kPorts[] + * Check if configs are loaded properly */ - 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)); - } + 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(); + } + } + /* + * 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__); + } + else { + INT_ERROR("%d:%s: Audio Configs loading failed\n", __LINE__, __func__); + } } catch(const Exception &e) { throw e; } + notifyLoadComplete(); + INT_INFO("Exit funcation\n"); } void AudioOutputPortConfig::release() diff --git a/ds/frontPanelConfig.cpp b/ds/frontPanelConfig.cpp index e8c932b2..3c18b340 100644 --- a/ds/frontPanelConfig.cpp +++ b/ds/frontPanelConfig.cpp @@ -41,9 +41,23 @@ #include "frontPanelSettings.hpp" #include "illegalArgumentException.hpp" #include "dslogger.h" +#include "manager.hpp" + +#define DEBUG 1 // Using for dumpconfig +#define DEFAULT_FPD_TEXT_DISPLAY_SUPPORTED_CHARACTERS "ABCEDFG" 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 { /** @@ -337,6 +351,57 @@ 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].supportedCharacters : "NULL", + 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() @@ -352,44 +417,138 @@ void FrontPanelConfig::load() * 1. Create Supported Colors. * 2. Create Indicators. */ + static int indicatorSize, indicatorColorSize, textDisplaySize, invalid_size = -1; + static fpdConfigs_t configuration = {0}; + + const char* searchVaribles[] = { + "kFPDIndicatorColors", + "kFPDIndicatorColors_size", + "kIndicators", + "kIndicators_size", + "kFPDTextDisplays", + "kFPDTextDisplays_size" + }; + bool ret = false; + + INT_INFO("Enter function\n"); + //startLoad(); + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(searchVaribles[0], (void **)&configuration.pKFPDIndicatorColors ); + //ret = false; + //INT_INFO("disable the new FP config ret= %d \n", ret); + if(ret == true) + { + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(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(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(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(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(searchVaribles[5], (void **)&configuration.pKTextDisplays_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[5]); + configuration.pKTextDisplays_size = &invalid_size; + } + } + else + { + INT_ERROR("Read Old Configs\n"); + 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)); + } + if (configuration.pKFPDIndicatorColors != NULL && configuration.pKFPDIndicatorColors_size != NULL && + *(configuration.pKFPDIndicatorColors_size) > 0 && + configuration.pKIndicators != NULL && configuration.pKIndicators_size != NULL && + *(configuration.pKIndicators_size) > 0) { - for (size_t i = 0; i < dsUTL_DIM(kIndicatorColors); i++) { - _colors.push_back(FrontPanelIndicator::Color(kIndicatorColors[i].id)); + #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)); + } } - 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(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) ? std::string(configuration.pKTextDisplays[i].supportedCharacters) : + std::string(DEFAULT_FPD_TEXT_DISPLAY_SUPPORTED_CHARACTERS), + configuration.pKTextDisplays[i].colorMode)); + } } - + else + { + INT_ERROR("No valid text display configuration found\n"); + } } - + else { - /* - * 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)); - } + INT_ERROR("No valid front panel configuration found\n"); } + notifyLoadComplete(); + INT_INFO("Exit function\n"); } } - /** @} */ /** @} */ diff --git a/ds/include/manager.hpp b/ds/include/manager.hpp index 2539569a..f5ddae7a 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,16 @@ */ namespace device { +// Forward declaration for searchConfigs function +bool openDLFile(); +//bool closeFile(); +bool searchConfigs(const char *searchConfigStr, void **pConfigVar); +//void startLoad(); +//void finishLoad(); +void notifyLoadComplete(); +void waitAndClose(); + +std::string parse_opt_flag( std::string file_name , bool integer_check= false , bool debugStats = true); /** * @class Manager diff --git a/ds/manager.cpp b/ds/manager.cpp index eedcd8b2..c3c146f4 100644 --- a/ds/manager.cpp +++ b/ds/manager.cpp @@ -43,6 +43,14 @@ #include "exception.hpp" #include #include +#include +#include +#include +#include "dsHALConfig.h" + + +//static pthread_mutex_t dsLock = PTHREAD_MUTEX_INITIALIZER; + /** * @file manager.cpp @@ -62,6 +70,12 @@ namespace device { int Manager::IsInitialized = 0; //!< Indicates the application has initialized with devicettings modules. static std::mutex gManagerInitMutex; +static std::mutex gSearchMutex; +static void *dllib = NULL; +int activeLoads = 0; // reference counter +static std::mutex gMtx; +std::condition_variable cv; +const int REQUIRED = 4; // wait for 4 loads to finish Manager::Manager() { // TODO Auto-generated constructor stub @@ -70,6 +84,11 @@ Manager::Manager() { Manager::~Manager() { // TODO Auto-generated destructor stub + // Ensure close if not already + if (dllib) { + dlclose(dllib); + INT_INFO("Destructor dlclose\n"); + } } #define CHECK_RET_VAL(ret) {\ @@ -79,6 +98,62 @@ Manager::~Manager() { }\ } +std::string parse_opt_flag( std::string file_name , bool integer_check , bool debugStats ) +{ + std::string return_buffer = ""; + std::ifstream parse_opt_flag_file( file_name.c_str()); + + if (!parse_opt_flag_file) + { + if ( debugStats ){ + INT_INFO("Failed to open [%s] file",file_name.c_str()); + } + } + else + { + std::string line = ""; + if (std::getline(parse_opt_flag_file, line)) + { + if ( debugStats ){ + INT_INFO("Content in [%s] is [%s]",file_name.c_str(),line.c_str()); + } + } + else + { + if ( debugStats ){ + INT_INFO("No Content in [%s]",file_name.c_str()); + } + } + parse_opt_flag_file.close(); + + return_buffer = line; + + if (integer_check) + { + if (line.empty()) + { + integer_check = false; + } + else + { + for (char c : line) { + if (!isdigit(c)) + { + integer_check = false; + break; + } + } + } + + if ( false == integer_check ) + { + return_buffer = ""; + } + } + } + return return_buffer; +} + /** * @addtogroup dssettingsmanagerapi * @{ @@ -106,6 +181,9 @@ Manager::~Manager() { void Manager::Initialize() { {std::lock_guard lock(gManagerInitMutex); + + int delay = 1; + bool ret = false; printf("Entering %s count %d with thread id %lu\n",__FUNCTION__,IsInitialized,pthread_self()); try { @@ -131,9 +209,31 @@ void Manager::Initialize() CHECK_RET_VAL(err); err = dsVideoDeviceInit(); CHECK_RET_VAL(err); - AudioOutputPortConfig::getInstance().load(); + #if 0 + std::string delaystr = parse_opt_flag("/opt/delay", true, true); + if (!delaystr.empty()) + { + INT_INFO("dealy: [%s]", delaystr.c_str()); + delay = std::stoi(delaystr); + } + #endif + INT_INFO("Open the hal file\n"); + ret = openDLFile(); + if(ret == true) + { + INT_INFO("File opened successfully\n"); + } + else + { + INT_ERROR("Failed to open the hal file\n"); + } + AudioOutputPortConfig::getInstance().load(); + //sleep(delay); VideoOutputPortConfig::getInstance().load(); - VideoDeviceConfig::getInstance().load(); + //sleep(delay); + VideoDeviceConfig::getInstance().load(); + INT_INFO("disabled waitAndClose()\n"); + //waitAndClose(); } IsInitialized++; } @@ -154,6 +254,115 @@ void Manager::load() printf("%d:%s load completed\n", __LINE__, __FUNCTION__); } +bool openDLFile() +{ + bool ret = false; + + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + INT_INFO("%d:%s: RDK_DSHAL_NAME = %s\n", __LINE__, __func__, RDK_DSHAL_NAME); + + dlerror(); // clear old error + dllib = dlopen(RDK_DSHAL_NAME, RTLD_LAZY); + if (dllib) { + INT_INFO("open %s success", RDK_DSHAL_NAME); + ret = true; + } + else { + const char* err = dlerror(); + INT_ERROR("%d:%s: Open %s failed with error err= %s\n", __LINE__, __func__, RDK_DSHAL_NAME, err ? err: "unknown"); + ret = false; + } + INT_INFO("%d:%s: Exiting function\n", __LINE__, __func__); + return ret; +} + +#if 0 +void EE::requestClose() { + std::lock_guard lock(m); + closeRequested = true; + if (active == 0 && handle) { + dlclose(handle); + handle = nullptr; + } +} +void startLoad() +{ + std::lock_guard lock(gMtx); + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + activeLoads++; + INT_INFO("%d:%s: Exit function. activeLoads = %d\n", __LINE__, __func__, activeLoads); + +} + + +void finishLoad() +{ + std::lock_guard lock(gMtx); + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + + activeLoads++; + INT_INFO("%d:%s: activeLoads = %d\n", __LINE__, __func__, activeLoads); + if (activeLoads == 0) { + if (dllib) { + dlclose(dllib); + INT_INFO("%d:%s: Closed the hal file\n", __LINE__, __func__); + dllib = NULL; + } + else { + INT_ERROR("dllib is NULL\n"); + } + } + INT_INFO("%d:%s: Exiting function\n", __LINE__, __func__); +} +#endif + +bool searchConfigs(const char *searchConfigStr, void **pConfigVar) +{ + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + INT_INFO("%d:%s: searchConfigStr = %s\n", __LINE__, __func__, searchConfigStr); + INT_INFO("%d:%s: RDK_DSHAL_NAME = %s\n", __LINE__, __func__, RDK_DSHAL_NAME); + + std::lock_guard lock(gSearchMutex); + INT_INFO("%d:%s: using lock_guard() instead pthread_mutex_lock \n", __LINE__, __func__); + if (dllib) { + *pConfigVar = (void *) dlsym(dllib, searchConfigStr); + if (*pConfigVar != NULL) { + INT_INFO("%s is defined and loaded pConfigVar= %p\r\n", searchConfigStr, *pConfigVar); + } + else { + INT_ERROR("%d:%s: %s is not defined\n", __LINE__, __func__, searchConfigStr); + } + } + else { + INT_ERROR("dllib is NULL\n"); + } + INT_INFO("%d:%s: Exit function\n", __LINE__, __func__); + return (*pConfigVar != NULL); +} + +void notifyLoadComplete() { + INT_INFO("%d:%s: Entering function\n", __LINE__, __func__); + std::unique_lock lock(gMtx); + + activeLoads++; + // Wake waiting thread + cv.notify_all(); + INT_INFO("%d:%s: Exit function\n", __LINE__, __func__); +} + +void waitAndClose() { + std::unique_lock lock(gMtx); + INT_INFO("%d:%s: Entering function activeLoads = %d\n", __LINE__, __func__, activeLoads); + + cv.wait(lock, [&] { return activeLoads >= REQUIRED; }); // wait for 4 loads complete + + if (dllib) { + dlclose(dllib); + dllib = nullptr; + } + INT_INFO("%d:%s: Exit function\n", __LINE__, __func__); +} + /** * @fn void Manager::DeInitialize() * @brief This API is used to deinitialize the device settings module. diff --git a/ds/videoDeviceConfig.cpp b/ds/videoDeviceConfig.cpp index 0a25b478..43f99db5 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,50 @@ VideoDFC & VideoDeviceConfig::getDefaultDFC() return _vDFCs.back(); } + +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() { + int configSize, invalid_size = -1; + static videoDeviceConfig_t videoDeviceConfig = {0}; + const char* searchVaribles[] = { + "kVideoDeviceConfigs", + "kVideoDeviceConfigs_size", + }; + bool ret = false; + + INT_INFO("Enter function\n"); + //startLoad(); /* * Load Constants First. */ @@ -95,16 +139,49 @@ void VideoDeviceConfig::load() _vDFCs.push_back(VideoDFC(i)); } + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(searchVaribles[0], (void **)&(videoDeviceConfig.pKVideoDeviceConfigs)); + if(ret == true) + { + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(searchVaribles[1], (void **)&(videoDeviceConfig.pKVideoDeviceConfigs_size)); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[1]); + videoDeviceConfig.pKVideoDeviceConfigs_size = &invalid_size; + } + } + else + { + 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__); + } + notifyLoadComplete(); + INT_INFO("Exit function\n"); } void VideoDeviceConfig::release() diff --git a/ds/videoOutputPortConfig.cpp b/ds/videoOutputPortConfig.cpp index 8f1e475c..22fc0c76 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,94 @@ 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); + + } + 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() { + static int configSize, portSize, resolutionSize, invalid_size = -1; + static videoPortConfigs_t configuration = {0}; + + const char* searchVaribles[] = { + "kVideoPortConfigs", + "kVideoPortConfigs_size", + "kVideoPortPorts", + "kVideoPortPorts_size", + "kResolutionsSettings", + "kResolutionsSettings_size" + }; + bool ret = false; + + INT_INFO("Enter function\n"); + //startLoad(); try { /* * Load Constants First. @@ -288,58 +386,128 @@ 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)); + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[0]); + ret = searchConfigs(searchVaribles[0], (void **)&configuration.pKConfigs); + if(ret == true) + { + INT_INFO("%d:%s: Calling searchConfigs( %s)\n", __LINE__, __func__, searchVaribles[1]); + ret = searchConfigs(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(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(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(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(searchVaribles[5], (void **)&configuration.pKResolutionsSettings_size); + if(ret == false) + { + INT_ERROR("%s is not defined\n", searchVaribles[5]); + configuration.pKResolutionsSettings_size = &invalid_size; } } - - - /* - * Initialize Video portTypes (Only Enable POrts) - * and its port instances (curr resolution) - */ - for (size_t i = 0; i < dsUTL_DIM(kConfigs); i++) + else { - const dsVideoPortTypeConfig_t *typeCfg = &kConfigs[i]; - VideoOutputPortType &vPortType = VideoOutputPortType::getInstance(typeCfg->typeId); - vPortType.enable(); - vPortType.setRestrictedResolution(typeCfg->restrictedResollution); + INT_ERROR("Read Old Configs\n"); + 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)); } - /* - * set up ports based on kPorts[] - */ - for (size_t i = 0; i < dsUTL_DIM(kPorts); i++) { - const dsVideoPortPortConfig_t *port = &kPorts[i]; + if((configuration.pKConfigs != NULL) && (configuration.pKVideoPortConfigs_size != NULL) && + (configuration.pKPorts != NULL) && (configuration.pKVideoPortPorts_size != NULL) && + (configuration.pKResolutionsSettings != NULL) && (configuration.pKResolutionsSettings_size != NULL)) + { - _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))); + #if DEBUG + dumpconfig(&configuration); + //INT_INFO("disable the dumpconfig()\n"); + #endif + /* 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)); + } + } - _vPortTypes.at(port->id.type).addPort(_vPorts.at(i)); - } + /* + * 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); + } + + /* + * 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. ..."< +#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; +} + + + + +/** @} */ +/** @} */