from pathlib import Path ROOT = Path(__file__).resolve().parents[1] DASHBOARD = ROOT / "firmware" / "esp32-s3-dashboard" / "esp32-s3-dashboard.ino" SENSOR_NODE_RECEIVER = ROOT / "firmware" / "esp32-s3-dashboard" / "sensor_node_receiver.cpp" def test_setup_done_button_event_is_handled(): source = DASHBOARD.read_text() callback_start = source.index("static void setup_keyboard_event_cb") callback_end = source.index("static void setup_textarea_event_cb", callback_start) callback = source[callback_start:callback_end] assert "LV_EVENT_CLICKED" in callback assert "lv_obj_add_flag(setup_keyboard, LV_OBJ_FLAG_HIDDEN);" in callback assert "lv_obj_add_event_cb(done_button, setup_keyboard_event_cb, LV_EVENT_CLICKED" in source def test_dashboard_can_is_passive_and_logs_changed_frames(): source = DASHBOARD.read_text() assert "TWAI_MODE_LISTEN_ONLY" in source assert "twai_transmit(" not in source assert "log_changed_can_frame(message);" in source assert 'Serial.print("CAN,");' in source assert 'can_serial_command.startsWith("TEMP,")' in source assert 'can_serial_command.startsWith("MARK,")' in source assert 'Serial.print("MARK,");' in source def test_dashboard_receives_sensor_node_rs485_for_diagnostics(): dashboard = DASHBOARD.read_text() receiver = SENSOR_NODE_RECEIVER.read_text() assert "initSensorNodeRs485();" in dashboard assert "processSensorNodeRs485();" in dashboard assert "Sensor Node RS485" in dashboard assert "sensorNodeRs485Connected()" in dashboard assert "SENSOR_NODE_RS485_RX_PIN = 43" in receiver assert "SENSOR_NODE_RS485_TX_PIN = 44" in receiver assert "SENSOR_NODE_RS485_BAUD = 115200" in receiver assert 'strcmp(type, "sensor_status")' in receiver assert 'doc["frame_sequence"]' in receiver assert "framesDropped" in receiver