@@ -64,6 +64,7 @@ const CLOCK_REFRESH_INTERVAL: Duration = Duration::from_secs(60);
6464const BATTERY_REFRESH_INTERVAL : Duration = Duration :: from_secs ( 299 ) ;
6565const AUTO_SUSPEND_REFRESH_INTERVAL : Duration = Duration :: from_secs ( 60 ) ;
6666const SUSPEND_WAIT_DELAY : Duration = Duration :: from_secs ( 15 ) ;
67+ const SUSPEND_WAIT_DELAY_TRMNL : Duration = Duration :: from_secs ( 300 ) ;
6768const PREPARE_SUSPEND_WAIT_DELAY : Duration = Duration :: from_secs ( 3 ) ;
6869
6970struct Task {
@@ -350,7 +351,7 @@ pub fn run() -> Result<(), Error> {
350351 resume ( TaskId :: Suspend , & mut tasks, view. as_mut ( ) , & tx, & mut rq, & mut context) ;
351352 } else {
352353 view. handle_event ( & Event :: Suspend , & tx, & mut bus, & mut rq, & mut context) ;
353- let interm = Intermission :: new ( context. fb . rect ( ) , IntermKind :: Suspend , & context) ;
354+ let interm = Intermission :: trmnl_or_new ( context. fb . rect ( ) , IntermKind :: Suspend , & mut context) ;
354355 rq. add ( RenderData :: new ( interm. id ( ) , * interm. rect ( ) , UpdateMode :: Full ) ) ;
355356 schedule_task ( TaskId :: PrepareSuspend , Event :: PrepareSuspend ,
356357 PREPARE_SUSPEND_WAIT_DELAY , & tx, & mut tasks) ;
@@ -374,7 +375,7 @@ pub fn run() -> Result<(), Error> {
374375 }
375376
376377 view. handle_event ( & Event :: Suspend , & tx, & mut bus, & mut rq, & mut context) ;
377- let interm = Intermission :: new ( context. fb . rect ( ) , IntermKind :: Suspend , & context) ;
378+ let interm = Intermission :: trmnl_or_new ( context. fb . rect ( ) , IntermKind :: Suspend , & mut context) ;
378379 rq. add ( RenderData :: new ( interm. id ( ) , * interm. rect ( ) , UpdateMode :: Full ) ) ;
379380 schedule_task ( TaskId :: PrepareSuspend , Event :: PrepareSuspend ,
380381 PREPARE_SUSPEND_WAIT_DELAY , & tx, & mut tasks) ;
@@ -398,6 +399,22 @@ pub fn run() -> Result<(), Error> {
398399 }
399400 } ,
400401 DeviceEvent :: NetUp => {
402+ if context. settings . trmnl . is_some ( )
403+ && tasks. iter ( ) . any ( |t| t. id == TaskId :: Suspend ) {
404+ tasks. retain ( |task| task. id != TaskId :: Suspend ) ;
405+
406+ println ! ( "Network is up, cancelling fallback suspend and preparing TRMNL refresh." ) ;
407+ // destroy and recreate the Interm::Suspend Intermission
408+ if let Some ( index) = locate :: < Intermission > ( view. as_ref ( ) ) {
409+ view. children_mut ( ) . remove ( index) ;
410+ let new_interm = Intermission :: trmnl_or_new ( context. fb . rect ( ) , IntermKind :: Suspend , & mut context) ;
411+ rq. add ( RenderData :: new ( new_interm. id ( ) , * new_interm. rect ( ) , UpdateMode :: Full ) ) ;
412+ view. children_mut ( ) . push ( Box :: new ( new_interm) as Box < dyn View > ) ;
413+ }
414+
415+ schedule_task ( TaskId :: PrepareSuspend , Event :: PrepareSuspend ,
416+ PREPARE_SUSPEND_WAIT_DELAY , & tx, & mut tasks) ;
417+ }
401418 if tasks. iter ( ) . any ( |task| task. id == TaskId :: PrepareSuspend ||
402419 task. id == TaskId :: Suspend ) {
403420 continue ;
@@ -586,6 +603,11 @@ pub fn run() -> Result<(), Error> {
586603 } ,
587604 Event :: Suspend => {
588605 if let Some ( alarm_manager) = context. alarm_manager . as_mut ( ) {
606+ if let Some ( trmnl_client) = & context. trmnl_client {
607+ alarm_manager. schedule_alarm ( AlarmType :: TrmnlRefresh , trmnl_client. refresh_rate ( ) as i64 )
608+ . map_err ( |e| eprintln ! ( "Can't schedule TRMNL refresh alarm: {:#}." , e) )
609+ . ok ( ) ;
610+ }
589611 if context. settings . auto_power_off > 0.0 && !alarm_manager. is_alarm_scheduled ( AlarmType :: AutoPowerOff ) {
590612 alarm_manager. schedule_alarm ( AlarmType :: AutoPowerOff , ( context. settings . auto_power_off * 86400.0 ) as i64 )
591613 . map_err ( |e| eprintln ! ( "Can't schedule auto power off alarm: {:#}." , e) )
@@ -612,6 +634,18 @@ pub fn run() -> Result<(), Error> {
612634 Ok ( fired_alarms) => {
613635 println ! ( "Alarms fired: {:?}" , fired_alarms) ;
614636
637+ if fired_alarms. contains ( & AlarmType :: TrmnlRefresh ) {
638+ if context. settings . wifi {
639+ println ! ( "TRMNL refresh time reached, enabling Wi-Fi to fetch new image" ) ;
640+ Command :: new ( "scripts/wifi-enable.sh" ) . status ( ) . ok ( ) ;
641+ tasks. retain ( |task| task. id != TaskId :: Suspend ) ;
642+ schedule_task ( TaskId :: Suspend , Event :: Suspend ,
643+ SUSPEND_WAIT_DELAY_TRMNL , & tx, & mut tasks) ;
644+ } else {
645+ println ! ( "TRMNL refresh time reached, but Wi-Fi is disabled. Not enabling Wi-Fi to fetch new image." ) ;
646+ }
647+ }
648+
615649 if fired_alarms. contains ( & AlarmType :: AutoPowerOff ) {
616650 power_off ( view. as_mut ( ) , & mut history, & mut updating, & mut context) ;
617651 exit_status = ExitStatus :: PowerOff ;
@@ -962,7 +996,7 @@ pub fn run() -> Result<(), Error> {
962996 let seconds = 60.0 * context. settings . auto_suspend ;
963997 if inactive_since. elapsed ( ) > Duration :: from_secs_f32 ( seconds) {
964998 view. handle_event ( & Event :: Suspend , & tx, & mut bus, & mut rq, & mut context) ;
965- let interm = Intermission :: new ( context. fb . rect ( ) , IntermKind :: Suspend , & context) ;
999+ let interm = Intermission :: trmnl_or_new ( context. fb . rect ( ) , IntermKind :: Suspend , & mut context) ;
9661000 rq. add ( RenderData :: new ( interm. id ( ) , * interm. rect ( ) , UpdateMode :: Full ) ) ;
9671001 schedule_task ( TaskId :: PrepareSuspend , Event :: PrepareSuspend ,
9681002 PREPARE_SUSPEND_WAIT_DELAY , & tx, & mut tasks) ;
0 commit comments