Serial library for MTS Socket Modem Arduino Shield devices from Multi-Tech Systems

Dependents:   mDot_AT_firmware mtsas mtsas MTDOT-EVB-LinkCheck-AL ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MTSSerialFlowControl.cpp Source File

MTSSerialFlowControl.cpp

00001 #include "mbed.h"
00002 #include "MTSSerialFlowControl.h"
00003 #include "MTSLog.h"
00004 #include "Utils.h"
00005 
00006 using namespace mts;
00007 
00008 MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize)
00009     : MTSSerial(TXD, RXD, txBufSize, rxBufSize)
00010     , rxReadyFlag(false)
00011     , rts(RTS)
00012     , cts(CTS)
00013 {
00014     notifyStartSending();
00015 
00016     // Calculate the high and low watermark values
00017     highThreshold = mts_max(rxBufSize - 10, rxBufSize * 0.85);
00018     lowThreshold = rxBufSize * 0.3;
00019 
00020     // Setup the low watermark callback on the internal receive buffer
00021     rxBuffer.attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, LESS);
00022 }
00023 
00024 MTSSerialFlowControl::~MTSSerialFlowControl()
00025 {
00026 }
00027 
00028 //Override the rxClear function to make sure that flow control lines are set correctly.
00029 void MTSSerialFlowControl::rxClear()
00030 {
00031     MTSBufferedIO::rxClear();
00032     notifyStartSending();
00033 }
00034 
00035 void MTSSerialFlowControl::notifyStartSending()
00036 {
00037     if(!rxReadyFlag) {
00038         rts.write(0);
00039         rxReadyFlag = true;
00040         //printf("RTS LOW: READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity());
00041     }
00042 }
00043 
00044 void MTSSerialFlowControl::notifyStopSending()
00045 {
00046     if(rxReadyFlag) {
00047         rts.write(1);
00048         rxReadyFlag = false;
00049         //printf("RTS HIGH: NOT-READY - RX[%d/%d]\r\n", rxBuffer.size(), rxBuffer.capacity());
00050     }
00051 }
00052 
00053 void MTSSerialFlowControl::handleRead()
00054 {
00055     char byte = _serial->getc();
00056     if(rxBuffer.write(byte) != 1) {
00057         logError("Serial Rx Byte Dropped [%c][0x%02X]", byte, byte);
00058     }
00059     if (rxBuffer.size() >= highThreshold) {
00060         notifyStopSending();
00061     }
00062 }
00063 
00064 void MTSSerialFlowControl::handleWrite()
00065 {
00066     while(txBuffer.size() != 0) {
00067         if (_serial->writeable() && cts.read() == 0) {
00068             char byte;
00069             if(txBuffer.read(byte) == 1) {
00070                 _serial->attach(NULL, Serial::RxIrq);
00071                 _serial->putc(byte);
00072                 _serial->attach(callback(this, &MTSSerialFlowControl::handleRead), Serial::RxIrq);
00073             }
00074         } else {
00075             return;
00076         }
00077     }
00078 }
00079