Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: C027Interface C027Interface C027_SupportTest
Fork of C027_Support by
Diff: MDM.cpp
- Revision:
- 35:9275215a3a5b
- Parent:
- 33:fb8fb5021b09
- Child:
- 36:c4df7bcf9b6e
--- a/MDM.cpp Wed Apr 09 14:25:41 2014 +0000
+++ b/MDM.cpp Thu Apr 10 13:05:45 2014 +0000
@@ -4,7 +4,7 @@
#include "MDM.h"
#define TRACE (0)?:printf
-//#define DEBUG // enable this for AT command debugging
+#define DEBUG // enable this for AT command debugging
#define PROFILE "0" // this is the psd profile used
#define MAX_SIZE 256 // max expected messages
// some helper
@@ -40,7 +40,7 @@
{
memset(&_dev, 0, sizeof(_dev));
memset(&_net, 0, sizeof(_net));
- _ip = NOIP;
+ _ip = NOIP;
memset(_sockets, 0, sizeof(_sockets));
}
@@ -78,6 +78,7 @@
int len = LENGTH(ret);
int type = TYPE(ret);
const char* s = (type == TYPE_UNKNOWN)? YEL("UNK") :
+ (type == TYPE_TEXT) ? MAG("TXT") :
(type == TYPE_OK ) ? GRE("OK ") :
(type == TYPE_ERROR) ? RED("ERR") :
(type == TYPE_PLUS) ? CYA(" + ") :
@@ -179,7 +180,7 @@
int MDMParser::_cbString(int type, const char* buf, int len, char* str)
{
- if (str && (type == TYPE_UNKNOWN)) {
+ if (str && (type == TYPE_TEXT)) {
if (sscanf(buf, "\r\n%s\r\n", str) == 1)
/*nothing*/;
}
@@ -188,7 +189,7 @@
int MDMParser::_cbInt(int type, const char* buf, int len, int* val)
{
- if (val && (type == TYPE_UNKNOWN)) {
+ if (val && (type == TYPE_TEXT)) {
if (sscanf(buf, "\r\n%d\r\n", val) == 1)
/*nothing*/;
}
@@ -199,12 +200,15 @@
bool MDMParser::init(const char* pin, DevStatus* status)
{
- for(int i = 0; i < 5; i++) {
+ int i = 5;
+ while (i--) {
// check interface and disable local echo
sendFormated("AT\r\n");
if(OK == waitFinalResp())
break;
}
+ if (i == 0)
+ return false;
// echo off
sendFormated("AT E0\r\n");
if(OK != waitFinalResp())
@@ -226,10 +230,6 @@
return false;
// device specific init
if (_dev.dev == DEV_LISA_C200) {
- // disable flow control
- sendFormated("AT+IFC=0,0\r\n");
- if (OK != waitFinalResp())
- return false;
// get the manufacturer
sendFormated("AT+GMI\r\n");
if (OK != waitFinalResp(_cbString, _dev.manu))
@@ -247,20 +247,13 @@
if (OK != waitFinalResp(_cbString, _dev.meid))
return false;
} else {
- // disable flow control
- sendFormated("AT&K0\r\n");
- if (OK != waitFinalResp())
- return false;
- // enable power saving
- sendFormated("AT+UPSV=1\r\n");
- if (OK != waitFinalResp())
- return false;
- // enable the network identification feature
if (_dev.dev == DEV_LISA_U200) {
+ // enable the network identification feature
sendFormated("AT+UGPIOC=20,2\r\n");
if (OK != waitFinalResp())
return false;
} else {
+ // enable the network identification feature
sendFormated("AT+UGPIOC=16,2\r\n");
if (OK != waitFinalResp())
return false;
@@ -324,6 +317,14 @@
sendFormated("AT+CIMI\r\n");
if (OK != waitFinalResp(_cbString, _dev.imsi))
return false;
+ // enable power saving
+ if (_dev.lpm != LPM_DISABLED) {
+ // enable power saving (requires flow control, cts at least)
+ sendFormated("AT+UPSV=1\r\n");
+ if (OK != waitFinalResp())
+ return false;
+ _dev.lpm = LPM_ACTIVE;
+ }
if (status)
memcpy(status, &_dev, sizeof(DevStatus));
return true;
@@ -331,7 +332,7 @@
int MDMParser::_cbATI(int type, const char* buf, int len, Dev* dev)
{
- if ((type == TYPE_UNKNOWN) && dev) {
+ if ((type == TYPE_TEXT) && dev) {
if (strstr(buf, "SARA-G350")) {
*dev = DEV_SARA_G350;
/*TRACE("Identified Device: SARA-G350 2G\\n")*/;
@@ -857,7 +858,7 @@
if (type == TYPE_PLUS) {
if (sscanf(buf, "\r\n+CMGR: \"%*[^\"]\",\"%[^\"]", param->num) == 1) {
}
- } else if ((type == TYPE_UNKNOWN) && (buf[len-2] == '\r') && (buf[len-1] == '\n')) {
+ } else if ((type == TYPE_TEXT) && (buf[len-2] == '\r') && (buf[len-1] == '\n')) {
memcpy(param->buf, buf, len-2);
param->buf[len-2] = '\0';
}
@@ -912,6 +913,10 @@
}
}
if (!end) return o; // no termination
+ // at least any char
+ if (++o > len) return WAIT;
+ pipe->next();
+ // check the end
int x = 0;
while (end[x]) {
if (++o > len) return WAIT;
@@ -988,6 +993,7 @@
{ "\r\n+", "\r\n", TYPE_PLUS },
{ "\r\n@", NULL, TYPE_PROMPT }, // Sockets
{ "\r\n>", NULL, TYPE_PROMPT }, // SMS
+ { "\r\n", "\r\n", TYPE_TEXT },
};
for (int i = 0; i < sizeof(lutF)/sizeof(*lutF); i ++) {
pipe->set(unkn);
@@ -1022,22 +1028,26 @@
MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/,
int baudrate /*= MDMBAUD*/,
-#if DEVICE_SERIAL_FC
PinName rts /*= MDMRTS*/, PinName cts /*= MDMCTS*/,
-#endif
int rxSize /*= 256*/, int txSize /*= 128*/) :
-#if DEVICE_SERIAL_FC
- SerialPipe(tx, rx, rts, cts, rxSize, txSize)
-#else
- SerialPipe(tx, rx, rxSize, txSize)
-#endif
+ SerialPipe(tx, rx, rxSize, txSize)
{
baud(baudrate);
+ // have it fix low
+#if DEVICE_SERIAL_FC
+ if ((rts != NC) || (cts != NC))
+ {
+ Flow flow = (cts == NC) ? RTS :
+ (rts == NC) ? CTS : RTSCTS ;
+ set_flow_control(flow, rts, cts);
+ if (cts != NC) _dev.lpm = LPM_ENABLED;
+ }
+#endif
}
int MDMSerial::_send(const void* buf, int len)
{
- return put((const char*)buf, len, true/*=blocking*/);
+ return put((const char*)buf, len, true/*=blocking*/);
}
int MDMSerial::getLine(char* buffer, int length)
@@ -1054,4 +1064,4 @@
MDMUsb::MDMUsb(void) { }
int MDMUsb::_send(const void* buf, int len) { return len; }
int MDMUsb::getLine(char* buffer, int length) { return NOT_FOUND; }
-#endif
\ No newline at end of file
+#endif
