10 changed files with 278 additions and 16 deletions
@ -0,0 +1,49 @@ |
|||||
|
#include "BaseRegister.h" |
||||
|
|
||||
|
BaseRegister::BaseRegister(quint32 bar, quint32 offset, const UltraSoundDevice& usd) |
||||
|
{ |
||||
|
this->_bar = bar; |
||||
|
this->_offset = offset; |
||||
|
this->_usd = usd; |
||||
|
_isSync = false; |
||||
|
} |
||||
|
|
||||
|
/*************************************************************************************************/ |
||||
|
quint32 BaseRegister::read() |
||||
|
{ |
||||
|
auto readValue = _usd.readWord(_offset, _bar); |
||||
|
_isSync = true; |
||||
|
|
||||
|
for(auto i = 0; i < _fields.length(); i++) |
||||
|
{ |
||||
|
_fields[i].ExtractValue(readValue); |
||||
|
} |
||||
|
|
||||
|
return readValue; |
||||
|
} |
||||
|
|
||||
|
/*************************************************************************************************/ |
||||
|
void BaseRegister::write() |
||||
|
{ |
||||
|
_usd.writeWord(_offset, _bar, _value); |
||||
|
_isSync = false; |
||||
|
} |
||||
|
|
||||
|
/*************************************************************************************************/ |
||||
|
void BaseRegister::appendToList(const RegisterField& registerField) |
||||
|
{ |
||||
|
connect(®isterField, &RegisterField::fieldUpdated, this, &BaseRegister::fieldUpdated); |
||||
|
_fields.append(registerField); |
||||
|
} |
||||
|
|
||||
|
/*************************************************************************************************/ |
||||
|
void BaseRegister::fieldUpdated(quint32 value, quint32 clearMask) |
||||
|
{ |
||||
|
if(!_isSync) |
||||
|
{ |
||||
|
read(); |
||||
|
} |
||||
|
|
||||
|
auto temp = _readValue & clearMask; |
||||
|
temp |= value; |
||||
|
} |
@ -0,0 +1,36 @@ |
|||||
|
#ifndef BASEREGISTER_H |
||||
|
#define BASEREGISTER_H |
||||
|
|
||||
|
#include <QObject> |
||||
|
|
||||
|
#include "api.h" |
||||
|
#include "RegisterField.h" |
||||
|
|
||||
|
class BaseRegister : public QObject |
||||
|
{ |
||||
|
Q_OBJECT |
||||
|
|
||||
|
protected: |
||||
|
quint32 _bar; |
||||
|
quint32 _offset; |
||||
|
quint32 _value; |
||||
|
quint32 _readValue; |
||||
|
bool _isSync; |
||||
|
UltraSoundDevice _usd; |
||||
|
QList<RegisterField> _fields; |
||||
|
|
||||
|
void appendToList(const RegisterField& registerField); |
||||
|
|
||||
|
public: |
||||
|
explicit BaseRegister(quint32 _bar, quint32 _offset, const UltraSoundDevice& _usd); |
||||
|
|
||||
|
quint32 read(); |
||||
|
void write(); |
||||
|
|
||||
|
//uncrustify off
|
||||
|
public slots: |
||||
|
void fieldUpdated(quint32 _value, quint32 clearMask); |
||||
|
//uncrustify on
|
||||
|
}; |
||||
|
|
||||
|
#endif //BASEREGISTER_H
|
@ -0,0 +1,6 @@ |
|||||
|
#include "BaseRegisterRegion.h" |
||||
|
|
||||
|
BaseRegisterRegion::BaseRegisterRegion() |
||||
|
{ |
||||
|
|
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
#ifndef BASEREGISTERREGION_H |
||||
|
#define BASEREGISTERREGION_H |
||||
|
|
||||
|
#include "BaseRegister.h" |
||||
|
|
||||
|
class BaseRegisterRegion |
||||
|
{ |
||||
|
private: |
||||
|
QList<BaseRegister> _registers; |
||||
|
|
||||
|
public: |
||||
|
BaseRegisterRegion(); |
||||
|
|
||||
|
void writeAll(); |
||||
|
void readAll(); |
||||
|
void clearAll(); |
||||
|
}; |
||||
|
|
||||
|
#endif //BASEREGISTERREGION_H
|
@ -0,0 +1,79 @@ |
|||||
|
#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; |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
#ifndef REGISTERFIELD_H |
||||
|
#define REGISTERFIELD_H |
||||
|
|
||||
|
#include <QObject> |
||||
|
|
||||
|
class RegisterField : public QObject |
||||
|
{ |
||||
|
Q_OBJECT |
||||
|
|
||||
|
private: |
||||
|
quint32 _mask; |
||||
|
quint32 _value; |
||||
|
bool _isSigned; |
||||
|
quint32 getBitPosition(); |
||||
|
quint32 getBitLength(); |
||||
|
|
||||
|
public: |
||||
|
RegisterField(quint32 mask, bool isSigned); |
||||
|
void update(quint32 value); |
||||
|
quint32 getRawValue(); |
||||
|
void ExtractValue(quint32 value); |
||||
|
|
||||
|
signals: |
||||
|
void fieldUpdated(quint32 value, quint32 clearMask); |
||||
|
}; |
||||
|
|
||||
|
#endif //REGISTERFIELD_H
|
@ -0,0 +1,14 @@ |
|||||
|
#include "TestRegister.h" |
||||
|
|
||||
|
TestRegister::TestRegister(quint32 offset, quint32 bar, const UltraSoundDevice& usd) : BaseRegister( |
||||
|
offset, |
||||
|
bar, |
||||
|
usd), |
||||
|
fiedl1(0x000000FF, false), |
||||
|
fiedl2(0x0000FF00, false), |
||||
|
fiedl3(0xFFFF0000, false) |
||||
|
{ |
||||
|
appendToList(fiedl1); |
||||
|
appendToList(fiedl2); |
||||
|
appendToList(fiedl3); |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
#ifndef TESTREGISTER_H |
||||
|
#define TESTREGISTER_H |
||||
|
|
||||
|
#include "BaseRegister.h" |
||||
|
|
||||
|
class TestRegister : public BaseRegister |
||||
|
{ |
||||
|
public: |
||||
|
TestRegister(quint32 _offset, quint32 _bar, const UltraSoundDevice& _usd); |
||||
|
|
||||
|
RegisterField fiedl1; |
||||
|
RegisterField fiedl2; |
||||
|
RegisterField fiedl3; |
||||
|
}; |
||||
|
|
||||
|
#endif //TESTREGISTER_H
|
Loading…
Reference in new issue