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:
Thu Dec 26 21:54:19 2013 +0000
Revision:
77:d7b14688a704
Parent:
67:1003b410f781
Child:
78:ef3ee53cf5df
Fixed Several RTS/CTS Issues

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
mfiore 2:8d3ea0dfce39 14 clearToSend = true;
mfiore 2:8d3ea0dfce39 15 rts = new InterruptIn(RTS);
mfiore 3:0caed9526d24 16 rts->rise(this, &MTSSerialFlowControl::stopSending); // active low -> stop sending
mfiore 10:2bd727a4b329 17 rts->fall(this, &MTSSerialFlowControl::startSending); // active low -> start sending
jengbrecht 45:40745c2036cf 18
jengbrecht 0:563b70517320 19 cts = new DigitalOut(CTS);
mfiore 10:2bd727a4b329 20 notifyStartSending();
jengbrecht 45:40745c2036cf 21
jengbrecht 77:d7b14688a704 22 //highThreshold = MAX(rxBufSize - 10, rxBufSize * 0.85);
jengbrecht 77:d7b14688a704 23 highThreshold = 10;
mfiore 2:8d3ea0dfce39 24 lowThreshold = rxBufSize * 0.3;
jengbrecht 45:40745c2036cf 25
mfiore 2:8d3ea0dfce39 26 rxBuffer->attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS);
mfiore 2:8d3ea0dfce39 27 }
mfiore 2:8d3ea0dfce39 28
jengbrecht 45:40745c2036cf 29 MTSSerialFlowControl::~MTSSerialFlowControl()
jengbrecht 45:40745c2036cf 30 {
mfiore 2:8d3ea0dfce39 31 delete rts;
mfiore 2:8d3ea0dfce39 32 delete cts;
mfiore 2:8d3ea0dfce39 33 delete serial;
mfiore 2:8d3ea0dfce39 34 }
mfiore 2:8d3ea0dfce39 35
jengbrecht 45:40745c2036cf 36 void MTSSerialFlowControl::baud(int baudrate)
jengbrecht 45:40745c2036cf 37 {
mfiore 10:2bd727a4b329 38 serial->baud(baudrate);
mfiore 10:2bd727a4b329 39 }
mfiore 10:2bd727a4b329 40
jengbrecht 45:40745c2036cf 41 void MTSSerialFlowControl::format(int bits, SerialBase::Parity parity, int stop_bits)
jengbrecht 45:40745c2036cf 42 {
jengbrecht 45:40745c2036cf 43 serial->format(bits, parity, stop_bits);
jengbrecht 45:40745c2036cf 44 }
jengbrecht 45:40745c2036cf 45
jengbrecht 45:40745c2036cf 46 void MTSSerialFlowControl::startSending()
jengbrecht 45:40745c2036cf 47 {
mfiore 2:8d3ea0dfce39 48 clearToSend = true;
jengbrecht 77:d7b14688a704 49 //printf("RTS: START SENDING YOU BYTES - TX[%d]\r\n", txBuffer->size());
mfiore 2:8d3ea0dfce39 50 }
mfiore 2:8d3ea0dfce39 51
jengbrecht 45:40745c2036cf 52 void MTSSerialFlowControl::stopSending()
jengbrecht 45:40745c2036cf 53 {
mfiore 2:8d3ea0dfce39 54 clearToSend = false;
jengbrecht 77:d7b14688a704 55 //printf("RTS: STOP SENDING YOU BYTES - TX[%d]\r\n", txBuffer->size());
jengbrecht 0:563b70517320 56 }
mfiore 2:8d3ea0dfce39 57
jengbrecht 45:40745c2036cf 58 void MTSSerialFlowControl::notifyStartSending()
jengbrecht 45:40745c2036cf 59 {
mfiore 2:8d3ea0dfce39 60 cts->write(0);
jengbrecht 77:d7b14688a704 61 //printf("CTS: START SENDING US BYTES - RX[%d]\r\n", rxBuffer->size());
mfiore 2:8d3ea0dfce39 62 }
mfiore 2:8d3ea0dfce39 63
jengbrecht 45:40745c2036cf 64 void MTSSerialFlowControl::notifyStopSending()
jengbrecht 45:40745c2036cf 65 {
mfiore 2:8d3ea0dfce39 66 cts->write(1);
jengbrecht 77:d7b14688a704 67 //printf("CTS: STOP SENDING US BYTES - RX[%d]\r\n", rxBuffer->size());
mfiore 2:8d3ea0dfce39 68 }
mfiore 2:8d3ea0dfce39 69
jengbrecht 45:40745c2036cf 70 void MTSSerialFlowControl::handleRead()
jengbrecht 45:40745c2036cf 71 {
jengbrecht 77:d7b14688a704 72
mfiore 10:2bd727a4b329 73 while (serial->readable()) {
mfiore 10:2bd727a4b329 74 rxBuffer->write(serial->getc());
jengbrecht 77:d7b14688a704 75 if (rxBuffer->size() > highThreshold) {
jengbrecht 77:d7b14688a704 76 notifyStopSending();
jengbrecht 77:d7b14688a704 77 }
mfiore 2:8d3ea0dfce39 78 }
mfiore 2:8d3ea0dfce39 79 }
mfiore 2:8d3ea0dfce39 80
jengbrecht 45:40745c2036cf 81 void MTSSerialFlowControl::handleWrite()
jengbrecht 45:40745c2036cf 82 {
jengbrecht 77:d7b14688a704 83
jengbrecht 77:d7b14688a704 84 while(txBuffer->size() != 0) {
jengbrecht 77:d7b14688a704 85 if (serial->writeable() && clearToSend) {
jengbrecht 77:d7b14688a704 86 char byte;
jengbrecht 77:d7b14688a704 87 if(txBuffer->read(byte) == 1) {
jengbrecht 77:d7b14688a704 88 serial->putc(byte);
mfiore 2:8d3ea0dfce39 89 }
jengbrecht 77:d7b14688a704 90 } else {
jengbrecht 77:d7b14688a704 91 return;
mfiore 2:8d3ea0dfce39 92 }
mfiore 2:8d3ea0dfce39 93 }
jengbrecht 77:d7b14688a704 94
mfiore 2:8d3ea0dfce39 95 }
mfiore 2:8d3ea0dfce39 96
jengbrecht 0:563b70517320 97 #endif /* MTSSERIALFLOWCONTROL */