Version:0.9 StartHTML:0000000105 EndHTML:0000281394 StartFragment:0000001578 EndFragment:0000281378 C:\_MikroC\_MesProjets_MikroC\_18F87J50_ESP8266_Server\18F87J50_ESP8266_server_160523.c
#define Version "160513"
// rajout Nb echanges OK
// test SEND OK plutot que le STATUS=3

#define Version "160513"

// rajout drapeau_first_run pour validation Pourcent seulement
// apres 10 boucles programme
// remplace Byte CPT par  float Pourcentage de connection
//taux > 95%

//#define Version "160510"
// add delay 100ms apres ecriture UART1 , avant envoi sur UART2
// SANS Memory manager

//#define Version "160509"
// PB calcul taille webpage
// usage malloc ????
// voir   WiFI3_Serveur_UART2_UART1_LCD_I2C_Malloc_Test.c
// usage


//#define Version "160506"
// doublé taille buffer1 et buffer2
// envoi WebPage coupée en 2 ..car  pb si > 256 cars

//#define Version "160505"
// remis UART2 à 19200 bauds  (was 9600
//#define Version "160504"
// rajout  gestion perte connection STATUS <> 3
//define Version "160502"

// ok mais saut de ligne sur page web ???

//#define Version "160429"
// rajout terminal HID
#define Projet  "WiFI3_Serveur_18F87J50_UART1_2_LCD_I2C2_Mai_2016.mcppi"
#define Source "WiFI3_Serveur_UART2_UART1_LCD_I2C_HID_mikrobus1"
// Tools  -> Options -> cocher Case sensitive
// WiFI3_click_18F87J50_UART1_2_LCD_I2C2.hex

#define  Nom_Reseau_Wifi "ON_Air"
#define  Mot_de_Passe ""
#define test_Page_HTML
#define With_LCD2119
#define USE_I2C2
#define LCD2119_ADR 0x74     // LCD 2119 2x16 car  OK avec alim 3,3V
//#define With_HID
#define With_UART

//#define Version "160427"
// corrigé bug strrchr(buffer1, "x") au lieu de strrchr((buffer2,'*')

//#define Version "06 Avril 2016"
// test web page
//#define Version "05 Avril 2016"
// test avec Telnet (fenetre dos) et port 23)   192.168.0.108:23
// on ne peut pas modifier le timeout CIPST0 ?

//#define Version "03 Avril 2016"
// test avec On_air + cle WEP !!!
// p=Send_Cde_Test_response("AT+CWJAP=\"On_Air\",\"ACCA9135F318DBFBE476D3D95D\",\"3\",\"WEP\"\r\n","OK");
// 16:57:51.890> AT+CIFSR
// 16:57:51.890>
// 16:57:51.953> 192.168.4.1
// 16:57:51.953> 192.168.0.108

 /*
    avec page web 192.168.0.108:80  depuis chrome Windows 10
18:40:06.531> AT+CIFSR
18:40:06.531>
18:40:06.531> 192.168.4.1
18:40:06.531> 192.168.0.108
18:40:06.531>
18:40:06.531> OK
18:40:06.531>
18:40:06.718>
18:40:06.718>
18:40:06.781>  MODE TEST AVEC TERMINAL VBRAY :
18:40:14.718>  Reçu : Link
18:40:14.718>
18:40:15.781>  Reçu : 1+½5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36A
18:46:44.546>  Reçu : UnlinkL
18:49:45.984>  Reçu : Link
18:49:45.984>
*/

//#define Version "02 Avril 2016"
// 1ere connection semblant reussie avec WIFI
//10:27:58.734> +CWLAP:(0,"FreeWifi",-83,"f4:ca:e5:aa:7a:79",2)
//10:28:36.421> AT+CIFSR
//10:28:36.421>
//10:28:36.421> 192.168.4.1
//10:28:36.421> 10.48.222.233    ou  10.18.134.254

//#define Version "01 Avril 2016"
//              + CWLAP: <ecn>,<ssid>,<rssi>,<mac>
// 17:54:35.156> +CWLAP:(1,"On_Air",-70,"4a:39:bc:3d:ba:d0",3)
//17:54:35.218> +CWLAP:(0,"FreeWifi",-71,"4a:39:bc:3d:ba:d2",3)
// ecn=0=>OPEN  ecn=1=>WEP    ecn=2=> WPA_PSK    ecn=3=> WPA2_PSK

//#define Version "29 Mars 2016"
// test avec adresse IP sans guillemets

//#define Version "27 Mars 2016"
// rajout LCD 2119 sur bus I2C2
// bug delai via Timer0 trouvé .. il manquait simplement les parentehses Arme_Timer0();
// et de ce fait, la fonction n'etait pas executée donc flag_timer0 restait à 1

//#define Version "11 Mars 2016" // .. presque OK"

 //ac:datasheet
 
  //ac:Pinout_18F87J50
  
   //ac:Interliaisons_PIC_Wifi3
 
 
/* **************************************
PIC18FxxJxx Specifics
Shared Address SFRs
mikroC PRO for PIC does not provide auto setting of bit for acessing alternate register.
 This is new feature added to PIC18fxxJxx family and will be supported in future. 
 In several locations in the SFR bank, a single address is used to access two 
 different hardware registers. In these cases, a “legacy” register of the standard PIC18
 SFR set (such as OSCCON, T1CON, etc.) shares its address with an alternate register.
 These alternate registers are associated with enhanced configuration options for peripherals,
 or with new device features not included in the standard PIC18 SFR map.
 A complete list of shared register addresses and the registers associated with them
 is provided in datasheet.
************************************** */


// .. PB Timer0"
// passe à FOSC 8MHz interne  au lieu de 48Mhz
//C:\_MikroC\_MesProjets_MikroC\_WIFI3_ESP8266\P18F87J50_internal_Fosc_8MHz_USB_PLL_48Mhz.cfgsch
// #define Version "09 Mars 2016"
//  Toujours PB avec Timer0 interrupt utilisée dans subroutine
/// reduction vitesse UART1 et 2 -> 19200 bds
// Vu que Timer0 est TOUJOURS en Hihg level interrupt

// problemes liés à la taille RAM de buffer1 et buffer2 de 300 
// si taille limitée à 256, l'interrupt timer0 repond bien
// par contre il faut veiller à ce que buffer2 ne deborde pas
// surtout avec la commande de decouverte reseau..
//

// A nouveau probleme de confusion entre INT0IF et TMR0IF dans l'IT timer0!!
// Big probleme avec timer0 dans sub routine    Stack problem ?
// remplacée par Delay_ms
// #define Version "08 Mars 2016 a"
// modif cas special recherche des reseaux Wifi AT+CWLAP ,
// car necessite 7 à 10 secondes , meme à 38400 bds!
// ATTENTION : modif vitesse en baud  à 38400... avec AT+CIOBAUD=38400  (was 19200)
// il faut etre à la vitesse préalable UART=19200  pour pouvoir le faire
// et ensuite modifier l'init UART2 = 38400 pour correspondre à la nouvelle valeur
// modif : test "LF ou CR " sur reception buffer2 ( was LF only) pour armer le flag UART2_DataReady

