MeterLogger
queue.c
Go to the documentation of this file.
1 /* str_queue.c
2 *
3 * Copyright (c) 2014-2015, Tuan PM <tuanpm at live dot com>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * * Neither the name of Redis nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without
16 * specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "queue.h"
31 #include "proto.h"
32 
33 #include <esp8266.h>
34 
35 uint8_t *last_rb_p_r;
36 uint8_t *last_rb_p_w;
37 uint32_t last_fill_cnt;
38 
39 void ICACHE_FLASH_ATTR QUEUE_Init(QUEUE *queue, int bufferSize)
40 {
41  queue->buf = (uint8_t*)os_zalloc(bufferSize);
42  RINGBUF_Init(&queue->rb, queue->buf, bufferSize);
43 }
44 int32_t ICACHE_FLASH_ATTR QUEUE_Puts(QUEUE *queue, uint8_t* buffer, uint16_t len)
45 {
46  uint32_t ret;
47 
48  last_rb_p_r = queue->rb.p_r;
49  last_rb_p_w = queue->rb.p_w;
50  last_fill_cnt = queue->rb.fill_cnt;
51 
52  ret = PROTO_AddRb(&queue->rb, buffer, len);
53  if (ret == -1) {
54  // rolling ring buffer back
55  queue->rb.p_r = last_rb_p_r;
56  queue->rb.p_w = last_rb_p_w;
57  queue->rb.fill_cnt = last_fill_cnt;
58  }
59  return ret;
60 }
61 int32_t ICACHE_FLASH_ATTR QUEUE_Gets(QUEUE *queue, uint8_t* buffer, uint16_t* len, uint16_t maxLen)
62 {
63  return PROTO_ParseRb(&queue->rb, buffer, len, maxLen);
64 }
65 
67 {
68  if(queue->rb.fill_cnt<=0)
69  return TRUE;
70  return FALSE;
71 }
uint8_t * last_rb_p_w
Definition: queue.c:36
BOOL ICACHE_FLASH_ATTR QUEUE_IsEmpty(QUEUE *queue)
Definition: queue.c:66
int32_t ICACHE_FLASH_ATTR QUEUE_Puts(QUEUE *queue, uint8_t *buffer, uint16_t len)
Definition: queue.c:44
#define ICACHE_FLASH_ATTR
Definition: c_types.h:99
#define FALSE
Definition: c_types.h:111
#define TRUE
Definition: c_types.h:110
#define os_zalloc(s)
Definition: mem.h:44
I16 ICACHE_FLASH_ATTR PROTO_AddRb(RINGBUF *rb, const U8 *packet, I16 len)
Definition: proto.c:106
I16 ICACHE_FLASH_ATTR RINGBUF_Init(RINGBUF *r, U8 *buf, I32 size)
init a RINGBUF object
Definition: ringbuf.c:16
uint32_t last_fill_cnt
Definition: queue.c:37
int32_t ICACHE_FLASH_ATTR QUEUE_Gets(QUEUE *queue, uint8_t *buffer, uint16_t *len, uint16_t maxLen)
Definition: queue.c:61
#define BOOL
Definition: c_types.h:107
void ICACHE_FLASH_ATTR QUEUE_Init(QUEUE *queue, int bufferSize)
Definition: queue.c:39
uint8_t * buf
Definition: queue.h:36
Definition: queue.h:35
RINGBUF rb
Definition: queue.h:37
I16 ICACHE_FLASH_ATTR PROTO_ParseRb(RINGBUF *rb, U8 *bufOut, U16 *len, U16 maxBufLen)
Definition: proto.c:56
uint8_t * last_rb_p_r
Definition: queue.c:35
U8 *volatile p_w
Definition: ringbuf.h:10
volatile I32 fill_cnt
Definition: ringbuf.h:11
U8 *volatile p_r
Definition: ringbuf.h:9