WORD GSM_HttpRead(far char * URL)

WORD GSM_HttpRead(far char * URL)
{			
 WORD wTemp;
 static BYTE HttpGetFlag = 0;
 static BYTE HttpUrlFlag = 0;
 static BYTE HttpReadFlag = 0;
 static BYTE HttpElement = 255;
 static BYTE update = 0;
 char *p;
 BYTE i, buf[4];
 char PN[25];
 if(ModemGsm.Signal.Control.RcvMessage){
  if(GSM_CompareMessage("CONNECT") && Gsm.ActualCommand == mcQHTTPURL){
   UART_PutData(MODEM, URL, strlen((const char*)URL));
   UART_PutData(GSM_DEBUG, URL, strlen((const char*)URL));
#if defined(SENSOR_HISTORY)
   if(SensorFlag.bits.DataHistory){
    if(strstr((const char*)URL, ".00.") != NULL)	HttpElement = 0;
    else if(strstr((const char*)URL, ".1E.") != NULL)	HttpElement = 30;
    else if(strstr((const char*)URL, ".1F.") != NULL)	HttpElement = 31;
   }
#endif
   Gsm.State = NONE;
   ModemGsm.Signal.Control.RcvMessage = FALSE;
  }
  else if(GSM_CompareMessage("ANSWER OK") && Gsm.ActualCommand == mcQHTTPREAD){
  // precitaj odpoved, dopisat kod
   Gsm.State = NONE;
   ModemGsm.Signal.Control.RcvMessage = FALSE;
  }
  else if(GSM_CompareMessage("NORMAL POWER DOWN") && Gsm.ActualCommand == mcQPOWD){
    UM_G_LedOn(0);
    DelayMs(3000);
    UM_G_LedOn(1);
    DelayMs(1000);
    UM_G_LedOn(0);
    DelayMs(1000);
 #if defined(UART_5)
    if(bEPPflags.bits.usb_connect)	disconnect_USB();
 #endif
    UM_G_LedOn(1);
    DelayMs(1000);
    UM_G_LedOn(0);
    DelayMs(1000);
    UM_G_LedOn(1);
    DelayMs(1000);
    Reset();
   }
  else if(GSM_CompareMessage("flash") && Gsm.ActualCommand == mcQHTTPREAD){
   Gsm.State = NONE;
   ModemGsm.Signal.Control.RcvMessage = FALSE;
   VERSION_GetUDN(PN, 0);
   if((p = (char*)strchr(PN,'.')) != NULL)	(*p) = 0;
   VERSION_GetSwVersion(bTemp);
   if(!GSM_CompareMessage(bTemp) && GSM_CompareMessage(PN)){
    bTemp[6] = 0;
    if(OsSocket.status.semaphore.update_save && GSM_CompareMessage(bTemp)){
     if(CORE_SaveBackup()){
#if defined(FIREBOX)
      INTERNAL_EEPROM_WriteByte( 0x3fe, 0x82 );
#else
      INTERNAL_EEPROM_WriteByte( 0x3fe, 0x81 );
#endif
      goto _UPDATE_PROCESS;
     }
    }
    else{
#if defined(FIREBOX)
     INTERNAL_EEPROM_WriteByte( 0x3fe, 0x42 );
#else
     INTERNAL_EEPROM_WriteByte( 0x3fe, 0x41 );
#endif _UPDATE_PROCESS:
     wTemp = 0x3c8;
     for(i=0; i < strlen((const char*)TableApnSettingGPRS[Gsm.Operator].APN); i++){
      if((wTemp + (WORD)i) == 0x3fd)	goto _END_CONFIGURE_APN;
      INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i, TableApnSettingGPRS[Gsm.Operator].APN[i] );
     }
     INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i, 0 );	
     INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i + 1, 0 );			
     wTemp += (strlen((const char*)TableApnSettingGPRS[Gsm.Operator].APN) + 1);
     for(i=0; i < strlen((const char*)TableApnSettingGPRS[Gsm.Operator].Name); i++){
      if((wTemp + (WORD)i) == 0x3fd)	goto _END_CONFIGURE_APN;
      INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i, TableApnSettingGPRS[Gsm.Operator].Name[i] );
     }
     INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i, 0 );
     INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i + 1, 0 );
     wTemp += (strlen((const char*)TableApnSettingGPRS[Gsm.Operator].Name) + 1);
     for(i=0; i < strlen((const char*)TableApnSettingGPRS[Gsm.Operator].Password); i++){
      if((wTemp + (WORD)i) == 0x3fd)	break;
      INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i, TableApnSettingGPRS[Gsm.Operator].Password[i] );
     }
