//|----------------------------------------------| //| TRINITY UNIVERSITY | //|Accessible Home Vital Signs Monitoring System | //| ENGR 4382-1 - Senior Design VIII | //| | //|Group Advisor: Dr. Farzan Aminian | //|Group Members: Michael Giese, Matt Bardwell, | //| Kevin Wallof, Katherine Avakian| //| Consultant: Adam Harwell | //|----------------------------------------------| #include #include #include #include #include "serial.cpp" struct device { int lcd; int spo2; int scale; int bp; }; //Device Open/Close Prototypes device DEVICE_Init(void); void DEVICE_Stop(int lcd_port, int spo2_port, int scale_port, int bp_port); //Menu Prototypes void MENU_Welcome(int lcd_port); void MENU_Skip(int lcd_port); void MENU_Done(int lcd_port); bool MENU_spo2(int lcd_port); bool MENU_scale(int lcd_port); bool MENU_bp(int lcd_port); bool getMouseIn(void); void MENU_scale_info01(int lcd_port); void MENU_scale_info02(int lcd_port); //Measurement Prototypes int M_spo2(int lcd_port, int spo2_port); float M_scale(int lcd_port, int scale_port); void M_bp(int lcd_port, int bp_port); int main(int argc, char* argv[]) { device Serial = DEVICE_Init(); // Serial Port Variables int lcd_port = Serial.lcd; int spo2_port = Serial.spo2; int scale_port = Serial.scale; int bp_port = Serial.bp; // File Save Variables int spo2; float weight; MENU_Welcome(lcd_port); bool menu_sel = MENU_scale(lcd_port); if(menu_sel) {MENU_Skip(lcd_port);} else { MENU_scale_info01(lcd_port); MENU_scale_info02(lcd_port); weight = M_scale(lcd_port, scale_port); } printf("Returned Weight: %.01flb.\n", weight); menu_sel = MENU_spo2(lcd_port); if(menu_sel) {MENU_Skip(lcd_port);} else { // MENU_spo2_info01(lcd_port); spo2 = M_spo2(lcd_port, spo2_port); } printf("Returned Blood Oxygen Level: %d%%\n", spo2); menu_sel = MENU_bp(lcd_port); if(menu_sel) {MENU_Skip(lcd_port);} else { // MENU_bp_info01(lcd_port); M_bp(lcd_port, bp_port); } // FILE *fstr; // fstr = fopen("file", "w"); // fprintf(fstr,"%d %d",weight,spo2); // fclose(fstr); MENU_Done(lcd_port); DEVICE_Stop(lcd_port, spo2_port, scale_port, bp_port); return 0; } device DEVICE_Init(void) { device PORT; PORT.lcd = LCD_Init(); sleep(1); close(PORT.lcd); sleep(1); PORT.lcd = LCD_Init(); PORT.lcd = LCD_Init(); PORT.spo2 = SPO2_Init(); PORT.scale = SCALE_Init(); PORT.bp = BP_Init(); return PORT; } void DEVICE_Stop(int lcd_port, int spo2_port, int scale_port, int bp_port) { close(lcd_port); close(spo2_port); close(scale_port); close(bp_port); return; } void MENU_Welcome(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " Trinity University "); LCD_Write(lcd_port, 1, " Accessible Home "); LCD_Write(lcd_port, 2, " Vital Signs "); LCD_Write(lcd_port, 3, " Monitoring System "); system("echo Welcome to the Trinity University Accessible Home Vital Signs Monitoring System. | festival --tts"); return; } void MENU_Done(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " Trinity University "); LCD_Write(lcd_port, 1, " Accessible Home "); LCD_Write(lcd_port, 2, " Vital Signs "); LCD_Write(lcd_port, 3, " Monitoring System "); system("echo Thank you for using the Trinity University Accessible Home Vital Signs Monitoring System. | festival --tts"); return; } void MENU_Skip(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, "Skipping Measurement"); LCD_Write(lcd_port, 1, " .... "); LCD_Write(lcd_port, 2, " .... "); LCD_Write(lcd_port, 3, " .... "); system("killall -9 festival && sleep 3 && echo You have chosen to skip the current measurement. | festival --tts"); return; } bool MENU_bp(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " Blood Pressure "); LCD_Write(lcd_port, 1, " and Heart Rate "); LCD_Write(lcd_port, 2, "(NO) (YES)"); LCD_Write(lcd_port, 3, "Skip Ready"); system("echo The system will now measure your blood pressure and heart rate. Press YES when ready or Press NO to skip the measurement. | festival --tts &"); return getMouseRaw(); } bool MENU_spo2(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " SpO2 Level "); LCD_Write(lcd_port, 1, " and Heart Rate "); LCD_Write(lcd_port, 2, "(NO) (YES)"); LCD_Write(lcd_port, 3, "Skip Ready"); system("echo The system will now measure your blood oxygen level and heart rate. Press YES when ready or Press NO to skip the measurement. | festival --tts &"); return getMouseRaw(); } bool MENU_scale(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " Weight "); LCD_Write(lcd_port, 1, " "); LCD_Write(lcd_port, 2, "(NO) (YES)"); LCD_Write(lcd_port, 3, "Skip Ready"); system("echo The system will now measure your weight. Press YES when ready or Press NO to skip the measurement. | festival --tts &"); return getMouseRaw(); } void MENU_scale_info01(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " .... "); LCD_Write(lcd_port, 1, "Press the button on "); LCD_Write(lcd_port, 2, "the scale\'s base. "); LCD_Write(lcd_port, 3, " .... "); system("echo Press the button on scale\\'s base. | festival --tts"); return; } void MENU_scale_info02(int lcd_port) { LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " .... "); LCD_Write(lcd_port, 1, "After button pressed"); LCD_Write(lcd_port, 2, "step onto the scale."); LCD_Write(lcd_port, 3, " .... "); system("echo After pressing the button, step onto the scale to obtain your current weight. | festival --tts"); return; } int M_spo2(int lcd_port, int spo2_port) { //Structure - Holds all blood oximeter readings. int spo2vals[3]; //LCD and TTS Messages (reused variables) char message1[90] = ""; char message2[90] = ""; char message3[90] = ""; //String Variables char svar2[4]=""; char svar3[4]=""; //Time Averaging Variables int hr_sum = 0; int spo2_sum = 0; //Conditional Variables int i; int iterations = 10; int throwout = 10; int tcount = 0; bool a = false, b = false; sprintf(message1, "%s", "Valid Reading: "); sprintf(message2, "%s", "Heart Rate: "); sprintf(message3, "%s", "Blood/Oxygen: "); LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, "Valid Reading: No"); LCD_Write(lcd_port, 1, "Heart Rate: NA"); LCD_Write(lcd_port, 2, "Blood/Oxygen: NA"); LCD_Write(lcd_port, 3, " "); for(i = 0; i < iterations + throwout; i++) { SPO2_Get(spo2_port, spo2vals); printf("Valid Reading: %d\n",spo2vals[0]); printf("Heart Rate: %d\n",spo2vals[1]); printf("Blood Oxygen Level: %d%%\n",spo2vals[2]); sprintf(message1, "%s", "Valid Reading: "); sprintf(message2, "%s", "Heart Rate: "); sprintf(message3, "%s", "Blood/Oxygen: "); sprintf(svar2, "%d", spo2vals[1]); sprintf(svar3, "%d", spo2vals[2]); if (spo2vals[0] == 128 || spo2vals[0] == 129 || spo2vals[0] == 130 || spo2vals[0] == 131) { strcat(message1, "Yes"); strcat(message2, svar2); strcat(message3, svar3); strcat(message3, "%"); if (tcount >= throwout) { hr_sum += spo2vals[1]; spo2_sum += spo2vals[2]; } tcount++; a = true; b = false; } else { strcat(message1, "No "); strcat(message2, "NA"); strcat(message3, "NA"); i--; b = true; } if (a) { LCD_Write(lcd_port, 0, message1); LCD_Write(lcd_port, 1, message2); LCD_Write(lcd_port, 2, message3); LCD_Write(lcd_port, 3, " "); if (b) a = false; b = false; } } //Time Averaging hr_sum/=iterations; spo2_sum/=iterations; sprintf(svar2, "%d", hr_sum); sprintf(svar3, "%d", spo2_sum); sprintf(message2, "%s", "Heart Rate: "); sprintf(message3, "%s", "Blood Oxygen: "); strcat(message2, svar2); strcat(message3, svar3); strcat(message3, "%"); //Average Data Reading LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, "Average "); LCD_Write(lcd_port, 1, message2); LCD_Write(lcd_port, 2, "Average "); LCD_Write(lcd_port, 3, message3); //TTS, Average Heart Rate and SpO2 Level sprintf(message1, "%s", "echo Your average heart rate is "); sprintf(message2, "%s", "echo Your average blood oxygen level is "); strcat(message1, svar2); strcat(message2, svar3); strcat(message1, " beats per minute. | festival --tts"); strcat(message2, " percent. | festival --tts"); system(message1); system(message2); //Return Contains Average Blood Oxygen Level For File Save... return spo2_sum; } float M_scale(int lcd_port, int scale_port) { //LCD and TTS Messages char message2[90] = ""; char message3[90] = ""; SCALE_Val scalevals = SCALE_Get(scale_port); printf("Status: %s\n", scalevals.status); printf("Weight: %s %s\n", scalevals.weight, scalevals.units); sprintf(message2, "%s", "Status: "); sprintf(message3, "%s", "Weight: "); if (scalevals.status[0] == 'S') { strcat(message2, "Stable"); strcat(message3, scalevals.weight); strcat(message3, scalevals.units); } else if (scalevals.status[0] == 'U') { strcat(message2, "Unstable"); strcat(message3, scalevals.weight); strcat(message3, scalevals.units); } else if (scalevals.status[0] == 'O') { strcat(message2, "Overload"); strcat(message3, scalevals.weight); strcat(message3, scalevals.units); } else { strcat(message2, "Error"); strcat(message3, "Error"); } //Weight Measurement LCD_Clear(lcd_port); LCD_Write(lcd_port, 0, " "); LCD_Write(lcd_port, 1, message2); LCD_Write(lcd_port, 2, message3); LCD_Write(lcd_port, 3, " "); //TTS, current weight sprintf(message2, "%s", "echo Your current weight is "); strcat(message2, scalevals.weight); if (scalevals.units[0] == 'l') { strcat(message2, " pounds. | festival --tts"); } else if (scalevals.units[0] == 'k') { strcat(message2, " kilograms. | festival --tts"); } else { strcat(message2, " unknown units. | festival --tts"); } system(message2); return atof(scalevals.weight); } void M_bp(int lcd_port, int bp_port) { printf("Blood Pressure:\n"); return; }