diff --git a/CPP/register_modeling/example_project/driver/device.cpp b/CPP/register_modeling/example_project/driver/device.cpp index f160b78..06f4851 100644 --- a/CPP/register_modeling/example_project/driver/device.cpp +++ b/CPP/register_modeling/example_project/driver/device.cpp @@ -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,14 +20,31 @@ 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; } 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; + + + + } \ No newline at end of file diff --git a/CPP/register_modeling/example_project/driver/device.hpp b/CPP/register_modeling/example_project/driver/device.hpp index 08efb7c..32f4689 100644 --- a/CPP/register_modeling/example_project/driver/device.hpp +++ b/CPP/register_modeling/example_project/driver/device.hpp @@ -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; diff --git a/CPP/register_modeling/example_project/main.cpp b/CPP/register_modeling/example_project/main.cpp index 54a3903..ab862ce 100644 --- a/CPP/register_modeling/example_project/main.cpp +++ b/CPP/register_modeling/example_project/main.cpp @@ -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(); diff --git a/CPP/register_modeling/example_project/runtest b/CPP/register_modeling/example_project/runtest index e21106f..869ff84 100755 Binary files a/CPP/register_modeling/example_project/runtest and b/CPP/register_modeling/example_project/runtest differ diff --git a/CPP/register_modeling/example_project/utils/BitField.hpp b/CPP/register_modeling/example_project/utils/BitField.hpp index aef84a6..7b36c16 100644 --- a/CPP/register_modeling/example_project/utils/BitField.hpp +++ b/CPP/register_modeling/example_project/utils/BitField.hpp @@ -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: diff --git a/CPP/register_modeling/portable_bitfields/BitField.h b/CPP/register_modeling/portable_bitfields/BitField.h index 0d0e588..a826b6c 100644 --- a/CPP/register_modeling/portable_bitfields/BitField.h +++ b/CPP/register_modeling/portable_bitfields/BitField.h @@ -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: