Add working command instructions, optimize control
auto.cpp: - forward instructions from commands to newly passed pointer control.cpp: - handle instructions returned at generation of commands in auto mode - add method toggleMode - remove dupliate code in toggleIdle method button.cpp: - optimize command for enabling leg support, add instruction
This commit is contained in:
		
							parent
							
								
									6dfae934d5
								
							
						
					
					
						commit
						fb9e9ede25
					
				| @ -18,12 +18,16 @@ automatedArmchair::automatedArmchair(void) { | ||||
| //==============================
 | ||||
| //====== generateCommands ======
 | ||||
| //==============================
 | ||||
| motorCommands_t automatedArmchair::generateCommands() { | ||||
| motorCommands_t automatedArmchair::generateCommands(auto_instruction_t * instruction) { | ||||
|     //reset instruction
 | ||||
|     *instruction = auto_instruction_t::NONE; | ||||
|     //check if previous command is finished
 | ||||
|     if ( esp_log_timestamp() > timestampCmdFinished ) { | ||||
|         //get next command from queue
 | ||||
|         if( xQueueReceive( commandQueue, &cmdCurrent, pdMS_TO_TICKS(500) ) ) { | ||||
|             ESP_LOGI(TAG, "running next command from queue..."); | ||||
|             //copy instruction to be provided to control task
 | ||||
|             *instruction = cmdCurrent.instruction; | ||||
|             //set acceleration / fading parameters according to command
 | ||||
|             motorLeft.setFade(fadeType_t::DECEL, cmdCurrent.fadeDecel); | ||||
|             motorRight.setFade(fadeType_t::DECEL, cmdCurrent.fadeDecel); | ||||
|  | ||||
| @ -18,7 +18,7 @@ extern "C" | ||||
| //---- struct, enum, variable declarations ---
 | ||||
| //--------------------------------------------
 | ||||
| //enum for special instructions / commands to be run in control task
 | ||||
| enum class auto_instruction_t { NONE, SWITCH_PREV_MODE, RESET_ACCEL, RESET_DECEL }; | ||||
| enum class auto_instruction_t { NONE, SWITCH_PREV_MODE, SWITCH_JOYSTICK_MODE, RESET_ACCEL_DECEL, RESET_ACCEL, RESET_DECEL }; | ||||
| 
 | ||||
| //struct for a simple command
 | ||||
| //e.g. put motors in a certain state for certain time
 | ||||
| @ -46,7 +46,9 @@ class automatedArmchair { | ||||
|         //  - receive commands with queue anyways
 | ||||
|         //  - => use delay function
 | ||||
|         //  - have a queue that outputs current motor state/commands -> repeatedly check the queue in control task
 | ||||
|         motorCommands_t generateCommands(); //repeatedly called by control task
 | ||||
|         //function that handles automatic driving and returns motor commands
 | ||||
|         //also provides instructions to be executed in control task via pointer
 | ||||
|         motorCommands_t generateCommands(auto_instruction_t * instruction); | ||||
| 
 | ||||
|         //function that adds a basic command to the queue
 | ||||
|         void addCommand(commandSimple_t command); | ||||
|  | ||||
| @ -66,20 +66,20 @@ void buttonCommands::action (uint8_t count){ | ||||
|                     .left = {motorstate_t::REV, 90}, | ||||
|                     .right = {motorstate_t::REV, 90} | ||||
|                 }, | ||||
|                 .msDuration = 700, | ||||
|                 .msDuration = 1200, | ||||
|                 .fadeDecel = 800, | ||||
|                 .fadeAccel = 1200, | ||||
|                 .fadeAccel = 1300, | ||||
|                 .instruction = auto_instruction_t::NONE | ||||
|             }; | ||||
|             cmds[1] = | ||||
|             { | ||||
|                 .motorCmds = { | ||||
|                     .left = {motorstate_t::FWD, 50}, | ||||
|                     .right = {motorstate_t::FWD, 50} | ||||
|                     .left = {motorstate_t::FWD, 70}, | ||||
|                     .right = {motorstate_t::FWD, 70} | ||||
|                 }, | ||||
|                 .msDuration = 100, | ||||
|                 .msDuration = 70, | ||||
|                 .fadeDecel = 0, | ||||
|                 .fadeAccel = 400, | ||||
|                 .fadeAccel = 300, | ||||
|                 .instruction = auto_instruction_t::NONE | ||||
|             }; | ||||
|             cmds[2] = | ||||
| @ -91,7 +91,7 @@ void buttonCommands::action (uint8_t count){ | ||||
|                 .msDuration = 10, | ||||
|                 .fadeDecel = 800, | ||||
|                 .fadeAccel = 1300, | ||||
|                 .instruction = auto_instruction_t::NONE | ||||
|                 .instruction = auto_instruction_t::SWITCH_JOYSTICK_MODE | ||||
|             }; | ||||
| 
 | ||||
|             //send commands to automatedArmchair command queue
 | ||||
|  | ||||
| @ -125,11 +125,41 @@ void controlledArmchair::startHandleLoop() { | ||||
|             case controlMode_t::AUTO: | ||||
|                 vTaskDelay(20 / portTICK_PERIOD_MS); | ||||
|                //generate commands
 | ||||
|                commands = armchair.generateCommands(); | ||||
|                commands = armchair.generateCommands(&instruction); | ||||
|                 //--- apply commands to motors ---
 | ||||
|                 //TODO make motorctl.setTarget also accept motorcommand struct directly
 | ||||
|                motorRight->setTarget(commands.right.state, commands.right.duty);  | ||||
|                motorLeft->setTarget(commands.left.state, commands.left.duty);  | ||||
| 
 | ||||
|                //process received instruction
 | ||||
|                switch (instruction) { | ||||
|                    case auto_instruction_t::NONE: | ||||
|                        break; | ||||
|                    case auto_instruction_t::SWITCH_PREV_MODE: | ||||
|                        toggleMode(controlMode_t::AUTO); | ||||
|                        break; | ||||
|                    case auto_instruction_t::SWITCH_JOYSTICK_MODE: | ||||
|                        changeMode(controlMode_t::JOYSTICK); | ||||
|                        break; | ||||
|                    case auto_instruction_t::RESET_ACCEL_DECEL: | ||||
|                        //enable downfading (set to default value)
 | ||||
|                        motorLeft->setFade(fadeType_t::DECEL, true); | ||||
|                        motorRight->setFade(fadeType_t::DECEL, true); | ||||
|                        //set upfading to default value
 | ||||
|                        motorLeft->setFade(fadeType_t::ACCEL, true); | ||||
|                        motorRight->setFade(fadeType_t::ACCEL, true); | ||||
|                        break; | ||||
|                    case auto_instruction_t::RESET_ACCEL: | ||||
|                        //set upfading to default value
 | ||||
|                        motorLeft->setFade(fadeType_t::ACCEL, true); | ||||
|                        motorRight->setFade(fadeType_t::ACCEL, true); | ||||
|                        break; | ||||
|                    case auto_instruction_t::RESET_DECEL: | ||||
|                        //enable downfading (set to default value)
 | ||||
|                        motorLeft->setFade(fadeType_t::DECEL, true); | ||||
|                        motorRight->setFade(fadeType_t::DECEL, true); | ||||
|                        break; | ||||
|                } | ||||
|                break; | ||||
| 
 | ||||
| 
 | ||||
| @ -274,7 +304,7 @@ void controlledArmchair::changeMode(controlMode_t modeNew) { | ||||
|     } | ||||
| 
 | ||||
|     //copy previous mode
 | ||||
|     controlMode_t modePrevious = mode; | ||||
|     modePrevious = mode; | ||||
| 
 | ||||
|     ESP_LOGW(TAG, "=== changing mode from %s to %s ===", controlModeStr[(int)mode], controlModeStr[(int)modeNew]); | ||||
| 
 | ||||
| @ -383,15 +413,8 @@ void controlledArmchair::changeMode(controlMode_t modeNew) { | ||||
| //-----------------------------------
 | ||||
| //function to toggle between IDLE and previous active mode
 | ||||
| void controlledArmchair::toggleIdle() { | ||||
|     if (mode == controlMode_t::IDLE){ | ||||
|         changeMode(modePrevious); //restore previous mode, or default if not switched yet
 | ||||
|         buzzer->beep(2, 200, 100); | ||||
|         ESP_LOGW(TAG, "toggle idle: switched mode from IDLE to %s", controlModeStr[(int)mode]); | ||||
|     } else { | ||||
|         modePrevious = mode; //store current mode
 | ||||
|         changeMode(controlMode_t::IDLE); //set mode to IDLE
 | ||||
|         ESP_LOGW(TAG, "toggle idle: switched mode from %s to IDLE", controlModeStr[(int)mode]); | ||||
|     } | ||||
|     //toggle between IDLE and previous mode
 | ||||
|     toggleMode(controlMode_t::IDLE); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -415,3 +438,25 @@ void controlledArmchair::toggleModes(controlMode_t modePrimary, controlMode_t mo | ||||
|         changeMode(modePrimary); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| //-----------------------------------
 | ||||
| //----------- toggleMode ------------
 | ||||
| //-----------------------------------
 | ||||
| //function that toggles between certain mode and previous mode
 | ||||
| void controlledArmchair::toggleMode(controlMode_t modePrimary){ | ||||
| 
 | ||||
|     //switch to previous mode when primary is already active
 | ||||
|     if (mode == modePrimary){ | ||||
|         ESP_LOGW(TAG, "toggleMode: switching from primaryMode %s to previousMode %s", controlModeStr[(int)mode], controlModeStr[(int)modePrevious]); | ||||
|         //buzzer->beep(2,200,100);
 | ||||
|         changeMode(modePrevious); //switch to previous 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);
 | ||||
|         changeMode(modePrimary); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -55,6 +55,8 @@ class controlledArmchair { | ||||
| 
 | ||||
|         //function that toggles between two modes, but prefers first argument if entirely different mode is currently active
 | ||||
|         void toggleModes(controlMode_t modePrimary, controlMode_t modeSecondary); | ||||
|         //toggle between certain mode and previous mode
 | ||||
|         void toggleMode(controlMode_t modePrimary); | ||||
| 
 | ||||
|         //function that restarts timer which initiates the automatic timeout (switch to IDLE) after certain time of inactivity
 | ||||
|         void resetTimeout(); | ||||
| @ -92,6 +94,9 @@ class controlledArmchair { | ||||
|         //variables for MASSAGE mode
 | ||||
|         bool freezeInput = false; | ||||
| 
 | ||||
|         //variables for AUTO mode
 | ||||
|         auto_instruction_t instruction = auto_instruction_t::NONE; //variable to receive instructions from automatedArmchair
 | ||||
|          | ||||
|         //variable to store button event
 | ||||
|         uint8_t buttonCount = 0; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user