#include <stdio.h>
#include <string.h>
#include "ndl.h"

ndl_hdr_t empty_pkt; // some sort of empty packet to send?

ndl_hdr_t  *slave(ndl_hdr_t *pkt, ndl_hdr_t *nexttosend) {
    ndl_hdr_t *response;
    
    switch (s_state) {
        case S_LISTEN:
            if (pkt->poll) { /* POLLED */
                puts("slave: polled");
                if (slave_rx_buf_pos > 0) { // data available
                    if (slave_rx_buf_pos == 1) {
                        puts("1: txack, data");
                       
                        response = nexttosend;
                        set_ndl_ctl(response,ACK);
                        
                        s_state = S_WAIT;
                    }
                    else if (slave_rx_buf_pos > 1) {
                        puts("2: txack, data, mtp");

                        response = nexttosend;
                        set_ndl_ctl(response,ACK | MTP);
                        
                        s_state = S_WAIT;
                    }
                }
                else {
                    puts("slave: sending ACK, no data");

                    response = &empty_pkt;
                    set_ndl_ctl(response,ACK);

                    puts("\twaiting for ACK");
                    s_state = S_WAIT;
                }
            }
            else if (pkt->poll == 0) { // RECEIVE DATA
                printf("slave: received %02X, \n\ttransmitting ACK \r\n",pkt->data);

                response = &empty_pkt;
                set_ndl_ctl(response,ACK);
            
                s_state = S_LISTEN;
            }
            break;
            
        case S_WAIT:
            if (pkt->ack && pkt->poll) {
                puts("5: goto pseudo state POLLED");
            }
            else if (pkt->ack) {
                s_state = S_LISTEN;
            }
            else if (!pkt->ack) {
                puts("6: re-tx frame, reset timer");
            }
            // else if timeout
            // don't remove data, reset timer
            break;
    }
    //printf("slave state %1d\r\n",s_state);

    return response;
}

void master(ndl_hdr_t *pkt, int action) {
    //ndl_hdr_t pkt;
    
    switch (m_state) {
        case M_IDLE:
            if (action == SEND) {
                    // form packet
                    puts("master: sending packet");
                    
                    set_ndl_ctl(pkt, 0);
                    // put in send buffer
                    memcpy(&master_tx_buf[0], pkt, sizeof(pkt));
                   
                    puts("\twaiting for ACK");
                    m_state = M_WAIT_SEND;
            } 
            else if (action == RECV) {
            }
            break;
    
        case M_WAIT_SEND:
            if (!pkt->ack) {
                //master_tx(data);
                // else if timeout
            } 
            else if (pkt->ack) {
                puts("master: got ACK");
                m_state = M_IDLE;
            }
            break;

        case M_WAIT_RECV:
            break;
    }
}
int main() {
    ndl_hdr_t masterpacket= {1,1,1,1,0x55};
    ndl_hdr_t slavepacket;

    slavepacket = *(master(&masterpacket,SEND));
    
    slavepacket = slave(&slavepacket,&slave_tx_buf[0]);
    
    //puts("slave sends");
    //print_packet(tmp);

    return 0;
}



