Compare commits

..

3 Commits

Author SHA1 Message Date
Dirk Hohndel
4054a19ffb cleanup: initialize all fields
This doesn't appear likely to cause an issue, but also doesn't
seem wrong.

Fixes CID 350734

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-10-25 11:10:31 -07:00
Dirk Hohndel
54026edf7a cleanup: fix over-eager Coverity warnings
Technically get_dive() could return a nullptr. The existing code made sure the
argument passed to get_dive() was one that always would result in a valid dive
pointer being returned. The new code is only slightly less efficient but allows
a static code analysis to easily see that we don't derefence NULL pointers here.

On some level this change is unnecessary. But it's also not wrong.

Fixes CID 354762

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-10-25 11:10:31 -07:00
Dirk Hohndel
a64787f70d cleanup: fix over-eager Coverity warnings
Technically get_dive(i) could return a nullptr. But given the range for i that
can never happen. Still, the test is extremely cheap and doesn't hurt.

Fixes CID 354768
Fixes CID 354766

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-10-25 11:10:31 -07:00
887 changed files with 173114 additions and 223073 deletions

View File

@ -10,7 +10,7 @@ ColumnLimit: 0
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
ForEachMacros: [ 'for_each_dc', 'for_each_relevant_dc', 'for_each_dive', 'for_each_line' ]
ForEachMacros: [ 'foreach', 'for_each_dc', 'for_each_dive', 'for_each_line', 'Q_FOREACH', 'BOOST_FOREACH' ]
IndentFunctionDeclarationAfterType: false #personal taste, good for long methods
IndentWidth: 8
MaxEmptyLinesToKeep: 2

2
.github/FUNDING.yml vendored
View File

@ -1,2 +0,0 @@
github: subsurface
ko_fi: dirkhh

View File

@ -1,56 +0,0 @@
name: Manage the Subsurface CICD versioning
inputs:
no-increment:
description: 'Only get the current version, do not increment it even for push events (Caution: not actually a boolean)'
default: false
nightly-builds-secret:
description: The secret to access the nightly builds repository
default: ''
outputs:
version:
description: The long form version number
value: ${{ steps.version_number.outputs.version }}
buildnr:
description: The build number
value: ${{ steps.version_number.outputs.buildnr }}
runs:
using: composite
steps:
- name: atomically create or retrieve the build number and assemble release notes for a push (i.e. merging of a pull request)
if: github.event_name == 'push' && inputs.no-increment == 'false'
env:
NIGHTLY_BUILDS_SECRET: ${{ inputs.nightly-builds-secret }}
shell: bash
run: |
if [ -z "$NIGHTLY_BUILDS_SECRET" ]; then
echo "Need to supply the secret for the nightly-builds repository to increment the version number, aborting."
exit 1
fi
scripts/get-atomic-buildnr.sh $GITHUB_SHA $NIGHTLY_BUILDS_SECRET "CICD-release"
- name: retrieve the current version number in all other cases
if: github.event_name != 'push' || inputs.no-increment != 'false'
env:
PULL_REQUEST_BRANCH: ${{ github.event.pull_request.head.ref }}
shell: bash
run: |
echo "pull-request-$PULL_REQUEST_BRANCH" > latest-subsurface-buildnumber-extension
- name: store version number for the build
id: version_number
env:
PULL_REQUEST_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
shell: bash
run: |
git config --global --add safe.directory $GITHUB_WORKSPACE
# For a pull request we need the information from the pull request branch
# and not from the merge branch on the pull request
git checkout $PULL_REQUEST_HEAD_SHA
version=$(scripts/get-version.sh)
echo "version=$version" >> $GITHUB_OUTPUT
buildnr=$(scripts/get-version.sh 1)
echo "buildnr=$buildnr" >> $GITHUB_OUTPUT
git checkout $GITHUB_SHA

View File

@ -1,36 +1,48 @@
name: Android Docker Image CI
# -- disabled for now, as the resulting image is HUGE and causes our
# Android builds to fail
#on:
# push:
# paths:
# - scripts/docker/android-build-container/Dockerfile
# - .github/workflows/android-docker*
# this is here to prevent errors about not having an on: clause
on:
push:
branches:
- master
paths:
- scripts/docker/android-build-container/**
- .github/workflows/android-dockerimage.yml
repository_dispatch:
types:
- unused
jobs:
android-build-container:
runs-on: ubuntu-latest
env:
VERSION: ${{ '5.15.2' }} # the version numbers here is based on the Qt version, the third digit is the rev of the docker image
VERSION: ${{ '5.13.10' }} # the version numbers here is based on the Qt version, the third digit is the rev of the docker image
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v1
- name: Build the name for the docker image
id: build_name
- name: Get our pre-reqs
run: |
v=$VERSION
b=$GITHUB_REF # -BRANCH suffix, unless the branch is master
cd scripts/docker/android-build-container
bash download.sh
sed -ie 's/^sudo/#sudo/' setup-docker.sh
bash setup-docker.sh
- name: set env
run: |
v=${{ env.VERSION }}
b=${{ github.ref }} # -BRANCH suffix, unless the branch is master
b=${b/refs\/heads\//}
b=${b,,} # the name needs to be all lower case
if [ $b = "master" ] ; then b="" ; else b="-$b" ; fi
echo "NAME=$GITHUB_REPOSITORY_OWNER/android-build${b}:${v}" >> $GITHUB_OUTPUT
echo "::set-env name=NAME::subsurface/android-build-container${b}:${v}"
- name: Build and Publish Linux Docker image to Dockerhub
uses: elgohr/Publish-Docker-Github-Action@v5
uses: elgohr/Publish-Docker-Github-Action@master
with:
name: ${{ steps.build_name.outputs.NAME }}
name: ${{ env.NAME }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
dockerfile: 'Dockerfile'

View File

@ -1,91 +1,42 @@
name: Android
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
build:
env:
KEYSTORE_FILE: ${{ github.workspace }}/../subsurface.keystore
buildInContainer:
runs-on: ubuntu-latest
container:
image: docker://subsurface/android-build:5.15.2
image: docker://subsurface/android-build-container:5.13.12
steps:
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
- name: set up the keystore
if: github.event_name == 'push'
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
run: |
echo "$ANDROID_KEYSTORE_BASE64" | base64 -d > $KEYSTORE_FILE
uses: actions/checkout@v1
- name: run build
id: build
env:
KEYSTORE_PASSWORD: pass:${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
KEYSTORE_ALIAS: ${{ secrets.ANDROID_KEYSTORE_ALIAS }}
BUILDNR: ${{ steps.version_number.outputs.buildnr }}
run: |
# this is rather awkward, but it allows us to use the preinstalled
# Android and Qt versions with relative paths
cd ..
ln -s /android/5.15.* .
ln -s /android/build-tools .
ln -s /android/cmdline-tools .
ln -s /android/ndk .
ln -s /android/platform-tools .
ln -s /android/platforms .
ln -s /android/tools .
git config --global user.email "ci@subsurface-divelog.org"
git config --global user.name "Subsurface CI"
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer
# get the build number via curl so this works both for a pull request as well as a push
export OUTPUT_DIR="$GITHUB_WORKSPACE"
bash -x ./subsurface/packaging/android/qmake-build.sh -buildnr $BUILDNR
ln -s /android/Qt .
ln -s /android/android-ndk-r18b .
ln -s /android/android-sdk-linux .
ls -l
bash -x subsurface/packaging/android/android-build-wrapper.sh
cp /__w/subsurface/subsurface-mobile-build-arm64/*mobile*/build/outputs/apk/debug/subsurface-mobile-arm64-v8a-debug.apk ${GITHUB_WORKSPACE}/Subsurface-mobile.arm64.apk
cp /__w/subsurface/subsurface-mobile-build-arm/*mobile*/build/outputs/apk/debug/subsurface-mobile-armeabi-v7a-debug.apk ${GITHUB_WORKSPACE}/Subsurface-mobile.apk
- name: delete the keystore
if: github.event_name == 'push'
run: |
rm $KEYSTORE_FILE
- name: publish pull request artifacts
- name: prepare PR artifacts
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v4
with:
name: Subsurface-Android-${{ steps.version_number.outputs.version }}
path: Subsurface-mobile-*.apk
run: |
mkdir -p Android-artifacts
mv Subsurface-mobile.apk Subsurface-mobile.arm64.apk Android-artifacts
# only publish a 'release' on push events (those include merging a PR)
- name: upload binaries
if: github.event_name == 'push'
uses: softprops/action-gh-release@v2
- name: PR artifacts
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@master
with:
tag_name: v${{ steps.version_number.outputs.version }}
repository: ${{ github.repository_owner }}/nightly-builds
token: ${{ secrets.NIGHTLY_BUILDS }}
prerelease: false
fail_on_unmatched_files: true
files: |
Subsurface-mobile-${{ steps.version_number.outputs.version }}.apk
name: Android-artifacts
path: Android-artifacts

View File

@ -1,24 +0,0 @@
name: Add artifact links to pull request
on:
workflow_run:
workflows: ["Ubuntu 16.04 / Qt 5.15-- for AppImage", "Mac", "Windows", "Android", "iOS"]
types: [completed]
jobs:
artifacts-url-comments:
name: Add artifact links to PR and issues
runs-on: ubuntu-22.04
steps:
- name: Add artifact links to PR and issues
if: github.event.workflow_run.event == 'pull_request'
uses: tonyhallett/artifacts-url-comments@v1.1.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
prefix: "**Artifacts:**"
suffix: "_**WARNING:** Use at your own risk._"
format: name
addTo: pull
errorNoArtifacts: false

View File

@ -25,32 +25,34 @@ jobs:
matrix:
# Override automatic language detection by changing the below list
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
language: ['c-cpp', 'javascript-typescript']
language: ['cpp', 'javascript']
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
- name: get container ready for build
run: |
sudo apt-get update
sudo apt-get install -y -q \
sudo apt-get install -y -q --force-yes \
autoconf automake cmake g++ git libcrypto++-dev libcurl4-gnutls-dev \
libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libssl-dev \
libtool libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make \
pkg-config qml-module-qtlocation qml-module-qtpositioning \
qml-module-qtquick2 qt5-qmake qtchooser qtconnectivity5-dev \
qml-module-qtquick2 qt5-default qt5-qmake qtchooser qtconnectivity5-dev \
qtdeclarative5-dev qtdeclarative5-private-dev qtlocation5-dev \
qtpositioning5-dev qtscript5-dev qttools5-dev qttools5-dev-tools \
qtquickcontrols2-5-dev xvfb libbluetooth-dev libmtp-dev
qtquickcontrols2-5-dev xvfb libbluetooth-dev
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@ -61,9 +63,7 @@ jobs:
- name: Build
run: |
cd ..
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer
bash -e -x subsurface/scripts/build.sh -desktop -build-with-webkit
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v1

View File

@ -1,56 +1,57 @@
name: Coverity Scan Linux Qt 5.9
on:
schedule:
- cron: '0 18 * * *' # Daily at 18:00 UTC
jobs:
CoverityScanBuildOnUbuntu:
runs-on: ubuntu-latest
CoverityScanBuildOnBionic:
runs-on: ubuntu-18.04
container:
image: ubuntu:22.04
image: ubuntu:18.04 # yes, this looks redundant, but something is messed up with their Ubuntu image that causes our builds to fail
steps:
- name: checkout sources
uses: actions/checkout@v1
- name: add build dependencies
run: |
apt-get update
apt-get dist-upgrade -y
DEBIAN_FRONTEND=noninteractive apt-get install -y -q \
wget curl \
apt update
apt install -y \
autoconf automake cmake g++ git libcrypto++-dev libcurl4-gnutls-dev \
libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libssl-dev \
libtool libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make \
pkg-config qml-module-qtlocation qml-module-qtpositioning \
qml-module-qtquick2 qt5-qmake qtchooser qtconnectivity5-dev \
qml-module-qtquick2 qt5-default qt5-qmake qtchooser qtconnectivity5-dev \
qtdeclarative5-dev qtdeclarative5-private-dev qtlocation5-dev \
qtpositioning5-dev qtscript5-dev qttools5-dev qttools5-dev-tools \
qtquickcontrols2-5-dev libbluetooth-dev libmtp-dev
qtquickcontrols2-5-dev wget curl libbluetooth-dev
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: configure environment
- name: Download Coverity Build Tool
run: |
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer
cd ..
wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=Subsurface-divelog%2Fsubsurface" -O cov-analysis-linux64.tar.gz
mkdir cov-analysis-linux64
tar xzf cov-analysis-linux64.tar.gz --strip 1 -C cov-analysis-linux64
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
- name: get the version information
id: version_number
uses: ./.github/actions/manage-version
with:
no-increment: true
- name: run build
run: |
cd ..
export PATH=`pwd`/cov-analysis-linux64/bin:$PATH
cov-build --dir cov-int bash -x subsurface/scripts/build.sh -desktop -build-with-webkit
- name: run coverity scan
uses: vapier/coverity-scan-action@v1
with:
project: Subsurface-divelog/subsurface
token: ${{ secrets.COVERITY_SCAN_TOKEN }}
email: glance@acc.umu.se
command: subsurface/scripts/build.sh -desktop -build-with-webkit
working-directory: ${{ github.workspace }}/..
version: ${{ steps.version_number.outputs.version }}
description: Automatic scan on github actions
- name: Submit the result to Coverity Scan
run: |
cd ..
tar czvf subsurface.tgz cov-int
curl \
--form token=$TOKEN \
--form email=glance@acc.umu.se \
--form file=@subsurface.tgz \
--form version=$(/scripts/get-version linux) \
--form description="Automatic scan on github actions" \
https://scan.coverity.com/builds?project=Subsurface-divelog%2Fsubsurface
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}

View File

@ -1,36 +0,0 @@
name: Documentation
on:
push:
branches:
- master
paths:
- Documentation
- .github/workflows/documentation.yml
pull_request:
branches:
- master
paths:
- Documentation
- .github/workflows/documentation.yml
jobs:
documentation:
runs-on: ubuntu-22.04
steps:
- name: Install Packages
run: |
sudo apt-get -y update
sudo apt-get -y install asciidoc docbook-xml w3m
- name: Checkout Sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: Process the Documentation
id: process_documentation
working-directory: Documentation
run: make

View File

@ -1,59 +0,0 @@
name: Fedora Copr Build
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
- current
jobs:
setup-build:
name: Submit build to Fedora COPR
# this seems backwards, but we want to run under Fedora, but Github doesn' support that
runs-on: ubuntu-latest
container:
image: fedora:latest
steps:
- name: Setup build dependencies in the Fedora container
run: |
dnf -y install @development-tools @rpm-development-tools
dnf -y install copr-cli make
- name: Check out sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: setup git
run: |
git config --global --add safe.directory /__w/subsurface/subsurface
git config --global --add safe.directory /__w/subsurface/subsurface/libdivecomputer
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
- name: Setup API token for copr-cli
env:
API_TOKEN: ${{ secrets.COPR_TOKEN }}
API_LOGIN: ${{ secrets.COPR_LOGIN }}
run: |
mkdir -p "$HOME/.config"
cp packaging/copr/config.copr "$HOME/.config/copr"
sed -i "s/API_TOKEN/$API_TOKEN/;s/API_LOGIN/$API_LOGIN/" "$HOME/.config/copr"
- name: Checkout googlemaps
run: |
cd ..
git clone https://github.com/subsurface/googlemaps
- name: run the copr build script
run: |
cd ..
bash -x subsurface/packaging/copr/make-package.sh $GITHUB_REF_NAME

View File

@ -1,61 +1,33 @@
name: iOS
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
build:
runs-on: macOS-11
mobileBuild:
runs-on: macOS-latest
steps:
- name: switch to Xcode 11
run: sudo xcode-select -s "/Applications/Xcode_11.7.app"
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
uses: actions/checkout@v1
- name: setup Homebrew
run: brew install autoconf automake libtool pkg-config
- name: checkout Qt resources
uses: actions/checkout@v4
with:
repository: subsurface/qt-ios
ref: main
path: qt-ios
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
- name: build Subsurface-mobile for iOS
env:
VERSION: ${{ steps.version_number.outputs.version }}
- name: set our Qt build
run: |
cd ..
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer
export IOS_QT=$GITHUB_WORKSPACE/qt-ios
echo "build for simulator"
bash -x $GITHUB_WORKSPACE/packaging/ios/build.sh -simulator
# We need this in order to be able to access the file and publish it
mv build-Subsurface-mobile-Qt_5_14_1_for_iOS-Release/Release-iphonesimulator/Subsurface-mobile.app $GITHUB_WORKSPACE/Subsurface-mobile-$VERSION.app
- name: publish artifacts
uses: actions/upload-artifact@v4
with:
name: Subsurface-iOS-${{ steps.version_number.outputs.version }}
path: Subsurface-mobile-*.app
env
curl -L --output Qt-5.14.1-ios.tar.xz https://f002.backblazeb2.com/file/Subsurface-Travis/Qt-5.14.1-ios.tar.xz
mkdir -p $HOME/Qt
xzcat Qt-5.14.1-ios.tar.xz | tar -x -C $HOME/Qt -f -
- name: build Subsurface-mobile for iOS
run: |
cd packaging/ios
ln -s $HOME/Qt Qt
echo "build dependencies"
bash -x build.sh -simulator
echo "Subsurface-mobile for iOS"
cd build-Subsurface-mobile-*for_iOS-Release
sed -i.bak 's/-Wall/-Wno-everything/' Makefile # make the build far less verbose
make -j2

45
.github/workflows/linux-bionic-5.9.yml vendored Normal file
View File

@ -0,0 +1,45 @@
name: Ubuntu 18.04 / Qt 5.9
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
buildOnBionic:
runs-on: ubuntu-18.04
container:
image: ubuntu:18.04 # yes, this looks redundant, but something is messed up with their Ubuntu image that causes our builds to fail
steps:
- name: checkout sources
uses: actions/checkout@v1
- name: add build dependencies
run: |
apt update
apt install -y \
autoconf automake cmake g++ git libcrypto++-dev libcurl4-gnutls-dev \
libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libssl-dev \
libtool libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make \
pkg-config qml-module-qtlocation qml-module-qtpositioning \
qml-module-qtquick2 qt5-default qt5-qmake qtchooser qtconnectivity5-dev \
qtdeclarative5-dev qtdeclarative5-private-dev qtlocation5-dev \
qtpositioning5-dev qtscript5-dev qttools5-dev qttools5-dev-tools \
qtquickcontrols2-5-dev xvfb libbluetooth-dev
- name: build Subsurface
run: |
cd ..
bash -x subsurface/scripts/build.sh -desktop -build-with-webkit
- name: test desktop build
run: |
# and now run the tests - with Qt 5.9 we can only run the desktop flavor
echo "------------------------------------"
echo "run tests"
cd build
xvfb-run --auto-servernum make check

View File

@ -1,100 +0,0 @@
name: Generic workflow for Debian and derivatives
on:
workflow_call:
inputs:
container-image:
required: true
type: string
jobs:
build:
runs-on: ubuntu-latest
container:
image: ${{ inputs.container-image }}
steps:
- name: get container ready for build
run: |
echo "--------------------------------------------------------------"
echo "update distro and install dependencies"
apt-get update
apt-get dist-upgrade -y
DEBIAN_FRONTEND=noninteractive apt-get install -y -q \
autoconf automake cmake g++ git libcrypto++-dev libcurl4-gnutls-dev \
libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libssl-dev \
libtool libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make \
pkg-config qml-module-qtlocation qml-module-qtpositioning \
qml-module-qtquick2 qt5-qmake qtchooser qtconnectivity5-dev \
qtdeclarative5-dev qtdeclarative5-private-dev qtlocation5-dev \
qtpositioning5-dev qtscript5-dev qttools5-dev qttools5-dev-tools \
qtquickcontrols2-5-dev xvfb libbluetooth-dev libmtp-dev \
mdbtools-dev
git config --global user.email "ci@subsurface-divelog.org"
git config --global user.name "Subsurface CI"
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer
# needs git from the previous step
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
no-increment: true
- name: build subsurface-mobile
run: |
echo "--------------------------------------------------------------"
echo "building mobile"
cd ..
bash -e -x subsurface/scripts/build.sh -mobile
- name: test mobile build
run: |
echo "--------------------------------------------------------------"
echo "running tests for mobile"
cd build-mobile/tests
# xvfb-run --auto-servernum ./TestGitStorage -v2
xvfb-run --auto-servernum make check
- name: build subsurface
run: |
echo "--------------------------------------------------------------"
echo "building desktop"
# now build for the desktop version (including WebKit)
cd ..
bash -e -x subsurface/scripts/build.sh -desktop -build-with-webkit
- name: test desktop build
run: |
echo "--------------------------------------------------------------"
echo "running tests for desktop"
cd build/tests
# xvfb-run --auto-servernum ./TestGitStorage -v2
xvfb-run --auto-servernum make check
- name: build subsurface-downloader
run: |
echo "--------------------------------------------------------------"
echo "building downloader"
cd ..
bash -e -x subsurface/scripts/build.sh -downloader
- name: build smtk2ssrf
run: |
echo "--------------------------------------------------------------"
echo "building smtk2ssrf"
# build smtk2ssrf (needs the artefacts generated by the subsurface build
cd ..
bash -e -x subsurface/scripts/smtk2ssrf-build.sh -y

View File

@ -1,19 +0,0 @@
name: Debian trixie / Qt 5.15--
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
do-build-test:
uses: ./.github/workflows/linux-debian-generic.yml
with:
container-image: debian:trixie

39
.github/workflows/linux-dockerimage.yml vendored Normal file
View File

@ -0,0 +1,39 @@
name: Linux Qt 5.12 Docker Image CI
on:
push:
paths:
- scripts/docker/trusty-qt512/Dockerfile
- .github/workflows/linux-docker*
jobs:
trusty-qt512:
runs-on: ubuntu-latest
env:
VERSION: ${{ '1.0' }} # 'official' images should have a dot-zero version
steps:
- uses: actions/checkout@v1
- name: Get our pre-reqs
run: |
cd scripts/docker/trusty-qt512
bash getpackages.sh
- name: set env
run: |
v=${{ env.VERSION }}
b=${{ github.ref }} # -BRANCH suffix, unless the branch is master
b=${b/refs\/heads\//}
b=${b,,} # the name needs to be all lower case
if [ $b = "master" ] ; then b="" ; else b="-$b" ; fi
echo "::set-env name=NAME::subsurface/trusty-qt512${b}:${v}"
- name: Build and Publish Linux Docker image to Dockerhub
uses: elgohr/Publish-Docker-Github-Action@master
with:
name: ${{ env.NAME }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
dockerfile: 'Dockerfile'
workdir: './scripts/docker/trusty-qt512/'

69
.github/workflows/linux-eoan-5.12.yml vendored Normal file
View File

@ -0,0 +1,69 @@
name: Ubuntu 19.10 / Qt 5.12
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
buildInContainer:
runs-on: ubuntu-latest
container:
image: ubuntu:19.10
steps:
- name: checkout sources
uses: actions/checkout@v1
- name: get container ready for build
run: |
echo "--------------------------------------------------------------"
echo "update distro and install dependencies"
apt-get update
apt-get upgrade -y
DEBIAN_FRONTEND=noninteractive apt-get install -y -q --force-yes \
autoconf automake cmake g++ git libcrypto++-dev libcurl4-gnutls-dev \
libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libssl-dev \
libtool libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make \
pkg-config qml-module-qtlocation qml-module-qtpositioning \
qml-module-qtquick2 qt5-default qt5-qmake qtchooser qtconnectivity5-dev \
qtdeclarative5-dev qtdeclarative5-private-dev qtlocation5-dev \
qtpositioning5-dev qtscript5-dev qttools5-dev qttools5-dev-tools \
qtquickcontrols2-5-dev xvfb libbluetooth-dev
- name: build Subsurface-mobile
run: |
echo "--------------------------------------------------------------"
echo "building mobile"
cd ..
bash -e -x subsurface/scripts/build.sh -mobile
- name: test mobile build
run: |
echo "--------------------------------------------------------------"
echo "running tests for mobile"
cd build-mobile
xvfb-run --auto-servernum make check
- name: build Subsurface
run: |
echo "--------------------------------------------------------------"
echo "building desktop"
# now build for the desktop version (including WebKit)
cd ..
bash -e -x subsurface/scripts/build.sh -desktop -build-with-webkit
- name: test desktop build
run: |
echo "--------------------------------------------------------------"
echo "running tests for desktop"
cd build
xvfb-run --auto-servernum make check

View File

@ -1,68 +0,0 @@
name: Fedora 35 / Qt 6--
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
container:
image: fedora:35
steps:
- name: get container ready for build
run: |
echo "--------------------------------------------------------------"
echo "update distro and install dependencies"
dnf update -y
dnf install -y autoconf automake bluez-libs-devel cmake gcc-c++ git-core \
libcurl-devel libsqlite3x-devel libssh2-devel libtool libudev-devel \
libusbx-devel libxml2-devel libxslt-devel make \
qt6-qtbase-devel qt6-qtconnectivity-devel qt6-qtdeclarative-devel \
qt6-qtlocation-devel qt6-qtsvg-devel \
qt6-qttools-devel redhat-rpm-config \
libxkbcommon-devel qt6-qt5compat-devel \
bluez-libs-devel libgit2-devel libzip-devel libmtp-devel \
xorg-x11-server-Xvfb
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
no-increment: true
- name: build Subsurface
run: |
echo "--------------------------------------------------------------"
echo "building desktop"
# now build for the desktop version (without WebKit)
cd ..
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer
git config --global --get-all safe.directory
bash -e -x subsurface/scripts/build.sh -desktop -build-with-qt6
- name: test desktop build
run: |
echo "--------------------------------------------------------------"
echo "running tests for desktop"
cd build/tests
xvfb-run --auto-servernum make check

69
.github/workflows/linux-groovy-5.14.yml vendored Normal file
View File

@ -0,0 +1,69 @@
name: Ubuntu 20.10 / Qt 5.14
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
buildInContainer:
runs-on: ubuntu-latest
container:
image: ubuntu:20.10
steps:
- name: checkout sources
uses: actions/checkout@v1
- name: get container ready for build
run: |
echo "--------------------------------------------------------------"
echo "update distro and install dependencies"
apt-get update
apt-get upgrade -y
DEBIAN_FRONTEND=noninteractive apt-get install -y -q --force-yes \
autoconf automake cmake g++ git libcrypto++-dev libcurl4-gnutls-dev \
libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libssl-dev \
libtool libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make \
pkg-config qml-module-qtlocation qml-module-qtpositioning \
qml-module-qtquick2 qt5-default qt5-qmake qtchooser qtconnectivity5-dev \
qtdeclarative5-dev qtdeclarative5-private-dev qtlocation5-dev \
qtpositioning5-dev qtscript5-dev qttools5-dev qttools5-dev-tools \
qtquickcontrols2-5-dev xvfb libbluetooth-dev
- name: build Subsurface-mobile
run: |
echo "--------------------------------------------------------------"
echo "building mobile"
cd ..
bash -e -x subsurface/scripts/build.sh -mobile
- name: test mobile build
run: |
echo "--------------------------------------------------------------"
echo "running tests for mobile"
cd build-mobile
xvfb-run --auto-servernum make check
- name: build Subsurface
run: |
echo "--------------------------------------------------------------"
echo "building desktop"
# now build for the desktop version (including WebKit)
cd ..
bash -e -x subsurface/scripts/build.sh -desktop -build-with-webkit
- name: test desktop build
run: |
echo "--------------------------------------------------------------"
echo "running tests for desktop"
cd build
xvfb-run --auto-servernum make check

View File

@ -0,0 +1,50 @@
name: openSUSE 15.2 / Qt 5.15
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
buildInContainer:
runs-on: ubuntu-latest
container:
image: opensuse/leap:15.2
steps:
- name: checkout sources
uses: actions/checkout@v1
- name: get container ready for build
run: |
echo "--------------------------------------------------------------"
echo "update distro and install dependencies"
zypper -n install git gcc-c++ make autoconf automake libtool cmake libzip-devel \
libxml2-devel libxslt-devel sqlite3-devel libusb-1_0-devel \
libqt5-linguist-devel libqt5-qttools-devel libQt5WebKitWidgets-devel \
libqt5-qtbase-devel libQt5WebKit5-devel libqt5-qtsvg-devel \
libqt5-qtscript-devel libqt5-qtdeclarative-devel \
libqt5-qtconnectivity-devel libqt5-qtlocation-devel libcurl-devel \
libQt5QuickControls2-devel bluez-devel \
which libgit2-devel libssh2-devel
# if we want to run the tests below, add xvfb-run
- name: build Subsurface
run: |
echo "--------------------------------------------------------------"
echo "building desktop"
# now build for the desktop version (including WebKit)
cd ..
bash -e -x subsurface/scripts/build.sh -desktop -build-with-webkit
# let's not run the tests... to do that, we need to install 'xvfb-run' above
# - name: test desktop build
# run: |
# echo "--------------------------------------------------------------"
# echo "running tests for desktop"
# cd build
# xvfb-run --auto-servernum make check

View File

@ -1,80 +0,0 @@
name: Snap
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
Snap:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Check out code
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
- name: store dummy version and build number for pull request
if: github.event_name == 'pull_request'
run: |
echo "100" > latest-subsurface-buildnumber
echo "CICD-pull-request" > latest-subsurface-buildnumber-extension
- name: Set up LXD
uses: canonical/setup-lxd@main
- name: Set up CCache
id: setup-ccache
run: |
sudo apt-get install ccache
mkdir -p ${HOME}/.ccache
ccache --max-size=2G
/snap/bin/lxc profile device add default ccache disk source=${HOME}/.ccache/ path=/root/.ccache
# Patch snapcraft.yaml to enable ccache
patch -p1 < .github/workflows/scripts/linux-snap.patch
# Find common base between master and HEAD to use as cache key.
git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules origin master
echo "key=$( git merge-base origin/master $GITHUB_SHA )" >> $GITHUB_OUTPUT
- name: CCache
uses: actions/cache@v3
with:
key: ccache-${{ runner.os }}-${{ steps.setup-ccache.outputs.key }}
restore-keys: |
ccache-${{ runner.os }}-
path: ~/.ccache/**
- name: Build and verify the snap
uses: canonical/actions/build-snap@release
id: build-snap
with:
setup-lxd: false
- name: Clear CCache stats
run: ccache --show-stats --zero-stats
- name: Upload the snap
if: github.event_name == 'push'
uses: actions/upload-artifact@v4
with:
name: ${{ steps.build-snap.outputs.snap-name }}
path: ${{ steps.build-snap.outputs.snap-path }}
if-no-files-found: error

37
.github/workflows/linux-trusty-5.12.yml vendored Normal file
View File

@ -0,0 +1,37 @@
name: Ubuntu 14.04 / Qt 5.12 for AppImage
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
buildInContainer:
runs-on: ubuntu-latest
container:
image: docker://subsurface/trusty-qt512:1.0
steps:
- name: checkout sources
uses: actions/checkout@v1
- name: run build
run: |
cd ..
rm -rf /install-root/include/libdivecomputer
bash -x subsurface/.github/workflows/scripts/linux-in-container-build.sh
- name: prepare PR artifacts
if: github.event_name == 'pull_request'
run: |
mkdir -p Linux-artifacts
mv Subsurface.AppImage Linux-artifacts
- name: PR artifacts
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@master
with:
name: Linux-artifacts
path: Linux-artifacts

View File

@ -1,149 +0,0 @@
name: Ubuntu 16.04 / Qt 5.15-- for AppImage
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
container:
image: ubuntu:16.04
steps:
- name: get container ready for build
run: |
echo "--------------------------------------------------------------"
echo "update distro and install dependencies"
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y -q \
software-properties-common
add-apt-repository -y ppa:savoury1/qt-5-15
add-apt-repository -y ppa:savoury1/kde-5-80
add-apt-repository -y ppa:savoury1/gpg
add-apt-repository -y ppa:savoury1/ffmpeg4
add-apt-repository -y ppa:savoury1/vlc3
add-apt-repository -y ppa:savoury1/gcc-9
add-apt-repository -y ppa:savoury1/display
add-apt-repository -y ppa:savoury1/apt-xenial
add-apt-repository -y ppa:savoury1/gtk-xenial
add-apt-repository -y ppa:savoury1/qt-xenial
add-apt-repository -y ppa:savoury1/kde-xenial
add-apt-repository -y ppa:savoury1/backports
add-apt-repository -y ppa:savoury1/build-tools
apt-get update
apt-get dist-upgrade -y
DEBIAN_FRONTEND=noninteractive apt-get install -y -q \
autoconf automake cmake g++ g++-9 git libcrypto++-dev libcurl4-gnutls-dev \
libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libssl-dev \
libtool libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make \
pkg-config qml-module-qtlocation qml-module-qtpositioning \
qml-module-qtquick2 qt5-qmake qtchooser qtconnectivity5-dev \
qtdeclarative5-dev qtdeclarative5-private-dev qtlocation5-dev \
qtpositioning5-dev qtscript5-dev qttools5-dev qttools5-dev-tools \
qtquickcontrols2-5-dev xvfb libbluetooth-dev libmtp-dev liblzma-dev \
curl
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 \
--slave /usr/bin/g++ g++ /usr/bin/g++-9
- name: checkout sources
# We cannot update this as glibc on 16.04 is too old for node 20.
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
- name: build Subsurface
run: |
echo "--------------------------------------------------------------"
echo "building desktop"
# now build the appimage
cd ..
bash -e -x subsurface/scripts/build.sh -desktop -create-appdir -build-with-webkit
- name: test desktop build
run: |
echo "--------------------------------------------------------------"
echo "running tests for desktop"
cd build/tests
# xvfb-run --auto-servernum ./TestGitStorage -v2
xvfb-run --auto-servernum make check
- name: build appimage
env:
VERSION: ${{ steps.version_number.outputs.version }}
run: |
echo "--------------------------------------------------------------"
echo "assembling AppImage"
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_DEBUG_PLUGINS=1
cd ..
# set up the appdir
mkdir -p appdir/usr/plugins/
# mv googlemaps plugins into place
mv appdir/usr/usr/lib/x86_64-linux-gnu/qt5/plugins/* appdir/usr/plugins # the usr/usr is not a typo, that's where it ends up
rm -rf appdir/usr/home/ appdir/usr/include/ appdir/usr/share/man/ # No need to ship developer and man files as part of the AppImage
rm -rf appdir/usr/usr appdir/usr/lib/x86_64-linux-gnu/cmake appdir/usr/lib/pkgconfig
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 appdir/usr/lib/
cp /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 appdir/usr/lib/
# get the linuxdeployqt tool and run it to collect the libraries
curl -L -O "https://github.com/probonopd/linuxdeployqt/releases/download/7/linuxdeployqt-7-x86_64.AppImage"
chmod a+x linuxdeployqt*.AppImage
unset QTDIR
unset QT_PLUGIN_PATH
unset LD_LIBRARY_PATH
./linuxdeployqt*.AppImage --appimage-extract-and-run ./appdir/usr/share/applications/*.desktop -exclude-libs=libdbus-1.so.3 -bundle-non-qt-libs -qmldir=./subsurface/stats -qmldir=./subsurface/map-widget/ -verbose=2
# create the AppImage
./linuxdeployqt*.AppImage --appimage-extract-and-run ./appdir/usr/share/applications/*.desktop -exclude-libs=libdbus-1.so.3 -appimage -qmldir=./subsurface/stats -qmldir=./subsurface/map-widget/ -verbose=2
# copy AppImage to the calling VM
# with GitHub Actions the $GITHUB_WORKSPACE directory is the current working directory at the start of a step
cp Subsurface*.AppImage* $GITHUB_WORKSPACE/Subsurface-$VERSION.AppImage
- name: PR artifacts
if: github.event_name == 'pull_request'
# We cannot update this as glibc on 16.04 is too old for node 20.
uses: actions/upload-artifact@v3
with:
name: Subsurface-Linux-AppImage-${{ steps.version_number.outputs.version }}
path: Subsurface-*.AppImage
compression-level: 0
# only publish a 'release' on push events (those include merging a PR)
- name: upload binaries
if: github.event_name == 'push'
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ steps.version_number.outputs.version }}
repository: ${{ github.repository_owner }}/nightly-builds
token: ${{ secrets.NIGHTLY_BUILDS }}
prerelease: false
fail_on_unmatched_files: true
files: |
./Subsurface-*.AppImage

View File

@ -1,19 +0,0 @@
name: Ubuntu 20.04 / Qt 5.12--
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
do-build-test:
uses: ./.github/workflows/linux-debian-generic.yml
with:
container-image: ubuntu:20.04

View File

@ -1,19 +0,0 @@
name: Ubuntu 22.04 / Qt 5.15--
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
do-build-test:
uses: ./.github/workflows/linux-debian-generic.yml
with:
container-image: ubuntu:22.04

View File

@ -1,19 +0,0 @@
name: Ubuntu 24.04 / Qt 5.15--
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
do-build-test:
uses: ./.github/workflows/linux-debian-generic.yml
with:
container-image: ubuntu:24.04

View File

@ -1,80 +1,69 @@
name: Mac
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
build:
runs-on: macOS-11
desktopBuild:
runs-on: macOS-latest
steps:
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
uses: actions/checkout@v1
- name: setup Homebrew
run: brew install hidapi libxslt libjpg libmtp create-dmg confuse
- name: checkout Qt resources
uses: actions/checkout@v4
with:
repository: subsurface/qt-mac
ref: main
path: qt-mac
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
- name: build Subsurface
id: build
run: brew install autoconf automake libtool xz hidapi libusb libxml2 libxslt libzip openssl pkg-config libgit2 libssh2 libjpg libpng
- name: set our Qt build
run: |
mkdir -p Qt/5.13.0
curl --output Qt-5.13.0-mac.tar.xz https://f002.backblazeb2.com/file/Subsurface-Travis/Qt-5.13.0-mac.tar.xz
tar -xJ -C Qt/5.13.0 -f Qt-5.13.0-mac.tar.xz
- name: build Subsurface-mobile
run: |
cd ${GITHUB_WORKSPACE}/..
export QT_ROOT=${GITHUB_WORKSPACE}/qt-mac/Qt5.15.13
export QT_ROOT=${GITHUB_WORKSPACE}/Qt/5.13.0/clang_64
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export PATH=$QT_ROOT/bin:$PATH
export CMAKE_PREFIX_PATH=$QT_ROOT/lib/cmake
DIR=$(pwd)
# now setup Subsurface with WebKit and build the dependencies, using the generic build script
bash -e -x ./subsurface/scripts/build.sh -desktop -build-with-webkit -release -build-deps -ftdi -prep-only
# first build Subsurface-mobile to ensure this didn't get broken
bash -e -x ./subsurface/scripts/build.sh -mobile
echo "finished initial cmake setup of Subsurface - next build the package"
cd subsurface/build
echo "run the packaging script"
bash -e -x ../packaging/macosx/make-package.sh | tee mp.log 2>&1
IMG=$(grep ^created: mp.log | tail -1 | cut -b10-)
echo "Created $IMG"
echo "dmg=$IMG" >> $GITHUB_OUTPUT
- name: test mobile build
run: |
echo "------------------------------------"
echo "run tests for mobile build"
export QT_ROOT=${GITHUB_WORKSPACE}/Qt/5.13.0/clang_64
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
cd ${GITHUB_WORKSPACE}/build-mobile/tests
make check
- name: publish pull request artifacts
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v4
with:
name: Subsurface-MacOS-${{ steps.version_number.outputs.version }}
path: ${{ steps.build.outputs.dmg }}
compression-level: 0
- name: build Subsurface
run: |
cd ${GITHUB_WORKSPACE}/..
export QT_ROOT=${GITHUB_WORKSPACE}/Qt/5.13.0/clang_64
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export PATH=$QT_ROOT/bin:$PATH
export CMAKE_PREFIX_PATH=$QT_ROOT/lib/cmake
DIR=$(pwd)
# now Subsurface with WebKit
bash -e -x ./subsurface/scripts/build.sh -desktop -build-with-webkit -release
cd ${GITHUB_WORKSPACE}/build
# build export-html to make sure that didn't get broken
make export-html
- name: test desktop build
run: |
echo "------------------------------------"
echo "run tests for desktop build"
export QT_ROOT=${GITHUB_WORKSPACE}/Qt/5.13.0/clang_64
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
cd ${GITHUB_WORKSPACE}/build/tests
make check
# only publish a 'release' on push events (those include merging a PR)
- name: upload binaries
if: github.event_name == 'push'
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.version_number.outputs.version }}
repository: ${{ github.repository_owner }}/nightly-builds
token: ${{ secrets.NIGHTLY_BUILDS }}
prerelease: false
fail_on_unmatched_files: true
files: ${{ steps.build.outputs.dmg }}

View File

@ -0,0 +1,53 @@
name: MXE Docker Image CI
on:
push:
paths:
- scripts/docker/mxe-build-container/*
- .github/workflows/mxe-docker*
jobs:
mxe-build-container-stage1:
runs-on: ubuntu-latest
env:
# IMPORTANT: use the second digit to test new versions, each new official build should be n.0 with the first one being 1.0
# as you test changes toward a new release, call those 1.1, 1.2, 1.3, etc
# VERSION is just that version presented as a string constant
#
VERSION: ${{ '1.0' }}
steps:
- uses: actions/checkout@v1
# Because, reasons, we can't really do anything in YAML, so do this crazy shell callout thingy in order to assemble
# sane variables to use later in this job - if someone knows an easier way to do this, please let me know!
# This abomination below assembles the docker image NAME and appends ".stage1" to the VERSION
- name: set env
run: |
v=${{ env.VERSION }}
s=".stage1"
b=${{ github.ref }} # -BRANCH suffix, unless the branch is master
b=${b/refs\/heads\//}
b=${b,,} # the name needs to be all lower case
if [ $b = "master" ] ; then b="" ; else b="-$b" ; fi
echo "::set-env name=NAME::subsurface/mxe-build-container${b}:${v}${s}"
- name: Build and Publish stage 1 Docker image to Dockerhub
uses: elgohr/Publish-Docker-Github-Action@master
with:
name: ${{ env.NAME }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
dockerfile: 'Dockerfile-stage1'
workdir: './scripts/docker/mxe-build-container/'
- name: Trigger stage 2 to run
# this triggers a dispatch event in our own repository - this allows us to work around the
# 6h runtime max (as on a two core system the total build time of this container is closer to 7h)
# we use the event_type to pass the version that we are building to the second stage
run: |
curl -XPOST -H 'authorization: token ${{ secrets.ACCESS_TOKEN }}' \
-H "Accept: application/vnd.github.everest-preview+json" \
-H "Content-Type: application/json" \
https://api.github.com/repos/subsurface-divelog/subsurface/dispatches \
--data '{"event_type": "${{ env.VERSION }}", "client_payload": { "target_branch": "${{ github.ref }}" } }'

View File

@ -0,0 +1,40 @@
name: MXE stage 2 Docker Image CI
# trigger this second stage via a repository dispaych event
# the version that we are building is passed in via the event type that is available to us here
# as github.event.action
on: repository_dispatch
jobs:
mxe-build-container-stage2:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
with:
ref: ${{ github.event.client_payload.target_branch }}
# Grab the version from the event name that we were triggered by and add ".stage1" to find the docker image to start FROM
# And create the NAME of the final docker image (including the branch if not master)
- name: set env
run: |
v=${{ github.event.action }}
s=".stage1"
b=${{ github.event.client_payload.target_branch }} # -BRANCH suffix, unless the branch is master
b=${b/refs\/heads\//}
b=${b,,} # the name needs to be all lower case
if [ "$b" = "master" ] || [ "$b" = "" ] ; then b="" ; else b="-$b" ; fi
echo "::set-env name=VERSION::${v}${s}"
echo "::set-env name=NAME::subsurface/mxe-build-container${b}:${v}"
- name: Build and Publish stage 2 Docker image to Dockerhub
uses: elgohr/Publish-Docker-Github-Action@master
with:
name: ${{ env.NAME }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
dockerfile: 'Dockerfile-stage2'
workdir: './scripts/docker/mxe-build-container/'
buildargs: VERSION

View File

@ -1,45 +0,0 @@
name: Post Release Notes
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
postRelease:
runs-on: ubuntu-latest
steps:
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
# since we are running this step on a pull request, we will skip build numbers in releases
- name: assemble release notes
env:
EVENT_HEAD_COMMIT_ID: ${{ github.event.head_commit.id }}
# Required because we are using the GitHub CLI in 'create-releasenotes.sh'
GH_TOKEN: ${{ github.token }}
run: |
scripts/create-releasenotes.sh $EVENT_HEAD_COMMIT_ID
# add a file containing the release title so it can be picked up and listed on the release page on our web server
- name: publish release
if: github.event_name == 'push'
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.version_number.outputs.version }}
repository: ${{ github.repository_owner }}/nightly-builds
token: ${{ secrets.NIGHTLY_BUILDS }}
prerelease: false
files: release_content_title.txt
body_path: gh_release_notes.md

View File

@ -1,169 +0,0 @@
#!/usr/bin/env python3
# coding: utf-8
import json
import logging
import multiprocessing
import os
import pathlib
import pprint
import sys
import subprocess
import tempfile
from launchpadlib import errors as lp_errors # fades
from launchpadlib.credentials import RequestTokenAuthorizationEngine, UnencryptedFileCredentialStore
from launchpadlib.launchpad import Launchpad
import requests # fades
logger = logging.getLogger("subsurface.check_usns")
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.INFO)
APPLICATION = "subsurface-ci"
LAUNCHPAD = "production"
TEAM = "subsurface"
SOURCE_NAME = "subsurface"
SNAPS = {
"subsurface": {
"stable": {"recipe": "subsurface-stable"},
},
}
STORE_URL = "https://api.snapcraft.io/api/v1/snaps" "/details/{snap}?channel={channel}"
STORE_HEADERS = {"X-Ubuntu-Series": "16", "X-Ubuntu-Architecture": "{arch}"}
CHECK_NOTICES_PATH = "/snap/bin/review-tools.check-notices"
CHECK_NOTICES_ARGS = ["--ignore-pockets", "esm-apps"]
def get_store_snap(processor, snap, channel):
logger.debug("Checking for snap %s on %s in channel %s", snap, processor, channel)
data = {
"snap": snap,
"channel": channel,
"arch": processor,
}
resp = requests.get(STORE_URL.format(**data), headers={k: v.format(**data) for k, v in STORE_HEADERS.items()})
logger.debug("Got store response: %s", resp)
try:
result = json.loads(resp.content)
except json.JSONDecodeError:
logger.error("Could not parse store response: %s", resp.content)
else:
return result
def fetch_url(entry):
dest, uri = entry
r = requests.get(uri, stream=True)
logger.debug("Downloading %s to %s", uri, dest)
if r.status_code == 200:
with open(dest, "wb") as f:
for chunk in r:
f.write(chunk)
return dest
def check_snap_notices(store_snaps):
with tempfile.TemporaryDirectory(dir=pathlib.Path.home()) as dir:
snaps = multiprocessing.Pool(8).map(
fetch_url,
(
(pathlib.Path(dir) / f"{snap['package_name']}_{snap['revision']}.snap", snap["download_url"])
for snap in store_snaps
),
)
try:
notices = subprocess.check_output([CHECK_NOTICES_PATH] + CHECK_NOTICES_ARGS + snaps, encoding="UTF-8")
logger.debug("Got check_notices output:\n%s", notices)
except subprocess.CalledProcessError as e:
logger.error("Failed to check notices:\n%s", e.output)
sys.exit(2)
else:
notices = json.loads(notices)
return notices
if __name__ == "__main__":
check_notices = os.path.isfile(CHECK_NOTICES_PATH) and os.access(CHECK_NOTICES_PATH, os.X_OK)
if not check_notices:
raise RuntimeError("`review-tools` not found.")
try:
lp = Launchpad.login_with(
APPLICATION,
LAUNCHPAD,
version="devel",
authorization_engine=RequestTokenAuthorizationEngine(LAUNCHPAD, APPLICATION),
credential_store=UnencryptedFileCredentialStore(os.path.expanduser(sys.argv[1])),
)
except NotImplementedError:
raise RuntimeError("Invalid credentials.")
ubuntu = lp.distributions["ubuntu"]
logger.debug("Got ubuntu: %s", ubuntu)
team = lp.people[TEAM]
logger.debug("Got team: %s", team)
errors = []
for snap, channels in SNAPS.items():
for channel, snap_map in channels.items():
logger.info("Processing channel %s for snap %s", channel, snap)
try:
snap_recipe = lp.snaps.getByName(owner=team, name=snap_map["recipe"])
logger.debug("Got snap: %s", snap_recipe)
except lp_errors.NotFound as ex:
logger.error("Snap not found: %s", snap_map["recipe"])
errors.append(ex)
continue
if len(snap_recipe.pending_builds) > 0:
logger.info("Skipping %s: snap builds pending…", snap_recipe.web_link)
continue
store_snaps = tuple(
filter(
lambda snap: snap.get("result") != "error",
(get_store_snap(processor.name, snap, channel) for processor in snap_recipe.processors),
)
)
logger.debug("Got store versions: %s", {snap["architecture"][0]: snap["version"] for snap in store_snaps})
snap_notices = check_snap_notices(store_snaps)[snap]
for store_snap in store_snaps:
if str(store_snap["revision"]) not in snap_notices:
logger.error(
"Revision %s missing in result, see above for any review-tools errors.", store_snap["revision"]
)
errors.append(f"Revision {store_snap['revision']} missing in result:\n{store_snap}")
if any(snap_notices.values()):
logger.info("Found USNs:\n%s", pprint.pformat(snap_notices))
else:
logger.info("Skipping %s: no USNs found", snap)
continue
logger.info("Triggering %s", snap_recipe.description or snap_recipe.name)
snap_recipe.requestBuilds(
archive=snap_recipe.auto_build_archive,
pocket=snap_recipe.auto_build_pocket,
channels=snap_recipe.auto_build_channels,
)
logger.debug("Triggered builds: %s", snap_recipe.web_link)
for error in errors:
logger.debug(error)
if errors:
sys.exit(1)

View File

@ -0,0 +1,64 @@
#!/bin/bash
set -x
set -e
# this gets executed by the GitHub Action when building an AppImage for Linux
# inside of the trusty-qt512 container
export PATH=$QT_ROOT/bin:$PATH # Make sure correct qmake is found on the $PATH for linuxdeployqt
export CMAKE_PREFIX_PATH=$QT_ROOT/lib/cmake
echo "--------------------------------------------------------------"
echo "install missing packages"
apt install -y libbluetooth-dev
# the container currently has things under / that need to be under /__w/subsurface/subsurface instead
cp -a /appdir /__w/subsurface/
cp -a /install-root /__w/subsurface/
echo "--------------------------------------------------------------"
echo "building mobile"
# first make sure that no one broke Subsurface-mobile
bash -e -x subsurface/scripts/build.sh -mobile -quick
echo "--------------------------------------------------------------"
echo "building desktop"
# now build our AppImage
bash -e -x subsurface/scripts/build.sh -desktop -create-appdir -build-with-webkit -quick
echo "--------------------------------------------------------------"
echo "assembling AppImage"
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_DEBUG_PLUGINS=1
# set up the appdir
mkdir -p appdir/usr/plugins/
# mv googlemaps plugins into place
mv appdir/usr/usr/local/Qt/5.12.4/gcc_64/plugins/* appdir/usr/plugins # the usr/usr is not a typo, that's where it ends up
rm -rf appdir/usr/home/ appdir/usr/include/ appdir/usr/share/man/ # No need to ship developer and man files as part of the AppImage
rm -rf appdir/usr/usr appdir/usr/lib/cmake appdir/usr/lib/pkgconfig
cp /ssllibs/libssl.so appdir/usr/lib/libssl.so.1.1
cp /ssllibs/libcrypto.so appdir/usr/lib/libcrypto.so.1.1
# get the linuxdeployqt tool and run it to collect the libraries
curl -L -O "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
chmod a+x linuxdeployqt*.AppImage
unset QTDIR
unset QT_PLUGIN_PATH
unset LD_LIBRARY_PATH
./linuxdeployqt*.AppImage --appimage-extract-and-run ./appdir/usr/share/applications/*.desktop -exclude-libs=libdbus-1.so.3 -bundle-non-qt-libs -qmldir=./subsurface/map-widget/ -verbose=2
# create the AppImage
export VERSION=$(cd subsurface/scripts ; ./get-version linux) # linuxdeployqt uses this for naming the file
./linuxdeployqt*.AppImage --appimage-extract-and-run ./appdir/usr/share/applications/*.desktop -exclude-libs=libdbus-1.so.3 -appimage -qmldir=./subsurface/map-widget/ -verbose=2
# copy AppImage to the calling VM
# with GitHub Actions the /${GITHUB_WORKSPACE} directory is the current working directory at the start of a step
cp Subsurface*.AppImage* /${GITHUB_WORKSPACE}/Subsurface.AppImage
ls -l /${GITHUB_WORKSPACE}/Subsurface.AppImage

View File

@ -1,44 +0,0 @@
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index 9f34d0169..0d5a89fd9 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -35,6 +35,7 @@ parts:
source: https://github.com/Subsurface/googlemaps.git
plugin: make
build-packages:
+ - ccache
- qtbase5-dev
- wget
override-pull: |
@@ -79,6 +80,7 @@ parts:
override-build: |
qmake \
INCLUDEPATH+=${CRAFT_PART_SRC}/QtHeaders \
+ CONFIG+=ccache \
${CRAFT_PART_SRC}
craftctl default
@@ -111,7 +113,11 @@ parts:
source: .
source-type: git
source-subdir: libdivecomputer
+ autotools-configure-parameters:
+ - CC="ccache gcc"
+ - CXX="ccache g++"
build-packages:
+ - ccache
- libbluetooth-dev
- libhidapi-dev
- libusb-dev
@@ -134,8 +140,11 @@ parts:
- -DFTDISUPPORT=ON
- -DLIBDIVECOMPUTER_LIBRARIES=../../../stage/usr/local/lib/libdivecomputer.so
- -DLIBDIVECOMPUTER_INCLUDE_DIR=../../../stage/usr/local/include
+ - -DCMAKE_C_COMPILER_LAUNCHER=ccache
+ - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
build-packages:
- build-essential
+ - ccache
- libcurl4-gnutls-dev
- libftdi1-dev
- libgit2-dev

View File

@ -1,2 +0,0 @@
launchpadlib
requests

View File

@ -5,4 +5,3 @@
echo "downloading sources for fresh build"
bash subsurface/scripts/get-dep-lib.sh single . libzip
bash subsurface/scripts/get-dep-lib.sh single . googlemaps
bash subsurface/scripts/get-dep-lib.sh single . libmtp

View File

@ -1,6 +1,6 @@
#!/bin/bash
# this gets executed inside the container when building a Windows
# installer as GitHub Action
# installer on Travis
#
# working directory is assumed to be the directory including all the
# source directories (subsurface, googlemaps, grantlee, etc)
@ -14,19 +14,17 @@ mkdir -p win32
cd win32
# build Subsurface and then smtk2ssrf
export MXEBUILDTYPE=x86_64-w64-mingw32.shared
export MXEBUILDTYPE=i686-w64-mingw32.shared
bash -ex ../subsurface/packaging/windows/mxe-based-build.sh installer
# the strange two step move is in order to get predictable names to use
# in the publish step of the GitHub Action
mv subsurface/subsurface.exe* ${OUTPUT_DIR}/
fullname=$(cd subsurface ; ls subsurface-*.exe)
mv subsurface/"$fullname" ${OUTPUT_DIR}/"${fullname%.exe}-installer.exe"
mv subsurface/subsurface.exe* ${GITHUB_WORKSPACE}/
mv subsurface/subsurface-*.exe ${GITHUB_WORKSPACE}/subsurface-installer.exe
bash -ex ../subsurface/packaging/windows/smtk2ssrf-mxe-build.sh -a -i
# the strange two step move is in order to get predictable names to use
# in the publish step of the GitHub Action
mv smtk-import/smtk2ssrf.exe ${OUTPUT_DIR}/
fullname=$(cd smtk-import ; ls smtk2ssrf*.exe)
mv smtk-import/smtk2ssrf*.exe ${OUTPUT_DIR}/"${fullname%.exe}-installer.exe"
mv smtk-import/smtk2ssrf.exe ${GITHUB_WORKSPACE}/
mv smtk-import/smtk2ssrf*.exe ${GITHUB_WORKSPACE}/smtk2ssrf-installer.exe

View File

@ -1,37 +0,0 @@
name: SnapUSNs
on:
workflow_dispatch:
schedule:
- cron: '0 5 * * *'
jobs:
CheckUSNs:
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Python dependencies
uses: insightsengineering/pip-action@v2.0.0
with:
requirements: .github/workflows/scripts/requirements.txt
- name: Install Snap dependencies
run: |
sudo snap install review-tools --edge
- name: Set up Launchpad credentials
uses: DamianReeves/write-file-action@v1.2
with:
path: lp_credentials
contents: ${{ secrets.LAUNCHPAD_CREDENTIALS }}
- name: Check for USNs
run: .github/workflows/scripts/check_usns.py lp_credentials

View File

@ -1,55 +0,0 @@
name: Ubuntu Launchpad Build
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
- current
jobs:
push-to-ppa:
name: Submit build to Ubuntu Launchpad
runs-on: ubuntu-latest
steps:
- name: Check out sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
- name: Setup build dependencies
run: |
sudo apt-get update
sudo apt-get install -y devscripts dput gpg debhelper qt5-qmake cmake
- name: Setup gpg key token for launchpad
env:
GPG_PRIVATE_KEY: ${{ secrets.PPA_SECRET_KEY }}
run: |
echo "$GPG_PRIVATE_KEY" > ~/.key
gpg --import ~/.key
- name: setup git
run: |
git config --global --add safe.directory /__w/subsurface/subsurface
git config --global --add safe.directory /__w/subsurface/subsurface/libdivecomputer
- name: Checkout googlemaps
run: |
cd ..
git clone https://github.com/subsurface/googlemaps
- name: run the launchpad make-package script
run: |
cd ..
bash -x subsurface/packaging/ubuntu/make-package.sh $GITHUB_REF_NAME

View File

@ -1,38 +0,0 @@
name: Windows (MXE) Docker Image
on:
push:
branches:
- master
paths:
- scripts/docker/mxe-build-container/**
- .github/workflows/windows-mxe-dockerimage.yml
jobs:
windows-mxe:
runs-on: ubuntu-latest
env:
VERSION: ${{ '3.1.0' }} # 'official' images should have a dot-zero version
mxe_sha: 'c0bfefc57a00fdf6cb5278263e21a478e47b0bf5'
steps:
- uses: actions/checkout@v4
- name: Build the name for the docker image
id: build_name
run: |
v=$VERSION
b=$GITHUB_REF # -BRANCH suffix, unless the branch is master
b=${b/refs\/heads\//}
b=${b,,} # the name needs to be all lower case
if [ $b = "master" ] ; then b="" ; else b="-$b" ; fi
echo "NAME=$GITHUB_REPOSITORY_OWNER/mxe-build${b}:${v}" >> $GITHUB_OUTPUT
- name: Build and Publish Linux Docker image to Dockerhub
uses: elgohr/Publish-Docker-Github-Action@v5
with:
name: ${{ steps.build_name.outputs.NAME }}
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
workdir: './scripts/docker/mxe-build-container/'
buildargs: mxe_sha

View File

@ -1,73 +1,43 @@
name: Windows
on:
push:
paths-ignore:
- scripts/docker/**
branches:
- master
pull_request:
paths-ignore:
- scripts/docker/**
branches:
- master
jobs:
build:
buildInContainer:
runs-on: ubuntu-latest
container:
image: docker://subsurface/mxe-build:3.1.0
image: docker://subsurface/mxe-build-container:1.1
steps:
- name: checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: set the version information
id: version_number
uses: ./.github/actions/manage-version
with:
nightly-builds-secret: ${{ secrets.NIGHTLY_BUILDS }}
uses: actions/checkout@v1
- name: get other dependencies
env:
SUBSURFACE_REPO_PATH: ${{ github.workspace }}
run: |
echo "Running script to install additional dependancies into container"
git config --global --add safe.directory ${SUBSURFACE_REPO_PATH}
git config --global --add safe.directory ${SUBSURFACE_REPO_PATH}/libdivecomputer
cd /win
ln -s /__w/subsurface/subsurface .
bash -x subsurface/packaging/windows/container-prep.sh 2>&1 | tee pre-build.log
bash -x subsurface/.github/workflows/scripts/windows-container-prep.sh 2>&1 | tee pre-build.log
- name: run build
run: |
export OUTPUT_DIR="$GITHUB_WORKSPACE"
cd /win
bash -x subsurface/packaging/windows/in-container-build.sh 2>&1 | tee build.log
bash -x subsurface/.github/workflows/scripts/windows-in-container-build.sh 2>&1 | tee build.log
grep "Built target installer" build.log
- name: publish pull request artifacts
- name: prepare PR artifacts
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v4
with:
name: Subsurface-Windows-${{ steps.version_number.outputs.version }}
path: |
subsurface*.exe*
smtk2ssrf*.exe
run: |
mkdir -p Windows-artifacts
mv ./subsurface-installer.exe ./subsurface.exe ./subsurface.exe.debug ./smtk2ssrf-installer.exe ./smtk2ssrf.exe Windows-artifacts
# only publish a 'release' on push events (those include merging a PR)
- name: upload binaries
if: github.event_name == 'push'
uses: softprops/action-gh-release@v2
- name: PR artifacts
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@master
with:
tag_name: v${{ steps.version_number.outputs.version }}
repository: ${{ github.repository_owner }}/nightly-builds
token: ${{ secrets.NIGHTLY_BUILDS }}
prerelease: false
fail_on_unmatched_files: true
files: |
./subsurface*.exe*
./smtk2ssrf*.exe
name: Windows-artifacts
path: Windows-artifacts

9
.gitignore vendored
View File

@ -35,18 +35,9 @@ Subsurface.app
.DS_Store
!android/**/*.xml
build*
nightly-builds/
mobile-widgets/qml/kirigami
mobile-widgets/3rdparty/ECM/
mobile-widgets/3rdparty/breeze-icons/
mobile-widgets/3rdparty/extra-cmake-modules/
mobile-widgets/3rdparty/kirigami/
packaging/ios/install-root
packaging/ios/Info.plist
packaging/ios/Qt
packaging/ios/asset_catalog_compiler.Info.plist
appdata/subsurface.appdata.xml
android-mobile/Roboto-Regular.ttf
gh_release_notes.md
release_content_title.txt
/output/

2
.gitmodules vendored
View File

@ -1,4 +1,4 @@
[submodule "libdivecomputer"]
path = libdivecomputer
url = https://github.com/Subsurface/libdc.git
url = git://github.com/Subsurface/libdc.git
branch = Subsurface-NG

View File

@ -4,7 +4,6 @@
<dirk@hohndel.org> <hohndel@mail.gr8dns.org>
Dirk Hohndel <dirk@hohndel.org> Dirk Hohndel (Intel) <dhohndel@dhohndel-mac02.jf.intel.com>
Dirk Hohndel <dirk@hohndel.org> Subsurface <dirk@subsurface-divelog.org>
Dirk Hohndel <dirk@hohndel.org> Subsurface CI <dirk@hohndel.org>
<guido.lerch@gmail.com> <glerch@Guidos-MacBook-Air.local>
<jacco.van.koll@gmail.com> <jko@haringstad.com>
<jlmulder@xs4all.nl> <jlmulder@planet.nl>

View File

@ -11,4 +11,3 @@ type = TS
source_file = terms
source_lang = en
type = txt

View File

@ -1,46 +1,13 @@
statistics: show proper dates in January
desktop: add country to the fields indexed for full text search
import: update libdivecomputer version, add support for the Scubapro G3 / Luna and Shearwater Tern
desktop: add a button linking to the 'Contribute' page
mobile: fix configuration of decompression ceiling and gradient factors
desktop: fix gas switches in UDDF exports
core: allow of up to 6 O2 sensors (and corresponding voting logic)
desktop: add divemode as a possible dive list column
profile-widget: Now zomed in profiles can be panned with horizontal scroll.
desktop: hide only events with the same severity when 'Hide similar events' is used
equipment: mark gas mixes reported by the dive computer as 'inactive' as 'not used'
equipment: include unused cylinders in merged dive if the preference is enabled
equipment: fix bug showing the first diluent in the gas list as 'used' for CCR dives
desktop: added button to hide the infobox in the dive profile
desktop: use persisted device information for the dive computer configuration
core: fix bug using salinity and pressure values in mbar <-> depth conversion
export: fix bug resulting in invalid CSV for '""' in 'CSV summary dive details'
desktop: add support for multiple tanks to the profile ruler
export: change format produced by 'CSV summary dive details' from TSV (tab separated) to CSV
desktop: add function to merge dive site into site selected in list
import: add option to synchronise dive computer time when downloading dives
desktop: fix salinity combo/icon when DC doesnt have salinity info
core: fix bug when save sea water salinity given by DC
desktop: add option to force firmware update on OSTC4
desktop: add column for dive notes to the dive list table
desktop: Add an option for printing in landscape mode
desktop: fix bug when printing a dive plan with multiple segments
desktop: fix remembering of bluetooth address for remembered dive computers (not MacOS)
desktop: fix bug in bailout gas selection for CCR dives
desktop: fix crash on cylinder update of multiple dives
desktop: use dynamic tank use drop down in equipment tab and planner
desktop: fix brightness configuration for OSTC4
equipment: Use 'diluent' as default gas use type if the dive mode is 'CCR'
htmlexport: fix search in HTML export
htmlexport: fix diveguide display
statistics: fix value axis for degenerate value ranges
profile: Show correct gas density when in CCR mode
statistics: show correct color of selected scatter items when switching to unbinned mode
statistics: fix display of month number in continuous date axis
statistics: fix range of continuous date axis
desktop: fix dive time display in time shift dialog
libdivecomputer: garmin: relax string parsing sanity checks
libdivecomputer: add Cressi Donatello, Scubapro G2 TEK, Oceanic Geo Air, Scorpena Alpha
- desktop: fix crash on drag&drop into tag widgets [#3030]
- macOS: fix issue with HID dive computers like Suunto Eon Core/Steel [#2999]
- windows: add missing modern Vista theme
- mobile: add location service warning as required by Google Play
- desktop: allow adding dives to arbitrary trips
- core: improve merging of cylinder pressures [#2884]
- desktop: respect page-up, page-down, home and end keys for selection change [#2957]
- Use pO2 from prefernces for MOD display in equipment tab
- filter: more flexible filtering system based on individual constraints
- mobile: fix manually adding dives in the past [#2971]
---
* Always add new entries at the very top of this file above other existing entries and this note.

View File

@ -20,7 +20,6 @@ endif ()
set(CMAKE_MODULE_PATH
${${PROJECT_NAME}_SOURCE_DIR}/cmake/Modules
${${PROJECT_NAME}_SOURCE_DIR}/../install-root/lib/cmake
${CMAKE_MODULE_PATH}
)
@ -30,9 +29,6 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
"We don't support building in source, please create a build folder elsewhere and remember to run git clean -xdf to remove temporary files created by CMake."
)
#Option for memory debugging
option(SUBSURFACE_ASAN_BUILD "enable memory debugging of Subsurface binary" OFF)
#Option for profiling
option(SUBSURFACE_PROFILING_BUILD "enable profiling of Subsurface binary" OFF)
@ -50,17 +46,14 @@ option(NO_PRINTING "disable the printing support" OFF)
option(NO_USERMANUAL "don't include a viewer for the user manual" OFF)
#Options regarding enabling parts of subsurface
option(BTSUPPORT "enable support for QtBluetooth" ON)
option(BTSUPPORT "enable support for QtBluetooth (requires Qt5.4 or newer)" ON)
option(FTDISUPPORT "enable support for libftdi based serial" OFF)
# Options regarding What should we build on subsurface
option(MAKE_TESTS "Make the tests" ON)
# Option whether we should try to build against Qt6, if it is available
option(BUILD_WITH_QT6 "try to build against Qt6 (incomplete)" OFF)
SET(SUBSURFACE_TARGET_EXECUTABLE "DesktopExecutable" CACHE STRING "The type of application, DesktopExecutable, MobileExecutable, or DownloaderExecutable")
LIST(APPEND SUBSURFACE_ACCEPTED_EXECUTABLES "DesktopExecutable" "MobileExecutable" "DownloaderExecutable")
SET(SUBSURFACE_TARGET_EXECUTABLE "DesktopExecutable" CACHE STRING "The type of application, DesktopExecutable or MobileExecutable")
LIST(APPEND SUBSURFACE_ACCEPTED_EXECUTABLES "DesktopExecutable" "MobileExecutable")
SET_PROPERTY(CACHE SUBSURFACE_TARGET_EXECUTABLE PROPERTY STRINGS ${SUBSURFACE_ACCEPTED_EXECUTABLES})
#verify if Platform is correct and warn on wxit with example.
@ -80,7 +73,7 @@ add_definitions(-DSUBSURFACE_SOURCE="${SUBSURFACE_SOURCE}")
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
#
@ -117,15 +110,10 @@ if (SUBSURFACE_PROFILING_BUILD)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
endif()
# set up ASan
if (SUBSURFACE_ASAN_BUILD)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
SET(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
endif()
# every compiler understands -Wall
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror=format")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror=format")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
# by detault optimize with -O2 even for debug builds
set (GCC_OPTIMIZATION_FLAGS "-O2" CACHE STRING "GCC optimization flags")
@ -145,6 +133,9 @@ include(pkgconfig_helper)
# module file.
include(HandleFindGit2)
include(HandleFindLibDiveComputer)
if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DesktopExecutable")
include(HandleUserManual)
endif()
include(HandleFtdiSupport)
include(HandleVersionGeneration)
include(RunOnBuildDir)
@ -152,7 +143,7 @@ include(cmake_variables_helper)
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
include_directories(${CMAKE_OSX_SYSROOT}/usr/include/libxml2)
LIST(APPEND SUBSURFACE_LINK_LIBRARIES -lxml2 -lxslt -lsqlite3)
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lxml2 -lxslt -lsqlite3)
else()
pkg_config_library(LIBXML libxml-2.0 REQUIRED)
pkg_config_library(LIBSQLITE3 sqlite3 REQUIRED)
@ -165,7 +156,6 @@ if(NOT ANDROID)
pkg_config_library(BLUEZ bluez REQUIRED)
endif()
pkg_config_library(LIBUSB libusb-1.0 QUIET)
pkg_config_library(LIBMTP libmtp QUIET)
endif()
include_directories(.
@ -174,67 +164,6 @@ include_directories(.
${CMAKE_BINARY_DIR}/desktop-widgets
)
# decide what to do about Qt
# this is messy because we want to support older Qt5 versions, newer Qt5 versions,
# and Qt6 when enabled / available.
if(BUILD_WITH_QT6)
set(CHECK_QT6 "Qt6")
endif()
# figure out which version of Qt we are building against
# in theory this should get us all the variables set up correctly, but that
# ended up failing in subtle ways to do what was advertized; in the Qt5 case
# some of the variables didn't get set up, so we'll immediately call it again
# for Qt5
find_package(QT NAMES ${CHECK_QT6} Qt5 REQUIRED COMPONENTS Core Widgets)
# right now there are a few things that don't work with Qt6
# let's disable them right here and remember our Qt version
if(QT_VERSION_MAJOR STREQUAL "6")
set(USINGQT6 ON)
set(QT5OR6 "")
# for Qt6 we want the Qt5 compatibility package
LIST(APPEND QT_EXTRA_COMPONENTS Core5Compat)
LIST(APPEND QT_TEST_LIBRARIES Qt::Core5Compat)
# QtWebKit doesn't work with Qt6, so no printing, no manual
set(NO_PRINTING ON)
set(NO_USERMANUAL ON)
# as of Qt 6.3 by default QtLocation isn't included, but one can
# build the module from source; so let's look if the user has installed
# it (or if a newer version is out that includes it, anyway)
find_package(Qt6 COMPONENTS Location)
if(Qt6Location_FOUND)
message(STATUS "Found Qt6Location")
LIST(APPEND QT_EXTRA_COMPONENTS Location)
add_definitions(-DMAP_SUPPORT)
set(MAPSUPPORT ON)
# at least on macOS something goes sideways and we fail to load the
# QML files with a weird error about Qml.WorkerScript missing
# linking Subsurface against that component appears enough to hack
# around that, but that feels... wrong
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
find_package(Qt6 COMPONENTS QmlWorkerScript)
LIST(APPEND SUBSURFACE_LINK_LIBRARIES Qt6::QmlWorkerScript)
endif()
endif()
else()
# as mentioned above, since some variables appear to fail to populate
# on some platforms, simply run this again the 'old' way
find_package(Qt5 REQUIRED COMPONENTS Core Widgets)
set(USINGQT6 OFF)
set(QT5OR6 "5")
set(QT_VERSION ${Qt5_VERSION})
set(QT_INSTALL_PREFIX ${_qt5Core_install_prefix})
# for Qt5 we want the Location component (which is missing so far in Qt6)
LIST(APPEND QT_EXTRA_COMPONENTS Location)
add_definitions(-DMAP_SUPPORT)
set(MAPSUPPORT ON)
endif()
message(STATUS "building with Qt ${QT_VERSION}")
# Project Target specific configuration should go here,
# if the configuration is too big or would disrupt the normal code flux,
# move it somewhere else (another file) and include it.
@ -246,32 +175,14 @@ if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DesktopExecutable")
endif()
list(APPEND QT_EXTRA_COMPONENTS QuickWidgets)
remove_definitions(-DSUBSURFACE_MOBILE)
if(NO_USERMANUAL)
message(STATUS "building without built-in user manual support")
add_definitions(-DNO_USERMANUAL)
else()
set(REQUEST_WEBKIT ON)
endif()
if(NO_PRINTING)
message(STATUS "building without printing support")
add_definitions(-DNO_PRINTING)
else()
set(REQUEST_WEBKIT ON)
endif()
if(REQUEST_WEBKIT)
LIST(APPEND QT_EXTRA_COMPONENTS PrintSupport)
# Because Qt5WebKitWidgets isn't a part of the "regular" Qt5, we can't get it the normal way
find_package(Qt5WebKitWidgets QUIET)
if(Qt5WebKitWidgets_FOUND STREQUAL "1")
LIST(APPEND QT_EXTRA_COMPONENTS PrintSupport WebKitWidgets)
LIST(APPEND SUBSURFACE_LINK_LIBRARIES Qt5::WebKitWidgets)
message(STATUS "building with QtWebKit")
else()
message(STATUS "didn't find QtWebKit, building without user manual and printing support")
add_definitions(-DNO_PRINTING)
add_definitions(-DNO_USERMANUAL)
set(NO_PRINTING ON)
set(NO_USERMANUAL ON)
endif()
find_package(Qt5WebKitWidgets REQUIRED)
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} Qt5::WebKitWidgets)
endif()
elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "MobileExecutable")
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
@ -280,7 +191,6 @@ elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "MobileExecutable")
set(SUBSURFACE_TARGET subsurface-mobile)
endif()
list(APPEND QT_EXTRA_COMPONENTS QuickControls2)
list(APPEND QT_EXTRA_COMPONENTS QuickWidgets)
add_definitions(-DSUBSURFACE_MOBILE)
# add definition to seperate mobile for devices and for desktop
@ -288,15 +198,6 @@ elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "MobileExecutable")
message(STATUS "Building Subsurface-mobile requires BT support")
set(BTSUPPORT ON)
elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DownloaderExecutable")
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(SUBSURFACE_TARGET Subsurface-downloader)
else()
set(SUBSURFACE_TARGET subsurface-downloader)
endif()
set(BTSUPPORT ON)
add_definitions(-DSUBSURFACE_DOWNLOADER)
message(STATUS "building the embedded Subsurface-downloader app")
endif()
if(ANDROID)
@ -304,32 +205,32 @@ if(ANDROID)
set(NO_USERMANUAL ON)
set(MAKE_TESTS OFF)
list(APPEND QT_EXTRA_COMPONENTS AndroidExtras)
LIST(APPEND SUBSURFACE_LINK_LIBRARIES -llog)
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -llog)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
# add pthread to the end of the library list on Linux
# this is only needed on Ubuntu
# but shouldn't hurt on other Linux versions
# in some builds we appear to be missing libz for some strange reason...
LIST(APPEND SUBSURFACE_LINK_LIBRARIES -lz -lpthread)
# add pthread to the end of the library list on Linux
# this is only needed on Ubuntu
# but shouldn't hurt on other Linux versions
# in some builds we appear to be missing libz for some strange reason...
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lz -lpthread)
# Test for ARM processor (Raspberry Pi) and add libGLESv2 if found
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "armv6l")
message (STATUS "Found ARM processor. Adding libGLESv2")
LIST(APPEND SUBSURFACE_LINK_LIBRARIES -lGLESv2)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif()
# Test for ARM processor (Raspberry Pi) and add libGLESv2 if found
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "armv6l")
message (STATUS "Found ARM processor. Adding libGLESv2")
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lGLESv2)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
execute_process(
COMMAND bash scripts/get-version.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE SSRF_VERSION_STRING
OUTPUT_STRIP_TRAILING_WHITESPACE
)
find_library(APP_SERVICES_LIBRARY ApplicationServices)
find_library(HID_LIB HidApi)
LIST(APPEND SUBSURFACE_LINK_LIBRARIES ${HID_LIB})
set(EXTRA_LIBS ${APP_SERVICES_LIBRARY})
set(ICON_FILE ${CMAKE_SOURCE_DIR}/packaging/macosx/Subsurface.icns)
execute_process(
COMMAND sh scripts/get-version linux
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE SSRF_VERSION_STRING
OUTPUT_STRIP_TRAILING_WHITESPACE
)
find_library(APP_SERVICES_LIBRARY ApplicationServices)
find_library(HID_LIB HidApi)
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${HID_LIB})
set(EXTRA_LIBS ${APP_SERVICES_LIBRARY})
set(ICON_FILE ${CMAKE_SOURCE_DIR}/packaging/macosx/Subsurface.icns)
if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "MobileExecutable")
set(MACOSX_BUNDLE_INFO_STRING "Subsurface-mobile")
set(MACOSX_BUNDLE_BUNDLE_NAME "Subsurface-mobile")
@ -339,16 +240,16 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
endif()
set(MACOSX_BUNDLE_ICON_FILE Subsurface.icns)
set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.subsurface-divelog")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${SSRF_VERSION_STRING}")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${SSRF_VERSION_STRING}")
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${SSRF_VERSION_STRING}")
set(MACOSX_BUNDLE_COPYRIGHT "Linus Torvalds, Dirk Hohndel, Tomaz Canabrava, Berthold Stoeger and others")
set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
set(SUBSURFACE_PKG MACOSX_BUNDLE ${ICON_FILE})
set(MACOSX_BUNDLE_BUNDLE_VERSION "${SSRF_VERSION_STRING}")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${SSRF_VERSION_STRING}")
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${SSRF_VERSION_STRING}")
set(MACOSX_BUNDLE_COPYRIGHT "Linus Torvalds, Dirk Hohndel, Tomaz Canabrava, Berthold Stoeger and others")
set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
set(SUBSURFACE_PKG MACOSX_BUNDLE ${ICON_FILE})
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
LIST(APPEND SUBSURFACE_LINK_LIBRARIES -lwsock32 -lws2_32)
remove_definitions(-DUNICODE)
add_definitions(-mwindows -D_WIN32)
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lwsock32 -lws2_32)
remove_definitions(-DUNICODE)
add_definitions(-mwindows -D_WIN32)
endif()
if(BTSUPPORT)
@ -364,64 +265,41 @@ if(ANDROID)
# our Qt installation. This is ugly, but it works.
set(CMAKE_FIND_ROOT_PATH "/;${CMAKE_FIND_ROOT_PATH}")
endif()
set(QT_FIND_COMPONENTS Core Concurrent Widgets Network Svg Positioning Quick ${QT_EXTRA_COMPONENTS})
set(QT_FIND_COMPONENTS Core Concurrent Widgets Network Svg Positioning Quick Location ${QT_EXTRA_COMPONENTS})
if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DesktopExecutable")
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QT_FIND_COMPONENTS} LinguistTools Test QuickTest)
elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "MobileExecutable")
find_package(Qt5 5.9.1 REQUIRED COMPONENTS ${QT_FIND_COMPONENTS} LinguistTools Test QuickTest)
else()
# Kirigami 5.62 and newer require at least Qt 5.12
if(ANDROID)
find_package(Qt${QT_VERSION_MAJOR} 5.12 REQUIRED COMPONENTS ${QT_FIND_COMPONENTS} LinguistTools)
find_package(Qt5 5.12 REQUIRED COMPONENTS ${QT_FIND_COMPONENTS} LinguistTools)
else()
find_package(Qt${QT_VERSION_MAJOR} 5.12 REQUIRED COMPONENTS ${QT_FIND_COMPONENTS} LinguistTools Test QuickTest)
find_package(Qt5 5.12 REQUIRED COMPONENTS ${QT_FIND_COMPONENTS} LinguistTools Test QuickTest)
endif()
elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DownloaderExecutable")
# let's pick a version that's not ancient
find_package(Qt${QT_VERSION_MAJOR} 5.11 REQUIRED COMPONENTS ${QT_FIND_COMPONENTS})
set(MAKE_TESTS OFF)
endif()
foreach(_QT_COMPONENT ${QT_FIND_COMPONENTS})
list(APPEND QT_LIBRARIES Qt${QT5OR6}::${_QT_COMPONENT})
list(APPEND QT_LIBRARIES Qt5::${_QT_COMPONENT})
endforeach()
if(NOT ANDROID)
LIST(APPEND QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt${QT5OR6}::Test Qt${QT5OR6}::QuickTest)
set(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test Qt5::QuickTest)
endif()
#set up the subsurface_link_libraries variable
LIST(APPEND SUBSURFACE_LINK_LIBRARIES ${LIBDIVECOMPUTER_LIBRARIES} ${LIBGIT2_LIBRARIES} ${LIBUSB_LIBRARIES} ${LIBMTP_LIBRARIES})
if (NOT SUBSURFACE_TARGET_EXECUTABLE MATCHES "DownloaderExecutable")
if(USINGQT6)
if(MAPSUPPORT)
qt_add_resources(SUBSURFACE_RESOURCES map-widget/qml/map-widget.qrc)
set(SUBSURFACE_MAPWIDGET subsurface_mapwidget)
endif()
qt_add_resources(SUBSURFACE_RESOURCES subsurface.qrc profile.qrc stats/statsicons.qrc desktop-widgets/qml/statsview2.qrc)
else()
qt5_add_resources(SUBSURFACE_RESOURCES subsurface.qrc profile.qrc stats/statsicons.qrc map-widget/qml/map-widget.qrc desktop-widgets/qml/statsview2.qrc)
set(SUBSURFACE_MAPWIDGET subsurface_mapwidget)
endif()
endif()
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${LIBDIVECOMPUTER_LIBRARIES} ${LIBGIT2_LIBRARIES} ${LIBUSB_LIBRARIES})
qt5_add_resources(SUBSURFACE_RESOURCES subsurface.qrc map-widget/qml/map-widget.qrc)
# hack to build successfully on LGTM
if(DEFINED ENV{LGTM_SRC})
LIST(APPEND SUBSURFACE_LINK_LIBRARIES -lgssapi_krb5 -lhttp_parser)
set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lgssapi_krb5 -lhttp_parser)
endif()
# include translations
if (NOT SUBSURFACE_TARGET_EXECUTABLE MATCHES "DownloaderExecutable")
add_subdirectory(translations)
endif()
add_subdirectory(core)
add_subdirectory(qt-models)
add_subdirectory(commands)
if (NOT SUBSURFACE_TARGET_EXECUTABLE MATCHES "DownloaderExecutable")
add_subdirectory(profile-widget)
if(MAPSUPPORT)
add_subdirectory(map-widget)
endif()
add_subdirectory(mobile-widgets)
add_subdirectory(stats)
endif()
add_subdirectory(backend-shared)
if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DesktopExecutable")
@ -430,50 +308,34 @@ endif()
# create the executables
if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "MobileExecutable")
# set up Kirigami using KDE ECM
# that's available as kde-extra-cmake-modules on Homebrew, on all Linux flavors
# Android and iOS are built via qmake, Windows build of Subsurface-mobile isn't supported
find_package(ECM REQUIRED CONFIG PATHS ${CMAKE_CURRENT_SOURCE_DIR}/mobile-widgets/3rdparty/ECM)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
set(BREEZEICONS_DIR mobile-widgets/3rdparty/breeze-icons/)
SET(QML_IMPORT_PATH ${QML_IMPORT_PATH} ${CMAKE_SOURCE_DIR}/mobile-widgets/3rdparty/kirigami/src ${CMAKE_SOURCE_DIR}/mobile-widgets/qml)
add_subdirectory(mobile-widgets/3rdparty)
include_directories(${CMAKE_SOURCE_DIR}/mobile-widgets/3rdparty/kirigami/src)
include(${CMAKE_SOURCE_DIR}/mobile-widgets/3rdparty/kirigami/KF5Kirigami2Macros.cmake)
set(MOBILE_SRC
subsurface-mobile-main.cpp
subsurface-helper.cpp
)
if(USINGQT6)
qt_add_resources(MOBILE_RESOURCES mobile-widgets/qml/mobile-resources.qrc)
qt_add_resources(MOBILE_RESOURCES profile.qrc)
qt_add_resources(MOBILE_RESOURCES mobile-widgets/3rdparty/icons.qrc)
qt_add_resources(MOBILE_RESOURCES mobile-widgets/3rdparty/kirigami/src/scenegraph/shaders/shaders.qrc)
include_directories(${CMAKE_SOURCE_DIR}/mobile-widgets/qml/kirigami/src/libkirigami)
add_definitions(-DKIRIGAMI_BUILD_TYPE_STATIC)
qt5_add_resources(MOBILE_RESOURCES mobile-widgets/qml/mobile-resources.qrc)
qt5_add_resources(MOBILE_RESOURCES mobile-widgets/qml/kirigami/kirigami.qrc)
# When building the mobile application in Android, link it and Qt will do the rest, when doing the mobile application on Desktop, create an executable.
if(ANDROID)
qt5_add_resources(MOBILE_RESOURCES android-mobile/font.qrc)
add_library(${SUBSURFACE_TARGET} SHARED ${SUBSURFACE_PKG} ${MOBILE_SRC} ${SUBSURFACE_RESOURCES} ${MOBILE_RESOURCES})
else()
qt5_add_resources(MOBILE_RESOURCES mobile-widgets/qml/mobile-resources.qrc)
qt5_add_resources(MOBILE_RESOURCES profile.qrc)
qt5_add_resources(MOBILE_RESOURCES mobile-widgets/3rdparty/icons.qrc)
qt5_add_resources(MOBILE_RESOURCES mobile-widgets/3rdparty/kirigami/src/scenegraph/shaders/shaders.qrc)
# the following is split across two commands since in cmake 3.12 this would result
# in a non-sensical "no sources given to target" error if done all as one set of
# arguments to the add_executable() call
add_executable(${SUBSURFACE_TARGET} ${SUBSURFACE_PKG} ${SUBSURFACE_RESOURCES})
target_sources(${SUBSURFACE_TARGET} PUBLIC ${MOBILE_SRC} ${MOBILE_RESOURCES})
endif()
# the following is split across two commands since in cmake 3.12 this would result
# in a non-sensical "no sources given to target" error if done all as one set of
# arguments to the add_executable() call
add_executable(${SUBSURFACE_TARGET} ${SUBSURFACE_PKG} ${SUBSURFACE_RESOURCES})
target_sources(${SUBSURFACE_TARGET} PUBLIC ${MOBILE_SRC} ${MOBILE_RESOURCES})
target_link_libraries(
${SUBSURFACE_TARGET}
subsurface_mobile
subsurface_profile
${SUBSURFACE_MAPWIDGET}
subsurface_mapwidget
subsurface_backend_shared
subsurface_models_mobile
subsurface_commands
subsurface_corelib
subsurface_stats
kirigamiplugin
${SUBSURFACE_LINK_LIBRARIES}
)
elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DesktopExecutable")
@ -482,45 +344,31 @@ elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DesktopExecutable")
subsurface-helper.cpp
)
source_group("Subsurface App" FILES ${SUBSURFACE_APP})
if(ANDROID)
add_library(${SUBSURFACE_TARGET} SHARED ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES})
else()
add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES})
endif()
if(ANDROID)
add_library(${SUBSURFACE_TARGET} SHARED ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES})
else()
add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES})
endif()
target_link_libraries(
${SUBSURFACE_TARGET}
subsurface_generated_ui
subsurface_interface
subsurface_profile
${SUBSURFACE_MAPWIDGET}
subsurface_statistics
subsurface_mapwidget
subsurface_backend_shared
subsurface_models_desktop
subsurface_commands
subsurface_corelib
subsurface_stats
${SUBSURFACE_LINK_LIBRARIES}
)
add_dependencies(subsurface_desktop_preferences subsurface_generated_ui)
add_dependencies(subsurface_statistics subsurface_generated_ui)
add_dependencies(subsurface_interface subsurface_generated_ui)
add_dependencies(subsurface_profile subsurface_generated_ui)
add_dependencies(subsurface_models_desktop subsurface_generated_ui)
add_dependencies(subsurface_generated_ui version)
elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DownloaderExecutable")
set(DOWNLOADER_APP
subsurface-downloader-main.cpp
cli-downloader.cpp
)
source_group("Downloader App" FILES ${DOWNLOADER_APP})
add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${DOWNLOADER_APP} ${SUBSURFACE_RESOURCES})
target_link_libraries(
${SUBSURFACE_TARGET}
subsurface_backend_shared
subsurface_models_downloader
subsurface_commands
subsurface_corelib
${SUBSURFACE_LINK_LIBRARIES}
)
endif()
add_dependencies(subsurface_corelib version)
@ -545,17 +393,14 @@ set(DOCFILES
${CMAKE_BINARY_DIR}/Documentation/user-manual.html
${CMAKE_BINARY_DIR}/Documentation/user-manual_es.html
${CMAKE_BINARY_DIR}/Documentation/user-manual_fr.html
${CMAKE_BINARY_DIR}/Documentation/user-manual_ru.html
)
# add all the translations that we may need
FILE(STRINGS "subsurface_enabled_translations" QTTRANSLATIONS_BASE)
if(NOT DEFINED QT_TRANSLATION_DIR OR QT_TRANSLATION_DIR STREQUAL "")
if(USINGQT6)
set(QT_TRANSLATION_DIR ${QtCore_DIR}/../../../translations)
else()
set(QT_TRANSLATION_DIR ${Qt5Core_DIR}/../../../translations)
endif()
set(QT_TRANSLATION_DIR ${Qt5Core_DIR}/../../../translations)
endif()
set(QTTRANSLATIONS "")
foreach(QTTRANSLATION ${QTTRANSLATIONS_BASE})
@ -596,58 +441,39 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
install(FILES ${QTTRANSLATIONS} DESTINATION ${RESOURCEDIR}/translations)
install(FILES ${CMAKE_SOURCE_DIR}/gpl-2.0.txt DESTINATION ${RESOURCEDIR})
install(CODE "execute_process(COMMAND mkdir -p ${RESOURCEDIR}/qml)")
if(USINGQT6)
set(QT_INSTALL_PREFIX ${QT6_INSTALL_PREFIX})
else()
set(QT_INSTALL_PREFIX ${_qt5Core_install_prefix})
endif()
if(MAPSUPPORT)
install(CODE "execute_process(COMMAND mkdir -p ${PLUGINDIR}/geoservices)")
# this is really weird. We first try a plugin that ended up in the Qt install prefix
# then we try one that's in that odd broken install location that the qmake file results in (that includes the QT_INSTALL_PREFIX after our INSTALL_ROOT
# and finally, for fat binaries, we copy the one that's in the 'logical' spot under the INSTALL_ROOT
# this should cover all cases and always get us the correct library
install(CODE "execute_process(COMMAND cp ${QT_INSTALL_PREFIX}/plugins/geoservices/libqtgeoservices_googlemaps.dylib ${PLUGINDIR}/geoservices ERROR_QUIET)")
install(CODE "execute_process(COMMAND cp ${CMAKE_SOURCE_DIR}/../install-root/${QT_INSTALL_PREFIX}/plugins/geoservices/libqtgeoservices_googlemaps.dylib ${PLUGINDIR}/geoservices ERROR_QUIET)")
install(CODE "execute_process(COMMAND cp ${CMAKE_SOURCE_DIR}/../install-root/plugins/geoservices/libqtgeoservices_googlemaps.dylib ${PLUGINDIR}/geoservices ERROR_QUIET)")
endif()
# this will fail is macdeployqt isn't in the PATH - that seemed to happen in the past, but not recently
# also, on M1 macOS systems macdeployqt throws a ton of (apparently harmless) errors. Warn the unsuspecting developer
install(CODE "execute_process(COMMAND macdeployqt ${APP_BUNDLE_DIR} -no-strip ${MACDEPLOY_ARGS})")
install(CODE "execute_process(COMMAND mkdir -p ${PLUGINDIR}/geoservices)")
install(CODE "execute_process(COMMAND cp ${_qt5Core_install_prefix}/plugins/geoservices/libqtgeoservices_googlemaps.dylib ${PLUGINDIR}/geoservices ERROR_QUIET)")
install(CODE "execute_process(COMMAND cp ${CMAKE_SOURCE_DIR}/../install-root/${_qt5Core_install_prefix}/plugins/geoservices/libqtgeoservices_googlemaps.dylib ${PLUGINDIR}/geoservices ERROR_QUIET)")
# this is a hack - but I don't know how else to find the macdeployqt program if it's not in the PATH
string(REPLACE moc macdeployqt MACDEPLOYQT ${QT_MOC_EXECUTABLE})
install(CODE "execute_process(COMMAND ${MACDEPLOYQT} ${APP_BUNDLE_DIR} -no-strip ${MACDEPLOY_ARGS})")
# the next hack is here to delete the sqlite plugin that get's installed even though it isn't needed
install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/PlugIns/sqldrivers)")
# and another hack to get the QML Components in the right place
if(MAPSUPPORT)
if (USINGQT6)
install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml/{QtQuick,QtLocation,QtPositioning})")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtQuick ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
else()
install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml/{QtQuick.2,QtLocation,QtPositioning})")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtQuick.2 ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
endif()
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtLocation ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
endif()
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtPositioning ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
if(NOT QT_VERSION VERSION_LESS 5.11.0)
install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml/{QtQuick.2,QtLocation,QtPositioning})")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtQuick.2 ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtLocation ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtPositioning ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
if(NOT Qt5Core_VERSION VERSION_LESS 5.11.0)
# and with Qt 5.11 we need another library that isn't copied by macdeployqt
install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtPositioningQuick.framework)")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/lib/QtPositioningQuick.framework ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/lib/QtPositioningQuick.framework ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks)")
endif()
if(NOT QT_VERSION VERSION_LESS 5.14.0)
if(NOT Qt5Core_VERSION VERSION_LESS 5.14.0)
# and with Qt 5.14 we need another library that isn't always copied by macdeployqt
install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtQmlWorkerScript.framework)")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/lib/QtQmlWorkerScript.framework ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/lib/QtQmlWorkerScript.framework ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks)")
endif()
if (SUBSURFACE_TARGET_EXECUTABLE MATCHES "MobileExecutable")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtQuick ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtGraphicalEffects ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtQml ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${QT_INSTALL_PREFIX}/qml/QtPositioning ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtQuick ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtGraphicalEffects ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtQml ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtPositioning ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources/qml)")
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
if (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
if(NOT DEFINED OBJCOPY)
set(OBJCOPY x86_64-w64-mingw32.shared-objcopy)
set(OBJCOPY i686-w64-mingw32.shared-objcopy)
endif()
find_program(OBJCOPY_FOUND ${OBJCOPY})
if (OBJCOPY_FOUND)
@ -676,10 +502,10 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
install(TARGETS ${SUBSURFACE_TARGET} DESTINATION ${WINDOWSSTAGING})
install(FILES ${CMAKE_BINARY_DIR}/qt.conf DESTINATION ${WINDOWSSTAGING})
if(NOT QT_VERSION VERSION_LESS 5.11.0)
if(NOT Qt5Core_VERSION VERSION_LESS 5.11.0)
# hack to work around the fact that we don't process the dependencies of plugins
# as of Qt 5.11 this additional DLL is needed and it's only referenced in the qml DLLs
install(FILES ${QT_INSTALL_PREFIX}/bin/Qt5PositioningQuick.dll DESTINATION ${WINDOWSSTAGING})
install(FILES ${_qt5Core_install_prefix}/bin/Qt5PositioningQuick.dll DESTINATION ${WINDOWSSTAGING})
endif()
if(NOT DEFINED MAKENSIS)
@ -720,15 +546,15 @@ elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
endif()
install(FILES subsurface.debug DESTINATION bin)
install(FILES subsurface.desktop DESTINATION share/applications)
install(CODE "execute_process(COMMAND sh ${CMAKE_SOURCE_DIR}/scripts/add-version-to-metainfo.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})")
install(FILES metainfo/subsurface.metainfo.xml DESTINATION share/metainfo)
install(CODE "execute_process(COMMAND sh ${CMAKE_SOURCE_DIR}/scripts/add-version-to-appdata.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})")
install(FILES appdata/subsurface.appdata.xml DESTINATION share/metainfo)
install(FILES icons/subsurface-icon.svg DESTINATION share/icons/hicolor/scalable/apps)
install(DIRECTORY Documentation/images DESTINATION share/subsurface/Documentation)
install(FILES ${DOCFILES} DESTINATION share/subsurface/Documentation)
install(DIRECTORY theme DESTINATION share/subsurface)
install(DIRECTORY printing_templates DESTINATION share/subsurface)
install(FILES ${TRANSLATIONS} DESTINATION share/subsurface/translations)
install(TARGETS ${SUBSURFACE_TARGET} DESTINATION bin)
install(TARGETS ${SUBSURFACE_TARGET} DESTINATION bin)
endif()
if (MAKE_TESTS)

View File

@ -6,11 +6,11 @@ not yet fully consistent to these rules, but following these rules will make
sure that no one yells at you about your patches.
We have a script that can be used to reformat code to be reasonably close
to these rules; it's in `scripts/whitespace.pl` this script requires
to these rules; it's in scripts/whitespace.pl - this script requires
clang-format to be installed (which sadly isn't installed by default on
any of our platforms; even on Mac where clang is the default compiler).
At the end of this file are some ideas for your `.emacs` file (if that's
At the end of this file are some ideas for your .emacs file (if that's
your editor of choice) as well as for QtCreator. If you have settings for
other editors that implement this coding style, please add them here.
@ -21,14 +21,14 @@ other editors that implement this coding style, please add them here.
* all keywords followed by a '(' have a space in between
```
if (condition)
for (i = 0; i < 5; i++)
if (condition)
for (i = 0; i < 5; i++)
```
* function calls do NOT have a space between their name and argument
```
i = some_function(argument);
i = some_function(argument);
```
* usually there is no space on the inside of parenthesis (see examples
@ -40,81 +40,69 @@ other editors that implement this coding style, please add them here.
* all other opening curly braces follow at the end of the line, with a
space separating them:
```
if (condition) {
dosomething();
dosomethingelse();
}
if (condition) {
dosomething();
dosomethingelse();
}
```
* both sides of an `if` / `else` clause either use or do not use curly braces:
* both sides of an if / else clause either use or do not use curly braces:
```
if (condition)
i = 4;
else
j = 6;
if (condition) {
i = 6;
} else {
i = 4;
j = 6;
}
if (condition)
i = 4;
else
j = 6;
if (condition) {
i = 6;
} else {
i = 4;
j = 6;
}
```
* use space to make visual separation easier
```
a = b + 3 + e / 4;
a = b + 3 + e / 4;
```
* continuation lines have the operator / comma at the end
```
if (very_long_condition_1 ||
condition_2)
b = a + (c + d +
f + z);
if (very_long_condition_1 ||
condition_2)
b = a + (c + d +
f + z);
```
* in a C++ constructor initialization list, the colon is on the same line and
continuation lines are aligned as the rule above:
```
ClassName::ClassName() : x(1),
y(2),
z(3)
{
}
ClassName::ClassName() : x(1),
y(2),
z(3)
{
}
```
* unfortunate inconsistency
- C code usually uses underscores to structure names
```
variable_in_C
variable_in_C
```
- In contrast, C++ code usually uses camelCase
```
variableInCPlusPlus
variableInCPlusPlus
```
for variable names and PascalCase
```
ClassInCPlusPlus
ClassInCPlusPlus
```
for names of classes and other types
where the two meet, use your best judgment and go for best consistency
(i.e., where does the name "originate")
* macro names should be capitalized; e.g., prefer
```
#define FROB 17
#define FROBULATE(x) (x)+FROB
```
to
```
#define frob 17
#define frobulate(x) (x)+frob
```
* there is a strong preference for lower case file names; sometimes conventions
or outside requirements make camelCase filenames the better (or only) choice,
but absent such an outside reason all file names should be lower case
@ -125,34 +113,33 @@ other editors that implement this coding style, please add them here.
case. Where it seems appropriate, multiple, closely related classes can be
in a single file with a more generic name.
* `switch` statements with blocks are a little bit special (to avoid indenting
* switch statements with blocks are a little bit special (to avoid indenting
too far)
```
switch (foo) {
case FIRST:
whatever();
break;
case SECOND: {
int i;
for (i = 0; i < 5; i++)
do_something(i);
}
}
switch (foo) {
case FIRST:
whatever();
break;
case SECOND: {
int i;
for (i = 0; i < 5; i++)
do_something(i);
}
}
```
## Coding conventions
* variable declarations
In C code we really like them to be at the beginning of a code block,
not interspersed in the middle.
in C++ we are a bit less strict about this but still, try not to go
in C++ we are a bit less strict about this - but still, try not to go
crazy. Notably, in C++ the lifetime of a variable often coincides with the
lifetime of a resource (e.g. file) and therefore the variable is defined
at the place where the resource is needed.
* The `*`, `&` and `&&` declarators are grouped with the name, not the type
(classical C-style) as in `char *string` instead of `char* string`. This
(classical C-style) as in `char *string` instead of `char* string`. This
reflects the precedence rules of the language: `int &i` means that the name
`i` stands for a reference [to an object with type `int`], not that
`i` stands for an object of the type [reference to `int`].
@ -160,85 +147,84 @@ other editors that implement this coding style, please add them here.
have the same effect) it is crucial in the
definition of multiple variables, such
as
```
struct dive *next, **pprev;
```
```
struct dive *next, **pprev;
```
* In C++ code, we generally use explicit types in variable declarations for clarity.
Use `auto` sparingly and only in cases where code readability improves.
Two classical examples are:
- Iterators, whose type names often are verbose:
```
auto it = m_trackers.find(when);
```
is not only distinctly shorter than
```
QMap<qint64, gpsTracker>::iterator it = m_trackers.find(when);
```
it will also continue working if a different data structure is chosen.
```
auto it = m_trackers.find(when);
```
is not only distinctly shorter than
```
QMap<qint64, gpsTracker>::iterator it = m_trackers.find(when);
```
it will also continue working if a different data structure is chosen.
- If the type is given in the same line anyway. Thus,
```
auto service = qobject_cast<QLowEnergyService*>(sender());
```
is easier to read than and conveys the same information as
```
QLowEnergyService *service = qobject_cast<QLowEnergyService*>(sender());
```
```
auto service = qobject_cast<QLowEnergyService*>(sender());
```
is easier to read than and conveys the same information as
```
QLowEnergyService *service = qobject_cast<QLowEnergyService*>(sender());
```
- If the variable is a container that is only assigned to a local variable to
be able to use it in a range-based `for` loop
```
const auto serviceUuids = device.serviceUuids();
for (QBluetoothUuid id: serviceUuids) {
```
The variable has also to be const to avoid that Qt containers will do a
deep copy when the range bases `for` loop will call the `begin()` method
internally.
be able to use it in a range-based for loop
```
const auto l = device.serviceUuids();
for (QBluetoothUuid id: serviceUuids) {
```
The variable has also to be const to avoid that Qt containers will do a
deep copy when the range bases for loop will call the begin() method
internally.
* text strings
The default language of subsurface is US English so please use US English
spelling and terminology.
User-visible strings should be passed to the `tr()` function to enable
User-visible strings should be passed to the tr() function to enable
translation into other languages.
- like this
```
QString msgTitle = tr("Check for updates.");
QString msgTitle = tr("Check for updates.");
```
- rather than
```
QString msgTitle = "Check for updates.";
QString msgTitle = "Check for updates.";
```
This works by default in classes (indirectly) derived from `QObject`. Each
This works by default in classes (indirectly) derived from QObject. Each
string to be translated is associated with a context, which corresponds
to the class name. Classes that are not derived from `QObject` can generate
the `tr()` functions by using the `Q_DECLARE_TR_FUNCTIONS` macro:
to the class name. Classes that are not derived from QObject can generate
the tr() functions by using the `Q_DECLARE_TR_FUNCTIONS` macro:
```
#include <QCoreApplication>
class myClass {
Q_DECLARE_TR_FUNCTIONS(gettextfromC)
...
};
#include <QCoreApplication>
class myClass {
Q_DECLARE_TR_FUNCTIONS(gettextfromC)
...
};
```
As an alternative, which also works outside of class context, the `tr()`
As an alternative, which also works outside of class context, the tr()
function of a different class can be called. This avoids creating multiple
translations for the same string:
```
gettextFromC::tr("%1km")
gettextFromC::tr("%1km")
```
The `gettextFromC` class in the above example was created as a catch-all
The gettextFromC class in the above example was created as a catch-all
context for translations accessed in C code. But it can also be used
from C++ helper functions. To use it from C, include the `"core/gettext.h"`
header and invoke the `translate()` macro:
from C++ helper functions. To use it from C, include the "core/gettext.h"
header and invoke the translate() macro:
```
#include "core/gettext.h"
report_error(translate("gettextFromC", "Remote storage and local data diverged"));
#include "core/gettext.h"
report_error(translate("gettextFromC", "Remote storage and local data diverged"));
```
It is crucial to pass `"gettextFromC"` as a first macro argument so that Qt
It is crucial to pass "gettextFromC" as a first macro argument so that Qt
is able to associate the string with the correct context.
The translate macro returns a cached C-style string, which is generated at runtime
when the particular translation string is encountered for the first time.
@ -247,20 +233,19 @@ other editors that implement this coding style, please add them here.
Outside of function context, the `QT_TRANSLATE_NOOP` macro can be used as in
```
struct ws_info_t ws_info[100] = {
{ QT_TRANSLATE_NOOP("gettextFromC", "integrated"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "belt"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "ankle"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "backplate"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "clip-on"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "integrated"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "belt"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "ankle"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "backplate"), 0 },
{ QT_TRANSLATE_NOOP("gettextFromC", "clip-on"), 0 },
};
```
Note that here, the texts will be scheduled for translation with the `"gettextFromC"`
Note that here, the texts will be scheduled for translation with the "gettextFromC"
context, but the array is only initialized with the original text. The actual
translation has to be performed later in code. For C-code, the `QT_TRANSLATE_NOOP`
macro is defined in the `"core/gettext.h"` header.
macro is defined in the "core/gettext.h" header.
* UI text style
These guidelines are designed to ensure consistency in presentation within
Subsurface.
Only the first word of multi-word text strings should be capitalized unless
@ -279,14 +264,10 @@ other editors that implement this coding style, please add them here.
* string manipulation
* user interface
In UI part of the code use of `QString` methods is preferred, see this pretty
good guide in [`QString` documentation][1]
In UI part of the code use of QString methods is preferred, see this pretty
good guide in [QString documentation][1]
* core components
In the core part of the code, C-string should be used.
C-string manipulation is not always straightforward specifically when
it comes to memory allocation, a set of helper functions has been developed
@ -297,8 +278,8 @@ other editors that implement this coding style, please add them here.
### Emacs
These lines in your `.emacs` file should get you fairly close when it comes
to indentation many of the other rules you have to follow manually
These lines in your .emacs file should get you fairly close when it comes
to indentation - many of the other rules you have to follow manually
```
;; indentation
@ -393,7 +374,7 @@ style that you can select which should work well for our coding style.
### Vim
As everybody knows vim is a way better editor than emacs and thus needs to be
in this file too. Put this into your `.vimrc` and this should produce something
in this file too. Put this into your .vimrc and this should produce something
close to our coding standards.
```

View File

@ -1,96 +1,68 @@
# Contributing to Subsurface
[Source](https://subsurface-divelog.org/documentation/contributing/ "Permalink to Contributing | Subsurface")
## Ways to Contribute
# Contributing | Subsurface
There are many ways in which you can contribute. We are always looking for testers who are willing to test the code while it is being developed. We especially need people running Windows and Mac (as the majority of the active developers are Linux people). We are also always looking for volunteers who help reviewing and improving the documentation. And very importantly we are looking for translators willing to translate the software into different languages. Our translations are centrally handled at [Transifex][4] please sign up for an account there and then request to join the [Subsurface Team][5].
It might be a good idea to join our [mailing list][1]. Conversation there is in English -- even though this site (and Subsurface itself) are available in many languages, the shared language we all communicate in is English. Actually "Broken English" is just fine… :-)
If you would like to contribute financially to help us cover the cost of running a free cloud synchronisation service for dive logs, you can do so by sponsoring this project.
We also tend to have some developers hanging out in the `#subsurface` channel on [Freenode][2].
There are many ways in which you can contribute. We are always looking for testers who are willing to test the code while it is being developed. We especially need people running Windows and Mac (as the majority of the active developers are Linux people). We are also always looking for volunteers who help reviewing and improving the documentation. And very importantly we are looking for translators willing to translate the software into different languages. Our translations are centrally handled at [Transifex][3] \-- please sign up for an account there and then request to join the [Subsurface Team][4].
## Joining the Subsurface Contributors' Community
If you would like to contribute patches that fix bugs or add new features, that is of course especially welcome. If you are looking for places to start, look at the open bugs in our [bug tracker][5].
To get 'into the loop' for what is going on in Subsurface you should join our [mailing list][1], and start watching the [subsurface/subsurface repository on GitHub][2]. Conversation in the mailing list is in English even though Subsurface itself and the website and documentation are available in many languages, the shared language the contributors communicate in is English. Actually "Broken English" is just fine… :-)
Here is a very brief introduction on creating commits that you can either send as [pull requests][6] on our main GitHub repository or send as emails to the mailing list. Much more details on how to use git can be found at the [git user manual][7].
Of course it is also a good idea to join our [User Forum][3], to be able to see feedback and bug reports from our users.
## Tips for Code Contributions
### Code Change Submissions
If you would like to contribute patches that fix bugs or add new features, that is of course especially welcome. If you are looking for places to start, look at the open bugs in our [bug tracker][6].
Here is a very brief introduction on creating commits that you can either send as [pull requests][7] on our main GitHub repository or send as emails to the mailing list. Much more details on how to use Git can be found at the [Git user manual][8].
Start with getting the latest source.
cd subsurface
git checkout master
git pull
ok, now we know you're on the latest version. Create a working branch to keep your development in:
git checkout -b devel
Edit the code (or documentation), compile, test… then create a commit:
git commit -s -a
Depending on your OS this will open a default editor usually you can define which by setting the environment variable `GIT_EDITOR`. Here you enter your commit message. The first line is the title of your commit. Keep it brief and to the point. Then a longer explanation (more on this and the fact that we insist on all contributions containing a Signed-off-by: line below).
If you want to change the commit message, `git commit --amend` is the way to go. Feel free to break your changes into multiple smaller commits. Then, when you are done there are two directions to go, which one you find easier depends a bit on how familiar you are with GitHub. You can either push your branch to GitHub and create a [pull requests on GitHub][7], or you run:
git format-patch master..devel
Which creates a number of files that have names like `0001-Commit-title.patch`, which you can then send to our developer mailing list.
### Developer Certificate of Origin (DCO)
Start with getting the latest source.
`cd subsurface`
`git checkout master`
`git pull`
ok, now we know you're on the latest version. Create a working branch to keep your development in:
`git checkout -b devel`
Edit the code (or documentation), compile, test… then create a commit:
`git commit -s -a`
Depending on your OS this will open a default editor -- usually you can define which by setting the environment variable `GIT_EDITOR`. Here you enter your commit message. The first line is the title of your commit. Keep it brief and to the point. Then a longer explanation (more on this and the fact that we insist on all contributions containing a Signed-off-by: line below).
If you want to change the commit message, "git commit --amend" is the way to go. Feel free to break your changes into multiple smaller commits. Then, when you are done there are two directions to go, which one you find easier depends a bit on how familiar you are with GitHub. You can either push your branch to GitHub and create a [pull requests on GitHub][6], or you run
`git format-patch master..devel`
Which creates a number of files that have names like 0001-Commit-title.patch, which you can then send to our developer mailing list.
When sending code, please either send signed-off patches or a pull request with signed-off commits. If you don't sign off on them, we will not accept them. This means adding a line that says "Signed-off-by: Name \<Email\>" at the end of each commit, indicating that you wrote the code and have the right to pass it on as an open source patch.
See: [Signed-off-by Lines][9]
See: [Signed-off-by Lines][8]
Also, please write good git commit messages. A good commit message looks like this:
### Commit Messages
Header line: explaining the commit in one line
Also, please write good Git commit messages. A good commit message looks like this:
Body of commit message is a few lines of text, explaining things
in more detail, possibly giving some background about the issue
being fixed, etc etc.
Header line: explaining the commit in one line
Body of commit message is a few lines of text, explaining things
in more detail, possibly giving some background about the issue
being fixed, etc etc.
The body of the commit message can be several paragraphs, and
please do proper word-wrap and keep columns shorter than about
74 characters or so. That way "git log" will show things
nicely even when it's indented.
Reported-by: whoever-reported-it
Signed-off-by: Your Name <you@example.com>
The body of the commit message can be several paragraphs, and
please do proper word-wrap and keep columns shorter than about
74 characters or so. That way "git log" will show things
nicely even when it's indented.
Reported-by: whoever-reported-it
Signed-off-by: Your Name \<you@example.com\>
That header line really should be meaningful, and really should be just one line. The header line is what is shown by tools like gitk and shortlog, and should summarize the change in one readable line of text, independently of the longer explanation.
The preferred way to write a commit message is using [imperative mood][12], e.g. "Make foo do xyz" instead of "This patch makes foo do xyz" or "I made foo do xyz", as if you are giving commands or requests to the code base.
The preferred way to write a commit message is using imperative mood, e.g. "Make foo do xyz" instead of "This patch makes foo do xyz" or "I made foo do xyz", as if you are giving commands or requests to the code base.
https://en.wikipedia.org/wiki/Imperative_mood
![gitk sample][10]
![gitk sample][9]
_Example with gitk_
Example with gitk
Additionally when important changes to behaviors, fixes or new feature are introduced an entry must be added to CHANGELOG.md file. Always add new entries at the very top of the file above other existing entries. Use this layout for new entries:
### Changelog
Additionally when important changes to behaviors, fixes or new feature are introduced an entry must be added to `CHANGELOG.md` file. Always add new entries at the very top of the file above other existing entries. Use this layout for new entries:
Area: Details about the change [reference thread / issue]
Area: Details about the change [reference thread / issue]
When multiple areas are affected list the areas separated with a /:
Area1/Area2: Detail about the change [reference thread / issue]
Area1/Area2: Detail about the change [reference thread / issue]
Here is a (non exhaustive) list of Areas that can be used:
* Bluetooth
* Cloud-storage
* Desktop
@ -103,20 +75,15 @@ Here is a (non exhaustive) list of Areas that can be used:
* Printing
* Profile
### Coding Style
In order to make reviews simpler and have contributions merged faster in the code base, please follow Subsurface project's coding style and coding conventions described in the [CodingStyle][11] file.
In order to make reviews simpler and have contributions merged faster in the code base, please follow Subsurface project's coding style and coding conventions described in the [CodingStyle][10] file.
[1]: http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface
[2]: https://github.com/subsurface/subsurface
[3]: https://groups.google.com/g/subsurface-divelog
[4]: https://www.transifex.com/
[5]: https://explore.transifex.com/subsurface/subsurface/
[6]: https://github.com/Subsurface/subsurface/issues
[7]: https://github.com/Subsurface/subsurface/pulls
[8]: https://www.kernel.org/pub/software/scm/git/docs/user-manual.html
[9]: https://gerrit-review.googlesource.com/Documentation/user-signedoffby.html
[10]: https://github.com/subsurface/subsurface/Documentation/images/Screenshot-gitk-subsurface-1.png "Example with gitk"
[11]: https://github.com/Subsurface/subsurface/blob/master/CODINGSTYLE.md
[12]: https://en.wikipedia.org/wiki/Imperative_mood
[2]: http://freenode.net/
[3]: https://www.transifex.com/
[4]: https://www.transifex.com/projects/p/subsurface/
[5]: https://github.com/Subsurface/subsurface/issues
[6]: https://github.com/Subsurface/subsurface/pulls
[7]: https://www.kernel.org/pub/software/scm/git/docs/user-manual.html
[8]: https://gerrit-review.googlesource.com/Documentation/user-signedoffby.html
[9]: https://subsurface-divelog.org/wp-content/uploads/2011/10/Screenshot-gitk-subsurface-1.png "Example with gitk"
[10]: https://github.com/Subsurface/subsurface/blob/master/CodingStyle

View File

@ -135,7 +135,7 @@ msgid ""
"mailto:subsurface@subsurface-divelog.org[our mailing list] and report bugs "
"at https://github.com/Subsurface/subsurface/issues[our bugtracker]. "
"For instructions on how to build the software and (if needed) its "
"dependencies please consult the INSTALL.md file included with the source code."
"dependencies please consult the INSTALL file included with the source code."
msgstr ""
#. type: Plain text
@ -9076,9 +9076,6 @@ msgid ""
"reconnect it. You can now retry (or start a new download session) and the "
"download will continue where it stopped previously. You may have to do this "
"more than once, depending on how many dives are stored on the dive computer."
"You may define a dive number offset by setting environment variable "
"UEMIS_DIVE_OFFSET (e.g. export UEMIS_DIVE_OFFSET=300), "
"if subsurface starts downloading dives that are already synced."
msgstr ""
#. type: Title ===

163
Documentation/FAQ.wordpress Normal file
View File

@ -0,0 +1,163 @@
<!-- when editing please don't break the formatting... WordPress is a bit silly about this
- I need the empty lines after the [expand...] and before the [/expand]
- Every paragraph is a single line (how stupid is that!) with an empty line in between -->
<h2>Here are some Frequently Asked Questions by our users</h2>
<span class="expandall">Expand All</span> --- <span class="collapseall">Collapse All</span>
[expand title="Which operating system does Subsurface support?"]
Subsurface runs on Windows (32 and 64bit, Windows XP and newer), MacOS (Intel, 10.7 and newer) and many flavors of Linux. We provide Linux packages for Ubuntu, Linux Mint, Debian, openSUSE and Fedora. Details on where to find Subsurface for your OS are on our <a title="Downloads" href="http://subsurface-divelog.org/download/">Downloads</a> page.
[/expand]
[expand title="How do I install Subsurface on Windows?"]
<a href="http://subsurface-divelog.org/download/">Download the installer</a> and double-click on it. You will get a warning that the installer is from an unknown publisher. Please click Yes to allow installation. Next you are presented with the license for Subsurface, after that you can choose where you would like to install Subsurface (the default should be reasonable in most cases) and the <em>Start Menu Folder</em> where a shortcut to call Subsurface and an entry to uninstall Subsurface will be installed.
[/expand]
[expand title="How do I install Subsurface on MacOS?"]
<a href="http://subsurface-divelog.org/download/">Download the installer DMG</a> and open it. Drag the Subsurface icon on to the Applications icon.
[/expand]
[expand title="How do I install Subsurface on Ubuntu?"]
Simply add the following PPA to your system:
<pre><code style="font-size: 8pt;">ppa:subsurface/subsurface</code></pre>
[/expand]
[expand title="How do I install Subsurface on Debian?"]
We currently only support Debian Jessie; you need to add the Ubuntu repository:
<pre><code style="font-size: 8pt;">echo "deb http://ppa.launchpad.net/subsurface/subsurface/ubuntu trusty main" \
| sudo tee /etc/apt/sources.lists.d/subsurface.list
gpg --keyserver subkeys.pgp.net --recv-keys A8BC9756EE61D9C6
gpg -a --export A8BC9756EE61D9C6 | sudo apt-key add -
sudo apt-get update</code></pre>
Now you can install Subsurface from that repository:
<pre><code style="font-size: 8pt;">sudo apt-get install subsurface</code></pre>
Make sure you are getting a current version with all its Qt5 dependencies.
[/expand]
[expand title="How do I install Subsurface on openSUSE?"]
Go to <a href="http://software.opensuse.org/download.html?project=home:Subsurface-Divelog&amp;package=subsurface">our build service project page</a> and follow the simple instructions there -- its as easy as two clicks.
[/expand]
[expand title="The shortcut keys don't work on Ubuntu"]
Please uninstall <code style="font-size: 9pt;">appmenu-qt5</code> and the shortcuts will work.
[/expand]
[expand title="How can I post my dive on Facebook?"]
Go to the preferences and select the Facebook section. There you can log in to your Facebook account. You have to do this every time you want to post to Facebook, for privacy reasons Subsurface does not stay logged in to Facebook between sessions.
Once you are logged into Facebook you can close the preferences. You will now see a Facebook button next to the Notes section towards the center of the Subsurface window. Clicking on that opens a dialog that allows you to control which parts of the current dive are posted to your timeline. The post is always "private" - you need to connect to Facebook and change the audience for that post in order for others to see it (we do this so you get to review what is posted before it becomes public).
[/expand]
[expand title="How can I post my dives on the web?"]
Currently Subsurface integrates with two different online logbooks: <a href="http://divelogs.de">divelogs.de</a> and <a href="http://dive-share.appspot.com/">DiveShare</a>. You can export dives to either of those two services from the File➝Export menu.
[/expand]
[expand title="How do I use the companion apps?"]
There are companion apps available for both Android and IOS. You can find them in the respective stores. Once you install them on your mobile device you can either mark dive sites and name them (e.g., right before or after a dive), or you can run a "service" in the background that periodically records your position. Don't forget to turn the service off when you are done as it may increase your battery consumption.
Once you have uploaded the dive site data from the companion app to our web service, you can then download the data from within Subsurface. Do this <em>after</em> you have downloaded the dives from that day from your divecomputer (or manually added the dives) so that Subsurface can match the dive data (and their time stamps) with the data stored by the companion app. Subsurface will then add GPS data to those dives that didn't have GPS information and are reasonably close in time to to markers saved by the companion app.
Please note that the companion apps by themselves do <em>not</em> add dives to your dive list. The dive needs to exist before GPS data is added to it.
[/expand]
[expand title="How can I use more than one tank with the same gas?"]
This is a typical question for side mount divers or some tec divers. Subsurface supports having more than one tank with the same gas, even if some dive computers don't. Simply add a gas change to your second tank of the same gas as both tanks will be included in the gas use calculations. In order to add gas changes simply right-click on the profile at the appropriate spot and you will be offered to add such an event.
[/expand]
[expand title="Why is Subsurface not able to download my dives?"]
Clean the contacts. Clean the contacts again. Make sure the connector is firmly connected. Wiggle it. Seriously. Make sure the dive computer is in transfer mode (this isn't necessary for all dive computers but for many common ones). Check with other software that the download works in general. Try another cable. See our user manual for pairing with BT and the general use case.
[/expand]
[expand title="Why is the CSV import failing?"]
The CSV import has a couple of caveats. You should avoid some special characters like ampersand (&), less than (<), greater than (>) and double quotes ("), the latter if quoting text cells. The file should use UTF-8 character set, if having non-ASCII characters. Also the size of the CSV file might cause problems. Importing 100 dives at a time (without dive profile) has worked previously, but larger files might exceed limits of the parser used. When having problems with CSV imports, try first with a smaller sample to make sure everything works.
[/expand]
[expand title="How can I use Subsurface for multiple users?"]
Store logs of different users to separate log files. From Subsurface, you can open individual files for different divers and multiple users are supported quite well.
[/expand]
[expand title="How can I load pictures and associate them with my dive?"]
Select the dives you want to load and associate the pictures with. Then right click on one of the selected dives and select "Load images" from the
popup menu. This will bring in a file selection dialog where you can select one or multiple pictures. When the selection is done and you hit Open, you get a new dialog where you can shift the times of the images. This is described in more detail in our user manual.
If you are having trouble with loading the images, check that you have at least one of the following tags in the Exif headers DateTimeOriginal or
DateTime. We take the time from these fields to detect if the image was shot during the dive or not. If the picture is edited, you should store the original Exif information on the new/edited image for it to be loaded properly.
[/expand]
[expand title="Can I import my dives from my old log software?"]
Many common programs are already supported and we are always happy to try to add new ones. If your old log software supports exporting the log book, we might well be able to import that (for example via CSV files or UDDF). However, usually support for importing the native format will help you to get more complete information into Subsurface. To implement support for the log format, we will need a sample log file. It would be great to have also a screenshot from the original log software or description of the dive that is shown on the sample log. Preferably we would like to have a reasonably simple dive to get basic support and another dive that has as many features enabled as possible (e.g. gas changes during the dive). Please post this information to the user forum or send it to the developer mailing list subsurface@subsurface-divelog.org. Unfortunately some of the log formats we have not been able to decipher (as some vendors have decided to encrypt their log files to increase the degree of lock-in of their customers), so there are no guarantees that this will bring support for your old log software, but it is worth a try.
[/expand]
[expand title="Can you add support for dive computer X?"]
We support a large number of dive computers already and are always happy to add support for more. Please contact us via the user forums so we can try to help. Some vendors have actively helped us in our work and adding support for new models from those vendors is usually easy. Other vendors are more neutral, some are actively hostile. Without help from the vendor it can be rather challenging to reverse engineer the transfer protocol and the dive encoding, but with sufficient help from you it is often possible to do so.
A good starting point is often to send us a libdivecomputer log and dump (you can pick those in the dive computer download dialog) when connecting to the dive computer using a similar existing model (if possible).
[/expand]
[expand title="Is there a virus in the Subsurface installer?"]
If you get a warning message or if Subsurface is blocked by your anti virus software, that is almost certainly a false positive. Subsurface is not built on a Windows machine, it is cross built from source on Linux on a well maintained and clean server.
Most/all Windows AV software packages support an "add exception" feature, which skips an executable from being scanned. Try adding Subsurface to the list of non-harmful software. If the Subsurface installer download is detected as malware, please temporary disable your AV software until Subsurface is installed
In either case, please inform your AV software vendor of a "false positive" as we assure your that Subsurface is not malware
[/expand]
[expand title="I cannot download all my dives, only the most recent ones even though my dive computer's manual states that it records history of e.g. 999 dives."]
Dive history is different than the dive profiles on the log. The history only keeps track of the total number of dives and total amount of time spent below surface. The logs, on the other hand, store the dive profile, but they have limited amount of memory to do so. The exact amount of dive profiles that can be stored on the device depend on sample interval and duration of the dives. Once the memory is full the oldest dives get overwritten with new dives. Thus we are only able to download the last 13, 30 or 199 dives.
If you have downloaded your dives to different dive logging software before they were overwritten, there is a high change that Subsurface can import these. However, if the logs are only on your dive computer, they cannot be salvaged after being over written by new dives.
[/expand]
[expand title="How do I download dives from my Bluetooth dive computer (e.g. Shearwater, OSTC) on Linux?"]
Downloading dives over Bluetooth on all platforms is done using the "Choose Bluetooth download mode" option when downloading dives, and pairing with the detected dive computer. This is further explained in the <a href="https://subsurface-divelog.org/documentation/subsurface-4-user-manual/">Subsurface User Manual</a>.
Previous versions of Subsurface required setting up an RFCOMM connection from the command line before downloading dives from a Bluetooth enabled dive computer. This is no longer the case.
[/expand]
[expand title="How do I fix permission errors when trying to download from my Atomics Aquatics Cobalt under Linux?"]
Sadly this is a somewhat difficult process on some versions of Linux. By default new devices are sometimes given permissions that prevent a regular user from accessing them. If you get a permission error when trying to download from a Cobalt or Cobalt 2 under Linux, please try these steps.
This should work on most Linux flavors. We'd appreciate feedback if this doesn't work for you. Open a terminal window and cut and paste the following command. It may ask you to enter your password in order to allow access as super user (which is required to set up the udev rule that changes the device permissions as you plug in your Cobalt).
<pre><code style="font-size: 8pt;">(MYGRP=$(id | sed "s/^.*gid=.*(\(.*\)) .*$/\1/") ; \
echo -n 'SUBSYSTEM=="usb", ATTR{idVendor}=="0471", ATTR{idProduct}=="0888", MODE="0660", GROUP="' ; \
echo -n $MYGRP ; echo '"') | sudo tee /etc/udev/rules.d/99-cobalt.rules </code></pre>
If you disconnect and reconnect your Cobalt it should now get the correct access permissions.
[/expand]
[expand title="How do I fix permission errors when trying to download from my Suunto EON Steel under Linux?"]
By default new devices are sometimes given permissions that prevent a regular user from accessing them. If you get a permission error when trying to download from an EON Steel under Linux, please try these steps.
This should work on most Linux flavors. We'd appreciate feedback if this doesn't work for you. Open a terminal window and cut and paste the following command. It may ask you to enter your password in order to allow access as super user (which is required to set up the udev rule that changes the device permissions as you plug in your EON Steel).
<pre><code style="font-size: 8pt;">echo 'SUBSYSTEM=="usb",ATTR{idVendor}=="1493",ATTR{idProduct}=="0030", MODE="0666"' |
sudo tee /etc/udev/rules.d/99-cobalt.rules </code></pre>
If you disconnect and reconnect your DC it should now get the correct access permissions.
[/expand]
[expand title="Why is my IRDA based dive computer not working on a MAC?"]
Subsurface on the Mac does not currently support IRDA based dive computers. This is an issue of missing support libraries for us to use - other dive log software may have implemented their own IRDA stack on the Mac, we have not. Subsurface on Windows and Linux does support IRDA based dive computers just fine.
[/expand]

View File

@ -7,7 +7,7 @@
# submitting patches to the user manual, only submit the changes to the .txt
# file - the maintainer will recreate the .html.git file
DOCNAMES = user-manual user-manual_es user-manual_fr user-manual_nl mobile-manual-v3
DOCNAMES = user-manual user-manual_es user-manual_fr user-manual_ru user-manual_nl mobile-manual-v2 mobile-manual-v3
HTMLDOCS = $(patsubst %,$(OUT)%.html,$(DOCNAMES))
TEXTDOCS = $(patsubst %,$(OUT)%.text,$(DOCNAMES))
@ -19,7 +19,7 @@ BROWSER = firefox
THEME = compact_subsurface
PWD = $(realpath .)
all: $(HTMLDOCS) $(TEXTDOCS) $(PDFDOCS)
all: $(HTMLEDOCS) $(TEXTDOCS) $(PDFDOCS)
doc: $(HTMLDOCS)
@ -30,21 +30,10 @@ $(OUT)%.pdf: %.txt
-$(A2X) --dblatex-opts "-P latex.output.revhistory=0" -f pdf $<
$(OUT)%.html: %.txt
$(ASCIIDOC) --version > /dev/null 2>&1 || echo "if asciidoc isn't found the html file included in the sources is copied"
@echo "if asciidoc isn't found the html file included in the sources is copied"
$(ASCIIDOC) -a toc -a toclevels=3 -a themedir=$(PWD) -a theme=$(THEME) -o $@ $< || \
cp $(<:%.txt=%.html.git) $@
# for the web facing version of the desktop manual, just use the post-processing script
user-manual.html.wp: user-manual.html
bash ../scripts/prep-manual.sh $<
# for the web facing version of the mobile manual, re-create the HTML with only one level in
# the table of context and then post process
mobile-manual-v3.html.wp: mobile-manual-v3.txt
$(ASCIIDOC) -a toc -a toclevels=1 -a themedir=$(PWD) -a theme=$(THEME) -o $(<:%.txt=%.html.tmp) $< && \
bash ../scripts/prep-manual.sh $(<:%.txt=%.html.tmp) && \
mv $(<:%.txt=%.html.tmp.wp) $@
# Alternatively::
$(OUT)$(DOCNAME).xhtml: $(DOCSOURCE)
$(A2X) --icons -f xhtml $<

View File

@ -8,7 +8,7 @@
*/
* { padding: 0; margin: 0; }
img { border: 0; margin: 15px; max-width:90% }
img { border: 0; margin: 15px; }
/*** Layout ***/
@ -69,12 +69,12 @@ body { font-family: Verdana, sans-serif; }
#footer { font-size: 0.8em; }
h2, h3, h4, h5, .title { font-family: Arial, sans-serif; }
h2 { font-size: 160%; }
h2 { font-size: 1.5em; }
.sectionbody { font-size: 0.85em; }
.sectionbody .sectionbody { font-size: inherit; }
h3 { font-size: 150%; } /* 1.35em */
h4 { font-size: 140%; } /* 1.2em */
h5 { font-size: 130%; } /* 1em */
h3 { font-size: 159%; } /* 1.35em */
h4 { font-size: 141%; } /* 1.2em */
h5 { font-size: 118%; } /* 1em */
.title { font-size: 106%; /* 0.9em */
font-weight: bold;
}

View File

@ -175,7 +175,7 @@ msgid ""
"an email to mailto:subsurface@subsurface-divelog.org[our mailing list] and "
"report bugs at https://github.com/Subsurface-divelog/subsurface/issues[our "
"bugtracker]. For instructions on how to build the software and (if needed) "
"its dependencies please consult the INSTALL.md file included with the source "
"its dependencies please consult the INSTALL file included with the source "
"code."
msgstr ""
"Ce manuel explique comment utiliser le programme _Subsurface_. Pour "
@ -184,7 +184,7 @@ msgstr ""
"pouvez envoyer un e-mail sur mailto:subsurface@subsurface-divelog.org[notre "
"liste de diffusion] et rapportez les bogues sur http://trac.hohndel."
"org[notre bugtracker]. Pour des instructions de compilation du logiciel et "
"(si besoin) de ses dépendances, merci de consulter le fichier INSTALL.md inclus "
"(si besoin) de ses dépendances, merci de consulter le fichier INSTALL inclus "
"dans les sources logicielles."
#. type: Plain text

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

View File

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

File diff suppressed because it is too large Load Diff

View File

@ -2,8 +2,8 @@
// Subsurface-mobile User Manual
// =============================
// :author: Manual authors: Willem Ferguson, Dirk Hohndel
// :revnumber: 3.1.3
// :revdate: February 2021
// :revnumber: 3.0.0
// :revdate: March 2020
:icons:
:toc:
:toc-placement: manual
@ -18,7 +18,7 @@ image::mobile-images/Banner.jpg["Banner",align="center"]
// toc::[]
[blue]#_Version 3.4, October 2021_#
[blue]#_Version 3.0.5, May 2020_#
toc::[]
@ -35,7 +35,8 @@ aimed at Android and iOS smartphone and tablet devices.
While the desktop version of _Subsurface_ shows much more detailed information
for each dive, the mobile version allows a more accessible dive log on the go. For example,
you can prove dive experience on a dive trip to dive shops or review
previous dives while on a dive boat.
previous dives while on a dive boat. _Subsurface-mobile_ also allows
the gathering of GPS locations where dives are performed.
Assuming you have a dive computer that is supported by the mobile OS of
your choice, _Subsurface-mobile_ supports the downloading of dives from your dive computer.
@ -52,6 +53,7 @@ _Subsurface-mobile_ allows:
- Download dive data directly from some dive computers.
- Editing most of the dive log data, e.g. dive-master, buddy,
equipment or notes relating to a dive.
- Recording, storing and applying GPS positions to dive information.
- Viewing the localities of recorded GPS positions and of dives
on a map.
@ -103,6 +105,8 @@ actions on that screen (see image on the left). Some screens have only
the round central button, others have one or two additional
actions on either side of the central button.
unfloat::[]
On Android devices, use the Android Back
button for "cancel", "discard" or "back" actions. For example, when
editing dive information, tapping the action button saves the changes while the
@ -219,7 +223,7 @@ and down through your dive history.
The Dive List consists of two types of entries:
1. *Trip headers*. A trip header is a line describing the year and month during which a dive trip
took place, as well as the geographical area of the trip. The second line in the lefthand image below indicates that a 10-dive trip
took place, as wel as the geographical area of the trip. The second line in the lefthand image below indicates that a 10-dive trip
was made to Guinjata, Moçambique during December 2016.
2. *Individual dive records*. Tapping a trip header expands the dive list to show (or hide) the individual dives performed during the trip. Each dive is represented by a dive record. By default the dives during the last trip are listed with older dives at the bottom and recent dives at the top of the list. In the lefthand image below the last dive during
@ -257,7 +261,6 @@ to open a map with the dive site in an integrated map viewer.
This of course is only possible if the dive site is associated with GPS
information.
[[S_Filter]]
=== Filter the dive list
By default, all the dives in the dive log are shown in the dive list. After several years your dive
@ -267,6 +270,8 @@ Filter to achieve this. The filter mechanism searches through all the informatio
looking for one or more key words. Only the dives containing these key words are listed in the dive
list. To Filter the dive list, tap the Filter action button:
unfloat::[]
image::mobile-images/FilterButton.jpg["FIGURE: Filter button",align="center"]
at the bottom of the dive list. A text box appears at the top of the screen (image below). Type the
@ -337,9 +342,9 @@ _Forget remembered dive computers_ in the xref:S_Settings[_Settings_] menu.
==== Download from USB serial dive computers
This feature is not supported on iOS.
[width="100%"]
[width="100%", frame="None"]
|=======
a|image:mobile-images/USB-OTG.jpg["FIGURE: USB-OTG cable",align="center"] |
a|image::mobile-images/USB-OTG.jpg["FIGURE: USB-OTG cable",align="center"] |
Most current Android devices now have a USB
Type C port and come with a simple A-to-C adapter plug, which lets you plug in
the dive computer cable into the phone or tablet.
@ -486,224 +491,7 @@ The summary page lists the date of your first dive in the dive list as well as y
It also provides two columns of data for selectable time ranges (by default all dives in the dive list
and the dives during the last six months.
[[S_Stats]]
== Dive Statistics
[width="100%", cols="2,3"]
|===
a|image:mobile-images/StatsPanel.jpg["Image: Statistics panel",float="left"] |
Creating meaningful statistics that convey the information you are looking for is surprisingly hard.
Different users have very different needs and very different expectations. Subsurface-Mobile provides
a rather detailed set of statistics features to summarize information from the dive log in a graphical
way. To access the dive statistics tool, select _Main Menu_ -> _Statistics_. The statistics tool is
so flexible that it is impossible to cover every possible use case. Rather, we provide a conceptual
introduction, followed by specific examples. The tool can be closed using the _Back_ button (bottom
right in Android).
The Statistics tool has two panels (image on left):
1. A setup panel containing comboboxes for requesting a graph (top).
2. The graph that has been requested (bottom).
|===
[[S_Stats_Intro]]
****
*A diver's introduction to statistical graphs*
[icon="images/icons/important.png"]
[IMPORTANT]
The extreme flexibility of the Statistics tool means that you need to provide detailed information about
what information Subsurface should provide. It helps to have a clear objective, i.e. a solid understanding of
what you want Subsurface to show you. In other words, you need to formulate the correct question. There
are so many graphical display options that, if you do not formulate the question correctly, the information
is unlikely to be presented in a valid or appropriate way. Because all statistical results in Subsurface
are shown as graphs, formulating an appropriate specification requires four steps:
a) Which dives do you wish to graph? If required, use the xref:S_Filter[Filter button] for selecting specific dives to be analyzed.
b) Which variable should be displayed along the bottom horizontal axis of the graph?
Let's say you wish to see how many dives you performed each year. In this case the variable along the bottom
horizontal axis would be "Year". Alternatively, if you wished to compare the mean depth of your dives using
different suit types, then "Suit type" would be selected as the variable for the bottom horizontal axis.
Alternatively, if you wished to visualize the water temperature for dives of different dive depths,
then you would select "Max. depth" as the variable on the horizontal axis (see image below). The variable
along the horizontal axis is also called the "base variable", the "X-axis variable" or the "independent
variable": it defines the basic units or categories used for analysis.
image::mobile-images/StatsGraphAxes.jpg["Example: Statistics graph axes",align="left"]
c) Which variable should be displayed along the left-hand vertical axis of the graph? This is the variable
that you are primarily interested in. In some cases this could just be a count such as "No. of dives".
However, if you are interested in water temperature at different dive depths, you would select "Water
temperature" as the variable along the vertical axis (see image above). In this case you are primarily
interested in water temperature, not in dive depth (which would be the variable along the horizontal
axis). The variable along the vertical axis is also called the "data variable" or the "dependent variable":
it is the variable affected by (or dependent on) the values of the variable along the horizontal axis, as
in the graph above.
*NB:* Since, in Subsurface-Mobile, the graphs can be rotated to be horizontally-oriented or vertically oriented,
the terms "horizontal axis variable" and "vertical axis variable" are not appropriate. We use the term *Base
variable* to denote the conventional horizontal axis variable and the *Data variable* to denote the conventional
vertical axis variable.
d) Which chart type do you require? By default Subsurface selects the most appropriate graph type, but this
is a user-selectable option. Taking the example of water temperature at various depths above, the image below
shows three of the possible chart types of the same data: Image A shows the raw data by plotting the exact
temperature and depth for each dive. Image B, however, groups the dives in 5m depth intervals within which the
temperature for each dive is indicated (the red marks are explained below). Image C also groups the dives in 5m
depth intervals. However, in this case the minimum, maximum, mean, upper quartile and lower quartile are shown
for each depth class.
image::mobile-images/StatsGraphOptions.jpg["Statistics graph options",align="left"]
The point of the discussion above is to show that, _before initiating a graph, you need to think carefully
about what you want Subsurface to show_, at least keeping the above four aspects in consideration.
*A more technical note on the valid use of statistical graphs*
When graphing variables from a dive log, there is an important distinction between _continuous variables_ and
_categorical variables_. These two data types are typically graphed in different ways. A continuous variable
can theoretically have any value. For instance dive depth can have any value greater than zero (theoretically
negative depths indicate height above the water but this is not a practical possibility). Consequently, depths
of 21.63857 meters or 44.7653 feet are entirely realistic. Dates are also continuous since the annual value
of any particular instant in time can be presented. For instance a dive at 12 noon on April 1st 2020 can be
presented by a value of 2020.24726 (90.5/366 days in that leap year). On the other hand dive mode is a
categorical variable: there are no values between "Freedive" and "Open circuit" or between "Open Circuit"
and "CCR". Other categorical variables include Buddy, Visibility, Rating and Suit type. Different methods
are used to represent these two types of variables, evident from the way in which the axes are organized.
It is perfectly valid to create a
graph with a continuous Base variable and a categorical Data variable and _vice versa_. However, when using
a continuous Base variable, use a
histogram, NOT a bar-chart. The images below show counts of dives at different depths. Image A is a histogram
showing that no dives were conducted between 55m and 60m depth. However two dives were performed between 60m
and 65m: these two bars (55-60m and 60-65m) have equally important information. Image B shows the bar-chart
of the same dataset where depth has been converted to a categorical type. Notice that the two bars with no
dives (55-60m and 75-80m) are omitted. Important information is lost because of the use of a bar-chart to
represent continuous data. It is easy to determine whether a specific graph is a barchart or a histogram:
when selecting "Chart type" the heading of the submenu should show either _Barchart_ or _Categorical_
in the case of categorical variables, and _histogram_ or _scattergraph_ in the case of continuous variables.
Subsurface-Mobile helps by showing a yellow triangle for graph types likely to be inappropriate (Image C).
image::mobile-images/StatsDataTypes.jpg["Statistics: bar-charts of continuous and categorical data types",align="left"]
****
=== Graph orientation
In many cases the values of the Base Variable along the horizontal axis are shown by dots, not numbers or names (Image B above).
This is because the screen of a mobile device often is not wide enough to show all the values, especially prevalent
in bar charts where the labels along the bottom axis are long. There are two ways of addressing this problem:
1. Turn the mobile device through 90 degrees so that the screen display is in landscape (wide) mode.
2. Rotate the bar chart through 90 degrees by selecting a horizontal bar chart (in the
Chart type combobox, select a horizontal chart type). In this case the bars are shown horizontally in both portrait and landscape orientation. For instance,
the image below shows the horizontal bar-chart produced when selecting "Categorical/Horizontal" in the Chart type combobox and
using the same dataset as in graph B in the image above. With the axes rotated there is much more horizontal space for showing
the relatively long label for each bar in the chart.
image::mobile-images/StatsBarchartRotated.jpg["Stats rotated barchart",align="left"]
=== Graphs of counts data
By default, when the Statistics panel is opened, a histogram is shown of the number of dives performed each year.
This is an example of *counts* data. To request a graph representing counts, three comboboxes need to be set:
a) The top left combobox of the Base variable needs to be specified. Which variable should be along the horizontal
axis? Examples are Year, Buddy, Rating, Max. depth.
b) The binning combobox (top right) for the Base variable needs to be specified. This represents the increment
for each bar along the horizontal axis. For instance, when counts of number of dives are extracted for years,
this could be in increments of a year, a quarter (3 month period) or a month. For some variables, e.g. Buddy
or Rating, a binning value is not relevant and cannot be selected. However, for others, e.g. Year or Max.
depth, selecting the appropriate binning is important.
c) For simple counts data, the left combobox of the Data variable needs to be set to "none". This is because
a data variable is not involved in this type of graph. Divers used to spreadsheets may prefer a *pie chart*
for these data, achieved by selecting "piechart" from the Chart type combobox. It is possible to
simultaneously provide counts for two variables. In this case one could specify a Data variable which
results in the counts being subdivided according to the data variable. This option does not have a piechart
equivalent.
For simple histograms, the default height of each bar is determined by the mean value for the observations
included in each bar. However, this can be manipulated using the Operation combobox to show the mean,
maximum, minimum, median and sum applicable to each bar. Image A below shows quarterly count data of
dives while image B shows quarterly count data, subdivided by dive mode (some dives open circuit,
other dives rebreather). The legend can be dragged around so that it does not obscure part of the graph.
image::mobile-images/StatsCountsData.jpg["Counts data example",align="center"]
=== Counts comprising more than one category in a bar
As mentioned in the section above, bar-charts showing a breakdown of each category for a number of
subcategories are easily created.
a) Select a variable with categories (along the horizontal axis) as a Base variable (e.g. dive mode or suite type).
b) Select another category of data as a Data variable (e.g. gas type or cylinder type).
The images below show two alternative bar-chart representations. If, in the Chart type combobox, one selects
"Barchart/stacked vertical", a graph similar to image A below is generated, summarizing a log of technical
dives where, for each cylinder gas type, the bar is subdivided into a count for open-circuit dives and for
rebreather dives. On the other hand, if "Barchart/grouped horizontal" is selected in the Chart type combobox, a graph
similar to image B, below, is produced. Here the subdivision within each gas type is shown as adjacent bars.
image::mobile-images/StatsBarchartSubdivided.jpg["Stats subdivided barchart",align="center"]
=== Scattergraphs
[width="100%", cols="2,3"]
|=======
a|image:mobile-images/StatsRegression.jpg["Regression data example",align="center"] |
Sometimes you might wish to investigate the relationship between two dive variables. Has my SAC rate decreased over
the years? Is the water temperature colder at greater dive depth? One of the ways of investigating these questions
is to draw a scattergraph where the values of one variable is plotted against the other variable (see image on the left).
|=======
For the dataset in the image above the SAC rate appears to have decreased over time. If the relationship between the two variables
is statistically significant, a red line is shown that summarizes the best estimate of the relationship between SAC rate and year.
In this graph it appears that SAC rate has decreased from around 21 l/min to around 14 l/min between 2013 and 2021. The pink area
around the red line indicates the uncertainty of the precise orientation of the line. The line is expected to lie somewhere within
the pink area with a certainty of 95%. The intensity of the pink color also indicates the relative reliability of these estimates.
The procedure for obtaining a scattergrapth is:
a) Specify the Base variable: Which variable should be along the horizontal axis? Examples are Date, Temperature, Max. depth, SAC rate.
b) Set the binning value for the Base variable (top right) to "none".
c) Specify the Data variable: Which variable should be along the vertical axis?
=== Comparisons between categories of dives
You might wish to compare different categories of dives. Is the (5-star) Rating of a dive related to water temperature?
Is my SAC rate related to diving with different dive suits? Since dive suit and Rating are categories, a scattergraph is not
appropriate. The default is a categorical dot graph, which, in the case of image A below, shows the precise water temperatures
for each Rating. The red lines indicate the top quartile, the mean and the lower quartile of temperature for each rating. The
column with no star indicates dives for which a Rating has not been selected. It appears that dives with a 5-star rating have
higher temperatures than the other ratings. To obtain a categorical graph:
a) Select a variable with categories (along the horizontal axis) as a Base variable (Top left).
b) Select the data variable and set binning to "none" (middle right combobox).
c) By default the Chart type combobox shows "Categorical/data points". If this is not the case, select this value.
image::mobile-images/StatsCategoricalData.jpg["Stats: Comparison of categories",align="center"]
Alternatively you could create a Box-whisker graph for the same data. In the Chart type combobox, select Categorical/"box-whisker".
This creates a graph indicating the maximum, top quartile (Q3), median, bottom quartile (Q1) and minimum for each category or
class. Image B above shows a box-whisker graph for the same data as image A above. You can see that the values for a Rating
of 5 stars tend to be higher than for other ratings.
== Export
=== Export
The _Export_ feature is somewhat experimental. On Android it only allows the upload of your dive list
to two websites (_divelogs.de_ and _diveshare_). On iOS it also allows local file based exports as _Subsurface_
@ -711,6 +499,89 @@ specific XML files (both for dives and dive sites) as well as _UDDF_.
Tapping on _Next_ opens an additional page for login information for the destination website (or a file selection dialog).
== Obtaining dive site locations using the GPS
The fact that almost all smartphones have GPS facilities allows
_Subsurface-mobile_ to record
the locations of dives.
****
[icon="images/icons/important.png"]
[IMPORTANT]
*Accuracy of GPS coordinates*
GPS-derived coordinates on a smartphone
are not always accurate and can have an error greater than 1 km. GPS accuracy
is determined by the hardware and software of the
smartphone as well as by the GPS settings selected within Android/iOS.
As of Android V6 (Marshmallow) select Android _Settings -> Communication -> Location -> High accuracy_*.
If the smartphone is taken on the boat
during a dive, locations can be automatically recorded at regular intervals.
These locations can then be applied to dives in the dive list as described below
****
To collect dive site coordinates four step are required:
[[S_ConfigureGPS]]
=== Configuring the GPS service
For most users, the defaults for tracking GPS locations are
appropriate. If you would like to change them, go to
the _Main Menu_, select the xref:S_Settings[_Settings_] screen, and open
the _Advanced_ area on that page where there is a section for
configuring the GPS service (see image below). GPS location data
are collected at regular intervals, e.g. every 5 minutes, or at regular
distances, e.g. after the boat has moved more than 200m, or a combination of
both of these approaches. Provide the appropriate information and
tap the _Back_ button. The program is now ready to collect GPS positions.
image::mobile-images/GPSConfig.jpg["FIGURE: GPS configure",align="center"]
=== Collecting GPS positions
[width="100%", frame="None"]
|=======
a|image::mobile-images/LocationMenu.jpg["FIGURE: GPS start",align="center"] |
In the _Location_ menu select _Run location service_.
_Subsurface-mobile_ starts to collect GPS locations automatically,
following the preferences specified as described above. While the GPS
location service is running, all menus have a GPS symbol at the bottom,
indicating that the service is active. After returning from
the dive, deactivate the collection of GPS data by tapping
the option _Location -> Disable location service_. The GPS symbol at the bottom
of menus disappears.
Collecting GPS fixes like this is relatively battery intensive and unfortunately
both Android and especially iOS have become increasingly aggressive in killing
applications that are running while the screen is turned off. It may make sense
to check between dives that the location service is still running. On the other hand
the battery consumption of a smartphone with GPS enabled is often significantly less than
the battery consumption of a dedicated GPS that is logging a track.
|=======
=== Viewing GPS data collected during a dive
From the _Location_ submenu select _Show GPS fixes_. This brings
up a list of GPS positions obtained by the location service (image
below). Two actions are possible for each of the locations, enabled by
dragging the right part of a location to the left. This exposes two
options. Tapping the dustbin deletes this particular GPS location. Tapping the
teardrop-shaped icon (actually a Google Maps pin) opens up Google Maps with a pin
indicating the exact map position of the GPS record being viewed. The two above
options can be hidden by drawing the GPS record to the right.
image::mobile-images/gpsmanagement.jpg["FIGURE: GPS management",align="center"]
=== Applying GPS data to dives in the dive log
After running the location service during a dive trip, first either download
the dives from your dive computer or manually enter the dives into the dive list.
Now you can apply the GPS positions to these dives.
From the _Dive management_ menu, tap _Apply GPS fixes_. The dive list contains the start
and end times of each dive. Now, _Subsurface-mobile_ applies the first
GPS position that falls within the dive period of each dive. This results
in a GPS position for each dive that is saved as part of the dive log.
== Viewing the locations of all dives in the dive list
image::mobile-images/DivesMap.jpg["FIGURE: Map of all dive sites",align="center"]
@ -756,9 +627,9 @@ buttons on the _Download from dive computer_ page.
==== Color theme
[width="100%"]
[width="100%", frame="None"]
|=======
a|image:mobile-images/ThemeSettings.jpg["FIGURE: Theme Settings",align="center"] |
a|image::mobile-images/ThemeSettings.jpg["FIGURE: Theme Settings",align="center"] |
Besides the default blue color scheme, _Subsurface-mobile_ supports two additional color schemes
for users with different tastes (see image on left). All screenshots shown in this user manual are
based on the blue default color scheme. You can pick the _pink_ or _dark_ color theme from
@ -782,6 +653,11 @@ your location.
As the name indicates, most users do not need to make changes here.
==== GPS location service thresholds
As indicated above in the _Location_ section of this manual, here you can set the distance and time
thresholds for the _location service_
==== Bluetooth
Since most mobile devices tend to find a _LOT_ of BT/BLE devices that aren't dive computers, by

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
// Subsurface 5.0 User Manual
// Subsurface 4.9 User Manual
// ==========================
// :author: Manual authors: Willem Ferguson, Jacco van Koll, Dirk Hohndel, Reinout Hoornweg,
// Linus Torvalds, Miika Turkia, Amit Chaudhuri, Jan Schubert, Salvador Cuñat, Pedro Neves
// :revnumber: 5.0
// :revdate:February 2021
// :revnumber: 4.9
// :revdate:April 2020
:icons:
:toc2:
:toc-placement: manual
@ -18,7 +18,7 @@ image::images/Subsurface4Banner.jpg["Banner",align="center"]
Linus Torvalds, Miika Turkia, Amit Chaudhuri, Jan Schubert, Salvador Cuñat, Pedro Neves,
Stefan Fuchs
[blue]#_Version 5.0, February 2021_#
[blue]#_Version 4.9, April 2020_#
Welcome as a user of _Subsurface_, an advanced dive logging program with
extensive infrastructure to describe, organize, interpret and print scuba
@ -34,7 +34,7 @@ https://subsurface-divelog.org/[_Subsurface_ web site].
Please discuss issues with this program by sending an email to
mailto:subsurface@subsurface-divelog.org[our mailing list] and report bugs at
https://github.com/Subsurface/subsurface/issues[our bugtracker]. For instructions on how to build the
software and (if needed) its dependencies please consult the INSTALL.md file
software and (if needed) its dependencies please consult the INSTALL file
included with the source code.
*Audience*: Recreational Scuba Divers, Free Divers, Tec Divers, Professional
@ -105,7 +105,7 @@ If a single dive is selected in the *Dive List*, the dive location, detailed inf
and profile of
the _selected dive_ are shown in the respective panels. If
several dives are selected, the last highlighted dive is the _selected
dive_, but summary data of all _highlighted dives_ is shown in the *Summary* tab
dive_, but summary data of all _highlighted dives_ is shown in the *Stats* tab
of the *Info* panel (maximum, minimum and average depths, durations, water
temperatures and SAC; total time and number of dives selected).
@ -178,7 +178,7 @@ These dives can be imported from:
This is usually the approach for dives without a dive computer. The basic record
of information within _Subsurface_ is a dive. The most important information
in a simple dive logbook usually includes dive type, date, time, duration,
depth, the names of your dive buddy and the dive guide, and
depth, the names of your dive buddy and the divemaster or dive guide, and
some remarks about the dive. _Subsurface_ can store much more
information for each dive. To add a dive to a dive log, select _Log
-> Add Dive_ from the Main Menu. The program then shows three panels
@ -374,13 +374,6 @@ of the dive computer (at least for those not charging while connected via USB).
- Do *not* check the checkboxes labelled _Save libdivecomputer logfile_ and
_Save libdivecomputer dumpfile_. These are only used as diagnostic tools
when there are problems with downloads(see below).
- With some dive computers it is possible to adjust the clock on the dive
computer based on the PC clock. This can be very helpful when dealing with
daylight savings time changes, or when travelling between different time
zones. In order to synchronise the dive computer clock with the PC clock
every time dives are imported, check _Sync dive computer time_.
- Then select the _Download_ button.
With communication established, you can see how the data are
retrieved from the dive computer.
@ -405,7 +398,6 @@ of the dive computer (at least for those not charging while connected via USB).
(Puck Pro)". Refer to the text in the box below.
****
*PROBLEMS WITH DATA DOWNLOAD FROM A DIVE COMPUTER?*
[icon="images/icons/important.png"]
@ -468,7 +460,7 @@ as well as contextual information about the dives recorded on the dive computer.
Bluetooth is becoming a more common way of communication between dive computers
and _Subsurface_. _Subsurface_ provides a largely operating system independent
Bluetooth interface. An increasing number of dive computers use Bluetooth Low Energy (BTLE)
as a means of communication. However, BTLE is not a standardized protocol,
as a means of communication. However, BTLE is not a standardised protocol,
consequently adaptations need to be made for communicating with each different dive computer model. See the
link:https://subsurface-divelog.org/documentation/supported-dive-computers/[list of supported dive computers].
Bluetooth communication is often more reliable if all Bluetooth devices seen by the
@ -496,7 +488,7 @@ Bluetooth pairing at the operating system level, it is always prudent to follow
initial Bluetooth pairing problems by pairing the Bluetooth dive computer with
the _Subsurface_ computer using the operating system services of the desktop computer. Delete all
existing pairings and start by scanning for Bluetooth devices from an empty list
(on the desktop) of Bluetooth devices. Once _Subsurface_ has recognized the Bluetooth dive
(on the desktop) of Bluetooth devices. Once _Subsurface_ has recognised the Bluetooth dive
computer, subsequent divelog downloads are likely to be simple.
On the _Linux_ or _MacOS_ platforms the name
@ -513,7 +505,7 @@ computer for more information. Now the third item in the list above has been fin
Select the _Scan_ button towards the bottom left of the dialog above. After
searching, the dive computer should be listed
(perhaps as one of a number of Bluetooth devices) in the main list box on the
left-hand side of the dialog (see image above). If this does not work, select
lefthand side of the dialog (see image above). If this does not work, select
the _Clear_ button, then scan again for Bluetooth devices using the _Scan_
button. After taking these actions _Subsurface_ should see the dive computer.
On the left hand side, if the
@ -552,7 +544,7 @@ One way to achieve this is to use +bluetoothctl+:
After the devices are paired, press the _Save_ button of the dialog.
This closes the Bluetooth dialog. Now select _Download_ in the _Download from
dive computer_ dialog which should still be open. The downloaded dives are
shown on the right-hand side of the download dialog.
shown on the righthand side of the download dialog.
===== On Windows:
image::images/DC_import_Bluetooth_Windows.jpg["FIGURE: Download Bluetooth on Windows",align="center"]
@ -599,12 +591,12 @@ you might like to call one "Alice's Suunto D4" and the other
"Bob's Suunto D4". Alternatively, consider a technical diver who dives with two or more
dive computers of the same model, the logs of both (or all) being uploaded.
In this case it might be prudent to call one of them
"Suunto D4 (1)" and another "Suunto D4 (2)".
To achieve this, display a dive downloaded from this dive computer, right click on its name
in the profile and select the option to set a new nickname. If this option isn't shown, then
Subsurface cannot reliably identify this specific dive computer (not all models support this
feature, but most modern ones do).
"Suunto D4 (1)" and another "Suunto D4 (2)". This is easily done in _Subsurface_.
On the *Main Menu*, select _Log -> Edit device names_. A dialog box opens, showing the
current Model, ID and Nickname of the dive computers used for upload. Edit the Nickname
field for the appropriate dive computer. After saving the Nickname, the dive logs
show the nickname for that particular device instead of the model name,
allowing easy identification of devices.
[[S_MultipleDiveComputers]]
==== Uploading data for a specific dive from more than one dive computer
@ -643,7 +635,7 @@ increase in the amount of information stored for a dive.
1. The *Notes* tab
holds basic information about the dive, the date and time, locality,
buddy, dive guide and some dive notes. This is about the minimum amount of
budiy, divemaster and some dive notes. This is about the minimum amount of
information required for a coherent dive log.
2. If one wishes, one can expand the dive information by using the
@ -709,7 +701,7 @@ image::images/undo.jpg["FIGURE:Performing an undo",align="center"]
Dive locations are managed as a *separate* part of the dive log (See the section entitled xref:S_DiveSiteManagement[Manipulating Dive Site Information]).
The dive information in the *Notes* and *Equipment* tabs can therefore NOT be edited at the same
time as the dive site information. Save all the other dive information (e.g.
dive guide, buddy, protective gear, notes about the dive) by selecting _Apply changes_ on the
divemaster, buddy, protective gear, notes about the dive) by selecting _Apply changes_ on the
*Notes* tab BEFORE editing the dive site information. Then supply a dive site name in the
textbox labelled _Location_ on the *Notes* tab.
@ -742,7 +734,8 @@ New dive locations can be recorded in one of four ways:
1. xref:S_existing_locations[Typing in known coordinates by hand]
2. xref:S_dive_map_location[Positioning the dive site flag on the dive map]
3. xref:S_GPS[Dive site coordinates from a GPS track]
3. xref:S_Subsurface_mobile[Dive site coordinates from the Subsurface-Mobile phone app]
4. xref:S_GPS[Dive site coordinates from a GPS track]
[[S_existing_locations]]
*(1): Enter coordinates by hand* if they are known, using one of
@ -792,9 +785,18 @@ image::images/Globe_image3.jpg["FIGURE:Location creation panel",align="center"]
Once the dive location data have been saved, the dive on the Dive List has
a globe icon immediately to the left of the location name of a particular dive.
[[S_Subsurface_mobile]]
[[S_Using_mobile]]
*(3): Dive coordinates from a mobile device with GPS using Subsurface-Mobile.*
Most smartphones have an integrated GPS, useful for collecting the coordinates of dive sites.
The https://subsurface-divelog.org/documentation/subsurface-mobile-user-manual[user manual for _Subsurface-mobile_] (accessible from within that app)
contains detailed instructions for
performing the collection of GPS data and for managing, uploading and
synchronising the coordinates with a dive log.
[[S_GPS]]
*(3): Import coordinates from GPS equipment.* Some divers prefer to take a GPS
*(4): Import coordinates from GPS equipment.* Some divers prefer to take a GPS
onto the boat and record a GPS track while diving. Subsurface can extract the
dive site from this track and store the dive site coordinates as part of the dive log.
Follow the next steps:
@ -808,7 +810,7 @@ from the GPS to a directory on your desktop computer.
2. In the *Dive List*, select the dive to be edited and specify a name for the dive site
using the Locality field in the *Notes* panel.
3. Open the *Dive site management panel* by selecting the blue globe icon to the right
3. Open the *Dive site managment panel* by selecting the blue globe icon to the right
of the Locality text box of the *Notes* tab.
4. Select the button "Use GPS file" to the right of the Coordinates text box (see image A
@ -830,10 +832,10 @@ show the local time. Make sure your GPS device shows the same local time as your
dive computer. If the times are not identical, then specify a correction in the bottom
text box of the panel illustrated below.
8. The colored icon to the right of the _Start and end times_ in the above panel shows the
degree of synchronization between dive computer and GPS device. A green icon
8. The coloured icon to the right of the _Start and end times_ in the above panel shows the
degree of synchronisation between dive computer and GPS device. A green icon
indicates that the GPS track coincides with the time of the dive. A yellow icon
indicates partial synchronization while a red icon indicates that the dive and the
indicates partial synchronisation while a red icon indicates that the dive and the
GPS track are at different times and that coordinates cannot be extracted. Make
sure that the GPS date and the dive date are the same.
@ -861,8 +863,9 @@ dive site name in the *Notes tab*.
Having entered information about the dive site into the *Notes* tab, the following
additional information can be typed in:
*Dive guide*: The name of the dive guide should be entered in this field
which offers auto selection based on the list of dive guides in
*Divemaster*: The name of the divemaster or dive guide should be
entered in this field
which offers auto selection based on the list of divemasters in
the current logbook.
*Buddy*: In this field, enter the name(s) of the buddy or buddies
@ -919,51 +922,20 @@ options for the entered characters. The
*Size* of the cylinder as well as its working pressure (_Work.press_) will
automatically be shown in the dialog.
*If your cylinder is not listed:* Maybe the cylinder type you dive with is not listed in the dropdown list. Add a new
cylinder by selecting any of the existing cylinders in the list and clicking on the
name of that cylinder. This activates the cursor on the cylinder name. Overtype
the cylinder name with your new cylinder name and press ENTER on the keyboard. The new
cylinder name now appears on the dropdown list. Overtyping a cylinder name does not affect
the name that is being overtyped. Add a size and start pressure for that
cylinder. The usual convention is that double cylinders are prefixed with a "D" to
indicate "double". Say for instance you dive a manifolded twinset of two 7 litre steel cylinders. This
could be named "D7 232 bar" rather than "14 232 bar". However, use a rule that works for you.
Next, indicate the starting pressure and the ending pressure of the
specified gas during the dive. The unit of pressure (metric/imperial)
corresponds to the settings chosen in the _Preferences_.
[[S_newcyl]]
****
[icon="images/icons/important.png"]
[IMPORTANT]
*MY CYLINDER IS NOT LISTED IN THE DROPDOWN LIST*
Maybe the cylinder type you dive with is not listed in the dropdown list. Let us say that you
dive with 7-litre twins at 300 bars and these do not appear in the dropdown list. The image below shows
the _Cylinder table_ as it might appear after selecting the _Equipment_ tab and before specifying
any cylinder information:
image::images/Newcyl-Initial.png["FIGURE: Initial display of cylinder table",align="center"]
Start by selecting the existing cylinder in the table and clicking on the
name of that cylinder type. The cylinder type changes to a dropdown box, recognized by the down-arrow
next to the cylinder name (see image below)
image::images/Newcyl-selection.png["FIGURE: Selecting cylinder name in cylinder table",align="center"]
This activates the cursor on the cylinder type. Overtype the cylinder type with your new cylinder type (image below).
*Important:* Overtyping a cylinder type does not affect the name that is being overtyped. The usual convention is that
double cylinders are prefixed with a "D" to indicate "double". In our case we have a manifolded twinset of two
7-litre 300 bar cylinders. This could be named "D7 300 bar" rather than "14 300 bar". However, use a rule that works for you.
image::images/Newcyl-name.png["FIGURE: Typing new cylinder name",align="center"]
and press ENTER on the keyboard. This is a critical step where most users go wrong. Pressing the ENTER key
is the action that creates a new cylinder type (image below). Merely clicking an adjacent cell in the table does not
create the new cylinder type.
image::images/Newcyl-create.png["FIGURE: Creating ne cylinder type",align="center"]
The new cylinder type now appears on the dropdown list. Add a size and start pressure for that
cylinder (image below).
image::images/Newcyl-final.png["FIGURE: Final details for new cylinder type",align="center"]
****
Finally, provide the gas mixture used. If air was used, the
value of 21% can be entered into the oxygen box or this field can be left blank. If nitrox or
trimix were used, their percentages of oxygen and/or helium should be entered.
@ -1052,7 +1024,7 @@ using the dropdown box. The following water types are available:
as a safe value for both fresh water and sea water.
4. Salt water encountered in the sea.
The topic of water salinity is complex because it differs somewhat between different oceans. A warning icon
The topic of water salinity is complex because it differs sonewhat between different oceans. A warning icon
is shown if the water type reported by the dive computer currently displayed is different from
the value that is typed here. The water density value (corresponding to salinity) is automatically calculated
from the choice of water type.
@ -1104,7 +1076,7 @@ and gas composition). Other fields remain empty.
It may be useful to simultaneously edit some of the
fields in the *Notes* and *Equipment* tabs. For instance, its possible
that a diver performed several dives during a single day, using identical equipment at the same
dive site, or with the same dive guide and/or buddy or tags. Instead
dive site, or with the same divemaster and/or buddy or tags. Instead
of completing the information for each
dive separately, select all the dives for that day in the *Dive List* and
insert the same information in the *Notes* and *Equipment* fields that need
@ -1440,7 +1412,7 @@ There are two types of _CSV_ dive logs that can be imported into _Subsurface_:
1. _CSV dive details_: This dive log format contains similar information to that of a
typical written dive log, e.g. dive date and time, dive depth, dive duration, names of
buddy and dive guide and information about cylinder pressures before and
buddy and divemaster and information about cylinder pressures before and
after the dive, as well as comments about the dive. All the data for a single
dive go on a single line of text, following the order of the column headings.
@ -1640,13 +1612,11 @@ Select the dive site to be merged by right-clicking it. A confirmation
message is presented (see image above). Clicking the confirmation message merges the selected dive with
the dive named at the top of the panel and returns you to the dive sites management panel.
Alternatively, if exactly one dive site is selected in the 'Near dive sites' list, there is an additional function 'Merge current site into this site' available in the context menu. This can be helpful if the name of the destination dive site is not known, e.g. when importing dive sites from a third party source.
==== Add a dive site
At the top right of the dive sites management table is a round button with a "+". Clicking that button inserts a
new site entitled "New dive site" into the list (image below). The new site can also be deleted (maybe after erroneously
clicking the + icon or you realized the dive site already exists) by selecting _Edit -> Undo_ from the main menu or by typing Ctrl-Z (or CMD-Z on a Mac) while the dive sites management table has focus. Edit this new site by selecting its edit icon and provide a name,
clicking the + icon or you realised the dive site already exists) by selecting _Edit -> Undo_ from the main menu or by typing Ctrl-Z (or CMD-Z on a Mac) while the dive sites management table has focus. Edit this new site by selecting its edit icon and provide a name,
coordinates and, if preferred, a description. Clicking
the "Done" button in the edit panel returns you to the dive sites management panel.
@ -1929,7 +1899,7 @@ logging of cylinder pressures during sidemount involves three steps, exactly as
from a dive with the times of cylinder changes is the only tedious part of logging sidemount dives.
- *Within _Subsurface_ describe the cylinders used during the dive*. The diver needs to provide the
specifications of the different cylinders, using the *Equipment* tab of the *Info Panel* (see
image below where two 12 liter cylinders were used).
image below where two 12 litre cylinders were used).
- *Indicate cylinder change events on the _Subsurface_ dive profile*. Once the dive log has been imported
from a dive computer into _Subsurface_, the cylinder switch events need to be shown on the dive profile.
Cylinder changes are recorded by right-clicking at the appropriate point on the dive profile, then
@ -1943,29 +1913,6 @@ logging of cylinder pressures during sidemount involves three steps, exactly as
image::images/sidemount1.jpg["FIGURE: Sidemount profile",align="center"]
==== Fixing sensor being attached to wrong cylinder
When importing a dive _Subsurface_ generally has to make some assumptions when importing dives. One
of these assumptions is which cylinder a pressure sensor is attached to. The following dive is a sidemount
dive with two deco cylinders. Each of the main cylinders has a pressure sensor attached to them. In this
case _Subsurface_ only knows about 3 gasses and 2 sensors so it makes the assumption that the sensors
are attached to the first two cylinders, one bottom gas and one with deco gas. For the cylinders with
attached sensors the cylinder index will be shown in the sensors column.
image::images/sensors-import.png["FIGURE: Imported cylinders and sensors",align="center"]
To fix this, you can add a new cylinder with bottom gas and pick the index for the deco cylinder in
the sensors drop down.
image::images/sensors-newcylinder.png["FIGURE: New cylinder added for sensor move",align="center"]
After this change the second sensor will be attached to the fourth cylinder and the two deco cylinders
won't have any cylinders attached.
image::images/sensors-moved.png["FIGURE: Sensor moved to new cylinder",align="center"]
The profile graph will also be updated to reflect this change.
[[S_sSCR_dives]]
==== Passive semi-closed circuit rebreather (pSCR) dives
@ -1997,8 +1944,8 @@ over two hours.
image::images/pSCR_profile.jpg["FIGURE: pSCR profile",align="center"]
Visualizing the pO~2~ drop_: The difference between the pO~2~ of the fresh cylinder gas and the pO~2~
in the loop can be visualized in _Subsurface_ by opening the _Tech setup_
_Visualising the pO~2~ drop_: The difference between the pO~2~ of the fresh cylinder gas and the pO~2~
in the loop can be visualised in _Subsurface_ by opening the _Tech setup_
panel in the _File -> Preferences_ menu item and then providing suitable information in the section
labelled _pSCR options_. The _pSCR metabolic rate_ is your rate of oxygen metabolism in liters/min (commonly
between 0.5 and 2.5). The _Dilution ratio_ is the ratio indicating how much gas in the loop is replaced with
@ -2150,7 +2097,7 @@ a stage cylinder, indicate the bailout as well as the gas change event and _Subs
all the appropriate pO~2~ values. Some dive computers record bailout events as well as gas change
events: in this case the events are shown automatically in the dive log.
image::images/CCR_bailout.jpg["FIGURE: CCR bailout profile",align="center"]
image::images/CCR_bailout.jpg["FIGURE: CCR bailout profileh",align="center"]
_Deco ceiling_: The deco ceiling calculated by Subsurface is not very accurate because the precise pressure of nitrogen
in the loop can usually not be determined from the dive log imported from the CCR equipment. Many CCR dive
@ -2233,9 +2180,9 @@ _Subsurface_ calculates SAC and Gas consumption taking in account gas
incompressibility, particularly at tank pressures above 200 bar, making them more accurate.
Refer to xref:SAC_CALCULATION[Appendix F] for more information.
=== The *Summary* tab (for groups of dives)
=== The *Stats* tab (for groups of dives)
The Summary tab gives summary statistics for more than one dive, assuming that
The Stats tab gives summary statistics for more than one dive, assuming that
more than one dive has been selected in the *Dive List* using the standard
Ctrl-click or Shift-click of the mouse. If only one
dive has been selected, figures for only that dive are given. This tab
@ -2249,7 +2196,7 @@ shallowest and deepest dives of those selected.
=== The *Extra Data* tab (usually for individual dives)
When using a dive computer, it often reports several data items that cannot easily be
presented in a standardized way because the nature of the information differs from one
presented in a standardised way because the nature of the information differs from one
dive computer to another. These data often comprise setup information, metadata about
a dive, battery levels, no fly times, or gradient factors used during the dive. When
possible, this information is presented in the *Extra Data* tab. Below is an
@ -2321,10 +2268,6 @@ M-value, corresponds to 100%), the time to surface (TTS), the calculated ceiling
as of the statistics in the Information Box, shown as four
buttons on the left of the profile panel. These are:
[icon="images/icons/InfoBox.png"]
[NOTE]
Show or hide the *Information Box*. This allows the Information Box to be hidden in order to see the entire dive profile without any obstructions.
[icon="images/icons/MOD.jpg"]
[NOTE]
Show the *Maximum Operating Depth (MOD)* of the dive, given the
@ -2374,11 +2317,11 @@ values are dependent on the composition of the breathing gas. The EAD
is the depth of a hypothetical air dive that has the same partial
pressure of nitrogen as the current depth of the nitrox dive at
hand. A nitrox dive leads to the same decompression obligation as an
air dive to the depth equalling the EAD. The END is the depth of a
air dive to the depth equaling the EAD. The END is the depth of a
hypothetical air dive that has the same sum of partial pressures of
the narcotic gases nitrogen and oxygen as the current trimix dive. A
trimix diver can expect the same narcotic effect as a diver breathing
air diving at a depth equalling the END.
air diving at a depth equaling the END.
If at some point a isobaric counter diffusion situation is encountered
in the leading tissue (defined to be a moment in time where helium is
@ -2457,7 +2400,7 @@ most dive computers report alarms relating to high partial pressures of oxygen,
to rapid ascents or the exceeding of no-deco limits (NDL).
On the other hand, other events are classified as warnings and, for instance, occur when
the remaining gas in a cylinder falls below a predetermined limit, a deep stop needs to be performed or
the need to change gas during multi-cylinder dives. Some dive computers also report notifications,
the need to change gas during multicylinder dives. Some dive computers also report notifications,
e.g. when a safety stop is initiated or terminated or when a predetermined amount of OTUs have been incurred.
The alarms, warnings and notifications differs from one dive computer to another: some dive computers do not
report any of the above events, while others provide an extensive log of events. The reporting of events
@ -2629,7 +2572,7 @@ image::images/ShowCylinders_f20.jpg["Figure: Cylinder use graph",align="center"]
[icon="images/icons/heatmap.png"]
[NOTE]
====================================================================================
Display the tissue heat-map. The heat map summarizes, for the duration of the dive, the inert gas tissue pressures
Display the tissue heat-map. The heat map summarises, for the duration of the dive, the inert gas tissue pressures
for each of the 16 tissue compartments of the Bühlmann model. Blue colors mean low gas pressures in a tissue compartment
and thus on-gassing, green to red means excess gas in the tissue and thus off-gassing. Fast to slow tissues are indicated from
top to bottom. The figure below explains in greater detail how the heat map can be interpreted.
@ -2646,7 +2589,7 @@ for more details on the different elements of this graph.
Image *B* shows a gradient of unique colors, spanning the whole range of inert gas pressures.
It is possible to map the height of each of the dark green vertical bars of *A* to a
color in *B*. For instance, the fastest (leftmost) dark green vertical bar in *A* has
a height corresponding to the medium green part of *B*. The height of this bar can therefore be summarized
a height corresponding to the medium green part of *B*. The height of this bar can therefore be summarised
using a medium green color. Similarly, the highest dark green bar in *A* is as high
as the yellow part of *B*. The 14 remaining tissue pressure bars in *A* can also be
translated to colors. The colors represent three ranges of tissue inert gas pressure:
@ -2739,7 +2682,7 @@ restored to view by selecting Unhide all events from the context menu.
=== Filtering the dive list
The dives in the *Dive List* can be filtered, selecting only some
of the dives based on attributes such as dive tags, dive site, dive guide or buddy.
of the dives based on attributes such as dive tags, dive site, divemaster or buddy.
For instance, filtering lets you list the dives during a particular year at a specific
dive site, or otherwise the cave dives with a particular buddy. Filtering can be performed
based on virtually any information in the *Info* panel.
@ -2792,20 +2735,20 @@ We may wish to refine our selection of dives to show in the *Dive List*. Let's s
temperature was 18 °C or higher. Select "Water Temp." from the list of constraints. A line containing this new constraint is added to the filter
panel. Select "at least" from the combobox on this line and type "18" in the appropriate text box. Below is an image with constraints defined to filter dives at Sodwana with water temperatures at 18 °C or higher.
image::images/Filter-LocTemp.png["Figure: Filter: Stage 2 Filter set construction",align="center"]
image::images/Filter:LocTemp.png["Figure: Filter: Stage 2 Filter set construction",align="center"]
In order to refine our filter we may wish to show only dives on a Tuesday. Select "week day" from the list of constraints. A line
containing this new constraint is added to the filter panel with a dropdown list of days that are selectable. Select "Tuesday" from the
list. The image below shows a filter that selects dives at Sodwana on Tuesdays with the water temperature at or above 18 °C.
image::images/Filter-LocTempWeek.png["Figure: Filter: Stage 3 Filter set construction",align="center"]
image::images/Filter:LocTempWeek.png["Figure: Filter: Stage 3 Filter set construction",align="center"]
As a last step in refining our filter we may wish to add another constraint specifying visibility of at least three stars. Select
"visibility" from the list of constraints. A new line is added to the filter panel, allowing us to select the number of stars
we require. In this case click on the third star and ensure that the combobox shows "at least". We have now filtered for all dives
at Sodwana on a Tuesday with water temperature at or above 18 °C and with a 3-star or better visibility.
image::images/Filter-LocTempWeekVis.png["Figure: Filter: Stage 4 Filter set construction",align="center"]
image::images/Filter:LocTempWeekVis.png["Figure: Filter: Stage 4 Filter set construction",align="center"]
Clearly it is possible to construct highly refined filters. The examples above show only a tiny fraction of the possibilities
in creating filters.
@ -2826,6 +2769,7 @@ line of the panel immediately following "Current set:"
Filter sets can be deleted by selecting the "Filter sets" tab in the Filter Panel and by clicking on the dustbin icon on the left
of the appropriate filter set name.
==== Closing the filter panel
The filter action can only be stopped by using the _Reset_ button (yellow up-arrow) or
@ -2838,141 +2782,6 @@ Bob Smith as a buddy. Closing the _Filter Panel_ allows viewing the map location
To re-open the _Filter Panel_ in this case, select _Log -> Filter divelist_ from the _Main Menu_. To switch
off filtering and exit the _Filter Panel_, click on _Reset_ and then on _Close_.
[[S_Stats]]
=== Dive statistics
Creating meaningful statistics that convey the information you are looking for is surprisingly hard. Different users have very different needs and very different expectations. Subsurface provides a rather detailed set of statistics features to summarize information from the dive log in a graphical way. To access the dive statistics tool, select _Main Menu_ -> _View_ -> _Dive Statistics_. This tool is so flexible that it is impossible to cover every possible use case. Rather, we provide a conceptual introduction, followed by specific examples. The tool can be closed using the Close button at the top left. The Statistics tool has four panels (see image below):
1. A setup panel containing comboboxes for requesting a graph (top left).
2. The graph that has been requested (top right).
3. The Filter panel (bottom right).
4. The Dive List, reflecting the dives or dive trips included in the analysis (bottom left).
image::images/StatsPanel.jpg["Statistics panel",align="center"]
[[S_Stats_Intro]]
****
*A diver's introduction to statistical graphs*
[icon="images/icons/important.png"]
[IMPORTANT]
The extreme flexibility of the Statistics tool means that you need to provide detailed information about what information Subsurface should provide. It helps to have a clear objective, a solid understanding of what you want Subsurface to show you. In other words, you need to formulate the correct question. There are so many graphical display options that, if you do not formulate the question correctly, the information is unlikely to be presented in a valid or appropriate way. Because all statistical results in Subsurface are shown as graphs, formulating an appropriate specification requires four steps:
a) Which dives do you wish to graph? Perhaps you wish to analyze dives during winter, or dives on tropical reefs, or dives at a specific dive site. Use the Filter panel for selecting those dives. The section on the <<S_Filter,_Filter tool_>> contains complete instructions for filtering the dive list.
b) Which variable should be displayed along the bottom horizontal axis of the graph? Let's say you wish to see how many dives you performed each year. In this case the variable along the bottom horizontal axis would be "Year". Alternatively, if you wished to compare the mean depth of your dives using different suit types, then "Suit type" would be selected as the variable for the bottom horizontal axis. Alternatively, if you wished to visualize the water temperature for dives of different dive depths, then you would select "Max. depth" as the variable on the horizontal axis (see image below). The variable along the horizontal axis is also called the "base variable", the "X-axis variable" or the "independent variable": it defines the basic units or categories used for analysis.
image::images/StatsGraphAxes.jpg["Example: Statistics graph axes",align="center"]
c) Which variable should be displayed along the left-hand vertical axis of the graph? This is the variable that you are primarily interested in. In some cases this could just be a count such as "No. of dives". However, if you are interested in water temperature at different dive depths, you would select "Water temperature" as the variable along the vertical axis (see image above). In this case you are primarily interested in water temperature, not in dive depth (which would be the variable along the horizontal axis). The variable along the vertical axis is also called the "data variable" or the "dependent variable": it is the variable affected by (or dependent on) the values of the variable along the horizontal axis, as in the graph above.
*NB:* Since, in Subsurface, the graphs can be rotated to be horizontally-oriented or vertically oriented, the terms "horizontal axis variable" and "vertical axis variable" are not appropriate. We use the term *Base variable* to denote the conventional horizontal axis variable and the *Data variable* to denote the conventional vertical axis variable.
d) Which chart type do you require? By default Subsurface selects the most appropriate graph type, but this is a user-selectable option. Taking the example of water temperature at various depths above, the image below shows three of the possible chart types of the same data: Image A below shows the raw data by plotting the exact temperature and depth for each dive. Image B, however, groups the dives in 5m depth intervals within which the temperature for each dive is indicated (the red marks are explained below). Image C also groups the dives in 5m depth intervals. However, in this case the minimum, maximum, mean, upper quartile and lower quartile are shown for each depth class.
image::images/StatsGraphOptions.jpg["Statistics graph options",align="center"]
The point of the discussion above is to show that, _before initiating a graph, you need to think carefully about what you want Subsurface to show_, at least keeping the above four aspects in consideration.
*A more technical note on the valid use of statistical graphs*
When graphing variables from a dive log, there is an important distinction between _continuous variables_ and _categorical variables_. These two data types are typically graphed in different ways. A continuous variable can theoretically have any value. For instance dive depth can have any value greater than zero (theoretically negative depths indicate height above the water but this is not a practical possibility). Consequently, depths of 21.63857 meters or 44.7653 feet are entirely realistic. Dates are also continuous since the annual value of any particular instant in time can be presented. For instance a dive at 12 noon on April 1st 2020 can be presented by a value of 2020.24726 (90.5/366 days in that leap year). On the other hand dive mode is a categorical variable: there are no values between "Freedive" and "Open circuit" or between "Open Circuit" and "CCR". Other categorical variables include Buddy, Visibility, Rating and Suit type. Different methods are used to represent these two types of variables, evident from the way in which the axes are organized. It is perfectly valid to create a
graph with a continuous Base variable and a categorical Data variable and _vice versa_. However, when using a continuous Base variable, use a
histogram, NOT a bar-chart. The images below show counts of dives at different depths. Image A is a histogram showing that no dives were conducted between 55m and 60m depth. However two dives were performed between 60m and 65m: these two bars (55-60m and 60-65m) have equally important information. Image B shows the bar-chart of the same dataset where depth has been converted to a categorical type. Notice that the two bars with no dives (55-60m and 75-80m) are omitted. Important information is lost because of the use of a bar-chart to represent continuous data.
image::images/StatsDataTypes.jpg["Statistics: bar-charts of continuous and categorical data types",align="center"]
****
==== Graphs of counts data
By default, when the Statistics panel is opened, a histogram is shown of the number of dives performed each year. This is an example of *counts* data. To request a graph representing counts, three comboboxes need to be set:
a) The top combobox of the Base variable needs to be specified. Which variable should be along the horizontal axis? Examples are Year, Buddy, Rating, Max. depth.
b) The binning combobox for the Base variable needs to be specified. This represents the increment for each bar along the horizontal axis. For instance, when counts of number of dives are extracted for years, this could be in increments of a year, a quarter (3 month period) or a month. For some variables, e.g. Buddy or Rating, a binning value is not relevant and cannot be selected. However, for others, e.g. Year or Max. depth, selecting the appropriate binning is important.
c) For simple counts data, the top combobox of the Data variable needs to be set to "none". This is because a data variable is not involved in this type of graph. Divers used to spreadsheets may prefer a *pie chart* for these data, achieved by selecting "Categorical/piechart" from the Chart combobox. It is possible to simultaneously provide counts for two variables. In this case one could specify a Data variable which results in the counts being subdivided according to the data variable. This option does not have a piechart equivalent. Detailed information for each bar can be obtained by hovering the mouse over the the appropriate bar.
For simple histograms, the default height of each bar is determined by the mean value for the observations included in each bar. However, this can be manipulated using the Operation combobox to show the mean, maximum, minimum, median and sum applicable to each bar. Image A below shows quarterly count data of dives while image B shows quarterly count data, subdivided by dive mode (some dives open circuit, other dives rebreather). The mouse is positioned over a specific bar to provide detailed information. The legend can be dragged around so that it does not obscure part of the graph. Alternatively, the legend can be removed by deselecting the appropriate checkbox at the bottom left of the setup panel.
image::images/StatsCountsData.jpg["Counts data example",align="center"]
==== Scattergraphs
Sometimes you might wish to investigate the relationship between two dive variables. Has my SAC rate decreased over the years? Is the water temperature colder at greater dive depth? One of the ways of investigating these questions is to draw a scattergraph where the values of one variable is plotted against the other variable (see image below).
image::images/StatsRegression.jpg["Regression data example",align="center"]
For the dataset in the above image, the SAC rate appears to have decreased over time. If the "linear regression" checkbox is marked, a red line is shown that summarizes the best estimate of the relationship between SAC rate and year. In this graph it appears that SAC rate has decreased from around 21 l/min to around 14 l/min between 2013 and 2021. The pink area around the red line indicates the uncertainty of the precise orientation of the line. The line is expected to lie somewhere within the pink area with a certainty of 95%. The intensity of the pink color also indicates the relative reliability of these estimates. The procedure for obtaining a scattergraph is:
a) Specify the Base variable: Which variable should be along the horizontal axis? Examples are Date, Temperature, Max. depth, SAC rate.
b) Set the binning value for the Base variable to "none".
c) Specify the Data variable: Which variable should be along the vertical axis?
Within the scattergraph, hover over a specific point to see more information for that point.
==== Comparisons between categories of dives
You might also wish to compare different categories of dives. Is the (5-star) Rating of a dive related to water temperature? Is my SAC rate related to diving with different dive suits? Since dive suit and Rating are categories, a scattergraph is not appropriate. The default is a categorical dot graph, which, in the case of image A below, shows the precise water temperatures for each Rating. The red lines indicate the top quartile, the mean and the lower quartile of temperature for each rating. The column with no star indicates dives for which a Rating has not been selected. It appears that dives with a 5-star rating have higher temperatures that the other ratings. To obtain a categorical graph:
a) Select a variable with categories (along the horizontal axis) as a Base variable.
b) Select the data variable and set binning to "none".
c) By default the Chart combobox shows "Categorical/data points". If this is not the case, select this value.
image::images/StatsCategoricalData.jpg["Stats: Comparison of categories",align="center"]
Alternatively you could create a Box-whisker graph for the same data. In the Chart combobox, select "Categorical/box-whisker". This creates a graph indicating the maximum, top quartile (Q3), median, bottom quartile (Q1) and minimum for each category or class. Image B above shows a box-whisker graph for the same data as image A above. You can see that the values for a Rating of 5 stars tend to be higher than for other ratings. Hover over a box to see more complete information for that box.
==== Counts comprising more than one category in a bar
As explained in the section above on counts data, bar-charts showing a breakdown of each category for a number of subcategories is easy (images below).
a) Select a variable with categories (along the horizontal axis) as a Base variable (e.g. dive mode or suite type).
b) Select another category of data as a Data variable (e.g. gas type or cylinder type).
The images below show two alternative bar-chart representations. If, in the Chart combobox, one selects "Barchart/stacked vertical", a graph similar to image A below is generated. This summarized a log of technical dives where, for each cylinder gas type, the bar is subdivided into a count for open-circuit dives and for rebreather dives. On the other hand, if "Barchart/grouped vertical" is selected in the Chart combobox, a graph similar to image B, below, is produced. Here the subdivision within each gas type is shown as adjacent bars.
image::images/StatsBarchartSubdivided.jpg["Stats subdivided barchart",align="center"]
==== Graph orientation
Bar-charts can be rotated by 90 degrees by selecting the appropriate chart type in the Chart combobox. For instance, here is the horizontal bar-chart produced when selecting "Barchart/stacked horizontal" in the Chart combobox and using the same dataset as in the graph above. This is useful if the labels for different bars are long, preventing them being displayed with vertical bar charts.
image::images/StatsBarchartHorizontal.jpg["Stats: Horizontal comparison of categories",align="center"]
==== Rapid graphing of subsets of data in a graph (restricting the displayed data)
Let's say you are viewing a bar graph showing mean maximum dive depth for different years. However two of the years have dive
depth values that appear atypical and you wish to inspect the dives only for those two years. The obvious approach is to use the xref:S_Filter[Filter tool]
to select only data for the two years of interest and then view those data using the Statistics panel. However,
_Subsurface_ provides a rapid mechanism of selecting the appropriate subset of data using your mouse. In the above example of a bar graph,
select the bars for the two years of interest by clicking on them and activate the "Restrict to selection" button towards the bottom left
of the Statistics panel.
This displays only the data for the two bars that have been selected. This restricted subset can now be analyzed
using all the options in the Statistics panel. Below is a scattergraph for a number of dives, showing the water temperature for different dive depths.
image::images/StatsRestricted.jpg["Stats: Selecting restricted data",align="center"]
Let's say you wish to analyze only dives at tropical dive sites, defined by temperatures above 22°C and depths less than 60m. Select the
appropriate dives by dragging your mouse across the scattergraph (see image above) and restrict the data by activating the "Restrict to selection" button.
Now only the selected subset of points is shown on the graph. You can now select *Base* and *Data* variables to further analyze the restricted data.
The graph below shows the SAC rates as a function of dive depth for the restricted dataset created
above. The graph shows that SAC rate was more or less constant (around 15 l/min) for all dive depths at tropical dive sites.
image::images/StatsRestrictedGraph.jpg["Stats: Showing restricted data",align="center"]
The ability to rapidly create subsets of data for display (using the restriction tool) creates a powerful mechanism to do rapid but detailed analysis of a dive log.
After creating a data subset, The text in the restriction tool indicates the number of dives in the subset that has been selected. Note, in the figure above, that a
previously greyed-out button, "Reset restriction", has been made active after restricting
the data for graphing. The original dataset can be restored by clicking the "Reset restriction" button. The text in the restriction tool now shows "Analyzing all dives".
== Organizing the logbook (Manipulating groups of dives)
@ -3146,7 +2955,7 @@ it may happen that the dive computer does not register a new dive, but continues
the previous dive due to the brief surface interval. In this case it is possible to
split a dive so that the two dives are shown as independent dives on the *Dive List*.
If this operation is performed, _Subsurface_ scans the selected dive(s) and splits the
dive at points during the dive where the depth is less than a meter.
dive at points during the dive where the depth is less than a metre.
==== Load image(s) from file(s)
This topic is discussed in the section: xref:S_LoadImage[Adding photographs or videos to dives].
@ -3201,7 +3010,7 @@ A dive log or part of it can be saved in several formats:
the depth profile, temperature and pressure information of each dive. The source of the data
being saved are the data as downloaded from your dive computer.
* _CSV Computer Profile Panel data_. This option exports the information presented in the _Profile Panel_.
* _CSV Computer Profile Panel daata_. This option exports the information presented in the _Profile Panel_.
The _Profile panel_ contains many calculated and interpolated values, e.g. SAC,
cylinder pressure, decompression ceilings, gas partial pressures and interpolated depths. These
data therefore differ from the raw dive information imported from a dive computer. This export option
@ -3243,7 +3052,7 @@ image::images/texexample.png["Figure: Export to TeX", align="center"]
of each of those photos/videos was taken.
When the "Anonymize" option is selected for xml-based file formats, the letters A-Z
are all replaced by the letter 'X' in the notes, buddy, dive guide, divesite name
are all replaced by the letter 'X' in the notes, buddy, divemaster, divesite name
and divesite description fields. This way, you can share dive log files for debugging
purposes without revealing personal information. Please note, though, that other
characters are not replaced, so this is not useful for languages with non-latin
@ -3316,7 +3125,7 @@ Subsurface will never use this email address again.
(this field is only visible while the server is waiting for email
address confirmation)
** Click _Apply_ again. The _Subsurface cloud storage_ account
will be marked as verified and the _Subsurface cloud storage_ service is initialized for use.
will be marked as verified and the _Subsurface cloud storage_ service is initialised for use.
****
[icon="images/icons/important.png"]
@ -3402,7 +3211,7 @@ In this case, each user's preferences, settings and cloud access information are
each diver to interact with _Subsurface_ in her/his preferred way and with individual cloud access. The above
process can be made user-friendly by creating a link/shortcut with a desktop icon that executes the above
command-line instruction. Use of the _--user=_ option therefore enables each user to create, maintain and
backup a separate dive log within a personalized user interface. This way, when each diver launches _Subsurface_,
backup a separate dive log within a personalised user interface. This way, when each diver launches _Subsurface_,
it opens with the correct dive log as well as the appropriate display and backup preferences, and each diver
can access their own divelog on a mobile device using https://subsurface-divelog.org/documentation/subsurface-mobile-user-manual[_Subsurface-Mobile_].
@ -3616,7 +3425,7 @@ image::images/Pref_log.jpg["FIGURE: Preferences: Dive log",align="center"]
in the Information tab of the Info panel. The tools for visibility and current are always shown,
irrespective of whether this radio button has been checked or not.
** *Allow editing of water salinity*: The *Information* tab has a tool for displaying the water salinity, i.e. the type of
** *Allow editing of water salinity*: The *Information* tab has a tool for displaying the water salinity, i.e the type of
water dived in and its salinity. In the case of manually-entered dives, editing of water type is *always* active.
In some cases one may want to edit the water type of a dive derived from a dive log. For instance you left the dive computer
setting as "Salt water" while actually diving in an inland lake with fresh water. In this case you may wish to edit the
@ -3634,7 +3443,7 @@ image::images/Pref_log.jpg["FIGURE: Preferences: Dive log",align="center"]
=== Equipment
This tab sets some default values relating to equipment.
This tab sets some dedault values relating to equipment.
image::images/Pref_eqpmnt.jpg["FIGURE: Preferences: equipment",align="center"]
@ -3644,8 +3453,6 @@ image::images/Pref_eqpmnt.jpg["FIGURE: Preferences: equipment",align="center"]
** *Show unused cylinders*: Checking this checkbox allows showing all cylinders entered for a dive
in the Cylinder Table of the *Equipment* tab, even if one or more cylinders were actually not used.
This will also include unused cylinders in data exports and when dives are cloned for the planner
or merged into one dive.
=== Media
@ -3667,9 +3474,11 @@ image::images/Pref_media.jpg["FIGURE: Preferences: media",align="center"]
This tab sets common variables used for decompression calculations pertaining to technical diving.
[[S_CCR_options]]
image::images/Pref_tech.jpg["FIGURE: Preferences: Tech setup",align="center"]
[[S_CCR_options]]
[[S_GradientFactors]]
* *Gas pressure display setup*. Even though nitrogen and helium pressures are also included here,
these items mainly pertain to oxygen management:
** _Thresholds_: _Subsurface_ can display graphs of the nitrogen, oxygen and the helium
@ -3994,7 +3803,7 @@ used without changing the original values in the _Preferences_.
Gradient Factor settings strongly affect the calculated ceilings and their depths.
A very low GFLow value brings on decompression stops early during the dive.
** For more information about Gradient factors, see the section on xref:S_CCR_options[Gradient Factor Preference settings].
** For more information about Gradient factors, see the section on xref:S_GradientFactors[Gradient Factor Preference settings].
If the VPM-B model is selected, the Conservatism_level needs to be specified on a scale of 0 (least conservative) to 4 (most conservative).
This model tends to give deco stops at deeper levels than the Bühlmann model and often results in slightly shorter
@ -4057,7 +3866,7 @@ In addition to calculating the total gas consumption for every cylinder the plan
of calculating the recommended volume of bottom gas which is needed for safe ascent to the
first deco gas change depth or the surface. This procedure is called the "minimum gas" or "rock bottom"
consideration and it is used by various (but not all)
technical diving organizations. See the text below for a detailed explanation.
technical diving organisations. See the text below for a detailed explanation.
Now you can start the detailed time-depth planning of the dive. _Subsurface_ offers an unique
graphical interface for doing planning. The mechanics are
@ -4092,7 +3901,7 @@ Cylinders used for the plan need to be entered in the table of _Available gases_
_Type_ select the appropriate cylinder size by using the dropdown list that appears when
double-clicking a cell in this column. By default, a large number of sizes are listed,
and a new cylinder size can be created by typing this into the text box. The cylinder size, start pressure
and default switch depths are initialized automatically. Specify the gas composition
and default switch depths are initialised automatically. Specify the gas composition
(e.g. helium and oxygen content). A non-zero value in the "CC setpoint" column of the table of dive planner points
indicates a valid setpoint for oxygen partial pressure and that the segment
is dived using a closed circuit rebreather (CCR). If the last manually entered
@ -4183,7 +3992,7 @@ bottom gas used during the dive if it exactly follows the plan. the minimum gas
This indicates:
* Within parentheses, the _SAC factor_ and _Problem solving time_ specified.
* The number of liters of back gas required for a safe ascent (2130 liters in the example above)
* The number of liters of back gas required for a safe ascent (2130 litres in the example above)
* The number of bars of back gas required for a safe ascent (90 bars in the example above).
* The delta-value: number of bars of back gas available at the end of the bottom section of the dive, _over and above_ the minimum
gas requirement (80 bars in the above example). A positive delta reflects a safe plan; a negative delta indicates insufficient gas for a
@ -4299,12 +4108,6 @@ CCR dive, add a one-minute dive segment to the end with a setpoint value of 0. T
algorithm does not switch deco-gases automatically while in CCR mode (i.e. when a positive setpoint is specified) but
this is calculated for bail out ascents.
If you want the setpoint to change during the planned ascent at a specified depth, you can do this
using a "fake" cylinder that you add to the gas list: Give that cylinder a name of "SP 1.4" (or use
a different number) and set the "Deco switch value" to the depth at which you want to set the new
setpoint. This will make the planner stop at the specified depth and use the new setpoint from
there on.
The dive profile for a CCR dive may look something like the image below.
image::images/Planner_CCR.jpg["FIGURE: Planning a CCR dive: setup",align="center"]
@ -4409,7 +4212,7 @@ merged dive highlighted in the _Dive List_, switch
between the planned profile and the real-life profile using the right-arrow/left-arrow keyboard keys.
== Running _Subsurface_ from the command-line
_Subsurface_ can be launched from the command-line to set some specialized settings or as
_Subsurface_ can be launched from the command-line to set some specialised settings or as
part of an script-based automated process for manipulating a dive log. The format for launching _Subsurface_ from the
command-line is:
@ -4490,7 +4293,6 @@ dealing with the appropriate operations.
- <<S_ViewPanels,_Profile_>> - View only the *Dive Profile* panel.
- <<S_ViewPanels,_Info_>> - View only the *Notes* panel.
- <<S_ViewPanels,_Map_>> - View only the *World Map* panel.
- <<S_Stats,_Dive statistics_>> - Use the statistics tool.
- _Yearly Statistics_ - Display summary statistics about dives during this and past
years.
- _Prev DC_ - Switch to data from previous dive computer, if a single dive was logged from more than one.
@ -4505,6 +4307,8 @@ dealing with the appropriate operations.
on the https://subsurface-divelog.org/[_Subsurface_ web site].
- _User manual_ - Open a window showing this user manual.
== APPENDIX A: Operating system specific information for importing dive information from a dive computer.
=== Make sure that the OS has the required drivers installed
@ -4615,7 +4419,7 @@ verifies that
the appropriate group membership has been created. The +dialout+ group should
be listed
among the different IDs.
- Under some circumstances this change takes only effect (e.g. on Ubuntu) after
- Under some circumstances this change takes only effect (eg. on Ubuntu) after
you log out and then log in again.
With the appropriate device name (e.g. +dev/ttyUSB3+) and with write permission
@ -4864,24 +4668,7 @@ the download page for the ScubaPro SmartTrak software.
For Windows, IrDA is not available for Windows 10 and higher.
For the Apple Mac, IrDA communication via the MCS7780 link is not
available for OSX 10.6 or higher.
In addition the IrDA stack has been phased out in Linux. This is old technology and, even though it is currently more robust, fast and efficient than many other technologies such as Bluetooth, it is not fashionable. If IrDA communication is required for an operating system that does not support it, an easy solution is to run Subsurface in a virtual machine (VM) that contains support for IrDA. A VM (e.g. VMWare or vitualbox) can be installed on most modern operating systems. The only hardware setup required is to route the USB port of the host OS through to the guest OS.
****
*My desktop computer does not provide for infra-red (IrDA) communication*
[icon="images/icons/important.png"]
[IMPORTANT]
Many of the new desktop operation systems (e.g. Windows 10, Linux kernel 4.17 and newer) do not provide support for IrDA-based communication. The underlying kernel drivers for IrDA
are not provided any more because IrDA is an old technology, not well-maintained any more, thus creating problems on new operating systems such as Windows or Linux. However, in this case, do not stop using your Galileo or other IrDA-dependent dive computer. A way to solve this problem is to create a virtual machine on your desktop with a guest operating system that still does support IrDA. Your existing desktop acts as a host, with the IrDA-supporting operating system running as a guest on your host desktop. This is not a
complex task but is best done with the help of an IT support person. Virtualization software can be found for all desktop operating systems. In the Microsoft environment, Hyper-V allows virtual machines, as does Parallels on the Apple Mac: however these are proprietary software. VMware is probably the most sophisticated virtualization software, running on all operating systems, but it is also proprietary. Within the open source environment, VirtualBox is available free of
charge for most current operation systems. Older, potential guest operating systems with IrDA support include Windows 8 and Linux Ubuntu 18.04 LTS (Linux kernel 4.15 or older). Creating a virtual machine allows, for instance, Windows 8 to be run as a guest on
your Windows 10 (or later) machine. After installing Subsurface on the Windows 8 guest operating system, its IrDA facilities can be used to access an IrDA dongle plugged into the USB port of your Windows 10 (or later) host machine, allowing dive computers dependent on IrDA to download dive data to the guest operating system (Windows 8 in this case). Host and guest can share directories, which facilitates dive log transfer between the two systems.
The downside of this solution is that the guest operating system needs to be started specially for the IrDA-based download from a dive computer. Install a scaled down version of the guest operating system to minimize its demands on the host system.
****
In addition it is foreseen that the IrDA stack will be phased out in Linux. This is old technology and, even though it is currently more robust, fast and efficient than many other technologies such as Bluetooth, it is not fasionable. If IrDA communication is required for an operating system that does not support it, an easy solution is to run Subsurface in a virtual machine (VM) that contains support for IrDA. A VM (e.g. VMWare or vitualbox) can be installed on most modern operating systems. The only hardware setup required is to route the USB port of the host OS through to the guest OS.
[[S_ImportingDR5]]
=== Importing from Heinrichs Weikamp DR5
@ -5066,7 +4853,7 @@ C:\ProgramData\AtomicsAquatics\Cobalt-Logbook\Cobalt.db. This file can
be directly imported to Subsurface.
=== Exporting from Mares Dive Organizer V2.1
=== Exporting from Mares Dive Organiser V2.1
[[Mares_Export]]
[icon="images/icons/mareslogo.jpg"]
@ -5190,7 +4977,8 @@ explained on the section xref:S_ImportingCSVDives[Importing CSV dives].
== APPENDIX E: Writing a custom print template
_Subsurface_ has a way to create or modify templates for printing dive logs to
produce customized printouts of them. Templates written in HTML are rendered to the print device by _Subsurface_.
produce customized printouts of them. Templates written in HTML, as well as a simple
Grantlee instruction set, are rendered to the print device by _Subsurface_.
Templates are accessed using the print dialog (see image *B* below).
@ -5213,11 +5001,14 @@ image::images/Template1_f22.jpg["FIGURE: template edit dialog",align="center"]
customizable: the _Edit_ buttons in the _Colors_ tab allows choosing arbitrary colors for different
components of the dive log printout.
3) The _Template_ tab of the Edit Panel (see image below) allows creating a template using HTML. The HTML of the
template can be edited and saved. The saved template is stored in the same directory as the dive being processed.
By default, a _Custom_ template is a skeleton with no specific print instructions. The information printed needs to
be specified and formatted in the template by replacing the section marked with:
"<!-- Template must be filled -->".
3) The _Template_ tab of the Edit Panel (see image below) allows creating a template using HTML as well as a few
Grantlee programming primitives. Grantlee can create and format HTML code in
a highly simple but efficient way (see below). The HTML of the template can be edited and saved. The saved
template is stored in the same directory as the dive being processed. By default, a _Custom_
template is a skeleton with no specific print instructions. The information printed
needs to be specified and formatted in the template by replacing the section marked with:
"<!-- Template must be filled -->". Writing HTML code with Grantlee instructions allows unlimited
freedom in determining what is printed and in which way it should be rendered.
image::images/Template2_f22.jpg["FIGURE:Template tab",align="center"]
@ -5228,8 +5019,7 @@ dialog to save the new template using a new template name.
To write a custom template, the following elements must exist so the template will be correctly handled and rendered.
=== Main dive loop
_Subsurface_ exports a dive list called (*dives*) as well as a list of cylinders called (*cylinderObjects*) to the back end. It is
possible to iterate over the list as follows:
_Subsurface_ exports a dive list called (*dives*) to the _Grantlee_ back end. It is possible to iterate over the list as follows:
.template.html
....
{% for dive in dives %}
@ -5244,40 +5034,33 @@ possible to iterate over the list as follows:
<h1> 3 </h1>
....
=== Exported dive variables
Additional information about _Grantlee_ can be found http://www.grantlee.org/apidox/for_themers.html[here]
=== Grantlee exported variables
Only a subset of the dive data is exported:
|====================
|*Name*|*Description*
|number| (*int*) dive number
|id| (*int*) unique dive ID, should be used to fetch the dive profile
|rating| (*int*) dive rating which ranges from 0 to 5
|visibility| (*int*) dive visibility which ranges from 0 to 5
|wavesize| (*int*) wave size during the dive which ranges from 0 to 5
|current| (*int*) current during the dive which ranges from 0 to 5
|surge| (*int*) surge during the dive which ranges from 0 to 5
|chill| (*int*) chill during the dive which ranges from 0 to 5
|date| (*string*) date of the dive
|time| (*string*) time of the dive
|location| (*string*) location of the dive
|gps| (*string*) GPS coordinates of the dive
|gps_decimal| (*string*) GPS coordinates of the dive in decimal format
|duration| (*string*) duration of the dive
|depth| (*string*) depth of the dive
|meandepth| (*string*) mean depth of the dive
|divemaster| (*string*) divemaster for the dive
|diveguide| (*string*) dive guide for the dive
|buddy| (*string*) buddy for the dive
|airTemp| (*string*) air temperature of the dive
|waterTemp| (*string*) water temperature of the dive
|notes| (*string*) dive notes
|rating| (*int*) dive rating which ranges from 0 to 5
|sac| (*string*) SAC value for the dive
|tags| (*string*) list of dive tags for the dive
|gas| (*string*) list of gases used in the dive
|sac| (*string*) SAC value for the dive
|weights| (*string*) complete information of all used weight systems
|weight0-5| (*string*) information about a specific weight system
|suit| (*string*) the suit used for the dive
|cylinders| (*string*) complete information of all used cylinders
|cylinder0-7| (*string*) information about a specific cylinder
|weights| (*string*) complete information of all used weight systems
|weight0-5| (*string*) information about a specific weight system
|maxcns| (*string*) maxCNS value for the dive
|otu| (*string*) OTU value for the dive
|sumWeight| (*string*) the summed weight of all used weight systems
@ -5288,22 +5071,6 @@ Only a subset of the dive data is exported:
|waterType| (*string*) the type of the water for the dive
|=====================
=== Exported cylinder object variables
Only a subset of the cylinder data is exported:
|====================
|*Name*|*Description*
|description| (*string*) cylinder description
|size| (*string*) cylinder size
|workingPressure| (*string*) cylinder working pressure
|startPressure| (*string*) start pressure of cylinder
|endPressure| (*string*) end pressure of cylinder
|gasMix| (*string*) gas mix of cylinder
|gasO2| (*int*) oxygen percentage of gas mix
|gasHe| (*int*) helium percentage of gas mix
|gasN2| (*int*) nitrogen percentage of gas mix
|=====================
Please note that some of the variables like 'notes' need to be extended with '|safe' to support HTML tags:
....
<p> {{ dive.notes|safe }} </p>
@ -5400,7 +5167,7 @@ IMPORTANT: All CSS units should be in relative lengths only, to support printing
In handling video associated with dives, _Subsurface_ needs to create a thumbnail for each video that can be shown
either on the dive profile or in the _Media_ tab. By default this is a nonspecific placeholder thumbnail.
To see thumbnails that represent individual videos, _Subsurface_ uses an external program called _FFmpeg_.
To see thumbnails that represent individual videos, _Subsurface_ uses an external program calle _FFmpeg_.
To create thumbnails for videos, do two things:
1. Install _FFmpeg_ on the computer that runs _Subsurface_. The program can be downloaded from the FFmpeg web site:
@ -5472,7 +5239,7 @@ Remember: one ATM is ~1.013 bar, so without the compressibility, your gas use is
which is about 1445, not 1464. So there was 19 l too much in your simple
calculation that ignored the difference between 1 bar and one ATM.
The compressibility does show up above 200 bar, and takes that 1445 down
about eight liters more, so you really did use only about 1437 l of air at surface pressure.
about eight litres more, so you really did use only about 1437 l of air at surface pressure.
So be happy: your SAC really is better than your calculations indicated.
Or be sad: your cylinder contains less air than you thought it did.
@ -5489,7 +5256,7 @@ _Subsurface_ ends up ignoring surface time for many things (average depth, divet
but then come back up and wait five minutes for your buddies, your dive computer may say
that your dive is 50 minutes long - because you have fifty minutes worth of samples - but
subsurface will say it's 45 minutes - because you were actually diving for 45 minutes.
It's even more noticeable if you do things like guiding the initial OW dives, when
It's even more noticeable if you do things like divemastering the initial OW dives, when
you may stay in the water for a long time, but spend most of it at the surface. And then
you don't want that to count as some kind of long dive”.

View File

@ -4,7 +4,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 10.1.2" />
<meta name="generator" content="AsciiDoc 8.6.10" />
<title></title>
<style type="text/css">
/*
@ -17,7 +17,7 @@
*/
* { padding: 0; margin: 0; }
img { border: 0; margin: 15px; max-width:90% }
img { border: 0; }
/*** Layout ***/
@ -78,12 +78,12 @@ body { font-family: Verdana, sans-serif; }
#footer { font-size: 0.8em; }
h2, h3, h4, h5, .title { font-family: Arial, sans-serif; }
h2 { font-size: 160%; }
h2 { font-size: 1.5em; }
.sectionbody { font-size: 0.85em; }
.sectionbody .sectionbody { font-size: inherit; }
h3 { font-size: 150%; } /* 1.35em */
h4 { font-size: 140%; } /* 1.2em */
h5 { font-size: 130%; } /* 1em */
h3 { font-size: 159%; } /* 1.35em */
h4 { font-size: 141%; } /* 1.2em */
h5 { font-size: 118%; } /* 1em */
.title { font-size: 106%; /* 0.9em */
font-weight: bold;
}
@ -446,7 +446,7 @@ asciidoc.install(3);
<div class="paragraph"><p><strong>Autores</strong>: Willem Ferguson, Jacco van Koll, Dirk Hohndel, Reinout Hoornweg,
Linus Torvalds, Miika Turkia, Amit Chaudhuri, Jan Schubert, Salvador Cuñat,
Pedro Neves, Stefan Fuchs</p></div>
<div class="paragraph"><p><span class="BLUE"><em>Versión 4.9, Febrero 2019</em></span></p></div>
<div class="paragraph"><p><span class="BLUE"><em>Versión 4.8, Septiembre 2018</em></span></p></div>
<div class="paragraph"><p>Bienvenido como usuario de <em>Subsurface</em>, un avanzado programa de registro de
inmersiones con extensa infraestructura para describir, organizar e
interpretar buceos en apnea o con botella. <em>Subsurface</em> ofrece muchas ventajas
@ -515,9 +515,9 @@ y libdivecomputer.</p></div>
el software, consulta la página Descargas en <a href="https://subsurface-divelog.org/">la
web</a>. Por favor, comenta los problemas que tengas con este programa enviando un
mail a <a href="mailto:subsurface@subsurface-divelog.org">nuestra lista de correo</a> e informa de
fallos en <a href="https://github.com/Subsurface/subsurface/issues">nuestro bugtracker</a>.
fallos en <a href="https://github.com/Subsurface-divelog/subsurface/issues">nuestro bugtracker</a>.
Para instrucciones acerca de como compilar el software y (en caso necesario)
sus dependencias, por favor, consulta el archivo INSTALL.md incluido con el código
sus dependencias, por favor, consulta el archivo INSTALL incluido con el código
fuente.</p></div>
<div class="paragraph"><p><strong>Audiencia</strong>: Buceadores recreativos, Buceadores en apnea, Buceadores técnicos,
Buceadores profesionales.</p></div>
@ -591,7 +591,7 @@ se puede hacer lanzando <em>Subsurface</em> desde la línea de comandos con la o
<h2 id="S_StartUsing">3. Empezar a usar el programa</h2>
<div class="sectionbody">
<div class="paragraph"><p>La ventana <em>Subsurface</em> está, habitualmente, dividida en cuatro paneles con un
<strong>Menú principal</strong> (Archivo Importar Registro Vista Ayuda) en la parte
<strong>Menú principal</strong> (Archivo Importar Registro Vista Compartir Ayuda) en la parte
superior (en Windows y Linux) o en la parte superior de la pantalla (en Mac y
Ubuntu Unity). Los cuatro paneles son:</p></div>
<div class="olist arabic"><ol class="arabic">
@ -642,7 +642,7 @@ temperaturas del agua, consumos de gases; el tiempo total y el número de
inmersiones seleccionadas).</p></div>
<div class="imageblock" id="S_ViewPanels" style="text-align:center;">
<div class="content">
<img src="images/MainWindow.jpg" alt="La ventana principal" />
<img src="images/main_window_f22.jpg" alt="La ventana principal" />
</div>
</div>
<div class="paragraph"><p>El usuario puede elegir cual de los cuatro paneles se mostrará seleccionando la
@ -906,19 +906,6 @@ El desplegable <strong>Dispositivo o punto de montaje</strong> contiene el nombr
para detalles técnicos de como encontrar la información apropiada sobre
puertos, para un ordenador en concreto y, en algunos casos, como hacer los
ajustes correctos al Sistema Operativo del ordenador que ejecuta <em>Subsurface</em>.
Algunos ordenadores de buceo desactivan este desplegable ya que usan otras
formas de conectar con el dispositivo. Para algunos ordenadores, el dato
introducido aquí es en realidad el punto de montaje del dispositivo de
almacenamiento USB con el que el ordenador de buceo se identifica a sí
mismo.
</p>
</li>
<li>
<p>
Bajo los desplegables hay hasta cuatro botones que te permiten cambiar
fácilmente entre varios ordenadores desde los que descargues
frecuentemente. Estos botones solo aparecen después de que hayas descargado
desde diferentes ordenadores de buceo.
</p>
</li>
<li>
@ -1220,19 +1207,6 @@ de descarga _Bluetooth</em>.</p></div>
<td class="icon">
<img src="images/icons/important.png" alt="Important" />
</td>
<td class="content">El soporte de Subsurface en Windows para ordenadores de buceo BTLE es
<strong>EXPERIMENTAL</strong> y solo está soportado en Windows10.
Por favor, asegúrate de tener la última versión de Windows10.
<a href="https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1803_(April_2018_Update)">La
versión 1803</a> is el requerimiento mínimo. Asegúrate también de tener
instalados los últimos drivers para tu placa base o receptor BTLE.</td>
</tr></table>
</div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<img src="images/icons/important.png" alt="Important" />
</td>
<td class="content"><strong>EN CASO DE PROBLEMAS</strong>: Si el adaptador Bluetooth del ordenador con <em>Subsurface</em>
se cuelga y el proceso de descarga falla repetidamente, <em>desempareja</em> los
dispositivos y repite los pasos indicados anteriormente. Si a pesar de ello
@ -1315,14 +1289,13 @@ aire ya que el cambio en la lectura del sensor de temperatura es bastante lento
para seguir los cambios en el entorno. Si fuera necesario, no hay que teclear
las unidades de temperatura: <em>Subsurface</em> las suministra automáticamente de
acuerdo con las <em>Preferencias</em> (métricas o imperiales).</p></div>
<div class="paragraph" id="S_locations"><p><strong>Ubicación</strong>:</p></div>
<div class="paragraph"><p><strong>Ubicación</strong>:</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<img src="images/icons/warning2.png" alt="Warning" />
</td>
<td class="content">Las localizaciones de buceo se gestionan como una parte <strong>separada</strong> del divelog
(Visita la sección llamada <a href="#S_DiveSiteManagement">Manipular información de puntos de buceo</a>).
<td class="content">Las localizaciones de buceo se gestionan como una parte <strong>separada</strong> del divelog.
La información de buceo de las pestañas <strong>Notas</strong> y <strong>Equipo</strong> no se puede editar
al mismo tiempo que la información de los puntos de buceo. Guarda toda la otra
información (p.e. divemaster, compañero, equipo, etc) seleccionando <em>Aplicar
@ -1773,24 +1746,9 @@ diarios de CCR APD.
</p>
</li>
</ul></div>
<div class="paragraph"><p>Selecciona el formato correspondiente en la lista del diálogo y el archivo de
la lista de la ventana principal. Luego haz clic en el botón _Abrir_abajo a la
derecha.</p></div>
<div class="paragraph"><p>Si el archivo que se está importando está en formato CSV, se da al usuario la
ocasión de efectuar ediciones manuales en las cabeceras de las columnas antes
de importarlas a <em>Subsurface</em> (ver imagen a continuación).</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/Import_csv.jpg" alt="FIGURA: Diálogo de importación: paso 2" />
</div>
</div>
<div class="paragraph"><p>Para más información sobre como configurar la importación CSV, visita
<a href="#S_ImportingCSVDives">Importar datos en formato CSV</a>.
En muchos casos no se requiere hacer cambios en las cabeceras de las columnas
porque están pre configuradas para el tipo de importación en concreto y la
pantalla de importación CSV se puede saltar pulsando el botón <em>OK</em>.
Esto abrirá el divelog importado en la <strong>Lista de inmersiones</strong> de <em>Subsurface</em>.</p></div>
<div class="paragraph"><p>También están soportados algunos otros formatos, no accesibles desde el diálogo
<div class="paragraph"><p>Seleccionar el archivo correspondiente en la lista del diálogo abre el archivo
importado directamente en la <strong>Lista de Inmersiones</strong> de <em>Subsurface</em>. También
están soportados algunos otros formatos, no accesibles desde el diálogo
Importar, como se explica a continuación.</p></div>
</div>
<div class="sect3">
@ -2186,126 +2144,7 @@ asegurarse de que el resto funciona.</p></div>
</div>
</div>
<div class="sect2">
<h3 id="S_DiveSiteManagement">5.4. Manipular la información de puntos de buceo</h3>
<div class="paragraph"><p>La información de los puntos de buceo se gestiona como una entidad separada de
la información de la inmersión.
Al seleccionar la pestaña llamada "Puntos de buceo" en el panel <strong>Notas</strong>,
aparecerá el <em>panel de gestión de puntos de inmersión</em> (ver imagen a
continuación). Asignar un punto de buceo a una inmersión se hace desde la
pestaña Notas que muestra la información de la inmersión (visita la sección
<a href="#S_locations">Ubicaciones</a>). Por otra parte, el panel de gestión de puntos
de buceo permite manejar datos independientes de las inmersiones. Un punto de
buceo nuevo se puede crear mientras se edita una inmersión o bien desde el
panel de gestión de puntos de buceo (ver imagen a continuación).</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/DiveSitesTab.jpg" alt="FIGURE: Pestaña puntos de buceo" />
</div>
</div>
<div class="paragraph"><p>Si se ha creado previamente la descripción de un punto de buceo, este se
mostrará en el panel, así como el número de inmersiones en cada punto. La
lista de puntos puede ordenarse haciendo clic en cualquiera de los
encabezamientos. A la derecha de cada punto de buceo hay un icono de papelera
y otro de edición, Se pueden efectuar las siguientes acciones para gestionar
la colección de puntos de buceo:</p></div>
<div class="sect3">
<h4 id="_filtrar_la_lista_de_puntos_de_inmersion">5.4.1. Filtrar la lista de puntos de inmersión</h4>
<div class="paragraph"><p>Arriba a la derecha en el panel hay una casilla de texto (ver imanterior). Si
solo quieres visualizar inmersiones de un punto en concreto, teclea un nombre
parcial como "Genova", así se mostrarán solo los nombres que contengan la
palabra "Genova" en el nombre o la descripción.</p></div>
</div>
<div class="sect3">
<h4 id="_editar_un_punto_de_buceo">5.4.2. Editar un punto de buceo</h4>
<div class="paragraph"><p>La información de cada punto de buceo puede editarse, bien desde la pestaña
<strong>Notas</strong>, bien desde la pestaña <strong>Puntos de buceo</strong>. Para editar la información,
selecciona el icono Editar de la izquierda del nombre del punto de buceo (ver
imagen anterior). La edición desde la pestaña <strong>Notas</strong> se comenta en la sección
<a href="#S_locations">Ubicaciones</a> donde se explica cada uno de los campos del
panel de edición.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/DiveSiteEdit.jpg" alt="FIGURA: Edición de puntos de buceo" />
</div>
</div>
<div class="paragraph"><p>Añade cualquier información que desees en la pestaña. Como editar las
coordenadas se explica en la sección sobre <a href="#S_locations">Ubicaciones</a>.
Cuando termines de editar la información del punto de inmersión, selecciona el
botón <strong>Terminado</strong> en la parte de arriba. Esto te devolverá al panel de gestión
de puntos de buceo.</p></div>
</div>
<div class="sect3">
<h4 id="_mezclar_puntos_de_inmersion">5.4.3. Mezclar puntos de inmersión</h4>
<div class="paragraph"><p>Mezclar dos o más puntos de inmersión se consigue desde el panel de edición de
puntos de buceo (ver imagen anterior). Asumimos que los puntos que se están
mezclando no están a mucha distancia. La mezcla se efectúa seleccionando un
punto y luego mezclando otros con este primero. En la parte superior del panel
de edición, selecciona la casilla de texto etiquetada "Mostrar los puntos de
buceo en el rango:" e introduce la distancia que consideres oportuna para
considerar que los diversos puntos son el mismo.
Se te presentará una lista con los puntos en el radio que hayas introducido
(ver imaden a continuación).</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/DiveSiteMerge.jpg" alt="FIGURA: Mezcla de puntos de buceo" />
</div>
</div>
<div class="paragraph"><p>Selecciona el punto a mezclar haciendo clic derecho sobre él. Se mostrará un
mensaje de confirmación (ver imagen anterior). Al aceptar el mensaje de
confirmación se mezcla la inmersión seleccionada con la de arriba del panel y
se regresa al panel de gestión de puntos de buceo.</p></div>
</div>
<div class="sect3">
<h4 id="_anadir_un_punto_de_buceo">5.4.4. Añadir un punto de buceo</h4>
<div class="paragraph"><p>En la parte alta de la tabla de gestión de puntos de buceo hay un botón
redondo con un "+". Haciendo clic en este botón se inserta un nuevo punto de
buceo llamado "Nuevo punto de buceo" (imagen a continuación). El nuevo punto
puede borrarse si nos hubiéramos equivocado seleccionando <em>Editar &#8594; Deshacer</em>
en el menú principal o tecleando Ctrl-Z mientras mantenemos enfocada la tabla
de gestión de puntos de buceo. El punto nuevo se edita seleccionando su botón
de edición y proporcionando un nombre, coordenadas y, si se desea, una
descripción. Al pulsar el botón "Terminado" en el panel de edición se regresa
a al panel de gestión de puntos de buceo.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/DiveSiteInsert.jpg" alt="FIGURA: Añadir un punto de buceo" />
</div>
</div>
</div>
<div class="sect3">
<h4 id="_borrar_un_punto_de_inmersion">5.4.5. Borrar un punto de inmersión</h4>
<div class="paragraph"><p>A la izquierda de cada punto de buceo hay una papelera. Pulsar este icono
borrará el punto de buceo asociado. Si hay varias inmersiones asociadas a este
punto, se mostrará un mensaje de aviso (ver imagen a continuación). Si el
punto se borra, será necesario crear ubicaciones para las inmersiones que
estuvieran asociadas al punto borrado.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/DiveSiteDelete.jpg" alt="FIGURA: Borrar un punto de buceo" />
</div>
</div>
</div>
<div class="sect3">
<h4 id="_aproximacion_general_al_uso_de_la_lista_de_puntos_de_buceo">5.4.6. Aproximación general al uso de la lista de puntos de buceo</h4>
<div class="paragraph"><p>Ya que la lista de puntos de buceo se gestiona separadamente de la lista de
inmersiones, es posible añadir puntos de buceo aunque no se hayan utilizado en
ninguna inmersión. En este caso, la columna etiquetada "# de buceos" muestra
un cero.
Esto posibilita que los buceadores que comparten puntos de buceo puedan
crearlos antes de haberlos buceado. Además, un punto puede crearse con
mucha información en la descripción, de esta forma la lista de puntos de buceo
se convierte en un útil repositorio de información fuera de la lista de
inmersiones.</p></div>
</div>
<div class="sect3">
<h4 id="_borrar_puntos_de_buceo_no_utilizados">5.4.7. Borrar puntos de buceo no utilizados</h4>
<div class="paragraph"><p>Arriba a la izquierda en el panel de gestión de inmersiones hay un botón
"Purgar puntos de buceo no usados". Al pulsar este botón se borran todos los
puntos de buceo que no tengan inmersiones asociadas.</p></div>
</div>
</div>
<div class="sect2">
<h3 id="_importar_coordenadas_de_buceo_desde_un_dispositivo_movil_con_gps">5.5. Importar coordenadas de buceo desde un dispositivo movil con GPS</h3>
<h3 id="_importar_coordenadas_de_buceo_desde_un_dispositivo_movil_con_gps">5.4. Importar coordenadas de buceo desde un dispositivo movil con GPS</h3>
<div class="paragraph"><p>Un smartphone con GPS incorporado puede utilizarse para guardar las
ubicaciones de las inmersiones. Esto se hace como sigue:</p></div>
<div class="paragraph"><p>1) Llevar el dispositivo móvil en el barco de buceo o vida abordo, para
@ -2322,7 +2161,7 @@ El antiguo servicio de posiciones GPS en internet se cerrará a finales de 2018
y a partir de ese momento, la app <em>Companion</em> ya no se podrá utilizar. Por
favor, usa la app <em>Subsurface-mobile</em> en su lugar.</p></div>
<div class="sect3">
<h4 id="_guardar_y_utilizar_coordenadas_gps_utilizando_em_subsurface_mobile_em">5.5.1. Guardar y utilizar coordenadas GPS utilizando <em>Subsurface-mobile</em></h4>
<h4 id="_guardar_y_utilizar_coordenadas_gps_utilizando_em_subsurface_mobile_em">5.4.1. Guardar y utilizar coordenadas GPS utilizando <em>Subsurface-mobile</em></h4>
<div class="sect4">
<h5 id="_instalar_em_subsurface_mobile_em">Instalar <em>Subsurface-mobile</em></h5>
<div class="paragraph"><p>Busca <em>Subsurface-mobile</em> en Google Play e instálala en el dispositivo
@ -2406,7 +2245,7 @@ recogida, subida, gestión y sincronizado de estas información.</p></div>
</div>
</div>
<div class="sect2">
<h3 id="S_LoadImage">5.6. Añadir fotografías o vídeos a las inmersiones</h3>
<h3 id="S_LoadImage">5.5. Añadir fotografías o vídeos a las inmersiones</h3>
<div class="paragraph"><p>Muchos buceadores (si no la mayoría) toman fotografías o vídeos durante sus
inmersiones. LLamaremos a estos archivos "medios" refiriendonos a fotos o
vídeos.
@ -2416,7 +2255,7 @@ donde se tomaron. Los medios pueden visualizarse desde el perfil o desde la
pestaña <em>Medios</em> en el <strong>Panel de Notas</strong>. <em>Subsurface</em> permite visualizar las
fotos o vídeos en un interfaz unificado.</p></div>
<div class="sect3">
<h4 id="_cargar_medios_y_sincronizar_la_camara_con_el_ordenador_de_buceo">5.6.1. Cargar medios y sincronizar la cámara con el ordenador de buceo</h4>
<h4 id="_cargar_medios_y_sincronizar_la_camara_con_el_ordenador_de_buceo">5.5.1. Cargar medios y sincronizar la cámara con el ordenador de buceo</h4>
<div class="paragraph"><p>Se selecciona una inmersión o un grupo de ellas en la lista. Luego se hace
clic-derecho en la selección lo que nos mostrará el <a href="#S_DiveListContextMenu">Menú contextual de la lista de inmersiones</a>.
Hacemos click-izquierdo en la opción apropiada para cargar los medios desde
@ -2503,7 +2342,7 @@ que todas las fotos o videos asociados con un buceo puedan visualizarse,
incluidos los que se hayan tomado antes o despues de la inmersión.</p></div>
</div>
<div class="sect3">
<h4 id="S_ViewMedia">5.6.2. Visualizar los medios</h4>
<h4 id="S_ViewMedia">5.5.2. Visualizar los medios</h4>
<div class="sidebarblock">
<div class="content">
<div class="paragraph"><p><strong>Asegurarse de que se crean las miniaturas para los archivos de vídeo</strong></p></div>
@ -2583,7 +2422,7 @@ sobre las imágenes. Las imágenes también puede borrase desde la pestaña
</div>
</div>
<div class="sect3">
<h4 id="_la_pestana_em_medios_em">5.6.3. La pestaña <em>Medios</em></h4>
<h4 id="_la_pestana_em_medios_em">5.5.3. La pestaña <em>Medios</em></h4>
<div class="paragraph"><p>Los medios asociados a una inmersión se muestran como miniaturas en la
pestaña <em>Medios</em> del <em>Panel de Notas</em>. Se puede acceder con facilidad a las
fotos hechas en rápida sucesión durante la inmersión, desde la pestaña <em>Medios</em>.
@ -2598,22 +2437,9 @@ video superpuesto a la ventana de <em>Subsurface</em>. Podemos borrar un medio d
la pestaña <em>Medios</em> seleccionándolo (un solo clic) y pulsando a continuación la
tecla <em>Supr</em> en el teclado. Esto eliminará el medio tanto de la pestaña
<em>Medios</em> como del <em>Perfil de la inmersión</em>.</p></div>
<div class="paragraph"><p>Haciendo clic derecho en un vídeo y seleccionando "Guardar datos como
subtitulos", se creará un archivo con el mismo nombre que el vídeo y con
extensión ".ass" que contendrá datos de la inmersión en función del tiempo
(tiempo transcurrido, profundidad, temperatura, LND, TTS, y GF) que se
superpondrán al vídeo. El reproductor de medios VLC encuentra automáticamente
este archivo y lo utiliza al reproducir un vídeo. Como alternativa, puede
utilizarse el codificador de vídeo ffmpeg para crear un nuevo archivo de vídeo
con los datos codificados en él. Para ello, ejecuta</p></div>
<div class="literalblock">
<div class="content">
<pre><code>ffmpeg -v video.mp4 -vf "ass=video.ass" video_with_data.mp4</code></pre>
</div></div>
<div class="paragraph"><p>desde la línea de comandos. Es necesario tener instalada la librería libass,</p></div>
</div>
<div class="sect3">
<h4 id="_fotos_en_disco_duro_externo">5.6.4. Fotos en disco duro externo</h4>
<h4 id="_fotos_en_disco_duro_externo">5.5.4. Fotos en disco duro externo</h4>
<div class="paragraph"><p>La mayoría de fotosubs guardan sus fotografías en un disco duro externo. Si este
disco puede mapearse (como es casi siempre el caso) <em>Subsurface</em> puede acceder
directamente a los medios. Esto facilita la interacción entre <em>Subsurface</em> y un
@ -2628,7 +2454,7 @@ Si, posteriormente, el disco externo con los medios se vuelve a conectar, los
medios podrán visualizarse normalmente.</p></div>
</div>
<div class="sect3">
<h4 id="_averiguar_que_inmersiones_tienen_medios_asociados">5.6.5. Averiguar que inmersiones tienen medios asociados</h4>
<h4 id="_averiguar_que_inmersiones_tienen_medios_asociados">5.5.5. Averiguar que inmersiones tienen medios asociados</h4>
<div class="paragraph"><p>Inspeccionar cada inmersión individual para saber si tiene asociados medios
puede llevarnos mucho tiempo. Hay una forma rápida de saber que inmersiones
tiene asociados medios y cuales no: activa la casilla <em>Medios</em> en la lista
@ -2639,7 +2465,7 @@ después o todo ello. Hay más información en la sección del manual que cubre
los <a href="#S_Divelist_columns">iconos de fotos en la <strong>Lista de Inmersiones</strong></a>.</p></div>
</div>
<div class="sect3">
<h4 id="S_FindMovedImages">5.6.6. Mover medios entre directorios, discos duros u ordenadores</h4>
<h4 id="S_FindMovedImages">5.5.6. Mover medios entre directorios, discos duros u ordenadores</h4>
<div class="paragraph"><p>Tras haber cargado un medio en <em>subsurface</em> y haberlo asociado a un buceo
determinado, se archiva el directorio donde el archivo permanece guardado, para poder
encontrarlo cuando se vuelva a abrir la inmersión. Si la foto, la colección
@ -2672,11 +2498,11 @@ sus posiciones conocidas. Los cambios propuestos pueden aplicarse clicando en
</div>
</div>
<div class="sect2">
<h3 id="_registrar_tipos_de_inmersion_especiales">5.7. Registrar tipos de inmersión especiales</h3>
<h3 id="_registrar_tipos_de_inmersion_especiales">5.6. Registrar tipos de inmersión especiales</h3>
<div class="paragraph"><p>Esta sección da ejemplos de la verstilidad de <em>Subsurface</em> como herramienta de
registro de inmersiones.</p></div>
<div class="sect3">
<h4 id="S_MulticylinderDives">5.7.1. Inmersiones multi botella</h4>
<h4 id="S_MulticylinderDives">5.6.1. Inmersiones multi botella</h4>
<div class="paragraph"><p><em>Subsurface</em> maneja fácilmente inmersiones que requieren más de una botella. El
buceo multi botella se produce habitualmente cuando (a) un buceador no tiene
bastante gas para completar una inmersión con una sola botella o (b) cuando el
@ -2746,7 +2572,7 @@ en lateral (en las que utilicen dos botellas). Visita el link
de ordenadores de buceo soportados</a>.</p></div>
</div>
<div class="sect3">
<h4 id="_inmersiones_en_montaje_lateral_sidemount">5.7.2. Inmersiones en montaje lateral (sidemount)</h4>
<h4 id="_inmersiones_en_montaje_lateral_sidemount">5.6.2. Inmersiones en montaje lateral (sidemount)</h4>
<div class="paragraph"><p>El buceo en montaje lateral es solo otra forma de buceo multi botella, a menudo
con ambas o todas las botellas conteniendo la misma mezcla. Aunque es una
configuración popular entre los espeleo buceadores, el buceo en lateral se
@ -2802,7 +2628,7 @@ exactamente como con las inmersiones multi botella anteriores:</p></div>
</div>
</div>
<div class="sect3">
<h4 id="S_sSCR_dives">5.7.3. Inmersiones con rebreather pasivo de circuito semi cerrado (pSCR)</h4>
<h4 id="S_sSCR_dives">5.6.3. Inmersiones con rebreather pasivo de circuito semi cerrado (pSCR)</h4>
<div class="admonitionblock">
<table><tr>
<td class="icon">
@ -2901,7 +2727,7 @@ naranja).</td>
</div>
</div>
<div class="sect3">
<h4 id="S_CCR_dives">5.7.4. Inmersiones con rebreather de circuito cerrado (CCR)</h4>
<h4 id="S_CCR_dives">5.6.4. Inmersiones con rebreather de circuito cerrado (CCR)</h4>
<div class="admonitionblock">
<table><tr>
<td class="icon">
@ -3312,13 +3138,10 @@ Entre ellas se incluyen: Momento de tiempo en la inmersión (indicado por un
ascenso y descenso, el Consumo de aire en superficie (CAS), la presión
parcial de oxigeno, la profundidad máxima operativa de la mezcla (POM o MOD),
la profundidad equivalente a aire (PEA o EAD), la profundidad narcótica equivalente
(PNE o END), la profundidad equivalente a la densidad del aire (EADD), los
requisitos descompresivos en ese instante de tiempo (Deco), el GF en
superficie (una medida de la carga de gas inerte en el cuerpo del buzo
definida como el exceso sobre la presión en superficie normalizada tal que la
la presión máxima permitida en superficie, el valor M, corresponde al 100%), el
Tiempo hasta la superficie (TTS), el techo calculado así como el techo
calculado para varios compartimentos de tejidos de Bühlmann.</p></div>
(PNE o END), la profundidad equivalenta a la densidad del aire (EADD), los
requisitos descompresivos en ese instante de tiempo (Deco), el Tiempo hasta la
superficie (TTS), el techo calculado así como el techo calculado para varios
compartimentos de tejidos de Bühlmann.</p></div>
<div class="paragraph"><p>El usuario tiene control sobre varios de los datos que se muestran en la Caja
de Información, mostrados como cuatro de los botones en la columna a la
izquierda del panel del perfil. Estos son:</p></div>
@ -3359,19 +3182,6 @@ Los TTS mayores a 2 horas resultan muy imprecisos y Subsurface solo indicará
<div class="admonitionblock">
<table><tr>
<td class="icon">
<img src="images/icons/GFLow.jpg" alt="Note" />
</td>
<td class="content">Muestra información de deco. Si está activado, la caja de información muestra
el GF en superficie y los techos para los compartimentos de tejidos
individuales. El GF en superficie es un indicador de hasta que punto la
presión parcial de nitrógeno en la sangre excede la presión parcial que se
necesita para llegar a superficie con seguridad. Un GF en superficie superior
al 100% significa que emerger no es seguro.</td>
</tr></table>
</div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<img src="images/icons/SAC.jpg" alt="Note" />
</td>
<td class="content">Pulsar en este botón hace que se muestre en la Caja de Información el
@ -3671,13 +3481,6 @@ ha eliminado a través de la respiración por lo que, aunque el buceador
técnicamente encontrara un techo, la inmersión aún no requiere explícitamente
una parada de descompresión. Esta característica permite a los ordenadores de
buceo ofrecer tiempos de fondo más largos.</p></div>
<div class="paragraph"><p>Estríctamente hablando, el techo verde calculado es solo una representación directa
de las cargas de gas inerte de los tejidos simulados y es independiente de
cualquier velocidad de ascenso asumida. Indica la profundidad mínima permitida
por el modelo de descompresión en ese instante de tiempo para unas cargas de
gas determinadas y no es una afirmación acerca de una posible tabla de ascenso
para el resto de la inmersión. Para obtener esta última utiliza la opción
"Editar inmersión en el Planificador_" en el menú Registro.</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
@ -3909,87 +3712,6 @@ un marcador preexistente, el menú se extiende añadiendo opciones para permitir
el borrado del marcador o permitir ocultar todos los marcadores de ese tipo.</p></div>
</div>
</div>
<div class="sect2">
<h3 id="S_Filter">6.5. Filtrar la lista de inmersiones</h3>
<div class="paragraph"><p>Los buceos de la <strong>Lista de Inmersiones</strong> se pueden filtrar seleccionando solo
algunos de ellos basándonos en atributos como etiquetas, puntos de buceo,
compañero o divemaster. Por ejemplo, el filtrado nos permite ver las
inmersiones de un año en concreto en cierto punto de buceo, o, por otro lado,
las inmersiones en cuevas con determinado compañero. El filtrado puede hacerse
en base a cualquier dato del <em>Panel de Información</em>.</p></div>
<div class="paragraph"><p>Para abrir el filtro, seleccionamos <em>Registro &#8594; Filtrar lista de inmersiones</em>
desde el menú principal. Esto reemplazará el <em>Panel Mapa</em> por el <em>Panel
Filtro</em>. La barra superior contiene el número de buceos que satisfacen las
selecciones efectuadas en el filtro (ver imagen a continuación).</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/FilterWindowBar.jpg" alt="Figura: Barra de la ventana de filtrado" />
</div>
</div>
<div class="paragraph"><p>Al abrirse, el filtro contiene valores por defecto que incluyen todas los
buceos de la <em>Lista de Inmersiones</em>. Fíltrala cambiando algunos de los valores
por defecto del panel o tecleando valores concretos o palabras en cualquiera
de los campos de texto. Por ejemplo, en la imagen a continuación se muestran
inmersiones en circuito abierto, con traje seco, en una ubicación específica
(Simonstad). No hay botón para activar la acción de filtrado: el hecho de
teclear en uno de los campos de texto o especificar un rango en cualquiera de
los campos, efectúa automáticamente el filtrado.</p></div>
<div class="paragraph"><p>Durante el filtrado, el modo de buceo (Circuito abierto, CCR, pSCR, Apnea) se
añade a la lista de etiquetas de una inmersión, lo que permite seleccionar
solo determinados tipos de buceo (p.e. CCR) en el filtro. Esto resulta útil
para buceadores con reciclador o apneistas que también buceen en circuito
abierto.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/FilterPanel.jpg" alt="Figura: Panel de filtrado" />
</div>
</div>
<div class="paragraph"><p>El criterio de filtrado puede ser cualquiera de los siguientes:</p></div>
<div class="paragraph"><p>1) Usar varios campos de texto en el panel de filtrado produce una operación
"AND" en los atributos. Por ejemplo, al teclear "Peter" en el atributo
Personas y "Sipadan" en el atributo Ubicación se obtiene una lista de
inmersiones que contienen a Peter y a Sipadan.</p></div>
<div class="paragraph"><p>2) En un atributo único, el criterio "All of" implementa un operador "AND". En
la imagen a continuación, para el atributo <em>Personas</em>, la lista de inmersiones
contiene los buceos en los que aparecen Bob Smith Y Stephan Schultz como
compañeros/divemaster en base a la información de personas del <em>Panel
Información</em>.</p></div>
<div class="paragraph"><p>3) El criterio "Any of" implementa una operación "OR". Para el atributo
<em>Ubicación</em> de la imagen a continuación, la lista filtrada contiene las
inmersiones efectuadas en Simonstad "O" en Hout Bay.</p></div>
<div class="paragraph"><p>4) El criterio "None of" implementa una operación "NOT". Para el atributo
<em>Traje</em> en la imagen a continuación, la lista de inmersiones EXCLUYE todas
las inmersiones en las que se usó traje seco,</p></div>
<div class="paragraph"><p>5) Campo vacío. El resultado de los campos vacíos para <em>Notas</em> y <em>Etiquetas</em>
en la imagen a continuación, es que estos atributos no se tienen en cuenta
durante el filtrado.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/FilterOptions.jpg" alt="Figura: Opciones de filtrado" />
</div>
</div>
<div class="paragraph"><p>En la parte superior del <em>Panel de Filtrado</em>, la <strong>flecha amarilla hacia
arriba</strong> se usa para reiniciar el filtro y mostrar todos los buceos. El botón
rojo con el aspa blanca se usa para cerrar el panel.</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<img src="./images/icons/important.png" alt="Important" />
</td>
<td class="content">La acción de filtrado solo se puede detener usando el botón "flecha
amarilla hacia arriba" o limpiando manualmente todos los campos de texto.
Cerrar el <em>Panel de filtrado</em> no acaba con la acción de filtrado: la lista
permanece sin cambios. Esto resulta obvio al indicar la barra superior de
<em>Subsurface</em> que solo se están mostrando parte de las inmersiones. Cerrar el
<em>Panel de filtrado</em> reabre el <em>Panel Mapa</em>, permitiendo visualizar las
posiciones de la lista filtrada. Por ejemplo, podemos querer filtrar a Bob
Smith como compañero. Al cerrar el <em>Panel de filtrado</em> se visualizan las
ubicaciones en las que hemos buceado con este compañero. Para reabrir el
<em>Panel de filtrado</em>, en este caso, seleccionamos <em>Registro &#8594; Filtrar lista de
inmersiones</em> desde el <em>Menú Principal</em>.</td>
</tr></table>
</div>
</div>
</div>
</div>
<div class="sect1">
@ -4219,11 +3941,117 @@ selecciona <em>Editar</em> desde el <strong>Menú Principal</strong>, lo que pre
con las posibilidades <em>Deshacer</em> y <em>Rehacer</em>.</p></div>
</div>
</div>
<div class="sect2">
<h3 id="S_Filter">7.5. Filtrar la Lista de Inmersiones</h3>
<div class="paragraph"><p>Los buceos del panel <strong>Lista de inmersiones</strong> pueden filtrarse, esto es, se pueden
seleccionar únicamente algunos de los buceos basándose en sus atributos, p.e.
las etiquetas, el lugar de buceo, el divemaster, compañeros o traje protector.
El filtrado permite, por ejemplo, listar las inmersiones profundas en un punto
determinado o, por el contrario, las inmersiones en cuevas con cierto
compañero.</p></div>
<div class="paragraph"><p>Para abrir el filtrado, seleccionar <em>Registro &#8594; Filtrar la lista de inmersiones</em>
desde el menú principal. Esto abrirá el <em>Panel de filtrado</em> en la parte de arriba
de la ventana de <em>Subsurface</em>. Arriba a la derecha del panel se ubican tres
iconos (ver imagen a continuación).
El <em>Panel de filtrado</em> puede reiniciarse (p.e. limpiar todos los filtros
actuales) seleccionando la flecha amarilla. El <em>Panel de filtrado</em> también puede
minimizarse seleccionando la <strong>flecha verde</strong>. Cuando está minimizado solo se
muestran los tres iconos. El panel puede maximizarse clicando el icono que lo
minimizó. El filtro se cierra y reinicia seleccionando el <strong>botón rojo</strong> con la
cruz blanca.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/Filterpanel.jpg" alt="Figura: Panel de filtrado" />
</div>
</div>
<div class="paragraph"><p>Se pueden utilizar cuatro criterios para filtrar la lista de inmersiones:
las etiquetas, las personas (compañeros/divemasters), punto de inmersión y traje
de buceo, cada uno de los cuales viene representado por una lista seleccionable.
Sobre cada lista hay un segundo nivel de filtrado. Por ejemplo, tecleando "<em>Ba</em>"
en la casilla de texto sobre las ubicaciones, la lista podría quedar reducida a
"<em>Bajo Piles I</em>", "<em>Bajo Piles II</em>" y "<em>Bajo de Testa</em>". Filtrar la lista
permite encontrar rápidamente términos de búsqueda para filtrar la lista de
inmersiones.</p></div>
<div class="paragraph"><p>Para activar el filtrado de la lista de inmersiones, se necesita seleccionar
al menos una casilla en una de las cuatro listas. La lista de inmersiones se
reduce para mostrar solo los buceos que cumplen los criterios seleccionados en
las listas. Las cuatro listas funcionan como un filtro con operadores <em>Y</em>,
<em>Subsurface</em> filtraría, pues, para "<em>cueva</em>" como etiqueta y "<em>José García</em>"
como compañero; pero los filtros dentro de una categoría son inclusivos, esto
es, filtrar por etiquetas con "cueva" y "barco" mostraría todas las inmersiones
en las que aparezcan las etiquetas "cueva" <em>O</em> "barco", solas o conjuntamente.</p></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="S_ExportLog">8. Exportar el registro de inmersiones o parte del mismo</h2>
<div class="sectionbody">
<div class="paragraph"><p>Hay dos posibilidades de exportar información de buceo desde <em>Subsurface</em>:</p></div>
<div class="ulist"><ul>
<li>
<p>
Exportar información de buceo a <em>Facebook</em>
</p>
</li>
<li>
<p>
<a href="#S_Export_other">Exportar información de buceo a otros destinos o formatos</a>
</p>
</li>
</ul></div>
<div class="sect2">
<h3 id="S_Facebook">8.1. Exportar información de buceo a <em>Facebook</em></h3>
<div class="paragraph"><p>La exportación de inmersiones a <em>Facebook</em> se maneja de forma diferente a otros
tipos de exportación porque se requiere una
conexión a esta red social y se necesita un usuario de <em>Facebook</em> y su password.
Si, desde el menú principal, seleccionamos <em>Compartir &#8594; Conectar a &#8594;
Facebook</em> (imagen <strong>A</strong> siguiente), se nos presentará una pantalla de acceso
(imagen <strong>B</strong> a continuación). Introducimos nuestro usuario y password de
<em>Facebook</em>.
Desde la ventana de <em>Subsurface</em> es fácil saber si se tiene una conexión válida
con <em>Facebook</em>. Desde el <strong>Menú principal</strong>, selecciona <em>Compartir</em>
(ver imagen <strong>A</strong> a continuación). Normalmente la opción <em>Facebook</em> está
desactivada, pero, si hay una conexión establecida, la opción está activa y
puede ser seleccionada.
Tras haber establecido una conexión con <em>Facebook</em>, se mostrará un panel con
un mensaje: "<em>Para desconectar Subsurface de tu cuenta de Facebook, utiliza la
entrada del menú 'Compartir'</em>."
Cierra este panel.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/facebook1.jpg" alt="Figure: Facebook login" />
</div>
</div>
<div class="paragraph"><p>Habiendo establecido una conexión a <em>Facebook</em>, transferir un perfil al
historial es fácil.
Selecciona en la <strong>Lista de Inmersiones</strong> de <em>Subsurface</em> el buceo que quieras
transferir; entonces, desde el <strong>Menú</strong> selecciona <em>Compartir &#8594; Facebook</em>,
aparecerá un diálogo en el que se definirá la cantidad de información
adicional que se desea compartir en el historial junto con el perfil (ver imagen
<strong>A</strong>, a continuación). Se necesita proporcionar el nombre de un álbum de <em>Facebook</em>
para poder enviar el perfil de inmersión. Las casillas seleccionables de la
izquierda nos permiten seleccionar la información que vamos a enviar. Esta
información se muestra en la ventana de texto de la derecha (ver imagen <strong>A</strong>
a continuación). El mensaje que se va a enviar se puede editar directamente en
esta ventana de texto. Tras haber elegido la información y verificado lo que se va
a subir, se selecciona el botón <em>OK</em> lo que inicia la transferencia a <em>Facebook</em>.
Unos momentos después aparecerá un mensaje indicando una transferencia correcta.</p></div>
<div class="paragraph"><p>El álbum creado y el post al historial se marcarán como privados. Para que
los amigos puedan ver el post habrá que cambiar los permisos desde un acceso
normal a <em>Facebook</em> desde un navegador o desde la app de <em>Facebook</em>. Aunque
esto suponga un paso de más, los desarrolladores entienden que esta es la mejor
solución para evitar subidas no deseadas en el historial público.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/facebook2.jpg" alt="Figure: Facebook data submission" />
</div>
</div>
<div class="paragraph"><p>Si se considera necesario, cierra la conexión a <em>Facebook</em>, seleccionando
desde el <strong>Menú principal</strong>, <em>Compartir &#8594; Desconectar de &#8594; Facebook</em> (imagen
<strong>B</strong> anterior).</p></div>
</div>
<div class="sect2">
<h3 id="S_Export_other">8.2. Exportar información de buceo a otros destinos o formatos</h3>
<div class="paragraph"><p>Para exportar a otros destinos,
se llega a la función de exportación seleccionando <em>Archivo &#8594; Exportar</em> lo que
despliega el diálogo de exportación. Este diálogo siempre ofrece dos opciones:
@ -4281,20 +4109,6 @@ Universal Dive Data format (UDDF). Ver <a href="http://uddf.org">http://uddf.org
</li>
<li>
<p>
<em>Perfil de Inmersión</em>, que permite compartir facilmente el perfil usando
redes sociales. Esta opción escribe la imagen del perfil de buceo en un
archivo en formato gráfico <em>.PNG</em> en la carpeta indicada en el diálogo
<em>Guardar Archivo</em>. La imagen guardada es exactamente la que se puede ver en
el perfil en la pantalla, así que comprueba que tienes activadas las
opciones correctas de la caja de herramientas del perfil. Si se seleccionan
varias inmersiones las imagenes se escriben en archivos separados. Al
seleccionar la opción <em>Perfil de Inmersión</em> se abre una ventana para elegir
el nombre que queremos asignar a los archivos a los que escribir los
perfiles. Pulsa <em>Guardar</em> tras haber escrito el nombre.
</p>
</li>
<li>
<p>
Formato <em>HTML</em>, en el cual los buceos se guardan en archivos HTML,
visualizables con un navegador de internet.Se soportan la mayoría de navegadores
modernos, pero debe estar activado Javascript. Este archivo <strong>NO</strong> es editable. El
@ -4343,12 +4157,6 @@ Formato <em>TeX</em>, un archivo para imprimir usando el software tipográfico T
<div class="ulist"><ul>
<li>
<p>
<em>LaTeX</em>. Escribe la inmersión a un documento Latex, en el que los ajustes
tipográficos se efectuan automáticamente usando TeX.
</p>
</li>
<li>
<p>
<em>Profundidad de imágenes</em>, que crea un fichero de texto que contiene los
nombres de todos los archivos de imagen o vídeo añadidos a cualquiera de los buceos
seleccionados del la <em>Lista de inmersiones</em>, junto con la profundidad a la
@ -4400,6 +4208,7 @@ Solo exportar lista: Solo se exportará una lista de inmersiones. No se
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="S_Cloud_access">9. Guardar un diario de <em>Subsurface</em> en la Nube</h2>
<div class="sectionbody">
@ -4749,7 +4558,7 @@ el nombre de dispositivo asignado al ordenador por el sistema operativo.
Ver el <a href="#_apendice_a_informacion_especifica_del_sistema_operativo_para_importar_inmersiones_desde_un_ordenador_de_buceo">APÉNDICE A</a>
para información sobre como hacerlo.</p></div>
<div class="paragraph"><p>Una vez que el ordenador de buceo está al PC con <em>Subsurface</em>, se selecciona
<em>Archivo &#8594; Cambiar ajustes del ordenador de buceo</em> en el menú principal. Si se ha
<em>Archivo &#8594; Configurar ordenador de buceo</em> en el menú principal. Si se ha
indicado el nombre de dispositivo correcto en el campo de texto de la parte
superior, esto abrirá y seleccionará el modelo correcto en el panel de la
izquierda (ver imagen a continuación).</p></div>
@ -5857,15 +5666,7 @@ circuito por la caída de oxígeno en la boquilla del equipo pSCR.</p></div>
<td class="content">Bucear en circuito abierto forma parte amenudo de las inmersiones con pSCR,
porque a pequeñas profundidades la pO<sub>2</sub> en el circuito es demasiado baja. El
cambio de rebreather a circuito abierto y viceversa se indica usando eventos
de "bailout". Hay dos formas de planificar bailouts en inmersiones con
reciclador: 1) Seleccionar la casilla <em>Bailout</em> en la sección <em>Modo de
Inmersión</em> del planificador; en este caso, las necesidades del bailout se
calcularán empezando por el último segmento especificado en la tabla del
planificador. 2) Si el bailout tiene lugar en otro punto de la inmersión (ver
el ejemplo de buceo en cuevas a continuación), el bailout se planifica
manipulando la columna <em>Modo de Inmersión</em> en la tabla <strong>Puntos del
Planificador</strong>.
La imagen a la izquierda muestra un plan con pSCR (utilizando
de "bailout". La imagen a la izquierda muestra un plan con pSCR (utilizando
tres botellas) en el que las partes más superficiales se llevan a cabo usando
EAN50 para poder tener una pO<sub>2</sub> suficiente. La parte profunda se lleva a cabo
usando con EAN31 (bot. 2 en la tabla de gases disponibles, también indicada en
@ -5889,7 +5690,7 @@ la botella en la tabla <strong>Puntos del Planificador de inmersiones</strong> c
en la imagen de la derecha (<strong>B</strong>). El icono del perfil mostrará ahora un evento
de bailout superpuesto con un cambio de botella. Como en el gráfico de la
izquierda, los valores apropiados de pO<sub>2</sub> se muestran en el perfil. Los
volúmenes de gas necesarios se encuentran al final del panel <strong>Detalles del
volumenes de gas necesarios se encuentran al final del panel <strong>Detalles del
Plan de Buceo</strong>.</td>
</tr></table>
</div>
@ -5899,13 +5700,12 @@ Plan de Buceo</strong>.</td>
</div>
</div>
<div class="paragraph"><p>En el caso de un plan de inmersión en aguas abiertas con pSCR, el "peor
escenario" es, probablemente, una emergencia al final de la parte más profunda
de la inmersión y esto puede simularse usando la casilla <em>Bailout</em> del
planificador. Como alternativa, se puede crear un segmento de 1 minuto al final
de la parte más profunda del plan. Luego manipula el segmento utilizando las
columnas <strong>Modo de buceo</strong> y <strong>Gas usado</strong>, como en el ejemplo anterior de la cueva.
Visita el ejemplo de emergencia para una inmersión con CCR, a continuación, que
utiliza esta aproximación.</p></div>
escenacio" es, probablemente, una emergencia al final de la parte más profunda
de la inmersión. Crea un segmento de 1 minuto al final de la parte más
profunda del plan. Luego manipula el segmento utilizando las columnas <strong>Modo de
buceo</strong> y <strong>Gas usado</strong>, como en el ejemplo anterior de la cueva. Visita el
ejemplo de emergencia para una inmersión con CCR, a continuación, que utiliza
esta aproximación.</p></div>
</div>
</div>
<div class="sect2">
@ -5943,15 +5743,12 @@ gas para un segmento en CCR, por tanto, lo normal es obtener valores de 0 l.</p>
<td class="icon">
<img src="images/CCR_b1.jpg" alt="Note" />
</td>
<td class="content">A menudo es necesario planificar casos de "peor escenario" para asegurarnos de
<td class="content">A menudo es necerario planificar casos de "peor escenario" para asegurarnos de
que dispondremos de gas suficiente, en caso de emergencia, para alcanzar la
superficie, teniendo en cuenta la descompresión. Esto se hace: 1)
seleccionando la casilla <em>Bailout</em> del planificador (el bailout se calculará
empezando en el último segmento de inmersión definido en la tabla); 2)
Definiendo segmentos de 1 minuto al final de la parte de fondo de la inmersión,
como se muestra en la imagen de la izquierda donde se planifica una inmersión a
40m durante 21 minutos; 3) Cambiando a un gas en circuito abierto en cualquier
segmento de la tabla de <em>Puntos del Planificador</em>.</td>
superficie, teniendo en cuenta la descompresión. Esto se hace definiendo
segmentos de 1 minuto al final de la parte de fondo de la inmersión, como se
muestra en la imagen de la izquierda donde se planifica una inmersión a 40m
durante 21 minutos.</td>
</tr></table>
</div>
<div class="admonitionblock">
@ -8079,7 +7876,7 @@ sido sobrescritos.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
2024-02-08 08:36:54 PST
2018-09-23 17:52:40 PDT
</div>
</div>
</body>

View File

@ -61,7 +61,7 @@ web]. Por favor, comenta los problemas que tengas con este programa enviando un
mail a mailto:subsurface@subsurface-divelog.org[nuestra lista de correo] e informa de
fallos en https://github.com/Subsurface/subsurface/issues[nuestro bugtracker].
Para instrucciones acerca de como compilar el software y (en caso necesario)
sus dependencias, por favor, consulta el archivo INSTALL.md incluido con el código
sus dependencias, por favor, consulta el archivo INSTALL incluido con el código
fuente.
*Audiencia*: Buceadores recreativos, Buceadores en apnea, Buceadores técnicos,
@ -727,7 +727,6 @@ para seguir los cambios en el entorno. Si fuera necesario, no hay que teclear
las unidades de temperatura: _Subsurface_ las suministra automáticamente de
acuerdo con las _Preferencias_ (métricas o imperiales).
[[S_locations]]
*Ubicación*:
[icon="images/icons/warning2.png"]
[WARNING]

View File

@ -1,10 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 10.1.2" />
<meta name="generator" content="AsciiDoc 8.6.9" />
<title></title>
<style type="text/css">
/*
@ -17,7 +16,7 @@
*/
* { padding: 0; margin: 0; }
img { border: 0; margin: 15px; max-width:90% }
img { border: 0; }
/*** Layout ***/
@ -78,12 +77,12 @@ body { font-family: Verdana, sans-serif; }
#footer { font-size: 0.8em; }
h2, h3, h4, h5, .title { font-family: Arial, sans-serif; }
h2 { font-size: 160%; }
h2 { font-size: 1.5em; }
.sectionbody { font-size: 0.85em; }
.sectionbody .sectionbody { font-size: inherit; }
h3 { font-size: 150%; } /* 1.35em */
h4 { font-size: 140%; } /* 1.2em */
h5 { font-size: 130%; } /* 1em */
h3 { font-size: 159%; } /* 1.35em */
h4 { font-size: 141%; } /* 1.2em */
h5 { font-size: 118%; } /* 1em */
.title { font-size: 106%; /* 0.9em */
font-weight: bold;
}
@ -526,7 +525,7 @@ problème, vous pouvez envoyer un e-mail sur
<a href="mailto:subsurface@subsurface-divelog.org">notre liste de diffusion</a> et
rapportez les bogues sur <a href="http://trac.hohndel.org">notre bugtracker</a>. Pour
des instructions de compilation du logiciel et (si besoin) de ses
dépendances, merci de consulter le fichier INSTALL.md inclus dans les sources
dépendances, merci de consulter le fichier INSTALL inclus dans les sources
logicielles.</p></div>
<div class="paragraph"><p><strong>Public</strong> : Plongeurs loisirs, apnéistes, plongeurs Tek et plongeurs
professionnels</p></div>
@ -577,7 +576,7 @@ meilleur manière qui soit, il est important d&#8217;avoir des informations sur
utilisateurs. À l&#8217;ouverture de <em>Subsurface</em> après avoir utilisé le logiciel
pendant une semaine environ, une fenêtre de sondage apparait. Cela est
complètement optionnel et l&#8217;utilisateur contrôle quelles informations sont
envoyées ou non à l&#8217;équipe de développement de <em>Subsurface</em>. Toutes les
envoyées ou non à l'équipe de développement de <em>Subsurface</em>. Toutes les
données que l&#8217;utilisateur envoie sont utiles et ne seront utilisées que pour
les futurs développements et modifications du logiciel pour coller au mieux
aux besoins des utilisateurs de <em>Subsurface</em>. Si vous complétez le sondage
@ -593,7 +592,7 @@ envoyer un nouveau sondage en démarrant <em>Subsurface</em> avec l&#8217;option
<div class="sectionbody">
<div class="paragraph"><p>La fenêtre <em>Subsurface</em> est généralement divisée en 4 panneaux avec un <strong>Menu
principal</strong> (Fichier Édition Importer Journal Vue Partager Aide) en haut de
la fenêtre (pour Windows et Linux) ou en haut de l&#8217;écran (pour Mac et Ubuntu
la fenêtre (pour Windows et Linux) ou en haut de l'écran (pour Mac et Ubuntu
Unity). Les quatre panneaux sont :</p></div>
<div class="paragraph"><p>La <strong>liste des plongées</strong> en bas à gauche, affichant toutes les plongées du
journal (carnet) de plongées de l&#8217;utilisateur. Une plongée peut être
@ -603,7 +602,7 @@ d&#8217;une plongée à l&#8217;autre. La <strong>liste des plongées</strong> e
manipuler un journal (carnet) de plongée.</p></div>
<div class="paragraph"><p>La <strong>carte de plongée</strong> en bas à droite, affiche les sites de plongées de
l&#8217;utilisateur, sur une carte mondiale et centrée sur le site de la dernière
plongée sélectionnée dans la <strong>liste des plongées</strong>. L&#8217;échelle de la carte
plongée sélectionnée dans la <strong>liste des plongées</strong>. L'échelle de la carte
peut être augmentée ou réduite.</p></div>
<div class="paragraph"><p>Les <strong>informations</strong> en haut à gauche, fournissent des informations détaillées
sur la plongée sélectionnée dans la <strong>liste des plongées</strong>, dont des
@ -633,7 +632,7 @@ plongées sélectionnées).</p></div>
<div class="paragraph"><p>Décider quels panneaux sont affichés, parmi les 4, en sélectionnant l&#8217;option
<strong>Vue</strong> dans le menu principal. Cette fonctionnalité permet plusieurs choix
d&#8217;affichage :</p></div>
<div class="paragraph"><p><strong>Tout</strong> : affiche les quatre panneaux tels que sur la capture d&#8217;écran ci-dessus.</p></div>
<div class="paragraph"><p><strong>Tout</strong> : affiche les quatre panneaux tels que sur la capture d'écran ci-dessus.</p></div>
<div class="paragraph"><p><strong>Liste des plongées</strong> : affiche uniquement la liste des plongées.</p></div>
<div class="paragraph"><p><strong>Profil</strong> : affiche uniquement le profile de plongée de la plongée sélectionnée.</p></div>
<div class="paragraph"><p><strong>Info</strong> : affiche uniquement les notes de plongées de la dernière plongée sélectionnée et les statistiques pour
@ -762,7 +761,7 @@ doit être enregistré sur le disque ou non.</p></div>
<div class="paragraph"><p>Le <strong>Profil de plongée</strong> (une représentation graphique de la profondeur d&#8217;une
plongée en fonction du temps) est affiché dans le panneau en haut à droite
de la fenêtre de <em>Subsurface</em>. Lorsqu&#8217;il est ajouté manuellement au carnet,
<em>Subsurface</em> affiche un profil de plongée par défaut qui nécessite d&#8217;être
<em>Subsurface</em> affiche un profil de plongée par défaut qui nécessite d'être
modifié pour représenter au mieux la plongée décrite:</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
@ -778,7 +777,7 @@ en haut de la boîte noire d&#8217;information (@ et D). Les unités
ligne séparés par des points de passage (les points blancs sur le profil,
voir ci-dessous). La profondeur par défaut d&#8217;une plongée est de 15m. Si la
prfondeur de votre plongée était de 20m, vous devez glisser le point de
passage approprié jusqu&#8217;à 20m. Pour ajouter un point de passage,
passage approprié jusqu'à 20m. Pour ajouter un point de passage,
double-cliquez sur n&#8217;importe quel segment de la ligne. Pour bouger un point
de passage supplémentaire, glissez-le. Le bouger peut également être réalisé
en le sélectionnant et en utilisant les flèches du clavier. Pour supprimer
@ -832,7 +831,7 @@ de plongée supportés</a>.</p></div>
<td class="icon">
<img src="images/icons/warning2.png" alt="Warning" />
</td>
<td class="content">Certains ordinateurs de plongée consomme plus d&#8217;énergie lorsqu&#8217;ils sont en
<td class="content">Certains ordinateurs de plongée consomme plus d'énergie lorsqu&#8217;ils sont en
mode Communication PC. <strong>Ceci peut consommer une grande partie de la
batterie de votre ordinateur de plongée</strong>. Nous recommandons à l&#8217;utilisateur
de vérifier que l&#8217;ordinateur de plongée est chargé lorsqu&#8217;il est connecté au
@ -844,7 +843,7 @@ au port USB.</td>
</tr></table>
</div>
<div class="paragraph"><p>Pour importer les informations depuis un ordinateur de plongée vers un
ordinateur utilisant <em>Subsurface</em>, les deux pièces d&#8217;équipement doivent
ordinateur utilisant <em>Subsurface</em>, les deux pièces d'équipement doivent
communiquer entre elles. Ceci implique la configuration des ports de
communication (ou point de montage) de l&#8217;ordinateur sur lequel tourne
<em>Subsurface</em> qui communique avec l&#8217;ordinateur de plongée. Pour configurer
@ -852,7 +851,8 @@ cette communication, les utilisateurs doivent trouver l&#8217;information
appropriée pour renseigner à <em>Subsurface</em> d&#8217;où et comment importer les
informations de
plongée.
<a href="#appendix_a">Annexe A</a> donne les informations techniques pour aider l&#8217;utilisateur à configurer
<a href="#_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer">Annexe
A</a> donne les informations techniques pour aider l&#8217;utilisateur à configurer
ceci pour les différents systèmes d&#8217;exploitation et
<a href="#_appendix_b_dive_computer_specific_information_for_importing_dive_information">Annexe
B</a> contient des informations spécifiques à chaque ordinateur de plongée.</p></div>
@ -908,7 +908,8 @@ La boîte de dialogue propose deux menus déroulants, <strong>Fournisseur</stron
Le menu déroulant <strong>Périphérique ou point de montage</strong> le nom du port USB ou
Bluetooth dont <em>Subsurface</em> a besoin pour communiquer avec l&#8217;ordinateur de
plongée. Le port approprié doit être sélectionné. Consultez
<a href="#appendix_a">Annexe A</a> et
<a href="#_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer">Annexe
A</a> et
<a href="#_appendix_b_dive_computer_specific_information_for_importing_dive_information">Annexe
B</a> pour obtenir des détails techniques sur la façon de trouver des
informations sur le port approprié à chaque ordinateur de plongée et, dans
@ -1034,15 +1035,17 @@ Le câble de connexion est-il fautif ? Le câble fonctionne-t-il avec d&#8217;au
<li>
<p>
Consultez
<a href="#appendix_a">Annexe A</a> pour être certain que le point de montage correct a été spécifié (voir
<a href="#_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer">Annexe
A</a> pour être certain que le point de montage correct a été spécifié (voir
ci-dessus).
</p>
</li>
<li>
<p>
Sur les systèmes d&#8217;exploitation de type Unix, l&#8217;utilisateur a-t-il les
droits d&#8217;écriture sur le port USB? Si non, consultez
<a href="#appendix_a">Annexe A</a>
droits d'écriture sur le port USB? Si non, consultez
<a href="#_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer">Annexe
A</a>
</p>
</li>
</ul></div>
@ -1139,7 +1142,7 @@ start by scanning for Bluetooth devices from an empty list (on the desktop)
of Bluetooth devices. Once <em>Subsurface</em> has recognised the Bluetooth dive
computer, subsequent divelog downloads are likely to be simple.</p></div>
<div class="paragraph"><p>Sur les plateformes <em>Linux</em> ou -MacOS_, le nom de l&#8217;ordinateur utilisant
Subsurface_ et son adresse Bluetooth sont affichées du côté droit. L&#8217;état
Subsurface_ et son adresse Bluetooth sont affichées du côté droit. L'état
(allumé/éteint) de l&#8217;adaptateur Bluetooth est affiché sous l&#8217;adresse et peut
être modifié en cliquer sur la case <em>Allumer/éteindre</em>. Si l&#8217;adresse
Bluetooth n&#8217;est pas affichée, <em>Subsurface</em> ne détecte pas le périphérique
@ -1218,10 +1221,10 @@ ci-dessus). Si l&#8217;ordinateur de plongée est connecté à Subsurface pour l
première fois, il est possible que Subsurface demande un nombre ou un code
PIN. Entrez le code indiqué dans le manuel utilisateur de l&#8217;ordinatuer de
plongée. Un code ou PIN de 0000 est souvent le code par défaut.</p></div>
<div class="paragraph"><p>L&#8217;étape de jumelage est vérifiée et réalisée automatiquement durant le
<div class="paragraph"><p>L'étape de jumelage est vérifiée et réalisée automatiquement durant le
processus de téléchargement. Si les périphériques n&#8217;ont pas encore été
jumelés, le système demandera l&#8217;autorisation de le faire et affichera un
message sur la partie droite de l&#8217;écran. <em>Ajouter un périphérique</em>, <em>Tapez
message sur la partie droite de l'écran. <em>Ajouter un périphérique</em>, <em>Tapez
pour configurer votre périphérique</em>. <em>Toujours autoriser le jumelage. Après
la sélection d&#8217;un item découvert, cliquez sur le bouton
_Enregistrer</em>. Enfin, sélectionnez le bouton "Télécharger_ dans la boîte de
@ -1275,7 +1278,7 @@ avec <em>Subsurface</em>.</td>
</div>
<div class="sect3">
<h4 id="S_DeviceNames">5.2.3. Changement du nom d&#8217;un ordinateur de plongée</h4>
<div class="paragraph"><p>Il peut être nécessaire d&#8217;établir une distinction entre différents
<div class="paragraph"><p>Il peut être nécessaire d'établir une distinction entre différents
ordinateurs de plongée utilisés pour télécharger des données de plongée vers
<em>Subsurface</em>. Par exemple, si l&#8217;ordinateur d&#8217;un équipier provient du même
fabriquant et est dun même modèle que le votre et que les données sont
@ -1346,7 +1349,7 @@ dans des boîtes de texte à droite de l&#8217;heure de début de plongée. De n
renseignent la température de l&#8217;eau, et cette boîte peut contenir cette information.
Si la température de l&#8217;air n&#8217;est pas renseignée par l&#8217;ordinateur de plongée, la première température pour l&#8217;eau
peut être utilisée comme température de l&#8217;air. En général, elle est proche de la température de l&#8217;air.
S&#8217;il est nécessaire d&#8217;éditer ces informations, seule une valeur est nécessaire, l&#8217;unité de température étant
S&#8217;il est nécessaire d'éditer ces informations, seule une valeur est nécessaire, l&#8217;unité de température étant
automatiquement fournie par
<em>Subsurface</em> (sur base des <em>Préférences</em>, les unités métriques ou impériales
seront utilisées).</p></div>
@ -1362,7 +1365,7 @@ plongée. Les informations de plongée dans les onglets <strong>Notes</strong>
informations sur le site de plongée. Enregistrez toutes les autres
informations (p. ex. instructeur, équipier, équipement, notes à propos de la
plongée) en sélectionnant <em>Appliquer les modifications</em> dans l&#8217;onglet
<strong>Notes</strong> AVANT d&#8217;éditer les informations sur le site de plongée. Ensuite,
<strong>Notes</strong> AVANT d'éditer les informations sur le site de plongée. Ensuite,
nommez le site de plongée dans la bpîte de texte <em>Lieu</em> dans l&#8217;onglet
<strong>Notes</strong>.</td>
</tr></table>
@ -1485,11 +1488,11 @@ Une sélection automatique est disponible.
Certains utilisateurs de vêtement étanche peuvent utiliser ce champ pour enregistrer quelle ensemble de
combinaison et souris ils ont utilisé.</p></div>
<div class="paragraph"><p><strong>Évaluation</strong>: attribue une évaluation subjective à une plongée sur une
échelle de 5 points en cliquant sur l&#8217;étoile correspondante.</p></div>
échelle de 5 points en cliquant sur l'étoile correspondante.</p></div>
<div class="paragraph"><p><strong>Visibilité</strong>: attribue une évaluation de la visibilité à une plongée sur une
échelle de 5 points en cliquant sur l&#8217;étoile correspondante.</p></div>
échelle de 5 points en cliquant sur l'étoile correspondante.</p></div>
<div class="paragraph"><p><strong>Étiquettes</strong>: il est possible de définir ici des étiquettes qui décrivent le
type de plongée (séparées par des virgules). Des exemples courants d&#8217;étiquettes sont bateau,
type de plongée (séparées par des virgules). Des exemples courants d'étiquettes sont bateau,
plongée dérivante, exercice, grotte, etc.
<em>Subsurface</em> contient de nombreuses étiquettes. En commençant à taper une étiquette, <em>Subsurface</em> liste
les étiquettes correspondant à la frappe. Par exemple, en entrant
@ -1512,7 +1515,7 @@ message dans la boîte bleue en haut du panneau:</p></div>
<img src="images/BlueEditBar_f22.jpg" alt="FIGURE: Blue edit bar" />
</div>
</div>
<div class="paragraph"><p>indique que l&#8217;équipement a été édité. C&#8217;est une partie hautement interactive
<div class="paragraph"><p>indique que l'équipement a été édité. C&#8217;est une partie hautement interactive
de <em>Subsurface</em> et les informations sur les blocs et les gaz (entrées ici)
déterminent le comportement du <strong>Profil de plongée</strong> (panneau en haut à
droite).</p></div>
@ -1889,7 +1892,7 @@ not currently supported on Mac.</p></div>
your system before building: <em>glib2.0</em> and <em>mdbtools</em> (see below).</p></div>
<div class="paragraph"><p>In addition, a web service is available for divelog convertions from
SmartTrak to <em>Subsurface</em> (see below).</p></div>
<div class="paragraph"><p>N&#8217;hésitez pas à contacter l&#8217;équipe de développement de <em>Subsurface</em> via
<div class="paragraph"><p>N&#8217;hésitez pas à contacter l'équipe de développement de <em>Subsurface</em> via
<a href="mailto:subsurface@subsurface-divelog.org">notre liste de diffusion</a> pour de
l&#8217;aide à l&#8217;importation des lofs <em>SmartTrak</em>.</p></div>
<div class="sect4">
@ -3189,7 +3192,7 @@ profondeur à un moment précis de la plongée.</p></div>
<img src="images/icons/scale.jpg" alt="Note" />
</td>
<td class="content">Dans certains cas, le profil de plongée ne remplit pas toute la zone du
panneau <strong>Profil de plongée</strong>. Cliquer sur le bouton <strong>Ajuster l&#8217;échelle du
panneau <strong>Profil de plongée</strong>. Cliquer sur le bouton <strong>Ajuster l'échelle du
graphique</strong> dans la barre d&#8217;outils sur la gauche du profil de plongée
augmente la taille du profil de plongée pour remplir la zone du panneau.</td>
</tr></table>
@ -3234,8 +3237,8 @@ panel. These are:</p></div>
<td class="content">Affiche la <strong>Profondeur maximale d&#8217;utilisation (MOD)</strong> d&#8217;une plongée, en
fonction du mélange gazeux utilisé. La MOD dépend de la concentration en
oxygène du gaz respiré. Pour l&#8217;air (21% d&#8217;oxygène), il vaut envuron 57m si
une pO<sub>2</sub> maximale de 1.4 est choisie dans la section <strong>Préférences</strong>
(sélectionnez <em>Fichier &#8594; Préférences &#8594; Profil</em> et éditez le champ <em>pO<sub>2</sub>
une pO<sub>2 maximale de 1.4 est choisie dans la section <strong>Préférences</strong>
(sélectionnez <em>Fichier &#8594; Préférences &#8594; Profil</em> et éditez le champ <em>pO</sub>2
dans le calcul de MOD</em>). En plongeant sous la MOD, il y a un risque
important d&#8217;exposition aux dangers liés à la toxicité de l&#8217;oxygène.</td>
</tr></table>
@ -4046,13 +4049,66 @@ those dives that have either one OR both of these tags.</p></div>
<div class="ulist"><ul>
<li>
<p>
Exporter les informations de plongée vers <em>Facebook</em>
</p>
</li>
<li>
<p>
<a href="#S_Export_other">Exporter des informations de plongée vers d&#8217;autres
destinations ou formats</a>
</p>
</li>
</ul></div>
<div class="sect2">
<h3 id="S_Export_other">8.1. Exporter des informations de plongée vers d&#8217;autres destinations ou formats</h3>
<h3 id="S_Facebook">8.1. Export des informations de plongée vers <em>Facebook</em></h3>
<div class="paragraph"><p>L&#8217;export des plongées vers <em>Facebook</em> est géré différemment des autres types
d&#8217;export car une connexion vers <em>Facebook</em> est nécessaire, nécessitant un
identifiant et un mot de passe. À partir du menu principal, sélectionnez
<em>Partager sur &#8594; Connecter à &#8594; Facebook</em> (image <strong>A</strong> ci-dessous). Un écran
de connexion s&#8217;affiche (image <strong>B</strong> ci dessous). Entrez l&#8217;identifiant et le
mot de passe <em>Facebook</em>. Depuis la fenêtre <em>Subsurface</em>, il est facile de
vérifier si <em>Subsurface</em> a une connection valide vers <em>Facebook</em> : Depuis le
"Menu principal", sélectionnez <em>Partager sur</em> (image <strong>A</strong>
ci-dessous). Normalement, l&#8217;option <em>Facebook</em> est grisée. Mais si une
connection vers <em>Facebook</em> existe, cette option est active (c&#8217;est à dire
écrit en noir et sélectionnable).</p></div>
<div class="paragraph"><p>Once logged into to <em>Facebook</em> , a panel is shown with a message: "<em>To
disconnect Subsurface from your Facebook account, use the <em>Share on</em> menu
entry</em>." Close this message panel.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/facebook1.jpg" alt="Figure: Facebook login" />
</div>
</div>
<div class="paragraph"><p>Une fois qu&#8217;une connexion à <em>Facebook</em> est établie, transférer un profil de
plongée vers <em>Facebook</em> est facile. Dans le panneau <strong>Liste des plongées</strong> de
<em>Subsurface</em>, sélectionnez la plongée à transférer. Ensuite, à partir du
<strong>menu principal</strong>, sélectionnez <em>Partager sur &#8594; Facebook</em>. Une fenêtre
s&#8217;affiche, pour déterminer quelles informations seront transférées avec le
profil de plongée (image <strong>A</strong> ci-dessous). Pour transférer un profil de
plongée vers <em>Facebook</em>, le nom d&#8217;un album <em>Facebook</em> doit être fourni. Les
cases à cocher sur la partie gauche permettent de sélectionner des
informations supplémentaires à transférer avec le profil de plongée. Ces
informations sont affichées dans le champs de texte sur la partie droite du
panneau. (image <strong>A</strong> ci dessous). Personnalisez le message qui sera envoyé
avec le profil de plongée en modifiant les informations. Une fois les
informations supplémentaires ajoutées et vérifiées, sélectionner le bouton
<em>OK</em> qui effectue le transfert vers <em>Facebook</em>. Après le transfert, une
fenêtre de confirmation apparait ,indiquant le succès du transfert.</p></div>
<div class="paragraph"><p>À la fois l&#8217;album créé et la publication sur votre ligne temporelle seront
marquées comme privés. Pour que vos amis puissent la voir, connectez-vous à
<em>Facebook</em> depuis un navigateur ou l&#8217;application Facebook et modifiez les
permissions.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/facebook2.jpg" alt="Figure: Facebook data submission" />
</div>
</div>
<div class="paragraph"><p>If required, then close the <em>Facebook</em> connection by selecting, from the
<strong>Main Menu</strong>, <em>Share on &#8594; Disconnect from &#8594; Facebook</em> (image <strong>B</strong> above).</p></div>
</div>
<div class="sect2">
<h3 id="S_Export_other">8.2. Exporter des informations de plongée vers d&#8217;autres destinations ou formats</h3>
<div class="paragraph"><p>For non-<em>Facebook exports</em>, the export function can be found by selecting
<em>File &#8594; Export</em>, which brings up the Export dialog. This dialog always
gives two options: save ALL dives, or save only the dives selected in <strong>Dive
@ -4544,7 +4600,7 @@ ces ordinateurs de plongée peuvent être lues et modifiées. Pour commencer,
assurez vous que les pilotes pour votre ordinateur de plongée sont installés
(également nécessaire pour télécharger les plongées) et que le nom de
périphérique de l&#8217;ordinateur de plongée est connu. Voir
<a href="#appendix_a">ANNEXE A</a> pour plus d&#8217;informations sur la manière de procéder.</p></div>
<a href="#_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer">ANNEXE A</a> pour plus d&#8217;informations sur la manière de procéder.</p></div>
<div class="paragraph"><p>Une fois que l&#8217;ordinateur de plongée est connecté à <em>Subsurface</em>,
sélectionner <em>Fichier &#8594; Configurer l&#8217;ordinateur de plongée</em>, à partir du
menu principal. Sélectionner le nom du périphérique (ou le point de montage)
@ -4979,7 +5035,7 @@ L&#8217;utilisateur planifie des plongées dans les limites de sa certification.
<li>
<p>
La planification de plongée se base sur les caractéristiques d&#8217;une <em>personne
normale</em> et ne peut compenser les caractéristiques physiologiques, l&#8217;état de
normale</em> et ne peut compenser les caractéristiques physiologiques, l'état de
santé, l&#8217;historique personnel et les caractéristiques du mode de vie.
</p>
</li>
@ -5003,7 +5059,7 @@ Un utilisateur qui n&#8217;est pas absolument certain d&#8217;un des prérequis
</ul></div>
</div></div>
<div class="sect2">
<h3 id="_l_8217_écran_du_planificateur_de_plongée_em_subsurface_em">14.1. L&#8217;écran du planificateur de plongée <em>Subsurface</em></h3>
<h3 id="_l_écran_du_planificateur_de_plongée_em_subsurface_em">14.1. L'écran du planificateur de plongée <em>Subsurface</em></h3>
<div class="paragraph"><p>Like the <em>Subsurface</em> dive log, the planner screen is divided into several
sections (see image below). The <strong>setup</strong> parameters for a dive are entered
into the sections on the left hand and bottom side of the screen. They are:
@ -6106,7 +6162,18 @@ The Edit option allows one to undo or redo an action, e.g. deleting dives.
</ul></div>
</div>
<div class="sect2">
<h3 id="_aide">16.6. Aide</h3>
<h3 id="_share_on">16.6. Share on</h3>
<div class="ulist"><ul>
<li>
<p>
<a href="#S_Facebook"><em>Facebook</em></a> - Partager la plongée sélectionnée sur votre
Facebook.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_aide">16.7. Aide</h3>
<div class="ulist"><ul>
<li>
<p>
@ -6138,7 +6205,7 @@ The Edit option allows one to undo or redo an action, e.g. deleting dives.
</div>
</div>
<div class="sect1">
<h2 id="appendix_a">17. ANNEXE A : informations spécifiques au système d&#8217;exploitation utilisé pour importer les informations de plongées depuis un ordinateur de plongée.</h2>
<h2 id="_annexe_a_informations_spécifiques_au_système_d_8217_exploitation_utilisé_pour_importer_les_informations_de_plongées_depuis_un_ordinateur_de_plongée">17. ANNEXE A : informations spécifiques au système d&#8217;exploitation utilisé pour importer les informations de plongées depuis un ordinateur de plongée.</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_assurez_vous_que_les_pilotes_drivers_nécessaires_sont_installés">17.1. Assurez-vous que les pilotes (drivers) nécessaires sont installés</h3>
@ -6248,14 +6315,14 @@ ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver</code></pre>
détecté et connecté sur <code>ttyUSB3</code>. Cette information peut à présent être
utilisée pour les paramètres d&#8217;importation en tant que <code>/dev/ttyUSB3</code> pour
que Subsurface utilise le bon port USB.</p></div>
<div class="paragraph"><p>S&#8217;assurer que l&#8217;utilisateur possède les droits d&#8217;écriture sur le port série
<div class="paragraph"><p>S&#8217;assurer que l&#8217;utilisateur possède les droits d'écriture sur le port série
USB :</p></div>
<div class="paragraph"><p>Sur les systèmes similaires à Unix, les ports USB ne peuvent être accédés
que par des utilisateurs membres d&#8217;un groupe spécial qui peut être <code>dialout</code>
ou <code>uucp</code>. Cela peut être vérifié en listant les permissions associées au
périphérique, par exemple via <code>ls - l /dev/ttyUSB0</code>. Notez que le numéro
dans le nom de fichier dépend du nombre de périphériques USB que vous avez
branchés et peut être ajusté au besoin.Si vous n&#8217;êtes pas root, vous n&#8217;êtes
branchés et peut être ajusté au besoin.Si vous n'êtes pas root, vous n'êtes
peut-être pas membre de ce groupe et ne pouvez donc pas utiliser le port
USB. Admettons que votre nom d&#8217;utilisateur soit <em>johnB</em>.</p></div>
<div class="paragraph"><p>En tant que root, tapez : usermod -a -G dialout johnB+ (utilisateurs
@ -7787,7 +7854,7 @@ salvaged after being overwritten by new dives.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
2024-02-08 08:51:28 PST
2018-11-05 09:24:27 CET
</div>
</div>
</body>

View File

@ -61,7 +61,7 @@ problème, vous pouvez envoyer un e-mail sur
mailto:subsurface@subsurface-divelog.org[notre liste de diffusion] et
rapportez les bogues sur http://trac.hohndel.org[notre bugtracker]. Pour
des instructions de compilation du logiciel et (si besoin) de ses
dépendances, merci de consulter le fichier INSTALL.md inclus dans les sources
dépendances, merci de consulter le fichier INSTALL inclus dans les sources
logicielles.
*Public* : Plongeurs loisirs, apnéistes, plongeurs Tek et plongeurs
@ -365,7 +365,8 @@ cette communication, les utilisateurs doivent trouver l'information
appropriée pour renseigner à _Subsurface_ d'où et comment importer les
informations de
plongée.
xref:appendix_a[Annexe A] donne les informations techniques pour aider l'utilisateur à configurer
xref:_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer[Annexe
A] donne les informations techniques pour aider l'utilisateur à configurer
ceci pour les différents systèmes d'exploitation et
xref:_appendix_b_dive_computer_specific_information_for_importing_dive_information[Annexe
B] contient des informations spécifiques à chaque ordinateur de plongée.
@ -405,7 +406,8 @@ plongée (en tout cas pour ceux qui ne se rechargent pas via USB).
- Le menu déroulant *Périphérique ou point de montage* le nom du port USB ou
Bluetooth dont _Subsurface_ a besoin pour communiquer avec l'ordinateur de
plongée. Le port approprié doit être sélectionné. Consultez
xref:appendix_a[Annexe A] et
xref:_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer[Annexe
A] et
xref:_appendix_b_dive_computer_specific_information_for_importing_dive_information[Annexe
B] pour obtenir des détails techniques sur la façon de trouver des
informations sur le port approprié à chaque ordinateur de plongée et, dans
@ -491,12 +493,14 @@ Vérifiez les éléments suivants:
sont-ils propres ?
- Consultez
xref:appendix_a[Annexe A] pour être certain que le point de montage correct a été spécifié (voir
xref:_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer[Annexe
A] pour être certain que le point de montage correct a été spécifié (voir
ci-dessus).
- Sur les systèmes d'exploitation de type Unix, l'utilisateur a-t-il les
droits d'écriture sur le port USB? Si non, consultez
xref:appendix_a[Annexe A]
xref:_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer[Annexe
A]
Si l'ordinateur utilisant _Subsurface_ ne reconnaît pas l'adaptateur USB en
ne montrant pas le bon nom de périphérique à côté du Point de montage, il
@ -2303,8 +2307,8 @@ panel. These are:
Affiche la *Profondeur maximale d'utilisation (MOD)* d'une plongée, en
fonction du mélange gazeux utilisé. La MOD dépend de la concentration en
oxygène du gaz respiré. Pour l'air (21% d'oxygène), il vaut envuron 57m si
une pO~2~ maximale de 1.4 est choisie dans la section *Préférences*
(sélectionnez _Fichier -> Préférences -> Profil_ et éditez le champ _pO~2~
une pO~2 maximale de 1.4 est choisie dans la section *Préférences*
(sélectionnez _Fichier -> Préférences -> Profil_ et éditez le champ _pO~2
dans le calcul de MOD_). En plongeant sous la MOD, il y a un risque
important d'exposition aux dangers liés à la toxicité de l'oxygène.
@ -2978,6 +2982,8 @@ those dives that have either one OR both of these tags.
Il y a deux façons d'exporter des informations de plongée depuis Subsurface:
- Exporter les informations de plongée vers _Facebook_
- xref:S_Export_other[Exporter des informations de plongée vers d'autres
destinations ou formats]
@ -3299,7 +3305,8 @@ ces ordinateurs de plongée peuvent être lues et modifiées. Pour commencer,
assurez vous que les pilotes pour votre ordinateur de plongée sont installés
(également nécessaire pour télécharger les plongées) et que le nom de
périphérique de l'ordinateur de plongée est connu. Voir
<<appendix_a,ANNEXE A>> pour plus d'informations sur la manière de procéder.
<<_appendix_a_operating_system_specific_information_for_importing_dive_information_from_a_dive_computer,
ANNEXE A>> pour plus d'informations sur la manière de procéder.
Une fois que l'ordinateur de plongée est connecté à _Subsurface_,
sélectionner _Fichier -> Configurer l'ordinateur de plongée_, à partir du
@ -4330,6 +4337,10 @@ des sections de ce manuel traitant des opérations relatives.
- _Ordinateur suivant_ - Passer à l'ordinateur de plongée suivant.
- _Plein écran_ - Passer en mode plein écran.
=== Share on
- <<S_Facebook,_Facebook_>> - Partager la plongée sélectionnée sur votre
Facebook.
=== Aide
- _À propos de Subsurface_ - Affiche un panneau avec le numéro de version de
_Subsurface_ ainsi que les informations de licence.
@ -4343,7 +4354,6 @@ des sections de ce manuel traitant des opérations relatives.
[[appendix_a]]
== ANNEXE A : informations spécifiques au système d'exploitation utilisé pour importer les informations de plongées depuis un ordinateur de plongée.
=== Assurez-vous que les pilotes (drivers) nécessaires sont installés
@ -5291,7 +5301,7 @@ see thumbnails that represent individual videos, _Subsurface_ uses an
external program calle _FFmpeg_. To create thumbnails for videos, do two
things:
1. Install _FFmpeg_ on the computer that runs _Subsurface_. The program can be
Install _FFmpeg_ on the computer that runs _Subsurface_. The program can be
downloaded from the FFmpeg web site:
https://www.ffmpeg.org/download.html. Most Linux distributions ship with an
_ffmpeg_ package and therefore do not need an additional download.

View File

@ -4,7 +4,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 10.1.2" />
<meta name="generator" content="AsciiDoc 8.6.10" />
<title></title>
<style type="text/css">
/*
@ -17,7 +17,7 @@
*/
* { padding: 0; margin: 0; }
img { border: 0; margin: 15px; max-width:90% }
img { border: 0; }
/*** Layout ***/
@ -78,12 +78,12 @@ body { font-family: Verdana, sans-serif; }
#footer { font-size: 0.8em; }
h2, h3, h4, h5, .title { font-family: Arial, sans-serif; }
h2 { font-size: 160%; }
h2 { font-size: 1.5em; }
.sectionbody { font-size: 0.85em; }
.sectionbody .sectionbody { font-size: inherit; }
h3 { font-size: 150%; } /* 1.35em */
h4 { font-size: 140%; } /* 1.2em */
h5 { font-size: 130%; } /* 1em */
h3 { font-size: 159%; } /* 1.35em */
h4 { font-size: 141%; } /* 1.2em */
h5 { font-size: 118%; } /* 1em */
.title { font-size: 106%; /* 0.9em */
font-weight: bold;
}
@ -514,9 +514,9 @@ moet installeren staat uitgelegd op <em>Downloaden</em> page on the
<a href="https://subsurface-divelog.org/"><em>Subsurface</em> website</a>. Vragen over of problemen met
het programma kunnen bij de ontwikkelaars gemeld worden via email op
<a href="mailto:subsurface@subsurface-divelog.org">onze mailinglijst</a>. Fouten kunnen
ook gemeld worden op <a href="https://github.com/Subsurface/subsurface/issues">onze bugtracker</a>.
ook gemeld worden op <a href="https://github.com/Subsurface-divelog/subsurface/issues">onze bugtracker</a>.
Instructies hoe <em>Subsurface</em> zelf te compileren vanuit de broncode staan ook op
onze website en in het INSTALL.md bestand in de broncode.</p></div>
onze website en in het INSTALL bestand in de broncode.</p></div>
<div class="paragraph"><p><strong>Doelgroep</strong>: Recreatieve duikers, Tec duikers, Apneu duikers,
Professionele duikers.</p></div>
<div id="toc">
@ -2119,7 +2119,7 @@ met een duik, en op deze manier zichtbaar zijn via het <em>Media</em> tabblad va
het <strong>Notities</strong> paneel.</p></div>
</div>
<div class="sect3">
<h4 id="S_ViewMedia">5.5.2. Media bekijken</h4>
<h4 id="_media_bekijken">5.5.2. Media bekijken</h4>
<div class="sidebarblock">
<div class="content">
<div class="paragraph"><p><strong>Zorg ervoor dat thumbnails voor video kunnen worden gemaakt</strong></p></div>
@ -3529,12 +3529,58 @@ grotduik met Bob).</p></div>
<div class="ulist"><ul>
<li>
<p>
Exporteer duikinformatie naar <em>Facebook</em>
</p>
</li>
<li>
<p>
<a href="#S_Export_other">Exporteer duikinformatie naar andere bestemmingen of formaten</a>
</p>
</li>
</ul></div>
<div class="sect2">
<h3 id="S_Export_other">8.1. Exporteer duikinformatie naar andere bestemmingen of formaten</h3>
<h3 id="S_Facebook">8.1. Exporteer duikinformatie naar <em>Facebook</em></h3>
<div class="paragraph"><p>Exporteren naar <em>Facebook</em> werkt op een andere manier dan andere vormen van
export, met name omdat er een verbinding met <em>Facebook</em> aanwezig moet zijn die
is ingelogd. Selecteer vanuit het hoofdmenu <em>Deel via &#8594; Facebook</em> (zie figuur
<strong>A</strong> hieronder). Een inlogscherm voor <em>Facebook</em> verschijnt (zie figuur
<strong>B</strong> hieronder), en log in bij <em>Facebook</em>.</p></div>
<div class="paragraph"><p>Het is eenvoudig te zien in het hoofdmenu of er een verbinding met <em>Facebook</em>
actief is. In het <em>Deel via</em> menu is de <em>Facebook knop</em> grijs en niet-selecteerbaar
als er geen verbinding is (figuur <strong>A</strong> hieronder).</p></div>
<div class="paragraph"><p>Eenmaal ingelogd op <em>Facebook</em> wordt er een paneel getoond met het bericht:
"Gebruik het <em>Deel via</em> menu om de verbinding van Subsurface met uw Facebook
account te sluiten.". Sluit dit paneel.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/facebook1.jpg" alt="Figuur: Facebook login" />
</div>
</div>
<div class="paragraph"><p>Met de verbinding met <em>Facebook</em> geactiveerd is het overdragen van een duik naar
<em>Facebook</em> eenvoudig. Selecteer eerst de duik in de <strong>Duiklijst</strong>. Selecteer dan
uit het hoofdmenu <em>Deel via &#8594; Facebook</em>. Er verschijnt een dialoog, waarin
aangegeven kan worden welke informatie naast het duikprofiel, moet worden
overgedragen naar <em>Facebook</em> (zie figuur <strong>A</strong> hieronder).</p></div>
<div class="paragraph"><p>Om een duikprofiel naar <em>Facebook</em> te exporteren is de naam van een (foto) album
nodig. De keuzevakjes aan de linker zijde bepalen welke data uit het logboek
eveneens wordt geëxporteerd. Deze verschijnen in het tekst veld aan de rechter zijde,
welke verder handmatig kan worden aangepast. Nadat alles naar wens is ingevuld,
kan via de <em>OK</em> knop de feitelijke export worden gedaan. Als de export gereed is
volgt een bevestiging.</p></div>
<div class="paragraph"><p>Zowel het album als de geëxporteerde profiel (met annotaties) is in <em>Facebook</em> als
privé aangemerkt, en de rechten van de geëxporteerde data moeten dus handmatig
in <em>Facebook</em> worden gezet zoals gewenst.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/facebook2.jpg" alt="Figuur: Facebook data submission" />
</div>
</div>
<div class="paragraph"><p>De verbinding met <em>Facebook</em> kan nu worden afgesloten als dat gewenst is. Gebruik
hiervoor uit het hoofdmenu <em>Deel via &#8594; Verbinding verbreken met &#8594; Facebook</em> (
figuur <strong>B</strong> hierboven).</p></div>
</div>
<div class="sect2">
<h3 id="S_Export_other">8.2. Exporteer duikinformatie naar andere bestemmingen of formaten</h3>
<div class="paragraph"><p>Andere dan <em>Facebook</em> exports kunnen gevonden worden door in het hoofdmenu
<em>Bestand &#8594; Exporteren</em> te kiezen. De exporteer dialoog biedt de mogelijkheid
om ALLE, of alleen de in de <strong>Duiklijst</strong> geselecteerde duiken, te exporteren. Kies
@ -5438,7 +5484,17 @@ tegelijktijd.
</ul></div>
</div>
<div class="sect2">
<h3 id="_help">16.6. Help</h3>
<h3 id="_deel_via">16.6. Deel via</h3>
<div class="ulist"><ul>
<li>
<p>
<a href="#S_Facebook"><em>Facebook</em></a> - Deel de geselecteerde duik op de Facebook tijdslijn.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_help">16.7. Help</h3>
<div class="ulist"><ul>
<li>
<p>
@ -7049,7 +7105,7 @@ alleen als deze nog niet zijn overschreven door nieuwere duiken.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
2024-02-08 08:55:00 PST
2018-09-19 08:04:33 PDT
</div>
</div>
</body>

View File

@ -59,7 +59,7 @@ het programma kunnen bij de ontwikkelaars gemeld worden via email op
mailto:subsurface@subsurface-divelog.org[onze mailinglijst]. Fouten kunnen
ook gemeld worden op https://github.com/Subsurface/subsurface/issues[onze bugtracker].
Instructies hoe _Subsurface_ zelf te compileren vanuit de broncode staan ook op
onze website en in het INSTALL.md bestand in de broncode.
onze website en in het INSTALL bestand in de broncode.
*Doelgroep*: Recreatieve duikers, Tec duikers, Apneu duikers,
Professionele duikers.
@ -1409,7 +1409,6 @@ met een duik, en op deze manier zichtbaar zijn via het _Media_ tabblad van
het *Notities* paneel.
[[S_ViewMedia]]
==== Media bekijken
****
@ -2542,6 +2541,8 @@ grotduik met Bob).
Er zijn twee manieren om duik informatie uit _Subsurface_ te exporteren:
- Exporteer duikinformatie naar _Facebook_
- xref:S_Export_other[Exporteer duikinformatie naar andere bestemmingen of formaten]
[[S_Export_other]]
@ -3771,6 +3772,9 @@ tegelijkertijd gebruiken>> en <<S_MergeDivePlan, combineren van een duik en zij
- _Volgende duikcomputer_ - Kies de volgende duikcomputer.
- _Volledig scherm_ - Volledig gevuld scherm aan en uit.
=== Deel via
- <<S_Facebook,_Facebook_>> - Deel de geselecteerde duik op de Facebook tijdslijn.
=== Help
- _Over Subsurface_ - Toont een paneel met versienummer van _Subsurface_ en
licentievoorwaarden.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

379
INSTALL Normal file
View File

@ -0,0 +1,379 @@
Building Subsurface from Source
===============================
Subsurface uses quite a few open source libraries and frameworks to do its
job. The most important ones include libdivecomputer, Qt, libxml2, libxslt,
libsqlite3, libzip, libgrantlee5 and libgit2.
Below are instructions for building Subsurface
- on some popular Linux distributions,
- MacOSX,
- Windows (cross-building)
- Android (cross-building)
- iOS (cross-building)
Getting Subsurface source
-------------------------
You can get the sources to the latest development version from our git
repository:
git clone http://github.com/Subsurface/subsurface.git
You keep it updated by doing:
git checkout master
git pull -r
Getting our flavor of libdivecomputer
-------------------------------------
All our prebuilt binaries (see https://subsurface-divelog.org/download)
are built using our own custom "flavor" of libdivecomputer
see https://github.com/Subsurface/libdc.git
In order to get the modified sources, do
- locate yourself in the subsurface repo on your local computer
- run "git submodule init"
- run "git submodule update"
The branches won't have a pretty history and will include ugly merges,
but they should always allow a fast forward pull that tracks what we
believe developers should build against. All our patches are contained
in the "Subsurface-NG".
This should allow distros to see which patches we have applied on top of
upstream. They will receive force pushes as we rebase to newer versions of
upstream so they are not ideal for ongoing development (but they are of
course easy to use for distributions as they always build "from scratch",
anyway).
The rationale for this is that we have no intention of forking the
project. We simply are adding a few patches on top of their latest
version and want to do so in a manner that is both easy for our
developers who try to keep them updated frequently, and anyone packaging
Subsurface or trying to understand what we have done relative to their
respective upstreams.
Getting Qt5
-----------
We use Qt5 in order to only maintain one UI across platforms.
Qt5.9.1 is the oldest version supported if ONLY building Subsurface
Qt5.12 is the oldest version supported if also building Subsurface-mobile
Download the Open Source version from https://www.qt.io/download and
follow the Qt instructions to install it or alternatively follow the
instruction specific to a distribution (see build instructions).
To save time and disk space you can unselect Android and IOS packages
(Of course unless you want to build Android/iOS versions) as well as
- Qt Data Visualisation
- Qt Purchasing
- Qt Virtual Keyboard",
- Qt WebEngine
- Qt Network Authorization
- Qt Remote Objects
- Qt WebGL Streaming
- Qt 3D2
- Qt Canvas 3D
- Qt Extras
This can be done later by use of MaintenanceTool.app in your Qt folder.
Remark: most Qt installations do not make Qt available on the command
line, which is needed. In order to make Qt available you need to
add qmake to the path, do something like
PATH=$PATH:<Qt location>/<version>/<type>/bin
QtWebKit is needed, if you want to print, but no longer part of Qt5,
so you need to download it and compile. In case you just want to test
without print possibility omit this step.
Other third party library dependencies
--------------------------------------
In order for our cloud storage to be fully functional you need
libgit2 0.26 or newer.
cmake build system
------------------
Our main build system is based on cmake. But qmake is needed
for the googlemaps plugin and the iOS build.
Download from https://cmake.org/download and follow the instructions
to install it or alternatively follow the instruction specific to a
distribution (see build instructions).
Build options for Subsurface
----------------------------
The following options are recognised when passed to cmake:
-DCMAKE_BUILD_TYPE=Release create a release build
-DCMAKE_BUILD_TYPE=Debug create a debug build
The Makefile that was created using cmake can be forced into a much more
verbose mode by calling
make VERBOSE=1
Many more variables are supported, the easiest way to interact with them is
to call
ccmake .
in your build directory.
Building the development version of Subsurface under Linux
----------------------------------------------------------
On Fedora you need
sudo dnf install autoconf automake bluez-libs-devel cmake gcc-c++ git \
libcurl-devel libsqlite3x-devel libssh2-devel libtool libudev-devel \
libusbx-devel libxml2-devel libxslt-devel make \
qt5-qtbase-devel qt5-qtconnectivity-devel qt5-qtdeclarative-devel \
qt5-qtlocation-devel qt5-qtscript-devel qt5-qtsvg-devel \
qt5-qttools-devel qt5-qtwebkit-devel redhat-rpm-config \
bluez-libs-devel libgit2-devel libzip-devel
Package names are sadly different on OpenSUSE
sudo zypper install git gcc-c++ make autoconf automake libtool cmake libzip-devel \
libxml2-devel libxslt-devel sqlite3-devel libusb-1_0-devel \
libqt5-linguist-devel libqt5-qttools-devel libQt5WebKitWidgets-devel \
libqt5-qtbase-devel libQt5WebKit5-devel libqt5-qtsvg-devel \
libqt5-qtscript-devel libqt5-qtdeclarative-devel \
libqt5-qtconnectivity-devel libqt5-qtlocation-devel libcurl-devel \
bluez-devel libgit2-devel
On Debian Buster this seems to work
sudo apt install \
autoconf automake cmake g++ git libbluetooth-dev libcrypto++-dev \
libcurl4-openssl-dev libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libtool \
libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make pkg-config \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 \
qt5-default qt5-qmake qtchooser qtconnectivity5-dev qtdeclarative5-dev \
qtdeclarative5-private-dev qtlocation5-dev qtpositioning5-dev \
qtscript5-dev qttools5-dev qttools5-dev-tools
In order to build and run mobile-on-desktop, you also need
sudo apt install \
qtquickcontrols2-5-dev qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-layouts qml-module-qtquick-controls2 qml-module-qtquick-templates2 \
qml-module-qtgraphicaleffects qml-module-qtqml-models2 qml-module-qtquick-controls
Package names for Ubuntu 20.04
sudo apt install \
autoconf automake cmake g++ git libbluetooth-dev libcrypto++-dev \
libcurl4-gnutls-dev libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libtool \
libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make pkg-config \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 \
qt5-default qt5-qmake qtchooser qtconnectivity5-dev qtdeclarative5-dev \
qtdeclarative5-private-dev qtlocation5-dev qtpositioning5-dev \
qtscript5-dev qttools5-dev qttools5-dev-tools
In order to build and run mobile-on-desktop, you also need
sudo apt install \
qtquickcontrols2-5-dev qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-layouts qml-module-qtquick-controls2 qml-module-qtquick-templates2 \
qml-module-qtgraphicaleffects qml-module-qtqml-models2 qml-module-qtquick-controls
On Raspberry Pi (Raspian Buster and Ubuntu Mate 20.04.1) this seems to work
sudo apt install \
autoconf automake cmake g++ git libbluetooth-dev libcrypto++-dev \
libcurl4-gnutls-dev libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libtool \
libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make pkg-config \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 \
qt5-default qt5-qmake qtchooser qtconnectivity5-dev qtdeclarative5-dev \
qtdeclarative5-private-dev qtlocation5-dev qtpositioning5-dev \
qtscript5-dev qttools5-dev qttools5-dev-tools
In order to build and run mobile-on-desktop, you also need
sudo apt install \
qtquickcontrols2-5-dev qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-layouts qml-module-qtquick-controls2 qml-module-qtquick-templates2 \
qml-module-qtgraphicaleffects qml-module-qtqml-models2 qml-module-qtquick-controls
Note that on Ubuntu Mate on the Raspberry Pi, you may need to configure
some swap space in order for the build to complete successfully. There is no
swap space configured by default. See the dphys-swapfile package.
On PCLinuxOS you appear to need the following packages
su -c "apt-get install -y autoconf automake cmake gcc-c++ git libtool \
lib64bluez-devel lib64qt5bluetooth-devel lib64qt5concurrent-devel \
lib64qt5help-devel lib64qt5location-devel lib64qt5quicktest-devel \
lib64qt5quickwidgets-devel lib64qt5script-devel lib64qt5svg-devel \
lib64qt5test-devel lib64qt5webkitwidgets-devel lib64qt5xml-devel \
lib64ssh2-devel lib64usb1.0-devel lib64zip-devel qttools5 qttranslations5"
In order to build Subsurface, use the supplied build script. This should
work on most systems that have all the prerequisite packages installed.
You should have Subsurface sources checked out in a sane place, something
like this:
mkdir -p ~/src
cd ~/src
git clone https://github.com/Subsurface/subsurface.git
./subsurface/scripts/build.sh # <- this step will take quite a while as it
# compiles a handful of libraries before
# building Subsurface
Now you can run Subsurface like this:
cd ~/src/subsurface/build
./subsurface
Note: on many Linux versions (for example on Kubuntu 15.04) the user must
belong to the dialout group.
You may need to run something like
sudo usermod -a -G dialout username
with your correct username and log out and log in again for that to take
effect.
If you get errors like:
./subsurface: error while loading shared libraries: libGrantlee_Templates.so.5: cannot open shared object file: No such file or directory
You can run the following command:
sudo ldconfig ~/src/install-root/lib
Building Subsurface under MacOSX
--------------------------------
You have 2 options for the first time install, either using homebrew
or by manually building the dependencies from source, depending on
what else you have installed on your mac.
0) You need to have XCode installed. The first time (and possibly after updating OSX)
0.1) run "xcode-select --install"
homebrew option:
1) brew install libzip cmake libusb pkg-config automake libtool hidapi curl libssh2
2) cd <repo>/..; bash <repo>/scripts/build.sh
Manual option:
1) install pkg-config
1.1) download http://sourceforge.net/projects/macpkg/files/PkgConfig/0.26/PkgConfig.pkg/download
1.2) run "PkgConfig.pkg"
1.3) run "sudo ln -s /opt/pkgconfig/bin/pkg-config /usr/local/bin/pkg-config"
2) install autoconf tools
2.1) curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-latest.tar.gz
2.2) tar -xzf autoconf-latest.tar.gz
2.3) cd autoconf-*; ./configure && make && sudo make install; cd ..
3) cd <repo>/..; bash <repo>/scripts/build.sh -build-deps -desktop
After the above is done, Subsurface.app will be available in the
subsurface/build directory. You can run Subsurface with the command
A) open subsurface/build/Subsurface.app
this will however not show diagnostic output
B) subsurface/build/Subsurface.app/Contents/MacOS/Subsurface
the TAB key is your friend :-)
Debugging can be done with either Xcode or QtCreator.
To install the app for all users, move subsurface/build/Subsurface.app to /Applications.
Cross-building Subsurface on MacOSX for iOS
-------------------------------------------
1) build SubSurface under MacOSX and iOS
1.1) cd <repo>/..; bash <repo>/scripts/build.sh -build-deps -both
note: this is mainly done to ensure all external dependencies are downloaded and set
to the correct versions
2) continue as described in subsurface/packaging/ios
Cross-building Subsurface on Linux for Windows
----------------------------------------------
Subsurface builds nicely with MinGW - the official builds are done as
cross builds under Linux (currently on Ubuntu 14.04). A shell script to do
that (plus the .nsi file to create the installer with makensis) are
included in the packaging/windows directory.
Please read through the explanations and instructions in
packaging/windows/mxe-based-build.sh if you want to build the Windows
version on your Linux system.
In addition you can use the Docker container the same way that CI builds do modify/test
modifications to the container build environment following instructions in
/scripts/docker/mxe-build-container/instructions.md
Building Subsurface on Windows
------------------------------
This is NOT RECOMMENDED. To the best of our knowledge there is one single
person who regularly does this. The Subsurface team does not provide support
for Windows binary build from sources natively under Windows...
The lack of a working package management system for Windows makes it
really painful to build Subsurface natively under Windows,
so we don't support that at all.
Cross-building Subsurface on Linux for Android
----------------------------------------------
To compile the mobile version you will need:
-Qt for Android (this can be downloaded from: http://www.qt.io/download-open-source/)
-Android SDK
-Android NDK
In the folder containing the subsurface source dir run: bash subsurface/packaging/android/android-build-wrapper.sh
This will download and install the required NDK, SDK and Qt required to build the app.
After that, you can run: ./subsurface/packaging/android/build.sh everytime you want to build a new version.
This will generate an apk file in ./subsurface-mobile-build-arm/build/outputs/apk/debug

View File

@ -1,430 +0,0 @@
# Building Subsurface from Source
Subsurface uses quite a few open source libraries and frameworks to do its
job. The most important ones include libdivecomputer, Qt, libxml2, libxslt,
libsqlite3, libzip, and libgit2.
Below are instructions for building Subsurface
- on some popular Linux distributions,
- MacOSX,
- Windows (cross-building)
- Android (cross-building)
- iOS (cross-building)
## Getting Subsurface source
You can get the sources to the latest development version from our git
repository:
```
git clone http://github.com/Subsurface/subsurface.git
cd subsurface
git submodule init # this will give you our flavor of libdivecomputer
```
You keep it updated by doing:
```
git checkout master
git pull -r
git submodule update
```
### Our flavor of libdivecomputer
Subsurface requires its own flavor of libdivecomputer which is inclduded
above as git submodule
The branches won't have a pretty history and will include ugly merges,
but they should always allow a fast forward pull that tracks what we
believe developers should build against. All our patches are contained
in the `Subsurface-DS9` branch.
This should allow distros to see which patches we have applied on top of
upstream. They will receive force pushes as we rebase to newer versions of
upstream so they are not ideal for ongoing development (but they are of
course easy to use for distributions as they always build "from scratch",
anyway).
The rationale for this is that we have no intention of forking the
project. We simply are adding a few patches on top of their latest
version and want to do so in a manner that is both easy for our
developers who try to keep them updated frequently, and anyone packaging
Subsurface or trying to understand what we have done relative to their
respective upstreams.
### Getting Qt5
We use Qt5 in order to only maintain one UI across platforms.
Qt5.9.1 is the oldest version supported if ONLY building Subsurface
Qt5.12 is the oldest version supported if also building Subsurface-mobile
Most Linux distributions include a new enough version of Qt (and if you are on
a distro that still ships with an older Qt, likely your C compiler is also not
new enough to build Subsurface).
If you need Qt (likely on macOS) or want a newer version than provided by your
Linux distro, you can install a separate version that Subsurface will use.
As of Qt5.15 it has become a lot harder to download and install Qt - you
now need a Qt account and the installer tool has a new space age look and
significantly reduced flexibility.
As of this writing, there is thankfully a thirdparty offline installer still
available:
```
pip3 install aqtinstall
aqt install -O <Qt Location> 5.15.2 mac desktop
```
(or whatever version / OS you need). This installer is surprisingly fast
and seems well maintained - note that we don't use this for Windows as
that is completely built from source using MXE.
In order to use this Qt installation, simply add it to your PATH:
```
PATH=<Qt Location>/<version>/<type>/bin:$PATH
```
QtWebKit is needed, if you want to print, but no longer part of Qt5,
so you need to download it and compile. In case you just want to test
without print possibility omit this step.
```
git clone -b 5.212 https://github.com/qt/qtwebkit
mkdir -p qtwebkit/WebKitBuild/Release
cd qtwebkit/WebKitBuild/Release
cmake -DPORT=Qt -DCMAKE_BUILD_TYPE=Release -DQt5_DIR=/<Qt Location>/<version>/<type>/lib/cmake/Qt5 ../..
make install
```
### Other third party library dependencies
In order for our cloud storage to be fully functional you need
libgit2 0.26 or newer.
### cmake build system
Our main build system is based on cmake. But qmake is needed
for the googlemaps plugin and the iOS build.
Download from https://cmake.org/download and follow the instructions
to install it or alternatively follow the instruction specific to a
distribution (see build instructions).
## Build options for Subsurface
The following options are recognised when passed to cmake:
`-DCMAKE_BUILD_TYPE=Release` create a release build
`-DCMAKE_BUILD_TYPE=Debug` create a debug build
The Makefile that was created using cmake can be forced into a much more
verbose mode by calling
```
make VERBOSE=1
```
Many more variables are supported, the easiest way to interact with them is
to call
```
ccmake .
```
in your build directory.
### Building the development version of Subsurface under Linux
On Fedora you need
```
sudo dnf install autoconf automake bluez-libs-devel cmake gcc-c++ git \
libcurl-devel libsqlite3x-devel libssh2-devel libtool libudev-devel \
libusbx-devel libxml2-devel libxslt-devel make \
qt5-qtbase-devel qt5-qtconnectivity-devel qt5-qtdeclarative-devel \
qt5-qtlocation-devel qt5-qtscript-devel qt5-qtsvg-devel \
qt5-qttools-devel qt5-qtwebkit-devel redhat-rpm-config \
bluez-libs-devel libgit2-devel libzip-devel libmtp-devel
```
Package names are sadly different on OpenSUSE
```
sudo zypper install git gcc-c++ make autoconf automake libtool cmake libzip-devel \
libxml2-devel libxslt-devel sqlite3-devel libusb-1_0-devel \
libqt5-linguist-devel libqt5-qttools-devel libQt5WebKitWidgets-devel \
libqt5-qtbase-devel libQt5WebKit5-devel libqt5-qtsvg-devel \
libqt5-qtscript-devel libqt5-qtdeclarative-devel \
libqt5-qtconnectivity-devel libqt5-qtlocation-devel libcurl-devel \
bluez-devel libgit2-devel libmtp-devel
```
On Debian Bookworm this seems to work
```
sudo apt install \
autoconf automake cmake g++ git libbluetooth-dev libcrypto++-dev \
libcurl4-openssl-dev libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libtool \
libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make pkg-config \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 \
qt5-qmake qtchooser qtconnectivity5-dev qtdeclarative5-dev \
qtdeclarative5-private-dev qtlocation5-dev qtpositioning5-dev \
qtscript5-dev qttools5-dev qttools5-dev-tools libmtp-dev
```
In order to build and run mobile-on-desktop, you also need
```
sudo apt install \
qtquickcontrols2-5-dev qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-layouts qml-module-qtquick-controls2 qml-module-qtquick-templates2 \
qml-module-qtgraphicaleffects qml-module-qtqml-models2 qml-module-qtquick-controls
```
Package names for Ubuntu 21.04
```
sudo apt install \
autoconf automake cmake g++ git libbluetooth-dev libcrypto++-dev \
libcurl4-gnutls-dev libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libtool \
libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make pkg-config \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 \
qt5-qmake qtchooser qtconnectivity5-dev qtdeclarative5-dev \
qtdeclarative5-private-dev qtlocation5-dev qtpositioning5-dev \
qtscript5-dev qttools5-dev qttools5-dev-tools libmtp-dev
```
In order to build and run mobile-on-desktop, you also need
```
sudo apt install \
qtquickcontrols2-5-dev qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-layouts qml-module-qtquick-controls2 qml-module-qtquick-templates2 \
qml-module-qtgraphicaleffects qml-module-qtqml-models2 qml-module-qtquick-controls
```
On Raspberry Pi (Raspian Buster and Ubuntu Mate 20.04.1) this seems to work
```
sudo apt install \
autoconf automake cmake g++ git libbluetooth-dev libcrypto++-dev \
libcurl4-gnutls-dev libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libtool \
libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make pkg-config \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 \
qt5-qmake qtchooser qtconnectivity5-dev qtdeclarative5-dev \
qtdeclarative5-private-dev qtlocation5-dev qtpositioning5-dev \
qtscript5-dev qttools5-dev qttools5-dev-tools libmtp-dev
```
In order to build and run mobile-on-desktop, you also need
```
sudo apt install \
qtquickcontrols2-5-dev qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-layouts qml-module-qtquick-controls2 qml-module-qtquick-templates2 \
qml-module-qtgraphicaleffects qml-module-qtqml-models2 qml-module-qtquick-controls
```
Note that on Ubuntu Mate on the Raspberry Pi, you may need to configure
some swap space in order for the build to complete successfully. There is no
swap space configured by default. See the dphys-swapfile package.
On Raspberry Pi OS with Desktop (64-bit) Released April 4th, 2022, this seems
to work
```
sudo apt install \
autoconf automake cmake g++ git libbluetooth-dev libcrypto++-dev \
libcurl4-gnutls-dev libgit2-dev libqt5qml5 libqt5quick5 libqt5svg5-dev \
libqt5webkit5-dev libsqlite3-dev libssh2-1-dev libssl-dev libtool \
libusb-1.0-0-dev libxml2-dev libxslt1-dev libzip-dev make pkg-config \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 \
qt5-qmake qtchooser qtconnectivity5-dev qtdeclarative5-dev \
qtdeclarative5-private-dev qtlocation5-dev qtpositioning5-dev \
qtscript5-dev qttools5-dev qttools5-dev-tools libmtp-dev
```
Note that you'll need to increase the swap space as the default of 100MB
doesn't seem to be enough. 1024MB worked on a 3B+.
If maps aren't working, copy the googlemaps plugin
from `<build_dir>/subsurface/googlemaps/build/libqtgeoservices_googlemaps.so`
to `/usr/lib/aarch64-linux-gnu/qt5/plugins/geoservices/`.
If Subsurface can't seem to see your dive computer on `/dev/ttyUSB0`, even after
adjusting your account's group settings (see note below about usermod), it
might be that the FTDI driver doesn't recognize the VendorID/ProductID of your
computer. Follow the instructions here:
https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_101_Customising_FTDI_VID_PID_In_Linux(FT_000081).pdf
If you're unsure of the VID/PID of your device, plug your dive computer in to
your host and run `dmesg`. That should show the codes that are needed to
follow TN_101.
On PCLinuxOS you appear to need the following packages
```
su -c "apt-get install -y autoconf automake cmake gcc-c++ git libtool \
lib64bluez-devel lib64qt5bluetooth-devel lib64qt5concurrent-devel \
lib64qt5help-devel lib64qt5location-devel lib64qt5quicktest-devel \
lib64qt5quickwidgets-devel lib64qt5script-devel lib64qt5svg-devel \
lib64qt5test-devel lib64qt5webkitwidgets-devel lib64qt5xml-devel \
lib64ssh2-devel lib64usb1.0-devel lib64zip-devel qttools5 qttranslations5"
```
In order to build Subsurface, use the supplied build script. This should
work on most systems that have all the prerequisite packages installed.
You should have Subsurface sources checked out in a sane place, something
like this:
```
mkdir -p ~/src
cd ~/src
git clone https://github.com/Subsurface/subsurface.git
./subsurface/scripts/build.sh # <- this step will take quite a while as it
# compiles a handful of libraries before
# building Subsurface
```
Now you can run Subsurface like this:
```
cd ~/src/subsurface/build
./subsurface
```
Note: on many Linux versions (for example on Kubuntu 15.04) the user must
belong to the `dialout` group.
You may need to run something like
```
sudo usermod -a -G dialout $USER
```
with your correct username and log out and log in again for that to take
effect.
If you get errors like:
```
./subsurface: error while loading shared libraries: libGrantlee_Templates.so.5: cannot open shared object file: No such file or directory
```
You can run the following command:
```
sudo ldconfig ~/src/install-root/lib
```
### Building Subsurface under MacOSX
While it is possible to build all required components completely from source,
at this point the preferred way to build Subsurface is to set up the build
infrastructure via Homebrew and then build the dependencies from source.
0. You need to have XCode installed. The first time (and possibly after updating OSX)
```
xcode-select --install
```
1. install Homebrew (see https://brew.sh) and then the required build infrastructure:
```
brew install autoconf automake libtool pkg-config gettext
```
2. install Qt
download the macOS installer from https://download.qt.io/official_releases/online_installers
and use it to install the desired Qt version. At this point the latest Qt5 version is still
preferred over Qt6.
If you plan to deploy your build to an Apple Silicon Mac, you may have better results with
Bluetooth connections if you install Qt5.15.13. If Qt5.15.13 is not available via the
installer, you can download from https://download.qt.io/official_releases/qt/5.15/5.15.13
and build using the usual configure, make, and make install.
3. now build Subsurface
```
cd ~/src; bash subsurface/scripts/build.sh -build-deps
```
if you are building against Qt6 (still experimental) you can create a universal binary with
```
cd ~/src; bash subsurface/scripts/build.sh -build-with-qt6 -build-deps -fat-build
```
After the above is done, Subsurface.app will be available in the
subsurface/build directory. You can run Subsurface with the command
A. `open subsurface/build/Subsurface.app`
this will however not show diagnostic output
B. `subsurface/build/Subsurface.app/Contents/MacOS/Subsurface`
the [Tab] key is your friend :-)
Debugging can be done with either Xcode or QtCreator.
To install the app for all users, move subsurface/build/Subsurface.app to /Applications.
### Cross-building Subsurface on MacOSX for iOS
0. build SubSurface under MacOSX and iOS
1. `cd <repo>/..; bash <repo>/scripts/build.sh -build-deps -both`
note: this is mainly done to ensure all external dependencies are downloaded and set
to the correct versions
2. follow [these instructions](packaging/ios/README.md)
### Cross-building Subsurface on Linux for Windows
Subsurface for Windows builds on linux by using the [MXE (M cross environment)](https://github.com/mxe/mxe). The easiest way to do this is to use a Docker container with a pre-built MXE for Subsurface by following [these instructions](packaging/windows/README.md).
### Building Subsurface on Windows
This is NOT RECOMMENDED. To the best of our knowledge there is one single
person who regularly does this. The Subsurface team does not provide support
for Windows binary build from sources natively under Windows...
The lack of a working package management system for Windows makes it
really painful to build Subsurface natively under Windows,
so we don't support that at all.
But if you want to build Subsurface on a Windows system, the docker based [cross-build for Windows](packaging/windows/README.md) works just fine in WSL2 on Windows.
### Cross-building Subsurface on Linux for Android
Follow [these instructions](packaging/android/README.md).

View File

@ -1,17 +1,18 @@
# Subsurface
# Subsurface
[![Windows](https://github.com/subsurface/subsurface/actions/workflows/windows.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/windows.yml)
[![Mac](https://github.com/subsurface/subsurface/actions/workflows/mac.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/mac.yml)
[![iOS](https://github.com/subsurface/subsurface/actions/workflows/ios.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/ios.yml)
[![Android](https://github.com/subsurface/subsurface/actions/workflows/android.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/android.yml)
![Build Status](https://github.com/subsurface/subsurface/workflows/Windows/badge.svg)
![Build Status](https://github.com/subsurface/subsurface/workflows/Mac/badge.svg)
![Build Status](https://github.com/subsurface/subsurface/workflows/iOS/badge.svg)
![Build Status](https://github.com/subsurface/subsurface/workflows/Android/badge.svg)
[![Snap](https://github.com/subsurface/subsurface/actions/workflows/linux-snap.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/linux-snap.yml)
[![Ubuntu 16.04 / Qt 5.15-- for AppImage](https://github.com/subsurface/subsurface/actions/workflows/linux-ubuntu-16.04-5.12-appimage.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/linux-ubuntu-16.04-5.12-appimage.yml)
[![Ubuntu 24.04 / Qt 5.15--](https://github.com/subsurface/subsurface/actions/workflows/linux-ubuntu-24.04-5.15.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/linux-ubuntu-24.04-5.15.yml)
[![Fedora 35 / Qt 6--](https://github.com/subsurface/subsurface/actions/workflows/linux-fedora-35-qt6.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/linux-fedora-35-qt6.yml)
[![Debian trixie / Qt 5.15--](https://github.com/subsurface/subsurface/actions/workflows/linux-debian-trixie-5.15.yml/badge.svg)](https://github.com/subsurface/subsurface/actions/workflows/linux-debian-trixie-5.15.yml)
![Build Status](https://github.com/subsurface/subsurface/workflows/Ubuntu%2014.04%20/%20Qt%205.12%20for%20AppImage/badge.svg)
![Build Status](https://github.com/subsurface/subsurface/workflows/Ubuntu%2018.04%20/%20Qt%205.9/badge.svg)
![Build Status](https://github.com/subsurface/subsurface/workflows/Ubuntu%2019.10%20/%20Qt%205.12/badge.svg)
[![Coverity Scan Results](https://scan.coverity.com/projects/14405/badge.svg)](https://scan.coverity.com/projects/subsurface-divelog-subsurface)
This is the README file for Subsurface 4.9.7
Please check the `ReleaseNotes.txt` for details about new features and
changes since Subsurface 4.9.5 (and earlier versions).
Subsurface can be found at http://subsurface-divelog.org
@ -21,9 +22,15 @@ Report bugs and issues at https://github.com/Subsurface/subsurface/issues
License: GPLv2
We are releasing 'nightly' builds of Subsurface that are built from the latest version of the code. Versions of this build for Windows, macOS, Android (requiring sideloading), and a Linux AppImage can be downloaded from the [Latest Dev Release](https://www.subsurface-divelog.org/latest-release/) page on [our website](https://www.subsurface-divelog.org/). Alternatively, they can be downloaded [directly from GitHub](https://github.com/subsurface/nightly-builds/releases). Additionally, those same versions are
posted to the Subsurface-daily repos on Ubuntu Launchpad, Fedora COPR, and
OpenSUSE OBS, and released to [Snapcraft](https://snapcraft.io/subsurface) into the 'edge' channel of subsurface.
We frequently make new test versions of Subsurface available at
http://subsurface-divelog.org/downloads/test/ and there you can always get
the latest builds for Mac, Windows, Linux AppImage and Android (with some
caveats about installability). Additionally, those same versions are
posted to the Subsurface-daily repos on Launchpad and OBS.
These tend to contain the latest bug fixes and features, but also
occasionally the latest bugs and issues. Please understand when using them
that these are primarily intended for testing.
You can get the sources to the latest development version from the git
repository:
@ -35,11 +42,17 @@ git clone https://github.com/Subsurface/subsurface.git
You can also fork the repository and browse the sources at the same site,
simply using https://github.com/Subsurface/subsurface
Additionally, artifacts for Windows, macOS, Android, Linux AppImage, and iOS (simulator build) are generated for all open pull requests and linked in pull request comments. Use these if you want to test the changes in a specific pull request and provide feedback before it has been merged.
If you want the latest release (instead of the bleeding edge
development version) you can either get this via git or the release tar
ball. After cloning run the following command:
If you want a more stable version that is a little bit more tested you can get this from the [Curent Release](https://www.subsurface-divelog.org/current-release/) page on [our website](https://www.subsurface-divelog.org/).
```
git checkout v4.9.7 (or whatever the last release is)
```
Detailed build instructions can be found in the [INSTALL.md](/INSTALL.md) file.
or download a tarball from http://subsurface-divelog.org/downloads/Subsurface-4.9.7.tgz
Detailed build instructions can be found in the INSTALL file.
## System Requirements

Some files were not shown because too many files have changed in this diff Show More