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:
Fri Dec 27 15:19:49 2013 +0000
Revision:
81:45e1359a5c69
Parent:
78:ef3ee53cf5df
Child:
83:9813f9b8ee68
Child:
85:b17ad6781c5b
Made update to MTSSerial to make it more robust.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jengbrecht 0:563b70517320 1 #ifndef MTSSERIALFLOWCONTROL_CPP
jengbrecht 0:563b70517320 2 #define MTSSERIALFLOWCONTROL_CPP
jengbrecht 0:563b70517320 3
jengbrecht 0:563b70517320 4 #include "MTSSerialFlowControl.h"
jengbrecht 0:563b70517320 5
mfiore 39:6e94520a3217 6 using namespace mts;
mfiore 39:6e94520a3217 7
mfiore 10:2bd727a4b329 8 MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize, char* name) : MTSBufferedIO(txBufSize, rxBufSize), if_name(name)
jengbrecht 0:563b70517320 9 {
mfiore 2:8d3ea0dfce39 10 serial = new Serial(TXD, RXD);
mfiore 3:0caed9526d24 11 serial->attach(this, &MTSSerialFlowControl::handleRead, Serial::RxIrq);
mfiore 10:2bd727a4b329 12 //serial->attach(this, &MTSSerialFlowControl::handleWrite, Serial::TxIrq);
jengbrecht 45:40745c2036cf 13
sgodinez 78:ef3ee53cf5df 14 rts = new DigitalOut(RTS);
sgodinez 78:ef3ee53cf5df 15 cts = new DigitalIn(CTS);
mfiore 10:2bd727a4b329 16 notifyStartSending();
jengbrecht 45:40745c2036cf 17
jengbrecht 77:d7b14688a704 18 //highThreshold = MAX(rxBufSize - 10, rxBufSize * 0.85);
jengbrecht 77:d7b14688a704 19 highThreshold = 10;
mfiore 2:8d3ea0dfce39 20 lowThreshold = rxBufSize * 0.3;
jengbrecht 45:40745c2036cf 21
mfiore 2:8d3ea0dfce39 22 rxBuffer->attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS);
mfiore 2:8d3ea0dfce39 23 }
mfiore 2:8d3ea0dfce39 24
jengbrecht 45:40745c2036cf 25 MTSSerialFlowControl::~MTSSerialFlowControl()
jengbrecht 45:40745c2036cf 26 {
mfiore 2:8d3ea0dfce39 27 delete rts;
mfiore 2:8d3ea0dfce39 28 delete cts;
mfiore 2:8d3ea0dfce39 29 delete serial;
mfiore 2:8d3ea0dfce39 30 }
mfiore 2:8d3ea0dfce39 31
jengbrecht 45:40745c2036cf 32 void MTSSerialFlowControl::baud(int baudrate)
jengbrecht 45:40745c2036cf 33 {
mfiore 10:2bd727a4b329 34 serial->baud(baudrate);
mfiore 10:2bd727a4b329 35 }
mfiore 10:2bd727a4b329 36
jengbrecht 45:40745c2036cf 37 void MTSSerialFlowControl::format(int bits, SerialBase::Parity parity, int stop_bits)
jengbrecht 45:40745c2036cf 38 {
jengbrecht 45:40745c2036cf 39 serial->format(bits, parity, stop_bits);
jengbrecht 45:40745c2036cf 40 }
jengbrecht 45:40745c2036cf 41
jengbrecht 45:40745c2036cf 42 void MTSSerialFlowControl::notifyStartSending()
jengbrecht 45:40745c2036cf 43 {
sgodinez 78:ef3ee53cf5df 44 rts->write(0);
sgodinez 78:ef3ee53cf5df 45 //printf("RTS: START SENDING US BYTES - RX[%d]\r\n", rxBuffer->size());
mfiore 2:8d3ea0dfce39 46 }
mfiore 2:8d3ea0dfce39 47
jengbrecht 45:40745c2036cf 48 void MTSSerialFlowControl::notifyStopSending()
jengbrecht 45:40745c2036cf 49 {
sgodinez 78:ef3ee53cf5df 50 rts->write(1);
sgodinez 78:ef3ee53cf5df 51 //printf("RTS: STOP SENDING US BYTES - RX[%d]\r\n", rxBuffer->size());
mfiore 2:8d3ea0dfce39 52 }
mfiore 2:8d3ea0dfce39 53
jengbrecht 45:40745c2036cf 54 void MTSSerialFlowControl::handleRead()
jengbrecht 45:40745c2036cf 55 {
mfiore 10:2bd727a4b329 56 while (serial->readable()) {
mfiore 10:2bd727a4b329 57 rxBuffer->write(serial->getc());
jengbrecht 77:d7b14688a704 58 if (rxBuffer->size() > highThreshold) {
jengbrecht 77:d7b14688a704 59 notifyStopSending();
jengbrecht 77:d7b14688a704 60 }
mfiore 2:8d3ea0dfce39 61 }
mfiore 2:8d3ea0dfce39 62 }
mfiore 2:8d3ea0dfce39 63
jengbrecht 45:40745c2036cf 64 void MTSSerialFlowControl::handleWrite()
jengbrecht 45:40745c2036cf 65 {
jengbrecht 77:d7b14688a704 66 while(txBuffer->size() != 0) {
sgodinez 78:ef3ee53cf5df 67 if (serial->writeable() && cts->read() == 0) {
jengbrecht 77:d7b14688a704 68 char byte;
jengbrecht 77:d7b14688a704 69 if(txBuffer->read(byte) == 1) {
jengbrecht 77:d7b14688a704 70 serial->putc(byte);
mfiore 2:8d3ea0dfce39 71 }
jengbrecht 77:d7b14688a704 72 } else {
jengbrecht 77:d7b14688a704 73 return;
mfiore 2:8d3ea0dfce39 74 }
mfiore 2:8d3ea0dfce39 75 }
mfiore 2:8d3ea0dfce39 76 }
mfiore 2:8d3ea0dfce39 77
jengbrecht 0:563b70517320 78 #endif /* MTSSERIALFLOWCONTROL */