Skip to content

Commit

Permalink
Add message building.
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabien-B committed Apr 22, 2021
1 parent 4b279ef commit 38cce72
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 31 deletions.
122 changes: 109 additions & 13 deletions PprzlinkQt/message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,41 +9,137 @@ Message::Message(MessageDefinition definition, QStringList values) : definition(
{
assert(definition.getFields().size() == values.size());

for(int i=0; i<definition.getFields().size(); i++) {
auto fieldDef = definition.getFields()[i];
auto defs = definition.getFields();
for(int i=0; i<defs.size(); i++) {
auto fieldDef = defs[i];
if(fieldDef.type == Type::U8) {
uint8_t val = values[i].toUInt();
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::I8) {
int8_t val = values[i].toInt();
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::U16) {
uint16_t val = values[i].toUInt();
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::I16) {
int16_t val = values[i].toInt();
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::U32) {
uint32_t val = values[i].toUInt();
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::I32) {
int32_t val = values[i].toInt();
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::FLOAT) {
float val = values[i].toFloat();
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::STRING) {
QString val = values[i];
addField(val);
addField(fieldDef.name, val);
} else if(fieldDef.type == Type::ARRAY) {
QString val = values[i];
addField(val);
addField(fieldDef.name, val);
}
}
}

QString Message::getField(QString field_name) {
auto field_defs = definition.getFields();

auto def = std::find_if(field_defs.begin(), field_defs.end(),
[=](FieldDef fd){return fd.name == field_name;});
if(def == field_defs.end()) {
throw std::runtime_error("No such field: \"" + field_name.toStdString() + "\"!");
}

if(def->type == Type::U8) {
uint8_t val;
getField(field_name, val);
return QString::number(val);
} else if(def->type == Type::I8) {
int8_t val;
getField(field_name, val);
return QString::number(val);
} else if(def->type == Type::U16) {
uint16_t val;
getField(field_name, val);
return QString::number(val);
} else if(def->type == Type::I16) {
int16_t val;
getField(field_name, val);
return QString::number(val);
} else if(def->type == Type::U32) {
uint32_t val;
getField(field_name, val);
return QString::number(val);
} else if(def->type == Type::I32) {
int32_t val;
getField(field_name, val);
return QString::number(val);
} else if(def->type == Type::FLOAT) {
float val;
getField(field_name, val);
return QString::number(val);
} else if(def->type == Type::STRING) {
QString val;
getField(field_name, val);
return val;
} else if(def->type == Type::ARRAY) {
throw std::runtime_error("arrays not done yet!");
}

throw std::runtime_error("unknown type!");
}

template<typename T>
void Message::addField(T value) {
fields.append(std::make_any<T>(value));
void Message::addField(QString name, T value) {

auto field_defs = definition.getFields();

auto def = std::find_if(field_defs.begin(), field_defs.end(),
[=](FieldDef fd){return fd.name == name;});
if(def == field_defs.end()) {
throw std::runtime_error("No such field: \"" + name.toStdString() + "\"!");
}

bool type_ok = false;
if(def->type == Type::U8) {
type_ok = std::is_same_v<T, uint8_t >;
} else if(def->type == Type::U16) {
type_ok = std::is_same_v<T, uint16_t >;
} else if(def->type == Type::U32) {
type_ok = std::is_same_v<T, uint32_t >;
} else if(def->type == Type::I8) {
type_ok = std::is_same_v<T, int8_t >;
} else if(def->type == Type::I16) {
type_ok = std::is_same_v<T, int16_t >;
} else if(def->type == Type::I32) {
type_ok = std::is_same_v<T, int32_t >;
} else if(def->type == Type::FLOAT) {
type_ok = std::is_same_v<T, float >;
} else if(def->type == Type::STRING) {
type_ok = std::is_same_v<T, QString >;
} else if(def->type == Type::CHAR) {
type_ok = std::is_same_v<T, char >;
}

if(!type_ok) {
throw std::runtime_error("Bad type!");
}

fields[name] = std::make_any<T>(value);
}

void Message::getField(QString field_name, QString& arg){
if(!fields.contains(field_name)) {
throw std::runtime_error("no such field!");
}
arg = std::any_cast<QString>(fields[field_name]);
}

bool Message::isComplete() {
// fields are checked at insertion,
// so just check if the number of fields match
return definition.getFields().size() == fields.size();
}

37 changes: 19 additions & 18 deletions PprzlinkQt/message.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,36 +11,37 @@ class Message
Message(MessageDefinition definition);
Message(MessageDefinition definition, QStringList values);

bool isComplete();
QString getSender() { return sender;}
void setSender(QString s) {
sender = s;
}
MessageDefinition getDefinition() { return definition;}

template<
typename T,
typename E = typename std::enable_if<std::is_arithmetic<T>::value>::type
>
void getField(QString field_name, T& arg){
for(int i=0; i < fields.size(); i++) {
if(definition.getFields()[i].name == field_name) {

arg = std::any_cast<T>(fields[i]);
}
}
if(!fields.contains(field_name)) {
throw std::runtime_error("No such field: \"" + field_name.toStdString() + "\"!");
}
arg = std::any_cast<T>(fields[field_name]);
}

void getField(QString field_name, QString& arg){
for(int i=0; i < fields.size(); i++) {
if(definition.getFields()[i].name == field_name) {
arg = std::any_cast<QString>(fields[i]);
}
}
}
QString getField(QString field_name);

MessageDefinition messageDefinition() const {return definition;}

private:
void getField(QString field_name, QString& arg);

template<typename T>
void addField(T value);
void addField(QString name, T value);

MessageDefinition messageDefinition() const {return definition;}

private:
MessageDefinition definition;
QList<std::any> fields;
QString sender;
QMap<QString, std::any> fields;
};

#endif // MESSAGE_H

0 comments on commit 38cce72

Please sign in to comment.