Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
AsyncSerial/AsyncSerial.h@11:6b99dbf1b65d, 2015-04-10 (annotated)
- 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?
| User | Revision | Line number | New 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__ |

