package Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . device Ċ Ċ import Ġandroid . bluetooth .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . databinding . Observable Ċ import Ġandroidx . databinding . Observable Field Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet annotations .* Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . converter . Blue berry Converter Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . converter . Blue berry Default Converter Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . request . call . Blue berry Abstract Request Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . request . call . Blue berry Request With No Response Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . request . call . Blue berry Request With Re pet it ious Results Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . request . call . Blue berry Request Without Result Ċ import Ġcom . gmail . ay t ene ve 9 3 . blue berry sher bet core . utility . Blue berry Logger Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġjava . lang . Class CastException Ċ import Ġjava . lang . Exception Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . collections . ArrayList Ċ Ċ /** Ċ Ġ* ĠAbstract Ġclass Ġof ĠBLE Ġdevice . Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġconfigure Ġspecific Ġoptions Ġfor Ġeach ĠBLE Ġdevice Ġby Ġinherit ing Ġthis Ġabstract Ġclass . Ċ Ġ* Ċ Ġ*/ Ċ abstract Ġclass ĠBlue berry Device < Blue berry Service > Ġprotected Ġconstructor () Ġ{ ĊĊĠĠĠ Ġvar Ġauto Connect : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġval Ġbluetooth State Ġ= ĠObservable Field ( Bluetooth State . STATE _ DIS CONNECTED ) ĊĠĠĠ Ġval Ġblue berry Service Ġ: ĠBlue berry Service Ġby Ġlazy Ġ{ Ġset ServiceImpl () Ġ} ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġset ServiceImpl () Ġ: ĠBlue berry Service ĊĊĠĠĠ Ġ/** ĠData ĠConverter Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġblue berry Converter Ġ: ĠBlue berry Converter Ġby Ġlazy Ġ{ Ġset Blue berry Converter () Ġ} ĊĠĠĠ Ġprotected Ġopen Ġfun Ġset Blue berry Converter () Ġ: ĠBlue berry Converter Ġ= ĠBlue berry Default Converter () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ END _ SIGNAL Ġ= Ġ"\ u 0 0 0 0 " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠC CC D Ġ= ĠUUID . fromString (" 0 0 0 0 2 9 0 2 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠC CC F Ġ= ĠUUID . fromString (" 0 0 0 0 2 9 0 1 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRX _ SERVICE _ UUID Ġ= ĠUUID . fromString (" 0 0 0 0 fff 0 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRX _ CHAR _ UUID Ġ= ĠUUID . fromString (" 0 0 0 0 fff 2 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTX _ CHAR _ UUID Ġ= ĠUUID . fromString (" 0 0 0 0 fff 1 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠBlue berry Connection Priority ( val Ġvalue Ġ: ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONNECTION _ PRIORITY _ BAL ANCED ( Bluetooth Gatt . CONNECTION _ PRIORITY _ BAL ANCED ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONNECTION _ PRIORITY _ HIGH ( Bluetooth Gatt . CONNECTION _ PRIORITY _ HIGH ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONNECTION _ PRIORITY _ LOW _ POWER ( Bluetooth Gatt . CONNECTION _ PRIORITY _ LOW _ POWER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠBluetooth State ( val Ġstate Code Ġ: ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ DIS CONNECTED ( 0 x 0 0 0 0 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ CONNECT ING ( 0 x 0 0 0 0 0 0 0 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ CONNECTED ( 0 x 0 0 0 0 0 0 0 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ DIS CONNECT ING ( 0 x 0 0 0 0 0 0 0 3 ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġfun ĠgetState From Code ( state Code Ġ: ĠInt ) Ġ: ĠBluetooth State Ġ= Ġvalues (). find Ġ{ Ġit . state Code Ġ== Ġstate Code Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// medium . com /@ ab ris ad _ it / ble - error - codes - a 3 c 6 6 7 5 b 2 9 c 1 ĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠB le Status ( val ĠstatusCode Ġ: ĠShort ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ SUCCESS ( 0 x 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ UNKNOWN _ BT LE _ COMMAND ( 0 x 0 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ UNKNOWN _ CONNECTION _ IDENTIFIER ( 0 x 0 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ AUTHENT ICATION _ FAILURE ( 0 x 0 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ PIN _ OR _ KEY _ MISSING ( 0 x 0 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ MEMORY _ CAP ACITY _ EX CE EDED ( 0 x 0 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ CONNECTION _ TIMEOUT ( 0 x 0 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ COMMAND _ DIS ALLOWED ( 0 x 0 C ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ INVALID _ BT LE _ COMMAND _ PARAMETERS ( 0 x 1 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ REMOTE _ USER _ TERMIN ATED _ CONNECTION ( 0 x 1 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ REMOTE _ DEV _ TERMIN ATION _ D UE _ TO _ LOW _ RESOURCES ( 0 x 1 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ REMOTE _ DEV _ TERMIN ATION _ D UE _ TO _ POWER _ OFF ( 0 x 1 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ LOCAL _ HOST _ TERMIN ATED _ CONNECTION ( 0 x 1 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ UNSUPPORTED _ REMOTE _ FEATURE ( 0 x 1 A ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ INVALID _ L MP _ PARAMETERS ( 0 x 1 E ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ UNSPECIFIED _ ERROR ( 0 x 1 F ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ L MP _ RESPONSE _ TIMEOUT ( 0 x 2 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ STATUS _ CODE _ L MP _ P DU _ NOT _ ALLOWED ( 0 x 2 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ INST ANT _ PAS SED ( 0 x 2 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ PAIR ING _ WITH _ UNIT _ KEY _ SUPPORTED ( 0 x 2 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ DI FFER ENT _ TRANSACTION _ COLL ISION ( 0 x 2 A ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ CONTROLLER _ BUSY ( 0 x 3 A ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ CONN _ INTERVAL _ UN ACCEPT ABLE ( 0 x 3 B ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ DIRECT ED _ AD VERT IS ER _ TIMEOUT ( 0 x 3 C ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ CONN _ TERMIN ATED _ D UE _ TO _ MIC _ FAILURE ( 0 x 3 D ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLE _ H CI _ CONN _ FAILED _ TO _ BE _ EST AB L ISHED ( 0 x 3 E ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ NO _ RESOURCES ( 0 x 8 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ INTERNAL _ ERROR ( 0 x 8 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ WRONG _ STATE ( 0 x 8 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ DB _ FULL ( 0 x 8 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ BUSY ( 0 x 8 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ ERROR ( 0 x 8 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ CMD _ STARTED ( 0 x 8 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ IL LEG AL _ PARAMETER ( 0 x 8 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ AUTH _ FAIL ( 0 x 8 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ MORE ( 0 x 8 a ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ INVALID _ CFG ( 0 x 8 b ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ SERVICE _ STARTED ( 0 x 8 C ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ ENCRYPT ED _ NO _ MIT M ( 0 x 8 D ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ NOT _ ENCRYPT ED ( 0 x 8 E ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ CON GEST ED ( 0 x 8 F ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ CCC _ CFG _ ERR ( 0 xFD ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ PR C _ IN _ PROGRESS ( 0 xFE ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ATT _ OUT _ OF _ RANGE ( 0 xFF ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠgetStatus From Code ( statusCode Ġ: ĠShort ) Ġ: ĠB le Status ? Ġ= Ġvalues (). find Ġ{ Ġit . statusCode Ġ== ĠstatusCode Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠP hy Option ( val Ġvalue Ġ: ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPHY _ OPTION _ NO _ PREFERRED ( Bluetooth Device . PHY _ OPTION _ NO _ PREFERRED ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPHY _ OPTION _ S 2 ( Bluetooth Device . PHY _ OPTION _ S 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPHY _ OPTION _ S 8 ( Bluetooth Device . PHY _ OPTION _ S 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġr ssi Binding Ġ= ĠObservable Field < Int >() ĊĠĠĠ Ġval Ġtx Phy Binding Ġ= ĠObservable Field < Int >() ĊĠĠĠ Ġval Ġrx Phy Binding Ġ= ĠObservable Field < Int >() ĊĠĠĠ Ġval Ġmt u Binding Ġ= ĠObservable Field < Int >() ĊĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġm Bluetooth Device Ġ: ĠBluetooth Device ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠmContext Ġ: ĠContext ĊĊĠĠĠ Ġprivate Ġvar Ġm Is Rel iable Write On Process Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Rel iable Write Value Ġ: ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġm Is Writing Without Response Ġ= Ġfalse ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġm Bluetooth Gatt Ġ: ĠBluetooth Gatt ĊĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Gatt Callback Ġ= Ġobject Ġ: ĠBluetooth Gatt Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Read Remote R ssi ( g att : ĠBluetooth Gatt ?, Ġr ssi : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Read Remote R ssi ( g att , Ġr ssi , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Blue berry Device . rssi Binding . set ( rssi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection StateChange ( g att : ĠBluetooth Gatt ?, Ġstatus : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Connection StateChange ( g att , Ġstatus , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth State . set ( Bluetooth State . getState From Code ( newState )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Services Dis covered ( g att : ĠBluetooth Gatt ?, Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Services Dis covered ( g att , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att ?. let Ġ{ Ġbluetooth Gatt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Characteristic List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt . services . forEach Ġ{ Ġeach Gatt Service Ġ-> Ġm Characteristic List . addAll ( each Gatt Service . character istics ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Service Dis covered Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Or Indic ate Request List . forEach Ġ{ Ġprev Not i Request Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Not i Request Info . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Priority Ġ= ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Services Dis covered () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Phy Read ( g att : ĠBluetooth Gatt ?, Ġtx Phy : ĠInt , Ġrx Phy : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Phy Read ( g att , Ġtx Phy , Ġrx Phy , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Blue berry Device . tx Phy Binding . set ( tx Phy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Blue berry Device . rx Phy Binding . set ( rx Phy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Phy Update ( g att : ĠBluetooth Gatt ?, Ġtx Phy : ĠInt , Ġrx Phy : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Phy Update ( g att , Ġtx Phy , Ġrx Phy , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Blue berry Device . tx Phy Binding . set ( tx Phy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Blue berry Device . rx Phy Binding . set ( rx Phy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon M tu Changed ( g att : ĠBluetooth Gatt ?, Ġmt u : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on M tu Changed ( g att , Ġmt u , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Blue berry Device . mt u Binding . set ( mt u ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Read ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Characteristic Read ( g att , Ġcharacteristic , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Request ?. on Response ( status , Ġcharacteristic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic ?. setValue ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Write ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Characteristic Write ( g att , Ġcharacteristic , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Is Writing Without Response ) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Writing Without Response Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Request ?. m Is On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Is Rel iable Write On Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( character istic Ġ!= Ġnull Ġ&& Ġcharacteristic . getString Value ( 0 ) Ġ== Ġm Rel iable Write Value ) Ġm Bluetooth Gatt . execute Rel iable Write () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġm Bluetooth Gatt . abort Rel iable Write () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Request ?. on Response ( status , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic ?. setValue ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! m Is Rel iable Write On Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Characteristic Changed ( g att , Ġcharacteristic ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic ?. let Ġ{ Ġnotify Or Indic ate Characteristic Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Or Indic ate Request List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . m Blue berry Request Info . m Uuid Ġ== Ġnotify Or Indic ate Characteristic . uuid Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġit . on Response ( 0 , Ġnotify Or Indic ate Characteristic ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Write ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠBluetooth Gatt Descriptor ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Descriptor Write ( g att , Ġdescriptor , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor ?. character istic ?. let Ġ{ Ġnotify Or Indic ate Characteristic Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Or Indic ate Request List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . m Blue berry Request Info . m Uuid Ġ== Ġnotify Or Indic ate Characteristic . uuid Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . on Response ( null , Ġnotify Or Indic ate Characteristic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Read ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠBluetooth Gatt Descriptor ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Descriptor Read ( g att , Ġdescriptor , Ġstatus ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Rel iable Write Completed ( g att : ĠBluetooth Gatt ?, Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Rel iable Write Completed ( g att , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Rel iable Write On Process Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Rel iable Write Value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġinternal Ġfun Ġinitialize ( bluetooth Device : ĠBluetooth Device , Ġcontext Ġ: ĠContext , Ġauto Connect Ġ: ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Bluetooth Device Ġ= Ġbluetooth Device ĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġthis . auto Connect Ġ= Ġauto Connect ĊĠĠĠĠĠĠĠ ĠsetDefault Connection StateChange Delegate () ĊĠĠĠĠĠĠĠ ĠsetDefault R ssi Value Change Delegate () ĊĠĠĠĠĠĠĠ Ġif ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) ĠsetDefault Phy Value Change Delegate () ĊĠĠĠĠĠĠĠ ĠsetDefault M tu Value Change Delegate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠConnection ĠState ĠChange ĠDelegate Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetDefault Connection StateChange Delegate () Ġ{ ĊĠĠĠĠĠĠĠ Ġbluetooth State . add On PropertyChanged Callback ( object Ġ: ĠObservable . On PropertyChanged Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon PropertyChanged ( sender : ĠObservable ?, Ġproperty Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( bluetooth State . get ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth State . STATE _ CONNECT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Device Connecting () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth State . STATE _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . discover Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . read Remote R ssi () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġthis @ Blue berry Device . read Phy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTo Do Ġ: ĠMT U Ġê°Ĵ Ġë³Ģê²½ ĠMethod Ġíĺ¸ì¶ľ ìĭľ ĠWRITE Ġ-> ĠRESP ONSE Ġë©Ķ ìĨĮ ëĵľ Ġë ¨ ¹ í Ĩµ ĠëĲĺ ëĬĶ ĠIssue Ġì¶Ķ í ĽĦ Ġíķ´ ê²° ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest M tu ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Device Connected () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth State . STATE _ DIS CONNECT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss R ssi Update Interval () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ssi Binding . set ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Phy Binding . set ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrx Phy Binding . set ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Binding . set ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Service Dis covered Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Device Disconnect ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth State . STATE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm M tu Request Info Queue . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Phy Request Info Queue . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Blue berry Request Queue . clear () ĊĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Request Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Device Disconnected () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠDevice ĠLife ĠCycle ĠCallback Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Device Disconnected () Ġ{ ĊĠĠĠĠĠĠĠ ĠBlue berry Logger . d (" Disconnected Ġfrom Ġ${ m Bluetooth Device . address }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Device Connecting () Ġ{ ĊĠĠĠĠĠĠĠ ĠBlue berry Logger . d (" Connecting Ġto Ġ${ m Bluetooth Device . address }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Device Connected () Ġ{ ĊĠĠĠĠĠĠĠ ĠBlue berry Logger . d (" Connected Ġto Ġ${ m Bluetooth Device . address }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Device Disconnect ing () Ġ{ ĊĠĠĠĠĠĠĠ ĠBlue berry Logger . d (" Disconnect ing Ġfrom Ġ${ m Bluetooth Device . address }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Services Dis covered () Ġ{ ĊĠĠĠĠĠĠĠ ĠBlue berry Logger . d (" Services Ġof Ġ${ m Bluetooth Device . address } Ġare ĠDis covered ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĠService ĠSetting Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Characteristic List Ġ= ĠArrayList < Bluetooth GattCharacteristic >() ĊĠĠĠ Ġprivate Ġvar Ġm Is Service Dis covered Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Is Bluetooth On Progress Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġm Blue berry Request Queue Ġ: ĠPriority Queue < Blue berry Abstract Request > Ġ= ĠPriority Queue () ĊĠĠĠ Ġprivate Ġval Ġm Notify Or Indic ate Request List Ġ: ĠArrayList < Blue berry Request With Re pet it ious Results < out ĠAny >> Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġvar ĠmCurrent Request Ġ: ĠBlue berry Abstract Request ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġfun Ġenqueue Blue berry Request Info ( blue berry Request : ĠBlue berry Abstract Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( m Is Service Dis covered Ġ&& Ġm Characteristic List . find Ġ{ Ġit . uuid Ġ== Ġblue berry Request . m Uuid Ġ} Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBlue berry Logger . e (" No ĠSuch ĠU uid ĠEx ists Ġ: Ġ'${ blue berry Request . m Uuid }' ") ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Blue berry Request Queue . offer ( blue berry Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Blue berry Request Queue . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcancel Blue berry Request ( blue berry Request : ĠBlue berry Abstract Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( blue berry Request . m RequestType Ġin ĠarrayOf ( NOTIFY :: class . java , ĠIND ICATE :: class . java )) Ġenqueue Blue berry Request Info ( blue berry Request ) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Blue berry Request Queue . find Ġ{ Ġit . m Request Code Ġ== Ġblue berry Request . m Request Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġm Blue berry Request Queue . remove ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception Ġ: ĠException ) Ġ{ Ġexception . printStackTrace () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġexecute Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġif (:: m Bluetooth Gatt . isInitialized ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġm Is Service Dis covered ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġbluetooth State . get () Ġ== ĠBluetooth State . STATE _ CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! m Is Bluetooth On Progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm M tu Request Info Queue . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm M tu Request Info Queue . poll ()?. let Ġ{ Ġmt u Request Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . request M tu ( mt u Request Info . mt u ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ execute Request ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Blue berry Request Queue . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Request Ġ= Ġm Blue berry Request Queue . poll () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Request ?. let Ġ{ Ġcurrent Request Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Characteristic Ġ= Ġm Characteristic List . find Ġ{ Ġit . uuid Ġ== Ġcurrent Request Info . m Uuid Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( found Characteristic Ġ== Ġnull ) ĠBlue berry Logger . e (" No ĠSuch ĠU uid ĠEx ists Ġ: Ġ'${ current Request Info . m Uuid }' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Characteristic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġrequest Process @ Ġ{ Ġcharacteristic Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( current Request Info . m RequestType ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWRITE :: class . java Ġ-> Ġ( current Request Info Ġas ĠBlue berry Request Without Result ). let Ġ{ Ġblue berry Write Request Info Without Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . setValue ( blue berry Write Request Info Without Result . input String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Request Info . m RequestType Ġ== ĠWRITE :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( blue berry Write Request Info Without Result . check Is Rel iable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . begin Rel iable Write () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Rel iable Write On Process Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Rel iable Write Value Ġ= Ġblue berry Write Request Info Without Result . input String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . write Characteristic ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue berry Write Request Info Without Result . m Is On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlue berry Logger . i (" WRITE Ġmethod Ġis Ġcalled . ĠSent Ġdata Ġ: Ġ${ blue berry Write Request Info Without Result . input String }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWRITE _ WITHOUT _ RESPONSE :: class . java Ġ-> Ġ( current Request Info Ġas ĠBlue berry Request With No Response ). let Ġ{ Ġblue berry Write Request Info With No Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( blue berry Write Request Info With No Response . end Signal Ġ== ĠDEFAULT _ END _ SIGNAL ) Ġcharacteristic . setValue ( blue berry Write Request Info With No Response . input String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Remain String Ġ= Ġblue berry Write Request Info With No Response . remain Input String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Remain String Ġ== Ġnull Ġ|| Ġcurrent Remain String Ġ== Ġ"") Ġcharacteristic . setValue ( blue berry Write Request Info With No Response . end Signal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Remain String . length Ġ< Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . setValue ( current Remain String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue berry Write Request Info With No Response . remain Input String Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . setValue ( current Remain String . substring ( 0 , Ġ 2 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue berry Write Request Info With No Response . remain Input String Ġ= Ġcurrent Remain String . substring ( 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ NO _ RESPONSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( blue berry Write Request Info With No Response . check Is Rel iable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . begin Rel iable Write () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Rel iable Write On Process Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Rel iable Write Value Ġ= Ġblue berry Write Request Info With No Response . input String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . write Characteristic ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue berry Write Request Info With No Response . m Is On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Writing Without Response Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlue berry Logger . i (" WRITE _ WITHOUT _ RESPONSE Ġmethod Ġis Ġcalled . ĠSent Ġdata Ġ: Ġ${ blue berry Write Request Info With No Response . input String }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( blue berry Write Request Info With No Response . end Signal Ġ!= ĠDEFAULT _ END _ SIGNAL Ġ&& Ġcharacteristic . getString Value ( 0 ) Ġ!= Ġblue berry Write Request Info With No Response . end Signal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue berry Write Request Info With No Response . enqueue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREAD :: class . java Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . read Characteristic ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request Info . m Is On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlue berry Logger . i (" READ Ġmethod Ġis Ġcalled .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFY :: class . java , ĠIND ICATE :: class . java Ġ-> Ġ( current Request Info Ġas ĠBlue berry Request With Re pet it ious Results < Any >). let Ġ{ Ġblue berry Request Info With Re pet it ious Results Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġcharacteristic . get Descriptor ( CC CD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠTo Do Ġ: ĠNotify ĠLimit ĠíĻķìĿ¸ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( blue berry Request Info With Re pet it ious Results . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Notify Or Indic ate Request List . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . m Uuid Ġ== Ġblue berry Request Info With Re pet it ious Results . m Uuid } Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Notify Or Indic ate Request List . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . m Request Code Ġ== Ġ Ġblue berry Request Info With Re pet it ious Results . m Request Code Ġ} Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Or Indic ate Request List . add ( blue berry Request Info With Re pet it ious Results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ request Process ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Request Info . m RequestType Ġ== ĠNOT IFY :: class . java ) ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠBluetooth Gatt Descriptor . ENABLE _ IND ICATION _ VALUE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Or Indic ate Request List . add ( blue berry Request Info With Re pet it ious Results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! m Notify Or Indic ate Request List . remove If Ġ{ Ġit . m Request Code Ġ== Ġblue berry Request Info With Re pet it ious Results . m Request Code Ġ}) Ġreturn @ request Process ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Notify Or Indic ate Request List . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . m Uuid Ġ== Ġblue berry Request Info With Re pet it ious Results . m Uuid } Ġ!= Ġnull ) Ġreturn @ request Process ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( descriptor . value Ġin ĠarrayOf ( Bluetooth Gatt Descriptor . ENABLE _ IND ICATION _ VALUE , ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . value Ġ= ĠBluetooth Gatt Descriptor . DISABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġreturn @ request Process ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . set Characteristic Notification ( character istic , Ġblue berry Request Info With Re pet it ious Results . isEnabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . write Descriptor ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . read Descriptor ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue berry Request Info With Re pet it ious Results . m Is On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlue berry Logger . e ("${ this . java Class . canonical Name } Ġhas Ġno Ġdescriptor .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlue berry Logger . i ("${ current Request Info . m RequestType . simple Name } Ġis Ġcalled .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegal AccessException (" Blue berry ĠExecution ĠAccess Ġby ĠUnknown ĠRequest ĠType ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request Info . start Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Phy Request Info Queue . isNotEmpty () Ġ&& ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Phy Request Info Queue . poll ()?. let Ġ{ Ġphy Request Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( phy Request Info . use Read Operation Only ) Ġm Bluetooth Gatt . read Phy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphy Request Info . tx Phy Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġphy Request Info . rx Phy Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġphy Request Info . phy Option Ġ!= Ġnull ) Ġm Bluetooth Gatt . set Preferred Phy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphy Request Info . tx Phy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphy Request Info . rx Phy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphy Request Info . phy Option . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Bluetooth On Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠP hy ĠValue ĠChange ĠDelegate Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun ĠsetDefault Phy Value Change Delegate () Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( tx Phy Binding , Ġrx Phy Binding ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add On PropertyChanged Callback ( object Ġ: ĠObservable . On PropertyChanged Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon PropertyChanged ( sender : ĠObservable ?, Ġproperty Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( tx Phy Binding . get () Ġ!= Ġnull Ġ&& Ġrx Phy Binding . get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Phy ValueChanged ( tx Phy Binding . get () !! , Ġrx Phy Binding . get () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġopen Ġfun Ġon Phy ValueChanged ( tx Phy : ĠInt , Ġrx Phy : ĠInt ) Ġ= ĠBlue berry Logger . d (" Phy ĠValue ĠChanged . Ġtx Phy Ġ: Ġ$ tx Phy , Ġrx Phy Ġ: Ġ$ rx Phy Ġat Ġ${ m Bluetooth Device . address }") ĊĠĠĠ Ġprivate Ġdata Ġclass ĠP hy Request Info ( ĊĠĠĠĠĠĠĠ Ġval Ġuse Read Operation Only Ġ: ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġtx Phy Ġ: ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġrx Phy Ġ: ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġphy Option Ġ: ĠP hy Option ? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġm Phy Request Info Queue Ġ: ĠQueue < Phy Request Info > Ġ= ĠLinkedList () ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprotected Ġfun Ġread Phy () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Phy Request Info Queue . offer ( Phy Request Info ()) ĊĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprotected Ġfun Ġset Preferred Phy ( tx Phy : ĠInt , Ġrx Phy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Phy Request Info Queue . offer ( Phy Request Info ( false , Ġtx Phy , Ġrx Phy )) ĊĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠR ssi ĠValue ĠChange ĠDelegate Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetDefault R ssi Value Change Delegate () Ġ{ ĊĠĠĠĠĠĠĠ Ġr ssi Binding . add On PropertyChanged Callback ( object Ġ: ĠObservable . On PropertyChanged Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon PropertyChanged ( sender : ĠObservable ?, Ġproperty Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ssi Binding . get ()?. let Ġ{ Ġon R ssi ValueChanged ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġopen Ġfun Ġon R ssi ValueChanged ( rssi Value Ġ: ĠInt ) Ġ= ĠBlue berry Logger . d (" R ssi ĠValue ĠChanged Ġto Ġ$ rssi Value Ġat Ġ${ m Bluetooth Device . address }") ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm R ssi Update Interval Disposable : ĠDis posable ĊĠĠĠ Ġfun Ġset R ssi Update Interval ( interval Time Ġ: ĠLong , Ġinterval TimeUnit : ĠTimeUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( bluetooth State . get () Ġ== ĠBluetooth State . STATE _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss R ssi Update Interval () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Interval Time Ġ= Ġinterval Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Interval TimeUnit Ġ= Ġinterval TimeUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( interval TimeUnit . to Seconds ( interval Time ) Ġ< Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Interval Time Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Interval TimeUnit Ġ= ĠTimeUnit . SECONDS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm R ssi Update Interval Disposable Ġ= Ġio . reactivex . Observable . interval ( 0 , Ġs Interval Time , Ġs Interval TimeUnit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġif ( bluetooth State . get () Ġ== ĠBluetooth State . STATE _ CONNECTED ) Ġm Bluetooth Gatt . read Remote R ssi () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġdismiss R ssi Update Interval () Ġ{ Ġif (:: m R ssi Update Interval Disposable . isInitialized Ġ&& Ġ! m R ssi Update Interval Disposable . is Disposed ) Ġm R ssi Update Interval Disposable . dispose () Ġ} ĊĊĠĠĠ Ġ/** ĠM tu ĠValue ĠChange ĠDelegate Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetDefault M tu Value Change Delegate () Ġ{ ĊĠĠĠĠĠĠĠ Ġmt u Binding . add On PropertyChanged Callback ( object Ġ: ĠObservable . On PropertyChanged Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon PropertyChanged ( sender : ĠObservable ?, Ġproperty Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Binding . get ()?. let Ġ{ Ġon M tu ValueChanged ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġopen Ġfun Ġon M tu ValueChanged ( mt u Ġ: ĠInt ) Ġ= ĠBlue berry Logger . d (" M tu ĠValue ĠChanged Ġto Ġ$ mt u Ġat Ġ${ m Bluetooth Device . address }") ĊĠĠĠ Ġprivate Ġdata Ġclass ĠM tu Request Info ( val Ġmt u Ġ: ĠInt ) ĊĠĠĠ Ġprivate Ġval Ġm M tu Request Info Queue Ġ: ĠQueue < M tu Request Info > Ġ= ĠLinkedList () ĊĠĠĠ Ġ/* protected */ Ġprivate Ġfun Ġrequest M tu ( mt u Ġ: ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm M tu Request Info Queue . offer ( M tu Request Info ( mt u )) ĊĠĠĠĠĠĠĠ Ġexecute Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠChange ĠConnection ĠPriority Ġ*/ ĊĠĠĠ Ġfun Ġset Connection Priority ( connection Priority : ĠBlue berry Connection Priority ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . request Connection Priority ( connection Priority . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠBasic ĠConnection ĠCont rolling ĠOperation Ġ*/ ĊĠĠĠ Ġfun Ġconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( bluetooth State . get () Ġ== ĠBluetooth State . STATE _ DIS CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth State . set ( Bluetooth State . STATE _ CONNECT ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt Ġ= Ġm Bluetooth Device . connect Gatt ( mContext , Ġauto Connect , Ġm Bluetooth Gatt Callback , ĠBluetooth Device . TRANSPORT _ LE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( bluetooth State . get () Ġ== ĠBluetooth State . STATE _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth State . set ( Bluetooth State . STATE _ DIS CONNECT ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt . disconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠOverride ĠFunctions Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġwhen ( other ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġis ĠBlue berry Device < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( other Ġas ĠBlue berry Device < Blue berry Service >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. m Bluetooth Device . address Ġ== Ġthis . m Bluetooth Device . address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( exception Ġ: ĠClass CastException ) Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ( 3 1 Ġ+ Ġblue berry Service . hashCode ()) Ġ* Ġ 3 1 Ġ+ Ġm Bluetooth Device . hashCode () ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . toString () ĊĠĠĠ Ġ} Ċ }