Ahmad Alkaff / Mbed 2 deprecated CS3237

Dependencies:   mbed

Committer:
AhmadAlkaff
Date:
Mon Nov 11 17:38:48 2019 +0000
Revision:
12:2ad10c36f820
Parent:
7:188bf08cfb44
Child:
13:0f663ca63342
Code Cleanup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AhmadAlkaff 0:7b5d37ca532f 1 #include "mbed.h"
AhmadAlkaff 1:e4a32b4163f2 2 #include "LIS2DH.h"
AhmadAlkaff 0:7b5d37ca532f 3 #include "MAX14720.h"
AhmadAlkaff 0:7b5d37ca532f 4 #include "MAX30001.h"
AhmadAlkaff 1:e4a32b4163f2 5 #include "MAX30205.h"
AhmadAlkaff 0:7b5d37ca532f 6 #include "System.h"
AhmadAlkaff 0:7b5d37ca532f 7 #include "USBSerial.h"
socrj 7:188bf08cfb44 8 //#include "unistd.h"
socrj 7:188bf08cfb44 9
AhmadAlkaff 0:7b5d37ca532f 10 /************************************************************************************************************************************/
AhmadAlkaff 0:7b5d37ca532f 11 // define the HVOUT Boost Voltage default for the MAX14720 PMIC
AhmadAlkaff 0:7b5d37ca532f 12 #define HVOUT_VOLTAGE 4500 // set to 4500 mV
AhmadAlkaff 0:7b5d37ca532f 13
AhmadAlkaff 0:7b5d37ca532f 14 // define all I2C addresses
AhmadAlkaff 0:7b5d37ca532f 15 #define LIS2DH_I2C_SLAVE_ADDR (0x32)
AhmadAlkaff 0:7b5d37ca532f 16 #define MAX14720_I2C_SLAVE_ADDR (0x54)
AhmadAlkaff 0:7b5d37ca532f 17 #define MAX30101_I2C_SLAVE_ADDR (0xAE)
AhmadAlkaff 1:e4a32b4163f2 18 #define MAX30205_I2C_SLAVE_ADDR_BOTTOM (0x90)
AhmadAlkaff 1:e4a32b4163f2 19 #define MAX30205_I2C_SLAVE_ADDR_TOP (0x92)
AhmadAlkaff 1:e4a32b4163f2 20 #define BMP280_I2C_SLAVE_ADDR (0xEC)
AhmadAlkaff 0:7b5d37ca532f 21
AhmadAlkaff 0:7b5d37ca532f 22 // Settings for ECG Initialization
AhmadAlkaff 0:7b5d37ca532f 23 #define En_ecg 0x01
AhmadAlkaff 0:7b5d37ca532f 24 #define Openp 0x00
AhmadAlkaff 0:7b5d37ca532f 25 #define Openn 0x00
AhmadAlkaff 0:7b5d37ca532f 26 #define Pol 0x00
AhmadAlkaff 0:7b5d37ca532f 27 #define Calp_sel 0x00
AhmadAlkaff 0:7b5d37ca532f 28 #define Caln_sel 0x00
AhmadAlkaff 0:7b5d37ca532f 29 #define E_fit 0x0F
socrj 7:188bf08cfb44 30 #define Rate 0x00
AhmadAlkaff 0:7b5d37ca532f 31 #define Gain 0x00
AhmadAlkaff 0:7b5d37ca532f 32 #define Dhpf 0x01
AhmadAlkaff 0:7b5d37ca532f 33 #define Dlpf 0x01
AhmadAlkaff 0:7b5d37ca532f 34
AhmadAlkaff 0:7b5d37ca532f 35 // Settings for ECG RtoR
AhmadAlkaff 0:7b5d37ca532f 36 #define En_rtor 0x01
AhmadAlkaff 0:7b5d37ca532f 37 #define Wndw 0x03
AhmadAlkaff 0:7b5d37ca532f 38 #define Gain1 0x0f
AhmadAlkaff 0:7b5d37ca532f 39 #define Pavg 0x02
AhmadAlkaff 0:7b5d37ca532f 40 #define Ptsf 0x03
AhmadAlkaff 0:7b5d37ca532f 41 #define Hoff 0x20
AhmadAlkaff 0:7b5d37ca532f 42 #define Ravg 0x02
AhmadAlkaff 0:7b5d37ca532f 43 #define Rhsf 0x04
AhmadAlkaff 0:7b5d37ca532f 44 #define Clr_rrint 0x01
AhmadAlkaff 0:7b5d37ca532f 45
AhmadAlkaff 0:7b5d37ca532f 46 // Settings for Lead Detection
AhmadAlkaff 0:7b5d37ca532f 47 #define En_dcloff 0x01
AhmadAlkaff 0:7b5d37ca532f 48 #define Ipol 0x00
AhmadAlkaff 0:7b5d37ca532f 49 #define Imag 0x00
AhmadAlkaff 0:7b5d37ca532f 50 #define Vth 0x00
AhmadAlkaff 0:7b5d37ca532f 51
AhmadAlkaff 0:7b5d37ca532f 52 // Settings for the HR initialization
AhmadAlkaff 0:7b5d37ca532f 53 #define FIFO_WATERLEVEL_MARK 15
AhmadAlkaff 0:7b5d37ca532f 54 #define SAMPLE_AVG 2
AhmadAlkaff 0:7b5d37ca532f 55 #define SAMPLE_RATE 1
AhmadAlkaff 0:7b5d37ca532f 56 #define PULSE_WIDTH 2
AhmadAlkaff 0:7b5d37ca532f 57 #define RED_LED_CURRENT 0x1F
AhmadAlkaff 0:7b5d37ca532f 58 #define IR_LED_CURRENT 0X1F
AhmadAlkaff 0:7b5d37ca532f 59
AhmadAlkaff 0:7b5d37ca532f 60 // Define with Maxim VID and a Maxim assigned PID, set to version 0x0001 and non-blocking
AhmadAlkaff 0:7b5d37ca532f 61 USBSerial usbSerial(0x0b6a, 0x0100, 0x0001, false);
AhmadAlkaff 0:7b5d37ca532f 62
AhmadAlkaff 0:7b5d37ca532f 63 // I2C Masters
AhmadAlkaff 12:2ad10c36f820 64 I2C i2c1(I2C1_SDA, I2C1_SCL); // used by MAX30205
AhmadAlkaff 12:2ad10c36f820 65 I2C i2c2(I2C2_SDA, I2C2_SCL); // used by MAX14720, LIS2DH
AhmadAlkaff 0:7b5d37ca532f 66
AhmadAlkaff 0:7b5d37ca532f 67 // SPI Master 0 with SPI0_SS for use with MAX30001
AhmadAlkaff 0:7b5d37ca532f 68 SPI spi(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS);
AhmadAlkaff 0:7b5d37ca532f 69
AhmadAlkaff 0:7b5d37ca532f 70 // PMIC
AhmadAlkaff 0:7b5d37ca532f 71 MAX14720 max14720(&i2c2, MAX14720_I2C_SLAVE_ADDR);
AhmadAlkaff 0:7b5d37ca532f 72
AhmadAlkaff 0:7b5d37ca532f 73 // Accelerometer
AhmadAlkaff 2:17d5a74fc2c4 74 LIS2DH lis2dh(&i2c2, LIS2DH_I2C_SLAVE_ADDR);
AhmadAlkaff 2:17d5a74fc2c4 75 InterruptIn lis2dh_Interrupt(P4_7);
AhmadAlkaff 0:7b5d37ca532f 76
AhmadAlkaff 0:7b5d37ca532f 77 // Top Temperature Sensor
AhmadAlkaff 2:17d5a74fc2c4 78 MAX30205 MAX30205_top(&i2c1, MAX30205_I2C_SLAVE_ADDR_TOP);
AhmadAlkaff 0:7b5d37ca532f 79
AhmadAlkaff 0:7b5d37ca532f 80 // Botttom Temperature Sensor
AhmadAlkaff 2:17d5a74fc2c4 81 MAX30205 MAX30205_bottom(&i2c1, MAX30205_I2C_SLAVE_ADDR_BOTTOM);
AhmadAlkaff 0:7b5d37ca532f 82
AhmadAlkaff 0:7b5d37ca532f 83 // ECG device
AhmadAlkaff 0:7b5d37ca532f 84 MAX30001 max30001(&spi);
AhmadAlkaff 0:7b5d37ca532f 85 InterruptIn max30001_InterruptB(P3_6);
AhmadAlkaff 0:7b5d37ca532f 86 InterruptIn max30001_Interrupt2B(P4_5);
socrj 7:188bf08cfb44 87
AhmadAlkaff 0:7b5d37ca532f 88 // PWM used as fclk for the MAX30001
AhmadAlkaff 0:7b5d37ca532f 89 PwmOut pwmout(P1_7);
AhmadAlkaff 0:7b5d37ca532f 90
AhmadAlkaff 0:7b5d37ca532f 91 DigitalOut led(LED1);
AhmadAlkaff 0:7b5d37ca532f 92
AhmadAlkaff 0:7b5d37ca532f 93 // Data of sensors
AhmadAlkaff 0:7b5d37ca532f 94 int32_t ECG_Raw, ECG_cumul, SpO_Raw;
AhmadAlkaff 0:7b5d37ca532f 95 double ECG_converted = 0;
AhmadAlkaff 0:7b5d37ca532f 96 uint32_t index = 0;
AhmadAlkaff 0:7b5d37ca532f 97
AhmadAlkaff 0:7b5d37ca532f 98 //Temperature sensor variables
AhmadAlkaff 2:17d5a74fc2c4 99 uint16_t rawTemp_top, rawTemp_bottom;
AhmadAlkaff 2:17d5a74fc2c4 100 float celsius_top, celsius_bottom, fahrenheit_top, fahrenheit_bottom;
AhmadAlkaff 0:7b5d37ca532f 101
AhmadAlkaff 2:17d5a74fc2c4 102 // Accelerometer sensor variables
AhmadAlkaff 2:17d5a74fc2c4 103 int16_t accel_value[3];
AhmadAlkaff 0:7b5d37ca532f 104
AhmadAlkaff 0:7b5d37ca532f 105 //write the power down command to PMIC
AhmadAlkaff 0:7b5d37ca532f 106 void turnOff() {
AhmadAlkaff 0:7b5d37ca532f 107 max14720.shutdown();
AhmadAlkaff 0:7b5d37ca532f 108 }
AhmadAlkaff 0:7b5d37ca532f 109
AhmadAlkaff 0:7b5d37ca532f 110 //@brief Creates a packet that will be streamed via USB Serial
AhmadAlkaff 0:7b5d37ca532f 111 //@brief the packet created will be inserted into a fifo to be streamed at a later time
AhmadAlkaff 0:7b5d37ca532f 112 //@param id Streaming ID
AhmadAlkaff 0:7b5d37ca532f 113 //@param buffer Pointer to a uint32 array that contains the data to include in the packet
AhmadAlkaff 0:7b5d37ca532f 114 //@param number Number of elements in the buffer
AhmadAlkaff 0:7b5d37ca532f 115 void StreamPacketUint32_ex(uint32_t id, uint32_t *buffer, uint32_t number) {
AhmadAlkaff 0:7b5d37ca532f 116 int k;
AhmadAlkaff 0:7b5d37ca532f 117
AhmadAlkaff 0:7b5d37ca532f 118 if(id == MAX30001_DATA_ECG) {
AhmadAlkaff 0:7b5d37ca532f 119 for (k = 0; k < number ; k++) {
AhmadAlkaff 0:7b5d37ca532f 120 ECG_Raw = (int32_t)(buffer[k] << 8);
AhmadAlkaff 0:7b5d37ca532f 121 ECG_Raw = ECG_Raw >> 14;
socrj 7:188bf08cfb44 122 //usbSerial.printf("%s ECG", datetime.datetime.utcnow().strftime("%H:%M:%S"));
socrj 7:188bf08cfb44 123 usbSerial.printf("ECG\r\n");
socrj 7:188bf08cfb44 124 usbSerial.printf("%d\r\n", ECG_Raw);
socrj 7:188bf08cfb44 125 //usbSerial.printf("k is %d and number is %d\r\n", k, number);
AhmadAlkaff 0:7b5d37ca532f 126 index++;
AhmadAlkaff 0:7b5d37ca532f 127 }
AhmadAlkaff 0:7b5d37ca532f 128 }
AhmadAlkaff 0:7b5d37ca532f 129 }
AhmadAlkaff 0:7b5d37ca532f 130
AhmadAlkaff 0:7b5d37ca532f 131 int main() {
AhmadAlkaff 0:7b5d37ca532f 132 // hold results for returning functions
AhmadAlkaff 0:7b5d37ca532f 133 int result;
AhmadAlkaff 0:7b5d37ca532f 134
AhmadAlkaff 0:7b5d37ca532f 135 // initialize HVOUT on the MAX14720 PMIC
AhmadAlkaff 0:7b5d37ca532f 136 result = max14720.init();
AhmadAlkaff 0:7b5d37ca532f 137 if (result == MAX14720_ERROR)
AhmadAlkaff 0:7b5d37ca532f 138 printf("Error initializing MAX14720");
AhmadAlkaff 0:7b5d37ca532f 139 max14720.boostEn = MAX14720::BOOST_ENABLED;
AhmadAlkaff 0:7b5d37ca532f 140 max14720.boostSetVoltage(HVOUT_VOLTAGE);
AhmadAlkaff 0:7b5d37ca532f 141
AhmadAlkaff 0:7b5d37ca532f 142 // Interrupt priority
AhmadAlkaff 0:7b5d37ca532f 143 NVIC_SetPriority(GPIO_P0_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 144 NVIC_SetPriority(GPIO_P1_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 145 NVIC_SetPriority(GPIO_P2_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 146 NVIC_SetPriority(GPIO_P3_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 147 NVIC_SetPriority(GPIO_P4_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 148 NVIC_SetPriority(GPIO_P5_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 149 NVIC_SetPriority(GPIO_P6_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 150 // Used by the MAX30001
AhmadAlkaff 0:7b5d37ca532f 151 NVIC_SetPriority(SPI1_IRQn, 0);
AhmadAlkaff 0:7b5d37ca532f 152
AhmadAlkaff 0:7b5d37ca532f 153 /* ECG Initialize */
AhmadAlkaff 0:7b5d37ca532f 154 max30001_InterruptB.disable_irq();
AhmadAlkaff 0:7b5d37ca532f 155 max30001_Interrupt2B.disable_irq();
AhmadAlkaff 0:7b5d37ca532f 156 max30001_InterruptB.mode(PullUp);
AhmadAlkaff 0:7b5d37ca532f 157 max30001_InterruptB.fall(&MAX30001Mid_IntB_Handler);
AhmadAlkaff 0:7b5d37ca532f 158 max30001_Interrupt2B.mode(PullUp);
AhmadAlkaff 0:7b5d37ca532f 159 max30001_Interrupt2B.fall(&MAX30001Mid_Int2B_Handler);
AhmadAlkaff 0:7b5d37ca532f 160 max30001_InterruptB.enable_irq();
AhmadAlkaff 0:7b5d37ca532f 161 max30001_Interrupt2B.enable_irq();
AhmadAlkaff 0:7b5d37ca532f 162 MAX30001_AllowInterrupts(1);
AhmadAlkaff 0:7b5d37ca532f 163 // Configuring the FCLK for the ECG, set to 32.768KHZ
AhmadAlkaff 0:7b5d37ca532f 164 pwmout.period_us(31);
AhmadAlkaff 0:7b5d37ca532f 165 pwmout.write(0.5); // 0-1 is 0-100%, 0.5 = 50% duty cycle.
AhmadAlkaff 0:7b5d37ca532f 166 max30001.max30001_sw_rst(); // Do a software reset of the MAX30001
AhmadAlkaff 0:7b5d37ca532f 167 max30001.max30001_INT_assignment(
AhmadAlkaff 0:7b5d37ca532f 168 MAX30001::MAX30001_INT_B, // en_enint_loc
AhmadAlkaff 0:7b5d37ca532f 169 MAX30001::MAX30001_NO_INT, // en_eovf_loc
AhmadAlkaff 0:7b5d37ca532f 170 MAX30001::MAX30001_NO_INT, // en_fstint_loc
AhmadAlkaff 0:7b5d37ca532f 171
AhmadAlkaff 0:7b5d37ca532f 172 MAX30001::MAX30001_INT_2B, // en_dcloffint_loc
AhmadAlkaff 0:7b5d37ca532f 173 MAX30001::MAX30001_INT_B, // en_bint_loc
AhmadAlkaff 0:7b5d37ca532f 174 MAX30001::MAX30001_NO_INT, // en_bovf_loc
AhmadAlkaff 0:7b5d37ca532f 175
AhmadAlkaff 0:7b5d37ca532f 176 MAX30001::MAX30001_INT_2B, // en_bover_loc
AhmadAlkaff 0:7b5d37ca532f 177 MAX30001::MAX30001_INT_2B, // en_bundr_loc
AhmadAlkaff 0:7b5d37ca532f 178 MAX30001::MAX30001_NO_INT, // en_bcgmon_loc
AhmadAlkaff 0:7b5d37ca532f 179
AhmadAlkaff 0:7b5d37ca532f 180 MAX30001::MAX30001_INT_B, // en_pint_loc
AhmadAlkaff 0:7b5d37ca532f 181 MAX30001::MAX30001_NO_INT, // en_povf_loc,
AhmadAlkaff 0:7b5d37ca532f 182 MAX30001::MAX30001_NO_INT, // en_pedge_loc
AhmadAlkaff 0:7b5d37ca532f 183
AhmadAlkaff 0:7b5d37ca532f 184 MAX30001::MAX30001_INT_2B, // en_lonint_loc
AhmadAlkaff 0:7b5d37ca532f 185 MAX30001::MAX30001_INT_B, // en_rrint_loc
AhmadAlkaff 0:7b5d37ca532f 186 MAX30001::MAX30001_NO_INT, // en_samp_loc
AhmadAlkaff 0:7b5d37ca532f 187
AhmadAlkaff 0:7b5d37ca532f 188 MAX30001::MAX30001_INT_ODNR, // intb_Type
AhmadAlkaff 0:7b5d37ca532f 189 MAX30001::MAX30001_INT_ODNR); // int2b_Type
socrj 7:188bf08cfb44 190
socrj 7:188bf08cfb44 191 lis2dh.initStart(LIS2DH_DATARATE_50HZ, LIS2DH_FIFO_SIZE);
socrj 7:188bf08cfb44 192
AhmadAlkaff 0:7b5d37ca532f 193 max30001.max30001_ECG_InitStart(En_ecg, Openp, Openn, Pol, Calp_sel, Caln_sel, E_fit, Rate, Gain, Dhpf, Dlpf);
AhmadAlkaff 0:7b5d37ca532f 194 max30001.max30001_synch();
AhmadAlkaff 0:7b5d37ca532f 195 max30001.onDataAvailable(&StreamPacketUint32_ex);
socrj 7:188bf08cfb44 196
socrj 7:188bf08cfb44 197 while (1){
socrj 7:188bf08cfb44 198 // MAX30001 initialize interrupt
socrj 7:188bf08cfb44 199 // ECG READING
socrj 3:a7396ed925e6 200
socrj 7:188bf08cfb44 201 // LIS2DH initialize interrupt
socrj 7:188bf08cfb44 202 //lis2dh.init();
socrj 7:188bf08cfb44 203 //lis2dh_Interrupt.fall(&LIS2DHIntHandler);
socrj 7:188bf08cfb44 204 //lis2dh_Interrupt.mode(PullUp);
socrj 7:188bf08cfb44 205
socrj 7:188bf08cfb44 206 int a;
socrj 7:188bf08cfb44 207 lis2dh.get_motion_fifo(&accel_value[0], &accel_value[1], &accel_value[2]);
socrj 7:188bf08cfb44 208 usbSerial.printf("ACC\r\n");
socrj 7:188bf08cfb44 209
socrj 7:188bf08cfb44 210 usbSerial.printf("X %d\r\nY %d\r\nZ %d\r\n", accel_value[0], accel_value[1], accel_value[2]);
socrj 7:188bf08cfb44 211
socrj 3:a7396ed925e6 212 /*
socrj 7:188bf08cfb44 213 int child_pid = fork();
socrj 7:188bf08cfb44 214 int status;
socrj 3:a7396ed925e6 215
socrj 7:188bf08cfb44 216
socrj 7:188bf08cfb44 217 if (child_pid == 0) {
socrj 7:188bf08cfb44 218 while (1){
socrj 7:188bf08cfb44 219 a = usbSerial._getc();
socrj 7:188bf08cfb44 220 if (a==97){
socrj 7:188bf08cfb44 221 max30001.max30001_Stop_ECG();
socrj 7:188bf08cfb44 222 lis2dh.stop();
socrj 7:188bf08cfb44 223 return 0;
socrj 7:188bf08cfb44 224 }
socrj 7:188bf08cfb44 225 }
AhmadAlkaff 0:7b5d37ca532f 226 }
socrj 7:188bf08cfb44 227 //LOOP-FOREVER READ ACCELEROTMETER
socrj 7:188bf08cfb44 228 else {
socrj 7:188bf08cfb44 229 pid_t result = waitpid(child_pid, &status, WNOHANG);
socrj 7:188bf08cfb44 230 if (result == 0) {
socrj 7:188bf08cfb44 231 while (1) {
socrj 3:a7396ed925e6 232 */
AhmadAlkaff 0:7b5d37ca532f 233
socrj 7:188bf08cfb44 234 /*
socrj 7:188bf08cfb44 235 wait(5);
socrj 7:188bf08cfb44 236 a = usbSerial._getc();
socrj 7:188bf08cfb44 237 usbSerial.printf("WAIT 5 LIAO\r\n");
socrj 7:188bf08cfb44 238
socrj 7:188bf08cfb44 239 if (a == 98) {
socrj 7:188bf08cfb44 240 max30001.max30001_Stop_ECG();
socrj 7:188bf08cfb44 241 index = 0;
socrj 7:188bf08cfb44 242 }
socrj 7:188bf08cfb44 243 */
socrj 7:188bf08cfb44 244 /*
socrj 7:188bf08cfb44 245 lis2dh.int_handler();
socrj 7:188bf08cfb44 246
socrj 7:188bf08cfb44 247 lis2dh.get_motion_fifo(&accel_value[0], &accel_value[1], &accel_value[2]);
AhmadAlkaff 2:17d5a74fc2c4 248
socrj 7:188bf08cfb44 249 //usbSerial.printf("***** LIS2DH Acclerometer Sensor Reading *****\r\n");
socrj 7:188bf08cfb44 250 usbSerial.printf("X %d\r\nY %d\r\nZ %d\r\n", accel_value[0], accel_value[1], accel_value[2]);
socrj 7:188bf08cfb44 251 //usbSerial.printf("-------------------------------------------------\r\n");
socrj 7:188bf08cfb44 252 wait(1);
socrj 7:188bf08cfb44 253 }
socrj 7:188bf08cfb44 254 } else {
socrj 7:188bf08cfb44 255 while(1){
socrj 7:188bf08cfb44 256 usbSerial.printf("Press c to continue\r\n");
socrj 7:188bf08cfb44 257 a = usbSerial._getc();
socrj 7:188bf08cfb44 258 if (a==99){
socrj 7:188bf08cfb44 259 break;
socrj 7:188bf08cfb44 260 }
socrj 7:188bf08cfb44 261 }
socrj 7:188bf08cfb44 262 }
socrj 7:188bf08cfb44 263 }
socrj 7:188bf08cfb44 264 */
socrj 7:188bf08cfb44 265 }
AhmadAlkaff 0:7b5d37ca532f 266 }