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