package Ġcom . ju ul . sens ort ag Ċ Ċ import Ġcom . ju ul . k able . Options Ċ import Ġcom . ju ul . k able . Options . Filter . Name Prefix Ċ import Ġcom . ju ul . k able . State . Disconnected Ċ import Ġcom . ju ul . k able . request Per ipheral Ċ import Ġcom . ju ul . tu ul box . logging . Console Logger Ċ import Ġcom . ju ul . tu ul box . logging . Constant Tag Generator Ċ import Ġcom . ju ul . tu ul box . logging . Log Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . await Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . launch Ċ Ċ type alias ĠMessage Listener Ġ= Ġ( message : ĠString ) Ġ-> ĠUnit Ċ type alias ĠMovement Listener Ġ= Ġ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ) Ġ-> ĠUnit Ċ Ċ private Ġfun Ġcanonical Uuid ( uuid : ĠString ): ĠString Ġ= Ġwhen Ġ( uuid . length ) Ġ{ ĊĠĠĠĠ 4 Ġ-> Ġ" 0 0 0 0 $ uuid - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb " ĊĠĠĠ Ġelse Ġ-> Ġerror (" Canonical ĠUUID Ġlength Ġmust Ġbe Ġ 4 , Ġwas Ġ${ uuid . length }") Ċ } Ċ Ċ private Ġconst Ġval Ġmovement Sensor Service Uuid Ġ= Ġ" f 0 0 0 aa 8 0 - 0 4 5 1 - 4 0 0 0 - b 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 " Ċ private Ġconst Ġval Ġmovement Sensor Data Uuid Ġ= Ġ" f 0 0 0 aa 8 1 - 0 4 5 1 - 4 0 0 0 - b 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 " Ċ private Ġconst Ġval Ġmovement Notification Uuid Ġ= Ġ" f 0 0 0 2 9 0 2 - 0 4 5 1 - 4 0 0 0 - b 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 " Ċ private Ġconst Ġval Ġmovement Configuration Uuid Ġ= Ġ" f 0 0 0 aa 8 2 - 0 4 5 1 - 4 0 0 0 - b 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 " Ċ private Ġconst Ġval Ġmovement Period Uuid Ġ= Ġ" f 0 0 0 aa 8 3 - 0 4 5 1 - 4 0 0 0 - b 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 " Ċ private Ġval Ġclient Characteristic Config Uuid Ġ= Ġcanonical Uuid (" 2 9 0 2 ") Ċ Ċ class ĠScript Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . tag Generator Ġ= ĠConstant Tag Generator ( tag Ġ= Ġ" Sensor Tag ") ĊĠĠĠĠĠĠĠ ĠLog . dispatcher . install ( Console Logger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( Job ()) ĊĊĠĠĠ Ġprivate Ġval Ġoptions Ġ= ĠOptions ( ĊĠĠĠĠĠĠĠ Ġoptional Services Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovement Sensor Service Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovement Sensor Data Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovement Notification Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovement Configuration Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovement Period Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Characteristic Config Uuid , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġfilters Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠName Prefix (" Sensor Tag "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠName Prefix (" CC 2 6 5 0 ĠSensor Tag "), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġstatus Listeners Ġ= Ġmutable ListOf < Message Listener >() ĊĊĠĠĠ Ġ@ Js Name (" add Status Listener ") ĊĠĠĠ Ġfun Ġadd Status Listener ( listener : ĠMessage Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Listeners Ġ+= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Js Name (" remove Status Listener ") ĊĠĠĠ Ġfun Ġremove Status Listener ( listener : ĠMessage Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Listeners Ġ-= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Status ( status : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . verbose Ġ{ Ġstatus Ġ} ĊĠĠĠĠĠĠĠ Ġstatus Listeners . forEach Ġ{ Ġit . invoke ( status ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmovement Listeners Ġ= Ġmutable ListOf < Movement Listener >() ĊĊĠĠĠ Ġ@ Js Name (" add Movement Listener ") ĊĠĠĠ Ġfun Ġadd Movement Listener ( listener : ĠMovement Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmovement Listeners Ġ+= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Js Name (" remove Movement Listener ") ĊĠĠĠ Ġfun Ġremove Movement Listener ( listener : ĠMovement Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmovement Listeners Ġ-= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Movement ( movement : ĠVector 3 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy , Ġz ) Ġ= Ġmovement ĊĠĠĠĠĠĠĠ Ġmovement Listeners . forEach Ġ{ Ġit . invoke ( x , Ġy , Ġz ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġconnection : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Js Name (" connect ") ĊĠĠĠ Ġfun Ġconnect (): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġdisconnect () Ġ// ĠClean Ġup Ġprevious Ġconnection , Ġif Ġany . ĊĊĠĠĠĠĠĠĠ Ġconnection Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor Tag Ġ= ĠSensor Tag ( request Per ipheral ( options ). await ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Tag . est ablish Connection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Auto Re connect ( sensor Tag ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Tag . gyro . collect (:: emit Movement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Tag . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke On Completion Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . info Ġ{ Ġ" invoke On Completion Ġ$ cause " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit Status (" Disconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Js Name (" disconnect ") ĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection ?. cancel () ĊĠĠĠĠĠĠĠ Ġconnection Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠSensor Tag . est ablish Connection (): ĠUnit Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġemit Status (" Connecting ") ĊĠĠĠĠĠĠĠ Ġconnect () ĊĠĠĠĠĠĠĠ Ġenable G yro () ĊĠĠĠĠĠĠĠ Ġemit Status (" Connected ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCor outine Scope . enable Auto Re connect ( ĊĠĠĠĠĠĠĠ Ġsensor Tag : ĠSensor Tag ĊĠĠĠ Ġ) Ġ= Ġsensor Tag . state . on Each Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠ ĠLog . info Ġ{ Ġ" State : Ġ${ state :: class . simple Name }" Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠDis connected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . info Ġ{ Ġ" Waiting Ġ 5 Ġseconds Ġto Ġreconnect ..." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 _ 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Tag . est ablish Connection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. launch In ( this ) Ċ } ĊĊ