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:
mfiore
Date:
Wed Dec 11 20:07:02 2013 +0000
Revision:
2:8d3ea0dfce39
Parent:
0:563b70517320
Child:
3:0caed9526d24
CircularBuffer template function definitions moved to header; implemented (but not tested) MTSSerialFlowControl

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
jengbrecht 0:563b70517320 6 MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize) : MTSBufferedIO(txBufSize, rxBufSize)
jengbrecht 0:563b70517320 7 {
mfiore 2:8d3ea0dfce39 8 serial = new Serial(TXD, RXD);
mfiore 2:8d3ea0dfce39 9 //serial->attach(this, &MTSSerialFlowControl::handleRead, Serial::RxIrq);
mfiore 2:8d3ea0dfce39 10 //serial->attach(this, &MTSSerialFlowControl::handleWrite, Serial::TxIrq);
mfiore 2:8d3ea0dfce39 11
mfiore 2:8d3ea0dfce39 12 clearToSend = true;
mfiore 2:8d3ea0dfce39 13 rts = new InterruptIn(RTS);
mfiore 2:8d3ea0dfce39 14 //rts->rise(this, &MTSSerialFlowControl::stopSending); // active low -> stop sending
mfiore 2:8d3ea0dfce39 15 //rts->fall(this, &MTSSerialFlowControl::startSending); // active high -> start sending
mfiore 2:8d3ea0dfce39 16
jengbrecht 0:563b70517320 17 cts = new DigitalOut(CTS);
mfiore 2:8d3ea0dfce39 18 cts = 0;
mfiore 2:8d3ea0dfce39 19
mfiore 2:8d3ea0dfce39 20 highThreshold = rxBufSize * 0.85;
mfiore 2:8d3ea0dfce39 21 lowThreshold = rxBufSize * 0.3;
mfiore 2:8d3ea0dfce39 22
mfiore 2:8d3ea0dfce39 23 rxBuffer->attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS);
mfiore 2:8d3ea0dfce39 24 }
mfiore 2:8d3ea0dfce39 25
mfiore 2:8d3ea0dfce39 26 MTSSerialFlowControl::~MTSSerialFlowControl() {
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
mfiore 2:8d3ea0dfce39 32 void MTSSerialFlowControl::startSending() {
mfiore 2:8d3ea0dfce39 33 clearToSend = true;
mfiore 2:8d3ea0dfce39 34 }
mfiore 2:8d3ea0dfce39 35
mfiore 2:8d3ea0dfce39 36 void MTSSerialFlowControl::stopSending() {
mfiore 2:8d3ea0dfce39 37 clearToSend = false;
jengbrecht 0:563b70517320 38 }
mfiore 2:8d3ea0dfce39 39
mfiore 2:8d3ea0dfce39 40 void MTSSerialFlowControl::notifyStartSending() {
mfiore 2:8d3ea0dfce39 41 cts->write(0);
mfiore 2:8d3ea0dfce39 42 }
mfiore 2:8d3ea0dfce39 43
mfiore 2:8d3ea0dfce39 44 void MTSSerialFlowControl::notifyStopSending() {
mfiore 2:8d3ea0dfce39 45 cts->write(1);
mfiore 2:8d3ea0dfce39 46 }
mfiore 2:8d3ea0dfce39 47
mfiore 2:8d3ea0dfce39 48 void MTSSerialFlowControl::handleRead() {
mfiore 2:8d3ea0dfce39 49 if (rxBuffer->available() > highThreshold) {
mfiore 2:8d3ea0dfce39 50 notifyStopSending();
mfiore 2:8d3ea0dfce39 51 } else {
mfiore 2:8d3ea0dfce39 52 while (serial->readable()) {
mfiore 2:8d3ea0dfce39 53 rxBuffer->write(serial->getc());
mfiore 2:8d3ea0dfce39 54 }
mfiore 2:8d3ea0dfce39 55 }
mfiore 2:8d3ea0dfce39 56 }
mfiore 2:8d3ea0dfce39 57
mfiore 2:8d3ea0dfce39 58 void MTSSerialFlowControl::handleWrite() {
mfiore 2:8d3ea0dfce39 59 if (clearToSend) {
mfiore 2:8d3ea0dfce39 60 while(txBuffer->available() != 0) {
mfiore 2:8d3ea0dfce39 61 if (serial->writeable()) {
mfiore 2:8d3ea0dfce39 62 serial->putc(txBuffer->read());
mfiore 2:8d3ea0dfce39 63 } else {
mfiore 2:8d3ea0dfce39 64 wait(.05);
mfiore 2:8d3ea0dfce39 65 }
mfiore 2:8d3ea0dfce39 66 }
mfiore 2:8d3ea0dfce39 67 }
mfiore 2:8d3ea0dfce39 68 }
mfiore 2:8d3ea0dfce39 69
jengbrecht 0:563b70517320 70 #endif /* MTSSERIALFLOWCONTROL */