Example #1
0
static void 
circular_buffer_test(circular_buffer_t cb) 
{
  int i;
  test_t t;
  for (i = 0; i < 7; ++i) {
    memset(t.buf, 0, sizeof(t.buf));
    t.index = i + 1;
    sprintf(t.buf, "the test buffer with id=>%d\n", t.index);
    t.len = strlen(t.buf);

    circular_buffer_put(cb, (const char*)&t, sizeof(t));
  }
  fprintf(stdout, "size : %d\n", circular_buffer_size(cb));
  fprintf(stdout, "circular buffer get=>%d\n", 
    circular_buffer_get(cb, sizeof(t), (char*)&t));
  fprintf(stdout, "size : %d\n", circular_buffer_size(cb));
  test_show(t);

  for (i = 0; i < 1; ++i) {
    memset(t.buf, 0, sizeof(t.buf));
    t.index = (i + 7) * (i + 7);
    sprintf(t.buf, "the test buffer with id=>%d\n", t.index);
    t.len = strlen(t.buf);

    circular_buffer_put(cb, (const char*)&t, sizeof(t));
  }
  fprintf(stdout, "size : %d\n", circular_buffer_size(cb));
  while (!circular_buffer_empty(cb)) {
    circular_buffer_get(cb, sizeof(t), (char*)&t);
    test_show(t);
  }
  fprintf(stdout, "size : %d\n", circular_buffer_size(cb));
}
Example #2
0
size_t circular_buffer_write(circular_buffer_t* buffer, const uint8_t* data, size_t size)
{
    // Если места недостаточно или размер данных равен 0 - возврат 0.
    if(buffer->size - buffer->count < size || size == 0) return 0;
    
    size_t n;
    for(n = 0; n < size; n ++) circular_buffer_put(buffer, *data ++);
    
    return size;
}
/**
 *   \brief Call back function for DMA left channel receive complete
 *
 *  This function will be called when DMA receive completes
 *  This function changes the destination address of the DMA channel and
 *  restarts the DMA transfer.
 *
 *   \param dmaStatus    [IN]    Status of the DMA transfer
 *   \param dataCallback [IN]    I2S handle
 *
 *   \return             void
 *
 */
void I2S_DmaRxLChCallBack(
    PSP_DMATransferStatus    dmaStatus,
    void    *dataCallback
)
{
	Uint16 *ptrRxLeft;
	Uint16 i;


#ifdef ENABLE_RECORD
    if ((dataCallback != NULL) && (dmaStatus == PSP_DMA_TRANSFER_COMPLETE))
    {
    	/* Get pointer to ping/pong buffer */
    	ptrRxLeft = &my_i2sRxLeftBuf[0];
    	if (left_rx_buf_sel == 0x1) /* check ping or pong buffer */
    	{
    	  	/* this buffer has data to be processed */
            ptrRxLeft += DMA_TARNSFER_SZ;
        }
        left_rx_buf_sel ^= 0x1; /* update ping/pong */
    	// copy data to the
        /*if(SEM_count(&SEM_BufferFull) > PROCESS_BUFFER_SIZE/DMA_TARNSFER_SZ){
        	return;
        }*/
       	for (i = 0; i < DMA_BUFFER_SZ; i++)
       	{
            // NOTE: since we need datapack to be disabled on I2S tx, we need it disabled on I2S rx therefore
            // we get 2 words per DMA transfer so the offset into DMA buffers has to be twice as big

       		recInLeftBuf = *ptrRxLeft;
    	    ptrRxLeft += 2;
    	    circular_buffer_put(recInLeftBuf);
    	    /*bufferIn[bufferInIdx] =  (recInLeftBuf & 0xFF);
    	    bufferInIdx = (bufferInIdx+1) % PROCESS_BUFFER_SIZE;
    	    bufferIn[bufferInIdx] =  ((recInLeftBuf >> 8) & 0xFF);
    	    bufferInIdx = (bufferInIdx+1) % PROCESS_BUFFER_SIZE; */
    	}
    	SEM_post(&SEM_BufferFull);
    	//LOG_printf(&trace, "IN log %ld\n",bufferInIdx);
    }
    else
    {
#ifdef DEBUG_LOG_PRINT
        LOG_printf(&trace, "Left RX DMA Failed");
#endif
    }

#endif // ENABLE_RECORD
}
Example #4
0
void mesg_queue_add(mesg_queue *q, mesg_queue_entry * entry) {
  pthread_mutex_lock(&q->lock);
  circular_buffer_put(q->buffer,entry);
  pthread_mutex_unlock(&q->lock);
}