/************************ HEADERS ****************************************/
#include "task.h"
#include "asf.h"
#include <asf.h>
#include "sio2host.h"

#if defined(ENABLE_NETWORK_FREEZER)
#include "pdsDataServer.h"
#include "wlPdsTaskManager.h"
#endif

#if ((BOARD == SAMR30_XPLAINED_PRO) || (BOARD == SAMR21_XPLAINED_PRO))
#include "edbg-eui.h"
#endif

/************************** DEFINITIONS **********************************/
#if (BOARD == SAMR30_MODULE_XPLAINED_PRO)
#define NVM_UID_ADDRESS   ((volatile uint16_t *)(0x0080400AU))
#endif

// location found indicates that the other rover found an object
#define LOCATION_FOUND (1)


/************************** PROTOTYPES **********************************/
void ReadMacAddress(void);
void init_spi(SercomSpi spi);
unsigned char write_spi(SercomSpi spi, unsigned char val);

int main ( void )
{
    bool freezer_enable = false;
    irq_initialize_vectors();


   system_init();
   delay_init();


    cpu_irq_enable();

#if defined (ENABLE_CONSOLE)
    sio2host_init();
#endif

    // Read the MAC address from either flash or EDBG
    ReadMacAddress();

    // Initialize system Timer
    SYS_TimerInit();

    // Demo Start Message
    DemoOutput_Greeting();



#if defined(ENABLE_NETWORK_FREEZER)
    SYS_TimerInit();
    nvm_init(INT_FLASH);
    PDS_Init();
    demo_output_freezer_options();
    // User Selection to commission a network or use Freezer
    freezer_enable = freezer_feature();
#endif

    // Commission the network
    Initialize_Demo(freezer_enable);
    
	init_spi(SERCOM1->SPI); // our pic is connected to SPI 1
	
    while(1)
    {
        Run_Demo();
    }
}

/*********************************************************************
* Function:         void ReadMacAddress()
*
* PreCondition:     none
*
* Input:            none
*
* Output:            Reads MAC Address from MAC Address EEPROM
*
* Side Effects:        none
*
* Overview:            Uses the MAC Address from the EEPROM for addressing
*
* Note:
**********************************************************************/
void ReadMacAddress(void)
{
   uint8_t i = 0, j = 0;
   for (i = 0; i < 8; i += 2, j++)
   {
     myLongAddress[i] = (NVM_UID_ADDRESS[j] & 0xFF);
     myLongAddress[i + 1] = (NVM_UID_ADDRESS[j] >> 8);
   }

}

void init_spi(SercomSpi spi){
	//SercomSpi spi = SERCOM4; // sercom 4 controls transceiver?
	// initialize spi
	spi.CTRLA.bit.ENABLE = 1;
	spi.CTRLA.bit.MODE = 0x3; // master mode (0x02 for slave)
	spi.CTRLA.bit.CPHA = 1; // clock phase
	spi.CTRLA.bit.CPOL = 1; // clock polarity
	spi.CTRLA.bit.DORD = 0; // MSB first
	spi.CTRLB.bit.MSSEN = 1; // slave select
	spi.BAUD.bit.BAUD = 0x0F; // baud rate
	spi.CTRLB.bit.RXEN = 1; // enable sending
}

unsigned char write_spi(SercomSpi spi, unsigned char val){
	spi.CTRLB.bit.MSSEN = 0;
	spi.DATA.bit.DATA = val;
	while(!spi.INTFLAG.bit.DRE);
	nop();
	return spi.DATA.bit.DATA;
}
