HSP Platform firmware evaluating ECG data and hearth rate over PPG data.

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
phonemacro
Date:
Thu Mar 25 21:59:17 2021 +0000
Revision:
4:682a4ebb995a
Parent:
3:2fe2ff1ca0dc
fix compile errors from mbed OS changes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 1 /*******************************************************************************
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 2 * Copyright (C) Maxim Integrated Products, Inc., All rights Reserved.
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 3 *
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 4 * This software is protected by copyright laws of the United States and
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 5 * of foreign countries. This material may also be protected by patent laws
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 6 * and technology transfer regulations of the United States and of foreign
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 7 * countries. This software is furnished under a license agreement and/or a
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 8 * nondisclosure agreement and may only be used or reproduced in accordance
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 9 * with the terms of those agreements. Dissemination of this information to
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 10 * any party or parties not specified in the license agreement and/or
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 11 * nondisclosure agreement is expressly prohibited.
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 12 *
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 13 * The above copyright notice and this permission notice shall be included
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 14 * in all copies or substantial portions of the Software.
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 15 *
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 19 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 20 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 22 * OTHER DEALINGS IN THE SOFTWARE.
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 23 *
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 24 * Except as contained in this notice, the name of Maxim Integrated
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 25 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 26 * Products, Inc. Branding Policy.
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 27 *
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 28 * The mere transfer of this software does not imply any licenses
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 29 * of trade secrets, proprietary technology, copyrights, patents,
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 30 * trademarks, maskwork rights, or any other form of intellectual
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 31 * property whatsoever. Maxim Integrated Products, Inc. retains all
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 32 * ownership rights.
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 33 *******************************************************************************
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 34 */
Emre.Eken@IST-LT-36262.maxim-ic.internal 3:2fe2ff1ca0dc 35
gmehmet 1:f60eafbf009a 36 #include "mbed.h"
gmehmet 1:f60eafbf009a 37 #include "USBSerial.h"
gmehmet 1:f60eafbf009a 38 #include "version.h"
gmehmet 1:f60eafbf009a 39 #include "DSInterface.h"
gmehmet 1:f60eafbf009a 40 #include "Peripherals.h"
gmehmet 1:f60eafbf009a 41 #include "usb_regs.h"
gmehmet 0:07d28b5db986 42
gmehmet 1:f60eafbf009a 43 #define GPIO_PRIOINVERSION_MASK NVIC_SetPriority(GPIO_P0_IRQn, 5); \
gmehmet 1:f60eafbf009a 44 NVIC_SetPriority(GPIO_P1_IRQn, 5); \
gmehmet 1:f60eafbf009a 45 NVIC_SetPriority(GPIO_P2_IRQn, 5); \
gmehmet 1:f60eafbf009a 46 NVIC_SetPriority(GPIO_P3_IRQn, 5); \
gmehmet 1:f60eafbf009a 47 NVIC_SetPriority(GPIO_P4_IRQn, 5); \
gmehmet 1:f60eafbf009a 48 NVIC_SetPriority(GPIO_P5_IRQn, 5); \
gmehmet 1:f60eafbf009a 49 NVIC_SetPriority(GPIO_P6_IRQn, 5);
gmehmet 1:f60eafbf009a 50
gmehmet 1:f60eafbf009a 51
gmehmet 1:f60eafbf009a 52 #if defined(MBED_MEM_TRACING_ENABLED)
gmehmet 1:f60eafbf009a 53 #include "mbed_mem_trace.h"
gmehmet 1:f60eafbf009a 54 #endif /* MBED_MEM_TRACING_ENABLED */
gmehmet 1:f60eafbf009a 55
gmehmet 1:f60eafbf009a 56 #if defined(MBED_HEAP_STATS_ENABLED)
gmehmet 1:f60eafbf009a 57 #include "mbed_stats.h"
gmehmet 1:f60eafbf009a 58 #endif /* MBED_HEAP_STATS_ENABLED */
gmehmet 1:f60eafbf009a 59
gmehmet 1:f60eafbf009a 60 #if defined(MBED_STACK_STATS_ENABLED)
gmehmet 1:f60eafbf009a 61 #include "cmsis_os.h"
gmehmet 1:f60eafbf009a 62 #endif /* MBED_STACK_STATS_ENABLED */
gmehmet 1:f60eafbf009a 63
gmehmet 1:f60eafbf009a 64
gmehmet 1:f60eafbf009a 65
gmehmet 1:f60eafbf009a 66
gmehmet 1:f60eafbf009a 67
gmehmet 1:f60eafbf009a 68 //
gmehmet 1:f60eafbf009a 69 // BOARD
gmehmet 1:f60eafbf009a 70 //
gmehmet 1:f60eafbf009a 71 #include "max32630hsp.h"
gmehmet 1:f60eafbf009a 72 DigitalIn button(P6_5);
gmehmet 1:f60eafbf009a 73 InterruptIn interruptIn_PowerButton(P7_6);
gmehmet 1:f60eafbf009a 74 MAX32630HSP icarus(MAX32630HSP::VIO_1V8, &interruptIn_PowerButton);
gmehmet 1:f60eafbf009a 75
gmehmet 1:f60eafbf009a 76 //
gmehmet 1:f60eafbf009a 77 // LED
gmehmet 1:f60eafbf009a 78 //
gmehmet 1:f60eafbf009a 79 #include "LEDStatus.h"
gmehmet 1:f60eafbf009a 80 LEDStatus ledStatus(LED1, LED_ON, LED2, LED_ON, LED3, LED_OFF);
gmehmet 1:f60eafbf009a 81
gmehmet 1:f60eafbf009a 82 // Virtual serial port over USB
gmehmet 1:f60eafbf009a 83 USBSerial microUSB(0x1f00, 0x2012, 0x0001, false);
gmehmet 1:f60eafbf009a 84 #define IS_USB_HOST_CONNECTED() ((uint8_t)((MXC_USB->dev_intfl & MXC_F_USB_DEV_INTFL_VBUS_ST) >> MXC_F_USB_DEV_INTFL_VBUS_ST_POS))
gmehmet 1:f60eafbf009a 85
gmehmet 1:f60eafbf009a 86 //
gmehmet 1:f60eafbf009a 87 // DS INTERFACE. COMMAND IN DATA OUT POINT FOR HOST. ROOF INTERFACE TO ALL SUB MODULES
gmehmet 1:f60eafbf009a 88 //
gmehmet 1:f60eafbf009a 89 DSInterface dsInterface(&microUSB);
gmehmet 1:f60eafbf009a 90
gmehmet 1:f60eafbf009a 91 //
gmehmet 1:f60eafbf009a 92 // BLE
gmehmet 1:f60eafbf009a 93 //
gmehmet 1:f60eafbf009a 94 #include "BLE.h"
gmehmet 1:f60eafbf009a 95 #include "BLE_ICARUS.h"
gmehmet 1:f60eafbf009a 96 #ifdef ENABLE_BLETEST_COMM
gmehmet 1:f60eafbf009a 97 #include "BleTestComm.h"
gmehmet 1:f60eafbf009a 98 BleTestComm bleTestComm(&microUSB);
gmehmet 1:f60eafbf009a 99 #endif
gmehmet 1:f60eafbf009a 100
gmehmet 1:f60eafbf009a 101
gmehmet 1:f60eafbf009a 102
gmehmet 1:f60eafbf009a 103
gmehmet 1:f60eafbf009a 104 //
gmehmet 1:f60eafbf009a 105 // DISPLAY INTERFACE.
gmehmet 1:f60eafbf009a 106 //
gmehmet 1:f60eafbf009a 107 #include "LS013B7DH03.h"
gmehmet 1:f60eafbf009a 108 #include "mbed_logo.h"
gmehmet 1:f60eafbf009a 109 SPI displaySPI(P0_5, P0_6, P0_4, NC);
gmehmet 1:f60eafbf009a 110
gmehmet 1:f60eafbf009a 111 #include "WatchInterface.h"
gmehmet 1:f60eafbf009a 112 #define PIN_BUTTON_UP P2_3
gmehmet 1:f60eafbf009a 113 #define PIN_BUTTON_DOWN P6_5
gmehmet 1:f60eafbf009a 114 #define PIN_BUTTON_PWR P7_6
gmehmet 1:f60eafbf009a 115 #define PIN_displayCS P0_7
gmehmet 1:f60eafbf009a 116 #define PIN_displayEXTCOM P6_4
gmehmet 1:f60eafbf009a 117 #define PIN_displayDISP P6_6
gmehmet 1:f60eafbf009a 118 WatchInterface watchInterface(PIN_BUTTON_UP, PIN_BUTTON_DOWN, PIN_BUTTON_PWR, PIN_displayCS, PIN_displayEXTCOM, PIN_displayDISP, &displaySPI);
gmehmet 1:f60eafbf009a 119
gmehmet 1:f60eafbf009a 120
gmehmet 1:f60eafbf009a 121 //
gmehmet 1:f60eafbf009a 122 // HOST ACCELEROMETER.
gmehmet 1:f60eafbf009a 123 //
gmehmet 1:f60eafbf009a 124 #include "bmi160.h"
gmehmet 1:f60eafbf009a 125 //#include "C:\Users\mehmet.gok\Desktop\DEV\BPTDEMO\wearables_MBED\Drivers\BMI160\bmi160.h"
gmehmet 1:f60eafbf009a 126 InterruptIn bmi160_int_pin(P3_6);
gmehmet 1:f60eafbf009a 127 I2C I2CM2(P5_7, P6_0); /* SDA, SCL */
gmehmet 1:f60eafbf009a 128 BMI160_I2C bmi160_dev(&I2CM2, BMI160_I2C::I2C_ADRS_SDO_LO, &bmi160_int_pin);
gmehmet 1:f60eafbf009a 129
gmehmet 1:f60eafbf009a 130
gmehmet 1:f60eafbf009a 131 //
gmehmet 1:f60eafbf009a 132 // ECG SENSOR
gmehmet 1:f60eafbf009a 133 //
gmehmet 1:f60eafbf009a 134 #include "EcgComm.h"
gmehmet 1:f60eafbf009a 135 EcgComm ecgCommHandler(&microUSB);
gmehmet 1:f60eafbf009a 136
gmehmet 1:f60eafbf009a 137 #include "MAX30001.h"
gmehmet 1:f60eafbf009a 138 #include "MAX30001_Helper.h"
gmehmet 1:f60eafbf009a 139 SPI max30001_spi(P5_1, P5_2, P5_0);
gmehmet 1:f60eafbf009a 140 DigitalOut max30001_cs(P5_3);
gmehmet 1:f60eafbf009a 141 MAX30001 max30001(&max30001_spi, &max30001_cs);
gmehmet 1:f60eafbf009a 142 InterruptIn max30001_InterruptB(P5_5);
gmehmet 1:f60eafbf009a 143 InterruptIn max30001_Interrupt2B(P6_2);
gmehmet 1:f60eafbf009a 144
gmehmet 1:f60eafbf009a 145
gmehmet 1:f60eafbf009a 146 //
gmehmet 1:f60eafbf009a 147 // TEMP SENSOR
gmehmet 1:f60eafbf009a 148 //
gmehmet 1:f60eafbf009a 149 #include "TempComm.h"
gmehmet 1:f60eafbf009a 150 TempComm tpCommHandler(&microUSB);
gmehmet 1:f60eafbf009a 151 #include "MAX30205.h"
gmehmet 1:f60eafbf009a 152 I2C i2c(P3_4, P3_5);
gmehmet 1:f60eafbf009a 153 MAX30205 max30205(&i2c, (0x90 >> 1));
gmehmet 1:f60eafbf009a 154 //enable the LDO for temp sensor
gmehmet 1:f60eafbf009a 155 DigitalOut max30205_LDO_EN(P7_1, 1);
gmehmet 1:f60eafbf009a 156
gmehmet 1:f60eafbf009a 157
gmehmet 1:f60eafbf009a 158 //
gmehmet 1:f60eafbf009a 159 // ME11 SMART SENSOR INTERFACE
gmehmet 1:f60eafbf009a 160 //
gmehmet 1:f60eafbf009a 161 #include "SSInterface.h"
gmehmet 1:f60eafbf009a 162 I2C ssI2C(P3_4, P3_5);
gmehmet 1:f60eafbf009a 163 PinName ss_mfio(P5_4);
gmehmet 1:f60eafbf009a 164 PinName ss_reset(P5_6);
gmehmet 1:f60eafbf009a 165 SSInterface ssInterface(ssI2C, ss_mfio, ss_reset);
gmehmet 1:f60eafbf009a 166
gmehmet 1:f60eafbf009a 167 #include "SSBootloaderComm.h"
gmehmet 1:f60eafbf009a 168 SSBootloaderComm ssBoot(&microUSB, &ssInterface, &dsInterface);
gmehmet 1:f60eafbf009a 169
gmehmet 1:f60eafbf009a 170 #include "SSMAX8614XComm.h"
gmehmet 1:f60eafbf009a 171 SSMAX8614XComm ssMAX8614X(&microUSB, &ssInterface, &dsInterface);
gmehmet 1:f60eafbf009a 172
gmehmet 1:f60eafbf009a 173 #include "SSGenericCmd.h"
gmehmet 1:f60eafbf009a 174 SSGenericCmd ssGenericCmd(&microUSB, &ssInterface, &dsInterface);
gmehmet 1:f60eafbf009a 175
gmehmet 1:f60eafbf009a 176
gmehmet 1:f60eafbf009a 177 //
gmehmet 1:f60eafbf009a 178 // MX25U Flash Driver Definition
gmehmet 1:f60eafbf009a 179 //
gmehmet 1:f60eafbf009a 180 #define MHZ_VALUE 1000000
gmehmet 1:f60eafbf009a 181 #define SPI_MHZ 16
gmehmet 1:f60eafbf009a 182 #define SPI_FREQUENCY (SPI_MHZ * MHZ_VALUE)
gmehmet 1:f60eafbf009a 183 #include "SPIFBlockDevice.h"
gmehmet 1:f60eafbf009a 184 #include "FATFileSystem.h"
gmehmet 1:f60eafbf009a 185
gmehmet 1:f60eafbf009a 186 DigitalOut flash_nHOLD(P1_5);
gmehmet 1:f60eafbf009a 187 SPIFBlockDevice spif(P1_1, P1_2, P1_0, P1_3, SPI_FREQUENCY);
gmehmet 1:f60eafbf009a 188 FATFileSystem filesystem("fs");
gmehmet 1:f60eafbf009a 189 // USB MSD
gmehmet 1:f60eafbf009a 190 #include "USBMSD_BD.h"
gmehmet 1:f60eafbf009a 191
gmehmet 1:f60eafbf009a 192
gmehmet 1:f60eafbf009a 193
gmehmet 1:f60eafbf009a 194 //
gmehmet 1:f60eafbf009a 195 // Hardware serial port over DAPLink
gmehmet 1:f60eafbf009a 196 //
gmehmet 1:f60eafbf009a 197 Serial daplink(USBTX, USBRX, 115200);
gmehmet 1:f60eafbf009a 198
gmehmet 1:f60eafbf009a 199
gmehmet 1:f60eafbf009a 200
gmehmet 1:f60eafbf009a 201 static void setup_ble(void);
gmehmet 1:f60eafbf009a 202 static void process_ble(void);
gmehmet 1:f60eafbf009a 203 static void print_build_version(void);
gmehmet 1:f60eafbf009a 204 static void HSP_run_in_usbmcd_mode(void);
gmehmet 1:f60eafbf009a 205 static void HSP_mount_filesystem(void);
gmehmet 1:f60eafbf009a 206
gmehmet 1:f60eafbf009a 207 #ifdef ENABLE_MEMORY_DEBUG
gmehmet 1:f60eafbf009a 208 void print_memory_info();
gmehmet 1:f60eafbf009a 209 #endif
gmehmet 1:f60eafbf009a 210
gmehmet 1:f60eafbf009a 211
gmehmet 1:f60eafbf009a 212 int main()
gmehmet 1:f60eafbf009a 213 {
gmehmet 1:f60eafbf009a 214 wait_ms(100);
gmehmet 1:f60eafbf009a 215
gmehmet 1:f60eafbf009a 216 HSP_mount_filesystem();
gmehmet 1:f60eafbf009a 217
gmehmet 1:f60eafbf009a 218 if (watchInterface.getButtonStatus(WatchInterface::BUTTON_UP) == WatchInterface::BUTTON_RELEASED) {
gmehmet 1:f60eafbf009a 219 HSP_run_in_usbmcd_mode();
gmehmet 1:f60eafbf009a 220 }
gmehmet 1:f60eafbf009a 221 wait_ms(500);
gmehmet 1:f60eafbf009a 222
gmehmet 1:f60eafbf009a 223
gmehmet 1:f60eafbf009a 224 GPIO_PRIOINVERSION_MASK;
gmehmet 1:f60eafbf009a 225
gmehmet 1:f60eafbf009a 226 // used by the MAX30001
gmehmet 1:f60eafbf009a 227 NVIC_SetPriority(SPIM2_IRQn, 0);
gmehmet 1:f60eafbf009a 228
gmehmet 1:f60eafbf009a 229
gmehmet 1:f60eafbf009a 230 watchInterface.bootComplete = true;
gmehmet 1:f60eafbf009a 231 print_build_version();
gmehmet 1:f60eafbf009a 232 daplink.printf("daplink serial port\r\n");
gmehmet 1:f60eafbf009a 233 microUSB.printf("micro USB serial port\r\n");
gmehmet 1:f60eafbf009a 234
gmehmet 1:f60eafbf009a 235 //dsInterface.set_fw_version(FIRMWARE_VERSION);
phonemacro 4:682a4ebb995a 236 #define MAXIM_PLATFORM_NAME "Pegasus"
gmehmet 1:f60eafbf009a 237 dsInterface.set_fw_platform(MAXIM_PLATFORM_NAME);
gmehmet 1:f60eafbf009a 238 Peripherals::setUSBSerial(&microUSB);
gmehmet 1:f60eafbf009a 239
gmehmet 1:f60eafbf009a 240 icarus.max20303.Max20303_IsBattery_Connected();
gmehmet 1:f60eafbf009a 241 watchInterface.m_max20303_ = &icarus.max20303;
gmehmet 1:f60eafbf009a 242
gmehmet 1:f60eafbf009a 243
gmehmet 1:f60eafbf009a 244 setup_ble();
gmehmet 1:f60eafbf009a 245 #ifdef ENABLE_BLETEST_COMM
gmehmet 1:f60eafbf009a 246 dsInterface.add_sensor_comm(&bleTestComm);
gmehmet 1:f60eafbf009a 247 #endif
gmehmet 1:f60eafbf009a 248
gmehmet 1:f60eafbf009a 249 //
gmehmet 1:f60eafbf009a 250 // MAX30001
gmehmet 1:f60eafbf009a 251 //
gmehmet 1:f60eafbf009a 252 printf("Init MAX30001 callbacks, interrupts...\r\n");
gmehmet 1:f60eafbf009a 253 MAX30001_Helper m_max30001helper(&max30001, &max30001_InterruptB, &max30001_Interrupt2B);
gmehmet 1:f60eafbf009a 254 Peripherals::setMAX30001(&max30001);
gmehmet 1:f60eafbf009a 255 Peripherals::setMAX30001Helper(&m_max30001helper);
gmehmet 1:f60eafbf009a 256 ecgCommHandler.comm_init(&m_max30001helper);
gmehmet 1:f60eafbf009a 257 dsInterface.add_sensor_comm(&ecgCommHandler);
gmehmet 1:f60eafbf009a 258
gmehmet 1:f60eafbf009a 259 //
gmehmet 1:f60eafbf009a 260 //MAX30205
gmehmet 1:f60eafbf009a 261 //
gmehmet 1:f60eafbf009a 262 tpCommHandler.comm_init(&max30205);
gmehmet 1:f60eafbf009a 263 dsInterface.add_sensor_comm(&tpCommHandler);
gmehmet 1:f60eafbf009a 264
gmehmet 1:f60eafbf009a 265 //Configure mfio as a level based interrupt (no mbed API for this, must use Maxim-specific code)
gmehmet 1:f60eafbf009a 266 //gpio_cfg_t mfio_gpio_cfg = {PORT_5, PIN_4, GPIO_FUNC_GPIO, GPIO_PAD_INPUT_PULLUP};
gmehmet 1:f60eafbf009a 267 //GPIO_IntConfig(&mfio_gpio_cfg, GPIO_INT_LOW_LEVEL);
gmehmet 1:f60eafbf009a 268 ssI2C.frequency(400000);
gmehmet 1:f60eafbf009a 269 dsInterface.set_fw_platform(ssInterface.get_ss_platform_name());
gmehmet 1:f60eafbf009a 270 dsInterface.set_fw_version(ssInterface.get_ss_fw_version());
gmehmet 1:f60eafbf009a 271
gmehmet 1:f60eafbf009a 272 //
gmehmet 1:f60eafbf009a 273 //REGISTER BOOTLOADER API TO SS INTERFACE
gmehmet 1:f60eafbf009a 274 //
gmehmet 1:f60eafbf009a 275 dsInterface.add_sensor_comm(&ssBoot);
gmehmet 1:f60eafbf009a 276
gmehmet 1:f60eafbf009a 277 //
gmehmet 1:f60eafbf009a 278 //REGISTER 8614X PPG SENSOR API TO SS INTERFACE
gmehmet 1:f60eafbf009a 279 //
gmehmet 1:f60eafbf009a 280 dsInterface.add_sensor_comm(&ssMAX8614X);
gmehmet 1:f60eafbf009a 281 ssMAX8614X.setBMI160(&bmi160_dev);
gmehmet 1:f60eafbf009a 282
gmehmet 1:f60eafbf009a 283 //
gmehmet 1:f60eafbf009a 284 //REGISTER GENERIC COMMAND API TO SS INTERFACE
gmehmet 1:f60eafbf009a 285 //
gmehmet 1:f60eafbf009a 286 dsInterface.add_sensor_comm(&ssGenericCmd);
gmehmet 1:f60eafbf009a 287
gmehmet 1:f60eafbf009a 288
gmehmet 1:f60eafbf009a 289 //Blink green if SmartSensor is present, yellow otherwise
gmehmet 1:f60eafbf009a 290 SS_STATUS status = ssInterface.ss_comm_check();
gmehmet 1:f60eafbf009a 291 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 292 ledStatus.set_state(LED_OFF, LED_ON, LED_OFF);
gmehmet 1:f60eafbf009a 293 else
gmehmet 1:f60eafbf009a 294 ledStatus.set_state(LED_ON, LED_ON, LED_OFF);
gmehmet 1:f60eafbf009a 295 ledStatus.blink(100, 1900);
gmehmet 1:f60eafbf009a 296 ledStatus.blink(100, 1900);
gmehmet 1:f60eafbf009a 297
gmehmet 1:f60eafbf009a 298 //
gmehmet 1:f60eafbf009a 299 //MAIN CONTEXT LOOP
gmehmet 1:f60eafbf009a 300 //
gmehmet 1:f60eafbf009a 301 while (1) {
gmehmet 1:f60eafbf009a 302
gmehmet 1:f60eafbf009a 303 USBSerial* serial = &microUSB;
gmehmet 1:f60eafbf009a 304 uint8_t ch;
gmehmet 1:f60eafbf009a 305 while (serial->readable()) {
gmehmet 1:f60eafbf009a 306 ch = serial->_getc();
gmehmet 1:f60eafbf009a 307 dsInterface.enable_console_interface();
gmehmet 1:f60eafbf009a 308 dsInterface.build_command(ch);
gmehmet 1:f60eafbf009a 309 }
gmehmet 1:f60eafbf009a 310
gmehmet 1:f60eafbf009a 311
gmehmet 1:f60eafbf009a 312 if(dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 313 if((icarus.status_powerButton == MAX32630HSP::BUTTONSTATUS_LONG_PRESS_WAITING) ||
gmehmet 1:f60eafbf009a 314 (watchInterface.batteryLevel <= BATTERY_CRITICAL_LEVEL)) {
gmehmet 1:f60eafbf009a 315 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 316 dsInterface.force_file_close();
gmehmet 1:f60eafbf009a 317 }
gmehmet 1:f60eafbf009a 318 }
gmehmet 1:f60eafbf009a 319
gmehmet 1:f60eafbf009a 320 icarus.Max32630HSP_CheckInterrupt_Status();
gmehmet 1:f60eafbf009a 321 //
gmehmet 1:f60eafbf009a 322 // DSINTERFACE CONTEXT as all other interfaces is run by call to its data_report_execute function!!
gmehmet 1:f60eafbf009a 323 //
gmehmet 1:f60eafbf009a 324 dsInterface.data_report_execute();
gmehmet 1:f60eafbf009a 325
gmehmet 1:f60eafbf009a 326 if (ecgCommHandler.is_enabled() != watchInterface.ecg_enabled) {
gmehmet 1:f60eafbf009a 327
gmehmet 1:f60eafbf009a 328 if (ecgCommHandler.is_enabled()) {
gmehmet 1:f60eafbf009a 329
gmehmet 1:f60eafbf009a 330 if (!dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 331 watchInterface.displayMode = DISPLAYMODE_ECG;
gmehmet 1:f60eafbf009a 332 }
gmehmet 1:f60eafbf009a 333
gmehmet 1:f60eafbf009a 334 // Turn off LEDs
gmehmet 1:f60eafbf009a 335 ledStatus.set_state(1, 1, 1);
gmehmet 1:f60eafbf009a 336 ledStatus.solid();
gmehmet 1:f60eafbf009a 337 ledStatus.set_state(1, 1, 1);
gmehmet 1:f60eafbf009a 338 } else {
gmehmet 1:f60eafbf009a 339
gmehmet 1:f60eafbf009a 340 if (!dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 341 watchInterface.displayMode = DISPLAYMODE_TIME;
gmehmet 1:f60eafbf009a 342 }
gmehmet 1:f60eafbf009a 343
gmehmet 1:f60eafbf009a 344 }
gmehmet 1:f60eafbf009a 345 watchInterface.ecg_enabled = ecgCommHandler.is_enabled();
gmehmet 1:f60eafbf009a 346
gmehmet 1:f60eafbf009a 347 }
gmehmet 1:f60eafbf009a 348
gmehmet 1:f60eafbf009a 349 // Sensor Interface Updates on Watch display mode changes
gmehmet 1:f60eafbf009a 350 if (watchInterface.modeUpdated) {
gmehmet 1:f60eafbf009a 351
gmehmet 1:f60eafbf009a 352 watchInterface.modeUpdated = false;
gmehmet 1:f60eafbf009a 353 watchInterface.DisplayModeUpdated();
gmehmet 1:f60eafbf009a 354
gmehmet 1:f60eafbf009a 355 // Tethered mode
gmehmet 1:f60eafbf009a 356 if ((watchInterface.BLE_Interface_Exists) || (watchInterface.USB_Interface_Exists)) {
gmehmet 1:f60eafbf009a 357
gmehmet 1:f60eafbf009a 358
gmehmet 1:f60eafbf009a 359 // Stop all sensors
gmehmet 1:f60eafbf009a 360 if(!dsInterface.recordingStarted)
gmehmet 1:f60eafbf009a 361 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 362
gmehmet 1:f60eafbf009a 363
gmehmet 1:f60eafbf009a 364 } else
gmehmet 1:f60eafbf009a 365 // Not in tethered mode
gmehmet 1:f60eafbf009a 366 {
gmehmet 1:f60eafbf009a 367
gmehmet 1:f60eafbf009a 368 switch (watchInterface.displayMode) {
gmehmet 1:f60eafbf009a 369
gmehmet 1:f60eafbf009a 370 case DISPLAYMODE_INFO :
gmehmet 1:f60eafbf009a 371
gmehmet 1:f60eafbf009a 372 // Before switching to INFO screen, stop all sensors
gmehmet 1:f60eafbf009a 373 if (!dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 374 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 375 }
gmehmet 1:f60eafbf009a 376
gmehmet 1:f60eafbf009a 377 break;
gmehmet 1:f60eafbf009a 378 case DISPLAYMODE_TIME :
gmehmet 1:f60eafbf009a 379
gmehmet 1:f60eafbf009a 380 // Before switching to TIME screen, stop all sensors
gmehmet 1:f60eafbf009a 381 if (!dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 382 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 383 }
gmehmet 1:f60eafbf009a 384
gmehmet 1:f60eafbf009a 385 break;
gmehmet 1:f60eafbf009a 386 case DISPLAYMODE_PPG :
gmehmet 1:f60eafbf009a 387
gmehmet 1:f60eafbf009a 388 // Before switching to PPG screen, stop all sensors
gmehmet 1:f60eafbf009a 389 if (!dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 390 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 391 dsInterface.parse_command_str("set_reg ppg 2a 10");
gmehmet 1:f60eafbf009a 392 dsInterface.parse_command_str("set_reg ppg 23 ff");
gmehmet 1:f60eafbf009a 393 dsInterface.parse_command_str("read ppg 0");
gmehmet 1:f60eafbf009a 394 }
gmehmet 1:f60eafbf009a 395
gmehmet 1:f60eafbf009a 396 break;
gmehmet 1:f60eafbf009a 397
gmehmet 1:f60eafbf009a 398 case DISPLAYMODE_TEMP :
gmehmet 1:f60eafbf009a 399
gmehmet 1:f60eafbf009a 400 // Before switching to TEMP screen, stop all sensors
gmehmet 1:f60eafbf009a 401 if (!dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 402 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 403 dsInterface.parse_command_str("set_cfg temp sr 500");
gmehmet 1:f60eafbf009a 404 dsInterface.parse_command_str("read temp 0");
gmehmet 1:f60eafbf009a 405 }
gmehmet 1:f60eafbf009a 406
gmehmet 1:f60eafbf009a 407 break;
gmehmet 1:f60eafbf009a 408
gmehmet 1:f60eafbf009a 409 }
gmehmet 1:f60eafbf009a 410 }
gmehmet 1:f60eafbf009a 411 }
gmehmet 1:f60eafbf009a 412
gmehmet 1:f60eafbf009a 413 // Update the watch interface with the latest data
gmehmet 1:f60eafbf009a 414 watchInterface.instant_temp_celsius = tpCommHandler.TempComm_instant_temp_celsius;
gmehmet 1:f60eafbf009a 415 watchInterface.instant_hr = ssMAX8614X.instant_hr;
gmehmet 1:f60eafbf009a 416 watchInterface.instant_hr_conf = ssMAX8614X.instant_hr_conf;
gmehmet 1:f60eafbf009a 417
gmehmet 1:f60eafbf009a 418 watchInterface.BLE_Interface_Exists = BLE::Instance().gap().getState().connected;
gmehmet 1:f60eafbf009a 419 watchInterface.USB_Interface_Exists = IS_USB_HOST_CONNECTED();
gmehmet 1:f60eafbf009a 420
gmehmet 1:f60eafbf009a 421 if (watchInterface.recordingStopFlag) {
gmehmet 1:f60eafbf009a 422
gmehmet 1:f60eafbf009a 423 watchInterface.recordingStopFlag = false;
gmehmet 1:f60eafbf009a 424 watchInterface.recording = false;
gmehmet 1:f60eafbf009a 425 watchInterface.recording_old = false;
gmehmet 1:f60eafbf009a 426 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 427 ledStatus.set_state(LED_OFF, LED_ON, LED_OFF);
gmehmet 1:f60eafbf009a 428 ledStatus.blink(100, 1900);
gmehmet 1:f60eafbf009a 429 } else {
gmehmet 1:f60eafbf009a 430 watchInterface.recording = dsInterface.recordingStarted;
gmehmet 1:f60eafbf009a 431 }
gmehmet 1:f60eafbf009a 432
gmehmet 1:f60eafbf009a 433
gmehmet 1:f60eafbf009a 434 if (watchInterface.BLE_Interface_Exists || watchInterface.USB_Interface_Exists) {
gmehmet 1:f60eafbf009a 435 watchInterface.connection_indicator++;
gmehmet 1:f60eafbf009a 436 if (watchInterface.connection_indicator == 1) {
gmehmet 1:f60eafbf009a 437
gmehmet 1:f60eafbf009a 438 if (!dsInterface.recordingStarted) {
gmehmet 1:f60eafbf009a 439 dsInterface.stopcommand();
gmehmet 1:f60eafbf009a 440 }
gmehmet 1:f60eafbf009a 441
gmehmet 1:f60eafbf009a 442 } else if (watchInterface.connection_indicator > 50) {
gmehmet 1:f60eafbf009a 443 watchInterface.connection_indicator = 2;
gmehmet 1:f60eafbf009a 444 }
gmehmet 1:f60eafbf009a 445
gmehmet 1:f60eafbf009a 446 }
gmehmet 1:f60eafbf009a 447
gmehmet 1:f60eafbf009a 448 watchInterface.execute();
gmehmet 1:f60eafbf009a 449 process_ble();
gmehmet 1:f60eafbf009a 450 ledStatus.update();
gmehmet 1:f60eafbf009a 451
gmehmet 1:f60eafbf009a 452 #ifdef ENABLE_MEMORY_DEBUG
gmehmet 1:f60eafbf009a 453 print_memory_info();
gmehmet 1:f60eafbf009a 454 #endif
gmehmet 1:f60eafbf009a 455 }
gmehmet 1:f60eafbf009a 456 }
gmehmet 1:f60eafbf009a 457
gmehmet 1:f60eafbf009a 458
gmehmet 1:f60eafbf009a 459
gmehmet 1:f60eafbf009a 460
gmehmet 1:f60eafbf009a 461 static void setup_ble(void)
gmehmet 1:f60eafbf009a 462 {
gmehmet 1:f60eafbf009a 463
gmehmet 1:f60eafbf009a 464 //Set up BLE communication
gmehmet 1:f60eafbf009a 465 BLE& ble = BLE::Instance();
gmehmet 1:f60eafbf009a 466 ble.init(bleInitComplete);
gmehmet 1:f60eafbf009a 467 while (BLE::Instance().hasInitialized() == false) { /* spin loop */ }
gmehmet 1:f60eafbf009a 468 BLE_Icarus_SetDSInterface(&dsInterface);
gmehmet 1:f60eafbf009a 469
gmehmet 1:f60eafbf009a 470 char addr[6];
gmehmet 1:f60eafbf009a 471 BLE_ICARUS_Get_Mac_Address(addr);
gmehmet 1:f60eafbf009a 472 printf("BLE MAC: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\r\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
gmehmet 1:f60eafbf009a 473
gmehmet 1:f60eafbf009a 474
gmehmet 1:f60eafbf009a 475 memcpy(watchInterface.m_mac_addr_, addr, 6);
gmehmet 1:f60eafbf009a 476
gmehmet 1:f60eafbf009a 477
gmehmet 1:f60eafbf009a 478
gmehmet 1:f60eafbf009a 479 }
gmehmet 1:f60eafbf009a 480
gmehmet 1:f60eafbf009a 481 static void process_ble(void)
gmehmet 1:f60eafbf009a 482 {
gmehmet 1:f60eafbf009a 483
gmehmet 1:f60eafbf009a 484 if (BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 485 BLE_Icarus_TransferDataFromQueue();
gmehmet 1:f60eafbf009a 486 }
gmehmet 1:f60eafbf009a 487 BLE::Instance().waitForEvent();
gmehmet 1:f60eafbf009a 488
gmehmet 1:f60eafbf009a 489 }
gmehmet 1:f60eafbf009a 490
gmehmet 1:f60eafbf009a 491 static void print_build_version(void)
gmehmet 1:f60eafbf009a 492 {
gmehmet 1:f60eafbf009a 493 printf("\n\nICARUS mBED EVKit\r\n");
gmehmet 1:f60eafbf009a 494 printf("Fw version: %s, mbed version: %d\r\n", FIRMWARE_VERSION, MBED_VERSION);
gmehmet 1:f60eafbf009a 495 printf("Build source: (%s) %s\r\n", BUILD_SOURCE_BRANCH, BUILD_SOURCE_HASH);
gmehmet 1:f60eafbf009a 496 printf("Build time: %s %s\r\n\n", __TIME__, __DATE__);
gmehmet 1:f60eafbf009a 497 }
gmehmet 1:f60eafbf009a 498
gmehmet 1:f60eafbf009a 499 static void HSP_run_in_usbmcd_mode(void){
gmehmet 1:f60eafbf009a 500
gmehmet 1:f60eafbf009a 501 int err;
gmehmet 1:f60eafbf009a 502
gmehmet 1:f60eafbf009a 503 const int writecyclecount = 256;
gmehmet 1:f60eafbf009a 504 watchInterface.USB_Interface_Exists = false;
gmehmet 1:f60eafbf009a 505 watchInterface.USB_Interface_MSD = true;
gmehmet 1:f60eafbf009a 506 watchInterface.bootComplete = true;
gmehmet 1:f60eafbf009a 507 watchInterface.displayMode = DISPLAYMODE_TETHERED_USB;
gmehmet 1:f60eafbf009a 508 watchInterface.updateDisplay(4);
gmehmet 1:f60eafbf009a 509
gmehmet 1:f60eafbf009a 510 for(int i = 0; i < writecyclecount; ++i) {
gmehmet 1:f60eafbf009a 511 watchInterface.execute();
gmehmet 1:f60eafbf009a 512 wait_ms(1);
gmehmet 1:f60eafbf009a 513 }
gmehmet 1:f60eafbf009a 514
gmehmet 1:f60eafbf009a 515 USBMSD_BD msd(&spif);
gmehmet 1:f60eafbf009a 516 printf("Starting MSD... ");
gmehmet 1:f60eafbf009a 517 msd.disk_initialize();
gmehmet 1:f60eafbf009a 518 err = msd.connect();
gmehmet 1:f60eafbf009a 519 ledStatus.set_state(1, 1, 0);
gmehmet 1:f60eafbf009a 520 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
gmehmet 1:f60eafbf009a 521
gmehmet 1:f60eafbf009a 522 msd.disk_initialize();
gmehmet 1:f60eafbf009a 523 err = msd.connect();
gmehmet 1:f60eafbf009a 524
gmehmet 1:f60eafbf009a 525 GPIO_PRIOINVERSION_MASK;
gmehmet 1:f60eafbf009a 526
gmehmet 1:f60eafbf009a 527 while (1) {
gmehmet 1:f60eafbf009a 528
gmehmet 1:f60eafbf009a 529 icarus.Max32630HSP_CheckInterrupt_Status();
gmehmet 1:f60eafbf009a 530
gmehmet 1:f60eafbf009a 531 wait_ms(1);
gmehmet 1:f60eafbf009a 532 }
gmehmet 1:f60eafbf009a 533 }
gmehmet 1:f60eafbf009a 534
gmehmet 1:f60eafbf009a 535 static void HSP_mount_filesystem(void){
gmehmet 1:f60eafbf009a 536
gmehmet 1:f60eafbf009a 537 // For ISSI part, in 3-wire SPI mode, HOLD pin should be tied to high to un-pause communication
gmehmet 1:f60eafbf009a 538 flash_nHOLD = 1;
gmehmet 1:f60eafbf009a 539 // Try to mount the filesystem
gmehmet 1:f60eafbf009a 540 printf("Mounting the filesystem... ");
gmehmet 1:f60eafbf009a 541 fflush(stdout);
gmehmet 1:f60eafbf009a 542 int err = filesystem.mount(&spif);
gmehmet 1:f60eafbf009a 543 printf("%s\n", (err ? "Fail :(" : "OK"));
gmehmet 1:f60eafbf009a 544 if (err) {
gmehmet 1:f60eafbf009a 545 // Reformat if we can't mount the filesystem
gmehmet 1:f60eafbf009a 546 // this should only happen on the first boot
gmehmet 1:f60eafbf009a 547 printf("No filesystem found, formatting... ");
gmehmet 1:f60eafbf009a 548 fflush(stdout);
gmehmet 1:f60eafbf009a 549 err = filesystem.reformat(&spif);
gmehmet 1:f60eafbf009a 550 printf("%s\n", (err ? "Fail :(" : "OK"));
gmehmet 1:f60eafbf009a 551 }
gmehmet 1:f60eafbf009a 552
gmehmet 1:f60eafbf009a 553 }
gmehmet 1:f60eafbf009a 554
gmehmet 1:f60eafbf009a 555
gmehmet 1:f60eafbf009a 556
gmehmet 1:f60eafbf009a 557 #ifdef ENABLE_MEMORY_DEBUG
gmehmet 1:f60eafbf009a 558 void print_memory_info() {
gmehmet 1:f60eafbf009a 559 static int threadStackSize[8] = {0};
gmehmet 1:f60eafbf009a 560 static int heapSize = 0;
gmehmet 1:f60eafbf009a 561 // allocate enough room for every thread's stack statistics
gmehmet 1:f60eafbf009a 562 int cnt = osThreadGetCount();
gmehmet 1:f60eafbf009a 563 mbed_stats_stack_t *stats = (mbed_stats_stack_t*) malloc(cnt * sizeof(mbed_stats_stack_t));
gmehmet 1:f60eafbf009a 564
gmehmet 1:f60eafbf009a 565 cnt = mbed_stats_stack_get_each(stats, cnt);
gmehmet 1:f60eafbf009a 566 for (int i = 0; i < cnt; i++) {
gmehmet 1:f60eafbf009a 567 if(threadStackSize[i] < stats[i].max_size){
gmehmet 1:f60eafbf009a 568 printf("Thread: 0x%lX, Stack size: %lu / %lu\r\n", stats[i].thread_id, stats[i].max_size, stats[i].reserved_size);
gmehmet 1:f60eafbf009a 569 threadStackSize[i] = stats[i].max_size;
gmehmet 1:f60eafbf009a 570 }
gmehmet 1:f60eafbf009a 571 }
gmehmet 1:f60eafbf009a 572 free(stats);
gmehmet 1:f60eafbf009a 573
gmehmet 1:f60eafbf009a 574 // Grab the heap statistics
gmehmet 1:f60eafbf009a 575 mbed_stats_heap_t heap_stats;
gmehmet 1:f60eafbf009a 576 mbed_stats_heap_get(&heap_stats);
gmehmet 1:f60eafbf009a 577 if(heapSize < heap_stats.current_size){
gmehmet 1:f60eafbf009a 578 printf("Heap size: %lu / %lu bytes\r\n", heap_stats.current_size, heap_stats.reserved_size);
gmehmet 1:f60eafbf009a 579 heapSize = heap_stats.current_size;
gmehmet 1:f60eafbf009a 580 }
gmehmet 1:f60eafbf009a 581 }
gmehmet 1:f60eafbf009a 582 #endif