Serial library for MTS Socket Modem Arduino Shield devices from Multi-Tech Systems
Dependents: mDot_AT_firmware mtsas mtsas MTDOT-EVB-LinkCheck-AL ... more
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
Generated on Thu Jul 14 2022 05:10:02 by 1.7.2