Darien Figueroa / Mbed OS Final_Program

Dependencies:   USBDevice

Committer:
darienf
Date:
Wed Apr 07 22:37:59 2021 +0000
Revision:
0:832122ce6748
painnie

Who changed what in which revision?

UserRevisionLine numberNew contents of line
darienf 0:832122ce6748 1 /*******************************************************************************
darienf 0:832122ce6748 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
darienf 0:832122ce6748 3 *
darienf 0:832122ce6748 4 * Permission is hereby granted, free of charge, to any person obtaining a
darienf 0:832122ce6748 5 * copy of this software and associated documentation files (the "Software"),
darienf 0:832122ce6748 6 * to deal in the Software without restriction, including without limitation
darienf 0:832122ce6748 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
darienf 0:832122ce6748 8 * and/or sell copies of the Software, and to permit persons to whom the
darienf 0:832122ce6748 9 * Software is furnished to do so, subject to the following conditions:
darienf 0:832122ce6748 10 *
darienf 0:832122ce6748 11 * The above copyright notice and this permission notice shall be included
darienf 0:832122ce6748 12 * in all copies or substantial portions of the Software.
darienf 0:832122ce6748 13 *
darienf 0:832122ce6748 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
darienf 0:832122ce6748 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
darienf 0:832122ce6748 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
darienf 0:832122ce6748 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
darienf 0:832122ce6748 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
darienf 0:832122ce6748 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
darienf 0:832122ce6748 20 * OTHER DEALINGS IN THE SOFTWARE.
darienf 0:832122ce6748 21 *
darienf 0:832122ce6748 22 * Except as contained in this notice, the name of Maxim Integrated
darienf 0:832122ce6748 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
darienf 0:832122ce6748 24 * Products, Inc. Branding Policy.
darienf 0:832122ce6748 25 *
darienf 0:832122ce6748 26 * The mere transfer of this software does not imply any licenses
darienf 0:832122ce6748 27 * of trade secrets, proprietary technology, copyrights, patents,
darienf 0:832122ce6748 28 * trademarks, maskwork rights, or any other form of intellectual
darienf 0:832122ce6748 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
darienf 0:832122ce6748 30 * ownership rights.
darienf 0:832122ce6748 31 *******************************************************************************
darienf 0:832122ce6748 32 */
darienf 0:832122ce6748 33 #include "MAX30101_RPC.h"
darienf 0:832122ce6748 34 #include "StringHelper.h"
darienf 0:832122ce6748 35 #include "MAX30101.h"
darienf 0:832122ce6748 36 #include "Streaming.h"
darienf 0:832122ce6748 37 #include "RpcFifo.h"
darienf 0:832122ce6748 38 #include "RpcServer.h"
darienf 0:832122ce6748 39 #include "StringInOut.h"
darienf 0:832122ce6748 40 #include "MAX30101_helper.h"
darienf 0:832122ce6748 41 #include "LIS2DH.h"
darienf 0:832122ce6748 42 #include "Peripherals.h"
darienf 0:832122ce6748 43 #include "DataLoggingService.h"
darienf 0:832122ce6748 44
darienf 0:832122ce6748 45 //******************************************************************************
darienf 0:832122ce6748 46 int MAX30101_WriteReg(char argStrs[32][32], char replyStrs[32][32]) {
darienf 0:832122ce6748 47 uint8_t args[2];
darienf 0:832122ce6748 48 uint8_t reply[1];
darienf 0:832122ce6748 49 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 50 reply[0] = 0x80;
darienf 0:832122ce6748 51 FormatReply(reply, sizeof(reply), replyStrs);
darienf 0:832122ce6748 52 return 0;
darienf 0:832122ce6748 53 }
darienf 0:832122ce6748 54
darienf 0:832122ce6748 55 //******************************************************************************
darienf 0:832122ce6748 56 int MAX30101_ReadReg(char argStrs[32][32], char replyStrs[32][32]) {
darienf 0:832122ce6748 57 uint8_t args[1];
darienf 0:832122ce6748 58 uint8_t reply[1];
darienf 0:832122ce6748 59 char value = 0;
darienf 0:832122ce6748 60 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 61 reply[0] = (uint8_t)value;
darienf 0:832122ce6748 62 FormatReply(reply, sizeof(reply), replyStrs);
darienf 0:832122ce6748 63 return 0;
darienf 0:832122ce6748 64 }
darienf 0:832122ce6748 65
darienf 0:832122ce6748 66 //******************************************************************************
darienf 0:832122ce6748 67 int MAX30101_COMMinit(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 68 {
darienf 0:832122ce6748 69 uint8_t args[4];
darienf 0:832122ce6748 70 uint8_t return_value = 0;
darienf 0:832122ce6748 71 ProcessArgs(argStrs,args,sizeof(args));
darienf 0:832122ce6748 72
darienf 0:832122ce6748 73 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 74 return return_value;
darienf 0:832122ce6748 75 }
darienf 0:832122ce6748 76
darienf 0:832122ce6748 77 //******************************************************************************
darienf 0:832122ce6748 78 int MAX30101_SpO2mode_stop(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 79 {
darienf 0:832122ce6748 80 uint8_t args[4];
darienf 0:832122ce6748 81 uint8_t return_value = 0;
darienf 0:832122ce6748 82 ProcessArgs(argStrs,args,sizeof(args));
darienf 0:832122ce6748 83
darienf 0:832122ce6748 84 Peripherals::max30101()->SpO2mode_stop();
darienf 0:832122ce6748 85
darienf 0:832122ce6748 86 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 87 return return_value;
darienf 0:832122ce6748 88 }
darienf 0:832122ce6748 89
darienf 0:832122ce6748 90 //******************************************************************************
darienf 0:832122ce6748 91 int MAX30101_HRmode_stop(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 92 {
darienf 0:832122ce6748 93 uint8_t args[4];
darienf 0:832122ce6748 94 ProcessArgs(argStrs,args,sizeof(args));
darienf 0:832122ce6748 95
darienf 0:832122ce6748 96 Peripherals::max30101()->HRmode_stop();
darienf 0:832122ce6748 97
darienf 0:832122ce6748 98 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 99 return 0;
darienf 0:832122ce6748 100 }
darienf 0:832122ce6748 101
darienf 0:832122ce6748 102 //******************************************************************************
darienf 0:832122ce6748 103 int MAX30101_Multimode_stop(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 104 {
darienf 0:832122ce6748 105 uint8_t args[4];
darienf 0:832122ce6748 106 ProcessArgs(argStrs,args,sizeof(args));
darienf 0:832122ce6748 107
darienf 0:832122ce6748 108 Peripherals::max30101()->Multimode_stop();
darienf 0:832122ce6748 109
darienf 0:832122ce6748 110 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 111 return 0;
darienf 0:832122ce6748 112 }
darienf 0:832122ce6748 113
darienf 0:832122ce6748 114 //******************************************************************************
darienf 0:832122ce6748 115 void ClearInOutFifos() {
darienf 0:832122ce6748 116 fifo_clear(GetStreamOutFifo()); ///< clear stream out fifo
darienf 0:832122ce6748 117 fifo_clear(GetUSBIncomingFifo()); ///< clear USB serial incoming fifo
darienf 0:832122ce6748 118 }
darienf 0:832122ce6748 119
darienf 0:832122ce6748 120 int highDataRate = 0;
darienf 0:832122ce6748 121 #define MAX30101_200HZ 2
darienf 0:832122ce6748 122 #define MAX30101_400HZ 3
darienf 0:832122ce6748 123
darienf 0:832122ce6748 124 /**
darienf 0:832122ce6748 125 * Adjust the threshold of the Accel based on the data rate
darienf 0:832122ce6748 126 * @lis2dhDataRate Data rate of the accel to determine what would be a good threshold value
darienf 0:832122ce6748 127 */
darienf 0:832122ce6748 128 static int adjustAccelThreshold(int lis2dhDataRate) {
darienf 0:832122ce6748 129 int lis2dhFifoThreshold;
darienf 0:832122ce6748 130 lis2dhFifoThreshold = 31;
darienf 0:832122ce6748 131 if (lis2dhDataRate <= LIS2DH_DATARATE_50HZ) lis2dhFifoThreshold = 4;
darienf 0:832122ce6748 132 if (lis2dhDataRate == LIS2DH_DATARATE_100HZ) lis2dhFifoThreshold = 8;
darienf 0:832122ce6748 133 return lis2dhFifoThreshold;
darienf 0:832122ce6748 134 }
darienf 0:832122ce6748 135
darienf 0:832122ce6748 136 /**
darienf 0:832122ce6748 137 * Evaluate the data rate of the Accel to see if we should stream using a high data rate mode
darienf 0:832122ce6748 138 * @lis2dhDataRate Data rate of the accel to determine if this is a high data rate
darienf 0:832122ce6748 139 */
darienf 0:832122ce6748 140 static void adjustHighDataRate(int lis2dhDataRate) {
darienf 0:832122ce6748 141 highDataRate = 0;
darienf 0:832122ce6748 142 if (lis2dhDataRate >= LIS2DH_DATARATE_200HZ) highDataRate = 1;
darienf 0:832122ce6748 143 }
darienf 0:832122ce6748 144
darienf 0:832122ce6748 145 //******************************************************************************
darienf 0:832122ce6748 146 int MAX30101_SpO2mode_init(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 147 {
darienf 0:832122ce6748 148 uint8_t args[7];
darienf 0:832122ce6748 149 uint8_t lis2dhDataRate;
darienf 0:832122ce6748 150 uint8_t lis2dhFifoThreshold;
darienf 0:832122ce6748 151 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 152
darienf 0:832122ce6748 153 ClearInOutFifos();
darienf 0:832122ce6748 154 MAX30101_Helper_SetStreamingFlag(eStreaming_SPO2,1);
darienf 0:832122ce6748 155 Peripherals::max30101()->SpO2mode_init(args[0], args[1], args[2], args[3], args[4], args[5]);
darienf 0:832122ce6748 156
darienf 0:832122ce6748 157 lis2dhDataRate = args[6];
darienf 0:832122ce6748 158 lis2dhFifoThreshold = adjustAccelThreshold(lis2dhDataRate);
darienf 0:832122ce6748 159 adjustHighDataRate(lis2dhDataRate);
darienf 0:832122ce6748 160
darienf 0:832122ce6748 161 Peripherals::lis2dh()->initStart(lis2dhDataRate,lis2dhFifoThreshold);
darienf 0:832122ce6748 162 LoggingService_StartLoggingUsb();
darienf 0:832122ce6748 163
darienf 0:832122ce6748 164 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 165 return 0;
darienf 0:832122ce6748 166 }
darienf 0:832122ce6748 167
darienf 0:832122ce6748 168 //******************************************************************************
darienf 0:832122ce6748 169 int MAX30101_SpO2mode_InitStart(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 170 {
darienf 0:832122ce6748 171 uint8_t args[6]; // Size
darienf 0:832122ce6748 172 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 173
darienf 0:832122ce6748 174 ClearInOutFifos();
darienf 0:832122ce6748 175 MAX30101_Helper_SetStreamingFlag(eStreaming_SPO2,1);
darienf 0:832122ce6748 176 if (args[2] >= MAX30101_200HZ) {
darienf 0:832122ce6748 177 highDataRate = 1;
darienf 0:832122ce6748 178 }
darienf 0:832122ce6748 179 Peripherals::max30101()->SpO2mode_init(args[0], args[1], args[2], args[3], args[4], args[5]);
darienf 0:832122ce6748 180
darienf 0:832122ce6748 181 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 182 return 0;
darienf 0:832122ce6748 183 }
darienf 0:832122ce6748 184
darienf 0:832122ce6748 185 //******************************************************************************
darienf 0:832122ce6748 186 int MAX30101_HRmode_init(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 187 {
darienf 0:832122ce6748 188 uint8_t args[6];
darienf 0:832122ce6748 189 uint8_t lis2dhDataRate;
darienf 0:832122ce6748 190 uint8_t lis2dhFifoThreshold;
darienf 0:832122ce6748 191 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 192
darienf 0:832122ce6748 193 ClearInOutFifos();
darienf 0:832122ce6748 194 MAX30101_Helper_SetStreamingFlag(eStreaming_HR,1);
darienf 0:832122ce6748 195 Peripherals::max30101()->HRmode_init(args[0], args[1], args[2], args[3], args[4]);
darienf 0:832122ce6748 196
darienf 0:832122ce6748 197 lis2dhDataRate = args[5];
darienf 0:832122ce6748 198 lis2dhFifoThreshold = adjustAccelThreshold(lis2dhDataRate);
darienf 0:832122ce6748 199 adjustHighDataRate(lis2dhDataRate);
darienf 0:832122ce6748 200
darienf 0:832122ce6748 201 Peripherals::lis2dh()->initStart(lis2dhDataRate,lis2dhFifoThreshold);
darienf 0:832122ce6748 202 LoggingService_StartLoggingUsb();
darienf 0:832122ce6748 203 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 204 return 0;
darienf 0:832122ce6748 205 }
darienf 0:832122ce6748 206
darienf 0:832122ce6748 207 //******************************************************************************
darienf 0:832122ce6748 208 int MAX30101_HRmode_InitStart(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 209 {
darienf 0:832122ce6748 210 uint8_t args[5];
darienf 0:832122ce6748 211 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 212
darienf 0:832122ce6748 213 ClearInOutFifos();
darienf 0:832122ce6748 214 MAX30101_Helper_SetStreamingFlag(eStreaming_HR,1);
darienf 0:832122ce6748 215 if (args[2] >= MAX30101_200HZ) {
darienf 0:832122ce6748 216 highDataRate = 1;
darienf 0:832122ce6748 217 }
darienf 0:832122ce6748 218 Peripherals::max30101()->HRmode_init(args[0], args[1], args[2], args[3], args[4]);
darienf 0:832122ce6748 219 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 220 return 0;
darienf 0:832122ce6748 221 }
darienf 0:832122ce6748 222
darienf 0:832122ce6748 223 //******************************************************************************
darienf 0:832122ce6748 224 int MAX30101_Multimode_init(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 225 {
darienf 0:832122ce6748 226 uint8_t args[12];
darienf 0:832122ce6748 227 uint8_t lis2dhDataRate;
darienf 0:832122ce6748 228 uint8_t lis2dhFifoThreshold;
darienf 0:832122ce6748 229 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 230
darienf 0:832122ce6748 231 ClearInOutFifos();
darienf 0:832122ce6748 232
darienf 0:832122ce6748 233 lis2dhDataRate = args[11];
darienf 0:832122ce6748 234 lis2dhFifoThreshold = adjustAccelThreshold(lis2dhDataRate);
darienf 0:832122ce6748 235 adjustHighDataRate(lis2dhDataRate);
darienf 0:832122ce6748 236
darienf 0:832122ce6748 237 Peripherals::lis2dh()->initStart(lis2dhDataRate,lis2dhFifoThreshold);
darienf 0:832122ce6748 238
darienf 0:832122ce6748 239 wait(0.1f);
darienf 0:832122ce6748 240 MAX30101_Helper_SetStreamingFlag(eStreaming_MULTI, 1);
darienf 0:832122ce6748 241 Peripherals::max30101()->Multimode_init(args[0], args[1], args[2],
darienf 0:832122ce6748 242 args[3], args[4], args[5], args[6],
darienf 0:832122ce6748 243 args[7], args[8], args[9], args[10]);
darienf 0:832122ce6748 244 LoggingService_StartLoggingUsb();
darienf 0:832122ce6748 245
darienf 0:832122ce6748 246 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 247 return 0;
darienf 0:832122ce6748 248 }
darienf 0:832122ce6748 249
darienf 0:832122ce6748 250 //******************************************************************************
darienf 0:832122ce6748 251 int MAX30101_Multimode_InitStart(char argStrs[32][32], char replyStrs[32][32])
darienf 0:832122ce6748 252 {
darienf 0:832122ce6748 253 uint8_t args[11];
darienf 0:832122ce6748 254 ProcessArgs(argStrs, args, sizeof(args));
darienf 0:832122ce6748 255
darienf 0:832122ce6748 256 ClearInOutFifos();
darienf 0:832122ce6748 257 MAX30101_Helper_SetStreamingFlag(eStreaming_MULTI, 1);
darienf 0:832122ce6748 258 if (args[2] >= MAX30101_200HZ) {
darienf 0:832122ce6748 259 highDataRate = 1;
darienf 0:832122ce6748 260 }
darienf 0:832122ce6748 261 Peripherals::max30101()->Multimode_init(args[0], args[1], args[2],
darienf 0:832122ce6748 262 args[3], args[4], args[5], args[6],
darienf 0:832122ce6748 263 args[7], args[8], args[9], args[10]);
darienf 0:832122ce6748 264
darienf 0:832122ce6748 265 strcpy(replyStrs[0],"80");
darienf 0:832122ce6748 266 return 0;
darienf 0:832122ce6748 267 }
darienf 0:832122ce6748 268
darienf 0:832122ce6748 269
darienf 0:832122ce6748 270