From 0999da3b512862587f99152130d3937299b3480d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?PontualTech=20/=20Karl=C3=A3o?= Date: Wed, 29 Apr 2026 08:42:19 -0300 Subject: [PATCH] =?UTF-8?q?fix(ble):=20typo=20writeWithoutResponses?= =?UTF-8?q?=E2=86=92writeWithoutResponse=20v1.10.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Web Bluetooth log mostrou ff02 com property [read] sozinha, mas no APK v1.10.7 o plugin reportava [wnr,read]. Discrepância revelou typo: eu usei p.writeWithoutResponses (com S no final) mas o nome correto da property em BluetoothCharacteristicProperties é singular — p.writeWithoutResponse. Sempre undefined → ff02 não detectado como writeChar → probe abortava com 'Sem chars notify+write'. Fix: 4 ocorrências em bmsProbeWebBluetooth corrigidas. Plugin Capacitor por sorte usa o nome diferente (writeWithoutResponse no nested object) então não foi afetado. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/diario-bordo.html | 10 +++++----- server/public/index.html | 10 +++++----- server/public/sw.js | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/diario-bordo.html b/app/diario-bordo.html index 9002e62..abe1dd6 100644 --- a/app/diario-bordo.html +++ b/app/diario-bordo.html @@ -6073,11 +6073,11 @@ async function bmsProbeWebBluetooth(deviceId,deviceName){ let notifyChar=null,writeChar=null; for(const c of chars){ const p=c.properties; - const propsStr=[p.notify&&'notify',p.indicate&&'indicate',p.write&&'write',p.writeWithoutResponses&&'wnr',p.read&&'read'].filter(Boolean).join(','); + const propsStr=[p.notify&&'notify',p.indicate&&'indicate',p.write&&'write',p.writeWithoutResponse&&'wnr',p.read&&'read'].filter(Boolean).join(','); const cu=c.uuid.toLowerCase(); setBleDiag(` ${cu.slice(4,8)} [${propsStr}]`,'info'); if(!notifyChar&&(p.notify||p.indicate))notifyChar=c; - if(!writeChar&&(p.write||p.writeWithoutResponses))writeChar=c; + if(!writeChar&&(p.write||p.writeWithoutResponse))writeChar=c; } if(!notifyChar||!writeChar){setBleDiag('Sem chars notify+write','err');return false} setBleDiag(`Notify=${notifyChar.uuid.slice(4,8)} Write=${writeChar.uuid.slice(4,8)}`,'ok'); @@ -6094,7 +6094,7 @@ async function bmsProbeWebBluetooth(deviceId,deviceName){ setBleDiag('Notify ativo · iniciando wake...','ok'); await new Promise(r=>setTimeout(r,500)); try{ - const fn=writeChar.properties.writeWithoutResponses?'writeValueWithoutResponse':'writeValue'; + const fn=writeChar.properties.writeWithoutResponse?'writeValueWithoutResponse':'writeValue'; await writeChar[fn](new Uint8Array([0x5A,0x5A,0x5A,0x5A])); setBleDiag('Wake 5A x4 enviado','info'); }catch(e){setBleDiag('Wake skip: '+e.message,'info')} @@ -6107,7 +6107,7 @@ async function bmsProbeWebBluetooth(deviceId,deviceName){ for(const p of PROTOCOLS){ try{ setBleDiag(`→ TX ${p.name}`,'info'); - const fn=writeChar.properties.writeWithoutResponses?'writeValueWithoutResponse':'writeValue'; + const fn=writeChar.properties.writeWithoutResponse?'writeValueWithoutResponse':'writeValue'; await writeChar[fn](new Uint8Array(p.bytes)); setBleDiag(`✔ write ${p.name} OK`,'info'); await new Promise(r=>setTimeout(r,2500)); @@ -6440,7 +6440,7 @@ async function removeBluetoothDevice(id){ renderBluetoothCard(); } -const APP_VERSION='1.10.12'; +const APP_VERSION='1.10.13'; function renderBluetoothCard(){ const el=document.getElementById('bt-list'); const supportEl=document.getElementById('bt-support'); diff --git a/server/public/index.html b/server/public/index.html index 9002e62..abe1dd6 100644 --- a/server/public/index.html +++ b/server/public/index.html @@ -6073,11 +6073,11 @@ async function bmsProbeWebBluetooth(deviceId,deviceName){ let notifyChar=null,writeChar=null; for(const c of chars){ const p=c.properties; - const propsStr=[p.notify&&'notify',p.indicate&&'indicate',p.write&&'write',p.writeWithoutResponses&&'wnr',p.read&&'read'].filter(Boolean).join(','); + const propsStr=[p.notify&&'notify',p.indicate&&'indicate',p.write&&'write',p.writeWithoutResponse&&'wnr',p.read&&'read'].filter(Boolean).join(','); const cu=c.uuid.toLowerCase(); setBleDiag(` ${cu.slice(4,8)} [${propsStr}]`,'info'); if(!notifyChar&&(p.notify||p.indicate))notifyChar=c; - if(!writeChar&&(p.write||p.writeWithoutResponses))writeChar=c; + if(!writeChar&&(p.write||p.writeWithoutResponse))writeChar=c; } if(!notifyChar||!writeChar){setBleDiag('Sem chars notify+write','err');return false} setBleDiag(`Notify=${notifyChar.uuid.slice(4,8)} Write=${writeChar.uuid.slice(4,8)}`,'ok'); @@ -6094,7 +6094,7 @@ async function bmsProbeWebBluetooth(deviceId,deviceName){ setBleDiag('Notify ativo · iniciando wake...','ok'); await new Promise(r=>setTimeout(r,500)); try{ - const fn=writeChar.properties.writeWithoutResponses?'writeValueWithoutResponse':'writeValue'; + const fn=writeChar.properties.writeWithoutResponse?'writeValueWithoutResponse':'writeValue'; await writeChar[fn](new Uint8Array([0x5A,0x5A,0x5A,0x5A])); setBleDiag('Wake 5A x4 enviado','info'); }catch(e){setBleDiag('Wake skip: '+e.message,'info')} @@ -6107,7 +6107,7 @@ async function bmsProbeWebBluetooth(deviceId,deviceName){ for(const p of PROTOCOLS){ try{ setBleDiag(`→ TX ${p.name}`,'info'); - const fn=writeChar.properties.writeWithoutResponses?'writeValueWithoutResponse':'writeValue'; + const fn=writeChar.properties.writeWithoutResponse?'writeValueWithoutResponse':'writeValue'; await writeChar[fn](new Uint8Array(p.bytes)); setBleDiag(`✔ write ${p.name} OK`,'info'); await new Promise(r=>setTimeout(r,2500)); @@ -6440,7 +6440,7 @@ async function removeBluetoothDevice(id){ renderBluetoothCard(); } -const APP_VERSION='1.10.12'; +const APP_VERSION='1.10.13'; function renderBluetoothCard(){ const el=document.getElementById('bt-list'); const supportEl=document.getElementById('bt-support'); diff --git a/server/public/sw.js b/server/public/sw.js index cb41661..da916c4 100644 --- a/server/public/sw.js +++ b/server/public/sw.js @@ -1,7 +1,7 @@ // Shivao Service Worker — offline real // Estratégia: shell precachado, tiles cache-first, windy network-first, /api passa direto. // Versão usada nos cache names — bumpa essa string pra invalidar caches antigos em deploys. -const VERSION = 'shivao-v1.10.12'; +const VERSION = 'shivao-v1.10.13'; const SHELL_CACHE = `shivao-shell-${VERSION}`; const TILES_CACHE = 'shivao-tiles-v1'; // separado pra não invalidar tiles em update do shell const WINDY_CACHE = `shivao-windy-${VERSION}`;