Есть внешние устройства, с которых нужно забирать данные.
У каждого типа определенный протокол обмена.
В протоколе есть как предопределенные запросы, так и с параметрами.
Предопределенные запросы, например, прочитать время.
const uint8_t gPacketReadTime[] = { 0x04, 0x00 };
а есть динамические, т.е. часть у них константная, а часть —
переменные(параметры)
const uint8_t gPacketReadInstantPower[] = {
0x08, // код первого параметра
0x00, 0x00, /// держатели места для значения первого параметра
0x10, // код второго параметра
0x00, 0x00 /// держатели места для значения первого параметра
};
...
obuf_.
для формирования используется макрос, который очищает буфер запроса, кроме
первого байта адреса устройства (адресуемый протокол обмена).
#define LXC_SET_PACKET_BODY(buf, packet) \
{ \
buf.erase(buf.begin() + 1, buf.end()); \
std::copy((packet), (packet + sizeof(packet)), back_inserter(buf)); \
}
в итоге формирование предопределенного константого запроса
typedef std::vector<uint8_t> BufferType;
...
BufferType obuf_;
...
LXC_SET_PACKET_BODY(obuf_, gPacketReadTime);
/// обмен данными;
формирование параметризованного запроса
typedef std::vector<uint8_t> BufferType;
...
BufferType obuf_;
...
LXC_SET_PACKET_BODY(obuf_, gPacketReadInstantPower);
// а дальше вся красота нарушается
// а - переменная значения 1-го параметра
// b - переменная значения 2-го параметра
obuf_.at(3) = a & 0xFF;
obuf_.at(4) = (a >> 8) & 0xFF
obuf_.at(6) = b & 0xFF;
obuf_.at(7) = (b >> 8) & 0xFF
/// обмен данными;
можно сделать через итератор, но тоже как-то не красиво
typedef std::vector<uint8_t> BufferType;
...
BufferType obuf_;
...
LXC_SET_PACKET_BODY(obuf_, gPacketReadInstantPower);
// а дальше вся красота нарушается
// а - переменная значения 1-го параметра
// b - переменная значения 2-го параметра
BufferType::iterator it = obuf_.begin() + 1;
*(++it) = a & 0xFF; // obuf_.at(3) = a & 0xFF;
*(++it) = (a >> 8) & 0xFF; // obuf_.at(4) = (a >> 8) & 0xFF
++it;
*(++it) = b & 0xFF; // obuf_.at(6) = b & 0xFF;
*(++it) = b >> 8) & 0xFF; // obuf_.at(7) = (b >> 8) & 0xFF
/// обмен данными;
Есть ли мысли, как можно сделать красиво и универсально?
В разных запросах разное кол-во параметров.
Posted via RSDN NNTP Server 2.1 beta