Пишу программу для работы с устройством, разрабатываемым мною же, по ModBus RTU.
На данный момент обмен устроен так, что есть класс ModBus клиент, обеспечивающий посылку запросов и обработку ответов по ModBus.
Интерфейс его вида:
class IModBusClient {
virtual void ReadHoldingRegs(uint16_t startRegAddres, uint16_t RegsCount, IModBusReponseListener *listener) = 0;
...
}
Т.е. названия функций дублируют названия запросов из документации на протокол.
Ключевой момент тут listener.
Все запросы кладутся в очередь и обрабатываются по одному.
Когда запрос обработан (неважно успешно или таймаут произошел или ошибку девайс вернул, дергается соответствующая функция у listener-а.
Когда я отправляю один запрос, ну или кучку независимых друг от друга запросов все нормально.
Но вот бывают задачи, когда к примеру надо убедиться в успешности выполнения группы запросов, например записываю я кучку разрозненных регистров (некая запись конфига в устройство), мне надо знать что все они успешно записались.
Вот тут я и пытаюсь сообразить как можно сделать удобнее?
Моя идея - присваивать запросу некий идентификатор и использовать его как ключ. Т.е. дергаем мы ReadHoldingRegs, он возвращает ID запроса. Потом когда будет вызван callback у listener-а, туда передастся этот ID и слушатель будет знать какой запрос выполнился.
Второе - организовать объекты, которые выполняют более высокоуровневые функции. Условно - записать конфиг, прочитать конфиг (собрать из нескольких запросов более сложный), ну и т.п. И далее оперировать ими.
Подскажите, какие идейки еще есть? может паттерны какие подойдут удобные?