aqc_embedded_doc
README. config-manager. Библиотека для работы с файлом конфигурации

Библиотека предоставляет объект config_manager, с помощью которого можно удобно парсить конфигурационный файл /mnt/data/aqsi-config.json. Кроме этого, можно получить информацию о ревизии, серийном номере и device ID.

Building documentation

Для создания документации сначала установите зависимости (doxygen, doxyqml and dot):

sudo apt install doxygen graphviz doxyqml

Затем создайте документацию:

doxygen ./Doxyfile

Документация будет создана в папке ./doc/html/. Чтобы открыть документацию, откройте файл ./doc/html/pages.html в браузере.

Dependencies

  • libstdc++ 6.0.23
  • libjansson 4.11.1
  • libhwhelper 1.5.0

Содержимое

Configuration - класс конфигурации. Является обёрткой над unordered_map<string, variant>
ConfigManager - отвечает за управление объектами класса Configuration
config_manager - объект класса ConfigManager, используется клиентом
ConfigParameter - namespace, содержащий enum'ы для ряда параметров, а так же шаблонную
функцию toString() для получения текстового представления этих enum'ов. ConfigPointer - указатель на объект Configuration, который используется клиентом.

Описание работы

ConfigManager оперирует объектом класса Configuration. Клиент не может самостоятельно создать или изменить содержимое этого класса. Он создается внутри ConfigManager и отправляет клиенту shared_ptr на него. Это сделано для того, чтобы у клиента была возможность использовать конфигурацию в течение определенного времени (сессии), не беспокоясь о том, что она внезапно обновится (обновление предполагается по сигналу SIGHUP). При вызове метода обновления конфигурации ConfigManager создает у себя новый указатель. Когда клиент закончит работу со своей старой версией конфига, он просто берет из ConfigManager новый указатель.

В ConfigManager также хранится дефолтная конфигурация, которая задается клиентом перед вызовом функции update(). Данные из этой конфигурации используются при создании нового Configuration.

Пример использования

{c++}
#include <string>
#include <ConfigManager.h>
#include <signal.h>
static void setCallback(std::string const &str)
{
printf("%s\n", str.c_str());
}
void sighandler(int n)
{
if (n == SIGHUP) {
config_manager.update();
}
}
void init(int /*argc*/, char */*argv*/[])
{
// По нашей договоренности, все приложения должны обрабатывать сигнал SIGHUP
// как команду на обновление конфигурации
signal(SIGHUP, sighandler);
// Все параметры, которые впоследствие будет использовать приложение,
// следует таким образом определить, чтобы приложение знало, на какие значения
// нужно fallback'аться, если параметра в конфиге нет.
// Если все параметры перечислены, второй параметр в Configuration::get(string key, bool ok)
// использовать не нужно.
config_manager.setDefault("MainMode", 1);
config_manager.setDefault("SalesStatisticSource",
ConfigParameter::SalesStatisticSource::Bus); // Используйте enum'ы из ConfigParameter.h вместо цифр
config_manager.setDefault("ScaleFactor", 1);
config_manager.setDefault("DecimalPlacesCash", 2);
config_manager.setDefault("DecimalPlacesCashless", 2);
// Следующие 2 строчки обычно не требуются. Можно использовать, если нужна особая
// обработка сообщений, которые пишутся ConfigManager'ом.
// В колбэке по-умолчанию идёт запись в syslog.
config_manager.installErrorCallback(setCallback);
config_manager.installInformCallback(setCallback);
// Здесь происходит обновление конфигурации из файла.
config_manager.update();
// Выводит на экран список из параметров, ранее определнных через setDefault(),
// обновленных после чтения конфигурации из файла.
config_manager.showUpdatedDefaults();
}
int main(int argc, char *argv[])
{
// Заполняем config_manager данными
init(argc, argv);
// Получаем указатель на Configuration. Как вариант, можно использовать auto
ConfigPointer cfg = config_manager.getConfigPtr();
// Получаем значение параметра MainMode.
int mode = cfg->get<int>("MainMode");
// Выводим enum
printf("MainMode = %d (%s)\n",
mode, ConfigParameter::toString<ConfigParameter::MainMode>(mode));
// Предполагаем, что в момент слипа файл с конфигурацией
// обновился и приложению послали SIGHUP
sleep(10);
// MainMode всё ещё старый
mode = cfg->get<int>("MainMode");
printf("MainMode = %d", mode);
// Старый указатель уничтожился, получили новый
cfg = config_manager.getConfigPtr();
// MainMode обновился
mode = cfg->get<int>("MainMode");
printf("MainMode = %d", mode);
return 0;
}