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:38:01 2013 +0000
Revision:
45:40745c2036cf
Parent:
17:2d7c4ea7491b
Child:
46:b30547bf07d5
Added a ton of documentation, made the notify start and stop methods private in MTSSerialFlowControl, added format method to the serial classes, fixed an issue in the bulk write method of MTSCircularBuffer

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