Example Host software for integration of MAX3266x chips (, MAX32664GWEB) equipped with Heart Rate from Wrist Algorithm. This is “stand-alone” software that runs on the MAX32630 low-power microcontroller to display heart rate on the display of the MAXREFDES101 reference design. It is intended provide a simple example of how to initialize and communicate with the sensor hub. Windows and Android communications are not supported.

Dependencies:   Maxim_Sensor_Hub_Communications BMI160 whrmDemoUI max32630hsp3

Fork of Host_Software_MAX32664GWEB_HR_wrist by mehmet gok

Committer:
gmehmet
Date:
Mon Dec 17 10:44:03 2018 +0000
Revision:
6:f2bd1cff0796
Parent:
0:ddc2fef69ef9
back to 20303 as source not lib import from maxim site as caused errors it sould be updated there

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 0:ddc2fef69ef9 1 /*******************************************************************************
gmehmet 0:ddc2fef69ef9 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 0:ddc2fef69ef9 3 *
gmehmet 0:ddc2fef69ef9 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 0:ddc2fef69ef9 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 0:ddc2fef69ef9 6 * to deal in the Software without restriction, including without limitation
gmehmet 0:ddc2fef69ef9 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 0:ddc2fef69ef9 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 0:ddc2fef69ef9 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 0:ddc2fef69ef9 10 *
gmehmet 0:ddc2fef69ef9 11 * The above copyright notice and this permission notice shall be included
gmehmet 0:ddc2fef69ef9 12 * in all copies or substantial portions of the Software.
gmehmet 0:ddc2fef69ef9 13 *
gmehmet 0:ddc2fef69ef9 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 0:ddc2fef69ef9 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 0:ddc2fef69ef9 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 0:ddc2fef69ef9 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 0:ddc2fef69ef9 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 0:ddc2fef69ef9 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 0:ddc2fef69ef9 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 0:ddc2fef69ef9 21 *
gmehmet 0:ddc2fef69ef9 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 0:ddc2fef69ef9 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 0:ddc2fef69ef9 24 * Products, Inc. Branding Policy.
gmehmet 0:ddc2fef69ef9 25 *
gmehmet 0:ddc2fef69ef9 26 * The mere transfer of this software does not imply any licenses
gmehmet 0:ddc2fef69ef9 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 0:ddc2fef69ef9 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 0:ddc2fef69ef9 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 0:ddc2fef69ef9 30 * ownership rights.
gmehmet 0:ddc2fef69ef9 31 *******************************************************************************
gmehmet 0:ddc2fef69ef9 32 */
gmehmet 0:ddc2fef69ef9 33
gmehmet 0:ddc2fef69ef9 34
gmehmet 0:ddc2fef69ef9 35 /**********************************************************************************
gmehmet 0:ddc2fef69ef9 36 *
gmehmet 0:ddc2fef69ef9 37 * Desc: Example Code to get algorithm estimation results of Heart rate( HRM) and Blood
gmehmet 0:ddc2fef69ef9 38 * Oxygen (SPo2) form sensor hub and display it on screen. Example starts by monitoring heart rate
gmehmet 0:ddc2fef69ef9 39 * ans switches to blood oxygen monitoring via a button press (switch button)
gmehmet 0:ddc2fef69ef9 40 *
gmehmet 0:ddc2fef69ef9 41 * Example,
gmehmet 0:ddc2fef69ef9 42 *
gmehmet 0:ddc2fef69ef9 43 * 1. Initializes user interface
gmehmet 0:ddc2fef69ef9 44 * initialize display screen and switch button for algo selection.
gmehmet 0:ddc2fef69ef9 45 *
gmehmet 0:ddc2fef69ef9 46 * 2. Initializes underlying hardware port for sensor hub communication:
gmehmet 0:ddc2fef69ef9 47 * setup i2c comm. inits reset pin and mfio event pin and connects interrupt to mfio pin.
gmehmet 0:ddc2fef69ef9 48 *
gmehmet 0:ddc2fef69ef9 49 * 3. When switched to a minitoring mode
gmehmet 0:ddc2fef69ef9 50 * disables previous algorithm, clears mfio event
gmehmet 0:ddc2fef69ef9 51 * calls default init function for the sensor whose data is used by enabled algorithms. Algorithms are
gmehmet 0:ddc2fef69ef9 52 * registered under sesnor instance for this example. Fcunction
gmehmet 0:ddc2fef69ef9 53 * 1. initialize algorithm config struct enabled
gmehmet 0:ddc2fef69ef9 54 * 2. enable data type to both raw sensor and algorithm data
gmehmet 0:ddc2fef69ef9 55 * 3. get input fifo size to learn fifo capacity
gmehmet 0:ddc2fef69ef9 56 * 4. set fifo threshold for mfio event frequency
gmehmet 0:ddc2fef69ef9 57 * 5. reaenable sensor to acquire ppg data
gmehmet 0:ddc2fef69ef9 58 * 6. enable accompanying accel sensor
gmehmet 0:ddc2fef69ef9 59 * 7. enable switched algorithm
gmehmet 0:ddc2fef69ef9 60 *
gmehmet 0:ddc2fef69ef9 61 * 4. Sensor Hub now starts to write raw sensor/algorithm data to its data report FIFO which
gmehmet 0:ddc2fef69ef9 62 * reports mfio event when data size determined by fifo threshold is written to report fifo.
gmehmet 0:ddc2fef69ef9 63 *
gmehmet 0:ddc2fef69ef9 64 * 5. Example calls SH_Max8614x_data_report_execute() which
gmehmet 0:ddc2fef69ef9 65 * 1. calls SH API's sh_ss_execute_once() function which:
gmehmet 0:ddc2fef69ef9 66 * writes sensor hub's report fifo content (sensor/algorithm data samples) to a buffer(1).
gmehmet 0:ddc2fef69ef9 67 * 2. calls CSTMR_SH_FeedAccDataIntoSH() to send accelerometer data to sensor hub which os required for heart rate
gmehmet 0:ddc2fef69ef9 68 * Note: SPo2 requires stablity so do not move/shake senor when taking SPo2 data.
gmehmet 0:ddc2fef69ef9 69 * 3. Parses buffer(1) data to extract numeric sensor and algorithm samples according to enabled algorithms.
gmehmet 0:ddc2fef69ef9 70 * look: whrm_data_rx() , wspo2_data_rx() , max8614x_data_rx() and sample structs whrm_mode1_data, wspo2_mode1_data and max8614x_mode1_data
gmehmet 0:ddc2fef69ef9 71 *
gmehmet 0:ddc2fef69ef9 72 * 6. numeric values are written to HrmResult, SPO2Result ... within MAX8614x whrm_data_rx() ... and included as extern in main.cpp
gmehmet 0:ddc2fef69ef9 73 *
gmehmet 0:ddc2fef69ef9 74 * 7. Example calls demoUI_display_algo_estimations() to display result on watch screen
gmehmet 0:ddc2fef69ef9 75 *
gmehmet 0:ddc2fef69ef9 76 *
gmehmet 0:ddc2fef69ef9 77 ***********************************************************************************/
gmehmet 0:ddc2fef69ef9 78
gmehmet 0:ddc2fef69ef9 79 #include <events/mbed_events.h>
gmehmet 0:ddc2fef69ef9 80 #include <mbed.h>
gmehmet 0:ddc2fef69ef9 81 #include "max32630hsp.h"
gmehmet 0:ddc2fef69ef9 82 #include "SHComm.h"
gmehmet 0:ddc2fef69ef9 83 #include "SH_Max8614x_BareMetal.h"
gmehmet 0:ddc2fef69ef9 84 #include "bmi160.h"
gmehmet 0:ddc2fef69ef9 85
gmehmet 0:ddc2fef69ef9 86 #include "demoUI.h"
gmehmet 0:ddc2fef69ef9 87
gmehmet 0:ddc2fef69ef9 88
gmehmet 0:ddc2fef69ef9 89 extern uint16_t HrmResult;
gmehmet 0:ddc2fef69ef9 90 extern uint16_t SPO2Result;
gmehmet 0:ddc2fef69ef9 91 extern uint8_t HrmConfidence;
gmehmet 0:ddc2fef69ef9 92 extern uint8_t SPo2Confidence;
gmehmet 0:ddc2fef69ef9 93
gmehmet 0:ddc2fef69ef9 94 DigitalOut led1(LED1, 1);
gmehmet 0:ddc2fef69ef9 95 // Hardware serial port over DAPLink
gmehmet 0:ddc2fef69ef9 96 Serial daplink(USBTX, USBRX, 115200);
gmehmet 0:ddc2fef69ef9 97 // ICARUS Board initialization
gmehmet 0:ddc2fef69ef9 98 InterruptIn interruptIn_PowerButton(P7_6);
gmehmet 0:ddc2fef69ef9 99 MAX32630HSP icarus(MAX32630HSP::VIO_1V8, &interruptIn_PowerButton);
gmehmet 0:ddc2fef69ef9 100
gmehmet 0:ddc2fef69ef9 101 #define WAIT_SENSORHUB_STABLE_BOOTUP_MS ((uint32_t)2000)
gmehmet 0:ddc2fef69ef9 102
gmehmet 0:ddc2fef69ef9 103
gmehmet 0:ddc2fef69ef9 104 static bool isWhrmInitialized = false;
gmehmet 0:ddc2fef69ef9 105 static bool isSpo2Initialized = false;
gmehmet 0:ddc2fef69ef9 106
gmehmet 0:ddc2fef69ef9 107 int main() {
gmehmet 0:ddc2fef69ef9 108
gmehmet 0:ddc2fef69ef9 109 wait_ms(WAIT_SENSORHUB_STABLE_BOOTUP_MS);
gmehmet 0:ddc2fef69ef9 110 //demoUI_display_set_algoMode(kAlgoModeHeartRate);
gmehmet 0:ddc2fef69ef9 111
gmehmet 0:ddc2fef69ef9 112 demoUI_init();
gmehmet 0:ddc2fef69ef9 113
gmehmet 0:ddc2fef69ef9 114 sh_init_hwcomm_interface();
gmehmet 0:ddc2fef69ef9 115 sh_disable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 116 sh_clear_mfio_event_flag();
gmehmet 0:ddc2fef69ef9 117 sh_enable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 118 int i = 0;
gmehmet 0:ddc2fef69ef9 119
gmehmet 0:ddc2fef69ef9 120 #if 1
gmehmet 0:ddc2fef69ef9 121
gmehmet 0:ddc2fef69ef9 122 int displayMode;
gmehmet 0:ddc2fef69ef9 123 uint16_t resultToDisplay;
gmehmet 0:ddc2fef69ef9 124 uint8_t confidenceToDisplay;
gmehmet 0:ddc2fef69ef9 125
gmehmet 0:ddc2fef69ef9 126 while(1) {
gmehmet 0:ddc2fef69ef9 127
gmehmet 0:ddc2fef69ef9 128 displayMode = demoUI_display_get_mode();
gmehmet 0:ddc2fef69ef9 129
gmehmet 0:ddc2fef69ef9 130 if( displayMode == kAlgoModeHeartRate ){
gmehmet 0:ddc2fef69ef9 131 if( !isWhrmInitialized){
gmehmet 0:ddc2fef69ef9 132 #if defined(DEBUG_INFO)
gmehmet 0:ddc2fef69ef9 133 printf(" WHRM inititalized \r\n");
gmehmet 0:ddc2fef69ef9 134 #endif
gmehmet 0:ddc2fef69ef9 135 SH_Max8614x_stop();
gmehmet 0:ddc2fef69ef9 136 SH_Max8614x_default_init(kAlgoModeHeartRate);
gmehmet 0:ddc2fef69ef9 137 isWhrmInitialized = true;
gmehmet 0:ddc2fef69ef9 138 isSpo2Initialized = false;
gmehmet 0:ddc2fef69ef9 139 wait_ms(1000); /* for display screen*/
gmehmet 0:ddc2fef69ef9 140 }
gmehmet 0:ddc2fef69ef9 141 resultToDisplay = HrmResult;
gmehmet 0:ddc2fef69ef9 142 confidenceToDisplay = HrmConfidence;
gmehmet 0:ddc2fef69ef9 143
gmehmet 0:ddc2fef69ef9 144 }else{
gmehmet 0:ddc2fef69ef9 145 if( !isSpo2Initialized){
gmehmet 0:ddc2fef69ef9 146 #if defined(DEBUG_INFO)
gmehmet 0:ddc2fef69ef9 147 printf(" WSPo2 inititalized \r\n");
gmehmet 0:ddc2fef69ef9 148 #endif
gmehmet 0:ddc2fef69ef9 149 SH_Max8614x_stop();
gmehmet 0:ddc2fef69ef9 150 SH_Max8614x_default_init(kAlgoModeSPO2);
gmehmet 0:ddc2fef69ef9 151 isWhrmInitialized = false;
gmehmet 0:ddc2fef69ef9 152 isSpo2Initialized = true;
gmehmet 0:ddc2fef69ef9 153 wait_ms(1000); /* for display screen*/
gmehmet 0:ddc2fef69ef9 154 }
gmehmet 0:ddc2fef69ef9 155 resultToDisplay = SPO2Result;
gmehmet 0:ddc2fef69ef9 156 confidenceToDisplay = SPo2Confidence;
gmehmet 0:ddc2fef69ef9 157 }
gmehmet 0:ddc2fef69ef9 158
gmehmet 0:ddc2fef69ef9 159 int cumSampleCNt = SH_Max8614x_data_report_execute();
gmehmet 0:ddc2fef69ef9 160 if(cumSampleCNt){
gmehmet 0:ddc2fef69ef9 161 #if defined(DEBUG_INFO)
gmehmet 0:ddc2fef69ef9 162 printf("estimate: =%d conf: %d dispMode: %d \r\n", resultToDisplay , confidenceToDisplay, displayMode);
gmehmet 0:ddc2fef69ef9 163 #endif
gmehmet 0:ddc2fef69ef9 164 demoUI_display_algo_estimations(resultToDisplay);
gmehmet 0:ddc2fef69ef9 165 //printf(" Display Mode : %d \r\n", displayMode );
gmehmet 0:ddc2fef69ef9 166 }
gmehmet 0:ddc2fef69ef9 167
gmehmet 0:ddc2fef69ef9 168
gmehmet 0:ddc2fef69ef9 169
gmehmet 0:ddc2fef69ef9 170 }
gmehmet 0:ddc2fef69ef9 171
gmehmet 0:ddc2fef69ef9 172
gmehmet 0:ddc2fef69ef9 173
gmehmet 0:ddc2fef69ef9 174
gmehmet 0:ddc2fef69ef9 175
gmehmet 0:ddc2fef69ef9 176 #else
gmehmet 0:ddc2fef69ef9 177
gmehmet 0:ddc2fef69ef9 178 while(1) {
gmehmet 0:ddc2fef69ef9 179 SH_Max8614x_default_init(kAlgoModeHeartRate);
gmehmet 0:ddc2fef69ef9 180
gmehmet 0:ddc2fef69ef9 181 while(1){
gmehmet 0:ddc2fef69ef9 182 ++i;
gmehmet 0:ddc2fef69ef9 183 int cumSampleCNt = SH_Max8614x_data_report_execute();
gmehmet 0:ddc2fef69ef9 184 if(cumSampleCNt)
gmehmet 0:ddc2fef69ef9 185 printf("hr_cttt=%d %d\r\n", HrmResult , HrmConfidence);
gmehmet 0:ddc2fef69ef9 186 wait_ms(2);
gmehmet 0:ddc2fef69ef9 187 led1 = !led1;
gmehmet 0:ddc2fef69ef9 188 if(i == 24000) {
gmehmet 0:ddc2fef69ef9 189 break;
gmehmet 0:ddc2fef69ef9 190 }
gmehmet 0:ddc2fef69ef9 191 }
gmehmet 0:ddc2fef69ef9 192 i = 0;
gmehmet 0:ddc2fef69ef9 193 SH_Max8614x_stop();
gmehmet 0:ddc2fef69ef9 194 printf("Stopped\r\n");
gmehmet 0:ddc2fef69ef9 195 while(1){
gmehmet 0:ddc2fef69ef9 196 ++i;
gmehmet 0:ddc2fef69ef9 197 SH_Max8614x_data_report_execute();
gmehmet 0:ddc2fef69ef9 198 wait_ms(2);
gmehmet 0:ddc2fef69ef9 199 led1 = !led1;
gmehmet 0:ddc2fef69ef9 200 if(i == 4000) {
gmehmet 0:ddc2fef69ef9 201 break;
gmehmet 0:ddc2fef69ef9 202 }
gmehmet 0:ddc2fef69ef9 203 }
gmehmet 0:ddc2fef69ef9 204 i = 0;
gmehmet 0:ddc2fef69ef9 205 }
gmehmet 0:ddc2fef69ef9 206 #endif
gmehmet 0:ddc2fef69ef9 207
gmehmet 0:ddc2fef69ef9 208 }