// // Created by tangchao on 2022/6/28. // #include "Header_Files/configfile.h" Configfile::Configfile() { } void Configfile::setConfigfilePath(string configfilePath) { m_configfilePath = configfilePath; } int Configfile::parseConfigfile() { // Read the file. If there is an error, report it and exit. try { cfg.readFile(m_configfilePath); } catch(const FileIOException &fioex) { std::cerr << "I/O error while reading file." << std::endl; return(EXIT_FAILURE); } catch(const ParseException &pex) { std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine() << " - " << pex.getError() << std::endl; return(EXIT_FAILURE); } } bool Configfile::getBin(int &bin) { try { bin = cfg.lookup("bin"); return(EXIT_SUCCESS); } catch(const SettingNotFoundException &nfex) { cerr << "No 'bin' setting in configuration file." << endl; return(EXIT_FAILURE); } } bool Configfile::getEffectiveWindow(int &width, int &offsetx, int &height, int &offsety) { const Setting& root = cfg.getRoot(); // Output a list of all books in the inventory. try { const Setting &effective_window = root["effective_window"]; int count = effective_window.getLength(); int bin; getBin(bin); const Setting &window = effective_window[bin-1]; string name = window.getName(); if(!(window.lookupValue("width", width) && window.lookupValue("offsetx", offsetx) && window.lookupValue("height", height) && window.lookupValue("offsety", offsety))) { return(EXIT_FAILURE); } } catch(const SettingNotFoundException &nfex) { // Ignore. int a=1; } return(EXIT_SUCCESS); } bool Configfile::getGainOffset(float &gain, float &offset) { const Setting& root = cfg.getRoot(); // Output a list of all books in the inventory. try { const Setting &gainOffset = root["gainOffset"]; int count = gainOffset.getLength(); int bin; getBin(bin); const Setting &gainOffsetSetting = gainOffset[bin-1]; string name = gainOffsetSetting.getName(); if(!(gainOffsetSetting.lookupValue("gain", gain) && gainOffsetSetting.lookupValue("offset", offset))) { return(EXIT_FAILURE); } } catch(const SettingNotFoundException &nfex) { // Ignore. int a=1; } return(EXIT_SUCCESS); } int Configfile::createConfigFile() { using namespace std; using namespace libconfig; static const char *output_file = "ximea.cfg"; Config cfg; Setting &root = cfg.getRoot(); // Add some settings to the configuration. Setting &bin = root.add("bin", Setting::TypeInt) = 1; Setting &SN = root.add("SN", Setting::TypeString) = "0098"; Setting &effective_window = root.add("effective_window", Setting::TypeGroup); Setting &effective_windowBin1 = effective_window.add("bin1", Setting::TypeGroup); Setting &effective_windowBin2 = effective_window.add("bin2", Setting::TypeGroup); effective_windowBin1.add("width", Setting::TypeInt) = 1; effective_windowBin1.add("offsetx", Setting::TypeInt) = 2; effective_windowBin1.add("height", Setting::TypeInt) = 3; effective_windowBin1.add("offsety", Setting::TypeInt) = 4; effective_windowBin2.add("width", Setting::TypeInt) = 5; effective_windowBin2.add("offsetx", Setting::TypeInt) = 6; effective_windowBin2.add("height", Setting::TypeInt) = 7; effective_windowBin2.add("offsety", Setting::TypeInt) = 8; Setting &gainOffset = root.add("gainOffset", Setting::TypeGroup); Setting &gainOffsetBin1 = gainOffset.add("bin1", Setting::TypeGroup); Setting &gainOffsetBin2 = gainOffset.add("bin2", Setting::TypeGroup); gainOffsetBin1.add("gain", Setting::TypeFloat) = 9.12; gainOffsetBin1.add("offset", Setting::TypeFloat) = -10.2; gainOffsetBin2.add("gain", Setting::TypeFloat) = 11.789; gainOffsetBin2.add("offset", Setting::TypeFloat) = -12.58; // Write out the new configuration. try { cfg.writeFile(output_file); cerr << "New configuration successfully written to: " << output_file << endl; } catch(const FileIOException &fioex) { cerr << "I/O error while writing file: " << output_file << endl; return(EXIT_FAILURE); } return(EXIT_SUCCESS); } int Configfile::updateConfigFile() { using namespace std; using namespace libconfig; static const char *output_file = "updated.cfg"; Config cfg; cfg.setOptions(Config::OptionFsync | Config::OptionSemicolonSeparators | Config::OptionColonAssignmentForGroups | Config::OptionOpenBraceOnSeparateLine); // Read the file. If there is an error, report it and exit. try { cfg.readFile("example.cfg"); } catch(const FileIOException &fioex) { std::cerr << "I/O error while reading file." << std::endl; return(EXIT_FAILURE); } catch(const ParseException &pex) { std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine() << " - " << pex.getError() << std::endl; return(EXIT_FAILURE); } // Find the 'movies' setting. Add intermediate settings if they don't yet // exist. Setting &root = cfg.getRoot(); if(! root.exists("inventory")) root.add("inventory", Setting::TypeGroup); Setting &inventory = root["inventory"]; if(! inventory.exists("movies")) inventory.add("movies", Setting::TypeList); Setting &movies = inventory["movies"]; // Create the new movie entry. Setting &movie = movies.add(Setting::TypeGroup); movie.add("title", Setting::TypeString) = "Buckaroo Banzai"; movie.add("media", Setting::TypeString) = "DVD"; movie.add("price", Setting::TypeFloat) = 12.99; movie.add("qty", Setting::TypeInt) = 20; // Write out the updated configuration. try { cfg.writeFile(output_file); cerr << "Updated configuration successfully written to: " << output_file << endl; } catch(const FileIOException &fioex) { cerr << "I/O error while writing file: " << output_file << endl; return(EXIT_FAILURE); } return(EXIT_SUCCESS); }