csi_webclient/ui/
config.rs1use crate::state::{
2 AppState, CollectionMode, LogMode, OutputMode, UserIntent, WiFiMode,
3};
4
5pub 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
128fn 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
138fn 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
149fn 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}