/*
 * DataType.h
 *
 *      Author: Aleksey Gerasimenko
 *      gerasimenko.aleksey.n@gmail.com
 */

#include <math.h>
#include <stdint.h>

#ifndef SYSTEM_DATATYPE_H_
#define SYSTEM_DATATYPE_H_



typedef void (*pGPIO_FUNCTION)();
typedef void (*pGPIO_FUNCTION_UINT)(uint16_t& data);



struct Register16BitField
{
    uint16_t b00: 1;
    uint16_t b01: 1;
    uint16_t b02: 1;
    uint16_t b03: 1;
    uint16_t b04: 1;
    uint16_t b05: 1;
    uint16_t b06: 1;
    uint16_t b07: 1;
    uint16_t b08: 1;
    uint16_t b09: 1;
    uint16_t b10: 1;
    uint16_t b11: 1;
    uint16_t b12: 1;
    uint16_t b13: 1;
    uint16_t b14: 1;
    uint16_t b15: 1;
};//Register16BitField

struct Register16ByteField
{
    uint16_t low :8;
    uint16_t high :8;
};//Register16ByteField

struct Register16WordField
{
    uint16_t wL :16;
};//Register16WordField


union Register16
{
    uint16_t            all;
    Register16BitField  bit;
    Register16ByteField byte;
};//Register16


struct Register32BitField
{
    uint16_t b00: 1;
    uint16_t b01: 1;
    uint16_t b02: 1;
    uint16_t b03: 1;
    uint16_t b04: 1;
    uint16_t b05: 1;
    uint16_t b06: 1;
    uint16_t b07: 1;
    uint16_t b08: 1;
    uint16_t b09: 1;
    uint16_t b10: 1;
    uint16_t b11: 1;
    uint16_t b12: 1;
    uint16_t b13: 1;
    uint16_t b14: 1;
    uint16_t b15: 1;
    uint16_t b16: 1;
    uint16_t b17: 1;
    uint16_t b18: 1;
    uint16_t b19: 1;
    uint16_t b20: 1;
    uint16_t b21: 1;
    uint16_t b22: 1;
    uint16_t b23: 1;
    uint16_t b24: 1;
    uint16_t b25: 1;
    uint16_t b26: 1;
    uint16_t b27: 1;
    uint16_t b28: 1;
    uint16_t b29: 1;
    uint16_t b30: 1;
    uint16_t b31: 1;
};//Register32BitField


struct Register32ByteField
{
    uint16_t bt0 :8;
    uint16_t bt1 :8;
    uint16_t bt2 :8;
    uint16_t bt3 :8;
};//Register32ByteField

struct Register32WordField
{
    uint16_t wL :16;
    uint16_t wH :16;
};//Register32WordField


union UIntRegister32
{
    uint32_t            all;
    Register32BitField  bit;
    Register32ByteField byte;
    Register32WordField word;
};//UIntRegister32



struct BoolRegisterBitField
{
    uint16_t    b0 :1;
};//BoolRegisterBitField

union BoolRegister
{
    uint16_t        all;
    BoolRegisterBitField boolbit;
    BoolRegister():
        all(0)
    {}
};//BoolRegister


struct AnalogFaultRegister16BitField
{
    uint16_t a0: 1;
    uint16_t a1: 1;
    uint16_t a2: 1;
};//AnalogFaultRegister16BitField

union AnalogFaultRegister
{
    uint16_t all;
    AnalogFaultRegister16BitField bit;
    AnalogFaultRegister():
        all(0)
    {}
};//AnalogFaultRegister


struct HardFaultRegister16BitField
{
    uint16_t h0: 1;
    uint16_t h1: 1;
    uint16_t h2: 1;
};//HardFaultRegister16BitField

union HardFaultRegister
{
    uint16_t all;
    HardFaultRegister16BitField bit;
    HardFaultRegister():
        all(0)
    {}
};//HardFaultRegister




#endif /* SYSTEM_DATATYPE_H_ */