diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index e796b31..df836e4 100644 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -1158,6 +1158,92 @@ mbus_parse_variable_record(mbus_data_record *data) return record; } +//------------------------------------------------------------------------------ +/// Generate XML for variable-length data +//------------------------------------------------------------------------------ +char * +mbus_data_variable_xml_normalized(mbus_data_variable *data) +{ + mbus_data_record *record; + mbus_record *norm_record; + static char buff[8192]; + char str_encoded[768]; + size_t len = 0; + size_t i; + + if (data) + { + len += snprintf(&buff[len], sizeof(buff) - len, "\n\n"); + + len += snprintf(&buff[len], sizeof(buff) - len, "%s", mbus_data_variable_header_xml(&(data->header))); + + for (record = data->record, i = 0; record; record = record->next, i++) + { + norm_record = mbus_parse_variable_record(record); + + len += snprintf(&buff[len], sizeof(buff) - len, " \n", i); + + if (norm_record != NULL) + { + mbus_str_xml_encode(str_encoded, norm_record->function_medium, sizeof(str_encoded)); + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); + + mbus_str_xml_encode(str_encoded, norm_record->unit, sizeof(str_encoded)); + + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); + + mbus_str_xml_encode(str_encoded, norm_record->quantity, sizeof(str_encoded)); + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); + + + if (norm_record->is_numeric) + { + len += snprintf(&buff[len], sizeof(buff) - len, " %f\n", norm_record->value.real_val); + } + else + { + mbus_str_xml_encode(str_encoded, norm_record->value.str_val.value, sizeof(str_encoded)); + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); + } + + mbus_record_free(norm_record); + } + else + { + } + + len += snprintf(&buff[len], sizeof(buff) - len, " \n\n"); + } + + len += snprintf(&buff[len], sizeof(buff) - len, "\n"); + + return buff; + } + + return ""; +} + +//------------------------------------------------------------------------------ +/// Return a string containing an XML representation of the M-BUS frame data. +//------------------------------------------------------------------------------ +char * +mbus_frame_data_xml_normalized(mbus_frame_data *data) +{ + if (data) + { + if (data->type == MBUS_DATA_TYPE_FIXED) + { + return mbus_data_fixed_xml(&(data->data_fix)); + } + + if (data->type == MBUS_DATA_TYPE_VARIABLE) + { + return mbus_data_variable_xml_normalized(&(data->data_var)); + } + } + + return ""; +} mbus_handle * mbus_connect_serial(const char * device) diff --git a/mbus/mbus-protocol-aux.h b/mbus/mbus-protocol-aux.h index a55e694..f29065d 100644 --- a/mbus/mbus-protocol-aux.h +++ b/mbus/mbus-protocol-aux.h @@ -346,6 +346,24 @@ int mbus_vif_unit_normalize(int vif, double value, char **unit_out, double *valu */ int mbus_vib_unit_normalize(mbus_value_information_block *vib, double value, char **unit_out, double *value_out, char ** quantity_out); +/** + * Generate XML for normalized variable-length data + * + * @param data variable-length data + * + * @return string with XML + */ +char * mbus_data_variable_xml_normalized(mbus_data_variable *data); + +/** + * Return a string containing an XML representation of the normalized M-BUS frame data. + * + * @param data M-Bus frame data + * + * @return string with XML + */ +char * mbus_frame_data_xml_normalized(mbus_frame_data *data); + /** * Iterate over secondary addresses, send a probe package to all addresses matching * the given addresses mask.