Index: scripts/MsgUtils/msgutils/templates/MsgProtoUtils_cpp.jinja =================================================================== diff -u -r59b4c22f45a1d098064a886452769204e90cfb4b -raaebfee335c74b0250864a6dce0555f866adadea --- scripts/MsgUtils/msgutils/templates/MsgProtoUtils_cpp.jinja (.../MsgProtoUtils_cpp.jinja) (revision 59b4c22f45a1d098064a886452769204e90cfb4b) +++ scripts/MsgUtils/msgutils/templates/MsgProtoUtils_cpp.jinja (.../MsgProtoUtils_cpp.jinja) (revision aaebfee335c74b0250864a6dce0555f866adadea) @@ -12,18 +12,17 @@ {%- endif %} // Populate the protobuf Header (field 1) shared by every typed message. -static void updateHeader(messages::Header *header, const QDateTime ×tamp, const QString &deviceSerialNum, quint16 msgId, qint16 sequence) +static void updateHeader(messages::Header *header, const QDateTime ×tamp, qint16 sequence, quint16 msgId) { if (header) { const auto msecs = timestamp.toMSecsSinceEpoch(); - header->set_deviceserialnum(deviceSerialNum.toStdString()); auto proto_timestamp = header->mutable_timestamp(); if (proto_timestamp) { proto_timestamp->set_seconds(msecs / 1000); proto_timestamp->set_nanos((msecs % 1000) * 1000000); } - header->set_msgid(msgId); header->set_sequence(sequence); + header->set_msgid(msgId); } } {%- for (msg_id_value, msg) in msg_cpp.data.items() %} @@ -32,12 +31,13 @@ // {{ msg['msg_id'] }} ({{ msg['msg_id_hex_string'] }}) // payload: {{ msg_cpp.field_list(msg_id_value) | join(", ") }} // serializeProto: msg struct -> QByteArray of serialized protobuf data (header populated from params) -QByteArray serializeProto([[maybe_unused]] const {{ msg['msg_name'] }}Payload &src, const QDateTime ×tamp, const QString &deviceSerialNum, quint16 msgId, qint16 sequence) +bool serializeProto([[maybe_unused]] const {{ msg['msg_name'] }}Payload &src, const QDateTime ×tamp, qint16 sequence, quint16 msgId, QByteArray &dst) { {%- if has_union %} qDebug().noquote() << "WARNING: MsgId={{ msg['msg_name'] }} contains union/oneof field(s); protobuf serialization is partial"; {%- endif %} messages::{{ msg['msg_name'] }} proto; + updateHeader(proto.mutable_header(), timestamp, sequence, msgId); {%- for field in msg['payload'] %} {%- if field['type'] != "union" %} // {{ field['type'] ~ "-" ~ field['name'] }} @@ -46,10 +46,15 @@ // TODO: {{ field['type'] ~ "-" ~ field['name'] }} {%- endif %} {%- endfor %} - updateHeader(proto.mutable_header(), timestamp, deviceSerialNum, msgId, sequence); std::string out; - (void)proto.SerializeToString(&out); - return QByteArray(out.data(), static_cast(out.size())); + if (proto.SerializeToString(&out)) { + dst = QByteArray::fromStdString(out); + return true; + } + else { + dst = QByteArray(); + return false; + } } // {{ msg['msg_id'] }} ({{ msg['msg_id_hex_string'] }}) @@ -61,39 +66,44 @@ qDebug().noquote() << "WARNING: MsgId={{ msg['msg_name'] }} contains union/oneof field(s); protobuf deserialization is partial"; {%- endif %} messages::{{ msg['msg_name'] }} proto; - if (proto.ParseFromArray(bytes.constData(), bytes.size()) == false) { - qDebug().noquote() << "ERROR: could not parse protobuf for MsgId={{ msg['msg_name'] }}"; - return false; - } + if (proto.ParseFromArray(bytes.constData(), bytes.size())) { {%- for field in msg['payload'] %} {%- if field['type'] != "union" %} - // {{ field['type'] ~ "-" ~ field['name'] }} - dst.{{ field['name'] }}.value = proto.{{ field['name'].lower() }}(); + // {{ field['type'] ~ "-" ~ field['name'] }} + dst.{{ field['name'] }}.value = proto.{{ field['name'].lower() }}(); {%- else %} - // TODO: {{ field['type'] ~ "-" ~ field['name'] }} + // TODO: {{ field['type'] ~ "-" ~ field['name'] }} {%- endif %} {%- endfor %} - return true; + return true; + } + else { + return false; + } } {%- endfor %} -QByteArray canMessageToProtobufByteArray(const QDateTime ×tamp, const QString &deviceSerialNum, const Can::Message &msg) +bool canMessageToProtobufByteArray(const QDateTime ×tamp, const Can::Message &msg, QByteArray &dst) { switch (msg.msgId) { {%- for (msg_id_value, msg) in msg_cpp.data.items() %} case {{ msg['msg_id'] }}: { {{ msg['msg_name'] }}Payload payload; - if (payload.fromQByteArray(msg.data) == false) { - qDebug().noquote() << "ERROR: could not convert CAN message with MsgId={{ msg['msg_name'] }} to struct"; + if (payload.fromQByteArray(msg.data)) { + return serializeProto(payload, timestamp, msg.sequence, msg.msgId, dst); } - return serializeProto(payload, timestamp, deviceSerialNum, msg.msgId, msg.sequence); + else { + dst = QByteArray(); + return false; + } } {%- endfor %} default: qDebug().noquote() << QString("WARNING: MsgId=0x%1 not handled").arg(msg.msgId, 4, 16, QChar('0')); + dst = QByteArray(); + return false; break; } - return QByteArray(); } // Maps a msgId to its fully-qualified protobuf message name for descriptor-pool lookup.