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.
Fork of daplink-validation by
main.cpp@3:ffa3bbc3725f, 2015-09-18 (annotated)
- Committer:
- c1728p9
- Date:
- Fri Sep 18 19:54:50 2015 +0000
- Revision:
- 3:ffa3bbc3725f
- Parent:
- 2:204ef796ee06
- Child:
- 4:9d5fa3e73be2
Fix incorrect overflow check
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| c1728p9 | 0:c4a3bb148a79 | 1 | #include "mbed.h" |
| c1728p9 | 1:db2a55107c7e | 2 | #include <stdio.h> |
| c1728p9 | 0:c4a3bb148a79 | 3 | |
| c1728p9 | 0:c4a3bb148a79 | 4 | Serial pc(USBTX, USBRX); |
| c1728p9 | 0:c4a3bb148a79 | 5 | |
| c1728p9 | 2:204ef796ee06 | 6 | class ByteBuffer |
| c1728p9 | 2:204ef796ee06 | 7 | { |
| c1728p9 | 2:204ef796ee06 | 8 | private: |
| c1728p9 | 2:204ef796ee06 | 9 | uint32_t head; |
| c1728p9 | 2:204ef796ee06 | 10 | uint32_t tail; |
| c1728p9 | 2:204ef796ee06 | 11 | const size_t size; |
| c1728p9 | 2:204ef796ee06 | 12 | uint8_t* buffer; |
| c1728p9 | 2:204ef796ee06 | 13 | public: |
| c1728p9 | 2:204ef796ee06 | 14 | ByteBuffer(size_t buffer_size): size(buffer_size) { |
| c1728p9 | 2:204ef796ee06 | 15 | head = 0; |
| c1728p9 | 2:204ef796ee06 | 16 | tail = 0; |
| c1728p9 | 2:204ef796ee06 | 17 | buffer = new uint8_t[buffer_size]; |
| c1728p9 | 2:204ef796ee06 | 18 | } |
| c1728p9 | 2:204ef796ee06 | 19 | |
| c1728p9 | 2:204ef796ee06 | 20 | ~ByteBuffer() { |
| c1728p9 | 2:204ef796ee06 | 21 | delete[] buffer; |
| c1728p9 | 2:204ef796ee06 | 22 | } |
| c1728p9 | 2:204ef796ee06 | 23 | |
| c1728p9 | 2:204ef796ee06 | 24 | bool empty() { |
| c1728p9 | 2:204ef796ee06 | 25 | return head == tail; |
| c1728p9 | 2:204ef796ee06 | 26 | } |
| c1728p9 | 2:204ef796ee06 | 27 | |
| c1728p9 | 2:204ef796ee06 | 28 | bool full() { |
| c1728p9 | 3:ffa3bbc3725f | 29 | return head == (tail + 1) % size; |
| c1728p9 | 2:204ef796ee06 | 30 | } |
| c1728p9 | 2:204ef796ee06 | 31 | |
| c1728p9 | 2:204ef796ee06 | 32 | void enqueue(uint8_t data) { |
| c1728p9 | 2:204ef796ee06 | 33 | if (full()) { |
| c1728p9 | 2:204ef796ee06 | 34 | error("Queue full\n"); |
| c1728p9 | 2:204ef796ee06 | 35 | } |
| c1728p9 | 2:204ef796ee06 | 36 | buffer[tail] = data; |
| c1728p9 | 2:204ef796ee06 | 37 | tail++; |
| c1728p9 | 2:204ef796ee06 | 38 | |
| c1728p9 | 2:204ef796ee06 | 39 | } |
| c1728p9 | 2:204ef796ee06 | 40 | |
| c1728p9 | 2:204ef796ee06 | 41 | uint8_t dequeue() { |
| c1728p9 | 2:204ef796ee06 | 42 | uint8_t data; |
| c1728p9 | 2:204ef796ee06 | 43 | if (empty()) { |
| c1728p9 | 2:204ef796ee06 | 44 | error("Queue empty\n"); |
| c1728p9 | 2:204ef796ee06 | 45 | } |
| c1728p9 | 2:204ef796ee06 | 46 | data = buffer[head]; |
| c1728p9 | 2:204ef796ee06 | 47 | head++; |
| c1728p9 | 2:204ef796ee06 | 48 | return data; |
| c1728p9 | 2:204ef796ee06 | 49 | } |
| c1728p9 | 2:204ef796ee06 | 50 | |
| c1728p9 | 2:204ef796ee06 | 51 | }; |
| c1728p9 | 2:204ef796ee06 | 52 | |
| c1728p9 | 1:db2a55107c7e | 53 | int main() |
| c1728p9 | 1:db2a55107c7e | 54 | { |
| c1728p9 | 1:db2a55107c7e | 55 | uint32_t baud; |
| c1728p9 | 1:db2a55107c7e | 56 | uint32_t count; |
| c1728p9 | 1:db2a55107c7e | 57 | uint32_t index; |
| c1728p9 | 1:db2a55107c7e | 58 | uint32_t val; |
| c1728p9 | 1:db2a55107c7e | 59 | uint8_t str[64]; |
| c1728p9 | 2:204ef796ee06 | 60 | ByteBuffer buf(512); |
| c1728p9 | 1:db2a55107c7e | 61 | count = 0; |
| c1728p9 | 1:db2a55107c7e | 62 | index = 0; |
| c1728p9 | 1:db2a55107c7e | 63 | |
| c1728p9 | 0:c4a3bb148a79 | 64 | pc.baud(115200); |
| c1728p9 | 1:db2a55107c7e | 65 | pc.printf("{init}"); |
| c1728p9 | 2:204ef796ee06 | 66 | while (1) { |
| c1728p9 | 3:ffa3bbc3725f | 67 | |
| c1728p9 | 2:204ef796ee06 | 68 | // Enqueue data as it arrives |
| c1728p9 | 2:204ef796ee06 | 69 | if (pc.readable()) { |
| c1728p9 | 1:db2a55107c7e | 70 | val = pc.getc(); |
| c1728p9 | 2:204ef796ee06 | 71 | buf.enqueue(val); |
| c1728p9 | 2:204ef796ee06 | 72 | } |
| c1728p9 | 3:ffa3bbc3725f | 73 | |
| c1728p9 | 2:204ef796ee06 | 74 | // Process and send data |
| c1728p9 | 2:204ef796ee06 | 75 | if (pc.writeable() && !buf.empty()) { |
| c1728p9 | 2:204ef796ee06 | 76 | val = buf.dequeue(); |
| c1728p9 | 1:db2a55107c7e | 77 | // Check for overflow. Leave space for |
| c1728p9 | 1:db2a55107c7e | 78 | // a null terminating character |
| c1728p9 | 1:db2a55107c7e | 79 | if (index >= sizeof(str) - 1) { |
| c1728p9 | 1:db2a55107c7e | 80 | index = 0; |
| c1728p9 | 1:db2a55107c7e | 81 | } |
| c1728p9 | 1:db2a55107c7e | 82 | |
| c1728p9 | 1:db2a55107c7e | 83 | // Check for start of frame |
| c1728p9 | 1:db2a55107c7e | 84 | if ('{' == val) { |
| c1728p9 | 1:db2a55107c7e | 85 | index = 0; |
| c1728p9 | 1:db2a55107c7e | 86 | } |
| c1728p9 | 1:db2a55107c7e | 87 | |
| c1728p9 | 1:db2a55107c7e | 88 | // Check for end of frame |
| c1728p9 | 1:db2a55107c7e | 89 | str[index] = val; |
| c1728p9 | 1:db2a55107c7e | 90 | index++; |
| c1728p9 | 1:db2a55107c7e | 91 | |
| c1728p9 | 1:db2a55107c7e | 92 | // Check for end of frame |
| c1728p9 | 1:db2a55107c7e | 93 | if ('}' == val && index > 0) { |
| c1728p9 | 1:db2a55107c7e | 94 | str[index] = 0; |
| c1728p9 | 1:db2a55107c7e | 95 | count = sscanf((char*)str, "{baud:%i}", &baud); |
| c1728p9 | 1:db2a55107c7e | 96 | } |
| c1728p9 | 1:db2a55107c7e | 97 | |
| c1728p9 | 1:db2a55107c7e | 98 | // Echo back character |
| c1728p9 | 1:db2a55107c7e | 99 | pc.putc(val); |
| c1728p9 | 1:db2a55107c7e | 100 | |
| c1728p9 | 1:db2a55107c7e | 101 | // Set baud if there is a valid command |
| c1728p9 | 1:db2a55107c7e | 102 | if (count == 1) { |
| c1728p9 | 1:db2a55107c7e | 103 | wait(0.01f); |
| c1728p9 | 1:db2a55107c7e | 104 | pc.baud(baud); |
| c1728p9 | 2:204ef796ee06 | 105 | // Make sure pc has enough time |
| c1728p9 | 2:204ef796ee06 | 106 | // LCP11u35 requires ~0.1us while K20D requires ~0.01us |
| c1728p9 | 2:204ef796ee06 | 107 | wait(0.1f); |
| c1728p9 | 1:db2a55107c7e | 108 | pc.printf("{change}"); |
| c1728p9 | 1:db2a55107c7e | 109 | count = 0; |
| c1728p9 | 1:db2a55107c7e | 110 | } |
| c1728p9 | 1:db2a55107c7e | 111 | } |
| c1728p9 | 0:c4a3bb148a79 | 112 | } |
| c1728p9 | 0:c4a3bb148a79 | 113 | } |
