diff --git a/CPP/register_modeling/example_project/driver/device.cpp b/CPP/register_modeling/example_project/driver/device.cpp index 06f4851..e9ebe90 100644 --- a/CPP/register_modeling/example_project/driver/device.cpp +++ b/CPP/register_modeling/example_project/driver/device.cpp @@ -47,4 +47,21 @@ void Device::doSomething() +} + +void Device::status() +{ + // imitating read hardware register + reg_motorStatus = 0xFF; + + if(reg_motorStatus.bits.POWER == Reg_MotorStatus::POWER::ON) { + std::cout << "Motor is Powered ON!" << std::endl; + } else { + std::cout << "Motor is Powered OFF!" << std::endl; + } + + // will throw error because this bitfield is set const! + //std::cout << "Motor is Powered ON!" << std::endl; + + std::cout << +reg_motorStatus.bits.POWER << 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 32f4689..2f9e1ea 100644 --- a/CPP/register_modeling/example_project/driver/device.hpp +++ b/CPP/register_modeling/example_project/driver/device.hpp @@ -13,6 +13,8 @@ class Device void doSomething(); + void status(); + private: // @@ -71,8 +73,39 @@ class Device void operator = (uint8_t v) {raw = v;} }; + union Reg_MotorStatus + { + struct POWER{ + typedef BitField<uint8_t,0,1> Bits; + enum{OFF = 0, ON = 1}; + }; + struct STATUS{ + typedef BitField<uint8_t, 2,3>Bits; + enum{STANDSTILL = 0, + ACCELERATING_CW = 1, + DEACCELERATING_CW = 2, + ACCELERATING_CCW = 3, + DEACCELERATING_CCW = 4, + CONSTANT_SPEED = 5, + BLOCKED = 6}; + }; + union Bits + { + // is set const because it only used for status indication + const Reg_MotorStatus::POWER::Bits POWER; + const Reg_MotorStatus::STATUS::Bits STATUS; + }bits; + uint8_t raw; + + Reg_MotorStatus(uint8_t v = 0x00) : raw(v) {} + operator uint8_t() {return raw;} + void operator = (uint8_t v) {raw = v;} + }; + Reg_Control reg_control; + Reg_MotorStatus reg_motorStatus; + }; diff --git a/CPP/register_modeling/example_project/main.cpp b/CPP/register_modeling/example_project/main.cpp index ab862ce..ea510f1 100644 --- a/CPP/register_modeling/example_project/main.cpp +++ b/CPP/register_modeling/example_project/main.cpp @@ -47,7 +47,9 @@ int main(void) Device dev; - dev.doSomething(); + //dev.doSomething(); + + dev.status(); //dev.doSomething(); diff --git a/CPP/register_modeling/example_project/runtest b/CPP/register_modeling/example_project/runtest index 869ff84..107aae9 100755 Binary files a/CPP/register_modeling/example_project/runtest and b/CPP/register_modeling/example_project/runtest differ