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.

Fork of C027_Support by u-blox

Committer:
mazgch
Date:
Sun Nov 10 16:39:42 2013 +0000
Revision:
9:e7a5959ffae1
Child:
11:b084552b03fe
update support library (tx pipe)

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 9:e7a5959ffae1 5 SerialPipe::SerialPipe(PinName tx, PinName rx, int rxSize, int txSize, const char* name)
mazgch 9:e7a5959ffae1 6 : Serial(tx,rx,name), _pipeRx(rxSize), _pipeTx(txSize)
mazgch 9:e7a5959ffae1 7 {
mazgch 9:e7a5959ffae1 8 attach(this, &SerialPipe::rxIrqBuf, RxIrq);
mazgch 9:e7a5959ffae1 9 attach(this, &SerialPipe::txIrqBuf, TxIrq);
mazgch 9:e7a5959ffae1 10 }
mazgch 9:e7a5959ffae1 11
mazgch 9:e7a5959ffae1 12 SerialPipe::~SerialPipe(void)
mazgch 9:e7a5959ffae1 13 {
mazgch 9:e7a5959ffae1 14 attach(NULL, RxIrq);
mazgch 9:e7a5959ffae1 15 attach(NULL, TxIrq);
mazgch 9:e7a5959ffae1 16 }
mazgch 9:e7a5959ffae1 17
mazgch 9:e7a5959ffae1 18 // tx channel
mazgch 9:e7a5959ffae1 19 int SerialPipe::put(const char* b, int s, bool t)
mazgch 9:e7a5959ffae1 20 {
mazgch 9:e7a5959ffae1 21 int c = 0;
mazgch 9:e7a5959ffae1 22 while (s && t)
mazgch 9:e7a5959ffae1 23 {
mazgch 9:e7a5959ffae1 24 c += _pipeTx.put(b, s, false);
mazgch 9:e7a5959ffae1 25 b ++;
mazgch 9:e7a5959ffae1 26 s --;
mazgch 9:e7a5959ffae1 27 // give a chance to start tx
mazgch 9:e7a5959ffae1 28 __disable_irq();
mazgch 9:e7a5959ffae1 29 txIrqBuf();
mazgch 9:e7a5959ffae1 30 __enable_irq();
mazgch 9:e7a5959ffae1 31 }
mazgch 9:e7a5959ffae1 32 return c;
mazgch 9:e7a5959ffae1 33 }
mazgch 9:e7a5959ffae1 34
mazgch 9:e7a5959ffae1 35 void SerialPipe::txIrqBuf(void)
mazgch 9:e7a5959ffae1 36 {
mazgch 9:e7a5959ffae1 37 while (serial_writable(&_serial) && _pipeTx.readable())
mazgch 9:e7a5959ffae1 38 serial_putc(&_serial, _pipeTx.getc());
mazgch 9:e7a5959ffae1 39 }
mazgch 9:e7a5959ffae1 40
mazgch 9:e7a5959ffae1 41 // rx channel
mazgch 9:e7a5959ffae1 42 int SerialPipe::readable(void)
mazgch 9:e7a5959ffae1 43 {
mazgch 9:e7a5959ffae1 44 return _pipeRx.readable();
mazgch 9:e7a5959ffae1 45 }
mazgch 9:e7a5959ffae1 46
mazgch 9:e7a5959ffae1 47 int SerialPipe::getc(void)
mazgch 9:e7a5959ffae1 48 {
mazgch 9:e7a5959ffae1 49 return _pipeRx.getc();
mazgch 9:e7a5959ffae1 50 }
mazgch 9:e7a5959ffae1 51
mazgch 9:e7a5959ffae1 52 int SerialPipe::get(char* b, int s, bool t)
mazgch 9:e7a5959ffae1 53 {
mazgch 9:e7a5959ffae1 54 return _pipeRx.get(b,s,t);
mazgch 9:e7a5959ffae1 55 }
mazgch 9:e7a5959ffae1 56
mazgch 9:e7a5959ffae1 57 void SerialPipe::rxIrqBuf(void)
mazgch 9:e7a5959ffae1 58 {
mazgch 9:e7a5959ffae1 59 while (serial_readable(&_serial))
mazgch 9:e7a5959ffae1 60 {
mazgch 9:e7a5959ffae1 61 char ch = serial_getc(&_serial);
mazgch 9:e7a5959ffae1 62 if (_pipeRx.writeable())
mazgch 9:e7a5959ffae1 63 _pipeRx.putc(ch);
mazgch 9:e7a5959ffae1 64 else
mazgch 9:e7a5959ffae1 65 /* overflow */;
mazgch 9:e7a5959ffae1 66 }
mazgch 9:e7a5959ffae1 67 }
mazgch 9:e7a5959ffae1 68
mazgch 9:e7a5959ffae1 69 // -----------------------------------------------------------------------
mazgch 9:e7a5959ffae1 70
mazgch 9:e7a5959ffae1 71 SerialPipeEx::SerialPipeEx(PinName tx, PinName rx, int rxSize, int txSize, const char* name)
mazgch 9:e7a5959ffae1 72 : SerialPipe(tx,rx,rxSize,txSize,name)
mazgch 9:e7a5959ffae1 73 {}
mazgch 9:e7a5959ffae1 74
mazgch 9:e7a5959ffae1 75 int SerialPipeEx::getLine(char* b, int s)
mazgch 9:e7a5959ffae1 76 {
mazgch 9:e7a5959ffae1 77 int o = 0;
mazgch 9:e7a5959ffae1 78 int i = 0;
mazgch 9:e7a5959ffae1 79 int l = _pipeRx.start();
mazgch 9:e7a5959ffae1 80 while ((i < l) && (o < s))
mazgch 9:e7a5959ffae1 81 {
mazgch 9:e7a5959ffae1 82 int t = _pipeRx.next();
mazgch 9:e7a5959ffae1 83 i ++;
mazgch 9:e7a5959ffae1 84 if (t == '\r') // terminate commands with carriage return
mazgch 9:e7a5959ffae1 85 {
mazgch 9:e7a5959ffae1 86 _pipeRx.done();
mazgch 9:e7a5959ffae1 87 return o; // if enter send the zero char
mazgch 9:e7a5959ffae1 88 }
mazgch 9:e7a5959ffae1 89 else if (t == '\n') // skip/filter new line
mazgch 9:e7a5959ffae1 90 /* skip */;
mazgch 9:e7a5959ffae1 91 else if (t != '\b') // normal char (no backspace)
mazgch 9:e7a5959ffae1 92 b[o++] = t;
mazgch 9:e7a5959ffae1 93 else if (o > 0) // backspace
mazgch 9:e7a5959ffae1 94 o --; // remove it
mazgch 9:e7a5959ffae1 95 }
mazgch 9:e7a5959ffae1 96 o = 0;
mazgch 9:e7a5959ffae1 97 return WAIT;
mazgch 9:e7a5959ffae1 98 }