/*
                                                   Bovolenta Aprile 2017
         JUMBO elettronica

          GESTIONE INVIO PAGINA WEB
          
          COMANDI AT PER ESP8266     Aggiornamento: 20/06/2020 V.3.0
          
          
         #include "ESP8266_Routine.c"

*/
 extern const char AT[] =         "AT+";
 extern const char AT_CIPSEND[] = "CIPSEND=";
 const char AT_CIPCLOSE[] ="CIPCLOSE=";
//
//  --- Prototipe:
  extern void Delay_msec (unsigned int count_delay);
  extern unsigned int Calc_Value (unsigned short tilde, unsigned short count);
//  unsigned int Length_Packet(const unsigned short *packet);
//  void UART_Write_Const(const char *packet);
  unsigned int UART_Length_Write_Const (const char *packet, char mode);
//
  #include "Utility.c"
//
// *****************************************************************************
//
// *****************************************************************************
 void New_Line_Return() {
//
        UART1_Write(0x0D);   //  Carriage return
         UART1_Write(0x0A);  //  Line feed
 }
// *****************************************************************************  INVIO PAGINE WEB
//
//  Send_Web_Page (packet, ch_id, closed);
//
//  packet: pagina web da inviare
//  ch_id: Identificativo di connessione (dal browser)
//  closed: tiene aperta la porta nel caso sia necessario l'invio di altri pacchetti.
//          Nel caso contrario la chiude:
//          "closed" = 0: continue send packet; "closed" = 1: close connection;
// *****************************************************************************
 void Send_Web_Page (const char *packet, char ch_id_, char closed) {
  unsigned int buff_word;
// ------------------------------------------------- Calcola lunghezza pacchetto
//                                                                                 // 27/06/2018
    if (flag_.closed) return;     // Se è intervenuto il time-out nel precedente pacchetto, non continuare a inviare i successivi
//
     buff_word = UART_Length_Write_Const (packet, 1); // Solo conteggio
// --- Trasmissione N.caratteri  Es.: AT+CIPSEND=0,876
 reinvia:
        esp8266_Send(AT);            //
         esp8266_Send(AT_CIPSEND);        // AT+CIPSEND
          UART1_Write(ch_id_);            // Identificativo di connessione (dal browser)
           UART1_Write(',');
            Word_to_string(buff_word);   // Word to string senza zeri iniziali
             UART1_Write(0x0D);
              UART1_Write(0x0A);
// --- Wait "busy" con Time-Out
        get_resp_timeout = 0;        // Inizializze TimeOut
         while(Get_Response() != busy) {
           Delay_msec (20);
            get_resp_timeout ++;
             if ( get_resp_timeout >= 250) {    // Time-Out di 4 sec (200)
               goto Close_connection;
             //  goto continue_;
             }
            //  if (Get_Response() == ERROR) {
            //   goto reinvia;
            //  }
         }
// ---
 continue_:
       Delay_msec(10);           // 100
// ---------------------------------------------------------------- Send packet
     UART_Length_Write_Const (packet, 0); // Invia pacchetto
// --- Wait response "OK" con Time-Out
         get_resp_timeout = 0;                   // Inizializze TimeOut
          while(Get_Response() != OK && get_resp_timeout <= 250) {  // Time-Out di 4 sec (200)
             Delay_msec (20);
              get_resp_timeout ++;
          }
// --- "closed" = 0: continue send packet; "closed" = 1: close connection;
      if (closed == 0) {
        flag_.closed = 0;
         return;
      }
        else  flag_.closed = 1;
// --- Chiude la connessione: il ESP8266 invia il pacchetto in memoria al browser
 Close_connection:
               Delay_msec(10);                     // 100
                esp8266_Send(AT);
                 esp8266_Send(AT_CIPCLOSE);  // AT+CIPCLOSE
                  UART1_Write(ch_id_);    // Identificativo di connessione (dal browser)
                   UART1_Write(0x0D);
                    UART1_Write(0x0A);
                     Delay_msec(20);      // 200

//
 }
