Pranav Thakur / Mbed 2 deprecated daplink-validation

Dependencies:   mbed

Fork of daplink-validation by Russ Butler

Committer:
c1728p9
Date:
Thu Sep 15 19:34:29 2016 +0000
Revision:
10:8f171987d9a2
Parent:
9:17b6e12e46ab
Child:
11:79bb70065356
Decrease response time to fix buffer filling

Who changed what in which revision?

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