Marcus Chang / AsyncSerial
Committer:
marcuschang
Date:
Tue Mar 31 10:50:40 2015 +0000
Revision:
2:efec63739aa3
Parent:
1:a3f39ec7d5f2
Child:
3:af3caa18e928
Full callback support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcuschang 0:dfed780dc91a 1 #include "AsyncSerial/AsyncSerial.h"
marcuschang 0:dfed780dc91a 2
marcuschang 0:dfed780dc91a 3 #include "mbed.h"
marcuschang 0:dfed780dc91a 4
marcuschang 0:dfed780dc91a 5 AsyncSerial::AsyncSerial(PinName tx, PinName rx, PinName rts, PinName cts)
marcuschang 0:dfed780dc91a 6 : SerialBase(tx, rx),
Marcus Chang 1:a3f39ec7d5f2 7
marcuschang 0:dfed780dc91a 8 sendBuffer(NULL),
marcuschang 0:dfed780dc91a 9 sendLength(0),
Marcus Chang 1:a3f39ec7d5f2 10 sendIndex(0),
Marcus Chang 1:a3f39ec7d5f2 11
marcuschang 0:dfed780dc91a 12 sendDoneHandler(NULL),
Marcus Chang 1:a3f39ec7d5f2 13 sendObject(NULL),
Marcus Chang 1:a3f39ec7d5f2 14 sendMember(),
Marcus Chang 1:a3f39ec7d5f2 15 sendDoneObject(NULL),
Marcus Chang 1:a3f39ec7d5f2 16
marcuschang 0:dfed780dc91a 17 receiveBuffer(NULL),
marcuschang 0:dfed780dc91a 18 receiveMaxLength(0),
Marcus Chang 1:a3f39ec7d5f2 19 receiveIndex(0),
Marcus Chang 1:a3f39ec7d5f2 20
marcuschang 0:dfed780dc91a 21 receiveDoneHandler(NULL),
Marcus Chang 1:a3f39ec7d5f2 22 receiveObject(NULL),
Marcus Chang 1:a3f39ec7d5f2 23 receiveMember(),
Marcus Chang 1:a3f39ec7d5f2 24 receiveDoneObject(NULL),
Marcus Chang 1:a3f39ec7d5f2 25
marcuschang 0:dfed780dc91a 26 conditionBuffer(NULL),
marcuschang 0:dfed780dc91a 27 conditionLength(0),
marcuschang 0:dfed780dc91a 28 conditionIndex(0),
marcuschang 0:dfed780dc91a 29 timeout()
Marcus Chang 1:a3f39ec7d5f2 30 {
marcuschang 0:dfed780dc91a 31 SerialBase::attach<AsyncSerial>(this, &AsyncSerial::getReady, SerialBase::RxIrq);
marcuschang 0:dfed780dc91a 32 SerialBase::attach<AsyncSerial>(this, &AsyncSerial::putDone, SerialBase::TxIrq);
marcuschang 0:dfed780dc91a 33 }
marcuschang 0:dfed780dc91a 34
marcuschang 0:dfed780dc91a 35 void AsyncSerial::putDone()
marcuschang 0:dfed780dc91a 36 {
marcuschang 0:dfed780dc91a 37 if (sendLength > 0)
marcuschang 0:dfed780dc91a 38 {
marcuschang 0:dfed780dc91a 39 sendIndex++;
Marcus Chang 1:a3f39ec7d5f2 40
marcuschang 0:dfed780dc91a 41 if (sendIndex < sendLength)
marcuschang 0:dfed780dc91a 42 {
marcuschang 0:dfed780dc91a 43 SerialBase::_base_putc(sendBuffer[sendIndex]);
marcuschang 0:dfed780dc91a 44 }
marcuschang 0:dfed780dc91a 45 else
marcuschang 0:dfed780dc91a 46 {
Marcus Chang 1:a3f39ec7d5f2 47 sendLength = 0;
Marcus Chang 1:a3f39ec7d5f2 48
marcuschang 0:dfed780dc91a 49 if (sendDoneHandler)
marcuschang 0:dfed780dc91a 50 {
marcuschang 0:dfed780dc91a 51 sendDoneHandler(sendBuffer, sendLength);
marcuschang 0:dfed780dc91a 52 sendDoneHandler = NULL;
Marcus Chang 1:a3f39ec7d5f2 53 }
Marcus Chang 1:a3f39ec7d5f2 54 else if (sendObject)
Marcus Chang 1:a3f39ec7d5f2 55 {
Marcus Chang 1:a3f39ec7d5f2 56 sendDoneObject(sendObject, sendMember, sendBuffer, sendLength);
Marcus Chang 1:a3f39ec7d5f2 57 sendObject = NULL;
marcuschang 0:dfed780dc91a 58 }
marcuschang 0:dfed780dc91a 59 }
marcuschang 0:dfed780dc91a 60 }
marcuschang 0:dfed780dc91a 61 }
marcuschang 0:dfed780dc91a 62
marcuschang 0:dfed780dc91a 63 void AsyncSerial::getReady()
marcuschang 0:dfed780dc91a 64 {
marcuschang 0:dfed780dc91a 65 uint8_t input = SerialBase::_base_getc();
Marcus Chang 1:a3f39ec7d5f2 66
marcuschang 0:dfed780dc91a 67 if (receiveMaxLength > 0)
Marcus Chang 1:a3f39ec7d5f2 68 {
marcuschang 0:dfed780dc91a 69 receiveBuffer[receiveIndex] = input;
marcuschang 0:dfed780dc91a 70 receiveIndex++;
Marcus Chang 1:a3f39ec7d5f2 71
marcuschang 0:dfed780dc91a 72 if (receiveIndex == receiveMaxLength)
marcuschang 0:dfed780dc91a 73 {
marcuschang 0:dfed780dc91a 74 timeout.detach();
marcuschang 0:dfed780dc91a 75 getDone();
marcuschang 0:dfed780dc91a 76 }
marcuschang 0:dfed780dc91a 77 else if (conditionLength > 0)
marcuschang 0:dfed780dc91a 78 {
marcuschang 0:dfed780dc91a 79 if (receiveBuffer[receiveIndex - 1] == conditionBuffer[conditionIndex])
marcuschang 0:dfed780dc91a 80 {
marcuschang 0:dfed780dc91a 81 conditionIndex++;
Marcus Chang 1:a3f39ec7d5f2 82
marcuschang 0:dfed780dc91a 83 if (conditionIndex == conditionLength)
marcuschang 0:dfed780dc91a 84 {
marcuschang 0:dfed780dc91a 85 timeout.detach();
marcuschang 0:dfed780dc91a 86 getDone();
marcuschang 0:dfed780dc91a 87 }
marcuschang 0:dfed780dc91a 88 }
marcuschang 0:dfed780dc91a 89 else
marcuschang 0:dfed780dc91a 90 {
marcuschang 0:dfed780dc91a 91 conditionIndex = 0;
marcuschang 0:dfed780dc91a 92 }
marcuschang 0:dfed780dc91a 93 }
marcuschang 0:dfed780dc91a 94 }
marcuschang 0:dfed780dc91a 95 }
marcuschang 0:dfed780dc91a 96
marcuschang 0:dfed780dc91a 97 void AsyncSerial::getDone()
Marcus Chang 1:a3f39ec7d5f2 98 {
marcuschang 0:dfed780dc91a 99 receiveMaxLength = 0;
marcuschang 0:dfed780dc91a 100
marcuschang 0:dfed780dc91a 101 if (receiveDoneHandler)
marcuschang 0:dfed780dc91a 102 {
marcuschang 0:dfed780dc91a 103 receiveDoneHandler(receiveBuffer, receiveIndex);
marcuschang 0:dfed780dc91a 104 receiveDoneHandler = NULL;
marcuschang 0:dfed780dc91a 105 }
Marcus Chang 1:a3f39ec7d5f2 106 else if (receiveObject)
Marcus Chang 1:a3f39ec7d5f2 107 {
Marcus Chang 1:a3f39ec7d5f2 108 receiveDoneObject(receiveObject, receiveMember, receiveBuffer, receiveIndex);
Marcus Chang 1:a3f39ec7d5f2 109 receiveObject = NULL;
Marcus Chang 1:a3f39ec7d5f2 110 }
marcuschang 0:dfed780dc91a 111 }
marcuschang 0:dfed780dc91a 112
marcuschang 0:dfed780dc91a 113 void AsyncSerial::send(send_done_t handler, uint8_t* buffer, uint16_t length)
marcuschang 0:dfed780dc91a 114 {
marcuschang 0:dfed780dc91a 115 if (handler && buffer && length)
Marcus Chang 1:a3f39ec7d5f2 116 {
marcuschang 0:dfed780dc91a 117 sendDoneHandler = handler;
Marcus Chang 1:a3f39ec7d5f2 118
Marcus Chang 1:a3f39ec7d5f2 119 sendObject = NULL;
Marcus Chang 1:a3f39ec7d5f2 120
marcuschang 0:dfed780dc91a 121 send(buffer, length);
marcuschang 0:dfed780dc91a 122 }
marcuschang 0:dfed780dc91a 123 }
marcuschang 0:dfed780dc91a 124
marcuschang 0:dfed780dc91a 125 void AsyncSerial::send(uint8_t* buffer, uint16_t length)
marcuschang 0:dfed780dc91a 126 {
marcuschang 0:dfed780dc91a 127 sendBuffer = buffer;
marcuschang 0:dfed780dc91a 128 sendLength = length;
marcuschang 0:dfed780dc91a 129
Marcus Chang 1:a3f39ec7d5f2 130 sendIndex = 0;
marcuschang 0:dfed780dc91a 131 SerialBase::_base_putc(sendBuffer[sendIndex]);
marcuschang 0:dfed780dc91a 132 }
marcuschang 0:dfed780dc91a 133
Marcus Chang 1:a3f39ec7d5f2 134 void AsyncSerial::receive(receive_done_t handler,
Marcus Chang 1:a3f39ec7d5f2 135 uint8_t* buffer, uint16_t maxLength,
Marcus Chang 1:a3f39ec7d5f2 136 const uint8_t* conditionBuffer, uint16_t conditionLength,
marcuschang 0:dfed780dc91a 137 uint32_t timeoutMilli)
marcuschang 0:dfed780dc91a 138 {
Marcus Chang 1:a3f39ec7d5f2 139 if (handler)
Marcus Chang 1:a3f39ec7d5f2 140 {
Marcus Chang 1:a3f39ec7d5f2 141 receiveDoneHandler = handler;
Marcus Chang 1:a3f39ec7d5f2 142
Marcus Chang 1:a3f39ec7d5f2 143 receiveObject = NULL;
Marcus Chang 1:a3f39ec7d5f2 144
Marcus Chang 1:a3f39ec7d5f2 145 receive(buffer, maxLength, conditionBuffer, conditionLength, timeoutMilli);
Marcus Chang 1:a3f39ec7d5f2 146 }
Marcus Chang 1:a3f39ec7d5f2 147 }
marcuschang 0:dfed780dc91a 148
marcuschang 2:efec63739aa3 149 void AsyncSerial::receive(uint8_t* buffer, uint16_t maxLength,
marcuschang 2:efec63739aa3 150 const uint8_t* _conditionBuffer, uint16_t _conditionLength,
Marcus Chang 1:a3f39ec7d5f2 151 uint32_t timeoutMilli)
Marcus Chang 1:a3f39ec7d5f2 152 {
marcuschang 0:dfed780dc91a 153 receiveBuffer = buffer;
marcuschang 0:dfed780dc91a 154 receiveMaxLength = maxLength;
marcuschang 0:dfed780dc91a 155 receiveIndex = 0;
Marcus Chang 1:a3f39ec7d5f2 156
marcuschang 0:dfed780dc91a 157 conditionBuffer = _conditionBuffer;
marcuschang 0:dfed780dc91a 158 conditionLength = _conditionLength;
marcuschang 0:dfed780dc91a 159 conditionIndex = 0;
Marcus Chang 1:a3f39ec7d5f2 160
marcuschang 0:dfed780dc91a 161 timeout.attach_us<AsyncSerial>(this, &AsyncSerial::getDone, timeoutMilli * 1000);
marcuschang 0:dfed780dc91a 162 }
marcuschang 0:dfed780dc91a 163
Marcus Chang 1:a3f39ec7d5f2 164 int AsyncSerial::getc()
marcuschang 0:dfed780dc91a 165 {
marcuschang 0:dfed780dc91a 166 return SerialBase::_base_getc();
marcuschang 0:dfed780dc91a 167 }
marcuschang 0:dfed780dc91a 168
Marcus Chang 1:a3f39ec7d5f2 169 int AsyncSerial::putc(int c)
marcuschang 0:dfed780dc91a 170 {
marcuschang 0:dfed780dc91a 171 return SerialBase::_base_putc(c);
marcuschang 0:dfed780dc91a 172 }
marcuschang 0:dfed780dc91a 173
marcuschang 0:dfed780dc91a 174