// int Send_Cde_Test_response(const char *cde,const char * answ)
// pour liste des reseaux dispo
//  Activation IT RXW UART1 pour cde directe modukle WIFI3
// modif UART2 à 19200 bauds
//carte clicker2 18F87J50 cramée en envoyant +12V sur VSYS bornier (5V)!
// mais encore operationelle si alimentée en 3,3V (hormis la partie 5V et cgageur de batterie)

//#define Version "05-03-2016"
// modif test sur reception UART1

//#define Version "05-12-2015\r\n"
//#define Test_With_VBRAY

// *****  mode TESTS *****************************
// Le module WIFI3 est retiré du mikrobus et relié en externe..
// via liaisons au PIC Clicker2 avec des fils prologateurs Male-femelle
// 4 fils :  pour PWD et GPIO15  , 0V, +3,3V
// 2 fils : alimenter l'interface 2TR en 3,3V
// 2 fils liaison UART
// ATTENTION : croiser RX et TX entre WIFI3 module et Interface 2Tr Terminal
// testé OK avec COM2 9600  fiche cable PC DB9 noire + empilement connecteurs DB9 inverseur !

// Avec cette meme connectique
// test avec programme ESP8266 User Progr V1.1 firatdeveci.com ... OK


/*
29/08/2015
sur PC XP affichage monitor LINKSYS WUSB54G
sur l'onglet Site Survey
apparait en plus le module WIFI3 :
ESP_9C100C   1    70%     infrastructure   channel 1  Security No  MAC= 1A-FE-34-9C-19-0C
SSID=  ESP_9C100C
Wireless mode = Infrastructure
channel =  1
Security = No
MAC= 1A-FE-34-9C-19-0C
adresse IP : 192.168.0.110
AT+CIPA= 192.158.1.4 ??
rajouté dans NORTON_Securite reseau _ Approbation .. totale
*/

/*
 * Project name:
     WiFI3 click board example;
 * Copyright:
     (c) MikroElektronika, 2015.
  * Revision History:
     20150126: - initial release (FJ) for 18F45K22 Easypic V7;
     REV Paulfjujo Aout 2015
 * Description:
     This is a simple project which demonstrates the use of WiFi3 click board.
     After establishing the connection, user should send messages via UDP terminal
     The WiFI3 click board receives them and displays them at the Lcd.
 * Test configuration:
     MCU:             PIC18F87J50
     Dev.Board:       PICClicker2
     Oscillator:      HS-PLL 32.0000 MHz, 8.0000 MHz Crystal
     ext. modules:    wifi3 click board - 
                      UART2 + terminal VBRAY
     SW:              mikroC PRO 6.50 for PIC
  NOTES:
     - Place WiFi3 click board in the mikroBUS socket #1
     - Put power supply jumper (J5) on the EasyPIC7 board in 3.3V position.
     - Configure SSId, password and port to match your network settings.
     - Use UDP terminal tool to connect to the WiFi module and send data to it.
     
//MicroBus Socket #1
//--- left ---------
//RA0     AN    STAT
//RD2     RST   POWERKEY
//---- right -------
//RG3     PWM   RI    PWD
//RB3     INT   CTS   GIO15
//RG2     RX   TXD
//RG1     TX   RXD
//
// nota: PIC 18F87J50 Clicker2
// Pins reservés , non utilisables
// RJ5  Stat
// partie Alim carte
// RF6 Vsense
// RE2 input  Test presence alim USB
// RE5 Sensel
// RE6   Fault
//
// RD4  affecté à LD1  LED tirée au Gnd   1= Allumée
// RE4 affecté à LD2   LED tirée au Gnd   1= Allumée
// RD7 affecté à T2  BP1   tiré au +Vcc  1= BP Ouvert
// RH3 affecté à T3  BP2   tiré au +Vcc  1= BP Ouvert
//  LCD éx16 car sur I2C2
// RD6  SCL I2C2  --> LCD2119 pin 3  fil vert
// RD5  SDA I2C2  --> LCD2119 pin4   fil jaune
//  +3,3V ----------  LCD2119 pin2   fil rouge
//  Gnd   ----------  LCD2119 pin1   fil Noir


 */     
 //

 //  
 
 
//#include "WiFI3_click_UART2_.h"

#define Lo(param) ((char *)&param)[0]
#define Hi(param) ((char *)&param)[1]

 //-- commandes terminal VT220
#define CLS 12     // effacement de page sur Terminal VBRAY
#define CR 13
#define VT 10
#define LF 10
#define TAB 9
#define Bell 7
#define Byte unsigned char
#define uint8 unsigned char
#define NULL 0


unsigned const char WebHead[]=
"<html>\
<head>\
<meta http-equiv=\"Content-Type\"\
content=\"text/html; charset=iso-8859-1\">\
<meta http-equiv=\"refresh\" content=\"10\">\
<title>WIFI3-Click</title>\
</head>\
<body>\
<h2><br>";
unsigned char WebVar0[]="Temper. Ext :<br> 10.54 °C<br>";
unsigned char WebVar1[]="Temper. Amb :<br> 17.63 °C<br>";
unsigned char WebVar2[]="BP1 = x<br>";
unsigned char WebVar3[]="BP2 = x<br>";
unsigned char WebVar4[]="Taux= xx.x %<br>";
unsigned char WebVar5[]="NbEchanges= xxxxx<br>";
unsigned const char WebTail[]= "</h2></body></html>" ;

#define Byte unsigned Char
#define Word unsigned int

#define MAXLEN1   320
 unsigned char buffer1[MAXLEN1];
  unsigned char * PBuffer1;

#define MAXLEN2 512
 unsigned char buffer2[MAXLEN2];
 unsigned char * PBuffer2;

#define MAXLEN3 512
unsigned  char WebPage[MAXLEN3];
unsigned char *PWeb;
static char msg[128];
static char TEXTE[256];
char CRam1[80];
char *txt;
unsigned char  *p;
unsigned char Web_Status='0';
unsigned char Envoi_Status='0';
unsigned int PageLen;
unsigned long L1; 
unsigned char  *pOrg;


unsigned int Index1=0;
unsigned int i1=0;
unsigned int UART1_DataReady=0;
unsigned char c1=0;
unsigned char cx;

unsigned int i,j,k;
unsigned int Flag_Timer0;
unsigned int Cpt0;
int Vbray;
int Max_Timer0=2;
unsigned int Flag_Timer1;
unsigned int Cpt1;
int Max_Timer1=10;

unsigned char LCD_ADR=LCD2119_ADR; //0x74;
unsigned char NbCarPL;  // 16
unsigned char addr ;

unsigned int EAx,EA0,EA1,EA2;
float Degres1,Degres2;

char received_data[16], ip_address[16];
unsigned char tmp,c2;
int UART2_DataReady;
unsigned int i2,Index2;

unsigned int Step;

unsigned char IPD=0;
unsigned char Cpt=0;
unsigned int NbC=0;
unsigned int NbB=0;
float Pourcent;


volatile struct chbits {   // 8 flags
     unsigned res1:1;
     unsigned res2:1;
     unsigned res3:1;
     unsigned res4:1;
     unsigned res5:1;
     unsigned res6:1;
     unsigned First_Run:1;
   }Drapeaux ;


 // module connections  click#1
sbit CH_PD  at LATA0_bit;      // resert pin
sbit GPIO15 at LATD2_bit;
sbit CH_PD_Direction  at LATA0_bit;
sbit GPIO15_Direction at LATD2_bit;

