- config, chairAdjust: - disable reset-pin of display (not connected, random pin was assigned) same pin was used for chair adjust resulting in on state after startup - fix chairAdjust not stopping in OFF state - display - add functionality to show different status screens (content when not in MENU) - add status screen 'Speed' (to show speed and debug speedsensors) - menu - fix item joystick define center not working - add item to select status screen
116 lines
3.2 KiB
C++
116 lines
3.2 KiB
C++
extern "C"
|
|
{
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "driver/gpio.h"
|
|
#include "esp_log.h"
|
|
#include <string.h>
|
|
}
|
|
|
|
#include "chairAdjust.hpp"
|
|
|
|
|
|
|
|
//--- gloabl variables ---
|
|
// strings for logging the rest state
|
|
const char* restStateStr[] = {"REST_OFF", "REST_DOWN", "REST_UP"};
|
|
|
|
//--- local variables ---
|
|
//tag for logging
|
|
static const char * TAG = "chair-adjustment";
|
|
|
|
|
|
|
|
//=============================
|
|
//======== constructor ========
|
|
//=============================
|
|
cControlledRest::cControlledRest(gpio_num_t gpio_up_f, gpio_num_t gpio_down_f, const char * name_f){
|
|
strcpy(name, name_f);
|
|
gpio_up = gpio_up_f;
|
|
gpio_down = gpio_down_f;
|
|
init();
|
|
}
|
|
|
|
|
|
|
|
//====================
|
|
//======= init =======
|
|
//====================
|
|
// init gpio pins for relays
|
|
void cControlledRest::init()
|
|
{
|
|
ESP_LOGW(TAG, "[%s] initializing gpio pins %d, %d for relays...", name, gpio_up, gpio_down);
|
|
// configure 2 gpio pins
|
|
gpio_pad_select_gpio(gpio_up);
|
|
gpio_set_direction(gpio_up, GPIO_MODE_OUTPUT);
|
|
gpio_pad_select_gpio(gpio_down);
|
|
gpio_set_direction(gpio_down, GPIO_MODE_OUTPUT);
|
|
// both relays off initially
|
|
gpio_set_level(gpio_down, 0);
|
|
gpio_set_level(gpio_up, 0);
|
|
state = REST_OFF;
|
|
}
|
|
|
|
|
|
|
|
//============================
|
|
//========= setState =========
|
|
//============================
|
|
void cControlledRest::setState(restState_t targetState)
|
|
{
|
|
//check if actually changed
|
|
if (targetState == state){
|
|
ESP_LOGD(TAG, "[%s] state already at '%s', nothing to do", name, restStateStr[state]);
|
|
return;
|
|
}
|
|
|
|
//apply new state
|
|
ESP_LOGI(TAG, "[%s] switching from state '%s' to '%s'", name, restStateStr[state], restStateStr[targetState]);
|
|
state = targetState;
|
|
timestamp_lastChange = esp_log_timestamp(); //TODO use this to estimate position
|
|
switch (state)
|
|
{
|
|
case REST_UP:
|
|
gpio_set_level(gpio_down, 0);
|
|
gpio_set_level(gpio_up, 1);
|
|
break;
|
|
case REST_DOWN:
|
|
gpio_set_level(gpio_down, 1);
|
|
gpio_set_level(gpio_up, 0);
|
|
break;
|
|
case REST_OFF:
|
|
gpio_set_level(gpio_down, 0);
|
|
gpio_set_level(gpio_up, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//====================================
|
|
//====== controlChairAdjustment ======
|
|
//====================================
|
|
//function that controls the two rests according to joystick data (applies threshold, defines direction)
|
|
//TODO:
|
|
// - add separate task that controls chair adjustment
|
|
// - timeout
|
|
// - track position
|
|
// - auto-adjust: move to position while driving
|
|
// - control via app
|
|
// - add delay betweem direction change
|
|
void controlChairAdjustment(joystickData_t data, cControlledRest * legRest, cControlledRest * backRest){
|
|
//--- variables ---
|
|
float stickThreshold = 0.3; //min coordinate for motor to start
|
|
|
|
//--- control rest motors ---
|
|
//leg rest (x-axis)
|
|
if (data.x > stickThreshold) legRest->setState(REST_UP);
|
|
else if (data.x < -stickThreshold) legRest->setState(REST_DOWN);
|
|
else legRest->setState(REST_OFF);
|
|
|
|
//back rest (y-axis)
|
|
if (data.y > stickThreshold) backRest->setState(REST_UP);
|
|
else if (data.y < -stickThreshold) backRest->setState(REST_DOWN);
|
|
else backRest->setState(REST_OFF);
|
|
}
|