Pranav Thakur / Mbed 2 deprecated daplink-validation

Dependencies:   mbed

Fork of daplink-validation by Russ Butler

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?

UserRevisionLine numberNew 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 }