David Jung / Mbed OS MAXREFDES101_SOURCE_CODE_HEART_RATE

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
gmehmet
Date:
Wed Apr 10 14:56:25 2019 +0300
Revision:
1:f60eafbf009a
Parent:
0:07d28b5db986
Child:
3:2fe2ff1ca0dc
upload from local

Who changed what in which revision?

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