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:
sgodinez
Date:
Tue Dec 31 17:30:07 2013 +0000
Revision:
110:8f3149c99112
Parent:
101:27bb34e23304
Child:
140:bf0c8288eb78
Improved robustness of close() call

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
sgodinez 86:186bbf974c7c 5 MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize)
sgodinez 86:186bbf974c7c 6 : MTSSerial(TXD, RXD, txBufSize, rxBufSize)
sgodinez 101:27bb34e23304 7 , rxReadyFlag(false)
sgodinez 86:186bbf974c7c 8 , rts(RTS)
sgodinez 86:186bbf974c7c 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
sgodinez 101:27bb34e23304 24 void MTSSerialFlowControl::rxClear() {
sgodinez 101:27bb34e23304 25 MTSBufferedIO::rxClear();
sgodinez 101:27bb34e23304 26 notifyStartSending();
sgodinez 101:27bb34e23304 27 }
sgodinez 101:27bb34e23304 28
jengbrecht 45:40745c2036cf 29 void MTSSerialFlowControl::notifyStartSending()
jengbrecht 45:40745c2036cf 30 {
sgodinez 101:27bb34e23304 31 if(!rxReadyFlag) {
sgodinez 101:27bb34e23304 32 rts.write(0);
sgodinez 101:27bb34e23304 33 rxReadyFlag = true;
sgodinez 110:8f3149c99112 34 //printf("RTS LOW: READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity());
sgodinez 101:27bb34e23304 35 }
mfiore 2:8d3ea0dfce39 36 }
mfiore 2:8d3ea0dfce39 37
jengbrecht 45:40745c2036cf 38 void MTSSerialFlowControl::notifyStopSending()
jengbrecht 45:40745c2036cf 39 {
sgodinez 101:27bb34e23304 40 if(rxReadyFlag) {
sgodinez 101:27bb34e23304 41 rts.write(1);
sgodinez 101:27bb34e23304 42 rxReadyFlag = false;
sgodinez 110:8f3149c99112 43 //printf("RTS HIGH: NOT-READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity());
sgodinez 101:27bb34e23304 44 }
mfiore 2:8d3ea0dfce39 45 }
mfiore 2:8d3ea0dfce39 46
jengbrecht 45:40745c2036cf 47 void MTSSerialFlowControl::handleRead()
jengbrecht 45:40745c2036cf 48 {
sgodinez 86:186bbf974c7c 49 while (serial.readable()) {
sgodinez 96:27bdf4aa3a31 50 char byte = serial.getc();
sgodinez 96:27bdf4aa3a31 51 if(rxBuffer.write(byte) != 1) {
sgodinez 110:8f3149c99112 52 rts.write(1);
sgodinez 110:8f3149c99112 53 rxReadyFlag = false;
sgodinez 101:27bb34e23304 54 printf("[ERROR] Serial Rx Byte Dropped [%c][0x%02X]\r\n", byte, byte);
sgodinez 110:8f3149c99112 55 return;
sgodinez 96:27bdf4aa3a31 56 }
sgodinez 86:186bbf974c7c 57 if (rxBuffer.size() > highThreshold) {
jengbrecht 77:d7b14688a704 58 notifyStopSending();
jengbrecht 77:d7b14688a704 59 }
mfiore 2:8d3ea0dfce39 60 }
mfiore 2:8d3ea0dfce39 61 }
mfiore 2:8d3ea0dfce39 62
jengbrecht 45:40745c2036cf 63 void MTSSerialFlowControl::handleWrite()
jengbrecht 45:40745c2036cf 64 {
sgodinez 86:186bbf974c7c 65 while(txBuffer.size() != 0) {
sgodinez 86:186bbf974c7c 66 if (serial.writeable() && cts.read() == 0) {
jengbrecht 77:d7b14688a704 67 char byte;
sgodinez 86:186bbf974c7c 68 if(txBuffer.read(byte) == 1) {
sgodinez 86:186bbf974c7c 69 serial.putc(byte);
mfiore 2:8d3ea0dfce39 70 }
jengbrecht 77:d7b14688a704 71 } else {
jengbrecht 77:d7b14688a704 72 return;
mfiore 2:8d3ea0dfce39 73 }
mfiore 2:8d3ea0dfce39 74 }
mfiore 2:8d3ea0dfce39 75 }