Marcus Chang / AsyncSerial
Committer:
marcuschang
Date:
Mon Mar 30 15:37:07 2015 +0000
Revision:
0:dfed780dc91a
Child:
1:a3f39ec7d5f2
Initial commit

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