A library for talking to Multi-Tech's Cellular SocketModem Devices.

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
jengbrecht
Date:
Sat Jan 04 05:07:22 2014 +0000
Revision:
140:bf0c8288eb78
Parent:
110:8f3149c99112
Child:
141:571e0ef6c8dc
In MTSSerial and MTSSerialFlowControl added code in handle to read to clear buffer on invalid overflow condition of 0xFF

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jengbrecht 0:563b70517320 1 #include "MTSSerialFlowControl.h"
jengbrecht 0:563b70517320 2
mfiore 39:6e94520a3217 3 using namespace mts;
mfiore 39:6e94520a3217 4
jengbrecht 140:bf0c8288eb78 5 MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize)
jengbrecht 140:bf0c8288eb78 6 : MTSSerial(TXD, RXD, txBufSize, rxBufSize)
jengbrecht 140:bf0c8288eb78 7 , rxReadyFlag(false)
jengbrecht 140:bf0c8288eb78 8 , rts(RTS)
jengbrecht 140:bf0c8288eb78 9 , cts(CTS)
jengbrecht 0:563b70517320 10 {
mfiore 10:2bd727a4b329 11 notifyStartSending();
jengbrecht 45:40745c2036cf 12
sgodinez 84:77c5ab16534d 13 highThreshold = MAX(rxBufSize - 10, rxBufSize * 0.85);
mfiore 2:8d3ea0dfce39 14 lowThreshold = rxBufSize * 0.3;
jengbrecht 45:40745c2036cf 15
sgodinez 86:186bbf974c7c 16 rxBuffer.attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS);
mfiore 2:8d3ea0dfce39 17 }
mfiore 2:8d3ea0dfce39 18
jengbrecht 45:40745c2036cf 19 MTSSerialFlowControl::~MTSSerialFlowControl()
jengbrecht 45:40745c2036cf 20 {
mfiore 2:8d3ea0dfce39 21
jengbrecht 45:40745c2036cf 22 }
jengbrecht 45:40745c2036cf 23
jengbrecht 140:bf0c8288eb78 24 void MTSSerialFlowControl::rxClear()
jengbrecht 140:bf0c8288eb78 25 {
sgodinez 101:27bb34e23304 26 MTSBufferedIO::rxClear();
jengbrecht 140:bf0c8288eb78 27 notifyStartSending();
sgodinez 101:27bb34e23304 28 }
sgodinez 101:27bb34e23304 29
jengbrecht 45:40745c2036cf 30 void MTSSerialFlowControl::notifyStartSending()
jengbrecht 45:40745c2036cf 31 {
sgodinez 101:27bb34e23304 32 if(!rxReadyFlag) {
sgodinez 101:27bb34e23304 33 rts.write(0);
sgodinez 101:27bb34e23304 34 rxReadyFlag = true;
sgodinez 110:8f3149c99112 35 //printf("RTS LOW: READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity());
sgodinez 101:27bb34e23304 36 }
mfiore 2:8d3ea0dfce39 37 }
mfiore 2:8d3ea0dfce39 38
jengbrecht 45:40745c2036cf 39 void MTSSerialFlowControl::notifyStopSending()
jengbrecht 45:40745c2036cf 40 {
sgodinez 101:27bb34e23304 41 if(rxReadyFlag) {
sgodinez 101:27bb34e23304 42 rts.write(1);
sgodinez 101:27bb34e23304 43 rxReadyFlag = false;
sgodinez 110:8f3149c99112 44 //printf("RTS HIGH: NOT-READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity());
sgodinez 101:27bb34e23304 45 }
mfiore 2:8d3ea0dfce39 46 }
mfiore 2:8d3ea0dfce39 47
jengbrecht 45:40745c2036cf 48 void MTSSerialFlowControl::handleRead()
jengbrecht 45:40745c2036cf 49 {
sgodinez 86:186bbf974c7c 50 while (serial.readable()) {
sgodinez 96:27bdf4aa3a31 51 char byte = serial.getc();
sgodinez 96:27bdf4aa3a31 52 if(rxBuffer.write(byte) != 1) {
sgodinez 110:8f3149c99112 53 rts.write(1);
sgodinez 110:8f3149c99112 54 rxReadyFlag = false;
sgodinez 101:27bb34e23304 55 printf("[ERROR] Serial Rx Byte Dropped [%c][0x%02X]\r\n", byte, byte);
jengbrecht 140:bf0c8288eb78 56 if(byte == 0xFF) {
jengbrecht 140:bf0c8288eb78 57 serial.attach(NULL, Serial::RxIrq);
jengbrecht 140:bf0c8288eb78 58 serial.attach(this, &MTSSerialFlowControl::handleRead, Serial::RxIrq);
jengbrecht 140:bf0c8288eb78 59 printf("[INFO] Reset the RxIrq.\n\r");
jengbrecht 140:bf0c8288eb78 60 }
sgodinez 110:8f3149c99112 61 return;
sgodinez 96:27bdf4aa3a31 62 }
sgodinez 86:186bbf974c7c 63 if (rxBuffer.size() > highThreshold) {
jengbrecht 77:d7b14688a704 64 notifyStopSending();
jengbrecht 77:d7b14688a704 65 }
mfiore 2:8d3ea0dfce39 66 }
mfiore 2:8d3ea0dfce39 67 }
mfiore 2:8d3ea0dfce39 68
jengbrecht 45:40745c2036cf 69 void MTSSerialFlowControl::handleWrite()
jengbrecht 45:40745c2036cf 70 {
sgodinez 86:186bbf974c7c 71 while(txBuffer.size() != 0) {
sgodinez 86:186bbf974c7c 72 if (serial.writeable() && cts.read() == 0) {
jengbrecht 77:d7b14688a704 73 char byte;
sgodinez 86:186bbf974c7c 74 if(txBuffer.read(byte) == 1) {
sgodinez 86:186bbf974c7c 75 serial.putc(byte);
mfiore 2:8d3ea0dfce39 76 }
jengbrecht 77:d7b14688a704 77 } else {
jengbrecht 77:d7b14688a704 78 return;
mfiore 2:8d3ea0dfce39 79 }
mfiore 2:8d3ea0dfce39 80 }
mfiore 2:8d3ea0dfce39 81 }