_END_CONFIGURE_APN:
     INTERNAL_EEPROM_WriteByte( wTemp + (WORD)i, 0 );
#if defined(FIREBOX) && !defined(INTERCOM)
     EA_DOGM132X_5_ClrDisplay();
     strcpy((char*)dog_chars_buffer, "UPDATE ");
     strcat((char*)dog_chars_buffer, "FIRMWARE");
     AppFlag.bits.actualy_display = TRUE;
     dog_index = 0;
#if defined(BACK_LIGHT_DISPLAY)
     EA_DOGM132X_5_BackLightDisplay( 1 );
#endif
#endif
#if defined(DISPLAY)
     EA_DOGM132X_5_ClrDisplay();
     strcpy((char*)dog_chars_buffer, "UPDATE ");
     strcat((char*)dog_chars_buffer, "FIRMWARE");
     AppFlag.bits.actualy_display = TRUE;
     dog_index = 0;
#if defined(BACK_LIGHT_DISPLAY)
     EA_DOGM132X_5_BackLightDisplay( 1 );
#endif
#endif
#if defined(LED_DISPLAY)
     buf[0] = 'U';
     buf[1] = 'P';
     buf[2] = 'D';
     buf[3] = 'F';
     I2C_SEG8B4A036A_SetSleep(0, SET_ADDR, 0);
     I2C_SEG8B4A036A_Print(0, SET_ADDR, buf);
#if defined(FILIP)
     DelayMs(1000);
     POWER_MANAGEMENT_Buzzer(0);
     DelayMs(500);
     POWER_MANAGEMENT_Buzzer(1);
     DelayMs(100);
     POWER_MANAGEMENT_Buzzer(0);
     DelayMs(500);
     POWER_MANAGEMENT_Buzzer(1);
     DelayMs(100);
     POWER_MANAGEMENT_Buzzer(0);
     DelayMs(500);
     POWER_MANAGEMENT_Buzzer(1);
     DelayMs(100);
     POWER_MANAGEMENT_Buzzer(0);
     DelayMs(500);
#else
     DelayMs(3000);
