Lib SIM5320 avec SMS

Dependents:   0-sim5320e-L432KC-relais-0

Revision:
0:d63231e47571
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sim800l.cpp	Sun May 01 06:28:05 2022 +0000
@@ -0,0 +1,193 @@
+
+#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\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\n","OK",timeoutdefaut);  // Passe sms mode texte
+}
+bool Sim800l::smsclearall(void)
+{
+    return writecmdandwaitreponse("AT+CMGDA=\"DEL ALL\"\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\n","OK",timeoutdefaut)) return false;  // Passe sms mode texte
+    sprintf(_Phrase,"AT+CMGS=\"%s\"\n",phonenumber);
+    if (!writecmdandwaitreponse(_Phrase,">",timeoutsendsms)) return false;  // ouvre sms
+    sprintf(_Phrase,"%s%c\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\n",index);
+    return waitsmsreponse("OK",timeoutreadsms);
+}
\ No newline at end of file