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