File: hfp_handsfree.html

package info (click to toggle)
python-bumble 0.0.220-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 9,280 kB
  • sloc: python: 71,701; java: 3,782; javascript: 823; xml: 203; sh: 172; makefile: 8
file content (132 lines) | stat: -rw-r--r-- 5,594 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<html data-bs-theme="dark">

<head>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
</head>

<body>
    <nav class="navbar navbar-dark bg-primary">
        <div class="container">
            <span class="navbar-brand mb-0 h1">Bumble Handsfree</span>
        </div>
    </nav>
    <br>

    <div class="container">

        <label class="form-label">Server Port</label>
        <div class="input-group mb-3">
            <input type="text" class="form-control" aria-label="Port Number" value="8989" id="port">
            <button class="btn btn-primary" type="button" onclick="connect()">Connect</button>
        </div>

        <label class="form-label">Dial Phone Number</label>
        <div class="input-group mb-3">
            <input type="text" class="form-control" placeholder="Phone Number" aria-label="Phone Number"
                id="dial_number">
            <button class="btn btn-primary" type="button"
                onclick="send_at_command(`ATD${dialNumberInput.value}`)">Dial</button>
        </div>

        <label class="form-label">Send AT Command</label>
        <div class="input-group mb-3">
            <input type="text" class="form-control" placeholder="AT Command" aria-label="AT command" id="at_command">
            <button class="btn btn-primary" type="button"
                onclick="send_at_command(document.getElementById('at_command').value)">Send</button>
        </div>

        <div class="row">
            <div class="col-auto">
                <label class="form-label">Battery Level</label>
                <div class="input-group mb-3">
                    <input type="text" class="form-control" placeholder="0 - 100" aria-label="Battery Level"
                        id="battery_level">
                    <button class="btn btn-primary" type="button"
                        onclick="send_at_command(`AT+BIEV=2,${document.getElementById('battery_level').value}`)">Set</button>
                </div>
            </div>
            <div class="col-auto">
                <label class="form-label">Speaker Volume</label>
                <div class="input-group mb-3 col-auto">
                    <input type="text" class="form-control" placeholder="0 - 15" aria-label="Speaker Volume"
                        id="speaker_volume">
                    <button class="btn btn-primary" type="button"
                        onclick="send_at_command(`AT+VGS=${document.getElementById('speaker_volume').value}`)">Set</button>
                </div>
            </div>
            <div class="col-auto">
                <label class="form-label">Mic Volume</label>
                <div class="input-group mb-3 col-auto">
                    <input type="text" class="form-control" placeholder="0 - 15" aria-label="Mic Volume"
                        id="mic_volume">
                    <button class="btn btn-primary" type="button"
                        onclick="send_at_command(`AT+VGM=${document.getElementById('mic_volume').value}`)">Set</button>
                </div>
            </div>
        </div>

        <button class="btn btn-primary" onclick="send_at_command('ATA')">Answer</button>
        <button class="btn btn-primary" onclick="send_at_command('AT+CHUP')">Hang Up</button>
        <button class="btn btn-primary" onclick="send_at_command('AT+BLDN')">Redial</button>
        <button class="btn btn-primary" onclick="send({ type: 'query_call'})">Get Call Status</button>

        <br><br>

        <button class="btn btn-primary" onclick="send_at_command('AT+BVRA=1')">Start Voice Assistant</button>
        <button class="btn btn-primary" onclick="send_at_command('AT+BVRA=0')">Stop Voice Assistant</button>

        <hr>

        <div id="socketStateContainer" class="bg-body-tertiary p-3 rounded-2">
            <h3>Log</h3>
            <code id="log" style="white-space: pre-line;"></code>
        </div>
    </div>


    <script>
        let portInput = document.getElementById("port")
        let atCommandInput = document.getElementById("at_command")
        let log = document.getElementById("log")
        let socket

        function connect() {
            socket = new WebSocket(`ws://localhost:${portInput.value}`);
            socket.onopen = _ => {
                log.textContent += 'OPEN\n'
            }
            socket.onclose = _ => {
                log.textContent += 'CLOSED\n'
            }
            socket.onerror = (error) => {
                log.textContent += 'ERROR\n'
                console.log(`ERROR: ${error}`)
            }
            socket.onmessage = (event) => {
                log.textContent += `<-- ${event.data}\n`
                let volume_state = JSON.parse(event.data)
                volumeSetting.value = volume_state.volume_setting
                changeCounter.value = volume_state.change_counter
                muted.checked = volume_state.muted ? true : false
            }
        }

        function send(message) {
            if (socket && socket.readyState == WebSocket.OPEN) {
                let jsonMessage = JSON.stringify(message)
                log.textContent += `--> ${jsonMessage}\n`
                socket.send(jsonMessage)
            } else {
                log.textContent += 'NOT CONNECTED\n'
            }
        }

        function send_at_command(command) {
            send({ type: 'at_command', 'command': command })
        }
    </script>
    </div>
</body>

</html>