// LEDs on PIC18F87J50  Clicker2
sbit LD1 at LATD4_bit;
sbit LD2 at LATE4_bit;
sbit LD1_Direction at TRISD4_bit;
sbit LD2_Direction at TRISE4_bit;

// BPs on PIC18F87J50 Clicker2
sbit BP1 at RD7_bit;
sbit BP2 at RH3_bit;
sbit BP1_Direction at TRISD7_bit;
sbit BP2_Direction at TRISH3_bit;

#ifdef With_HID
unsigned char readbuff[64] absolute 0x500;   // Buffers should be in USB RAM, please consult datasheet
unsigned char writebuff[64] absolute 0x540;// RFID Click Connections
void CRLF_HID(void);
void Send_Text_HID(char * msg );
void Send_CText_HID(const char * msgC );
#endif

void Arme_Timer0(void);
void Init_Timer0(void);
void strConstRamCpy(char *dest, const char *source);
void Init_ADC(void);
char * Send_Cde_Test_response(const char *cde,const char * answ);
 void WiFI_Configure(void);
char * ESP_Connetion(void);

void CRLF1(void) ;
void UART1_Write_String(unsigned char * St,int MaxCars);
void UART1_Write_CText(const char *txt);
void RAZ_UART1(void);
void CRLF2(void) ;
void UART2_Write_String(unsigned char * St,int MaxCars);
void UART2_Write_CText(const char *txt) ;
void RAZ_UART2(void);

void LCD_CLS(void);
void LCD_Clear(void); // <-- PB >> au lieu de space.. à suivre
int LCD2119_Init(void);
void LCD_RAZ_Ligne(int L);
void LCD_Write_Chr_At(int Ligne,int Col,char c1) ;
void LCD_Write_Text_At(unsigned int Ligne,unsigned int col,char * t1);
void LCD_Write_CText_At(unsigned int Ligne,unsigned int col,const char * t1);
void LCD_Write_CText(const char * t1);
void Cree_Euro(void) ;
void Cree_8_cars_CGRAM(void)  ;
void LCD_Cde(unsigned char Cde);
void LCD_Gauche(void);
void LCD_Droite(void);
unsigned char check_device(unsigned char dev_address);  // necessite liaison RS232 UART1
void Float2Ascii (float x, unsigned char *str,char precision);


// interrupt handler
void Interrupts() iv 0x0008 ics ICS_AUTO
{

//  UART2
    if((RC2IF_bit==1) && (RC2IE_bit==1))
    {  
       c2 =RCREG2;  //UART2_Read();
        if(OERR2_bit)
        {
          CREN2_bit = 0;
          CREN2_bit = 1;
          OERR2_bit = 0;
        }
        if(FERR2_bit==1)   c2 = RCREG2;
        if (i2 < (MAXLEN2-2))
         {
                 buffer2[i2]=c2;
                 Index2=i2;
                 i2++;
          }
          else  RC2IE_bit=0;
       }
      //UART1
  if((RC1IF_bit==1) && (RC1IE_bit==1))
  {
      c1 = RCREG1;
     //TXREG1='*';
     if(OERR1_bit)
      {
       CREN1_bit = 0;
       CREN1_bit = 1;
       OERR2_bit = 0;
      }
     if(FERR1_bit)
     {
       c1 = RCREG1;
     }

     if ((c1==13) || (i1>(MAXLEN1-2)))    //|| (c1==10))
      {
      UART1_DataReady=1;
      buffer1[i1]=0;
      Index1=i1;
      i1=0;
      c1=0;
     }
     else
     {
        if (c1>0)
        {
           buffer1[i1]=c1;
           Index1=i1;
           i1++;
        }
      }

   }
 #ifdef With_HID
    //   ====  IT Timer0  =============
  if  ((TMR0IE_bit==1) && (TMR0IF_bit==1)) //  (TMR0IF_bit){
    {
     TMR0IF_bit = 0;
     TMR0H         = 0x48;    // 18661    prescaler=1/256  8Mhz
     TMR0L         = 0xE5;
     Cpt0++;
       if( Cpt0 > Max_Timer0 )  // 1sec * Max_Timer0
     {
      Flag_Timer0=1;
      TMR0IE_bit=0;
      Cpt0=0;
      }
    }


  USB_Interrupt_Proc();           // for HID
  #endif
}


void Interrupt_LOW() iv 0x0018 ics ICS_AUTO
 {

  // -----  timer 1  ----------------
  if  ( (TMR1IE_bit==1) && ( TMR1IF_bit==1))
   {  // Test "Peripheral Interrupt Request Register 1" for Timer1 Flag
     Cpt1++;
     if (Cpt1 >=Max_Timer1)   // every x250 ms  si 8Mhz (PLL=0) , every  50mS si 40Mhz  (PLL=1)
       {
        Cpt1=0;
        Flag_Timer1=1;
        TMR1ON_bit=0;
        TMR1IE_bit=0;
      }
      TMR1H= 0x0B; // Hi (3035);
      TMR1L= 0xDB; // Lo (3035);
      PIR1.TMR1IF=0;
   }
 }



#include "LCD2119_I2Cx_routines.h"



void Float2Ascii (float x, unsigned char *str,char precision)
{
 /* converts a floating point number to an ascii string */
 /* x is stored into str, which should be at least 30 chars long */
 int ie, i, k, ndig;
 double y;
 ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
 ie = 0;
 /* if x negative, write minus and reverse */
 if ( x < 0)
 {
   *str++ = '-';
   x = -x;
 }
 /* put x in range 1 <= x < 10 */
 if (x > 0.0) while (x < 1.0)
 {
   x *= 10.0;                // a la place de =*
   ie--;
 }
 while (x >= 10.0)
 {
   x = x/10.0;
   ie++;
 }
 // in f format, number of digits is related to size
 ndig += ie;                                // a la place de =+
 //round. x is between 1 and 10 and ndig will be printed to
 // right of decimal point so rounding is ...
 for (y = i = 1; i < ndig; i++)
 y = y/10.;
 x += y/2.;
 if (x >= 10.0) {x = 1.0; ie++;}
 if (ie<0)
 {
   *str++ = '0'; *str++ = '.';
   if (ndig < 0) ie = ie-ndig;
   for (i = -1; i > ie; i--)  *str++ = '0';
 }
 for (i=0; i < ndig; i++)
 {
   k = x;
   *str++ = k + '0';
   if (i ==  ie ) *str++ = '.';
   x -= (y=k);
   x *= 10.0;
  }
 *str = '\0';
}


// Send Status SMS
void Send_Msg(const char* Msg)
{
  UART2_Write_CText(Msg);
  UART2_Write(0x1A);                 // Send CTRL + Z as end character
  UART2_Write(0x0D);                 // Send CR
  //Get_Response("Ok");             // Wait OK as confirmation that the message was sent
}

