/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠInt rep id ĠP urs uits , ĠLLC Ċ Ġ*/ Ċ package Ġio . int rep id . ble idi om Ċ Ċ import Ġrx . Observable Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect .* Ċ import Ġkotlin . reflect . full . primary Constructor Ċ Ċ /** Ċ Ġ* ĠThis Ġ' keyword ' Ġwill Ġstart Ġany Ġ[ B le Service ] Ġconfiguration . Ċ Ġ* Ċ Ġ* ĠSee Ġalso Ġ[ B le Id iom DSL ] Ġand Ġits Ġrelated Ġinterfaces . Ċ Ġ* Ġ@ sample Ġ[ io . int rep id . ble idi om . app . define B le Services ] Ċ Ġ*/ Ċ @ Suppress (" ClassName ") Ċ object Ġconfigure B le Service Ġ: ĠB le Id iom DSL Ġ{ ĊĠĠĠ Ġprivate Ġval Ġregistration Ġ= ĠB le Service DS LI mpl . Registration ĊĊĠĠĠ Ġin fix ĊĠĠĠ Ġoverride Ġfun Ġ< Svc Ġ: ĠB le Service < Svc >> Ġfor Class ( ble Service Class : ĠK Class < Svc >) Ġ= ĠWith Configuration < Svc >( ble Service Class ) ĊĊĠĠĠ Ġclass ĠWith Configuration < Svc >( private Ġval Ġble Service Class : ĠK Class < out ĠB le Service <* >>) Ġ: ĠB le Id iom DSL . For Class With < Svc > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġin fix ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwith ( dsl : ĠB le Service DSL < Svc >. () Ġ-> ĠUnit ) Ġ= Ġregistration . register DSL ( ble Service Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB le Service DS LI mpl ( create Prototype ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd sl () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Prototype () Ġ= Ġble Service Class . primary Constructor ?. call () Ġas ĠS vc ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠB le Service DS LI mpl < Svc >( internal Ġval Ġsvc Prototype : ĠS vc ) Ġ: ĠB le Service DSL < Svc > Ġ{ ĊĠĠĠ Ġinternal Ġobject ĠRegistration Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġregistered DSL s : ĠMutable Map < Int , ĠB le Service DS LI mpl <* >> Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġregistered Services : ĠMutable Map < String , ĠK Class < out ĠB le Service <* >>> Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġregister DSL ( ble Service Class : ĠK Class < out ĠB le Service <* >>, Ġcreate Service DSL : Ġ() Ġ-> ĠB le Service DS LI mpl <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġble Service Class . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ! in Ġregistered DSL s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice DSL Ġ= Ġcreate Service DSL () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered DSL s [ key ] Ġ= Ġservice DSL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Services [ service DSL . uuid ] Ġ= Ġble Service Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Service DSL ( ble Service : ĠB le Service <* >) Ġ= Ġregistered DSL s [ ble Service :: class . hashCode ()] ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġhas Service ( service UUID : ĠString ) Ġ= Ġservice UUID Ġin Ġregistered Services ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate Service ( service UUID : ĠString ) Ġ= Ġregistered Services [ service UUID ]?. primary Constructor ?. call () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit ĊĠĠĠ Ġoverride Ġvar Ġuuid : ĠString ĊĊĠĠĠ Ġoverride Ġfun Ġread ( dsl : ĠB le Service Read DSL < Svc >. () Ġ-> ĠUnit ) Ġ= Ġread DSL . dsl () ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( dsl : ĠB le Service Write DSL < Svc >. () Ġ-> ĠUnit ) Ġ= Ġwrite DSL . dsl () ĊĊĠĠĠ Ġinternal Ġval Ġread Character istics Map : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () ĊĠĠĠ Ġinternal Ġval Ġwrite Character istics Map : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġval Ġread DSL Ġ= Ġobject Ġ: ĠB le Service Read DSL < Svc > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdata : ĠRead able Char DSL < Svc > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġobject Ġ: ĠRead able Char DSL < Svc > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom ( uuid : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRead able Char Builder (` this `). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinto ( property : ĠK Property 1 < Svc , ĠB le Char Value <* >>) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRead able Char Builder (` this `). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( property ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinto ( property Get : ĠS vc . () Ġ-> ĠK Property 0 < B le Char Value <* >>) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRead able Char Builder (` this `). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( property Get ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġwrite DSL Ġ= Ġobject Ġ: ĠB le Service Write DSL < Svc > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdata : ĠWrit able Char DSL < Svc > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġobject Ġ: ĠWrit able Char DSL < Svc > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom ( property : ĠK Mutable Property 1 < Svc , Ġout ĠB le Char Value <* >>) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrit able Char Builder (` this `). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( property ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom ( property Get : ĠS vc . () Ġ-> ĠK Mutable Property 0 < out ĠB le Char Value <* >>) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrit able Char Builder (` this `). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( property Get ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinto ( uuid : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrit able Char Builder (` this `). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ` this ` Ġ= Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġa Ġproperty - delegate Ġthat Ġhandles Ġthe ĠBLE Ġinput / output Ġfrom Ġand Ġto Ġproperty 's ĠBLE - character istic Ċ Ġ*/ Ċ internal Ġclass ĠB le Char Value Delegate < Val Ġ: ĠAny >() Ġ: ĠB le Char Handler DSL < Val > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbacking Field Ġ= ĠB le Char Value < Val >() ĊĊĠĠĠ Ġoverride Ġvar Ġfor Class : ĠK Class < out ĠVal > ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ByteArray Ġ= Ġfrom ByteArray Transformer ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto ByteArray Ġ= Ġto ByteArray Transformer ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow ĠIllegal Access Error (" for Class - getter Ġmust Ġnot Ġbe Ġcalled ") ĊĊĠĠĠ Ġoverride Ġvar Ġfrom ByteArray : Ġ(( ByteArray ) Ġ-> ĠVal )? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġvar Ġto ByteArray : Ġ(( Val ) Ġ-> ĠByteArray )? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġconstructor ( dsl : ĠB le Char Handler DSL < Val >. () Ġ-> ĠUnit ) Ġ: Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġd sl () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator ĊĠĠĠ Ġoverride Ġfun ĠgetValue ( service : ĠB le Service <* >, Ġprop : ĠK Property < *> ): ĠB le Char Value < Val > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchar UUID Ġ= Ġservice . dsl . read Character istics Map [ prop . name ] ĊĠĠĠĠĠĠĠ Ġval Ġtransform From Ġ= Ġfrom ByteArray ĊĊĠĠĠĠĠĠĠ Ġbacking Field . read Action Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char UUID Ġ!= Ġnull Ġ&& Ġtransform From Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . connection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . read Characteristic ( UUID . fromString ( char UUID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠbyteArray Ġ-> Ġtransform From ( byteArray ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take ( 1 ) Ġ?: ĠObservable . empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠObservable . empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbacking Field ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator ĊĠĠĠ Ġoverride Ġfun ĠsetValue ( service : ĠB le Service <* >, Ġprop : ĠK Property <* >, Ġvalue : ĠB le Char Value < Val >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchar UUID Ġ= Ġservice . dsl . write Character istics Map [ prop . name ] ĊĠĠĠĠĠĠĠ Ġval Ġtransform To Ġ= Ġto ByteArray ĊĠĠĠĠĠĠĠ Ġval Ġtransform From Ġ= Ġfrom ByteArray ĊĠĠĠĠĠĠĠ Ġval Ġprop Value Ġ= Ġvalue . value ĊĊĠĠĠĠĠĠĠ Ġbacking Field . write Action Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char UUID Ġ!= Ġnull Ġ&& Ġtransform To Ġ!= Ġnull Ġ&& Ġtransform From Ġ!= Ġnull Ġ&& Ġprop Value Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . connection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . write Characteristic ( UUID . fromString ( char UUID ), Ġtransform To ( prop Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠbyteArray Ġ-> Ġtransform From ( byteArray ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take ( 1 ) Ġ?: ĠObservable . empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠObservable . empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠBuilds Ġa ĠBLE - character istic , Ġt ies Ġa ĠB le Char Value Ġproperty Ġto Ġa Ġcharacteristic - UUID . Ċ Ġ*/ Ċ private Ġabstract Ġclass ĠChar Builder < Svc >( protected Ġval Ġservice DSL : ĠB le Service DS LI mpl < Svc >) Ġ{ ĊĠĠĠ Ġprotected Ġval Ġsvc Prototype : ĠS vc Ġ= Ġservice DSL . svc Prototype ĊĠĠĠ Ġprotected Ġvar Ġprop Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġvar Ġchar UUID : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġfun Ġbuild If Ready ( map : ĠMutable Map < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġprop Name ĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġchar UUID ĊĠĠĠĠĠĠĠ Ġif Ġ( propertyName Ġ== Ġnull Ġ|| Ġuuid Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// ĠNot Ġall Ġdata Ġis Ġknown ; Ġnot Ġyet Ġready Ġto Ġbuild Ġit . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġit Ġby Ġregistering Ġit . ĊĠĠĠĠĠĠĠ Ġmap [ propertyName ] Ġ= Ġuuid ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠBuilds Ġa Ġreadable ĠBLE - character istic , Ġt ies Ġa ĠB le Char Value Ġproperty Ġto Ġa Ġ' read ' Ġcharacteristic - UUID . Ċ Ġ*/ Ċ private Ġclass ĠRead able Char Builder < Svc >( service : ĠB le Service DS LI mpl < Svc >) Ġ: ĠChar Builder < Svc >( service ), ĠRead able Char DSL < Svc > Ġ{ ĊĠĠĠ Ġin fix ĊĠĠĠ Ġoverride Ġfun Ġfrom ( uuid : ĠString ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġchar UUID Ġ= Ġfix Char UUID ( uuid ) ĊĠĠĠĠĠĠĠ Ġbuild If Ready ( service DSL . read Character istics Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix ĊĠĠĠ Ġoverride Ġfun Ġinto ( property : ĠK Property 1 < Svc , ĠB le Char Value <* >>) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġprop Name Ġ= Ġproperty . name ĊĠĠĠĠĠĠĠ Ġbuild If Ready ( service DSL . read Character istics Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix ĊĠĠĠ Ġoverride Ġfun Ġinto ( property Get : ĠS vc . () Ġ-> ĠK Property 0 < B le Char Value <* >>) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġprop Name Ġ= Ġsvc Prototype . property Get (). name ĊĠĠĠĠĠĠĠ Ġbuild If Ready ( service DSL . read Character istics Map ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠBuilds Ġa Ġwritable ĠBLE - character istic , Ġt ies Ġa Ġmutable ĠB le Char Value Ġproperty Ġto Ġa Ġ' write ' Ġcharacteristic - UUID . Ċ Ġ*/ Ċ private Ġclass ĠWrit able Char Builder < Svc >( service : ĠB le Service DS LI mpl < Svc >) Ġ: ĠChar Builder < Svc >( service ), ĠWrit able Char DSL < Svc > Ġ{ ĊĠĠĠ Ġin fix ĊĠĠĠ Ġoverride Ġfun Ġfrom ( property : ĠK Mutable Property 1 < Svc , Ġout ĠB le Char Value <* >>) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġprop Name Ġ= Ġproperty . name ĊĠĠĠĠĠĠĠ Ġbuild If Ready ( service DSL . write Character istics Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix ĊĠĠĠ Ġoverride Ġfun Ġfrom ( property Get : ĠS vc . () Ġ-> ĠK Mutable Property 0 < out ĠB le Char Value <* >>) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġprop Name Ġ= Ġsvc Prototype . property Get (). name ĊĠĠĠĠĠĠĠ Ġbuild If Ready ( service DSL . write Character istics Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix ĊĠĠĠ Ġoverride Ġfun Ġinto ( uuid : ĠString ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġchar UUID Ġ= Ġfix Char UUID ( uuid ) ĊĠĠĠĠĠĠĠ Ġbuild If Ready ( service DSL . write Character istics Map ) ĊĠĠĠ Ġ} Ċ } Ċ