support library for C027 helper functions for Buffer Pipes, Buffered Serial Port (rtos capable) and GPS parsing. It includes modem APIs for USSD, SMS and Sockets.

Dependents:   HTTPClient_Cellular_HelloWorld Cellular_HelloMQTT MbedSmartRestMain Car_Bon_car_module ... more

This library is intended to be used with u-blox products such as the C027 or a shield with u-blox cellular and GPS modules like the cellular and positioning shield from Embedded Artist.

For 2G/GSM and 3G/UMTS you need to:

  • have a SIM card and know its PIN number
  • need to know you network operators APN setting These setting should be passed to the connect or init and join functions. You can also extend the APN database in MDMAPN.h.

For CDMA products you need to make sure that you have provisioned and activated the modem with either Sprint or Verizon.

Committer:
mazgch
Date:
Thu Jul 03 18:44:32 2014 +0000
Revision:
102:fb982ff9da82
Parent:
95:8282dbbe1492
Child:
116:709a6386e685
cmip parsing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 9:e7a5959ffae1 1 #pragma once
mazgch 9:e7a5959ffae1 2
mazgch 9:e7a5959ffae1 3 #include "SerialPipe.h"
mazgch 9:e7a5959ffae1 4
mazgch 74:208e3e32d263 5 SerialPipe::SerialPipe(PinName tx, PinName rx, int rxSize, int txSize) :
mazgch 74:208e3e32d263 6 _SerialPipeBase(tx,rx),
mazgch 74:208e3e32d263 7 _pipeRx( (rx!=NC) ? rxSize : 0),
mazgch 74:208e3e32d263 8 _pipeTx( (tx!=NC) ? txSize : 0)
mazgch 9:e7a5959ffae1 9 {
mazgch 74:208e3e32d263 10 if (rx!=NC)
mazgch 74:208e3e32d263 11 attach(this, &SerialPipe::rxIrqBuf, RxIrq);
mazgch 9:e7a5959ffae1 12 }
mazgch 9:e7a5959ffae1 13
mazgch 9:e7a5959ffae1 14 SerialPipe::~SerialPipe(void)
mazgch 9:e7a5959ffae1 15 {
mazgch 9:e7a5959ffae1 16 attach(NULL, RxIrq);
mazgch 9:e7a5959ffae1 17 attach(NULL, TxIrq);
mazgch 9:e7a5959ffae1 18 }
mazgch 9:e7a5959ffae1 19
mazgch 9:e7a5959ffae1 20 // tx channel
mazgch 13:e2446fcdc246 21 int SerialPipe::writeable(void)
mazgch 13:e2446fcdc246 22 {
mazgch 13:e2446fcdc246 23 return _pipeTx.free();
mazgch 13:e2446fcdc246 24 }
mazgch 13:e2446fcdc246 25
mazgch 13:e2446fcdc246 26 int SerialPipe::putc(int c)
mazgch 13:e2446fcdc246 27 {
mazgch 15:5eda64e5b9d1 28 c = _pipeTx.putc(c);
mazgch 15:5eda64e5b9d1 29 txStart();
mazgch 15:5eda64e5b9d1 30 return c;
mazgch 13:e2446fcdc246 31 }
mazgch 13:e2446fcdc246 32
mazgch 13:e2446fcdc246 33 int SerialPipe::put(const void* buffer, int length, bool blocking)
mazgch 9:e7a5959ffae1 34 {
mazgch 13:e2446fcdc246 35 int count = length;
mazgch 13:e2446fcdc246 36 const char* ptr = (const char*)buffer;
mazgch 15:5eda64e5b9d1 37 if (count)
mazgch 9:e7a5959ffae1 38 {
mazgch 15:5eda64e5b9d1 39 do
mazgch 15:5eda64e5b9d1 40 {
mazgch 15:5eda64e5b9d1 41 int written = _pipeTx.put(ptr, count, false);
mazgch 75:ce6e12067d0c 42 if (written) {
mazgch 75:ce6e12067d0c 43 ptr += written;
mazgch 75:ce6e12067d0c 44 count -= written;
mazgch 75:ce6e12067d0c 45 txStart();
mazgch 75:ce6e12067d0c 46 }
mazgch 75:ce6e12067d0c 47 else if (!blocking)
mazgch 75:ce6e12067d0c 48 break;
mazgch 95:8282dbbe1492 49 /* nothing / just wait */;
mazgch 15:5eda64e5b9d1 50 }
mazgch 75:ce6e12067d0c 51 while (count);
mazgch 9:e7a5959ffae1 52 }
mazgch 13:e2446fcdc246 53 return (length - count);
mazgch 13:e2446fcdc246 54 }
mazgch 13:e2446fcdc246 55
mazgch 70:0a87d256cd24 56 void SerialPipe::txCopy(void)
mazgch 9:e7a5959ffae1 57 {
mazgch 15:5eda64e5b9d1 58 while (_SerialPipeBase::writeable() && _pipeTx.readable())
mazgch 11:b084552b03fe 59 {
mazgch 13:e2446fcdc246 60 char c = _pipeTx.getc();
mazgch 15:5eda64e5b9d1 61 _SerialPipeBase::_base_putc(c);
mazgch 11:b084552b03fe 62 }
mazgch 9:e7a5959ffae1 63 }
mazgch 9:e7a5959ffae1 64
mazgch 70:0a87d256cd24 65 void SerialPipe::txIrqBuf(void)
mazgch 70:0a87d256cd24 66 {
mazgch 70:0a87d256cd24 67 txCopy();
mazgch 70:0a87d256cd24 68 // detach tx isr if we are done
mazgch 70:0a87d256cd24 69 if (!_pipeTx.readable())
mazgch 70:0a87d256cd24 70 attach(NULL, TxIrq);
mazgch 70:0a87d256cd24 71 }
mazgch 70:0a87d256cd24 72
mazgch 13:e2446fcdc246 73 void SerialPipe::txStart(void)
mazgch 13:e2446fcdc246 74 {
mazgch 70:0a87d256cd24 75 // disable the tx isr to avoid interruption
mazgch 70:0a87d256cd24 76 attach(NULL, TxIrq);
mazgch 70:0a87d256cd24 77 txCopy();
mazgch 70:0a87d256cd24 78 // attach the tx isr to handle the remaining data
mazgch 70:0a87d256cd24 79 if (_pipeTx.readable())
mazgch 70:0a87d256cd24 80 attach(this, &SerialPipe::txIrqBuf, TxIrq);
mazgch 13:e2446fcdc246 81 }
mazgch 13:e2446fcdc246 82
mazgch 9:e7a5959ffae1 83 // rx channel
mazgch 9:e7a5959ffae1 84 int SerialPipe::readable(void)
mazgch 9:e7a5959ffae1 85 {
mazgch 9:e7a5959ffae1 86 return _pipeRx.readable();
mazgch 9:e7a5959ffae1 87 }
mazgch 9:e7a5959ffae1 88
mazgch 9:e7a5959ffae1 89 int SerialPipe::getc(void)
mazgch 9:e7a5959ffae1 90 {
mazgch 15:5eda64e5b9d1 91 if (!_pipeRx.readable())
mazgch 15:5eda64e5b9d1 92 return EOF;
mazgch 15:5eda64e5b9d1 93 return _pipeRx.getc();
mazgch 13:e2446fcdc246 94 }
mazgch 13:e2446fcdc246 95
mazgch 13:e2446fcdc246 96 int SerialPipe::get(void* buffer, int length, bool blocking)
mazgch 13:e2446fcdc246 97 {
mazgch 13:e2446fcdc246 98 return _pipeRx.get((char*)buffer,length,blocking);
mazgch 13:e2446fcdc246 99 }
mazgch 13:e2446fcdc246 100
mazgch 9:e7a5959ffae1 101 void SerialPipe::rxIrqBuf(void)
mazgch 9:e7a5959ffae1 102 {
mazgch 15:5eda64e5b9d1 103 while (_SerialPipeBase::readable())
mazgch 9:e7a5959ffae1 104 {
mazgch 15:5eda64e5b9d1 105 char c = _SerialPipeBase::_base_getc();
mazgch 9:e7a5959ffae1 106 if (_pipeRx.writeable())
mazgch 13:e2446fcdc246 107 _pipeRx.putc(c);
mazgch 9:e7a5959ffae1 108 else
mazgch 9:e7a5959ffae1 109 /* overflow */;
mazgch 9:e7a5959ffae1 110 }
mazgch 9:e7a5959ffae1 111 }
mazgch 9:e7a5959ffae1 112