874dd969b6
- NVS-Flash (4MB) durch SD-Karte via SDMMC ersetzt - GPIO: SD_CMD=2, SD_CLK=6, SD_D0=7, SD_CS=23 - CSV-Ausgabe mit Rohdaten-Hex: timestamp, msg_type, channel, RSSI, MAC, raw_hex - Channel-Hopping über alle 10 V2X-Kanäle (5845-5925 MHz) - CSV-Auto-Rotation bei >50MB - v2x_log.txt mit periodischen Statistiken - Frame Queue (64 Frames) zwischen Promisc-CB und Writer Task - Kanal-Hopper, Stats-Task, Frame-Writer als eigene Tasks - README mit SD-Vorbereitung und Analyse-Hinweisen
74 lines
2.0 KiB
C
74 lines
2.0 KiB
C
#ifndef V2X_DB_H
|
|
#define V2X_DB_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <sys/types.h>
|
|
|
|
#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 */
|