Host software for the MAXREFDES220 Heart Rate Monitor Smart Sensor. Hosted on the MAX32630FTHR.

Dependencies:   max32630fthr USBDevice

Fork of MAXREFDES220_HEART_RATE_MONITOR by Maxim Integrated

Finger Heart Rate Monitor and SpO2 Monitor

The MAXREFDES220 Smart Sensor FeatherWing board is a integrated solution for providing finger-based heart rate measurements and SpO2 (blood oxygen saturation). This evaluation board interfaces to the host computer using the I2C interface. Heart rate outpu is available in beats per minute (BPM) and SpO2 is reported in percentages.; the PPG (photoplethysmography) raw data is also available. The board has an MAX30101 chip which is a low power heart rate monitor with adjustable sample rates and adjustable LED currents. The low cost MAX32664 microcontroller is pre-flashed with C code for finger-based pulse rate and SpO2 monitoring. Bootloader software is included to allow for future algorithms or updates to the algorithm from Maxim Integrated.

Ordering information will be available soon.

Note: SpO2 values are not calibrated. Calibration should be performed using the final end product.

Warning

The MAXREFDES220 source code listed is dated and only compatible with the 1.2.8a.msbl. The latest sample host source code is available on the MAX32664 website.

MAXREFDES220 FeatherWing Pinout Connections

/media/uploads/phonemacro/maxrefdes220_pinouts_heart_rate_monitor.jpg