#endif
#endif
     INTERNAL_EEPROM_WriteByte( 0x3ff, 0x55 );
     update = 1;
    }
   }
  }
  else if(GSM_CompareMessage(GSMResponse[mrOK])){   //prikaz bol uspesne vykonany
   switch(Gsm.ActualCommand){
    case mcQHTTPURL:
     ModemGsm.Signal.Control.CommandOK = TRUE;
     Gsm.State = HTTP_GET;
     HttpUrlFlag = 0;
     ModemGsm.Signal.Control.RcvMessage = FALSE;
     break;
    case mcQHTTPGET:
     ModemGsm.Signal.Control.CommandOK = TRUE;
     Gsm.State = HTTP_READ;
     HttpGetFlag = 0;
     ModemGsm.Signal.Control.RcvMessage = FALSE;
     break;
    case mcQHTTPREAD:
     ModemGsm.Signal.Control.CommandOK = TRUE;
     HttpReadFlag = 0;
     if(update){
      Gsm.State = MODEM_DISCONNECT;			
      update = 0;
      goto _MODEM_DISCONNECT;
     }
     else Gsm.State = NONE;
     ModemGsm.Signal.Control.Process = FALSE;
#if defined(SENSOR_HISTORY)
     if(SensorFlag.bits.DataHistory){
      if(HttpElement == 0)
       SensorFlag.bits.DataHistorySend = TRUE;
      else if(HttpElement == 30)
       SensorFlag.bits.DataHistorySend2 = TRUE;
      else if(HttpElement == 31)
       SensorFlag.bits.DataHistorySend3 = TRUE;
     }
#endif
     ModemGsm.Signal.Control.RcvMessage = FALSE;
     return 0;
   }
  }
  else if(GSM_CompareMessage(GSMResponse[mrERROR])){   
   switch(Gsm.ActualCommand){
    case mcQHTTPURL:
    case mcQHTTPREAD:
    case mcQHTTPGET:
     ModemGsm.Semaphore.Control.watchdog = FALSE;
     ModemGsm.Signal.Control.CommandOK = TRUE;
     Gsm.State = NONE;
     if(Gsm.ActualCommand == mcQHTTPURL)	HttpUrlFlag++;
     else if(Gsm.ActualCommand == mcQHTTPREAD)	HttpReadFlag++;
     else if(Gsm.ActualCommand == mcQHTTPGET)	HttpGetFlag++;
     if(HttpGetFlag == 3 || HttpUrlFlag == 3 || HttpReadFlag == 3 || !ModemGsm.Semaphore.Control.GprsAttach){
      ModemGsm.Signal.Control.Process = FALSE;
#if defined(SENSOR_HISTORY)
      if(SensorFlag.bits.DataHistory){
       if(HttpElement == 0)
        SensorFlag.bits.DataHistorySend = FALSE;
       else if(HttpElement == 30)
        SensorFlag.bits.DataHistorySend2 = FALSE;
       else if(HttpElement == 31)
        SensorFlag.bits.DataHistorySend3 = FALSE;
      }
#endif
      HttpGetFlag = 0; HttpUrlFlag = 0; HttpReadFlag = 0;
      ModemGsm.Signal.Control.RcvMessage = FALSE;
      return 0;
     }
     else{
      Gsm.State = HTTP_URL;
     }
     ModemGsm.Signal.Control.RcvMessage = FALSE;
     break;
   }
  }
 }
_MODEM_DISCONNECT:
 switch(Gsm.State){
  case HTTP_URL:
   Gsm.State = NONE;
   strcpy((char*)Gsm.CommandData, GSMCommand[mcQHTTPURL]);
   wTemp = strlen((const char*)URL);
   ui_to_a(wTemp, bTemp);
   strcat((char*)Gsm.CommandData, bTemp);
   strcat((char*)Gsm.CommandData, ",30\r");
   Gsm.ActualCommand = mcQHTTPURL;
   ModemGsm.Signal.Control.SendCommand = TRUE;
   break;
  case HTTP_GET:
   Gsm.State = NONE;
   strcpy((char*)Gsm.CommandData, GSMCommand[mcQHTTPGET]);
   strcat((char*)Gsm.CommandData, "30,20\r");
   Gsm.ActualCommand = mcQHTTPGET;
   ModemGsm.Signal.Control.SendCommand = TRUE;
   break;
  case HTTP_READ:
   Gsm.State = NONE;
   strcpy((char*)Gsm.CommandData, GSMCommand[mcQHTTPREAD]);
   strcat((char*)Gsm.CommandData, "30\r");
   Gsm.ActualCommand = mcQHTTPREAD;
   ModemGsm.Signal.Control.SendCommand = TRUE;
   break;
  case MODEM_DISCONNECT:
   Gsm.State = NONE;
   strcpy((char*)Gsm.CommandData, GSMCommand[mcQPOWD]);
   Gsm.ActualCommand = mcQPOWD;
   ModemGsm.Signal.Control.SendCommand = TRUE;
   break;
 }	
 return 1;
}