Skip to content

Commit

Permalink
Fix for off-by-one error, and datalog parse checking, to ensure that …
Browse files Browse the repository at this point in the history
…smaller logs don't get parsed with the wrong parser
  • Loading branch information
malcom2073 committed Nov 29, 2013
1 parent 7158765 commit a9a35d6
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 14 deletions.
19 changes: 11 additions & 8 deletions plugins/freeems/datafield.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,27 +66,28 @@ DataField::DataField(QString shortname,QString description,int offset,int size,d
m_isFlags = isFlags;
m_bit = bit;
}
bool DataField::flagValue(QByteArray *payload)
bool DataField::flagValue(QByteArray *payload, bool *value)
{
if (!m_isFlags)
{
return false;
}
if (payload->size() > m_offset+m_size)
if (payload->size() >= m_offset+m_size)
{
unsigned int val = 0;
for (int i=0;i<m_size;i++)
{
val += ((unsigned char)payload->at(m_offset+i)) << (8*(m_size-(i+1)));
}
return (m_bit & val);
*value = (m_bit & val);
return true;
}
return false;
}

float DataField::getValue(QByteArray *payload,bool translatebeforescale)
bool DataField::getValue(QByteArray *payload,double *value,bool translatebeforescale)
{
if (payload->size() > m_offset+m_size)
if (payload->size() >= m_offset+m_size)
{
float val = 0;
for (int i=0;i<m_size;i++)
Expand All @@ -95,12 +96,14 @@ float DataField::getValue(QByteArray *payload,bool translatebeforescale)
}
if (translatebeforescale)
{
return (val + m_addoffset) * m_div;
*value = (val + m_addoffset) * m_div;
return true;
}
else
{
return (val / m_div) + m_addoffset;
*value = (val / m_div) + m_addoffset;
return true;
}
}
return 0;
return false;
}
4 changes: 2 additions & 2 deletions plugins/freeems/datafield.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ class DataField
public:
DataField();
DataField(QString shortname,QString description,int offset,int size,double div,double addoffset=0,double min=0,double max=0,bool isFlags=false,int bit=0);
float getValue(QByteArray *payload,bool translatebeforescale = false);
bool getValue(QByteArray *payload,double *value,bool translatebeforescale = false);
QString description() { return m_description; }
QString name() { return m_name; }
bool isFlag() { return m_isFlags; }
bool flagValue(QByteArray *payload);
bool flagValue(QByteArray *payload, bool *value);
int offset() { return m_offset; }
int size() { return m_size; }
private:
Expand Down
26 changes: 22 additions & 4 deletions plugins/freeems/fedatapacketdecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,31 @@ void FEDataPacketDecoder::decodePayload(QByteArray payload)
{
if (m_dataFieldList[i].isFlag())
{
bool value = m_dataFieldList[i].flagValue(&payload);
m_valueMap[m_dataFieldList[i].name()] = value;
bool value = false;
if (m_dataFieldList[i].flagValue(&payload,&value))
{
m_valueMap[m_dataFieldList[i].name()] = value;
}
else
{
//Invalid datalog packet.
int stopper = 1;
return;
}
}
else
{
double value = m_dataFieldList[i].getValue(&payload);
m_valueMap[m_dataFieldList[i].name()] = value;
double value = 0;
if (m_dataFieldList[i].getValue(&payload,&value))
{
m_valueMap[m_dataFieldList[i].name()] = value;
}
else
{
//Invalid datalog packet.
int stopper = 1;
return;
}
}
}
if (m_valueMap.contains("tempClock"))
Expand Down

0 comments on commit a9a35d6

Please sign in to comment.