From a22e565583716ce58eeb682fb904ceff5bcb99f4 Mon Sep 17 00:00:00 2001 From: John A Hodgson Date: Mon, 24 Sep 2012 11:13:00 -0400 Subject: [PATCH] added locationdiagnostics project --- locationdiagnostics/.cproject | 209 +++++++++++++++ locationdiagnostics/.gitignore | 3 + locationdiagnostics/.project | 90 +++++++ locationdiagnostics/LICENSE | 177 +++++++++++++ locationdiagnostics/Makefile | 35 +++ locationdiagnostics/NOTICE | 5 + locationdiagnostics/README.md | 62 +++++ locationdiagnostics/assets/LabelLabel.qml | 55 ++++ locationdiagnostics/assets/LocationPage.qml | 243 +++++++++++++++++ .../assets/ToggleLabelButton.qml | 50 ++++ locationdiagnostics/assets/WarpDrive.qml | 102 +++++++ .../assets/images/background.png | Bin 0 -> 22540 bytes .../assets/images/compass_base.png | Bin 0 -> 18427 bytes .../assets/images/compass_pointer.png | Bin 0 -> 5297 bytes locationdiagnostics/assets/images/pin.png | Bin 0 -> 5486 bytes locationdiagnostics/assets/images/track.png | Bin 0 -> 8127 bytes locationdiagnostics/assets/main.qml | 249 ++++++++++++++++++ locationdiagnostics/bar-descriptor.xml | 119 +++++++++ locationdiagnostics/device-assets.xml | 4 + locationdiagnostics/icon.png | Bin 0 -> 12769 bytes locationdiagnostics/locationdiagnostics.pro | 51 ++++ locationdiagnostics/readme.txt | 35 +++ .../src/LocationDiagnostics.cpp | 245 +++++++++++++++++ .../src/LocationDiagnostics.hpp | 95 +++++++ locationdiagnostics/src/LocationSession.cpp | 213 +++++++++++++++ locationdiagnostics/src/LocationSession.hpp | 129 +++++++++ locationdiagnostics/src/main.cpp | 51 ++++ locationdiagnostics/translations/Makefile | 12 + .../translations/locationdiagnostics.pro | 1 + 29 files changed, 2235 insertions(+) create mode 100644 locationdiagnostics/.cproject create mode 100644 locationdiagnostics/.gitignore create mode 100644 locationdiagnostics/.project create mode 100644 locationdiagnostics/LICENSE create mode 100644 locationdiagnostics/Makefile create mode 100644 locationdiagnostics/NOTICE create mode 100644 locationdiagnostics/README.md create mode 100644 locationdiagnostics/assets/LabelLabel.qml create mode 100644 locationdiagnostics/assets/LocationPage.qml create mode 100644 locationdiagnostics/assets/ToggleLabelButton.qml create mode 100644 locationdiagnostics/assets/WarpDrive.qml create mode 100644 locationdiagnostics/assets/images/background.png create mode 100644 locationdiagnostics/assets/images/compass_base.png create mode 100644 locationdiagnostics/assets/images/compass_pointer.png create mode 100644 locationdiagnostics/assets/images/pin.png create mode 100644 locationdiagnostics/assets/images/track.png create mode 100644 locationdiagnostics/assets/main.qml create mode 100644 locationdiagnostics/bar-descriptor.xml create mode 100644 locationdiagnostics/device-assets.xml create mode 100644 locationdiagnostics/icon.png create mode 100644 locationdiagnostics/locationdiagnostics.pro create mode 100644 locationdiagnostics/readme.txt create mode 100644 locationdiagnostics/src/LocationDiagnostics.cpp create mode 100644 locationdiagnostics/src/LocationDiagnostics.hpp create mode 100644 locationdiagnostics/src/LocationSession.cpp create mode 100644 locationdiagnostics/src/LocationSession.hpp create mode 100644 locationdiagnostics/src/main.cpp create mode 100644 locationdiagnostics/translations/Makefile create mode 100644 locationdiagnostics/translations/locationdiagnostics.pro diff --git a/locationdiagnostics/.cproject b/locationdiagnostics/.cproject new file mode 100644 index 00000000..1815e4ec --- /dev/null +++ b/locationdiagnostics/.cproject @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/locationdiagnostics/.gitignore b/locationdiagnostics/.gitignore new file mode 100644 index 00000000..81fe222a --- /dev/null +++ b/locationdiagnostics/.gitignore @@ -0,0 +1,3 @@ +/.settings +/arm +/x86 diff --git a/locationdiagnostics/.project b/locationdiagnostics/.project new file mode 100644 index 00000000..0e0f40b0 --- /dev/null +++ b/locationdiagnostics/.project @@ -0,0 +1,90 @@ + + + locationdiagnostics + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + Device-Debug + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + Device-Debug + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + com.qnx.tools.bbt.xml.core.bbtXMLValidationBuilder + + + + + com.rim.tad.tools.qml.core.qmlFileBuilder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + com.qnx.tools.ide.bbt.core.bbtnature + org.eclipse.cdt.core.ccnature + com.rim.tad.tools.qml.core.qmlNature + + diff --git a/locationdiagnostics/LICENSE b/locationdiagnostics/LICENSE new file mode 100644 index 00000000..4a459866 --- /dev/null +++ b/locationdiagnostics/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/locationdiagnostics/Makefile b/locationdiagnostics/Makefile new file mode 100644 index 00000000..d643966a --- /dev/null +++ b/locationdiagnostics/Makefile @@ -0,0 +1,35 @@ +QMAKE_TARGET = locationdiagnostics +QMAKE = $(QNX_HOST)/usr/bin/qmake +TARGET = $(QMAKE_TARGET) + + +all: Makefile $(QMAKE_TARGET) + +clean: + $(MAKE) -C ./arm -f Makefile sureclean + $(MAKE) -C ./x86 -f Makefile sureclean + + +Makefile: FORCE + $(QMAKE) -spec unsupported/blackberry-armv7le-g++ -o arm/Makefile $(QMAKE_TARGET).pro CONFIG+=device + $(QMAKE) -spec unsupported/blackberry-x86-g++ -o x86/Makefile $(QMAKE_TARGET).pro CONFIG+=simulator + $(MAKE) -C ./translations -f Makefile update release + +FORCE: + +$(QMAKE_TARGET): device simulator + +device: + $(MAKE) -C ./arm -f Makefile all + +Device-Debug: Makefile + $(MAKE) -C ./arm -f Makefile debug + +Device-Release: Makefile + $(MAKE) -C ./arm -f Makefile release + +simulator: + $(MAKE) -C ./x86 -f Makefile all + +Simulator-Debug: Makefile + $(MAKE) -C ./x86 -f Makefile debug diff --git a/locationdiagnostics/NOTICE b/locationdiagnostics/NOTICE new file mode 100644 index 00000000..877071e7 --- /dev/null +++ b/locationdiagnostics/NOTICE @@ -0,0 +1,5 @@ +Location Diagnostics +Copyright (c) 2011 Research In Motion Limited (http://www.rim.com/) + +This product includes software developed at +Research In Motion Limited (http://www.rim.com/). \ No newline at end of file diff --git a/locationdiagnostics/README.md b/locationdiagnostics/README.md new file mode 100644 index 00000000..21b8e54f --- /dev/null +++ b/locationdiagnostics/README.md @@ -0,0 +1,62 @@ +# Location Diagnostics + +Location Diagnostics sample demonstrates the C++ Location APIs of BlackBerry 10. This sample can be used as a reference usage of the Lcoation API from a Cascades application. + +**Feature Summary** + + - Choosing a specific positioning method + - Providing location assistance information such as PDE/SLP + - Specifying the frequency of fixes + - Specifying whether app should receive fixes while in Background + - Ability to request both multiple and single fix + - Displays details of every fix obtained + - Ability to reset the low level location module in hot, warm and cold mode + +**Not Implemented** + + - Satellite information is not yet available via this API. The tab for that will not show anything at this time + - Map and Email Logs action items are not functional yet but will be implmented once those APIs are available. + +**Author(s)** + +* [Shadid Haque](https://github.com/shaque) + +**Requirements** + + - BlackBerry Native SDK 10.0.06 beta + - BlackBerry 10 Dev Alpha device running 10.0.06 OS + + +**Importing a project into the Native SDK** + + 1. From the the Sample apps page, download and extract the sample application. + 2. Launch the Native SDK. + 3. On the File menu, click Import. + 4. Expand General, and select Existing Projects into Workspace. Click Next. + 5. Browse to the location where you extracted the sample app, and click OK. + The sample project should display in the the Projects section. + 6. Click Finish to import the project into your workspace. + + **Citations** + + - pewpew.wav + - http://www.mediacollege.com/downloads/sound-effects/alien/ + - thunder.wav + - http://www.mediacollege.com/downloads/sound-effects/weather/ + + **To contribute code to this repository you must be [signed up as an official contributor](http://blackberry.github.com/howToContribute.html).** + + +## Contributing Changes + +Please see the [README](https://github.com/blackberry/Samples-for-Java) of the Samples-for-Java repository for instructions on how to add new Samples or make modifications to existing Samples. + + +## Bug Reporting and Feature Requests + +If you find a bug in a Sample, or have an enhancement request, simply file an [Issue](https://github.com/blackberry/Samples-for-Java/issues) for the Sample and send a message (via github messages) to the Sample Author(s) to let them know that you have filed an [Issue](https://github.com/blackberry/Samples-for-Java/issues). + + +## Disclaimer + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/locationdiagnostics/assets/LabelLabel.qml b/locationdiagnostics/assets/LabelLabel.qml new file mode 100644 index 00000000..e6ec59fb --- /dev/null +++ b/locationdiagnostics/assets/LabelLabel.qml @@ -0,0 +1,55 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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 bb.cascades 1.0 + +Container { + property alias label: labelPart.text + property alias text: textPart.text + + layout: StackLayout { + orientation: LayoutOrientation.LeftToRight + } + + Label { + id: labelPart + + layoutProperties: StackLayoutProperties { + spaceQuota: 1 + } + + textStyle { + base: SystemDefaults.TextStyles.BodyText + color: Color.Black + fontStyle: FontStyle.Italic + } + + opacity: 0.7 + } + + Label { + id: textPart + + layoutProperties: StackLayoutProperties { + spaceQuota: 1 + } + + multiline: true + textStyle { + base: SystemDefaults.TextStyles.BodyText + color: Color.Black + } + } +} diff --git a/locationdiagnostics/assets/LocationPage.qml b/locationdiagnostics/assets/LocationPage.qml new file mode 100644 index 00000000..ae3425b0 --- /dev/null +++ b/locationdiagnostics/assets/LocationPage.qml @@ -0,0 +1,243 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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 bb.cascades 1.0 + +Page { +//! [0] + property variant session +//! [0] + + Container { + layout: DockLayout {} + + // The background image + ImageView { + imageSource: "asset:///images/background.png" + } + + Container { + topPadding: 100 + + layout: DockLayout {} + +//! [1] + // Location page + ScrollView { + scrollViewProperties { + scrollMode: ScrollMode.Vertical + } + + visible: (pageSelector.selectedIndex == 0) + + Container { + topPadding: 50 + leftPadding: 50 + rightPadding: 50 + + LabelLabel { + label: qsTr ("timestamp") + text: session ? session.time : "" + } + + Divider {} + + LabelLabel { + label: qsTr ("latitude") + text: session ? session.latitude : "" + } + + LabelLabel { + label: qsTr ("longitude") + text: session ? session.longitude : "" + } + + LabelLabel { + label: qsTr ("altitude") + text: session ? session.altitude : "" + } + + Divider {} + + LabelLabel { + label: qsTr ("direction") + text: session ? session.direction : "" + } + + LabelLabel { + label: qsTr ("ground speed") + text: session ? session.groundSpeed : "" + } + + LabelLabel { + label: qsTr ("vertical speed") + text: session ? session.verticalSpeed : "" + } + + Divider {} + + LabelLabel { + label: qsTr ("magnetic variation") + text: session ? session.magneticVariation : "" + } + + LabelLabel { + label: qsTr ("horizontal accuracy") + text: session ? session.horizontalAccuracy : "" + } + + LabelLabel { + label: qsTr ("vertical accuracy") + text: session ? session.verticalAccuracy : "" + } + + Divider {} + + DropDown { + id: resetModeSelector + + title: qsTr ("Reset Mode") + + Option { + text: qsTr ("Cold") + value: "cold" + selected: true + } + + Option { + text: qsTr ("Warm") + value: "warm" + } + + Option { + text: qsTr ("Hot") + value: "hot" + } + } + + Button { + horizontalAlignment: HorizontalAlignment.Center + + text: qsTr ("Reset") + + onClicked: session.resetSession(resetModeSelector.selectedValue) + } + } + } +//! [1] + + // Satellites page + ScrollView { + scrollViewProperties { + scrollMode: ScrollMode.Vertical + } + + visible: (pageSelector.selectedIndex == 1) + + Container { + topPadding: 30 + leftPadding: 30 + rightPadding: 30 + + TextArea { + textStyle { + base: SystemDefaults.TextStyles.BodyText + fontWeight: FontWeight.Normal + fontFamily: "courier" + } + + editable: false + + backgroundVisible: true + + hintText: qsTr ("Satellite Information") + } + } + } + +//! [2] + // Logs page + ScrollView { + scrollViewProperties { + scrollMode: ScrollMode.Vertical + } + + visible: (pageSelector.selectedIndex == 2) + + Container { + topPadding: 30 + leftPadding: 30 + rightPadding: 30 + + TextArea { + textStyle { + base: SystemDefaults.TextStyles.BodyText + fontWeight: FontWeight.Normal + fontFamily: "courier" + } + + editable: false + + backgroundVisible: true + + hintText: qsTr ("Logs") + text: session ? session.log : "" + } + } + } + } +//! [2] + + Container { + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Top + + leftPadding: 30 + topPadding: 30 + rightPadding: 30 + +//! [3] + SegmentedControl { + id: pageSelector + + Option { + text: qsTr ("Location") + selected: true + } + + Option { + text: qsTr ("Satellites") + } + + Option { + text: qsTr ("Logs") + } + } +//! [3] + } + } + +//! [4] + paneProperties: NavigationPaneProperties { + backButton: ActionItem { + title: qsTr ("Back") + onTriggered: { + session.stopUpdates() + navigationPane.pop() + } + } + } +//! [4] +} diff --git a/locationdiagnostics/assets/ToggleLabelButton.qml b/locationdiagnostics/assets/ToggleLabelButton.qml new file mode 100644 index 00000000..092a3ffa --- /dev/null +++ b/locationdiagnostics/assets/ToggleLabelButton.qml @@ -0,0 +1,50 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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 bb.cascades 1.0 + +Container { + id: root + + property alias text: label.text + property bool checked + + signal checkedChanged(bool checked) + + layout: DockLayout {} + + Label { + id: label + + horizontalAlignment: HorizontalAlignment.Left + verticalAlignment: VerticalAlignment.Center + + textStyle { + base: SystemDefaults.TextStyles.BodyText + fontWeight: FontWeight.Bold + } + } + + ToggleButton { + horizontalAlignment: HorizontalAlignment.Right + verticalAlignment: VerticalAlignment.Center + + checked: root.checked + + onCheckedChanged: { + root.checkedChanged(checked); + } + } +} diff --git a/locationdiagnostics/assets/WarpDrive.qml b/locationdiagnostics/assets/WarpDrive.qml new file mode 100644 index 00000000..5693f81c --- /dev/null +++ b/locationdiagnostics/assets/WarpDrive.qml @@ -0,0 +1,102 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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 bb.cascades 1.0 + +Container { + id: root + + property int frequency: 0 + + signal frequencyChanged(int frequency) + + // The compass + Container { + horizontalAlignment: HorizontalAlignment.Fill + + layout: DockLayout {} + + ImageView { + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Top + + imageSource: "asset:///images/compass_base.png" + } + + ImageView { + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Top + + imageSource: "asset:///images/compass_pointer.png" + animations: [ + FadeTransition { + id: fadeout + fromOpacity: 1 + toOpacity: .5 + duration: root.frequency + 200 + onEnded: { + fadein.play(); + } + }, + FadeTransition { + id: fadein + duration: fadeout.duration + fromOpacity: .5 + toOpacity: 1 + onEnded: { + rotate.play(); + } + }, + RotateTransition { + id: rotate + fromAngleZ: 0 + toAngleZ: 360 + easingCurve: StockCurve.CubicOut + duration: fadeout.duration + onEnded: { + fadeout.play(); + } + } + ] + } + + onCreationCompleted: { + fadeout.play(); + + // The animation speed at start up should be taken from the stored value of the slider. + fadeout.duration = root.frequency + 200; + } + } + + Label { + horizontalAlignment: HorizontalAlignment.Center + + text: (root.frequency == 0 ? qsTr ("Frequency") : qsTr ("Frequency: %1s").arg(root.frequency)) + textStyle { + base: SystemDefaults.TextStyles.BodyText + fontWeight: FontWeight.Bold + } + } + + Slider { + horizontalAlignment: HorizontalAlignment.Center + + fromValue: 1 + toValue: 500 + value: root.frequency + + onValueChanged: { + root.frequencyChanged(Math.floor(value)) + } + } +} diff --git a/locationdiagnostics/assets/images/background.png b/locationdiagnostics/assets/images/background.png new file mode 100644 index 0000000000000000000000000000000000000000..5073cea9197ddc5181298f173cda2c59032da5bd GIT binary patch literal 22540 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 o!1X43nPDqhL0KZw^TU5;Z*gZ2iSLY?K6K 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 GCH@C@t>AwE literal 0 HcmV?d00001 diff --git a/locationdiagnostics/assets/images/compass_pointer.png b/locationdiagnostics/assets/images/compass_pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b8657af6161871f1122207c3198d2b28787578 GIT binary patch literal 5297 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 literal 0 HcmV?d00001 diff --git a/locationdiagnostics/assets/images/pin.png b/locationdiagnostics/assets/images/pin.png new file mode 100644 index 0000000000000000000000000000000000000000..dff2661c4b9bd8ea329b71bf33b7a5a7b7a35b44 GIT binary patch literal 5486 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 + + + + + + + com.example.bb10samples.geo.locationdiagnostics + + + locationdiagnostics + + + 1.0.0 + + + 1 + + + + + + + + + + + Example Inc. + The locationdiagnostics application + + icon.png + + + + + + + portrait + false + false + + + + core.games + + armle-v7 + locationdiagnostics + + + armle-v7 + locationdiagnostics + + + armle-v7 + locationdiagnostics + + + x86 + locationdiagnostics + + + + + assets + + + + + + + + icon.png + + + run_native + read_geolocation + access_internet + run_when_backgrounded + play_audio + + + + + + + + + + + + + + diff --git a/locationdiagnostics/device-assets.xml b/locationdiagnostics/device-assets.xml new file mode 100644 index 00000000..f90448b3 --- /dev/null +++ b/locationdiagnostics/device-assets.xml @@ -0,0 +1,4 @@ + + + + diff --git a/locationdiagnostics/icon.png b/locationdiagnostics/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc8b017b094ad3d9fcc2960bd676cae039e10f4 GIT binary patch literal 12769 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 literal 0 HcmV?d00001 diff --git a/locationdiagnostics/locationdiagnostics.pro b/locationdiagnostics/locationdiagnostics.pro new file mode 100644 index 00000000..503c0ff3 --- /dev/null +++ b/locationdiagnostics/locationdiagnostics.pro @@ -0,0 +1,51 @@ +TEMPLATE = app +TARGET = locationdiagnostics + +CONFIG += qt warn_on debug_and_release cascades + +INCLUDEPATH += ../src +SOURCES += ../src/*.cpp +HEADERS += ../src/*.hpp ../src/*.h +LIBS += -lQtLocationSubset -lbbmultimedia -lmmrndclient -lasound + +lupdate_inclusion { + SOURCES += ../assets/*.qml +} + +device { + CONFIG(release, debug|release) { + DESTDIR = o.le-v7 + } + CONFIG(debug, debug|release) { + DESTDIR = o.le-v7-g + } +} + +simulator { + CONFIG(release, debug|release) { + DESTDIR = o + } + CONFIG(debug, debug|release) { + DESTDIR = o-g + } +} + +OBJECTS_DIR = $${DESTDIR}/.obj +MOC_DIR = $${DESTDIR}/.moc +RCC_DIR = $${DESTDIR}/.rcc +UI_DIR = $${DESTDIR}/.ui + +suredelete.target = sureclean +suredelete.commands = $(DEL_FILE) $${MOC_DIR}/*; $(DEL_FILE) $${RCC_DIR}/*; $(DEL_FILE) $${UI_DIR}/* +suredelete.depends = distclean + +QMAKE_EXTRA_TARGETS += suredelete + +TRANSLATIONS = \ + $${TARGET}_en_GB.ts \ + $${TARGET}_fr.ts \ + $${TARGET}_it.ts \ + $${TARGET}_de.ts \ + $${TARGET}_es.ts \ + $${TARGET}.ts + diff --git a/locationdiagnostics/readme.txt b/locationdiagnostics/readme.txt new file mode 100644 index 00000000..1a0eabe6 --- /dev/null +++ b/locationdiagnostics/readme.txt @@ -0,0 +1,35 @@ +Location Diagnostics + +======================================================================== +Sample Description. + +The Notifications example demonstrates how use the geo location information +to determine the current position of the device. + +You will learn how to: +- Use the QGeoPositionInfoSource and QGeoSatelliteInfoSource classes +- Separate the business logic from the UI +- Create property bindings + +======================================================================== +Requirements: + +BlackBerry 10 Native SDK Beta 3 + +======================================================================== +Running the example: + +1. Clone the Sample repository. +2. Launch BlackBerry 10 Native SDK Beta 3, and from the File menu, select Import. +3. Expand General, and select Existing Projects into Workspace. Click Next. +4. Browse to the location of your sample directory, and then click OK. +5. The sample project should display in the Projects section. + Click Finish to import the project into your workspace. +6. In the Project Explorer pane, Right-click the project (for example hellocascades) + and select Build Project. +7. In the Project Explorer pane, Right-click the project (for example hellocascades) + and select Run As > BlackBerry C/C++ Application. +8. The application will now install and launch on your device if not you might + have to set up your environment: + http://developer.blackberry.com/cascades/documentation/getting_started/setting_up.html + diff --git a/locationdiagnostics/src/LocationDiagnostics.cpp b/locationdiagnostics/src/LocationDiagnostics.cpp new file mode 100644 index 00000000..a4ed2a92 --- /dev/null +++ b/locationdiagnostics/src/LocationDiagnostics.cpp @@ -0,0 +1,245 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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. +*/ + +#include "LocationDiagnostics.hpp" + +#include "LocationSession.hpp" + +#include + +//! [0] +LocationDiagnostics::LocationDiagnostics(QObject *parent) + : QObject(parent) +{ + // Load default values from persistent storage + QSettings settings; + m_positionMethod = settings.value("positionMethod", "all").toString(); + m_assistanceMode = settings.value("assistanceMode", "password").toString(); + m_frequency = settings.value("frequency", "1").toInt(); + m_useSound = settings.value("useSound", true).toBool(); + m_backgroundMode = settings.value("backgroundMode", true).toBool(); +} +//! [0] + +//! [1] +LocationSession* LocationDiagnostics::createLocationSession(bool trackingMode) +{ + // Create a new location session + LocationSession* session = new LocationSession(this, true); + + // Configure the session according to the property values + session->setSoundEnabled(m_useSound); + + if (!session->positionSource()) + return session; + + if (m_positionMethod == QLatin1String("all")) { + session->positionSource()->setPreferredPositioningMethods(QGeoPositionInfoSource::AllPositioningMethods); + } else if (m_positionMethod == QLatin1String("nonSatellite")) { + session->positionSource()->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); + } else if (m_positionMethod == QLatin1String("satellite")) { + session->positionSource()->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods); + } else if (m_positionMethod == QLatin1String("gps")) { + session->positionSource()->setProperty("provider", "gnss"); + session->positionSource()->setProperty("fixType", "gps_autonomous"); + } else if (m_positionMethod == QLatin1String("cellular")) { + session->positionSource()->setProperty("provider", "network"); + session->positionSource()->setProperty("fixType", "cellsite"); + } else if (m_positionMethod == QLatin1String("wifi")) { + session->positionSource()->setProperty("provider", "network"); + session->positionSource()->setProperty("fixType", "wifi"); + } else if (m_positionMethod == QLatin1String("msb")) { + session->positionSource()->setProperty("provider", "gnss"); + session->positionSource()->setProperty("fixType", "gps_ms_based"); + } else if (m_positionMethod == QLatin1String("msa")) { + session->positionSource()->setProperty("provider", "gnss"); + session->positionSource()->setProperty("fixType", "gps_ms_assisted"); + } + + if (m_assistanceMode == QLatin1String("pde")) { + if (!m_pdeUrl.isEmpty()) + session->positionSource()->setProperty("qtaPDEURL", m_pdeUrl); + } else if (m_assistanceMode == QLatin1String("slp")) { + if (!m_slpUrl.isEmpty()) + session->positionSource()->setProperty("slpURL", m_slpUrl); + } else if (m_assistanceMode == QLatin1String("password")) { + if (!m_appId.isEmpty()) + session->positionSource()->setProperty("qtaAppID", m_appId); + + if (!m_password.isEmpty()) + session->positionSource()->setProperty("qtaAppPassword", m_password); + } + + session->positionSource()->setUpdateInterval(m_frequency * 1000); + session->positionSource()->setProperty("canRunInBackground", m_backgroundMode); + + // Activate the session + if (trackingMode) { + session->startUpdates(); + } else { + session->requestUpdate(); + } + + return session; +} +//! [1] + +//! [2] +QString LocationDiagnostics::positionMethod() const +{ + return m_positionMethod; +} + +void LocationDiagnostics::setPositionMethod(const QString &method) +{ + if (m_positionMethod == method) + return; + + m_positionMethod = method; + + QSettings settings; + settings.setValue("positionMethod", m_positionMethod); + + emit positionMethodChanged(); +} +//! [2] + +QString LocationDiagnostics::assistanceMode() const +{ + return m_assistanceMode; +} + +void LocationDiagnostics::setAssistanceMode(const QString &mode) +{ + if (m_assistanceMode == mode) + return; + + m_assistanceMode = mode; + + QSettings settings; + settings.setValue("assistanceMode", m_assistanceMode); + + emit assistanceModeChanged(); +} + +QString LocationDiagnostics::pdeUrl() const +{ + return m_pdeUrl; +} + +void LocationDiagnostics::setPdeUrl(const QString &url) +{ + if (m_pdeUrl == url) + return; + + m_pdeUrl = url; + emit pdeUrlChanged(); +} + +QString LocationDiagnostics::slpUrl() const +{ + return m_slpUrl; +} + +void LocationDiagnostics::setSlpUrl(const QString &url) +{ + if (m_slpUrl == url) + return; + + m_slpUrl = url; + emit slpUrlChanged(); +} + +QString LocationDiagnostics::appId() const +{ + return m_appId; +} + +void LocationDiagnostics::setAppId(const QString &appId) +{ + if (m_appId == appId) + return; + + m_appId = appId; + emit appIdChanged(); +} + +QString LocationDiagnostics::password() const +{ + return m_password; +} + +void LocationDiagnostics::setPassword(const QString &password) +{ + if (m_password == password) + return; + + m_password = password; + emit passwordChanged(); +} + +int LocationDiagnostics::frequency() const +{ + return m_frequency; +} + +void LocationDiagnostics::setFrequency(int frequency) +{ + if (m_frequency == frequency) + return; + + m_frequency = frequency; + + QSettings settings; + settings.setValue("frequency", m_frequency); + + emit frequencyChanged(); +} + +bool LocationDiagnostics::useSound() const +{ + return m_useSound; +} + +void LocationDiagnostics::setUseSound(bool sound) +{ + if (m_useSound == sound) + return; + + m_useSound = sound; + + QSettings settings; + settings.setValue("useSound", m_useSound); + + emit useSoundChanged(); +} + +bool LocationDiagnostics::backgroundMode() const +{ + return m_backgroundMode; +} + +void LocationDiagnostics::setBackgroundMode(bool mode) +{ + if (m_backgroundMode == mode) + return; + + m_backgroundMode = mode; + + QSettings settings; + settings.setValue("backgroundMode", m_backgroundMode); + + emit backgroundModeChanged(); +} diff --git a/locationdiagnostics/src/LocationDiagnostics.hpp b/locationdiagnostics/src/LocationDiagnostics.hpp new file mode 100644 index 00000000..26260ca6 --- /dev/null +++ b/locationdiagnostics/src/LocationDiagnostics.hpp @@ -0,0 +1,95 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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. +*/ + +#ifndef LOCATIONDIAGNOSTICS_HPP +#define LOCATIONDIAGNOSTICS_HPP + +#include + +class LocationSession; + +//! [0] +class LocationDiagnostics : public QObject +{ + Q_OBJECT + + // The properties to configure the geo location sources + Q_PROPERTY(QString positionMethod READ positionMethod WRITE setPositionMethod NOTIFY positionMethodChanged) + Q_PROPERTY(QString assistanceMode READ assistanceMode WRITE setAssistanceMode NOTIFY assistanceModeChanged) + + Q_PROPERTY(QString pdeUrl READ pdeUrl WRITE setPdeUrl NOTIFY pdeUrlChanged) + Q_PROPERTY(QString slpUrl READ slpUrl WRITE setSlpUrl NOTIFY slpUrlChanged) + Q_PROPERTY(QString appId READ appId WRITE setAppId NOTIFY appIdChanged) + Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) + + Q_PROPERTY(int frequency READ frequency WRITE setFrequency NOTIFY frequencyChanged) + Q_PROPERTY(bool useSound READ useSound WRITE setUseSound NOTIFY useSoundChanged) + Q_PROPERTY(bool backgroundMode READ backgroundMode WRITE setBackgroundMode NOTIFY backgroundModeChanged) + +public: + LocationDiagnostics(QObject *parent = 0); + + /** + * This method creates a new location session. + */ + Q_INVOKABLE LocationSession* createLocationSession(bool trackingMode); + +Q_SIGNALS: + // The change notification signals of the properties + void positionMethodChanged(); + void assistanceModeChanged(); + void pdeUrlChanged(); + void slpUrlChanged(); + void appIdChanged(); + void passwordChanged(); + void frequencyChanged(); + void useSoundChanged(); + void backgroundModeChanged(); + +private: + // The accessor methods of the properties + QString positionMethod() const; + void setPositionMethod(const QString &method); + QString assistanceMode() const; + void setAssistanceMode(const QString &mode); + QString pdeUrl() const; + void setPdeUrl(const QString &url); + QString slpUrl() const; + void setSlpUrl(const QString &url); + QString appId() const; + void setAppId(const QString &appId); + QString password() const; + void setPassword(const QString &password); + int frequency() const; + void setFrequency(int frequency); + bool useSound() const; + void setUseSound(bool sound); + bool backgroundMode() const; + void setBackgroundMode(bool mode); + + // The property values + QString m_positionMethod; + QString m_assistanceMode; + QString m_pdeUrl; + QString m_slpUrl; + QString m_appId; + QString m_password; + int m_frequency; + bool m_useSound; + bool m_backgroundMode; +}; +//! [0] + +#endif diff --git a/locationdiagnostics/src/LocationSession.cpp b/locationdiagnostics/src/LocationSession.cpp new file mode 100644 index 00000000..c826ac47 --- /dev/null +++ b/locationdiagnostics/src/LocationSession.cpp @@ -0,0 +1,213 @@ +/* Copyright (c) 2012 Research In Motion Limited. + * + * 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. + */ + +#include "LocationSession.hpp" + +#include + +#include + +using namespace bb::multimedia; + +//! [0] +LocationSession::LocationSession(QObject* parent, bool satInfo) + : QObject(parent) + , m_soundEnabled(false) + , m_positionSource(QGeoPositionInfoSource::createDefaultSource(this)) +{ + if (m_positionSource) { + connect(m_positionSource, SIGNAL(positionUpdated(const QGeoPositionInfo &)), this, SLOT(positionUpdated(const QGeoPositionInfo &))); + connect(m_positionSource, SIGNAL(updateTimeout()), this, SLOT(positionUpdateTimeout())); + + log(tr("Initialized QGeoPositionInfoSource")); + } else { + log(tr("Failed to initialized QGeoPositionInfoSource")); + } + + if (satInfo) { + m_satelliteSource = QGeoSatelliteInfoSource::createDefaultSource(this); + + if (m_satelliteSource) { + connect(m_satelliteSource, SIGNAL(satellitesInUseUpdated(const QList &)), this, SLOT(satellitesInUseUpdated(const QList &))); + connect(m_satelliteSource, SIGNAL(satellitesInViewUpdated(const QList &)), this, SLOT(satellitesInViewUpdated(const QList &))); + + log(tr("Initialized QGeoSatelliteInfoSource")); + } else { + log(tr("Failed to initialized QGeoSatelliteInfoSource")); + } + } + + m_latitude = m_longitude = m_altitude = m_direction = m_horizontalAccuracy = m_verticalAccuracy = m_magneticVariation = tr("--"); + m_time = tr("-/-/- -:-"); + m_groundSpeed = tr("-- km/h"); + m_verticalSpeed = tr("-- km/h"); +} +//! [0] + +//! [1] +void LocationSession::startUpdates() +{ + if (m_positionSource) { + m_positionSource->startUpdates(); + log(tr("Updates started")); + } +} +//! [1] + +//! [2] +void LocationSession::requestUpdate() +{ + if (m_positionSource) { + m_positionSource->requestUpdate(120000); + log(tr("Update requested")); + } +} +//! [2] + +//! [3] +void LocationSession::stopUpdates() +{ + if (m_positionSource) { + m_positionSource->stopUpdates(); + log(tr("Updates stopped")); + } + + deleteLater(); +} +//! [3] + +//! [4] +void LocationSession::resetSession(const QString &type) +{ + if (m_soundEnabled) + SystemSound::play(SystemSound::GeneralNotification); + + if (m_positionSource) { + m_positionSource->stopUpdates(); + m_positionSource->setProperty("reset", type); + m_positionSource->startUpdates(); + log(tr("%1 RESET").arg(type)); + } +} +//! [4] + +//! [5] +void LocationSession::positionUpdated(const QGeoPositionInfo& pos) +{ + if (m_soundEnabled) + SystemSound::play(SystemSound::GeneralNotification); + + m_latitude = QString::number(pos.coordinate().latitude()); + m_longitude = QString::number(pos.coordinate().longitude()); + m_altitude = QString::number(pos.coordinate().altitude()); + m_time = pos.timestamp().toString(); + m_direction = QString::number(pos.attribute(QGeoPositionInfo::Direction)); + m_groundSpeed = QString::number(pos.attribute(QGeoPositionInfo::GroundSpeed)); + m_verticalSpeed = QString::number(pos.attribute(QGeoPositionInfo::VerticalSpeed)); + m_horizontalAccuracy = QString::number(pos.attribute(QGeoPositionInfo::HorizontalAccuracy)); + m_verticalAccuracy = QString::number(pos.attribute(QGeoPositionInfo::VerticalAccuracy)); + m_magneticVariation = QString::number(pos.attribute(QGeoPositionInfo::MagneticVariation)); + + emit dataChanged(); + + log(tr("update")); +} +//! [5] + +QGeoPositionInfoSource* LocationSession::positionSource() const +{ + return m_positionSource; +} + +void LocationSession::positionUpdateTimeout() +{ + log(tr("positionUpdateTimeout() received")); +} + +void LocationSession::satellitesInUseUpdated(const QList&) +{ + log(tr("satellitesInUseUpdated received")); +} + +void LocationSession::setSoundEnabled(bool enabled) +{ + m_soundEnabled = enabled; +} + +void LocationSession::satellitesInViewUpdated(const QList&) +{ + log(tr("satellitesInViewUpdated received")); +} + +void LocationSession::log(const QString &msg) +{ + m_log += msg + QLatin1String("\n"); + emit logChanged(); +} + +QString LocationSession::latitude() const +{ + return m_latitude; +} + +QString LocationSession::longitude() const +{ + return m_longitude; +} + +QString LocationSession::altitude() const +{ + return m_altitude; +} + +QString LocationSession::time() const +{ + return m_time; +} + +QString LocationSession::direction() const +{ + return m_direction; +} + +QString LocationSession::groundSpeed() const +{ + return m_groundSpeed; +} + +QString LocationSession::verticalSpeed() const +{ + return m_verticalSpeed; +} + +QString LocationSession::horizontalAccuracy() const +{ + return m_horizontalAccuracy; +} + +QString LocationSession::verticalAccuracy() const +{ + return m_verticalAccuracy; +} + +QString LocationSession::magneticVariation() const +{ + return m_magneticVariation; +} + +QString LocationSession::log() const +{ + return m_log; +} diff --git a/locationdiagnostics/src/LocationSession.hpp b/locationdiagnostics/src/LocationSession.hpp new file mode 100644 index 00000000..bbb50a0f --- /dev/null +++ b/locationdiagnostics/src/LocationSession.hpp @@ -0,0 +1,129 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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. +*/ + +#ifndef LOCATIONSESSION_HPP +#define LOCATIONSESSION_HPP + +#include +#include +#include +#include + +#include + +using namespace QtMobilitySubset; + +/** + * @short A helper class that encapsulates the retrieval of location information. + */ +//! [0] +class LocationSession: public QObject +{ + Q_OBJECT + + // The properties that provide the location information to the UI + Q_PROPERTY(QString latitude READ latitude NOTIFY dataChanged) + Q_PROPERTY(QString longitude READ longitude NOTIFY dataChanged) + Q_PROPERTY(QString altitude READ altitude NOTIFY dataChanged) + Q_PROPERTY(QString time READ time NOTIFY dataChanged) + Q_PROPERTY(QString direction READ direction NOTIFY dataChanged) + Q_PROPERTY(QString groundSpeed READ groundSpeed NOTIFY dataChanged) + Q_PROPERTY(QString verticalSpeed READ verticalSpeed NOTIFY dataChanged) + Q_PROPERTY(QString horizontalAccuracy READ horizontalAccuracy NOTIFY dataChanged) + Q_PROPERTY(QString verticalAccuracy READ verticalAccuracy NOTIFY dataChanged) + Q_PROPERTY(QString magneticVariation READ magneticVariation NOTIFY dataChanged) + Q_PROPERTY(QString log READ log NOTIFY logChanged) + +public: + LocationSession(QObject* parent, bool satInfo); + + // This method is called to trigger the continious retrieval of location information + void startUpdates(); + + // This method is called to trigger an one-time retrieval of location information + void requestUpdate(); + + // The accessor method for the internal geo position object + QGeoPositionInfoSource* positionSource() const; + + // Sets whether a sound should be played on retrieval of new location information + void setSoundEnabled(bool enabled); + + // This method is called to stop the retrieval of location information + Q_INVOKABLE void stopUpdates(); + + // This method is called to reset the internal retrieval engine + Q_INVOKABLE void resetSession(const QString &type); + +Q_SIGNALS: + // The change notification signals of the properties + void dataChanged(); + void logChanged(); + +private Q_SLOTS: + // This slot is invoked whenever new location information are retrieved + void positionUpdated(const QGeoPositionInfo & pos); + + // This slot is invoked whenever a timeout happend while retrieving location information + void positionUpdateTimeout(); + + // This slot is invoked whenever new information about the used satellites are retrieved + void satellitesInUseUpdated(const QList & satellites); + + // This slot is invoked whenever new information about the in-view satellites are retrieved + void satellitesInViewUpdated(const QList & satellites); + +private: + // A helper message to log events + void log(const QString &msg); + + // The accessor methods of the properties + QString latitude() const; + QString longitude() const; + QString altitude() const; + QString time() const; + QString direction() const; + QString groundSpeed() const; + QString verticalSpeed() const; + QString horizontalAccuracy() const; + QString verticalAccuracy() const; + QString magneticVariation() const; + QString log() const; + + // The flag for sound usage + bool m_soundEnabled; + + // The central object to retrieve location information + QGeoPositionInfoSource *m_positionSource; + + // The central object to retrieve satellite information + QGeoSatelliteInfoSource *m_satelliteSource; + + // The property values + QString m_latitude; + QString m_longitude; + QString m_altitude; + QString m_time; + QString m_direction; + QString m_groundSpeed; + QString m_verticalSpeed; + QString m_horizontalAccuracy; + QString m_verticalAccuracy; + QString m_magneticVariation; + QString m_log; +}; +//! [0] + +#endif diff --git a/locationdiagnostics/src/main.cpp b/locationdiagnostics/src/main.cpp new file mode 100644 index 00000000..2a92da72 --- /dev/null +++ b/locationdiagnostics/src/main.cpp @@ -0,0 +1,51 @@ +/* Copyright (c) 2012 Research In Motion Limited. +* +* 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. +*/ + +#include "LocationDiagnostics.hpp" +#include "LocationSession.hpp" + +#include +#include +#include + +using namespace bb::cascades; + +int main(int argc, char **argv) +{ + // Register custom type at QML runtime environment + qmlRegisterType(); + + Application app(argc, argv); + + // We set up the application Organization and name, this is used by QSettings + // when saving values to the persistent store. + app.setOrganizationName("Shadid Haque"); + app.setApplicationName("Location Diagnostics"); + + // Create the locationDiagnostics object + LocationDiagnostics locationDiagnostics; + + // Load the UI description from main.qml + QmlDocument *qml = QmlDocument::create("asset:///main.qml"); + + // Make the LocationDiagnostics object available to the UI as context property + qml->setContextProperty("_locationDiagnostics", &locationDiagnostics); + + // Create the application scene + AbstractPane *appPage = qml->createRootObject(); + Application::instance()->setScene(appPage); + + return Application::exec(); +} diff --git a/locationdiagnostics/translations/Makefile b/locationdiagnostics/translations/Makefile new file mode 100644 index 00000000..e8dc0f60 --- /dev/null +++ b/locationdiagnostics/translations/Makefile @@ -0,0 +1,12 @@ +QMAKE_TARGET = locationdiagnostics +LUPDATE = $(QNX_HOST)/usr/bin/lupdate +LRELEASE = $(QNX_HOST)/usr/bin/lrelease + +update: $(QMAKE_TARGET).pro FORCE + $(LUPDATE) $(QMAKE_TARGET).pro + +release: $(QMAKE_TARGET).pro $(QMAKE_TARGET).ts + $(LRELEASE) $(QMAKE_TARGET).pro + +FORCE: + diff --git a/locationdiagnostics/translations/locationdiagnostics.pro b/locationdiagnostics/translations/locationdiagnostics.pro new file mode 100644 index 00000000..1f029b99 --- /dev/null +++ b/locationdiagnostics/translations/locationdiagnostics.pro @@ -0,0 +1 @@ +include (../locationdiagnostics.pro)