package Ġcom . se iko . serial . target Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . se iko . serial . core . Serial Port Ċ import Ġcom . se iko . serial . mod bus . to HexString Ċ import Ġcom . se iko . serial . target . decode . Break age Decode Ċ import Ġcom . se iko . serial . target . decode . I Decode Ċ import Ġcom . se iko . serial . target . filter . Crc 1 6 Filter Ċ import Ġcom . se iko . serial . target . filter . I Filter Ċ import Ġcom . se iko . serial . target . msg . Serial Msg Ċ import Ġcom . se iko . serial . target . msg . Serial Msg Post Thread Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ import Ġjava . util . concurrent . Priority BlockingQueue Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . atomic . Atomic Long Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠSerial Target ( private Ġval Ġserial : ĠSerial Port ): ĠSerial Module . Target , ĠSerial Msg Post Thread . Callback Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åŃĹèĬĤ å¤ĦçĲĨ ï¼Į å¤ĦçĲĨ æĸŃ åĮħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġi Decode : ĠI Decode Ġ= ĠBreak age Decode () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åŃĹèĬĤ è¿ĩæ»¤ ï¼Į é»ĺè®¤ ï¼ļ Crc 1 6 æł¡éªĮ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġi Filter : ĠI Filter Ġ= ĠC rc 1 6 Filter () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¾å¤ĩ éĽĨåĲĪ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmodules Ġby Ġlazy Ġ{ ĠCopy On Write ArrayList < Serial Module >() Ġ} ĊĠĠĠ Ġprivate Ġval Ġcurrent Module Ġby Ġlazy Ġ{ ĠAtomic Reference < Serial Module >() Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ åĲ¯åĬ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠisOpen Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å®īåħ¨ éĶģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlast Receive Time Ġ= ĠAtomic Long ( System . currentTimeMillis ()) ĊĠĠĠ Ġprivate Ġvar Ġsend Thread : ĠSerial Msg Post Thread ? Ġ= Ġnull ĊĊĠĠĠ Ġ/ **************************************** *** ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFun ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ********************************* ******** **/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¾å¤ĩ æĺ¯åĲ¦ å¼ĢåĲ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠisOpen (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠisOpen . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĲ¯åĬ¨ ä¸² åı£ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isOpen . get ()) Ġreturn ĊĠĠĠĠĠĠĠ ĠisOpen . lazy Set ( true ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠByteArray ĊĠĠĠĠĠĠĠ Ġserial . open ( object Ġ: ĠSerial Port . Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonStart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" WARN .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Result ( bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IS _ DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" RAW ï¼ļ ${ bytes . to HexString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġi Decode . check ( bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( result . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Filter . is Safe ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Bytes ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( IS _ DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" è¿ĩæ»¤ å¼Ĥå¸¸ åŃĹèĬĤ ï¼ļ ${ bytes . to HexString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġi Decode . check ( ByteArray ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åħ³éĹŃ ä¸² åı£ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isOpen . get ()) Ġreturn ĊĠĠĠĠĠĠĠ ĠisOpen . lazy Set ( false ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠåĪłéĻ¤ çĽ®åīį åŃĺåľ¨ çļĦ devices ĊĠĠĠĠĠĠĠ Ġfor Ġ( module Ġin ĠArrayList ( modules )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdel Serial Module ( module ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġserial . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĳéĢģ æĮĩä»¤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġsend ( device : ĠSerial Module , Ġbytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Thread ?. offer ( Serial Msg . obtain ( device , Ġbytes )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł ä¸² åı£ Module ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd Serial Module ( module : ĠSerial Module ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( modules . contains ( module )) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġbool Ġ= Ġmodules . add ( module ) ĊĠĠĠĠĠĠĠ Ġif Ġ( bool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isOpen . get ()) Ġmodule . attach ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IS _ DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" æ·»åĬł Module ï¼ļ ${ module . java Class . simple Name } ãĢĤ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbool ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪłéĻ¤ ä¸² åı£ Module ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdel Serial Module ( module : ĠSerial Module ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbool Ġ= Ġmodules . remove ( module ) ĊĠĠĠĠĠĠĠ Ġif Ġ( bool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isOpen . get ()) Ġmodule . attach ( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IS _ DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" åĪłéĻ¤ Module ï¼ļ ${ module . java Class . simple Name } ãĢĤ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbool ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************************************** *** ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOST Ġ/ ĠO FFER ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ********************************* ******** **/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¼ĢåĲ¯ åıĳéĢģ éĺŁåĪĹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Post Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Post Queue () ĊĊĠĠĠĠĠĠĠ Ġval Ġb ak Ġ= ĠSerial Msg Post Thread () ĊĠĠĠĠĠĠĠ Ġb ak . set Callback ( this ) ĊĠĠĠĠĠĠĠ Ġb ak . start () ĊĠĠĠĠĠĠĠ Ġsend Thread Ġ= Ġb ak ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åħ³éĹŃ åıĳéĢģ éĺŁåĪĹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Post Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb ak Ġ= Ġsend Thread ĊĠĠĠĠĠĠĠ Ġif Ġ( bak Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ak . set Callback ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ak . stop Thread () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Thread Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************************************** *** ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Ġ/ Ġon Pause ĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ********************************* ******** **/ ĊĊĠĠĠ Ġprivate Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Post Queue () ĊĠĠĠĠĠĠĠ Ġmodules . forEach Ġ{ Ġit . attach ( this ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġmodules . forEach Ġ{ Ġit . attach ( null ) Ġ} ĊĠĠĠĠĠĠĠ Ġstop Post Queue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************************************** *** ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠ ĠBytes ĠPost Ġ/ ĠDecode ĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ********************************* ******** **/ ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Msg ( msg : ĠSerial Msg ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġmsg . module ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġmsg . bytes ĊĊĠĠĠĠĠĠĠ Ġcurrent Module . set ( module ) ĊĠĠĠĠĠĠĠ Ġserial . send ( bytes ) ĊĠĠĠĠĠĠĠ Ġi Decode . bytes Of Send ( bytes ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( IS _ DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ Ġ"% s Ġ-> ĠPOST ï¼ļ % s ". format ( module . getTag (), Ġbytes . to HexString ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmsg . recycle () Ġ// Ġ åĽŀ æĶ¶ Msg ĊĊĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis (). minus ( last Receive Time . get ()) Ġ> ĠMAX _ CONNECT _ TIME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IS _ DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" å°Ŀè¯ķ æ¸ħ ç©º éĺŁåĪĹ ï¼ļ ${ send Thread ?. size () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Thread ?. clear Queue () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Bytes ( bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Module . get ()?. let Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module . accept ( bytes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Thread ?. setIs Wait Receive ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IS _ DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ Ġ"% s Ġ-> ĠREAD ï¼ļ % s ". format ( module . getTag (), Ġbytes . to HexString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast Receive Time . lazy Set ( System . currentTimeMillis ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************************************** *** ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMP AN ION ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ********************************* ******** **/ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ è°ĥè¯ķ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar ĠIS _ DEBUG Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Serial Target " ĊĠĠĠ Ġ} Ċ }