パケットごとに出し入れするFIFOバッファ

Committer:
jksoft
Date:
Thu Aug 25 02:15:08 2011 +0000
Revision:
1:039fb6d44f92
Parent:
0:0e4cbd5ddf25

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:0e4cbd5ddf25 1
jksoft 0:0e4cbd5ddf25 2 /** @file PacketBuffer.cpp
jksoft 0:0e4cbd5ddf25 3 * @brief Ring Buffer
jksoft 0:0e4cbd5ddf25 4 */
jksoft 0:0e4cbd5ddf25 5
jksoft 0:0e4cbd5ddf25 6 #include "PacketBuffer.h"
jksoft 0:0e4cbd5ddf25 7
jksoft 0:0e4cbd5ddf25 8
jksoft 0:0e4cbd5ddf25 9 PacketBuffer::PacketBuffer(int num,int packet_size)
jksoft 0:0e4cbd5ddf25 10 {
jksoft 1:039fb6d44f92 11 max_num = num;
jksoft 0:0e4cbd5ddf25 12 max_size = packet_size;
jksoft 0:0e4cbd5ddf25 13
jksoft 1:039fb6d44f92 14 p_buf = new PacketBufInf[num];
jksoft 0:0e4cbd5ddf25 15
jksoft 0:0e4cbd5ddf25 16 for(int i = 0 ; i < num ; i++)
jksoft 0:0e4cbd5ddf25 17 {
jksoft 0:0e4cbd5ddf25 18 p_buf[i].buf = new char[packet_size];
jksoft 0:0e4cbd5ddf25 19 p_buf[i].size = 0;
jksoft 0:0e4cbd5ddf25 20 }
jksoft 0:0e4cbd5ddf25 21 addr_w = 0;
jksoft 0:0e4cbd5ddf25 22 addr_r = 0;
jksoft 0:0e4cbd5ddf25 23 }
jksoft 0:0e4cbd5ddf25 24
jksoft 0:0e4cbd5ddf25 25 PacketBuffer::~PacketBuffer()
jksoft 0:0e4cbd5ddf25 26 {
jksoft 0:0e4cbd5ddf25 27
jksoft 1:039fb6d44f92 28 for(int i = 0 ; i < max_num ; i++)
jksoft 0:0e4cbd5ddf25 29 {
jksoft 0:0e4cbd5ddf25 30 delete [] p_buf[i].buf;
jksoft 1:039fb6d44f92 31 }
jksoft 0:0e4cbd5ddf25 32 delete [] p_buf;
jksoft 0:0e4cbd5ddf25 33 }
jksoft 0:0e4cbd5ddf25 34
jksoft 0:0e4cbd5ddf25 35 int PacketBuffer::PutPacket(char *packet, int len)
jksoft 0:0e4cbd5ddf25 36 {
jksoft 0:0e4cbd5ddf25 37 int next;
jksoft 0:0e4cbd5ddf25 38
jksoft 0:0e4cbd5ddf25 39 if(max_size < len) return(-1);
jksoft 0:0e4cbd5ddf25 40
jksoft 0:0e4cbd5ddf25 41 next = (addr_w + 1) % max_num;
jksoft 0:0e4cbd5ddf25 42
jksoft 0:0e4cbd5ddf25 43 if( next == addr_r ) return(0);
jksoft 0:0e4cbd5ddf25 44
jksoft 0:0e4cbd5ddf25 45 memcpy( p_buf[addr_w].buf , packet , len );
jksoft 0:0e4cbd5ddf25 46
jksoft 0:0e4cbd5ddf25 47 p_buf[addr_w].size = len;
jksoft 0:0e4cbd5ddf25 48
jksoft 0:0e4cbd5ddf25 49 addr_w = next;
jksoft 0:0e4cbd5ddf25 50
jksoft 0:0e4cbd5ddf25 51 return(len);
jksoft 0:0e4cbd5ddf25 52 }
jksoft 0:0e4cbd5ddf25 53
jksoft 0:0e4cbd5ddf25 54 int PacketBuffer::GetPacket(char *packet)
jksoft 0:0e4cbd5ddf25 55 {
jksoft 0:0e4cbd5ddf25 56 int len;
jksoft 0:0e4cbd5ddf25 57
jksoft 0:0e4cbd5ddf25 58 if( addr_w == addr_r ) return(0);
jksoft 0:0e4cbd5ddf25 59
jksoft 0:0e4cbd5ddf25 60 len = p_buf[addr_r].size;
jksoft 0:0e4cbd5ddf25 61
jksoft 0:0e4cbd5ddf25 62 memcpy( packet , p_buf[addr_r].buf , len );
jksoft 0:0e4cbd5ddf25 63
jksoft 0:0e4cbd5ddf25 64 addr_r = (addr_r + 1) % max_num;
jksoft 0:0e4cbd5ddf25 65
jksoft 0:0e4cbd5ddf25 66 return len;
jksoft 0:0e4cbd5ddf25 67 }
jksoft 0:0e4cbd5ddf25 68
jksoft 0:0e4cbd5ddf25 69 int PacketBuffer::available () {
jksoft 0:0e4cbd5ddf25 70 if (addr_w < addr_r) {
jksoft 0:0e4cbd5ddf25 71 return addr_r - addr_w - 1;
jksoft 0:0e4cbd5ddf25 72 } else {
jksoft 0:0e4cbd5ddf25 73 return (max_num - addr_w) + addr_r - 1;
jksoft 0:0e4cbd5ddf25 74 }
jksoft 0:0e4cbd5ddf25 75 }
jksoft 0:0e4cbd5ddf25 76
jksoft 0:0e4cbd5ddf25 77 int PacketBuffer::use () {
jksoft 0:0e4cbd5ddf25 78 return max_num - available() - 1;
jksoft 0:0e4cbd5ddf25 79 }
jksoft 0:0e4cbd5ddf25 80
jksoft 0:0e4cbd5ddf25 81 void PacketBuffer::clear () {
jksoft 0:0e4cbd5ddf25 82 addr_w = 0;
jksoft 0:0e4cbd5ddf25 83 addr_r = 0;
jksoft 0:0e4cbd5ddf25 84 }