/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 - 2 0 2 1 ĠAnimated LED Strip Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġanimated led strip . server Ċ Ċ import Ġanimated led strip . led s . location management . Location Ċ import Ġanimated led strip . led s . strip management . Strip Info Ċ import Ġanimated led strip . utils . ALS Logger Ċ import Ġanimated led strip . utils . Logger Ċ import Ġco . touch lab . ker mit . Severity Ċ import Ġcom . github . do y aaaa aken . kotlin csv . dsl . csv Reader Ċ import Ġorg . apache . commons . cli .* Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . util .* Ċ import Ġkotlin . system . exit Process Ċ Ċ val Ġoptions Ġ= ĠOptions (). apply Ġ{ ĊĠĠĠ Ġadd Option (" f ", Ġ" config ", Ġtrue , Ġ" Specify Ġa Ġconfig Ġto Ġload Ġinstead Ġof Ġ/ etc / led s / led . config ") ĊĊĠĠĠ Ġadd Long Option (" log - level ", Ġtrue , Ġ" Set Ġthe Ġminimum Ġseverity Ġlevel Ġfor Ġlogs Ġthat Ġwill Ġbe Ġprinted ") ĊĊĠĠĠ Ġadd Long Option (" persist ", Ġfalse , Ġ" Persist Ġanimations Ġacross Ġrestart s ") ĊĠĠĠ Ġadd Long Option (" no persist ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Don 't Ġpersist Ġanimations Ġacross Ġrestart s Ġ( overrides Ġ-- persist Ġand Ġpersist = true Ġin Ġconfig )") ĊĠĠĠ Ġadd Long Option (" persist - dir ", Ġtrue , Ġ" Directory Ġto Ġstore Ġpersistent Ġanimations ") ĊĊĠĠĠ Ġadd Option (" n ", Ġ" num led s ", Ġtrue , Ġ" Specify Ġnumber Ġof ĠLED s Ġin Ġthe Ġstrip Ġ( default Ġ 2 4 0 )") ĊĠĠĠ Ġadd Option (" l ", Ġ" locations - file ", Ġtrue , Ġ" Specify Ġa Ġfile Ġwith Ġthe Ġlocations Ġof Ġall Ġpixels ") ĊĠĠĠ Ġadd Option (" p ", Ġ" pin ", Ġtrue , Ġ" Specify Ġpin Ġnumber Ġthe ĠLED Ġstrip Ġis Ġconnected Ġto Ġ( default Ġ 1 2 )") ĊĠĠĠ Ġadd Long Option (" render - delay ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Specify Ġthe Ġtime Ġin Ġmilliseconds Ġbetween Ġrenders Ġof Ġthe ĠLED Ġstrip Ġ( default Ġ 1 0 )") ĊĊĠĠĠ Ġadd Long Option (" log - renders ", Ġfalse , Ġ" Enable Ġstrip Ġcolor Ġlogging ") ĊĠĠĠ Ġadd Long Option (" log - file ", Ġtrue , Ġ" Specify Ġthe Ġoutput Ġfile Ġname Ġfor Ġstrip Ġcolor Ġlogging ") ĊĠĠĠ Ġadd Long Option (" log - render - count ", Ġtrue , Ġ" Specify Ġnumber Ġof Ġrenders Ġbetween Ġsaves Ġto Ġlog Ġfile Ġ( default Ġ 1 0 0 0 )") ĊĊĠĠĠ Ġadd Option (" 1 ", Ġ" 1 d ", Ġfalse , Ġ" Support Ġone - dimensional Ġanimations ") ĊĠĠĠ Ġadd Long Option (" no 1 d ", Ġfalse , Ġ" Don 't Ġsupport Ġone - dimensional Ġanimations ") ĊĠĠĠ Ġadd Option (" 2 ", Ġ" 2 d ", Ġfalse , Ġ" Support Ġtwo - dimensional Ġanimations ") ĊĠĠĠ Ġadd Long Option (" no 2 d ", Ġfalse , Ġ" Don 't Ġsupport Ġtwo - dimensional Ġanimations ") ĊĠĠĠ Ġadd Option (" 3 ", Ġ" 3 d ", Ġfalse , Ġ" Support Ġthree - dimensional Ġanimations ") ĊĠĠĠ Ġadd Long Option (" no 3 d ", Ġfalse , Ġ" Don 't Ġsupport Ġthree - dimensional Ġanimations ") ĊĊĠĠĠ Ġadd Option (" h ", Ġ" help ", Ġfalse , Ġ" Show Ġhelp Ġmessage ") Ċ } Ċ Ċ fun ĠOptions . add Long Option ( long Opt : ĠString , Ġhas Arg : ĠBoolean , Ġdescription : ĠString ) Ġ{ ĊĠĠĠ Ġadd Option ( Option . builder (). long Opt ( long Opt ). desc ( description ). has Arg ( has Arg ). build ()) Ċ } Ċ Ċ fun ĠAnimated LED Strip Server <* >. parse Options ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġarg Parser : ĠCommandLine Ġ= ĠDefault Parser (). parse ( options , Ġargs ) ĊĊĠĠĠ Ġif Ġ( arg Parser . has Option (" h ")) Ġ{ ĊĠĠĠĠĠĠĠ ĠHelp Formatter (). print Help (" led server . jar ", Ġoptions ) ĊĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġconfig File : ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġarg Parser . getOption Value (" f ") ĊĠĠĠĠĠĠĠ Ġ?: Ġ"/ etc / led s / led . config " ĊĊĠĠĠ Ġval Ġconfiguration : ĠProperties Ġ= ĠProperties (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload ( FileInputStream ( configFile )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . w (" Config ĠParser ") Ġ{ Ġ" File Ġ$ configFile Ġnot Ġfound " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠParse Ġfor Ġlogging Ġseverity ĊĠĠĠ Ġval Ġlogging Severity Ġ= Ġwhen Ġ( val Ġarg L Ġ= Ġarg Parser . getOption Value (" log - level ") ?. toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" verbose " Ġ-> ĠSeverity . Verbose ĊĠĠĠĠĠĠĠ Ġ" debug " Ġ-> ĠSeverity . Debug ĊĠĠĠĠĠĠĠ Ġ" info " Ġ-> ĠSeverity . Info ĊĠĠĠĠĠĠĠ Ġ" warn " Ġ-> ĠSeverity . Warn ĊĠĠĠĠĠĠĠ Ġ" error " Ġ-> ĠSeverity . Error ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg L Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . w (" Argument ĠParser ") Ġ{ Ġ" Could Ġnot Ġparse Ġ-- log - level Ġ\"$ arg L \" Ġfrom Ġcommand Ġline Ġ( must Ġbe Ġone Ġof Ġverbose , Ġdebug , Ġinfo , Ġwarn , Ġerror )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġconf L Ġ= Ġconfiguration . getProperty (" log - level ") ?. toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" verbose " Ġ-> ĠSeverity . Verbose ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" debug " Ġ-> ĠSeverity . Debug ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" info " Ġ-> ĠSeverity . Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" warn " Ġ-> ĠSeverity . Warn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" error " Ġ-> ĠSeverity . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( conf L Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . w (" Config ĠParser ") Ġ{ Ġ" Could Ġnot Ġparse Ġlog - level Ġ\"$ conf L \" Ġin Ġconfig Ġ( must Ġbe Ġone Ġof Ġverbose , Ġdebug , Ġinfo , Ġwarn , Ġerror )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSeverity . Warn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠA LS Logger . min Severity Ġ= Ġlogging Severity ĊĊĠĠĠ Ġpersist Animations Ġ= Ġ! arg Parser . has Option (" no persist ") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( arg Parser . has Option (" persist ") Ġ|| Ġconfiguration . getProperty (" persist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to Boolean () Ġ?: Ġpersist Animations ) ĊĊĠĠĠ Ġpersistent Animation Directory Ġ= Ġarg Parser . getOption Value (" persist - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġconfiguration . getProperty (" persist - dir ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġpersistent Animation Directory ĊĊĠĠĠ Ġfun Ġwarn Arg ParseError ( flag : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . w (" Argument ĠParser ") Ġ{ Ġ" Could Ġnot Ġparse Ġ$ flag Ġ\"$ value \" Ġfrom Ġcommand Ġline " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwarn Config ParseError ( prop : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . w (" Config ĠParser ") Ġ{ Ġ" Could Ġnot Ġparse Ġ$ prop Ġ\"$ value \" Ġin Ġconfig " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdefault Strip Info Ġ= ĠStrip Info () ĊĊĠĠĠ Ġ// ĠChecks Ġfor Ġcommand Ġline Ġ- n Ġor Ġ-- num LED s , ĊĠĠĠ Ġ// Ġthen Ġchecks Ġfor Ġnum LED s Ġin Ġconfig , ĊĠĠĠ Ġ// Ġthen Ġchecks Ġfor Ġnum led s Ġin Ġconfig ĊĠĠĠ Ġval Ġnum LED s : ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġarg LED s Ġ= Ġarg Parser . getOption Value (" n ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġwhen Ġ( val Ġconfig LED s 1 Ġ= Ġconfiguration . getProperty (" num LED s ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġwhen Ġ( val Ġconfig LED s 2 Ġ= Ġconfiguration . getProperty (" num led s ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġdefault Strip Info . num LED s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġconfig LED Num Ġ= Ġconfig LED s 2 . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Config ParseError (" num led s ", Ġconfig LED s 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . num LED s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconfig LED Num ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġconfig LED Num Ġ= Ġconfig LED s 1 . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Config ParseError (" num LED s ", Ġconfig LED s 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . num LED s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconfig LED Num ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġarg LED Num Ġ= Ġarg LED s . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Arg ParseError ("- n / -- num led s ", Ġarg LED s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . num LED s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarg LED Num ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpin : ĠInt ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġarg Pin Ġ= Ġarg Parser . getOption Value (" p ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġwhen Ġ( val Ġconfig Pin Ġ= Ġconfiguration . getProperty (" pin ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġdefault Strip Info . pin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġconfig Pin Num Ġ= Ġconfig Pin . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Config ParseError (" pin ", Ġconfig Pin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . pin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconfig Pin Num ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġarg Pin Num Ġ= Ġarg Pin . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Arg ParseError ("- p / -- pin ", Ġarg Pin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . pin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarg Pin Num ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrender Delay : ĠLong Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġarg Delay Ġ= Ġarg Parser . getOption Value (" render - delay ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġwhen Ġ( val Ġconfig Delay Ġ= Ġconfiguration . getProperty (" render - delay ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġdefault Strip Info . render Delay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġconfig Delay Num Ġ= Ġconfig Delay . to Long OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Config ParseError (" render - delay ", Ġconfig Delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . render Delay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconfig Delay Num ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġarg Delay Num Ġ= Ġarg Delay . to Long OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Arg ParseError ("-- render - delay ", Ġarg Delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . render Delay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarg Delay Num ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Render Logging Enabled : ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġarg Parser . has Option (" log - renders ") Ġ|| Ġ( configuration . getProperty (" log - renders ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to Boolean () Ġ?: Ġdefault Strip Info . is Render Logging Enabled ) ĊĊĠĠĠ Ġval Ġrender LogFile : ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġarg Parser . getOption Value (" log - file ") Ġ?: Ġconfiguration . getProperty (" log - file ") Ġ?: Ġdefault Strip Info . render LogFile ĊĊĠĠĠ Ġval Ġrenders Between Log S aves : ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġarg Count Ġ= Ġarg Parser . getOption Value (" log - render - count ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġwhen Ġ( val Ġconfig Count Ġ= Ġconfiguration . getProperty (" log - render - count ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġdefault Strip Info . renders Between Log S aves ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġconfig Count Num Ġ= Ġconfig Count . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Config ParseError (" log - render - count ", Ġconfig Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . renders Between Log S aves ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġconfig Count Num ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( val Ġarg Count Num Ġ= Ġarg Count . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarn Arg ParseError ("-- log - render - count ", Ġarg Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Strip Info . renders Between Log S aves ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarg Count Num ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis 1 DS upport ed Ġ= Ġ! arg Parser . has Option (" no 1 d ") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( arg Parser . has Option (" 1 d ") Ġ|| Ġ( configuration . getProperty (" 1 d ") ?. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdefault Strip Info . is 1 DS upport ed )) ĊĊĠĠĠ Ġval Ġis 2 DS upport ed Ġ= Ġ! arg Parser . has Option (" no 2 d ") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( arg Parser . has Option (" 2 d ") Ġ|| Ġ( configuration . getProperty (" 2 d ") ?. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdefault Strip Info . is 2 DS upport ed )) ĊĊĠĠĠ Ġval Ġis 3 DS upport ed Ġ= Ġ! arg Parser . has Option (" no 3 d ") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( arg Parser . has Option (" 3 d ") Ġ|| Ġ( configuration . getProperty (" 3 d ") ?. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdefault Strip Info . is 3 DS upport ed )) ĊĊĠĠĠ Ġval Ġlocations FileName : ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġarg Parser . getOption Value (" locations - file ") Ġ?: Ġconfiguration . getProperty (" locations - file ") ĊĊĠĠĠ Ġval Ġlocations File : ĠFile ? Ġ= Ġif Ġ( locations FileName Ġ!= Ġnull ) ĠFile ( locations FileName ) Ġelse Ġnull ĊĊĠĠĠ Ġval Ġled Locations Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġlocations File ?. exists () Ġ== Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . w (" LED ĠLoc ations ĠFile ĠParser ") Ġ{ Ġ" File Ġ$ locations FileName Ġdoes Ġnot Ġexist " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocations File Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdiscard Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocations : ĠMutable List < Location > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġl ) Ġin Ġcsv Reader (). read All ( locations File ). with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġl . get OrNull ( 0 )?. toDouble OrNull () Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" LED ĠLoc ations ĠFile ĠParser ") Ġ{ Ġ" Could Ġnot Ġparse Ġfirst Ġcolumn Ġof Ġrow Ġ${ i Ġ+ Ġ 1 } Ġproperly , Ġabort ing Ġand Ġusing Ġdefaults " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscard Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġl . get OrNull ( 1 )?. toDouble OrNull () Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" LED ĠLoc ations ĠFile ĠParser ") Ġ{ Ġ" Could Ġnot Ġparse Ġsecond Ġcolumn Ġof Ġrow Ġ${ i Ġ+ Ġ 1 } Ġproperly , Ġabort ing Ġand Ġusing Ġdefaults " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscard Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġl . get OrNull ( 2 )?. toDouble OrNull () Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" LED ĠLoc ations ĠFile ĠParser ") Ġ{ Ġ" Could Ġnot Ġparse Ġthird Ġcolumn Ġof Ġrow Ġ${ i Ġ+ Ġ 1 } Ġproperly , Ġabort ing Ġand Ġusing Ġdefaults " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscard Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ!= Ġnull Ġ&& Ġy Ġ!= Ġnull Ġ&& Ġz Ġ!= Ġnull ) Ġlocations . add ( Location ( x , Ġy , Ġz )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( discard ) Ġpixel Locations Ġelse Ġlocations ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpixel Locations ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġstrip Info Ġ= ĠStrip Info ( num LED s Ġ= Ġnum LED s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin Ġ= Ġpin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Delay Ġ= Ġrender Delay , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Render Logging Enabled Ġ= Ġis Render Logging Enabled , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender LogFile Ġ= Ġrender LogFile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenders Between Log S aves Ġ= Ġrenders Between Log S aves , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis 1 DS upport ed Ġ= Ġis 1 DS upport ed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis 2 DS upport ed Ġ= Ġis 2 DS upport ed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis 3 DS upport ed Ġ= Ġis 3 DS upport ed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġled Locations Ġ= Ġled Locations ) Ċ } Ċ