Added error frames for testing
This commit is contained in:
@ -1629,6 +1629,68 @@ mbus_vif_unit_lookup(u_char vif)
|
||||
return buff;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Lookup the error message
|
||||
//
|
||||
// See section 6.6 Codes for general application errors in the M-BUS spec
|
||||
//------------------------------------------------------------------------------
|
||||
const char *
|
||||
mbus_data_error_lookup(int error)
|
||||
{
|
||||
static char buff[256];
|
||||
|
||||
switch (error)
|
||||
{
|
||||
case MBUS_ERROR_DATA_UNSPECIFIED:
|
||||
snprintf(buff, sizeof(buff), "Unspecified error");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_UNIMPLEMENTED_CI:
|
||||
snprintf(buff, sizeof(buff), "Unimplemented CI-Field");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_BUFFER_TOO_LONG:
|
||||
snprintf(buff, sizeof(buff), "Buffer too long, truncated");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_TOO_MANY_RECORDS:
|
||||
snprintf(buff, sizeof(buff), "Too many records");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_PREMATURE_END:
|
||||
snprintf(buff, sizeof(buff), "Premature end of record");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_TOO_MANY_DIFES:
|
||||
snprintf(buff, sizeof(buff), "More than 10 DIFE´s");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_TOO_MANY_VIFES:
|
||||
snprintf(buff, sizeof(buff), "More than 10 VIFE´s");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_RESERVED:
|
||||
snprintf(buff, sizeof(buff), "Reserved");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_APPLICATION_BUSY:
|
||||
snprintf(buff, sizeof(buff), "Application busy");
|
||||
break;
|
||||
|
||||
case MBUS_ERROR_DATA_TOO_MANY_READOUTS:
|
||||
snprintf(buff, sizeof(buff), "Too many readouts");
|
||||
break;
|
||||
|
||||
default:
|
||||
snprintf(buff, sizeof(buff), "Unknown error (0x%.2X)", error);
|
||||
break;
|
||||
}
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Lookup the unit from the VIB (VIF or VIFE)
|
||||
//
|
||||
@ -2391,21 +2453,50 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data)
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Check the stype of the frame data (fixed or variable) and dispatch to the
|
||||
/// Check the stype of the frame data (error, fixed or variable) and dispatch to the
|
||||
/// corresponding parser function.
|
||||
//------------------------------------------------------------------------------
|
||||
int
|
||||
mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data)
|
||||
{
|
||||
if (frame && data && frame->data_size > 0)
|
||||
if (frame && data)
|
||||
{
|
||||
if (frame->control_information == MBUS_CONTROL_INFO_RESP_FIXED)
|
||||
if (frame->control_information == MBUS_CONTROL_INFO_ERROR_GENERAL)
|
||||
{
|
||||
data->type = MBUS_DATA_TYPE_ERROR;
|
||||
|
||||
if (frame->data_size > 0)
|
||||
{
|
||||
data->error = (int) frame->data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
data->error = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
else if (frame->control_information == MBUS_CONTROL_INFO_RESP_FIXED)
|
||||
{
|
||||
if (frame->data_size == 0)
|
||||
{
|
||||
snprintf(error_str, sizeof(error_str), "Got zero data_size.");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
data->type = MBUS_DATA_TYPE_FIXED;
|
||||
return mbus_data_fixed_parse(frame, &(data->data_fix));
|
||||
}
|
||||
else if (frame->control_information == MBUS_CONTROL_INFO_RESP_VARIABLE)
|
||||
{
|
||||
if (frame->data_size == 0)
|
||||
{
|
||||
snprintf(error_str, sizeof(error_str), "Got zero data_size.");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
data->type = MBUS_DATA_TYPE_VARIABLE;
|
||||
return mbus_data_variable_parse(frame, &(data->data_var));
|
||||
}
|
||||
@ -2417,7 +2508,7 @@ mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data)
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(error_str, sizeof(error_str), "Got null pointer to frame, data or zero data_size.");
|
||||
snprintf(error_str, sizeof(error_str), "Got null pointer to frame or data.");
|
||||
|
||||
return -1;
|
||||
}
|
||||
@ -2544,6 +2635,12 @@ mbus_frame_internal_pack(mbus_frame *frame, mbus_frame_data *frame_data)
|
||||
|
||||
switch (frame_data->type)
|
||||
{
|
||||
case MBUS_DATA_TYPE_ERROR:
|
||||
|
||||
frame->data[frame->data_size++] = (char) frame_data->error;
|
||||
|
||||
return -2;
|
||||
|
||||
case MBUS_DATA_TYPE_FIXED:
|
||||
|
||||
//
|
||||
@ -2681,6 +2778,11 @@ mbus_frame_data_print(mbus_frame_data *data)
|
||||
{
|
||||
if (data)
|
||||
{
|
||||
if (data->type == MBUS_DATA_TYPE_ERROR)
|
||||
{
|
||||
return mbus_data_error_print(data->error);
|
||||
}
|
||||
|
||||
if (data->type == MBUS_DATA_TYPE_FIXED)
|
||||
{
|
||||
return mbus_data_fixed_print(&(data->data_fix));
|
||||
@ -2815,6 +2917,14 @@ mbus_data_fixed_print(mbus_data_fixed *data)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
mbus_data_error_print(int error)
|
||||
{
|
||||
printf("%s: Error = %d\n", __PRETTY_FUNCTION__, error);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// XML RELATED FUNCTIONS
|
||||
@ -3020,6 +3130,30 @@ mbus_data_fixed_xml(mbus_data_fixed *data)
|
||||
return "";
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Generate XML representation of a general application error.
|
||||
//------------------------------------------------------------------------------
|
||||
char *
|
||||
mbus_data_error_xml(int error)
|
||||
{
|
||||
static char buff[512];
|
||||
char str_encoded[256];
|
||||
size_t len = 0;
|
||||
|
||||
len += snprintf(&buff[len], sizeof(buff) - len, "<MBusData>\n\n");
|
||||
|
||||
len += snprintf(&buff[len], sizeof(buff) - len, " <SlaveInformation>\n");
|
||||
|
||||
mbus_str_xml_encode(str_encoded, mbus_data_error_lookup(error), sizeof(str_encoded));
|
||||
len += snprintf(&buff[len], sizeof(buff) - len, " <Error>%s</Error>\n", str_encoded);
|
||||
|
||||
len += snprintf(&buff[len], sizeof(buff) - len, " </SlaveInformation>\n\n");
|
||||
|
||||
len += snprintf(&buff[len], sizeof(buff) - len, "</MBusData>\n");
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Return a string containing an XML representation of the M-BUS frame.
|
||||
//------------------------------------------------------------------------------
|
||||
@ -3028,6 +3162,11 @@ mbus_frame_data_xml(mbus_frame_data *data)
|
||||
{
|
||||
if (data)
|
||||
{
|
||||
if (data->type == MBUS_DATA_TYPE_ERROR)
|
||||
{
|
||||
return mbus_data_error_xml(data->error);
|
||||
}
|
||||
|
||||
if (data->type == MBUS_DATA_TYPE_FIXED)
|
||||
{
|
||||
return mbus_data_fixed_xml(&(data->data_fix));
|
||||
|
Reference in New Issue
Block a user