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:
- jengbrecht
- Date:
- 2013-12-26
- Revision:
- 77:d7b14688a704
- Parent:
- 67:1003b410f781
- Child:
- 78:ef3ee53cf5df
File content as of revision 77:d7b14688a704:
#ifndef MTSSERIALFLOWCONTROL_CPP #define MTSSERIALFLOWCONTROL_CPP #include "MTSSerialFlowControl.h" using namespace mts; MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize, char* name) : MTSBufferedIO(txBufSize, rxBufSize), if_name(name) { 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 low -> start sending cts = new DigitalOut(CTS); notifyStartSending(); //highThreshold = MAX(rxBufSize - 10, rxBufSize * 0.85); highThreshold = 10; lowThreshold = rxBufSize * 0.3; rxBuffer->attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS); } MTSSerialFlowControl::~MTSSerialFlowControl() { delete rts; delete cts; delete serial; } void MTSSerialFlowControl::baud(int baudrate) { serial->baud(baudrate); } void MTSSerialFlowControl::format(int bits, SerialBase::Parity parity, int stop_bits) { serial->format(bits, parity, stop_bits); } void MTSSerialFlowControl::startSending() { clearToSend = true; //printf("RTS: START SENDING YOU BYTES - TX[%d]\r\n", txBuffer->size()); } void MTSSerialFlowControl::stopSending() { clearToSend = false; //printf("RTS: STOP SENDING YOU BYTES - TX[%d]\r\n", txBuffer->size()); } void MTSSerialFlowControl::notifyStartSending() { cts->write(0); //printf("CTS: START SENDING US BYTES - RX[%d]\r\n", rxBuffer->size()); } void MTSSerialFlowControl::notifyStopSending() { cts->write(1); //printf("CTS: STOP SENDING US BYTES - RX[%d]\r\n", rxBuffer->size()); } void MTSSerialFlowControl::handleRead() { while (serial->readable()) { rxBuffer->write(serial->getc()); if (rxBuffer->size() > highThreshold) { notifyStopSending(); } } } void MTSSerialFlowControl::handleWrite() { while(txBuffer->size() != 0) { if (serial->writeable() && clearToSend) { char byte; if(txBuffer->read(byte) == 1) { serial->putc(byte); } } else { return; } } } #endif /* MTSSERIALFLOWCONTROL */