obu-firmware is now a port of the colleague's standalone VRU station (microbu-esp32c5/firmware, kept beside this repository and gitignored): the vanetza-idf C-ITS stack with the TS 103 097 security entity, credentials in NVS, the station-link v1 protocol over the native USB port (frame type 0x10 in the existing 0xAA55 framing) and over a BLE GATT peripheral, and its ITS-G5 radio adapter. The phone still builds CAM and VAM; the board adds GeoNetworking/BTP and signs with the provisioned authorization ticket. The private key never leaves the board. Builds with ESP-IDF 6.0.2 only, which vanetza-idf pins for the radio's private driver ABI. The previous C firmware stays on disk unbuilt; a full-flash backup of the bench board is kept in firmware-backups/ (gitignored). Changed against the colleague's firmware, marked MicrOBU: in the sources: - Reception unchanged for the app. vanetza-idf drops what it cannot verify (unsigned traffic, every RSU), so each captured frame also goes through the previous gn_unwrap.c and reaches the phone as link opcode V2X_RX (0x85), whose body is the old SERIAL_MSG_V2X_RX payload. - Unsigned transmission still possible, with the previous geonet.c header; the phone chooses per message. - Console on UART0 (CH343 port); the native USB port carries only link frames. - BLE advertising pauses while the USB link is in use: BLE and ITS-G5 share one RF front end. - NVS 80 KB (app at 0x20000). At 24 KB, with Wi-Fi settings the previous firmware left behind, the BLE bond could not be stored and the phone had to pair on every connection. - Bench fixes: the radio queue is drained before the first PoTi (no RX and ~177 queue drops before); the station loop waited pdMS_TO_TICKS(5) = 0 ticks at 100 Hz and starved the idle task; the 2.4 KB RX capture buffer is off the Wi-Fi task stack; BLE notifications longer than the MTU are dropped instead of cut short, MTU 517; serial writes are skipped with no USB host. - Manual country policy and TX-power read-back from the previous radio setup; logs for BLE encryption changes and the number of stored bonds. Verified on the bench board (COM3) with the phone over USB and BLE: CAM and VAM, signed and unsigned, go out; reception of the sim car and the RSU's CAM/SPATEM/MAPEM continues; the board survives app restarts and reconnects. See docs/06-signed-its-vam-ble.md.
66 lines
1.8 KiB
C++
66 lines
1.8 KiB
C++
#include "board_controls.hpp"
|
|
|
|
#include <driver/gpio.h>
|
|
#include <esp_log.h>
|
|
#include <esp_timer.h>
|
|
|
|
namespace microbu {
|
|
namespace {
|
|
const char* TAG = "board";
|
|
constexpr std::int64_t blink_us = CONFIG_MICROBU_TX_LED_BLINK_MS * 1000LL;
|
|
}
|
|
|
|
BoardControls::BoardControls() {
|
|
#if CONFIG_MICROBU_TX_LED_GPIO < 0
|
|
ESP_LOGI(TAG, "no activity LED configured");
|
|
#else
|
|
gpio_config_t led = {};
|
|
led.pin_bit_mask = 1ULL << CONFIG_MICROBU_TX_LED_GPIO;
|
|
led.mode = GPIO_MODE_OUTPUT;
|
|
led.pull_up_en = GPIO_PULLUP_DISABLE;
|
|
led.pull_down_en = GPIO_PULLDOWN_DISABLE;
|
|
led.intr_type = GPIO_INTR_DISABLE;
|
|
ESP_ERROR_CHECK(gpio_config(&led));
|
|
#if CONFIG_MICROBU_LED_INVERTED_RX
|
|
mode_ = LedMode::inverted_rx;
|
|
#else
|
|
mode_ = LedMode::normal_tx;
|
|
#endif
|
|
apply_led_state();
|
|
ESP_LOGI(TAG, "LED GPIO %d (mode: %s)", CONFIG_MICROBU_TX_LED_GPIO,
|
|
mode_ == LedMode::inverted_rx ? "inverted_rx (normally ON)" : "normal_tx (normally OFF)");
|
|
#endif
|
|
}
|
|
|
|
void BoardControls::apply_led_state() {
|
|
#if CONFIG_MICROBU_TX_LED_GPIO >= 0
|
|
// The XIAO ESP32-C5 user LED is wired active-low (0 = ON, 1 = OFF).
|
|
// In normal_tx mode: default OFF (1), pulsing ON (0).
|
|
// In inverted_rx mode: default ON (0), pulsing OFF (1).
|
|
bool led_illuminated = false;
|
|
if (mode_ == LedMode::normal_tx) {
|
|
led_illuminated = pulsing_;
|
|
} else {
|
|
led_illuminated = !pulsing_;
|
|
}
|
|
gpio_set_level(static_cast<gpio_num_t>(CONFIG_MICROBU_TX_LED_GPIO), led_illuminated ? 0 : 1);
|
|
#endif
|
|
}
|
|
|
|
void BoardControls::blink() {
|
|
pulse_until_us_ = esp_timer_get_time() + blink_us;
|
|
if (!pulsing_) {
|
|
pulsing_ = true;
|
|
apply_led_state();
|
|
}
|
|
}
|
|
|
|
void BoardControls::tick() {
|
|
if (pulsing_ && esp_timer_get_time() >= pulse_until_us_) {
|
|
pulsing_ = false;
|
|
apply_led_state();
|
|
}
|
|
}
|
|
|
|
} // namespace microbu
|