HAND

Dependencies:   mbed BMI160 MLX90614 max32630fthr Adafruit_FeatherOLED MAX30100

Revision:
0:d36fd4cabb70
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/functions.cpp	Wed Nov 03 15:59:51 2021 +0000
@@ -0,0 +1,1021 @@
+#include "functions.h"
+#include "ble_functions.h"
+#include "RawSerial.h"
+#include <InterruptIn.h>
+#include <InterruptManager.h>
+#include "bmi160.h"
+#include "max32630fthr.h"
+#include "max3263x.h"
+#include "MAX14690.h"
+#include "MAX30100_PulseOximeter.h"
+#include "mlx90614.h"
+#include "Adafruit_SSD1306.h"
+#include <BLE.h>
+#include "ble/BLE.h"
+#include "ble/Gap.h"
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+#include <errno.h>
+#include <stdio.h>
+#include <time.h>
+#include <stdint.h>
+
+extern char device_id[];
+extern unsigned short int measure_id;
+extern unsigned short int log_id;
+
+extern Serial pan1326b;
+extern DigitalOut bt_rst;
+
+extern volatile int conn_state;
+extern bool in_BT;
+
+extern AnalogIn battery;
+
+extern DigitalOut r;
+extern DigitalOut g;
+extern DigitalOut b;
+extern DigitalOut RGBs[];
+
+extern MAX32630FTHR pegasus;
+
+extern I2C i2cm2;
+extern MAX14690 max14690;
+
+extern InterruptIn button;
+
+extern FATFileSystem fileSystem;
+extern SDBlockDevice blockDevice;
+
+extern I2C i2c;
+extern int sensor_temp;
+extern Adafruit_SSD1306_I2c featherOLED;
+
+extern Timer t;
+extern PulseOximeter pox;
+extern uint32_t tsLastReport;
+
+extern DigitalIn ain;
+extern double anSignal;
+extern int bpm;
+extern int signal;
+extern int ibi;
+extern MLX90614 IR_thermometer;
+extern float ir_temp;
+
+extern volatile int quit;
+extern volatile int ble_return;
+extern volatile int conn_state;
+extern int counter_ble;
+
+extern bool error_status;
+extern bool BT_error;
+extern bool shipping;
+extern bool pause;
+extern bool init_status;
+extern bool after_BT;
+
+extern Timeout after_BLE;
+extern Timeout turnoff;
+extern Timeout flipper;                    // 
+extern Timeout advertise_cancel;          // Zum abbrechen von BT bei keinem Verbindungsaufbau
+extern Timeout connected_cancel;          // Zum abbrechen von BT bei kein Befehlempfang
+extern Ticker mess_timer;                 // ticker eventuell nur bis 30 Minuten geeignet
+extern Ticker ticker;
+extern time_t now;
+extern time_t raw;
+
+extern float    buffer_temp;
+extern struct   tm current;
+extern struct   tm actual;
+
+extern struct user_config_struct user_config_para;
+extern struct tm user_config_time;
+
+extern Timeout done_rcv;
+
+extern int next_state;
+
+extern int unsigned long t_diff;
+extern int unsigned long unix_time;
+
+extern int default_advertise_time;
+extern int default_connected_time;
+
+extern int alert_count;
+
+extern Timer t;
+extern PulseOximeter pox;
+extern uint32_t tsLastReport;
+
+bool newValueMAX30100 = 0;
+extern float heartRate;
+float finalHeartRate;
+extern uint8_t sp02;
+uint16_t finalSp02;
+uint32_t REPORTING_PERIOD_MS = 1000;
+std::vector<float> valuesHeartRate;
+std::vector<uint8_t> valuesSp02;
+uint8_t samplesMAX30100 = 10;
+uint8_t counterMAX30100 = 0;
+
+void turnON(){
+    max14690.writeReg(MAX14690::REG_PWR_CFG, 0x1D);
+    char string[] = "H.A.N.D. turned on";
+    write_to_sd_log_single(string);
+}
+
+void reboot(){
+    char string[] = "Rebooting H.A.N.D. ...";
+    write_to_sd_log_single(string);
+    printf("\n__________________________\n\nRebooting H.A.N.D.\n__________________________\n\n");
+    log_id -= 2;
+    BT_false();
+    wait(0.2);
+    NVIC_SystemReset();
+}
+
+void set_time(){
+    unix_time = 946684800; //946684800: 2000-01-01 00:00:00
+    now = time(0);
+    time(&now);
+    set_time(unix_time);
+}
+
+int set_app_time(unsigned long device_time){
+    printf("\nDevice time: %ld\n", device_time);
+    if(device_time >= 946684800){
+        unix_time = device_time; 
+        now = time(0);
+        time(&now);
+        set_time(unix_time);
+    
+        tm *current;
+        time(&now);
+        current = localtime (&now);
+        char string[] = "Device time updated";
+        write_to_sd_log_single(string);
+        printf ("\nDate: 20%02d-%02d-%02d %02d:%02d:%02d\r\n", current->tm_year - 100, current->tm_mon + 1, current->tm_mday, current->tm_hour, current->tm_min, current->tm_sec);        
+        printf("\n__________________________\n\nNew device time applied\n__________________________\n\n");
+        
+        return 1;
+    }else{
+        printf("\n__________________________\n\nCan not applie new device time\n__________________________\n\n");
+        
+        return -1;
+    }
+}
+
+void write_to_sd_log_single(char log_string[])
+{   
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    fileSystem.mount(&blockDevice);
+    
+    char file_name[14] = "/fs/log";
+    char file_type[10] = ".csv";
+    char buff_file[25];
+    sprintf(buff_file, "%s%s", file_name, file_type);
+    FILE * f = fopen(buff_file, "a");
+    
+    log_id++;
+    
+    tm *current;
+    time(&now);
+    current = localtime (&now);
+    fprintf(f, "%d;20%02d-%02d-%02d;%02d:%02d:%02d;%s;\r\n",  log_id, current->tm_year - 100, current->tm_mon + 1, current->tm_mday, current->tm_hour, current->tm_min, current->tm_sec, log_string);
+    
+    fclose(f);
+    fileSystem.unmount();
+}
+
+void write_to_sd_messdaten_single(float buffer_temp)
+{   
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    fileSystem.mount(&blockDevice);
+
+    char file_name[14] = "/fs/messdaten";
+    char file_type[10] = ".csv";
+    char buff_file[25];
+    sprintf(buff_file, "%s%s", file_name, file_type);
+    FILE * f = fopen(buff_file, "a");
+    
+    int buffer_conv = (int)(100*buffer_temp);
+    
+    measure_id++;
+    
+    tm *current;
+    time(&now);
+    current = localtime (&now);
+    fprintf(f, "%d;20%02d-%02d-%02d;%02d:%02d:%02d;%d;%4d;\r\n", measure_id,  current->tm_year - 100, current->tm_mon + 1, current->tm_mday, current->tm_hour, current->tm_min, current->tm_sec, sensor_temp, buffer_conv);
+    
+    fclose(f);
+    fileSystem.unmount();
+}
+
+void get_save_Messpunkt(float temperatur)
+{
+    buffer_temp = temperatur;
+    
+    tm *current;
+    time(&now);
+    current = localtime (&now);
+    write_to_sd_messdaten_single(buffer_temp);
+    sensor_temp = 2;
+    write_to_sd_messdaten_single(finalHeartRate);
+    write_to_sd_messdaten_single((float)finalSp02);
+    sensor_temp = 1;
+    printf ("Measurement %d saved 20%02d-%02d-%02d %02d:%02d:%02d\r\n", measure_id, current->tm_year - 100, current->tm_mon + 1, current->tm_mday, current->tm_hour, current->tm_min, current->tm_sec);
+}
+
+float get_Messwert()  
+{
+    float temperatur = 0;   
+     
+    IR_thermometer.getTemp(&temperatur);
+    
+    wait(0.3);
+    
+    if(user_config_para.alert == 1){
+        if(user_config_para.minimum > temperatur){
+            char string[] = "ALERT: lower threshold limit below";
+            write_to_sd_log_single(string);
+            
+            printf("ALERT: lower threshold limit below (lower limit: %d C)\n", user_config_para.minimum);
+            
+            alert_count++;
+        }else if(user_config_para.maximum < temperatur){
+            char string[] = "ALERT: upper threshold exceeded";
+            write_to_sd_log_single(string);
+            
+            printf("ALERT: upper threshold exceeded (upper limit: %d C)\n", user_config_para.maximum);
+            
+            alert_count++;
+        }
+    }
+    
+    get_save_Messpunkt(temperatur);
+    
+    return temperatur;
+}
+
+int create_file_messdaten(){
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err){
+        fileSystem.unmount(); 
+        
+        char string[] = "SD mount error";
+        write_to_sd_log_single(string);
+        
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+         
+        return -1;
+    }else{
+
+        char file_name[14] = "/fs/messdaten";
+        char file_type[10] = ".csv";
+        char buff_file[25];
+        sprintf(buff_file, "%s%s", file_name, file_type);
+        FILE * f = fopen(buff_file, "a");
+    
+        fclose(f);
+        fileSystem.unmount();  
+        
+        return 1;
+    }     
+}
+
+int create_file_log()
+{
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err){
+        fileSystem.unmount();
+        
+        char string[] = "SD mount error";
+        write_to_sd_log_single(string);
+        
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+          
+        return -1;
+    }else{
+
+        char file_name[14] = "/fs/log";
+        char file_type[10] = ".csv";
+        char buff_file[25];
+        sprintf(buff_file, "%s%s", file_name, file_type);
+        FILE * f = fopen(buff_file, "a");
+    
+        fclose(f);
+        fileSystem.unmount();  
+        
+        return 1;
+    }  
+}
+
+int delete_file_messdaten(){
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err)
+    {
+        char string[] = "SD mount error";
+        write_to_sd_log_single(string);
+        
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+        
+        fileSystem.unmount();
+        
+        return -1;
+    }else{
+    
+        remove("/fs/messdaten.csv");
+        wait(0.2);
+        fileSystem.unmount();
+        fflush(stdout);
+        
+        char string_1[] = "Measuring data file deleted";
+        write_to_sd_log_single(string_1);
+    
+        if(create_file_messdaten() == 1){
+            
+            char string[] = "New measuring data file created";
+            write_to_sd_log_single(string);
+        
+            fileSystem.unmount();
+            
+            measure_id = 0;
+            
+            printf("\n__________________________\n\nMeasuring data deleted\n__________________________\n\n");
+            return 1;
+        }else{
+            fileSystem.unmount();
+            printf("\nError while creating new file\n");
+            return -1;
+        }
+    }
+}
+
+int delete_file_log(){
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err)
+    {
+        char string[] = "SD mount error";
+        write_to_sd_log_single(string);
+        
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+        
+        fileSystem.unmount();
+        
+        return -1;
+    }else{
+    
+        remove("/fs/log.csv");
+        wait(0.2);
+        /*
+        char string_1[] = "Log file deleted";
+        write_to_sd_log_single(string_1);
+    */
+        if(create_file_log() == 1){
+            
+            log_id = 0;
+            
+            char string[] = "New log data file created";
+            write_to_sd_log_single(string);
+        
+            fileSystem.unmount();
+            
+            printf("\n__________________________\n\nLog deleted\n__________________________\n\n");
+            return 1;
+        }else{
+            fileSystem.unmount();
+            printf("\nError while creating new file\n");
+            return -1;
+        }
+    }
+}
+
+int file_copy(const char *src, const char *dst)
+{
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int retval = 0;
+    int ch;
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err)
+    {
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+        fileSystem.unmount();
+        
+        return -1;
+    }else{
+ 
+    FILE *fpsrc = fopen(src, "r");   // src file
+    FILE *fpdst = fopen(dst, "w");   // dest file
+    
+    while (1) {                  // Copy src to dest
+        ch = fgetc(fpsrc);       // until src EOF read.
+        if (ch == EOF) break;
+        fputc(ch, fpdst);
+    }
+    fclose(fpsrc);
+    fclose(fpdst);
+  
+    fpdst = fopen(dst, "r");     // Reopen dest to insure
+    if (fpdst == NULL) {          // that it was created.
+        retval = -1;           // Return error.
+    } else {
+        fclose(fpdst);
+        retval = 0;              // Return success.
+    }
+    return retval;
+    }
+}
+
+int load_user_config() 
+{
+    printf("\n__________________________\n\nReading the config\n__________________________\n\n");
+    
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err)
+    {
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+        fileSystem.unmount();
+        
+        return -1;
+    }else{
+    
+    FILE * conf = fopen ("/fs/user_config.csv", "rb");
+    char buffer[700];
+    int length;
+    
+    if (conf)
+    {
+        fseek (conf, 0, SEEK_END);
+        length = ftell (conf);
+        fseek (conf, 0, SEEK_SET);
+        
+        if (buffer)
+        {
+            fread (buffer, 1, length, conf);
+        }
+        fclose(conf);
+        fileSystem.unmount();
+        
+            if (buffer)
+            {
+                char* single_word[100];
+                int word_count = 0;
+                char delim[] = ";\r\n";
+                char *ptr = strtok(buffer, delim);
+        
+                for(int j = 0; j < 100; j++)
+                {
+                    single_word[j] = new char[15];
+                }
+        
+                while (ptr != NULL)
+                {
+                    strcpy(single_word[word_count], ptr);
+                    ptr = strtok(NULL, delim); 
+                    word_count++;
+                }
+        
+                const char *params[] = {"interval", "alert", "minimum", "maximum", "advertise", "connected"};
+                for(int k = 0; k < 100; k++)
+                {
+                    for(int l = 0; l < 5; l++)
+                    {
+                        if(strcmp(single_word[k], params[0]) == 0){
+                            user_config_para.interval = atoi(single_word[k+1]);
+                        }
+                        else if(strcmp(single_word[k], params[1]) == 0){
+                            user_config_para.alert = atoi(single_word[k+1]);
+                        }
+                        else if(strcmp(single_word[k], params[2]) == 0){
+                            user_config_para.minimum = atoi(single_word[k+1]);
+                        }
+                        else if(strcmp(single_word[k], params[3]) == 0){
+                            user_config_para.maximum = atoi(single_word[k+1]);
+                        }
+                        else if(strcmp(single_word[k], params[4]) == 0){
+                            user_config_para.advertise = atoi(single_word[k+1]);
+                        }
+                        else if(strcmp(single_word[k], params[5]) == 0){
+                            user_config_para.connected = atoi(single_word[k+1]);
+                        }
+                    }
+                }
+        
+        //printf("\nID: #%s\n", user_config_para.id);
+        
+        //char idnummer[10];
+        //sscanf(idnummer, "%d", &user_config_para.id);
+
+                printf("\nH.A.N.D. ID #%s\n", device_id);
+                if(user_config_para.interval == 1){
+                    printf("Mesureual interval: %d second\n", user_config_para.interval);
+                }else{
+                    printf("Mesureual interval: %d seconds\n", user_config_para.interval);
+                }
+                if(user_config_para.alert == 1){
+                    printf("Alert-function - ON\n");
+                    printf("Minimum temperature: %d C | Maximum temperature: %d C\n", user_config_para.minimum, user_config_para.maximum);
+                }else{
+                    printf("Alert-function - OFF\n");
+                }
+                printf("BLE advertise timer: %d seconds\n", user_config_para.advertise);
+                printf("BLE when connected timer: %d seconds\n", user_config_para.connected);
+            }
+            else{ 
+            printf("Buffer empty: %s", buffer);
+            }
+            return 1;
+        }
+    else{
+        printf("!!! Config file not found, error: %s (%d)\n", strerror(errno), -errno);
+        fileSystem.unmount();
+        user_config_para.advertise = default_advertise_time;
+        user_config_para.connected = default_connected_time;
+        return -1;
+    }
+    }
+}
+
+int load_standard_config(){
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    printf("\n__________________________\n\nReseting config settings \nto default\n__________________________\n\n");
+    
+    int file_err = fileSystem.mount(&blockDevice);  
+     
+    if(file_err){
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+        fileSystem.unmount();
+        
+        return -1;
+    }else{
+        remove("/fs/user_config.csv");
+        wait(0.2);
+    
+        if(file_copy("/fs/standard_config.csv", "/fs/user_config.csv") == 0){
+            load_user_config();
+            
+            printf("\n__________________________\n\nConfig settings reseted\n__________________________\n\n");
+            char string[] = "Standard user config file created";
+            write_to_sd_log_single(string);
+            fileSystem.unmount();
+            
+            return 1;
+        }else{
+            printf("\n__________________________\n\nFailed to reset config file\n__________________________\n\n");
+            char string[] = "Failed to copy standard config file";
+            write_to_sd_log_single(string);
+            fileSystem.unmount();
+            
+            return -1;
+        }
+    }
+}
+
+int read_id()
+{
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err)
+    {
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+        fileSystem.unmount();
+        
+        return -1;
+    }else{
+    
+    FILE * id = fopen ("/fs/id.csv", "rb");
+    char buffer[14];
+    int length;
+    
+    if (id)
+    {
+        fseek (id, 0, SEEK_END);
+        length = ftell (id);
+        fseek (id, 0, SEEK_SET);
+        
+        if (buffer)
+        {
+            fread (buffer, 1, length, id);
+        }
+        fclose(id);
+        fileSystem.unmount();
+        
+            if (buffer)
+            {
+                char* single_word[10];
+                int word_count = 0;
+                char delim[] = ";\r\n";
+                char *ptr = strtok(buffer, delim);
+        
+                for(int j = 0; j < 10; j++)
+                {
+                    single_word[j] = new char[10];    
+                }
+        
+                while (ptr != NULL)
+                {
+                    strcpy(single_word[word_count], ptr);
+                    ptr = strtok(NULL, delim); 
+                    word_count++;
+                }
+                
+                strcpy(device_id, single_word[1]);
+                return 1;
+            }
+            else{ 
+                printf("Buffer empty: %s", buffer);
+                return -1;
+            }
+        }
+    else{
+        printf("!!! Config file not found, error: %s (%d)\n", strerror(errno), -errno);
+        fileSystem.unmount();
+        return -1;
+    }
+    }
+}
+
+int create_user_config(char params[]){
+    fileSystem.unmount();
+    fflush(stdout);
+    
+    int file_err = fileSystem.mount(&blockDevice);    
+    if(file_err){
+        printf("\n__________________________\n\n! No SD-card detected !\n__________________________\n\n");
+        fileSystem.unmount();
+        
+        return -1;
+    }else{
+        remove("/fs/user_config.csv");
+        wait(0.2);
+        char string[] = "User config file deleted";
+        write_to_sd_log_single(string);
+        fileSystem.unmount();  
+        
+        fileSystem.mount(&blockDevice); 
+        char file_name[16] = "/fs/user_config";
+        char file_type[10] = ".csv";
+        char buff_file[27];
+        sprintf(buff_file, "%s%s", file_name, file_type);
+        FILE * f = fopen(buff_file, "a");
+    
+        fclose(f);
+        
+        char string_1[] = "User config file created";
+        write_to_sd_log_single(string_1);
+        
+        fileSystem.unmount();  
+        
+        char *single_word[15];
+        int word_count = 0;
+        char delim[] = ";\r\n";
+        char *ptr = strtok(params, delim);
+        for(int j = 0; j < 9; j++)
+        {
+            single_word[j] = new char[6];
+        }
+        
+        while (ptr != NULL)
+        {
+            strcpy(single_word[word_count], ptr);
+            ptr = strtok(NULL, delim);
+            word_count++;
+        }
+        printf("interval;%s;\r\nalert;%s;\r\nminimum;%s;\r\nmaximum;%s;\r\nadvertise;%s;\r\nconnected;%s;", 
+        single_word[0], single_word[1], single_word[2], single_word[3], single_word[4]);
+        
+        fileSystem.mount(&blockDevice); 
+        FILE * fp = fopen("/fs/user_config.csv", "w");
+        
+        fprintf(fp, "interval;%s;\r\n",   single_word[0]);
+        fprintf(fp, "alert;%s;\r\n",      single_word[1]);
+        fprintf(fp, "minimum;%s;\r\n",    single_word[2]);
+        fprintf(fp, "maximum;%s;\r\n",    single_word[3]);
+        fprintf(fp, "advertise;%s;\r\n",  single_word[4]);
+        fprintf(fp, "connected;%s;\r\n",  single_word[5]);
+        
+        fclose(fp);
+        fileSystem.unmount();  
+        
+        if(load_user_config() == 1){
+            return 1;
+        }else{
+            printf("\nFaild to read the config!\n");
+            return -1;
+        }
+    }  
+}
+
+void led_blink(int led, int anzahl, int lang, int pause){
+    for(int i = 0; anzahl > i; i++){
+        RGBs[led] = 0;
+        if(lang == 1){
+            wait(1.5);
+        }else{
+            wait(0.5);
+        }
+        RGBs[led] = 1;
+        wait(0.5);
+    }
+    if(pause == 1){
+        wait(1);
+    }
+}
+
+void error_handler(int error) 
+{
+    g = 1;
+    wait(1);
+    
+    int file_err = fileSystem.mount(&blockDevice);
+    if(file_err){
+        switch (error) {
+            case   10:{            led_blink(0, 2, 1, 1); }
+                break;   
+            case   11:{            BT_error = true; led_blink(0, 1, 1, 1); led_blink(0, 2, 1, 1); }
+                break; 
+            case  110:{            led_blink(0, 2, 1, 1); led_blink(0, 3, 1, 1); }
+                break; 
+            case  111:{            BT_error = true; led_blink(0, 1, 1, 1); led_blink(0, 2, 1, 1); led_blink(0, 3, 1, 1); }
+                break; 
+        }
+        fileSystem.unmount();
+    }else{
+        tm *current;
+        time(&now);
+        current = localtime (&now);
+    
+        switch (error) {
+            case    0:{            char string[] = "Initializing succesfull"; write_to_sd_log_single(string); led_blink(1, 1, 0, 0); }
+                break;
+            case    1:{            char string[] = "Initializing failed: Bluetooth not detected"; write_to_sd_log_single(string); BT_error = true; led_blink(0, 1, 1, 1); } 
+                break;  
+            case  100:{            char string[] = "Initializing failed: Temperature sensor not detected"; write_to_sd_log_single(string); led_blink(0, 3, 1, 1); }
+                break; 
+            case  101:{            char string[] = "Initializing failed: Temperature sensor and bluetooth not detected"; write_to_sd_log_single(string); BT_error = true; led_blink(0, 1, 1, 1); led_blink(0, 3, 1, 1); }
+                break; 
+        }
+        fileSystem.unmount();
+    }
+    r = 1;
+    g = 1;
+    b = 1;
+    wait(0.5);
+}
+/*
+void sendDataToProcessing(char symbol, int data)
+{
+    if(symbol == 'S'){
+        signal = data;
+    }
+    else if(symbol == 'B'){
+        bpm = data;
+    }
+    else if(symbol == 'Q'){
+        ibi = data;
+    }
+}
+*/
+
+void onBeatDetected()
+{
+    //printf("Beat!\r\n");
+}
+
+bool setup()
+{
+    // Initialize the PulseOximeter instance and register a beat-detected callback
+    if(!pox.begin())
+        return false;
+    pox.setOnBeatDetectedCallback(onBeatDetected);
+    return true;
+}
+
+void updateMAX30100 (){
+    // Make sure to call update as fast as possible
+    pox.update();
+    
+    if (t.read_ms() > REPORTING_PERIOD_MS) {
+        heartRate = pox.getHeartRate();
+        sp02 = pox.getSpO2();
+        
+        if(heartRate != 0 && sp02 != 0) {
+            valuesHeartRate.push_back(heartRate);
+            valuesSp02.push_back(sp02);
+            counterMAX30100 ++;
+            next_state = 1;
+        }else{
+            next_state = 0;
+        }
+        
+        if(samplesMAX30100 == counterMAX30100) {
+            
+            finalHeartRate = 0;
+            finalSp02 = 0;
+            for(int i=0; i<samplesMAX30100; i++){
+                finalHeartRate += valuesHeartRate[i];
+                finalSp02 += valuesSp02[i];        
+            }
+            
+            finalHeartRate /= samplesMAX30100;
+            finalSp02 /= samplesMAX30100;
+            
+            counterMAX30100 = 0;
+            valuesHeartRate.clear();
+            valuesSp02.clear();
+            newValueMAX30100 = true;
+        }
+        
+        t.reset();
+    }         
+}
+
+void loop()
+{
+    updateMAX30100();
+    
+    if(newValueMAX30100){
+        printf("--->New Value\r\n");
+        printf("Heart rate: %f",finalHeartRate);
+        printf("   bpm / SpO2: %d%\r\n",finalSp02);
+        printf("*************************\r\n");
+        newValueMAX30100 = false;  
+    }
+       
+}
+
+int check_devices()
+{
+    printf("\nDevices check...\n\n");
+    
+    int bl      =       1;
+    int sd      =      10;
+    int tempsen =     100;
+    int pulsoxi =    1000;
+    
+    //BLE check
+    bt_rst = 1;
+    bt_rst = 0;
+    wait(0.5);
+    BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
+    ble.init(bleInitComplete);
+    if(ble.hasInitialized() == true){
+        bl = 0;
+        BT_error = false;
+        printf("\nBLE detected\n");
+        printMacAddress();
+    }else{
+        BT_error = true;
+        printf("\nBLE not detected!\n");
+    }
+    
+    //SD check
+    int file_err = fileSystem.mount(&blockDevice);
+    if(file_err)
+    {
+        printf("\nSD-card not detected\n");
+        BT_error = true;
+    }
+    else {   
+        sd = 0;
+        create_file_log();
+        create_file_messdaten();
+        printf("\nSD-card detected\n");
+        
+        fileSystem.unmount();
+        
+        messdaten_count();
+        printf("Measuremnts count: %d\n", measure_id);
+        log_count();
+        printf("Logs count: %d\n", log_id);
+    }
+    fileSystem.unmount();
+    
+    //IR Thermometer check
+    if(IR_thermometer.getTemp(&ir_temp)){
+        printf("\nIR Thermometer detected\n");
+        tempsen = 0;
+    }else{
+        printf("\nIR Thermometer not detected\n");
+    }
+    
+    //Pulsoximeter check
+    if(setup()){
+        printf("\nPulsoximeter detected!\r\n");
+        t.start();  
+        pulsoxi = 0;
+    }else{
+        printf("\nPulsoximeter not detected!\r\n");
+    }
+    
+    //Check output
+    int devices = pulsoxi + tempsen + sd + bl;
+    
+    if(devices != 0000){
+        printf("\nError in check_devices(): %04d\n", devices);
+        
+        error_handler(devices);
+        
+        return 0;
+        
+    }else{
+        printf("\n__________________________\n\nAll devices connected\n__________________________\n\n");
+        
+        return 1;
+    }
+}
+
+int RTC_check(){
+    tm *current;
+    time(&now);
+    if ( (current = localtime (&now) ) == NULL) {
+        printf ("\n\n__________________________\n\n! RTC initialize failed !\n__________________________\n");
+        return -1;
+    }else{
+        set_time();
+        printf ("\n\n__________________________\n\nRTC initialized\n__________________________\n");
+        return 1;
+    }
+}
+
+void max14690_init(){
+    max14690.resetToDefaults();
+    max14690.ldo2Millivolts = 3300;
+    max14690.ldo3Millivolts = 3300;
+    max14690.ldo2Mode = MAX14690::LDO_ENABLED;
+    max14690.ldo3Mode = MAX14690::LDO_ENABLED;
+    max14690.intEnChgStatus = 1;
+    max14690.monCfg = MAX14690::MON_SYS;        //Monitoring - Multiplexer auf Battery eingestellt, um Akku-wert auszulesen 
+    max14690.monRatio = MAX14690::MON_DIV4;
+    max14690.intEnChgStatus = 0;
+    max14690.ldo3Mode = MAX14690::SW_EN_MPC1_DSC;
+    if (max14690.init() == MAX14690_ERROR) {
+        printf("Error initializing MAX14690");
+    }
+}
+
+void init(){
+    r = 1;
+    g = 1;
+    b = 1;
+    
+    printf("\n\n__________________________\n\nStarting H.A.N.D.\n__________________________\n\n");
+    g = 0;
+    
+    printf("Initializing MAX32630FTHR\n\n");
+    pegasus.init(MAX32630FTHR::VIO_3V3);
+    
+    printf("Initializing MAX14690N\n");
+    max14690_init();
+    
+    if(RTC_check() == 1){
+        if(check_devices() == 1 & read_id() == 1 & load_user_config() == 1){
+            printf("\n__________________________\n\nInitializing succesfull\n__________________________\n\n");
+            BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
+            g = 1;
+            init_status = true;
+            error_status = false;
+            error_handler(000);
+        }else{
+            printf("\n__________________________\n\nInitializing failed\n__________________________\n\n");
+            BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
+            next_state = 0;
+            init_status = false;
+            error_status = true;
+            g = 1;
+        }
+    }else{
+        printf("\n__________________________\n\nRTC failure\n__________________________\n\n");
+        error_status = true;
+        init_status = false;
+        next_state = 0;
+        g = 1;
+    }
+}
\ No newline at end of file