package Ġcom . example . arduino _ sense Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġcom . example . arduino _ sense . databinding . Control Room Layout Binding Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util .* ĊĊ Ċ /* ĠNote Ġabout Ġseek bar : Ċ Seek bar Ġdoes Ġnot Ġhave Ġxml Ġproperty Ġfor Ġbeing Ġgrey ed Ġout . Ċ This Ġmeans Ġthe Ġenabled / disabled Ġstate Ġcan 't Ġbe Ġbin ded Ġto Ġmode Ġchanges . Ċ It Ġis Ġpossible Ġto Ġdisable Ġresponse Ġto Ġthumb Ġactivity Ġby Ġreturning Ġtrue Ġfrom Ġon Touch Listener ... Ċ ... Ġwhen Ġmode Ġis Ġ" Auto ". Ċ But Ġto Ġnotify Ġuser Ġmore Ġclearly Ġif Ġthe Ġseek bar Ġis Ġenabled Ġfor Ġchange ... Ċ ... Ġwe Ġare Ġcalling Ġset Speed Bar Visibility () Ġfrom Ġevery Ġfunction Ġthat Ġchanges Ġstate . Ċ This Ġprogram matically Ġenables / disable s Ġthe Ġseek bar . Ċ */ Ċ Ċ class ĠControl Room : ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġble Controller : ĠBLE Controller ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠControl Room Layout Binding ĊĠĠĠ Ġprivate Ġvar Ġdata Service Ġ= ĠData Service () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġjob : ĠJob ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . control _ room _ layout ) ĊĠĠĠĠĠĠĠ Ġble Controller Ġ= ĠBLE Controller . getInstance ( this ) ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġstart Repe ating Job ( 3 0 0 0 0 0 ) Ġ// Ġ 3 0 0 0 0 0 Ġ 5 Ġminutes ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . control _ room _ layout ) ĊĠĠĠĠĠĠĠ Ġbinding . datas Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġbinding . auto Button . setOnClickListener Ġ{ Ġtoggle Mode () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . speed Bar . setOn Seek Bar ChangeListener ( speed Bar Listener ()) ĊĠĠĠĠĠĠĠ Ġbinding . speed Bar . setOn Touch Listener ( speed Bar State ()) ĠĠĠ Ġ// ĠNote Ġabout Ġseek bar ĊĠĠĠĠĠĠĠ Ġbinding . btn Open Temp Data . setOnClickListener { Ġopen Data () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . back btn . setOnClickListener Ġ{ Ġg ob ack () Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . switch Led . setOn Checked ChangeListener ( Compound Button . On Checked ChangeListener () Ġ{ Ġbutton View , Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . set Led Mode ( Led Mode . ON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . set Led Mode ( Led Mode . OFF ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġble Controller !!. send LED Data ( data . get Led Mode (). to _ arduino ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . off Button . setOn Checked ChangeListener ( Compound Button . On Checked ChangeListener Ġ{ Ġbutton View , Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn Fan Off () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . get Speed () Ġ== Ġ 0 Ġ&& Ġdata . get Mode () Ġ== ĠF an Modes . USER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . setIs Fan Of Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġinit Mode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ ĠLog . d (" tag ", Ġ" control Ġroom Ġon Destroy () ") ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġg ob ack (){ ĊĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠ Ġ} Ċ /* ĊĠĠĠ Ġoverride Ġfun Ġon Support Navigate Up (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊ Ġ*/ ĊĊĠĠĠ Ġ// ĠSave Ġdata Ġto Ġserver Ġevery Ġn Ġms ĊĠĠĠ Ġprivate Ġfun Ġstart Repe ating Job ( time Interval : ĠLong ): ĠJob Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCor outine Scope ( Dispatch ers . Default ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( Non C ancellable . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Service . post Data ( data . getToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost Data Req ( data . get Temperature (). toInt (), Ġdata . get Hum idity (). toInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . fetch Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( time Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlittle Endian Conversion ( bytes : ĠByteArray ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbytes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult Ġor Ġ( bytes [ i ]. toInt () Ġshl Ġ 8 Ġ* Ġi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠData Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Failed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnumber To ByteArray Ġ( data : ĠNumber , Ġsize : ĠInt Ġ= Ġ 4 ) Ġ: ĠByteArray Ġ= ĊĠĠĠĠĠĠĠ ĠByteArray Ġ( size ) Ġ{ i Ġ-> Ġ( data . to Long () Ġshr Ġ( i * 8 )). to Byte ()} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . set Mode ( if Ġ( little Endian Conversion ( ble Controller !!. get Mode ()) Ġ== Ġ 0 ) ĠF an Modes . AUTO Ġelse ĠF an Modes . USER ) ĊĠĠĠĠĠĠĠ Ġble Controller !!. read Speed () ĊĠĠĠĠĠĠĠ Ġset Speed Bar Visibility () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġspeed Bar Listener (): ĠSeek Bar . On Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeek Bar . On Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek : ĠSeek Bar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ġcustom Ġcode Ġfor Ġprogress Ġis Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ġcustom Ġcode Ġfor Ġprogress Ġis Ġstarted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ġcustom Ġcode Ġfor Ġprogress Ġis Ġstopped ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Fan Speed ( seek . progress . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġspeed Bar State (): ĠView . On Touch Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDisable Ġchanges Ġon Ġseek bar Ġby Ġin Ġauto Ġmode ĊĠĠĠĠĠĠĠ Ġreturn ĠView . On Touch Listener Ġ{ Ġp 0 , Ġp 1 Ġ-> Ġdata . get Mode () Ġ== ĠF an Modes . AUTO Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Fan Speed ( speed : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . set Speed User ( speed ) ĊĠĠĠĠĠĠĠ Ġble Controller !!. send Speed ( byte ArrayOf ( speed . to Byte ())) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Speed Bar Visibility () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . speed Bar . isEnabled Ġ= Ġdata . get Mode () Ġ== ĠF an Modes . USER ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġturn Fan Off () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . set Mode ( Fan Modes . USER ) ĊĠĠĠĠĠĠĠ Ġdata . set Speed User ( 0 ) ĊĠĠĠĠĠĠĠ Ġble Controller !!. send Mode ( data . get Mode (). to _ arduino ) ĊĠĠĠĠĠĠĠ Ġble Controller !!. send Speed ( byte ArrayOf ( 0 )) ĊĠĠĠĠĠĠĠ Ġset Speed Bar Visibility () ĊĠĠĠĠĠĠĠ Ġdata . setIs Fan Of Enabled ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Toggle d Ġmode Ġto Ġ${ data . get Mode (). btn _ text }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . toggle Mode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġble Controller !!. send Mode ( data . get Mode (). to _ arduino ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġble Controller !!. send Speed ( number To ByteArray ( data . get Speed ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Speed Bar Visibility () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" try Ġagain Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġprivate Ġfun Ġdisconnect B le () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġtoast (" Disconnect ing ") Ċ // ĠĠĠĠĠĠĠ Ġble Controller !!. disconnect () Ċ // ĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this @ Control Room , ĠMainActivity :: class . java ) Ċ // ĠĠĠĠĠĠĠ ĠstartActivity ( intent ) Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġtoast ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġtext , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} Ċ }