Lib SIM5320 avec SMS

Dependents:   0-sim5320e-L432KC-relais-0

sim5320e.cpp

Committer:
schnf30
Date:
2022-05-18
Revision:
1:8eff8b2b35e8

File content as of revision 1:8eff8b2b35e8:


#include "mbed.h"
#include "sim5320e.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
c // pour convertir en phrase avant envoi
*/
sim5320e::sim5320e(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
        */
    _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 sim5320e::IndexSmsRecu(void)
{
    return _IndexSms;
}
// return true si une phrase a ete recue
bool sim5320e::dataready(void)
{
    return _DataReady;
}
// return phrase recu
char * sim5320e::read(void)
{
    _DataReady = false;
    return _Data;
}
// recoit les caractere serie et les stocke en tache de fond
void sim5320e::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 sim5320e::Ftimeout()
{
    FinTimeOut = true;
}
// defini time out et le lance
void sim5320e::SetTimeout(float delay)
{
    FinTimeOut = false;
    _timeout.attach(callback(this,&sim5320e::Ftimeout),delay);
}
// attente reponse dans *reponse jusqua timeout
bool sim5320e::waitreponse(const char *reponse,float timeout)
{
    SetTimeout(timeout);
    while (FinTimeOut==false) { // attente Ok
        if (dataready()) {
            char tmp[maxdata + 1];
            strcpy(tmp,read());
            if (strcmp(tmp,reponse)==0) return true;
            if (strcmp(tmp,"ERROR")==0) return false;
        }
    }
    return false; // timeout ecoule donc erreur
}
// envoi commande et attend reponse
bool sim5320e::writecmdandwaitreponse(const char *data, const char *reponse,float timeout)
{
    serial.printf("%s\r\n",data);
    return waitreponse(reponse,timeout);
}
// initialise sim5320e en mode SMS Texte
// configure baud
// Renvoi
// - true tout s'est bien passé
// - false erreur
// cmdecho = true --> copie donne de reponse sim5320e vers pc
bool sim5320e::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(100);
    reset.write(1);
    thread_sleep_for(1000);
    serial.attach(callback(this, &sim5320e::receive), RawSerial::RxIrq); // affecte interruption sur Rx
    int i=0;
    while (!writecmdandwaitreponse("AT","START",timeoutdefaut)) { // on attend 10 x pas plus
        if (i++>10) return false;
    }
    if (!waitreponse("+CPIN: READY",timewaitCallready)) return false;
    if (!waitreponse("SMS DONE",timewaitCallready)) return false;
    return waitreponse("PB DONE",timewaitCallready);
}

// initialise mode sms
bool sim5320e::smsinit(void)
{
    if (!writecmdandwaitreponse("AT+CMGF=1","OK",timeoutdefaut)) return false;  // sms mode texte
    if (!writecmdandwaitreponse("AT+CNMI=2,1","OK",timeoutdefaut)) return false;  // tretourne tout te
    if (!writecmdandwaitreponse("AT+CSDH=1","OK",timeoutdefaut)) return false;
    return writecmdandwaitreponse(" AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",timeoutdefaut);;
}
// efface tous les message
bool sim5320e::smsclearall(void)
{
    return writecmdandwaitreponse("AT+CMGD=1,4","OK",timewaitSmsallclear);  // efface sms

}
bool sim5320e::smsready(void)
{
    bool _SmsReadytemp = _SmsReady;
    _SmsReady = false;
    return _SmsReadytemp;
}
bool sim5320e::sendsms(const char *phonenumber,const char *data)
{
    if (!writecmdandwaitreponse("AT+CMGF=1","OK",timeoutdefaut)) return false;  // Passe sms mode texte
    char _Phrase[maxdata + 1];
    sprintf(_Phrase,"AT+CMGS=\"%s\"",phonenumber);
    if (!writecmdandwaitreponse(_Phrase,">",timeoutdefaut)) return false;  // ouvre sms
    sprintf(_Phrase,"%s%c",data,26);
    return writecmdandwaitreponse(_Phrase,"OK",timeoutsendsms); // envoi message
}
// Lecture sms jusqua reception reponse dans *reponse
bool sim5320e::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;  // sms termine cest tout bon
            if (strncmp(read(),"+CMS ERROR",9)==0) return false;  // sms termine cest tout bon
            if (strncmp(read(),"+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 *sim5320e::readtextesms()
{
    return _DataSms;
}
bool sim5320e::readsms(int index)
{
    serial.printf("AT+CMGR=%d\r\n",index);
    return waitsmsreponse("OK",timeoutreadsms);
}