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.
Dependencies: DAQ mbed-rtos mbed
Uart.cpp@2:7f7eb0cc78a4, 2014-04-30 (annotated)
- Committer:
- leysenkobe
- Date:
- Wed Apr 30 11:41:10 2014 +0000
- Revision:
- 2:7f7eb0cc78a4
- Parent:
- 1:fa51edf89e71
kbk;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leysenkobe | 0:6ee88b4152dc | 1 | #include "Uart.h" |
leysenkobe | 0:6ee88b4152dc | 2 | #include "Packet.h" |
leysenkobe | 0:6ee88b4152dc | 3 | #include "mbed.h" |
leysenkobe | 0:6ee88b4152dc | 4 | |
leysenkobe | 0:6ee88b4152dc | 5 | Serial pc(USBTX, USBRX); |
leysenkobe | 0:6ee88b4152dc | 6 | |
leysenkobe | 0:6ee88b4152dc | 7 | Uart::Uart(Module *m) |
leysenkobe | 0:6ee88b4152dc | 8 | { |
leysenkobe | 0:6ee88b4152dc | 9 | pc.baud(230400); |
leysenkobe | 0:6ee88b4152dc | 10 | this->m = m; |
leysenkobe | 0:6ee88b4152dc | 11 | packetscount = 0; |
leysenkobe | 0:6ee88b4152dc | 12 | blub = 0; |
leysenkobe | 0:6ee88b4152dc | 13 | } |
leysenkobe | 0:6ee88b4152dc | 14 | |
leysenkobe | 0:6ee88b4152dc | 15 | Uart::~Uart(void) |
leysenkobe | 0:6ee88b4152dc | 16 | { |
leysenkobe | 0:6ee88b4152dc | 17 | |
leysenkobe | 0:6ee88b4152dc | 18 | } |
leysenkobe | 0:6ee88b4152dc | 19 | |
leysenkobe | 0:6ee88b4152dc | 20 | void Uart::uart_thread() |
leysenkobe | 0:6ee88b4152dc | 21 | { |
leysenkobe | 0:6ee88b4152dc | 22 | //kijken of we data kunnen ontvangen |
leysenkobe | 0:6ee88b4152dc | 23 | if(pc.readable()) |
leysenkobe | 0:6ee88b4152dc | 24 | { |
leysenkobe | 0:6ee88b4152dc | 25 | //TOT_SIZE bepalen voor de totale groote van de array |
leysenkobe | 0:6ee88b4152dc | 26 | uint8_t *totsize = new uint8_t[2]; |
leysenkobe | 0:6ee88b4152dc | 27 | totsize[0] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 28 | totsize[1] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 29 | int TOT_SIZE = ((totsize[0] << 8) + totsize[1]); |
leysenkobe | 0:6ee88b4152dc | 30 | |
leysenkobe | 0:6ee88b4152dc | 31 | if(TOT_SIZE<7 || TOT_SIZE>50) |
leysenkobe | 0:6ee88b4152dc | 32 | { |
leysenkobe | 0:6ee88b4152dc | 33 | this->flush(); |
leysenkobe | 0:6ee88b4152dc | 34 | Packet *p = new Packet(m->getID()); |
leysenkobe | 0:6ee88b4152dc | 35 | m->packetWorker(p); |
leysenkobe | 0:6ee88b4152dc | 36 | return; |
leysenkobe | 0:6ee88b4152dc | 37 | } |
leysenkobe | 0:6ee88b4152dc | 38 | |
leysenkobe | 0:6ee88b4152dc | 39 | //DATA packet aanmaken |
leysenkobe | 0:6ee88b4152dc | 40 | uint8_t *data = new uint8_t[TOT_SIZE+2]; |
leysenkobe | 0:6ee88b4152dc | 41 | |
leysenkobe | 0:6ee88b4152dc | 42 | //TOT_SIZE |
leysenkobe | 0:6ee88b4152dc | 43 | data[0] = totsize[0]; |
leysenkobe | 0:6ee88b4152dc | 44 | data[1] = totsize[1]; |
leysenkobe | 0:6ee88b4152dc | 45 | |
leysenkobe | 0:6ee88b4152dc | 46 | //ID |
leysenkobe | 0:6ee88b4152dc | 47 | data[2] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 48 | data[3] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 49 | |
leysenkobe | 0:6ee88b4152dc | 50 | //CMD |
leysenkobe | 0:6ee88b4152dc | 51 | data[4] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 52 | |
leysenkobe | 0:6ee88b4152dc | 53 | //CMD_SIZE |
leysenkobe | 0:6ee88b4152dc | 54 | data[5] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 55 | data[6] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 56 | |
leysenkobe | 0:6ee88b4152dc | 57 | //CMD_DATA |
leysenkobe | 0:6ee88b4152dc | 58 | int size = ((data[5] << 8) + data[6]); |
leysenkobe | 0:6ee88b4152dc | 59 | if(size+7 != TOT_SIZE) |
leysenkobe | 0:6ee88b4152dc | 60 | { |
leysenkobe | 0:6ee88b4152dc | 61 | this->flush(); |
leysenkobe | 0:6ee88b4152dc | 62 | Packet *p = new Packet(m->getID()); |
leysenkobe | 0:6ee88b4152dc | 63 | m->packetWorker(p); |
leysenkobe | 0:6ee88b4152dc | 64 | return; |
leysenkobe | 0:6ee88b4152dc | 65 | } |
leysenkobe | 0:6ee88b4152dc | 66 | for (int i = 7; i < size+7; i++) |
leysenkobe | 0:6ee88b4152dc | 67 | { |
leysenkobe | 0:6ee88b4152dc | 68 | data[i] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 69 | } |
leysenkobe | 0:6ee88b4152dc | 70 | //RESERVED |
leysenkobe | 0:6ee88b4152dc | 71 | data[size+7] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 72 | data[size+8] = pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 73 | |
leysenkobe | 0:6ee88b4152dc | 74 | this->flush(); |
leysenkobe | 2:7f7eb0cc78a4 | 75 | Packet *p = new Packet(m->getID(),data,TOT_SIZE+2); |
leysenkobe | 2:7f7eb0cc78a4 | 76 | m->packetWorker(p); |
leysenkobe | 0:6ee88b4152dc | 77 | |
leysenkobe | 0:6ee88b4152dc | 78 | delete [] totsize; |
leysenkobe | 0:6ee88b4152dc | 79 | delete [] data; |
leysenkobe | 0:6ee88b4152dc | 80 | |
leysenkobe | 0:6ee88b4152dc | 81 | } |
leysenkobe | 0:6ee88b4152dc | 82 | //kijken of we data kunnen versturen |
leysenkobe | 0:6ee88b4152dc | 83 | if(packetscount > 0) |
leysenkobe | 0:6ee88b4152dc | 84 | { |
leysenkobe | 0:6ee88b4152dc | 85 | for(int i = 0; i < packetscount; i++) |
leysenkobe | 0:6ee88b4152dc | 86 | { |
leysenkobe | 0:6ee88b4152dc | 87 | //pc.printf("PACKET: "); |
leysenkobe | 0:6ee88b4152dc | 88 | Packet *p = packets[i]; |
leysenkobe | 0:6ee88b4152dc | 89 | |
leysenkobe | 0:6ee88b4152dc | 90 | //TOT_SIZE bytes |
leysenkobe | 0:6ee88b4152dc | 91 | pc.putc((p->getTOT_SIZE() >> 8) & 255); |
leysenkobe | 0:6ee88b4152dc | 92 | pc.putc((p->getTOT_SIZE() & 255)); |
leysenkobe | 0:6ee88b4152dc | 93 | |
leysenkobe | 0:6ee88b4152dc | 94 | //ID bytes |
leysenkobe | 0:6ee88b4152dc | 95 | pc.putc(p->getID()[0]); |
leysenkobe | 0:6ee88b4152dc | 96 | pc.putc(p->getID()[1]); |
leysenkobe | 0:6ee88b4152dc | 97 | |
leysenkobe | 0:6ee88b4152dc | 98 | //CMD byte |
leysenkobe | 0:6ee88b4152dc | 99 | pc.putc(p->getCMD()); |
leysenkobe | 0:6ee88b4152dc | 100 | |
leysenkobe | 0:6ee88b4152dc | 101 | //CMD_SIZE bytes |
leysenkobe | 0:6ee88b4152dc | 102 | pc.putc((p->getCMD_SIZE()>>8)& 255); |
leysenkobe | 0:6ee88b4152dc | 103 | pc.putc(p->getCMD_SIZE() & 255); |
leysenkobe | 0:6ee88b4152dc | 104 | |
leysenkobe | 0:6ee88b4152dc | 105 | //CMD_DATA |
leysenkobe | 0:6ee88b4152dc | 106 | for (int j = 0; j < p->getCMD_SIZE(); j++) |
leysenkobe | 0:6ee88b4152dc | 107 | { |
leysenkobe | 0:6ee88b4152dc | 108 | pc.putc(p->getCMD_DATA()[j]); |
leysenkobe | 0:6ee88b4152dc | 109 | } |
leysenkobe | 0:6ee88b4152dc | 110 | |
leysenkobe | 0:6ee88b4152dc | 111 | //RESERVED bytes |
leysenkobe | 0:6ee88b4152dc | 112 | pc.putc(p->getRESERVED()[0]); |
leysenkobe | 0:6ee88b4152dc | 113 | pc.putc(p->getRESERVED()[1]); |
leysenkobe | 0:6ee88b4152dc | 114 | |
leysenkobe | 1:fa51edf89e71 | 115 | //pc.printf("PACKET: %d \n",this->blub++); |
leysenkobe | 0:6ee88b4152dc | 116 | delete p; |
leysenkobe | 0:6ee88b4152dc | 117 | //pc.printf("\n"); |
leysenkobe | 0:6ee88b4152dc | 118 | } |
leysenkobe | 0:6ee88b4152dc | 119 | packetscount = 0; |
leysenkobe | 0:6ee88b4152dc | 120 | } |
leysenkobe | 0:6ee88b4152dc | 121 | } |
leysenkobe | 0:6ee88b4152dc | 122 | void Uart::send(Packet *p) |
leysenkobe | 0:6ee88b4152dc | 123 | { |
leysenkobe | 0:6ee88b4152dc | 124 | //packet toevoegen aan de buffer |
leysenkobe | 0:6ee88b4152dc | 125 | if(packetscount<2) |
leysenkobe | 0:6ee88b4152dc | 126 | { |
leysenkobe | 0:6ee88b4152dc | 127 | packets[packetscount] = p; |
leysenkobe | 0:6ee88b4152dc | 128 | packetscount++; |
leysenkobe | 0:6ee88b4152dc | 129 | } |
leysenkobe | 0:6ee88b4152dc | 130 | else |
leysenkobe | 0:6ee88b4152dc | 131 | { |
leysenkobe | 0:6ee88b4152dc | 132 | //laten weten aan module dat de buffer vol zit, zodat een lampje gaat branden |
leysenkobe | 0:6ee88b4152dc | 133 | } |
leysenkobe | 0:6ee88b4152dc | 134 | } |
leysenkobe | 0:6ee88b4152dc | 135 | |
leysenkobe | 0:6ee88b4152dc | 136 | void Uart::flush(void) |
leysenkobe | 0:6ee88b4152dc | 137 | { |
leysenkobe | 0:6ee88b4152dc | 138 | while(pc.readable()) |
leysenkobe | 0:6ee88b4152dc | 139 | { |
leysenkobe | 0:6ee88b4152dc | 140 | pc.getc(); |
leysenkobe | 0:6ee88b4152dc | 141 | } |
leysenkobe | 0:6ee88b4152dc | 142 | return; |
leysenkobe | 0:6ee88b4152dc | 143 | } |