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); } };