/***************************************************************************//**
 *   @file   user.h
 *   @brief  Fichier entête des fonctions de l'application
 *   @author Kévin (Kevin.marchand@intelligence-electronique.com)
********************************************************************************
 * Copyright 2014(c) PLCD, Inc.
 *
 * Fonctions d'initialisation et de traitement des commandes.
 *
********************************************************************************
 *   SVN Revision: 1
*******************************************************************************/
#include "GenericTypeDefs.h"
#include "HardwareProfile.h"
#include "Include/TCPIPStack/TCPIP.h"
#include "usb/usb.h"

//! Définition du numéro d'esclave pour le PROFIBUS (peut être utilisé également pour la RS485)
#define SLAVE_ID 3

#if defined(EEPROM_CS_TRIS)
    void SaveAppConfig(const APP_CONFIG *AppConfig);
#else
    #define SaveAppConfig(a)
#endif

//! Définition de la structure pour validé la sauvegarde des données de la structure AppConfig dans la mémoire EEPROM
typedef struct
{
    //! Number of bytes saved in EEPROM (sizeof(APP_CONFIG))
    unsigned short wConfigurationLength;
    //! Checksum of the original AppConfig defaults as loaded from ROM (to detect when to wipe the EEPROM record of AppConfig due to a stack change, such as when switching from Ethernet to Wi-Fi)
    unsigned short wOriginalChecksum;
    //! Checksum of the current EEPROM data. This protects against using corrupt values if power failure occurs while writing them and helps detect coding errors in which some other task writes to the EEPROM in the AppConfig area.
    unsigned short wCurrentChecksum;
} NVM_VALIDATION_STRUCT;


// Définition des constante pour le calcul du CRC
#define POLYLEN 0x000F      //!< Length of polynomial-1
//!- CRC-16-CCITT    POLY=0x1021  =  X^12 + X^5 + 1
//!- CRC-16          POLY=0x8005  =  X^15 + X^2 + 1
#define POLY  0x8005        //!< Generator Polynomial

// Delay d'appel du driver ABCC Profibus
#define ABCC_DELAYMS    10

typedef struct _Trame{
   unsigned char length;
   BYTE data[CDC_DATA_OUT_EP_SIZE];
   struct _Trame *next;
}DATA_Trame;

#define MAX_USB_MESSAGE 3

/******************************************************************************/
/* User Function Prototypes                                                   */
/******************************************************************************/
//! Initialisation diverses
void InitApp(void);         

void BerkeleyTCPClient(void);
void BerkeleyTCPServer(void);
void BerkeleyUDPClient(void);

// Fonction de calcul du checksum
unsigned int CRC_ChecksumWord(int Number_of_words, unsigned char* data);
void CRC_Init(void);

//! Traitement du protocole de communication
void ProccessCmd(char * trame, int length, char * reponse);

//! Mise à zéro du compteur de milliseconds
void ResetCounterMillis(void);
//! Récupère la valeur du compteur de milliseconds
DWORD GetCounterMillis(void);

//! Met à jour les données en fonction des ADI
void UpdateB40ADI();

void USB_enqMsg(DATA_Trame * toEnqueue);
void putsUSB(char * buff, unsigned int length);
// USB Function Prototypes
void DeviceCDCInitialize();
void DeviceCDCTasks();