diff options
Diffstat (limited to 'app/api/Binding.qml')
-rw-r--r-- | app/api/Binding.qml | 196 |
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 }) + } +} |