From 95f2403163c00f6a9dde526479816faebec6978d Mon Sep 17 00:00:00 2001 From: jonny_jr9 Date: Sun, 8 Oct 2023 14:54:22 +0200 Subject: [PATCH] Add control mode 'ADJUST_CHAIR' (btn 1 short, 1 long) Add functional mode to control chair position via joystick Switch to that mode using button 1x short 1x long (prev eject support) --- board_single/main/auto.hpp | 47 +++++++++++++++++++++++++++++++++++ board_single/main/button.cpp | 44 ++------------------------------ board_single/main/control.cpp | 38 ++++++++++++++++++++++++---- board_single/main/control.hpp | 4 +-- 4 files changed, 84 insertions(+), 49 deletions(-) diff --git a/board_single/main/auto.hpp b/board_single/main/auto.hpp index 8b799fb..3f37646 100644 --- a/board_single/main/auto.hpp +++ b/board_single/main/auto.hpp @@ -85,3 +85,50 @@ class automatedArmchair { }; +//=========== EXAMPLE USAGE ============ +//the following was once used in button.cpp to make move that ejects the leg support of armchair v1 +/** +if (trigger){ + //define commands + cmds[0] = + { + .motorCmds = { + .left = {motorstate_t::REV, 90}, + .right = {motorstate_t::REV, 90} + }, + .msDuration = 1200, + .fadeDecel = 800, + .fadeAccel = 1300, + .instruction = auto_instruction_t::NONE + }; + cmds[1] = + { + .motorCmds = { + .left = {motorstate_t::FWD, 70}, + .right = {motorstate_t::FWD, 70} + }, + .msDuration = 70, + .fadeDecel = 0, + .fadeAccel = 300, + .instruction = auto_instruction_t::NONE + }; + cmds[2] = + { + .motorCmds = { + .left = {motorstate_t::IDLE, 0}, + .right = {motorstate_t::IDLE, 0} + }, + .msDuration = 10, + .fadeDecel = 800, + .fadeAccel = 1300, + .instruction = auto_instruction_t::SWITCH_JOYSTICK_MODE + }; + + //send commands to automatedArmchair command queue + armchair.addCommands(cmds, 3); + + //change mode to AUTO + control->changeMode(controlMode_t::AUTO); + return; +} +*/ diff --git a/board_single/main/button.cpp b/board_single/main/button.cpp index 0974fdc..688a802 100644 --- a/board_single/main/button.cpp +++ b/board_single/main/button.cpp @@ -72,47 +72,8 @@ void buttonCommands::action (uint8_t count, bool lastPressLong){ case 2: //run automatic commands to lift leg support when pressed 1x short 1x long if (lastPressLong){ - //define commands - cmds[0] = - { - .motorCmds = { - .left = {motorstate_t::REV, 90}, - .right = {motorstate_t::REV, 90} - }, - .msDuration = 1200, - .fadeDecel = 800, - .fadeAccel = 1300, - .instruction = auto_instruction_t::NONE - }; - cmds[1] = - { - .motorCmds = { - .left = {motorstate_t::FWD, 70}, - .right = {motorstate_t::FWD, 70} - }, - .msDuration = 70, - .fadeDecel = 0, - .fadeAccel = 300, - .instruction = auto_instruction_t::NONE - }; - cmds[2] = - { - .motorCmds = { - .left = {motorstate_t::IDLE, 0}, - .right = {motorstate_t::IDLE, 0} - }, - .msDuration = 10, - .fadeDecel = 800, - .fadeAccel = 1300, - .instruction = auto_instruction_t::SWITCH_JOYSTICK_MODE - }; - - //send commands to automatedArmchair command queue - armchair.addCommands(cmds, 3); - - //change mode to AUTO - control->changeMode(controlMode_t::AUTO); - return; + ESP_LOGW(TAG, "cmd %d: toggle ADJUST_CHAIR", count); + control->toggleMode(controlMode_t::ADJUST_CHAIR); } //toggle idle when 2x pressed @@ -120,7 +81,6 @@ void buttonCommands::action (uint8_t count, bool lastPressLong){ control->toggleIdle(); //toggle between idle and previous/default mode break; - case 3: ESP_LOGW(TAG, "cmd %d: switch to JOYSTICK", count); control->changeMode(controlMode_t::JOYSTICK); //switch to JOYSTICK mode diff --git a/board_single/main/control.cpp b/board_single/main/control.cpp index fc9e4e3..1fe52d3 100644 --- a/board_single/main/control.cpp +++ b/board_single/main/control.cpp @@ -11,6 +11,7 @@ extern "C" #include "config.hpp" #include "control.hpp" +#include "chairAdjust.hpp" //used definitions moved from config.hpp: @@ -19,7 +20,7 @@ extern "C" //tag for logging static const char * TAG = "control"; -const char* controlModeStr[7] = {"IDLE", "JOYSTICK", "MASSAGE", "HTTP", "MQTT", "BLUETOOTH", "AUTO"}; +const char* controlModeStr[8] = {"IDLE", "JOYSTICK", "MASSAGE", "HTTP", "MQTT", "BLUETOOTH", "AUTO", "ADJUST_CHAIR"}; //----------------------------- @@ -169,6 +170,19 @@ void controlledArmchair::startHandleLoop() { break; + case controlMode_t::ADJUST_CHAIR: + vTaskDelay(100 / portTICK_PERIOD_MS); + //--- read joystick --- + stickData = joystick_l->getData(); + //--- idle motors --- + commands = cmds_bothMotorsIdle; + motorRight->setTarget(commands.right.state, commands.right.duty); + motorLeft->setTarget(commands.left.state, commands.left.duty); + //--- control armchair position with joystick input --- + joystick_ControlChairAdjustment(stickData, 0); + break; + + //TODO: add other modes here } @@ -322,12 +336,13 @@ void controlledArmchair::changeMode(controlMode_t modeNew) { ESP_LOGI(TAG, "noting to execute when changing FROM this mode"); break; -#ifdef JOYSTICK_LOG_IN_IDLE case controlMode_t::IDLE: +#ifdef JOYSTICK_LOG_IN_IDLE ESP_LOGI(TAG, "disabling debug output for 'evaluatedJoystick'"); esp_log_level_set("evaluatedJoystick", ESP_LOG_WARN); //FIXME: loglevel from config - break; #endif + buzzer->beep(1,200,100); + break; case controlMode_t::HTTP: ESP_LOGW(TAG, "switching from http mode -> disabling http and wifi"); @@ -367,6 +382,14 @@ void controlledArmchair::changeMode(controlMode_t modeNew) { motorLeft->setFade(fadeType_t::ACCEL, true); motorRight->setFade(fadeType_t::ACCEL, true); break; + + case controlMode_t::ADJUST_CHAIR: + ESP_LOGW(TAG, "switching from ADJUST_CHAIR mode => turning off adjustment motors..."); + //prevent motors from being always on in case of mode switch while joystick is not in center thus motors currently moving + setLegrestOff(); + setBackrestOff(); + break; + } @@ -384,6 +407,11 @@ void controlledArmchair::changeMode(controlMode_t modeNew) { #endif break; + case controlMode_t::ADJUST_CHAIR: + ESP_LOGW(TAG, "switching to ADJUST_CHAIR mode -> beep"); + buzzer->beep(4,200,100); + break; + case controlMode_t::HTTP: ESP_LOGW(TAG, "switching to http mode -> enabling http and wifi"); //start wifi @@ -445,13 +473,13 @@ void controlledArmchair::toggleModes(controlMode_t modePrimary, controlMode_t mo //switch to secondary mode when primary is already active if (mode == modePrimary){ ESP_LOGW(TAG, "toggleModes: switching from primaryMode %s to secondarMode %s", controlModeStr[(int)mode], controlModeStr[(int)modeSecondary]); - buzzer->beep(2,200,100); + //buzzer->beep(2,200,100); changeMode(modeSecondary); //switch to secondary mode } //switch to primary mode when any other mode is active else { ESP_LOGW(TAG, "toggleModes: switching from %s to primary mode %s", controlModeStr[(int)mode], controlModeStr[(int)modePrimary]); - buzzer->beep(4,200,100); + //buzzer->beep(4,200,100); changeMode(modePrimary); } } diff --git a/board_single/main/control.hpp b/board_single/main/control.hpp index 8ed1e66..63b8234 100644 --- a/board_single/main/control.hpp +++ b/board_single/main/control.hpp @@ -11,9 +11,9 @@ //---- struct, enum, variable declarations --- //-------------------------------------------- //enum that decides how the motors get controlled -enum class controlMode_t {IDLE, JOYSTICK, MASSAGE, HTTP, MQTT, BLUETOOTH, AUTO}; +enum class controlMode_t {IDLE, JOYSTICK, MASSAGE, HTTP, MQTT, BLUETOOTH, AUTO, ADJUST_CHAIR}; //string array representing the mode enum (for printing the state as string) -extern const char* controlModeStr[7]; +extern const char* controlModeStr[8]; //--- control_config_t --- //struct with config parameters