Compare commits
130 Commits
v4.0-DEV16
...
release_2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c436ff4305 | ||
|
|
abb7ab9869 | ||
|
|
5d5054d64d | ||
|
|
d70cf5aae4 | ||
|
|
6e0f769b26 | ||
|
|
86fa671858 | ||
|
|
7fcc83f62c | ||
|
|
fff37e524c | ||
|
|
ab03dd3637 | ||
|
|
1ad2228b84 | ||
|
|
57fbf65b23 | ||
|
|
d6ba7b0cb3 | ||
|
|
3ad5401b0b | ||
|
|
d9e54c2be0 | ||
|
|
eeadc688bf | ||
|
|
ed9baf6fa3 | ||
|
|
3115bec92f | ||
|
|
2294b85e3b | ||
|
|
d1a1d56d6f | ||
|
|
cd576a4e27 | ||
|
|
03a221c558 | ||
|
|
9ed9f7a6d0 | ||
|
|
a78bd5d919 | ||
|
|
e4ece50af2 | ||
|
|
7611a44a54 | ||
|
|
8e43eb31aa | ||
|
|
a3f643e11c | ||
|
|
d348344e0e | ||
|
|
7b0fa7680d | ||
|
|
565ba3f219 | ||
|
|
db2b68bd9d | ||
|
|
d746dde5a3 | ||
|
|
ac43bccd6f | ||
|
|
ac2e202af4 | ||
|
|
b107c4a1e6 | ||
|
|
dcb441b7e5 | ||
|
|
dae942a2f7 | ||
|
|
97cedad044 | ||
|
|
8fec614a5e | ||
|
|
5463be1a2f | ||
|
|
e2e063015e | ||
|
|
7b7ff9622e | ||
|
|
cd6b86c3eb | ||
|
|
b01c007ed2 | ||
|
|
acdde3e02a | ||
|
|
6b07997791 | ||
|
|
440a0b8404 | ||
|
|
d3f16313bb | ||
|
|
fa0aa3fd75 | ||
|
|
0d811ba4ba | ||
|
|
9dff6e0cf6 | ||
|
|
b04e308d9f | ||
|
|
63fe2fb443 | ||
|
|
34001d30b5 | ||
|
|
769fd633e2 | ||
|
|
eb456cee63 | ||
|
|
afe4710bf5 | ||
|
|
b977abffcc | ||
|
|
8e1ec66820 | ||
|
|
adc8430e0e | ||
|
|
65109d95fd | ||
|
|
189f11d80f | ||
|
|
183564d1ea | ||
|
|
076190161f | ||
|
|
f43a71f3a4 | ||
|
|
c383ee75fb | ||
|
|
e0711b4bb7 | ||
|
|
5ce1617667 | ||
|
|
0091defb6c | ||
|
|
3d93c0ca52 | ||
|
|
8fcbe81daf | ||
|
|
524ab81a08 | ||
|
|
ad9a76a172 | ||
|
|
5b838d99c2 | ||
|
|
b7bfb98dc8 | ||
|
|
7352245a91 | ||
|
|
bfa68faeda | ||
|
|
95d6a40ecd | ||
|
|
3a4b782a16 | ||
|
|
7331775e40 | ||
|
|
0c7abe9755 | ||
|
|
9ab5fb26e2 | ||
|
|
a641ec7e0a | ||
|
|
c513a47e07 | ||
|
|
a562d2f73b | ||
|
|
dfbb1c29f8 | ||
|
|
b0cca3c2fa | ||
|
|
8c2eac427b | ||
|
|
880c97c639 | ||
|
|
614f267a5e | ||
|
|
14f7924c28 | ||
|
|
7a501a9699 | ||
|
|
f1238fcce6 | ||
|
|
4784408106 | ||
|
|
182208c145 | ||
|
|
00959bed8c | ||
|
|
57c7260a19 | ||
|
|
a70cf8ebc0 | ||
|
|
0f9b82a750 | ||
|
|
8cca3c088a | ||
|
|
d84ffec0a6 | ||
|
|
20477e1670 | ||
|
|
610b2ea2d0 | ||
|
|
e7a7803f09 | ||
|
|
c6a376b89f | ||
|
|
65c4d89890 | ||
|
|
1674558dbb | ||
|
|
ee79a86c1f | ||
|
|
92897a966b | ||
|
|
ca1c4def3a | ||
|
|
05346eda24 | ||
|
|
bea79092ab | ||
|
|
e478c24650 | ||
|
|
96bb21d04d | ||
|
|
65615295c2 | ||
|
|
b21d24039c | ||
|
|
c25f920062 | ||
|
|
7f2b6dd793 | ||
|
|
148390ea61 | ||
|
|
c525a36ea5 | ||
|
|
627595175f | ||
|
|
09365a8b24 | ||
|
|
8ae7a3f738 | ||
|
|
2ef0533ec3 | ||
|
|
b7632a4173 | ||
|
|
29fa978b8f | ||
|
|
1fbaeae611 | ||
|
|
d91337e18d | ||
|
|
88967c1588 | ||
|
|
dd7af03785 |
43
.gitignore
vendored
@@ -1,49 +1,8 @@
|
||||
Makefile
|
||||
.qmake.stash
|
||||
*.o
|
||||
*.so.*
|
||||
*.so
|
||||
*.a
|
||||
*~
|
||||
*.orig
|
||||
*.rej
|
||||
|
||||
# old skool
|
||||
.svn
|
||||
*.pri
|
||||
*.prl
|
||||
|
||||
# osx noise
|
||||
.DS_Store
|
||||
profile
|
||||
|
||||
# qmake Xcode generator side-effects
|
||||
*.xcodeproj
|
||||
xcshareddata/
|
||||
*.xcworkspace
|
||||
*.pbxproj
|
||||
*.mak
|
||||
*.build/
|
||||
|
||||
moc_*
|
||||
moc/
|
||||
obj/
|
||||
lib/
|
||||
bin/
|
||||
plugins/
|
||||
resources/
|
||||
src/debug/
|
||||
src/release/
|
||||
|
||||
qwt/src/debug/
|
||||
qwt/src/release/
|
||||
src/Makefile.Debug
|
||||
src/Makefile.Release
|
||||
src/object_script.GoldenCheetah.Debug
|
||||
src/object_script.GoldenCheetah.Release
|
||||
qwt/src/object_script.libqwt.Release
|
||||
qwt/src/object_script.libqwtd.Debug
|
||||
qwt/src/Makefile.Release
|
||||
qwt/src/Makefile.Debug
|
||||
qwt/textengines/mathml/debug/
|
||||
qwt/textengines/mathml/release/
|
||||
build.pro.user
|
||||
|
||||
120
.travis.yml
@@ -1,120 +0,0 @@
|
||||
branches:
|
||||
- master
|
||||
language:
|
||||
- objective-c
|
||||
compiler:
|
||||
- clang
|
||||
- gcc
|
||||
env:
|
||||
matrix:
|
||||
## Test 4.8 or 5.4.2
|
||||
- BRANCH=master QT=qt4 QT_PATH=qt
|
||||
- BRANCH=master QT=qt5 QT_PATH=qt5
|
||||
global:
|
||||
- secure: iqYW7f3//ZkMVzeCEarYn0S0DqKjFU9juBh0KF6WTlUsKX902Jtsk7dFoJlNDYBf63HLgV+wW2Hc6MxI9sGiUkom0gY9/To/aeGIJFGEX2sLm/e0Ok3qN521FA0Q/OiCFsD0RC6J+yrHxzI+rf8Z1rujceUsz2KgsrfAjYYv+BY=
|
||||
- secure: C6f58PXwvvHeVOjCLbyDRjgyF0tk+bXjCNUDur8VJLhJEGNdnrt+rH+d3azYaX0n348ZnQZ14as4M4rHjN1A/3DRbdUdOS7PQZrkj/n363ck1tvYOG/tzYqkEcVoQyjIJ7ZoTuBXDQry/VJmLxQjM0glTa2upNFHMOMwqZNkF+I=
|
||||
- secure: mgf181ok4rJTHxAdSaeIb/OzUx7PQc6UjJYfhJQcZDjN1Nou+Um6OHpnooMHeEq0CdGuLSiv2xVmuQnRjI5MfG5re/a3l39hSzi9tPLWi1y7uOLCtQFooJw3H+LhiKZcgAtEnkTmEhUCEu5uZ7cp4lWhrQZWCR5mCDNtJrGHjiw=
|
||||
- secure: UkW6SpgeACb6enGZADTAtPPRe23Tffne/SRQoBsZ3kGbKzgv8kTCLY0G5N71B1xEGdLB/36piOa0yji2SMW1jbflxR7tdOsiNpfd9R5qYqWVZRulY0qite8ZCwU5dqgy87pp4ECC1hNSOTq17aa4Sc4G4egg9AOy8cntLBTtxJA=
|
||||
- secure: rb/MKPHEK8yOK5uYpXq2o+MQ7h65ft+c/xE9XmLFk1jLnK0oxe6+KeoSFlQ0n5UwLSsHrytMXVaUHex6EEt0TheXFlohi7BcNFWRWXr+wLucuaPjMnU49VErrSigjJ5VW/rcR7fORmnDwn5y06r3Rer9SC1hImCxf/pqF8hFZps=
|
||||
- secure: FXJzm98lwbc1R2eh9/CvVReVRHEPLDm+sCRjiV9HJgeCveIUauLasp9Skamz0c6OKLmkjLY8JERPT491ZgCG8YcQ9x1bM8HGbmRqnn9xSUxINIRzVmyTiLMBoT/ibHHeFjFpyiGfukOAkHwMNNsrSrbaekhiJuekaXo7iTwYQB0=
|
||||
before_install:
|
||||
- date
|
||||
- brew update
|
||||
##- sh travis/install-qt.sh
|
||||
- brew install $QT
|
||||
- brew install libical
|
||||
- brew install libusb libusb-compat
|
||||
- brew install srmio
|
||||
- brew install libsamplerate
|
||||
## Disable KML for now
|
||||
##- brew install --HEAD travis/libkml.rb
|
||||
- sudo chmod -R +w /usr/local
|
||||
- curl -O http://www.ftdichip.com/Drivers/D2XX/MacOSX/D2XX1.2.2.dmg
|
||||
- git clone --depth 1 https://github.com/sintegrial/qwtplot3d.git qwtplot3d
|
||||
- cd qwtplot3d
|
||||
- CC=clang CXX=clang++ /usr/local/opt/$QT_PATH/bin/qmake -makefile -recursive QMAKE_CXXFLAGS_WARN_ON+=-Wno-unused-private-field
|
||||
- CC=clang CXX=clang++ make -j2
|
||||
- cd ..
|
||||
- git clone --branch 0.98 https://github.com/kypeli/kQOAuth.git kQOAuth-0.98
|
||||
- cd kQOAuth-0.98
|
||||
- CC=clang CXX=clang++ /usr/local/opt/$QT_PATH/bin/qmake -makefile -recursive QMAKE_CXXFLAGS_WARN_ON+=-Wno-unused-private-field
|
||||
- CC=clang CXX=clang++ make -j2 qmake_all
|
||||
- CC=clang CXX=clang++ sudo make install
|
||||
- cd ..
|
||||
- hdiutil mount D2XX1.2.2.dmg
|
||||
before_script:
|
||||
- mkdir D2XX
|
||||
- cp /Volumes/release/D2XX/Object/10.5-10.7/x86_64/libftd2xx.1.2.2.dylib D2XX
|
||||
- sudo cp /Volumes/release/D2XX/Object/10.5-10.7/x86_64/libftd2xx.1.2.2.dylib /usr/local/lib
|
||||
- cp /Volumes/release/D2XX/bin/*.h D2XX
|
||||
- sed -i "" "s|libftd2xx.dylib|@executable_path/../Frameworks/libftd2xx.1.2.2.dylib|"
|
||||
src/D2XX.cpp
|
||||
- cp qwt/qwtconfig.pri.in qwt/qwtconfig.pri
|
||||
- cp src/gcconfig.pri.in src/gcconfig.pri
|
||||
- /usr/local/opt/$QT_PATH/bin/lupdate src/src.pro
|
||||
- sed -i "" "s|#\(CONFIG += release.*\)|\1 static |" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(QMAKE_LRELEASE\).*|\1 += /usr/local/opt/$QT_PATH/bin/lrelease|"
|
||||
src/gcconfig.pri
|
||||
- sed -i "" "s|#\(QMAKE_CXXFLAGS\).*|\1_RELEASE += -mmacosx-version-min=10.7 -arch
|
||||
x86_64|" src/gcconfig.pri
|
||||
- sed -i "" "s|^#CloudDB|CloudDB|" src/gcconfig.pri
|
||||
- sed -i "" "s|^#LIBZ|LIBZ|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(SRMIO_INSTALL =.*\)|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(D2XX_INCLUDE =.*\)|\1 ../D2XX|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(D2XX_LIBS =.*\)|\1 -L../D2XX -lftd2xx.1.2.2|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(KQOAUTH_INSTALL =.*\)|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(KQOAUTH_INCLUDE =.*\)|\1 \$\$[QT_INSTALL_LIBS]/kqoauth.framework/Headers|"
|
||||
src/gcconfig.pri
|
||||
- sed -i "" "s|#\(KQOAUTH_LIBS =.*\)|\1 -F\$\$[QT_INSTALL_LIBS] -framework kqoauth|"
|
||||
src/gcconfig.pri
|
||||
- sed -i "" "s|#\(QWT3D_INSTALL =.*\)|\1 ../qwtplot3d|" src/gcconfig.pri
|
||||
## Disable KML for now
|
||||
##- sed -i "" "s|#\(KML_INSTALL =\).*|\1 /usr/local|" src/gcconfig.pri
|
||||
##- sed -i "" "s|#\(KML_LIBS =.*\)|\1 -L/usr/local/lib -lkmlxsd -lkmlregionator -lkmldom
|
||||
## -lkmlconvenience -lkmlengine -lkmlbase|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(ICAL_INSTALL =.*\)|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(ICAL_LIBS =.*\)|\1 -L/usr/local/lib -lical|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(LIBUSB_INSTALL =\).*|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(LIBUSB_LIBS =.*\)|\1 -L/usr/local/lib -lusb|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(SAMPLERATE_INSTALL =\).*|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(SAMPLERATE_LIBS =\).*|\1 -L/usr/local/lib -lsamplerate|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(DEFINES += GC_HAVE_LION*\)|\1|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(HTPATH = ../httpserver.*\)|\1 |" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(DEFINES += GC_WANT_ROBOT.*\)|\1 |" src/gcconfig.pri
|
||||
- sed -i "" "s|\(DEFINES += GC_VIDEO_NONE.*\)|#\1 |" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(DEFINES += GC_VIDEO_QUICKTIME.*\)|\1 |" src/gcconfig.pri
|
||||
- echo "QMAKE_CFLAGS_RELEASE += -mmacosx-version-min=10.7 -arch x86_64" >> src/gcconfig.pri
|
||||
- sed -i "" "s/__GC_GOOGLE_CALENDAR_CLIENT_SECRET__/"$GC_GOOGLE_CALENDAR_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_STRAVA_CLIENT_SECRET__/"$GC_STRAVA_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_DROPBOX_CLIENT_SECRET__/"$GC_DROPBOX_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_CYCLINGANALYTICS_CLIENT_SECRET__/"$GC_CYCLINGANALYTICS_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_TWITTER_CONSUMER_SECRET__/"$GC_TWITTER_CONSUMER_SECRET"/" src/Secrets.h
|
||||
- cat src/gcconfig.pri
|
||||
script:
|
||||
- CC=clang CXX=clang++ /usr/local/opt/$QT_PATH/bin/qmake -makefile -recursive QMAKE_CXXFLAGS_WARN_ON+=-Wno-unused-private-field
|
||||
- CC=clang CXX=clang++ make qmake_all
|
||||
- CC=clang CXX=clang++ make -j4 sub-qwt --silent
|
||||
- CC=clang CXX=clang++ make -j4 sub-src
|
||||
after_success:
|
||||
- cd src
|
||||
- ls -laR GoldenCheetah.app
|
||||
- GoldenCheetah.app/Contents/MacOS/GoldenCheetah --help
|
||||
- /usr/local/opt/$QT_PATH/bin/macdeployqt GoldenCheetah.app -verbose=2 -dmg
|
||||
## fix up the bundle with macdeployqtfix
|
||||
- python ../travis/macdeployqtfix.py GoldenCheetah.app /usr/local/opt/$QT_PATH
|
||||
- brew remove $QT
|
||||
- mv GoldenCheetah.dmg GoldenCheetah_$QT.dmg
|
||||
- hdiutil mount GoldenCheetah_$QT.dmg
|
||||
- cd /Volumes/GoldenCheetah
|
||||
- ls -laR GoldenCheetah.app
|
||||
- GoldenCheetah.app/Contents/MacOS/GoldenCheetah --help
|
||||
##deploy broken in travis, read-only filesystem error
|
||||
##before_deploy:
|
||||
##- gem install mime-types -v 2.6.2
|
||||
##deploy:
|
||||
## provider: releases
|
||||
## api_key: $GH_OAUTH_TOKEN
|
||||
## file: GoldenCheetah_$QT.dmg
|
||||
## skip_cleanup: true
|
||||
## on:
|
||||
## tags: true
|
||||
879
COPYING
@@ -1,626 +1,285 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
NO WARRANTY
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
16. Limitation of Liability.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
@@ -628,15 +287,15 @@ free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
@@ -645,31 +304,37 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
||||
373
INSTALL-LINUX
@@ -1,373 +0,0 @@
|
||||
+++++++++++++++++++++++
|
||||
LINUX BUILD WALKTHROUGH
|
||||
+++++++++++++++++++++++
|
||||
|
||||
Mark Liversedge
|
||||
John Ehrlinger
|
||||
|
||||
Jan 2015
|
||||
Version 1.2
|
||||
|
||||
A walkthrough of building GoldenCheetah from scratch on Ubuntu linux. This walkthrough
|
||||
should be largely the same for any Linux distro.
|
||||
|
||||
CONTENTS
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
- QT
|
||||
- git
|
||||
|
||||
2. ADDING OPTIONAL DEPENDENCIES WHEN BUILDING VERSION 2
|
||||
- FTDI D2XX
|
||||
- SRMIO
|
||||
- liboauth
|
||||
- QwtPlot3d
|
||||
- libkml
|
||||
|
||||
3. ADDING OPTIONAL DEPENDENCIES WHEN BUILDING VERSION 3
|
||||
- checking out the release 3 branch & building with MANDATORY dependencies
|
||||
- flex
|
||||
- bison
|
||||
- libical - Diary window and CalDAV support (google/mobileme calendar integration)
|
||||
- libvlc - Video playback in training mode
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
=================================================
|
||||
|
||||
Installed Ubuntu 11.04 from CD image amd-64.iso. You will not need to do this if you
|
||||
already have a Linux distribution installed. Left this step in to highlight the
|
||||
Linux distribution the commands below were executed on.
|
||||
|
||||
login and open a terminal to get a shell prompt
|
||||
|
||||
Download MANDATORY DEPENDENCIES (browser)
|
||||
-----------------------------------------
|
||||
Download and install the Qt 4.8 SDK from http://qt-project.org/
|
||||
Once that is completed test qmake is ok with: qmake --version (should report 4.7.0 or higher)
|
||||
|
||||
Install git with:
|
||||
$ sudo apt-get install git
|
||||
Said Y to prompt about all git files installed (git-gui et al)
|
||||
|
||||
Install FLEX and BISON
|
||||
----------------------
|
||||
|
||||
You will need flex v2.5.9 or later
|
||||
$ sudo apt-get install bison
|
||||
$ sudo apt-get install flex
|
||||
$ vi gcconfig.pri
|
||||
|
||||
Ensure you have the following lines (which are now also in gcconfig.pri.in which has
|
||||
been updated to reflect the new dependencies in version 3)
|
||||
|
||||
QMAKE_LEX = flex
|
||||
QMAKE_YACC = bison
|
||||
win32 {
|
||||
QMAKE_YACC = bison --file-prefix=y -t
|
||||
QMAKE_MOVE = cmd /c move
|
||||
QMAKE_DEL_FILE = rm -f
|
||||
}
|
||||
|
||||
Build!
|
||||
------
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
You will now have a release3 binary but with none of the release3 dependencies compiled in.
|
||||
Get latest GOLDEN CHEETAH source files
|
||||
--------------------------------------
|
||||
$ mkdir -p ~/Projects/Live
|
||||
$ cd ~/Projects/Live
|
||||
$ git clone git://github.com/GoldenCheetah/GoldenCheetah.git
|
||||
$ cd GoldenCheetah
|
||||
|
||||
Configure MANDATORY DEPENDENCIES
|
||||
--------------------------------
|
||||
$ cd qwt
|
||||
$ cp qwtconfig.pri.in qwtconfig.pri
|
||||
$ cd ../src
|
||||
$ cp gcconfig.pri.in gcconfig.pri
|
||||
$ vi gcconfig.pri
|
||||
|
||||
Comment out the D2XX_INCLUDE and SRMIO_INSTALL lines for now (put # in first character of the line
|
||||
to comment out), we will install that in a moment, if we need to.
|
||||
|
||||
If you are building for your local host you may find that you get better performance if
|
||||
compiling with gcc -O3 (tree vectorization can have a significat impact) [or -Ofast]
|
||||
|
||||
If so you might like to uncomment:
|
||||
|
||||
QMAKE_CXXFLAGS += -O3
|
||||
|
||||
Save and exit
|
||||
|
||||
$ cd ..
|
||||
|
||||
BUILD WITH BASIC CONFIGURATION
|
||||
$ qmake -recursive
|
||||
$ make
|
||||
|
||||
Congratulations you have now build a basic GoldenCheetah and can run this safely. See below for
|
||||
optional dependencies you can install to support other features.
|
||||
|
||||
ADDING OPTIONAL DEPENDENCIES WHEN BUILDING VERSION 2
|
||||
====================================================
|
||||
|
||||
D2XX - For Powertap downloads via USB
|
||||
-------------------------------------
|
||||
|
||||
Download the FTDI drivers from http://www.ftdichip.com/Drivers/D2XX.htm (e.g. I used Linux
|
||||
64-bit drivers from http://www.ftdichip.com/Drivers/D2XX/Linux/libftd2xx1.0.4.tar.gz)
|
||||
|
||||
Extract into your home directory (I put mine into ~/Projects/ with archive manager which
|
||||
created a sub-directory ~/Projects/libftd2xx1.0.4
|
||||
|
||||
$ cd src
|
||||
$ vi gcconfig.pri
|
||||
|
||||
Uncomment the D2XX_INCLUDE entry and make it match (my home is /home/markl)
|
||||
D2XX_INCLUDE = /home/markl/libftd2xx1.0.4
|
||||
|
||||
Make clean is needed if you have previouslt built, since source files examine #defines before
|
||||
including this feature. You can skip it if you know why ;)
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
You now have D2XX support, for downloading from a PT via a USB cradle.
|
||||
|
||||
SRMIO - For SRM powercontrol V downloads via Serial
|
||||
---------------------------------------------------
|
||||
|
||||
$ cd ~/Projects
|
||||
$ git clone git://github.com/rclasen/srmio srmio
|
||||
$ cd srmio
|
||||
|
||||
Get automake and tools, if you don't already have them (I didn't after a fresh install)
|
||||
$ sudo apt-get install automake
|
||||
$ sudo apt-get install libtool
|
||||
|
||||
Generate the configure script, run it, build and install srmio
|
||||
$ sh genautomake.sh
|
||||
$ ./configure
|
||||
$ make
|
||||
$ sudo make install
|
||||
|
||||
Lets go config GC and build with SRMIO
|
||||
$ cd ~/Projects/Live/GoldenCheetah/src
|
||||
$ vi gcconfig.pri
|
||||
|
||||
Uncomment the SRMIO_INSTALL and replace with the target used from srmio install:
|
||||
SRMIO_INSTALL = /usr/local/
|
||||
|
||||
At the bottom of gcconfig.pri you will see the include directory should reference from
|
||||
the base install location (/usr/local) make sure it says:
|
||||
|
||||
SRMIO_INCLUDE = $${SRMIO_INSTALL}/include
|
||||
SRMIO_LIB = $${SRMIO_INSTALL}/lib/libsrmio.a
|
||||
|
||||
Make clean is needed if you have previouslt built, since source files examine #defines before
|
||||
including this feature. You can skip it if you know why ;)
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
You now have SRM support built in.
|
||||
|
||||
OAUTH/CRYPT - For Tweet my ride (twitter) support
|
||||
-------------------------------------------------
|
||||
|
||||
You should be able to install liboauth and dependencies
|
||||
directly with:
|
||||
$ sudo apt-get install liboauth-dev
|
||||
|
||||
If this does not work then:
|
||||
|
||||
Download the source from: http://sourceforge.net/projects/liboauth/files/liboauth-0.9.4.tar.gz/download and
|
||||
unpack it into ~/Projects/liboauth-0.9.4 using archive manager
|
||||
|
||||
$ cd ~/Projects/liboauth-0.9.4
|
||||
|
||||
You may find that libcurl is not installed (which liboauth depends upon) so download it
|
||||
from http://curl.haxx.se/download/curl-7.21.6.tar.gz and unpack it into ~/Projects/curl-7.21.6
|
||||
using archive manager to drag and drop into your Projects folder
|
||||
|
||||
$ cd ~/Projects/curl-7.21.6
|
||||
$ ./configure
|
||||
$ make
|
||||
$ sudo make install
|
||||
|
||||
You should now have libcurl and friends installed in /usr/local
|
||||
|
||||
You may find that liboauth also requires the openssl libs installed, these are available
|
||||
pre-packaged thankfully so:
|
||||
$ sudo apt-get install libssl-dev
|
||||
|
||||
This will also install zlibg which liboauth also desires.
|
||||
|
||||
$ cd ~/Projects/liboauth-0.9.4
|
||||
$ ./configure
|
||||
$ make
|
||||
$ sudo make install
|
||||
|
||||
Now we have liboauth and libcurl in /usr/local and libssl in /usr/lib, so we can go back to
|
||||
GoldenCheetah and update the gcconfig.pri to point at the right places:
|
||||
|
||||
$ cd ~/Projects/Live/GoldenCheetah/src
|
||||
$ vi gcconfig.pri
|
||||
|
||||
Make sure the following are set:
|
||||
LIBOAUTH_INSTALL = /usr/local
|
||||
LIBCRYPTO_INSTALL = -lcrypto
|
||||
LIBCURL_INSTALL=-lcurl
|
||||
|
||||
Make clean is needed if you have previously built, since source files examine #defines before
|
||||
including this feature. You can skip it if you know why ;)
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
You can now tweet your rides and amaze your friends, or alternatively tweet your rides but
|
||||
omit to mention average power to hide your weaknesses.
|
||||
|
||||
LIBQWTPLOT3D - For 3D plot
|
||||
--------------------------
|
||||
|
||||
Download the tarball from http://qwtplot3d.svn.sourceforge.net/viewvc/qwtplot3d/branches/maintain_0_2_x/qwtplot3d/?view=tar
|
||||
and unarchive it into your Projects directory using archive manager. There is no version number it just creates a
|
||||
subdirectory called qwtplot3d
|
||||
|
||||
You will need to install libgl and extensions, this can be done with;
|
||||
$ sudo apt-get install libgl1-mesa-dev
|
||||
$ sudo apt-get install libglu-dev
|
||||
|
||||
On Ubuntu 12.10 I also ran
|
||||
$ sudo apt-get install freeglut3 freeglut3-dev
|
||||
|
||||
$ cd ~/Projects/qwtplot3d
|
||||
Edit the qwtplot3d.pri and add
|
||||
CONFIG += staticlib
|
||||
|
||||
You will find that on modern Linuxes you also need to fix include/qwt3d_global.h by adding the line:
|
||||
#include <GL/glu.h>
|
||||
|
||||
then build
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
Then to let gc know where the qwtplot3d libs are you need to edit gcconfig.pri;
|
||||
$ cd ~/Projects/Live/GoldenCheetah/src
|
||||
$ vi gcconfig.pri
|
||||
|
||||
And uncomment the following line and set the install directory to where you build
|
||||
QWT3D_INSTALL = ~/Projects/qwtplot3d
|
||||
|
||||
|
||||
|
||||
LIBKML - For export to Google Earth
|
||||
-----------------------------------
|
||||
|
||||
You will need Google Earth 5.2 or later and therefore libkml that supports this. Unfortunately at the time of writing
|
||||
the officially packaged libkml is too old, so you will need to install from source, which means you will need to have
|
||||
subversion installed and expat. You may be able to use the currently packaged libkml with
|
||||
|
||||
$ sudo apt-get install libkml-dev
|
||||
|
||||
if this does not work you will need to build from source:
|
||||
|
||||
$ sudo apt-get install subversion
|
||||
$ sudo apt-get install expat libexpat1 libexpat1-dev
|
||||
|
||||
Once svn is installed you can grab the libkml source and configure build etc:
|
||||
$ cd ~/Projects
|
||||
$ svn checkout http://libkml.googlecode.com/svn/trunk/ libkml
|
||||
$ cd libkml
|
||||
|
||||
You will need automake and friends (see SRMIO above)
|
||||
$ sh autogen.sh
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make install
|
||||
$ sudo make install
|
||||
|
||||
If you get errors about use of 'long long' then edit:
|
||||
- src/kml/{convenience,dom,engine,regionator,xsd}/Makefile
|
||||
- examples/{engine,gpx,gx,hellonet,helloworld,regionator,xsd}/Makefile
|
||||
- and look for the flag -pedantic and remove it. I got this on Linux 64bit builds ymmv.
|
||||
|
||||
Once libkml is installed and built:
|
||||
|
||||
$ cd ~/Projects/Live/GoldenCheetah/src
|
||||
$ vi gcconfig.pri
|
||||
|
||||
Ensure KML_INSTALL=/usr/local
|
||||
|
||||
Make clean is needed if you have previously built, since source files examine #defines before
|
||||
including this feature. You can skip it if you know why ;)
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
You can now export rides to Google Earth kml format.
|
||||
|
||||
ADDING OPTIONAL DEPENDENCIES WHEN BUILDING VERSION 3
|
||||
====================================================
|
||||
|
||||
|
||||
NOTE: When you run version 3 it will refresh ride metrics and CP files -- this only occurs the
|
||||
first time it runs (and will refresh only rides that change after that). I find it is best
|
||||
to import ride files once your build where you want it. i.e. don't import until you have
|
||||
got all your dependencies sorted.
|
||||
|
||||
NOTE: To reduce the dependencies on 'dormant' code there are a number of new pieces of source
|
||||
that are included in the release3 tree. Notably; qtsoap from qt-solutions, since they
|
||||
work but are likely to be archived and deprecated. If and when that happens we may well
|
||||
adopt whatever classes Trolltech introduce.
|
||||
|
||||
|
||||
LIBICAL - Diary integration with Google or MobileMe calendars
|
||||
-------------------------------------------------------------
|
||||
|
||||
$ cd ~/Projects/Live/GoldenCheetah/src
|
||||
|
||||
$ sudo apt-get install libical-dev
|
||||
$ vi gcconfig.pri
|
||||
|
||||
ICAL_INSTALL=/usr/include
|
||||
ICAL_LIBS=-lical
|
||||
|
||||
Since the src.pro wants ICAL installed in a different place we need to hack it, *** this will
|
||||
be fixed shortly ***
|
||||
|
||||
$ vi src.pro
|
||||
|
||||
Comment out the ICAL_LIBS entry:
|
||||
|
||||
#ICAL_LIBS = $${ICAL_INSTALL}/lib/libical.a
|
||||
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
You should now have diary functions.
|
||||
|
||||
NOTE: That upload to MobileMe and Google requires a functioning https lib in QT. Depending
|
||||
upon the version installed this might not be the case and will need to be built and
|
||||
configured -- this is beyond the scope of this walkthough. Sorry.
|
||||
|
||||
LIBVLC - Video playback in Realtime (Experimental)
|
||||
--------------------------------------------------
|
||||
|
||||
You will need libvlc 1.1.9 or higher (1.1.8 is ok but will segv on exit)
|
||||
$ sudo apt-get install libvlc-dev
|
||||
|
||||
$ vi gcconfig.pri
|
||||
|
||||
Comment out VLC_INSTALL and it should read:
|
||||
|
||||
VLC_INSTALL = /usr/include/vlc/
|
||||
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
299
INSTALL-MAC
@@ -1,299 +0,0 @@
|
||||
+++++++++++++++++++++++
|
||||
MAC OSX BUILD WALKTHROUGH
|
||||
+++++++++++++++++++++++
|
||||
|
||||
Mark Liversedge
|
||||
|
||||
Jan 2015
|
||||
Version 1.2
|
||||
|
||||
A walkthrough of building GoldenCheetah from scratch on Mac OSX. This was performed
|
||||
on Mac OSX Lion (10.7) but the instructions are largely the same for all versions of
|
||||
Mac OS X.
|
||||
|
||||
CONTENTS
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
- Xcode
|
||||
- Qt
|
||||
|
||||
2. ADDING OPTIONAL DEPENDENCIES
|
||||
- FTDI D2XX
|
||||
- SRMIO
|
||||
- kQOAuth
|
||||
- QwtPlot3d
|
||||
- libkml
|
||||
- libusb
|
||||
- libical
|
||||
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
=================================================
|
||||
|
||||
Depending upon the speed of your internet connection and availability of the
|
||||
required software the steps in section 1 will take approximately 1 hour.
|
||||
|
||||
1.1 Ensure OS X is up-to-date
|
||||
-----------------------------
|
||||
|
||||
Make sure you have applied all the latest updates to Mac OS X. This can be
|
||||
found from the system menu, apple, about this mac, software update.
|
||||
|
||||
This walkthrough was performed on an iMac running 10.7.2 (Lion)
|
||||
|
||||
1.2 Install XCode from App Store
|
||||
--------------------------------
|
||||
|
||||
If you are building on 10.6 or higher you should install Xcode4, for earlier
|
||||
releases you will need Xcode 3.1.4. If you have capable hardware you should
|
||||
consider upgrading to Lion to get the latest bug fixes and capabilities.
|
||||
|
||||
To install Xcode on Lion you need to download it via the App Store. You can
|
||||
launch the App Store from launchpad, or it may be already in your dock.
|
||||
|
||||
Under the search box type in Xcode and it will return a few optios, generally
|
||||
Xcode is the first item and shows a blueprint with a hammer icon. Click on
|
||||
this to install it. It should be free. The usual app store process will apply
|
||||
as the application is downloaded and installed. The download is about 2GB
|
||||
so do bear this in mind if you have limits on your internet bandwidth or cap.
|
||||
|
||||
1.3 Run the Xcode installer
|
||||
---------------------------
|
||||
|
||||
The app store download will have added an Install Xcode icon in the launchpad.
|
||||
Go ahead and run it.
|
||||
|
||||
Xcode includes all the development tools such as a compiler, debugger and
|
||||
SDKs. It also installs the 'git' tool for working with Git repositories.
|
||||
|
||||
It will run through a wizard to install, just read and then accept the license
|
||||
agreement and let it get on with it. If you don't like the license then quit
|
||||
and use the development builds from goldencheetah.stand2surtf.net.
|
||||
|
||||
You may find it borks at iTunes helper running, you will
|
||||
need to force quit the iTunes helper via Finder, Applications, Utilities,
|
||||
Activity Monitor if this happens.
|
||||
|
||||
1.4 Get the source code
|
||||
-----------------------
|
||||
|
||||
We store all the Golden Cheetah source code on github.com, it is a great
|
||||
site holding repositories for many open source projects.
|
||||
|
||||
First open up a terminal session, then;
|
||||
|
||||
$ cd
|
||||
$ mkdir Projects
|
||||
$ cd Projects
|
||||
$ git clone git://github.com/GoldenCheetah/GoldenCheetah.git
|
||||
|
||||
You will now have the GoldenCheetah sources downloaded into a 'GoldenCheetah'
|
||||
directory in your home directory, under another folder called 'Projects'.
|
||||
|
||||
$ cd GoldenCheetah
|
||||
$ ls
|
||||
|
||||
You should see a number of directories such as doc, qwt, src etc. If you are
|
||||
wanting to build a particular release you need to checkout the release. To
|
||||
build a release you need to checkout the code at the tag for the release.
|
||||
|
||||
A list of releases can be found at: https://github.com/GoldenCheetah/GoldenCheetah/tags
|
||||
|
||||
$ git checkout V3.3-RC1
|
||||
$ ls
|
||||
|
||||
You will now see an updated version of this walkthrough, please jump to using
|
||||
that since it may be more up-to-date than this walkthrough (depending upon
|
||||
where you got it from of course!).
|
||||
|
||||
1.5 Install the QT SDK
|
||||
----------------------
|
||||
|
||||
GoldenCheetah is developed using the Nokia QT toolkit, it is large and will
|
||||
need to be downloaded and installed from their website. Alternatively, you
|
||||
can intall qt via macports (http://www.macports.org) as described in section
|
||||
1.5.1.
|
||||
|
||||
As of today, the latest stable release is 4.7.4, we need 4.7 or higher so
|
||||
go ahead and download the offline installer - it has everything you need
|
||||
but is about 1.3GB. Please make sure you download the installer for Mac
|
||||
OS X 10.6 or later, 64-bit.
|
||||
|
||||
The url for QT downloads is: http://qt.nokia.com/downloads and whilst the
|
||||
offline installer is only 12mb it will still call back and download the
|
||||
required objects as you install, I think it is better to get it all in
|
||||
one hit (and you can save it to reinstall on another computer or if you
|
||||
want to rebuild/reinstall for any other reason).
|
||||
|
||||
Once the QT SDK is downloaded you will have a .dmg (disk image) that you
|
||||
need to mount by double clicking on it. You will then get a volume mounted
|
||||
and shown on your desktop. Go ahead and double click that to start the install
|
||||
process. It is probably called something like 'Qt SDK Installer'.
|
||||
|
||||
It will popup with a dialog warning that this is downloaded from the internet
|
||||
and are you sure you want to open it? Go ahead and click Open.
|
||||
|
||||
A wizard will now guide you through the QT install process. Go ahead and accept
|
||||
all the defaults, it will install in your home directory and avoid updating the
|
||||
system directories, this means you are less likely to bork your Mac OSX installation.
|
||||
|
||||
Read and accept the license agreement and then continue and install.
|
||||
|
||||
We need to make sure that a program called qmake is installed in a directory where
|
||||
it can be found. So, we need to create a link from what we just installed in the
|
||||
user programs folder. For QT SDK1.1 (4.7.4) we need to:
|
||||
|
||||
$ sudo ln -s ~/QtSDK/Desktop/Qt/474/gcc/bin/qmake /usr/bin/qmake
|
||||
|
||||
1.5.1 Install via Mac Ports
|
||||
---------------------------
|
||||
|
||||
If you have macports installed, you can install the qt dependices
|
||||
with the following commands:
|
||||
|
||||
$ sudo port install qt4-mac
|
||||
$ sudo port install qt4-mac-sqlite3-plugin
|
||||
|
||||
1.6 DEPRECATED
|
||||
--------------
|
||||
|
||||
No longer need this step (install boost)
|
||||
|
||||
1.7 Configure and Build GoldenCheetah (with no optional dependencies)
|
||||
---------------------------------------------------------------------
|
||||
|
||||
First thing we need to do is set the build configuration, this means editing the
|
||||
private build profile settings. There is one for qwt (a charting library) and
|
||||
there is another for GoldenCheetah itself.
|
||||
|
||||
$ cd ~/Projects/GoldenCheetah/qwt
|
||||
$ cp qwtconfig.pri.in qwtconfig.pri
|
||||
$ cd ../src
|
||||
$ cp gcconfig.pri.in gcconfig.pri
|
||||
$ vi gcconfig.pri
|
||||
|
||||
In that last step you can use whatever editor you feel most comfortable with.
|
||||
|
||||
For now we will comment out some of the dependencies we have not installed
|
||||
support for yet:
|
||||
|
||||
#SRMIO_INSTALL = /usr/local/srmio
|
||||
#D2XX_INCLUDE = /usr/local/include/D2XX
|
||||
|
||||
we may need to additionally configure to use the local compression
|
||||
libraries (at least I did), by adding the following line:
|
||||
|
||||
LIBS += -lz
|
||||
|
||||
Lastly, since we are on Lion, we can also uncomment and change the following line:
|
||||
|
||||
DEFINES += GC_HAVE_LION
|
||||
|
||||
Once the changes have been made we are now ready to build for the first time. You
|
||||
may notice a lot of warning messages about the version of O/S not being supported.
|
||||
This is because QT does not officially support Lion at this point in time (but it
|
||||
does work). You can either ignore the warning messages or (like me) go and edit out
|
||||
the warning (once you have seen the message once you don't need reminding every
|
||||
time you compile).
|
||||
|
||||
To do this, edit the file in question as an administrator:
|
||||
|
||||
$ sudo vi ~/QtSDK/Desktop/Qt/474/gcc/include/QtCore/qglobal.h
|
||||
|
||||
And comment out line 320 (or thereabouts):
|
||||
|
||||
//# warning "This version of Mac OS X is unsupported"
|
||||
|
||||
Once this is done you can kick off the build:
|
||||
|
||||
$ cd .. #this should put you in the top level dir containing this file
|
||||
$ qmake -recursive
|
||||
$ make
|
||||
|
||||
If make fails to find a Makefile then qmake is configured, by default, to create
|
||||
an xcode project file. You will need to change the qmake command above to tell it
|
||||
to create a makefile with the following:
|
||||
$ qmake -spec macx-g++ -recursive
|
||||
$ make
|
||||
|
||||
Once this completes you will have a GoldenCheetah.app in the src directory which
|
||||
can be launched:
|
||||
|
||||
$ open src/GoldenCheetah.app
|
||||
|
||||
And you're up and running.
|
||||
|
||||
2. ADDING OPTIONAL DEPENDENCIES
|
||||
===============================
|
||||
|
||||
- SRMIO
|
||||
- kQOAuth
|
||||
- QwtPlot3d
|
||||
- libkml
|
||||
- libusb
|
||||
- libical
|
||||
|
||||
Since these optional dependencies are more complex and require more advanced
|
||||
technical skills we do not provide a walkthrough for building them all but
|
||||
instead provide the configure settings and any special considerations that
|
||||
should be taken into account.
|
||||
|
||||
2.1 SRMIO - For working with PC 5/6/7
|
||||
-------------------------------------
|
||||
|
||||
SRMIO (git)
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64" CPPFLAGS=-I/usr/local/D2XX/ --disable-dependency-tracking
|
||||
|
||||
2.2 kQOAuth - For OAuth Authentication
|
||||
--------------------------------------
|
||||
|
||||
kQOauth (0.98)
|
||||
|
||||
qmake
|
||||
|
||||
|
||||
2.3 QwtPlot3d - For 3d plot support
|
||||
-----------------------------------
|
||||
|
||||
qwtplot3d (maintain_0_2_x)
|
||||
|
||||
Add the following to qwtplot3d.pro:
|
||||
CONFIG += x86_64 static
|
||||
QMAKE_MAC_SDK=/Developer/SDKs/MacOSX10.7.sdk
|
||||
|
||||
2.4 libkml - For export to Google Earth
|
||||
---------------------------------------
|
||||
|
||||
expat (2.0.1)
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64" --disable-dependency-tracking
|
||||
|
||||
libkml (pulled down from the svn repo)
|
||||
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64" --disable-dependency-tracking --with-expat-include-dir=/usr/local/include --with-expat-lib-dir=/usr/local/lib --disable-swig CXXFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64"
|
||||
|
||||
note: the added CXXFLAGS helped clear the -Werror flag that stopped compilation.
|
||||
|
||||
2.5 libusb - For Garmin USB2 stick support
|
||||
------------------------------------------
|
||||
|
||||
libusb (0.1.12)
|
||||
|
||||
To compile on OSX you need to apply the patch here:
|
||||
https://trac.macports.org/browser/trunk/dports/devel/libusb-legacy/files?rev=97840
|
||||
|
||||
Then:
|
||||
./configure --prefix=/opt/libusb/ CFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" --disable-dependency-tracking
|
||||
then
|
||||
sed -i 'bak' 's|CC -dynamiclib|CC -dynamiclib -arch x86_64|g' libtool
|
||||
make
|
||||
make install
|
||||
|
||||
note: that the sed line updates some commands in libtool. not sure why the arch clags are not getting passed.
|
||||
|
||||
2.6 libical
|
||||
-----------
|
||||
|
||||
libical (0.46)
|
||||
first run autogen.sh
|
||||
then
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64" --disable-dependency-tracking
|
||||
117
INSTALL-WIN32
@@ -1,117 +0,0 @@
|
||||
Please note: This is an old build instruction set for Version 2.x.
|
||||
|
||||
Most of it is still fairly valid for version 3.x.
|
||||
|
||||
Minimum build requirements are: Qt 4.8 with Qt.4.8.4 recommended.
|
||||
|
||||
All other libs are find the best that you can except for libusb which requires 0.1.12.
|
||||
|
||||
I have found that the cross compiler at http://mxe.cc/ to be great for building GC and SRMIO.
|
||||
|
||||
+++++++++++++++++++++++
|
||||
WIN32 BUILD WALKTHROUGH
|
||||
+++++++++++++++++++++++
|
||||
|
||||
Gareth Coco
|
||||
|
||||
May 2011
|
||||
|
||||
For my install, I am installing all my files into the directory: d:\coding.
|
||||
You can use any directory structure you like, you’ll just have to change paths.
|
||||
Just ensure that any folder path you use does not have a space in it.
|
||||
|
||||
Download the NSI installer application. I use the Portable Apps version from:
|
||||
http://portableapps.com/apps/development/nsis_portable
|
||||
- Install in D:\Coding\NSISPortable\
|
||||
|
||||
Download Qt SDK from:
|
||||
http://qt.nokia.com/downloads/sdk-windows-cpp
|
||||
(File I am using is qt-sdk-win-opensource-2010.02.1.exe)
|
||||
- Install in D:\Coding\Qt
|
||||
|
||||
Download the D2XX drivers:
|
||||
http://www.ftdichip.com/Drivers/D2XX.htm
|
||||
(File I am using is: CDM 202.06.00 WHQL Certified.zip)
|
||||
- Install in D:\Coding\D2XX
|
||||
|
||||
Download qwt-plot3d from:
|
||||
http://sourceforge.net/projects/qwtplot3d/files/
|
||||
(File I am using is qwtplot3d-0.2.7.zip)
|
||||
- Install in D:\Coding\qwtplot3d
|
||||
|
||||
Edit D:\coding\qwtplot3d\src\qwt3d_function.cpp
|
||||
- Add at top of file: #include <cstdio>
|
||||
Edit D:\coding\qwtplot3d\qwtplot3d.pro
|
||||
- Comment out: #win32:TEMPLATE = vclib
|
||||
|
||||
Then I start the “Qt Command Prompt” from the Qt SDK folder.
|
||||
|
||||
d:
|
||||
cd d:\coding\qwtplot3d\
|
||||
qmake -win32
|
||||
mingw32-make release
|
||||
|
||||
Now check out your favourite web sites until the code is built.
|
||||
|
||||
Leave the Qt Command Prompt window open as we use it later.
|
||||
|
||||
Download GoldenCheetah source
|
||||
(Either use GIT – git://github.com/GoldenCheetah/GoldenCheetah.git
|
||||
or download the zip file:
|
||||
http://github.com/GoldenCheetah/GoldenCheetah/zipball/master)
|
||||
- Install in D:\Coding\GoldenCheetah
|
||||
|
||||
Copy D:\Coding\GoldenCheetah\src\gccconfig.pri.in
|
||||
to D:\Coding\GoldenCheetah\src\gccconfig.pri and edit
|
||||
- Set: D2XX_INCLUDE = d:/coding/D2XX
|
||||
- Comment out #SRMIO_INSTALL
|
||||
- Comment out: CONFIG += debug
|
||||
- Uncomment: CONFIG += static
|
||||
|
||||
Copy D:\Coding\GoldenCheetah\qwt\qwtconfig.pri.in
|
||||
to D:\Coding\GoldenCheetah\qwt\qwtconfig.pri and edit
|
||||
- Set win32 { INSTALLBASE = D:/Coding/Qt }
|
||||
- In #Qt4 win32 { section
|
||||
– Comment out: #CONFIG += debug # release/debug/debug_and_release
|
||||
– Add in: CONFIG += release
|
||||
|
||||
Using the “Qt Command Prompt” window from before:
|
||||
|
||||
cd d:\coding\GoldenCheetah
|
||||
qmake -win32 -recursive
|
||||
mingw32-make release
|
||||
|
||||
Go back to checking your email or favourite web sites while this builds.
|
||||
|
||||
When all is finished, you should have a release version in:
|
||||
|
||||
D:\Coding\GoldenCheetah\src\release\
|
||||
|
||||
Next , move required build files into the d:\coding\GoldenCheetah\src\release directory.
|
||||
|
||||
cd d:\coding\GoldenCheetah
|
||||
copy /y ..\Qt\qt\bin\mingwm10.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtCore4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtGui4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtSql4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtXml4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtNetwork4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtOpenGL4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtWebKit4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\QtXmlPatterns4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\phonon4.dll src\release\
|
||||
copy /y ..\Qt\qt\bin\libgcc_s_dw2-1.dll src\release\
|
||||
copy /y ..\qwtplot3d\lib\qwtplot3d.dll src\release\
|
||||
mkdir src\release\sqldrivers
|
||||
copy /y ..\Qt\qt\plugins\sqldrivers\qsqlite4.dll src\release\sqldrivers\
|
||||
mkdir src\release\imageformats
|
||||
copy /y ..\Qt\qt\plugins\imageformats\qjpeg4.dll src\release\imageformats\
|
||||
|
||||
To build the self installer:
|
||||
|
||||
cd d:\coding\GoldenCheetah\src\win32
|
||||
d:\coding\NSISPortable\App\NSIS\makensis.exe GoldenCheetahInstall.nsi
|
||||
|
||||
You should find the installer file in the directory you are in.
|
||||
|
||||
Install and enjoy.
|
||||
15
README
Normal file
@@ -0,0 +1,15 @@
|
||||
To build
|
||||
|
||||
cp src/gcconfig.pri.in src/gcconfig.pri
|
||||
cp qwt/qwtconfig.pri.in qwt/qwtconfig.pri
|
||||
|
||||
Edit both src/gcconfig.pri and qwt/qwtconfig.pri as necessary, then
|
||||
|
||||
qmake
|
||||
make
|
||||
|
||||
To uninstall the older FTDI VCP drivers on Mac OS X, open a Terminal and type:
|
||||
|
||||
sudo mv /System/Library/Extensions/FTDIUSBSerialDriver.kext /tmp
|
||||
|
||||
Type your password when prompted, then restart your computer.
|
||||
17
README.md
@@ -1,17 +0,0 @@
|
||||
Golden Cheetah install and build instructions are documented
|
||||
for each platform;
|
||||
|
||||
INSTALL-WIN32 For building on Microsoft Windows
|
||||
|
||||
INSTALL-LINUX For building on Ubuntu Linux
|
||||
|
||||
INSTALL-MAC For building on Apple OS X
|
||||
|
||||
|
||||
[](https://travis-ci.org/GoldenCheetah/GoldenCheetah)
|
||||
|
||||
[](https://scan.coverity.com/projects/goldencheetah-goldencheetah)
|
||||
|
||||
Alternatively official builds are available from http://www.goldencheetah.org
|
||||
|
||||
whilst latest developer builds are available from http://goldencheetah.stand2surf.net
|
||||
@@ -1,7 +1,3 @@
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS = qwt
|
||||
unix:!macx {
|
||||
SUBDIRS += kqoauth
|
||||
}
|
||||
SUBDIRS += src
|
||||
SUBDIRS = qwt src
|
||||
CONFIG += ordered
|
||||
|
||||
@@ -1,316 +0,0 @@
|
||||
From 7be04e65a53b22ce382d640a6c409b5d3bfe5645 Mon Sep 17 00:00:00 2001
|
||||
From: Joern <joern.rm@gmail.com>
|
||||
Date: Sat, 20 Dec 2014 12:42:37 +0100
|
||||
Subject: [PATCH] Patch-Windows-MingGW-subset for GC
|
||||
|
||||
... reduce the libs in Make to what GoldenCheetah needs
|
||||
... add two functions missing in MingGW standard libs
|
||||
---
|
||||
Makefile.am | 2 +-
|
||||
configure.ac | 44 -------------------
|
||||
src/Makefile.am | 2 +-
|
||||
src/kml/base/file_posix.cc | 102 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
src/kml/base/string_util.cc | 17 ++++++++
|
||||
third_party/Makefile.am | 42 +++---------------
|
||||
6 files changed, 126 insertions(+), 83 deletions(-)
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 2be0803..e29201e 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -1,7 +1,7 @@
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
# Order is important:
|
||||
-SUBDIRS = third_party src testdata examples msvc xcode
|
||||
+SUBDIRS = third_party src
|
||||
|
||||
EXTRA_DIST = \
|
||||
AUTHORS \
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index d5fa75f..033128b 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -203,23 +203,6 @@ AC_CHECK_LIB(pthread, pthread_create,,
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
- examples/Makefile
|
||||
- examples/domviewer/Makefile
|
||||
- examples/engine/Makefile
|
||||
- examples/gpx/Makefile
|
||||
- examples/gx/Makefile
|
||||
- examples/hellonet/Makefile
|
||||
- examples/helloworld/Makefile
|
||||
- examples/java/Makefile
|
||||
- examples/kml/Makefile
|
||||
- examples/python/Makefile
|
||||
- examples/regionator/Makefile
|
||||
- examples/wxregionator/Makefile
|
||||
- examples/wxviewer/Makefile
|
||||
- examples/xsd/Makefile
|
||||
- msvc/Makefile
|
||||
- msvc/examples/Makefile
|
||||
- msvc/tests/Makefile
|
||||
src/Makefile
|
||||
src/kml/Makefile
|
||||
src/kml/convenience/Makefile
|
||||
@@ -228,34 +211,7 @@ AC_CONFIG_FILES([
|
||||
src/kml/regionator/Makefile
|
||||
src/kml/base/Makefile
|
||||
src/kml/xsd/Makefile
|
||||
- src/swig/Makefile
|
||||
- src/swig/java/Makefile
|
||||
- src/swig/python/Makefile
|
||||
- testdata/Makefile
|
||||
- testdata/atom/Makefile
|
||||
- testdata/balloon/Makefile
|
||||
- testdata/csv/Makefile
|
||||
- testdata/deprecated/Makefile
|
||||
- testdata/gdata/Makefile
|
||||
- testdata/gmaps/Makefile
|
||||
- testdata/gpx/Makefile
|
||||
- testdata/gx/Makefile
|
||||
- testdata/kml/Makefile
|
||||
- testdata/kmz/Makefile
|
||||
- testdata/kmz/files/Makefile
|
||||
- testdata/kmz/kmzfiles/Makefile
|
||||
- testdata/kmz/rumsey/Makefile
|
||||
- testdata/kmz/rumsey/kml/Makefile
|
||||
- testdata/kmz/rumsey/imagery/Makefile
|
||||
- testdata/links/Makefile
|
||||
- testdata/style/Makefile
|
||||
- testdata/style/weather/Makefile
|
||||
- testdata/update/Makefile
|
||||
- testdata/xal/Makefile
|
||||
- testdata/xsd/Makefile
|
||||
third_party/Makefile
|
||||
- xcode/Makefile
|
||||
- xcode/LibKML/Makefile
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
||||
diff --git a/src/Makefile.am b/src/Makefile.am
|
||||
index 0bf15ac..721209e 100644
|
||||
--- a/src/Makefile.am
|
||||
+++ b/src/Makefile.am
|
||||
@@ -1,4 +1,4 @@
|
||||
-SUBDIRS = kml swig
|
||||
+SUBDIRS = kml
|
||||
|
||||
# TODO: use the phc files in msvc.
|
||||
EXTRA_DIST = \
|
||||
diff --git a/src/kml/base/file_posix.cc b/src/kml/base/file_posix.cc
|
||||
index b9461c0..920a996 100644
|
||||
--- a/src/kml/base/file_posix.cc
|
||||
+++ b/src/kml/base/file_posix.cc
|
||||
@@ -33,8 +33,110 @@
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h> // For unlink, close.
|
||||
|
||||
+// START PATCH
|
||||
+#include <fcntl.h>
|
||||
+#include <sys/time.h>
|
||||
+#include <sys/stat.h>
|
||||
+// END PATCH
|
||||
+
|
||||
namespace kmlbase {
|
||||
|
||||
+// START PATCH
|
||||
+// Implementation of missing functions
|
||||
+
|
||||
+/* mkstemp extracted from libc/sysdeps/posix/tempname.c. Copyright
|
||||
+ (C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version. */
|
||||
+
|
||||
+static const char letters[] =
|
||||
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
+
|
||||
+/* Generate a temporary file name based on TMPL. TMPL must match the
|
||||
+ rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
|
||||
+ does not exist at the time of the call to mkstemp. TMPL is
|
||||
+ overwritten with the result. */
|
||||
+int
|
||||
+mkstemp (char *tmpl)
|
||||
+{
|
||||
+ int len;
|
||||
+ char *XXXXXX;
|
||||
+ static unsigned long value;
|
||||
+ unsigned long random_time_bits;
|
||||
+ unsigned int count;
|
||||
+ int fd = -1;
|
||||
+ int save_errno = errno;
|
||||
+
|
||||
+ /* A lower bound on the number of temporary files to attempt to
|
||||
+ generate. The maximum total number of temporary file names that
|
||||
+ can exist for a given template is 62**6. It should never be
|
||||
+ necessary to try all these combinations. Instead if a reasonable
|
||||
+ number of names is tried (we define reasonable as 62**3) fail to
|
||||
+ give the system administrator the chance to remove the problems. */
|
||||
+#define ATTEMPTS_MIN (62 * 62 * 62)
|
||||
+
|
||||
+ /* The number of times to attempt to generate a temporary file. To
|
||||
+ conform to POSIX, this must be no smaller than TMP_MAX. */
|
||||
+#if ATTEMPTS_MIN < TMP_MAX
|
||||
+ unsigned int attempts = TMP_MAX;
|
||||
+#else
|
||||
+ unsigned int attempts = ATTEMPTS_MIN;
|
||||
+#endif
|
||||
+
|
||||
+ len = strlen (tmpl);
|
||||
+ if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
|
||||
+ {
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+/* This is where the Xs start. */
|
||||
+ XXXXXX = &tmpl[len - 6];
|
||||
+
|
||||
+ /* Get some more or less random data. */
|
||||
+ {
|
||||
+ struct timeval tv;
|
||||
+ gettimeofday (&tv, NULL);
|
||||
+ random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
|
||||
+ }
|
||||
+ value += random_time_bits ^ getpid ();
|
||||
+
|
||||
+ for (count = 0; count < attempts; value += 7777, ++count)
|
||||
+ {
|
||||
+ unsigned long v = value;
|
||||
+
|
||||
+ /* Fill in the random bits. */
|
||||
+ XXXXXX[0] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[1] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[2] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[3] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[4] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[5] = letters[v % 62];
|
||||
+
|
||||
+ fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, _S_IREAD | _S_IWRITE);
|
||||
+ if (fd >= 0)
|
||||
+ {
|
||||
+ errno = save_errno;
|
||||
+ return fd;
|
||||
+ }
|
||||
+ else if (errno != EEXIST)
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* We got out of the loop because we ran out of combinations to try. */
|
||||
+ errno = EEXIST;
|
||||
+ return -1;
|
||||
+}
|
||||
+// END PATCH
|
||||
+
|
||||
// Internal to the POSIX File class.
|
||||
static bool StatFile(const char* path, struct stat* stat_data) {
|
||||
struct stat tmp;
|
||||
diff --git a/src/kml/base/string_util.cc b/src/kml/base/string_util.cc
|
||||
index b3a9654..3fdba2b 100644
|
||||
--- a/src/kml/base/string_util.cc
|
||||
+++ b/src/kml/base/string_util.cc
|
||||
@@ -31,6 +31,23 @@
|
||||
|
||||
namespace kmlbase {
|
||||
|
||||
+// START PATCH
|
||||
+int strncasecmp(const char *s1, const char *s2, size_t n) {
|
||||
+ while (*s1 != 0 && tolower(*s1) == tolower(*s2)) {
|
||||
+ ++s1;
|
||||
+ ++s2;
|
||||
+ }
|
||||
+
|
||||
+ return
|
||||
+ (*s2 == 0)
|
||||
+ ? (*s1 != 0)
|
||||
+ : (*s1 == 0)
|
||||
+ ? -1
|
||||
+ : (tolower(*s1) - tolower(*s2));
|
||||
+}
|
||||
+
|
||||
+// ENDPATCH
|
||||
+
|
||||
void b2a_hex(uint32_t i, char* out) {
|
||||
char map[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'a', 'b', 'c', 'd', 'e', 'f'};
|
||||
diff --git a/third_party/Makefile.am b/third_party/Makefile.am
|
||||
index b73dec3..fe34dea 100644
|
||||
--- a/third_party/Makefile.am
|
||||
+++ b/third_party/Makefile.am
|
||||
@@ -12,7 +12,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/third_party/zlib-1.2.3/contrib \
|
||||
-I$(top_srcdir)/third_party/gtest-1.7.0/include
|
||||
|
||||
lib_LTLIBRARIES = libminizip.la liburiparser.la
|
||||
-noinst_LTLIBRARIES = libgtest.la libgtest_main.la
|
||||
+#noinst_LTLIBRARIES = libgtest.la libgtest_main.la
|
||||
|
||||
libminizip_la_SOURCES = \
|
||||
zlib-1.2.3/contrib/minizip/unzip.c \
|
||||
@@ -83,11 +83,11 @@ libboostconfigplatforminclude_HEADERS = \
|
||||
$(boost)/config/platform/linux.hpp \
|
||||
$(boost)/config/platform/macos.hpp
|
||||
|
||||
-libgtest_la_SOURCES = \
|
||||
- gtest-1.7.0/src/gtest-all.cc
|
||||
+#libgtest_la_SOURCES = \
|
||||
+# gtest-1.7.0/src/gtest-all.cc
|
||||
|
||||
-libgtest_main_la_SOURCES = gtest-1.7.0/src/gtest_main.cc
|
||||
-libgtest_main_la_LIBADD = libgtest.la
|
||||
+#libgtest_main_la_SOURCES = gtest-1.7.0/src/gtest_main.cc
|
||||
+#libgtest_main_la_LIBADD = libgtest.la
|
||||
|
||||
# TODO: add the new gtest libs for windows.
|
||||
# gtest-1.7.0.win32/debug/gtest.lib \
|
||||
@@ -149,38 +149,6 @@ EXTRA_DIST = \
|
||||
$(boost)/config/stdlib/sgi.hpp \
|
||||
$(boost)/config/stdlib/stlport.hpp \
|
||||
$(boost)/config/stdlib/vacpp.hpp \
|
||||
- gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-message.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-param-test.h.pump \
|
||||
- gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-spi.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||
- gtest-1.7.0/include/gtest/gtest.h \
|
||||
- gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||
- gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-tuple.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump \
|
||||
- gtest-1.7.0/src/gtest-death-test.cc \
|
||||
- gtest-1.7.0/src/gtest-filepath.cc \
|
||||
- gtest-1.7.0/src/gtest-internal-inl.h \
|
||||
- gtest-1.7.0/src/gtest-port.cc \
|
||||
- gtest-1.7.0/src/gtest-printers.cc \
|
||||
- gtest-1.7.0/src/gtest-test-part.cc \
|
||||
- gtest-1.7.0/src/gtest-typed-test.cc \
|
||||
- gtest-1.7.0/src/gtest.cc \
|
||||
uriparser-0.7.5/COPYING \
|
||||
uriparser-0.7.5.win32/debug/uriparser.lib \
|
||||
uriparser-0.7.5.win32/release/uriparser.lib \
|
||||
--
|
||||
1.9.5.github.0
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
From 44a403d45ae049e7ade3e9b47a39778dcacf4382 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Liversedge <liversedge@gmail.com>
|
||||
Date: Thu, 28 Mar 2013 22:03:35 +0000
|
||||
Subject: [PATCH] Fixup no threads for GC
|
||||
|
||||
---
|
||||
src/core/CLucene/debug/lucenebase.h | 2 +-
|
||||
src/shared/CLucene/LuceneThreads.h | 21 ++++++++++++++++++---
|
||||
src/shared/CLucene/util/Misc.cpp | 2 ++
|
||||
src/shared/CLucene/util/Misc.h | 2 ++
|
||||
4 files changed, 23 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/core/CLucene/debug/lucenebase.h b/src/core/CLucene/debug/lucenebase.h
|
||||
index c053f11..9732ce6 100644
|
||||
--- a/src/core/CLucene/debug/lucenebase.h
|
||||
+++ b/src/core/CLucene/debug/lucenebase.h
|
||||
@@ -6,7 +6,7 @@
|
||||
------------------------------------------------------------------------------*/
|
||||
#ifndef _lucene_debug_lucenebase_
|
||||
#define _lucene_debug_lucenebase_
|
||||
-
|
||||
+#define _CL_DISABLE_MULTITHREADING
|
||||
#include "CLucene/LuceneThreads.h"
|
||||
|
||||
CL_NS_DEF(debug)
|
||||
diff --git a/src/shared/CLucene/LuceneThreads.h b/src/shared/CLucene/LuceneThreads.h
|
||||
index 97072ee..662ff2f 100644
|
||||
--- a/src/shared/CLucene/LuceneThreads.h
|
||||
+++ b/src/shared/CLucene/LuceneThreads.h
|
||||
@@ -13,10 +13,10 @@ class CLuceneThreadIdCompare;
|
||||
|
||||
#if defined(_CL_DISABLE_MULTITHREADING)
|
||||
#define SCOPED_LOCK_MUTEX(theMutex)
|
||||
- #define DEFINE_MUTEX(x)
|
||||
+ //#define DEFINE_MUTEX(x)
|
||||
#define DEFINE_MUTABLE_MUTEX(x)
|
||||
#define DEFINE_CONDITION(x)
|
||||
- #define STATIC_DEFINE_MUTEX(x)
|
||||
+ //#define STATIC_DEFINE_MUTEX(x)
|
||||
#define CONDITION_WAIT(theMutex, theCondition)
|
||||
#define CONDITION_NOTIFYALL(theCondition)
|
||||
#define _LUCENE_CURRTHREADID 1
|
||||
@@ -25,11 +25,26 @@ class CLuceneThreadIdCompare;
|
||||
#define _LUCENE_THREAD_FUNC_RETURN(val) return (int)val;
|
||||
#define _LUCENE_THREAD_CREATE(func, arg) (*func)(arg)
|
||||
#define _LUCENE_THREAD_JOIN(value) //nothing to do...
|
||||
- #define _LUCENE_THREADMUTEX void*
|
||||
+ //#define _LUCENE_THREADMUTEX void*
|
||||
|
||||
#define _LUCENE_ATOMIC_INC(theInteger) (++(*theInteger))
|
||||
#define _LUCENE_ATOMIC_DEC(theInteger) (--(*theInteger))
|
||||
#define _LUCENE_ATOMIC_INT int
|
||||
+#define _LUCENE_ATOMIC_INT_SET(x,v) x=v
|
||||
+#define _LUCENE_ATOMIC_INT_GET(x) x
|
||||
+
|
||||
+struct CLUCENE_SHARED_EXPORT mutex_thread
|
||||
+{
|
||||
+ void lock() {}
|
||||
+ void unlock() {}
|
||||
+};
|
||||
+#define _LUCENE_THREADMUTEX CL_NS(util)::mutex_thread
|
||||
+
|
||||
+#define DEFINE_MUTEX(theMutex) _LUCENE_THREADMUTEX theMutex;
|
||||
+#define STATIC_DEFINE_MUTEX(theMutex) static _LUCENE_THREADMUTEX theMutex;
|
||||
+
|
||||
+#define CONDITION_WAIT(theMutex, theCondition)
|
||||
+#define CONDITION_NOTIFYALL(theCondition)
|
||||
#else
|
||||
#if defined(_LUCENE_DONTIMPLEMENT_THREADMUTEX)
|
||||
//do nothing
|
||||
diff --git a/src/shared/CLucene/util/Misc.cpp b/src/shared/CLucene/util/Misc.cpp
|
||||
index 240b827..ec9eabd 100644
|
||||
--- a/src/shared/CLucene/util/Misc.cpp
|
||||
+++ b/src/shared/CLucene/util/Misc.cpp
|
||||
@@ -466,6 +466,7 @@ bool Misc::listFiles(const char* directory, std::vector<std::string>& files, boo
|
||||
std::string Misc::toString(const bool value){
|
||||
return value ? "true" : "false";
|
||||
}
|
||||
+#ifndef _CL_DISABLE_MULTITHREADING
|
||||
std::string Misc::toString(_LUCENE_THREADID_TYPE value){
|
||||
static int32_t nextindex = 0;
|
||||
static std::map<_LUCENE_THREADID_TYPE, int32_t> ids;
|
||||
@@ -474,6 +475,7 @@ std::string Misc::toString(_LUCENE_THREADID_TYPE value){
|
||||
}
|
||||
return toString(ids[value]);
|
||||
}
|
||||
+#endif
|
||||
std::string Misc::toString(const int32_t value){
|
||||
char buf[20];
|
||||
TCHAR tbuf[20];
|
||||
diff --git a/src/shared/CLucene/util/Misc.h b/src/shared/CLucene/util/Misc.h
|
||||
index aea7c42..4196e24 100644
|
||||
--- a/src/shared/CLucene/util/Misc.h
|
||||
+++ b/src/shared/CLucene/util/Misc.h
|
||||
@@ -67,7 +67,9 @@ CL_NS_DEF(util)
|
||||
|
||||
static std::string toString(const int32_t value);
|
||||
static std::string toString(const int64_t value);
|
||||
+#ifndef _CL_DISABLE_MULTITHREADING
|
||||
static std::string toString(const _LUCENE_THREADID_TYPE value);
|
||||
+#endif
|
||||
static std::string toString(const bool value);
|
||||
static std::string toString(const float_t value);
|
||||
static std::string toString(const TCHAR* s, int32_t len=-1);
|
||||
--
|
||||
1.7.8.msysgit.0
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
Clucene-2.3.3.4-NoThreads.patch - To patch Clucene on Windows to remove patching
|
||||
Fortius USB Driver Stubs.zip - Drivers for use with Fortius without Tacx software
|
||||
Install_D2XX_drivers.mpkg.zip - D2XX installer for Windows
|
||||
Universal_D2XX0.1.6.dmg - D2XX installer for Mac OSX
|
||||
libusb-0.1.12.tar.gz - Libusb (patched) to work with GoldenCheetah
|
||||
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
12
contrib/RideLogger/.gitignore
vendored
@@ -1,12 +0,0 @@
|
||||
# Ignores for Eclipse
|
||||
/.settings/
|
||||
|
||||
# Ignores for Android Projects
|
||||
/bin/
|
||||
/gen/
|
||||
/publish/
|
||||
/local.properties
|
||||
/secure.properties
|
||||
|
||||
# Ignores for Mac machines
|
||||
.DS_Store
|
||||
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE AndroidXML>
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:installLocation="auto"
|
||||
package="com.ridelogger"
|
||||
android:versionCode="040000"
|
||||
android:versionName="4.0.0"
|
||||
android:icon="@drawable/ic_launcher" >
|
||||
<uses-sdk android:minSdkVersion="14"
|
||||
android:targetSdkVersion="21" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.SEND_SMS"/>
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@android:style/Theme.DeviceDefault.Light" >
|
||||
<service
|
||||
android:name="com.ridelogger.RideService"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/service_name" >
|
||||
</service>
|
||||
<activity
|
||||
android:name="com.ridelogger.StartActivity"
|
||||
android:label="@string/app_name" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.ridelogger.SettingsActivity"
|
||||
android:label="@string/setting_title" >
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
|
Before Width: | Height: | Size: 176 KiB |
@@ -1,3 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<lint>
|
||||
</lint>
|
||||
@@ -1,68 +0,0 @@
|
||||
# This is a configuration file for ProGuard.
|
||||
# http://proguard.sourceforge.net/index.html#manual/usage.html
|
||||
|
||||
# Optimizations: If you don't want to optimize, use the
|
||||
# proguard-android.txt configuration file instead of this one, which
|
||||
# turns off the optimization flags. Adding optimization introduces
|
||||
# certain risks, since for example not all optimizations performed by
|
||||
# ProGuard works on all versions of Dalvik. The following flags turn
|
||||
# off various optimizations known to have issues, but the list may not
|
||||
# be complete or up to date. (The "arithmetic" optimization can be
|
||||
# used if you are only targeting Android 2.0 or later.) Make sure you
|
||||
# test thoroughly if you go this route.
|
||||
-optimizations code/simplification/arithmetic,code/simplification/cast,field/*,class/merging/*
|
||||
-optimizationpasses 24
|
||||
-allowaccessmodification
|
||||
-dontpreverify
|
||||
|
||||
# The remainder of this file is identical to the non-optimized version
|
||||
# of the Proguard configuration file (except that the other file has
|
||||
# flags to turn off optimization).
|
||||
|
||||
-dontusemixedcaseclassnames
|
||||
-dontskipnonpubliclibraryclasses
|
||||
-verbose
|
||||
|
||||
-keepattributes *Annotation*
|
||||
-keep public class com.google.vending.licensing.ILicensingService
|
||||
-keep public class com.android.vending.licensing.ILicensingService
|
||||
|
||||
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
|
||||
-keepclasseswithmembernames class * {
|
||||
native <methods>;
|
||||
}
|
||||
|
||||
# keep setters in Views so that animations can still work.
|
||||
# see http://proguard.sourceforge.net/manual/examples.html#beans
|
||||
-keepclassmembers public class * extends android.view.View {
|
||||
void set*(***);
|
||||
*** get*();
|
||||
}
|
||||
|
||||
# We want to keep methods in Activity that could be used in the XML attribute onClick
|
||||
-keepclassmembers class * extends android.app.Activity {
|
||||
public void *(android.view.View);
|
||||
}
|
||||
|
||||
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
|
||||
-keepclassmembers enum * {
|
||||
public static **[] values();
|
||||
public static ** valueOf(java.lang.String);
|
||||
}
|
||||
|
||||
-keep class * implements android.os.Parcelable {
|
||||
public static final android.os.Parcelable$Creator *;
|
||||
}
|
||||
|
||||
-keepclassmembers class **.R$* {
|
||||
public static <fields>;
|
||||
}
|
||||
|
||||
# The support library contains references to newer platform versions.
|
||||
# Don't warn about those in case this app is linking against an older
|
||||
# platform version. We know about them, and they are safe.
|
||||
-dontwarn android.support.**
|
||||
|
||||
-keep public class com.ridelogger.SettingsActivity$GeneralFragment
|
||||
-keep public class com.ridelogger.SettingsActivity$AntFragment
|
||||
-keep public class com.ridelogger.SettingsActivity$SensorsFragment
|
||||
@@ -1,15 +0,0 @@
|
||||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
proguard.config=proguard-android-optimize.txt
|
||||
|
||||
# Project target.
|
||||
target=android-21
|
||||
min=android-14
|
||||
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE AndroidXML>
|
||||
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/LayoutData"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:numColumns="auto_fit"
|
||||
android:stretchMode="columnWidth"
|
||||
android:gravity="right"
|
||||
/>
|
||||
@@ -1,13 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<preference-headers
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<header android:fragment="com.ridelogger.SettingsActivity$GeneralFragment"
|
||||
android:title="@string/setting_general_title"
|
||||
android:summary="@string/setting_general_note" />
|
||||
<header android:fragment="com.ridelogger.SettingsActivity$AntFragment"
|
||||
android:title="@string/setting_ant_title"
|
||||
android:summary="@string/setting_ant_note" />
|
||||
<header android:fragment="com.ridelogger.SettingsActivity$SensorsFragment"
|
||||
android:title="@string/setting_sensors_title"
|
||||
android:summary="@string/setting_sensors_note" />
|
||||
</preference-headers>
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item android:id="@+id/Start"
|
||||
android:title="@string/start" />
|
||||
<item android:id="@+id/Stop"
|
||||
android:title="@string/stop" />
|
||||
<item android:id="@+id/Settings"
|
||||
android:title="@string/edit_settings"
|
||||
android:showAsAction="never" />
|
||||
</menu>
|
||||
@@ -1,97 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE AndroidXML>
|
||||
<resources>
|
||||
<string name="app_name">Ride Logger</string>
|
||||
<string name="service_name">Logging Ride</string>
|
||||
|
||||
<string name="emergency_contact_dialog_title">Emergency Contact</string>
|
||||
<string name="emergency_contact_dialog_note">Should a text messesage be sent on ride start and periodically to let your emergency contact know you are alright?</string>
|
||||
|
||||
<string name="sms_period_dialog_title">Emergency Contact SMS Period</string>
|
||||
<string name="sms_period_dialog_note">Period in Minutes:</string>
|
||||
|
||||
<string name="crash_detection_dialog_title">Crash Detection</string>
|
||||
<string name="crash_detection_dialog_note">Should a text messesage be sent on crash detction to your emergency contact?</string>
|
||||
|
||||
<string name="emergency_contact_number_dialog_title">Emergency Contact Number</string>
|
||||
<string name="emergency_contact_number_dialog_note">Emergency phone number to update position on crash detection</string>
|
||||
|
||||
<string name="ant_setup_title">Set Ant+</string>
|
||||
<string name="ant_setup_note">Pair your Ant+ devices now?</string>
|
||||
|
||||
<string name="ant_pair_dialog_title">Select Ant Devices</string>
|
||||
<string name="ant_pair_dialog_button_note">Pair</string>
|
||||
|
||||
<string name="gc_rider_name_dialog_title">Enter Rider Name</string>
|
||||
<string name="gc_rider_name_dialog_note">What is your Golder Cheata Rider Name?</string>
|
||||
|
||||
<string name="save_setting_button">Next</string>
|
||||
<string name="skip_setting_button">Skip</string>
|
||||
|
||||
<string name="boolean_dialog_yes">Yes</string>
|
||||
<string name="boolean_dialog_no">No</string>
|
||||
|
||||
<string name="starting_ride">Starting Ride!</string>
|
||||
<string name="stopping_ride">Stoping Ride!</string>
|
||||
|
||||
<string name="ride_on">Ride On</string>
|
||||
<string name="building_ride">Building ride: </string>
|
||||
|
||||
<string name="click_to_stop"> Click to stop ride.</string>
|
||||
|
||||
<string name="ride_start_title">Start Ride</string>
|
||||
<string name="ride_start_note">Make sure locations is turned on. Internet connection is NOT required.</string>
|
||||
|
||||
<string name="start">Start Logging</string>
|
||||
<string name="edit_settings">Settings</string>
|
||||
|
||||
<string name="ride_stop_title">Ride in Progress</string>
|
||||
<string name="ride_stop_note">Would you like to stop the ride or view current values.</string>
|
||||
|
||||
<string name="stop">Stop Logging</string>
|
||||
<string name="view">View</string>
|
||||
|
||||
<string name="crash_warning">WARNING CRASH!</string>
|
||||
<string name="crash_confirm">CRASH CONFIRMED!</string>
|
||||
<string name="crash_unknow_location">Unknow location.</string>
|
||||
<string name="crash_magnitude">Mag</string>
|
||||
|
||||
<string name="ride_start_sms">I\'m starting my ride.</string>
|
||||
<string name="ride_stop_sms">I have finished my ride.</string>
|
||||
<string name="riding_ok_sms">I\'m ok.</string>
|
||||
|
||||
<string name="setting_title">Settings</string>
|
||||
|
||||
<string name="setting_general_title">General</string>
|
||||
<string name="setting_general_note">Settings</string>
|
||||
|
||||
<string name="setting_ant_title">Ant+</string>
|
||||
<string name="setting_ant_note">Setup your Ant+ Devices</string>
|
||||
|
||||
<string name="searching_for_ants">Searching for Ant+ Devices...</string>
|
||||
<string name="found_ants">Found Ant+ Devices, Press to Pair.</string>
|
||||
<string name="no_found_ants">Nothing found to pair.</string>
|
||||
|
||||
<string name="setting_sensors_title">Display Sensors</string>
|
||||
<string name="setting_sensors_note">List of Sensors Display</string>
|
||||
|
||||
<string name="setting_wheel_size">Wheel Circumference in Meters</string>
|
||||
|
||||
<string name="imperial_units_title">Imperial Units</string>
|
||||
<string name="imperial_units_note">Show Measurements in Imperial Units</string>
|
||||
|
||||
<string name="setting_size_title">Display Text Size</string>
|
||||
|
||||
<string name="PREFS_NAME">RideLogger</string>
|
||||
<string name="PREF_RIDER_NAME">RiderName</string>
|
||||
<string name="PREF_EMERGENCY_NUMBER">EmergencyNumbuer</string>
|
||||
<string name="PREF_DETECT_CRASH">DetectCrash</string>
|
||||
<string name="PREF_PHONE_HOME">PhoneHome</string>
|
||||
<string name="PREF_PAIRED_ANTS">PairedAnts</string>
|
||||
<string name="PREF_PHONE_HOME_PERIOD">PhoneHomePeriod</string>
|
||||
<string name="PREF_TRACKING_SENSORS">TrackingSensors</string>
|
||||
<string name="PREF_TRACKING_SIZE">TrackingSize</string>
|
||||
<string name="PREF_TRACKING_IMPERIAL_UNITS">TrackingImperialUnits</string>
|
||||
<string name="PREF_WHEEL_SIZE">WheelSize</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<PreferenceCategory
|
||||
android:title="@string/PREFS_NAME">
|
||||
|
||||
<MultiSelectListPreference
|
||||
android:key="@string/PREF_PAIRED_ANTS"
|
||||
android:title="@string/ant_pair_dialog_title"
|
||||
android:summary="@string/ant_pair_dialog_button_note"
|
||||
/>
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_WHEEL_SIZE"
|
||||
android:title="@string/setting_wheel_size"
|
||||
android:defaultValue="2.096"
|
||||
/>
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<PreferenceCategory
|
||||
android:title="@string/PREFS_NAME"
|
||||
android:persistent="true">
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_RIDER_NAME"
|
||||
android:title="@string/gc_rider_name_dialog_title"
|
||||
android:summary="@string/gc_rider_name_dialog_note" />
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_EMERGENCY_NUMBER"
|
||||
android:title="@string/emergency_contact_number_dialog_title"
|
||||
android:summary="@string/emergency_contact_number_dialog_note" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:layout="?android:attr/preferenceLayoutChild"
|
||||
android:dependency="@string/PREF_EMERGENCY_NUMBER"
|
||||
android:key="@string/PREF_DETECT_CRASH"
|
||||
android:title="@string/crash_detection_dialog_title"
|
||||
android:summary="@string/crash_detection_dialog_note" />
|
||||
|
||||
<!-- The visual style of a child is defined by this styled theme attribute. -->
|
||||
<CheckBoxPreference
|
||||
android:layout="?android:attr/preferenceLayoutChild"
|
||||
android:dependency="@string/PREF_EMERGENCY_NUMBER"
|
||||
android:key="@string/PREF_PHONE_HOME"
|
||||
android:title="@string/emergency_contact_dialog_title"
|
||||
android:summary="@string/emergency_contact_dialog_note" />
|
||||
|
||||
<EditTextPreference
|
||||
android:layout="?android:attr/preferenceLayoutChild"
|
||||
android:dependency="@string/PREF_PHONE_HOME"
|
||||
android:key="@string/PREF_PHONE_HOME_PERIOD"
|
||||
android:title="@string/sms_period_dialog_title"
|
||||
android:summary="@string/sms_period_dialog_note"
|
||||
android:defaultValue="20" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
@@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<PreferenceCategory
|
||||
android:title="@string/PREFS_NAME">
|
||||
|
||||
<MultiSelectListPreference
|
||||
android:key="@string/PREF_TRACKING_SENSORS"
|
||||
android:title="@string/setting_sensors_title"
|
||||
android:summary="@string/setting_sensors_note"
|
||||
/>
|
||||
<CheckBoxPreference
|
||||
android:key="@string/PREF_TRACKING_IMPERIAL_UNITS"
|
||||
android:title="@string/imperial_units_title"
|
||||
android:summary="@string/imperial_units_note"
|
||||
/>
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_TRACKING_SIZE"
|
||||
android:title="@string/setting_size_title"
|
||||
android:defaultValue="20"
|
||||
/>
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
@@ -1,281 +0,0 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Typeface;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.GridView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class CurrentValuesAdapter extends BaseAdapter {
|
||||
private StartActivity context;
|
||||
|
||||
private int[] keys;
|
||||
private String[] values;
|
||||
private String[] keyLabels;
|
||||
private int size = 20;
|
||||
private boolean imperial = false;
|
||||
private SharedPreferences settings = null;
|
||||
|
||||
private GridView layout;
|
||||
|
||||
public CurrentValuesAdapter(StartActivity c, GridView pLayout) {
|
||||
context = c;
|
||||
layout = pLayout;
|
||||
|
||||
layout.setBackgroundColor(Color.BLACK);
|
||||
layout.setVerticalSpacing(4);
|
||||
layout.setHorizontalSpacing(4);
|
||||
|
||||
settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Set<String> sensors = settings.getStringSet(context.getString(R.string.PREF_TRACKING_SENSORS), null);
|
||||
|
||||
size = Integer.valueOf(settings.getString(context.getString(R.string.PREF_TRACKING_SIZE), "20"));
|
||||
imperial = settings.getBoolean(context.getString(R.string.PREF_TRACKING_IMPERIAL_UNITS), false);
|
||||
|
||||
initKeys(sensors);
|
||||
initKeyLables();
|
||||
initValues();
|
||||
|
||||
settings.registerOnSharedPreferenceChangeListener(
|
||||
new SharedPreferences.OnSharedPreferenceChangeListener() {
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String pkey) {
|
||||
if(pkey == context.getString(R.string.PREF_TRACKING_SIZE)) {
|
||||
size = Integer.valueOf(sharedPreferences.getString(context.getString(R.string.PREF_TRACKING_SIZE), "20"));
|
||||
setupWidth();
|
||||
notifyDataSetChanged();
|
||||
} else if (pkey == context.getString(R.string.PREF_TRACKING_SENSORS)) {
|
||||
Set<String> sensors = sharedPreferences.getStringSet(context.getString(R.string.PREF_TRACKING_SENSORS), null);
|
||||
|
||||
initKeys(sensors);
|
||||
initKeyLables();
|
||||
initValues();
|
||||
|
||||
layout.setAdapter(CurrentValuesAdapter.this);
|
||||
notifyDataSetChanged();
|
||||
} else if (pkey == context.getString(R.string.PREF_TRACKING_IMPERIAL_UNITS)) {
|
||||
imperial = sharedPreferences.getBoolean(pkey, false);
|
||||
|
||||
initKeyLables();
|
||||
initValues();
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
private void initKeys(Set<String> sensors) {
|
||||
if(sensors != null && sensors.size() > 0) {
|
||||
keys = new int[sensors.size()];
|
||||
int i = 0;
|
||||
for(String sensor : sensors) {
|
||||
keys[i] = Integer.parseInt(sensor);
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
keys = new int[RideService.KEYS.length];
|
||||
for (int i = 0; i < RideService.KEYS.length; i++) {
|
||||
keys[i] = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initKeyLables() {
|
||||
keyLabels = new String[keys.length];
|
||||
|
||||
if(!imperial) {
|
||||
for(int key : keys) {
|
||||
keyLabels[key] = RideService.KEYS[key].toString().toLowerCase();
|
||||
}
|
||||
} else {
|
||||
for(int key : keys) {
|
||||
switch (key) {
|
||||
case RideService.ALTITUDE:
|
||||
keyLabels[key] = "ft";
|
||||
break;
|
||||
|
||||
case RideService.KPH:
|
||||
keyLabels[key] = "mph";
|
||||
break;
|
||||
|
||||
case RideService.KM:
|
||||
keyLabels[key] = "m";
|
||||
break;
|
||||
|
||||
default:
|
||||
keyLabels[key] = RideService.KEYS[key].toString().toLowerCase();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initValues() {
|
||||
values = new String[keys.length];
|
||||
for (int key : keys) {
|
||||
if(key == RideService.SECS) {
|
||||
values[key] = "00:00:00";
|
||||
} else {
|
||||
values[key] = "0.0";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private RelativeLayout newRelativeLayout(int key) {
|
||||
RelativeLayout view = new RelativeLayout(context);
|
||||
view.setBackgroundColor(Color.WHITE);
|
||||
|
||||
TextView valueView = newValueTv(key);
|
||||
TextView keyView = newKeyTv(key);
|
||||
|
||||
RelativeLayout.LayoutParams valueLayoutParams = new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT,
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
|
||||
valueLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
|
||||
valueLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
|
||||
view.addView(valueView, valueLayoutParams);
|
||||
|
||||
RelativeLayout.LayoutParams keyLayoutParams = new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT,
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
|
||||
keyLayoutParams.addRule(RelativeLayout.BELOW, valueView.getId());
|
||||
keyLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
|
||||
keyLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
|
||||
view.addView(keyView, keyLayoutParams);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
|
||||
private TextView newValueTv(int key){
|
||||
TextView tv = new TextView(context);
|
||||
tv.setTextAppearance(context, android.R.attr.textAppearanceLarge);
|
||||
tv.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
|
||||
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
|
||||
tv.setText(values[key]);
|
||||
tv.setId(key + 1);
|
||||
return tv;
|
||||
}
|
||||
|
||||
|
||||
private TextView newKeyTv(int key){
|
||||
TextView tv = new TextView(context);
|
||||
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
|
||||
tv.setBackgroundColor(Color.LTGRAY);
|
||||
tv.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
|
||||
tv.setPadding(4, 1, 4, 1);
|
||||
tv.setText(keyLabels[key]);
|
||||
return tv;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return keys.length;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
if (convertView == null) {
|
||||
return newRelativeLayout(keys[position]);
|
||||
} else {
|
||||
RelativeLayout view = (RelativeLayout) convertView;
|
||||
TextView valueView = (TextView) (view.getChildAt(0));
|
||||
TextView valueKey = (TextView) (view.getChildAt(1));
|
||||
|
||||
if(valueView.getText() != values[keys[position]])
|
||||
valueView.setText(values[keys[position]]);
|
||||
|
||||
valueView.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
|
||||
|
||||
if(valueKey.getText() != keyLabels[keys[position]])
|
||||
valueKey.setText(keyLabels[keys[position]]);
|
||||
|
||||
return convertView;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void update(float[] current_float_values) {
|
||||
for (int key: keys) {
|
||||
if(key == RideService.SECS) {
|
||||
int hr = (int) (current_float_values[key]/3600);
|
||||
int rem = (int) (current_float_values[key]%3600);
|
||||
int mn = rem/60;
|
||||
int sec = rem%60;
|
||||
|
||||
values[key] = (hr<10 ? "0" : "") + hr + ":" + (mn<10 ? "0" : "") + mn + ":" + (sec<10 ? "0" : "")+sec;
|
||||
} else if(!imperial) {
|
||||
values[key] = String.format("%.1f", current_float_values[key]);
|
||||
} else {
|
||||
switch (key) {
|
||||
case RideService.ALTITUDE:
|
||||
values[key] = String.format("%.1f", current_float_values[key] * 3.28084);
|
||||
break;
|
||||
|
||||
case RideService.KPH:
|
||||
values[key] = String.format("%.1f", current_float_values[key] * 0.621371);
|
||||
break;
|
||||
|
||||
case RideService.KM:
|
||||
values[key] = String.format("%.1f", current_float_values[key] * 0.621371);
|
||||
break;
|
||||
|
||||
default:
|
||||
values[key] = String.format("%.1f", current_float_values[key]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the size of the cell basted on 8 chars wide and the configured size param
|
||||
* @return int
|
||||
*/
|
||||
private void setupWidth() {
|
||||
TextView tv = new TextView(context);
|
||||
tv.setTextAppearance(context, android.R.attr.textAppearanceLarge);
|
||||
tv.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
|
||||
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
|
||||
tv.setText(String.format("%.1f", 1111.11));
|
||||
|
||||
Rect bounds = new Rect();
|
||||
tv.getPaint().getTextBounds("00:00:00", 0, "00:00:00".length(), bounds);
|
||||
|
||||
layout.setColumnWidth(bounds.width() + 16);
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
public class GzipWriter extends GZIPOutputStream {
|
||||
public GzipWriter(OutputStream os) throws IOException {
|
||||
super(os);
|
||||
}
|
||||
|
||||
public void write(String data) throws IOException {
|
||||
super.write(data.getBytes());
|
||||
}
|
||||
|
||||
public void write(float data) throws IOException {
|
||||
super.write(Float.floatToIntBits(data));
|
||||
}
|
||||
|
||||
public void write(CharSequence data) throws IOException {
|
||||
byte[] barr = new byte[data.length()];
|
||||
for (int i = 0; i < barr.length; i++) {
|
||||
barr[i] = (byte) data.charAt(i);
|
||||
}
|
||||
|
||||
super.write(barr);
|
||||
}
|
||||
}
|
||||
@@ -1,417 +0,0 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceType;
|
||||
import com.dsi.ant.plugins.utility.log.LogAnt;
|
||||
import com.ridelogger.formats.BaseFormat;
|
||||
import com.ridelogger.formats.JsonFormat;
|
||||
import com.ridelogger.listners.Base;
|
||||
import com.ridelogger.listners.Gps;
|
||||
import com.ridelogger.listners.HeartRate;
|
||||
import com.ridelogger.listners.Power;
|
||||
import com.ridelogger.listners.Sensors;
|
||||
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.app.TaskStackBuilder;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import android.os.RemoteException;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.telephony.PhoneNumberUtils;
|
||||
import android.telephony.SmsManager;
|
||||
|
||||
|
||||
/**
|
||||
* RideService
|
||||
* @author Chet Henry
|
||||
* Performs ride logging from sensors as an android service
|
||||
*/
|
||||
public class RideService extends Service
|
||||
{
|
||||
public static final int notifyID = 1; //Id of the notification in the top android bar that this class creates and alters
|
||||
|
||||
public static final int SECS = 0;
|
||||
public static final int KPH = 1;
|
||||
public static final int ALTITUDE = 2;
|
||||
public static final int bearing = 3;
|
||||
public static final int gpsa = 4;
|
||||
public static final int LAT = 5;
|
||||
public static final int LON = 6;
|
||||
public static final int HR = 7;
|
||||
public static final int WATTS = 8;
|
||||
public static final int NM = 9;
|
||||
public static final int CAD = 10;
|
||||
public static final int KM = 11;
|
||||
public static final int LTE = 12;
|
||||
public static final int RTE = 13;
|
||||
public static final int SNPLC = 14;
|
||||
public static final int SNPR = 15;
|
||||
public static final int ms2x = 16;
|
||||
public static final int ms2y = 17;
|
||||
public static final int ms2z = 18;
|
||||
public static final int temp = 19;
|
||||
public static final int uTx = 20;
|
||||
public static final int uTy = 21;
|
||||
public static final int uTz = 22;
|
||||
public static final int press = 23;
|
||||
public static final int lux = 24;
|
||||
|
||||
public static CharSequence[] KEYS = {
|
||||
"SECS",
|
||||
"KPH",
|
||||
"ALTITUDE",
|
||||
"bearing",
|
||||
"gpsa",
|
||||
"LAT",
|
||||
"LON",
|
||||
"HR",
|
||||
"WATTS",
|
||||
"NM",
|
||||
"CAD",
|
||||
"KM",
|
||||
"LTE",
|
||||
"RTE",
|
||||
"SNPLC",
|
||||
"SNPR",
|
||||
"ms2x",
|
||||
"ms2y",
|
||||
"ms2z",
|
||||
"temp",
|
||||
"uTx",
|
||||
"uTy",
|
||||
"uTz",
|
||||
"press",
|
||||
"lux"
|
||||
};
|
||||
|
||||
public GzipWriter buf; //writes to log file buffered
|
||||
public long startTime; //start time of the ride
|
||||
public float[] currentValues = new float[RideService.KEYS.length]; //float array of current values
|
||||
private Messenger mMessenger = null; //class to send back current values if needed
|
||||
private boolean rideStarted = false; //have we started logging the ride
|
||||
private int sensor_index = 0; //current index of sensors
|
||||
private String emergencyNumbuer; //the number to send the messages to
|
||||
private Timer timer; //timer class to control the periodic messages
|
||||
private Timer timerUI; //timer class to control the periodic messages
|
||||
private Base<?>[] sensors; //list of sensors tracking
|
||||
public BaseFormat<?> fileFormat;
|
||||
|
||||
|
||||
/**
|
||||
* starts the ride on service start
|
||||
*/
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
startRide();
|
||||
return Service.START_NOT_STICKY;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* returns the messenger to talk to the app with
|
||||
*/
|
||||
@Override
|
||||
public IBinder onBind(Intent arg0) {
|
||||
mMessenger = new Messenger(new Handler() { // Handler of incoming messages from clients.
|
||||
Messenger replyTo;
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
if(timerUI != null) {
|
||||
timerUI.cancel();
|
||||
timerUI = null;
|
||||
}
|
||||
|
||||
timerUI = new Timer();
|
||||
|
||||
if(msg.replyTo != null) {
|
||||
replyTo = msg.replyTo;
|
||||
timerUI.scheduleAtFixedRate(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
Message msg = Message.obtain(null, 2, 0, 0);
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable("currentValues", currentValues);
|
||||
msg.setData(bundle);
|
||||
try {
|
||||
replyTo.send(msg);
|
||||
} catch (RemoteException e) {}
|
||||
}
|
||||
},
|
||||
1000,
|
||||
1000
|
||||
); //every second update the screen
|
||||
}
|
||||
}
|
||||
}); // Target we publish for clients to send messages to IncomingHandler.
|
||||
|
||||
return mMessenger.getBinder();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* releases the timer that sends messages to the app
|
||||
*/
|
||||
@Override
|
||||
public boolean onUnbind (Intent intent) {
|
||||
if(timerUI != null) {
|
||||
timerUI.cancel();
|
||||
timerUI = null;
|
||||
}
|
||||
|
||||
mMessenger = null;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* stop the ride on service stop
|
||||
*/
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
stopRide();
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* start a ride if there is not one started yet
|
||||
*/
|
||||
protected void startRide() {
|
||||
if(rideStarted) return;
|
||||
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
emergencyNumbuer = settings.getString(getString(R.string.PREF_EMERGENCY_NUMBER), "");
|
||||
currentValues[SECS] = (float) 0.0;
|
||||
|
||||
startTime = System.currentTimeMillis();
|
||||
|
||||
|
||||
Date startDate = new Date(startTime);
|
||||
|
||||
SimpleDateFormat startTimef = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
||||
SimpleDateFormat filef = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
SimpleDateFormat month = new SimpleDateFormat("MMMMM");
|
||||
SimpleDateFormat year = new SimpleDateFormat("yyyy");
|
||||
SimpleDateFormat day = new SimpleDateFormat("EEEEE");
|
||||
|
||||
startTimef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
filef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
month.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
year.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
day.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
|
||||
final String fileName = filef.format(startDate) + ".json.gz";
|
||||
|
||||
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
|
||||
fileFormat = new JsonFormat(this);
|
||||
fileFormat.createFile();
|
||||
fileFormat.writeHeader();
|
||||
|
||||
LogAnt.setDebugLevel(LogAnt.DebugLevel.NONE, this);
|
||||
|
||||
final Set<String> pairedAnts = settings.getStringSet(getString(R.string.PREF_PAIRED_ANTS), null);
|
||||
|
||||
if(pairedAnts != null && !pairedAnts.isEmpty()){
|
||||
sensors = new Base<?>[pairedAnts.size() + 2];
|
||||
for(String deviceNumber: pairedAnts) {
|
||||
DeviceType deviceType = DeviceType.getValueFromInt(settings.getInt(deviceNumber, 0));
|
||||
switch (deviceType) {
|
||||
case BIKE_CADENCE:
|
||||
break;
|
||||
case BIKE_POWER:
|
||||
sensors[sensor_index++] = new Power(Integer.valueOf(deviceNumber), this);
|
||||
break;
|
||||
case BIKE_SPD:
|
||||
break;
|
||||
case BIKE_SPDCAD:
|
||||
break;
|
||||
case BLOOD_PRESSURE:
|
||||
break;
|
||||
case ENVIRONMENT:
|
||||
break;
|
||||
case WEIGHT_SCALE:
|
||||
break;
|
||||
case HEARTRATE:
|
||||
sensors[sensor_index++] = new HeartRate(Integer.valueOf(deviceNumber), this);
|
||||
break;
|
||||
case STRIDE_SDM:
|
||||
break;
|
||||
case FITNESS_EQUIPMENT:
|
||||
break;
|
||||
case GEOCACHE:
|
||||
case CONTROLLABLE_DEVICE:
|
||||
break;
|
||||
case UNKNOWN:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sensors = new Base<?>[4];
|
||||
sensors[sensor_index++] = new HeartRate(0, this);
|
||||
sensors[sensor_index++] = new Power(0, this);
|
||||
}
|
||||
|
||||
sensors[sensor_index++] = new Gps(this);
|
||||
sensors[sensor_index++] = new Sensors(this);
|
||||
}
|
||||
rideStarted = true;
|
||||
|
||||
if(settings.getBoolean(getString(R.string.PREF_PHONE_HOME), false)) {
|
||||
timer = new Timer();
|
||||
int period = Integer.parseInt(settings.getString(getString(R.string.PREF_PHONE_HOME_PERIOD), "10"));
|
||||
|
||||
timer.scheduleAtFixedRate(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
phoneHome();
|
||||
}
|
||||
},
|
||||
60000 * period,
|
||||
60000 * period
|
||||
); //every ten min let them know where you are at
|
||||
phoneStart();
|
||||
}
|
||||
|
||||
//build the notification in the top android drawer
|
||||
NotificationCompat.Builder mBuilder = new NotificationCompat
|
||||
.Builder(this)
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setContentTitle(getString(R.string.ride_on))
|
||||
.setContentText(getString(R.string.building_ride) + " " + fileName + " " + getString(R.string.click_to_stop))
|
||||
.setProgress(0, 0, true)
|
||||
.setContentIntent(
|
||||
TaskStackBuilder
|
||||
.create(this)
|
||||
.addParentStack(StartActivity.class)
|
||||
.addNextIntent(new Intent(this, StartActivity.class))
|
||||
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||
);
|
||||
|
||||
startForeground(notifyID, mBuilder.build());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let a love one know where you are at about every 10 min
|
||||
*/
|
||||
public void phoneCrash(double mag) {
|
||||
smsHome(
|
||||
getString(R.string.crash_warning) + "\n" + getLocationLink()
|
||||
+ "\n " + getString(R.string.crash_magnitude) + ": " + String.valueOf(mag)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* confirm the crash if we are not moving
|
||||
*/
|
||||
public void phoneCrashConfirm() {
|
||||
smsHome(getString(R.string.crash_confirm) + "!\n" + getLocationLink());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let them know we are starting
|
||||
*/
|
||||
public void phoneStart() {
|
||||
smsWithLocation(getString(R.string.ride_start_sms));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let them know we are stopping
|
||||
*/
|
||||
public void phoneStop() {
|
||||
smsWithLocation(getString(R.string.ride_stop_sms));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* send an sms with location
|
||||
*/
|
||||
public void smsWithLocation(String body) {
|
||||
smsHome(body + "\n " + getLocationLink());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let a love one know where you are at about every 10 min
|
||||
*/
|
||||
public void phoneHome() {
|
||||
smsWithLocation(getString(R.string.riding_ok_sms));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* send a sms message
|
||||
*/
|
||||
public void smsHome(String body) {
|
||||
SmsManager smsManager = SmsManager.getDefault();
|
||||
if(emergencyNumbuer != null && PhoneNumberUtils.isWellFormedSmsAddress(emergencyNumbuer)) {
|
||||
smsManager.sendTextMessage(emergencyNumbuer, null, body, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
public String getLocationLink() {
|
||||
if(currentValues[LAT] != 0.0 || currentValues[LON] != 0.0) {
|
||||
return "https://www.google.com/maps/place/" + currentValues[LAT] + "," + currentValues[LON];
|
||||
}
|
||||
return getString(R.string.crash_unknow_location);
|
||||
}
|
||||
|
||||
|
||||
//stop the ride and clean up resources
|
||||
protected void stopRide() {
|
||||
if(!rideStarted) return;
|
||||
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
if(settings.getBoolean(getString(R.string.PREF_PHONE_HOME), false)) {
|
||||
phoneStop();
|
||||
}
|
||||
|
||||
for(Base<?> sensor: sensors) {
|
||||
if(sensor != null) {
|
||||
sensor.onDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
//stop the phoneHome timer if we need to.
|
||||
if(timer != null) {
|
||||
timer.cancel();
|
||||
timer = null;
|
||||
}
|
||||
|
||||
if(timerUI != null) {
|
||||
timerUI.cancel();
|
||||
timerUI = null;
|
||||
}
|
||||
|
||||
fileFormat.writeFooter();
|
||||
|
||||
rideStarted = false;
|
||||
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mNotificationManager.cancel(notifyID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,274 +0,0 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceType;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.MultiDeviceSearch;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.MultiDeviceSearch.MultiDeviceSearchResult;
|
||||
import com.dsi.ant.plugins.utility.log.LogAnt;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningServiceInfo;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.Editor;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.preference.MultiSelectListPreference;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
public class SettingsActivity extends PreferenceActivity {
|
||||
|
||||
static ArrayList<MultiDeviceSearchResult> foundDevices = new ArrayList<MultiDeviceSearchResult>();
|
||||
|
||||
/**
|
||||
* This fragment contains a second-level set of preference that you
|
||||
* can get to by tapping an item in the first preferences fragment.
|
||||
*/
|
||||
public static class GeneralFragment extends PreferenceFragment {
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
// Load the preferences from an XML resource
|
||||
addPreferencesFromResource(R.xml.general_settings);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
// TODO Auto-generated method stub
|
||||
super.onResume();
|
||||
|
||||
if(((SettingsActivity) getActivity()).getServiceRunning(RideService.class) != null) {
|
||||
Preference pref = findPreference(getString(R.string.PREF_RIDER_NAME));
|
||||
pref.setEnabled(false);
|
||||
|
||||
pref = findPreference(getString(R.string.PREF_EMERGENCY_NUMBER));
|
||||
pref.setEnabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This fragment contains a second-level set of preference that you
|
||||
* can get to by tapping an item in the first preferences fragment.
|
||||
*/
|
||||
public static class SensorsFragment extends PreferenceFragment {
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addPreferencesFromResource(R.xml.sensors_settings);
|
||||
MultiSelectListPreference mMultiSelectListPreference = (MultiSelectListPreference) findPreference(getString(R.string.PREF_TRACKING_SENSORS));
|
||||
mMultiSelectListPreference.setEntries( RideService.KEYS );
|
||||
|
||||
CharSequence[] keys = new CharSequence[RideService.KEYS.length];
|
||||
|
||||
for (int i = 0; i < RideService.KEYS.length; i++) {
|
||||
keys[i] = String.valueOf(i);
|
||||
}
|
||||
mMultiSelectListPreference.setEntryValues(keys);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isValidFragment(String fragment) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This fragment contains a second-level set of preference that you
|
||||
* can get to by tapping an item in the first preferences fragment.
|
||||
*/
|
||||
public static class AntFragment extends PreferenceFragment {
|
||||
private MultiDeviceSearch mSearch;
|
||||
private MultiSelectListPreference mMultiSelectListPreference;
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
// TODO Auto-generated method stub
|
||||
super.onConfigurationChanged(newConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addPreferencesFromResource(R.xml.ant_settings);
|
||||
mMultiSelectListPreference = (MultiSelectListPreference) findPreference(getString(R.string.PREF_PAIRED_ANTS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
// TODO Auto-generated method stub
|
||||
super.onResume();
|
||||
initAntSearch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* search for ant+ if we are not recording
|
||||
*/
|
||||
public void initAntSearch() {
|
||||
mMultiSelectListPreference.setEnabled(false);
|
||||
if(((SettingsActivity) getActivity()).getServiceRunning(RideService.class) == null) {
|
||||
mMultiSelectListPreference.setSummary(R.string.searching_for_ants);
|
||||
|
||||
setupAnt();
|
||||
|
||||
Timer timer = new Timer();
|
||||
final Handler handler = new Handler();
|
||||
|
||||
timer.schedule(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
if(mMultiSelectListPreference.getEntryValues().length > 0) {
|
||||
handler.post(new Runnable() {
|
||||
public void run() {
|
||||
mMultiSelectListPreference.setEnabled(true);
|
||||
mMultiSelectListPreference.setSummary(R.string.found_ants);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
handler.post(new Runnable() {
|
||||
public void run() {
|
||||
mMultiSelectListPreference.setEnabled(true);
|
||||
mMultiSelectListPreference.setSummary(R.string.no_found_ants);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
5000
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* try to pair some ant+ devices
|
||||
*/
|
||||
protected void setupAnt() {
|
||||
MultiDeviceSearch.SearchCallbacks mCallback;
|
||||
MultiDeviceSearch.RssiCallback mRssiCallback;
|
||||
|
||||
updateList(foundDevices);
|
||||
|
||||
LogAnt.setDebugLevel(LogAnt.DebugLevel.NONE, this.getActivity());
|
||||
|
||||
mCallback = new MultiDeviceSearch.SearchCallbacks(){
|
||||
public void onDeviceFound(final MultiDeviceSearchResult deviceFound)
|
||||
{
|
||||
if(!foundDevices.contains(deviceFound)) {
|
||||
foundDevices.add(deviceFound);
|
||||
updateList(foundDevices);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSearchStopped(RequestAccessResult arg0) {}
|
||||
};
|
||||
|
||||
mRssiCallback = new MultiDeviceSearch.RssiCallback() {
|
||||
@Override
|
||||
public void onRssiUpdate(final int resultId, final int rssi){}
|
||||
};
|
||||
|
||||
// start the multi-device search
|
||||
mSearch = new MultiDeviceSearch(this.getActivity(), EnumSet.allOf(DeviceType.class), mCallback, mRssiCallback);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* dialog of soon to be paired ant devices
|
||||
* @param foundDevices
|
||||
*/
|
||||
protected void updateList(final ArrayList<MultiDeviceSearchResult> foundDevices) {
|
||||
ArrayList<CharSequence> foundDevicesString = new ArrayList<CharSequence>();
|
||||
ArrayList<CharSequence> foundDevicesValues = new ArrayList<CharSequence>();
|
||||
|
||||
for(MultiDeviceSearchResult device : foundDevices) {
|
||||
foundDevicesString.add(device.getAntDeviceType() + ": " + String.valueOf(device.getAntDeviceNumber()));
|
||||
}
|
||||
|
||||
for(MultiDeviceSearchResult device : foundDevices) {
|
||||
foundDevicesValues.add(String.valueOf(device.getAntDeviceNumber()));
|
||||
}
|
||||
|
||||
if(mMultiSelectListPreference != null) {
|
||||
mMultiSelectListPreference.setEntries(
|
||||
foundDevicesString.toArray(new CharSequence[foundDevicesString.size()])
|
||||
);
|
||||
mMultiSelectListPreference.setEntryValues(
|
||||
foundDevicesValues.toArray(new CharSequence[foundDevicesValues.size()])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
if(mSearch != null) mSearch.close();
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Populate the activity with the top-level headers.
|
||||
*/
|
||||
@Override
|
||||
public void onBuildHeaders(List<Header> target) {
|
||||
loadHeadersFromResource(R.layout.settings, target);
|
||||
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
settings.registerOnSharedPreferenceChangeListener(
|
||||
new SharedPreferences.OnSharedPreferenceChangeListener() {
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String pkey) {
|
||||
if (pkey == getString(R.string.PREF_PAIRED_ANTS)) {
|
||||
Set<String> sensors = sharedPreferences.getStringSet(pkey, null);
|
||||
if(sensors != null && sensors.size() > 0) {
|
||||
Editor editor = sharedPreferences.edit();
|
||||
for(MultiDeviceSearchResult result : foundDevices) {
|
||||
sensors.contains(String.valueOf(result.getAntDeviceNumber()));
|
||||
editor.putInt(String.valueOf(result.getAntDeviceNumber()), result.getAntDeviceType().getIntValue());
|
||||
}
|
||||
editor.commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* is a service running or not
|
||||
* @param serviceClass
|
||||
* @return
|
||||
*/
|
||||
public RunningServiceInfo getServiceRunning(Class<?> serviceClass) {
|
||||
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||||
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (serviceClass.getName().equals(service.service.getClassName())) {
|
||||
return service;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,215 +0,0 @@
|
||||
package com.ridelogger;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningServiceInfo;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import android.os.RemoteException;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.GridView;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class StartActivity extends FragmentActivity
|
||||
{
|
||||
private MenuItem startMenu;
|
||||
private MenuItem stopMenu;
|
||||
|
||||
private ServiceConnection mConnection;
|
||||
static CurrentValuesAdapter currentValuesAdapter;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu items for use in the action bar
|
||||
MenuInflater inflater = getMenuInflater();
|
||||
inflater.inflate(R.menu.start_activity, menu);
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle presses on the action bar items
|
||||
if(item.getItemId() == R.id.Settings) {
|
||||
setupSettings();
|
||||
} else if(item.getItemId() == R.id.Start) {
|
||||
startRide();
|
||||
} else {
|
||||
stopRide();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* start up our class
|
||||
*/
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_dashboard);
|
||||
|
||||
GridView layout = (GridView) findViewById(R.id.LayoutData);
|
||||
currentValuesAdapter = new CurrentValuesAdapter(this, layout);
|
||||
layout.setAdapter(currentValuesAdapter);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
bindToService();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
unBindToService();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
unBindToService();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* setup the settings for the user
|
||||
*/
|
||||
private void setupSettings() {
|
||||
Intent intent = new Intent(this, SettingsActivity.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* stop ride and clean up references
|
||||
*/
|
||||
private void stopRide() {
|
||||
Toast toast = Toast.makeText(getApplicationContext(), getString(R.string.stopping_ride), Toast.LENGTH_LONG);
|
||||
toast.show();
|
||||
|
||||
Intent rsi = new Intent(this, RideService.class);
|
||||
this.stopService(rsi);
|
||||
finish();
|
||||
}
|
||||
|
||||
static final Handler mHandler = new Handler(){
|
||||
@Override
|
||||
public void handleMessage(Message msg_internal) {
|
||||
updateValues(msg_internal.getData());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* tell the service to start sending us messages with current values
|
||||
*/
|
||||
private void bindToService() {
|
||||
RunningServiceInfo service = getServiceRunning(RideService.class);
|
||||
|
||||
if(service != null) {
|
||||
mConnection = new ServiceConnection() {
|
||||
public void onServiceConnected(ComponentName className, IBinder service) {
|
||||
Messenger mService = new Messenger(service);
|
||||
try {
|
||||
Message msg = Message.obtain();
|
||||
msg.replyTo = new Messenger(mHandler);
|
||||
|
||||
mService.send(msg);
|
||||
} catch (RemoteException e) {
|
||||
// In this case the service has crashed before we could even do anything with it
|
||||
}
|
||||
}
|
||||
|
||||
public void onServiceDisconnected(ComponentName className) {}
|
||||
};
|
||||
|
||||
bindService(new Intent(StartActivity.this, RideService.class), mConnection, Context.BIND_AUTO_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* tell the service to stop sending us messages with current values
|
||||
*/
|
||||
private void unBindToService() {
|
||||
if (mConnection != null) {
|
||||
// Detach our existing connection.
|
||||
unbindService(mConnection);
|
||||
mConnection = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* update the text fields with current values
|
||||
* @param bundle
|
||||
*/
|
||||
private static void updateValues(Bundle bundle) {
|
||||
currentValuesAdapter.update((float[]) bundle.getSerializable("currentValues"));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
|
||||
RunningServiceInfo service = getServiceRunning(RideService.class);
|
||||
startMenu = menu.findItem(R.id.Start);
|
||||
stopMenu = menu.findItem(R.id.Stop);
|
||||
if(service == null) {
|
||||
startMenu.setVisible(true);
|
||||
stopMenu.setVisible(false);
|
||||
} else {
|
||||
startMenu.setVisible(false);
|
||||
stopMenu.setVisible(true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* start the ride and notify the user of success
|
||||
*/
|
||||
private void startRide() {
|
||||
Intent rsi = new Intent(this, RideService.class);
|
||||
this.startService(rsi);
|
||||
|
||||
startMenu.setVisible(false);
|
||||
stopMenu.setVisible(true);
|
||||
|
||||
bindToService();
|
||||
|
||||
Toast toast = Toast.makeText(getApplicationContext(), getString(R.string.starting_ride), Toast.LENGTH_LONG);
|
||||
toast.show();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* is a service running or not
|
||||
* @param serviceClass
|
||||
* @return
|
||||
*/
|
||||
private RunningServiceInfo getServiceRunning(Class<?> serviceClass) {
|
||||
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||||
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (serviceClass.getName().equals(service.service.getClassName())) {
|
||||
return service;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
package com.ridelogger.formats;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import android.os.Environment;
|
||||
|
||||
import com.ridelogger.GzipWriter;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
|
||||
public class BaseFormat<T> {
|
||||
protected GzipWriter buf;
|
||||
protected RideService context;
|
||||
protected String subExt = "";
|
||||
|
||||
public BaseFormat(RideService rideService) {
|
||||
context = rideService;
|
||||
}
|
||||
|
||||
|
||||
public void createFile() {
|
||||
File dir = new File(
|
||||
Environment.getExternalStorageDirectory(),
|
||||
"Rides"
|
||||
);
|
||||
|
||||
dir.mkdirs();
|
||||
|
||||
Date startDate = new Date(context.startTime);
|
||||
SimpleDateFormat filef = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
String fileName = filef.format(startDate) + subExt + ".gz";
|
||||
|
||||
try {
|
||||
buf = new GzipWriter(new BufferedOutputStream(new FileOutputStream(new File(dir, fileName))));
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeHeader(){
|
||||
try {
|
||||
synchronized (buf) {
|
||||
for(CharSequence key : RideService.KEYS) {
|
||||
buf.write(key);
|
||||
buf.write(",");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeValues() {
|
||||
try {
|
||||
synchronized (buf) {
|
||||
for(float value : context.currentValues) {
|
||||
buf.write(value);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeFooter() {
|
||||
try {
|
||||
buf.close();
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
package com.ridelogger.formats;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import com.ridelogger.R;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
public class JsonFormat extends BaseFormat<Object> {
|
||||
public JsonFormat(RideService rideService) {
|
||||
super(rideService);
|
||||
subExt = ".json";
|
||||
}
|
||||
|
||||
public void writeHeader() {
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Date startDate = new Date(context.startTime);
|
||||
|
||||
SimpleDateFormat startTimef = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
||||
SimpleDateFormat filef = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
SimpleDateFormat month = new SimpleDateFormat("MMMMM");
|
||||
SimpleDateFormat year = new SimpleDateFormat("yyyy");
|
||||
SimpleDateFormat day = new SimpleDateFormat("EEEEE");
|
||||
|
||||
startTimef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
filef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
month.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
year.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
day.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
|
||||
try {
|
||||
buf.write("{" +
|
||||
"\"RIDE\":{" +
|
||||
"\"STARTTIME\":\"" + startTimef.format(startDate) + " UTC\"," +
|
||||
"\"RECINTSECS\":1," +
|
||||
"\"DEVICETYPE\":\"Android\"," +
|
||||
"\"IDENTIFIER\":\"\"," +
|
||||
"\"TAGS\":{" +
|
||||
"\"Athlete\":\"" + settings.getString(context.getString(R.string.PREF_RIDER_NAME), "") + "\"," +
|
||||
"\"Calendar Text\":\"Auto Recored Android Ride\"," +
|
||||
"\"Change History\":\"\"," +
|
||||
"\"Data\":\"\"," +
|
||||
"\"Device\":\"\"," +
|
||||
"\"Device Info\":\"\"," +
|
||||
"\"File Format\":\"\"," +
|
||||
"\"Filename\":\"\"," +
|
||||
"\"Month\":\"" + month.format(startDate) +"\"," +
|
||||
"\"Notes\":\"\"," +
|
||||
"\"Objective\":\"\"," +
|
||||
"\"Sport\":\"Bike\"," +
|
||||
"\"Weekday\":\"" + day.format(startDate) + "\"," +
|
||||
"\"Workout Code\":\"\"," +
|
||||
"\"Year\":\"" + year.format(startDate) + "\"" +
|
||||
"}," +
|
||||
"\"SAMPLES\":[{\"SECS\":0}");
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeValues() {
|
||||
try {
|
||||
synchronized (buf) {
|
||||
buf.write(",{");
|
||||
buf.write("\"");
|
||||
buf.write(RideService.KEYS[0]);
|
||||
buf.write("\":");
|
||||
buf.write(String.format("%f", context.currentValues[0]));
|
||||
|
||||
for (int i = 1; i < context.currentValues.length; i++) {
|
||||
buf.write(",\"");
|
||||
buf.write(RideService.KEYS[i]);
|
||||
buf.write("\":");
|
||||
buf.write(String.format("%f", context.currentValues[i]));
|
||||
}
|
||||
|
||||
buf.write("}");
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeFooter() {
|
||||
try {
|
||||
buf.write("]}}");
|
||||
|
||||
} catch (Exception e) {}
|
||||
super.writeFooter();
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceState;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.PccReleaseHandle;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IDeviceStateChangeReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IPluginAccessResultReceiver;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
|
||||
/**
|
||||
* Ant
|
||||
* @author Chet Henry
|
||||
* Listen to and log Ant+ events base class
|
||||
*/
|
||||
public abstract class Ant extends Base<Object>
|
||||
{
|
||||
protected PccReleaseHandle<?> releaseHandle; //Handle class
|
||||
public IPluginAccessResultReceiver<?> mResultReceiver; //Receiver class
|
||||
protected int deviceNumber = 0;
|
||||
|
||||
|
||||
//setup listeners and logging
|
||||
public Ant(int pDeviceNumber, RideService mContext)
|
||||
{
|
||||
super(mContext);
|
||||
deviceNumber = pDeviceNumber;
|
||||
}
|
||||
|
||||
|
||||
public IDeviceStateChangeReceiver mDeviceStateChangeReceiver = new IDeviceStateChangeReceiver()
|
||||
{
|
||||
@Override
|
||||
public void onDeviceStateChange(final DeviceState newDeviceState){
|
||||
//if we lose a device zero out its values
|
||||
if(newDeviceState.equals(DeviceState.DEAD)) {
|
||||
zeroReadings();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
abstract protected void requestAccess();
|
||||
|
||||
|
||||
@Override
|
||||
public void onDestroy()
|
||||
{
|
||||
if(releaseHandle != null) {
|
||||
releaseHandle.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
/**
|
||||
* Base
|
||||
* @author Chet Henry
|
||||
* Base sensor class that has methods to time stamp are write to buffer
|
||||
*/
|
||||
public class Base<T>
|
||||
{
|
||||
public RideService context;
|
||||
|
||||
public Base(RideService mContext) {
|
||||
context = mContext;
|
||||
}
|
||||
|
||||
|
||||
public void alterCurrentData(int key, float value)
|
||||
{
|
||||
synchronized (context.currentValues) {
|
||||
context.currentValues[RideService.SECS] = getTs();
|
||||
context.currentValues[key] = value;
|
||||
context.fileFormat.writeValues();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void alterCurrentData(int[] keys, float[] values)
|
||||
{
|
||||
synchronized (context.currentValues) {
|
||||
context.currentValues[RideService.SECS] = getTs();
|
||||
|
||||
int i = 0;
|
||||
for (int key : keys) {
|
||||
context.currentValues[key] = values[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
context.fileFormat.writeValues();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//get current time stamp
|
||||
public float getTs() {
|
||||
return (float) ((System.currentTimeMillis() - context.startTime) / 1000.0);
|
||||
}
|
||||
|
||||
|
||||
//Clean up my listeners here
|
||||
public void onDestroy() {}
|
||||
|
||||
//zero any of my values
|
||||
public void zeroReadings() {}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import android.content.Context;
|
||||
import android.location.Location;
|
||||
import android.location.LocationListener;
|
||||
import android.location.LocationManager;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
/**
|
||||
* Gps
|
||||
* @author henry
|
||||
* Listen and log gps events
|
||||
*/
|
||||
public class Gps extends Base<Gps>
|
||||
{
|
||||
public Gps(RideService mContext)
|
||||
{
|
||||
super(mContext);
|
||||
|
||||
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
|
||||
|
||||
//listen to gps events and log them
|
||||
LocationListener locationListener = new LocationListener() {
|
||||
public void onLocationChanged(Location location) {
|
||||
int[] keys = {
|
||||
RideService.ALTITUDE,
|
||||
RideService.KPH,
|
||||
RideService.bearing,
|
||||
RideService.gpsa,
|
||||
RideService.LAT,
|
||||
RideService.LON
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
(float) location.getAltitude(),
|
||||
location.getSpeed(),
|
||||
location.getBearing(),
|
||||
location.getAccuracy(),
|
||||
(float) location.getLatitude(),
|
||||
(float) location.getLongitude()
|
||||
};
|
||||
|
||||
alterCurrentData(keys, values);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatusChanged(String provider, int status, Bundle extras) {}
|
||||
|
||||
@Override
|
||||
public void onProviderEnabled(String provider) {}
|
||||
|
||||
@Override
|
||||
public void onProviderDisabled(String provider) {}
|
||||
};
|
||||
|
||||
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusHeartRatePcc;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusHeartRatePcc.DataState;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusHeartRatePcc.IHeartRateDataReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceState;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.EventFlag;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IPluginAccessResultReceiver;
|
||||
import com.ridelogger.RideService;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.EnumSet;
|
||||
|
||||
/**
|
||||
* HeartRate
|
||||
* @author Chet Henry
|
||||
* Listen to and log Ant+ HearRate events
|
||||
*/
|
||||
public class HeartRate extends Ant
|
||||
{
|
||||
public IPluginAccessResultReceiver<AntPlusHeartRatePcc> mResultReceiver;
|
||||
|
||||
public HeartRate(int pDeviceNumber, RideService mContext) {
|
||||
super(pDeviceNumber, mContext);
|
||||
|
||||
mResultReceiver = new IPluginAccessResultReceiver<AntPlusHeartRatePcc>() {
|
||||
//Handle the result, connecting to events on success or reporting failure to user.
|
||||
@Override
|
||||
public void onResultReceived(AntPlusHeartRatePcc result, RequestAccessResult resultCode, DeviceState initialDeviceState)
|
||||
{
|
||||
if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SUCCESS) {
|
||||
deviceNumber = result.getAntDeviceNumber();
|
||||
result.subscribeHeartRateDataEvent(
|
||||
new IHeartRateDataReceiver() {
|
||||
@Override
|
||||
public void onNewHeartRateData(final long estTimestamp, EnumSet<EventFlag> eventFlags, final int computedHeartRate, final long heartBeatCount, final BigDecimal heartBeatEventTime, final DataState dataState) {
|
||||
alterCurrentData(RideService.HR, (float) computedHeartRate);
|
||||
}
|
||||
}
|
||||
);
|
||||
} else if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SEARCH_TIMEOUT) {
|
||||
if(deviceNumber != 0) {
|
||||
requestAccess();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
requestAccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected void requestAccess() {
|
||||
releaseHandle = AntPlusHeartRatePcc.requestAccess(context, deviceNumber, 0, mResultReceiver, mDeviceStateChangeReceiver);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void zeroReadings()
|
||||
{
|
||||
alterCurrentData(RideService.HR, (float) 0.0);
|
||||
}
|
||||
}
|
||||
@@ -1,223 +0,0 @@
|
||||
package com.ridelogger.listners;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.CalculatedWheelDistanceReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.CalculatedWheelSpeedReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.DataSource;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.ICalculatedCrankCadenceReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.ICalculatedPowerReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.ICalculatedTorqueReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.IInstantaneousCadenceReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.IRawPowerOnlyDataReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceState;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.EventFlag;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IPluginAccessResultReceiver;
|
||||
import com.ridelogger.R;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.EnumSet;
|
||||
|
||||
/**
|
||||
* Power
|
||||
* @author Chet Henry
|
||||
* Listen to and log Ant+ Power events
|
||||
*/
|
||||
public class Power extends Ant
|
||||
{
|
||||
public BigDecimal wheelCircumferenceInMeters; //size of wheel to calculate speed
|
||||
public IPluginAccessResultReceiver<AntPlusBikePowerPcc> mResultReceiver;
|
||||
|
||||
//setup listeners and logging
|
||||
public Power(int pDeviceNumber, RideService mContext) {
|
||||
super(pDeviceNumber, mContext);
|
||||
|
||||
wheelCircumferenceInMeters = new BigDecimal(
|
||||
PreferenceManager.getDefaultSharedPreferences(context).getString(context.getString(R.string.PREF_WHEEL_SIZE), "2.096")
|
||||
);
|
||||
|
||||
//Handle messages
|
||||
mResultReceiver = new IPluginAccessResultReceiver<AntPlusBikePowerPcc>() {
|
||||
//Handle the result, connecting to events on success or reporting failure to user.
|
||||
@Override
|
||||
public void onResultReceived(AntPlusBikePowerPcc result, RequestAccessResult resultCode, DeviceState initialDeviceState) {
|
||||
if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SUCCESS) {
|
||||
deviceNumber = result.getAntDeviceNumber();
|
||||
|
||||
result.subscribeCalculatedPowerEvent(new ICalculatedPowerReceiver() {
|
||||
@Override
|
||||
public void onNewCalculatedPower(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedPower) {
|
||||
alterCurrentData(RideService.WATTS, calculatedPower.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedTorqueEvent(
|
||||
new ICalculatedTorqueReceiver() {
|
||||
@Override
|
||||
public void onNewCalculatedTorque(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedTorque) {
|
||||
alterCurrentData(RideService.NM, calculatedTorque.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedCrankCadenceEvent(
|
||||
new ICalculatedCrankCadenceReceiver() {
|
||||
@Override
|
||||
public void onNewCalculatedCrankCadence(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedCrankCadence) {
|
||||
alterCurrentData(RideService.CAD, calculatedCrankCadence.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedWheelSpeedEvent(
|
||||
new CalculatedWheelSpeedReceiver(wheelCircumferenceInMeters) {
|
||||
@Override
|
||||
public void onNewCalculatedWheelSpeed(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedWheelSpeed)
|
||||
{
|
||||
alterCurrentData(RideService.KPH, calculatedWheelSpeed.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedWheelDistanceEvent(
|
||||
new CalculatedWheelDistanceReceiver(wheelCircumferenceInMeters) {
|
||||
@Override
|
||||
public void onNewCalculatedWheelDistance(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedWheelDistance)
|
||||
{
|
||||
alterCurrentData(RideService.KM, calculatedWheelDistance.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeInstantaneousCadenceEvent(
|
||||
new IInstantaneousCadenceReceiver() {
|
||||
@Override
|
||||
public void onNewInstantaneousCadence(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final int instantaneousCadence)
|
||||
{
|
||||
alterCurrentData(RideService.CAD, (float) instantaneousCadence);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeRawPowerOnlyDataEvent(
|
||||
new IRawPowerOnlyDataReceiver() {
|
||||
@Override
|
||||
public void onNewRawPowerOnlyData(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long powerOnlyUpdateEventCount, final int instantaneousPower, final long accumulatedPower)
|
||||
{
|
||||
alterCurrentData(RideService.WATTS, (float) instantaneousPower);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
/*result.subscribePedalPowerBalanceEvent(
|
||||
new IPedalPowerBalanceReceiver() {
|
||||
@Override
|
||||
public void onNewPedalPowerBalance(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final boolean rightPedalIndicator, final int pedalPowerPercentage)
|
||||
{
|
||||
alterCurrentData(RideService.LTE, pedalPowerPercentage);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeRawWheelTorqueDataEvent(
|
||||
new IRawWheelTorqueDataReceiver() {
|
||||
@Override
|
||||
public void onNewRawWheelTorqueData(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long wheelTorqueUpdateEventCount, final long accumulatedWheelTicks, final BigDecimal accumulatedWheelPeriod, final BigDecimal accumulatedWheelTorque)
|
||||
{
|
||||
alterCurrentData(RideService.NM, accumulatedWheelTorque);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeRawCrankTorqueDataEvent(
|
||||
new IRawCrankTorqueDataReceiver() {
|
||||
@Override
|
||||
public void onNewRawCrankTorqueData(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long crankTorqueUpdateEventCount, final long accumulatedCrankTicks, final BigDecimal accumulatedCrankPeriod, final BigDecimal accumulatedCrankTorque)
|
||||
{
|
||||
alterCurrentData(RideService.NM, accumulatedCrankTorque);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeTorqueEffectivenessEvent(
|
||||
new ITorqueEffectivenessReceiver() {
|
||||
@Override
|
||||
public void onNewTorqueEffectiveness(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long powerOnlyUpdateEventCount, final BigDecimal leftTorqueEffectiveness, final BigDecimal rightTorqueEffectiveness)
|
||||
{
|
||||
int[] keys = {
|
||||
RideService.LTE,
|
||||
RideService.RTE
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
leftTorqueEffectiveness,
|
||||
rightTorqueEffectiveness
|
||||
}
|
||||
|
||||
alterCurrentData(keys, values);
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribePedalSmoothnessEvent(new IPedalSmoothnessReceiver() {
|
||||
@Override
|
||||
public void onNewPedalSmoothness(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long powerOnlyUpdateEventCount, final boolean separatePedalSmoothnessSupport, final BigDecimal leftOrCombinedPedalSmoothness, final BigDecimal rightPedalSmoothness)
|
||||
{
|
||||
int[] keys = {
|
||||
RideService.SNPLC,
|
||||
RideService.SNPR
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
leftOrCombinedPedalSmoothness,
|
||||
rightPedalSmoothness
|
||||
}
|
||||
|
||||
alterCurrentData(map);
|
||||
}
|
||||
}
|
||||
);*/
|
||||
} else if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SEARCH_TIMEOUT) {
|
||||
if(deviceNumber != 0) {
|
||||
requestAccess();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
requestAccess();
|
||||
}
|
||||
|
||||
protected void requestAccess() {
|
||||
releaseHandle = AntPlusBikePowerPcc.requestAccess(context, deviceNumber, 0, mResultReceiver, mDeviceStateChangeReceiver);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void zeroReadings()
|
||||
{
|
||||
int[] keys = {
|
||||
RideService.WATTS,
|
||||
RideService.NM,
|
||||
RideService.CAD,
|
||||
RideService.KPH,
|
||||
RideService.KM
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
(float) 0.0,
|
||||
(float) 0.0,
|
||||
(float) 0.0,
|
||||
(float) 0.0,
|
||||
(float) 0.0
|
||||
};
|
||||
|
||||
alterCurrentData(keys, values);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,222 +0,0 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import com.ridelogger.R;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
/**
|
||||
* Sensors
|
||||
* @author Chet Henry
|
||||
* Listen to android sensor events and log them
|
||||
*/
|
||||
public class Sensors extends Base<Object>
|
||||
{
|
||||
public static final double CRASHMAGNITUDE = 30.0;
|
||||
|
||||
private SensorEventListener luxListner;
|
||||
private SensorEventListener accelListner;
|
||||
private SensorEventListener pressListner;
|
||||
private SensorEventListener tempListner;
|
||||
private SensorEventListener fieldListner;
|
||||
|
||||
public Sensors(RideService mContext)
|
||||
{
|
||||
super(mContext);
|
||||
|
||||
SensorManager mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||
|
||||
Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
|
||||
Sensor mAccel = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
|
||||
Sensor mPress = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
|
||||
Sensor mTemp = mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
|
||||
Sensor mField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
|
||||
|
||||
if(mLight != null) {
|
||||
luxListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
// The light sensor returns a single value.
|
||||
// Many sensors return 3 values, one for each axis.
|
||||
alterCurrentData(RideService.lux, event.values[0]);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(luxListner, mLight, 3000000);
|
||||
}
|
||||
|
||||
if(mAccel != null) {
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
if(settings.getBoolean(context.getString(R.string.PREF_DETECT_CRASH), false)) {
|
||||
accelListner = new SensorEventListener() {
|
||||
private boolean crashed = false;
|
||||
private Timer timer = new Timer();
|
||||
private double[] St = new double[3];
|
||||
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
int[] keys = {
|
||||
RideService.ms2x,
|
||||
RideService.ms2y,
|
||||
RideService.ms2z
|
||||
};
|
||||
|
||||
alterCurrentData(keys, event.values);
|
||||
|
||||
if(St.length == 0) {
|
||||
St[0] = event.values[0];
|
||||
St[1] = event.values[1];
|
||||
St[2] = event.values[2];
|
||||
}
|
||||
|
||||
St[0] = 0.6 * event.values[0] + 0.4 * St[0];
|
||||
St[1] = 0.6 * event.values[1] + 0.4 * St[1];
|
||||
St[2] = 0.6 * event.values[2] + 0.4 * St[2];
|
||||
|
||||
double amag = Math.sqrt(St[0]*St[0] + St[1]*St[1] + St[2]*St[2]);
|
||||
|
||||
if(amag > CRASHMAGNITUDE && !crashed) {
|
||||
crashed = true;
|
||||
context.phoneCrash(amag);
|
||||
|
||||
if(!Float.isNaN(context.currentValues[RideService.KPH])) {
|
||||
timer.schedule(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
//if we are traveling less then 1km/h at 5 seconds after crash detection
|
||||
// confirm the crash
|
||||
if(1.0 > context.currentValues[RideService.KPH]) {
|
||||
context.phoneCrashConfirm();
|
||||
} else {
|
||||
crashed = false;
|
||||
context.phoneHome();
|
||||
}
|
||||
}
|
||||
},
|
||||
5000
|
||||
); //in five sec reset
|
||||
} else {
|
||||
timer.schedule(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
crashed = false;
|
||||
}
|
||||
},
|
||||
180000
|
||||
); //in three min reset
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
} else {
|
||||
accelListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
int[] keys = {
|
||||
RideService.ms2x,
|
||||
RideService.ms2y,
|
||||
RideService.ms2z
|
||||
};
|
||||
|
||||
alterCurrentData(keys, event.values);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
mSensorManager.registerListener(accelListner, mAccel, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
|
||||
if(mPress != null) {
|
||||
pressListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
// The light sensor returns a single value.
|
||||
// Many sensors return 3 values, one for each axis.
|
||||
alterCurrentData(RideService.press, event.values[0]);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(pressListner, mPress, 3000000);
|
||||
}
|
||||
|
||||
if(mTemp != null) {
|
||||
tempListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
// The light sensor returns a single value.
|
||||
// Many sensors return 3 values, one for each axis.
|
||||
alterCurrentData(RideService.temp, event.values[0]);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(tempListner, mTemp, 3000000);
|
||||
}
|
||||
|
||||
if(mField != null) {
|
||||
fieldListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
int[] keys = {
|
||||
RideService.uTx,
|
||||
RideService.uTy,
|
||||
RideService.uTz
|
||||
};
|
||||
|
||||
alterCurrentData(keys, event.values);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(fieldListner, mField, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy()
|
||||
{
|
||||
SensorManager mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||
if(luxListner != null) {
|
||||
mSensorManager.unregisterListener(luxListner);
|
||||
}
|
||||
if(accelListner != null) {
|
||||
mSensorManager.unregisterListener(accelListner);
|
||||
}
|
||||
if(pressListner != null) {
|
||||
mSensorManager.unregisterListener(pressListner);
|
||||
}
|
||||
if(tempListner != null) {
|
||||
mSensorManager.unregisterListener(tempListner);
|
||||
}
|
||||
if(fieldListner != null) {
|
||||
mSensorManager.unregisterListener(fieldListner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
@@ -8,10 +8,10 @@ OTHER= 3d.png choose-a-cyclist.png cpint.gp cpint.png critical-power-plot.png cr
|
||||
pm.png power.zones realtime.png ride-plot.png ride-plot2.png ride-summary.png sample.gp \
|
||||
sample.png weekly-summary.png google-earth.png aerolab.png
|
||||
|
||||
BIN= GoldenCheetah_3.0.1_Mac_Universal.dmg \
|
||||
GoldenCheetah-3.0.1-1.fc18.x86_64.rpm \
|
||||
GoldenCheetah-3.0.1-1.fc19.x86_64.rpm \
|
||||
GoldenCheetah_3.0.1_Windows_Installer.exe
|
||||
BIN= GoldenCheetah_2.0.0_Linux_x86_64.gz \
|
||||
GoldenCheetah_2.0.0_Linux_x86.gz \
|
||||
GoldenCheetah_2.0.0_Mac_Universal.dmg \
|
||||
GoldenCheetah_2.0.0_Windows_Installer.exe
|
||||
|
||||
all: $(HTML)
|
||||
.PHONY: all clean install
|
||||
@@ -21,11 +21,11 @@ clean:
|
||||
|
||||
install:
|
||||
rsync -avz -e ssh $(HTML) $(TARBALLS) $(OTHER) \
|
||||
goldencheetah.org:/home/srhea/wwwroot/goldencheetah.org/
|
||||
liversedge@srhea.net:/home/srhea/wwwroot/goldencheetah.org/
|
||||
|
||||
install-bin:
|
||||
rsync -avz -e ssh $(BIN) \
|
||||
goldencheetah.org:/home/srhea/wwwroot/goldencheetah.org/
|
||||
srhea.net:/home/srhea/wwwroot/goldencheetah.org/
|
||||
|
||||
bug-tracker.html: bug-tracker.content genpage.pl
|
||||
./genpage.pl "Bug Tracker" $< > $@
|
||||
@@ -51,15 +51,6 @@ download.html: download.content genpage.pl
|
||||
release-notes.html: release-notes.content genpage.pl
|
||||
./genpage.pl "Release Notes" $< > $@
|
||||
|
||||
release-notes_2.1.0.html: release-notes_2.1.0.content genpage.pl
|
||||
./genpage.pl "Release Notes 2.1.0" $< > $@
|
||||
|
||||
release-notes_3.0.0.html: release-notes_3.0.0.content genpage.pl
|
||||
./genpage.pl "Release Notes 3.0.0" $< > $@
|
||||
|
||||
release-notes_3.0.1.html: release-notes_3.0.1.content genpage.pl
|
||||
./genpage.pl "Release Notes 3.0.1" $< > $@
|
||||
|
||||
faq.html: faq.content genpage.pl
|
||||
./genpage.pl "Frequently Asked Questions" $< > $@
|
||||
|
||||
@@ -81,9 +72,6 @@ search.html: search.content genpage.pl
|
||||
users-guide.html: users-guide.content genpage.pl
|
||||
./genpage.pl "User's Guide" $< > $@
|
||||
|
||||
wiki.html: wiki.content genpage.pl
|
||||
./genpage.pl "Wiki" $< > $@
|
||||
|
||||
wishlist.html: wishlist.content genpage.pl
|
||||
./genpage.pl "Wish List" $< > $@
|
||||
|
||||
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
97
doc/bug-tracker.content
Normal file
@@ -0,0 +1,97 @@
|
||||
<p>We have an issue tracker set up at
|
||||
<a href=http://bugs.goldencheetah.org/projects/show/goldencheetah>
|
||||
bugs.goldencheetah.org</a>. Below are some guidelines for users and
|
||||
developers for working with the issue tracker.</p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Report a new bug/feature
|
||||
</font></big>
|
||||
|
||||
<p> If you think that you have found a bug in GoldenCheetah or would like
|
||||
to request a new feature please report it by filing a new issue at our <a
|
||||
href=http://bugs.goldencheetah.org/projects/show/goldencheetah>issue
|
||||
tracker</a>. To report a bug/feature request go to the above link and
|
||||
follow these steps:
|
||||
|
||||
<ol>
|
||||
<li>Login or register for a new account.</li>
|
||||
<li>Click the "new issue" link near the top of the page.</li>
|
||||
<li>Select either "bug" or "feature" from the tracker drop-down menu.</li>
|
||||
<li>Fill out the form including as much detail as possible.<br>
|
||||
You can upload crashreports, problem files, or screenshots if they
|
||||
help document the issue.</li>
|
||||
<li>Click the create button to save your report.<br>
|
||||
This will also send a copy of your report to the Golden-Cheetah-Users
|
||||
mailing list.</li>
|
||||
</ol>
|
||||
<p>Thanks for helping to improve GoldenCheetah.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Managing issues in the tracker
|
||||
</font></big>
|
||||
|
||||
<p>To make it easier for all of us to track the status please try to
|
||||
adhere to a few simple guidelines listed below.</p>
|
||||
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<b>Issue Status:</b>
|
||||
</font>
|
||||
<p>Depending on your account status (non-member, reporter, developer, or
|
||||
manager) you may be able to update the status of an existing issue. When
|
||||
working in the bug tracker please update the status appropriately.
|
||||
Current status options are:</p>
|
||||
|
||||
<ul>
|
||||
<li>New: Default status.
|
||||
|
||||
<li>Assigned: issue has been assigned to someone on the project. If you
|
||||
are a Developer you can assign an issue to someone, including
|
||||
yourself. If you are working on a fix, please change the status to
|
||||
Assigned, and post a message stating your plan of attack etc.
|
||||
|
||||
<li>Feedback: This could be used to alert others that you have a
|
||||
proposed fix that you want feed back on. Please attach patches and
|
||||
make a note. Also remember to tag the issue in your patches.
|
||||
|
||||
<li>Resolved: The issue has been corrected. People that have tested the
|
||||
patch or that submitted the bug should update to this status when
|
||||
they feel that it has been fixed. If it turns out that it was not
|
||||
resolved, most users can change the status back to "feedback". If
|
||||
you do so, please leave a note.
|
||||
|
||||
<li>Tempfix: A workaround for the issue has been posted, but we may still be
|
||||
working on a more long term solution.
|
||||
|
||||
<li>Closed: Those with commit access to Github are the only ones that
|
||||
can mark an issue as closed. That said, if you are submitting a
|
||||
patch that fixes and issue, please include the "fixes #<issuenum>"
|
||||
tag to your commit as this will automatically close the issue when your
|
||||
patch is accepted and pushed to github.
|
||||
</ul>
|
||||
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<b>Tagging in messages</b>
|
||||
</font>
|
||||
<p>The tracker has a very basic tagging and markup scheme that is described in
|
||||
detail <a href="http://bugs.goldencheetah.org/help/wiki_syntax.html">here</a>.
|
||||
Perhaps the most useful feature is the ability to use tags to link issues,
|
||||
commits, etc. When commenting on an issue please use the following tags
|
||||
when appropriate to automatically create links when:</p>
|
||||
|
||||
<table align="center" width="600">
|
||||
<tr>
|
||||
<th>Tag</th>
|
||||
<th>Effect</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Issue #2</td>
|
||||
<td>Creates a link to existing Issue #2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>commit:e76247a</td>
|
||||
<td>Creates a link to commit e76247a</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>source:src/MainWindow.cpp</td>
|
||||
<td>Creates a link to src/Mainwindow.cpp in our git repo</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -1,18 +0,0 @@
|
||||
@c gnupress.tex -- Common Texinfo macros for GNU Press books.
|
||||
@c
|
||||
@c Print in 7" x 9.25" format.
|
||||
@smallbook
|
||||
@advance@voffset by -0.25in
|
||||
@special{papersize=7in,9.25in}
|
||||
@c
|
||||
@c Since we are using @smallbook, we ought to use @smallfonts
|
||||
@tex
|
||||
\global\let\lisporig=\lisp
|
||||
\gdef\lisp{\smallexamplefonts\lisporig}%
|
||||
\global\let\exampleorig=\example
|
||||
\gdef\example{\smallexamplefonts\exampleorig}%
|
||||
\global\let\displayorig=\display
|
||||
\gdef\display{\smallexamplefonts\displayorig}%
|
||||
\global\let\formatorig=\format
|
||||
\gdef\format{\smallexamplefonts\formatorig}%
|
||||
@end tex
|
||||
@@ -1,161 +0,0 @@
|
||||
@c palatino.tex -- TeXinfo macros to set the default Roman font to Palatino
|
||||
@c
|
||||
@def@palatinoversion{2003-04-01.00}
|
||||
@c
|
||||
@c Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
@c
|
||||
@c This palatino.tex file is free software; you can redistribute it and/or
|
||||
@c modify it under the terms of the GNU General Public License as
|
||||
@c published by the Free Software Foundation; either version 2, or (at
|
||||
@c your option) any later version.
|
||||
@c
|
||||
@c This palatino.tex file is distributed in the hope that it will be
|
||||
@c useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
@c of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
@c General Public License for more details.
|
||||
@c
|
||||
@c You should have received a copy of the GNU General Public License
|
||||
@c along with this texinfo.tex file; see the file COPYING. If not, write
|
||||
@c to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
@c Boston, MA 02111-1307, USA.
|
||||
@c
|
||||
@c You should use this module, go to your root .texi file and make sure
|
||||
@c it reads like this:
|
||||
@c \input texinfo @c -*-texinfo-*-
|
||||
@c @input palatino
|
||||
|
||||
@message{Loading palatino [version @palatinoversion]:}
|
||||
|
||||
@c Turn on the normal TeX command characters.
|
||||
@catcode`\=0
|
||||
\catcode`\%=14
|
||||
% Set the font macro #1 to the font named #2#3. #4 is the point size.
|
||||
% We save \setfont as \setfontorig, so we can restore it at the end of this
|
||||
% section.
|
||||
\catcode`\#=6
|
||||
\let\setfontorig=\setfont
|
||||
\def\setfont#1#2#3#4{\font#1=#2#3 at #4}
|
||||
\catcode`\#=\other
|
||||
|
||||
% Set Palatino as the default roman font face
|
||||
\def\rmfontprefix{ppl}
|
||||
|
||||
% Only define roman font attributes here.
|
||||
\def\rmshape{r}
|
||||
\def\rmbshape{b}
|
||||
\def\bfshape{b}
|
||||
\def\bxshape{b}
|
||||
\def\itshape{ri}
|
||||
\def\itbshape{bi}
|
||||
\def\slshape{ro}
|
||||
\def\slbshape{bo}
|
||||
\def\scshape{rc}
|
||||
\def\scbshape{bc}
|
||||
|
||||
\ifx\bigger\relax
|
||||
% not really supported.
|
||||
\def\mainmagstep{12pt}
|
||||
\setfont\textrm\rmfontprefix\rmshape{\mainmagstep}
|
||||
\else
|
||||
\def\mainmagstep{10pt}
|
||||
\setfont\textrm\rmfontprefix\rmshape{\mainmagstep}
|
||||
\fi
|
||||
% Instead of cmb10, you many want to use cmbx10.
|
||||
% cmbx10 is a prettier font on its own, but cmb10
|
||||
% looks better when embedded in a line with cmr10.
|
||||
\setfont\textbf\rmfontprefix\bfshape{\mainmagstep}
|
||||
\setfont\textit\rmfontprefix\itshape{\mainmagstep}
|
||||
\setfont\textsl\rmfontprefix\slshape{\mainmagstep}
|
||||
\setfont\textsc\rmfontprefix\scshape{\mainmagstep}
|
||||
\font\texti=zppler7m at \mainmagstep
|
||||
\font\textsy=zppler7y at \mainmagstep
|
||||
|
||||
% A few fonts for \defun, etc.
|
||||
\setfont\defbf\rmfontprefix\bxshape{10pt} %was 1314
|
||||
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
|
||||
|
||||
% Fonts for indices, footnotes, small examples (9pt).
|
||||
\setfont\smallrm\rmfontprefix\rmshape{9pt}
|
||||
\setfont\smallbf\rmfontprefix\bfshape{9pt}
|
||||
\setfont\smallit\rmfontprefix\itshape{9pt}
|
||||
\setfont\smallsl\rmfontprefix\slshape{9pt}
|
||||
\setfont\smallsc\rmfontprefix\scshape{9pt}
|
||||
\font\smalli=zppler7m at 9pt
|
||||
\font\smallsy=zppler7y at 9pt
|
||||
|
||||
% Fonts for small examples (8pt).
|
||||
\setfont\smallerrm\rmfontprefix\rmshape{8pt}
|
||||
\setfont\smallerbf\rmfontprefix\bfshape{8pt}
|
||||
\setfont\smallerit\rmfontprefix\itshape{8pt}
|
||||
\setfont\smallersl\rmfontprefix\slshape{8pt}
|
||||
\setfont\smallersc\rmfontprefix\scshape{8pt}
|
||||
\font\smalleri=zppler7m at 8pt
|
||||
\font\smallersy=zppler7y at 8pt
|
||||
|
||||
% Fonts for title page:
|
||||
\setfont\titlerm\rmfontprefix\rmbshape{18pt}
|
||||
\setfont\titleit\rmfontprefix\itbshape{18pt}
|
||||
\setfont\titlesl\rmfontprefix\slbshape{18pt}
|
||||
\let\titlebf=\titlerm
|
||||
\setfont\titlesc\rmfontprefix\scbshape{18pt}
|
||||
\font\titlei=zppler7m at 18pt
|
||||
\font\titlesy=zppler7y at 18pt
|
||||
\def\authorrm{\secrm}
|
||||
\def\authortt{\sectt}
|
||||
|
||||
% Chapter (and unnumbered) fonts (17.28pt).
|
||||
\setfont\chaprm\rmfontprefix\rmbshape{17.28pt}
|
||||
\setfont\chapit\rmfontprefix\itbshape{17.28pt}
|
||||
\setfont\chapsl\rmfontprefix\slbshape{17.28pt}
|
||||
\let\chapbf=\chaprm
|
||||
\setfont\chapsc\rmfontprefix\scbshape{17.28pt}
|
||||
\font\chapi=zppler7m at 17.28pt
|
||||
\font\chapsy=zppler7y at 17.28pt
|
||||
|
||||
% Section fonts (14.4pt).
|
||||
\setfont\secrm\rmfontprefix\rmbshape{14.4pt}
|
||||
\setfont\secit\rmfontprefix\itbshape{14.4pt}
|
||||
\setfont\secsl\rmfontprefix\slbshape{14.4pt}
|
||||
\let\secbf\secrm
|
||||
\setfont\secsc\rmfontprefix\scbshape{14.4pt}
|
||||
\font\seci=zppler7m at 14.4pt
|
||||
\font\secsy=zppler7y at 14.4pt
|
||||
|
||||
% Subsection fonts (13.15pt).
|
||||
\setfont\ssecrm\rmfontprefix\rmbshape{13.15pt}
|
||||
\setfont\ssecit\rmfontprefix\itbshape{13.15pt}
|
||||
\setfont\ssecsl\rmfontprefix\slbshape{13.15pt}
|
||||
\let\ssecbf\ssecrm
|
||||
\setfont\ssecsc\rmfontprefix\scbshape{13.15pt}
|
||||
\font\sseci=zppler7m at 13.15pt
|
||||
\font\ssecsy=zppler7y at 13.15pt
|
||||
% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
|
||||
% but that is not a standard magnification.
|
||||
|
||||
% Fonts for short table of contents.
|
||||
\setfont\shortcontrm\rmfontprefix\rmshape{12pt}
|
||||
\setfont\shortcontbf\rmfontprefix\bxshape{12pt}
|
||||
\setfont\shortcontsl\rmfontprefix\slshape{12pt}
|
||||
|
||||
% Set keyfont as well.
|
||||
\setfont\keyrm\rmfontprefix\rmshape{8pt}
|
||||
\font\keysy=zppler7y at 9pt
|
||||
|
||||
\let\setfont=\setfontorig
|
||||
\def\setfontorig{\relax}
|
||||
|
||||
% Restore the TeXinfo character set.
|
||||
\catcode`\\=\active
|
||||
@catcode`@%=@other
|
||||
|
||||
@c Set initial fonts (again)
|
||||
@textfonts
|
||||
@rm
|
||||
|
||||
@c Local variables:
|
||||
@c eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
@c page-delimiter: "^\\\\message"
|
||||
@c time-stamp-start: "def\\\\palatinoversion{"
|
||||
@c time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
@c time-stamp-end: "}"
|
||||
@c End:
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 195 KiB |
@@ -1,48 +0,0 @@
|
||||
<mockup version="1.0" skin="sketch" fontFace="Balsamiq Sans" measuredW="591" measuredH="228" mockupW="566" mockupH="205">
|
||||
<controls>
|
||||
<control controlID="0" controlTypeID="com.balsamiq.mockups::Canvas" x="25" y="23" w="566" h="205" measuredW="100" measuredH="70" zOrder="0" locked="false" isInGroup="-1"/>
|
||||
<control controlID="1" controlTypeID="com.balsamiq.mockups::HRule" x="31" y="37" w="560" h="-1" measuredW="100" measuredH="10" zOrder="1" locked="false" isInGroup="-1"/>
|
||||
<control controlID="2" controlTypeID="com.balsamiq.mockups::Label" x="34" y="23" w="-1" h="-1" measuredW="110" measuredH="21" zOrder="2" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Compare%20Intervals</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="3" controlTypeID="com.balsamiq.mockups::CheckBox" x="40" y="191" w="-1" h="-1" measuredW="110" measuredH="22" zOrder="3" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Compare%20Delta</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="4" controlTypeID="com.balsamiq.mockups::Canvas" x="34" y="52" w="414" h="133" measuredW="100" measuredH="70" zOrder="4" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<borderStyle>roundedDotted</borderStyle>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="6" controlTypeID="com.balsamiq.mockups::List" x="456" y="47" w="128" h="174" measuredW="100" measuredH="174" zOrder="5" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>May%202x20s%0ABarhatch%20Climbs%0ASub%204%20ToSH%0AMarmottes%0AAdH%20Ascents%0ABox%20Hill%202009%0ABox%20Hill%202013%0ABox%20Hill%20All</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="7" controlTypeID="com.balsamiq.mockups::TextInput" x="170" y="189" w="225" h="-1" measuredW="138" measuredH="27" zOrder="6" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Compare%20Set%20Name...</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="8" controlTypeID="com.balsamiq.mockups::Button" x="402" y="189" w="-1" h="-1" measuredW="45" measuredH="27" zOrder="7" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Add</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="10" controlTypeID="com.balsamiq.mockups::RoundButton" x="569" y="24" w="15" h="18" measuredW="32" measuredH="32" zOrder="8" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<icon>CircledXIcon%7Cxsmall</icon>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="11" controlTypeID="com.balsamiq.mockups::Label" x="48" y="62" w="387" h="-1" measuredW="180" measuredH="21" zOrder="9" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<color>10066329</color>
|
||||
<text>Drag%20and%20drop%20intervals%20here%20...</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
</controls>
|
||||
</mockup>
|
||||
|
Before Width: | Height: | Size: 22 KiB |
@@ -1,610 +0,0 @@
|
||||
<mockup version="1.0" skin="sketch" fontFace="Balsamiq Sans" measuredW="1997" measuredH="568" mockupW="1935" mockupH="553">
|
||||
<controls>
|
||||
<control controlID="0" controlTypeID="com.balsamiq.mockups::TitleWindow" x="62" y="61" w="355" h="400" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bottomheight>0</bottomheight>
|
||||
<dragger>false</dragger>
|
||||
<text>Chart%20Controls%20%5BLTM%20Chart%5D</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="1" controlTypeID="com.balsamiq.mockups::TabBar" x="84" y="101" w="312" h="284" measuredW="219" measuredH="100" zOrder="1" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Basic%2C%20Preset%2C%20Custom*</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="2" controlTypeID="com.balsamiq.mockups::Button" x="321" y="413" w="75" h="27" measuredW="53" measuredH="27" zOrder="2" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Done</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="3" controlTypeID="com.balsamiq.mockups::List" x="101" y="164" w="-1" h="-1" measuredW="100" measuredH="126" zOrder="3" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Best%0AFormula%0AMetric%0AMeasure</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="4" controlTypeID="com.balsamiq.mockups::List" x="201" y="164" w="171" h="126" measuredW="100" measuredH="126" zOrder="4" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Power%205s%0A%3D60m%20WPK%20*%20RPE%0AAverage_Power%0AWeight</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="5" controlTypeID="com.balsamiq.mockups::TextInput" x="100" y="140" w="101" h="-1" measuredW="44" measuredH="27" zOrder="5" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Type</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="6" controlTypeID="com.balsamiq.mockups::TextInput" x="201" y="140" w="171" h="-1" measuredW="56" measuredH="27" zOrder="6" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Details</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="7" controlTypeID="com.balsamiq.mockups::Button" x="101" y="298" w="75" h="27" measuredW="46" measuredH="27" zOrder="7" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Edit</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="8" controlTypeID="com.balsamiq.mockups::Button" x="294" y="298" w="36" h="27" measuredW="31" measuredH="27" zOrder="8" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>+</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="9" controlTypeID="com.balsamiq.mockups::Button" x="336" y="298" w="36" h="27" measuredW="27" measuredH="27" zOrder="9" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>-</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="12" controlTypeID="com.balsamiq.mockups::Arrow" x="345" y="15" w="225" h="143" measuredW="150" measuredH="100" zOrder="10" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<backgroundAlpha>1</backgroundAlpha>
|
||||
<direction>bottom</direction>
|
||||
<rightArrow>false</rightArrow>
|
||||
<text>Lists%20all%20data%20series%20that%20will%20be%20available%20on%20the%20chart</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="13" controlTypeID="com.balsamiq.mockups::TitleWindow" x="481" y="55" w="489" h="507" measuredW="450" measuredH="400" zOrder="11" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Edit%20Data%20Series%20%5BMetric/Measure%5D</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="14" controlTypeID="com.balsamiq.mockups::RadioButton" x="497" y="156" w="136" h="22" measuredW="53" measuredH="22" zOrder="12" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<state>selected</state>
|
||||
<text>Metric</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="15" controlTypeID="com.balsamiq.mockups::RadioButton" x="497" y="184" w="136" h="22" measuredW="43" measuredH="22" zOrder="13" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Best</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="16" controlTypeID="com.balsamiq.mockups::RadioButton" x="497" y="212" w="136" h="22" measuredW="63" measuredH="22" zOrder="14" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Formula</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="17" controlTypeID="com.balsamiq.mockups::RadioButton" x="497" y="130" w="136" h="22" measuredW="68" measuredH="22" zOrder="15" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<state>selected</state>
|
||||
<text>Measure</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="18" controlTypeID="com.balsamiq.mockups::Arrow" x="155" y="242" w="326" h="69" measuredW="150" measuredH="100" zOrder="16" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<backgroundAlpha>0.25</backgroundAlpha>
|
||||
<direction>bottom</direction>
|
||||
<leftArrow>false</leftArrow>
|
||||
<rightArrow>true</rightArrow>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="19" controlTypeID="com.balsamiq.mockups::Arrow" x="306" y="242" w="175" h="69" measuredW="150" measuredH="100" zOrder="17" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<backgroundAlpha>0.25</backgroundAlpha>
|
||||
<direction>bottom</direction>
|
||||
<leftArrow>false</leftArrow>
|
||||
<rightArrow>false</rightArrow>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="20" controlTypeID="com.balsamiq.mockups::List" x="615" y="126" w="317" h="113" measuredW="100" measuredH="132" zOrder="18" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Peak%201m%20Power%0APeak%201m%20WPK%0APeak%201s%20Power%0APeak%201s%20WPK%0APeak%205s%20Power%0APeak%205s%20WPK</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="21" controlTypeID="com.balsamiq.mockups::TextInput" x="615" y="102" w="317" h="-1" measuredW="58" measuredH="27" zOrder="19" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Metrics</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="22" controlTypeID="com.balsamiq.mockups::VerticalScrollBar" x="916" y="126" w="-1" h="113" measuredW="16" measuredH="100" zOrder="20" locked="false" isInGroup="-1"/>
|
||||
<control controlID="24" controlTypeID="com.balsamiq.mockups::Label" x="498" y="101" w="-1" h="-1" measuredW="30" measuredH="21" zOrder="21" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Type</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="26" controlTypeID="com.balsamiq.mockups::Label" x="497" y="264" w="104" h="-1" measuredW="35" measuredH="21" zOrder="22" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Name</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="27" controlTypeID="com.balsamiq.mockups::Label" x="497" y="304" w="131" h="-1" measuredW="106" measuredH="21" zOrder="23" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Axis%20Label%20/%20Units</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="28" controlTypeID="com.balsamiq.mockups::Label" x="497" y="342" w="131" h="-1" measuredW="36" measuredH="21" zOrder="24" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="29" controlTypeID="com.balsamiq.mockups::Label" x="497" y="378" w="131" h="-1" measuredW="44" measuredH="21" zOrder="25" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Symbol</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="30" controlTypeID="com.balsamiq.mockups::Label" x="499" y="416" w="131" h="-1" measuredW="35" measuredH="21" zOrder="26" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Stack</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="31" controlTypeID="com.balsamiq.mockups::Label" x="499" y="448" w="131" h="-1" measuredW="32" measuredH="21" zOrder="27" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Color</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="32" controlTypeID="com.balsamiq.mockups::Label" x="499" y="484" w="111" h="-1" measuredW="55" measuredH="21" zOrder="28" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Fill%20Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="33" controlTypeID="com.balsamiq.mockups::TextInput" x="618" y="261" w="97" h="-1" measuredW="79" measuredH="26" zOrder="29" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="34" controlTypeID="com.balsamiq.mockups::TextInput" x="616" y="301" w="97" h="-1" measuredW="79" measuredH="26" zOrder="30" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="35" controlTypeID="com.balsamiq.mockups::ComboBox" x="618" y="340" w="95" h="-1" measuredW="55" measuredH="24" zOrder="31" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Line</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="36" controlTypeID="com.balsamiq.mockups::ComboBox" x="618" y="378" w="95" h="-1" measuredW="64" measuredH="24" zOrder="32" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Circle</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="37" controlTypeID="com.balsamiq.mockups::CheckBox" x="627" y="417" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="33" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="38" controlTypeID="com.balsamiq.mockups::CheckBox" x="627" y="483" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="34" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="39" controlTypeID="com.balsamiq.mockups::ColorPicker" x="620" y="447" w="-1" h="-1" measuredW="26" measuredH="28" zOrder="35" locked="false" isInGroup="-1"/>
|
||||
<control controlID="40" controlTypeID="com.balsamiq.mockups::Label" x="738" y="264" w="104" h="-1" measuredW="52" measuredH="21" zOrder="36" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Highlight</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="41" controlTypeID="com.balsamiq.mockups::Label" x="736" y="304" w="104" h="-1" measuredW="47" measuredH="21" zOrder="37" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Outliers</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="42" controlTypeID="com.balsamiq.mockups::Label" x="738" y="342" w="104" h="-1" measuredW="50" measuredH="21" zOrder="38" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Baseline</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="43" controlTypeID="com.balsamiq.mockups::Label" x="738" y="416" w="104" h="-1" measuredW="84" measuredH="21" zOrder="39" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Smooth%20Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="44" controlTypeID="com.balsamiq.mockups::Label" x="738" y="446" w="104" h="-1" measuredW="63" measuredH="21" zOrder="40" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Trend%20Line</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="45" controlTypeID="com.balsamiq.mockups::CheckBox" x="842" y="417" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="41" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="46" controlTypeID="com.balsamiq.mockups::CheckBox" x="842" y="448" w="20" h="21" measuredW="20" measuredH="21" zOrder="42" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="47" controlTypeID="com.balsamiq.mockups::NumericStepper" x="837" y="263" w="95" h="-1" measuredW="41" measuredH="24" zOrder="43" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="48" controlTypeID="com.balsamiq.mockups::NumericStepper" x="837" y="301" w="95" h="-1" measuredW="41" measuredH="24" zOrder="44" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="49" controlTypeID="com.balsamiq.mockups::NumericStepper" x="837" y="341" w="95" h="-1" measuredW="61" measuredH="24" zOrder="45" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>-999</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="50" controlTypeID="com.balsamiq.mockups::TitleWindow" x="991" y="57" w="489" h="507" measuredW="450" measuredH="400" zOrder="46" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Edit%20Data%20Series%20%5BFormula%5D</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="51" controlTypeID="com.balsamiq.mockups::RadioButton" x="1007" y="158" w="136" h="22" measuredW="53" measuredH="22" zOrder="47" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<state>up</state>
|
||||
<text>Metric</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="52" controlTypeID="com.balsamiq.mockups::RadioButton" x="1007" y="186" w="136" h="22" measuredW="43" measuredH="22" zOrder="48" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Best</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="53" controlTypeID="com.balsamiq.mockups::RadioButton" x="1007" y="214" w="136" h="22" measuredW="63" measuredH="22" zOrder="49" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<state>selected</state>
|
||||
<text>Formula</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="54" controlTypeID="com.balsamiq.mockups::RadioButton" x="1007" y="132" w="136" h="22" measuredW="68" measuredH="22" zOrder="50" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Measure</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="58" controlTypeID="com.balsamiq.mockups::Label" x="1008" y="103" w="-1" h="-1" measuredW="30" measuredH="21" zOrder="51" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Type</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="59" controlTypeID="com.balsamiq.mockups::Label" x="1007" y="266" w="104" h="-1" measuredW="35" measuredH="21" zOrder="52" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Name</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="60" controlTypeID="com.balsamiq.mockups::Label" x="1007" y="306" w="131" h="-1" measuredW="106" measuredH="21" zOrder="53" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Axis%20Label%20/%20Units</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="61" controlTypeID="com.balsamiq.mockups::Label" x="1007" y="344" w="131" h="-1" measuredW="36" measuredH="21" zOrder="54" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="62" controlTypeID="com.balsamiq.mockups::Label" x="1007" y="380" w="131" h="-1" measuredW="44" measuredH="21" zOrder="55" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Symbol</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="63" controlTypeID="com.balsamiq.mockups::Label" x="1009" y="418" w="131" h="-1" measuredW="35" measuredH="21" zOrder="56" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Stack</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="64" controlTypeID="com.balsamiq.mockups::Label" x="1009" y="450" w="131" h="-1" measuredW="32" measuredH="21" zOrder="57" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Color</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="65" controlTypeID="com.balsamiq.mockups::Label" x="1009" y="486" w="111" h="-1" measuredW="55" measuredH="21" zOrder="58" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Fill%20Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="66" controlTypeID="com.balsamiq.mockups::TextInput" x="1128" y="263" w="97" h="-1" measuredW="79" measuredH="26" zOrder="59" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="67" controlTypeID="com.balsamiq.mockups::TextInput" x="1126" y="303" w="97" h="-1" measuredW="79" measuredH="26" zOrder="60" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="68" controlTypeID="com.balsamiq.mockups::ComboBox" x="1128" y="342" w="95" h="-1" measuredW="55" measuredH="24" zOrder="61" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Line</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="69" controlTypeID="com.balsamiq.mockups::ComboBox" x="1128" y="380" w="95" h="-1" measuredW="64" measuredH="24" zOrder="62" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Circle</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="70" controlTypeID="com.balsamiq.mockups::CheckBox" x="1137" y="419" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="63" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="71" controlTypeID="com.balsamiq.mockups::CheckBox" x="1137" y="485" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="64" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="72" controlTypeID="com.balsamiq.mockups::ColorPicker" x="1130" y="449" w="-1" h="-1" measuredW="26" measuredH="28" zOrder="65" locked="false" isInGroup="-1"/>
|
||||
<control controlID="73" controlTypeID="com.balsamiq.mockups::Label" x="1248" y="266" w="104" h="-1" measuredW="52" measuredH="21" zOrder="66" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Highlight</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="74" controlTypeID="com.balsamiq.mockups::Label" x="1246" y="306" w="104" h="-1" measuredW="47" measuredH="21" zOrder="67" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Outliers</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="75" controlTypeID="com.balsamiq.mockups::Label" x="1248" y="344" w="104" h="-1" measuredW="50" measuredH="21" zOrder="68" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Baseline</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="76" controlTypeID="com.balsamiq.mockups::Label" x="1248" y="418" w="104" h="-1" measuredW="84" measuredH="21" zOrder="69" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Smooth%20Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="77" controlTypeID="com.balsamiq.mockups::Label" x="1248" y="448" w="104" h="-1" measuredW="63" measuredH="21" zOrder="70" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Trend%20Line</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="78" controlTypeID="com.balsamiq.mockups::CheckBox" x="1352" y="419" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="71" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="79" controlTypeID="com.balsamiq.mockups::CheckBox" x="1352" y="450" w="20" h="21" measuredW="20" measuredH="21" zOrder="72" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="80" controlTypeID="com.balsamiq.mockups::NumericStepper" x="1347" y="265" w="95" h="-1" measuredW="41" measuredH="24" zOrder="73" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="81" controlTypeID="com.balsamiq.mockups::NumericStepper" x="1347" y="303" w="95" h="-1" measuredW="41" measuredH="24" zOrder="74" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="82" controlTypeID="com.balsamiq.mockups::NumericStepper" x="1347" y="343" w="95" h="-1" measuredW="61" measuredH="24" zOrder="75" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>-999</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="83" controlTypeID="com.balsamiq.mockups::SearchBox" x="1128" y="103" w="315" h="-1" measuredW="120" measuredH="25" zOrder="76" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>%3D%20Formula...</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="84" controlTypeID="com.balsamiq.mockups::TextArea" x="1135" y="125" w="293" h="124" measuredW="200" measuredH="140" zOrder="77" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="85" controlTypeID="com.balsamiq.mockups::VerticalScrollBar" x="1412" y="126" w="-1" h="123" measuredW="16" measuredH="100" zOrder="78" locked="false" isInGroup="-1"/>
|
||||
<control controlID="87" controlTypeID="com.balsamiq.mockups::Label" x="1147" y="130" w="-1" h="-1" measuredW="35" measuredH="21" zOrder="79" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Fields</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="88" controlTypeID="com.balsamiq.mockups::Label" x="1308" y="131" w="70" h="-1" measuredW="59" measuredH="21" zOrder="80" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Operators</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="89" controlTypeID="com.balsamiq.mockups::Button" x="1147" y="151" w="-1" h="-1" measuredW="107" measuredH="27" zOrder="81" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>1s%20Peak%20Power</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="90" controlTypeID="com.balsamiq.mockups::Button" x="1149" y="183" w="-1" h="-1" measuredW="107" measuredH="27" zOrder="82" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>1s%20Peak%20Power</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="91" controlTypeID="com.balsamiq.mockups::Button" x="1149" y="215" w="-1" h="-1" measuredW="107" measuredH="27" zOrder="83" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>1s%20Peak%20Power</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="92" controlTypeID="com.balsamiq.mockups::Button" x="1301" y="152" w="85" h="27" measuredW="49" measuredH="27" zOrder="84" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>AND</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="93" controlTypeID="com.balsamiq.mockups::Button" x="1303" y="184" w="85" h="27" measuredW="42" measuredH="27" zOrder="85" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>OR</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="94" controlTypeID="com.balsamiq.mockups::Button" x="1305" y="216" w="85" h="27" measuredW="40" measuredH="27" zOrder="86" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>%3E%3D</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="95" controlTypeID="com.balsamiq.mockups::VerticalScrollBar" x="1266" y="126" w="-1" h="123" measuredW="16" measuredH="100" zOrder="87" locked="false" isInGroup="-1"/>
|
||||
<control controlID="96" controlTypeID="com.balsamiq.mockups::TitleWindow" x="1508" y="61" w="489" h="507" measuredW="450" measuredH="400" zOrder="88" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Edit%20Data%20Series%20%5BBests%5D</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="97" controlTypeID="com.balsamiq.mockups::RadioButton" x="1524" y="162" w="136" h="22" measuredW="53" measuredH="22" zOrder="89" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<state>up</state>
|
||||
<text>Metric</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="98" controlTypeID="com.balsamiq.mockups::RadioButton" x="1524" y="190" w="136" h="22" measuredW="43" measuredH="22" zOrder="90" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<state>selected</state>
|
||||
<text>Best</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="99" controlTypeID="com.balsamiq.mockups::RadioButton" x="1524" y="218" w="136" h="22" measuredW="63" measuredH="22" zOrder="91" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<state>up</state>
|
||||
<text>Formula</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="100" controlTypeID="com.balsamiq.mockups::RadioButton" x="1524" y="136" w="136" h="22" measuredW="68" measuredH="22" zOrder="92" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Measure</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="101" controlTypeID="com.balsamiq.mockups::Label" x="1525" y="107" w="-1" h="-1" measuredW="30" measuredH="21" zOrder="93" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Type</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="102" controlTypeID="com.balsamiq.mockups::Label" x="1524" y="270" w="104" h="-1" measuredW="35" measuredH="21" zOrder="94" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Name</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="103" controlTypeID="com.balsamiq.mockups::Label" x="1524" y="310" w="131" h="-1" measuredW="106" measuredH="21" zOrder="95" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Axis%20Label%20/%20Units</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="104" controlTypeID="com.balsamiq.mockups::Label" x="1524" y="348" w="131" h="-1" measuredW="36" measuredH="21" zOrder="96" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="105" controlTypeID="com.balsamiq.mockups::Label" x="1524" y="384" w="131" h="-1" measuredW="44" measuredH="21" zOrder="97" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Symbol</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="106" controlTypeID="com.balsamiq.mockups::Label" x="1526" y="422" w="131" h="-1" measuredW="35" measuredH="21" zOrder="98" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Stack</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="107" controlTypeID="com.balsamiq.mockups::Label" x="1526" y="454" w="131" h="-1" measuredW="32" measuredH="21" zOrder="99" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Color</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="108" controlTypeID="com.balsamiq.mockups::Label" x="1526" y="490" w="111" h="-1" measuredW="55" measuredH="21" zOrder="100" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Fill%20Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="109" controlTypeID="com.balsamiq.mockups::TextInput" x="1645" y="267" w="97" h="-1" measuredW="79" measuredH="26" zOrder="101" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="110" controlTypeID="com.balsamiq.mockups::TextInput" x="1643" y="307" w="97" h="-1" measuredW="79" measuredH="26" zOrder="102" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="111" controlTypeID="com.balsamiq.mockups::ComboBox" x="1645" y="346" w="95" h="-1" measuredW="55" measuredH="24" zOrder="103" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Line</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="112" controlTypeID="com.balsamiq.mockups::ComboBox" x="1645" y="384" w="95" h="-1" measuredW="64" measuredH="24" zOrder="104" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Circle</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="113" controlTypeID="com.balsamiq.mockups::CheckBox" x="1654" y="423" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="105" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="114" controlTypeID="com.balsamiq.mockups::CheckBox" x="1654" y="489" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="106" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="115" controlTypeID="com.balsamiq.mockups::ColorPicker" x="1647" y="453" w="-1" h="-1" measuredW="26" measuredH="28" zOrder="107" locked="false" isInGroup="-1"/>
|
||||
<control controlID="116" controlTypeID="com.balsamiq.mockups::Label" x="1765" y="270" w="104" h="-1" measuredW="52" measuredH="21" zOrder="108" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Highlight</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="117" controlTypeID="com.balsamiq.mockups::Label" x="1763" y="310" w="104" h="-1" measuredW="47" measuredH="21" zOrder="109" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Outliers</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="118" controlTypeID="com.balsamiq.mockups::Label" x="1765" y="348" w="104" h="-1" measuredW="50" measuredH="21" zOrder="110" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Baseline</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="119" controlTypeID="com.balsamiq.mockups::Label" x="1765" y="422" w="104" h="-1" measuredW="84" measuredH="21" zOrder="111" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Smooth%20Curve</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="120" controlTypeID="com.balsamiq.mockups::Label" x="1765" y="452" w="104" h="-1" measuredW="63" measuredH="21" zOrder="112" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Trend%20Line</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="121" controlTypeID="com.balsamiq.mockups::CheckBox" x="1869" y="423" w="-1" h="-1" measuredW="20" measuredH="21" zOrder="113" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="122" controlTypeID="com.balsamiq.mockups::CheckBox" x="1869" y="454" w="20" h="21" measuredW="20" measuredH="21" zOrder="114" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text/>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="123" controlTypeID="com.balsamiq.mockups::NumericStepper" x="1864" y="269" w="95" h="-1" measuredW="41" measuredH="24" zOrder="115" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="124" controlTypeID="com.balsamiq.mockups::NumericStepper" x="1864" y="307" w="95" h="-1" measuredW="41" measuredH="24" zOrder="116" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="125" controlTypeID="com.balsamiq.mockups::NumericStepper" x="1864" y="347" w="95" h="-1" measuredW="61" measuredH="24" zOrder="117" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>-999</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="126" controlTypeID="com.balsamiq.mockups::NumericStepper" x="1694" y="147" w="95" h="-1" measuredW="41" measuredH="24" zOrder="118" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>5</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="127" controlTypeID="com.balsamiq.mockups::ComboBox" x="1797" y="145" w="95" h="-1" measuredW="69" measuredH="24" zOrder="119" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Minute</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="128" controlTypeID="com.balsamiq.mockups::Label" x="1694" y="177" w="95" h="-1" measuredW="30" measuredH="21" zOrder="120" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Peak</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="129" controlTypeID="com.balsamiq.mockups::ComboBox" x="1797" y="175" w="95" h="-1" measuredW="66" measuredH="24" zOrder="121" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Power</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
</controls>
|
||||
</mockup>
|
||||
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 173 KiB |
|
Before Width: | Height: | Size: 141 KiB |
@@ -1,161 +0,0 @@
|
||||
<mockup version="1.0" skin="sketch" fontFace="Balsamiq Sans" measuredW="654" measuredH="544" mockupW="499" mockupH="529">
|
||||
<controls>
|
||||
<control controlID="2" controlTypeID="com.balsamiq.mockups::TitleWindow" x="155" y="15" w="499" h="529" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>User%20Defined%20Metric</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="3" controlTypeID="com.balsamiq.mockups::Canvas" x="170" y="237" w="471" h="228" measuredW="100" measuredH="70" zOrder="1" locked="false" isInGroup="-1"/>
|
||||
<control controlID="4" controlTypeID="com.balsamiq.mockups::Label" x="170" y="213" w="77" h="-1" measuredW="33" measuredH="21" zOrder="2" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Code</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="5" controlTypeID="com.balsamiq.mockups::Button" x="552" y="479" w="88" h="27" measuredW="41" measuredH="27" zOrder="3" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>OK</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="7" controlTypeID="com.balsamiq.mockups::Button" x="449" y="479" w="88" h="27" measuredW="64" measuredH="27" zOrder="4" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Cancel</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="8" controlTypeID="com.balsamiq.mockups::Label" x="171" y="487" w="77" h="-1" measuredW="60" measuredH="21" zOrder="5" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Evaluates</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="9" controlTypeID="com.balsamiq.mockups::Label" x="246" y="489" w="27" h="-1" measuredW="25" measuredH="21" zOrder="6" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>200</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="10" controlTypeID="com.balsamiq.mockups::Label" x="273" y="489" w="50" h="-1" measuredW="34" measuredH="21" zOrder="7" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="11" controlTypeID="com.balsamiq.mockups::Label" x="246" y="468" w="77" h="-1" measuredW="41" measuredH="21" zOrder="8" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Metric</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="12" controlTypeID="com.balsamiq.mockups::Label" x="333" y="489" w="27" h="-1" measuredW="25" measuredH="21" zOrder="9" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>200</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="13" controlTypeID="com.balsamiq.mockups::Label" x="360" y="489" w="74" h="-1" measuredW="34" measuredH="21" zOrder="10" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="14" controlTypeID="com.balsamiq.mockups::Label" x="333" y="468" w="77" h="-1" measuredW="51" measuredH="21" zOrder="11" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Imperial</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="15" controlTypeID="com.balsamiq.mockups::Label" x="176" y="239" w="451" h="-1" measuredW="312" measuredH="224" zOrder="12" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>%23%20Average%20Power%20%5Cr%23%20Calculated%20using%20samples%20and%20should%20work%20with%5Cr%23%20variable%20sample%20rates%20since%20it%20%5Cr%23%20accumulates%20joules%20and%20duration.%20%5Crrelevant%20%7B%20Data%20contains%20%22P%22%3B%20%7D%5Crinit%20%7B%20joules%20%3C-%200%3B%20secs%20%3C-%200%3B%20%7D%20%5Cr%5Crsample%20%7B%5Cr%09joules%20%3C-%20joules%20+%20%28POWER%20*%20RECINTSECS%29%3B%5Cr%09secs%20%3C-%20secs%20+%20RECINTSECS%3B%5Cr%20%7D%5Cr%5Crvalue%20%7B%20joules%20/%20seconds%3B%20%7D%5Crcount%20%7B%20seconds%3B%20%7D</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="16" controlTypeID="com.balsamiq.mockups::Label" x="170" y="50" w="77" h="-1" measuredW="46" measuredH="21" zOrder="13" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Symbol</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="17" controlTypeID="com.balsamiq.mockups::Label" x="345" y="50" w="77" h="-1" measuredW="72" measuredH="21" zOrder="14" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Description</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="18" controlTypeID="com.balsamiq.mockups::TextInput" x="243" y="47" w="82" h="-1" measuredW="31" measuredH="27" zOrder="15" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>AP</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="20" controlTypeID="com.balsamiq.mockups::TextArea" x="434" y="48" w="207" h="91" measuredW="200" measuredH="140" zOrder="16" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Average%20Power%20computed%20via%20Joules%20to%20account%20for%20variable%20sample%20rates.</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="21" controlTypeID="com.balsamiq.mockups::Label" x="170" y="159" w="77" h="-1" measuredW="77" measuredH="21" zOrder="17" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Metric%20Units</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="22" controlTypeID="com.balsamiq.mockups::Label" x="324" y="159" w="104" h="-1" measuredW="87" measuredH="21" zOrder="18" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Imperial%20Units</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="23" controlTypeID="com.balsamiq.mockups::Label" x="465" y="144" w="80" h="-1" measuredW="68" measuredH="37" zOrder="19" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Conversion%5CrFactor</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="24" controlTypeID="com.balsamiq.mockups::Label" x="567" y="144" w="77" h="-1" measuredW="68" measuredH="37" zOrder="20" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Conversion%5CrSum</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="25" controlTypeID="com.balsamiq.mockups::TextInput" x="170" y="180" w="129" h="-1" measuredW="48" measuredH="27" zOrder="21" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="26" controlTypeID="com.balsamiq.mockups::TextInput" x="324" y="180" w="119" h="-1" measuredW="48" measuredH="27" zOrder="22" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="27" controlTypeID="com.balsamiq.mockups::TextInput" x="465" y="180" w="80" h="-1" measuredW="38" measuredH="27" zOrder="23" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>1.00</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="28" controlTypeID="com.balsamiq.mockups::TextInput" x="564" y="180" w="78" h="-1" measuredW="41" measuredH="27" zOrder="24" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0.00</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="29" controlTypeID="com.balsamiq.mockups::Label" x="170" y="118" w="77" h="-1" measuredW="57" measuredH="21" zOrder="25" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Precision</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="30" controlTypeID="com.balsamiq.mockups::TextInput" x="243" y="115" w="82" h="-1" measuredW="23" measuredH="27" zOrder="26" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>2</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="31" controlTypeID="com.balsamiq.mockups::Label" x="170" y="86" w="77" h="-1" measuredW="31" measuredH="21" zOrder="27" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Type</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="32" controlTypeID="com.balsamiq.mockups::ComboBox" x="243" y="82" w="-1" h="-1" measuredW="77" measuredH="24" zOrder="28" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Average</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
</controls>
|
||||
</mockup>
|
||||
|
Before Width: | Height: | Size: 103 KiB |
@@ -11,15 +11,12 @@ Installing dependencies
|
||||
</font></big>
|
||||
|
||||
<p>GC requires a number of libraries. On Mac OS X, you can get most of these
|
||||
through <a href="http://www.macports.org/">Mac Ports</a> or
|
||||
<a href="http://www.brew.sh/">Homebrew</a>. On Linux and other
|
||||
through <a href="http://www.macports.org/">Mac Ports</a>. On Linux and other
|
||||
Unixes, you can use whatever package manager your distribution provides. (We
|
||||
list the package names for MacPorts and Ubuntu below.) On Windows, you'll
|
||||
probably need to download and install everything by hand. You might also want
|
||||
to read <a href="old-mailing-list-archives/2009-September/002502.html">this
|
||||
mailing list message</a> or check the
|
||||
<a href="https://github.com/GoldenCheetah/GoldenCheetah">INSTALL</a> documents
|
||||
on GitHub.</p>
|
||||
mailing list message</a>.</p>
|
||||
|
||||
<p>You'll need the following:</p>
|
||||
<table align="center" width="500">
|
||||
@@ -31,10 +28,16 @@ on GitHub.</p>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://qt.nokia.com/downloads">Qt</a></td>
|
||||
<td>4.8.0 or later</td>
|
||||
<td>4.6.0 or later</td>
|
||||
<td>qt4-mac</td>
|
||||
<td>libqt4-dev</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://www.boost.org/users/download/">Boost</a></td>
|
||||
<td>1.38.0 or later</td>
|
||||
<td>boost</td>
|
||||
<td>libboost-dev</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://git-scm.com/download">git</a></td>
|
||||
<td>any</td>
|
||||
@@ -60,7 +63,7 @@ checkout the code, execute this command:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
git clone git://github.com/GoldenCheetah/GoldenCheetah.git
|
||||
git clone git://github.com/srhea/GoldenCheetah.git
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
@@ -100,9 +103,9 @@ make
|
||||
for the build process. We would too, but none of us know
|
||||
<a href="http://www.gnu.org/software/autoconf/">autoconf</a> well
|
||||
enough to integrate it with Qt on Mac, Linux, and Windows. If you can help
|
||||
us out with that, please post a message on the
|
||||
<a href="https://groups.google.com/forum/?fromgroups&hl=en#!forum/golden-cheetah-users">GoldenCheetah User's
|
||||
Google Group</a>.</p>
|
||||
us out with that, please email the
|
||||
<a href="cgi-bin/mailman/listinfo/golden-cheetah-users">GoldenCheetah User's
|
||||
Mailing List</a>.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Making changes
|
||||
@@ -132,16 +135,18 @@ git show --color abcd0123
|
||||
variable, declare it <code>static</code> within a .cpp file.
|
||||
|
||||
<li>Only call C++'s operator <code>new</code> within the constructors and
|
||||
<code>reset</code> functions of <code>std::auto_ptr</code> etc.
|
||||
or when passing a parent pointer to a Qt class (so that the parent
|
||||
deletes the child). Never call <code>delete</code> explicitly.
|
||||
<code>reset</code> functions of <code>std::auto_ptr</code>,
|
||||
<code>boost::scoped_pointer</code>, etc. or when passing a parent pointer to a
|
||||
Qt class (so that the parent deletes the child). Never call
|
||||
<code>delete</code> explicitly.
|
||||
|
||||
<li>Do not use <code>malloc</code> or <code>free</code> unless forced to by an
|
||||
external C library.
|
||||
|
||||
<li>Allocate large buffers on the heap, not on the stack.
|
||||
|
||||
<li>When the Qt or C++ standard library has an appropriate function, use it.
|
||||
<li>When the C++ standard library has an appropriate function, use it.
|
||||
Likewise for Qt and Boost.
|
||||
|
||||
<li>Only use external libraries with GPL-compatible licenses.
|
||||
|
||||
@@ -481,13 +486,11 @@ file</em>, <code>0001-don-t-include-zero-metrics-in-ride-summary.patch</code>,
|
||||
that other people can use to include my change in their own local git
|
||||
repositories.</p>
|
||||
|
||||
<p>If you have a patch you'd like to share with others, we recommend that you
|
||||
<a href="https://help.github.com/articles/fork-a-repo">fork</a> the main GIT
|
||||
repository and submit a
|
||||
<a href="https://help.github.com/articles/creating-a-pull-request">pull request</a>
|
||||
with your patch. Alternatively you can join the
|
||||
<a href="https://groups.google.com/forum/?fromgroups#!forum/golden-cheetah-developers">
|
||||
Golden Cheetah Developer's Group</a> and post a patch there.</p>
|
||||
<p>If you have a patch you'd like to share with others, you can email it to
|
||||
the <a href="cgi-bin/mailman/listinfo/golden-cheetah-users">GoldenCheetah
|
||||
User's Mailing List</a>, and it will be considered for inclusion in the next
|
||||
release of GoldenCheetah. In fact, if you join the mailing list, you'll see
|
||||
lots of patches like this. You may even want to try some of them.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Applying patches
|
||||
72
doc/download.content
Normal file
@@ -0,0 +1,72 @@
|
||||
<!-- $Id: download.content,v 1.6 2009/01/09 20:45:03 rcarlsen Exp $ -->
|
||||
|
||||
<p>
|
||||
Golden Cheetah is available in binary form for
|
||||
Linux x86, Mac OS X (universal binary), and Windows.
|
||||
It is also available as source code.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Golden Cheetah downloads data from all versions of the PowerTap
|
||||
computer including the new Joule. If you're using the PowerTap USB cradle
|
||||
(as opposed to the older, serial cable), you may need to install the
|
||||
<a href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB driver</a>
|
||||
before downloading.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
On Linux and Mac OS X, Golden Cheetah also downloads from the SRM PCV. On Mac
|
||||
OS X, you'll need to install <a href="http://osx-pl2303.sourceforge.net/">the
|
||||
open source PL2303 driver</a> to download from an SRM. Please see the
|
||||
<a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki/">WIKI</a> article
|
||||
- <a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki/PCV_on_Mac_OS_X">
|
||||
PCV on Mac OS X</a> for further information.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Download Release 2.1</strong></big>
|
||||
</font>
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="GoldenCheetah_2.1.0_Windows_Installer.exe">Windows 32-bit (runs on 64bit as well)</a>
|
||||
<li><a href="GoldenCheetah_2.1.0_Mac_Universal.dmg">Mac OS X Universal 10.4->10.7</a><br>
|
||||
<li><a href="GoldenCheetah_2.1.0_Linux_x86.tgz">Linux x86</a><br>
|
||||
<li><a href="GoldenCheetah_2.1.0_Linux_x86_64.tgz">Linux x86_64</a><br>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Please follow the <a href="/users-guid.html">User's Guide</a> on how to install
|
||||
and use Golden Cheetah.
|
||||
</p>
|
||||
<p>
|
||||
You can also <a href="release-notes.html">view the release notes</a> for 2.1
|
||||
or <a href="older-releases.html">download older releases</a> of Golden Cheetah.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Development Releases</strong></big>
|
||||
</font>
|
||||
</p>
|
||||
|
||||
<p>Gareth Coco has also made
|
||||
<a href="http://goldencheetah.stand2surf.net/">regular development builds</a>
|
||||
available. These binaries are based on the latest source code, so they may have
|
||||
more features and less (but sometime more) bugs than the stable release above.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Source Code</strong></big>
|
||||
</font>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The Golden Cheetah source code is available via git. See the
|
||||
<a href="developers-guide.html">Developer's Guide</a> for more information.
|
||||
You can also <a href="http://github.com/srhea/GoldenCheetah/tree/master/">browse
|
||||
the source on github</a>.
|
||||
</p>
|
||||
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 155 KiB |
@@ -1,12 +1,5 @@
|
||||
<!-- $Id: faq.content,v 1.4 2006/07/05 16:59:56 srhea Exp $ -->
|
||||
|
||||
<h2>Documentation</h2>
|
||||
<p>
|
||||
There is a <a href="https://github.com/GoldenCheetah/GoldenCheetah/blob/master/doc/user/GC3-Manual.pdf?raw=true">Manual</a>
|
||||
and a <a href="https://github.com/GoldenCheetah/GoldenCheetah/blob/master/doc/user/GC3-FAQ.pdf?raw=true">FAQ</a> that
|
||||
you can use to help you use the program.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<b><i>GoldenCheetah doesn't find my PowerTap on Ubuntu Linux.</i></b>
|
||||
<p>
|
||||
@@ -54,14 +54,14 @@ body {
|
||||
<img src="logo.jpg" width="175" height="175" alt="Picture of Cheetah">
|
||||
|
||||
<p> <b><a href="index.html">Introduction</a></b>
|
||||
<br> <b><a href="download.html">Download</a></b>
|
||||
<br> <b><a href="screenshots.html">Screenshots</a>
|
||||
<br> <b><a href="wiki.html">Wiki</a>
|
||||
<br> <b><a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki">Wiki</a>
|
||||
<br> <b><a href="users-guide.html">User's Guide</a>
|
||||
<br> <b><a href="developers-guide.html">Developer's Guide</a>
|
||||
<br> <b><a href="faq.html">FAQ</a>
|
||||
<br> <b><a href="wishlist.html">Wish List</a>
|
||||
<br> <b><a href="license.html">License</a></b>
|
||||
<br> <b><a href="download.html">Download</a></b>
|
||||
<br> <b><a href="contrib.html">Contributors</a></b>
|
||||
<br> <b><a href="search.html">Search</a></b>
|
||||
<br> <b><a href="mailing-list.html">Mailing List</a></b>
|
||||
|
Before Width: | Height: | Size: 311 KiB After Width: | Height: | Size: 311 KiB |
|
Before Width: | Height: | Size: 203 KiB After Width: | Height: | Size: 203 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
@@ -13,7 +13,8 @@ GoldenCheetah is a software package that:
|
||||
|
||||
<ul>
|
||||
<li>Downloads ride data directly from the CycleOps PowerTap and the SRM
|
||||
PowerControl V, VI and VII.</p>
|
||||
PowerControl V. Support for SRM PowerControl VI and VII is planned for the
|
||||
future.<p>
|
||||
|
||||
<li>Imports ride data downloaded with other programs, including TrainingPeaks
|
||||
WKO+ and the manufacturers' software for the Ergomo, Garmin, Polar, PowerTap,
|
||||
@@ -23,7 +24,8 @@ and SRM devices.<p>
|
||||
BikeScore calculation, histogram analysis, a best interval finder, and a pedal
|
||||
force versus pedal velocity chart, to name just a few.<p>
|
||||
|
||||
<li>Is available for Linux, Mac OS X, and Windows.<p>
|
||||
<li>Is available for Linux, Mac OS X, and Windows. (The Windows version
|
||||
does not yet support direct downloads from the SRM PowerControl.)<p>
|
||||
|
||||
<li>Is released under an Open Source license.
|
||||
</ul>
|
||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 203 KiB After Width: | Height: | Size: 203 KiB |
|
Before Width: | Height: | Size: 267 KiB After Width: | Height: | Size: 267 KiB |