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:
Fri Dec 27 16:20:32 2013 +0000
Revision:
85:b17ad6781c5b
Parent:
81:45e1359a5c69
Parent:
84:77c5ab16534d
Child:
86:186bbf974c7c
Merge

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