Committer:
phonemacro
Date:
Fri Feb 05 01:59:25 2021 +0000
Revision:
14:3fdc09d9017b
Parent:
0:da5f5b56060a
Remove code for EventStats irq_evt - it no longer compiles on mBed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Shaun Kelsey 0:da5f5b56060a 1 /*******************************************************************************
Shaun Kelsey 0:da5f5b56060a 2 * Author: Ismail Kose, Ismail.Kose@maximintegrated.com
Shaun Kelsey 0:da5f5b56060a 3 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
Shaun Kelsey 0:da5f5b56060a 4 *
Shaun Kelsey 0:da5f5b56060a 5 * Permission is hereby granted, free of charge, to any person obtaining a
Shaun Kelsey 0:da5f5b56060a 6 * copy of this software and associated documentation files (the "Software"),
Shaun Kelsey 0:da5f5b56060a 7 * to deal in the Software without restriction, including without limitation
Shaun Kelsey 0:da5f5b56060a 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Shaun Kelsey 0:da5f5b56060a 9 * and/or sell copies of the Software, and to permit persons to whom the
Shaun Kelsey 0:da5f5b56060a 10 * Software is furnished to do so, subject to the following conditions:
Shaun Kelsey 0:da5f5b56060a 11 *
Shaun Kelsey 0:da5f5b56060a 12 * The above copyright notice and this permission notice shall be included
Shaun Kelsey 0:da5f5b56060a 13 * in all copies or substantial portions of the Software.
Shaun Kelsey 0:da5f5b56060a 14 *
Shaun Kelsey 0:da5f5b56060a 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Shaun Kelsey 0:da5f5b56060a 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Shaun Kelsey 0:da5f5b56060a 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Shaun Kelsey 0:da5f5b56060a 18 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Shaun Kelsey 0:da5f5b56060a 19 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Shaun Kelsey 0:da5f5b56060a 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Shaun Kelsey 0:da5f5b56060a 21 * OTHER DEALINGS IN THE SOFTWARE.
Shaun Kelsey 0:da5f5b56060a 22 *
Shaun Kelsey 0:da5f5b56060a 23 * Except as contained in this notice, the name of Maxim Integrated
Shaun Kelsey 0:da5f5b56060a 24 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Shaun Kelsey 0:da5f5b56060a 25 * Products, Inc. Branding Policy.
Shaun Kelsey 0:da5f5b56060a 26 *
Shaun Kelsey 0:da5f5b56060a 27 * The mere transfer of this software does not imply any licenses
Shaun Kelsey 0:da5f5b56060a 28 * of trade secrets, proprietary technology, copyrights, patents,
Shaun Kelsey 0:da5f5b56060a 29 * trademarks, maskwork rights, or any other form of intellectual
Shaun Kelsey 0:da5f5b56060a 30 * property whatsoever. Maxim Integrated Products, Inc. retains all
Shaun Kelsey 0:da5f5b56060a 31 * ownership rights.
Shaun Kelsey 0:da5f5b56060a 32 *******************************************************************************
Shaun Kelsey 0:da5f5b56060a 33 */
Shaun Kelsey 0:da5f5b56060a 34
Shaun Kelsey 0:da5f5b56060a 35 /*
Shaun Kelsey 0:da5f5b56060a 36 * TODO:
Shaun Kelsey 0:da5f5b56060a 37 * Add a function to enqueue data block instead of one by one.
Shaun Kelsey 0:da5f5b56060a 38 * Write function definitions in the header file as doxygen format
Shaun Kelsey 0:da5f5b56060a 39 * Init function will also allocate memory for queue buffer, providing the buffer will not necessary
Shaun Kelsey 0:da5f5b56060a 40 *
Shaun Kelsey 0:da5f5b56060a 41 * */
Shaun Kelsey 0:da5f5b56060a 42
Shaun Kelsey 0:da5f5b56060a 43 #include "queue.h"
Shaun Kelsey 0:da5f5b56060a 44 #include "mbed.h"
Shaun Kelsey 0:da5f5b56060a 45 #include "Peripherals.h"
Shaun Kelsey 0:da5f5b56060a 46
Shaun Kelsey 0:da5f5b56060a 47 int queue_reset(struct queue_t *q)
Shaun Kelsey 0:da5f5b56060a 48 {
Shaun Kelsey 0:da5f5b56060a 49 if (!q)
Shaun Kelsey 0:da5f5b56060a 50 return E_INVALID;
Shaun Kelsey 0:da5f5b56060a 51
Shaun Kelsey 0:da5f5b56060a 52 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 53 q->wr = q->base;
Shaun Kelsey 0:da5f5b56060a 54 q->rd = q->base;
Shaun Kelsey 0:da5f5b56060a 55 q->num_item = 0;
Shaun Kelsey 0:da5f5b56060a 56 q->ovf_item = 0;
Shaun Kelsey 0:da5f5b56060a 57 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 58 return 0;
Shaun Kelsey 0:da5f5b56060a 59 }
Shaun Kelsey 0:da5f5b56060a 60
Shaun Kelsey 0:da5f5b56060a 61 int queue_len(struct queue_t *q)
Shaun Kelsey 0:da5f5b56060a 62 {
Shaun Kelsey 0:da5f5b56060a 63 int num_elements;
Shaun Kelsey 0:da5f5b56060a 64
Shaun Kelsey 0:da5f5b56060a 65 if (!q)
Shaun Kelsey 0:da5f5b56060a 66 return E_INVALID;
Shaun Kelsey 0:da5f5b56060a 67
Shaun Kelsey 0:da5f5b56060a 68 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 69 num_elements = q->num_item;
Shaun Kelsey 0:da5f5b56060a 70 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 71
Shaun Kelsey 0:da5f5b56060a 72 return num_elements;
Shaun Kelsey 0:da5f5b56060a 73 }
Shaun Kelsey 0:da5f5b56060a 74
Shaun Kelsey 0:da5f5b56060a 75
Shaun Kelsey 0:da5f5b56060a 76 int queue_init(struct queue_t *q, void *buf, int item_size, int buffer_size)
Shaun Kelsey 0:da5f5b56060a 77 {
Shaun Kelsey 0:da5f5b56060a 78 if (!q || !buf)
Shaun Kelsey 0:da5f5b56060a 79 return E_INVALID;
Shaun Kelsey 0:da5f5b56060a 80
Shaun Kelsey 0:da5f5b56060a 81 if (buffer_size % item_size != 0)
Shaun Kelsey 0:da5f5b56060a 82 return E_INVALID; // Padding problem
Shaun Kelsey 0:da5f5b56060a 83
Shaun Kelsey 0:da5f5b56060a 84 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 85 q->num_item = 0;
Shaun Kelsey 0:da5f5b56060a 86 q->ovf_item = 0;
Shaun Kelsey 0:da5f5b56060a 87 q->base = buf;
Shaun Kelsey 0:da5f5b56060a 88 q->wr = buf;
Shaun Kelsey 0:da5f5b56060a 89 q->rd = buf;
Shaun Kelsey 0:da5f5b56060a 90 q->item_size = item_size;
Shaun Kelsey 0:da5f5b56060a 91 q->buffer_size = buffer_size;
Shaun Kelsey 0:da5f5b56060a 92 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 93 return 0;
Shaun Kelsey 0:da5f5b56060a 94 }
Shaun Kelsey 0:da5f5b56060a 95
Shaun Kelsey 0:da5f5b56060a 96 void queue_destroy(struct queue_t *q)
Shaun Kelsey 0:da5f5b56060a 97 {
Shaun Kelsey 0:da5f5b56060a 98 /* TODO: This is placeholder function, double check the implementation */
Shaun Kelsey 0:da5f5b56060a 99 free((void *)q->base);
Shaun Kelsey 0:da5f5b56060a 100 free((void *)q);
Shaun Kelsey 0:da5f5b56060a 101 }
Shaun Kelsey 0:da5f5b56060a 102
Shaun Kelsey 0:da5f5b56060a 103 int enqueue(struct queue_t *q, void *data)
Shaun Kelsey 0:da5f5b56060a 104 {
Shaun Kelsey 0:da5f5b56060a 105 int ret = 0;
Shaun Kelsey 0:da5f5b56060a 106
Shaun Kelsey 0:da5f5b56060a 107 if (!q || !data)
Shaun Kelsey 0:da5f5b56060a 108 return E_INVALID; // Invalid pointer
Shaun Kelsey 0:da5f5b56060a 109
Shaun Kelsey 0:da5f5b56060a 110 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 111 if (q->wr == q->rd)
Shaun Kelsey 0:da5f5b56060a 112 ret = (q->num_item != 0) ? -2 : 0; // Is FIFO Full or Empty?
Shaun Kelsey 0:da5f5b56060a 113
Shaun Kelsey 0:da5f5b56060a 114 if (((uint32_t)q->wr) >= ((uint32_t)q->base + q->buffer_size))
Shaun Kelsey 0:da5f5b56060a 115 q->wr = q->base;
Shaun Kelsey 0:da5f5b56060a 116
Shaun Kelsey 0:da5f5b56060a 117 memcpy((void *)q->wr, data, q->item_size);
Shaun Kelsey 0:da5f5b56060a 118 q->wr = (void *)((uint32_t)q->wr + q->item_size);
Shaun Kelsey 0:da5f5b56060a 119 q->num_item++;
Shaun Kelsey 0:da5f5b56060a 120 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 121 return ret;
Shaun Kelsey 0:da5f5b56060a 122 }
Shaun Kelsey 0:da5f5b56060a 123
Shaun Kelsey 0:da5f5b56060a 124 int dequeue(struct queue_t *q, void *data)
Shaun Kelsey 0:da5f5b56060a 125 {
Shaun Kelsey 0:da5f5b56060a 126 int fifo_size = q->buffer_size / q->item_size;
Shaun Kelsey 0:da5f5b56060a 127
Shaun Kelsey 0:da5f5b56060a 128 if (!q || !data)
Shaun Kelsey 0:da5f5b56060a 129 return E_INVALID;
Shaun Kelsey 0:da5f5b56060a 130
Shaun Kelsey 0:da5f5b56060a 131 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 132 if (q->num_item <= 0) {
Shaun Kelsey 0:da5f5b56060a 133 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 134 return -2;
Shaun Kelsey 0:da5f5b56060a 135 }
Shaun Kelsey 0:da5f5b56060a 136
Shaun Kelsey 0:da5f5b56060a 137 if (q->num_item > fifo_size) {
Shaun Kelsey 0:da5f5b56060a 138 uint32_t curr_rd_off = (((uint32_t)q->rd - (uint32_t)q->base) + q->num_item * q->item_size);
Shaun Kelsey 0:da5f5b56060a 139 q->ovf_item = q->num_item - fifo_size;
Shaun Kelsey 0:da5f5b56060a 140 q->rd = (void *)((uint32_t)q->base + (curr_rd_off % q->buffer_size));
Shaun Kelsey 0:da5f5b56060a 141 q->num_item = fifo_size; // OVF number samples are already gone.
Shaun Kelsey 0:da5f5b56060a 142 pr_info("%s:%d - %d samples lost, avail:%d \n",
Shaun Kelsey 0:da5f5b56060a 143 __func__, __LINE__, q->ovf_item, q->num_item);
Shaun Kelsey 0:da5f5b56060a 144 } else
Shaun Kelsey 0:da5f5b56060a 145 q->ovf_item = 0;
Shaun Kelsey 0:da5f5b56060a 146
Shaun Kelsey 0:da5f5b56060a 147 if (((uint32_t)q->rd) >= ((uint32_t)q->base + q->buffer_size))
Shaun Kelsey 0:da5f5b56060a 148 q->rd = q->base;
Shaun Kelsey 0:da5f5b56060a 149
Shaun Kelsey 0:da5f5b56060a 150 memcpy(data, (void *)q->rd, q->item_size);
Shaun Kelsey 0:da5f5b56060a 151 q->rd = (void *)((uint32_t)q->rd + q->item_size);
Shaun Kelsey 0:da5f5b56060a 152 q->num_item--;
Shaun Kelsey 0:da5f5b56060a 153 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 154
Shaun Kelsey 0:da5f5b56060a 155 #if defined(QUEUE_DEBUG)
Shaun Kelsey 0:da5f5b56060a 156 do {
Shaun Kelsey 0:da5f5b56060a 157 static int cnt;
Shaun Kelsey 0:da5f5b56060a 158
Shaun Kelsey 0:da5f5b56060a 159 if (cnt++ % 100 == 0)
Shaun Kelsey 0:da5f5b56060a 160 pr_debug("$ Fifo size: %d, usage: %d\n", fifo_size, q->num_item);
Shaun Kelsey 0:da5f5b56060a 161 } while(0);
Shaun Kelsey 0:da5f5b56060a 162 #endif
Shaun Kelsey 0:da5f5b56060a 163
Shaun Kelsey 0:da5f5b56060a 164 return 0;
Shaun Kelsey 0:da5f5b56060a 165 }
Shaun Kelsey 0:da5f5b56060a 166
Shaun Kelsey 0:da5f5b56060a 167 int queue_usage(struct queue_t *q, int *total, int *nm_item)
Shaun Kelsey 0:da5f5b56060a 168 {
Shaun Kelsey 0:da5f5b56060a 169 if (!q)
Shaun Kelsey 0:da5f5b56060a 170 return E_INVALID;
Shaun Kelsey 0:da5f5b56060a 171
Shaun Kelsey 0:da5f5b56060a 172 *total = q->buffer_size / q->item_size;
Shaun Kelsey 0:da5f5b56060a 173 *nm_item = q->num_item;
Shaun Kelsey 0:da5f5b56060a 174
Shaun Kelsey 0:da5f5b56060a 175 return 0;
Shaun Kelsey 0:da5f5b56060a 176 }
Shaun Kelsey 0:da5f5b56060a 177
Shaun Kelsey 0:da5f5b56060a 178 int queue_pop(struct queue_t *q)
Shaun Kelsey 0:da5f5b56060a 179 {
Shaun Kelsey 0:da5f5b56060a 180 int fifo_size = q->buffer_size / q->item_size;
Shaun Kelsey 0:da5f5b56060a 181
Shaun Kelsey 0:da5f5b56060a 182 if (!q)
Shaun Kelsey 0:da5f5b56060a 183 return E_INVALID;
Shaun Kelsey 0:da5f5b56060a 184
Shaun Kelsey 0:da5f5b56060a 185 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 186 if (q->num_item <= 0) {
Shaun Kelsey 0:da5f5b56060a 187 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 188 return -2;
Shaun Kelsey 0:da5f5b56060a 189 }
Shaun Kelsey 0:da5f5b56060a 190
Shaun Kelsey 0:da5f5b56060a 191 if (q->num_item > fifo_size) {
Shaun Kelsey 0:da5f5b56060a 192 uint32_t curr_rd_off = (((uint32_t)q->rd - (uint32_t)q->base) + q->num_item * q->item_size);
Shaun Kelsey 0:da5f5b56060a 193 q->ovf_item = q->num_item - fifo_size;
Shaun Kelsey 0:da5f5b56060a 194 q->rd = (void *)((uint32_t)q->base + (curr_rd_off % q->buffer_size));
Shaun Kelsey 0:da5f5b56060a 195 q->num_item = fifo_size; // OVF number samples are already gone.
Shaun Kelsey 0:da5f5b56060a 196 pr_info("%s:%d - %d samples lost, avail:%d \n",
Shaun Kelsey 0:da5f5b56060a 197 __func__, __LINE__, q->ovf_item, q->num_item);
Shaun Kelsey 0:da5f5b56060a 198 } else
Shaun Kelsey 0:da5f5b56060a 199 q->ovf_item = 0;
Shaun Kelsey 0:da5f5b56060a 200
Shaun Kelsey 0:da5f5b56060a 201 if (((uint32_t)q->rd) >= ((uint32_t)q->base + q->buffer_size))
Shaun Kelsey 0:da5f5b56060a 202 q->rd = q->base;
Shaun Kelsey 0:da5f5b56060a 203
Shaun Kelsey 0:da5f5b56060a 204 q->rd = (void *)((uint32_t)q->rd + q->item_size);
Shaun Kelsey 0:da5f5b56060a 205 q->num_item--;
Shaun Kelsey 0:da5f5b56060a 206 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 207
Shaun Kelsey 0:da5f5b56060a 208 #if defined(QUEUE_DEBUG)
Shaun Kelsey 0:da5f5b56060a 209 do {
Shaun Kelsey 0:da5f5b56060a 210 static int cnt;
Shaun Kelsey 0:da5f5b56060a 211
Shaun Kelsey 0:da5f5b56060a 212 if (cnt++ % 100 == 0)
Shaun Kelsey 0:da5f5b56060a 213 pr_debug("$ Fifo size: %d, usage: %d\n", fifo_size, q->num_item);
Shaun Kelsey 0:da5f5b56060a 214 } while(0);
Shaun Kelsey 0:da5f5b56060a 215 #endif
Shaun Kelsey 0:da5f5b56060a 216
Shaun Kelsey 0:da5f5b56060a 217 return 0;
Shaun Kelsey 0:da5f5b56060a 218 }
Shaun Kelsey 0:da5f5b56060a 219
Shaun Kelsey 0:da5f5b56060a 220 int queue_front(struct queue_t *q, void *data)
Shaun Kelsey 0:da5f5b56060a 221 {
Shaun Kelsey 0:da5f5b56060a 222 int fifo_size = q->buffer_size / q->item_size;
Shaun Kelsey 0:da5f5b56060a 223 void *rd = 0;
Shaun Kelsey 0:da5f5b56060a 224
Shaun Kelsey 0:da5f5b56060a 225 if (!q || !data)
Shaun Kelsey 0:da5f5b56060a 226 return E_INVALID;
Shaun Kelsey 0:da5f5b56060a 227
Shaun Kelsey 0:da5f5b56060a 228 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 229 if (q->num_item <= 0) {
Shaun Kelsey 0:da5f5b56060a 230 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 231 return -2;
Shaun Kelsey 0:da5f5b56060a 232 }
Shaun Kelsey 0:da5f5b56060a 233
Shaun Kelsey 0:da5f5b56060a 234 if (q->num_item > fifo_size) {
Shaun Kelsey 0:da5f5b56060a 235 uint32_t curr_rd_off = (((uint32_t)q->rd - (uint32_t)q->base) + q->num_item * q->item_size);
Shaun Kelsey 0:da5f5b56060a 236 rd = (void *)((uint32_t)q->base + (curr_rd_off % q->buffer_size));
Shaun Kelsey 0:da5f5b56060a 237 pr_info("%s:%d - %d samples lost, avail:%d \n",
Shaun Kelsey 0:da5f5b56060a 238 __func__, __LINE__, q->ovf_item, q->num_item);
Shaun Kelsey 0:da5f5b56060a 239 } else {
Shaun Kelsey 0:da5f5b56060a 240 q->ovf_item = 0;
Shaun Kelsey 0:da5f5b56060a 241 rd = q->rd;
Shaun Kelsey 0:da5f5b56060a 242 }
Shaun Kelsey 0:da5f5b56060a 243
Shaun Kelsey 0:da5f5b56060a 244 if (((uint32_t)q->rd) >= ((uint32_t)q->base + q->buffer_size))
Shaun Kelsey 0:da5f5b56060a 245 rd = q->base;
Shaun Kelsey 0:da5f5b56060a 246
Shaun Kelsey 0:da5f5b56060a 247 memcpy(data, (void *)rd, q->item_size);
Shaun Kelsey 0:da5f5b56060a 248 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 249
Shaun Kelsey 0:da5f5b56060a 250 return 0;
Shaun Kelsey 0:da5f5b56060a 251 }
Shaun Kelsey 0:da5f5b56060a 252
Shaun Kelsey 0:da5f5b56060a 253 int enqueue_string(struct queue_t *q, char *data, int sz)
Shaun Kelsey 0:da5f5b56060a 254 {
Shaun Kelsey 0:da5f5b56060a 255 int ret = 0;
Shaun Kelsey 0:da5f5b56060a 256 int buf_index;
Shaun Kelsey 0:da5f5b56060a 257 char *wr_ptr;
Shaun Kelsey 0:da5f5b56060a 258
Shaun Kelsey 0:da5f5b56060a 259 if (!q || !data || sz <= 0)
Shaun Kelsey 0:da5f5b56060a 260 return E_UNKNOWN; // Invalid parameters
Shaun Kelsey 0:da5f5b56060a 261
Shaun Kelsey 0:da5f5b56060a 262 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 263 if (q->wr == q->rd)
Shaun Kelsey 0:da5f5b56060a 264 ret = (q->num_item != 0) ? -2 : 0; // Is FIFO Full or Empty?
Shaun Kelsey 0:da5f5b56060a 265
Shaun Kelsey 0:da5f5b56060a 266 if (((uint32_t)q->wr) >= ((uint32_t)q->base + q->buffer_size))
Shaun Kelsey 0:da5f5b56060a 267 q->wr = q->base;
Shaun Kelsey 0:da5f5b56060a 268
Shaun Kelsey 0:da5f5b56060a 269 if ((q->num_item + sz) > q->buffer_size) {
Shaun Kelsey 0:da5f5b56060a 270 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 271 #if defined(QUEUE_DEBUG)
Shaun Kelsey 0:da5f5b56060a 272 {
Shaun Kelsey 0:da5f5b56060a 273 char buf[128];
Shaun Kelsey 0:da5f5b56060a 274 int len;
Shaun Kelsey 0:da5f5b56060a 275 len = sprintf(buf, "\r\n**** %s - Fifo is full. num_item: %d, sz: %d, buffer size: %d\r\n",
Shaun Kelsey 0:da5f5b56060a 276 __func__, q->num_item, sz, q->buffer_size);
Shaun Kelsey 0:da5f5b56060a 277 UART_Write(UART_PORT, (uint8_t*)buf, len);
Shaun Kelsey 0:da5f5b56060a 278 }
Shaun Kelsey 0:da5f5b56060a 279 #endif
Shaun Kelsey 0:da5f5b56060a 280 return E_UNKNOWN;
Shaun Kelsey 0:da5f5b56060a 281 }
Shaun Kelsey 0:da5f5b56060a 282
Shaun Kelsey 0:da5f5b56060a 283 buf_index = (uint32_t)q->wr - (uint32_t)q->base;
Shaun Kelsey 0:da5f5b56060a 284 wr_ptr = (char *)q->base;
Shaun Kelsey 0:da5f5b56060a 285 q->num_item += sz;
Shaun Kelsey 0:da5f5b56060a 286 while(sz--)
Shaun Kelsey 0:da5f5b56060a 287 wr_ptr[buf_index++ % q->buffer_size] = *data++;
Shaun Kelsey 0:da5f5b56060a 288
Shaun Kelsey 0:da5f5b56060a 289 q->wr = (void *)((uint32_t)q->base + buf_index % q->buffer_size);
Shaun Kelsey 0:da5f5b56060a 290 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 291 return ret;
Shaun Kelsey 0:da5f5b56060a 292 }
Shaun Kelsey 0:da5f5b56060a 293
Shaun Kelsey 0:da5f5b56060a 294 int dequeue_string(struct queue_t *q, char *buf, char delimiter, int buffer_size)
Shaun Kelsey 0:da5f5b56060a 295 {
Shaun Kelsey 0:da5f5b56060a 296 char *rd_ptr;
Shaun Kelsey 0:da5f5b56060a 297 int buf_index;
Shaun Kelsey 0:da5f5b56060a 298 int len;
Shaun Kelsey 0:da5f5b56060a 299
Shaun Kelsey 0:da5f5b56060a 300 if (!q || !buf || buffer_size <= 0)
Shaun Kelsey 0:da5f5b56060a 301 return E_UNKNOWN;
Shaun Kelsey 0:da5f5b56060a 302
Shaun Kelsey 0:da5f5b56060a 303 __disable_irq();
Shaun Kelsey 0:da5f5b56060a 304 if (q->num_item <= 0) {
Shaun Kelsey 0:da5f5b56060a 305 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 306 return E_UNKNOWN;
Shaun Kelsey 0:da5f5b56060a 307 }
Shaun Kelsey 0:da5f5b56060a 308
Shaun Kelsey 0:da5f5b56060a 309 rd_ptr = (char *)q->base;
Shaun Kelsey 0:da5f5b56060a 310 buf_index = (uint32_t)q->rd - (uint32_t)q->base;
Shaun Kelsey 0:da5f5b56060a 311 len = q->num_item;
Shaun Kelsey 0:da5f5b56060a 312
Shaun Kelsey 0:da5f5b56060a 313 while (buffer_size-- && q->num_item--) {
Shaun Kelsey 0:da5f5b56060a 314 char tmp = rd_ptr[buf_index % q->buffer_size];
Shaun Kelsey 0:da5f5b56060a 315 rd_ptr[buf_index % q->buffer_size] = 0; // Remove this later on
Shaun Kelsey 0:da5f5b56060a 316 buf_index++;
Shaun Kelsey 0:da5f5b56060a 317 *buf++ = tmp;
Shaun Kelsey 0:da5f5b56060a 318 if (tmp == delimiter)
Shaun Kelsey 0:da5f5b56060a 319 break;
Shaun Kelsey 0:da5f5b56060a 320 }
Shaun Kelsey 0:da5f5b56060a 321
Shaun Kelsey 0:da5f5b56060a 322 if (q->num_item < 0) {
Shaun Kelsey 0:da5f5b56060a 323 /* Data corruption in FIFO */
Shaun Kelsey 0:da5f5b56060a 324 q->num_item = 0;
Shaun Kelsey 0:da5f5b56060a 325 } else
Shaun Kelsey 0:da5f5b56060a 326 len -= q->num_item;
Shaun Kelsey 0:da5f5b56060a 327
Shaun Kelsey 0:da5f5b56060a 328 q->rd = (void *)((uint32_t)q->base + buf_index % q->buffer_size);
Shaun Kelsey 0:da5f5b56060a 329 __enable_irq();
Shaun Kelsey 0:da5f5b56060a 330
Shaun Kelsey 0:da5f5b56060a 331 return len;
Shaun Kelsey 0:da5f5b56060a 332 }
Shaun Kelsey 0:da5f5b56060a 333
Shaun Kelsey 0:da5f5b56060a 334
Shaun Kelsey 0:da5f5b56060a 335
Shaun Kelsey 0:da5f5b56060a 336 #if 0
Shaun Kelsey 0:da5f5b56060a 337 void queue_test(void)
Shaun Kelsey 0:da5f5b56060a 338 {
Shaun Kelsey 0:da5f5b56060a 339 int ret;
Shaun Kelsey 0:da5f5b56060a 340 ppg_data_t ppg_test = { 0, };
Shaun Kelsey 0:da5f5b56060a 341 ppg_data_t ppg_test_out = { 0, };
Shaun Kelsey 0:da5f5b56060a 342 int i, j, ii, jj;
Shaun Kelsey 0:da5f5b56060a 343 static ppg_data_t ppg_data[10];
Shaun Kelsey 0:da5f5b56060a 344 static queue_t queue;
Shaun Kelsey 0:da5f5b56060a 345
Shaun Kelsey 0:da5f5b56060a 346 srand((unsigned)time(NULL));
Shaun Kelsey 0:da5f5b56060a 347 ret = queue_init(&queue, &ppg_data, sizeof(ppg_data_t), sizeof(ppg_data));
Shaun Kelsey 0:da5f5b56060a 348 while (1) {
Shaun Kelsey 0:da5f5b56060a 349 ii = rand() % 20;
Shaun Kelsey 0:da5f5b56060a 350 for (i = 0; i < ii; i++) {
Shaun Kelsey 0:da5f5b56060a 351 /* Test data */
Shaun Kelsey 0:da5f5b56060a 352 ppg_test.timestamp++;
Shaun Kelsey 0:da5f5b56060a 353 ppg_test.ir++;
Shaun Kelsey 0:da5f5b56060a 354 ppg_test.red++;
Shaun Kelsey 0:da5f5b56060a 355 ppg_test.green++;
Shaun Kelsey 0:da5f5b56060a 356 /* Test functions */
Shaun Kelsey 0:da5f5b56060a 357 ret = enqueue(&queue, &ppg_test);
Shaun Kelsey 0:da5f5b56060a 358 }
Shaun Kelsey 0:da5f5b56060a 359 jj = rand() % 20;
Shaun Kelsey 0:da5f5b56060a 360 for (j = 0; j < jj; j++) {
Shaun Kelsey 0:da5f5b56060a 361 ret = dequeue(&queue, &ppg_test_out);
Shaun Kelsey 0:da5f5b56060a 362 }
Shaun Kelsey 0:da5f5b56060a 363 }
Shaun Kelsey 0:da5f5b56060a 364 }
Shaun Kelsey 0:da5f5b56060a 365 #endif