You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

79 lines
1.6 KiB

#include "RegisterField.h"
/*************************************************************************************************/
quint32 RegisterField::getBitPosition()
{
auto bitPosition = 0U;
auto mask = _mask;
while(true)
{
if((mask & 0x01) == 0x01)
{
break;
}
bitPosition++;
mask = mask >> 1;
}
return bitPosition;
}
/*************************************************************************************************/
quint32 RegisterField::getBitLength()
{
auto bitlength = 0U;
auto mask = _mask >> getBitPosition();
while(true)
{
if((mask & 0x01) != 0x01)
{
break;
}
bitlength++;
mask = mask >> 1;
}
return bitlength;
}
/*************************************************************************************************/
RegisterField::RegisterField(quint32 mask, bool isSigned)
{
_mask = mask;
_isSigned = isSigned;
}
/*************************************************************************************************/
void RegisterField::update(quint32 value)
{
if(_value == value)
{
return;
}
_value = value;
quint32 temp = 0;
temp = (_value << getBitPosition()) & _mask;
emit fieldUpdated(_value, ~_mask);
}
/*************************************************************************************************/
quint32 RegisterField::getRawValue()
{
return _value;
}
/*************************************************************************************************/
void RegisterField::ExtractValue(quint32 value)
{
auto temp = (value >> getBitPosition()) & (_mask >> getBitPosition());
if(_isSigned && ((temp >> (getBitLength() - 1)) & 0x01) == 0x01)
{
temp |= (~(_mask >> getBitPosition()));
}
_value = temp;
}