| import {LitElement, html, css} from 'https://cdn.jsdelivr.net/gh/lit/dist@2/core/lit-core.min.js'; |
| import {setupSimpleApp} from '../bumble.js'; |
| |
| class ScanList extends LitElement { |
| static properties = { |
| listItems: {state: true}, |
| }; |
| |
| static styles = css` |
| table, th, td { |
| padding: 2px; |
| white-space: pre; |
| border: 1px solid black; |
| border-collapse: collapse; |
| } |
| `; |
| |
| constructor() { |
| super(); |
| this.listItems = []; |
| } |
| |
| render() { |
| if (this.listItems.length === 0) { |
| return ''; |
| } |
| return html` |
| <table> |
| <thead> |
| <tr> |
| ${Object.keys(this.listItems[0]).map(i => html`<th>${i}</th>`)} |
| </tr> |
| </thead> |
| <tbody> |
| ${this.listItems.map(i => html` |
| <tr> |
| ${Object.keys(i).map(key => html`<td>${i[key]}</td>`)} |
| </tr> |
| `)} |
| </tbody> |
| </table> |
| `; |
| } |
| } |
| customElements.define('scan-list', ScanList); |
| |
| const logOutput = document.querySelector('#log-output'); |
| function logToOutput(message) { |
| console.log(message); |
| logOutput.value += message + '\n'; |
| } |
| |
| function onUpdate(scanResults) { |
| const items = scanResults.toJs({create_proxies : false}).map(entry => ( |
| { address: entry.address, address_type: entry.address_type, rssi: entry.rssi, data: entry.data } |
| )); |
| scanResults.destroy(); |
| scanList.listItems = items; |
| } |
| |
| // Setup the UI |
| const scanList = document.querySelector('#scan-list'); |
| const bumbleControls = document.querySelector('#bumble-controls'); |
| |
| // Setup the app |
| const app = await setupSimpleApp('scanner.py', bumbleControls, logToOutput); |
| app.on('update', onUpdate); |
| logToOutput('Click the Bluetooth button to start'); |