Sim800L loib obj sms
sim800l.cpp
- Committer:
- schnf30
- Date:
- 2022-04-30
- Revision:
- 1:2e6fa015734c
- Parent:
- 0:5c39ec4eaaa1
File content as of revision 1:2e6fa015734c:
#include "mbed.h" #include "sim800l.h" char _DataTmp[maxdata + 1]; // tableau de donnees pour stocker pendant reception char _Data[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues char _DataSms[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues char _Phrase[maxdata + 1]; // pour convertir en phrase avant envoi Sim800l::Sim800l(PinName tx, PinName rx, PinName resetpin,int baudrate):serial(tx,rx), reset (resetpin) { reset.write(0); //reset _DataTmp = new char[maxdata + 1]; // tableau de donnees pour stocker pendant reception _Data = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues _DataSms = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues _Phrase = new char[maxdata + 1]; // pour convertir en phrase avant envoi _DataTmp[0] = 0; _Data[0] = 0; _DataPtr = 0; _DataReady = false; _SmsReady = false; _IndexSms = 0; serial.baud(baudrate); // configure data baud } // retourne incdex du sms recu int Sim800l::IndexSmsRecu(void) { return _IndexSms; } // return true si une phrase a ete recue bool Sim800l::dataready(void) { return _DataReady; } // return phrase recu char * Sim800l::read(void) { _DataReady = false; return _Data; } // recoit les caractere serie et les stocke en tache de fond void Sim800l::receive() { char inChar; if (serial.readable()) { inChar = serial.getc(); // pc.putc(inChar); // pour echo switch (inChar) { case '\n' : if (_DataPtr > 1) { // pc.printf("-%s/\r\n",_DataTmp); if (strncmp(_DataTmp,"+CMTI:",6)==NULL) { // recoit sms +CMTI: "SM",3 if (sscanf(_DataTmp,"+CMTI: \"SM\",%d",&_IndexSms)==1) _SmsReady = true; } else { // cmde strcpy(_Data,_DataTmp); _DataReady = true; } } _DataTmp[0] = 0; _DataPtr = 0; break; case 0 : break; case '\r' : break; case ' ' : if (_DataPtr==1) { if ( _DataTmp[0]=='>') { strcpy(_Data,_DataTmp); _DataReady = true; _DataTmp[0] = 0; _DataPtr = 0; break; } } default : _DataTmp[_DataPtr] = inChar; _DataPtr = _DataPtr + 1; _DataTmp[_DataPtr] = 0; } if (_DataPtr >= maxdata) { // si phrase trop longue vide phrase _DataTmp[0] = 0; _DataPtr = 0; } } } // fonction appele en fin timerout void Sim800l::Ftimeout() { FinTimeOut = true; } // defini time out et le lance void Sim800l::SetTimeout(float delay) { FinTimeOut = false; _timeout.attach(callback(this,&Sim800l::Ftimeout),delay); // timeout.attach(callback(this, &Sonar::trigger_toggle), 10.0e-6); } // attente reponse dans *reponse jusqua timeout bool Sim800l::waitreponse(const char *reponse,float timeout) { SetTimeout(timeout); while (FinTimeOut==false) { // attente Ok if (dataready()) { if (strcmp(read(),reponse)==0) return true; } } return false; // timeout ecoule donc erreur } // envoi commande et attend reponse bool Sim800l::writecmdandwaitreponse(const char *data, const char *reponse,float timeout) { serial.printf("%s",data); return waitreponse(reponse,timeout); } // initialise SIM800L en mode SMS Texte // configure baud // Renvoi // - true tout s'est bien passé // - false erreur // cmdecho = true --> copie donne de reponse sim800l vers pc bool Sim800l::init() { bool resultat = true; _DataTmp[0] = 0; _Data[0] = 0; _DataPtr = 0; _DataReady = false; _SmsReady = false; _IndexSms = 0; reset.write(0); //reset thread_sleep_for(200); reset.write(1); serial.attach(callback(this, &Sim800l::receive), RawSerial::RxIrq); // affecte interruption sur Rx thread_sleep_for(1000); int i=0; while (!writecmdandwaitreponse("AT\r\n","OK",timeoutdefaut)) { // on attend 10 x pas plus if (i++>10) return false; } if (!waitreponse("Call Ready",timewaitCallready)) return false; if (!waitreponse("SMS Ready",timewaitSmsready)) return false; return writecmdandwaitreponse("AT+CMGF=1\r\n","OK",timeoutdefaut); // Passe sms mode texte } bool Sim800l::smsclearall(void) { return writecmdandwaitreponse("AT+CMGDA=\"DEL ALL\"\r\n","OK",timewaitSmsallclear); // efface sms } bool Sim800l::smsready(void) { bool _SmsReadytemp = _SmsReady; _SmsReady = false; return _SmsReadytemp; } bool Sim800l::sendsms(const char *phonenumber,const char *data) { if (!writecmdandwaitreponse("AT+CMGF=1\r\n","OK",timeoutdefaut)) return false; // Passe sms mode texte sprintf(_Phrase,"AT+CMGS=\"%s\"\r\n",phonenumber); if (!writecmdandwaitreponse(_Phrase,">",timeoutsendsms)) return false; // ouvre sms sprintf(_Phrase,"%s%c\r\n",data,26); return writecmdandwaitreponse(_Phrase,"OK",timeoutsendsms); // envoi message } // attente r eponse dans *reponse bool Sim800l::waitsmsreponse(const char *reponse,float timeout) { char DataSmsOk = 0; _DataSms[0] = 0; SetTimeout(timeout); while (FinTimeOut==false) { // attente Ok if (dataready()) { // pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms); if (strcmp(read(),reponse)==0) return true; if (strncmp(_Data,"+CMGR:",6)==NULL) DataSmsOk = 1; else if (DataSmsOk!=0) { if (DataSmsOk > 1) strcat(_DataSms,","); strcat(_DataSms,_Data); DataSmsOk = 2; } // pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms); } } return false; // timeout ecoule donc erreur } char *Sim800l::readtextesms() { return _DataSms; } bool Sim800l::readsms(int index) { serial.printf("AT+CMGR=%d,0\r\n",index); return waitsmsreponse("OK",timeoutreadsms); }