Skip to main content

csi_webclient/ui/
config.rs

1use crate::state::{
2    AppState, CollectionMode, LogMode, OutputMode, UserIntent, WiFiMode,
3};
4
5/// Render the configuration view.
6pub fn render(ui: &mut egui::Ui, state: &mut AppState) {
7    ui.heading("Configuration");
8    ui.separator();
9
10    ui.collapsing("Wi-Fi", |ui| {
11        ui.horizontal(|ui| {
12            ui.label("Mode");
13            mode_picker(ui, &mut state.persistent.wifi.mode);
14        });
15
16        ui.horizontal(|ui| {
17            ui.label("STA SSID");
18            ui.text_edit_singleline(&mut state.persistent.wifi.sta_ssid);
19        });
20
21        ui.horizontal(|ui| {
22            ui.label("STA Password");
23            ui.add(egui::TextEdit::singleline(&mut state.persistent.wifi.sta_password).password(true));
24        });
25
26        ui.horizontal(|ui| {
27            ui.label("Channel");
28            ui.text_edit_singleline(&mut state.persistent.wifi.channel);
29        });
30
31        if ui.button("Apply Wi-Fi Config").clicked() {
32            state.push_intent(UserIntent::SetWifi(state.persistent.wifi.clone()));
33        }
34    });
35
36    ui.separator();
37
38    ui.collapsing("Traffic", |ui| {
39        ui.horizontal(|ui| {
40            ui.label("Frequency (Hz)");
41            ui.text_edit_singleline(&mut state.persistent.traffic.frequency_hz);
42            if ui.button("Apply Traffic Config").clicked() {
43                state.push_intent(UserIntent::SetTraffic(state.persistent.traffic.clone()));
44            }
45        });
46    });
47
48    ui.separator();
49
50    ui.collapsing("CSI Flags", |ui| {
51        ui.columns(2, |columns| {
52            columns[0].checkbox(&mut state.persistent.csi.disable_lltf, "disable_lltf");
53            columns[0].checkbox(&mut state.persistent.csi.disable_htltf, "disable_htltf");
54            columns[0].checkbox(&mut state.persistent.csi.disable_stbc_htltf, "disable_stbc_htltf");
55            columns[0].checkbox(&mut state.persistent.csi.disable_ltf_merge, "disable_ltf_merge");
56            columns[0].checkbox(&mut state.persistent.csi.disable_csi, "disable_csi");
57            columns[0].checkbox(&mut state.persistent.csi.disable_csi_legacy, "disable_csi_legacy");
58            columns[1].checkbox(&mut state.persistent.csi.disable_csi_ht20, "disable_csi_ht20");
59            columns[1].checkbox(&mut state.persistent.csi.disable_csi_ht40, "disable_csi_ht40");
60            columns[1].checkbox(&mut state.persistent.csi.disable_csi_su, "disable_csi_su");
61            columns[1].checkbox(&mut state.persistent.csi.disable_csi_mu, "disable_csi_mu");
62            columns[1].checkbox(&mut state.persistent.csi.disable_csi_dcm, "disable_csi_dcm");
63            columns[1].checkbox(&mut state.persistent.csi.disable_csi_beamformed, "disable_csi_beamformed");
64        });
65
66        ui.horizontal(|ui| {
67            ui.label("csi_he_stbc (u8)");
68            ui.text_edit_singleline(&mut state.persistent.csi.csi_he_stbc);
69        });
70
71        ui.horizontal(|ui| {
72            ui.label("val_scale_cfg (u8)");
73            ui.text_edit_singleline(&mut state.persistent.csi.val_scale_cfg);
74        });
75
76        if ui.button("Apply CSI Config").clicked() {
77            state.push_intent(UserIntent::SetCsi(state.persistent.csi.clone()));
78        }
79    });
80
81    ui.separator();
82
83    ui.horizontal(|ui| {
84        ui.label("Collection Mode");
85        collection_mode_picker(ui, &mut state.persistent.collection_mode);
86        if ui.button("Apply").clicked() {
87            state.push_intent(UserIntent::SetCollectionMode(state.persistent.collection_mode));
88        }
89    });
90
91    ui.horizontal(|ui| {
92        ui.label("Log Mode");
93        log_mode_picker(ui, &mut state.persistent.log_mode);
94        if ui.button("Apply").clicked() {
95            state.push_intent(UserIntent::SetLogMode(state.persistent.log_mode));
96        }
97    });
98
99    ui.horizontal(|ui| {
100        ui.label("Output Mode");
101        output_mode_picker(ui, &mut state.persistent.output_mode);
102        if ui.button("Apply").clicked() {
103            state.push_intent(UserIntent::SetOutputMode(state.persistent.output_mode));
104        }
105    });
106
107    ui.horizontal(|ui| {
108        if ui.button("Reset Config Defaults").clicked() {
109            state.push_intent(UserIntent::ResetConfig);
110        }
111
112        if ui.button("Refresh Config").clicked() {
113            state.push_intent(UserIntent::FetchConfig);
114        }
115    });
116}
117
118fn mode_picker(ui: &mut egui::Ui, mode: &mut WiFiMode) {
119    egui::ComboBox::from_id_salt("wifi_mode_combo")
120        .selected_text(mode.as_api_value())
121        .show_ui(ui, |ui| {
122            ui.selectable_value(mode, WiFiMode::Sta, "sta");
123            ui.selectable_value(mode, WiFiMode::Monitor, "monitor");
124            ui.selectable_value(mode, WiFiMode::Sniffer, "sniffer");
125        });
126}
127
128/// Render collection mode selector.
129fn collection_mode_picker(ui: &mut egui::Ui, mode: &mut CollectionMode) {
130    egui::ComboBox::from_id_salt("collection_mode_combo")
131        .selected_text(mode.as_api_value())
132        .show_ui(ui, |ui| {
133            ui.selectable_value(mode, CollectionMode::Collector, "collector");
134            ui.selectable_value(mode, CollectionMode::Listener, "listener");
135        });
136}
137
138/// Render log mode selector.
139fn log_mode_picker(ui: &mut egui::Ui, mode: &mut LogMode) {
140    egui::ComboBox::from_id_salt("log_mode_combo")
141        .selected_text(mode.as_api_value())
142        .show_ui(ui, |ui| {
143            ui.selectable_value(mode, LogMode::Text, "text");
144            ui.selectable_value(mode, LogMode::ArrayList, "array-list");
145            ui.selectable_value(mode, LogMode::Serialized, "serialized");
146        });
147}
148
149/// Render output mode selector.
150fn output_mode_picker(ui: &mut egui::Ui, mode: &mut OutputMode) {
151    egui::ComboBox::from_id_salt("output_mode_combo")
152        .selected_text(mode.as_api_value())
153        .show_ui(ui, |ui| {
154            ui.selectable_value(mode, OutputMode::Stream, "stream");
155            ui.selectable_value(mode, OutputMode::Dump, "dump");
156            ui.selectable_value(mode, OutputMode::Both, "both");
157        });
158}