package Ġme . cyber . n uk le os . thing Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . google . android . things . contrib . driver . pwm servo . Ser vo Ċ import Ġcom . z ugal dia . rob oc ar . hardware . ad afruit 2 3 4 8 . Ad afruit Motor Hat Ċ import Ġme . cyber . n uk le os . IM ot ors Ċ import Ġme . cyber . n uk le os . Motor Message Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . math . absolute Value Ċ Ċ class ĠMotor Controller Ġ: ĠIM ot ors Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcommand Executor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠ Ġ// ada Ġmot ors Ġare Ġindexed Ġfrom Ġ 1 ; Ġ 0 th Ġelement Ġis Ġempty ĊĠĠĠ Ġprivate Ġval Ġmot ors Speed s Ġ= ĠByteArray ( IM ot ors . MOT ORS _ COUNT ) ĊĊĠĠĠ Ġprivate Ġvar Ġmotor Hat Ġ= ĠAd afruit Motor Hat ( 0 ) ĊĠĠĠ Ġprivate Ġval Ġmotor Hat 1 Ġ= ĠAd afruit Motor Hat ( 1 ) ĊĠĠĠ Ġ// 0 Ġbase , Ġpin ĠĠ 1 8 ; ĊĠĠĠ Ġprivate Ġval Ġservo 0 Ġ= Ġinit Ser vo (" PWM 0 ", ĠIM ot ors . BASE _ SER VO _ CLOSE , Ġ 0 . 0 , Ġ 1 8 0 . 0 ) ĊĠĠĠ Ġ// 1 Ġupper , Ġpin ĠĠ 1 3 ; ĊĠĠĠ Ġprivate Ġval Ġservo 1 Ġ= Ġinit Ser vo (" PWM 1 ", ĠIM ot ors . TOP _ SER VO _ CLOSE , Ġ 0 . 0 , Ġ 1 8 0 . 0 ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Speed s (): ĠByteArray Ġ= Ġmot ors Speed s ĊĊĠĠĠ Ġoverride Ġfun Ġget Connection Status () Ġ= ĠIM ot ors . Status . CONNECTED ĊĊĠĠĠ Ġoverride Ġfun ĠgetName (): ĠString Ġ= Ġ" ADA ĠM OT ORS " ĊĊĠĠĠ Ġoverride Ġfun Ġexecute Motor Message ( motor Message : ĠMotor Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcommand Executor . execute { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotor Message . execute ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġi Motor ĊĠĠĠĠ Ġ* Ġ@ param Ġdirection ĊĠĠĠĠ Ġ* Ġ@ param Ġspeed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġspin Motor ( i Motor : ĠInt , Ġspeed : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w (" Mot ors ", Ġ" try ing Ġto Ġspin Ġmot ors .") ĊĠĠĠĠĠĠĠ Ġval Ġmotor Ġ= Ġwhen Ġ( val Ġada Motor Ġ= Ġi Motor Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 .. MOT ORS _ PER _ H AT Ġ-> Ġmotor Hat . get Motor ( ada Motor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠM OT ORS _ PER _ H AT Ġ+ Ġ 1 .. IM ot ors . MOT ORS _ COUNT Ġ-> Ġmotor Hat 1 . get Motor ( ada Motor Ġ- ĠM OT ORS _ PER _ H AT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmot ors Speed s [ i Motor ] Ġ= Ġspeed ĊĠĠĠĠĠĠĠ Ġmotor !!. set Speed ( speed . toInt (). absolute Value Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( 0 . to Byte () Ġ!= Ġspeed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotor . run ( if Ġ( speed Ġ> Ġ 0 ) ĠAd afruit Motor Hat . FORWARD Ġelse ĠAd afruit Motor Hat . BACK WARD ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotor . run ( Ad afruit Motor Hat . RELEASE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġspin Mot ors ( speed s : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Motor Ġin Ġ 0 Ġuntil ĠIM ot ors . MOT ORS _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspin Motor ( i Motor , Ġspeed s [ i Motor ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop Mot ors () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠIM ot ors . MOT ORS _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmot ors Speed s [ i ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( ada Motor Ġin Ġ 1 .. MOT ORS _ PER _ H AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotor Hat . get Motor ( ada Motor ). run ( Ad afruit Motor Hat . RELEASE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotor Hat 1 . get Motor ( ada Motor ). run ( Ad afruit Motor Hat . RELEASE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Ser vo Angle ( i Ser vo : ĠInt , Ġangle : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservo Ġ= Ġwhen ( i Ser vo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġservo 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġservo 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġservo . angle Ġ= Ġangle . toDouble () ĊĠĠĠĠĠĠĠ ĠLog . d ( getName (), Ġ" Set Ġservo Ġ$ i Ser vo Ġto Ġangle Ġ${ servo . angle }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ser vo ( pwm Pin : ĠString , Ġstart Angle : ĠDouble , Ġmin Angle : ĠDouble , Ġmax Angle : ĠDouble ): ĠSer vo Ġ= ĠSer vo ( pwm Pin ). also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . set Pulse Duration Range ( 0 . 5 , Ġ 2 . 5 ) ĊĠĠĠĠĠĠĠ Ġit . set Angle Range ( min Angle , Ġmax Angle ) ĊĠĠĠĠĠĠĠ Ġit . angle Ġ= Ġstart Angle ĊĠĠĠĠĠĠĠ Ġit . setEnabled ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠM OT ORS _ PER _ H AT Ġ= Ġ 4 ĊĠĠĠ Ġ} Ċ }