diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index 546541f9..e1415801 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -3279,11 +3279,15 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) { if (mbus_frame_calc_length(frame) == -1) { + snprintf(error_str, sizeof(error_str), "Length calculation of frame failed"); + return -2; } if (mbus_frame_calc_checksum(frame) == -1) { + snprintf(error_str, sizeof(error_str), "Checksum calculation of frame failed"); + return -3; } @@ -3293,6 +3297,8 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) if (data_size < MBUS_FRAME_ACK_BASE_SIZE) { + snprintf(error_str, sizeof(error_str), "data_size (%d) < MBUS_FRAME_ACK_BASE_SIZE (%d)", data_size, MBUS_FRAME_ACK_BASE_SIZE); + return -4; } @@ -3304,6 +3310,8 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) if (data_size < MBUS_FRAME_SHORT_BASE_SIZE) { + snprintf(error_str, sizeof(error_str), "data_size (%d) < MBUS_FRAME_SHORT_BASE_SIZE (%d)", data_size, MBUS_FRAME_SHORT_BASE_SIZE); + return -4; } @@ -3319,6 +3327,8 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) if (data_size < MBUS_FRAME_CONTROL_BASE_SIZE) { + snprintf(error_str, sizeof(error_str), "data_size (%d) < MBUS_FRAME_CONTROL_BASE_SIZE (%d)", data_size, MBUS_FRAME_CONTROL_BASE_SIZE); + return -4; } @@ -3340,6 +3350,8 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) if (data_size < frame->data_size + MBUS_FRAME_LONG_BASE_SIZE) { + snprintf(error_str, sizeof(error_str), "data_size (%d) < frame->data_size + MBUS_FRAME_LONG_BASE_SIZE (%d + %d = %d)", data_size, frame->data_size, MBUS_FRAME_LONG_BASE_SIZE, frame->data_size + MBUS_FRAME_LONG_BASE_SIZE); + return -4; } @@ -3363,6 +3375,8 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) return offset; default: + snprintf(error_str, sizeof(error_str), "frame->type (%d) in unknown.", frame->type); + return -5; } } @@ -3511,7 +3525,7 @@ mbus_frame_print(mbus_frame *frame) return -2; } - printf("%s: Dumping M-Bus frame [type %d, %d bytes]: ", __PRETTY_FUNCTION__, iter->type, len); + printf("%s: Dumping M-Bus frame [type %s, %d bytes]: ", __PRETTY_FUNCTION__, mbus_frame_type_print(iter->type), len); for (i = 0; i < len; i++) { printf("%.2X ", data_buff[i]); @@ -3522,6 +3536,43 @@ mbus_frame_print(mbus_frame *frame) return 0; } +//------------------------------------------------------------------------------ +/// Return a string containing the frame type +//------------------------------------------------------------------------------ +const char * +mbus_frame_type_print(const int type) +{ + static char buff[128]; + + switch (type) + { + case MBUS_FRAME_TYPE_ANY: + snprintf(buff, sizeof(buff), "Any"); + break; + + case MBUS_FRAME_TYPE_ACK: + snprintf(buff, sizeof(buff), "Ack"); + break; + + case MBUS_FRAME_TYPE_SHORT: + snprintf(buff, sizeof(buff), "Short"); + break; + + case MBUS_FRAME_TYPE_CONTROL: + snprintf(buff, sizeof(buff), "Control"); + break; + + case MBUS_FRAME_TYPE_LONG: + snprintf(buff, sizeof(buff), "Long"); + break; + + default: + snprintf(buff, sizeof(buff), "unknown"); + } + + return buff; +} + //------------------------------------------------------------------------------ /// /// Print the data part of a frame. @@ -3649,6 +3700,8 @@ mbus_data_variable_print(mbus_data_variable *data) printf("\n"); } + + return 0; } return -1; @@ -3689,6 +3742,8 @@ mbus_data_fixed_print(mbus_data_fixed *data) mbus_data_int_decode(data->cnt2_val, 4, &val); printf("%s: Counter2 = %d\n", __PRETTY_FUNCTION__, val); } + + return 0; } return -1; @@ -3724,7 +3779,7 @@ mbus_data_error_print(int error) { printf("%s: Error = %d\n", __PRETTY_FUNCTION__, error); - return -1; + return 0; } //------------------------------------------------------------------------------ diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h index 60b7424b..323e5c58 100755 --- a/mbus/mbus-protocol.h +++ b/mbus/mbus-protocol.h @@ -584,6 +584,7 @@ char *mbus_frame_xml(mbus_frame *frame); // Debug/dump // int mbus_frame_print(mbus_frame *frame); +const char * mbus_frame_type_print(const int type); int mbus_frame_data_print(mbus_frame_data *data); int mbus_data_fixed_print(mbus_data_fixed *data); int mbus_data_error_print(int error);