// --- Copie le texte depuis ROM vers RAM
void strConstRamCpy(char *dest, const char *source) 
{
  while(*source) *dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}


 void Init_ADC()
 {
  //config lecture ADC 10 bits
  ADCON0.VCFG1=0;  // - AVss=Gnd;
  ADCON0.VCFG0=0;  // +Avdd;
  ADCON0.CHS3=0;  // channel1
  ADCON0.CHS2=0;
  ADCON0.CHS1=0;
  ADCON0.CHS0=1;
  ADCON0.ADON=1;      // ADC enabled

  ADCON1.ADFM=1;     // right justified
  ADCON1.ADCAL=0;
  ADCON1.ACQT2=1;
  ADCON1.ACQT1=1;
  ADCON1.ACQT0=0;    // 110=> 16 TAD
  ADCON1.ADCS1=1;
  ADCON1.ADCS2=1;
  ADCON1.ADCS0=0;    // 110 => Fosc/64
 }

void UART2_Write_String(unsigned char * St,int MaxCars)
{
// nota: plantage si passage direct valeur pointee
// il faut passer par une variable intermediaire
 int i;
 unsigned char c0;
 i=0;
while(1)
 {
 c0= *(St+i);
 if(c0==0) break;
UART2_Write(c0);
i++;
 if (i>MaxCars) break;
  }
}


void UART1_Write_String(unsigned char * St,int MaxCars)
{
 int i;
 unsigned char c0;
 i=0;
while(1)
 {
 c0= *(St+i);
 if(c0==0) break;
 UART1_Write(c0);
 i++;
 if (i>MaxCars) break;
 }
}

void UART1_Write_CText(const char *txt1)
 {
   while (*txt1)
      UART1_Write(*txt1++);
}

void CRLF1()
{
 UART1_Write(CR);
  UART1_Write(LF);
 }
 
 void RAZ_UART1()
{     RC1IE_bit=0 ;
      for (Index1=0;Index1<MAXLEN1;Index1++) buffer1[Index1]=0;
      Index1=0;
      i1=0;
      UART1_DataReady=0; 
      c1=0;
      RC1IE_bit=1 ;
}

void CRLF2()
{
 UART2_Write(CR);
  UART2_Write(LF);
 }
 
 void UART2_Write_CText(const char *txt2)
 {
   while (*txt2)
      UART2_Write(*txt2++);
}

void RAZ_UART2()
{     RC2IE_bit=0 ;
      for (Index2=0;Index2<MAXLEN2;Index2++) buffer2[Index2]=0;
      Index2=0;
      i2=0;
      UART2_DataReady=0;
      c2=0;
      RC2IE_bit=1 ;
}

void Hardware_Init(void)
 {
  TRISG=0xFF;
  TRISA=0xFF;
  TRISB=0xFF ;
  TRISC=0xFF;
  TRISD=0xFD;
  TRISE=0xFF;   //  all input
  TRISH=0xFF;   //  all input
  //ADSHR_bit = 1;  // plante si lecture ADC
  //REGISTER 21-3: ANCON0: A/D PORT CONFIGURATION REGISTER 2
  ANCON0=0xFF ; // 0= analog   1= digital
  ANCON0.F4=1; // PCFG4_bit=1; // RA4 digital
  ANCON0.F3=1; // PCFG3_bit=1; // RA3 digital
  ANCON0.F2=0; // PCFG2_bit=0; // RA2 Analog inp
  ANCON0.F1=0; // PCFG1_bit=0; // RA1 Analog inp
  ANCON0.F0=1; // PCFG0_bit=1; // RA0 digital
// REGISTER 21-4: ANCON1: A/D PORT CONFIGURATION REGISTER 1
  ANCON1=0xFF; // No analog on AN15--AN10
 // 2 BP poussoir clicker2
  BP1_Direction = 1;      // Set direction for buttons
  BP2_Direction = 1;     // RH3
  // 2 Leds sur cliker2
  LD1_Direction = 0;     // Set direction for LEDs
  LD2_Direction = 0;
  LD1 = 0;                // turn off LEDs
  LD2 = 0;
  //
  CH_PD_Direction=0;
  GPIO15_Direction=0;
  }
  

void Init_Timer0()
{
  T0CON.PSA=0;      // Timer0 prescaler assigned to Clock
  T0CON.T0PS2=1;    //
  T0CON.T0PS1=1;    //
  T0CON.T0PS0=1;    // prescler =>111 => 1/256
  T0CON.T0CS=0;     // internal cycle clock
  T0CON.T08BIT=0 ;  // Mode 16 bits
// 3035  prescaler=32  1sec at 8Mhe
// 18661 prescaler =256 1sec at 48MHz  48E5
// 28036 prescaler=32 48MHz => 100mS  6D84
// 3035 prescaler =128  0,5sec @64Mhz
// 3035  prescaler=128  2sec at 16Mhz
// 3035  prescaler=256  2sec at 32Mhz
// 34286  prescaler=128  1,0sec at 16Mhz    85EE
//  T0CON         = 0x84;   //
//
//  1 = Enables Timer0
//  0 = Timer0 is configured as a 16-bit timer/counter
//  0 = Internal instruction cycle clock
//  0 = Increment on low-to-high
//  0 = Timer0 prescaler is assigned
//  100 = 1:32 Prescale value
//
  TMR0H         = 0x48;    // 18661
  TMR0L         = 0xE5;
  Max_Timer0=2;
  Cpt0=0;
  Flag_Timer0=0;
  TMR0IF_bit=0;
  TMR0IE_bit     = 1;
}



void Arme_Timer0()
{
  //TMR0IF_bit = 0;
  //TMR0H   = 0x0B;   //3035
  //TMR0L   = 0xDC;
  Cpt0=0;
  Flag_Timer0=0;
  TMR0IE_bit = 1;
  }


//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 50 ms
//Place/Copy this part in declaration section
void Init_Timer1(void)
{
  T1CON  = 0x31;      // prescaler 1:8
  TMR1IF_bit = 0;
  TMR1H      = 0x0B;   // at 8Mhz =>  250mS
  TMR1L      = 0xDC;
  TMR1IE_bit = 1;
  TMR1IP_bit=0;  // .. low level interrupt
  INTCON  = 0xC0;
}

void Arme_Timer1()
{
  //TMR1IF_bit = 0;
  TMR1H      = 0x0B;
  TMR1L      = 0xDC;
  Cpt1=0;
  Flag_Timer1=0;
  TMR1ON_bit=1;     // Timer0 ON
  TMR1IE_bit = 1;
  }


char * Send_Cde_Test_response(const char *cde,const char * answ)
{
char dummy[40];
int n;
  strConstRamCpy(dummy,answ);
  n=strlen(dummy);
  RAZ_UART2();
   UART1_Write_CText(cde);CRLF1();
   Delay_ms(100);
      UART2_Write_CText(cde);
   Arme_Timer1();
   p=0;
    while (Flag_Timer1==0);
   // pour debugger le probleme ci dessous
   RC2IE_bit=0;
   // CRLF1();
   // k=strlen(buffer2);
   //WordToStr(k,CRam1);
   //UART1_Write_CText(" len buffer2= ");
   //UART1_Write_Text(CRam1);
   //CRLF1();

   buffer2[MAXLEN3-1]=0; // limite la longueur  => OK
    p=strpbrk(dummy,buffer2);
  //  p=strstr(buffer2,dummy);
    if (p>0 ) Step++;
    UART1_Write_String(buffer2,100);
    CRLF1();
  CRam1[0]=0;
  p=&CRam1[0];
  ByteToStr(Step,CRam1);
  CRam1[8]=0;
  LCD_Write_Text_At(2,8,CRam1);
  return p;
  }


