1+ use std:: sync:: { Arc , RwLock } ;
12use std:: { io:: stdout, time:: Instant } ;
23use std:: { sync:: mpsc, time:: Duration } ;
34
@@ -121,6 +122,8 @@ enum Event {
121122 Update ( Metrics ) ,
122123 ChangeColor ,
123124 ChangeView ,
125+ IncInterval ,
126+ DecInterval ,
124127 Tick ,
125128 Quit ,
126129}
@@ -131,6 +134,9 @@ fn handle_key_event(key: &event::KeyEvent, tx: &mpsc::Sender<Event>) -> WithErro
131134 KeyCode :: Char ( 'c' ) if key. modifiers == KeyModifiers :: CONTROL => Ok ( tx. send ( Event :: Quit ) ?) ,
132135 KeyCode :: Char ( 'c' ) => Ok ( tx. send ( Event :: ChangeColor ) ?) ,
133136 KeyCode :: Char ( 'v' ) => Ok ( tx. send ( Event :: ChangeView ) ?) ,
137+ KeyCode :: Char ( '+' ) => Ok ( tx. send ( Event :: IncInterval ) ?) ,
138+ KeyCode :: Char ( '=' ) => Ok ( tx. send ( Event :: IncInterval ) ?) , // fallback to press without shift
139+ KeyCode :: Char ( '-' ) => Ok ( tx. send ( Event :: DecInterval ) ?) ,
134140 _ => Ok ( ( ) ) ,
135141 }
136142}
@@ -157,17 +163,16 @@ fn run_inputs_thread(tx: mpsc::Sender<Event>, tick: u64) {
157163 } ) ;
158164}
159165
160- fn run_sampler_thread ( tx : mpsc:: Sender < Event > , interval : u64 ) {
161- let interval = interval. max ( 100 ) . min ( 10000 ) ;
162-
166+ fn run_sampler_thread ( tx : mpsc:: Sender < Event > , msec : Arc < RwLock < u32 > > ) {
163167 std:: thread:: spawn ( move || {
164168 let mut sampler = Sampler :: new ( ) . unwrap ( ) ;
165169
166170 // Send initial metrics
167171 tx. send ( Event :: Update ( sampler. get_metrics ( 100 ) . unwrap ( ) ) ) . unwrap ( ) ;
168172
169173 loop {
170- tx. send ( Event :: Update ( sampler. get_metrics ( interval) . unwrap ( ) ) ) . unwrap ( ) ;
174+ let msec = * msec. read ( ) . unwrap ( ) ;
175+ tx. send ( Event :: Update ( sampler. get_metrics ( msec) . unwrap ( ) ) ) . unwrap ( ) ;
171176 }
172177 } ) ;
173178}
@@ -372,7 +377,7 @@ impl App {
372377 } ;
373378
374379 let block = self . title_block ( & label_l, & label_r) ;
375- let usage = " Press 'q' to quit, 'c' – color, 'v' – view " ;
380+ let usage = format ! ( " 'q' – quit, 'c' – color, 'v' – view | -/+ {}ms " , self . cfg . interval ) ;
376381 let block = block. title_bottom ( Line :: from ( usage) . right_aligned ( ) ) ;
377382 let iarea = block. inner ( rows[ 1 ] ) ;
378383 f. render_widget ( block, rows[ 1 ] ) ;
@@ -387,10 +392,14 @@ impl App {
387392 f. render_widget ( self . get_power_block ( "ANE" , & self . ane_power , 0.0 ) , ha[ 2 ] ) ;
388393 }
389394
390- pub fn run_loop ( & mut self , interval : u64 ) -> WithError < ( ) > {
395+ pub fn run_loop ( & mut self , interval : Option < u32 > ) -> WithError < ( ) > {
396+ // use from arg if provided, otherwise use config restored value
397+ self . cfg . interval = interval. unwrap_or ( self . cfg . interval ) . max ( 100 ) . min ( 10_000 ) ;
398+ let msec = Arc :: new ( RwLock :: new ( self . cfg . interval ) ) ;
399+
391400 let ( tx, rx) = mpsc:: channel :: < Event > ( ) ;
392401 run_inputs_thread ( tx. clone ( ) , 250 ) ;
393- run_sampler_thread ( tx. clone ( ) , interval ) ;
402+ run_sampler_thread ( tx. clone ( ) , msec . clone ( ) ) ;
394403
395404 let mut term = enter_term ( ) ;
396405
@@ -402,6 +411,14 @@ impl App {
402411 Event :: Update ( data) => self . update_metrics ( data) ,
403412 Event :: ChangeColor => self . cfg . next_color ( ) ,
404413 Event :: ChangeView => self . cfg . next_view_type ( ) ,
414+ Event :: IncInterval => {
415+ self . cfg . inc_interval ( ) ;
416+ * msec. write ( ) . unwrap ( ) = self . cfg . interval ;
417+ }
418+ Event :: DecInterval => {
419+ self . cfg . dec_interval ( ) ;
420+ * msec. write ( ) . unwrap ( ) = self . cfg . interval ;
421+ }
405422 _ => { }
406423 }
407424 }
0 commit comments