Формирование пакетов-запросов ко внешним устройствам
От: Alexander Pazdnikov  
Дата: 01.09.07 12:34
Оценка:
Есть внешние устройства, с которых нужно забирать данные.
У каждого типа определенный протокол обмена.

В протоколе есть как предопределенные запросы, так и с параметрами.
Предопределенные запросы, например, прочитать время.

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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.