This program is for an autonomous robot for the competition at the Hochschule Luzern. http://cruisingcrepe.wordpress.com/ We are one of the 32 teams. http://cruisingcrepe.wordpress.com/ The postition control is based on this Documentation: Control of Wheeled Mobile Robots: An Experimental Overview from Alessandro De Luca, Giuseppe Oriolo, Marilena Vendittelli. For more information see here: http://www.dis.uniroma1.it/~labrob/pub/papers/Ramsete01.pdf
Fork of autonomous Robot Android by
MicroBridge/PacketBuffer/PacketBuffer.cpp@17:f0a973f17917, 2013-05-03 (annotated)
- Committer:
- chrigelburri
- Date:
- Fri May 03 06:30:46 2013 +0000
- Revision:
- 17:f0a973f17917
bastel mit adb
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chrigelburri | 17:f0a973f17917 | 1 | |
chrigelburri | 17:f0a973f17917 | 2 | /** @file PacketBuffer.cpp |
chrigelburri | 17:f0a973f17917 | 3 | * @brief Ring Buffer |
chrigelburri | 17:f0a973f17917 | 4 | */ |
chrigelburri | 17:f0a973f17917 | 5 | |
chrigelburri | 17:f0a973f17917 | 6 | #include "PacketBuffer.h" |
chrigelburri | 17:f0a973f17917 | 7 | |
chrigelburri | 17:f0a973f17917 | 8 | |
chrigelburri | 17:f0a973f17917 | 9 | PacketBuffer::PacketBuffer(int num,int packet_size) |
chrigelburri | 17:f0a973f17917 | 10 | { |
chrigelburri | 17:f0a973f17917 | 11 | max_num = num; |
chrigelburri | 17:f0a973f17917 | 12 | max_size = packet_size; |
chrigelburri | 17:f0a973f17917 | 13 | |
chrigelburri | 17:f0a973f17917 | 14 | p_buf = new PacketBufInf[num]; |
chrigelburri | 17:f0a973f17917 | 15 | |
chrigelburri | 17:f0a973f17917 | 16 | for(int i = 0 ; i < num ; i++) |
chrigelburri | 17:f0a973f17917 | 17 | { |
chrigelburri | 17:f0a973f17917 | 18 | p_buf[i].buf = new char[packet_size]; |
chrigelburri | 17:f0a973f17917 | 19 | p_buf[i].size = 0; |
chrigelburri | 17:f0a973f17917 | 20 | } |
chrigelburri | 17:f0a973f17917 | 21 | addr_w = 0; |
chrigelburri | 17:f0a973f17917 | 22 | addr_r = 0; |
chrigelburri | 17:f0a973f17917 | 23 | } |
chrigelburri | 17:f0a973f17917 | 24 | |
chrigelburri | 17:f0a973f17917 | 25 | PacketBuffer::~PacketBuffer() |
chrigelburri | 17:f0a973f17917 | 26 | { |
chrigelburri | 17:f0a973f17917 | 27 | |
chrigelburri | 17:f0a973f17917 | 28 | for(int i = 0 ; i < max_num ; i++) |
chrigelburri | 17:f0a973f17917 | 29 | { |
chrigelburri | 17:f0a973f17917 | 30 | delete [] p_buf[i].buf; |
chrigelburri | 17:f0a973f17917 | 31 | } |
chrigelburri | 17:f0a973f17917 | 32 | delete [] p_buf; |
chrigelburri | 17:f0a973f17917 | 33 | } |
chrigelburri | 17:f0a973f17917 | 34 | |
chrigelburri | 17:f0a973f17917 | 35 | int PacketBuffer::PutPacket(char *packet, int len) |
chrigelburri | 17:f0a973f17917 | 36 | { |
chrigelburri | 17:f0a973f17917 | 37 | int next; |
chrigelburri | 17:f0a973f17917 | 38 | |
chrigelburri | 17:f0a973f17917 | 39 | if(max_size < len) return(-1); |
chrigelburri | 17:f0a973f17917 | 40 | |
chrigelburri | 17:f0a973f17917 | 41 | next = (addr_w + 1) % max_num; |
chrigelburri | 17:f0a973f17917 | 42 | |
chrigelburri | 17:f0a973f17917 | 43 | if( next == addr_r ) return(0); |
chrigelburri | 17:f0a973f17917 | 44 | |
chrigelburri | 17:f0a973f17917 | 45 | memcpy( p_buf[addr_w].buf , packet , len ); |
chrigelburri | 17:f0a973f17917 | 46 | |
chrigelburri | 17:f0a973f17917 | 47 | p_buf[addr_w].size = len; |
chrigelburri | 17:f0a973f17917 | 48 | |
chrigelburri | 17:f0a973f17917 | 49 | addr_w = next; |
chrigelburri | 17:f0a973f17917 | 50 | |
chrigelburri | 17:f0a973f17917 | 51 | return(len); |
chrigelburri | 17:f0a973f17917 | 52 | } |
chrigelburri | 17:f0a973f17917 | 53 | |
chrigelburri | 17:f0a973f17917 | 54 | int PacketBuffer::GetPacket(char *packet) |
chrigelburri | 17:f0a973f17917 | 55 | { |
chrigelburri | 17:f0a973f17917 | 56 | int len; |
chrigelburri | 17:f0a973f17917 | 57 | |
chrigelburri | 17:f0a973f17917 | 58 | if( addr_w == addr_r ) return(0); |
chrigelburri | 17:f0a973f17917 | 59 | |
chrigelburri | 17:f0a973f17917 | 60 | len = p_buf[addr_r].size; |
chrigelburri | 17:f0a973f17917 | 61 | |
chrigelburri | 17:f0a973f17917 | 62 | memcpy( packet , p_buf[addr_r].buf , len ); |
chrigelburri | 17:f0a973f17917 | 63 | |
chrigelburri | 17:f0a973f17917 | 64 | addr_r = (addr_r + 1) % max_num; |
chrigelburri | 17:f0a973f17917 | 65 | |
chrigelburri | 17:f0a973f17917 | 66 | return len; |
chrigelburri | 17:f0a973f17917 | 67 | } |
chrigelburri | 17:f0a973f17917 | 68 | |
chrigelburri | 17:f0a973f17917 | 69 | int PacketBuffer::available () { |
chrigelburri | 17:f0a973f17917 | 70 | if (addr_w < addr_r) { |
chrigelburri | 17:f0a973f17917 | 71 | return addr_r - addr_w - 1; |
chrigelburri | 17:f0a973f17917 | 72 | } else { |
chrigelburri | 17:f0a973f17917 | 73 | return (max_num - addr_w) + addr_r - 1; |
chrigelburri | 17:f0a973f17917 | 74 | } |
chrigelburri | 17:f0a973f17917 | 75 | } |
chrigelburri | 17:f0a973f17917 | 76 | |
chrigelburri | 17:f0a973f17917 | 77 | int PacketBuffer::use () { |
chrigelburri | 17:f0a973f17917 | 78 | return max_num - available() - 1; |
chrigelburri | 17:f0a973f17917 | 79 | } |
chrigelburri | 17:f0a973f17917 | 80 | |
chrigelburri | 17:f0a973f17917 | 81 | void PacketBuffer::clear () { |
chrigelburri | 17:f0a973f17917 | 82 | addr_w = 0; |
chrigelburri | 17:f0a973f17917 | 83 | addr_r = 0; |
chrigelburri | 17:f0a973f17917 | 84 | } |