@ file : Suppress (" EXPERIMENT AL _ API _ USAGE ") Ċ Ċ package Ġcom . team 2 8 9 8 . robot . sub systems Ċ Ċ import Ġcom . bps robot ics . engine . utils .* Ċ import Ġedu . wpi . first . wp ilib j . Address able LED Ċ import Ġedu . wpi . first . wp ilib j . Address able LED Buffer Ċ import Ġedu . wpi . first . wp ilib j . Timer Ċ import Ġedu . wpi . first . wp ilib j 2 . command . Subsystem Base Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . random . Random Ċ Ċ object ĠRGB LED Handler Ġ: ĠSub system Base () Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval Ġled Count Ġ= Ġ 2 0 0 Ġ// ĠTODO : ĠHow Ġmany ĠWS 2 8 1 2 s Ġdo Ġwe Ġhave ĊĠĠĠ Ġprivate Ġval Ġled Strip Ġ= ĠAddress able LED ( 8 ) Ġ// ĠTODO : ĠPWM ĠPort ĠConstant ĊĠĠĠ Ġprivate Ġval Ġfinal LED Strip Buffer Ġ= ĠAddress able LED Buffer ( led Count ) ĊĠĠĠ Ġprivate Ġval Ġled Strip Buffer Ġ= ĠRGBA Array ( led Count ) ĊĠĠĠ Ġprivate Ġconst Ġval Ġrain bow Speed Ġ= Ġ 1 . 0 Ġ// ĠConfigure Ġrain bow Ġspacing , Ġ 0 Ġto Ġ 2 ĠPI ĊĠĠĠ Ġprivate Ġconst Ġval Ġle ds Per Flag Color Ġ= Ġ 4 Ġ// ĠSize Ġof Ġeach Ġcolor Ġstrip Ġin Ġflag Ġcolor Ġmodes ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġcolor Ġmode . Ġ ĠSet Ġit Ġto Ġthe Ġdesired Ġvalue Ġand Ġthe Ġsubsystem Ġwill Ġhandle Ġupdating . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġmode Ġ= ĠColor Mode . OFF Ġ Ġ// Ġre initialized Ġbelow Ġin Ġan Ġinit Ġblock Ġso Ġthat Ġit Ġinvokes Ġthe Ġsetter ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġthe Ġmode Ġis Ġset , Ġhave Ġit Ġset Ġall Ġthe Ġcolors Ġonce Ġbecause Ġthe Ġflag Ġmodes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaren 't Ġrun Ġperiodically ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠTimer . getF PG AT ime stamp (). seconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . lambda . invoke ( led Strip Buffer , Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetData RGBA () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġled Strip . setData ( final LED Strip Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Update Ġ= Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġmode Ġ= ĠColor Mode . values (). filter Ġ{ Ġit . random ly Selectable Ġ}. random () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠColor Mode ( val Ġlambda : ĠRGBA Array .( time : ĠSecond s ) Ġ-> ĠUnit , Ġval Ġupdate Rate : ĠH ert z Ġ= Ġ(- 1 ). hz , Ġval Ġrandomly Selectable : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ ĠOFF ({ Ġfill ( RGBA ( 0 x 0 0 , Ġ 0 x 0 0 , Ġ 0 x 0 0 )) Ġ}), ĊĊĠĠĠĠĠĠĠ Ġ// Ġsolid Ġcolors Ġ( use Ġin Ġmatch Ġfor Ġsignal ing ?) ĊĠĠĠĠĠĠĠ ĠRED ({ Ġfill ( RGBA ( 0 x DF , Ġ 0 x 0 0 , Ġ 0 xFF )) Ġ}), Ġ Ġ// Ġ 1 5 1 0 Ġred ĊĠĠĠĠĠĠĠ ĠBL UE ({ Ġfill ( RGBA ( 0 x 1 B , Ġ 0 x 4 5 , Ġ 0 x 9 B )) Ġ}), Ġ Ġ// Ġ 2 8 9 8 Ġblue ĊĠĠĠĠĠĠĠ ĠGREEN ({ Ġfill ( RGBA ( 0 x 0 0 , Ġ 0 xFF , Ġ 0 x 0 0 )) Ġ}), ĊĠĠĠĠĠĠĠ ĠOR ANGE ({ Ġfill ( RGBA ( 0 xFF , Ġ 0 xA 5 , Ġ 0 x 0 0 )) Ġ}), ĊĠĠĠĠĠĠĠ ĠPIN K ({ Ġfill ( RGBA ( 0 xFF , Ġ 0 xC 0 , Ġ 0 x CB )) Ġ}), ĊĊĠĠĠĠĠĠĠ Ġ// Ġp ride Ġflags ĊĠĠĠĠĠĠĠ ĠR AIN BO W ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠTimer . getF PG AT ime stamp (). seconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġ( i Ġ* Ġrain bow Speed Ġ+ Ġ( time . value Ġ/ Ġ 2 )). mod ( 2 Ġ* ĠPI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġ( sin ( pos ) Ġ* Ġ 1 2 7 Ġ+ Ġ 1 2 8 ). round ToInt (). to U Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg Ġ= Ġ( sin ( pos Ġ+ Ġ( 2 Ġ* ĠPI ) Ġ/ Ġ 3 ) Ġ* Ġ 1 2 7 Ġ+ Ġ 1 2 8 ). round ToInt (). to U Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġ( sin ( pos Ġ- Ġ( 2 Ġ* ĠPI ) Ġ/ Ġ 3 ) Ġ* Ġ 1 2 7 Ġ+ Ġ 1 2 8 ). round ToInt (). to U Byte () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( i , ĠRGBA ( r , Ġg , Ġb )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 . hz ), ĊĠĠĠĠĠĠĠ ĠTRANS ({ Ġstri pes ( RGBA Array . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 5 5 , Ġ 0 x CD , Ġ 0 xFC ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xF 7 , Ġ 0 xA 8 , Ġ 0 xB 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 xFF , Ġ 0 xFF ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xF 7 , Ġ 0 xA 8 , Ġ 0 xB 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 5 5 , Ġ 0 x CD , Ġ 0 xFC ))) ĊĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ ĠEN BY ({ Ġstri pes ( RGBA Array . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 xF 4 , Ġ 0 x 3 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 xFF , Ġ 0 xFF ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 9 C , Ġ 0 x 5 9 , Ġ 0 xD 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 0 0 , Ġ 0 x 0 0 , Ġ 0 x 0 0 ))) ĊĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ ĠACE ({ Ġstri pes ( RGBA Array . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 0 0 , Ġ 0 x 0 0 , Ġ 0 x 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xA 4 , Ġ 0 xA 4 , Ġ 0 xA 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 xFF , Ġ 0 xFF ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 8 1 , Ġ 0 x 0 0 , Ġ 0 x 8 1 ))) ĊĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ ĠPAN ({ Ġstri pes ( RGBA Array . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 x 1 B , Ġ 0 x 8 D ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 x DA , Ġ 0 x 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 1 B , Ġ 0 xB 3 , Ġ 0 xFF ))) ĊĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ ĠL ES BI AN ({ Ġstri pes ( RGBA Array . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xD 6 , Ġ 0 x 2 9 , Ġ 0 x 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 x 9 B , Ġ 0 x 5 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 xFF , Ġ 0 xFF ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xD 4 , Ġ 0 x 6 1 , Ġ 0 xA 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xA 5 , Ġ 0 x 0 0 , Ġ 0 x 6 2 ))) ĊĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ ĠBI ({ Ġstri pes ( RGBA Array . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xD 0 , Ġ 0 x 0 0 , Ġ 0 x 7 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 8 C , Ġ 0 x 4 7 , Ġ 0 x 9 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 0 0 , Ġ 0 x 3 2 , Ġ 0 xA 0 ))) ĊĠĠĠĠĠĠĠ Ġ}), ĊĠĠĠĠĠĠĠ ĠUK RA INE ({ Ġstri pes ( RGBA Array . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 x 0 0 , Ġ 0 x 5 B , Ġ 0 xBB ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRGBA ( 0 xFF , Ġ 0 xD 5 , Ġ 0 x 0 0 ))) ĊĠĠĠĠĠĠĠ Ġ}), ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġeffects Ġthat Ġmodify Ġexisting Ġdata Ġin Ġthe Ġbuffer ĊĠĠĠĠĠĠĠ ĠSL IDE _ LEFT ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . copy Into ( temp . array , Ġ 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp [ temp . size Ġ- Ġ 1 ] Ġ= Ġtemp [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp . array . copy Into ( array , Ġ 0 , Ġ 0 , Ġsize ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 . hz , Ġfalse ), ĊĠĠĠĠĠĠĠ ĠSL IDE _ RIGHT ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . copy Into ( temp . array , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp [ 0 ] Ġ= Ġtemp [ temp . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp . array . copy Into ( array , Ġ 0 , Ġ 0 , Ġsize ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 . hz , Ġfalse ), ĊĠĠĠĠĠĠĠ ĠR AN DOM _ BL INK ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġthis [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ i ] Ġ= ĠRGBA ( old . r , Ġold . g , Ġold . b , Ġ( Random . nextInt ( 0 , Ġ 1 ) Ġ* Ġ 2 5 5 ). to U Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 . hz , Ġfalse ), ĊĠĠĠĠĠĠĠ ĠR AN DOM _ BR IGHT NESS ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġthis [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ i ] Ġ= ĠRGBA ( old . r , Ġold . g , Ġold . b , Ġ( old . a . toInt () Ġ+ ĠRandom . nextInt (- 2 5 , Ġ 2 5 )). coerce In ( 0 , Ġ 2 5 5 ). to U Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 . hz , Ġfalse ), ĊĠĠĠĠĠĠĠ ĠCOLOR _ DR IFT ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh sv Ġ= ĠColor Space Conversions . RGB to H SV ( this [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġ( h sv . h . toInt () Ġ+ ĠRandom . nextInt (- 5 , Ġ 5 )). mod ( 1 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ i ] Ġ= ĠColor Space Conversions . H SV to RGB ( H SV A ( h , Ġh sv . s , Ġh sv . v )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 . hz , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġled Strip . setData ( final LED Strip Buffer ) ĊĠĠĠĠĠĠĠ Ġled Strip . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRGBA Array . stri pes ( colors : ĠRGBA Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġcolors [( i Ġ/ Ġle ds Per Flag Color ). mod ( colors . size )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( i , Ġcolor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtemp Ġ= ĠRGBA Array ( led Strip Buffer . size Ġ+ Ġ 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCop ies Ġthe Ġdata Ġfrom Ġ[ led Strip Buffer ] Ġto Ġthe Ġactual ĠLED Ġbuffer , Ġmultiply ing Ġby Ġalpha Ġto ĊĠĠĠĠ Ġ* Ġadjust Ġthe Ġbrightness ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetData RGBA () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġled Strip Buffer . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġled Strip Buffer [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal LED Strip Buffer . set RGB ( i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor . r . toInt () Ġ* Ġcolor . a . toInt () Ġ/ Ġ 2 5 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor . g . toInt () Ġ* Ġcolor . a . toInt () Ġ/ Ġ 2 5 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor . b . toInt () Ġ* Ġcolor . a . toInt () Ġ/ Ġ 2 5 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġlast Ġtime Ġthe Ġcurrent Ġmode 's Ġupdate Ġlambda Ġwas Ġinvoked . Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġlast Update Ġ= Ġ 0 . seconds ĊĊĠĠĠ Ġoverride Ġfun Ġperiodic () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġcurrent Ġmode Ġrequires Ġperiodic Ġupdates , Ġand Ġit 's Ġbeen Ġlong Ġenough Ġsince Ġthe Ġlast ĊĠĠĠĠĠĠĠ Ġ// Ġupdate , Ġthen Ġcall Ġthe Ġmode 's Ġupdate Ġmethod Ġand Ġcopy Ġthe Ġdata Ġover Ġto Ġthe Ġstrip . ĊĠĠĠĠĠĠĠ Ġif Ġ( mode . update Rate . value Ġ> Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠTimer . getF PG AT ime stamp (). seconds ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Since Ġ= Ġtime Ġ- Ġlast Update ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Since . value Ġ> Ġ 1 Ġ/ Ġmode . update Rate . h ert z Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode . lambda . invoke ( led Strip Buffer , Ġtime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData RGBA () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Update Ġ= Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġled Strip . setData ( final LED Strip Buffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