summaryrefslogtreecommitdiffstats
path: root/app/api/Binding.qml
diff options
context:
space:
mode:
Diffstat (limited to 'app/api/Binding.qml')
-rw-r--r--app/api/Binding.qml196
1 files changed, 196 insertions, 0 deletions
diff --git a/app/api/Binding.qml b/app/api/Binding.qml
new file mode 100644
index 0000000..3b43510
--- /dev/null
+++ b/app/api/Binding.qml
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (C) 2017 Konsulko Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtWebSockets 1.0
+
+WebSocket {
+ id: root
+ active: true
+ url: bindingAddress
+
+ property string apiString: "radio"
+ property var verbs: []
+ property string payloadLength: "9999"
+
+ readonly property var msgid: {
+ "call": 2,
+ "retok": 3,
+ "reterr": 4,
+ "event": 5
+ }
+
+ readonly property int amBand: 0
+ readonly property int fmBand: 1
+
+ readonly property int stoppedState: 0
+ readonly property int activeState: 1
+
+ property int band: fmBand
+ property int frequency
+ property int frequencyStep
+ property int minimumFrequency
+ property int maximumFrequency
+ property int state: stoppedState
+ property int scanningState: stoppedState
+ property bool scanningFreqUpdate: false
+ property string stationId: ""
+
+ signal stationFound
+
+ property Connections c : Connections {
+ target: root
+
+ onFrequencyChanged: {
+ if(scanningState != activeState) {
+ // Not scanning, push update
+ sendSocketMessage("frequency", { value: frequency })
+ } else if(!scanningFreqUpdate) {
+ // External change, stop scanning
+ sendSocketMessage("scan_stop", 'None')
+ scanningState = stoppedState
+ sendSocketMessage("frequency", { value: frequency })
+ } else {
+ // This update was from scanning, clear state
+ scanningFreqUpdate = false
+ }
+ }
+
+ onBandChanged: {
+ sendSocketMessage("band", { value: band })
+ updateFrequencyRange(band)
+ updateFrequencyStep(band)
+ frequency = minimumFrequency
+ }
+ }
+
+ onTextMessageReceived: {
+ var json = JSON.parse(message)
+ //console.debug("Raw response: " + message)
+ var request = json[2].request
+ var response = json[2].response
+
+ switch (json[0]) {
+ case msgid.call:
+ break
+ case msgid.retok:
+ var verb = verbs.shift()
+ if (verb == "frequency_range") {
+ minimumFrequency = response.min
+ maximumFrequency = response.max
+ } else if (verb == "frequency_step") {
+ frequencyStep = response.step
+ }
+ break
+ case msgid.event:
+ var event = JSON.parse(JSON.stringify(json[2]))
+ if (event.event === "radio/frequency") {
+ if(scanningState == activeState) {
+ scanningFreqUpdate = true
+ frequency = event.data.value
+ }
+ } else if (event.event === "radio/station_found") {
+ if(scanningState == activeState) {
+ scanningState = stoppedState
+ stationId = freq2str(event.data.value)
+ root.stationFound()
+ }
+ }
+ break
+ case msg.reterr:
+ console.debug("Bad return value, binding probably not installed")
+ break
+ case MessageId.event:
+ break
+ }
+ }
+
+ onStatusChanged: {
+ switch (status) {
+ case WebSocket.Open:
+ // Initialize band values now that we're connected to the
+ // binding
+ updateFrequencyRange(band)
+ updateFrequencyStep(band)
+ frequency = minimumFrequency
+ sendSocketMessage("subscribe", { value: "frequency" })
+ sendSocketMessage("subscribe", { value: "station_found" })
+ break
+ case WebSocket.Error:
+ console.debug("WebSocket error: " + root.errorString)
+ break
+ }
+ }
+
+ function freq2str(freq) {
+ if (freq > 5000000) {
+ return '%1 MHz'.arg((freq / 1000000).toFixed(1))
+ } else {
+ return '%1 kHz'.arg((freq / 1000).toFixed(0))
+ }
+ }
+
+ function sendSocketMessage(verb, parameter) {
+ var requestJson = [ msgid.call, payloadLength, apiString + '/'
+ + verb, parameter ]
+ //console.debug("sendSocketMessage: " + JSON.stringify(requestJson))
+ verbs.push(verb)
+ sendTextMessage(JSON.stringify(requestJson))
+ }
+
+ function start() {
+ sendSocketMessage("start", 'None')
+ state = activeState
+ }
+
+ function stop() {
+ sendSocketMessage("stop", 'None')
+ state = stoppedState
+ }
+
+ function tuneUp() {
+ frequency += frequencyStep
+ if(frequency > maximumFrequency) {
+ frequency = minimumFrequency
+ }
+ }
+
+ function tuneDown() {
+ frequency -= frequencyStep
+ if(frequency < minimumFrequency) {
+ frequency = maximumFrequency
+ }
+ }
+
+ function scanUp() {
+ scanningState = activeState
+ sendSocketMessage("scan_start", { direction: "forward" })
+ }
+
+ function scanDown() {
+ scanningState = activeState
+ sendSocketMessage("scan_start", { direction: "backward" })
+ }
+
+ function updateFrequencyRange(band) {
+ sendSocketMessage("frequency_range", { band: band })
+ }
+
+ function updateFrequencyStep(band) {
+ sendSocketMessage("frequency_step", { band: band })
+ }
+}