Add custom VIFE handling with a corrective factor (from Jakob

Skov-Pedersen)
This commit is contained in:
Stefan Wahren
2012-10-21 11:21:07 +02:00
parent 0c26bc17a7
commit bc2c85c378
2 changed files with 61 additions and 12 deletions

View File

@ -2104,6 +2104,13 @@ mbus_vib_unit_lookup(mbus_value_information_block *vib)
snprintf(buff, sizeof(buff), "%s", vib->custom_vif);
return buff;
}
else if (vib->vif == 0xFC && (vib->vife[0] & 0x78) == 0x70)
{
// custom VIF
n = (vib->vife[0] & 0x07);
snprintf(buff, sizeof(buff), "%s %s", mbus_unit_prefix(n-6), vib->custom_vif);
return buff;
}
return mbus_vif_unit_lookup(vib->vif); // no extention, use VIF
}
@ -2686,21 +2693,30 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data)
// read and parse VIB (= VIF + VIFE)
// VIF
record->drh.vib.vif = frame->data[i];
if (record->drh.vib.vif == 0x7C)
record->drh.vib.vif = frame->data[i++];
if ((record->drh.vib.vif & 0x7F) == 0x7C)
{
// variable length VIF in ASCII format
int var_vif_len;
i++;
var_vif_len = frame->data[i++];
if (i + var_vif_len > frame->data_size)
{
mbus_data_record_free(record);
return -1;
}
mbus_data_str_decode(record->drh.vib.custom_vif, &(frame->data[i]), var_vif_len);
i += var_vif_len;
}
else
// VIFE
record->drh.vib.nvife = 0;
if (record->drh.vib.vif & MBUS_DIB_VIF_EXTENSION_BIT)
{
// VIFE
record->drh.vib.nvife = 0;
record->drh.vib.vife[0] = frame->data[i];
record->drh.vib.nvife++;
while (frame->data[i] & MBUS_DIB_VIF_EXTENSION_BIT &&
record->drh.vib.nvife < NITEMS(record->drh.vib.vife))
{
@ -2710,7 +2726,7 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data)
record->drh.vib.nvife++;
i++;
}
i++;
i++;
}
// re-calculate data length, if of variable length type