Added 4 point or 8 point averaging function .
Dependencies: SDFileSystem ds3231 eeprom_Nikita mbed testUniGraphic_150217
Fork of merged_code2_3rd_nov_2017 by
Diff: bp.cpp
- Revision:
- 14:f5c62d30c6fc
- Parent:
- 10:aeff3309002a
- Child:
- 15:208b146151ba
diff -r 5d3b478ea9c7 -r f5c62d30c6fc bp.cpp --- a/bp.cpp Sat May 27 05:47:55 2017 +0000 +++ b/bp.cpp Thu Jun 01 09:24:45 2017 +0000 @@ -1,17 +1,14 @@ - -//BP Optimised Program for Averaging the received value from PPG and ECG & Check for SD card Storage// +//-----------------------------------------------NEW BP code starts--------------------------------/// -/** ECG ADS1291 Test program. -ADS1291 is a single channel ECG chip -with a 24 bit Sigma-Delta ADC - */ -/* #include "mbed.h" #include "MAX30102.h" // BP ADD #include <string.h> #include <stdio.h> + +#include <time.h> +//#include <iostream> #include "ds3231.h" #include "SDFileSystem.h" #include "rtc.h" @@ -21,218 +18,23 @@ #include "display_modules.h" -Serial bc(USBTX,USBRX); -DigitalIn INTR(PTC7); - - -void bp() { - -//------------------BP ADD------------------------------//{ -//int location; // BP ADD -int32_t n_red_buffer_length = 1500; //data length -uint32_t aun_red_buffer[1500]; //Red LED sensor data, set to 500 -uint32_t red_value; -uint32_t ecg_value; -uint8_t uch_dummy; -uint32_t ecg_buf[1000]; -int32_t ecg_buffer_length = 1000; -float SBP, DBP, PWV, delta_t; -int d = 210; - -uint32_t un_min, un_max, ecg_min, ecg_max ; //variables to calculate the on-board LED brightness that reflects the heartbeats - //int i, j; - float ecg_location, ppg_location; - //int32_t n_brightness; - - // n_brightness=0; - un_min=0x3FFFF; - un_max=0; - ecg_min = 0xFFFFFF; - ecg_max = 0; - //---------------- BP ADD-----------------------------//} - - - //time_t epoch_time; - //int fp; - int concatenate_value1 = 0; -//uint32_t ecg_buf[1500]; -//int32_t ecg_der[1500]; -//int buff1[15]= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; -//int32_t sample_sum; // static int32_t avg[1500]; - //int32_t count = 0; int32_t fs = 500; int32_t w=0,w1=0; - - unsigned char chk = 1; - bc.baud(baud_rate); - // mySpi.frequency(freq) ; - // mySpi.format(bits, mode) ; - freqset(); - // Ds3231 rtc(PTC11, PTC10); //sda,scl2yy - - //------------------BP ADD---------------------------// { - while(bc.readable()==0) - { - bc.printf("\x1B[2J"); //clear terminal program screen - bc.printf("Press any key to start conversion\n\r"); - wait(1); - } - wait(5); - bc.printf("Start of capture, Remain CALM and Donot MOVE\n"); - wait(2); - //-------------------BP ADD---------------------------//} - - setupfunc(); - ecgsetupfunc(); - //--------------- BP ADD------------------------------------//{ - maxim_max30102_reset(); // PPG reset - maxim_max30102_init(); // PPG ADC register Initialise - //---------------BP ADD ----------------------------------// } - - - chk = 1; - bc.printf("rawecg......................\n"); - for(int i=0; i<N_ECG; i++) - { - - concatenate_value1=readvalue(); - ecg_buf[i] = concatenate_value1; - - bc.printf( "%d\n", concatenate_value1); - maxim_max30102_read_reg(0,&uch_dummy); - while(INTR.read()==1); - maxim_max30102_read_fifo((aun_red_buffer+i)); - //bc.printf( "%d\n", concatenate_value1); - // bc.printf("%d\n",aun_red_buffer[i]); - //sd_write(concatenate_value); - -- BP ADD commented - //printf( "%d\n", concatenate_value); -- BP ADD commented - // bc.printf("loop2"); - } - - for (int w=1000; w < n_red_buffer_length; w++) // for reading extra 500 PPG samples. - { - //bc.printf("loop2"); - while(INTR.read()==1); - maxim_max30102_read_fifo((aun_red_buffer+w)); - } - - - //sd_close(); -- BP ADD commented - - int32_t ecg_n_denom; - - // 4 pt Moving Average ECG - bc.printf("PRINTING ECG 4 POINT IN DECIMAL........\n"); - for(int y=0; y<996; y++){ - ecg_n_denom= ( ecg_buf[y]+ ecg_buf[y+1]+ ecg_buf[y+2]+ ecg_buf[y+3]); - ecg_buf[y]= ecg_n_denom/(int32_t)4; - } - for( int l= 0; l<1000; l++){ - bc.printf("%d\n",ecg_buf[l]); //PRINTING ecg AFTER AVERAGING - } -bc.printf("PRINTING PPG IN DECIMAL (after averaging)........\n"); -int32_t ppg_n_denom; - // 4 pt Moving Average PPG - for(int f=0; f<1496; f++){ - ppg_n_denom= ( aun_red_buffer[f]+aun_red_buffer[f+1]+ aun_red_buffer[f+2]+ aun_red_buffer[f+3]); - aun_red_buffer[f]= ppg_n_denom/(int32_t)4; - } - for( int b = 0; b<1500; b++){ - bc.printf("%d\n",aun_red_buffer[b]); - } - - -for(int f=0; f<ecg_buffer_length; f++) - { - if(ecg_min > ecg_buf[f]) - ecg_min = ecg_buf[f]; //update signal min - if(ecg_max < ecg_buf[f]) - { - ecg_max=ecg_buf[f]; //update signal max - ecg_location = f+1; - } - } - bc.printf( "ecg_location = %f\n", ecg_location); - -for(int g = ecg_location; g < (ecg_location+400); g++) // Peak detect changed to 400 samples from 500 samples - { - if(un_min>aun_red_buffer[g]) - un_min=aun_red_buffer[g]; //update signal min - if(un_max<aun_red_buffer[g]) - { - un_max=aun_red_buffer[g]; //update signal max - ppg_location = g+1; - } - } -bc.printf( "ppg_location = %f\n", ppg_location); - -delta_t = (2*(ppg_location - ecg_location))/1000; -bc.printf( "delta_t = %f\n", delta_t); - -PWV = d/delta_t; -bc.printf( "PWV = %f\n", PWV); - -SBP = 0.0508955*PWV+62.559; -DBP = 0.0494*PWV + 17.480; - - -bc.printf( "SBP = %f\n", SBP); -bc.printf( "DBP = %f\n", DBP); - -screen_bp1(SBP,DBP); -*/ - -//-----------------WRITE ECG &PPG - /* -sd_open_BPfile(1); -for (int w=0; w < 1000; w++) -{ -ecg_value = ecg_buf[w]; -sd_write(ecg_value); -} - - - -for (int w=0; w < n_red_buffer_length; w++) -{ -red_value = aun_red_buffer[w]; -sd_write(red_value); -} -sd_close();*/ - -//----------- FINISHED WRITING ECG & PPG TO SD CARD - - - - - //} // End of main function - - -//-----------------------------------------------NEW BP code starts--------------------------------/// - -#include "mbed.h" -#include "MAX30102.h" // BP ADD -#include <string.h> -#include <stdio.h> -//#include <iostream> -#include "ds3231.h" -#include "SDFileSystem.h" -#include "rtc.h" -#include "sdcard.h" -#include "ec_bp.h" -#include "bp.h" -#include "display_modules.h" +#include "struct.h" +#include "test_type.h" using namespace std; -Serial bc(USBTX,USBRX); +Serial bpr(USBTX,USBRX); DigitalIn INTR(PTC7); Timer t; + //FILE *ecg; //FILE *ppg; -void bp(int pid) { + void bp(int pid) { + uint8_t uch_dummy; uint32_t ppgdata; @@ -240,8 +42,83 @@ int concatenate_value2 = 0; unsigned char chk = 1; - int drum11[64]; + uint32_t drum11[64]; uint32_t drum21[64]; + + + //Declaration of Master structure + + BLEMsg_info *ptr_BLEMsg_info_bp, BLEMsg_info_bp; // A copy of master strcuture [ "BLEMsg_info" ] by name "BLEMsg_info_bp" is created + ptr_BLEMsg_info_bp = &BLEMsg_info_bp; // *ptr_BLEMsg_info_bp is the pointer to local copy; + + // Declaration of Date Structure + DateTime_info *ptr_DateTime_info_bp, DateTime_info_bp; // A copy of Master Structure "DateTime_info" created, + ptr_DateTime_info_bp = &DateTime_info_bp; // Structure pointer points to that copy. + + + // RTC operations + time_t epoch_time_bp; //A copy of time_t by name epoch_time_bp is created + epoch_time_bp = rtc_read(); // time is got from get epoch function. + + struct tm * ptr_time_info_bp, time_info_bp; // Sturucture copy of tm is created + ptr_time_info_bp = localtime(&epoch_time_bp); // Structure accepts the time in local format from "time_t" type. + + //BELOW LINE IS TO CHECK Date and TIME + bpr.printf("Time is %d: %d: %d\n", (*ptr_time_info_bp).tm_hour, (*ptr_time_info_bp).tm_min, (*ptr_time_info_bp).tm_sec); + bpr.printf("Date is %d:%d:%d\n", (*ptr_time_info_bp).tm_mday, (*ptr_time_info_bp).tm_mon+1, (*ptr_time_info_bp).tm_year-100); + + //Copying from one structure to the other using variables + DateTime_info_bp.hour = (uint8_t)(*ptr_time_info_bp).tm_hour; + DateTime_info_bp.mins = (uint8_t)(*ptr_time_info_bp).tm_min; + DateTime_info_bp.sec = (uint8_t)(*ptr_time_info_bp).tm_sec; + + DateTime_info_bp.date = (uint8_t) (*ptr_time_info_bp).tm_mday; + DateTime_info_bp.month =(uint8_t)(*ptr_time_info_bp).tm_mon+1; + DateTime_info_bp.year = (uint8_t)(*ptr_time_info_bp).tm_year-100; + + // Copying Time to Main structure + BLEMsg_info_bp.date_time.hour = DateTime_info_bp.hour; + BLEMsg_info_bp.date_time.mins = DateTime_info_bp.mins; + BLEMsg_info_bp.date_time.sec = DateTime_info_bp.sec; + + BLEMsg_info_bp.date_time.date = DateTime_info_bp.date ; + BLEMsg_info_bp.date_time.month = DateTime_info_bp.month ; + BLEMsg_info_bp.date_time.year = DateTime_info_bp.year ; + + + //Checking if the structure has these values + bpr.printf("Time 2 is %d:%d:%d\n", DateTime_info_bp.hour, DateTime_info_bp.mins, DateTime_info_bp.sec); + bpr.printf("\t Date is %d:%d:%d\n",DateTime_info_bp.date, DateTime_info_bp.month, DateTime_info_bp.year); + + + //Loading values to of Test type + test_type_info test_type_info_bp; // copy of " test_type_info" created + test_type_info_bp = BP_Test; // Loaded value 00 to the test type + + BLEMsg_info_bp.test_type = test_type_info_bp; + //Check if 00 is getting printed + bpr.printf("Test Type is : %d\n", test_type_info_bp); + + + // Loading values of Length , PID, DID, sampling frequency, number of samples, calculated data. + BLEMsg_info_bp.device_id = 01; // Device ID fixed + BLEMsg_info_bp.patient_id = (uint32_t)pid; // Patient ID + BLEMsg_info_bp.sampling_freq = 500; // sampling frrquency + BLEMsg_info_bp.length = 10774; //Total length of data in bytes 22 B+10752 B + + /* + //Loading number of samples + NumSamples_info NumSamples_info_bp; //Copy of structure NumSamples_info + NumSamples_info_bp.num_ppg_sample = 1664; // PPG & ECG Sample number loaded in structure copy + NumSamples_info_bp.num_ecg_sample = 1024; + */ + + BLEMsg_info_bp.num_samples.num_sample_ppg_dummy = 1664 ;// PPG number of samples copied to master struct + BLEMsg_info_bp.num_samples.num_sample_ecg_OTtyp = 1024 ; // ECG number of samples copied to master struct + + + + // Variables for file operations // uint32_t amax=0; @@ -253,7 +130,7 @@ //int bloc = 0; //int samples = 0; - bc.baud(baud_rate); + bpr.baud(baud_rate); freqset(); // setting the frequency setupfunc(); @@ -279,48 +156,52 @@ } - + sd_open_BPfilee(pid); sd_open_BP_ECGfile(pid) ; // sd_open_BP_ECGfile(123) draft file for testing sd_open_BP_PPGfile(pid) ; // sd_open_BP_PPGfile(123) draft file for testing FILE *ecg = NULL; FILE *ppg = NULL; - int *drum_ecg = NULL; // pointers to ecg buffer + uint32_t *drum_ecg = NULL; // pointers to ecg buffer changed to uint32_t from int uint32_t *drum_ppg = NULL; // pointer to ppg buffer drum_ecg = drum11; drum_ppg = drum21; - for(int j =0 ; j<16; j++) // changed to 16 from 8 + for(int j =0 ; j<1; j++) // changed to 16 from 8 // Change by Nidhin 30/5/2017 Direct writing to SD card. no loop required { - for(int i=0; i<64; i++) + for(int i=0; i<1024; i++) { concatenate_value2 = readvalue(); - drum11[i]=concatenate_value2; //drum11[i]=concatenate_value2; drum11[i]=dummyconcat; - + //drum11[i]=(uint32_t)concatenate_value2; //drum11[i]=concatenate_value2; drum11[i]=dummyconcat; typecasted to uint32_t + //Change by Nidhin 30/5/2017 Direct writing to SD card. + ecg = sd_BP_ecgwrite(drum_ecg); + maxim_max30102_read_reg(0,&uch_dummy); while(INTR.read()==1); maxim_max30102_read_fifo(&ppgdata); - drum21[i]=ppgdata; + ppg = sd_BP_ppgwrite(&ppgdata); //Change by Nidhin 30/5/2017 Direct writing to SD card. + //drum21[i]=ppgdata; //Change by Nidhin 30/5/2017 Direct writing to SD card. } - ecg = sd_BP_ecgwrite(drum_ecg); // - ppg = sd_BP_ppgwrite(drum_ppg); + //ecg = sd_BP_ecgwrite(drum_ecg); // //Change by Nidhin 30/5/2017 Direct writing to SD card. + //ppg = sd_BP_ppgwrite(drum_ppg); // //Change by Nidhin 30/5/2017 Direct writing to SD card. } - for(int j =0 ; j<10; j++) // changed to 16 from 8 + for(int j =0 ; j<1; j++) // changed to 16 from 8 { - for(int i=0; i<64; i++) + for(int i=0; i<640; i++) { maxim_max30102_read_reg(0,&uch_dummy); while(INTR.read()==1); maxim_max30102_read_fifo(&ppgdata); - drum21[i]=ppgdata; + //drum21[i]=ppgdata; + ppg = sd_BP_ppgwrite (&ppgdata); //Change by Nidhin 30/5/2017 Direct writing to SD card. } - ppg = sd_BP_ppgwrite (drum_ppg); + } fclose(ecg); @@ -355,8 +236,24 @@ SBP = 0.0508955*PWV+62.559; DBP = (0.0494*PWV + 17.480)+10; + /* + //Copying to Structure starts + CalData_info CalData_info_bp; + CalData_info_bp.cal_sbp = (uint16_t) SBP; + CalData_info_bp.cal_dbp = (uint16_t) DBP; NOT REQUIRED + */ + + BLEMsg_info_bp.cal_data.cal_sbp_dummy = (uint16_t) SBP; + BLEMsg_info_bp.cal_data.cal_dbp_OTtyp = (uint16_t) DBP; + + + + create_single_BPfile(pid); // Copy ECG and PPG data to BP file + structure_file(ptr_BLEMsg_info_bp, pid); // Copy BP structure to main file + bpfile_mainfile(pid); + screen_bp1(SBP,DBP); - create_single_BPfile(pid); - - } \ No newline at end of file + // Only for testing + } + \ No newline at end of file