#ifndef V2X_DB_H #define V2X_DB_H #include #include #include #define V2X_MAX_FRAME_LEN 320 #define SD_CARD_MOUNT_POINT "/sdcard" #define SD_CSV_FILE "/sdcard/v2x_frames.csv" #define SD_LOG_FILE "/sdcard/v2x_log.txt" #define CSV_LINE_MAX 512 #define RAW_HEX_BUF 2048 /* Message-Typen */ typedef enum { V2X_MSG_UNKNOWN = 0, V2X_MSG_BSM = 1, V2X_MSG_CAM = 2, V2X_MSG_DENM = 3, V2X_MSG_SOA3 = 4, V2X_MSG_SAE2619 = 5, V2X_MSG_SAE2725 = 6, } v2x_msg_type_t; /* Ein Frame: alle Felder werden in CSV geschrieben */ typedef struct { uint64_t timestamp_us; /* esp_timer_get_time() */ uint8_t msg_type; /* V2X_MSG_* */ uint8_t channel; /* 157-164 (5 GHz) oder 17/18 (4300 MHz) */ float frequency_mhz; /* z.B. 5845.0 */ int8_t rssi_dbm; int8_t noise_dbm; uint8_t rate_index; uint16_t frame_len; /* 802.11 PDU length */ uint8_t mac_addr[6]; /* Source MAC */ uint8_t bssid[6]; /* BSSID */ uint8_t raw_data[V2X_MAX_FRAME_LEN]; uint16_t raw_len; } v2x_frame_t; #define CSV_HEADER \ "timestamp_us,msg_type,channel,frequency_mhz,rssi_dbm,noise_dbm,rate_index,frame_len,mac_addr,bssid,raw_hex" /* === SD-Karte === */ esp_err_t v2x_sd_init(void); /* === CSV-Schreiber === */ esp_err_t v2x_sd_write_frame(const v2x_frame_t *frame); /* === Log === */ esp_err_t v2x_sd_log_write(const char *fmt, ...); /* === Statistik === */ typedef struct { uint32_t total_frames; uint32_t cam_count; uint32_t denm_count; uint32_t bsm_count; uint32_t unknown_count; uint32_t sd_write_errors; uint64_t start_timestamp_us; } v2x_stats_t; const v2x_stats_t* v2x_sd_get_stats(void); void v2x_sd_reset_stats(void); esp_err_t v2x_sd_dump_stats(void); /* === Hilfsfunktionen === */ void frame_to_csv_line(const v2x_frame_t *frame, char *out, size_t out_len); #endif /* V2X_DB_H */