import Ġcom . be ust . kl ax on . JsonObject Ċ import Ġcom . be ust . kl ax on . Parser Ċ import Ġcom . be ust . kl ax on . json Ċ import Ġcom . github . kit tin un f . fuel . core . Fuel Manager Ċ import Ġcom . github . kit tin un f . fuel . http Get Ċ import Ġcom . github . kit tin un f . fuel . http Post Ċ import Ġdb . Config Ċ import Ġdb . Logs Ċ import Ġdb . Metrics Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . joda . time . Duration Ċ Ċ data Ġclass ĠRefresh Token Response ( ĊĠĠĠ Ġval ĠaccessToken : ĠString , ĊĠĠĠ Ġval Ġrefresh Token : ĠString Ċ ) Ċ Ċ data Ġclass ĠCar Overview ( ĊĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġstate : ĠString Ċ ) Ċ Ċ data Ġclass ĠCar Status ( ĊĠĠĠ Ġval Ġm ile age : ĠInt , ĊĠĠĠ Ġval Ġbattery : ĠInt , ĊĠĠĠ Ġval Ġlat : ĠDouble , ĊĠĠĠ Ġval Ġlon : ĠDouble , ĊĠĠĠ Ġval Ġch arging : ĠBoolean , ĊĠĠĠ Ġval Ġch arging Power : ĠInt , ĊĠĠĠ Ġval Ġversion : ĠString , ĊĠĠĠ Ġval Ġstate : ĠString , ĊĠĠĠ Ġval Ġfull Data : ĠString Ċ ) Ċ Ċ class ĠUnauthorized Exception Ġ: ĠException (" API ĠUnauthorized ") Ċ Ċ fun Ġrefresh Token ( refresh Token : ĠString ): ĠRefresh Token Response Ġ{ ĊĠĠĠ Ġval Ġreq Ġ= Ġ"/ oauth / token ". http Post () ĊĠĠĠĠĠĠĠ Ġ. body ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" grant _ type " Ġto Ġ" refresh _ token ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ id " Ġto Ġ" 8 1 5 2 7 cff 0 6 8 4 3 c 8 6 3 4 fdc 0 9 e 8 ac 0 ab efb 4 6 ac 8 4 9 f 3 8 fe 1 e 4 3 1 c 2 ef 2 1 0 6 7 9 6 3 8 4 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ secret " Ġto Ġ" c 7 2 5 7 eb 7 1 a 5 6 4 0 3 4 f 9 4 1 9 ee 6 5 1 c 7 d 0 e 5 f 7 aa 6 bf bd 1 8 b afb 5 c 5 c 0 3 3 b 0 9 3 bb 2 fa 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh _ token " Ġto Ġrefresh Token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toJson String () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġreq . headers [" Content - Type "] Ġ= Ġ" application / json " ĊĠĠĠ Ġval Ġ(_, Ġ_, Ġrefresh Result ) Ġ= Ġreq . response String () ĊĊĠĠĠ Ġval Ġrefresh ResponseData Ġ= ĠParser (). parse ( StringBuilder ( refresh Result . get ())) Ġas ĠJsonObject ĊĠĠĠ Ġreturn ĠRefresh Token Response ( ĊĠĠĠĠĠĠĠ Ġrefresh ResponseData . string (" access _ token ") !! , ĊĠĠĠĠĠĠĠ Ġrefresh ResponseData . string (" refresh _ token ") !! ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġget Vehicle ( token : ĠString , Ġvin : ĠString ): ĠCar Overview Ġ{ ĊĠĠĠ Ġval Ġ(_, Ġresp , Ġresult ) Ġ= Ġ"/ api / 1 / vehicles ". http Get () ĊĠĠĠĠĠĠĠ Ġ. header (" Authorization " Ġto Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠ Ġ. response String () ĊĊĠĠĠ Ġwhen Ġ( resp . statusCode ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 0 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠParser (). parse ( StringBuilder ( result . get ())) Ġas ĠJsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvehicle Obj Ġ= Ġdata . array < JsonObject >(" response ") !!. filter Ġ{ Ġvehicle : ĠJsonObject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvehicle . string (" vin ") !! Ġ== Ġvin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCar Overview ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġvehicle Obj . long (" id ") !!. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġvehicle Obj . string (" display _ name ") !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġvehicle Obj . string (" state ") !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 4 0 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnauthorized Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġresult . component 2 () !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġget Vehicle Status ( token : ĠString , Ġvehicle : ĠCar Overview ): ĠCar Status Ġ{ ĊĠĠĠ Ġval Ġ(_, Ġ_, Ġch arging State Result ) Ġ= Ġ"/ api / 1 / vehicles /${ vehicle . id }/ data _ request / charge _ state ". http Get () ĊĠĠĠĠĠĠĠ Ġ. header (" Authorization " Ġto Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠ Ġ. response String () ĊĠĠĠ Ġval Ġ(_, Ġ_, Ġvehicle State Result ) Ġ= Ġ"/ api / 1 / vehicles /${ vehicle . id }/ data _ request / vehicle _ state ". http Get () ĊĠĠĠĠĠĠĠ Ġ. header (" Authorization " Ġto Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠ Ġ. response String () ĊĠĠĠ Ġval Ġ(_, Ġ_, Ġdrive State Result ) Ġ= Ġ"/ api / 1 / vehicles /${ vehicle . id }/ data _ request / drive _ state ". http Get () ĊĠĠĠĠĠĠĠ Ġ. header (" Authorization " Ġto Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠ Ġ. response String () ĊĊĠĠĠ Ġval Ġch arging State Data Ġ= ĠParser (). parse ( StringBuilder ( ch arging State Result . get ())) Ġas ĠJsonObject ĊĠĠĠ Ġval Ġvehicle State Data Ġ= ĠParser (). parse ( StringBuilder ( vehicle State Result . get ())) Ġas ĠJsonObject ĊĠĠĠ Ġval Ġdrive State Data Ġ= ĠParser (). parse ( StringBuilder ( drive State Result . get ())) Ġas ĠJsonObject ĊĊĠĠĠ Ġval Ġcurrent M ile age Ġ= Ġvehicle State Data . obj (" response ") !!. int (" od ometer ") !! ĊĠĠĠ Ġval Ġch arging State Ġ= Ġch arging State Data . obj (" response ") !!. string (" ch arging _ state ") !! ĊĠĠĠ Ġval Ġch arging Ġ= Ġch arging State Ġ== Ġ" Ch arging " ĊĊĠĠĠ Ġreturn ĠCar Status ( ĊĠĠĠĠĠĠĠ Ġm ile age Ġ= Ġcurrent M ile age , ĊĠĠĠĠĠĠĠ Ġbattery Ġ= Ġch arging State Data . obj (" response ") !!. int (" battery _ level ") !! , ĊĠĠĠĠĠĠĠ Ġlat Ġ= Ġdrive State Data . obj (" response ") !!. double (" latitude ") !! , ĊĠĠĠĠĠĠĠ Ġlon Ġ= Ġdrive State Data . obj (" response ") !!. double (" longitude ") !! , ĊĠĠĠĠĠĠĠ Ġch arging Ġ= Ġch arging , ĊĠĠĠĠĠĠĠ Ġch arging Power Ġ= Ġch arging State Data . obj (" response ") !!. int (" ch arger _ power ") !! , ĊĠĠĠĠĠĠĠ Ġversion Ġ= Ġvehicle State Data . obj (" response ") !!. string (" car _ version ") !! , ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġvehicle . state , ĊĠĠĠĠĠĠĠ Ġfull Data Ġ= Ġjson Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ch arging _ state " Ġto Ġch arging State Data . obj (" response ") !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vehicle _ state " Ġto Ġvehicle State Data . obj (" response ") !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" drive _ state " Ġto Ġdrive State Data . obj (" response ") !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. toJson String () ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġwrite ( car : ĠCar Overview , Ġinfo : ĠCar Status ) Ġ{ ĊĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠMetrics . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ vehicle Id ] Ġ= Ġcar . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ m ile age ] Ġ= Ġinfo . m ile age ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ battery ] Ġ= Ġinfo . battery . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ lat ] Ġ= Ġinfo . lat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ lon ] Ġ= Ġinfo . lon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ ch arging ] Ġ= Ġinfo . ch arging ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ ch arging Power ] Ġ= Ġinfo . ch arging Power ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ version ] Ġ= Ġinfo . version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ state ] Ġ= Ġinfo . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ full Data ] Ġ= Ġinfo . full Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ timestamp ] Ġ= ĠDateTime . now () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġannotate Ch arging ( ch arging : ĠBoolean ) Ġ{ ĊĠĠĠ Ġfun Ġannotate ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= Ġ"${ System . getenv (" GR AF ANA _ HOST ") }/ api / annotations ". http Post () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Content - Type " Ġto Ġ" application / json ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Authorization " Ġto Ġ" Bearer Ġ${ System . getenv (" GR AF ANA _ TOKEN ") }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( json Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dashboard Id " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" panel Id " Ġto Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" time " Ġto ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" is Region " Ġto Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" text " Ġto Ġmsg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toJson String ()) ĊĠĠĠĠĠĠĠ Ġreq . headers [" Content - Type "] Ġ= Ġ" application / json " ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġ_, Ġrefresh Result ) Ġ= Ġreq . response String () ĊĠĠĠĠĠĠĠ Ġprintln (" annot ating : Ġ$ msg ") ĊĠĠĠĠĠĠĠ Ġprintln ( refresh Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġwas Ch arging Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Status Ġ= ĠMetrics . selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy ( Metrics . timestamp Ġto ĠSort Order . DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( last Status Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Status [ Metrics . ch arging ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch arging Ġ// Ġreturn Ġthe Ġsame Ġch arging Ġstate Ġto Ġno - op Ġthis Ġfunction ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( was Ch arging Ġ&& Ġ! ch arging ) Ġ{ ĊĠĠĠĠĠĠĠ Ġannotate (" stopped Ġch arging ") ĊĠĠĠ Ġ} Ġelse Ġif Ġ(! was Ch arging Ġ&& Ġch arging ) Ġ{ ĊĠĠĠĠĠĠĠ Ġannotate (" started Ġch arging ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠDatabase . connect ( ĊĠĠĠĠĠĠĠ Ġ" jdbc : postgresql ://${ System . getenv (" PG HOST ") }/ tes la ", ĊĠĠĠĠĠĠĠ Ġ" org . postgresql . Driver ", ĊĠĠĠĠĠĠĠ ĠSystem . getenv (" PG USER "), ĊĠĠĠĠĠĠĠ ĠSystem . getenv (" PG PASSWORD ") ĊĠĠĠ Ġ) ĊĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Logger ( Std Out Sql Logger ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠF uel Manager . instance . basePath Ġ= Ġ" https :// owner - api . tes lam ot ors . com " ĊĠĠĠ ĠF uel Manager . instance . removeAll Response Intercept ors () ĊĊĠĠĠ Ġvar Ġtried Refresh Ġ= Ġfalse ĊĠĠĠ Ġval Ġtry To Sleep Length Ġ= Ġ 1 5 ĊĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġconfig Ġ= ĠConfig . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġconfig [ Config . accessToken ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvin Ġ= Ġconfig [ Config . vin ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Getting Ġvehicles ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvehicle Ġ= Ġget Vehicle ( token , Ġvin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( vehicle ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" Vehicle ĠOverview : Ġ$ vehicle ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vehicle . state Ġ== Ġ" as leep ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhave Ġbeen Ġsleep ing , Ġno Ġneed Ġto Ġtry Ġto Ġsleep Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . update ({ ĠConfig . vin Ġeq Ġvin Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ try To Sleep Since ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠContinue Ġto Ġwake Ġup Ġthe Ġcar Ġif Ġit 's Ġmore Ġthan Ġ 6 Ġhours Ġsince Ġlast Ġping ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDis abling Ġthis Ġfor Ġnow Ġsince ĠTes la Ġnow Ġrequires Ġan Ġexplicit Ġwake Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand ĠI 'm Ġnot Ġsure Ġif ĠI Ġwant Ġto Ġdo Ġthat Ġin Ġcase Ġof Ġan Ġextended Ġvac ation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Continue Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Status Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . select Ġ{ Ġ( Metrics . state Ġeq Ġ" online ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy ( Metrics . timestamp Ġto ĠSort Order . DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Status Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Aw ake Time Ġ= Ġlast Status [ Metrics . timestamp ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= ĠDuration ( last Aw ake Time , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration . standard Hours Ġ> Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Continue Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! should Continue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" The Ġcar Ġis Ġsleep ing , Ġexit .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Sh hh h Ġthe Ġcar Ġis Ġsleep ing . ĠGood Ġby e .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" The Ġcar Ġhas Ġsle pt Ġfor Ġ 6 Ġhours , Ġwake Ġit Ġup ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( vehicle . state Ġ== Ġ" online ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġjust Ġwake Ġup , Ġblock Ġsleep Ġmode Ġfor Ġ 3 0 Ġmins ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Status Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy ( Metrics . timestamp Ġto ĠSort Order . DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Status Ġ!= Ġnull Ġ&& Ġlast Status [ Metrics . state ] Ġ== Ġ" as leep ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" The Ġcar Ġjust Ġwo ke Ġup . ĠBlock ing Ġsleep Ġfor Ġ 3 0 mins ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . update ({ ĠConfig . vin Ġeq Ġvin Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ block Sleep Until ] Ġ= ĠDateTime . now (). plus Minutes ( 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ try To Sleep Since ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= ĠConfig . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Sleep Remaining Ġ= Ġif Ġ( config [ Config . block Sleep Until ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmins Left Ġ= ĠDuration ( null , Ġconfig [ Config . block Sleep Until ]). standard Minutes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġit Ġhas Ġexpired , Ġclean Ġit Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mins Left Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . update ({ ĠConfig . vin Ġeq Ġvin Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ block Sleep Until ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . max ( mins Left , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtry To Sleep Duration Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config [ Config . try To Sleep Since ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDuration ( config [ Config . try To Sleep Since ], Ġnull ). standard Minutes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( try To Sleep Duration Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( try To Sleep Duration Ġ>= Ġtry To Sleep Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" Clean ing Ġup Ġsleep Ġmode ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . update ({ ĠConfig . vin Ġeq Ġvin Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ try To Sleep Since ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( try To Sleep Duration Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" Trying Ġto Ġsleep Ġfor Ġ${ try To Sleep Length Ġ- Ġtry To Sleep Duration } Ġmins .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Trying Ġto Ġsleep ... Ġ${ try To Sleep Length Ġ- Ġtry To Sleep Duration } Ġmins . Ġremaining ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvehicle Status Ġ= Ġget Vehicle Status ( token , Ġvehicle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdebug Vehicle Status Ġ= Ġvehicle Status . copy ( full Data Ġ= Ġ"< RED ACT ED >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( debug Vehicle Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" Status : Ġ$ debug Vehicle Status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotate Ch arging ( vehicle Status . ch arging ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcar Ġis Ġch arging , Ġactively Ġextend Ġsleep Ġblock . ĠOtherwise Ġwe 'll Ġtry Ġto Ġlet Ġit Ġsleep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġright Ġafter Ġun plug ging Ġdue Ġto Ġno Ġmovement . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vehicle Status . ch arging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" The Ġcar Ġis Ġch arging . ĠKeep Ġblocking Ġsleep Ġfor Ġ 3 0 mins ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . update ({ ĠConfig . vin Ġeq Ġvin Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ block Sleep Until ] Ġ= ĠDateTime . now (). plus Minutes ( 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ try To Sleep Since ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcurrent Ġm ile age Ġis Ġthe Ġsame Ġas Ġ 1 0 Ġminutes Ġago , Ġlet 's Ġtry Ġto Ġallow Ġthe Ġcar Ġto Ġsleep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm ile age While Ago Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Status Ġ= ĠMetrics . select Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Metrics . state Ġeq Ġ" online ") Ġand Ġ( Metrics . timestamp Ġless Eq ĠDateTime . now (). minus Minutes ( 1 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. orderBy ( Metrics . timestamp Ġto ĠSort Order . DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Status Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Status [ Metrics . m ile age ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġstart Ġsleep Ġmode Ġif : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ 1 . ĠThe Ġcar Ġhas Ġnot Ġmoved Ġin Ġthe Ġpast Ġ 1 0 Ġmins ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ 2 . ĠNot Ġcurrently Ġtrying Ġto Ġsleep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ 3 . ĠSleep Ġmode Ġis Ġnot Ġblocked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ 4 . ĠThe Ġcar Ġis Ġnot Ġbeing Ġchar ged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vehicle Status . m ile age Ġ== Ġm ile age While Ago Ġ&& Ġtry To Sleep Duration Ġ== Ġnull Ġ&& Ġblock Sleep Remaining Ġ<= Ġ 0 Ġ&& Ġ! vehicle Status . ch arging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" Turn Ġon Ġsleep Ġmode ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . update ({ ĠConfig . vin Ġeq Ġvin Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ try To Sleep Since ] Ġ= ĠDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( block Sleep Remaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" Sleep Ġmode Ġis Ġbeing Ġblocked Ġfor Ġ$ block Sleep Remaining Ġmins ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Sleep Ġmode Ġis Ġblocked Ġfor Ġ$ block Sleep Remaining Ġmins ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( vehicle , Ġvehicle Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnauthorized Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tri ed Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfig . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvin Ġ= Ġconfig [ Config . vin ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Refresh Ġ= Ġconfig [ Config . refresh Token ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" Refresh ing Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Refresh Ġtoken ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( new AccessToken , Ġnew RefreshToken ) Ġ= Ġrefresh Token ( token Refresh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . update ({ ĠConfig . vin Ġeq Ġvin Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ accessToken ] Ġ= Ġnew AccessToken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ refresh Token ] Ġ= Ġnew RefreshToken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtried Refresh Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . write (" ERROR : ĠToken Ġrefresh Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Unable Ġto Ġrefresh Ġtoken ! ĠExit ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