- 库下载地址
libconfig下载地址:About | libconfig
- 解压及编译
tar xzvf libconfig-1.7.2.tar.gz
cd libconfig-1.7.2
sudo ./configure
sudo make sudo
make check
生成的库路径在 libconfig/lib/.libs
更加不同的编译环境要求生成不一样的动态库,例如X86 arm等平台
- 对libconfig做适配,主要是提供简单的初始化接口和配置读写接口,以及处理多任务问题和定时同步保存等。
- 用命令创建一个空白的包 ros2 pkg create bay_config --build-type ament_cmake.
- 在src同级创建一个lib目录,将不同平台生成的libconfig库放置在下面
- 设置bay_config为共享库
add_library(bay_config SHARED ${LIB_CONFIG_SRC})
- 将libconfig库和bay_config适配库一起发布
if(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "aarch64")
install(DIRECTORY lib/arm/ DESTINATION lib)
target_link_libraries(bay_config ${CMAKE_CURRENT_SOURCE_DIR}/lib/arm/libconfig++.so)
elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "x86_64")
install(DIRECTORY lib/x86/ DESTINATION lib)
target_link_libraries(bay_config ${CMAKE_CURRENT_SOURCE_DIR}/lib/x86/libconfig++.so)
endif()
ament_export_include_directories(include)
install(DIRECTORY include/
DESTINATION include/)
ament_export_libraries(${PROJECT_NAME})
install(TARGETS bay_config LIBRARY DESTINATION lib)
- 适配库头文件代码
#ifndef BAY_CONFIG_MANAGER_H
#define BAY_CONFIG_MANAGER_H
#include <mutex>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include "libconfig.h++"
#include "libconfig.h"
#include <string>
#include <thread>
#include <boost/thread/mutex.hpp>
#include <boost/thread/lock_types.hpp>
#include <boost/thread/pthread/shared_mutex.hpp>
#include <typeinfo>
#include <unistd.h>
#include <fcntl.h>
#include <array>
#include <vector>
#include <fstream>
using std::string;
using std::vector;
class ConfigManager
{
public:
static ConfigManager &GetInstance(void);
bool Init(const std::string &default_path, const std::string& user_path);
bool ResetValue(const string &obj_directroy);
template<class T>
bool WriteValue(const string &obj_directroy,T write_Data);
template<class T>
bool ReadValue(const string &obj_directroy,T &read_data);
template<class T>
bool ReadDefaultValue(const string &obj_directroy,T &read_data);
bool GetUpdateFlag(void);
void SetForceFlagTrue(void);
bool GetForceFlag(void);
private:
ConfigManager(/* args */);
~ConfigManager();
void UpdateCfgProcess(void);
vector<string> SplitTheString(const string &str);
bool CopyFileStream(const char *src_path,const char *dst_path);
bool ConfigFileInit(libconfig::Config &cfg,const char *str,bool &file_read_statu);
bool WriteConfigToFile(libconfig::Config &cfg, bool bsync = false);
libconfig::Setting* CheckObjectformPathFileAndReturnObj(libconfig::Config &cfg,std::vector<string> vec);
libconfig::Setting* CheckObjectformPathFileAndReturnObjForArray(libconfig::Config &cfg,std::vector<string> vec);
libconfig::Setting* CheckObjectformPathFileAndReturnObjForReset(libconfig::Config &cfg,std::vector<string> vec);
libconfig::Setting* WritePathToConfigObj(libconfig::Config &cfg,std::vector<string> vec);
libconfig::Setting* CheckPathInLoop(libconfig::Setting &root,std::vector<string> vec);
libconfig::Setting* WritePathInLoop(libconfig::Setting &root,std::vector<string> vec);
private:
std::string default_file_path_;
std::string user_file_path_;
std::string user_backup_file_path_;
libconfig::Config cfg_default_;
libconfig::Config cfg_user_;
bool default_file_read_{true};
bool user_file_read_{true};
bool backup_file_read_{true};
typedef boost::shared_lock<boost::shared_mutex> ReadConfLock;
typedef boost::unique_lock<boost::shared_mutex> WriteConfLock;
boost::shared_mutex ConfLock;
std::thread * sync_config_to_file_;
bool update_configfile_flag_{false};
bool force_update_flag_{false};
bool thread_exit_status{false};
};
#endif
- 适配库实现代码(其中有一些日志输出,可以忽略)
#include "config_manager.h"
#include "log_printf.h"
#include <dlfcn.h>
#include <regex>
using namespace libconfig;
using namespace std;
ConfigManager &ConfigManager::GetInstance(void)
{
static ConfigManager obj;
return obj;
}
ConfigManager::ConfigManager()
:cfg_default_()
,cfg_user_()
{
}
bool ConfigManager::Init(const std::string &default_path, const std::string& user_path)
{
BAY_PRINTF("Cfg", ERROR, "%s %s ", default_path.c_str(), user_path.c_str());
default_file_path_ = default_path;
user_file_path_ = user_path;
user_backup_file_path_ = user_path + std::string(".backup");
if(!ConfigFileInit(cfg_default_, default_file_path_.c_str(), default_file_read_))
{
BAY_PRINTF("Cfg", ERROR, "config init file read failed!");
return false;
}
if(ConfigFileInit(cfg_user_, user_file_path_.c_str(), user_file_read_)) //main exit
{
CopyFileStream(user_file_path_.c_str(),user_backup_file_path_.c_str());
BAY_PRINTF("Cfg", INFO, "main file read success,copy main file to backup file!");
}
else
{
if(ConfigFileInit(cfg_user_, user_backup_file_path_.c_str(), backup_file_read_)) //backup file path exit
{
CopyFileStream(user_backup_file_path_.c_str(), user_file_path_.c_str());
BAY_PRINTF("Cfg", INFO, "backup file read success,copy backup file to user file!");
}
else
{
BAY_PRINTF("Cfg", WARN, "main file and backup file read failed!");
}
}
sync_config_to_file_ = new std::thread(std::bind(&ConfigManager::UpdateCfgProcess,this));
BAY_PRINTF("Cfg", WARN, "started UpdateCfgProcess thread!");
return true;
}
bool ConfigManager::ConfigFileInit(libconfig::Config &cfg,const char *str,bool &file_read_statu)
{
cfg.setOptions( Config::OptionFsync
| Config::OptionSemicolonSeparators
| Config::OptionColonAssignmentForGroups
| Config::OptionOpenBraceOnSeparateLine);
try
{
cfg.readFile(str);
}
catch(const FileIOException &fioex)
{
BAY_PRINTF("Cfg", ERROR, "load file failed!");
file_read_statu=false;
}
catch(const ParseException &pex)
{
BAY_PRINTF("Cfg", ERROR, "parse file failed!");
file_read_statu=false;
}
return file_read_statu;
}
bool ConfigManager::CopyFileStream(const char *src_path,const char *dst_path)
{
ifstream infile((const string)src_path,ios::in);
if(!infile.is_open()) return false;
ifstream src((const string)src_path,ios::binary);
ofstream dst((const string)dst_path,ios::binary);
dst << src.rdbuf();
infile.close();
src.close();
dst.close();
std::system("sync");
return true;
}
ConfigManager::~ConfigManager()
{
BAY_PRINTF("Cfg", INFO, "entry class config manager destroy");
if(!thread_exit_status)
{
thread_exit_status = true;
while(thread_exit_status)
{
usleep(10000);
}
}
if(sync_config_to_file_ != nullptr)
{
delete sync_config_to_file_;
sync_config_to_file_ = nullptr;
}
BAY_PRINTF("Cfg", INFO, "class config manager destroy");
}
void ConfigManager::UpdateCfgProcess(void)
{
unsigned int sum_times_us{0};
unsigned int count = 0;
BAY_PRINTF("Cfg", INFO, "start UpdateCfgProcess!");
while(!thread_exit_status)
{
if(update_configfile_flag_ && (force_update_flag_ || (sum_times_us >= 3000000)))
{
bool ret = false;
ReadConfLock lock(ConfLock);
ret = WriteConfigToFile(cfg_user_, true);
if(ret || (count >= 3))
{
update_configfile_flag_ = false;
force_update_flag_ = false;
sum_times_us = 0;
count = 0;
}else
{
count += 1;
BAY_PRINTF("Cfg", ERROR, "update the config file fail times: %u",count);
}
BAY_PRINTF("Cfg", INFO, "update the config file status: %s",ret?"true":"false");
}else
{
sum_times_us += 100000;
}
usleep(100000);
}
BAY_PRINTF("Cfg", INFO, "exit UpdateCfgProcess!");
thread_exit_status = false;
}
bool ConfigManager::GetUpdateFlag(void)
{
return update_configfile_flag_;
}
bool ConfigManager::GetForceFlag(void)
{
return force_update_flag_;
}
void ConfigManager::SetForceFlagTrue(void)
{
force_update_flag_ = true;
}
vector<string> ConfigManager::SplitTheString(const string &str)
{
vector<string> resVec;
string part=":";
string strs=str+part;
size_t pos=strs.find(part);
size_t size=strs.size();
while(pos!=string::npos)
{
string x=strs.substr(0,pos);
resVec.push_back(x);
strs=strs.substr(pos+1,size);
pos=strs.find(part);
}
return resVec;
}
template<class T>
bool ConfigManager::WriteValue(const string &obj_directroy,T write_data)
{
BAY_PRINTF("Cfg", INFO, "The main template function()");
return true;
}
template<>
bool ConfigManager::WriteValue<int>(const string &obj_directroy,int write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeInt)=write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write int value :%d success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<uint8_t>(const string &obj_directroy,uint8_t write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeInt)=write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write uint8_t value :%d success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<uint32_t>(const string &obj_directroy,uint32_t write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeInt)=(int)write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write uint32_t value :%d success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<uint16_t>(const string &obj_directroy,uint16_t write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeInt)=(int)write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write uint16_t value :%d success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<int16_t>(const string &obj_directroy,int16_t write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeInt)=(int)write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write int16_t value :%d success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<int64_t>(const string &obj_directroy,int64_t write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeInt64)=write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write int64_t value :%d success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<double>(const string &obj_directroy,double write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeFloat)=(float)write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write double value :%f success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<float>(const string &obj_directroy,float write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeFloat)=write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write float value :%f success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<string>(const string &obj_directroy,string write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeString)=write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write string value :%s success to main path %s",write_data.c_str(),obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<bool>(const string &obj_directroy,bool write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
WriteConfLock lock(ConfLock);
temp_setting=WritePathToConfigObj(cfg_user_,vec);
temp_setting->add(vec.back().c_str(),libconfig::Setting::TypeBoolean)=write_data;
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "write bool value :%d success to main path %s",write_data,obj_directroy.c_str());
return true;
}
template<>
bool ConfigManager::WriteValue<vector<float> >(const string &obj_directroy,vector<float> write_data)
{
vector<string> vec;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting_1=NULL;
WriteConfLock lock(ConfLock);
temp_setting_1=WritePathToConfigObj(cfg_user_,vec);
libconfig::Setting &temp_setting_2=temp_setting_1->add(vec.back().c_str(),libconfig::Setting::TypeArray);
for(unsigned int i=0;i<write_data.size();i++)
{
temp_setting_2.add(libconfig::Setting::TypeFloat)=write_data.at(i);
}
update_configfile_flag_ = true;
return true;
}
template<class T>
bool ConfigManager::ReadValue(const string &obj_directroy,T &read_data)
{
BAY_PRINTF("Cfg", INFO, "The main template function()");
return true;
}
template<>
bool ConfigManager::ReadValue<int>(const string &obj_directroy,int &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
//BAY_PRINTF("Cfg", INFO, "get int value :%d success from main path %s",read_data,obj_directroy.c_str());
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
//BAY_PRINTF("Cfg", INFO, "get int value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false; //assertion both main bk init file does not contain target configuration
}
template<>
bool ConfigManager::ReadValue<uint8_t>(const string &obj_directroy,uint8_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get uint8_t value :%d success from main path %s",read_data,obj_directroy.c_str());
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get uint8_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<int16_t>(const string &obj_directroy,int16_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
//BAY_PRINTF("Cfg", INFO, "get int16_t value :%d success from main path %s",read_data,obj_directroy.c_str());
return true;
}
temp_setting = CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
// BAY_PRINTF("Cfg", INFO, "get int16_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<uint32_t>(const string &obj_directroy,uint32_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get uint32_t value :%d success from main path %s",read_data,obj_directroy.c_str());
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get uint32_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<uint16_t>(const string &obj_directroy,uint16_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
//BAY_PRINTF("Cfg", INFO, "get uint16_t value :%d success from main path %s",read_data,obj_directroy.c_str());
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
//BAY_PRINTF("Cfg", INFO, "get uint16_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<int64_t>(const string &obj_directroy,int64_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
read_data=temp_setting->lookup(vec.back().c_str());
//BAY_PRINTF("Cfg", INFO, "get int64_t value :%d success from main path %s",read_data,obj_directroy.c_str());
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
read_data=temp_setting->lookup(vec.back().c_str());
//BAY_PRINTF("Cfg", INFO, "get int64_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<double>(const string &obj_directroy,double &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
double a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get int value :%d success from main path",read_data);
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
double a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get int value :%d success from init path",read_data);
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<bool>(const string &obj_directroy,bool &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get bool value :%d success from main path",read_data);
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get bool value :%d success from init path",read_data);
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<float>(const string &obj_directroy,float &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get float value :%f success from main path %s",read_data,obj_directroy.c_str());
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get float value :%f success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadValue<string>(const string &obj_directroy,string &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_user_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get string :%s success from main path",read_data.c_str(),obj_directroy.c_str());
return true;
}
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get string :%s success from init path",read_data.c_str(),obj_directroy.c_str());
return true;
}
return false; //assertion both main bk init file does not contain target configuration
}
template<>
bool ConfigManager::ReadValue<std::vector<float>>(const string &obj_directroy,std::vector<float> &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting_1=NULL;
ReadConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting_1=CheckObjectformPathFileAndReturnObjForArray(cfg_user_,vec);
if(temp_setting_1!=NULL)
{
libconfig::Setting &tmp_setting = *temp_setting_1;
for(int i=0;i<tmp_setting[vec.back().c_str()].getLength();i++)
{
float temp=tmp_setting[vec.back().c_str()][i];
read_data.push_back(temp);
}
BAY_PRINTF("Cfg", INFO, "get vector<float> success from main path");
//cout<<"get vector<float> success from main path"<<endl;
return true;
}
temp_setting_1=CheckObjectformPathFileAndReturnObjForArray(cfg_default_,vec);
if(temp_setting_1!=NULL)
{
libconfig::Setting &tmp_setting = *temp_setting_1;
for(int i=0;i<tmp_setting[vec.back().c_str()].getLength();i++)
{
float temp=tmp_setting[vec.back().c_str()][i];
read_data.push_back(temp);
BAY_PRINTF("Cfg", INFO, "get vector<float> %.4f", temp);
}
BAY_PRINTF("Cfg", INFO, "get vector<float> success from init path");
//cout<<"get vector<float> success from init path"<<endl;
return true;
}
return false;
}
libconfig::Setting* ConfigManager::WritePathToConfigObj(libconfig::Config &cfg,std::vector<string> vec)
{
libconfig::Setting &root=cfg.getRoot();
return WritePathInLoop(root,vec);
}
libconfig::Setting* ConfigManager::WritePathInLoop(libconfig::Setting &root,std::vector<string> vec)
{
string temp_s=vec.begin()->c_str();
vector<string>::iterator it=vec.begin();
vec.erase(it);
if(vec.empty())
{
if(root.exists(temp_s.c_str()))
{
root.remove(temp_s.c_str());
}
return &root;
}
else
{
if(!root.exists(temp_s.c_str()))
{
root.add(temp_s.c_str(),libconfig::Setting::TypeGroup);
}
else
{
}
libconfig::Setting &obj = root[temp_s.c_str()];
return WritePathInLoop(obj,vec);
}
}
libconfig::Setting* ConfigManager::CheckObjectformPathFileAndReturnObj(libconfig::Config &cfg,std::vector<string> vec)
{
libconfig::Setting &root=cfg.getRoot();
return CheckPathInLoop(root,vec);
}
libconfig::Setting* ConfigManager::CheckObjectformPathFileAndReturnObjForArray(libconfig::Config &cfg,std::vector<string> vec)
{
libconfig::Setting &root=cfg.getRoot();
return CheckPathInLoop(root,vec);
}
libconfig::Setting* ConfigManager::CheckObjectformPathFileAndReturnObjForReset(libconfig::Config &cfg,std::vector<string> vec)
{
libconfig::Setting &root=cfg.getRoot();
return CheckPathInLoop(root,vec);
}
libconfig::Setting* ConfigManager::CheckPathInLoop(libconfig::Setting &root,std::vector<string> vec)
{
//cout<<"iter check str: "<<vec.begin()->c_str()<<endl;
string temp_s=vec.begin()->c_str();
//cout<<"temp str: "<<temp_s.c_str()<<endl;
vector<string>::iterator it=vec.begin();
vec.erase(it);
if(root.exists(temp_s.c_str())&&vec.empty())
{
//cout<<"obj match!"<<endl;
return &root;
}
else if(!root.exists(temp_s.c_str()))
{
//cout<<"error not obj match "<<endl;
return NULL;
}
else
{
libconfig::Setting &obj=root[temp_s.c_str()];
return CheckPathInLoop(obj,vec);
}
}
bool ConfigManager::WriteConfigToFile(libconfig::Config &cfg, bool bsync)
{
try
{
cfg.writeFile(user_file_path_);
if(bsync)
{
std::system("sync");
}
}
catch(const FileIOException &fioex)
{
BAY_PRINTF("Cfg", INFO, "I/O error while writing file");
return false;
}
if(bsync)
{
return CopyFileStream(user_file_path_.c_str(), user_backup_file_path_.c_str());
}
return true;
}
bool ConfigManager::ResetValue(const string &obj_directroy)
{
vector<string> vec;
WriteConfLock lock(ConfLock);
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
libconfig::Setting *temp_setting=NULL;
temp_setting=CheckObjectformPathFileAndReturnObjForReset(cfg_user_,vec);
if(temp_setting!=NULL)
{
temp_setting->remove(vec.back().c_str());
update_configfile_flag_ = true;
BAY_PRINTF("Cfg", INFO, "Reset :%s success from main file",obj_directroy.c_str());
}
else
{
BAY_PRINTF("Cfg", WARN, "%s not exsit in main file",obj_directroy.c_str());
}
return true;
}
template<class T>
bool ConfigManager::ReadDefaultValue(const string &obj_directroy,T &read_data)
{
BAY_PRINTF("Cfg", INFO, "The main template function()");
return true;
}
template<>
bool ConfigManager::ReadDefaultValue<int>(const string &obj_directroy,int &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get int value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<uint8_t>(const string &obj_directroy,uint8_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get uint8_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<int16_t>(const string &obj_directroy,int16_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get int16_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<uint32_t>(const string &obj_directroy,uint32_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get uint32_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<uint16_t>(const string &obj_directroy,uint16_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
int a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get uint16_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<int64_t>(const string &obj_directroy,int64_t &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
read_data=temp_setting->lookup(vec.back().c_str());
BAY_PRINTF("Cfg", INFO, "get int64_t value :%d success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<double>(const string &obj_directroy,double &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
double a=temp_setting->lookup(vec.back().c_str());
read_data=a;
BAY_PRINTF("Cfg", INFO, "get int value :%d success from init path",read_data);
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<bool>(const string &obj_directroy,bool &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get bool value :%d success from init path",read_data);
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<float>(const string &obj_directroy,float &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get float value :%f success from init path %s",read_data,obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<string>(const string &obj_directroy,string &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting=CheckObjectformPathFileAndReturnObj(cfg_default_,vec);
if(temp_setting!=NULL)
{
temp_setting->lookupValue(vec.back().c_str(),read_data);
BAY_PRINTF("Cfg", INFO, "get string :%s success from init path",read_data.c_str(),obj_directroy.c_str());
return true;
}
return false;
}
template<>
bool ConfigManager::ReadDefaultValue<std::vector<float>>(const string &obj_directroy,std::vector<float> &read_data)
{
vector<string> vec;
libconfig::Setting *temp_setting_1=NULL;
if(obj_directroy.length()==0) return false;
vec=SplitTheString(obj_directroy);
temp_setting_1=CheckObjectformPathFileAndReturnObjForArray(cfg_default_,vec);
if(temp_setting_1!=NULL)
{
libconfig::Setting &tmp_setting = *temp_setting_1;
for(int i=0;i<tmp_setting[vec.back().c_str()].getLength();i++)
{
float temp=tmp_setting[vec.back().c_str()][i];
read_data.push_back(temp);
}
//cout<<"get vector<float> success from init path"<<endl;
BAY_PRINTF("Cfg", INFO, "get vector<float> success from init path");
return true;
}
return false;
}