/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 , ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġme . cyber . n uk le os . thing Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Gatt Ċ import Ġandroid . bluetooth . Bluetooth GattCharacteristic Ċ import Ġandroid . bluetooth . Bluetooth Gatt Descriptor Ċ import Ġandroid . bluetooth . Bluetooth Gatt Server Ċ import Ġandroid . bluetooth . Bluetooth Gatt Server Callback Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . bluetooth . Bluetooth Profile Ċ import Ġandroid . bluetooth . le . Ad vertise Callback Ċ import Ġandroid . bluetooth . le . Ad vertise Data Ċ import Ġandroid . bluetooth . le . Ad vertise Settings Ċ import Ġandroid . bluetooth . le . Bluetooth Le Ad vert iser Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcel Uuid Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . TextView Ċ import Ġme . cyber . n uk le os . IM ot ors Ċ import Ġme . cyber . n uk le os . IM ot ors . Companion . read Ser vo Command Ċ import Ġme . cyber . n uk le os . parse Motor Message Ċ Ċ import Ġjava . util . Arrays Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Gatt Server Activity " Ċ Ċ class ĠG att Server Activity Ġ: ĠIM ot ors Ġby ĠMotor Controller (), ĠActivity () Ġ{ ĊĊĠĠĠ Ġ/* ĠLocal ĠUI Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠtextView : ĠTextView ĊĠĠĠ Ġ/* ĠBluetooth ĠAPI Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbluetooth Manager : ĠBluetooth Manager ĊĠĠĠ Ġprivate Ġvar Ġbluetooth Gatt Server : ĠBluetooth Gatt Server ? Ġ= Ġnull ĊĠĠĠ Ġ/* ĠCollection Ġof Ġnotification Ġsubscribers Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmotor Speed s Sub scribers Ġ= Ġmutable Set Of < Bluetooth Device >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList ens Ġfor ĠBluetooth Ġadapter Ġevents Ġto Ġenable / disable ĊĠĠĠĠ Ġ* Ġadvertising Ġand Ġserver Ġfunctionality . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġbluetooth Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġintent . getInt Extra ( Bluetooth Adapter . EXTRA _ STATE , ĠBluetooth Adapter . STATE _ OFF ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . STATE _ ON Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ad vertising () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Server () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . STATE _ OFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Server () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ad vertising () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback Ġto Ġreceive Ġinformation Ġabout Ġthe Ġad vertisement Ġprocess . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġad vertise Callback Ġ= Ġobject Ġ: ĠAd vertise Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Success ( settings In Effect : ĠAd vertise Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" LE ĠAd vertise ĠStarted .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Failure ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" LE ĠAd vertise ĠFailed : Ġ$ errorCode ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback Ġto Ġhandle Ġincoming Ġrequests Ġto Ġthe ĠG ATT Ġserver . ĊĠĠĠĠ Ġ* ĠAll Ġread / write Ġrequests Ġfor Ġcharacteristics Ġand Ġdescriptors Ġare Ġhandled Ġhere . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġg att Server Callback Ġ= Ġobject Ġ: ĠBluetooth Gatt Server Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection StateChange ( device : ĠBluetooth Device , Ġstatus : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠBluetooth Profile . STATE _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Bluetooth Device ĠCONNECT ED : Ġ$ device ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( newState Ġ== ĠBluetooth Profile . STATE _ DIS CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Bluetooth Device ĠDIS CONNECTED : Ġ$ device ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Remove Ġdevice Ġfrom Ġany Ġactive Ġsubscriptions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmotor Speed s Sub scribers . remove ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġfix Ġ" ad vertising Ġdis appe ars Ġafter Ġclient Ġdisconnect s " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Mot ors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ad vertising () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ad vertising () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Read Request ( device : ĠBluetooth Device , ĠrequestId : ĠInt , Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIM ot ors . CHAR _ MOTOR _ STATE _ UUID Ġ== Ġcharacteristic . uuid Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Read Ġmot ors Ġstate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. send Response ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ SUCCESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Speed s ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInvalid Ġcharacteristic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Invalid ĠCharacter istic ĠRead : Ġ" Ġ+ Ġcharacteristic . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. send Response ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ FAILURE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Write Request ( device : ĠBluetooth Device , ĠrequestId : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Write : ĠBoolean , Ġresponse Needed : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠInt , Ġvalue : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IM ot ors . CHAR _ MOTOR _ CONTROL _ UUID Ġ== Ġcharacteristic . uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Motor Ġchar ater istic Ġwrite ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspin Mot ors ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( IM ot ors . CHAR _ SER VO _ CONTROL _ UUID Ġ== Ġcharacteristic . uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠString ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ser vo Ġchar ater istic Ġwrite Ġ: Ġ$ command ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservo Command Ġ= Ġread Ser vo Command ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ser vo Angle ( servo Command . first , Ġservo Command . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( IM ot ors . CHAR _ MOTOR _ MESSAGE _ CONTROL _ UUID Ġ== Ġcharacteristic . uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmotor Message Ġ= ĠString ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Motor Message Ġwrite Ġ: Ġ$ motor Message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Motor Message Ġ= Ġparse Motor Message ( motor Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Executing Ġmotor Ġmessage Ġ: Ġ${ parsed Motor Message . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Motor Message ( parsed Motor Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. send Response ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ SUCCESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IM ot ors . CHAR _ MOTOR _ CONTROL _ UUID Ġ== Ġcharacteristic . uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Motor Speed Sub scribers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Read Request ( device : ĠBluetooth Device , ĠrequestId : ĠInt , Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠBluetooth Gatt Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IM ot ors . MOTOR _ STATE _ DESCRIPTOR Ġ== Ġdescriptor . uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Config Ġdescriptor Ġread ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnValue Ġ= Ġif Ġ( motor Speed s Sub scribers . contains ( device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Descriptor . DISABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. send Response ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ SUCCESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Unknown Ġdescriptor Ġread Ġrequest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. send Response ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ FAILURE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Write Request ( device : ĠBluetooth Device , ĠrequestId : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠBluetooth Gatt Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Write : ĠBoolean , Ġresponse Needed : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠInt , Ġvalue : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IM ot ors . MOTOR _ STATE _ DESCRIPTOR Ġ== Ġdescriptor . uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Arrays . equals ( Bluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE , Ġvalue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Subscribe Ġdevice Ġto Ġnotifications : Ġ$ device ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmotor Speed s Sub scribers . add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Arrays . equals ( Bluetooth Gatt Descriptor . DISABLE _ NOTIFICATION _ VALUE , Ġvalue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Un subscribe Ġdevice Ġfrom Ġnotifications : Ġ$ device ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmotor Speed s Sub scribers . remove ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. send Response ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ SUCCESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Unknown Ġdescriptor Ġwrite Ġrequest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. send Response ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ FAILURE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ server ) ĊĊĠĠĠĠĠĠĠ ĠtextView Ġ= ĠfindViewById ( R . id . text ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDevices Ġwith Ġa Ġdisplay Ġshould Ġnot Ġgo Ġto Ġsleep ĊĠĠĠĠĠĠĠ Ġwindow . add Flags ( WindowManager . LayoutParams . FLAG _ KEEP _ SCREEN _ ON ) ĊĊĠĠĠĠĠĠĠ Ġbluetooth Manager Ġ= Ġget System Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Adapter Ġ= Ġbluetooth Manager . adapter ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan 't Ġcontinue Ġwithout Ġproper ĠBluetooth Ġsupport ĊĠĠĠĠĠĠĠ Ġif Ġ(! check Bluetooth Support ( bluetooth Adapter )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġfor Ġsystem ĠBluetooth Ġevents ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter ( Bluetooth Adapter . ACTION _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( bluetooth Receiver , Ġfilter ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Bluetooth Ġis Ġcurrently Ġdisabled ... en abling ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter . enable () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Bluetooth Ġenabled ... starting Ġservices ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ad vertising () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Server () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Adapter Ġ= Ġbluetooth Manager . adapter ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Server () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ad vertising () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġunregister Receiver ( bluetooth Receiver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVerify Ġthe Ġlevel Ġof ĠBluetooth Ġsupport Ġprovided Ġby Ġthe Ġhardware . ĊĠĠĠĠ Ġ* Ġ@ param Ġbluetooth Adapter ĠSystem Ġ[ Bluetooth Adapter ]. ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif ĠBluetooth Ġis Ġproperly Ġsupported , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Bluetooth Support ( bluetooth Adapter : ĠBluetooth Adapter ?): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Bluetooth Ġis Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! package Manager . has System Feature ( PackageManager . FEATURE _ BL U ETO OTH _ LE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Bluetooth ĠLE Ġis Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBegin Ġadvertising Ġover ĠBluetooth Ġthat Ġthis Ġdevice Ġis Ġconnect able ĊĠĠĠĠ Ġ* Ġand Ġsupports Ġthe ĠMot ors ĠService . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Ad vertising () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Le Ad vert iser : ĠBluetooth Le Ad vert iser ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Manager . adapter . bluetooth Le Ad vert iser ĊĊĠĠĠĠĠĠĠ Ġbluetooth Le Ad vert iser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠAd vertise Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Ad vertise Mode ( Ad vertise Settings . AD VER TI SE _ MODE _ BAL ANCED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Connect able ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTimeout ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Tx Power Level ( Ad vertise Settings . AD VER TI SE _ TX _ POWER _ MEDIUM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠAd vertise Data . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Include Device Name ( false )// some Ġdevice Ġnames Ġare Ġtoo Ġlong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Include Tx Power Level ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Service Uuid ( Parcel Uuid ( IM ot ors . SERVICE _ UUID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . start Ad vertising ( settings , Ġdata , Ġad vertise Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠLog . w ( TAG , Ġ" Failed Ġto Ġcreate Ġadvert iser ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop ĠBluetooth Ġad vertise ments . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Ad vertising () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Le Ad vert iser : ĠBluetooth Le Ad vert iser ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Manager . adapter . bluetooth Le Ad vert iser ĊĠĠĠĠĠĠĠ Ġbluetooth Le Ad vert iser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Ad vertising ( ad vertise Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠLog . w ( TAG , Ġ" Failed Ġto Ġcreate Ġadvert iser ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġthe ĠG ATT Ġserver Ġinstance Ġwith Ġthe Ġservices / character istics ĊĠĠĠĠ Ġ* Ġfrom Ġthe ĠMot ors ĠProfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġbluetooth Gatt Server Ġ= Ġbluetooth Manager . open Gatt Server ( this , Ġg att Server Callback ) ĊĊĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. add Service ( Mot ors Profile . create Mot ors Service ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠLog . w ( TAG , Ġ" Unable Ġto Ġcreate ĠG ATT Ġserver ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSh ut Ġdown Ġthe ĠG ATT Ġserver . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġa Ġmotor Ġservice Ġnotification Ġto Ġany Ġdevices Ġthat Ġare Ġsubscribed ĊĠĠĠĠ Ġ* Ġto Ġthe Ġcharacteristic . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġnotify Motor Speed Sub scribers () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( motor Speed s Sub scribers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" No Ġsubscribers Ġregistered ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Sending Ġupdate Ġto Ġ${ motor Speed s Sub scribers . size } Ġsubscribers ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin Ġmotor Speed s Sub scribers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmot ors State Characteristic Ġ= Ġbluetooth Gatt Server ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getService ( IM ot ors . SERVICE _ UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get Characteristic ( IM ot ors . CHAR _ MOTOR _ STATE _ UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmot ors State Characteristic ?. value Ġ= Ġget Speed s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt Server ?. notify Characteristic Changed ( device , Ġmot ors State Characteristic , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