@@ -6,14 +6,15 @@ extern crate preferences;
6
6
extern crate serde;
7
7
8
8
use std:: cmp:: max;
9
+ use std:: path:: PathBuf ;
9
10
use std:: sync:: mpsc:: { Receiver , Sender } ;
10
11
use std:: sync:: { mpsc, Arc , RwLock } ;
11
12
use std:: thread;
12
13
use std:: time:: Duration ;
13
14
14
15
use crate :: data:: { DataContainer , Packet } ;
15
16
use crate :: gui:: { load_gui_settings, MyApp , RIGHT_PANEL_WIDTH } ;
16
- use crate :: io:: { save_to_csv, FileOptions } ;
17
+ use crate :: io:: { open_from_csv , save_to_csv, FileOptions } ;
17
18
use crate :: serial:: { load_serial_settings, serial_thread, Device } ;
18
19
use eframe:: egui:: { vec2, ViewportBuilder , Visuals } ;
19
20
use eframe:: { egui, icon_data} ;
@@ -51,51 +52,90 @@ fn main_thread(
51
52
data_lock : Arc < RwLock < DataContainer > > ,
52
53
raw_data_rx : Receiver < Packet > ,
53
54
save_rx : Receiver < FileOptions > ,
55
+ load_rx : Receiver < PathBuf > ,
54
56
clear_rx : Receiver < bool > ,
55
57
) {
56
58
// reads data from mutex, samples and saves if needed
57
59
let mut data = DataContainer :: default ( ) ;
58
60
let mut failed_format_counter = 0 ;
61
+
62
+ let mut file_opened = false ;
63
+
59
64
loop {
60
65
if let Ok ( cl) = clear_rx. recv_timeout ( Duration :: from_millis ( 1 ) ) {
61
66
if cl {
62
67
data = DataContainer :: default ( ) ;
63
68
failed_format_counter = 0 ;
64
69
}
65
70
}
66
-
67
- if let Ok ( packet) = raw_data_rx. recv_timeout ( Duration :: from_millis ( 1 ) ) {
68
- if !packet. payload . is_empty ( ) {
69
- sync_tx. send ( true ) . expect ( "unable to send sync tx" ) ;
70
- data. raw_traffic . push ( packet. clone ( ) ) ;
71
- let split_data = split ( & packet. payload ) ;
72
- if data. dataset . is_empty ( ) || failed_format_counter > 10 {
73
- // resetting dataset
74
- data. dataset = vec ! [ vec![ ] ; max( split_data. len( ) , 1 ) ] ;
75
- failed_format_counter = 0 ;
76
- // println!("resetting dataset. split length = {}, length data.dataset = {}", split_data.len(), data.dataset.len());
77
- } else if split_data. len ( ) == data. dataset . len ( ) {
78
- // appending data
79
- for ( i, set) in data. dataset . iter_mut ( ) . enumerate ( ) {
80
- set. push ( split_data[ i] ) ;
81
- failed_format_counter = 0 ;
82
- }
83
- data. time . push ( packet. relative_time ) ;
84
- data. absolute_time . push ( packet. absolute_time ) ;
85
- if data. time . len ( ) != data. dataset [ 0 ] . len ( ) {
71
+ if !file_opened {
72
+ if let Ok ( packet) = raw_data_rx. recv_timeout ( Duration :: from_millis ( 1 ) ) {
73
+ if !packet. payload . is_empty ( ) {
74
+ sync_tx. send ( true ) . expect ( "unable to send sync tx" ) ;
75
+ data. raw_traffic . push ( packet. clone ( ) ) ;
76
+ let split_data = split ( & packet. payload ) ;
77
+ if data. dataset . is_empty ( ) || failed_format_counter > 10 {
86
78
// resetting dataset
87
- data. time = vec ! [ ] ;
88
79
data. dataset = vec ! [ vec![ ] ; max( split_data. len( ) , 1 ) ] ;
80
+ failed_format_counter = 0 ;
81
+ // println!("resetting dataset. split length = {}, length data.dataset = {}", split_data.len(), data.dataset.len());
82
+ } else if split_data. len ( ) == data. dataset . len ( ) {
83
+ // appending data
84
+ for ( i, set) in data. dataset . iter_mut ( ) . enumerate ( ) {
85
+ set. push ( split_data[ i] ) ;
86
+ failed_format_counter = 0 ;
87
+ }
88
+ data. time . push ( packet. relative_time ) ;
89
+ data. absolute_time . push ( packet. absolute_time ) ;
90
+ if data. time . len ( ) != data. dataset [ 0 ] . len ( ) {
91
+ // resetting dataset
92
+ data. time = vec ! [ ] ;
93
+ data. dataset = vec ! [ vec![ ] ; max( split_data. len( ) , 1 ) ] ;
94
+ }
95
+ } else {
96
+ // not same length
97
+ failed_format_counter += 1 ;
98
+ // println!("not same length in main! length split_data = {}, length data.dataset = {}", split_data.len(), data.dataset.len())
89
99
}
90
- } else {
91
- // not same length
92
- failed_format_counter += 1 ;
93
- // println!("not same length in main! length split_data = {}, length data.dataset = {}", split_data.len(), data.dataset.len())
94
100
}
95
- if let Ok ( mut write_guard) = data_lock. write ( ) {
96
- * write_guard = data. clone ( ) ;
101
+ }
102
+ }
103
+ if let Ok ( fp) = load_rx. recv_timeout ( Duration :: from_millis ( 10 ) ) {
104
+ if let Some ( file_ending) = fp. extension ( ) {
105
+ match file_ending. to_str ( ) . unwrap ( ) {
106
+ "csv" => {
107
+ file_opened = true ;
108
+ let mut file_options = FileOptions {
109
+ file_path : fp. clone ( ) ,
110
+ save_absolute_time : false ,
111
+ save_raw_traffic : false ,
112
+ names : vec ! [ ] ,
113
+ } ;
114
+ match open_from_csv ( & mut data, & mut file_options) {
115
+ Ok ( _) => {
116
+ log:: info!( "opened {:?}" , fp) ;
117
+ }
118
+ Err ( err) => {
119
+ file_opened = false ;
120
+ log:: error!( "failed opening {:?}: {:?}" , fp, err) ;
121
+ }
122
+ } ;
123
+ }
124
+ _ => {
125
+ file_opened = false ;
126
+ log:: error!( "file not supported: {:?} \n Close the file to connect to a spectrometer or open another file." , fp) ;
127
+ continue ;
128
+ }
97
129
}
130
+ } else {
131
+ file_opened = false ;
98
132
}
133
+ } else {
134
+ file_opened = false ;
135
+ }
136
+
137
+ if let Ok ( mut write_guard) = data_lock. write ( ) {
138
+ * write_guard = data. clone ( ) ;
99
139
}
100
140
101
141
if let Ok ( csv_options) = save_rx. recv_timeout ( Duration :: from_millis ( 1 ) ) {
@@ -129,6 +169,7 @@ fn main() {
129
169
let connected_lock = Arc :: new ( RwLock :: new ( false ) ) ;
130
170
131
171
let ( save_tx, save_rx) : ( Sender < FileOptions > , Receiver < FileOptions > ) = mpsc:: channel ( ) ;
172
+ let ( load_tx, load_rx) : ( Sender < PathBuf > , Receiver < PathBuf > ) = mpsc:: channel ( ) ;
132
173
let ( send_tx, send_rx) : ( Sender < String > , Receiver < String > ) = mpsc:: channel ( ) ;
133
174
let ( clear_tx, clear_rx) : ( Sender < bool > , Receiver < bool > ) = mpsc:: channel ( ) ;
134
175
let ( raw_data_tx, raw_data_rx) : ( Sender < Packet > , Receiver < Packet > ) = mpsc:: channel ( ) ;
@@ -151,7 +192,14 @@ fn main() {
151
192
let main_data_lock = data_lock. clone ( ) ;
152
193
153
194
let _main_thread_handler = thread:: spawn ( || {
154
- main_thread ( sync_tx, main_data_lock, raw_data_rx, save_rx, clear_rx) ;
195
+ main_thread (
196
+ sync_tx,
197
+ main_data_lock,
198
+ raw_data_rx,
199
+ save_rx,
200
+ load_rx,
201
+ clear_rx,
202
+ ) ;
155
203
} ) ;
156
204
157
205
let options = eframe:: NativeOptions {
@@ -196,6 +244,7 @@ fn main() {
196
244
gui_connected_lock,
197
245
gui_settings,
198
246
save_tx,
247
+ load_tx,
199
248
send_tx,
200
249
clear_tx,
201
250
) ) )
0 commit comments