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:
Mon Dec 16 20:00:20 2013 +0000
Revision:
17:2d7c4ea7491b
Parent:
10:2bd727a4b329
Child:
39:6e94520a3217
Child:
45:40745c2036cf
TCP send / receive working.  close() still requires some finesse when other end disconnects.

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);
mfiore 2:8d3ea0dfce39 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
mfiore 2:8d3ea0dfce39 16
jengbrecht 0:563b70517320 17 cts = new DigitalOut(CTS);
mfiore 10:2bd727a4b329 18 notifyStartSending();
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 10:2bd727a4b329 32 void MTSSerialFlowControl::baud(int baudrate) {
mfiore 10:2bd727a4b329 33 serial->baud(baudrate);
mfiore 10:2bd727a4b329 34 }
mfiore 10:2bd727a4b329 35
mfiore 2:8d3ea0dfce39 36 void MTSSerialFlowControl::startSending() {
mfiore 2:8d3ea0dfce39 37 clearToSend = true;
mfiore 2:8d3ea0dfce39 38 }
mfiore 2:8d3ea0dfce39 39
mfiore 2:8d3ea0dfce39 40 void MTSSerialFlowControl::stopSending() {
mfiore 2:8d3ea0dfce39 41 clearToSend = false;
jengbrecht 0:563b70517320 42 }
mfiore 2:8d3ea0dfce39 43
mfiore 2:8d3ea0dfce39 44 void MTSSerialFlowControl::notifyStartSending() {
mfiore 2:8d3ea0dfce39 45 cts->write(0);
mfiore 2:8d3ea0dfce39 46 }
mfiore 2:8d3ea0dfce39 47
mfiore 2:8d3ea0dfce39 48 void MTSSerialFlowControl::notifyStopSending() {
mfiore 2:8d3ea0dfce39 49 cts->write(1);
mfiore 2:8d3ea0dfce39 50 }
mfiore 2:8d3ea0dfce39 51
mfiore 2:8d3ea0dfce39 52 void MTSSerialFlowControl::handleRead() {
mfiore 2:8d3ea0dfce39 53 if (rxBuffer->available() > highThreshold) {
mfiore 2:8d3ea0dfce39 54 notifyStopSending();
mfiore 10:2bd727a4b329 55 }
mfiore 10:2bd727a4b329 56 while (serial->readable()) {
mfiore 10:2bd727a4b329 57 rxBuffer->write(serial->getc());
mfiore 2:8d3ea0dfce39 58 }
mfiore 2:8d3ea0dfce39 59 }
mfiore 2:8d3ea0dfce39 60
mfiore 2:8d3ea0dfce39 61 void MTSSerialFlowControl::handleWrite() {
mfiore 2:8d3ea0dfce39 62 if (clearToSend) {
mfiore 2:8d3ea0dfce39 63 while(txBuffer->available() != 0) {
mfiore 2:8d3ea0dfce39 64 if (serial->writeable()) {
sgodinez 17:2d7c4ea7491b 65 char byte;
sgodinez 17:2d7c4ea7491b 66 if(txBuffer->read(byte) == 1) {
sgodinez 17:2d7c4ea7491b 67 serial->putc(byte);
sgodinez 17:2d7c4ea7491b 68 }
mfiore 2:8d3ea0dfce39 69 } else {
mfiore 2:8d3ea0dfce39 70 wait(.05);
mfiore 2:8d3ea0dfce39 71 }
mfiore 2:8d3ea0dfce39 72 }
mfiore 2:8d3ea0dfce39 73 }
mfiore 2:8d3ea0dfce39 74 }
mfiore 2:8d3ea0dfce39 75
jengbrecht 0:563b70517320 76 #endif /* MTSSERIALFLOWCONTROL */