State machine

Dependencies:   mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter

EMG_calibration.h

Committer:
hermanindeput
Date:
2018-11-01
Revision:
36:691ea4660f29
Parent:
35:38a5af0afee8

File content as of revision 36:691ea4660f29:

#pragma once

#include "mbed.h"
#include "MODSERIAL.h"
#include "Screen.h"
#include "EMGFilter.h"

class EMG_calibration
{
private:
Ticker      calibration_timer;
timeout     adjustment_time;
Timeout     calibration_bicep;      // Timeout to get to relax state 
Timeout     end_of_calibration;     // Timeout to get to final state
EMG_Filter* EMG_filter 
Screen* screen;

//variables
    volatile float EMG_signal1;
    volatile float EMG_min_relax;
    volatile float EMG_min_tense;
    volatile float EMG_max_relax;
    volatile float EMG_max_tense;
    volatile float EMG_threshold; 
// IN STATE MACHINE:
EMGFilter emg_input *EMGFilter;         // Voor kalibratie van bicep 1
//EMGFilter emg_input = EMGFilter(A1);         // Voor kalibratie van bicep 2

EMG_calibration(Screen *new_screen,EMGFilter *EMG_filter){
    screen= new_screen;
    EMG_min_relax=1.000;
    EMG_min_tense=1.000;
    EMG_max_relax=0.000;
    EMG_max_tense=0.000;
    relax_calibration();
}

void tense_calibration()
{
    EMG_signal1 = emg_input.get_envelope_emg();
    if (EMG_max_tense < EMG_signal1)
    {
        EMG_max_tense=EMG_signal1;
    }
    if (EMG_min_tense > EMG_signal1)
    {
        EMG_min_tense=EMG_signal1;
    }
    screen.get_screen_handle()->setTextCursor(0, 0);    
    screen.get_screen_handle()->printf("Tense                ");
    screen.get_screen_handle()->printf("EMG maximum= %.6f",EMG_max_tense);
    screen.get_screen_handle()->printf("EMG minimum= %.6f",EMG_min_tense);
    screen.get_screen_handle()->printf("                     ",EMG_min_tense);
    screen.display();
}

void relax_calibration()
{
    EMG_signal1 = emg_input.get_envelope_emg();
    if (EMG_max_relax < EMG_signal1)
    {
        EMG_max_relax=EMG_signal1;
    }
    if (EMG_min_relax > EMG_signal1)
    {
        EMG_min_relax=EMG_signal1;
    }
    EMG_threshold=(((EMG_min_tense-EMG_max_relax)/2)+EMG_max_relax);
    screen.get_screen_handle()->setTextCursor(0, 0);    
    screen.get_screen_handle()->printf("Relax                ");
    screen.get_screen_handle()->printf("EMG maximum= %.6f",EMG_max_relax);
    screen.get_screen_handle()->printf("EMG minimum= %.6f",EMG_min_relax);
    screen.get_screen_handle()->printf("threshold= %.6f",EMG_threshold);
    screen.display();
}

void TheFinalCalibration()
    {
        calibration_bicep.detach();
        calibration_timer.detach();
        screen.get_screen_handle()->setTextCursor(0, 0);    
        screen.get_screen_handle()->printf("threshold= %.6f",EMG_threshold);
        screen.get_screen_handle()->printf("                     ");
        screen.get_screen_handle()->printf("                     "); 
        screen.get_screen_handle()->printf("                     "); 
        screen.display();
        emg_input.set_threshold(EMG_threshold);
    }

void relax_measure()
{
    calibration_timer.detach(); 
    screen.get_screen_handle()->setTextCursor(0, 0);    
    screen.get_screen_handle()->printf("Relax muscle         ",EMG_max_relax);    
    screen.get_screen_handle()->printf("                     ",EMG_min_tense);
    screen.get_screen_handle()->printf("                     ",EMG_min_tense);
    screen.get_screen_handle()->printf("                     ",EMG_min_tense);
    screen.display();
    adjustment_time.attach(callback(this, &EMG_calibration::start_relax),2.5f);
}
void start_relax(){   
    calibration_timer.attach(&relax_calibration, 0.1);
    end_of_calibration.attach(&relax_measure,5.0f);
}

void tense_measure()
{
    calibration_timer.detach(); 
    screen.get_screen_handle()->setTextCursor(0, 0);    
    screen.get_screen_handle()->printf("Tense muscle         ",EMG_max_relax);
    screen.get_screen_handle()->printf("                     ",EMG_min_tense);
    screen.get_screen_handle()->printf("                     ",EMG_min_tense);
    screen.get_screen_handle()->printf("                     ",EMG_min_tense);    
    screen.display();
    adjustment_time.attach(callback(this, &EMG_calibration::start_tense),2.5f);
}
void start_tense(){
    calibration_timer.attach(&tense_calibration,0.1);  
    calibration_bicep.attach(&TheFinalCalibration,5);
}
};