export test
Dependencies: SDFileSystem ds3231 eeprom_Nikita mbed testUniGraphic_150217
Fork of Int_Demo_09May2017_Suhasini_HRavg_Nikita_ili9341 by
ecgg.cpp@13:5d3b478ea9c7, 2017-05-27 (annotated)
- Committer:
- suhasini
- Date:
- Sat May 27 05:47:55 2017 +0000
- Revision:
- 13:5d3b478ea9c7
- Parent:
- 4:6bd81bb1790d
- Child:
- 14:f5c62d30c6fc
This code has ECG functionality with HRD calculation, BP, BG, new display
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nikitateggi | 1:8316c23ec6b9 | 1 | /** ECG ADS1291 Test program. |
nikitateggi | 1:8316c23ec6b9 | 2 | ADS1291 is a single channel ECG chip |
nikitateggi | 1:8316c23ec6b9 | 3 | with a 24 bit Sigma-Delta ADC |
nikitateggi | 1:8316c23ec6b9 | 4 | */ |
nikitateggi | 1:8316c23ec6b9 | 5 | |
nikitateggi | 1:8316c23ec6b9 | 6 | #include "mbed.h" |
nikitateggi | 1:8316c23ec6b9 | 7 | #include <string.h> |
nikitateggi | 1:8316c23ec6b9 | 8 | #include <stdio.h> |
nikitateggi | 1:8316c23ec6b9 | 9 | #include "ds3231.h" |
nikitateggi | 1:8316c23ec6b9 | 10 | #include "SDFileSystem.h" |
nikitateggi | 1:8316c23ec6b9 | 11 | #include "ecg_dec.h" |
nikitateggi | 1:8316c23ec6b9 | 12 | #include "rtc.h" |
nikitateggi | 1:8316c23ec6b9 | 13 | #include "sdcard.h" |
nikitateggi | 3:9a06c2bed650 | 14 | #include "ec_bp.h" |
nikitateggi | 3:9a06c2bed650 | 15 | Serial pc(USBTX,USBRX); |
nikitateggi | 1:8316c23ec6b9 | 16 | |
nikitateggi | 1:8316c23ec6b9 | 17 | |
nikitateggi | 1:8316c23ec6b9 | 18 | |
suhasini | 13:5d3b478ea9c7 | 19 | float ecg(int pid) |
nikitateggi | 3:9a06c2bed650 | 20 | { |
nikitateggi | 1:8316c23ec6b9 | 21 | |
nikitateggi | 3:9a06c2bed650 | 22 | int concatenate_value2 = 0; |
suhasini | 13:5d3b478ea9c7 | 23 | // int32_t sample_sum; // static int32_t avg[1500]; |
suhasini | 13:5d3b478ea9c7 | 24 | int32_t count = 0; int32_t fs = 500; |
suhasini | 13:5d3b478ea9c7 | 25 | uint32_t ecg_buf[N_ECG]; |
nikitateggi | 3:9a06c2bed650 | 26 | Timer t; |
suhasini | 13:5d3b478ea9c7 | 27 | |
suhasini | 13:5d3b478ea9c7 | 28 | //------------------ Declaration for Peak value detection ------------------------------------ |
suhasini | 13:5d3b478ea9c7 | 29 | |
suhasini | 13:5d3b478ea9c7 | 30 | uint32_t hi_val;uint32_t pk_val[20];unsigned int pk_pos[20]={0};unsigned int a; //uint32_t pk=0; |
suhasini | 13:5d3b478ea9c7 | 31 | int hi_dif = 0;int j=0; // int count1 = N_ECG/fs, a_dif=0, fs1 = fs ,h=0; |
suhasini | 13:5d3b478ea9c7 | 32 | // ------------------------- Declaration for Heart Rate calculation -------------------------- |
suhasini | 13:5d3b478ea9c7 | 33 | int n=0; //int n=10; |
suhasini | 13:5d3b478ea9c7 | 34 | float pos_dif, HR[2], HR1,t_pos_dif;int t_sec = 60; float HR_sum = 0,HR_avg; |
suhasini | 13:5d3b478ea9c7 | 35 | // ------------------------------------------------------------------------------------------- |
suhasini | 13:5d3b478ea9c7 | 36 | |
suhasini | 13:5d3b478ea9c7 | 37 | // unsigned char chk = 1; |
nikitateggi | 3:9a06c2bed650 | 38 | pc.baud(baud_rate); |
nikitateggi | 4:6bd81bb1790d | 39 | freqset(); // setting the frequency |
nikitateggi | 4:6bd81bb1790d | 40 | setupfunc(); |
nikitateggi | 3:9a06c2bed650 | 41 | ecgsetupfunc(); |
suhasini | 13:5d3b478ea9c7 | 42 | // chk = 1; |
nikitateggi | 4:6bd81bb1790d | 43 | sd_open_ECGfile(pid); // opening the ecg file |
suhasini | 13:5d3b478ea9c7 | 44 | pc.printf( "Raw data is = \n"); |
nikitateggi | 3:9a06c2bed650 | 45 | for(int i=0; i<N_ECG; i++) |
nikitateggi | 3:9a06c2bed650 | 46 | { |
nikitateggi | 3:9a06c2bed650 | 47 | concatenate_value2= readvalue(); |
nikitateggi | 4:6bd81bb1790d | 48 | sd_write(concatenate_value2); // writing into the sd card |
suhasini | 13:5d3b478ea9c7 | 49 | ecg_buf[i] = concatenate_value2; |
nikitateggi | 3:9a06c2bed650 | 50 | pc.printf( "%d\n", concatenate_value2); |
nikitateggi | 3:9a06c2bed650 | 51 | } |
nikitateggi | 3:9a06c2bed650 | 52 | |
nikitateggi | 4:6bd81bb1790d | 53 | sd_close(); // closing the file |
suhasini | 13:5d3b478ea9c7 | 54 | /* |
suhasini | 13:5d3b478ea9c7 | 55 | // ---------- reading back SD data for processing -------------------- |
suhasini | 13:5d3b478ea9c7 | 56 | sd_read_file(15); |
suhasini | 13:5d3b478ea9c7 | 57 | printf("Reading back SD data\n"); |
suhasini | 13:5d3b478ea9c7 | 58 | for(int i=10;i<N_ECG;i++) |
suhasini | 13:5d3b478ea9c7 | 59 | { |
suhasini | 13:5d3b478ea9c7 | 60 | ecg_buf= sd_read(); |
suhasini | 13:5d3b478ea9c7 | 61 | //printf("%d\n",ecg_buf[i]); |
suhasini | 13:5d3b478ea9c7 | 62 | } |
suhasini | 13:5d3b478ea9c7 | 63 | |
suhasini | 13:5d3b478ea9c7 | 64 | sd_close(); */ |
suhasini | 13:5d3b478ea9c7 | 65 | |
suhasini | 13:5d3b478ea9c7 | 66 | //----------------------------- PEAK DETECTION AND HEART RATE CALCULATION --------------------------------------------------- |
suhasini | 13:5d3b478ea9c7 | 67 | // -------------------------------------- PEAK DETECTION ------------------------------------------------------------- |
suhasini | 13:5d3b478ea9c7 | 68 | |
suhasini | 13:5d3b478ea9c7 | 69 | // ------------------ Main loop --------------------------------- |
nikitateggi | 3:9a06c2bed650 | 70 | |
suhasini | 13:5d3b478ea9c7 | 71 | for(int i=0;i<N_ECG-10;i++){ |
suhasini | 13:5d3b478ea9c7 | 72 | if(ecg_buf[i]>ecg_buf[i+1]) |
suhasini | 13:5d3b478ea9c7 | 73 | { |
suhasini | 13:5d3b478ea9c7 | 74 | hi_val = ecg_buf[i]; //To find the high value |
suhasini | 13:5d3b478ea9c7 | 75 | //printf("high value= %d\n",hi_val); |
suhasini | 13:5d3b478ea9c7 | 76 | a = i; |
suhasini | 13:5d3b478ea9c7 | 77 | //printf("a= %d\n",a); |
suhasini | 13:5d3b478ea9c7 | 78 | hi_dif = hi_val-ecg_buf[a+10]; |
suhasini | 13:5d3b478ea9c7 | 79 | |
suhasini | 13:5d3b478ea9c7 | 80 | //a_dif = ecg_buf[a+2] - ecg_buf[a+1]; |
suhasini | 13:5d3b478ea9c7 | 81 | //printf("The difference between high and low value is = %d\n",hi_dif); |
suhasini | 13:5d3b478ea9c7 | 82 | |
suhasini | 13:5d3b478ea9c7 | 83 | // ---------------------------- If hi_val is greater than next ten input values, then compare the hi_val with the tenth input value. |
suhasini | 13:5d3b478ea9c7 | 84 | // If the diff is greater than 10000, then it is a valid peak (pls chk the below condition)-------------------------------------------------- |
suhasini | 13:5d3b478ea9c7 | 85 | // if((hi_dif > 10000) && ((a+10) < N_ECG)) |
suhasini | 13:5d3b478ea9c7 | 86 | if(hi_dif > 10000) |
suhasini | 13:5d3b478ea9c7 | 87 | { |
suhasini | 13:5d3b478ea9c7 | 88 | // if(a_dif <= 0) ------------------------ add this condition if needed ---------------------- |
suhasini | 13:5d3b478ea9c7 | 89 | // { |
suhasini | 13:5d3b478ea9c7 | 90 | pk_val[j] = hi_val; //if condition satisfied, put the "pk" value into "pk_val" buffer |
suhasini | 13:5d3b478ea9c7 | 91 | pc.printf("peak value= %d\n",pk_val[j]); |
suhasini | 13:5d3b478ea9c7 | 92 | pk_pos[j]=a; // also save the peak's position |
suhasini | 13:5d3b478ea9c7 | 93 | pc.printf("peak position is = %d\n",pk_pos[j]); |
suhasini | 13:5d3b478ea9c7 | 94 | i = a+120; // once confirmed that this is the necessary peak, skip the next 120 input values |
suhasini | 13:5d3b478ea9c7 | 95 | n = j; // where n is the number of peaks detected |
suhasini | 13:5d3b478ea9c7 | 96 | j = j+1; |
suhasini | 13:5d3b478ea9c7 | 97 | |
suhasini | 13:5d3b478ea9c7 | 98 | // printf("j after peak detection is= %d\n",j); |
suhasini | 13:5d3b478ea9c7 | 99 | // } |
suhasini | 13:5d3b478ea9c7 | 100 | } |
suhasini | 13:5d3b478ea9c7 | 101 | else |
suhasini | 13:5d3b478ea9c7 | 102 | { |
suhasini | 13:5d3b478ea9c7 | 103 | //h = a+1; |
suhasini | 13:5d3b478ea9c7 | 104 | i = a+1; |
suhasini | 13:5d3b478ea9c7 | 105 | // printf("i if peak not found is= %d\n",i); |
suhasini | 13:5d3b478ea9c7 | 106 | } |
suhasini | 13:5d3b478ea9c7 | 107 | // store the peak value position in "pk_pos" |
suhasini | 13:5d3b478ea9c7 | 108 | |
suhasini | 13:5d3b478ea9c7 | 109 | } |
suhasini | 13:5d3b478ea9c7 | 110 | } |
suhasini | 13:5d3b478ea9c7 | 111 | // ----------------- HEART RATE LOGIC --------------------------- |
nikitateggi | 3:9a06c2bed650 | 112 | |
suhasini | 13:5d3b478ea9c7 | 113 | for(int i = 0;i < n-1;i++) |
suhasini | 13:5d3b478ea9c7 | 114 | { |
suhasini | 13:5d3b478ea9c7 | 115 | pos_dif = pk_pos[i+1] - pk_pos[i]; // difference between two consequtive peaks |
suhasini | 13:5d3b478ea9c7 | 116 | pc.printf("peak position diff is = %f\n",pos_dif); |
suhasini | 13:5d3b478ea9c7 | 117 | //printf("peak position i value is = %d\n",i); |
suhasini | 13:5d3b478ea9c7 | 118 | t_pos_dif = pos_dif/fs; // sample difference between peak positions divided by sampling frequency gives the difference value in terms of actual time |
suhasini | 13:5d3b478ea9c7 | 119 | pc.printf("time in seconds is = %f\n",t_pos_dif); |
suhasini | 13:5d3b478ea9c7 | 120 | HR[i] = t_sec/t_pos_dif; //HR calculation |
suhasini | 13:5d3b478ea9c7 | 121 | pc.printf("Heart Rate is = %f\n",HR[i]); |
suhasini | 13:5d3b478ea9c7 | 122 | // n = i; |
suhasini | 13:5d3b478ea9c7 | 123 | HR1 = HR[0]; |
suhasini | 13:5d3b478ea9c7 | 124 | |
suhasini | 13:5d3b478ea9c7 | 125 | } |
suhasini | 13:5d3b478ea9c7 | 126 | // ---------------------- To average individual HRs for higher number of samples ----------------------- |
suhasini | 13:5d3b478ea9c7 | 127 | /* for(int i = 0;i < 5;i++) |
suhasini | 13:5d3b478ea9c7 | 128 | { |
suhasini | 13:5d3b478ea9c7 | 129 | HR_sum = HR[i]+HR_sum; |
suhasini | 13:5d3b478ea9c7 | 130 | } |
suhasini | 13:5d3b478ea9c7 | 131 | HR_avg = HR_sum/5; // To find average of all the individual HRs calculated |
suhasini | 13:5d3b478ea9c7 | 132 | printf("Heart Rate sum is = %f\n",HR_sum); |
suhasini | 13:5d3b478ea9c7 | 133 | printf("Denominator = %d\n",n); |
suhasini | 13:5d3b478ea9c7 | 134 | printf("Heart Rate = %f\n",HR_avg); |
suhasini | 13:5d3b478ea9c7 | 135 | */ |
suhasini | 13:5d3b478ea9c7 | 136 | return HR1; |
suhasini | 13:5d3b478ea9c7 | 137 | // return HR_avg; |
suhasini | 13:5d3b478ea9c7 | 138 | |
suhasini | 13:5d3b478ea9c7 | 139 | } // End of main function |
suhasini | 13:5d3b478ea9c7 | 140 |