X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=staging%2Fsoundmanager.git;a=blobdiff_plain;f=sample%2Fradio%2Fapp%2FRadio.qml;fp=sample%2Fradio%2Fapp%2FRadio.qml;h=54d4844c967a8cfc79a6cde345eb2e10029bd660;hp=0000000000000000000000000000000000000000;hb=2e602801b372b0b68111316b89f567213e3ea378;hpb=f743c3428f41b8d127e538ea8a6505a0c882cdb2 diff --git a/sample/radio/app/Radio.qml b/sample/radio/app/Radio.qml new file mode 100644 index 0000000..54d4844 --- /dev/null +++ b/sample/radio/app/Radio.qml @@ -0,0 +1,350 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (C) 2017 Konsulko Group + * Copyright (C) 2017 Toyota Motor Corporation + * + * 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 QtQuick.Layouts 1.1 +import QtQuick.Controls 2.0 +import AGL.Demo.Controls 1.0 +import 'api' as API + +ApplicationWindow { + id: root + + API.Binding { + id: radio + + property string title + + onBandChanged: frequency = minimumFrequency + onStationFound: title = stationId + onFrequencyChanged: { + title = '' + slider.value = frequency + } + } + property int sourceID + property int connectionID + + function slotReply(msg){ + var jstr = JSON.stringify(msg) + console.log("radio: Json jstr:" + jstr) + var content = JSON.parse(jstr); + var verb = content.response.verb + var err = content.response.error + console.log("radio: verb: " + verb) + console.log("radio: content.response.error: " + err) + switch(verb) + { + case "connect": + console.log("radio: replied by connect") + if(err == 0){ + connectionID = content.response.mainConnectionID + console.log("radio: mainConnectionID is " + connectionID) + } + break; + case "registerSource": + console.log("radio: replied by registerSource") + if(err == 0){ + sourceID = content.response.sourceID + } + default: + break; + } + } + + function slotEvent(event,msg){ + var jstr = JSON.stringify(msg) + var content = JSON.parse(jstr); + var eventName = content.event + console.log("radio: event qml: event" + eventName + " msg: " + jstr) + switch(eventName) + { + case "soundmanager\/asyncSetSourceState": + console.log("radio: soundmanager\/asyncSetSourceState") + console.log("radio: my soundID:" + sourceID + "handle:" + content.data.handle + ",sourceID:" + content.data.sourceID + ",sourceState:" + content.data.sourceState) + if(sourceID == content.data.sourceID){ + console.log("radio: call ackSetSourceState") + var arg = JSON.stringify({handle:content.data.handle, error:0}) + smw.call("ackSetSourceState", arg) + switch(content.data.sourceState){ + case "on": + radio.start() + break; + case "off": + radio.stop() + break; + case "paused": + + radio.stop() + break; + } + } + break; + case "soundmanager\/asyncConnect": + // In reality, device shall be opened in this timing + if(connectionID == content.data.connectionID){ + //radio.open_device() + } + break; + case "soundmanager\/asyncDisconnect": + // In reality, device shall be closed in this timing + if(connectionID == content.data.connectionID){ + // radio.close_device() + } + break; + default: + break; + } + } + + ColumnLayout { + anchors.fill: parent + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredHeight: 3 + clip: true + Image { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + fillMode: Image.PreserveAspectFit + source: './images/HMI_Radio_Equalizer.svg' + } + Item { + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height :307 + Rectangle { + anchors.fill: parent + color: 'black' + opacity: 0.75 + } + + ColumnLayout { + anchors.fill: parent + anchors.margins: root.width * 0.02 + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Row { + spacing: 20 + Image { + source: './images/FM_Icons_FM.svg' + } +// ToggleButton { +// offImage: './images/FM_Icons_FM.svg' +// onImage: './images/FM_Icons_AM.svg' +// onCheckedChanged: { +// radio.band = checked ? radio.amBand : radio.fmBand +// radio.frequency = radio.minimumFrequency +// } +// } + } + ColumnLayout { + anchors.fill: parent + Label { + id: label + Layout.alignment: Layout.Center + text: radio.freq2str(radio.frequency) + horizontalAlignment: Label.AlignHCenter + verticalAlignment: Label.AlignVCenter + } + Label { + id: artist + Layout.alignment: Layout.Center + text: radio.title + horizontalAlignment: Label.AlignHCenter + verticalAlignment: Label.AlignVCenter + font.pixelSize: label.font.pixelSize * 0.6 + } + } + } + Slider { + id: slider + Layout.fillWidth: true + from: radio.minimumFrequency + to: radio.maximumFrequency + stepSize: radio.frequencyStep + snapMode: Slider.SnapOnRelease + onValueChanged: radio.frequency = value + Label { + anchors.left: parent.left + anchors.bottom: parent.top + font.pixelSize: 32 + text: radio.freq2str(radio.minimumFrequency) + } + Label { + anchors.right: parent.right + anchors.bottom: parent.top + font.pixelSize: 32 + text: radio.freq2str(radio.maximumFrequency) + } + } + RowLayout { + Layout.fillHeight: true + + Label { + text: 'TUNE' + } + + ImageButton { + offImage: './images/AGL_MediaPlayer_BackArrow.svg' + Timer { + running: parent.pressed + triggeredOnStart: true + interval: 100 + repeat: true + onTriggered: radio.tuneDown() + } + } + + ImageButton { + offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' + Timer { + running: parent.pressed + triggeredOnStart: true + interval: 100 + repeat: true + onTriggered: radio.tuneUp() + } + } + + Item { Layout.fillWidth: true } + + ImageButton { + id: play + offImage: './images/AGL_MediaPlayer_Player_Play.svg' + onClicked: { + var JsonArg = JSON.stringify({sourceID:sourceID, sinkID:1}) + console.log(JsonArg) + smw.call("connect",JsonArg) + } + states: [ + State { + when: radio.state === radio.activeState + PropertyChanges { + target: play + offImage: './images/AGL_MediaPlayer_Player_Pause.svg' + onClicked: { + var JsonDisConArg = JSON.stringify({mainConnectionID:connectionID}); + console.log(JsonDisConArg) + smw.call("disconnect",JsonDisConArg) + //radio.stop() + } + } + } + ] + } + + Item { Layout.fillWidth: true } + + Label { + //Layout.fillWidth: true + text: 'SCAN' + } + + ImageButton { + offImage: './images/AGL_MediaPlayer_BackArrow.svg' + Timer { + running: parent.pressed + triggeredOnStart: true + interval: 100 + repeat: true + onTriggered: radio.scanDown() + } + } + + ImageButton { + offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' + Timer { + running: parent.pressed + triggeredOnStart: true + interval: 100 + repeat: true + onTriggered: radio.scanUp() + } + } + + } + } + } + } + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredHeight: 2 + ListView { + anchors.fill: parent + anchors.leftMargin: 50 + anchors.rightMargin: 50 + clip: true + header: Label { text: 'PRESETS'; opacity: 0.5 } + model: presetModel + + delegate: MouseArea { + width: ListView.view.width + height: ListView.view.height / 4 + + onClicked: { + radio.band = model.modelData.band + radio.frequency = model.modelData.frequency + radio.title = model.modelData.title + } + + RowLayout { + anchors.fill: parent + Image { + source: './images/Radio_Active_Icon.svg' + } + ColumnLayout { + Layout.fillWidth: true + Label { + Layout.fillWidth: true + text: model.title + } + Label { + Layout.fillWidth: true + text: radio.freq2str(model.frequency) + color: '#59FF7F' + font.pixelSize: 32 + } + } + Image { + source: { + switch (model.modelData.band) { + case radio.fmBand: + return './images/FM_Icons_FM.svg' + case radio.amBand: + return './images/FM_Icons_AM.svg' + } + return null + } + } + } + } + } + } + Component.onCompleted: { + var JsonRegArg = JSON.stringify({appname:"radio"}) + console.log(JsonRegArg) + smw.call("registerSource", JsonRegArg) + } + } +}