//***************************************************************
// SENDEMAIL.C
// Invia una email alla pressione di un tasto
//
// TANZILLI.COM di Sergio Tanzilli
// http://www.tanzilli.com/?id=1314
//***************************************************************

#include <18F452.h>
#use Delay(Clock=10000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP

#include <stdio.h>
#include <gm862.h>

// Operatore telefonico

//#define WIND			
//#define TIM 			
//#define VODAFONE
#define OMNITEL

#define MAIL_FROM "info@ee01.it"
#define MAIL_TO   "info@ee01.it"

// Selezione dei parametri variabili in base all'operatore
// telefonico a cui appartiene la SIM

#ifdef WIND
#define GPRS_APN 		"internet.wind.biz"
#define GPRS_USERID "none"
#define GPRS_PASSWD "none"
#define GPRS_SMTP 	"smtp.libero.it"
#endif

// TIM e' l'unico operatore che richiede user e password per
// accedere al GPRS. In GPRS_USERID indicare il numero di telefono della SIM
// senza prefisso internazionale. Es. 33912345678. Nel campo GPRS_PASSWD inserire
// la password assegnata da TIM

#ifdef TIM
#define GPRS_APN 		"uni.tim.it"
#define GPRS_USERID "3391234567"				
#define GPRS_PASSWD "111111"		    		
#define GPRS_SMTP 	"mail.posta.tim.it"
#endif

#ifdef VODAFONE
#define GPRS_APN 		"web.omnitel.it"
#define GPRS_USERID "none"
#define GPRS_PASSWD "none"
#define GPRS_SMTP 	"smtp.net.vodafone.it"
#endif

#ifdef OMNITEL
#define GPRS_APN 		"web.omnitel.it"
#define GPRS_USERID "none"
#define GPRS_PASSWD "none"
#define GPRS_SMTP 	"smtp.net.vodafone.it"
#endif

// Linea a cui collegare il led di segnalazione. 
// Si accende quando il modulo EE01 è pronto per leggere lo 
// stato del pulsante KEY
#define LED       PIN_C0 
        
// Linea su cui collegare il pulsante di invio 
#define KEY       PIN_C2

void main(void) {  
  int i;
  int cMail;
  
  char buffer[256];
  char token[10];
  
  cMail=0;
  
  // Abilita gli interrupt in ricezione sulla USART collegata al modem
  enable_interrupts(int_rda); 
  enable_interrupts(global);

  // Mette i criteri del modem i stato di riposo
  gm_LineInit();
  
  // Accende il modem
  gm_PowerOn();

  // Aspetta che il modem si registri alla rete GSM
  // Se questo non avviene il programma rimane in questo loop
  // ed il led continua a lampegiare
  
  while (gm_NetworkChecking()==0) {
    output_high(LED);
    delay_ms(500);
    output_low(LED);
    delay_ms(500);
  }
  delay_ms(500);

  // Invia al modem i dati relativi all'accesso GPRS
  // In questo esempio viene utilizzato un accesso a wind
  // Per conoscere i parametri degli alti operatori:
  // http://www.tanzilli.com/?id=6
  
  sprintf(token,"OK");

  printf(gm_putc,"AT+CGDCONT=1,\"IP\",\"%s\",\"0.0.0.0\",0,0\r",GPRS_APN);
  gm_WaitToken(1000,token,buffer);
  delay_ms(500);

  printf(gm_putc,"AT#USERID=\"%s\"\r",GPRS_USERID);
  gm_WaitToken(1000,token,buffer);
  delay_ms(500);

  printf(gm_putc,"AT#PASSW=\"%s\"\r",GPRS_PASSWD);
  gm_WaitToken(1000,token,buffer);
  delay_ms(500);

  printf(gm_putc,"AT#SKTSET=0,25,\"%s\"\r",GPRS_SMTP);
  gm_WaitToken(1000,token,buffer);
  delay_ms(500);

  printf(gm_putc,"AT#SKTSAV\r");
  gm_WaitToken(1000,token,buffer);
  delay_ms(500);
  
  // Con il comando SKTSAV si programma nella EEPROM del modem 
  // la configurazione di accesso del proprio operatore telefonico
  // Questa configurazione rimane memorizzata nel modem anche in assenza
  // di alimentazione per cui per gli accessi successivi non è necessario
  // ritrasmetterla a meno di non cambiare la carta SIM con quella di
  // un altro operatore.
  
  // Accende il led fisso per indicare che e' pronto
  // per accettare la pressione del tasto KEY
  
  output_high(LED);
  for (;;) {
    
    // Se viene premuto il tasto KEY spegne il LED e trasmette l'email
    if (input(KEY)==0) {
      output_low(LED);
      
      // Si connette al server SMTP
      
      for (;;) {
        sprintf(token,"CONNECT");
        printf(gm_putc,"AT#SKTOP\r");
        if (gm_WaitToken(5000,token,buffer)==0) {
          for (i=0;i<=10;i++) {
            output_high(LED);
            delay_ms(100);
            output_low(LED);
            delay_ms(100);
          }
        } else {
          delay_ms(500);
          break;
        } 
      }  

      // Invia i comandi direttamente al server SMTP
      // http://www.faqs.org/rfcs/rfc821.html
  
      output_low(GM_RTS);

      sprintf(token,"250");
      printf(gm_putc,"HELO %s\r\n",GPRS_SMTP);
      gm_WaitToken(4000,token,buffer);
    
      printf(gm_putc,"MAIL FROM:<%s>\r\n",MAIL_FROM);
      gm_WaitToken(2000,token,buffer);
    
      printf(gm_putc,"RCPT TO:<%s>\r\n",MAIL_TO);
      gm_WaitToken(2000,token,buffer);
    
      sprintf(token,"354");
      printf(gm_putc,"DATA \r\n");
      gm_WaitToken(2000,token,buffer);
    
      printf(gm_putc,"From: %s\r\n",MAIL_FROM);
      printf(gm_putc,"To: %s\r\n",MAIL_TO);
      printf(gm_putc,"Subject: Messaggio n.%d\r\n\r\n",++cMail);
      printf(gm_putc,"Tasto KEY premuto %d volte\r\n",cMail);
      printf(gm_putc,"--------------------------\r\n",cMail);
      printf(gm_putc,"   APN GPRS = %s\r\n",GPRS_APN);
      printf(gm_putc,"SMTP SERVER = %s\r\n",GPRS_SMTP);
      printf(gm_putc,"\r\n.\r\n");
    
      sprintf(token,"250");
      gm_WaitToken(4000,token,buffer);
    
      printf(gm_putc,"+++");
  
      // Attende che venga rilasciato il punsante
      while (input(KEY)==0);
      output_high(GM_RTS);
      output_high(LED);
    } 
  }  
}
