// // Created by tangchao on 2022/6/28. // #include "Header_Files/configfile.h" Configfile::Configfile() { } void Configfile::setConfigfilePath(string configfilePath) { m_configfilePath = configfilePath; } bool Configfile::isConfigfileExist() { QFileInfo info(QString::fromStdString(m_configfilePath)); return info.exists(); } bool Configfile::parseConfigfile() { // Read the file. If there is an error, report it and exit. try { cfg.readFile(m_configfilePath); return true; } catch(const FileIOException &fioex) { std::cerr << "I/O error while reading file." << std::endl; return false; } catch(const ParseException &pex) { std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine() << " - " << pex.getError() << std::endl; return false; } } bool Configfile::getBin(int &bin) { try { bin = cfg.lookup("bin"); return true; } catch(const SettingNotFoundException &nfex) { cerr << "No 'bin' setting in configuration file." << endl; return false; } } 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 false; } } catch(const SettingNotFoundException &nfex) { // Ignore. return false; } return true; } bool Configfile::getEffectiveWindowRoi(int &width, int &offsetx) { const Setting& root = cfg.getRoot(); // Output a list of all books in the inventory. try { const Setting &effective_window = root["effective_window_roi"]; 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) )) { return false; } } catch(const SettingNotFoundException &nfex) { // Ignore. return false; } return true; } 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 false; } } catch(const SettingNotFoundException &nfex) { // Ignore. return false; } return true; } bool 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_window_Bin1 = effective_window.add("bin1", Setting::TypeGroup); Setting &effective_window_Bin2 = effective_window.add("bin2", Setting::TypeGroup); effective_window_Bin1.add("width", Setting::TypeInt) = 1392; effective_window_Bin1.add("offsetx", Setting::TypeInt) = 272; effective_window_Bin1.add("height", Setting::TypeInt) = 300; effective_window_Bin1.add("offsety", Setting::TypeInt) = 348; effective_window_Bin2.add("width", Setting::TypeInt) = 712; effective_window_Bin2.add("offsetx", Setting::TypeInt) = 128; effective_window_Bin2.add("height", Setting::TypeInt) = 151; effective_window_Bin2.add("offsety", Setting::TypeInt) = 174; Setting &effective_window_roi = root.add("effective_window_roi", Setting::TypeGroup); Setting &effective_window_roi_Bin1 = effective_window_roi.add("bin1", Setting::TypeGroup); Setting &effective_window_roi_Bin2 = effective_window_roi.add("bin2", Setting::TypeGroup); effective_window_roi_Bin1.add("width", Setting::TypeInt) = 1364; effective_window_roi_Bin1.add("offsetx", Setting::TypeInt) = 14; // effective_window_roi_Bin1.add("height", Setting::TypeInt) = 300; // effective_window_roi_Bin1.add("offsety", Setting::TypeInt) = 348; effective_window_roi_Bin2.add("width", Setting::TypeInt) = 682; effective_window_roi_Bin2.add("offsetx", Setting::TypeInt) = 15; // effective_window_roi_Bin2.add("height", Setting::TypeInt) = 151; // effective_window_roi_Bin2.add("offsety", Setting::TypeInt) = 174; 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) = 2.00313433; gainOffsetBin1.add("offset", Setting::TypeFloat) = -300.46283157590585; gainOffsetBin2.add("gain", Setting::TypeFloat) = 4.00626868; gainOffsetBin2.add("offset", Setting::TypeFloat) = -299.46126663407176; // 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 configuration file: " << output_file << endl; return true; } return true; } bool 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 false; } catch(const ParseException &pex) { std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine() << " - " << pex.getError() << std::endl; return false; } // 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 false; } return true; }