Files
common/error_handler.h
2026-05-03 23:20:16 -07:00

104 lines
2.6 KiB
C++

#ifndef ERROR_HANDLER_H
#define ERROR_HANDLER_H
#include <stdint.h>
#ifdef ARDUINO
#include <Arduino.h>
#else
#include <cstdio>
#endif
// Error codes
enum ErrorCode {
ERR_NONE = 0,
ERR_NFC_INIT_FAILED = 1,
ERR_ESPNOW_INIT_FAILED = 2,
ERR_SD_INIT_FAILED = 3,
ERR_COMMUNICATION_TIMEOUT = 4,
ERR_INVALID_MESSAGE = 5,
ERR_PAIRING_FAILED = 6,
ERR_NFC_READ_FAILED = 7,
ERR_SD_WRITE_FAILED = 8,
ERR_MEMORY_ALLOCATION = 9,
ERR_HARDWARE_FAULT = 10
};
// Error severity levels
enum ErrorSeverity {
SEVERITY_INFO = 0,
SEVERITY_WARNING = 1,
SEVERITY_ERROR = 2,
SEVERITY_CRITICAL = 3
};
// Error entry structure
struct ErrorEntry {
ErrorCode code;
ErrorSeverity severity;
unsigned long timestamp;
char description[64];
};
// Error statistics
struct ErrorStats {
uint32_t total_errors;
uint32_t critical_errors;
uint32_t last_error_time;
ErrorCode last_error_code;
uint32_t nfc_errors;
uint32_t communication_errors;
uint32_t sd_errors;
};
class ErrorHandler {
private:
static const int MAX_ERROR_HISTORY = 10;
ErrorEntry error_history[MAX_ERROR_HISTORY];
int error_index;
ErrorStats stats;
bool logging_enabled;
public:
ErrorHandler();
// Error reporting
void reportError(ErrorCode code, ErrorSeverity severity, const char* description = nullptr);
void reportNFCError(const char* description = nullptr);
void reportCommunicationError(const char* description = nullptr);
void reportSDError(const char* description = nullptr);
// Error handling
bool handleError(ErrorCode code);
void clearErrors();
// Recovery mechanisms
bool attemptNFCRecovery();
bool attemptCommunicationRecovery();
bool attemptSDRecovery();
// Status and statistics
ErrorStats getStats() const;
bool hasRecentErrors(unsigned long time_window_ms = 5000) const;
bool hasCriticalErrors() const;
void printErrorHistory() const;
void printStats() const;
// Configuration
void enableLogging(bool enable);
void setMaxRetries(int retries);
// Watchdog functionality
void feedWatchdog();
bool isSystemHealthy() const;
};
// Global error handler instance
extern ErrorHandler errorHandler;
// Convenience macros
#define REPORT_ERROR(code, severity, desc) errorHandler.reportError(code, severity, desc)
#define REPORT_NFC_ERROR(desc) errorHandler.reportNFCError(desc)
#define REPORT_COMM_ERROR(desc) errorHandler.reportCommunicationError(desc)
#define REPORT_SD_ERROR(desc) errorHandler.reportSDError(desc)
#endif // ERROR_HANDLER_H