act-common
Сейчас -- набор самостоятельных библиотек под разные платформы, схемы, документы и т.д.
Включает:
act-common-src-logger
-- [Win
] простой логгерact-common-src-com-port
-- [Win
] работа с COM-портом в стиле "реактор" (IO Reactor)act-common-mc-common
-- [AVR
] набор утилит для микроконтроллераact-common-schema
-- некоторые общие схемы
act-common-src-logger
Библиотека для логирования процесса работы программы. Поддерживает не так много функций, однако позволяет перенаправлять лог в произвольное место (файл, консоль, GUI), хотя это и реализуется пользователем.
Подробная инструкция по установке и настройке представлена находится в репозитории.
act-common-src-com-port
Обертка над WinAPI
по части работы с COM-портом, а также реализованный IO Reactor.
Паттерн
IO Reactor
предполагает наличие некоего реактора, который, будучи (сконфигурированным и) запущенным, работает в фоновом потоке (нескольких потоках), организуя две очереди (ввода и вывода соответсвенно). При поступлении входных данных реактор производит набор преобразований над ними, и уже эти окончательные данные кладутся в очередь ввода (или вызывается функция обратного вызова). При наличии свободного места в канале вывода реактор производит запись в него элемента очереди вывода. Реактор может быть конфигурирем "на лету", т.е. может допускать замену канала ввода-вывода, в т.ч. продолжать работу в режиме ожидания при выходе нижележащего канала ввода-вывода из строя.
Реактор полностью конфигурируем "на лету". В случае неисправности COM-порта ожидает установки корректного COM-порта.
Двустроннее преобразование "объект пакета"-"байты" осуществляет т.н. "диалект".
Описание типов приводится в README
репозитория. Примеры расположены внутри репозитория под директорией examples
.
Некоторые примеры
Создание и открытие COM-порта:
com_port port;
port.open(com_port_options("COM3", CBR_4800, 8, true, ODDPARITY, ONESTOPBIT));
if (!port.open()) { /* log error message */ }
Создание и конфигурирование реактора (custom_dialect
-- некоторый реализованный диалект -- наследник dialect < ipacket_t, opacket_t >
):
reactor < custom_dialect > r;
r.start();
r.supply_port(std::move(port));
Отправка пакетов данных (в предположении, что custom_dialect
-- наследник dialect < unsigned char, unsigned char >
):
r.supply_opacket(unsigned char(56));
r.supply_opacket(unsigned char(57));
r.supply_opacket(unsigned char(58));
Прием пакетов данных (в том же предположении):
std::list<unsigned char> packets;
{
// обязательно защитить чтение блокировкой!
reactor_t::guard_t guard(r.iqueue_mutex);
// обязательно очистить очередь пакетов!
packets.splice(packets.end(), r.iqueue);
}
Остановка реактора:
r.stop();
r.join(); // фактическое ожидание остановки
act-common-mc-common
В основном содержит определения для упрощения ввода-вывода со стороны микроконтролера.
Реализует кольцевые буферы на статических массивах. Предоставляет два варианта статических массивов (со статическим и динамическим размером). Позволяет использовать блокировки в стиле c++0x.
Подробная документация представлена в репозитории.