|
|
|
@ -34,22 +34,17 @@ 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);
|
|
|
|
|
#if 0
|
|
|
|
|
_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
|
|
|
|
|
#else
|
|
|
|
|
//_raw & ~(((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
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -77,29 +72,29 @@ struct BitField
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
union Reg_Control
|
|
|
|
|
{
|
|
|
|
|
// bit 4
|
|
|
|
|
struct POWER_DEV{
|
|
|
|
|
typedef BitField<uint8_t, 4, 1> Bits;
|
|
|
|
|
enum{TURN_OFF = 0, TURN_ON = 1};
|
|
|
|
|
};
|
|
|
|
|
// bits 2-3
|
|
|
|
|
struct SPEED{
|
|
|
|
|
typedef BitField<uint8_t, 2, 2> Bits;
|
|
|
|
|
enum{STAND_STILL = 0,
|
|
|
|
|
SLOW = 1,
|
|
|
|
|
NORMAL = 2,
|
|
|
|
|
FAST = 3};
|
|
|
|
|
};
|
|
|
|
|
struct Bits{
|
|
|
|
|
Reg_Control::POWER_DEV::Bits POWER_DEV;
|
|
|
|
|
Reg_Control::SPEED::Bits SPEED;
|
|
|
|
|
} bits;
|
|
|
|
|
// raw value. all bitfields will be "unified" here ;)
|
|
|
|
|
uint8_t raw;
|
|
|
|
|
// union Ctor with default value set to 0x00
|
|
|
|
|
Reg_Control(uint8_t v = 0x00) : raw(v) {}
|
|
|
|
|
};
|
|
|
|
|
{
|
|
|
|
|
// bit 4
|
|
|
|
|
struct POWER_DEV{
|
|
|
|
|
typedef BitField<uint8_t, 7, 1> Bits;
|
|
|
|
|
enum{TURN_OFF = 0, TURN_ON = 1};
|
|
|
|
|
};
|
|
|
|
|
// bits 2-3
|
|
|
|
|
struct SPEED{
|
|
|
|
|
typedef BitField<uint8_t, 0, 2> Bits;
|
|
|
|
|
enum{STAND_STILL = 0,
|
|
|
|
|
SLOW = 1,
|
|
|
|
|
NORMAL = 2,
|
|
|
|
|
FAST = 3};
|
|
|
|
|
};
|
|
|
|
|
union Bits{
|
|
|
|
|
Reg_Control::POWER_DEV::Bits POWER_DEV;
|
|
|
|
|
Reg_Control::SPEED::Bits SPEED;
|
|
|
|
|
} bits;
|
|
|
|
|
// raw value. all bitfields will be "unified" here ;)
|
|
|
|
|
uint8_t raw;
|
|
|
|
|
// union Ctor with default value set to 0x00
|
|
|
|
|
Reg_Control(uint8_t v = 0x00) : raw(v) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -107,15 +102,23 @@ int main()
|
|
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << +reg.raw << std::endl;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|