Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem ds3231 eeprom_Nikita mbed testUniGraphic_150217
Fork of merged_code2_3rd_nov_2017 by
main.cpp
- Committer:
- nikitateggi
- Date:
- 2017-09-16
- Revision:
- 50:b42238e7f46d
- Parent:
- 49:3ff80c4bc1be
- Child:
- 51:1a4693774b60
File content as of revision 50:b42238e7f46d:
#include "mbed.h"
#include "display_modules.h"
#include "touch_modules.h"
#include "ecg_dec.h"
#include "touch_modules.h"
#include "glc.h"
#include "bp.h"
#include "sdcard.h"
#include "eeprom_pgm.h"
#include "struct.h"
#include "battery.h"
#include "main.h"
#define TIMER_RXACK_BTCONNECTION 10000
#define BATTERY_TIMER_VALUE 600000
#define SERIAL_BAUD_RATE 115200
#define BATTERY_SCREEN_NO_CHARGE_CONDITION 3
#define TIMER_ENTER_DEBUG_MODE 10000
Serial gc(USBTX, USBRX);
DigitalIn q1(PTB11);
DigitalIn q(PTC5);
DigitalIn q3(PTC12);
DigitalIn BT(PTA5);
Serial blue1(PTC4,PTC3);
uint32_t get_timer_bluetooth();
static void battery_status_monitoring(); //bluetooth status pin
uint8_t touch(uint8_t state); // touch state
uint8_t display(uint8_t state1); // display state
static uint8_t nstate=0;
static uint8_t nstate1=0;
static uint32_t pid = 0; // patient ID
static bool file_created_status = false; //initialise file created to 0
static uint32_t filepid_btpid[2] = {};
Timer timer_bt; // timer for bluetooth
Timer timer_battery; // timer for battery
uint8_t debug_mode=0;
int main()
{
static uint8_t main_state=1;
static uint8_t state_display = 0;
static uint8_t state_touch = 1;
uint8_t state_t = 1; // state to transmit to bluetooth
uint8_t state_r = 0; // state to receive from bluetooth
DisableTouch();
gc.baud(115200);
blue1.baud(115200);
init_screen(); //initialize lcd
pid = get_filepid();
screen_main(); // display of main screen
battery_monitor(); // monitor battery at the start only
battery_status_display(); // display of main screen
timer_battery.start();
timer_bt.start();
gc.printf("Press any key to enter into debug mode\n");
while(timer_bt.read_ms()<TIMER_ENTER_DEBUG_MODE)
{
if (gc.readable()) // checking whether there is any data read
{
gc.getc();
//getchar();
debug_mode = 1;
timer_bt.stop();
timer_bt.reset();
gc.printf("entered debug mode\n");
break;
}
}
timer_bt.stop();
timer_bt.reset();
while(1)
{
battery_status_monitoring(); // to monitior battery status after every 10 min.
if (get_battery_status() == BATTERY_SCREEN_NO_CHARGE_CONDITION) // to check battery status and take action
{
DisableTouch();
}
else
{
EnableTouch();
switch(main_state) // main state machine
{
case 1:
state_display = touch(state_touch); // touch state
if(state_display == 12)
{
main_state = 3;
}
else
{
main_state = 2;
}
break;
case 2:
state_touch = display(state_display); //display state
main_state = 1;
break;
case 3:
DisableTouch(); // bluetooth send
timer_bt.start();
if(get_timer_bluetooth()<TIMER_RXACK_BTCONNECTION) // bluetooth connection timer 15 sec
{
if(BT==1) // checking for bluetooth connection
{
timer_bt.stop(); // stop the timer once connected to app
timer_bt.reset();
BT_connection() ; // displaying connection on bluetooth
state_r=bt_send(state_t);
timer_bt.start();
//gc.printf(" state_t = %d\n", state_t);
// gc.printf(" state_r = %d\n", state_r);
if (state_r==0) // if the state received is zero, then there is no new file to send
{
timer_bt.stop(); // stop the timer once connected to app
timer_bt.reset();
BT_finished(); // screen to display communication finished
screen_BT_return(); //screen to return back
EnableTouch();
main_state=1;
state_touch=12;
break;
}
else
{
main_state=4; // move to receving stste of bluetooth
}
}
else
{
BT_no_connection(); // display screen to show that there is no connection
}
}
else
{
BT_no_connection(); // display screen to show that there is no connection
gc.printf("stopped");
screen_BT_return(); // button to return
EnableTouch();
main_state=1;
state_touch=12;
//sd_close();
timer_bt.stop();
timer_bt.reset();
}
break;
case 4:
DisableTouch();
if(get_timer_bluetooth()<TIMER_RXACK_BTCONNECTION)
{
if (blue1.readable()) // if there is data to receive enter the loop
{
state_t=bt_receive(state_r);
// gc.printf(" state_t = %d\n", state_t);
// gc.printf(" state_r = %d\n", state_r);
timer_bt.stop();
timer_bt.reset();
if(state_t ==0) // if state_t is zero, there is no other file to send
{
BT_finished();
screen_BT_return();
EnableTouch();
main_state=1;
state_touch=12; // jumping to touch case 12
break;
}
else // move to bluetooth transmit if the states are 1,2,3,4
{
main_state=3;
}
}
}
else
{
DisableTouch();
BT_no_connection(); // display screen to show that there is no connection
gc.printf("stopped");
screen_BT_return(); // button to return
EnableTouch();
main_state=1;
state_touch=12;
state_t = 1; // state to transmit to bluetooth
state_r = 0; // state to receive from bluetooth
sd_close(); ///close the opened file which was used for bluetooth
timer_bt.stop();
timer_bt.reset();
}
break;
}
}
}
}
uint8_t touch(uint8_t state)
{
static uint8_t state1=0;
detect_touch(state); // determine the touch points
switch(state) // state for touch
{
case 1:
state1=touch_main(); // determining the touch for main screen
state=0;
nstate1=state1;
break;
case 2:
state1=touch_main_1(); // determining the touch for SYSTEM CONFIGURATION screen
state=0;
nstate1=state1;
break;
case 3:
state1=touch_main_2(); // determining the touch for TEST screen
state=0;
nstate1=state1;
break;
case 4:
state1=touch_glc(); // determining the touch for GLC screen
state=0;
nstate1=state1;
break;
case 5:
state1=touch_ecg(); // determining the touch for ECG screen
state=0;
nstate1=state1;
break;
case 6:
state1=touch_ret(); // determining the touch for returning back to the main screen
state=0;
nstate1=state1;
break;
case 7:
state1=touch_again_ecg(); // determining the touch when readings are taken more than once screen
state=0;
nstate1=state1;
break;
case 8:
state1=touch_bp(); // determining the touch for BP screen
state=0;
nstate1=state1;
break;
case 9:
state1=touch_again_glc();
state=0;
nstate1=state1;
break;
case 10 :
DisableTouch();
wait_ms(300);
EnableTouch();
state=nstate;
break;
case 11:
state1=touch_again_bp();
state=0;
nstate1=state1;
break;
case 12:
state1=BT_return();
state=0;
nstate1=state1;
break;
case 13:
state1 = touch_debug(); //touch state for debug
//state=0;
nstate1=state1;
break;
default :
DisableTouch();
wait_ms(300);
EnableTouch();
state=nstate;
break;
}
return state1;
}
uint8_t display(uint8_t state1)
{
static uint8_t state=0;
static uint8_t ecg_flag=0; // ecg_flag to indicate the ecg test is already done for the same pid
static uint8_t glc_flag=0; // glc_flag to indicate the glc test is already done for the same pid
uint16_t heart_rate=0;
switch(state1) // state for display screens
{
case 1:
DisableTouch();
screen_main(); // main screen
state1=0;
state=1;
nstate=state;
ecg_flag=0; // ecg, glc flag to determine whether the readings are taken more than once
glc_flag=0;
clear_filecreated_status();
pid = get_filepid();
battery_status_display(); //Display battery status on LCD
debug_mode = 0;
EnableTouch();
break;
case 2:
DisableTouch();
screen_main_1(); // System configration screen
state1=0;
state=2;
nstate=state;
battery_status_display(); //Display battery status on LCD
EnableTouch();
break;
case 3:
DisableTouch();
//sd_read(pid_btpid); //read pid from sd card
//pid=pid_btpid[0]; //copy pid to a variable
gc.printf("pidinit=%d",pid);
screen_main_2(pid);
state1=0;
state=3;
nstate=state;
battery_status_display();
EnableTouch();
break;
case 4:
DisableTouch();
if (glc_flag==1) // glc_flag=1 when already the reading has been taken
{
screen_again();
state1=0;
state=9;
nstate=state;
}
else
{
screen_glc(); // glc screen
state1=0;
state=4;
nstate=state;
}
EnableTouch();
break;
case 5:
DisableTouch();
if (ecg_flag==1)
{
screen_again();
state1=0;
state=7;
nstate=state;
}
else
{
screen_ecg(); //ecg main screen
state1=0;
state=5;
nstate=state;
}
EnableTouch();
break;
case 6:
DisableTouch();
screen_bp(); // bp main screen
state1=0;
state=8;
nstate=state;
EnableTouch();
break;
case 7:
DisableTouch();
glc(pid); // glc measurement
glc_flag=1;
wait(1);
state1=0;
screen_glc_2();
state=6;
eprom_write_8(30,0);
nstate=state;
EnableTouch();
break;
case 8: DisableTouch();
ecg_countdown(); // countdown before ecg capture
heart_rate=ecg(pid); // capturing ecg
state1=0;
if (heart_rate==0)
{
screen_ecg_lead();
}
else if(heart_rate==1) // if heart rate goes above or below range display error // 10/7/17 nikita
{
screen_ecg_error();
}
else
{
screen_ecg_2(heart_rate);
ecg_flag=1;
}
state=6;
eprom_write_8(30,1);
nstate=state;
screen_ecg_bp();
EnableTouch();
break;
case 9:
DisableTouch();
screen_bp2(); // bp main screen
bp_countdown(); // countdown for bp
bp(pid); // measuring bp earlier bp() changed to bp(pid) 28/4/2017
state1=0;
state=6;
eprom_write_8(30,2);
nstate=state;
EnableTouch();
break;
case 10 : DisableTouch();
wait_ms(300);
EnableTouch();
state=nstate;
break;
case 11 :
DisableTouch();
//sd_read(pid_btpid); //read pid from sd card
//current_test_pid=pid_btpid[0];
//bt_file_sent_pid=pid_btpid[1];
//screen_patient_info(current_test_pid, bt_file_sent_pid);
screen_patient_info(get_filepid(), get_btpid());
state1=0;
state=12;
EnableTouch();
break;
case 13 : //display screen for debug
DisableTouch();
screen_debug();
state1=0;
state=13;
nstate=state;
EnableTouch();
break;
case 14 :
DisableTouch(); //state to delete SD card
delete_sdcard();
screen_sdcard_delete();
state1=0;
state= 12;
nstate=state;
EnableTouch();
break;
case 15 :
DisableTouch();
// screen_sdcard_read(); //state to delete SD card
gc.printf("Enter the PID number");
/// gc.scanf("%d", &pid_read);
// gc.printf("%d\n",pid_read);
read_sdcard_file();
// screen_sdcard_read();
state1=0;
state= 12;
nstate=state;
EnableTouch();
break;
default :
state1=nstate1;
break;
}
return state;
}
bool get_filecreated_status(void) //function to get file created status
{
return file_created_status;
}
void set_filecreated_status(void) //function to set file created status
{
file_created_status = true;
}
void clear_filecreated_status(void) //function to clear file created status
{
file_created_status = false;
}
void increment_filepid (void) //increment pid if a test is completed
{
//uint32_t filepid_btpid[2] = {};
//set_filecreated_status(); //set it to make it append mode
sd_read(filepid_btpid); //read pid from sd card
filepid_btpid[0] = filepid_btpid[0] + 1; //increment it by 1
sd_write(filepid_btpid); //write it back to sd card
}
void increment_btpid (void) //increment pid if a test is completed
{
//uint32_t filepid_btpid[2] = {};
//set_filecreated_status(); //set it to make it append mode
sd_read(filepid_btpid); //read pid from sd card
filepid_btpid[1] = filepid_btpid[1] + 1; //increment it by 1
sd_write(filepid_btpid); //write it back to sd card
}
uint32_t get_filepid(void)
{
//uint32_t filepid_btpid[2] = {};
uint32_t filepid = 0;
sd_read(filepid_btpid); //read pid from sd card
filepid = filepid_btpid[0];
return filepid;
}
void store_filepid(uint32_t pid)
{
//uint32_t filepid_btpid[2] = {};
sd_read(filepid_btpid); //read pid from sd card
filepid_btpid[0] = pid;
sd_write(filepid_btpid); //write it back to sd card
}
uint32_t get_btpid(void)
{
//uint32_t filepid_btpid[2] = {};
uint32_t btpid = 0;
sd_read(filepid_btpid); //read pid from sd card
btpid = filepid_btpid[1];
return btpid;
}
void store_btpid(uint32_t bt_pid)
{
//uint32_t filepid_btpid[2] = {};
sd_read(filepid_btpid); //read pid from sd card
filepid_btpid[1] = bt_pid;
sd_write(filepid_btpid); //write it back to sd card
}
uint32_t get_timer_bluetooth()
{
return timer_bt.read_ms();
}
void battery_status_monitoring()
{
if(timer_battery.read_ms() > BATTERY_TIMER_VALUE )
{
battery_monitor();
timer_battery.reset();
}
}
uint8_t read_debug_status()
{
return debug_mode;
}
