00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "buffer.h"
00019 #include "global.h"
00020 #include "avr/io.h"
00021
00022 #ifndef CRITICAL_SECTION_START
00023 #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli()
00024 #define CRITICAL_SECTION_END SREG = _sreg
00025 #endif
00026
00027
00028
00029
00030
00031 void bufferInit(cBuffer* buffer, unsigned char *start, unsigned short size)
00032 {
00033
00034 CRITICAL_SECTION_START;
00035
00036 buffer->dataptr = start;
00037 buffer->size = size;
00038
00039 buffer->dataindex = 0;
00040 buffer->datalength = 0;
00041
00042 CRITICAL_SECTION_END;
00043 }
00044
00045
00046 unsigned char bufferGetFromFront(cBuffer* buffer)
00047 {
00048 unsigned char data = 0;
00049
00050 CRITICAL_SECTION_START;
00051
00052 if(buffer->datalength)
00053 {
00054
00055 data = buffer->dataptr[buffer->dataindex];
00056
00057 buffer->dataindex++;
00058 if(buffer->dataindex >= buffer->size)
00059 {
00060 buffer->dataindex -= buffer->size;
00061 }
00062 buffer->datalength--;
00063 }
00064
00065 CRITICAL_SECTION_END;
00066
00067 return data;
00068 }
00069
00070 void bufferDumpFromFront(cBuffer* buffer, unsigned short numbytes)
00071 {
00072
00073 CRITICAL_SECTION_START;
00074
00075
00076 if(numbytes < buffer->datalength)
00077 {
00078
00079 buffer->dataindex += numbytes;
00080 if(buffer->dataindex >= buffer->size)
00081 {
00082 buffer->dataindex -= buffer->size;
00083 }
00084 buffer->datalength -= numbytes;
00085 }
00086 else
00087 {
00088
00089 buffer->datalength = 0;
00090 }
00091
00092 CRITICAL_SECTION_END;
00093 }
00094
00095 unsigned char bufferGetAtIndex(cBuffer* buffer, unsigned short index)
00096 {
00097
00098 CRITICAL_SECTION_START;
00099
00100 unsigned char data = buffer->dataptr[(buffer->dataindex+index)%(buffer->size)];
00101
00102 CRITICAL_SECTION_END;
00103 return data;
00104 }
00105
00106 unsigned char bufferAddToEnd(cBuffer* buffer, unsigned char data)
00107 {
00108
00109 CRITICAL_SECTION_START;
00110
00111 if(buffer->datalength < buffer->size)
00112 {
00113
00114 buffer->dataptr[(buffer->dataindex + buffer->datalength) % buffer->size] = data;
00115
00116 buffer->datalength++;
00117
00118 CRITICAL_SECTION_END;
00119
00120 return -1;
00121 }
00122
00123 CRITICAL_SECTION_END;
00124
00125 return 0;
00126 }
00127
00128 unsigned short bufferIsNotFull(cBuffer* buffer)
00129 {
00130
00131 CRITICAL_SECTION_START;
00132
00133
00134 unsigned short bytesleft = (buffer->size - buffer->datalength);
00135
00136 CRITICAL_SECTION_END;
00137 return bytesleft;
00138 }
00139
00140 void bufferFlush(cBuffer* buffer)
00141 {
00142
00143 CRITICAL_SECTION_START;
00144
00145 buffer->datalength = 0;
00146
00147 CRITICAL_SECTION_END;
00148 }
00149