Subversion Repositories svnkaklik

Rev

Rev 507 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
507 kaklik 1
/*! \file buffer.c \brief Multipurpose byte buffer structure and methods. */
2
//*****************************************************************************
3
//
4
// File Name	: 'buffer.c'
5
// Title		: Multipurpose byte buffer structure and methods
6
// Author		: Pascal Stang - Copyright (C) 2001-2002
7
// Created		: 9/23/2001
8
// Revised		: 9/23/2001
9
// Version		: 1.0
10
// Target MCU	: any
11
// Editor Tabs	: 4
12
//
13
// This code is distributed under the GNU Public License
14
//		which can be found at http://www.gnu.org/licenses/gpl.txt
15
//
16
//*****************************************************************************
17
 
18
#include "buffer.h"
19
#include "global.h"
20
#include "avr/io.h"
21
 
22
#ifndef CRITICAL_SECTION_START
23
#define CRITICAL_SECTION_START	unsigned char _sreg = SREG; cli()
24
#define CRITICAL_SECTION_END	SREG = _sreg
25
#endif
26
 
27
// global variables
28
 
29
// initialization
30
 
31
void bufferInit(cBuffer* buffer, unsigned char *start, unsigned short size)
32
{
33
	// begin critical section
34
	CRITICAL_SECTION_START;
35
	// set start pointer of the buffer
36
	buffer->dataptr = start;
37
	buffer->size = size;
38
	// initialize index and length
39
	buffer->dataindex = 0;
40
	buffer->datalength = 0;
41
	// end critical section
42
	CRITICAL_SECTION_END;
43
}
44
 
45
// access routines
46
unsigned char  bufferGetFromFront(cBuffer* buffer)
47
{
48
	unsigned char data = 0;
49
	// begin critical section
50
	CRITICAL_SECTION_START;
51
	// check to see if there's data in the buffer
52
	if(buffer->datalength)
53
	{
54
		// get the first character from buffer
55
		data = buffer->dataptr[buffer->dataindex];
56
		// move index down and decrement length
57
		buffer->dataindex++;
58
		if(buffer->dataindex >= buffer->size)
59
		{
60
			buffer->dataindex -= buffer->size;
61
		}
62
		buffer->datalength--;
63
	}
64
	// end critical section
65
	CRITICAL_SECTION_END;
66
	// return
67
	return data;
68
}
69
 
70
void bufferDumpFromFront(cBuffer* buffer, unsigned short numbytes)
71
{
72
	// begin critical section
73
	CRITICAL_SECTION_START;
74
	// dump numbytes from the front of the buffer
75
	// are we dumping less than the entire buffer?
76
	if(numbytes < buffer->datalength)
77
	{
78
		// move index down by numbytes and decrement length by numbytes
79
		buffer->dataindex += numbytes;
80
		if(buffer->dataindex >= buffer->size)
81
		{
82
			buffer->dataindex -= buffer->size;
83
		}
84
		buffer->datalength -= numbytes;
85
	}
86
	else
87
	{
88
		// flush the whole buffer
89
		buffer->datalength = 0;
90
	}
91
	// end critical section
92
	CRITICAL_SECTION_END;
93
}
94
 
95
unsigned char bufferGetAtIndex(cBuffer* buffer, unsigned short index)
96
{
97
	// begin critical section
98
	CRITICAL_SECTION_START;
99
	// return character at index in buffer
100
	unsigned char data = buffer->dataptr[(buffer->dataindex+index)%(buffer->size)];
101
	// end critical section
102
	CRITICAL_SECTION_END;
103
	return data;
104
}
105
 
106
unsigned char bufferAddToEnd(cBuffer* buffer, unsigned char data)
107
{
108
	// begin critical section
109
	CRITICAL_SECTION_START;
110
	// make sure the buffer has room
111
	if(buffer->datalength < buffer->size)
112
	{
113
		// save data byte at end of buffer
114
		buffer->dataptr[(buffer->dataindex + buffer->datalength) % buffer->size] = data;
115
		// increment the length
116
		buffer->datalength++;
117
		// end critical section
118
		CRITICAL_SECTION_END;
119
		// return success
120
		return -1;
121
	}
122
	// end critical section
123
	CRITICAL_SECTION_END;
124
	// return failure
125
	return 0;
126
}
127
 
128
unsigned short bufferIsNotFull(cBuffer* buffer)
129
{
130
	// begin critical section
131
	CRITICAL_SECTION_START;
132
	// check to see if the buffer has room
133
	// return true if there is room
134
	unsigned short bytesleft = (buffer->size - buffer->datalength);
135
	// end critical section
136
	CRITICAL_SECTION_END;
137
	return bytesleft;
138
}
139
 
140
void bufferFlush(cBuffer* buffer)
141
{
142
	// begin critical section
143
	CRITICAL_SECTION_START;
144
	// flush contents of the buffer
145
	buffer->datalength = 0;
146
	// end critical section
147
	CRITICAL_SECTION_END;
148
}
149