package Ġcom . hd . tools . view Ċ Ċ import Ġandroid . view . View Ċ import Ġcom . hd . serial port . listener . Serial Port Measure Listener Ċ import Ġcom . hd . serial port . method . Device Measure Controller Ċ import Ġcom . hd . serial port . param . Serial Port Measure Parameter Ċ import Ġcom . hd . serial port . utils . L Ċ import Ġcom . hd . tools . R Ċ import Ġkotlinx . android . synt hetic . main . device _ measure _ title .* Ċ import Ġkotlinx . android . synt hetic . main . serial _ receive _ send _ test .* Ċ import Ġjava . io . IOException Ċ import Ġjava . io . OutputStream Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . concurrent . thread Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġhd Ġon Ġ 2 0 1 7 / 1 1 / 2 2 . Ċ Ġ* Ċ Ġ*/ Ċ class ĠSerial Port Measure Activity Ġ: ĠMeasure Activity < String >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġset Layout Id (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR . layout . activity _ serial _ port ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Content () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Spinner Adapter ( sp _ ba ud rate , Ġresources . getString Array ( R . array . ba ud rates )) ĊĠĠĠĠĠĠĠ Ġset Spinner Adapter ( sp _ parity , Ġresources . getString Array ( R . array . PAR ITY )) ĊĠĠĠĠĠĠĠ Ġtv Flag . text Ġ= Ġresources . getString ( R . string . flags ) ĊĠĠĠĠĠĠĠ Ġusb _ title . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Device List () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserial Map Ġ= ĠDevice Measure Controller . scan Serial Port () ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġserial Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . add ( path . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL . d ( path . key Ġ+ Ġ" ==" Ġ+ Ġpath . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Entries . clear () ĊĠĠĠĠĠĠĠ Ġm Entries . addAll ( paths ) ĊĠĠĠĠĠĠĠ Ġm Adapter ?. notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset List Title Name ( t : ĠString ): ĠCharSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Connect () Ġ{ ĊĠĠĠĠĠĠĠ ĠDevice Measure Controller . measure ( serial Port Measure Parameter Ġ= ĠSerial Port Measure Parameter ( port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbaud Rate Ġ= ĠInteger . parseInt ( sp _ ba ud rate . selected Item . toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠInteger . parseInt ( sp _ parity . selected Item . toString ())), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserial Port Measure Listener Ġ= Ġobject Ġ: ĠSerial Port Measure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmeasure Error ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Data With Line Feed ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmeas uring ( path : ĠString , Ġdata : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! port Test . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Data ( path , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Test ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( output Stream : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput IO Ġ= ĠoutputStream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Data ( array List : ĠArrayList < ByteArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġarray List . forEach Ġ{ Ġoutput IO ?. write ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Data ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Send Data Test ( null ) ĊĠĠĠĠĠĠĠ Ġreset Test Count () ĊĠĠĠĠĠĠĠ Ġsuper . send Data ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġoutput IO : ĠOutputStream ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġport Test Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġprivate Ġval Ġm Byte Received Back Semaphore Ġ= Ġjava . lang . Object () ĊĠĠĠ Ġprivate Ġvar Ġm Value ToSend : ĠByte Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Byte Received Back : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġsend Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġreceive Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlose Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġab normal Count Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġstart Send Data Test ( v : Ġandroid . view . View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( port Ġ!= Ġnull Ġ&& Ġopen . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Test Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Test . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Ġ{ Ġwrite Test () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( port Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Data With Line Feed ( resources . getString ( R . string . choose _ device )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Data With Line Feed ( resources . getString ( R . string . please _ open _ port _ first )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( port Test . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized Ġ( m Byte Received Back Semaphore ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Byte Received Back Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput IO ?. write ( m Value ToSend . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" write Ġdata Ġtest Ġerror Ġ: $ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġ 5 5 0 ms Ġbefore Ġsending Ġnext Ġbyte , Ġor Ġas Ġsoon Ġas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġsent Ġbyte Ġhas Ġbeen Ġread Ġback . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Byte Received Back Semaphore . wait ( 5 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Byte Received Back ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠByte Ġhas Ġbeen Ġreceived ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTimeout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlose Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Test Count ( receive Count . toString (), Ġlose Count . toString (), Ġsend Count . toString (), Ġab normal Count . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" write Ġdata Ġtest Ġerror Ġ: $ ignored ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Test ( data : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized Ġ( m Byte Received Back Semaphore ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL . d (" receive Ġdata Ġ:" Ġ+ ĠArrays . toString ( data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ i ] Ġ== Ġm Value ToSend Ġ&& Ġ! m Byte Received Back ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Value ToSend ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġbyte Ġwas Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠW ake - up Ġthe Ġsending Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Byte Received Back Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Byte Received Back Semaphore . notify () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġbyte Ġwas Ġnot Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġab normal Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Test Count () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Test Count (" 0 ", Ġ" 0 ", Ġ" 0 ", Ġ" 0 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Test Count ( receive Count : ĠString , Ġlose Count : ĠString , Ġsend Count : ĠString , Ġab normal Count : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtv _ receive Data Count . text Ġ= Ġreceive Count ĊĠĠĠĠĠĠĠ Ġtv _ lose Data Count . text Ġ= Ġlose Count ĊĠĠĠĠĠĠĠ Ġtv _ send Data Count . text Ġ= Ġsend Count ĊĠĠĠĠĠĠĠ Ġtv _ ab normal Data Count . text Ġ= Ġab normal Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Send Data Test ( v : Ġandroid . view . View ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġport Test . set ( false ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