Pranav Thakur / Mbed 2 deprecated daplink-validation

Dependencies:   mbed

Fork of daplink-validation by Russ Butler

Committer:
c1728p9
Date:
Mon Apr 10 16:15:01 2017 +0000
Revision:
14:1293f2ed9c63
Parent:
12:b56a7a3f45d7
Child:
15:b724ef1cc0fe
Fix overrun due to slight differences in baudrates (effects stm32f103)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
c1728p9 0:c4a3bb148a79 1 #include "mbed.h"
c1728p9 1:db2a55107c7e 2 #include <stdio.h>
c1728p9 0:c4a3bb148a79 3
c1728p9 4:9d5fa3e73be2 4 RawSerial 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 4:9d5fa3e73be2 29 uint32_t new_tail = tail + 1;
c1728p9 4:9d5fa3e73be2 30 if (new_tail >= size) {
c1728p9 4:9d5fa3e73be2 31 new_tail = new_tail - size;
c1728p9 4:9d5fa3e73be2 32 }
c1728p9 4:9d5fa3e73be2 33 return head == new_tail;
c1728p9 2:204ef796ee06 34 }
c1728p9 2:204ef796ee06 35
c1728p9 2:204ef796ee06 36 void enqueue(uint8_t data) {
c1728p9 2:204ef796ee06 37 if (full()) {
c1728p9 2:204ef796ee06 38 error("Queue full\n");
c1728p9 2:204ef796ee06 39 }
c1728p9 2:204ef796ee06 40 buffer[tail] = data;
c1728p9 2:204ef796ee06 41 tail++;
c1728p9 4:9d5fa3e73be2 42 if (tail >= size) {
c1728p9 4:9d5fa3e73be2 43 tail -= size;
c1728p9 4:9d5fa3e73be2 44 }
c1728p9 2:204ef796ee06 45 }
c1728p9 2:204ef796ee06 46
c1728p9 2:204ef796ee06 47 uint8_t dequeue() {
c1728p9 2:204ef796ee06 48 uint8_t data;
c1728p9 2:204ef796ee06 49 if (empty()) {
c1728p9 2:204ef796ee06 50 error("Queue empty\n");
c1728p9 2:204ef796ee06 51 }
c1728p9 2:204ef796ee06 52 data = buffer[head];
c1728p9 2:204ef796ee06 53 head++;
c1728p9 4:9d5fa3e73be2 54 if (head >= size) {
c1728p9 4:9d5fa3e73be2 55 head = head - size;
c1728p9 4:9d5fa3e73be2 56 }
c1728p9 2:204ef796ee06 57 return data;
c1728p9 2:204ef796ee06 58 }
c1728p9 2:204ef796ee06 59
c1728p9 2:204ef796ee06 60 };
c1728p9 2:204ef796ee06 61
c1728p9 1:db2a55107c7e 62 int main()
c1728p9 1:db2a55107c7e 63 {
c1728p9 1:db2a55107c7e 64 uint32_t baud;
c1728p9 1:db2a55107c7e 65 uint32_t count;
c1728p9 1:db2a55107c7e 66 uint32_t index;
c1728p9 1:db2a55107c7e 67 uint32_t val;
c1728p9 1:db2a55107c7e 68 uint8_t str[64];
c1728p9 2:204ef796ee06 69 ByteBuffer buf(512);
c1728p9 1:db2a55107c7e 70 count = 0;
c1728p9 1:db2a55107c7e 71 index = 0;
c1728p9 1:db2a55107c7e 72
c1728p9 0:c4a3bb148a79 73 pc.baud(115200);
c1728p9 1:db2a55107c7e 74 pc.printf("{init}");
c1728p9 2:204ef796ee06 75 while (1) {
c1728p9 3:ffa3bbc3725f 76
c1728p9 2:204ef796ee06 77 // Enqueue data as it arrives
c1728p9 11:79bb70065356 78 while (pc.readable() && !buf.full()) {
c1728p9 1:db2a55107c7e 79 val = pc.getc();
c1728p9 2:204ef796ee06 80 buf.enqueue(val);
c1728p9 2:204ef796ee06 81 }
c1728p9 3:ffa3bbc3725f 82
c1728p9 2:204ef796ee06 83 // Process and send data
c1728p9 14:1293f2ed9c63 84 if (!buf.empty() && pc.writeable()) {
c1728p9 2:204ef796ee06 85 val = buf.dequeue();
c1728p9 1:db2a55107c7e 86 // Check for overflow. Leave space for
c1728p9 1:db2a55107c7e 87 // a null terminating character
c1728p9 1:db2a55107c7e 88 if (index >= sizeof(str) - 1) {
c1728p9 1:db2a55107c7e 89 index = 0;
c1728p9 1:db2a55107c7e 90 }
c1728p9 1:db2a55107c7e 91
c1728p9 1:db2a55107c7e 92 // Check for start of frame
c1728p9 1:db2a55107c7e 93 if ('{' == val) {
c1728p9 1:db2a55107c7e 94 index = 0;
c1728p9 1:db2a55107c7e 95 }
c1728p9 1:db2a55107c7e 96
c1728p9 1:db2a55107c7e 97 // Check for end of frame
c1728p9 1:db2a55107c7e 98 str[index] = val;
c1728p9 1:db2a55107c7e 99 index++;
c1728p9 1:db2a55107c7e 100
c1728p9 1:db2a55107c7e 101 // Check for end of frame
c1728p9 1:db2a55107c7e 102 if ('}' == val && index > 0) {
c1728p9 1:db2a55107c7e 103 str[index] = 0;
c1728p9 1:db2a55107c7e 104 count = sscanf((char*)str, "{baud:%i}", &baud);
c1728p9 1:db2a55107c7e 105 }
c1728p9 1:db2a55107c7e 106
c1728p9 1:db2a55107c7e 107 // Echo back character
c1728p9 1:db2a55107c7e 108 pc.putc(val);
c1728p9 1:db2a55107c7e 109
c1728p9 1:db2a55107c7e 110 // Set baud if there is a valid command
c1728p9 1:db2a55107c7e 111 if (count == 1) {
c1728p9 1:db2a55107c7e 112 wait(0.01f);
c1728p9 1:db2a55107c7e 113 pc.baud(baud);
c1728p9 2:204ef796ee06 114 // Make sure pc has enough time
c1728p9 2:204ef796ee06 115 // LCP11u35 requires ~0.1us while K20D requires ~0.01us
c1728p9 2:204ef796ee06 116 wait(0.1f);
c1728p9 1:db2a55107c7e 117 pc.printf("{change}");
c1728p9 1:db2a55107c7e 118 count = 0;
c1728p9 1:db2a55107c7e 119 }
c1728p9 1:db2a55107c7e 120 }
c1728p9 0:c4a3bb148a79 121 }
c1728p9 0:c4a3bb148a79 122 }