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 19 21:48:32 2013 +0000
Revision:
46:b30547bf07d5
Parent:
45:40745c2036cf
Parent:
39:6e94520a3217
Child:
67:1003b410f781
Merged, removed Axeda Wrapper

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
mfiore 2:8d3ea0dfce39 22 highThreshold = rxBufSize * 0.85;
mfiore 2:8d3ea0dfce39 23 lowThreshold = rxBufSize * 0.3;
jengbrecht 45:40745c2036cf 24
mfiore 2:8d3ea0dfce39 25 rxBuffer->attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS);
mfiore 2:8d3ea0dfce39 26 }
mfiore 2:8d3ea0dfce39 27
jengbrecht 45:40745c2036cf 28 MTSSerialFlowControl::~MTSSerialFlowControl()
jengbrecht 45:40745c2036cf 29 {
mfiore 2:8d3ea0dfce39 30 delete rts;
mfiore 2:8d3ea0dfce39 31 delete cts;
mfiore 2:8d3ea0dfce39 32 delete serial;
mfiore 2:8d3ea0dfce39 33 }
mfiore 2:8d3ea0dfce39 34
jengbrecht 45:40745c2036cf 35 void MTSSerialFlowControl::baud(int baudrate)
jengbrecht 45:40745c2036cf 36 {
mfiore 10:2bd727a4b329 37 serial->baud(baudrate);
mfiore 10:2bd727a4b329 38 }
mfiore 10:2bd727a4b329 39
jengbrecht 45:40745c2036cf 40 void MTSSerialFlowControl::format(int bits, SerialBase::Parity parity, int stop_bits)
jengbrecht 45:40745c2036cf 41 {
jengbrecht 45:40745c2036cf 42 serial->format(bits, parity, stop_bits);
jengbrecht 45:40745c2036cf 43 }
jengbrecht 45:40745c2036cf 44
jengbrecht 45:40745c2036cf 45 void MTSSerialFlowControl::startSending()
jengbrecht 45:40745c2036cf 46 {
mfiore 2:8d3ea0dfce39 47 clearToSend = true;
mfiore 2:8d3ea0dfce39 48 }
mfiore 2:8d3ea0dfce39 49
jengbrecht 45:40745c2036cf 50 void MTSSerialFlowControl::stopSending()
jengbrecht 45:40745c2036cf 51 {
mfiore 2:8d3ea0dfce39 52 clearToSend = false;
jengbrecht 0:563b70517320 53 }
mfiore 2:8d3ea0dfce39 54
jengbrecht 45:40745c2036cf 55 void MTSSerialFlowControl::notifyStartSending()
jengbrecht 45:40745c2036cf 56 {
mfiore 2:8d3ea0dfce39 57 cts->write(0);
mfiore 2:8d3ea0dfce39 58 }
mfiore 2:8d3ea0dfce39 59
jengbrecht 45:40745c2036cf 60 void MTSSerialFlowControl::notifyStopSending()
jengbrecht 45:40745c2036cf 61 {
mfiore 2:8d3ea0dfce39 62 cts->write(1);
mfiore 2:8d3ea0dfce39 63 }
mfiore 2:8d3ea0dfce39 64
jengbrecht 45:40745c2036cf 65 void MTSSerialFlowControl::handleRead()
jengbrecht 45:40745c2036cf 66 {
mfiore 2:8d3ea0dfce39 67 if (rxBuffer->available() > highThreshold) {
mfiore 2:8d3ea0dfce39 68 notifyStopSending();
mfiore 10:2bd727a4b329 69 }
mfiore 10:2bd727a4b329 70 while (serial->readable()) {
mfiore 10:2bd727a4b329 71 rxBuffer->write(serial->getc());
mfiore 2:8d3ea0dfce39 72 }
mfiore 2:8d3ea0dfce39 73 }
mfiore 2:8d3ea0dfce39 74
jengbrecht 45:40745c2036cf 75 void MTSSerialFlowControl::handleWrite()
jengbrecht 45:40745c2036cf 76 {
mfiore 2:8d3ea0dfce39 77 if (clearToSend) {
mfiore 2:8d3ea0dfce39 78 while(txBuffer->available() != 0) {
mfiore 2:8d3ea0dfce39 79 if (serial->writeable()) {
sgodinez 17:2d7c4ea7491b 80 char byte;
sgodinez 17:2d7c4ea7491b 81 if(txBuffer->read(byte) == 1) {
sgodinez 17:2d7c4ea7491b 82 serial->putc(byte);
sgodinez 17:2d7c4ea7491b 83 }
mfiore 2:8d3ea0dfce39 84 } else {
mfiore 2:8d3ea0dfce39 85 wait(.05);
mfiore 2:8d3ea0dfce39 86 }
mfiore 2:8d3ea0dfce39 87 }
mfiore 2:8d3ea0dfce39 88 }
mfiore 2:8d3ea0dfce39 89 }
mfiore 2:8d3ea0dfce39 90
jengbrecht 0:563b70517320 91 #endif /* MTSSERIALFLOWCONTROL */