// *****************************************************************************
// mode: 1 = solo conteggio, 0 = invio pagina web
// *****************************************************************************
 unsigned int UART_Length_Write_Const (const char *packet, char mode) {
  unsigned short i=0, cnt_8, tilde, j;
  unsigned int cnt_16=0, cnt_var_tot=0, cnt_var;
  char buf;
//
      do {
        buf = packet[cnt_16];
         cnt_16 ++;
// --- tilde: sostituici il valore della varabile puntata da <i> (i) o da <i+24> (j)
          if (buf == '~') { // Rileva tilde e sostituiscilo con il valore della variabile
            tilde = ((packet[cnt_16]-0x30)*10) ;   // Carica il numero della variabile da aggiornare (decine)
             cnt_16 ++;                            // buff_16 -> +2 (decine)
               tilde += (packet[cnt_16]-0x30) ;   // Carica il numero della variabile da aggiornare (unità)
                cnt_16 ++;                        // buff_16 -> +3 (unità)
                 cnt_var_tot += Calc_Value (tilde, mode);
                  cnt_var_tot -= 3;
          }
// --- mode
             else if (mode==0 && buf != '\0') UART1_Write(buf);   // se richiesto invia dato

      } while (buf);
//
         cnt_16 --;
//
       if (mode ==0) {
         New_Line_Return ();
        //  LED_1 = 1; Delay_msec(100); LED_1 = 0;
           Delay_msec(10);                           // 100
       }
        return (cnt_16 + cnt_var_tot);
//
 }
// *****************************************************************************  // 19/06/2020  V.3.0
// *****************************************************************************
 void Send_Image (const char *packet, char ch_id_, char closed) {
  unsigned int buff_word, buf=0;
// ------------------------------------------------- Calcola lunghezza pacchetto
//                                                                                 // 27/06/2018
    if (flag_.closed) return;     // Se è intervenuto il time-out nel precedente pacchetto, non continuare a inviare i successivi
//

         else goto Close_connection;

// --- Trasmissione N.caratteri  Es.: AT+CIPSEND=0,876
 reinvia:
        esp8266_Send(AT);            //
         esp8266_Send(AT_CIPSEND);        // AT+CIPSEND
          UART1_Write(ch_id_);            // Identificativo di connessione (dal browser)
           UART1_Write(',');
            Word_to_string(buff_word);   // Word to string senza zeri iniziali
             UART1_Write(0x0D);
              UART1_Write(0x0A);
// --- Wait "busy" con Time-Out
        get_resp_timeout = 0;        // Inizializze TimeOut
         while(Get_Response() != busy) {
           Delay_msec (20);
            get_resp_timeout ++;
             if ( get_resp_timeout >= 250) {    // Time-Out di 4 sec (200)
               goto Close_connection;
             //  goto continue_;
             }
            //  if (Get_Response() == ERROR) {
            //   goto reinvia;
            //  }
         }
// ---
 continue_:
       Delay_msec(10);           // 100
// ---------------------------------------------------------------- Send packet

     do {
        UART1_Write(packet[buf]);   // se richiesto invia dato
         buf ++;
      } while (buf <= buff_word);
      // ---------------------------------------------------------
// --- Wait response "OK" con Time-Out
         get_resp_timeout = 0;                   // Inizializze TimeOut
          while(Get_Response() != OK && get_resp_timeout <= 250) {  // Time-Out di 4 sec (200)
             Delay_msec (20);
              get_resp_timeout ++;
          }
// --- "closed" = 0: continue send packet; "closed" = 1: close connection;
      if (closed == 0) {
        flag_.closed = 0;
         return;
      }
        else  flag_.closed = 1;
// --- Chiude la connessione: il ESP8266 invia il pacchetto in memoria al browser
 Close_connection:
               Delay_msec(10);                     // 100
                esp8266_Send(AT);
                 esp8266_Send(AT_CIPCLOSE);  // AT+CIPCLOSE
                  UART1_Write(ch_id_);    // Identificativo di connessione (dal browser)
                   UART1_Write(0x0D);
                    UART1_Write(0x0A);
                     Delay_msec(20);      // 200

//
 }
/*















*/