solved = problem + readout problems of bitfield

master
polymurph 4 years ago
parent 044a39062f
commit 86caa99e8d

@ -11,7 +11,8 @@ Device::Device() :
reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF;
reg_control.bits.SPEED = Reg_Control::SPEED::STAND_STILL;
std::cout << +reg_control.raw << std::endl;
std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl;
std::cout << "SPEED = " <<+reg_control.bits.SPEED << std::endl;
}
void Device::doSomething()
@ -19,7 +20,7 @@ void Device::doSomething()
std::cout << "Device::doSomething()" << std::endl;
reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON;
reg_control.bits.SPEED = Reg_Control::SPEED::NORMAL;
reg_control.bits.SPEED = Reg_Control::SPEED::FAST;
if(reg_control.bits.POWER_DEV == Reg_Control::POWER_DEV::TURN_ON){
std::cout << "device turned on!" << std::endl;
@ -28,5 +29,22 @@ void Device::doSomething()
std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl;
std::cout << "SPEED = " << +reg_control.bits.SPEED << std::endl;
std::cout << +reg_control.raw << std::endl;
std::cout << +reg_control << std::endl;
reg_control = 0;
std::cout << +reg_control << std::endl;
std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl;
std::cout << "SPEED = " << +reg_control.bits.SPEED << std::endl;
//reg_control.bits.SPEED = Reg_Control::SPEED::FAST;
reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON;
std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl;
std::cout << "SPEED = " << +reg_control.bits.SPEED << std::endl;
}

@ -65,6 +65,10 @@ class Device
uint8_t raw;
// union Ctor with default value set to 0x00
Reg_Control(uint8_t v = 0x00) : raw(v) {}
// raw value extraction of register
operator uint8_t() {return raw;}
// used for updating software immage of hardware register
void operator = (uint8_t v) {raw = v;}
};
Reg_Control reg_control;

@ -42,6 +42,9 @@ int main(void)
{
std::cout << "test" << std::endl;
//std::cout << std::hex << ((1ULL << 2)-1) << std::endl;
std::cout << 1ULL << std::endl;
Device dev;
dev.doSomething();

@ -47,21 +47,9 @@ struct BitField
*/
BitField& operator =(T v)
{
// this step can be optimised for systems that support bitbandalias
T mask = ((1ULL << SIZE)-1) << START;
_raw &= ~mask;
_raw |= ((v & ((1ULL << SIZE)-1)) << START);
return *this;
#ifdef old
//TODO: test = problem with |= instead of =
// mask creation for v : https://stackoverflow.com/questions/1392059/algorithm-to-generate-bit-mask
_raw |= ((v & ((1ULL << SIZE)-1)) << START) ;
// use bit band alias if system permits
_raw = ((v & ((1ULL << SIZE)-1)) << START) | (_raw & ~(((1ULL << SIZE)-1) << START));
return *this;
#endif
}
/**
@ -71,7 +59,7 @@ struct BitField
*/
operator T() const
{
return _raw >> START;
return (_raw >> START) & ((1ULL << SIZE) - 1);
}
/**
@ -81,7 +69,7 @@ struct BitField
*/
T operator ()() const
{
return _raw;
return (_raw >> START) & ((1ULL << SIZE) - 1);
}
private:

@ -57,8 +57,12 @@ struct BitField
*/
operator T() const
{
//return _raw >> START;
return (_raw & (((1ULL << SIZE)-1) >> START;
//return 0;
return 0;
//return (_raw >> START) & ((1ULL << SIZE)-1);
//return (_raw >> START) & ((1ULL << SIZE)-1);
//return (_raw & (((1ULL << SIZE)-1) << START)) >> START;
}
/**
@ -68,7 +72,10 @@ struct BitField
*/
T operator ()() const
{
return _raw;
//return _raw;
return 0;
//return (_raw >> START) & ((1ULL << SIZE)-1);
}
private:

Loading…
Cancel
Save