#ifndef ACVXbeePicUART_h
#define ACVXbeePicUART_h
#include "BITDEFS.h"
//#define UARTdebug


/*------------ UART Message Byte Indices -------------*/
//Xbee Received Message Byte Order, Data only
#define Byte_API 0
#define Byte_AddressHigh 1
#define Byte_AddressLow 2
#define Byte_MessageType 4 //needs to be masked with MessageTypeMask
#define Byte_Command 5

    //Teammate Finding
    #define Byte_Team 6

    //Atoll Reply
    #define Byte_Atoll 6
    #define Byte_Reply 7
    #define Byte_NewOwner 8

    //CVC Instruction
    #define Byte_Servos 6
    #define Byte_Motor0 7
    #define Byte_Motor1 8

//Xbee Status Message Byte Order
#define Byte_FrameID 1
#define Byte_Status 2


/*------------ SPI Message Byte Indices --------------*/
//SPI Received Message Byte Order
#define Byte_CardType 0
#define Byte_S1 1
#define Byte_S2 2
#define Byte_S3 3
#define Byte_SK1 4
#define Byte_SK2 5
#define Byte_SK3 6


/*------------------ Message Bytes -------------------*/
//Message Headers
#define Start_Atoll 0xAA
#define Start_Color 0xCC
#define Start_Xbee 0x7E
#define Start_Motor 0xB9

//Xbee APIs
#define API_Transmit 0x01
#define API_Status 0x89
#define API_Receive 0x81

//Xbee FrameIDs
#define FrameID_NoAck 0x00 //won't receive an Ack

//Xbee Adresses
#define Address_CVCHigh 0x20
#define Address_CVCLow 0x86
#define Address_AVCHigh 0x21
#define Address_AVCLow 0x86
#define Address_BroadcastHigh 0xFF
#define Address_BroadcastLow 0xFF

//Message Type
#define MessageTypeMask BIT1HI
#define MessageType_Direct 0x00
#define MessageType_Broadcast BIT1HI

//Xbee Options
#define Option_None 0x00

//Xbee Checksum
#define Checksum_Total 0xFF

//Xbee Transmit Statuses
#define Status_Success 0x00
#define Status_NoACK 0x01
#define Status_CCAFailure 0x02
#define Status_Purged 0x03

//Xbee Command Types
#define Command_Capture 0x66
#define Command_Reply 0x67
#define Command_FindTeam 0x89
#define Command_Announce 0xAB
#define Command_C2B 0xCD
#define Command_B2C 0xEF

//Atoll Numbers
#define Atoll_1 0x01
#define Atoll_2 0x02
#define Atoll_3 0x03
#define Atoll_4 0x04
#define Atoll_5 0x05
#define Atoll_Error 0x00 //for table lookup

//Team Colors
#define Team_Red 0xFE
#define Team_RedPending 0xFD
#define Team_Green 0x01
#define Team_GreenPending 0x02
#define Team_None 0x88
#define Team_Error 0x00 //for table lookup

//Atoll Capture Replies
#define Reply_Success 0xFF
#define Reply_Failure 0x00


/*------------- RFID Card Serial Numbers -------------*/
unsigned char ColorLookup[3][4] = {
   {Team_Red,   0x35, 0xD5, 0xEC},
   {Team_Green, 0x35, 0x9C, 0x5A},
   {Team_None,  0x32, 0x9E, 0x06} //Team_White
};

unsigned char AtollLookup[10][4] = {
    {Atoll_1, 0x5E, 0x6F, 0x47},
    {Atoll_1, 0x5F, 0x31, 0x66},
    {Atoll_2, 0x83, 0xCF, 0xC8},
    {Atoll_2, 0x83, 0xFC, 0xE0},
    {Atoll_3, 0x83, 0xC7, 0x36},
    {Atoll_3, 0x83, 0xDD, 0x31},
    {Atoll_4, 0x83, 0xE0, 0xF5},
    {Atoll_4, 0x83, 0xED, 0xF0},
    {Atoll_5, 0x84, 0x08, 0x5E},
    {Atoll_5, 0x84, 0x0C, 0x6A}
};


/*-------------- Servo Masks and Bytes ---------------*/
#define Servo_None  0b00000000
#define Servo_Green 0b00001000
#define Servo_Red   0b00000100
#define Motor_Stop 0x00
unsigned char TimeoutServos[2] = {Servo_Green, Servo_Red};


/*--------------- State Machine States ---------------*/
typedef enum {
	Transmit_Idle = 0,
	Transmit_XbeeInProgress,
    Transmit_MotorInProgress
} TransmitState_t;

typedef enum {
    Receive_Idle = 0,
    Receive_LengthHigh,
    Receive_LengthLow,
    Receive_Data,
    Receive_Checksum
} ReceiveState_t;

typedef enum {
    SPI_Idle = 0,
    SPI_Data
} SPIState_t;


/*----------------Function Prototypes ----------------*/
void InitTimer0(void);

/*------------- SPI Function Prototypes --------------*/
void InitSPI(void);
void UpdateSPI(void);

unsigned char CheckSPIMessageFlag(void); //1 for atoll, 2 for color
unsigned char ReadSPIMessage(unsigned char Index);

/*------------- UART Function Prototypes -------------*/
void InitUART(void);
void UpdateUART(void);

unsigned char CheckXbeeTransmitOK(void); //1 if ok to add to message
unsigned char CheckMotorTransmitOK(void);

unsigned char StartXbeeTransmission(unsigned char FrameID, unsigned char Address_High, unsigned char Address_Low);
unsigned char AddTransmissionData(unsigned char ByteToAdd);
unsigned char FinishXbeeTransmission(void);

unsigned char CreateMotorTransmission( unsigned char ServosByte, unsigned char Motor0Byte, unsigned char Motor1Byte);

unsigned char CheckReceiveMessageFlag(void);
unsigned char ReadXbeeMessage(unsigned char Index);


#endif