package Ġcom . i _ syst . b ly st scale Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth .* Ċ import Ġandroid . bluetooth . le . Bluetooth Le Scanner Ċ import Ġandroid . bluetooth . le . Scan Callback Ċ import Ġandroid . bluetooth . le . Scan Result Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . util .* Ċ import Ġkotlin . math . absolute Value Ċ Ċ class ĠMainActivity Ġ: ĠActivity () Ġ{ ĊĠĠĠ Ġval ĠBLE ADV _ M AND ATA _ TYPE _ ADC : ĠByte Ġ= Ġ 7 ĊĠĠĠ Ġval ĠBLE ADV _ M AND ATA _ SN Ġ= Ġ 0 xFF . to Byte () ĊĠĠĠ Ġval ĠA VER AGE _ COUNT Ġ= Ġ 2 0 ĊĊĠĠĠ Ġvar Ġm Bluetooth Adapter : ĠBluetooth Adapter ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġm LE Scanner : ĠBluetooth Le Scanner ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Ad c Label : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Weight Label Ġ: ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Zero Label Ġ: ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Scale Label Ġ: ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Message Label Ġ: ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġzero Weight Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Zero But Ġ: ĠButton ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġm Av r Start Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġm Zero Val Ġ: ĠFloat Ġ= Ġ 0 . 0 F ĊĠĠĠ Ġvar Ġm Av r Cnt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Cal But Ġ: ĠButton ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġm Cal State Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġm Av r Val Ġ= Ġ 0 F ĊĠĠĠ Ġvar Ġm Scale Factor Ġ= Ġ 2 0 F ĊĠĠĠ Ġvar Ġm Weight Ġ= Ġ 0 F ĊĊĠĠĠ Ġ// private Ġvar Ġm Adapter : Ġcom . i _ syst . b ly st scale . MainActivity . Device ListAdapter ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm Gatt Callback : ĠBluetooth Gatt Callback Ġ= Ġobject Ġ: ĠBluetooth Gatt Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection StateChange ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt , Ġstatus : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewState : ĠInt ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġintent Action : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠBluetooth Profile . STATE _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att . discover Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( newState Ġ== ĠBluetooth Profile . STATE _ DIS CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġrequest Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget System Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĊĠĠĠĠĠĠĠ Ġ// m Temp Label Ġ= ĠfindViewById < View >( R . id . temp Label ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġm Message Label Ġ= ĠfindViewById < View >( R . id . message Label ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġm Zero Label Ġ= ĠfindViewById < View >( R . id . zero Label ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġm Scale Label Ġ= ĠfindViewById < View >( R . id . scale Label ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġm Ad c Label Ġ= ĠfindViewById < View >( R . id . adc Label ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġm Weight Label Ġ= ĠfindViewById < View >( R . id . weight Label ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġm Bluetooth Adapter Ġ= Ġbluetooth Manager . adapter ĊĠĠĠĠĠĠĠ Ġm LE Scanner Ġ= Ġm Bluetooth Adapter ?. get Bluetooth Le Scanner () ĊĠĠĠĠĠĠĠ Ġm LE Scanner ?. start Scan ( m Scan Callback ) ĊĠĠĠĠĠĠĠ Ġm Zero But Ġ= ĠfindViewById < android . view . View ? >( R . id . button Zero ) Ġas Ġandroid . widget . Button ? ĊĠĠĠĠĠĠĠ Ġm Zero But ?. setOnClickListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ) Ġ{ Ġ// ĠCode Ġhere Ġexecutes Ġon Ġmain Ġthread Ġafter Ġuser Ġp resses Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Cnt Ġ= ĠA VER AGE _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Val Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Start Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Cal State Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġm Cal But Ġ= ĠfindViewById < android . view . View ? >( R . id . button Cal ) Ġas Ġandroid . widget . Button ? ĊĠĠĠĠĠĠĠ Ġm Cal But ?. setOnClickListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ) Ġ{ Ġ// ĠCode Ġhere Ġexecutes Ġon Ġmain Ġthread Ġafter Ġuser Ġp resses Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Cnt Ġ= ĠA VER AGE _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Val Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Start Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Cal State Ġ!= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Message Label ?. setText ( String . format (" Wait ! ĠCal ibr ating ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Cal State Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Scan Callback : ĠScan Callback Ġ= Ġobject Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Type : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult : ĠScan Result ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" callback Type ", Ġcallback Type . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" result ", Ġresult . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġresult . device ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscan Record Ġ= Ġresult . scan Record ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscan Data Ġ= Ġscan Record !!. bytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġscan Record . device Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice ID : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġman uf Ġ= Ġscan Record . get Manufacturer Specific Data ( 0 x 0 1 7 7 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( man uf Ġ== Ġnull )// Ġ|| Ġman uf . size Ġ< Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( man uf [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBLE ADV _ M AND ATA _ TYPE _ ADC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠByteBuffer . wrap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġman uf , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). order ( Byte Order . LIT TLE _ ENDIAN ). float ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġw Ġ= Ġ( v Ġ- Ġm Zero Val ) Ġ* Ġm Scale Factor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( m Weight Ġ- Ġw ). absolute Value Ġ> Ġ 2 0 F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Weight Ġ= Ġw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Weight Ġ= Ġ( m Weight Ġ+ Ġw ) Ġ/ 2 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Ġ= ĠString . format ("% . 3 f ĠK g ", Ġm Weight Ġ/ Ġ 1 0 0 0 F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Weight Label ?. setText ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= ĠString . format ("% d ", Ġv . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Ad c Label ?. setText ( s ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Av r Start Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Val Ġ+= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Cnt -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Av r Cnt Ġ<= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( m Cal State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Zero Val Ġ= Ġm Av r Val Ġ/ ĠA VER AGE _ COUNT . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Start Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Cal State Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= ĠString . format ("% d ", Ġm Zero Val . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Zero Label ?. setText ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Message Label ?. setText (" Put Ġ 1 Kg Ġload Ġon Ġand Ġpress ĠCal ibrate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Scale Factor Ġ= Ġ 1 0 0 0 F Ġ/ Ġ( m Av r Val Ġ/ ĠA VER AGE _ COUNT . toFloat () Ġ- Ġm Zero Val )// Ġ/ Ġ 0 . 1 3 8 F // 1 0 0 0 0 0 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Start Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Cal State Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= ĠString . format ("% d ", Ġm Scale Factor . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Scale Label ?. setText ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Message Label ?. setText (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Weight Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Zero Val Ġ= Ġm Av r Val Ġ/ ĠA VER AGE _ COUNT . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Av r Start Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Cal State Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= ĠString . format ("% d ", Ġm Zero Val . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Zero Label ?. setText ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBLE ADV _ M AND ATA _ SN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }