1
0
mirror of https://github.com/arduino/Arduino.git synced 2024-12-11 22:24:13 +01:00
Arduino/build/shared/lib/avrlib/bitbuf.c
2005-08-25 21:06:28 +00:00

132 lines
3.2 KiB
C
Executable File

/*! \file bitbuf.c \brief Multipurpose bit buffer structure and methods. */
//*****************************************************************************
//
// File Name : 'bitbuf.c'
// Title : Multipurpose bit buffer structure and methods
// Author : Pascal Stang - Copyright (C) 2001-2002
// Created : 7/10/2002
// Revised : 7/10/2002
// Version : 0.5
// Target MCU : any
// Editor Tabs : 4
//
// This code is distributed under the GNU Public License
// which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************
#include "bitbuf.h"
// global variables
//! Initialize the bit buffer
// sets the start location and size of the buffer in memory
void bitbufInit(BitBuf* bitBuffer, unsigned char *start, unsigned short bytesize)
{
// set start pointer of the buffer
bitBuffer->dataptr = start;
bitBuffer->size = bytesize;
// initialize indexing and length
bitBuffer->dataindex = 0;
bitbufFlush(bitBuffer);
}
// access routines
//! Get a bit from the current position in the buffer
// returns the bit at the current position in the buffer
// and increments the bit position
unsigned char bitbufGet(BitBuf* bitBuffer)
{
unsigned char byte;
unsigned char bit;
// get current working byte
byte = bitBuffer->dataptr[bitBuffer->bytePos];
// read data bit
bit = (byte & (1<<bitBuffer->bitPos))?(1):(0);
// increment bit counter
if(bitBuffer->bitPos < 7)
{
bitBuffer->bitPos++;
}
else
{
// increment byte counter
bitBuffer->bitPos = 0;
bitBuffer->bytePos++;
}
// return bit value
return bit;
}
//! Get a bit from a given index into the buffer
// returns the bit at position [bitIndex] in the buffer
unsigned char bitbufGetAtIndex(BitBuf* bitBuffer, unsigned short bitIndex)
{
// return bit at index in buffer
return (bitBuffer->dataptr[bitIndex>>3] & (1<<(bitIndex & 0x07)))?(1):(0);
}
//! Store a bit at the current position in the buffer
// stores the bit at the current position in the buffer
// and increments the bit position
void bitbufStore(BitBuf* bitBuffer, unsigned char bit)
{
unsigned char byte;
// get current working byte
byte = bitBuffer->dataptr[bitBuffer->bytePos];
// apply data bit
if(bit)
byte |= (1<<bitBuffer->bitPos);
else
byte &= ~(1<<bitBuffer->bitPos);
// store data
bitBuffer->dataptr[bitBuffer->bytePos] = byte;
bitBuffer->datalength++;
// increment bit counter
if(bitBuffer->bitPos < 7)
{
bitBuffer->bitPos++;
}
else
{
// increment byte counter
bitBuffer->bitPos = 0;
bitBuffer->bytePos++;
}
}
void bitbufReset(BitBuf* bitBuffer)
{
// reset counters
bitBuffer->bytePos = 0;
bitBuffer->bitPos = 0;
}
void bitbufFlush(BitBuf* bitBuffer)
{
// flush contents of the buffer
bitBuffer->datalength = 0;
// reset indexing
bitbufReset(bitBuffer);
}
unsigned short bitbufGetDataLength(BitBuf* bitBuffer)
{
return bitBuffer->datalength;
}
/*
unsigned char bitbufIsNotFull(cBuffer* buffer)
{
// check to see if the buffer has room
// return true if there is room
return (buffer->datalength < buffer->size);
}
*/