#pragma once
#include <cstdint>

/**
 * @brief RXnBF PIN CONTROL AND STATUS REGISTER (ADDRESS: 0Ch)
 * 
 */
struct BFPCTRL {
    uint8_t B0BFM : 1;
    uint8_t B1BFM : 1;
    uint8_t B0BFE : 1;
    uint8_t B1BFE : 1;
    uint8_t B0BFS : 1;
    uint8_t B1BFS : 1;
    uint8_t : 2;
};

/**
 * @brief TXnRTS PIN CONTROL AND STATUS REGISTER
 * 
 */
struct TXRTSCTRL {
    uint8_t B0RTSM : 1;
    uint8_t B1RTSM : 1;
    uint8_t B2RTSM : 1;
    uint8_t B0RTS : 1;
    uint8_t B1RTS : 1;
    uint8_t B2RTS : 1;
    uint8_t : 2;
};

struct CANSTAT {
    uint8_t ICOD0 : ;
    uint8_t : 1;
    uint8_t OPMOD0 : 1;
    uint8_t OPMOD1 : 1;
    uint8_t OPMOD2 : 1;
    uint8_t : 1;
};

struct CANCTRL {
    uint8_t CLKPRE0 : 1;
    uint8_t CLKPRE1 : 1;
    uint8_t CLKEN : 1;
    uint8_t OSM : 1;
    uint8_t ABAT : 1;
    uint8_t REQOP0 : 1;
    uint8_t REQOP1 : 1;
    uint8_t REQOP2 : 1;
};

struct TEC {
    uint8_t TEC;
};

struct REC {
    uint8_t REC;
};

struct CNF3 {
    uint8_t PHSEG20 : 1;
    uint8_t PHSEG21 : 1;
    uint8_t PHSEG22 : 1;
    uint8_t : 3;
    uint8_t WAKFIL : 1;
    uint8_t SOF : 1;
};

struct CNF2 {
    uint8_t PRSEG0 : 1;
    uint8_t PRSEG1 : 1;
    uint8_t PRSEG2 : 1;
    uint8_t PHSEG10 : 1;
    uint8_t PHSEG11 : 1;
    uint8_t PHSEG12 : 1;
    uint8_t SAM : 1;
    uint8_t BTLMODE : 1;
};

struct CNF1 {
    uint8_t BRP0 : 1;
    uint8_t BRP1 : 1;
    uint8_t BRP2 : 1;
    uint8_t BRP3 : 1;
    uint8_t BRP4 : 1;
    uint8_t BRP5 : 1;
    uint8_t SJW0 : 1;
    uint8_t SJW1 : 1;
};

struct CANINTE {
    uint8_t RX0IE : 1;
    uint8_t RX1IE : 1;
    uint8_t TX0IE : 1;
    uint8_t TX1IE : 1;
    uint8_t TX2IE : 1;
    uint8_t ERRIE : 1;
    uint8_t WAKIE : 1;
    uint8_t MERRE : 1;
};

struct CANINTF {
    uint8_t RX0IF : 1;
    uint8_t RX1IF : 1;
    uint8_t TX0IF : 1;
    uint8_t TX1IF : 1;
    uint8_t TX2IF : 1;
    uint8_t ERRIF : 1;
    uint8_t WAKIF : 1;
    uint8_t MERRF : 1;
};

struct EFLG {
    uint8_t EWARN : 1;
    uint8_t RXWAR : 1;
    uint8_t TXWAR : 1;
    uint8_t RXEP : 1;
    uint8_t TXEP : 1;
    uint8_t TXBO : 1;
    uint8_t RX0OVR : 1;
    uint8_t RX1OVR : 1;
};

struct TXB0CTRL {
    uint8_t TXP0 : 1;
    uint8_t TXP1 : 1;
    uint8_t : 1;
    uint8_t TXREQ : 1;
    uint8_t TXERR : 1;
    uint8_t MLOA : 1;
    uint8_t ABTF : 1;
    uint8_t : 1;
};

struct TXB1CTRL {
    uint8_t TXP0 : 1;
    uint8_t TXP1 : 1;
    uint8_t : 1;
    uint8_t TXREQ : 1;
    uint8_t TXERR : 1;
    uint8_t MLOA : 1;
    uint8_t ABTF : 1;
    uint8_t : 1;
};

struct TXB2CTRL {
    uint8_t TXP0 : 1;
    uint8_t TXP1 : 1;
    uint8_t : 1;
    uint8_t TXREQ : 1;
    uint8_t TXERR : 1;
    uint8_t MLOA : 1;
    uint8_t ABTF : 1;
    uint8_t : 1;
};

struct RXB0CTRL {
    uint8_t FILHIT0 : 1;
    uint8_t BUKT1 : 1;
    uint8_t BUKT : 1;
    uint8_t RXRTR : 1;
    uint8_t : 1;
    uint8_t RXM0 : 1;
    uint8_t RXM1 : 1;
    uint8_t : 1;
};

struct RXB1CTRL {
    uint8_t FILHIT0 : 1;
    uint8_t FILHIT1 : 1;
    uint8_t FILHIT2 : 1;
    uint8_t RXRTR : 1;
    uint8_t : 1;
    uint8_t RXM0 : 1;
    uint8_t RXM1 : 1;
    uint8_t : 1;
};
