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
io/MTSSerialFlowControl.cpp
- Committer:
- mfiore
- Date:
- 2013-12-11
- Revision:
- 3:0caed9526d24
- Parent:
- 2:8d3ea0dfce39
- Child:
- 10:2bd727a4b329
File content as of revision 3:0caed9526d24:
#ifndef MTSSERIALFLOWCONTROL_CPP #define MTSSERIALFLOWCONTROL_CPP #include "MTSSerialFlowControl.h" MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize) : MTSBufferedIO(txBufSize, rxBufSize) { serial = new Serial(TXD, RXD); serial->attach(this, &MTSSerialFlowControl::handleRead, Serial::RxIrq); serial->attach(this, &MTSSerialFlowControl::handleWrite, Serial::TxIrq); clearToSend = true; rts = new InterruptIn(RTS); rts->rise(this, &MTSSerialFlowControl::stopSending); // active low -> stop sending rts->fall(this, &MTSSerialFlowControl::startSending); // active high -> start sending cts = new DigitalOut(CTS); cts = 0; highThreshold = rxBufSize * 0.85; lowThreshold = rxBufSize * 0.3; rxBuffer->attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS); } MTSSerialFlowControl::~MTSSerialFlowControl() { delete rts; delete cts; delete serial; } void MTSSerialFlowControl::startSending() { clearToSend = true; } void MTSSerialFlowControl::stopSending() { clearToSend = false; } void MTSSerialFlowControl::notifyStartSending() { cts->write(0); } void MTSSerialFlowControl::notifyStopSending() { cts->write(1); } void MTSSerialFlowControl::handleRead() { if (rxBuffer->available() > highThreshold) { notifyStopSending(); } else { while (serial->readable()) { rxBuffer->write(serial->getc()); } } } void MTSSerialFlowControl::handleWrite() { if (clearToSend) { while(txBuffer->available() != 0) { if (serial->writeable()) { serial->putc(txBuffer->read()); } else { wait(.05); } } } } #endif /* MTSSERIALFLOWCONTROL */