UI: - Top bar shows a USB glyph reflecting the serial link on the ESP32-C5 path, instead of a Wi-Fi glyph driven by an MQTT state that is permanently disconnected there. - Recording screen's OBU stream row follows whichever transport the selected hardware uses. It previously read as offline throughout a recording that was actively beaconing CAMs. - Live map uses distinct markers: a centred dot for own position (a fact about the viewer, not a tracked object) and a teardrop pin for remote stations, tinted by alert severity. Both were osmdroid's identical default pin before, and severity required tapping a marker to read its label. - Sensor Monitor moves out of the bottom nav to Settings > Developer. A live phone-sensor feed is a bench tool; the Dashboard already reports GNSS/IMU health. Screen and route are unchanged, just not in the rider's way. Detection engine on the ESP32 path: - Seed our own StationID from the persisted value CamTransmitLoop transmits. It was null here (the CiT One learns it from v2x/rx/obu_gnss, which doesn't exist on this path), so the self-heard-TX filter never fired: the ESP32 runs promiscuous for raw TX to work at all, hears our own CAMs back off the air, and they were tracked as a remote station - a ghost vehicle on top of the ego position, fed to the engine as a collision partner for itself. RSSI: - The firmware has always sent per-frame RSSI in byte 0 of every CAM_RX frame; the app discarded it. Now carried on Cam, persisted per V2X message, shown per station in the received-CAM list, and exported. Null for own CAMs and the whole CiT One path, neither of which has a measurement. Trips, CSV and export (schema v3 -> v4): - trips.sessionId links a trip to the CSV session recorded alongside it. The two are written by independent subsystems that the Recording button happens to start together; without the link, deleting a trip orphaned its CSV forever. Timestamp matching was rejected - close recordings would delete the wrong file. - Deleting a trip now removes the CSV file AND its sessions row, so it stops appearing in the Session Log pointing at nothing. - Per-trip combined CSV export: GPS track, detected events, V2X messages (with RSSI) and the raw sensor samples in one file, keyed by a leading type column. One file rather than a zip of tables because the point of the export is correlating those streams, and splitting them pushes the join downstream. - Export takes the Activity context. Sharing from the ViewModel's Application context threw AndroidRuntimeException on startActivity - this crashed on the first tap of the share button. Trips recorded before v4 have a null sessionId, so their exports omit raw sensor rows and their CSVs still need clearing by hand once.
298 lines
18 KiB
XML
298 lines
18 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<resources>
|
|
<!-- App -->
|
|
<string name="app_name">MicrOBU</string>
|
|
<string name="app_subtitle">V2X Companion — Phase 02</string>
|
|
|
|
<!-- Language names (always shown in their own language) -->
|
|
<string name="lang_english">English</string>
|
|
<string name="lang_german">Deutsch</string>
|
|
|
|
<!-- Navigation -->
|
|
<string name="nav_dashboard">Dashboard</string>
|
|
<string name="nav_sensors">Sensors</string>
|
|
<string name="nav_record">Record</string>
|
|
<string name="nav_log">Log</string>
|
|
<string name="nav_v2x">V2X</string>
|
|
<string name="nav_settings">Settings</string>
|
|
<string name="nav_connection">Connection</string>
|
|
|
|
<!-- Dashboard -->
|
|
<string name="dash_gnss">GNSS</string>
|
|
<string name="dash_imu">IMU</string>
|
|
<string name="dash_obu_connection">OBU Connection</string>
|
|
<string name="dash_acquiring_fix">Acquiring fix…</string>
|
|
<string name="dash_permission_required">Permission required</string>
|
|
<string name="dash_tap_to_connect">Tap V2X to connect</string>
|
|
<string name="dash_connected">Connected</string>
|
|
<string name="dash_mqtt_connected">MQTT connected</string>
|
|
<string name="dash_mqtt_connecting">Connecting to broker…</string>
|
|
<string name="dash_mqtt_error">Broker unreachable — check V2X settings</string>
|
|
<string name="dash_recording">Recording</string>
|
|
<string name="dash_samples">samples</string>
|
|
<string name="dash_start_driving_session">Start Driving Session</string>
|
|
<string name="dash_initialising">Initialising…</string>
|
|
<string name="stat_pressure">Pressure</string>
|
|
<string name="stat_altitude">Altitude</string>
|
|
<string name="stat_heading">Heading</string>
|
|
<string name="stat_accuracy">Accuracy</string>
|
|
|
|
<!-- Sensor Screen -->
|
|
<string name="sensor_monitor_title">Sensor Monitor</string>
|
|
<string name="sensor_gnss">Phone GNSS</string>
|
|
<string name="sensor_accel">Accelerometer</string>
|
|
<string name="sensor_gyro">Gyroscope</string>
|
|
<string name="sensor_magnet">Magnetometer</string>
|
|
<string name="sensor_baro">Barometer</string>
|
|
<string name="sensor_latitude">Latitude</string>
|
|
<string name="sensor_longitude">Longitude</string>
|
|
<string name="sensor_altitude">Altitude</string>
|
|
<string name="sensor_speed">Speed</string>
|
|
<string name="sensor_heading">Heading</string>
|
|
<string name="sensor_accuracy">Accuracy</string>
|
|
<string name="sensor_pressure">Pressure</string>
|
|
<string name="sensor_est_altitude">Est. altitude</string>
|
|
<string name="sensor_waiting">Waiting for location fix…</string>
|
|
<string name="sensor_initialising">Initialising…</string>
|
|
<string name="sensor_not_present">Sensor not present on this device</string>
|
|
|
|
<!-- Connection Setup -->
|
|
<string name="conn_title">Connection Setup</string>
|
|
<string name="conn_desc">Connect to the micrOBU hardware via Bluetooth (primary) or USB-C (fallback).</string>
|
|
<string name="conn_phase2_desc">USB-C tethering is the primary transport in Phase 02. Plug the OBU in and tap Connect.</string>
|
|
<string name="conn_bluetooth">Bluetooth</string>
|
|
<string name="conn_bluetooth_phase3">Bluetooth</string>
|
|
<string name="conn_bluetooth_phase3_desc">Bluetooth connection is planned for Phase 03 and is not yet implemented.</string>
|
|
<string name="conn_esp32_title">ESP32-C5 (USB Serial)</string>
|
|
<string name="conn_esp32_phase3_desc">USB-serial connection to the ESP32-C5 is scaffolded for Phase 03 but not yet functional — it needs the ESP32 firmware protocol translated to Kotlin first.</string>
|
|
<string name="conn_esp32_state_disconnected">Not connected — plug the ESP32-C5 into the native USB-C port and tap Connect.</string>
|
|
<string name="conn_esp32_state_device_attached">Device detected, opening…</string>
|
|
<string name="conn_esp32_state_permission_requested">Waiting for USB permission…</string>
|
|
<string name="conn_esp32_state_connected">Connected</string>
|
|
<string name="conn_esp32_state_error">Connection error — check the cable and native USB-C port, then try again.</string>
|
|
<string name="conn_esp32_connect">Connect to ESP32-C5</string>
|
|
<string name="conn_scan">Scan for Devices</string>
|
|
<string name="conn_scanning">Scanning…</string>
|
|
<string name="conn_usb_title">USB-C (Primary)</string>
|
|
<string name="conn_usb_stub">Connect via USB-C (not yet implemented)</string>
|
|
<string name="conn_usb_cable_ok">Cable detected</string>
|
|
<string name="conn_usb_cable_missing">No cable</string>
|
|
<string name="conn_usb_obu_ip">OBU IP</string>
|
|
<string name="conn_usb_detecting">Detecting…</string>
|
|
<string name="conn_usb_mode">IP source</string>
|
|
<string name="conn_usb_auto">Auto-detected</string>
|
|
<string name="conn_usb_manual">Manual override</string>
|
|
<string name="conn_usb_no_cable_hint">⚠ Connect the USB-C cable to detect the OBU, or disable auto-detect in Settings → Connection to use a manual IP.</string>
|
|
<string name="conn_connect">Connect</string>
|
|
<string name="conn_connect_mqtt">Connect to OBU</string>
|
|
<string name="conn_disconnect">Disconnect</string>
|
|
<string name="conn_selected">Selected</string>
|
|
<string name="conn_connected_stub">Connected (stub)</string>
|
|
<string name="conn_stub_warning">⚠ Bluetooth stack not yet implemented. This screen shows the target UI layout.</string>
|
|
|
|
<!-- Recording -->
|
|
<string name="rec_title">Recording Session</string>
|
|
<string name="rec_ready">Ready to record</string>
|
|
<string name="rec_samples_captured">%1$d samples captured</string>
|
|
<string name="rec_active_streams">Active Streams</string>
|
|
<string name="rec_button_stop">STOP</string>
|
|
<string name="rec_button_rec">REC</string>
|
|
<string name="stream_gnss">Phone GNSS</string>
|
|
<string name="stream_accel">Accelerometer</string>
|
|
<string name="stream_gyro">Gyroscope</string>
|
|
<string name="stream_magnet">Magnetometer</string>
|
|
<string name="stream_baro">Barometer</string>
|
|
<string name="stream_obu">OBU / MQTT</string>
|
|
|
|
<!-- Session Log -->
|
|
<string name="log_title">Session Log</string>
|
|
<string name="log_stored_one">%1$d session stored on device</string>
|
|
<string name="log_stored_other">%1$d sessions stored on device</string>
|
|
<string name="log_session_number">Session #%1$d</string>
|
|
<string name="log_share_cd">Share CSV</string>
|
|
<string name="log_save_cd">Save to device</string>
|
|
<string name="trip_export_cd">Export trip CSV</string>
|
|
<string name="log_delete_cd">Delete session</string>
|
|
<string name="log_empty_title">No sessions yet</string>
|
|
<string name="log_empty_desc">Go to Record and start a session</string>
|
|
<string name="log_delete_dialog_title">Delete session?</string>
|
|
<string name="log_delete_dialog_text">This will permanently remove the session recorded on %1$s from the device.</string>
|
|
<string name="log_delete_confirm">Delete</string>
|
|
<string name="log_cancel">Cancel</string>
|
|
<string name="log_export_chooser">Export session</string>
|
|
|
|
<!-- GNSS bottom sheet & map -->
|
|
<string name="gnss_sheet_title">GNSS Location</string>
|
|
<string name="gnss_open_maps">Open in Maps App</string>
|
|
<string name="gnss_open_maps_sub">Opens in your preferred maps application</string>
|
|
<string name="gnss_view_inapp">View in App</string>
|
|
<string name="gnss_view_inapp_sub">Show current location on an in-app map</string>
|
|
<string name="gnss_no_fix">No GPS fix yet — move to an open area</string>
|
|
<string name="map_title">Location Map</string>
|
|
<string name="map_location_label">Current Location</string>
|
|
<string name="v2x_map_remote_count">%1$d tracked remote road user(s)</string>
|
|
<string name="v2x_map_own_label">Own (ego)</string>
|
|
<string name="v2x_map_remote_plain">Remote #%1$d</string>
|
|
<string name="v2x_map_remote_info">Remote #%1$d · Info</string>
|
|
<string name="v2x_map_remote_awareness">Remote #%1$d · Awareness</string>
|
|
<string name="v2x_map_remote_warning">Remote #%1$d · Warning</string>
|
|
|
|
<!-- Settings -->
|
|
<string name="settings_title">Settings</string>
|
|
<string name="settings_language">Language</string>
|
|
<string name="settings_appearance">Appearance</string>
|
|
<string name="settings_dark_theme">Dark theme</string>
|
|
<string name="settings_sensors">Sensor Streams</string>
|
|
<string name="settings_gnss">Phone GNSS</string>
|
|
<string name="settings_accel">Accelerometer</string>
|
|
<string name="settings_gyro">Gyroscope</string>
|
|
<string name="settings_magnet">Magnetometer</string>
|
|
<string name="settings_baro">Barometer</string>
|
|
<string name="settings_units">Units</string>
|
|
<string name="settings_metric">Metric (m, km/h, hPa)</string>
|
|
<string name="settings_mqtt_section">MQTT Broker</string>
|
|
<string name="settings_broker_ip">Broker IP</string>
|
|
<string name="settings_port">Port</string>
|
|
<string name="settings_username">Username</string>
|
|
<string name="settings_password">Password</string>
|
|
<string name="settings_optional">optional</string>
|
|
<string name="settings_show">Show</string>
|
|
<string name="settings_hide">Hide</string>
|
|
<string name="settings_developer">Developer</string>
|
|
<string name="settings_dev_mode">Developer mode</string>
|
|
<string name="settings_wifi">Wi-Fi OBU connection</string>
|
|
<string name="settings_wifi_val">Dev mode only — not implemented</string>
|
|
<string name="settings_about">About</string>
|
|
<string name="settings_app_version">App version</string>
|
|
<string name="settings_app_version_val">0.5.0 (Phase 03 — ESP32-C5 serial link + phone-built CAM)</string>
|
|
<string name="settings_connection">Connection</string>
|
|
<string name="settings_usb_auto_detect">Auto-detect OBU via USB-C</string>
|
|
<string name="settings_usb_manual_ip">Manual OBU IP</string>
|
|
<string name="settings_obu_hardware">OBU Hardware</string>
|
|
<string name="settings_obu_hardware_cit_one">CiT One</string>
|
|
<string name="settings_obu_hardware_esp32">ESP32-C5</string>
|
|
<string name="settings_obu_hardware_esp32_note">ESP32-C5 acts as a "dumb" transceiver: CAM is built and encoded on the phone, sent to the ESP32 over USB serial, and broadcast over ITS-G5. No MQTT broker or DENM use-case engine on this path — see the V2X Monitor screen\'s CAM Pinger for a manual test tool.</string>
|
|
<string name="settings_usb_transport">Active transport</string>
|
|
<string name="settings_transport_usbc">USB-C</string>
|
|
<string name="settings_transport_wifi">Wi-Fi</string>
|
|
<string name="settings_save_broker">Save Broker Settings</string>
|
|
|
|
<!-- MQTT Topic Viewer -->
|
|
<string name="mqtt_viewer_title">V2X Monitor</string>
|
|
<string name="mqtt_connect">Connect</string>
|
|
<string name="mqtt_disconnect">Disconnect</string>
|
|
<string name="mqtt_auto_scroll">Auto-scroll to latest</string>
|
|
<string name="mqtt_no_topics">No messages yet</string>
|
|
<string name="mqtt_view_list">List</string>
|
|
<string name="mqtt_view_map">Map</string>
|
|
<string name="mqtt_no_topics_hint">Connect to the OBU and wait for V2X traffic</string>
|
|
<string name="mqtt_no_messages">No messages on this topic yet</string>
|
|
|
|
<!-- DENM TX — manual antenna/RSU-range test tool only, not use-case-driven -->
|
|
<string name="mqtt_last_tx">Last transmitted payload:</string>
|
|
<string name="mqtt_denm_tx_title">DENM Transmission (Manual Test)</string>
|
|
<string name="mqtt_send_denm">Send Test DENM</string>
|
|
<string name="mqtt_stop_denm">Stop DENM</string>
|
|
<string name="mqtt_denm_use_case_desc">Aftermarket Stationary Vehicle (causeCode 94)</string>
|
|
<string name="mqtt_denm_not_connected">Connect to the OBU to enable DENM triggering</string>
|
|
<string name="mqtt_denm_active">DENM active — OBU broadcasting via ITS-G5</string>
|
|
<string name="mqtt_denm_hint">Manual antenna/RSU range test — publishes uca-denmctrl (retained) to v2x-uca/input/denmtrg. Not triggered by detected events or use case alerts.</string>
|
|
<string name="mqtt_denm_show">Show last TX</string>
|
|
<string name="mqtt_denm_hide">Hide</string>
|
|
|
|
<!-- CAM Pinger — ESP32-C5-only manual bench test, equivalent to the DENM TX card above -->
|
|
<string name="mqtt_cam_pinger_title">CAM Pinger (Manual Test)</string>
|
|
<string name="mqtt_cam_pinger_desc">1 Hz CAM ping built from live GNSS and IMU data — verifies the serial link and ESP32 radio path without needing a trip recording.</string>
|
|
<string name="mqtt_cam_pinger_no_fix">Waiting for GNSS fix — nothing transmitted yet</string>
|
|
|
|
<!-- Received-CAM list (ESP32-C5 path) -->
|
|
<string name="v2x_cam_rx_count">%1$d station(s) in range — latest CAM per station</string>
|
|
<string name="v2x_cam_rx_none">No CAMs received</string>
|
|
<string name="v2x_cam_rx_none_hint">Decoded CAMs from nearby stations appear here as they arrive over the serial link.</string>
|
|
<string name="v2x_cam_rx_station">Station %1$d · %2$s</string>
|
|
<string name="v2x_cam_rx_kinematics">%1$.1f km/h · heading %2$.0f°</string>
|
|
<string name="v2x_cam_rx_distance">%1$.0f m</string>
|
|
<string name="v2x_cam_rx_distance_unknown">— m</string>
|
|
<string name="v2x_cam_rx_rssi">%1$d dBm</string>
|
|
|
|
<!-- DENM map pins -->
|
|
<string name="v2x_map_denm_labeled">Hazard: cause %1$d/%2$d (station %3$d)</string>
|
|
<string name="v2x_map_denm_plain">Hazard from station %1$d</string>
|
|
|
|
<!-- ETSI station types -->
|
|
<string name="station_type_pedestrian">Pedestrian</string>
|
|
<string name="station_type_cyclist">Cyclist</string>
|
|
<string name="station_type_car">Car</string>
|
|
<string name="station_type_bus">Bus</string>
|
|
<string name="station_type_truck">Truck</string>
|
|
<string name="station_type_rsu">Roadside unit</string>
|
|
<string name="station_type_other">Type %1$d</string>
|
|
<string name="mqtt_cam_pinger_not_connected">Connect the ESP32-C5 to enable the CAM pinger</string>
|
|
<string name="mqtt_cam_pinger_active">Pinging — 1 CAM/s over the serial link</string>
|
|
<string name="mqtt_cam_pinger_sent_count">Sent: %1$d</string>
|
|
<string name="mqtt_cam_pinger_send_failures">Write failures: %1$d consecutive — CAMs are not reaching the ESP32</string>
|
|
<string name="mqtt_cam_pinger_fw_counters">ESP32: tx fail %1$d · oversize %2$d · crc err %3$d</string>
|
|
<string name="mqtt_start_pinger">Start Pinger</string>
|
|
<string name="mqtt_stop_pinger">Stop Pinger</string>
|
|
|
|
<!-- CAM-based Use Case Alert panel -->
|
|
<string name="mqtt_usecase_panel_title">CAM Use Case Alerts</string>
|
|
<string name="mqtt_usecase_not_connected">Connect to the OBU to evaluate CAM-based use cases</string>
|
|
<string name="mqtt_usecase_none_active">No active use case alerts</string>
|
|
<string name="mqtt_usecase_detail">Station %1$d · %2$.0f m · closing %3$.1f m/s · TTC %4$.1f s · %5$s</string>
|
|
|
|
<!-- Human-readable use-case narratives (Section 10.4 — not just raw JSON) -->
|
|
<string name="usecase_narrative_ima_b">Crossing vehicle ahead — %1$.0f s to conflict</string>
|
|
<string name="usecase_narrative_ima_s">Stopped vehicle may pull out — %1$.0f s</string>
|
|
<string name="usecase_narrative_rtw_b">Car turning right toward you — %1$.0f s</string>
|
|
<string name="usecase_narrative_ltw_b">Car turning left toward you — %1$.0f s</string>
|
|
<string name="usecase_narrative_smva_bcw_b">Fast-closing vehicle nearby — %1$.0f s</string>
|
|
|
|
<!-- Settings > Use Case Alerts -->
|
|
<string name="settings_usecase_alerts">Use Case Alerts</string>
|
|
<string name="settings_usecase_alerts_desc">Per-use-case enable/disable for the CAM-based Use Case Alert panel on the V2X Monitor screen. All use cases are CAM-only — none of them trigger a DENM.</string>
|
|
<string name="settings_usecase_alert_levels_title">Alert level thresholds (read-only)</string>
|
|
<string name="settings_usecase_level_warning">Warning</string>
|
|
<string name="settings_usecase_level_awareness">Awareness</string>
|
|
<string name="settings_usecase_level_info">Info</string>
|
|
<string name="settings_usecase_ttc_le">≤ %1$.0f s to conflict</string>
|
|
|
|
<!-- Dashboard transport -->
|
|
<string name="dash_transport_usbc">USB-C</string>
|
|
<string name="dash_transport_usb_serial">USB Serial</string>
|
|
<string name="dash_transport_wifi">Wi-Fi</string>
|
|
<string name="dash_transport_bt">BT</string>
|
|
|
|
<!-- OBU stationType warning -->
|
|
<string name="dash_station_type_warning">⚠ OBU stationType ≠ 2 (cyclist) — VRU detection may be impaired at equipped intersections</string>
|
|
|
|
<string name="settings_platform">Platform</string>
|
|
<string name="settings_platform_val">Android / Kotlin / Jetpack Compose</string>
|
|
<string name="settings_project">Project</string>
|
|
<string name="settings_project_val">MicrOBU — HAW Hamburg & consider it GmbH</string>
|
|
|
|
<!-- Phase A: Trip Recording (bottom nav) -->
|
|
<string name="nav_trips">Trips</string>
|
|
|
|
<!-- Phase A: Recording screen event counters -->
|
|
<string name="rec_events_detected">Detected Events</string>
|
|
<string name="rec_event_braking">Braking</string>
|
|
<string name="rec_event_turning">Turning</string>
|
|
<string name="rec_event_stopping">Stopping</string>
|
|
<string name="rec_stream_event_detection">Event Detection</string>
|
|
<string name="rec_open_session_log">CSV Session Log</string>
|
|
|
|
<!-- Phase A: Trip History screen -->
|
|
<string name="trip_history_title">Trip History</string>
|
|
<string name="trip_history_count_one">%1$d trip stored on device</string>
|
|
<string name="trip_history_count_other">%1$d trips stored on device</string>
|
|
<string name="trip_number">Trip #%1$d</string>
|
|
<string name="trip_delete_title">Delete trip?</string>
|
|
<string name="trip_delete_text">This will permanently remove the trip recorded on %1$s.</string>
|
|
<string name="trip_empty_title">No trips yet</string>
|
|
<string name="trip_empty_desc">Go to Record and start a session</string>
|
|
|
|
<!-- Phase A: Trip Review screen -->
|
|
<string name="trip_review_title">Trip Review</string>
|
|
</resources>
|