HardFOC Vortex V1 HAL
Unified HAL API for the HardFOC Vortex motor-control platform (ESP32-C6, TMC9660)
Loading...
Searching...
No Matches
Vortex.h
Go to the documentation of this file.
1
93#ifndef VORTEX_API_H_
94#define VORTEX_API_H_
95
96#include <array>
97#include <atomic>
98#include <cstdint>
99#include <cstring>
100#include <memory>
101
102// Forward declarations for all component handlers
104class NvsManager;
105class GpioManager;
106class AdcManager;
107class MotorController;
108class ImuManager;
109class EncoderManager;
110class LedManager;
112
113// Include the unified Logger
114#include "handlers/logger/Logger.h"
115#include "RtosMutex.h"
116#include "VortexBootReport.h"
117#include "VortexDiagnostics.h"
118#include "VortexVersion.h"
119
129enum class VortexOnboardTmc9660Transport : std::uint8_t {
130 Spi = 0,
131 Uart = 1,
132};
133
134//==============================================================================
135// VORTEX SYSTEM DIAGNOSTICS
136//==============================================================================
137
177
178//==============================================================================
179// MANAGER HEALTH SNAPSHOT
180//==============================================================================
181
186 const char* name;
190
192 : name(nullptr), initialized(false), has_error(false), last_error_code(0) {}
193};
194
224
225//==============================================================================
226// VORTEX API CLASS
227//==============================================================================
228
233class Vortex {
234public:
235 //**************************************************************************//
236 //** SINGLETON ACCESS **//
237 //**************************************************************************//
238
244 static Vortex& GetInstance() noexcept;
245
250 static void SetOnboardTmc9660Transport(VortexOnboardTmc9660Transport transport) noexcept;
251
253 [[nodiscard]] static VortexOnboardTmc9660Transport GetOnboardTmc9660Transport() noexcept;
254
255 // Non-copyable, non-movable
256 Vortex(const Vortex&) = delete;
257 Vortex& operator=(const Vortex&) = delete;
258 Vortex(Vortex&&) = delete;
259 Vortex& operator=(Vortex&&) = delete;
260
261 //**************************************************************************//
262 //** INITIALIZATION METHODS **//
263 //**************************************************************************//
264
274 bool EnsureInitialized() noexcept;
275
277 [[nodiscard]] ManagerError GetLastError() const noexcept { return last_error_.load(); }
278
286 bool CollectDiagnostics(VortexBoardDiagnostics& out) const noexcept;
287
292 [[nodiscard]] bool IsInitialized() const noexcept { return initialized_; }
293
298 bool Shutdown() noexcept;
299
305 [[nodiscard]] bool GetSystemDiagnostics(VortexSystemDiagnostics& diagnostics) const noexcept;
306
311 [[nodiscard]] std::array<bool, kVortexManagerCount> GetComponentInitializationStatus() const noexcept;
312
319 [[nodiscard]] size_t GetFailedComponents(const char* out_names[], size_t max_entries) const noexcept;
320
328 [[nodiscard]] size_t GetSystemWarnings(const char* out_warnings[], size_t max_entries) const noexcept;
329
336 [[nodiscard]] bool CollectManagerHealth(ManagerHealthSnapshot& snapshot) noexcept;
337
338 //**************************************************************************//
339 //** COMPONENT ACCESS **//
340 //**************************************************************************//
341
344
347
350
353
356
359
362
365
368
369 //**************************************************************************//
370 //** UTILITY METHODS **//
371 //**************************************************************************//
372
377 [[nodiscard]] uint64_t GetSystemUptimeMs() const noexcept;
378
383 [[nodiscard]] uint64_t GetInitializationTimeMs() const noexcept;
384
389 void DumpSystemStatistics() const noexcept;
390
395 [[nodiscard]] bool PerformHealthCheck() noexcept;
396
401 [[nodiscard]] const char* GetSystemVersion() const noexcept;
402
403private:
404 //**************************************************************************//
405 //** PRIVATE CONSTRUCTOR **//
406 //**************************************************************************//
407
411 Vortex() noexcept;
412
416 ~Vortex() = default;
417
418 //**************************************************************************//
419 //** PRIVATE INITIALIZATION METHODS **//
420 //**************************************************************************//
421
426 bool InitializeAllComponents() noexcept;
427
429 void ShutdownComponentsLocked() noexcept;
430
432 void FailClosed(ManagerError why) noexcept;
433
434 bool InitializeNvs() noexcept;
435
440 bool InitializeComms() noexcept;
441
446 bool InitializeGpio() noexcept;
447
452 bool InitializeMotors() noexcept;
453
458 bool InitializeAdc() noexcept;
459
464 bool InitializeImu() noexcept;
465
470 bool InitializeEncoders() noexcept;
471
476 bool InitializeLeds() noexcept;
477
482 bool InitializeTemperature() noexcept;
483
487 void UpdateSystemDiagnostics() noexcept;
488
493 void AddSystemWarning(const char* warning) noexcept;
494
495 //**************************************************************************//
496 //** PRIVATE MEMBER VARIABLES **//
497 //**************************************************************************//
498
499 std::atomic<bool> initialized_;
500 std::atomic<uint64_t> initialization_start_time_;
501 std::atomic<uint64_t> initialization_end_time_;
502
503 // Component initialization status
504 std::atomic<bool> nvs_initialized_;
505 std::atomic<bool> comms_initialized_;
506 std::atomic<bool> gpio_initialized_;
507 std::atomic<bool> motors_initialized_;
508 std::atomic<bool> adc_initialized_;
509 std::atomic<bool> imu_initialized_;
510 std::atomic<bool> encoders_initialized_;
511 std::atomic<bool> leds_initialized_;
512 std::atomic<bool> temp_initialized_;
513
514 // System diagnostics (fixed-size, no heap allocation)
516
518 std::atomic<ManagerError> last_error_{ManagerError::None};
519
521 mutable RtosMutex lifecycle_mutex_;
522
524 static std::atomic<std::uint8_t> onboard_tmc9660_transport_;
525
526 // Component references (these are references to singletons, not owned)
527 // NOTE: Removed duplicate _ref_ members - public refs serve both roles
528};
529
530//==============================================================================
531// CONVENIENCE
532//==============================================================================
533
538[[nodiscard]] inline Vortex& GetVortex() noexcept {
539 return Vortex::GetInstance();
540}
541
542//==============================================================================
543// GLOBAL ACCESS MACROS
544//==============================================================================
545
550#define VORTEX_API Vortex::GetInstance()
551
556#define VORTEX_API_INIT() (Vortex::GetInstance().EnsureInitialized(), Vortex::GetInstance())
557
558#endif // VORTEX_API_H_
Vortex & GetVortex() noexcept
Convenience accessor — equivalent to Vortex::GetInstance().
Definition Vortex.h:538
VortexOnboardTmc9660Transport
Host physical layer used for the onboard TMC9660 during Vortex::InitializeMotors().
Definition Vortex.h:129
Fixed-size record of what failed and what was degraded during Vortex::EnsureInitialized().
One error catalog and one aggregated health snapshot for the whole Vortex HAL.
ManagerError
The shared error catalog (manager lane).
Definition VortexDiagnostics.h:25
@ None
No error.
constexpr size_t kVortexManagerCount
Number of managers the facade owns (NVS, comms, GPIO, LEDs, motors, ADC, IMU, encoders,...
Definition VortexDiagnostics.h:22
Version information for the Vortex HAL and API.
Singleton manager for all analogue-to-digital channels on Vortex V1.
Definition AdcManager.h:92
Singleton managing all board communication channels for Vortex V1.
Definition CommChannelsManager.h:149
Singleton for managing multiple AS5047U encoder devices with indexed access.
Definition EncoderManager.h:144
Singleton managing GPIO pins across ESP32, PCAL95555 I/O expander, and TMC9660 controllers.
Definition GpioManager.h:110
Singleton for managing multiple IMU devices with indexed access and flexible device management.
Definition ImuManager.h:167
Singleton that drives the on-board WS2812 LED via ESP-IDF RMT.
Definition LedManager.h:199
Singleton managing multiple TMC9660 motor controllers on Vortex V1.
Definition MotorController.h:207
Singleton giving access to the Vortex board persistent-storage namespaces.
Definition NvsManager.h:32
Singleton manager for all temperature sensors on Vortex V1.
Definition TemperatureManager.h:169
Definition VortexBootReport.h:20
Unified API singleton for the HardFOC Vortex platform.
Definition Vortex.h:233
bool InitializeAllComponents() noexcept
Initialize all component handlers in proper order.
Definition Vortex.cpp:587
std::atomic< bool > motors_initialized_
Definition Vortex.h:507
bool InitializeComms() noexcept
Initialize communication channels (step 2)
Definition Vortex.cpp:679
bool InitializeGpio() noexcept
Initialize GPIO management (step 3)
Definition Vortex.cpp:695
LedManager & leds
WS2812 status LED. Independent component.
Definition Vortex.h:364
std::atomic< bool > gpio_initialized_
Definition Vortex.h:506
bool InitializeImu() noexcept
Initialize IMU management (step 7)
Definition Vortex.cpp:809
GpioManager & gpio
ESP32 + I/O-expander GPIO pins. Depends on comms.
Definition Vortex.h:349
bool IsInitialized() const noexcept
Check if all Vortex systems are initialized.
Definition Vortex.h:292
bool InitializeMotors() noexcept
Initialize motor controllers (step 5 — after GPIO + LEDs)
Definition Vortex.cpp:711
AdcManager & adc
ADC channels (Vortex: TMC9660-hosted path; see AdcManager). Depends on motors.
Definition Vortex.h:355
MotorController & motors
TMC9660 motor controllers. Depends on comms.
Definition Vortex.h:352
void UpdateSystemDiagnostics() noexcept
Update system diagnostics.
Definition Vortex.cpp:877
bool EnsureInitialized() noexcept
Bring the managers up in dependency order (idempotent).
Definition Vortex.cpp:99
std::array< bool, kVortexManagerCount > GetComponentInitializationStatus() const noexcept
Get initialization status for each component.
Definition Vortex.cpp:178
void FailClosed(ManagerError why) noexcept
Record why init failed and shut everything down again. Caller holds lifecycle_mutex_.
Definition Vortex.cpp:381
std::atomic< uint64_t > initialization_start_time_
Initialization start timestamp.
Definition Vortex.h:500
size_t GetSystemWarnings(const char *out_warnings[], size_t max_entries) const noexcept
Get the warnings recorded by the last EnsureInitialized() (degraded subsystems and unusual conditions...
Definition Vortex.cpp:197
std::atomic< bool > temp_initialized_
Definition Vortex.h:512
static Vortex & GetInstance() noexcept
Get the singleton instance of Vortex API.
Definition Vortex.cpp:41
uint64_t GetInitializationTimeMs() const noexcept
Get initialization time in milliseconds.
Definition Vortex.cpp:283
EncoderManager & encoders
AS5047U rotary encoders. Depends on comms and gpio.
Definition Vortex.h:361
bool InitializeLeds() noexcept
Initialize LED management (step 4 — early for LED-only benches)
Definition Vortex.cpp:841
CommChannelsManager & comms
Communication channels (SPI, I²C, UART, CAN). After NVS.
Definition Vortex.h:343
bool Shutdown() noexcept
Shut down all subsystems in reverse initialization order.
Definition Vortex.cpp:351
std::atomic< uint64_t > initialization_end_time_
Initialization end timestamp.
Definition Vortex.h:501
bool InitializeAdc() noexcept
Initialize ADC management (step 6)
Definition Vortex.cpp:793
std::atomic< bool > initialized_
Overall initialization status.
Definition Vortex.h:499
NvsManager & nvs
Non-volatile storage (vortex / vortex_cal / vortex_cfg). Init before comms.
Definition Vortex.h:346
static std::atomic< std::uint8_t > onboard_tmc9660_transport_
Definition Vortex.h:38
ManagerError GetLastError() const noexcept
Why the last EnsureInitialized() failed (ManagerError::None after a success).
Definition Vortex.h:277
ImuManager & imu
BNO08x IMU sensors. Depends on comms and gpio.
Definition Vortex.h:358
Vortex(Vortex &&)=delete
void ShutdownComponentsLocked() noexcept
Shut down every manager that is up, in reverse init order. Caller holds lifecycle_mutex_.
Definition Vortex.cpp:386
std::atomic< ManagerError > last_error_
Why the last init attempt failed.
Definition Vortex.h:518
void DumpSystemStatistics() const noexcept
Dump comprehensive system statistics.
Definition Vortex.cpp:290
bool InitializeNvs() noexcept
Definition Vortex.cpp:663
std::atomic< bool > leds_initialized_
Definition Vortex.h:511
void AddSystemWarning(const char *warning) noexcept
Add warning message to system warnings.
Definition Vortex.cpp:920
Vortex(const Vortex &)=delete
std::atomic< bool > nvs_initialized_
Definition Vortex.h:504
Vortex & operator=(Vortex &&)=delete
uint64_t GetSystemUptimeMs() const noexcept
Get system uptime in milliseconds.
Definition Vortex.cpp:279
VortexSystemDiagnostics diagnostics_
Definition Vortex.h:515
RtosMutex lifecycle_mutex_
Serialises EnsureInitialized(), Shutdown() and the diagnostics readers (recursive).
Definition Vortex.h:521
bool PerformHealthCheck() noexcept
Perform system health check.
Definition Vortex.cpp:315
std::atomic< bool > comms_initialized_
Definition Vortex.h:505
std::atomic< bool > encoders_initialized_
Definition Vortex.h:510
bool GetSystemDiagnostics(VortexSystemDiagnostics &diagnostics) const noexcept
Get comprehensive system diagnostics.
Definition Vortex.cpp:164
std::atomic< bool > adc_initialized_
Definition Vortex.h:508
const char * GetSystemVersion() const noexcept
Get system version information.
Definition Vortex.cpp:347
bool InitializeEncoders() noexcept
Initialize encoder management (step 8)
Definition Vortex.cpp:825
static void SetOnboardTmc9660Transport(VortexOnboardTmc9660Transport transport) noexcept
Select onboard TMC9660 transport before the first EnsureInitialized().
Definition Vortex.cpp:46
size_t GetFailedComponents(const char *out_names[], size_t max_entries) const noexcept
Get list of failed components during initialization.
Definition Vortex.cpp:192
Vortex & operator=(const Vortex &)=delete
VortexBootReport report_
Failed components and warnings of the last init attempt.
Definition Vortex.h:517
TemperatureManager & temp
Temperature sensors (NTC, ESP32, TMC9660). Depends on ADC and motors.
Definition Vortex.h:367
std::atomic< bool > imu_initialized_
Definition Vortex.h:509
bool InitializeTemperature() noexcept
Initialize temperature management (step 9)
Definition Vortex.cpp:857
bool CollectDiagnostics(VortexBoardDiagnostics &out) const noexcept
Aggregated health of every manager, the buses and the device counts.
Definition Vortex.cpp:520
bool CollectManagerHealth(ManagerHealthSnapshot &snapshot) noexcept
Collect per-manager error health into a unified snapshot.
Definition Vortex.cpp:206
static VortexOnboardTmc9660Transport GetOnboardTmc9660Transport() noexcept
Effective transport for InitializeMotors() (default: Uart).
Definition Vortex.cpp:56
Per-manager health entry for unified error aggregation.
Definition Vortex.h:185
uint8_t last_error_code
Last error code (0 = success, enum-specific otherwise)
Definition Vortex.h:189
bool has_error
Whether last error is non-zero.
Definition Vortex.h:188
bool initialized
Whether manager is initialized.
Definition Vortex.h:187
const char * name
Manager name (string literal)
Definition Vortex.h:186
ManagerHealthEntry() noexcept
Definition Vortex.h:191
Aggregated health snapshot across all Vortex managers.
Definition Vortex.h:213
static constexpr size_t kMaxManagers
Definition Vortex.h:214
size_t managers_with_errors
Count of managers reporting errors.
Definition Vortex.h:218
ManagerHealthSnapshot() noexcept
Definition Vortex.h:221
ManagerHealthEntry entries[kMaxManagers]
Per-manager entries.
Definition Vortex.h:216
bool all_healthy
True if no errors and all initialized.
Definition Vortex.h:219
size_t count
Number of populated entries.
Definition Vortex.h:217
Aggregated board health (Vortex::CollectDiagnostics()). Index order of managers = init order.
Definition VortexDiagnostics.h:64
Comprehensive system diagnostics for the Vortex platform.
Definition Vortex.h:141
uint32_t total_components
Total number of components.
Definition Vortex.h:153
uint32_t initialized_components
Number of initialized components.
Definition Vortex.h:154
uint32_t failed_components
Number of failed components.
Definition Vortex.h:155
uint64_t initialization_time_ms
Total initialization time.
Definition Vortex.h:157
bool system_healthy
Overall system health.
Definition Vortex.h:142
const char * warnings[kMaxDiagEntries]
System warnings.
Definition Vortex.h:164
VortexSystemDiagnostics() noexcept
Constructor for VortexSystemDiagnostics.
Definition Vortex.h:170
bool adc_initialized
ADC management status.
Definition Vortex.h:146
size_t warnings_count
Number of warnings.
Definition Vortex.h:165
bool temp_initialized
Temperature management status.
Definition Vortex.h:151
bool encoders_initialized
Encoder management status.
Definition Vortex.h:149
bool comms_initialized
Communication channels status.
Definition Vortex.h:144
size_t failed_components_list_count
Number of failed entries.
Definition Vortex.h:163
bool nvs_initialized
NvsManager ready.
Definition Vortex.h:143
bool motors_initialized
Motor controller status.
Definition Vortex.h:147
static constexpr size_t kMaxDiagEntries
Max diagnostic entries.
Definition Vortex.h:160
const char * failed_components_list[kMaxDiagEntries]
Failed component names.
Definition Vortex.h:162
bool leds_initialized
LED management status.
Definition Vortex.h:150
bool gpio_initialized
GPIO management status.
Definition Vortex.h:145
uint64_t system_uptime_ms
System uptime.
Definition Vortex.h:158
bool imu_initialized
IMU management status.
Definition Vortex.h:148