package Ġcom . nil h cem . assistant . andro idth ings . ui . main Ċ Ċ import Ġandroid . arch . lifecycle . Lifecycle Ċ import Ġandroid . arch . lifecycle . Lifecycle Observer Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . arch . lifecycle . On Lifecycle Event Ċ import Ġcom . google . android . things . contrib . driver . button . Button Ċ import Ġcom . google . android . things . contrib . driver . pwm servo . Ser vo Ċ import Ġcom . google . android . things . pio . Gpio Ċ import Ġcom . google . android . things . pio . Per ipheral Manager Service Ċ import Ġcom . nil h cem . assistant . andro idth ings . pubsub . Action Ċ import Ġcom . nil h cem . assistant . andro idth ings . ui . main . ey es . Em otion Ċ import Ġcom . nil h cem . assistant . andro idth ings . ui . main . ey es . E yes Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMain Board Components Ġ@ Inject Ġconstructor ( private Ġval Ġeyes : ĠE yes ) Ġ: ĠLifecycle Observer Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠGPIO _ LED Ġ= Ġ" BCM 2 5 " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠGPIO _ BUTTON Ġ= Ġ" BCM 2 3 " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠGPIO _ SER VO Ġ= Ġ" PWM 0 " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBUTTON _ DE BOUN CE _ DELAY _ MS Ġ= Ġ 2 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbutton Pressed LiveData : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġled : ĠG pio ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbutton : ĠButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservo : ĠSer vo ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ CREATE ) ĊĠĠĠ Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġperipheral Manager Service Ġ= ĠPer ipheral Manager Service () ĊĊĠĠĠĠĠĠĠ Ġled Ġ= Ġperipheral Manager Service . open Gpio ( GPIO _ LED ) ĊĠĠĠĠĠĠĠ Ġled . set Direction ( Gpio . DIRECTION _ OUT _ INIT I ALLY _ LOW ) ĊĠĠĠĠĠĠĠ Ġled . value Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġbutton Ġ= ĠButton ( GPIO _ BUTTON , ĠButton . Logic State . PRES SED _ WHEN _ LOW ) ĊĠĠĠĠĠĠĠ Ġbutton . set De bounce Delay ( BUTTON _ DE BOUN CE _ DELAY _ MS ) ĊĠĠĠĠĠĠĠ Ġbutton . setOn Button EventListener Ġ{ Ġ_, Ġpressed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġled . value Ġ= Ġpressed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Pressed LiveData . value Ġ= Ġpressed ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġservo Ġ= ĠSer vo ( GPIO _ SER VO ) ĊĠĠĠĠĠĠĠ Ġservo . set Pulse Duration Range ( 1 . 0 , Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ Ġservo . set Angle Range ( 0 . 0 , Ġ 1 8 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġservo . setEnabled ( true ) ĊĠĠĠĠĠĠĠ Ġservo . angle Ġ= Ġservo . minimum Angle ĊĊĠĠĠĠĠĠĠ Ġeyes . onCreate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ DESTROY ) ĊĠĠĠ Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġled . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġled . close () ĊĠĠĠĠĠĠĠ Ġbutton . setOn Button EventListener ( null ) ĊĠĠĠĠĠĠĠ Ġbutton . close () ĊĠĠĠĠĠĠĠ Ġservo . close () ĊĊĠĠĠĠĠĠĠ Ġeyes . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Action ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . CHO COL ATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeyes . set Em otion ( Em otion . HE ART S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ser vo () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . HE ART S Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeyes . set Em otion ( Em otion . HE ART S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . JO KE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeyes . set Em otion ( Em otion . JO KE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . NO PE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeyes . set Em otion ( Em otion . NO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction . S AD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeyes . set Em otion ( Em otion . S AD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Led s On (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġled . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Led s On ( on : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġled . value Ġ= Ġon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Ser vo () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( servo . angle Ġ< Ġ( 0 . 1 Ġ+ Ġservo . minimum Angle )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservo . angle Ġ= Ġservo . maximum Angle ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservo . angle Ġ= Ġservo . minimum Angle ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