Sim800L loib obj sms

Files at this revision

API Documentation at this revision

Comitter:
schnf30
Date:
Sat Apr 23 08:01:40 2022 +0000
Child:
1:2e6fa015734c
Commit message:
VERSION POUR F746ZG

Changed in this revision

sim800l.cpp Show annotated file Show diff for this revision Revisions of this file
sim800l.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sim800l.cpp	Sat Apr 23 08:01:40 2022 +0000
@@ -0,0 +1,186 @@
+
+#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[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);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sim800l.h	Sat Apr 23 08:01:40 2022 +0000
@@ -0,0 +1,62 @@
+#ifndef _sim800l_
+#define _sim800l_
+#include "mbed.h"
+
+#define maxdata 1000
+#define timeoutdefaut 1
+#define timeoutsendsms 60
+#define timeoutreadsms 5
+#define timewaitCallready 10
+#define timewaitSmsready 60
+#define timewaitSmsallclear 25
+#define timewaitCCID 2
+
+extern RawSerial pc;
+
+class Sim800l
+{
+public:
+    /*
+    * Constructor
+    *
+    * @param tx mbed pin to use for tx line of Serial interface
+    * @param rx mbed pin to use for rx line of Serial interface
+    * @param reset reset pin of the wifi module ()
+    */
+    Sim800l(PinName tx, PinName rx, PinName resetpin, int baudrate=9600);
+    bool init();
+    bool smsready(void);
+    bool sendsms(const char *phonenumber,const char *data);
+    bool readsms(int index);
+    bool smsclearall(void);
+    int IndexSmsRecu(void);
+    char *readtextesms();
+
+protected:
+    RawSerial serial;
+    DigitalOut reset;
+/*    
+    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
+*/
+    volatile int _DataPtr = 0; // position de stockage de la prochaine donnee a recevoir   
+    volatile bool _DataReady = false;
+    volatile bool _SmsReady = false;
+    volatile int _IndexSms;
+    Timeout _timeout; // permet deviter blocage en attente
+    volatile bool FinTimeOut;
+    bool dataready(void);
+    char * read(void);
+    void receive();
+    void Ftimeout();
+    void SetTimeout(float delay);
+// attente r eponse dans *reponse
+    bool waitreponse(const char *reponse,float timeout);
+// envoi commande et attend reponse
+    bool writecmdandwaitreponse(const char *data, const char *reponse,float timeout);
+// attente r eponse dans *reponse
+    bool waitsmsreponse(const char *reponse,float timeout);
+};
+#endif
\ No newline at end of file