package Ġcom . lux ro bo . mod is dk . core Ċ Ċ import Ġandroid . bluetooth .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Parcel Uuid Ċ import Ġcom . lux ro bo . mod is dk . client . Mod i Client Ċ import Ġcom . lux ro bo . mod is dk . utils . Mod i Log Ċ import Ġcom . lux ro bo . mod is dk . utils . isConnected Ċ import Ġcom . pol idea . rx android ble 2 . Notification Setup Mode Ċ import Ġcom . pol idea . rx android ble 2 . R xB le Client Ċ import Ġcom . pol idea . rx android ble 2 . R xB le Connection Ċ import Ġcom . pol idea . rx android ble 2 . R xB le Connection . G ATT _ MT U _ MAXIMUM Ċ import Ġcom . pol idea . rx android ble 2 . R xB le Device Ċ import Ġcom . pol idea . rx android ble 2 . exceptions . B le Already Connected Exception Ċ import Ġcom . pol idea . rx android ble 2 . exceptions . B le Disconnected Exception Ċ import Ġcom . pol idea . rx android ble 2 . exceptions . B le Scan Exception Ċ import Ġcom . pol idea . rx android ble 2 . scan . Scan Filter Ċ import Ġcom . pol idea . rx android ble 2 . scan . Scan Settings Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Transformer Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . exceptions . Un deliver able Exception Ċ import Ġio . reactivex . plugins . Rx Java Plugins Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . Number FormatException Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit ĊĊĊ Ċ class ĠMod i Manager Ġ: ĠMod i Frame Notifier () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġr xB le Client : ĠR xB le Client ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġble Device : ĠR xB le Device ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : ĠContext ĊĊĠĠĠ Ġprivate Ġvar Ġis Auto Connect Ġ= Ġfalse ĊĠĠĠ Ġval Ġis Sc anning : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġscan Disposable Ġ!= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġscan Disposable ĠĠĠĠĠĠĠĠĠ Ġ: ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġconnection Disposable ĠĠĠ Ġ: ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstate Disposable ĠĠĠĠĠĠĠĠ Ġ: ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnotification Dis pas able Ġ Ġ: ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġwrite able Disposable ĠĠĠĠ Ġ: ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġreadable Disposable ĠĠĠĠĠ Ġ: ĠDis posable ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġdisconnect Trigger Subject Ġ= ĠPublish Subject . create < Unit >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm R xB le Connection Ġ: ĠR xB le Connection ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconnection Observable : ĠObservable < R xB le Connection > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcharacteristic Uuid : ĠUUID ĊĊĠĠĠ Ġprivate Ġval Ġcharacteristics List Ġ= ĠHashMap < String , ĠBluetooth GattCharacteristic >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Bluetooth Gatt Services Ġ: ĠMutable List < Bluetooth Gatt Service > ĊĊĠĠĠ Ġprivate Ġvar Ġmod i Id Ġ= Ġbyte ArrayOf ( 4 ) ĊĠĠĠ Ġprivate Ġval Ġbytes To Write Ġ= ĠByteArray ( 1 0 2 4 ) Ġ// Ġa Ġki lob yte Ġarray ĊĠĠĠ Ġprivate Ġvar Ġmod i Mode Ġ= Ġ"" ĊĊĠĠĠ Ġprivate Ġvar Ġm Mod i Client : ĠMod i Client ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Module Manager : ĠMod i Module Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Mod i Code Updater : ĠMod i Code Updater ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbluetooth Adapter : ĠBluetooth Adapter ĊĊĠĠĠ Ġfun Ġinit ( context : ĠContext , Ġclient : ĠMod i Client ): ĠMod i Manager Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġr xB le Client Ġ= ĠR xB le Client . create ( context ) ĊĠĠĠĠĠĠĠ Ġm Mod i Client Ġ= Ġclient ĊĊĠĠĠĠĠĠĠ Ġcharacteristic Uuid Ġ= ĠUUID . fromString (" 0 0 0 0 8 4 2 1 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĊĠĠĠĠĠĠĠ Ġm Mod i Code Updater Ġ= ĠMod i Code Updater ( this ) ĊĠĠĠĠĠĠĠ Ġm Module Manager Ġ= ĠMod i Module Manager ( this ) ĊĊĠĠĠĠĠĠĠ Ġattach ( m Mod i Code Updater ) ĊĠĠĠĠĠĠĠ Ġattach ( m Module Manager ) ĊĊĠĠĠĠĠĠĠ Ġset Bluetooth Adapter () ĊĊĠĠĠĠĠĠĠ ĠRx Java Plugins . set ErrorHandler Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġis ĠUn deliver able Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġe . cause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġis ĠIOException Ġ|| Ġerror Ġis ĠSocket Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfine , Ġir relevant Ġnetwork Ġproblem Ġor ĠAPI Ġthat Ġthrows Ġon Ġcancellation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set ErrorHandler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġis ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfine , Ġsome Ġblocking Ġcode Ġwas Ġinterrupted Ġby Ġa Ġdispose Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set ErrorHandler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġis ĠNullPointerException Ġ|| Ġerror Ġis ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat 's Ġlikely Ġa Ġbug Ġin Ġthe Ġapplication ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Thread . currentThread (). unc a ught ExceptionHandler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). unc a ught ExceptionHandler !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unc a ught Exception ( Thread . currentThread (), Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set ErrorHandler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġis ĠIllegalStateException Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat 's Ġa Ġbug Ġin ĠRx Java Ġor Ġin Ġa Ġcustom Ġoperator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Thread . currentThread (). unc a ught ExceptionHandler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). unc a ught ExceptionHandler !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unc a ught Exception ( Thread . currentThread (), Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set ErrorHandler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" Un deliver able Ġexception Ġreceived , Ġnot Ġsure Ġwhat Ġto Ġdo Ġ${ error . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Connection Failure ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscan () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġuuid s Ġ= ĠarrayOf Null s < UUID >( 1 ) ĊĠĠĠĠĠĠĠ Ġuuid s [ 0 ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString ( Mod i Gatt Attributes . convert 1 2 8 UUID ( Mod i Gatt Attributes . DEVICE _ ADV _ SERVICE )) ĊĊĠĠĠĠĠĠĠ Ġval Ġparcel Uuid Ġ= ĠParcel Uuid ( uuid s [ 0 ]) ĊĊĠĠĠĠĠĠĠ Ġval Ġscan Settings Ġ= ĠScan Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ LAT ENCY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Callback Type ( Scan Settings . CALLBACK _ TYPE _ ALL _ MATCH ES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġscan Filter Ġ= ĠScan Filter . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Service Uuid ( parcel Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscan Result Ġ= Ġr xB le Client . scan B le Devices ( scan Settings , Ġscan Filter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Result . observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Finally Ġ{ Ġscan Dispose () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ Ġm Mod i Client !!. on Scan () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġm Mod i Client !!. on Found Device ( it ) Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" scan Result . observe On Ġon Scan Failure Ġ${ it . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scan Failure ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġscan Disposable Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Auto Connect ( is Auto Connect : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . is Auto Connect Ġ= Ġis Auto Connect ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Notification () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġm R xB le Connection . setup Notification ( character istic Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ({ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder ( it . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( byte Char Ġin Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( String . format ("% 0 2 X Ġ", Ġbyte Char )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it [ 0 ]. toInt () Ġ!= Ġ 0 Ġ&& ĠstringBuilder . toString (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmsg Ġ= Ġ" setup Notification ĠReceive ĠBytes Ġ" Ġ+ Ġit . size Ġ+ Ġ"(" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġit . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= Ġ"${ Integer . to HexString ( it [ i ]. toInt () Ġand Ġ 0 xFF )}, Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= Ġ")" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . d ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= ĠString ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . size Ġ== Ġ 1 6 Ġ|| Ġit . size Ġ== Ġ 1 0 ) Ġ{ ĊĊĊ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Received Data ( string Builder . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Received Data ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Mod i Frame ( Mod i Frame ( it )) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" setup Notification Ġerror Ġ Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Connection Failure ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Dis pas able Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġm R xB le Connection . read Characteristic ( character istic Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmsg Ġ= Ġ" read Characteristic ĠReceive ĠBytes Ġ" Ġ+ Ġit . size Ġ+ Ġ"(" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġit . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= ĠInteger . to HexString ( it [ i ]. toInt () Ġand Ġ 0 xFF ) Ġ+ Ġ", Ġ" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= Ġ")" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . d ( msg ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod i Id Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" read Characteristic Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Connection Failure ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreadable Disposable Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Bluetooth Gatt Services . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . uuid Ġ== ĠUUID . fromString ( Mod i Gatt Attributes . convert 1 2 8 UUID ( Mod i Gatt Attributes . DEVICE _ TX _ DESC ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . character istics . forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . descriptors . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm R xB le Connection . write Descriptor ( it , ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠHandler (). post Delayed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠMO DI Ġ= ĠByteArray ( 1 6 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ i ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 6 ] Ġ= Ġ 0 x 0 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 7 ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 8 ] Ġ= Ġ 0 x 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 9 ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 1 0 ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 1 1 ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 1 2 ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 1 3 ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 1 4 ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMO DI [ 1 5 ] Ġ= Ġ 0 x 0 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Data ( MODI ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Module Manager . set Root Module ( get Connected Mod i Uuid ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Data ( Mod i Protocol . getVersion ( get Connected Mod i Uuid () Ġand Ġ 0 xFF F )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconnect ( mac Address Ġ: ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif ( isConnected () Ġ&& Ġble Device . mac Address Ġ== Ġmac Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġble Device Ġ= Ġr xB le Client . getB le Device ( mac Address ) ĊĊ Ċ // ĠĠĠĠĠĠĠ Ġconnection Observable Ġ= Ġprepare Connection Observable () ĊĊĠĠĠĠĠĠĠ Ġval Ġmt u Neg otiation Observable Transformer Ġ= ĠObservable Transformer < R xB le Connection , ĠR xB le Connection > Ġ{ Ġupstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupstream . do On Subscribe Ġ{ ĠMod i Log . i (" MT U ", Ġ" MT U Ġneg otiation Ġis Ġsupported ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Single Ġ{ Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . request M tu ( G ATT _ MT U _ MAXIMUM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĠMod i Log . i (" MT U ", Ġ" Neg oti ating ĠMT U Ġstarted ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĠMod i Log . i (" MT U ", Ġ" Neg oti ated ĠMT U : Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Single . just ( connection )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġble Device . observe Connection State Changes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take Until ( disconnect Trigger Subject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Connection StateChange ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" observe Connection State Changes Ġerror Ġ: Ġ${ it . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġstate Disposable Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġble Device . est ablish Connection ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( mt u Neg otiation Observable Transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm R xB le Connection Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . request Connection Priority ( Bluetooth Gatt . CONNECTION _ PRIORITY _ HIGH , 1 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . discover Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take Until ( disconnect Trigger Subject ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt Services Ġ= Ġit . bluetooth Gatt Services ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Dis covered Service () Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Data ( Mod i Protocol . set Module State ( 0 xFF F , ĠMod i Protocol . MODULE _ STATE . RESET )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Connection Failure ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Disposable Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrigger Disconnect () Ġ= Ġdisconnect Trigger Subject . onNext ( Unit ) ĊĊĠĠĠ Ġprivate Ġfun Ġon Connection StateChange ( newState : ĠR xB le Connection . R xB le Connection State ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhen ( newState . name ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CONNECT ING " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Connecting () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CONNECTED " -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. stop Scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Connected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DIS CONNECTED " -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Disconnected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan Dispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġscan Disposable Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Scan Failure ( throwable : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġis ĠB le Scan Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Scan Failure () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Connection Failure ( e Ġ: ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif ( e Ġis ĠB le Already Connected Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Connection Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, 5 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( e Ġis ĠB le Disconnected Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Connection Failure ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( e Ġis ĠNumber FormatException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġ" 4 . 0 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtemp Ver Ġ= Ġ" 4 . 0 . 0 " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( 8 Ġ> Ġtemp Ver . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ver Ġ= Ġ" 0 $ temp Ver " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 8 - temp Ver . length ] Ġ= Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġtemp Ver . length Ġ- Ġversion . length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( Ġi Ġin Ġ 8 Ġ- Ġversion . length Ġuntil Ġ 8 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ= Ġversion [ i Ġ- Ġoffset ]. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Protocol . set Version ( get Connected Mod i Uuid () Ġand Ġ 0 xFF F , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Connected () Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġble Device . isConnected ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconnection Dispose () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġstate Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġconnection Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġnotification Dis pas able ?. dispose () ĊĠĠĠĠĠĠĠ Ġwrite able Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġreadable Disposable ?. dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisconnect Per manently () Ġ{ ĊĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconnection Dispose () ĊĠĠĠĠĠĠĠ Ġm Module Manager . reset All Modules () ĊĠĠĠĠĠĠĠ Ġtrigger Disconnect () ĊĠĠĠĠĠĠĠ Ġm Mod i Client !!. on Disconnected () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Scan () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġscan Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġm Mod i Client !!. stop Scan () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Connected Mod i Uuid () Ġ: ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByteBuffer . wrap ( mod i Id , Ġ 0 , Ġ 4 ). order ( Byte Order . LIT TLE _ ENDIAN ). int ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" get Connected Mod i Uuid ĠError Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmodule Mgr () Ġ: ĠMod i Module Manager { Ċ Ċ // ĠĠĠĠĠĠĠ Ġm Module Manager Ġ= ĠMod i Module Manager ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm Module Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode Updater (): ĠMod i Code Updater Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Mod i Code Updater ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget Device Address () Ġ: ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġble Device . mac Address ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Gatt Char Data Rx Tx () Ġ: ĠBluetooth GattCharacteristic { ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcharacteristics List [ Mod i Gatt Attributes . DEVICE _ CHAR _ TX _ RX ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Device Name () Ġ: ĠString ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġble Device . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget B le Device () Ġ: ĠR xB le Device Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġble Device ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Data ( data : ĠByteArray ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! isConnected ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġm R xB le Connection . write Characteristic ( character istic Uuid , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmsg Ġ= Ġ" send Data ĠTrans mit ĠBytes ĠDone " Ġ+ Ġit . size Ġ+ Ġ"(" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġit . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= ĠInteger . to HexString ( it [ i ]. toInt () Ġand Ġ 0 xFF ) Ġ+ Ġ", Ġ" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= Ġ")" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . v ( msg ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Updater (). notify Send Done ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" write Characteristic Ġerror Ġ$ it ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Connection Failure ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite able Disposable Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Long Write ( data Ġ: ĠByteArray ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġm R xB le Connection . createNew Long Write Builder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Characteristic Uuid ( character istic Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Bytes ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmsg Ġ= Ġ" send Long Write ĠTrans mit ĠBytes ĠDone " Ġ+ Ġit . size Ġ+ Ġ"(" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġit . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= ĠInteger . to HexString ( it [ i ]. toInt () Ġand Ġ 0 xFF ) Ġ+ Ġ", Ġ" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ+= Ġ")" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . v ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mod i Id () Ġ: ĠByteArray { ĊĠĠĠĠĠĠĠ Ġreturn Ġmod i Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mod i Mode (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmod i Mode ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġë¸ Ķ ë£ ¨ í Ī ¬ ìĬ¤ Ġì ¼ ľ ê¸° ( ê° ķ ìłľ ë¡ľ Ġë¸ Ķ ë£ ¨ í Ī ¬ ìĬ¤ ĠìĤ¬ìļ© Ġìĭľ ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Bluetooth Adapter () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbluetooth Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . context . getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . bluetooth Adapter Ġ= Ġbluetooth Manager . adapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . bluetooth Adapter . enable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter . enable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" set Bluetooth Adapter ĠError : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBluetooth Adapter ĠíĻľ ìĦ± íĻĶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġturn On Bluetooth (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . bluetooth Adapter . isEnabled ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . bluetooth Adapter . enable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbluetooth Adapter . isEnabled ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . e (" turn On Bluetooth ĠError Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreboot Bluetooth Adapter (): ĠBoolean Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . bluetooth Adapter . isEnabled ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . bluetooth Adapter . disable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . d (" Bluetooth ĠTurn ing Ġoff ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ( Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter . enable () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, 3 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod i Log . d (" Bluetooth Ġturn ĠOff ĠError Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbluetooth Adapter . isEnabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBluetooth GattCharacteristic . describe Properties (): ĠString Ġ= ĊĊĊĠĠĠĠĠĠĠ Ġmutable ListOf < String >(). run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Readable ) Ġadd (" REQUEST _ READ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Write able ) Ġadd (" REQUEST _ WRITE ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNot ifiable ) Ġadd (" REQUEST _ NOTIFY ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoin ToString (" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠBluetooth GattCharacteristic . isNot ifiable : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġproperties Ġand ĠBluetooth GattCharacteristic . PROPERTY _ NOTIFY Ġ!= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval ĠBluetooth GattCharacteristic . is Readable : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġproperties Ġand ĠBluetooth GattCharacteristic . PROPERTY _ READ Ġ!= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval ĠBluetooth GattCharacteristic . is Write able : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġproperties Ġand Ġ( Bluetooth GattCharacteristic . PROPERTY _ WRITE Ġor ĠBluetooth GattCharacteristic . PROPERTY _ WRITE _ NO _ RESPONSE ) Ġ!= Ġ 0 Ċ Ċ }