Coap
Fork of C027_Support by
Diff: MDM.cpp
- Revision:
- 18:e5697801df29
- Child:
- 19:2b5d097ca15d
- Child:
- 20:535ef78655df
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MDM.cpp Fri Mar 14 13:07:48 2014 +0000 @@ -0,0 +1,113 @@ +#include "mbed.h" +#include <ctype.h> +#include "MDM.h" + + +int MDMParser::send(const char* buf, int len) +{ + return _send(buf, len); +} + +int MDMParser::_getLine(Pipe<char>* pipe, char* buffer, int length) +{ + int o = 0; + int i = 0; + int l = pipe->start(); + while ((i < l) && (o < length)) + { + int t = pipe->next(); + i ++; + if (t == '\r') // terminate commands with carriage return + { + pipe->done(); + if (length > o) + buffer[o] = '\0'; + return o; // if enter send the zero char + } + else if (t == '\n') // skip/filter new line + /* skip */; + else if (t != '\b') // normal char (no backspace) + buffer[o++] = t; + else if (o > 0) // backspace + o --; // remove it + } + o = 0; + if (length > 0) + buffer[0] = '\0'; + return WAIT; +} + +int MDMParser::_getResp(Pipe<char>* pipe, char* buffer, int length) +{ + int o = 0; + int i = 0; + int l = pipe->start(); + static const char erTxt[] = "ERROR\r\n"; + static const char okTxt[] = "OK\r\n"; + int er = 0; + int ok = 0; + while ((i < pipe->size()) && (o < length)) + { + int t = pipe->next(); + i ++; + buffer[o++] = t; + ok = (t == okTxt[ok]) ? ok + 1 : 0; + er = (t == erTxt[er]) ? er + 1 : 0; + if ((okTxt[ok] == '\0') || (erTxt[er] == '\0')) + { + pipe->done(); + if (length > o) + buffer[o] = '\0'; + return o; + } + } + o = 0; + if (length > 0) + buffer[0] = '\0'; + return WAIT; +} + +// ---------------------------------------------------------------- +// Serial Implementation +// ---------------------------------------------------------------- + +MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/, int baudrate /*= MDMBAUD*/, + int rxSize /*= 256*/, int txSize /*= 128*/) : + SerialPipe(tx, rx, rxSize, txSize) +{ + baud(baudrate); +} + +MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/, int baudrate /*= MDMBAUD*/, + PinName rts /*= MDMRTS*/, PinName cts /*= MDMCTS*/, int rxSize /*= 256*/, int txSize /*= 128*/) : + SerialPipe(tx, rx, rts, cts, rxSize, txSize) +{ + baud(baudrate); +} + +int MDMSerial::_send(const void* buf, int len) +{ + return put((const char*)buf, len, true/*=blocking*/); +} + +int MDMSerial::getLine(char* buffer, int length) +{ + return _getLine(&_pipeRx, buffer, length); +} + +int MDMSerial::getResp(char* buffer, int length) +{ + return _getResp(&_pipeRx, buffer, length); +} + +// ---------------------------------------------------------------- +// USB Implementation +// ---------------------------------------------------------------- + +#ifdef HAVE_MDMUSB +// TODO properly implement with USB +MDMUsb::MDMUsb(void) { } +int MDMUsb::_send(const void* buf, int len) { return len; } +int MDMUsb::getLine(char* buffer, int length) { return NOT_FOUND; } +int MDMUsb::getResp(char* buffer, int length) { return NOT_FOUND; } +#endif \ No newline at end of file