package Ġde . un isa ar land . lo lad rives . Sources Ċ Ċ import Ġde . un isa ar land . lo lad rives . Constants Ċ import Ġkotlinx . coroutines . channels . Send Channel Ċ import Ġkotlinx . coroutines . delay Ċ import Ġpc df Event . PC DF Event Ċ import Ġpc df Event . events . Error Event Ċ import Ġpc df Event . events . ob d Events . OB D Command Ċ import Ġpc df Event . events . ob d Events . OB D Command .* Ċ import Ġpc df Event . events . ob d Events . OB DE vent Ċ import Ġpc df Event . events . ob d Events . ob d Intermediate Events . single Component Events . Fuel Type Event Ċ import Ġpc df Event . events . ob d Events . ob d Intermediate Events . single Component Events . Supported P ids Event Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ Ċ const Ġval ĠVER B OS ITY _ MODE Ġ= Ġfalse Ċ Ċ /** Ċ Ġ* ĠMain Ġclass Ġfor Ġcommunication Ġwith Ġthe ĠO BD - Adapter . Ċ Ġ* Ċ Ġ* Ġ@ property Ġinput ĠInputStream Ġto Ġreceive ĠO BD Ġdata Ġbits Ġ( most ly Ġbluetooth ). Ċ Ġ* Ġ@ property Ġoutput ĠOutputStream Ġto Ġsend ĠO BD Ġdata Ġbits Ġ( most ly Ġbluetooth ). Ċ Ġ* Ġ@ property Ġoutput Channel ĠChannel Ġto Ġsend Ġthe ĠPC DF Events , Ġmade Ġup Ġfrom Ġreceived ĠO BD Ġdata Ġto . Ċ Ġ* Ġ@ property Ġcommand List ĠList Ġof ĠO BD Ġcommands Ġto Ġbe Ġsent Ġto Ġthe ĠOutputStream Ġ( car ). Ċ Ġ*/ Ċ class ĠO BD Source ( ĊĠĠĠ Ġprivate Ġvar Ġinput : ĠInputStream ?, ĊĠĠĠ Ġprivate Ġvar Ġoutput : ĠOutputStream ?, ĊĠĠĠ Ġprivate Ġval Ġoutput Channel : ĠSend Channel < PC DF Event >, ĊĠĠĠ Ġprivate Ġvar Ġcommand List : ĠMutable List < OB D Command >, ĊĠĠĠ Ġprivate Ġval Ġm uuid : ĠUUID Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠMap Ġwhich Ġhelps Ġus Ġto Ġremember Ġthe Ġnumber Ġof Ġlines Ġan Ġanswer Ġfor Ġa Ġcertain ĠO BD Command Ġconsists Ġof Ġ( speed Ġup ). ĊĠĠĠ Ġprivate Ġvar ĠnumberOf Lines : ĠMutable Map < OB D Command , ĠInt ?> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġ// ĠSupported ĠP IDs Ġof Ġthe Ġconnected Ġcar . ĊĠĠĠ Ġprivate Ġvar Ġsupported Commands : ĠMutable List < OB D Command > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġ// ĠSub set Ġof Ġthe Ġcommand List Ġwhich Ġis Ġunsupported . ĊĠĠĠ Ġprivate Ġvar Ġnot Supported : ĠMutable List < OB D Command > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġrunning Ġ= Ġfalse ĊĠĠĠ Ġ// The Ġused ĠCAN Ġprotocol , ĠISO Ġ 1 5 7 6 5 - 4 Ġ( SP 6 ) Ġby Ġdefault , ĠISO Ġ 1 5 7 6 5 - 4 Ġ( SP 7 ) Ġused Ġe . g . Ġby ĠD aim ler ĊĠĠĠ Ġprivate Ġvar Ġprotocol Ġ= ĠProtocol . SP 6 ĊĠĠĠ Ġprivate Ġval Ġheader Length Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( protocol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProtocol . SP 6 Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProtocol . SP 7 Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġio Lock Ġ= ĠRe entrant Lock () ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( command Ġin ĠO BD Command . values ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Lines [ command ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġcommunication Ġwith Ġthe ĠO BD - Adapter . ĠPerforms Ġcommands Ġselected Ġfor Ġtracking Ġin Ġthe Ġcurrent Ġprofile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠTrack Ġevents Ġthat Ġwill Ġnot Ġchange Ġover Ġtime Ġjust Ġa Ġsingle Ġtime . ĊĠĠĠĠĠĠĠ Ġval Ġsingle Time Events Ġ= Ġcommand List . intersect ( Constants . SINGLE _ TIME _ EVENTS ). toList () ĊĠĠĠĠĠĠĠ Ġcommand List Ġ= Ġcommand List . minus ( single Time Events ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġperform Commands ( single Time Events ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPerform Ġcommands Ġselected Ġfor Ġtracking Ġin Ġa Ġcycle . ĊĠĠĠĠĠĠĠ Ġwhile Ġ( running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Commands ( command List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġcommunication Ġwith Ġthe ĠO BD - Adapter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġcommands Ġto Ġthe ĠO BD - Adapter Ġand Ġresponses Ġto Ġthe Ġ[ output Channel ] Ġas ĠPC DF Event . ĊĠĠĠĠ Ġ* ĠIf Ġsomething Ġgoes Ġwrong , Ġwe Ġsend Ġan ĠError - Event . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand List ĠList Ġof ĠO BD - Commands Ġto Ġsend Ġto Ġthe ĠO BD - Adapter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġperform Commands ( command List : ĠList < OB D Command >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( command Ġin Ġcommand List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend OB D Command ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Events Ġ= Ġreceive OB D ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġresponse Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Channel . send ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Channel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . APP _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . nano Time (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends ĠO BD ĠCommand Ġto Ġgiven ĠOutputStream Ġ/ ĠO BD - Adapter . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand : ĠO BD ĠCommand Ġto Ġbe Ġsent Ġto Ġthe ĠEL M . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend OB D Command ( command : ĠO BD Command ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinput Ġ= Ġ" 0 " ĊĠĠĠĠĠĠĠ Ġinput Ġ+= Ġcommand . mode . toString ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġinput Ġ+= Ġ" Ġ" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( command . pid Ġ< Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ+= Ġ" 0 " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinput Ġ+= Ġcommand . pid . toString ( 1 6 ). toUpperCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġalready Ġknow Ġhow Ġmuch Ġlines Ġthe Ġresponse Ġwill Ġconsist Ġof , Ġwe Ġappend Ġthis Ġnumber Ġto Ġspeed Ġthings Ġup . ĊĠĠĠĠĠĠĠ Ġif Ġ( numberOf Lines [ command ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ+= Ġ" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ+= ĠnumberOf Lines [ command ] !!. toString ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinput Ġ+= Ġ"\ r " ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERB OS ITY _ MODE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" SEND ING :\ n $ input ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput ?. write (( input . toByteArray ())) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe ceiv es ĠO BD Ġresponse Ġfrom Ġthe Ġgiven ĠInputStream Ġ/ ĠO BD - Adapter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠO BD Command Ġto Ġreceive Ġa Ġresponse Ġfor Ġ( so Ġwe Ġcan Ġassociate Ġthe Ġreceived Ġnumber Ġof Ġlines ). ĊĠĠĠĠ Ġ* Ġ@ return ĠResponse Ġas ĠPC DF Events . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreceive OB D ( command : ĠO BD Command ): ĠMutable List < PC DF Event ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresponse Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Byte Ġ= Ġinput !!. read (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( next Byte Ġ!= Ġ' >'. to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ+= Ġnext Byte . to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Byte Ġ= Ġinput !!. read (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠB MW Ġsends Ġ\ r \ r Ġat Ġthe Ġend Ġdespite ĠAT ĠL 0 . ĊĠĠĠĠĠĠĠ Ġif Ġ( response . endsWith ("\ r \ r ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġresponse . substring ( 0 , Ġresponse . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( VERB OS ITY _ MODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" RECE IV ING :\ n $ response ") ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġresponse . split ("\ r ") ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( lines . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSingle ĠFrame ĠResponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( numberOf Lines [ command ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Lines [ command ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf ( parse OB D ( response . replace (" Ġ", Ġ""), Ġcommand )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMulti ĠLine ĠResponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( numberOf Lines [ command ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemember Ġhow Ġmuch Ġlines Ġthe Ġresponse Ġcons isted Ġof , Ġto Ġspeed Ġthings Ġup Ġnext Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Lines [ command ] Ġ= Ġlines . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive OB D Multi Line ( lines . to Mutable List (), Ġcommand ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles ĠO BD Ġmulti Ġline Ġresponses Ġ( e . g . ĠV IN ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlines ĠReceived Ġlines . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠO BD Command Ġto Ġreceive Ġa Ġresponse Ġfor . ĊĠĠĠĠ Ġ* Ġ@ return ĠResponse Ġas ĠPC DF Events . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreceive OB D Multi Line ( lines : ĠMutable List < String >, Ġcommand : ĠO BD Command ): ĠMutable List < PC DF Event ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠMutable List < PC DF Event ?> Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġlines . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġline . replace (" Ġ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! line . matches ("^ [ a - fA - F 0 - 9 ]+ $ ". to Regex ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( parse OB D ( line , Ġcommand )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstring Ġ= Ġline . substring ( header Length , Ġheader Length Ġ+ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( substring . toInt () Ġ<= Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( parse OB D ( line , Ġcommand )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( lines . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Set Ġ= Ġreceive Multi Frame ( lines , Ġcommand ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġevent Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles ĠO BD Ġmulti Ġframe Ġresponses . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlines ĠReceived Ġlines . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠO BD Command Ġto Ġreceive Ġa Ġresponse Ġfor . ĊĠĠĠĠ Ġ* Ġ@ return ĠResponse Ġas ĠPC DF Events . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreceive Multi Frame ( lines : ĠMutable List < String >, Ġcommand : ĠO BD Command ): ĠMutable List < PC DF Event ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġfirst Ġheader . ĊĠĠĠĠĠĠĠ Ġheaders . add ( lines [ 0 ]. substring ( 0 , Ġheader Length )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġeach Ġnew Ġheader Ġto Ġthe Ġset Ġto Ġget Ġall Ġmulti Ġframes ĊĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġlines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvar Ġcline Ġ= Ġline . replace (" Ġ"," ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( headers . contains ( line . substring ( 0 , Ġheader Length )))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders . add ( line . substring ( 0 , Ġheader Length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġmutable ListOf < PC DF Event ?> () ĊĠĠĠĠĠĠĠ Ġfor Ġ( header Ġin Ġheaders ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Response Ġ= ĠArray ( lines . size ) Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġlines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġl Ġ= Ġline . replace (" Ġ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l . startsWith ( header )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Ġ= Ġl . substring ( header Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpci Ġ= Ġl . substring ( 1 , Ġ 2 ). toInt ( 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Ġ= Ġl . substring ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Response [ pci ] Ġ= Ġl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresponse Ġ= Ġheader ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġcurrent Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ+= Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( parse OB D ( response , Ġcommand )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġevents ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses ĠO BD Ġresponse Ġto Ġa Ġlist Ġof ĠPC DF Events Ġin Ġpersistent Ġformat . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġob d Response ĠResponse Ġto Ġbe Ġparsed . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠCommand Ġthe Ġresponse Ġwas Ġreceived Ġfor . ĊĠĠĠĠ Ġ* Ġ@ return ĠParsed Ġ[ PC DF Event ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse OB D ( ob d Response : ĠString , Ġcommand : ĠO BD Command ): ĠPC DF Event ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresponse Ġ= Ġob d Response . replace ("\ r ", Ġ"") ĊĠĠĠĠĠĠĠ Ġif Ġ( response . matches ("^ [ a - fA - F 0 - 9 ]+ $ ". to Regex ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġresponse . substring ( 0 , Ġheader Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġresponse . substring ( header Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpci String Ġ= Ġresponse . substring ( 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremaining Bytes Ġ= Ġpci String . toInt ( 1 6 ) Ġ* Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġresponse . substring ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġresponse . substring ( 0 , Ġremaining Bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġwe ther Ġthe Ġcommand Ġis Ġa Ġsupported Ġpid Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpid Ġ= Ġresponse . substring ( 2 , Ġ 4 ). toInt ( 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pid Ġ% Ġ 3 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Supported P ids ( response , Ġheader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOB DE vent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" EC U -$ header ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . nano Time (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠError Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . APP _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . nano Time (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" OB D ĠCommunication ĠError : Ġ$ command Ġ$ response " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfunction Ġto Ġreceive Ġthe Ġconnected Ġcars ĠV IN Ġ( Vehicle ĠIdent ification ĠNumber ). ĊĠĠĠĠ Ġ* ĠThe Ġresponse Ġis Ġsent Ġto Ġthe Ġ[ output Channel ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġget V IN () Ġ{ ĊĠĠĠĠĠĠĠ Ġsend OB D Command ( V IN ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Events Ġ= Ġreceive OB D ( V IN ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġresponse Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Channel . send ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfunction Ġto Ġreceive Ġthe Ġconnected Ġvehicles Ġfuel Ġtype . ĊĠĠĠĠ Ġ* ĠThe Ġresponse Ġis Ġsent Ġto Ġthe Ġ[ output Channel ] Ġand Ġreturned . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġget Fuel Type (): ĠF uel Type Event ? Ġ{ ĊĠĠĠĠĠĠĠ Ġsend OB D Command ( F UE L _ TYPE ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Events Ġ= Ġreceive OB D ( F UE L _ TYPE ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġresponse Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ!= Ġnull Ġ&& Ġevent Ġis ĠOB DE vent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġevent . to Intermediate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġis ĠF uel Type Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Channel . send ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfunction Ġto Ġdo Ġ Ġa Ġfull Ġsupported ĠP IDs Ġrequest Ġ( Modes Ġ 1 Ġand Ġ 9 ) Ġto Ġget Ġall Ġthe Ġsupported ĠP IDs Ġof Ġthe ĊĠĠĠĠ Ġ* Ġconnected Ġvehicle . ĊĠĠĠĠ Ġ* ĠThe Ġresults Ġare Ġsent Ġto Ġthe Ġ[ output Channel ] Ġand Ġused Ġfor Ġdetermining Ġthe Ġsupported Ġand Ġselected ĠP IDs Ġof Ġthe Ġ[ command List ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġperform Supported P ids Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġthe Ġsupported ĠP IDs Ġrequests . ĊĠĠĠĠĠĠĠ Ġget Supported P ids ( 1 ) ĊĠĠĠĠĠĠĠ Ġget Supported P ids ( 9 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġintersection Ġbetween Ġsupported Ġand Ġselected ĠP IDs , Ġso Ġwe Ġdo Ġnot Ġmonitor ĠP IDs Ġwhich Ġare Ġnot Ġsupported . ĊĠĠĠĠĠĠĠ Ġval Ġsupported And Selected Ġ= Ġcommand List . intersect ( supported Commands ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġnot Supported Ġ= Ġcommand List . minus ( supported And Selected ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( not Supported . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Channel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . APP _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . nano Time (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġfollowing ĠO BD - Commands Ġselected Ġfor Ġtracking Ġwere Ġnot Ġsupported : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Supported . join ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcommand List Ġ= Ġsupported And Selected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġa Ġsupported ĠP IDs Ġrequest . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠMode Ġfor Ġwhich Ġto Ġrequest Ġthe Ġsupported ĠP IDs Ġ( 1 Ġor Ġ 9 ). ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof Ġsupported ĠP IDs . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġget Supported P ids ( mode : ĠInt ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsupp P ids : ĠMutable List < Int > Ġ= ĠLinkedList () ĊĠĠĠĠĠĠĠ Ġval Ġcmds : ĠMutable List < OB D Command > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Events Ġ= Ġmutable ListOf < PC DF Event ?> () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmds . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUPPORT ED _ PID S _ 1 _ 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUPPORT ED _ PID S _ 1 _ 3 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUPPORT ED _ PID S _ 1 _ 6 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUPPORT ED _ PID S _ 1 _ 9 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUPPORT ED _ PID S _ 1 _ 1 2 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUPPORT ED _ PID S _ 1 _ 1 6 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUPPORT ED _ PID S _ 1 _ 1 9 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmds . add ( SUPPORTED _ PID S _ 9 _ 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġin Ġcmds ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend OB D Command ( cmd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Events . addAll ( receive OB D ( cmd )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġresponse Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ!= Ġnull Ġ&& Ġevent Ġis ĠOB DE vent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġevent . to Intermediate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġis ĠSupported P ids Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Channel . send ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupp P ids . addAll ( data . supported P ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsupp P ids ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġa Ġsupported ĠP IDs Ġrequest , Ġadds Ġsupported ĠP IDs Ġto Ġsupported Commands Ġlist . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġresponse : Ġsupported ĠP IDs Ġresponse Ġto Ġbe Ġparsed . ĊĠĠĠĠ Ġ* Ġ@ return ĠSupported ĠP IDs Ġin Ġa Ġpersistent ĠPC DF Event . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse Supported P ids ( response : ĠString , Ġheader : ĠString ): ĠPC DF Event ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġresponse . substring ( 0 , Ġ 2 ). toInt () Ġ- Ġ 4 0 ĊĠĠĠĠĠĠĠ Ġval Ġpid Ġ= Ġresponse . substring ( 2 , Ġ 4 ). toInt ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġvar Ġdata Ġ= Ġresponse . substring ( 4 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠConvert Ġdata Ġto Ġbit - string . ĊĠĠĠĠĠĠĠ Ġdata Ġ= Ġdata . to Long ( 1 6 ). toString ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFill Ġup Ġbit Ġstring Ġwith Ġzeros Ġin Ġcase Ġits Ġto Ġshort Ġ( has Ġto Ġconsist Ġof Ġexactly Ġ 3 2 Ġbits ). ĊĠĠĠĠĠĠĠ Ġwhile Ġ( data . length Ġ< Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġ" 0 $ data " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠA Ġ 1 Ġin Ġthe Ġreceived Ġbit Ġstring Ġindicates Ġthat Ġthe Ġcorresponding ĠPID Ġis Ġsupported . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġreplace Ġthis Ġthrough Ġthe Ġfunctionality Ġin Ġthe Ġcore . ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 3 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 4 9 Ġ== Ġ 1 Ġ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ i Ġ- Ġ 1 ]. toInt () Ġ== Ġ 4 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠO BD Command . get Command ( mode , Ġi Ġ+ Ġpid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupported Commands . add ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠOB DE vent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" EC U -$ header ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . nano Time (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends ĠEL M 3 2 7 Ġsystem Ġcommand Ġto Ġthe Ġgiven ĠOutputStream Ġ/ ĠO BD - Adapter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand Ġ: Ġcommand Ġto Ġbe Ġsent , Ġwithout ĠAT . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend EL M ( command : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ" AT Ġ$ command \ r " ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput ?. write (( input . toByteArray ())) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe ceiv es Ġthe Ġresponse Ġto Ġa ĠEL M 3 2 7 Ġsystem Ġcommand . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreceive EL M (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresponse Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Byte Ġ= Ġinput !!. read (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( next Byte Ġ!= Ġ' >'. to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ+= Ġnext Byte . to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Byte Ġ= Ġinput !!. read (). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse . replace (" Ġ", Ġ""). replace ("\ r ", Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġthe ĠEL M 3 2 7 ĠBluetooth Ġadapter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinit EL M () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresponse Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReset ĠEL M ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġchange Ġthis Ġhere Ġsince Ġit Ġmay Ġmake Ġthe Ġapp Ġfreeze ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! response . contains (" EL M ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend EL M (" Z ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġreceive EL M () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Response : Ġ" Ġ+ Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable ĠEcho ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! response . contains (" OK ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend EL M (" E 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġreceive EL M () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Response : Ġ" Ġ+ Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdisable Ġline feed , Ġno Ġcar riage Ġreturn Ġcharacters Ġafter Ġevery Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! response . contains (" OK ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend EL M (" L 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġreceive EL M () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Response : Ġ" Ġ+ Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġenable Ġheaders ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! response . contains (" OK ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend EL M (" H 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġreceive EL M () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Protocol (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalid Protocol Ġ= Ġcheck Protocol ( Protocol . SP 6 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( valid Protocol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalid Protocol Ġ= Ġcheck Protocol ( Protocol . SP 7 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġvalid Protocol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġelm Init Protocol ( protocol : ĠProtocol ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġprotocol Ġto Ġgiven ĠCAN Ġprotocol ĊĠĠĠĠĠĠĠ Ġvar Ġresponse Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! response . contains (" OK ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend EL M ( protocol . command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġreceive EL M () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Protocol ( protocol : ĠProtocol ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . protocol Ġ= Ġprotocol ĊĠĠĠĠĠĠĠ Ġelm Init Protocol ( protocol ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSend Ġ 0 x 0 1 Ġ 0 0 Ġsupported ĠP IDs Ġcommand Ġaccording Ġto ĠISO Ġ 1 5 7 6 5 - 4 Ġstandard 's ĊĠĠĠĠĠĠĠ Ġ// ĠCAN Ġidentifier Ġverification Ġprocedure ĊĠĠĠĠĠĠĠ Ġvar Ġvalid Response Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend OB D Command ( SUPPORTED _ PID S _ 1 _ 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġreceive OB D ( SUPPORTED _ PID S _ 1 _ 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Response Ġ= Ġresponse . fold ( false , Ġ{ Ġacc , Ġe Ġ-> Ġacc Ġor Ġ( e Ġ!= Ġnull Ġ&& Ġe Ġ! is ĠError Event ) Ġ}) Ġor Ġvalid Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid Response ) Ġ{ Ġbreak Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalid Response ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġused ĠInputStream Ġand ĠOutputStream Ġafter Ġa Ġconnection Ġloss . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchange IO Streams ( new Input : ĠInputStream , Ġnew Output : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġnew Input ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= Ġnew Output ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠProtocol ( val Ġcommand : String ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSP 6 (" SP 6 "), ĠSP 7 (" SP 7 ") ĊĠĠĠ Ġ} Ċ } Ċ