#include "device.hpp"
#include <iostream>

Device::Device() :
    reg_control(0x00)
{

    std::cout << "Device::Device()" << std::endl;
    std::cout << +reg_control.raw << std::endl;

    reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF;
    reg_control.bits.SPEED = Reg_Control::SPEED::STAND_STILL;

    std::cout << "POWER = " << +reg_control.bits.POWER_DEV <<  std::endl;
    std::cout << "SPEED = " <<+reg_control.bits.SPEED <<  std::endl;
}

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::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 << +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;



    
}

void Device::status()
{
    // imitating read hardware register (for example reading from device via SPI or i2c)
    reg_motorStatus = 0xFE;

    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!
    //reg_motorStatus.bits.STATUS = Reg_MotorStatus::STATUS::STANDSTILL;

    std::cout << +reg_motorStatus.bits.POWER << std::endl;

    std::cout << "Motor Status : " << +reg_motorStatus.bits.STATUS << std::endl;
}