void WiFI_Configure()
 {
    Max_Timer1=20;
    Step=0;
    //UART1_Write_CText("Step %c Connect to WIFI3 \r\n");
    UART1_Write_CText(" Step 0 \r\nEtablissement premiere Connection avec WIFI3 :" );
    p=Send_Cde_Test_response("AT\r\n","OK");
    Delay_ms(200);

    //  UART1_Write_CText("Reseting Module :\r\n");
    sprintf(msg," Step %s \r\nReseting Module : ",p );
    UART1_Write_Text(msg);
    p=Send_Cde_Test_response("AT+RST\r\n","ready");
    Delay_ms(200);

    sprintf(msg,"Step %s  \r\nDisable ECHO  ",p  );
  UART1_Write_Text(msg);
  p=   Send_Cde_Test_response("ATE0\r\n","OK");
  Delay_ms(200);
  
  if (BP1==0)
  {
  UART1_Write_CText("Init Maximum (car BP1 actionné) \r\n");
  sprintf(msg,"Step %s  \r\nSet speed 19200 bds  ",p  );
  UART1_Write_Text(msg);
  p=   Send_Cde_Test_response("AT+CIOBAUD=19200\r\n","OK");
  Delay_ms(200);

  sprintf(msg,"Step %s \r\nTimeOut Value ?  ",p );
  UART1_Write_Text(msg);
  p=   Send_Cde_Test_response("AT+CIPSTO?\r\n","OK");  // <-- lecture OK
  Delay_ms(200);

  sprintf(msg,"Step %s \r\n Version ESP :  ",p );
  UART1_Write_Text(msg);
  p=   Send_Cde_Test_response("AT+GMR\r\n","OK");
  Delay_ms(200);

  sprintf(msg,"Step %s \r\nDisConnecte l'ancien Spot Wifi AP : ",p );
  UART1_Write_Text(msg);
  Max_Timer0=20;
  p=   Send_Cde_Test_response("AT+CWQAP=?\r\n","OK");
  Delay_ms(200);
  } 
  else
  UART1_Write_CText("Init Minimum  (car BP1 au repos) \r\n");
  
  
  sprintf(msg,"Step %s  \r\nSetting Station & AP mode :  ",p );
  UART1_Write_Text(msg);
  p=   Send_Cde_Test_response("AT+CWMODE=3\r\n","OK");
  Delay_ms(100);

    sprintf(msg,"Step %s \r\nMultiple connexions : ",p );
    UART1_Write_Text(msg);
    Max_Timer1=20;
    p=   Send_Cde_Test_response("AT+CIPMUX=1\r\n","OK");
    Delay_ms(100);

   if (BP1==0)
   {
    sprintf(msg,"Step %s \r\nDecouverte des Reseaux visibles WIFI  :   ",p);
    UART1_Write_Text(msg);
    UART1_Write_CText("wait.. (16 sec)!\r\n");
    Max_Timer1=64;       // 64 * 0.25=16 sec
    p=   Send_Cde_Test_response("AT+CWLAP\r\n","OK");
    Delay_ms(200);
    Max_Timer1=4;
   UART1_Write_CText("\r\nFin de recherche\r\n");
   }
   
   sprintf(msg,"Step %s \r\nGetting  Adresse IP Server & Client : ",p );
   UART1_Write_Text(msg);
    Max_Timer1=20;
  p=   Send_Cde_Test_response("AT+CIFSR\r\n","OK");
  Delay_ms(200)   ;


     sprintf(msg,"Step %s \r\nSet Connecting to AP   ",Step);
     UART1_Write_Text(msg);
     Max_Timer1=10;
     p=Send_Cde_Test_response("AT+CWJAP=\"On_Air\",\"ACCA9135F318DBFBE476D3D95D\",\"3\",\"WEP\"\r\n","OK");
     Delay_ms(100);
     Max_Timer1=4;
     
     sprintf(msg,"Step %s \r\nQuel Reseau connecté ?",Step);
     UART1_Write_Text(msg);
     Max_Timer1=10;
     p=Send_Cde_Test_response("AT+CWSAP?\r\n","OK");
     Delay_ms(100);
     Max_Timer1=4;
}

#ifdef With_HID
void CRLF_HID()
{
  *(&writebuff)=13;
    *(&writebuff+1)=10;
      *(&writebuff+2)=0;
  while(!HID_Write(&writebuff,64));
  }
  
#ifdef With_HID
void Send_Text_HID(char * msg )
 {
    strcpy(&writebuff, msg);
    while(!HID_Write(&writebuff, 64));
}

void Send_CText_HID(const char * msgC )
 {
   strConstRamCpy(&writebuff,msgC);
    while(!HID_Write(&writebuff, 64));
}
#endif
  
  
#endif


void Test_2_leds()
{
  LD1 = 0;  LD2 = 0;  Delay_ms(250);
  LD1 = 1;  Delay_ms(250);
  LD1 = 0;  LD2 = 1;  Delay_ms(250);
  LD1 = 1;  LD2 = 0;  Delay_ms(250);
  LD1 = 0;  LD2 = 0;
    }


