ROS2下编译使用libconfig

  1. 库下载地址 

 libconfig下载地址:About | libconfig

  1. 解压及编译

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等平台

  1. 对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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值