/ components / utils / src / buffer.c
buffer.c
  1  
  2  
  3  #include "buffer.h"
  4  #include "string.h"
  5  
  6  //TODO: add mutex if multiple thread supported
  7  
  8  void Buffer_Init(Buffer_t* buffer, uint8_t* dataBuffer, uint32_t maxSize)
  9  {
 10  	buffer->buffer  = dataBuffer;
 11  	buffer->maxSize = maxSize;
 12  	buffer->front   = 0;
 13  	buffer->rear    = 0;
 14  	memset(dataBuffer,0,maxSize);
 15  	dataBuffer[0]=' ';
 16  }
 17  
 18  //////////////////////////////
 19  ///@breif put multiple node data to queue 
 20  ///@param data: the first node data adress of node data array will put into queue
 21  ///@param length: the length of node data that will put into queue
 22  /////////////////////////////
 23  bool Buffer_Puts(Buffer_t* buffer, uint8_t* data, uint16_t length)
 24  {
 25  	if (buffer->maxSize - Buffer_Size(buffer) <= length)//队满
 26  		return false;
 27  	for (uint16_t i = 0; i<length; ++i)
 28  	{
 29  		buffer->rear = (buffer->rear + 1) % buffer->maxSize;
 30  		buffer->buffer[buffer->rear] = data[i];
 31  	}
 32      
 33  	return true;
 34  }
 35  
 36  
 37  //////////////////////////////
 38  ///@breif get multiple node data from queue
 39  ///@param data: the first node data adress of node data array will get from the queue
 40  ///@param length: the length of node data that will get from the queue
 41  /////////////////////////////
 42  bool Buffer_Gets(Buffer_t* buffer, uint8_t *data, uint16_t length)
 43  {
 44  	if (Buffer_Size(buffer)<length)
 45  		return false;
 46  
 47  	for (uint16_t i = 0; i<length; ++i)
 48  	{
 49  		buffer->front = (buffer->front + 1) % buffer->maxSize;
 50  		data[i] = buffer->buffer[buffer->front];
 51  	}
 52  	return true;
 53  }
 54  
 55  
 56  /**
 57   * query some data from the queue, and the data remain be a part of the queue
 58   * @param data the address of the data save to
 59   * @param startPosition Index of where to start query
 60   * #param num The number of data will be query
 61   * @retval Is query succeed
 62   */
 63  int32_t Buffer_Query(Buffer_t* buffer, uint8_t* data, uint16_t length, uint16_t startPosition)
 64  {
 65  	uint32_t size = (buffer->rear - startPosition + 1 + buffer->maxSize) % buffer->maxSize;
 66  	uint32_t index = startPosition;
 67  	uint16_t indexData = 0;
 68  	int32_t indexReturn = -1;
 69  
 70  	while (size)
 71  	{
 72  		if (buffer->buffer[index] == data[indexData])
 73  		{
 74  			if (indexData == 0)
 75  				indexReturn = index;
 76  			++indexData;
 77  			if (indexData == length)//find success
 78  			{
 79  				return indexReturn;
 80  			}
 81  		}
 82  		else
 83  		{
 84  			indexData = 0;
 85  			indexReturn = -1;
 86  			if (buffer->buffer[index] == data[indexData])
 87  			{
 88  				if (indexData == 0)
 89  					indexReturn = index;
 90  				++indexData;
 91  				if (indexData == length)//find success
 92  				{
 93  					return indexReturn;
 94  				}
 95  			}
 96  		}
 97  		index = (index + 1) % buffer->maxSize;
 98  		--size;
 99  	}
100  
101  	return -1;
102  }
103  
104  ////////////////////////////
105  ///@brief get the size of queue
106  ///@retval the size of queue
107  ///////////////////////////
108  uint32_t Buffer_Size(Buffer_t* buffer)
109  {
110  	return (buffer->rear - buffer->front + buffer->maxSize) % buffer->maxSize;
111  }
112  
113  ////////////////////////////
114  ///@brief get size sigh specific end position
115  ///
116  ////////////////////////////
117  
118  uint32_t Buffer_Size2(Buffer_t* buffer,uint32_t index)
119  {
120  	return (index - buffer->front + buffer->maxSize) % buffer->maxSize;
121  }
122  
123  
124  ////////////////////////////////
125  ///@breif clear the queue
126  ////////////////////////////////
127  void Buffer_Clear(Buffer_t* buffer)
128  {
129  	buffer->front = 0;
130  	buffer->rear = 0;
131  }
132  
133  
134  int32_t Buffer_StartPostion(Buffer_t* buffer)
135  {
136  	return (buffer->front + 1)%buffer->maxSize;
137  }
138  
139