void main() 
{
// internal FOSC=8Mhz
  OSCTUNE=0;
  OSCTUNE.PLLEN = 1;
  OSCCON.IDLEN=0;
  OSCCON.IRCF2=1;  // 8Mhz
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=1;
  //11 = Postscaled internal clock (INTRC/INTOSC derived)
  // periferc idem as FOSC
  OSCCON.SCS1=1;
  OSCCON.SCS0=1;
  while(OSCCON.OSTS==0);
  
  Hardware_Init();
  
  Drapeaux.First_Run=1;
  
  ADC_Init();

  Delay_ms(250);
  // Initialize variables
  k=0;
  tmp = 0;
  Vbray=0;
  txt=&TEXTE[0];

  i = 0;
  UART2_Init(19200);       // Initialize UART2 module
  Delay_ms(100);
  UART1_Init(19200);
  UART1_Write(CLS);
  Delay_ms(500);
  CRLF1();
  UART1_Write_CText("Projet : "Projet"\r\n");
  UART1_Write_CText(Source"_"Version"c\r\n");
  UART1_Write_CText("FOSC interne 8Mhz  USB at 48MHz\r\n");
  UART1_Write_CText("Uart1 19200 bds =  Espion/debugging \r\n");
  UART1_Write_CText("Uart2 19200 bds =  MCU <--> ESP dialogue\r\n");
  UART1_Write_CText("LCD 2x16 cars  Tracage programme\r\n");


  Test_2_leds() ;

  // Initialize WiFI module
  UART1_Write_CText("Init Wifi3 Power ON pendant 5sec \r\n" );
  // Reset  WIFI3
  CH_PD=0;
  GPIO15=1;
  // verif Horloge FOSC via Delai et application delai pour POWER ON WIFI3
  CRLF1();
  UART1_Write('#');
  CRLF1();
  Delay_ms(5000);
  CRLF1();
  UART1_Write('$');
  CRLF1();
  CH_PD= 1;
  GPIO15=1;
  RAZ_UART2();
  RAZ_UART1();
  

 // Read_Msg_Eeprom(0x60);
  txt=&TEXTE[0];
  UART1_Write_CText("\r\nInit I2C2 at 400Khz\r\n");
  LD1=1;
  I2C2_Init(400000);
  CRLF1();
   LD1=0;
   
  NbB=1;
  NbC=1;
  PWeb=&WebPage[0];
  PBuffer1=&buffer1[0];
  PBuffer2=&buffer2[0];

     #ifdef test_Page_HTML

        UART1_Write_CText("\r\n TEST PAGE HTML \r\n");
            // refresh Datas
          EA1=ADC_Read(1);
          Degres1=(float)EA1*330/1024;      // 10mV par degres C
          sprintf(txt,"% 2.2f",Degres1);
          memcpy(WebVar0+17,txt,5);

          EA2=ADC_Read(2);
          EA2=100;  // 33°C forcé car entree analog non connecté au capteur
          Degres2=(float)EA2*330/1024;      // 10mV par degres C
          sprintf(txt,"% 2.2f",Degres2);
          memcpy(WebVar1+17,txt,5);

          WebVar2[6]=BP1+48;
          WebVar3[6]=BP2+48;

          // mesure Float
          Pourcent=92.7;
          sprintf(CRam1,"% 2.1f",Pourcent);
          WebVar4[6]= CRam1[0];
          WebVar4[7]= CRam1[1];
          WebVar4[8]=CRam1[2];
          WebVar4[9]=CRam1[3];
          
          //WebVar5[]="NbEchanges= xxxxx<br>";
          NbC=63767;
          WebVar5[12]= ((NbC/10000)%10) + 48;
          WebVar5[13]= ((NbC/1000)%10) + 48;
          WebVar5[14]= ((NbC/100)%10) + 48;
          WebVar5[15]= ((NbC/10)%10) + 48;
          WebVar5[16]= (NbC%10) + 48;
          NbC=0;
        
         // version Cpt compteur sur 8 bits
         // WebVar4[6]=((Cpt/100)%10) + 48; // extrait centaines
         // WebVar4[7]=((Cpt/10)%10) + 48;  // extrait dizaines
         // WebVar4[8]=(Cpt%10) + 48; // recupere Unites

          // build WebPage
          strConstRamCpy(PWeb,WebHead);
          k=strlen(PWeb);
          WordToStr(k,CRam1);
          UART1_Write_CText("1_ ");UART1_Write_Text(CRam1);CRLF1();

          strcat(PWeb+k,WebVar0);
          k=strlen(PWeb);
          WordToStr(k,CRam1);
          UART1_Write_CText("2_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(PWeb+k,WebVar1);
          k=strlen(PWeb);
          WordToStr(k,CRam1);
          UART1_Write_CText("3_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(PWeb+k,WebVar2);
          k=strlen(PWeb);
          WordToStr(k,CRam1);
          UART1_Write_CText("4_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(PWeb+k,WebVar3);
          k=strlen(PWeb);
          WordToStr(k,CRam1);
          UART1_Write_CText("5_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(PWeb+k,WebVar4);
          k=strlen(PWeb);
          WordToStr(k,CRam1);
          UART1_Write_CText("6_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(PWeb+k,WebVar5);
          k=strlen(PWeb);
          WordToStr(k,CRam1);
          UART1_Write_CText("7_ ");UART1_Write_Text(CRam1);CRLF1();
          
          
          
          
          strConstRamCpy(PWeb+k,WebTail);

         IPD=48;
         strConstRamCpy(msg,"AT+CIPSEND=x,");
         msg[11]= IPD;
         k=strlen(msg);
         PageLen=strlen(PWeb);
         WordToStr(PageLen,CRam1);
         strcat(msg+k,Ltrim(CRam1));

        UART1_Write_CText("Envoi msg : ");
        UART1_Write_Text(msg);CRLF1();


        UART1_Write_CText("Test envoi WebPage sur UART1 \r\n ");
        UART1_Write_String(PWeb,512);CRLF1();


  #endif


   addr= LCD_ADR; // 0x74;     // LCD 2119 2x16 car  OK avec alim 3,3V
   NbCarPL=  16;
   k=check_device(addr)  ;
   CRLF1();
   UART1_Write_CText("Init LCD 2119 2x16\r\n");
  k=LCD2119_Init();
  Delay_ms(50);
  LCD_CLS();
  Delay_ms(50);

  // Presentation sur LCD
  // LCD_RAZ_Ligne(1);
   LCD_Write_CText_At(1,1,"18F87J50 F=8MHz");
   LCD_Write_CText_At(2,1,"LCD2119 en I2C2");
   Delay_ms(1500);  // sans ce delai ,les 3 premiers caracteres sont bouffes sur le LCD
   LCD_Write_CText_At(1,1,"MikroC 6.62 1603");
   LCD_RAZ_Ligne(2);
  Delay_ms(2000);
  CRLF1();


  Max_Timer0=2;
  Max_Timer1=10;
  Init_Timer1();  //  1 sec @ 8Mhz   x Max_timer1

  UART1_Write_CText("Init Interrupts\r\n" );
  RC2IE_bit=1 ;
  RC1IE_bit=1 ;
  RC1IP_bit=1;
  RC2IP_bit=1;
  PEIE_bit=1;
  RCON.IPEN = 1;       // enable priority levels
  PEIE_bit = 1;          // Enable Peripheral interrupt
  GIE_bit  = 1;         // Enable Global interrupt

  #ifdef With_HID
   // tests durees via timer0 ci-dessous ..OK
  CRLF1();   
  UART1_Write_CText(" test Timer0 1sec *5 => 5sec\r\n" );
  Max_Timer0=5;
  Arme_Timer0();
  UART1_Write("#");   CRLF1();
  while( Flag_Timer0==0);
  UART1_Write("@");  CRLF1();
  #endif

  
 // attention : HID terminal ne semble pas fonctionner avec carte 18F87J50 1/2 HS !
 #ifdef With_HID

    Max_Timer0=10;
    UART1_Write_CText("Init HID USB link ..." );
    HID_Enable(&readbuff,&writebuff);       // Enable HID communication
    UART1_Write_CText("..OK \r\n" );
    // CRLF_HID() ;
    //Send_CText_HID("\r\n Test fonctionalites  HID USB \r\n") ;
  while(1)
  {
    Max_Timer0=5;
    UART1_Write_CText("Wait for data from HID USB Terminal\r\n" );
    Init_Timer0();
    while(!HID_Read() && (Flag_Timer0==0));                  // wait for data on USB
    if(Flag_Timer0==0)
    {
       k=strlen(&readbuff);
       strcpy( txt,&readbuff);
       strConstRamCpy( &writebuff,"Reception de: ");
       while(!HID_Write(&writebuff,64));
       strcpy( &writebuff,txt);
       while(!HID_Write(&writebuff,64));
       CRLF_HID();
        if(strncmp(&readbuff,"LD1_ON",6)==0 )
        {
          LD1=1;
           strConstRamCpy( &writebuff,"Fire LD1\r\n");
           while(!HID_Write(&writebuff,64));
         }
        if(strncmp(&readbuff,"LD1_OFF",7)==0 )
        {
          LD1=0;
            strConstRamCpy( &writebuff,"Shutdown LD1\r\n");
            while(!HID_Write(&writebuff,64));
         }
        if(strncmp(&readbuff,"LD2_ON",6)==0)
        {
           LD2=1;
           strConstRamCpy( &writebuff,"Fire LD2\r\n");
           while(!HID_Write(&writebuff,64));
         }
        if(strncmp(&readbuff,"LD2_OFF",7)==0)
        {
            LD2=0;
             strConstRamCpy( &writebuff,"Shutdown LD2\r\n");
            while(!HID_Write(&writebuff,64));
         }
     }
 }
 #endif

     // Configure WiFI module
  UART1_Write_CText("Wifi3 Configure via UART2\r\n" );
    // Configure WiFI module
  LCD_Write_CText_At(1,1,"Wifi3 Configure ");
  LCD_Write_CText_At(2,1," Step           ");

   WiFI_Configure();
   
   
   
   Delay_ms(100);
   LCD_Write_Text_At(2,1,"Fin d'init. ESP ");
   UART1_Write_CText(" Fin d'init. ESP8266 \r\n");
   Delay_ms(500);

  CRLF1();
  UART1_Write_CText("\r\n Attente connection SERVER pendant 60 x 5sec =>300 sec>\r\n");
  LCD_CLS();
  RAZ_UART1();
  RAZ_UART2();
  LCD_Write_Text_At(1,1,"Server connect. ");
  LCD_Write_Text_At(2,1,"Essai Num:      ");
  i=0;

    Max_Timer1=10;
    Vbray=0;
   i=0;
   while(IPD==0)
   { 
    IPD=0;

      sprintf(msg,"Step %s \r\nSet Serveur port 80 : ",p );
      UART1_Write_Text(msg);

      RAZ_UART2();
     //    AT+ CIPSERVER= <mode>[,<port>]
     //   <mode> 0 Delete server (need to follow by restart)
     //          1 Create server
     //          <port> port number, default is 333
     // A Server can only be created when AT+CIPMUX=1
     //  A Server monitor will automatically be created when Server is created.
     //  When a client is connected to the server, it will take up one connectionCbe gave an id.
     //  p=   Send_Cde_Test_response("AT+CIPSERVER=1,10001\r\n","OK");
     //  p=   Send_Cde_Test_response("AT+CIPSERVER=1,23\r\n","OK");
      Max_Timer1=3; // 1sec
      p=   Send_Cde_Test_response("AT+CIPSERVER=1,80\r\n","GET");
      UART1_Write_CText("buffer2 :\r\n");
      UART1_Write_String(buffer2,512);CRLF1();
       strConstRamCpy( CRam1,"+IPD,");
       p= strstr(buffer2,CRam1);
       UART1_Write_String(p,100); CRLF1();
       if (p>0)
       {
          IPD=*(p+5);
          strConstRamCpy(CRam1,"recu IPD =      ");
          CRam1[10]=IPD;  // IPD peut varier de 0 à4
          LCD_Write_Text_At(2,1,CRam1);
          UART1_Write_Text(CRam1);CRLF1();
          if((IPD>=48) && (IPD<=52))
          {
            LCD_Write_CText_At(1,1,"Liaison SERVER OK");
           // UART1_Write_Text(p);CRLF1();
            strConstRamCpy(CRam1,"recu IPD =      ");
            CRam1[10]=IPD;  // IPD peut varier de 0 à4
            LCD_Write_Text_At(2,1,CRam1);
            UART1_Write_Text(CRam1);CRLF1();
           break;
          }
          else
         {
           strConstRamCpy(CRam1,"recu BAD IPD =  ");
           CRam1[14]=IPD;  // IPD peut varier de 0 à4
           UART1_Write_Text(CRam1);CRLF1();
           IPD=0;
         }
        }
       WordToStr(i,txt);
       *(txt+5)=0;
       UART1_Write_Text(txt);
       UART1_Write(TAB); UART1_Write_String(buffer2,100);
       CRLF1();
       i++;
       LCD_Write_Text_At(2,11,txt);
       if (UART2_DataReady==2) RAZ_UART2();
       if (i>=60) break;    // 60*5=300 sec
       EA1=ADC_Read(1);
       Degres1=(float)EA1*330/1024;      // 10mV par degres C
       // Float2Ascii (Degres,txt,2);
       sprintf(txt,"Tp.Ext= % 2.2f   ",Degres1);
       LCD_Write_Text_At(1,1,txt);
       UART1_Write_Text(txt);CRLF1();
       
       EA2=ADC_Read(2);
       Degres2=(float)EA2*330/1024;      // 10mV par degres C
       // Float2Ascii (Degres,txt,2);
       sprintf(txt,"Tp.Amb= % 2.2f   ",Degres2);
       LCD_Write_Text_At(2,1,txt);
       UART1_Write_Text(txt);CRLF1();

       RAZ_UART1();
       Max_Timer1=10;
       p=   Send_Cde_Test_response("AT+CIPSERVER=0\r\n","OK");
       Delay_ms(500);
       Max_Timer1=20;
       p=   Send_Cde_Test_response("AT+RST\r\n","OK");
       Delay_ms(1500);
       Max_Timer1=20;
       p=   Send_Cde_Test_response("AT+CIPMUX=1\r\n","OK");
       Delay_ms(500);
       if (i>59)
       { 
         UART1_Write_CText("\r\nProbleme de Liaison avec SERVER \r\n");
         i=0;
         do
         {
          LCD_Write_CText_At(1,1,"PB avec Server. ");
          LCD_Write_CText_At(2,1,"Timeout=>Reset. ");
          UART1_Write('.');
          i++;
          if((i%80)==0) CRLF1();
          Delay_ms(2000);
          LCD_CLS() ;
          IPD=0;
          }while(1);
       }
       i++;
     }   //while
  i=0;
  

  j=0;
           
    // page 512 bytes maxi
  Cpt=0;
  Envoi_Status=0;
  Pourcent=0.02;
  while(1)
  {
    Max_Timer0=20;
    Max_Timer1=20;
    RAZ_UART1();
    RAZ_UART2();

          // local Display on LCD 2x16
          LCD_Write_CText_At(1,1,"BP1 =    BP2=   ");
       //   LCD_Write_CText_At(2,1,"Temp Amb.       ");
          LCD_Write_CText_At(2,1,"Te      Ta      ");
            // refresh Datas
          EA1=ADC_Read(1);
          Degres1=(float)EA1*330/1024;      // 10mV par degres C
          sprintf(txt,"% 2.2f",Degres1);
          LCD_Write_Text_At(2,3,txt);
          //unsigned char WebVar1[]="Temper. Ext :<br> 17.63 °C<br>";
          memcpy(WebVar0+17,txt,5);
          
          EA2=ADC_Read(2);
          EA2=62;   // simulee ici car non raccordé sur EA2
          Degres2=(float)EA2*330/1024;      // 10mV par degres C
          sprintf(txt,"% 2.2f",Degres2);
          LCD_Write_Text_At(2,12,txt);
          //unsigned char WebVar1[]="Temper. Amb :<br> 17.63 °C<br>";
          memcpy(WebVar1+17,txt,5);

          LCD_Write_Chr_At(1,6,BP1+48);
          LCD_Write_Chr_At(1,14,BP2+48);
          WebVar2[6]=BP1+48;
          WebVar3[6]=BP2+48;
          
          // mesure 8 bits
         // WebVar4[6]=((Cpt/100)%10) + 48; // extrait centaines
         // WebVar4[7]=((Cpt/10)%10) + 48;  // extrait dizaines
         // WebVar4[8]=(Cpt%10) + 48; // recupere Unites
         
         // mesure Float
         //  Pourcent=10.1;
          sprintf(CRam1,"% 2.1f",Pourcent);
          WebVar4[6]= CRam1[0];
          WebVar4[7]= CRam1[1];
          WebVar4[8]=CRam1[2];
          WebVar4[9]=CRam1[3];
          
          WebVar5[12]= ((NbC/10000)%10) + 48;
          WebVar5[13]= ((NbC/1000)%10) + 48;
          WebVar5[14]= ((NbC/100)%10) + 48;
          WebVar5[15]= ((NbC/10)%10) + 48;
          WebVar5[16]= (NbC%10) + 48;

          // build WebPage
          strConstRamCpy(WebPage,WebHead);
           k=strlen(WebPage);
          strcat(WebPage+k,WebVar0);
           k=strlen(WebPage);
          strcat(WebPage+k,WebVar1);
           k=strlen(WebPage);
          strcat(WebPage+k,WebVar2);
            k=strlen(WebPage);
          strcat(WebPage+k,WebVar3);
            k=strlen(WebPage);
          strcat(WebPage+k,WebVar4);
            k=strlen(WebPage);
          strcat(WebPage+k,WebVar5);
            k=strlen(WebPage);
          strConstRamCpy(WebPage+k,WebTail);


         strConstRamCpy(msg,"AT+CIPSEND=x,");
         msg[11]= IPD;
         PageLen=strlen(WebPage);
         WordToStr(PageLen,CRam1);
         strcat(msg,Ltrim(CRam1));

        RC2IE_bit=0;
        UART1_Write_CText("Envoi msg : ");
        UART1_Write_Text(msg);CRLF1();
        UART2_Write_Text(msg); CRLF2();
        Delay_ms(1000);


        UART1_Write_String(WebPage,320);     CRLF1();
        UART2_Write_String(WebPage,320);  //CRLF2();
        RAZ_UART2();
         Delay_ms(2000);
         
         UART1_Write_CText("response: "); CRLF1();     // SEND OK ?
          UART1_Write_String(buffer2,60); CRLF1();
          
              RC2IE_bit=0;
              buffer2[MAXLEN2-1]=0;
              strConstRamCpy(msg,"SEND OK" );
              p=strstr(buffer2,msg);
              if (p>0)
              {
               Envoi_Status=0;
               UART1_Write_CText("test ENVOI : ");
               UART1_Write_String(p,8);
               CRLF1();
               // test OK
               if ((*(p+5)=='O') && (*(p+6)=='K'))
               {
                 Envoi_Status=1;
               }
              }
             Delay_ms(1000);
        
          LCD_Write_CText_At(1,1,"Close Web page  ");
           strConstRamCpy(msg,"AT+CIPCLOSE=x\r\n");
           msg[12]=IPD;
           UART1_Write_Text(msg);
           RAZ_UART2();
           UART2_Write_Text(msg);
           Delay_ms(1500);
           UART1_Write_String(buffer2,100);
           CRLF1();
           Delay_ms(1000);

       // etat connection
              Max_Timer1=3;
              p=   Send_Cde_Test_response("AT+CIPSTATUS\r\n","+CIP");

           //   UART1_Write_CText( "Test ETAT  AT+CIPSTATUS\r\n");
           //   UART2_Write_CText( "AT+CIPSTATUS\r\n");
           //   RAZ_UART2();
           //   Delay_ms(600);
              RC2IE_bit=0;
              buffer2[MAXLEN2-1]=0;
              strConstRamCpy(msg,"STATUS:" );
              p=strstr(buffer2,msg);
              //p=strtok(buffer2,msg);
              //p=strtok(0,msg);
              if (p>0)
               { k=strncmp(buffer2,"STATUS:3",8);
             //if (k==0 )
             //{
               Web_Status='0';
               UART1_Write_CText("check status : ");
               UART1_Write_String(p,80);  CRLF1();
               Web_Status=*(p+7);
               }
               else
                {
                   UART1_Write_CText("\r\nbad answer\r\n");
                 }

            //strConstRamCpy(msg,"STATUS:?" );
            //Web_Status= memcmp(buffer2,msg,8);
            

            

    // gestion perte de connetion
            if ((Web_Status=='3') && (Envoi_Status==1))
            {
              j=0; 
              if ( Drapeaux.First_Run==0) NbC++;
              }
              else 
              { 
               // Cpt=0;
                j++;
                }
            if (j>3)
            {

              j=0;
              Max_Timer1=8;
               p=   Send_Cde_Test_response("AT+CIPSERVER=0\r\n","OK");
               p=0;
                Max_Timer1=20;
                p=   Send_Cde_Test_response("AT+RST\r\n","OK");
                p=0;
                  Max_Timer1=4;
                   p=   Send_Cde_Test_response("AT+CIPMUX=1\r\n","OK");
                   p=0;
                     Max_Timer1=12; // 3sec
                     p=Send_Cde_Test_response("AT+CIPSERVER=1,80\r\n","GET");
                     p=0;
            }
            else
            Delay_ms(2000);
           
            NbB++;
            // attendre la 1ere bonne connection
            if ((Drapeaux.First_Run==1) &&  (NbB>10) && (Web_Status=='3')   )
            {
               Drapeaux.First_Run=0;
               NbB=10;
               NbC=10;
               Pourcent=0.0;
            }
            if (Drapeaux.First_Run==0)
            {
                Pourcent=((float) NbC * 100.0)/(float)NbB;

            }

            UART1_Write_CText("Nb essai j =");
            UART1_Write(j+48);
            UART1_Write_CText(" CIP STATUS = ");
            UART1_Write(Web_Status);
            UART1_Write_CText(" ENVOI STATUS = ");
            UART1_Write(Envoi_Status+48);
            UART1_Write_CText(" NbB =");
            WordToStr(NbB ,CRam1);
            UART1_Write_Text(CRam1);
            UART1_Write_CText(" NbC =");
            WordToStr(NbC ,CRam1);
            UART1_Write_Text(CRam1);
            UART1_Write_CText(" Taux % =");
            Float2Ascii (Pourcent,CRam1,1) ;
            UART1_Write_Text(CRam1);
            CRLF1();



    if(UART1_DataReady==1)
     {
         RAZ_UART2();
         UART1_Write_CText("Envoi de :  ");
         UART1_Write_String(buffer1,40);
         CRLF1();
         UART2_Write_String(buffer1,40);
         CRLF2();
         Delay_ms(2500);
         UART1_Write_String(buffer2,40);CRLF1();
        RAZ_UART2();
        RAZ_UART1();
     }
    if( UART1_DataReady==2)
    {
       UART1_Write_CText("\r\n Debordement Buffer1 UART1 \r\n");
       UART1_Write_String(buffer1,60);
       RAZ_UART1();
    }
     LD2 =!LD2;    // clignote Led 2

   } // while 1

 }

/*
 <title>WIFI3-Click</title><h2><br>Temper. Amb :<br> 28.03 °C<br>BP1 = 1<br>BP2 = 1<br></h2>

*/