Changes done in ECG and BT

Dependencies:   SDFileSystem ds3231 eeprom_Nikita mbed testUniGraphic_150217

Fork of merged_code2_20sept_2017_4th_oct_2017 by nikita teggi

bp.cpp

Committer:
nikitateggi
Date:
2017-06-17
Revision:
20:7c64e6ecad76
Parent:
19:1650bbc923cc
Child:
21:7ef1b0b40841

File content as of revision 20:7c64e6ecad76:

//-----------------------------------------------NEW BP code starts--------------------------------///



#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"
#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 bpr(USBTX,USBRX);
DigitalIn INTR(PTC7);

Timer t; 


//FILE *ecg;
//FILE *ppg;
    
 void bp(int pid) {
    
    uint8_t uch_dummy;
    uint32_t ppgdata; 
    uint8_t lead_reg=0;
    //int dummyconcat = 700000;
    int concatenate_value2 = 0;
    unsigned char chk = 1;

    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;
    //uint32_t bmax = 0;
    //uint32_t a;
    //uint32_t b;
    
   //int aloc = 0;
   //int bloc = 0;
   //int samples = 0;

    bpr.baud(baud_rate);

    freqset();               // setting the frequency
    setupfunc();              
    lead_reg=ecgsetupfunc();    // lead contact // 14/06
        
    maxim_max30102_reset();  // PPG reset
    wait_ms(20);
    maxim_max30102_init();
        
    chk = 1;
        
    wait(2);
    //bc.printf("BP start\n");  

    for(int i=0; i<500; i++)
    {
        
        concatenate_value2= readvalue();
        
        maxim_max30102_read_reg(0,&uch_dummy);
        while(INTR.read()==1); 
        maxim_max30102_read_fifo(&ppgdata); 
            
    }   
// BP Finger detect Function Added Nidhin 16/6/17 
// START    
 uint32_t un_max, un_min; // Declare two VARIABLE FOR MAX AND MIN
 un_max = 0;
un_min = 0x3FFF;
       
for(int i=0; i<500; i++)    // READS 500 SAMPLES TO SEE MAX AND MIN VAL DIFFERENCE
{        
maxim_max30102_read_reg(0,&uch_dummy);
while(INTR.read()==1); 
maxim_max30102_read_fifo(&ppgdata); 

if(un_min>ppgdata)
un_min=ppgdata;    //update signal min
if(un_max<ppgdata)
un_max=ppgdata; 

}  

if (((un_max -un_min) > 300) && (lead_reg==0)) // Checking for threshold 300 Added Nidhin 16/6/17

{ //Added Nidhin 16/6/17

    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;
    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<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<1024; i++)
        {
            concatenate_value2 = readvalue();
            //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(&concatenate_value2);
            
            maxim_max30102_read_reg(0,&uch_dummy);
            while(INTR.read()==1); 
            maxim_max30102_read_fifo(&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); // //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<1; j++) // changed to 16 from 8
    {
        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; 
            ppg = sd_BP_ppgwrite (&ppgdata);         //Change by Nidhin 30/5/2017 Direct writing to SD card.
        }
        
         
        
     }  
    fclose(ecg);
    fclose(ppg);
     
    maxim_max30102_reset();
    
    //-----Reading from file starts //
    
    //std::ifstream ec1("/sd/123_BP_ECG.csv");
    //std::ifstream pp1("/sd/123_BP_PPG.csv");
    
    int eloc = 0;
    int ploc = 0;
   
   
   eloc = sd_BP_ECGMAX(pid); // eloc = sd_BP_ECGMAX(123);
   ploc = sd_BP_PPGMAX(pid); // ploc = sd_BP_PPGMAX(123);
    
   //bc.printf("The ECG max is at : %d", eloc);
   //bc.printf("The PPG Max is at : %d", ploc);
   
   float PWV = 0;
   int d = 210000;
   int delta_t = 0;
   float SBP = 0;
   float DBP = 0;
   
   delta_t  = (2*(ploc - eloc));
   PWV = d/delta_t;
   
    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);
  
  }  //Added Nidhin 16/6/17  
  
  else  //Added Nidhin 16/6/17 
  {     //Added Nidhin 16/6/17 
    // Add display sequence for Finger detect fail  //Added Nidhin 16/6/17 
    maxim_max30102_reset();
    bpr.printf("no finger detect\n");
      screen_ecg_lead_bp_fingerdetect();
  }  //Added Nidhin 16/6/17 
     screen_ecg_bp() ; 
    // Only for testing
 //} //Commented Nidhin 16/6/17 
}