working example -> tested on shell C++

master
edwin 4 years ago
parent 1a5cf76def
commit 1ff6863dd5

@ -34,22 +34,17 @@ struct BitField
BitField& operator =(T v) BitField& operator =(T v)
{ {
/* #if 0
// this step can be optimised for systems that support bitbandalias _raw = ((v & ((1ULL << SIZE)-1)) << START);
T mask = ((1ULL << SIZE)-1) << START;
_raw &= ~mask;
_raw |= ((v & ((1ULL << SIZE)-1)) << START);
return *this; return *this;
*/ #else
//_raw & ~(((1ULL << SIZE)-1) << START);
// use bit band alias if system permits
//#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) | (_raw & ~(((1ULL << SIZE)-1) << START)); _raw = ((v & ((1ULL << SIZE)-1)) << START) | (_raw & ~(((1ULL << SIZE)-1) << START));
return *this; return *this;
//#endif //#endif
#endif
} }
/** /**
@ -77,29 +72,29 @@ struct BitField
}; };
union Reg_Control union Reg_Control
{ {
// bit 4 // bit 4
struct POWER_DEV{ struct POWER_DEV{
typedef BitField<uint8_t, 4, 1> Bits; typedef BitField<uint8_t, 7, 1> Bits;
enum{TURN_OFF = 0, TURN_ON = 1}; enum{TURN_OFF = 0, TURN_ON = 1};
}; };
// bits 2-3 // bits 2-3
struct SPEED{ struct SPEED{
typedef BitField<uint8_t, 2, 2> Bits; typedef BitField<uint8_t, 0, 2> Bits;
enum{STAND_STILL = 0, enum{STAND_STILL = 0,
SLOW = 1, SLOW = 1,
NORMAL = 2, NORMAL = 2,
FAST = 3}; FAST = 3};
}; };
struct Bits{ union Bits{
Reg_Control::POWER_DEV::Bits POWER_DEV; Reg_Control::POWER_DEV::Bits POWER_DEV;
Reg_Control::SPEED::Bits SPEED; Reg_Control::SPEED::Bits SPEED;
} bits; } bits;
// raw value. all bitfields will be "unified" here ;) // raw value. all bitfields will be "unified" here ;)
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) {}
}; };
@ -107,15 +102,23 @@ int main()
{ {
Reg_Control reg; Reg_Control reg;
reg.bits.SPEED = Reg_Control::SPEED::FAST; //reg.bits.SPEED = Reg_Control::SPEED::FAST;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON; reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON;
std::cout << +reg.raw << std::endl; std::cout << +reg.raw << std::endl;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF; reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF;
std::cout << +reg.raw << std::endl;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON;
reg.bits.SPEED = Reg_Control::SPEED::SLOW; reg.bits.SPEED = Reg_Control::SPEED::SLOW;
std::cout << +reg.raw << std::endl;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF;
reg.bits.SPEED = Reg_Control::SPEED::FAST;
std::cout << +reg.raw << std::endl; std::cout << +reg.raw << std::endl;

Loading…
Cancel
Save