Code to log MAX30102 sensor data to phone application (Based on Nexpaq)
Dependencies: ds3231 maxim_dev nexpaq_mdk MAX30102
Fork of IO_Demo by
main.cpp
- Committer:
- shettypavank
- Date:
- 2016-12-18
- Revision:
- 2:9057c54ae6e9
- Parent:
- 1:5fb525e83780
File content as of revision 2:9057c54ae6e9:
#include "mbed.h" #include "nexpaq_mdk.h" #include "ds3231.h" #include "algorithm.h" #include "MAX30102.h" #define I2C_SDA P1_6 #define I2C_SCL P1_7 #define FUNCTION_TABLE_NUM 2 #define UUID_NUM 16 // UUID number is 16, don't change it #define LOOP_DELAY 1000 DigitalOut ledR(P2_4, LED_OFF); DigitalOut ledG(P2_5, LED_OFF); DigitalOut ledB(P2_6, LED_OFF); uint32_t aun_ir_buffer[500]; //IR LED sensor data int32_t n_ir_buffer_length; //data length uint32_t aun_red_buffer[500]; //Red LED sensor data int32_t n_sp02; //SPO2 value int8_t ch_spo2_valid; //indicator to show if the SP02 calculation is valid int32_t n_heart_rate; //heart rate value int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid uint8_t uch_dummy; DigitalIn INT(P4_1); AnalogIn aIn0(AIN_0); AnalogIn aIn1(AIN_1); AnalogIn aIn2(AIN_2); AnalogIn aIn3(AIN_3); AnalogIn aIn4(AIN_4); AnalogIn aIn5(AIN_5); DigitalInOut digPin[] = {DigitalInOut(P0_1),DigitalInOut(P0_0),DigitalInOut(P1_2),DigitalInOut(P1_1), DigitalInOut(P1_0),DigitalInOut(P1_3),DigitalInOut(P1_7),DigitalInOut(P1_6), DigitalInOut(P3_0),DigitalInOut(P3_1),DigitalInOut(P3_4),DigitalInOut(P3_5), DigitalInOut(P0_2),DigitalInOut(P0_3),DigitalInOut(P4_0),DigitalInOut(P4_1) }; /***** Definitions *****/ #define FUNCTION_TABLE_NUM 2 #define UUID_NUM 16 // UUID number is 16, don't change it #define LOOP_DELAY 1000 /***** Globals *****/ void my_function_CMD_2700(unsigned char *pData, unsigned char len); void my_function_CMD_2702(unsigned char *pData, unsigned char len); const MDK_REGISTER_CMD my_cmd_func_table[FUNCTION_TABLE_NUM] = { {0x2700, my_function_CMD_2700}, // Command -> function {0x2702, my_function_CMD_2702}, // Command -> function }; unsigned char dataOut[10]; Ds3231 temp_sense(P3_4, P3_5); DigitalOut cs(P1_3); //vitals int spo2=50,heart_rate=120,Resp_rate=12,tmp=25; /***** Functions *****/ void my_function_CMD_2700(unsigned char *pData, unsigned char len) { unsigned char response = 0x00; /* ledR = 1.0f - (pData[0] / 255.0f); ledG = 1.0f - (pData[1] / 255.0f); ledB = 1.0f - (pData[2] / 255.0f);*/ np_api_upload(0x2701, &response, 1); } void my_function_CMD_2702(unsigned char *pData, unsigned char len) { unsigned char response = 0x00; int pinIndex = pData[0]; int pinMode = pData[1]; switch(pinMode) { case 0: case 1: digPin[pinIndex].mode(PullNone); digPin[pinIndex].input(); break; case 2: digPin[pinIndex].mode(PullDown); digPin[pinIndex].input(); break; case 3: digPin[pinIndex].mode(PullUp); digPin[pinIndex].input(); break; case 4: digPin[pinIndex]=0; digPin[pinIndex].output(); break; case 5: digPin[pinIndex]=1; digPin[pinIndex].output(); break; } np_api_upload(0x2703, &response, 1); } void sendStatus() { np_api_upload(0x2800, dataOut, 10); } /******************************************************************************/ void app_setup() { int i = 0; // np_api_set_app_version(0, 0, 3); if ( np_api_register((MDK_REGISTER_CMD*)my_cmd_func_table, FUNCTION_TABLE_NUM) == MDK_REGISTER_FAILD ) { // Register failed handle code } /* ledR = 1.0f; ledG = 1.0f; ledB = 1.0f; for (i = 0; i < 16; i++) { digPin[i].mode(PullUp); digPin[i].input(); } for (i = 0; i < 10; i++) { dataOut[i] = 0xFF; }*/ //instantiate rtc object } void app_loop() { if((n_heart_rate>20)&&(n_heart_rate<220)) heart_rate=n_heart_rate; if((n_sp02>60)&&(n_sp02<120)) spo2=n_sp02; tmp = temp_sense.get_temperature(); dataOut[0] = heart_rate; dataOut[1] = heart_rate>>8; dataOut[2] = tmp; dataOut[3] = tmp>>8; dataOut[4] = spo2; dataOut[5] = spo2>>8; dataOut[6] = Resp_rate; dataOut[7] = Resp_rate>>8; dataOut[8] = (digPin[7].read()<<7) + (digPin[6].read()<<6) + (digPin[5].read()<<5) + (digPin[4].read()<<4) + (digPin[3].read()<<3) + (digPin[2].read()<<2) + (digPin[1].read()<<1) + (digPin[0].read()); dataOut[9] = (digPin[15].read()<<7) + (digPin[14].read()<<6) + (digPin[13].read()<<5) + (digPin[12].read()<<4) + (digPin[11].read()<<3) + (digPin[10].read()<<2) + (digPin[9].read()<<1) + (digPin[8].read()); sendStatus(); } int main(void) { uint32_t un_min, un_max, un_prev_data; //variables to calculate the on-board LED brightness that reflects the heartbeats int i; maxim_max30102_reset(); maxim_max30102_read_reg(0,&uch_dummy); maxim_max30102_init(); un_min=0x3FFFF; un_max=0; n_ir_buffer_length=500; np_api_init(); app_setup(); np_api_start(); for(i=0;i<n_ir_buffer_length;i++) { while(INT.read()==1); //wait until the interrupt pin asserts maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); //read from MAX30102 FIFO if(un_min>aun_red_buffer[i]) un_min=aun_red_buffer[i]; //update signal min if(un_max<aun_red_buffer[i]) un_max=aun_red_buffer[i]; } un_prev_data=aun_red_buffer[i]; maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid); while(1) { i=0; un_min=0x3FFFF; un_max=0; //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top for(i=100;i<500;i++) { aun_red_buffer[i-100]=aun_red_buffer[i]; aun_ir_buffer[i-100]=aun_ir_buffer[i]; //update the signal min and max if(un_min>aun_red_buffer[i]) un_min=aun_red_buffer[i]; if(un_max<aun_red_buffer[i]) un_max=aun_red_buffer[i]; } for(i=400;i<500;i++) { un_prev_data=aun_red_buffer[i-1]; while(INT.read()==1); maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); /* if(aun_red_buffer[i]>un_prev_data) { f_temp=aun_red_buffer[i]-un_prev_data; f_temp/=(un_max-un_min); f_temp*=MAX_BRIGHTNESS; n_brightness-=(int)f_temp; if(n_brightness<0) n_brightness=0; } else { f_temp=un_prev_data-aun_red_buffer[i]; f_temp/=(un_max-un_min); f_temp*=MAX_BRIGHTNESS; n_brightness+=(int)f_temp; if(n_brightness>MAX_BRIGHTNESS) n_brightness=MAX_BRIGHTNESS; }*/ //led.write(1-(float)n_brightness/256); //send samples and calculation result to terminal program through UART } // ledR=LED_OFF; // ledG=LED_ON; maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid); ledR = LED_ON; app_loop(); np_api_bsl_chk(); Thread::wait(LOOP_DELAY); } return 0; }