![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Tapton School Project to monitor and log SEN students physiological condition using GSR (conductivity) & Heart Rate and displaying output and logging the data to an SD card
Revision 0:0e26bf847b57, committed 2018-02-09
- Comitter:
- raheel123
- Date:
- Fri Feb 09 08:34:23 2018 +0000
- Commit message:
- Tapton school SENtinel project
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Clock.cpp Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,66 @@ +#include <mbed.h> + +// The us ticker is a wrapping uint32_t. We insert interrupts at +// 0, 0x40000000, 0x8000000, and 0xC0000000, rather than just 0 or just 0xFFFFFFFF because there is +// code that calls interrupts that are "very soon" immediately and we don't +// want that. Also because if we only use 0 and 0x80000000 then there is a chance it would +// be considered to be in the past and executed immediately. + +class ExtendedClock : public TimerEvent +{ +public: + ExtendedClock() + { + // This also starts the us ticker. + insert(0x40000000); + } + + float read() + { + return read_us() / 1000000.0f; + } + + uint64_t read_ms() + { + return read_us() / 1000; + } + + uint64_t read_us() + { + return mTriggers * 0x40000000ull + (ticker_read(_ticker_data) & 0x3FFFFFFF); + } + +private: + virtual void handler() + { + ++mTriggers; + // If this is the first time we've been called (at 0x4...) + // then mTriggers now equals 1 and we want to insert at 0x80000000. + insert((mTriggers+1) * 0x40000000); + } + + // The number of times the us_ticker has rolled over. + unsigned int mTriggers; + //mTriggers = 0; +}; + +static ExtendedClock _GlobalClock; + +// Return the number of seconds since boot. +float clock_s() +{ + return _GlobalClock.read(); +} + +// Return the number of milliseconds since boot. +uint64_t clock_ms() +{ + return _GlobalClock.read_ms(); +} + +// Return the number of microseconds since boot. +uint64_t clock_us() +{ + return _GlobalClock.read_us(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Clock.h Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,13 @@ +#pragma once + +#include <stdint.h> + +// Return the number of seconds since boot. +float clock_s(); + +// Return the number of milliseconds since boot. +uint64_t clock_ms(); + +// Return the number of microseconds since boot. +uint64_t clock_us(); +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DFRobot_Heartrate.cpp Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,266 @@ +#include "DFRobot_Heartrate.h" + +#define debug_ 1 + + +DigitalIn hrme (p21); + Serial pcu (USBTX, USBRX); // pc's usb tx, rx + +unsigned int value[SAMPLE_NUMBER]={0}; ///< Initialize sampling point value +unsigned int valueCount_ = 255; +/*! +* @brief Get a Sample values +* +* @brief Get a Sample values +* +* @return unsigned int +*/ +unsigned int DFRobot_Heartrate::getValue(unsigned int pin) +{ + valueCount_++; + if(valueCount_ >= SAMPLE_NUMBER){ + pcu.printf("Resetting counter"); + valueCount_ = 0; + } + value[valueCount_] = hrme; + return(value[valueCount_]); + +} + +/*! +* @brief Get a sample +* +* @brief Get the current location +* +* @return unsigned int +*/ +unsigned int DFRobot_Heartrate::getCnt(void) +{ + return(valueCount_); +} + +/*! +* @brief Points to a valid node of the wave rise +* +* @brief When the sampling point value increased 4 times in a row, considered to be a heartbeat +* +* @return char +*/ + +char DFRobot_Heartrate::maxNumber(unsigned int count) +{ + unsigned int temp1,temp2; + for(int i=0;i<4;i++){ + if(count<i){ + temp1 = SAMPLE_NUMBER+count-i; + }else{ + temp1 = count-i; + } + if(count<i+1){ + temp2 = SAMPLE_NUMBER+(count-1)-i; + }else{ + temp2 = (count-1)-i; + } + if(value[temp1]<=value[temp2])return(0); + } + if(valueFlag){ + valueFlag=1; + return(0); + }else{ + valueFlag=1; + return(1); + } +} + +/*! +* @brief Waveform down processing +* +* @brief When the sample values decreased four times in a row, clear the heartbeat +* +* @return void +*/ + +void DFRobot_Heartrate::minNumber(unsigned int count) +{ + unsigned int temp1,temp2; + for(int i=0;i<4;i++){ + if(count<i){ + temp1 = SAMPLE_NUMBER+count-i; + }else{ + temp1 = count-i; + } + if(count<i+1){ + temp2 = SAMPLE_NUMBER+(count-1)-i; + }else{ + temp2 = (count-1)-i; + } + if(value[temp1]>=value[temp2])return; + } + valueFlag = 0; + +} + + +/*! +* @brief Get heart rate value +* +* @brief Sample ten times in a row beating heart rate value is computed +* +* @return unsigned int +*/ + +unsigned int DFRobot_Heartrate::analogGetRate(void) +{ + + static unsigned int timeFlag; + static unsigned long sampleTime[10]; + unsigned long valueTime_; + minNumber(valueCount_); + if(maxNumber(valueCount_)){ + nowTim = clock_ms(); + unsigned int difTime = nowTim - lastTim; + lastTim = nowTim; + + if(difTime>300 || difTime<2000){ + sampleTime[timeFlag++] = difTime; + if(timeFlag > 9)timeFlag=0; + } + if(0 == sampleTime[9]){ + pcu.printf("Wait for valid data !"); + return(0); + } + + unsigned int Arrange[10]={0}; + for(int i=0;i<10;i++){ + Arrange[i] = sampleTime[i]; + } + unsigned int Arrange_=0; + for(int i=9;i>0;i--){ + for(int j=0;j<i;j++){ + if(Arrange[j] > Arrange[j+1]){ + Arrange_ = Arrange[j]; + Arrange[j] = Arrange[j+1]; + Arrange[j+1] = Arrange_; + } + } + } + if((Arrange[7]-Arrange[3])>150){ + pcu.printf("Wait for valid data !"); + return(0); + } + + Arrange_ = 0; + for(int i=3;i<=7;i++){ + Arrange_ += Arrange[i]; + } + + valueTime_ = 300000/Arrange_;///<60*1000*(7-2) + return((unsigned int)valueTime_); + } + return(0); +} + +/*! +* @brief Get heart rate value +* +* @brief Sample ten times in a row beating heart rate value is computed +* +* @return unsigned int +*/ + +unsigned int DFRobot_Heartrate::digitalGetRate(void) +{ + + static unsigned int timeFlag; + static unsigned long sampleTime[10]; + unsigned long valueTime_; + unsigned int count_; + + if(valueCount_){ + count_ = valueCount_-1; + }else{ + count_ = SAMPLE_NUMBER-1; + } + if((value[valueCount_]==1)){ + + nowTim = clock_ms(); + unsigned int difTime = nowTim - lastTim; + lastTim = nowTim; + pcu.printf("dif time %d, valueCount_ %d, value[valueCount_] %d\n\r ", difTime, valueCount_, value[valueCount_]); + + if(difTime>300 || difTime<2000){ + sampleTime[timeFlag++] = difTime; + if(timeFlag > 9)timeFlag=0; + } + if(0 == sampleTime[9]){ + pcu.printf("Wait for valid data !"); + return(0); + } + + unsigned int Arrange[10]={0}; + for(int i=0;i<10;i++){ + Arrange[i] = sampleTime[i]; + } + unsigned int Arrange_=0; + for(int i=9;i>0;i--){ + for(int j=0;j<i;j++){ + if(Arrange[j] > Arrange[j+1]){ + Arrange_ = Arrange[j]; + Arrange[j] = Arrange[j+1]; + Arrange[j+1] = Arrange_; + } + } + } + if((Arrange[7]-Arrange[3])>120){ + pcu.printf("Wait for valid data !"); + return(0); + } + + Arrange_ = 0; + for(int i=3;i<=7;i++){ + Arrange_ += Arrange[i]; + } + + valueTime_ = 300000/Arrange_;///<60*1000*(7-2) + return((unsigned int)valueTime_); + } + return(0); + +} + +/*! +* @brief Get heart rate value +* +* @brief Sample ten times in a row beating heart rate value is computed +* +* @return unsigned int +*/ +unsigned int DFRobot_Heartrate::getRate(void) +{ + if(mode_ == DIGITAL_MODE){ + return(digitalGetRate()); + }else{ + return(analogGetRate()); + } +} + + + +/****************************************************************************** + Copyright (C) <2015> <linfeng> + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + Contact: Musk.lin@dfrobot.com + ******************************************************************************/ + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DFRobot_Heartrate.h Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,68 @@ + +/*! +* @file DFRobot_Heartrate.h +* @brief Heartrate.h detailed description for Heartrate.cpp +* +* This is written for the heart rate sensor the company library. Mainly used for real +* time measurement of blood oxygen saturation, based on measured values calculate heart rate values. +* +* @author linfeng(Musk.lin@dfrobot.com) +* @version V1.0 +* @date 2015-12-24 +*/ + +#ifndef __DFRobot_HEARTRATE__H +#define __DFRobot_HEARTRATE__H + + +//#include "Arduino.h" +#include "Clock.h" +#include "mbed.h" +#define ANALOG_MODE 0 +#define DIGITAL_MODE 1 + +#include "SMARTGPU2.h" + +#define SAMPLE_NUMBER 300 + + +class DFRobot_Heartrate +{ +public: + DFRobot_Heartrate(char mode) { mode_ = mode; } + char maxNumber(unsigned int count); + void minNumber(unsigned int count); + unsigned int analogGetRate(void); + unsigned int digitalGetRate(void); + unsigned int getRate(void); + unsigned int getCnt(void); + unsigned int getValue(unsigned int pin); + + +private: + + unsigned int mode_; + unsigned int valueCount_; + unsigned int valueFlag; + unsigned int nowTim,lastTim; + +}; + +#endif + +/****************************************************************************** + Copyright (C) <2015> <linfeng> + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + Contact: Musk.lin@dfrobot.com + ******************************************************************************/ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SMARTGPU2_copy.lib Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mptapton/code/SMARTGPU2/#8b0a0688cbb5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,794 @@ +/**************************************************************************************/ +/**************************************************************************************/ +/*SMARTGPU2 intelligent embedded graphics processor unit + those examples are for using the SMARTGPU2 with the mbed microcontoller, just connect tx,rx,and reset + Board: + http://www.vizictechnologies.com/ + + www.vizictechnologies.com + Vizic Technologies copyright 2014 */ +/**************************************************************************************/ +/**************************************************************************************/ + +#include "mbed.h" +#include "SMARTGPU2.h" +#include "DFRobot_Heartrate.h" +#include "inttypes.h" +AnalogIn hrm (p16); +DigitalIn DigHRM (p21); +AnalogIn gsr(p19); // alalogue input pin for the galvanic skin response sensor + + +Serial pc(USBTX, USBRX); // pc's usb tx, rx + +DigitalOut led_1(LED1); +DigitalOut led_2(LED2); +DigitalOut led_3(LED3); +DigitalOut led_4(LED4); +int rateValue; +//const char rateVal = &rateValue; +DFRobot_Heartrate heartrate(DIGITAL_MODE); +SMARTGPU2 lcd(TXPIN,RXPIN,RESETPIN); //create our object called "lcd" + +TIME timeRTC; +STATE stateRTC; +/***************************************************/ +/***************************************************/ +void initializeSmartGPU2(void){ //Initialize SMARTGPU2 Board + lcd.reset(); //physically reset SMARTGPU2 + lcd.start(); //initialize the SMARTGPU2 processor +} + +float gsrValue = 0,gsrbaseline = 0,hrmValue = 0,hrmbaseline = 0; + +void Get_gsrBaseline(void) +{ + double gsrsum = 0; + wait(1); + for(int i=0; i<500; i++) { + gsrValue = gsr; + gsrsum += gsrValue; + wait(0.005); + } + gsrbaseline = gsrsum/500; +} + +// calculate hrmbaseline to compare against +void Get_hrmBaseline(void) +{ + double hrmsum = 0; + wait(1); + for(int i=0; i<500; i++) { + hrmValue = hrm; + hrmsum += hrmValue; + + wait(0.005); + } + hrmbaseline = hrmsum/500; +} + +FILERESULT fres; //create the variable that will store all SMARTGPU2 commands responses +int sdok; + +unsigned int row=10; + +//function that checks if the SD card operation had a problem +void die(unsigned char response){ //if the response is different than OK, print and wait for 3 seconds +// NUMBEROFBYTES charsPrint; + pc.printf("%d\r\n",response); //write to the USB PC if there is a problem + if(response!=F_OK){ + pc.printf("Error on microSD... \r\n"); + wait(3); + // while(1); + } + sdok=1; +} + + +int main() { //start of main program ******** + + SMARTGPUREPLY res; // responses from GPU + POINT point; + + int but1; // button pressed variable + pc.baud(9600); + + initializeSmartGPU2(); //Init communication with SmartGPU2 board + + lcd.baudChange(BAUD6); //set a fast baud! for fast drawing + + res = lcd.setupRTC(&stateRTC); // start the SmartGPU2 Real Time Clock RTC + + NUMBEROFBYTES bytes; // for use in text string call + + float gsrValue = 0,gsrbaseline = 0,aHRMvalue = 0,dHRMvalue = 0; + + while(1) + { // set up a loop to keep endless operation and changes to user operation + pc.printf("Start of Main\r\n"); + but1 = 0; + gsrbaseline = gsr; + lcd.erase(); + lcd.setTextColour(WHITE); + lcd.setTextSize(FONT1); + + //draw the object button1 and button2 + lcd.objButton(10, 170, 150, 220, DESELECTED, "Change?"); + lcd.objButton(170, 170, 309, 220, DESELECTED, "Continue"); + + res = lcd.getRTCTimeDate(&timeRTC); + lcd.string(70,40,300,60,"Hour Minutes Seconds", &bytes); + lcd.string(0,60,69,80,"Time:", &bytes); + lcd.string(70,100,300,120,"Day Month Year", &bytes); + lcd.string(0,120,100,140,"Date:", &bytes); + + lcd.printNumber(85,60, timeRTC.hour); + lcd.printNumber(130,60, timeRTC.minute); + lcd.printNumber(190,60, timeRTC.second); + lcd.printNumber(85,120, timeRTC.day); + lcd.printNumber(130,120, timeRTC.month); + lcd.printNumber(190,120, timeRTC.year); + +lcd.setTextColour(GREEN); +lcd.string(0,0,300,20,"Press Change? to set the time", &bytes); +lcd.setTextColour(WHITE); +pc.printf("TEST\r\n");//debug +but1=0; // prepare for catching a button press +led_2=0; //debug + while (but1 == 0) //wait for button press loop + { + //ask for a touch + if(lcd.touchScreen(&point)==VALID) + { //if a touch on screen is valid check which button + if(point.y>170 && point.y<220 && point.x<160) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 170, 150, 220, SELECTED, "Change Time?"); + wait_ms(50); + lcd.objButton(10, 170, 150, 220, DESELECTED, "Change Time?"); + pc.printf("change time button pressed\r\n"); //debug + timeRTC.hour = 8; // SET DATE AND TIME VALUES HERE ONCE + timeRTC.minute = 45; + timeRTC.second = 1; + timeRTC.day = 8; + timeRTC.month = 2; + timeRTC.year = 2018; + res = lcd.setRTCTimeDate(&timeRTC); // send the above values to the RTC + wait(2); + res = lcd.getRTCTimeDate(&timeRTC); // get the RTC values back + lcd.setTextColour(WHITE); + lcd.drawRectangle(200, 0, 318, 20, BLACK, FILL); // date refresh + lcd.drawRectangle(85, 60, 300, 80, BLACK, FILL); //time refresh + lcd.drawRectangle(85, 120, 300, 110, BLACK, FILL); //clears the area of screen with numbers so not to overwrite causing blurred numbers + lcd.printNumber(85,60, timeRTC.hour); + lcd.printNumber(130,60, timeRTC.minute); + lcd.printNumber(190,60, timeRTC.second); + lcd.printNumber(85,120, timeRTC.day); + lcd.printNumber(130,120, timeRTC.month); + lcd.printNumber(190,120, timeRTC.year); + lcd.drawRectangle(0, 0, 300, 20, BLACK, FILL); // date refresh + lcd.string(0,0,300,20,"OK new time set from storred values", &bytes); + wait(3);// display for 2 seconds + led_2=1; + but1 = 1; // button was pressed so set var to get out of this button press loop + } //end of Button 1 pressed IF + + //IF BUTTON2 + if(point.y>170 && point.y<220 && point.x>160) + { //if the touch on button2 draw the object button2 as SELECTED + lcd.objButton(170, 170, 309, 220, SELECTED, "Continue"); + wait_ms(50); + lcd.objButton(170, 170, 309, 220, DESELECTED, "Continue"); + but1 = 1;// button was pressed so set var to get out of thi sbutton press loop + pc.printf("continue button pressed\r\n"); //debug + }//end of Button 2 pressed IF + } // end of has a valid screen touch been made IF + } //end of second wait for button press while statement + +but1=0; //reset button pressed var +int candidate=0; //set up a var to track which candidate to be monitored +lcd.erase(); //clear the screen +lcd.setTextColour(WHITE); + +//draw the object button1 through button4 for Candidate selection +lcd.string(0,0,300,20,"Select the Candidate to be monitored", &bytes); +lcd.objButton(10, 30, 200, 60, DESELECTED, "Candidate 1"); +lcd.objButton(10, 85, 200, 120, DESELECTED, "Candidate 2"); +lcd.objButton(10, 145, 200, 180, DESELECTED, "Candidate 3"); +lcd.objButton(10, 205, 200, 238, DESELECTED, "Candidate 4"); + +while (but1 == 0) //wait for button press loop + { + //pc.printf("endless time loop\r\n"); //debug + led_4=!led_4; //debug + if(lcd.touchScreen(&point)==VALID) + { //if a touch on screen is valid check which button + if(point.y>30 && point.y<60 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 30, 200, 60, SELECTED, "Candidate 1"); + wait_ms(50); + lcd.objButton(10, 30, 200, 60, DESELECTED, "Candidate 1"); + pc.printf("Candidate 1\r\n"); //debug + but1=1; + candidate=1; + }// end of if button 1 pressed + + if(point.y>85 && point.y<120 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 85, 200, 120, SELECTED, "Candidate 2"); + wait_ms(50); + lcd.objButton(10, 85, 200, 120, DESELECTED, "Candidate 2"); + pc.printf("Candidate 2\r\n"); //debug + but1=1; + candidate=2; + }// end of if button 2 pressed + + if(point.y>145 && point.y<180 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 145, 200, 180, SELECTED, "Candidate 3"); + wait_ms(50); + lcd.objButton(10, 145, 200, 180, DESELECTED, "Candidate 3"); + pc.printf("Candidate 3\r\n"); //debug + but1=1; + candidate=3; + }// end of if button 3 pressed + + if(point.y>205 && point.y<238 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 205, 200, 238, SELECTED, "Candidate 4"); + wait_ms(50); + lcd.objButton(10, 205, 200, 238, DESELECTED, "Candidate 4"); + pc.printf("Candidate 4\r\n"); //debug + but1=1; + candidate=4; + }// end of if button 4 pressed + }// end of if screen touched +} //end of the button press while + +wait(1); +lcd.erase(); //clear the screen +lcd.setTextColour(CYAN); +lcd.setTextSize(FONT1); +if (candidate==0)lcd.string(0,0,300,20,"NO Candidate selected", &bytes); +if (candidate==1)lcd.string(0,0,300,20,"Candidate 1 selected", &bytes); +if (candidate==2)lcd.string(0,0,300,20,"Candidate 2 selected", &bytes); +if (candidate==3)lcd.string(0,0,300,20,"Candidate 3 selected", &bytes); +if (candidate==4)lcd.string(0,0,300,20,"Candidate 4 selected", &bytes); +wait(1); +sdok=0; + + + unsigned int dirs=0, files=0, sdcardavail=0; + NUMBEROFBYTES charsPrinted; + + unsigned char response; + + fres=lcd.SDFgetList(&dirs,&files); //obtain dirs and files + die(fres); + if(sdok==1) + {//if the SD card is there and ok list the directory contents + pc.printf("SD card is there\r\n"); + sdcardavail=1; // set to determine if user given choice to save session to SD card + } //end of if statement to check if SD disc there and ok +wait(1); + +int storetosd=0; //set up a var to track if seesion to be saved to disc if so at what intervals + +if(sdcardavail==1) + { //only give these options if a SD card is available and ok + but1=0; //reset button pressed var + lcd.erase(); //clear the screen + lcd.setTextColour(WHITE); + //draw the object button1 through button4 for save to disc option selection + lcd.string(0,0,315,20,"Select if session to be saved to disc, if so, select interval required", &bytes); + lcd.objButton(10, 30, 200, 60, DESELECTED, "Don't Save"); + lcd.objButton(10, 85, 200, 120, DESELECTED, "Save, 1 minute"); + lcd.objButton(10, 145, 200, 180, DESELECTED, "Save, 15 minutes"); + lcd.objButton(10, 205, 200, 238, DESELECTED, "Save, 30 minutes"); + + while(but1 == 0) //wait for button press loop + { + //pc.printf("endless time loop\r\n"); //debug + led_4=!led_4; //debug + if(lcd.touchScreen(&point)==VALID) + { //if a touch on screen is valid check which button + if(point.y>30 && point.y<60 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 30, 200, 60, SELECTED, "Don't Save"); + wait_ms(50); + lcd.objButton(10, 30, 200, 60, DESELECTED, "Don't Save"); + pc.printf("Don't Save\r\n"); //debug + but1=1; + storetosd=1; + }// end of if button 1 pressed + + if(point.y>85 && point.y<120 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 85, 200, 120, SELECTED, "Save, 1 minute"); + wait_ms(50); + lcd.objButton(10, 85, 200, 120, DESELECTED, "Save, 1 minute"); + pc.printf("Save 1 minute\r\n"); //debug + but1=1; + storetosd=2; + }// end of if button 2 pressed + + if(point.y>145 && point.y<180 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 145, 200, 180, SELECTED, "Save, 15 minutes"); + wait_ms(50); + lcd.objButton(10, 145, 200, 180, DESELECTED, "Save, 15 minutes"); + pc.printf("Save, 15 minutes\r\n"); //debug + but1=1; + storetosd=3; + }// end of if button 3 pressed + + if(point.y>205 && point.y<238 && point.x<200) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 205, 200, 238, SELECTED, "Save, 30 minutes"); + wait_ms(50); + lcd.objButton(10, 205, 200, 238, DESELECTED, "Save, 30 minutes"); + pc.printf("Save, 30 minutes\r\n"); //debug + but1=1; + storetosd=4; + }// end of if button 4 pressed + }// end of if screen touched + } //end of the button press while + }//end of if SD card available statement + +//wait(3); +lcd.erase(); //clear the screen +lcd.setTextColour(CYAN); +lcd.setTextSize(FONT1); +if (storetosd==1)lcd.string(0,0,300,20,"Don't Save", &bytes); +if (storetosd==2)lcd.string(0,0,300,20,"1 minute selected", &bytes); +if (storetosd==3)lcd.string(0,0,300,20,"15 minutes selected", &bytes); +if (storetosd==4)lcd.string(0,0,300,20,"30 minutes selected", &bytes); +if (storetosd==0)lcd.string(0,0,300,20,"nothing selected", &bytes); +//wait(5); + + + + + lcd.erase(); + lcd.setTextColour(GREEN); +if (candidate==0)lcd.string(0,0,150,20,"NO Candidate selected", &bytes); +if (candidate==1)lcd.string(0,0,150,20,"Candidate 1", &bytes); +if (candidate==2)lcd.string(0,0,150,20,"Candidate 2", &bytes); +if (candidate==3)lcd.string(0,0,150,20,"Candidate 3", &bytes); +if (candidate==4)lcd.string(0,0,150,20,"Candidate 4", &bytes); + + lcd.setTextColour(WHITE); + lcd.string(80,220,310,238," GSR HRM OVL",&bytes); + + lcd.string(0,60,100,80,"GSR Base", &bytes); //write a string on the screen + lcd.string(0,81,100,100,"GSR Actual", &bytes); //write a string on the screen + lcd.string(0,101,100,120,"HRM Digital", &bytes); //write a string on the screen + lcd.string(0,121,100,150,"Overall", &bytes); //write a string on the screen + +float gsrdelta,gsrdeltaabs,hrmdeltaabs,hrmdelta,gsr1, gsr2, gsr3, hrm10, hrm25, hrm5, hrm15; + + Get_gsrBaseline(); + Get_hrmBaseline(); + pc.printf("Calculating Average hrm:%f\n",hrmbaseline); + + + + gsr1 = (gsrbaseline+(0.05 * gsrbaseline)); //level 1 GSR Top boundry 5% + gsr2 = (gsrbaseline+(0.10 * gsrbaseline)); //level 2 GSR Top boundry 10% + gsr3 = (gsrbaseline+(0.15 * gsrbaseline)); //level 3 GSR Top boundry 15% + hrm25 = (hrmbaseline+(0.025 * hrmbaseline)); //level 1 HRM Top boundry 25% + hrm15 = (hrmbaseline+(0.015 * hrmbaseline)); //level 2 HRM Top boundry 15% + hrm10 = (hrmbaseline+(0.010 * hrmbaseline)); //level 3 HRM Top boundry 10% + hrm5 = (hrmbaseline-(0.005 * hrmbaseline)); //level 4 HRM Top boundry 5% + +but1=0; +lcd.setTextColour(WHITE); + //draw the object button1 Exit +unsigned int writtenBytes=0; + + if(storetosd>1 && storetosd<5) + { //open a file on the SD card called log.txt + pc.printf("Try to open a file on the SD card called log.txt\r\n"); + //try to open the file + fres=lcd.SDFopenFile("log.txt", WRITEONLY, WORKSPACE0); //Try to open the file in write only mode in the workspace block 0 + if(fres!=F_OK){ //If the file doesn't Open is because it doesn't exist + pc.printf("File doesn't exist, creating log.txt file...\r\n"); + fres=lcd.SDFnewFile("log.txt"); //Try to create the file + die(fres); //If any error report it + fres=lcd.SDFopenFile("log.txt", WRITEONLY, WORKSPACE0); //Try to open the created file + die(fres); //If any error report it + } + char messagetitle[100]="Candidate, Interval , GSR Base , GSR , HRM , Day , Month , Hour , Minute , Second \n"; + + res = lcd.getRTCTimeDate(&timeRTC); // get the RTC values back + lcd.SDFsetFileTimeDate(&timeRTC, "log.txt"); //Set Time and Date to the now existing log.txt file + pc.printf("***********saving titles to file \r\n"); + writtenBytes=0; //, readbytes=0; //i=0; + fres=lcd.SDFwriteFile(messagetitle, sizeof(messagetitle), &writtenBytes, WORKSPACE0); //write to the open file in WORKSPACE0 size of message in bytes and store the successfully written Bytes on writtenBytes variable + die(fres); //If any error report it + lcd.SDFsaveFile(WORKSPACE0); //Save changes in the file contained in WORKSPACE0 + } + +char textStringgsr[9],textStringgsrb[9],textStringhrm[9],textday[3],textmonth[3],texthour[3],textminute[3],textsecond[3]; //textStringhrmb[9] if baseline achieved later +int timestore1,timestore2,length,k=0,j=0,l=0; + + res = lcd.getRTCTimeDate(&timeRTC); // get the RTC values back + lcd.setTextColour(WHITE); + lcd.string(0,21,318,40,"Time:", &bytes); + lcd.printNumber(70,21, timeRTC.hour); // write them to the TFT + lcd.printNumber(95,21, timeRTC.minute); + // lcd.printNumber(170,21, timeRTC.second); + lcd.printNumber(200,0, timeRTC.day); + lcd.printNumber(230,0, timeRTC.month); + lcd.printNumber(260,0, timeRTC.year); + timestore1 = timeRTC.minute; // store value to test later for change to help screen refresh + timestore2 = timeRTC.second; // store value to test later for change to help screen refresh +int w=0;// used for overal feeling notification + +lcd.objButton(10, 180, 50, 215, DESELECTED, "EXIT"); // draw the object button to provide exit + +while (but1 == 0) //wait for button press loop + { + + gsrValue = gsr; + aHRMvalue = hrm; + dHRMvalue = DigHRM; + // wait(1); + lcd.setTextColour(WHITE); + lcd.printNumber(110,60, gsrbaseline); + lcd.printNumber(110,81, gsrValue); + //lcd.printNumber(110,101, rateValue);// we are printing here + //lcd.printNumber(110,121, dHRMvalue); + res = lcd.getRTCTimeDate(&timeRTC); // get the RTC values back + lcd.setTextColour(WHITE); + lcd.string(0,21,318,40,"Time:", &bytes); + if(timestore1 != timeRTC.minute) //a minute has expired so send non critical data to screen + { + led_1= !led_1; //toggle led 1 to show activated + lcd.drawRectangle(200, 0, 318, 20, BLACK, FILL); // date refresh + lcd.drawRectangle(70, 21, 300, 42, BLACK, FILL); //time refresh + + lcd.printNumber(70,21, timeRTC.hour); // write them to the TFT + lcd.printNumber(95,21, timeRTC.minute); + // lcd.printNumber(170,21, timeRTC.second); + lcd.printNumber(200,0, timeRTC.day); + lcd.printNumber(230,0, timeRTC.month); + lcd.printNumber(260,0, timeRTC.year); + timestore1 = timeRTC.minute; //store new minute value + } + gsrValue = gsr; //put actual gsr pin input into a variable + gsrdelta = gsrbaseline - gsrValue; + gsrdeltaabs = abs(gsrdelta); + + if (gsrdeltaabs < gsrbaseline) + { + gsrdeltaabs = gsrbaseline + gsrdeltaabs; // make all negative values regarding baseline +ve + } + if((gsrdeltaabs >= gsrbaseline) && (gsrdeltaabs <= gsr1)) // check for being upto 5% of baseline + { + lcd.drawRectangle(100, 180, 140, 215, GREEN, FILL); + // x, y, width, height, colour + w=1; //for overal feeling indication + } + else if((gsrdeltaabs > gsr1) && (gsrdeltaabs <= gsr2)) // check for being > 6% to 10% of baseline + { + lcd.drawRectangle(100, 180, 140, 215, YELLOW, FILL); + //x, y, width, height, colour + w=2; //for overal feeling indication + } + else if((gsrdeltaabs > gsr2) && (gsrdeltaabs <= gsr3)) // check for being > 11% to 15% of baseline + { + lcd.drawRectangle(100, 180, 140, 215, CYAN, FILL); + //x, y, width, height, colour + w=3; //for overal feeling indication + } + else if(gsrdeltaabs > gsr3) // check for being > 16% of baseline + { + lcd.drawRectangle(100, 180, 140, 215, RED, FILL); + //x, y, width, height, colour + w=4; //for overal feeling indication + } + + hrmValue = hrm; //Heart Rate Monitor + heartrate.getValue(p16); + rateValue = heartrate.getRate(); + // if(rateValue) { + // printf("\n\r=====BPM==== %d =====\n\r\n\r",rateValue); + // lcd.drawRectangle(110, 102, 300, 150, BLACK, FILL); // + // lcd.printNumber(110,102, rateValue); //Heart rate digital actual calculated value - real time + // lcd.printNumber(110,123, w); // now not used at this point + // w=0; + // } + int d = static_cast<long int>(clock_ms()); + //printf("Print every second : %d\n\r", d); + + //printf("hrmValue = %f\n\r",hrmValue); + // printf("hrm5 = %f\n\r",(hrm5)); +// printf("hrm10 = %f\n\r",(hrm10)); + //hrmdelta = hrmbaseline - hrmValue; + //hrmdeltaabs = abs(hrmdelta); +// if (hrmdeltaabs < hrmbaseline) +// { +// hrmdeltaabs = hrmbaseline + hrmdeltaabs; // make all negative values regarding baseline +ve +// } + if((hrm5) <= hrmValue && hrmValue <= (hrm10)) // check for being in between -5% to 10% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, GREEN, FILL); + //x, y, width, height, colour + //printf("green"); + w=w+1; //for overal feeling indication + } + else if((hrm10) < hrmValue && hrmValue< (hrm25)) // check for being > +10% to +25% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, YELLOW, FILL); + //printf("yellow"); + //x, y, width, height, colour + w=w+2; //for overal feeling indication + } + else if(hrmValue < (hrm5)) // check for being <45% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, BLUE, FILL); + //printf("blue"); + w=w+3; //for overal feeling indication + } + else if(hrmValue>=(hrm25)) // check for being > 75% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, RED, FILL); + w=w+4; //for overal feeling indication + } +/* if((hrm5) <= hrmValue && hrmValue <= (hrm10)) // check for being in between -5% to 10% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, GREEN, FILL); + //x, y, width, height, colour + //printf("green"); + w=w+1; //for overal feeling indication + } + else if((hrm10) < hrmValue && hrmValue< (hrm25)) // check for being > +10% to +25% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, YELLOW, FILL); + //printf("yellow"); + //x, y, width, height, colour + w=w+2; //for overal feeling indication + } + else if(hrmValue < (hrm5)) // check for being <45% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, BLUE, FILL); + //printf("blue"); + w=w+3; //for overal feeling indication + } + else if(hrmValue>=(hrm25)) // check for being > 75% of baseline + { + lcd.drawRectangle(180, 180, 220, 215, RED, FILL); + w=w+4; //for overal feeling indication + } +*/ +//overal feeling combined box display + if(w < 4) // 1,2or3 + { + lcd.drawRectangle(260, 180, 300, 215, GREEN, FILL); + //x, y, width, height, colour + //printf("green"); + } + else if(w >= 4 && w < 6) // 4or5 + { + lcd.drawRectangle(260, 180, 300, 215, YELLOW, FILL); + //printf("yellow"); + //x, y, width, height, colour + } + else if(w >= 6 && w < 8) // 6 or 7 + { + lcd.drawRectangle(260, 180, 300, 215, BLUE, FILL); + //printf("blue"); + } + else if(w >= 8) // 8 or above just in case new scheme used later + { + lcd.drawRectangle(260, 180, 300, 215, RED, FILL); + } + //w=0; //reset for next time round + if(rateValue) { + printf("\n\r=====BPM==== %d =====\n\r\n\r",rateValue); + lcd.drawRectangle(110, 102, 300, 150, BLACK, FILL); // + lcd.printNumber(110,102, rateValue); //Heart rate digital actual calculated value - real time + lcd.printNumber(110,123, w); // now not used at this point + w=0; + } + + + + wait(0.1); + // lcd.setTextColour(BLACK); + // lcd.drawRectangle(200, 0, 318, 20, BLACK, FILL); // date refresh + // lcd.drawRectangle(70, 21, 300, 60, BLACK, FILL); //time refresh + // lcd.drawRectangle(101, 31, 300, 150, BLACK, FILL); // 101 clears the area of screen with numbers so not to overwrite causing blurred numbers + lcd.drawRectangle(110, 60, 300, 101, BLACK, FILL); //110,31,300,150 + // lcd.printNumber(110,60, gsrbaseline); //gsr baseline value (doesnt change) + // lcd.printNumber(110,81, gsrValue); //GSR actual value - real time + + if(timestore2 != timeRTC.second) //a second has expired so send heart rate value to screen + { + led_2= !led_2; + // lcd.drawRectangle(110, 102, 300, 150, BLACK, FILL); // + // lcd.printNumber(110,102, rateValue); //Heart rate digital actual calculated value - real time + //lcd.printNumber(110,123, rateValue); // now not used at this point + timestore2 = timeRTC.second; // store new second value + } + if(storetosd>1 && storetosd<5) + { //if data to be captured to sd card do the following + res = lcd.getRTCTimeDate(&timeRTC); + length=snprintf(textday,3,"%d",timeRTC.day); + length=snprintf(textmonth,3,"%d",timeRTC.month); + length=snprintf(texthour,3,"%d",timeRTC.hour); + length=snprintf(textminute,3,"%d",timeRTC.minute); + length=snprintf(textsecond,3,"%d",timeRTC.second); + length=snprintf(textStringgsrb,9,"%f",gsrbaseline);// convert gsr baseline float to character string to send to SD card + length=snprintf(textStringgsr,9,"%f",gsrValue);// convert gsr float to character string to send to SD card + length=snprintf(textStringhrm,9,"%f",aHRMvalue);// convert analogue hrm float to character string to send to SD card + + // length=snprintf(textStringgsr,9,"%f",gsrValue);// convert float to character string to send to SD card + char messageft[60]="\0"; + if (candidate <1 || candidate>4) {strcat(messageft,"0,");} + if (candidate==1) {strcat(messageft,"1,");} + if (candidate==2) {strcat(messageft,"2,");} + if (candidate==3) {strcat(messageft,"3,");} + if (candidate==4) {strcat(messageft,"4,");} + if (storetosd==2) {strcat(messageft,"1,");} + if (storetosd==3) {strcat(messageft,"15,");} + if (storetosd==4) {strcat(messageft,"30,");} + strcat(messageft,textStringgsrb); + strcat(messageft,","); + strcat(messageft,textStringgsr); + strcat(messageft,","); + strcat(messageft,textStringhrm); + strcat(messageft,","); + strcat(messageft,textday);// add the hour value + strcat(messageft,","); + strcat(messageft,textmonth);// add the hour value + strcat(messageft,","); + strcat(messageft,texthour);// add the hour value + strcat(messageft,","); + strcat(messageft,textminute);// add the minute value + strcat(messageft,","); + strcat(messageft,textsecond);// add the hour value + strcat(messageft,"\n"); + pc.printf("%s\r\n",messageft); + + lcd.setTextColour(WHITE);//recording notice on screen + lcd.string(15,220,70,238,"Rec", &bytes); + wait(0.1); + int z; + + if(storetosd==2) + { //if data to be captured to sd card every 1 minute do the following + if(k==0) + {// if timer hasnt been started start it + k=1; // start timer once per selected period + j=timeRTC.second;// store second value + timeRTC.second++; //move the timer forward by one to prevent chance of immediate trigger of timer trap + pc.printf("***********************start 1 min timer\r\n"); + } + if(timeRTC.second!=j) + { //if second value is different from previous value assue 1 second has expired + //k=0; + j=timeRTC.second;// store new second value + l++; //increment second timer + pc.printf("************************** %d seconds have elapsed\r\n",l); + if (l==60) + { // 60 seconds have elapsed so lets save data to the SD card + l=0; //reset 1 minute counter + k=0; //reset timer + lcd.setTextColour(RED); + lcd.string(15,220,70,238,"Rec", &bytes); + wait(1); + pc.printf("***********reset 1 min timer\r\n"); + pc.printf("***********saving to file - 1 minute\r\n"); + writtenBytes=0; //, readbytes=0; //i=0; + fres=lcd.SDFwriteFile(messageft, sizeof(messageft), &writtenBytes, WORKSPACE0); //write to the open file in WORKSPACE0 size of message in bytes and store the successfully written Bytes on writtenBytes variable + die(fres); //If any error report it + lcd.SDFsaveFile(WORKSPACE0); //Save changes in the file contained in WORKSPACE0 + } + } + } + + if(storetosd==3) + { //if data to be captured to sd card every 15 minutes do the following + if(k==0) + {// if timer hasnt been started start it + k=1; // start timer once per selected period + j=timeRTC.minute;// store initial minute value + l=0; //clear minute counter + } + if(k==1) + { //if timer started do the following + //z=j; // save last value for minute + if(timeRTC.minute==j) + { //the minute value has not changed + z=0; + } + else + { //if the minute value has changed + l++; // count how many minutes have passed + j=timeRTC.minute;// store new minute value + pc.printf("*************************** %d minutes have elapsed\r\n",l); + } + if(l==15) + { // 15 minutes have elapsed so lets save data to the SD card + l=0; //reset 15 minute counter + k=0; //reset timer + lcd.setTextColour(RED); + lcd.string(15,220,70,238,"Rec", &bytes); + wait(1); + pc.printf("***********reset 15 min timer\r\n"); + pc.printf("***********saving to file - 15 minute\r\n"); + writtenBytes=0; //, readbytes=0; //i=0; + fres=lcd.SDFwriteFile(messageft, sizeof(messageft), &writtenBytes, WORKSPACE0); //write to the open file in WORKSPACE0 size of message in bytes and store the successfully written Bytes on writtenBytes variable + die(fres); //If any error report it + lcd.SDFsaveFile(WORKSPACE0); //Save changes in the file contained in WORKSPACE0 + } //end of if 15 mins counted + } //end of if timer has started + } // end of if 15min capture time selected + + + if(storetosd==4) + { //if data to be captured to sd card every 15 minutes do the following + if(k==0) + {// if timer hasnt been started start it + k=1; // start timer once per selected period + j=timeRTC.minute;// store minute value + j++; //move the timer along by one to prevent chance of immediate trigger of timer trap + pc.printf("*****************************start 30 min timer\r\n"); + } + if(timeRTC.minute!=j) + { //if minute value is different from previous value assue 1 minute has expired + //k=0; + j=timeRTC.minute;// store new minute value + l++; //increment minute timer + pc.printf("***************************** %d minutes have elapsed\r\n",l); + if (l==30) + { // 30 minutes have elapsed so lets save data to the SD card + l=0; //reset 30 minute counter + k=0; //reset timer + lcd.setTextColour(RED); + lcd.string(15,220,70,238,"Rec", &bytes); + wait(1); + pc.printf("***********reset 30 min timer\r\n"); + pc.printf("***********saving to file - 30 minute\r\n"); + writtenBytes=0; //, readbytes=0; //i=0; + fres=lcd.SDFwriteFile(messageft, sizeof(messageft), &writtenBytes, WORKSPACE0); //write to the open file in WORKSPACE0 size of message in bytes and store the successfully written Bytes on writtenBytes variable + die(fres); //If any error report it + lcd.SDFsaveFile(WORKSPACE0); //Save changes in the file contained in WORKSPACE0 + } + } + } + + + lcd.setTextColour(WHITE); + res = lcd.getRTCTimeDate(&timeRTC); + pc.printf("%d sec %d min %d \r\n",timeRTC.second, timeRTC.minute, storetosd); + // pc.printf("%d \r\n",timeRTC.minute); + } //end of storetosd if + + + if(lcd.touchScreen(&point)==VALID) + { //if a touch on screen is valid check which button + if(point.y>180 && point.y<215 && point.x<50) + { //if the touch on button1 draw the object button1 as SELECTED + lcd.objButton(10, 180, 50, 215, SELECTED, "EXIT"); + wait_ms(50); + lcd.objButton(10, 180, 50, 215, DESELECTED, "EXIT"); + pc.printf("EXIT\r\n"); //debug + but1=1; + }// end of if button 1 pressed + }// end of if screen touched + } //end of main loop while Exit button + + if(storetosd>1 && storetosd<5) + { //if data to be captured to sd card close the file properly + lcd.SDFsaveFile(WORKSPACE0); //Save changes in the file contained in WORKSPACE0 + //lcd.string(10,row,319,239,"Closing File...",&charsPrinted); row+=15; + lcd.SDFcloseFile(WORKSPACE0); //Close the file -------------------- + } + pc.printf("SD open file now saved and closed properly\r\n"); + wait(3); // wait to show message before starting the program again + pc.printf("re-starting the program again\r\n"); + wait(2); + }// end of total program while statement + }// end of main program \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/7130f322cb7e \ No newline at end of file