【发布时间】:2019-10-02 16:51:37
【问题描述】:
我想在两个微控制器之间创建一个通信协议,我使用在系统之间合并消息类型的类逻辑。我想通过做一些非常简单的事情来开发一个更简单的过程来创建新消息
BEGIN_MSG(LinearDriveMsg)
ADD_2BIT(DriveSpeed, speed)
ADD_16BIT(GMath::Position, position.x)
END_MSG
理想情况下,它会扩展为:
BEGIN_MSG(LinearDriveMsg)
BEGIN_SERIALIZER
ADD_SERIALIZER_2BIT(DriveSpeed, speed)
ADD_SERIALIZER_16BIT(GMath::Position, position.x)
END_SERIALIZER
BEGIN_DESERIALIZER
ADD_DESERIALIZER_2BIT(DriveSpeed, speed)
ADD_DESERIALIZER_16BIT(GMath::Position, position.x)
END_DESERIALIZER
END_MSG
然后展开为cpp代码
...
bool LinearDriveMsg::deserialize(const uint8_t *incoming_buffer, const uint8_t *incoming_size) override{
if (*incoming_size != getMessageSize())
return false;
_speed = (DriveSpeed)((incoming_buffer[0] & SPEED_MASK) >> SPEED_OFFSET);
weldTwoBytesToInt(&incoming_buffer[1], _position.x);
return true;
}
int LinearDriveMsg::serialize(uint8_t *outgoing_buffer, uint8_t *outgoing_size) const override{
if (*outgoing_size < getMessageSize())
return -1;
outgoing_buffer[0] |= ((uint8_t)_speed << SPEED_OFFSET) & SPEED_MASK;
cutIntToTwoBytes(_position.x, outgoing_buffer + 1, 2);
return getMessageSize();
}
...
我知道做一些高级预处理器的东西很棘手,但也许有一些方法可以完成这项任务?也可以调整实际cpp代码使其成为可能(这样效率还是可以的)
【问题讨论】:
-
我最好在 python 或 lua 之类的东西上编写代码生成器,而不是处理预处理器。不过,您的任务应该可以使用模板来完成。
标签: c++ serialization deserialization message preprocessor