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.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF;
reg_control.bits.SPEED = Reg_Control::SPEED::STAND_STILL; 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() void Device::doSomething()
@ -19,14 +20,31 @@ void Device::doSomething()
std::cout << "Device::doSomething()" << std::endl; std::cout << "Device::doSomething()" << std::endl;
reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON; 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){ if(reg_control.bits.POWER_DEV == Reg_Control::POWER_DEV::TURN_ON){
std::cout << "device turned on!" << std::endl; std::cout << "device turned on!" << std::endl;
} }
std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl; std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl;
std::cout << "SPEED = " <<+reg_control.bits.SPEED << 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; uint8_t raw;
// union Ctor with default value set to 0x00 // union Ctor with default value set to 0x00
Reg_Control(uint8_t v = 0x00) : raw(v) {} 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; Reg_Control reg_control;

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

@ -47,21 +47,9 @@ struct BitField
*/ */
BitField& operator =(T v) BitField& operator =(T v)
{ {
// use bit band alias if system permits
// this step can be optimised for systems that support bitbandalias _raw = ((v & ((1ULL << SIZE)-1)) << START) | (_raw & ~(((1ULL << SIZE)-1) << START));
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) ;
return *this; return *this;
#endif
} }
/** /**
@ -71,7 +59,7 @@ struct BitField
*/ */
operator T() const operator T() const
{ {
return _raw >> START; return (_raw >> START) & ((1ULL << SIZE) - 1);
} }
/** /**
@ -81,7 +69,7 @@ struct BitField
*/ */
T operator ()() const T operator ()() const
{ {
return _raw; return (_raw >> START) & ((1ULL << SIZE) - 1);
} }
private: private:

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

Loading…
Cancel
Save