Marcus Chang / AsyncSerial
Committer:
marcuschang
Date:
Fri Apr 10 14:27:21 2015 +0000
Revision:
11:6b99dbf1b65d
Parent:
10:9d3ae421081b
Child:
12:b45908320b9c
Changed all callbacks to use function pointer class.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcuschang 0:dfed780dc91a 1 #ifndef __ASYNCSERIAL_H__
marcuschang 0:dfed780dc91a 2 #define __ASYNCSERIAL_H__
marcuschang 0:dfed780dc91a 3
marcuschang 0:dfed780dc91a 4 #include "mbed.h"
marcuschang 11:6b99dbf1b65d 5 #include "FunctionPointer.h"
Marcus Chang 10:9d3ae421081b 6 #include "AsyncSerial/FunctionPointerWithContext.h"
marcuschang 0:dfed780dc91a 7
marcuschang 9:e183765bd81b 8 #define NDEBUG 1
marcuschang 0:dfed780dc91a 9
marcuschang 7:5ba3a01e13c4 10 #ifdef NDEBUG
marcuschang 7:5ba3a01e13c4 11 #define DEBUG(...) /* nothing */
marcuschang 7:5ba3a01e13c4 12 #else
marcuschang 7:5ba3a01e13c4 13 #define DEBUG(...) { printf(__VA_ARGS__); }
marcuschang 7:5ba3a01e13c4 14 #endif // NDEBUG
marcuschang 0:dfed780dc91a 15
marcuschang 0:dfed780dc91a 16
marcuschang 0:dfed780dc91a 17 class AsyncSerial : public SerialBase
marcuschang 0:dfed780dc91a 18 {
marcuschang 0:dfed780dc91a 19 public:
marcuschang 5:aecd37846dcc 20 typedef enum {
marcuschang 5:aecd37846dcc 21 RECEIVE_FOUND,
marcuschang 5:aecd37846dcc 22 RECEIVE_FULL,
marcuschang 5:aecd37846dcc 23 RECEIVE_TIMEOUT
marcuschang 5:aecd37846dcc 24 } receive_status_t;
Marcus Chang 6:9d48f2197243 25
Marcus Chang 10:9d3ae421081b 26 typedef struct {
Marcus Chang 10:9d3ae421081b 27 uint8_t* buffer;
Marcus Chang 10:9d3ae421081b 28 uint16_t length;
Marcus Chang 10:9d3ae421081b 29 uint8_t status;
Marcus Chang 10:9d3ae421081b 30 } receive_params_t;
Marcus Chang 10:9d3ae421081b 31
marcuschang 11:6b99dbf1b65d 32 typedef void (*send_done_t)(void);
marcuschang 11:6b99dbf1b65d 33 typedef void (*receive_done_t)(receive_params_t* result);
marcuschang 11:6b99dbf1b65d 34 typedef void (*wait_done_t)(uint8_t status);
marcuschang 11:6b99dbf1b65d 35
marcuschang 0:dfed780dc91a 36 AsyncSerial(PinName tx, PinName rx, PinName rts, PinName cts);
marcuschang 0:dfed780dc91a 37
marcuschang 7:5ba3a01e13c4 38 void send(send_done_t handler, const char* sendBuffer, uint16_t sendLength);
marcuschang 0:dfed780dc91a 39
marcuschang 0:dfed780dc91a 40 template<typename T>
marcuschang 9:e183765bd81b 41 void send(T* object, void (T::*member)(void),
marcuschang 7:5ba3a01e13c4 42 const char* buffer, uint16_t length)
marcuschang 2:efec63739aa3 43 {
marcuschang 11:6b99dbf1b65d 44 sendHandler.attach(object, member);
marcuschang 11:6b99dbf1b65d 45 send(buffer, length);
marcuschang 2:efec63739aa3 46 }
marcuschang 0:dfed780dc91a 47
Marcus Chang 1:a3f39ec7d5f2 48 void receive(receive_done_t handler,
Marcus Chang 1:a3f39ec7d5f2 49 uint8_t* receiveBuffer, uint16_t maxLength,
marcuschang 7:5ba3a01e13c4 50 const char* conditionStartBuffer, uint16_t conditionStartLength,
marcuschang 7:5ba3a01e13c4 51 const char* conditionEndBuffer, uint16_t conditionEndLength,
marcuschang 0:dfed780dc91a 52 uint32_t timeoutMilli);
marcuschang 0:dfed780dc91a 53
marcuschang 0:dfed780dc91a 54 template<typename T>
Marcus Chang 10:9d3ae421081b 55 void receive(T* object, void (T::*member)(receive_params_t*),
Marcus Chang 1:a3f39ec7d5f2 56 uint8_t* receiveBuffer, uint16_t maxLength,
marcuschang 7:5ba3a01e13c4 57 const char* conditionStartBuffer, uint16_t conditionStartLength,
marcuschang 7:5ba3a01e13c4 58 const char* conditionEndBuffer, uint16_t conditionEndLength,
marcuschang 2:efec63739aa3 59 uint32_t timeoutMilli)
marcuschang 2:efec63739aa3 60 {
Marcus Chang 10:9d3ae421081b 61 receiveHandler.attach(object, member);
marcuschang 2:efec63739aa3 62
Marcus Chang 10:9d3ae421081b 63 receive(receiveBuffer, maxLength,
Marcus Chang 10:9d3ae421081b 64 conditionStartBuffer, conditionStartLength,
Marcus Chang 10:9d3ae421081b 65 conditionEndBuffer, conditionEndLength,
Marcus Chang 10:9d3ae421081b 66 timeoutMilli);
marcuschang 2:efec63739aa3 67 }
marcuschang 0:dfed780dc91a 68
Marcus Chang 6:9d48f2197243 69 void wait(wait_done_t handler,
marcuschang 7:5ba3a01e13c4 70 const char* conditionEndBuffer, uint16_t conditionEndLength,
Marcus Chang 6:9d48f2197243 71 uint32_t timeoutMilli);
Marcus Chang 6:9d48f2197243 72
Marcus Chang 6:9d48f2197243 73 template<typename T>
marcuschang 7:5ba3a01e13c4 74 void wait(T* object, void (T::*member)(uint8_t),
marcuschang 7:5ba3a01e13c4 75 const char* conditionEndBuffer, uint16_t conditionEndLength,
Marcus Chang 6:9d48f2197243 76 uint32_t timeoutMilli)
Marcus Chang 10:9d3ae421081b 77 {
marcuschang 11:6b99dbf1b65d 78 waitHandler.attach(object, member);
marcuschang 11:6b99dbf1b65d 79
marcuschang 11:6b99dbf1b65d 80 receive(NULL, 0,
marcuschang 11:6b99dbf1b65d 81 NULL, 0,
marcuschang 11:6b99dbf1b65d 82 conditionEndBuffer, conditionEndLength,
marcuschang 11:6b99dbf1b65d 83 timeoutMilli);
Marcus Chang 6:9d48f2197243 84 }
Marcus Chang 6:9d48f2197243 85
marcuschang 0:dfed780dc91a 86 int getc();
marcuschang 0:dfed780dc91a 87 int putc(int c);
marcuschang 0:dfed780dc91a 88
marcuschang 3:af3caa18e928 89 /* Send buffer with length but without registering a callback function.
marcuschang 3:af3caa18e928 90 Useful in conjunction with the receive callback.
marcuschang 3:af3caa18e928 91 */
marcuschang 7:5ba3a01e13c4 92 void send(const char* buffer, uint16_t length);
marcuschang 3:af3caa18e928 93
marcuschang 0:dfed780dc91a 94 private:
Marcus Chang 1:a3f39ec7d5f2 95 void receive(uint8_t* receiveBuffer, uint16_t maxLength,
marcuschang 7:5ba3a01e13c4 96 const char* conditionStartBuffer, uint16_t conditionStartLength,
marcuschang 7:5ba3a01e13c4 97 const char* conditionEndBuffer, uint16_t conditionEndLength,
Marcus Chang 1:a3f39ec7d5f2 98 uint32_t timeoutMilli);
marcuschang 3:af3caa18e928 99
marcuschang 0:dfed780dc91a 100 void putDone();
marcuschang 0:dfed780dc91a 101 void getReady();
marcuschang 5:aecd37846dcc 102 void getDone(uint8_t status);
marcuschang 5:aecd37846dcc 103 void receiveTimeout();
marcuschang 0:dfed780dc91a 104
marcuschang 7:5ba3a01e13c4 105 const char* sendBuffer;
marcuschang 0:dfed780dc91a 106 uint16_t sendLength;
Marcus Chang 1:a3f39ec7d5f2 107 uint16_t sendIndex;
marcuschang 11:6b99dbf1b65d 108
marcuschang 11:6b99dbf1b65d 109 FunctionPointer sendHandler;
Marcus Chang 1:a3f39ec7d5f2 110
marcuschang 11:6b99dbf1b65d 111 FunctionPointerWithContext<receive_params_t*> receiveHandler;
Marcus Chang 10:9d3ae421081b 112 receive_params_t receiveResult;
Marcus Chang 1:a3f39ec7d5f2 113
marcuschang 11:6b99dbf1b65d 114 FunctionPointerWithContext<uint8_t> waitHandler;
Marcus Chang 6:9d48f2197243 115
Marcus Chang 4:e0a0eef4ca18 116 bool isReceiving;
Marcus Chang 4:e0a0eef4ca18 117 uint8_t* receiveBuffer;
Marcus Chang 4:e0a0eef4ca18 118 uint16_t receiveMaxLength;
Marcus Chang 4:e0a0eef4ca18 119 uint16_t receiveIndex;
Marcus Chang 10:9d3ae421081b 120 receive_status_t receiveStatus;
Marcus Chang 4:e0a0eef4ca18 121
marcuschang 7:5ba3a01e13c4 122 bool insideCondition;
marcuschang 7:5ba3a01e13c4 123 const char* conditionStartBuffer;
marcuschang 7:5ba3a01e13c4 124 uint16_t conditionStartLength;
marcuschang 7:5ba3a01e13c4 125 const char* conditionEndBuffer;
marcuschang 7:5ba3a01e13c4 126 uint16_t conditionEndLength;
marcuschang 7:5ba3a01e13c4 127 uint16_t conditionIndex;
Marcus Chang 1:a3f39ec7d5f2 128
marcuschang 0:dfed780dc91a 129 Timeout timeout;
marcuschang 0:dfed780dc91a 130 };
marcuschang 0:dfed780dc91a 131
marcuschang 0:dfed780dc91a 132 #endif // __ASYNCSERIAL_H__