dev
Dependencies: MTS-Serial libmDot-mbed5
Fork of Dot-AT-Firmware by
Diff: ATSerialFlowControl.cpp
- Revision:
- 9:ff62b20f7000
- Child:
- 14:f9a77400b622
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ATSerialFlowControl.cpp Mon Apr 04 09:00:31 2016 -0500 @@ -0,0 +1,65 @@ +#include "mbed.h" +#include "ATSerialFlowControl.h" +#include "MTSLog.h" +#include "Utils.h" + +using namespace mts; + +ATSerialFlowControl::ATSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize) + : ATSerial(TXD, RXD, txBufSize, rxBufSize) + , rxReadyFlag(false) + , rts(RTS) + , cts(CTS) +{ + notifyStartSending(); + + // Calculate the high and low watermark values + highThreshold = mts_max(rxBufSize - 10, rxBufSize * 0.85); + lowThreshold = rxBufSize * 0.3; + + // Setup the low watermark callback on the internal receive buffer + rxBuffer.attach(this, &ATSerialFlowControl::notifyStartSending, lowThreshold, LESS); +} + +ATSerialFlowControl::~ATSerialFlowControl() +{ +} + +//Override the rxClear function to make sure that flow control lines are set correctly. +void ATSerialFlowControl::rxClear() +{ + MTSBufferedIO::rxClear(); + notifyStartSending(); +} + +void ATSerialFlowControl::notifyStartSending() +{ + if(!rxReadyFlag) { + rts.write(0); + rxReadyFlag = true; + //printf("RTS LOW: READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity()); + } +} + +void ATSerialFlowControl::notifyStopSending() +{ + if(rxReadyFlag) { + rts.write(1); + rxReadyFlag = false; + //printf("RTS HIGH: NOT-READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity()); + } +} + +void ATSerialFlowControl::handleRead() +{ + ATSerial::handleRead(); + if (rxBuffer.size() >= highThreshold) { + notifyStopSending(); + } +} + +void ATSerialFlowControl::handleWrite() +{ + ATSerial::handleWrite(); +} +