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@10:2bd727a4b329, 2013-12-13 (annotated)
- Committer:
- mfiore
- Date:
- Fri Dec 13 14:53:08 2013 +0000
- Revision:
- 10:2bd727a4b329
- Parent:
- 3:0caed9526d24
- Child:
- 17:2d7c4ea7491b
tested and verified flow control code; added .h files to test serial code (loopback and passthrough)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jengbrecht | 0:563b70517320 | 1 | #ifndef MTSSERIALFLOWCONTROL_CPP |
jengbrecht | 0:563b70517320 | 2 | #define MTSSERIALFLOWCONTROL_CPP |
jengbrecht | 0:563b70517320 | 3 | |
jengbrecht | 0:563b70517320 | 4 | #include "MTSSerialFlowControl.h" |
jengbrecht | 0:563b70517320 | 5 | |
mfiore | 10:2bd727a4b329 | 6 | MTSSerialFlowControl::MTSSerialFlowControl(PinName TXD, PinName RXD, PinName RTS, PinName CTS, int txBufSize, int rxBufSize, char* name) : MTSBufferedIO(txBufSize, rxBufSize), if_name(name) |
jengbrecht | 0:563b70517320 | 7 | { |
mfiore | 2:8d3ea0dfce39 | 8 | serial = new Serial(TXD, RXD); |
mfiore | 3:0caed9526d24 | 9 | serial->attach(this, &MTSSerialFlowControl::handleRead, Serial::RxIrq); |
mfiore | 10:2bd727a4b329 | 10 | //serial->attach(this, &MTSSerialFlowControl::handleWrite, Serial::TxIrq); |
mfiore | 2:8d3ea0dfce39 | 11 | |
mfiore | 2:8d3ea0dfce39 | 12 | clearToSend = true; |
mfiore | 2:8d3ea0dfce39 | 13 | rts = new InterruptIn(RTS); |
mfiore | 3:0caed9526d24 | 14 | rts->rise(this, &MTSSerialFlowControl::stopSending); // active low -> stop sending |
mfiore | 10:2bd727a4b329 | 15 | rts->fall(this, &MTSSerialFlowControl::startSending); // active low -> start sending |
mfiore | 2:8d3ea0dfce39 | 16 | |
jengbrecht | 0:563b70517320 | 17 | cts = new DigitalOut(CTS); |
mfiore | 10:2bd727a4b329 | 18 | notifyStartSending(); |
mfiore | 2:8d3ea0dfce39 | 19 | |
mfiore | 2:8d3ea0dfce39 | 20 | highThreshold = rxBufSize * 0.85; |
mfiore | 2:8d3ea0dfce39 | 21 | lowThreshold = rxBufSize * 0.3; |
mfiore | 2:8d3ea0dfce39 | 22 | |
mfiore | 2:8d3ea0dfce39 | 23 | rxBuffer->attach(this, &MTSSerialFlowControl::notifyStartSending, lowThreshold, Vars::LESS); |
mfiore | 2:8d3ea0dfce39 | 24 | } |
mfiore | 2:8d3ea0dfce39 | 25 | |
mfiore | 2:8d3ea0dfce39 | 26 | MTSSerialFlowControl::~MTSSerialFlowControl() { |
mfiore | 2:8d3ea0dfce39 | 27 | delete rts; |
mfiore | 2:8d3ea0dfce39 | 28 | delete cts; |
mfiore | 2:8d3ea0dfce39 | 29 | delete serial; |
mfiore | 2:8d3ea0dfce39 | 30 | } |
mfiore | 2:8d3ea0dfce39 | 31 | |
mfiore | 10:2bd727a4b329 | 32 | void MTSSerialFlowControl::baud(int baudrate) { |
mfiore | 10:2bd727a4b329 | 33 | serial->baud(baudrate); |
mfiore | 10:2bd727a4b329 | 34 | } |
mfiore | 10:2bd727a4b329 | 35 | |
mfiore | 2:8d3ea0dfce39 | 36 | void MTSSerialFlowControl::startSending() { |
mfiore | 2:8d3ea0dfce39 | 37 | clearToSend = true; |
mfiore | 2:8d3ea0dfce39 | 38 | } |
mfiore | 2:8d3ea0dfce39 | 39 | |
mfiore | 2:8d3ea0dfce39 | 40 | void MTSSerialFlowControl::stopSending() { |
mfiore | 2:8d3ea0dfce39 | 41 | clearToSend = false; |
jengbrecht | 0:563b70517320 | 42 | } |
mfiore | 2:8d3ea0dfce39 | 43 | |
mfiore | 2:8d3ea0dfce39 | 44 | void MTSSerialFlowControl::notifyStartSending() { |
mfiore | 2:8d3ea0dfce39 | 45 | cts->write(0); |
mfiore | 2:8d3ea0dfce39 | 46 | } |
mfiore | 2:8d3ea0dfce39 | 47 | |
mfiore | 2:8d3ea0dfce39 | 48 | void MTSSerialFlowControl::notifyStopSending() { |
mfiore | 2:8d3ea0dfce39 | 49 | cts->write(1); |
mfiore | 2:8d3ea0dfce39 | 50 | } |
mfiore | 2:8d3ea0dfce39 | 51 | |
mfiore | 2:8d3ea0dfce39 | 52 | void MTSSerialFlowControl::handleRead() { |
mfiore | 2:8d3ea0dfce39 | 53 | if (rxBuffer->available() > highThreshold) { |
mfiore | 2:8d3ea0dfce39 | 54 | notifyStopSending(); |
mfiore | 10:2bd727a4b329 | 55 | } |
mfiore | 10:2bd727a4b329 | 56 | while (serial->readable()) { |
mfiore | 10:2bd727a4b329 | 57 | rxBuffer->write(serial->getc()); |
mfiore | 2:8d3ea0dfce39 | 58 | } |
mfiore | 2:8d3ea0dfce39 | 59 | } |
mfiore | 2:8d3ea0dfce39 | 60 | |
mfiore | 2:8d3ea0dfce39 | 61 | void MTSSerialFlowControl::handleWrite() { |
mfiore | 2:8d3ea0dfce39 | 62 | if (clearToSend) { |
mfiore | 2:8d3ea0dfce39 | 63 | while(txBuffer->available() != 0) { |
mfiore | 2:8d3ea0dfce39 | 64 | if (serial->writeable()) { |
mfiore | 2:8d3ea0dfce39 | 65 | serial->putc(txBuffer->read()); |
mfiore | 2:8d3ea0dfce39 | 66 | } else { |
mfiore | 2:8d3ea0dfce39 | 67 | wait(.05); |
mfiore | 2:8d3ea0dfce39 | 68 | } |
mfiore | 2:8d3ea0dfce39 | 69 | } |
mfiore | 2:8d3ea0dfce39 | 70 | } |
mfiore | 2:8d3ea0dfce39 | 71 | } |
mfiore | 2:8d3ea0dfce39 | 72 | |
jengbrecht | 0:563b70517320 | 73 | #endif /* MTSSERIALFLOWCONTROL */ |