New controller will be run with single controller at first... get single board version from V2.0 and create new folder (two boards version is kept) -> copied firmware from e6e586e5855d81ee726bb9a0fbe8ab12def5eeef
89 lines
3.1 KiB
C++
89 lines
3.1 KiB
C++
#include "auto.hpp"
|
|
#include "config.hpp"
|
|
|
|
//tag for logging
|
|
static const char * TAG = "automatedArmchair";
|
|
|
|
|
|
//=============================
|
|
//======== constructor ========
|
|
//=============================
|
|
automatedArmchair::automatedArmchair(void) {
|
|
//create command queue
|
|
commandQueue = xQueueCreate( 32, sizeof( commandSimple_t ) ); //TODO add max size to config?
|
|
}
|
|
|
|
|
|
|
|
//==============================
|
|
//====== 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);
|
|
motorLeft.setFade(fadeType_t::ACCEL, cmdCurrent.fadeAccel);
|
|
motorRight.setFade(fadeType_t::ACCEL, cmdCurrent.fadeAccel);
|
|
//calculate timestamp the command is finished
|
|
timestampCmdFinished = esp_log_timestamp() + cmdCurrent.msDuration;
|
|
//copy the new commands
|
|
motorCommands = cmdCurrent.motorCmds;
|
|
} else { //queue empty
|
|
ESP_LOGD(TAG, "no new command in queue -> set motors to IDLE");
|
|
motorCommands = motorCmds_bothMotorsIdle;
|
|
}
|
|
} else { //previous command still running
|
|
ESP_LOGD(TAG, "command still running -> no change");
|
|
}
|
|
|
|
//TODO also return instructions via call by reference
|
|
return motorCommands;
|
|
}
|
|
|
|
|
|
|
|
//============================
|
|
//======== addCommand ========
|
|
//============================
|
|
//function that adds a basic command to the queue
|
|
void automatedArmchair::addCommand(commandSimple_t command) {
|
|
//add command to queue
|
|
if ( xQueueSend( commandQueue, ( void * )&command, ( TickType_t ) 0 ) ){
|
|
ESP_LOGI(TAG, "Successfully inserted command to queue");
|
|
} else {
|
|
ESP_LOGE(TAG, "Failed to insert new command to queue");
|
|
}
|
|
}
|
|
|
|
void automatedArmchair::addCommands(commandSimple_t commands[], size_t count) {
|
|
for (int i = 0; i < count; i++) {
|
|
ESP_LOGI(TAG, "Reading command no. %d from provided array", i);
|
|
addCommand(commands[i]);
|
|
}
|
|
}
|
|
|
|
|
|
//===============================
|
|
//======== clearCommands ========
|
|
//===============================
|
|
//function that deletes all pending/queued commands
|
|
//e.g. when switching modes
|
|
motorCommands_t automatedArmchair::clearCommands() {
|
|
//clear command queue
|
|
xQueueReset( commandQueue );
|
|
ESP_LOGW(TAG, "command queue was successfully emptied");
|
|
//return commands for idling both motors
|
|
motorCommands = motorCmds_bothMotorsIdle;
|
|
return motorCmds_bothMotorsIdle;
|
|
}
|
|
|