#pragma once #include #include #include "configuration.h" #include "display_task.h" #include "logger.h" #include "motor_task.h" #include "serial/serial_protocol_plaintext.h" #include "serial/serial_protocol_protobuf.h" #include "serial/uart_stream.h" #include "task.h" class InterfaceTask : public Task, public Logger { friend class Task; // Allow base Task to invoke protected run() public: InterfaceTask(const uint8_t task_core, MotorTask& motor_task, DisplayTask* display_task); virtual ~InterfaceTask(); void log(const char* msg) override; void setConfiguration(Configuration* configuration); protected: void run(); private: #ifdef CONFIG_IDF_TARGET_ESP32S3 HWCDC stream_; #else UartStream stream_; #endif MotorTask& motor_task_; DisplayTask* display_task_; char buf_[128]; SemaphoreHandle_t mutex_; Configuration* configuration_ = nullptr; // protected by mutex_ PB_PersistentConfiguration configuration_value_; bool configuration_loaded_ = false; uint8_t strain_calibration_step_ = 0; int32_t strain_reading_ = 0; int current_config_ = 0; QueueHandle_t log_queue_; QueueHandle_t knob_state_queue_; SerialProtocolPlaintext plaintext_protocol_; SerialProtocolProtobuf proto_protocol_; void changeConfig(bool next); void updateHardware(); };