
typedef struct ndl_hdr_s {
    unsigned char ack : 1;
    unsigned char poll : 1;
    unsigned char mtp : 1;
    unsigned char length : 5;
    char data;
} ndl_hdr_t;
/*              SLAVE               */

#define S_LISTEN  1
#define S_POLLED  2 //pseudo state
#define S_WAIT  3

int s_state = S_LISTEN;

ndl_hdr_t slave_tx_buf[5];
int slave_tx_buf_pos = 0;

ndl_hdr_t slave_rx_buf[5];
int slave_rx_buf_pos = 1;
/*              MASTER                  */

#define M_IDLE 1
#define M_WAIT_SEND 2
#define M_WAIT_RECV 3

#define MASTER_SEND 1
#define MASTER_RECV 2

#define SEND 3
#define RECV 4
int m_state = M_IDLE; // master state

/* master buffers */
ndl_hdr_t master_tx_buf[5];
int master_tx_buf_pos = 0;

ndl_hdr_t master_rx_buf[5];
int master_rx_buf_pos = 0;

void print_packet(ndl_hdr_t *pkt) {
    printf("ACK %01d POLL %01d MTP %01d LENGTH %02d DATA %02x\r\n",(*pkt).ack, (*pkt).poll, (*pkt).mtp, (*pkt).length, (*pkt).data);
}

#define ACK (1 << 1)
#define MTP (1 << 2)
#define POLL (1 << 3)

void set_ndl_ctl(ndl_hdr_t *pkt,int flag) {
    pkt->ack = flag & ACK ? 1 : 0;
    pkt->mtp = flag & MTP ? 1 : 0;
    pkt->poll = flag & POLL ? 1 : 0;

    pkt->length = 0;
}

void rs485_master_to_slave() {
    memcpy(&slave_rx_buf[0], &master_tx_buf[0],sizeof(&master_tx_buf[0]));
}

void rs485_slave_to_master() {
    memcpy(&master_rx_buf[0], &slave_tx_buf[0],sizeof(&master_tx_buf[0]));
}




