UNPKG

web-bluetooth-terminal

Version:

Progressive Web Application for serial communication with your own Bluetooth Low Energy (Smart) devices

85 lines (68 loc) 2.54 kB
// UI elements. const deviceNameLabel = document.getElementById('device-name'); const connectButton = document.getElementById('connect'); const disconnectButton = document.getElementById('disconnect'); const terminalContainer = document.getElementById('terminal'); const sendForm = document.getElementById('send-form'); const inputField = document.getElementById('input'); // Helpers. const defaultDeviceName = 'Terminal'; const terminalAutoScrollingLimit = terminalContainer.offsetHeight / 2; let isTerminalAutoScrolling = true; const scrollElement = (element) => { const scrollTop = element.scrollHeight - element.offsetHeight; if (scrollTop > 0) { element.scrollTop = scrollTop; } }; const logToTerminal = (message, type = '') => { terminalContainer.insertAdjacentHTML('beforeend', `<div${type && ` class="${type}"`}>${message}</div>`); if (isTerminalAutoScrolling) { scrollElement(terminalContainer); } }; // Obtain configured instance. const terminal = new BluetoothTerminal(); // Override `receive` method to log incoming data to the terminal. terminal.receive = function(data) { logToTerminal(data, 'in'); }; // Override default log method to output messages to the terminal and console. terminal._log = function(...messages) { // We can't use `super._log()` here. messages.forEach((message) => { logToTerminal(message); console.log(message); // eslint-disable-line no-console }); }; // Implement own send function to log outcoming data to the terminal. const send = (data) => { terminal.send(data). then(() => logToTerminal(data, 'out')). catch((error) => logToTerminal(error)); }; // Bind event listeners to the UI elements. connectButton.addEventListener('click', () => { terminal.connect(). then(() => { deviceNameLabel.textContent = terminal.getDeviceName() ? terminal.getDeviceName() : defaultDeviceName; }); }); disconnectButton.addEventListener('click', () => { terminal.disconnect(); deviceNameLabel.textContent = defaultDeviceName; }); sendForm.addEventListener('submit', (event) => { event.preventDefault(); send(inputField.value); inputField.value = ''; inputField.focus(); }); // Switch terminal auto scrolling if it scrolls out of bottom. terminalContainer.addEventListener('scroll', () => { const scrollTopOffset = terminalContainer.scrollHeight - terminalContainer.offsetHeight - terminalAutoScrollingLimit; isTerminalAutoScrolling = (scrollTopOffset < terminalContainer.scrollTop); });