diff options
162 files changed, 20288 insertions, 5499 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a260e729..cb1ff6618 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,112 +1,205 @@ +# cmake based build of Subsurface + project(Subsurface) cmake_minimum_required(VERSION 2.8.11) -SET(CMAKE_AUTOMOC ON) -SET(CMAKE_AUTOUIC ON) -SET(CMAKE_MODULE_PATH ${${PROJECT_NAME}_SOURCE_DIR}/marbledata) +# global settings + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +option(LIBGIT2_FROM_PKGCONFIG "use pkg-config to retrieve libgit2" OFF) +option(LIBDC_FROM_PKGCONFIG "use pkg-config to retrieve libdivecomputer" OFF) +option(NO_MARBLE "disable the marble widget" OFF) +option(NO_TESTS "disable the tests" OFF) +option(NO_DOCS "disable the docs" OFF) + +set(CMAKE_MODULE_PATH ${${PROJECT_NAME}_SOURCE_DIR}/cmake/Modules) +include_directories(. ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} qt-ui qt-ui/profile) + +# compiler specific settings if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUXX) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ") -endif() - -INCLUDE_DIRECTORIES( . ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} qt-ui qt-ui/profile) -FIND_PACKAGE(PkgConfig) - -MACRO(pkg_config_library LIBNAME pcfile) - pkg_check_modules(${LIBNAME} ${pcfile}) - include_directories(${${LIBNAME}_INCLUDE_DIRS}) - link_directories(${${LIBNAME}_LIBRARY_DIRS}) - add_definitions(${${LIBNAME}_CFLAGS_OTHER}) - set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${${LIBNAME}_LIBRARIES}) -ENDMACRO() - -pkg_config_library(LIBXML libxml-2.0) -pkg_config_library(LIBSQLITE3 sqlite3) -pkg_config_library(LIBGIT2 libgit2) -pkg_config_library(LIBXSLT libxslt) - -SET(LIBDCDEVEL "" CACHE STRING "libraries") -IF(NOT (LIBDCDEVEL STREQUAL "")) - cmake_policy(SET CMP0015 OLD) - include_directories(${LIBDCDEVEL}/include ) - link_directories(${LIBDCDEVEL}/src/.libs) -ENDIF() - -STRING(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${${PROJECT_NAME}_BINARY_DIR}" insource) -GET_FILENAME_COMPONENT(PARENTDIR ${${PROJECT_NAME}_SOURCE_DIR} PATH) -STRING(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${PARENTDIR}" insourcesubdir) -IF(NOT (insource OR insourcedir)) - add_custom_target(link_marble_data ALL COMMAND rm -f marbledata && ln -s ${${PROJECT_NAME}_SOURCE_DIR}/marbledata ${${PROJECT_NAME}_BINARY_DIR}/marbledata) -ENDIF() - -#configure Qt. -FIND_PACKAGE(Qt5Core REQUIRED) -FIND_PACKAGE(Qt5Concurrent REQUIRED) -FIND_PACKAGE(Qt5Widgets REQUIRED) -FIND_PACKAGE(Qt5Network REQUIRED) -FIND_PACKAGE(Qt5WebKitWidgets REQUIRED) -FIND_PACKAGE(Qt5PrintSupport REQUIRED) -FIND_PACKAGE(Qt5Svg REQUIRED) -FIND_PACKAGE(Qt5Test REQUIRED) -SET(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network Qt5::WebKitWidgets Qt5::PrintSupport Qt5::Svg) -SET(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test) - -FIND_PACKAGE(Marble REQUIRED) -INCLUDE_DIRECTORIES(${MARBLE_INCLUDE_DIR}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ") +endif() + +# pkgconfig for required libraries +find_package(PkgConfig) +include(cmake/Modules/pkgconfig_helper.cmake) + +pkg_config_library(LIBXML libxml-2.0 REQUIRED) +pkg_config_library(LIBSQLITE3 sqlite3 REQUIRED) +pkg_config_library(LIBXSLT libxslt REQUIRED) +pkg_config_library(LIBZIP libzip REQUIRED) +pkg_config_library(LIBUSB libusb-1.0 QUIET) + +# more libraries with special handling in case we build them ourselves + +if(LIBGIT2_FROM_PKGCONFIG) + pkg_config_library(LIBGIT2 libgit2 REQUIRED) + set(LIBGIT2_LIBRARIES "") +else() + find_package(LIBGIT2 REQUIRED) + include_directories(${LIBGIT2_INCLUDE_DIR}) +endif() + +if(LIBDC_FROM_PKGCONFIG) + pkg_config_library(LIBDC libdivecomputer REQUIRED) + set(LIBDIVECOMPUTER_LIBRARIES "") +else() + find_package(Libdivecomputer REQUIRED) + include_directories(${LIBDIVECOMPUTER_INCLUDE_DIR}) +endif() + +# optional marble + +if(NOT NO_MARBLE) + find_package(Marble QUIET) + if(MARBLE_FOUND) + include_directories(${MARBLE_INCLUDE_DIR}) + else() + set(NO_MARBLE ON) + endif() +endif() + +if(NO_MARBLE) + message(STATUS "building without marble widget support") + add_definitions(-DNO_MARBLE) + set(MARBLE_LIBRARIES "") +endif() + +set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${LIBDIVECOMPUTER_LIBRARIES} ${LIBGIT2_LIBRARIES} -lusb-1.0) + +# handle out of tree build correctly + +string(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${${PROJECT_NAME}_BINARY_DIR}" insource) +get_filename_component(PARENTDIR ${${PROJECT_NAME}_SOURCE_DIR} PATH) +string(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${PARENTDIR}" insourcesubdir) +if(NOT (insource OR insourcedir)) + if(NOT NO_MARBLE) + add_custom_target(link_marble_data ALL COMMAND rm -f marbledata && ln -s ${${PROJECT_NAME}_SOURCE_DIR}/marbledata ${${PROJECT_NAME}_BINARY_DIR}/marbledata) + endif() +endif() + +# configure Qt. + +find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Network WebKitWidgets PrintSupport Svg Test LinguistTools) +set(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network Qt5::WebKitWidgets Qt5::PrintSupport Qt5::Svg) +set(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test) # Generate the ssrf-config.h every 'make' -FILE(WRITE ${CMAKE_BINARY_DIR}/version.h.in " - #define VERSION_STRING \"@VERSION_STRING@\" - #define GIT_VERSION_STRING \"@GIT_VERSION_STRING@\" - #define CANONICAL_VERSION_STRING \"@CANONICAL_VERSION_STRING@\" + +file(WRITE ${CMAKE_BINARY_DIR}/version.h.in +"#define VERSION_STRING \"@VERSION_STRING@\" +#define GIT_VERSION_STRING \"@GIT_VERSION_STRING@\" +#define CANONICAL_VERSION_STRING \"@CANONICAL_VERSION_STRING@\" ") -FILE(WRITE ${CMAKE_BINARY_DIR}/version.cmake " - IF (\${APPLE}) - SET(VER_OS darwin) - ELSEIF (\${WIN32}) - SET(VER_OS win) - ELSE () - SET(VER_OS linux) - ENDIF () - EXECUTE_PROCESS( - COMMAND sh scripts/get-version \${VER_OS} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE VERSION_STRING - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - EXECUTE_PROCESS( - COMMAND sh scripts/get-version linux - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_VERSION_STRING - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - EXECUTE_PROCESS( - COMMAND sh scripts/get-version full - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE CANONICAL_VERSION_STRING - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - CONFIGURE_FILE(\${SRC} \${DST} @ONLY) + +file(WRITE ${CMAKE_BINARY_DIR}/version.cmake " + if(\${APPLE}) + set(VER_OS darwin) + elseif(\${WIN32}) + set(VER_OS win) + else() + set(VER_OS linux) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\") + set(VER_OS win) + endif() + execute_process( + COMMAND sh scripts/get-version \${VER_OS} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE VERSION_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND sh scripts/get-version linux + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_VERSION_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND sh scripts/get-version full + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE CANONICAL_VERSION_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + configure_file(\${SRC} \${DST} @ONLY) + if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\") + execute_process( + COMMAND cat ${CMAKE_SOURCE_DIR}/packaging/windows/subsurface.nsi.in + COMMAND sed -e \"s/VERSIONTOKEN/\${GIT_VERSION_STRING}/\" + COMMAND sed -e \"s/PRODVTOKEN/\${CANONICAL_VERSION_STRING}/\" + OUTPUT_FILE ${CMAKE_BINARY_DIR}/staging/subsurface.nsi + ) + endif() ") -ADD_CUSTOM_TARGET(version ALL COMMAND - ${CMAKE_COMMAND} -D SRC=${CMAKE_BINARY_DIR}/version.h.in - -D DST=${CMAKE_BINARY_DIR}/ssrf-version.h - -P ${CMAKE_BINARY_DIR}/version.cmake + +add_custom_target( + version ALL COMMAND ${CMAKE_COMMAND} ${CMAKE_COMMAND} + -D SRC=${CMAKE_BINARY_DIR}/version.h.in + -D DST=${CMAKE_BINARY_DIR}/ssrf-version.h + -D CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P ${CMAKE_BINARY_DIR}/version.cmake ) +# set up the different target platforms + +set(PLATFORM_SRC unknown_platform.c) +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(FBSUPPORT 1) + set(SUBSURFACE_TARGET subsurface) + set(PLATFORM_SRC linux.c) + # in some builds we appear to be missing libz for some strange reason... + set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lz) +endif() +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(FBSUPPORT 1) + set(SUBSURFACE_TARGET Subsurface) + set(PLATFORM_SRC macos.c) + find_library(APP_SERVICES_LIBRARY ApplicationServices) + set(EXTRA_LIBS ${APP_SERVICES_LIBRARY}) + set(ICON_FILE ${CMAKE_SOURCE_DIR}/packaging/macosx/Subsurface.icns) + set(MACOSX_BUNDLE_INFO_STRING "Subsurface") + set(MACOSX_BUNDLE_ICON_FILE Subsurface.icns) + set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.subsurface-divelog") + set(MACOSX_BUNDLE_BUNDLE_NAME "Subsurface") + set(MACOSX_BUNDLE_BUNDLE_VERSION "4.4.1") + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "4.4.1") + set(MACOSX_BUNDLE_LONG_VERSION_STRING "4.4.1") + set(MACOSX_BUNDLE_COPYRIGHT "Linus Torvalds, Dirk Hohndel, Tomaz Canabrava, and others") + set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + set(SUBSURFACE_PKG MACOSX_BUNDLE ${ICON_FILE}) +endif() +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(FBSUPPORT 1) + set(SUBSURFACE_TARGET subsurface) + set(PLATFORM_SRC windows.c) + set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lwsock32) + remove_definitions(-DUNICODE) + add_definitions(-mwindows) +endif() + +# include translations +add_subdirectory(translations) + # compile the core library, in C. -SET(SUBSURFACE_CORE_LIB_SRCS + +set(SUBSURFACE_CORE_LIB_SRCS cochran.c + datatrak.c deco.c device.c dive.c + divesite.c divelist.c equipment.c file.c + git-access.c libdivecomputer.c liquivision.c load-git.c membuffer.c + ostctools.c parse-xml.c planner.c profile.c @@ -122,10 +215,10 @@ SET(SUBSURFACE_CORE_LIB_SRCS time.c uemis.c uemis-downloader.c - linux.c - #gettextfrommoc should be added because we are using it on the c-code. + version.c + # gettextfrommoc should be added because we are using it on the c-code. gettextfromc.cpp - #dirk ported some core functionality to c++. + # dirk ported some core functionality to c++. qthelper.cpp divecomputer.cpp exif.cpp @@ -133,10 +226,17 @@ SET(SUBSURFACE_CORE_LIB_SRCS devicedetails.cpp configuredivecomputer.cpp configuredivecomputerthreads.cpp + divesitehelpers.cpp + ${PLATFORM_SRC} ) -#the interface, in C++ -SET(SUBSURFACE_INTERFACE +if(FBSUPPORT) + add_definitions(-DFBSUPPORT) + set(SOCIALNETWORKS qt-ui/socialnetworks.cpp) +endif() +# the interface, in C++ + +set(SUBSURFACE_INTERFACE qt-ui/updatemanager.cpp qt-ui/about.cpp qt-ui/completionmodels.cpp @@ -153,6 +253,7 @@ SET(SUBSURFACE_INTERFACE qt-ui/modeldelegates.cpp qt-ui/models.cpp qt-ui/metrics.cpp + qt-ui/notificationwidget.cpp qt-ui/preferences.cpp qt-ui/printdialog.cpp qt-ui/printlayout.cpp @@ -170,10 +271,15 @@ SET(SUBSURFACE_INTERFACE qt-ui/usersurvey.cpp qt-ui/configuredivecomputerdialog.cpp qt-ui/filtermodels.cpp + qt-ui/undocommands.cpp + qt-ui/locationinformation.cpp + qt-ui/qtwaitingspinner.cpp + ${SOCIALNETWORKS} ) -#the profile widget -SET(SUBSURFACE_PROFILE_LIB_SRCS +# the profile widget + +set(SUBSURFACE_PROFILE_LIB_SRCS qt-ui/profile/profilewidget2.cpp qt-ui/profile/diverectitem.cpp qt-ui/profile/divepixmapitem.cpp @@ -189,59 +295,269 @@ SET(SUBSURFACE_PROFILE_LIB_SRCS qt-ui/profile/tankitem.cpp ) -#the yearly statistics widget. -SET(SUBSURFACE_STATISTICS_LIB_SRCS +# the yearly statistics widget. + +set(SUBSURFACE_STATISTICS_LIB_SRCS qt-ui/statistics/statisticswidget.cpp qt-ui/statistics/yearstatistics.cpp qt-ui/statistics/statisticsbar.cpp qt-ui/statistics/monthstatistics.cpp ) -#the main app. -SET(SUBSURFACE_APP +# the main app. + +set(SUBSURFACE_APP main.cpp qt-gui.cpp qthelper.cpp ) -FILE(GLOB SUBSURFACE_UI qt-ui/*.ui) -QT5_WRAP_UI( SUBSURFACE_UI_HDRS ${SUBSURFACE_UI} ) - -ADD_LIBRARY(subsurface_corelib STATIC ${SUBSURFACE_CORE_LIB_SRCS} ) -TARGET_LINK_LIBRARIES(subsurface_corelib ${QT_LIBRARIES}) -ADD_LIBRARY(subsurface_profile STATIC ${SUBSURFACE_PROFILE_LIB_SRCS}) -TARGET_LINK_LIBRARIES(subsurface_profile ${QT_LIBRARIES}) -ADD_LIBRARY(subsurface_statistics STATIC ${SUBSURFACE_STATISTICS_LIB_SRCS}) -TARGET_LINK_LIBRARIES(subsurface_statistics ${QT_LIBRARIES}) -ADD_LIBRARY(subsurface_generated_ui STATIC ${SUBSURFACE_UI_HDRS}) -ADD_LIBRARY(subsurface_interface STATIC ${SUBSURFACE_INTERFACE}) -TARGET_LINK_LIBRARIES(subsurface_interface ${QT_LIBRARIES} ${MARBLE_LIBRARIES}) - -ADD_EXECUTABLE(subsurface ${SUBSURFACE_APP} ${SUBSURFACE_QRC_HRDS} ) -target_link_libraries( subsurface - subsurface_generated_ui - subsurface_interface - subsurface_profile - subsurface_statistics - subsurface_corelib - ${SUBSURFACE_LINK_LIBRARIES} - -ldivecomputer - -lzip +# create the libraries + +file(GLOB SUBSURFACE_UI qt-ui/*.ui) +qt5_wrap_ui(SUBSURFACE_UI_HDRS ${SUBSURFACE_UI}) +qt5_add_resources(SUBSURFACE_RESOURCES subsurface.qrc) + +add_library(subsurface_corelib STATIC ${SUBSURFACE_CORE_LIB_SRCS} ) +target_link_libraries(subsurface_corelib ${QT_LIBRARIES}) +add_library(subsurface_profile STATIC ${SUBSURFACE_PROFILE_LIB_SRCS}) +target_link_libraries(subsurface_profile ${QT_LIBRARIES}) +add_library(subsurface_statistics STATIC ${SUBSURFACE_STATISTICS_LIB_SRCS}) +target_link_libraries(subsurface_statistics ${QT_LIBRARIES}) +add_library(subsurface_generated_ui STATIC ${SUBSURFACE_UI_HDRS}) +target_link_libraries(subsurface_generated_ui ${QT_LIBRARIES}) +add_library(subsurface_interface STATIC ${SUBSURFACE_INTERFACE}) +target_link_libraries(subsurface_interface ${QT_LIBRARIES} ${MARBLE_LIBRARIES}) + +# add pthread to the end of the library list on Linux +# this is only needed on Ubuntu (why do these idiots break everything?) +# but shouldn't hurt on other Linux versions +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lpthread) +endif() + +# create the executables + +add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES}) +target_link_libraries( + ${SUBSURFACE_TARGET} + subsurface_generated_ui + subsurface_interface + subsurface_profile + subsurface_statistics + subsurface_corelib + ${SUBSURFACE_LINK_LIBRARIES} ) -ADD_DEPENDENCIES(subsurface_statistics subsurface_generated_ui) -ADD_DEPENDENCIES(subsurface_profile subsurface_generated_ui) -ADD_DEPENDENCIES(subsurface_interface subsurface_generated_ui) -ADD_DEPENDENCIES(subsurface_generated_ui version) -ADD_DEPENDENCIES(subsurface_corelib version) - -MACRO(test NAME FILE) - ADD_EXECUTABLE(${NAME} tests/${FILE}) - TARGET_LINK_LIBRARIES(${NAME} subsurface_corelib ${QT_TEST_LIBRARIES} ${SUBSURFACE_LINK_LIBRARIES} -lzip -ldivecomputer) - ADD_TEST(NAME ${NAME} COMMAND ${NAME}) -ENDMACRO() - -ENABLE_TESTING() -test(TestUnitConversion testunitconversion.cpp) -test(TestProfile testprofile.cpp) -test(TestGpsCoords testgpscoords.cpp) +add_dependencies(subsurface_statistics subsurface_generated_ui) +add_dependencies(subsurface_profile subsurface_generated_ui) +add_dependencies(subsurface_interface subsurface_generated_ui) +add_dependencies(subsurface_generated_ui version) +add_dependencies(subsurface_corelib version) + +# add platform specific actions +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/qt.conf + COMMAND echo \"[Paths]\" > ${CMAKE_BINARY_DIR}/qt.conf \; echo \"Prefix=.\" >> ${CMAKE_BINARY_DIR}/qt.conf + ) + add_custom_target( + generate_qtconf + DEPENDS ${CMAKE_BINARY_DIR}/qt.conf + ) + add_dependencies(${SUBSURFACE_TARGET} generate_qtconf) +endif() + +# QTest based tests + +macro(TEST NAME FILE) + add_executable(${NAME} EXCLUDE_FROM_ALL tests/${FILE} ${SUBSURFACE_RESOURCES}) + target_link_libraries(${NAME} subsurface_corelib ${QT_TEST_LIBRARIES} ${SUBSURFACE_LINK_LIBRARIES}) + add_test(NAME ${NAME}_build COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${NAME}) + add_test(NAME ${NAME}_run COMMAND ${NAME}) + set_tests_properties(${NAME}_run PROPERTIES DEPENDS ${NAME}_build) +endmacro() + +add_definitions(-DSUBSURFACE_SOURCE="${CMAKE_SOURCE_DIR}") +add_definitions(-g) +if(NOT NO_TESTS) + enable_testing() + TEST(TestUnitConversion testunitconversion.cpp) + TEST(TestProfile testprofile.cpp) + TEST(TestGpsCoords testgpscoords.cpp) + TEST(TestParse testparse.cpp) +endif() + +if(NOT NO_DOCS) + add_custom_target( + documentation ALL + mkdir -p ${CMAKE_BINARY_DIR}/Documentation/ \\; + cp -a ${CMAKE_SOURCE_DIR}/Documentation/images ${CMAKE_BINARY_DIR}/Documentation/ \\; + make -C ${CMAKE_SOURCE_DIR}/Documentation OUT=${CMAKE_BINARY_DIR}/Documentation/ doc + ) +endif() + +# install Subsurface +# first some variables with files that need installing + +set(DOCFILES + README + ReleaseNotes/ReleaseNotes.txt + SupportedDivecomputers.txt + ${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 +) + +set(QTTRANSLATIONS_BASE + qt_da.qm + qt_de.qm + qt_es.qm + qt_fr.qm + qt_he.qm + qt_hu.qm + qt_pl.qm + qt_pt.qm + qt_ru.qm + qt_sk.qm + qt_sv.qm + qt_zh_TW.qm +) + +if(NOT DEFINED QT_TRANSLATION_DIR OR QT_TRANSLATION_DIR STREQUAL "") + set(QT_TRANSLATION_DIR ${Qt5Core_DIR}/../../../translations) +endif() +set(QTTRANSLATIONS "") +foreach(QTTRANSLATION ${QTTRANSLATIONS_BASE}) + if(NOT ${QTTRANSLATION} STREQUAL "") + set(QTTRANSLATIONS ${QTTRANSLATIONS} ${QT_TRANSLATION_DIR}/${QTTRANSLATION}) + endif() +endforeach() + +# now for each platform the install instructions + +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(RESOURCEDIR ${CMAKE_BINARY_DIR}/Subsurface.app/Contents/Resources) + install(DIRECTORY marbledata/maps DESTINATION ${RESOURCEDIR}/data) + install(DIRECTORY marbledata/bitmaps DESTINATION ${RESOURCEDIR}/data) + install(DIRECTORY Documentation/images DESTINATION ${RESOURCEDIR}/share/Documentation) + install(FILES ${DOCFILES} DESTINATION ${RESOURCEDIR}/share/Documentation) + install(DIRECTORY theme DESTINATION ${RESOURCEDIR}) + install(FILES ${TRANSLATIONS} DESTINATION ${RESOURCEDIR}/translations) + install(FILES ${QTTRANSLATIONS} DESTINATION ${RESOURCEDIR}/translations) + install(FILES ${CMAKE_SOURCE_DIR}/gpl-2.0.txt DESTINATION ${RESOURCEDIR}) + # 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} Subsurface.app)") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + # Windows bundling rules + # We don't have a helpful tool like macdeployqt for Windows, so we hardcode + # which libs we need. + # "make install", copies everything into a staging area + # "make installer", uses makensis to create an installer executable + set(WINDOWSSTAGING ${CMAKE_BINARY_DIR}/staging) + install(DIRECTORY marbledata/maps DESTINATION ${WINDOWSSTAGING}/data) + install(DIRECTORY marbledata/bitmaps DESTINATION ${WINDOWSSTAGING}/data) + install(DIRECTORY Documentation/images DESTINATION ${WINDOWSSTAGING}/Documentation) + install(FILES ${DOCFILES} DESTINATION ${WINDOWSSTAGING}/Documentation) + install(DIRECTORY theme DESTINATION ${WINDOWSSTAGING}) + install(FILES ${TRANSLATIONS} DESTINATION ${WINDOWSSTAGING}/translations) + install(FILES ${QTTRANSLATIONS} DESTINATION ${WINDOWSSTAGING}/translations) + install(FILES ${CMAKE_SOURCE_DIR}/gpl-2.0.txt ${CMAKE_SOURCE_DIR}/packaging/windows/subsurface.ico DESTINATION ${WINDOWSSTAGING}) + install(TARGETS ${SUBSURFACE_TARGET} DESTINATION ${WINDOWSSTAGING}) + install(FILES ${CMAKE_BINARY_DIR}/qt.conf DESTINATION ${WINDOWSSTAGING}) + if(NOT DEFINED MAKENSIS) + set(MAKENSIS makensis) + endif() + + # next figure out the DLLs we need to include in the installer + # since this needs to run at install time we create a new cmake + # script that then gets executed at install time with install(CODE...) + file(WRITE ${CMAKE_BINARY_DIR}/dlllist.cmake " + message(STATUS \"processing dlllist.cmake\") + # figure out which command to use for objdump + execute_process( + COMMAND ${CMAKE_C_COMPILER} -dumpmachine + OUTPUT_VARIABLE OBJDUMP + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # figure out where we should search for libraries + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-search-dirs + COMMAND sed -nE \"/^libraries: =/{s///;s,/lib/?\\\(:|\\\$\\\$\\\),/bin\\\\1,g;p;q;}\" + OUTPUT_VARIABLE ADDPATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # since cmake doesn't appear to give us a variable with + # all libraries we link against, grab the link.txt script + # instead and drop the command name from it (before the + # first space) -- this will fail if the full path for the + # linker used contains a space... + execute_process( + COMMAND tail -1 CMakeFiles/subsurface.dir/link.txt + COMMAND cut -d\\ -f 2- + OUTPUT_VARIABLE LINKER_LINE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # finally run our win-ldd.pl script against that to + # collect all the required dlls + execute_process( + COMMAND sh -c \"OBJDUMP=\${OBJDUMP}-objdump PATH=$ENV{PATH}:\${ADDPATH} perl ${CMAKE_SOURCE_DIR}/scripts/win-ldd.pl ${SUBSURFACE_TARGET}.exe \${LINKER_LINE}\" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + OUTPUT_VARIABLE DLLS + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # replace newlines with semicolons so this is a cmake list + string(REPLACE \"\\n\" \";\" DLLLIST \${DLLS}) + # executing 'install' as a command seems hacky, but you + # can't use the install() cmake function in a script + foreach(DLL \${DLLLIST}) + execute_process(COMMAND install \${DLL} \${STAGING}) + endforeach() + ") + # the script we created above is now added as a command to run at + # install time - so this ensures that subsurface.exe has been + # built before this is run + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -DSTAGING=${WINDOWSSTAGING} -P ${CMAKE_BINARY_DIR}/dlllist.cmake)") + + # create the subsurface-x.y.z.exe installer - this needs to depend + # on the install target but cmake doesn't allow that, so we depend + # on the fake target instead + add_custom_target( + fake_install + COMMAND "${CMAKE_COMMAND}" --build . --target install + DEPENDS ${SUBSURFACE_TARGET} + ) + + add_custom_target( + installer + COMMAND ${MAKENSIS} ${WINDOWSSTAGING}/subsurface.nsi + DEPENDS fake_install + ) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android template directory + set(ANDROID_PACKAGE_SOURCE_DIR, ${CMAKE_BINARY_DIR}/android) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + install(DIRECTORY marbledata/maps DESTINATION share/subsurface/data) + install(DIRECTORY marbledata/bitmaps DESTINATION share/subsurface/data) + install(FILES subsurface.desktop DESTINATION share/applications) + install(FILES 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(FILES ${TRANSLATIONS} DESTINATION share/subsurface/translations) + install(TARGETS ${SUBSURFACE_TARGET} DESTINATION bin) + if(DEFINED LIBMARBLEDEVEL) + install( + CODE "file(GLOB SSRFMARBLE_SHLIBS \"${LIBMARBLEDEVEL}/lib/libssrfmarblewidget.so*\")" + CODE "file(INSTALL \${SSRFMARBLE_SHLIBS} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)" + ) + endif() +endif() diff --git a/CodingStyle b/CodingStyle index 75aa1d431..fab68608a 100644 --- a/CodingStyle +++ b/CodingStyle @@ -42,6 +42,7 @@ Basic rules if (condition) { dosomething(); + dosomethingelse(); } - both sides of an if / else clause either use or do not use curly braces: @@ -73,8 +74,9 @@ Basic rules - 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) { } diff --git a/Documentation/50-pot/subsurface-manual.pot b/Documentation/50-pot/subsurface-manual.pot index 5f4a46ca6..caf5225c6 100644 --- a/Documentation/50-pot/subsurface-manual.pot +++ b/Documentation/50-pot/subsurface-manual.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: subsurface-manual VERSION\n" "Report-Msgid-Bugs-To: subsurface@subsurface-divelog.org\n" -"POT-Creation-Date: 2015-02-06 09:16+0100\n" +"POT-Creation-Date: 2015-05-18 11:34+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -180,9 +180,9 @@ msgstr "" #: ./user-manual.txt:94 msgid "" "The _Subsurface_ window is usually divided into four panels with a *Main " -"Menu* (File Import Log View Filter Help) at the top of the window (for " -"Windows and Linux) or the top of the screen (for Mac and Ubuntu Unity). The " -"four panels are:" +"Menu* (File Import Log View Help) at the top of the window (for Windows and " +"Linux) or the top of the screen (for Mac and Ubuntu Unity). The four panels " +"are:" msgstr "" #. type: Plain text @@ -205,9 +205,9 @@ msgstr "" #. type: Plain text #: ./user-manual.txt:108 msgid "" -"The *Dive Info* to the top left, giving more detailed information on the " -"dive selected in the *Dive List*, including some statistics for the selected " -"dive or for all highlighted dive(s)." +"The *Info* to the top left, giving more detailed information on the dive " +"selected in the *Dive List*, including some statistics for the selected dive " +"or for all highlighted dive(s)." msgstr "" #. type: Plain text @@ -233,7 +233,7 @@ msgid "" "information and profile of the _selected dive_ are shown in the respective " "panels. On the other hand, if one highlights more than one dive the last " "highlighted dive is the _selected dive_, but summary data of all " -"_highlighted dives_ are shown in the *Stats* tab of the *Dive Info* panel " +"_highlighted dives_ are 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)." msgstr "" @@ -274,7 +274,7 @@ msgstr "" #: ./user-manual.txt:141 #, no-wrap msgid "" -"*Info*: Show only the Dive Notes about the last selected dive and statistics " +"*Info*: Show only the Notes about the last selected dive and statistics " "for\n" "all highlighted dives.\n" msgstr "" @@ -430,11 +430,11 @@ msgid "" "guide, and some remarks about the dive. _Subsurface_ can store much more " "information than this for each dive. In order to add a dive to a dive log, " "select _Log -> Add Dive_ from the Main Menu. The program then shows three " -"panels to enter information for a dive: two tabs in the *Dive Info* panel " -"(*Dive Notes* and *Equipment*), as well as the *Dive Profile* panel that " -"displays a graphical profile of each dive. These panels are respectively " -"marked [red]#A#, [red]#B# and [red]#C# in the figure below. Each of these " -"tabs will now be explained for data entry." +"panels to enter information for a dive: two tabs in the *Info* panel " +"(*Notes* and *Equipment*), as well as the *Dive Profile* panel that displays " +"a graphical profile of each dive. These panels are respectively marked " +"[red]#A#, [red]#B# and [red]#C# in the figure below. Each of these tabs will " +"now be explained for data entry." msgstr "" #. type: Target for macro image @@ -446,10 +446,10 @@ msgstr "" #. type: Plain text #: ./user-manual.txt:215 msgid "" -"When one edits a field in Dive notes or Equipment panels, _Subsurface_ " -"enters *Editing Mode*, indicated by the message in the blue box at the top " -"of the _Dive Notes_ panel (see the image below). This message is displayed " -"in all the panels under Dive notes and Equipment when in *Editing Mode*." +"When one edits a field in Notes or Equipment panels, _Subsurface_ enters " +"*Editing Mode*, indicated by the message in the blue box at the top of the " +"_Notes_ panel (see the image below). This message is displayed in all the " +"panels under Notes and Equipment when in *Editing Mode*." msgstr "" #. type: Target for macro image @@ -473,7 +473,7 @@ msgstr "" #. type: Title ==== #: ./user-manual.txt:224 ./user-manual.txt:700 #, no-wrap -msgid "Dive Notes" +msgid "Notes" msgstr "" #. type: Plain text @@ -481,8 +481,8 @@ msgstr "" msgid "" "This panel contains the date, time and place information for a particular " "dive, environmental conditions, co-divers and buddies, as well as some " -"descriptive information. If one clicks on the *Dive Notes* tab, the " -"following fields are visible:" +"descriptive information. If one clicks on the *Notes* tab, the following " +"fields are visible:" msgstr "" #. type: Target for macro image @@ -683,7 +683,7 @@ msgid "" "The *Save* and *Cancel* buttons are used to save all the information for " "tabs in the info panel and in the dive profile panel, so there's no need to " "use them until ALL other information has been added. Here is an example of a " -"completed Dive Notes panel:" +"completed Notes panel:" msgstr "" #. type: Target for macro image @@ -938,13 +938,13 @@ msgstr "" #. type: Plain text #: ./user-manual.txt:473 msgid "" -"The information entered in the *Dive Notes* tab, the *Equipment* tab as well " -"as the *Dive Profile* can now be saved in the user's logbook by using the " -"two buttons on the top right hand of the Dive Notes tab. If the _Save_ " -"button is clicked, the dive data are saved in the current logbook. If the " -"_Cancel_ button is clicked, the newly entered dive data are discarded. When " -"exiting _Subsurface_, the user will be prompted once more to save the " -"logbook with the new dive(s)." +"The information entered in the *Notes* tab, the *Equipment* tab as well as " +"the *Dive Profile* can now be saved in the user's logbook by using the two " +"buttons on the top right hand of the Notes tab. If the _Save_ button is " +"clicked, the dive data are saved in the current logbook. If the _Cancel_ " +"button is clicked, the newly entered dive data are discarded. When exiting " +"_Subsurface_, the user will be prompted once more to save the logbook with " +"the new dive(s)." msgstr "" #. type: Title === @@ -973,7 +973,7 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:489 ./user-manual.txt:2868 +#: ./user-manual.txt:489 ./user-manual.txt:2937 #, no-wrap msgid "images/icons/warning2.png" msgstr "" @@ -1057,7 +1057,7 @@ msgid "" "on most dive computers and also saves battery power of the dive computer (at " "least for those not charging while connected via USB). If, for some reason, " "the user wishes to import ALL dives from the dive computer, even though some " -"may already be in the logbook, then check the check box labelled _Force " +"may already be in the logbook, then check the check box labeled _Force " "download of all dives_." msgstr "" @@ -1181,7 +1181,7 @@ msgid "*PROBLEMS WITH DATA DOWNLOAD FROM A DIVE COMPUTER?*\n" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:619 ./user-manual.txt:1165 ./user-manual.txt:1231 ./user-manual.txt:1284 ./user-manual.txt:1360 +#: ./user-manual.txt:619 ./user-manual.txt:1175 ./user-manual.txt:1241 ./user-manual.txt:1294 ./user-manual.txt:1370 ./user-manual.txt:1681 #, no-wrap msgid "images/icons/important.png" msgstr "" @@ -1324,8 +1324,8 @@ msgstr "" msgid "" "With the uploaded dives in the *Dive List*, the information from the dive " "computer is not complete and more details must be added in order to have a " -"fuller record of the dives. To do this, the *Dive Notes* and the *Equipment* " -"tabs on the top left hand of the _Subsurface_ window should be used." +"fuller record of the dives. To do this, the *Notes* and the *Equipment* tabs " +"on the top left hand of the _Subsurface_ window should be used." msgstr "" #. type: Plain text @@ -1337,8 +1337,8 @@ msgid "" "record. In a few cases, (e.g. APD rebreathers) one also has to provide the " "date and time of the dive. If the contents of this tab is changed or edited " "in any way, the message in a blue box at the top of the panel indicates that " -"the dive is being edited. If one clicks on the *Dive Notes* tab, the " -"following fields are visible:" +"the dive is being edited. If one clicks on the *Notes* tab, the following " +"fields are visible:" msgstr "" #. type: Target for macro image @@ -1611,17 +1611,17 @@ msgstr "" msgid "" "_METHOD 1_: After uploading dives from a dive computer, the dive profiles of " "the uploaded dives are shown in the *Dive profile* tab, as well as a few " -"items of information in the *Dive Notes* tab (e.g. water temperature) and in " -"the *Equipment* tab (e.g. gas pressures and gas composition). However the " -"other fields remain empty. It may be useful to simultaneously edit some of " -"the fields in the *Dive Notes* and *Equipment* tabs. For instance, it is " -"possible that a diver performed several dives during a single day, using " -"identical equipment while diving at the same dive site or with the same dive " -"master and/or buddy or tags. Instead of completing the information for each " -"of these dives separately, one can select all the dives for that day in the " -"*Dive List* and insert the same information in the *Dive Notes* and " -"*Equipment* fields that need identical information. This is achieved by " -"editing the dive notes or the equipment for any one of the selected dives." +"items of information in the *Notes* tab (e.g. water temperature) and in the " +"*Equipment* tab (e.g. gas pressures and gas composition). However the other " +"fields remain empty. It may be useful to simultaneously edit some of the " +"fields in the *Notes* and *Equipment* tabs. For instance, it is possible " +"that a diver performed several dives during a single day, using identical " +"equipment while diving at the same dive site or with the same dive master " +"and/or buddy or tags. Instead of completing the information for each of " +"these dives separately, one can select all the dives for that day in the " +"*Dive List* and insert the same information in the *Notes* and *Equipment* " +"fields that need identical information. This is achieved by editing the dive " +"notes or the equipment for any one of the selected dives." msgstr "" #. type: Plain text @@ -1643,15 +1643,15 @@ msgstr "" #: ./user-manual.txt:933 msgid "" "_METHOD 2_:There is a different way of achieving the same goal. Select a " -"dive with all the appropriate information typed into the *Dive Notes* and " +"dive with all the appropriate information typed into the *Notes* and " "*Equipment* tabs. Then, from the main menu, select _Log -> Copy dive " "components_. A box is presented with a selection of check boxes for most of " -"the fields in the *Dive Notes* and *Equipment* tabs. Select the fields to " -"be copied from the currently selected dive, then select _OK_. Now, in the " -"*Dive List*, select the dives into which this information is to be " -"pasted. Then, from the main menu, select _Log -> Paste dive components_. " -"All the selected dives now contain the data initially selected in the " -"original source dive log." +"the fields in the *Notes* and *Equipment* tabs. Select the fields to be " +"copied from the currently selected dive, then select _OK_. Now, in the *Dive " +"List*, select the dives into which this information is to be pasted. Then, " +"from the main menu, select _Log -> Paste dive components_. All the selected " +"dives now contain the data initially selected in the original source dive " +"log." msgstr "" #. type: Title ==== @@ -1713,13 +1713,13 @@ msgstr "" #. type: Plain text #: ./user-manual.txt:967 msgid "" -"The information entered in the *Dive Notes* tab and the *Equipment* tab can " -"be saved by using the two buttons on the top right hand of the *Dive Notes* " -"tab. If the _Save_ button is clicked, the dive data are saved. If the " -"_Cancel_ button is clicked, then the newly entered dive data are deleted, " -"although the dive profile obtained from the dive computer will be " -"retained. When the user exits _Subsurface_ there is a final prompt to " -"confirm that the new data should be saved." +"The information entered in the *Notes* tab and the *Equipment* tab can be " +"saved by using the two buttons on the top right hand of the *Notes* tab. If " +"the _Save_ button is clicked, the dive data are saved. If the _Cancel_ " +"button is clicked, then the newly entered dive data are deleted, although " +"the dive profile obtained from the dive computer will be retained. When the " +"user exits _Subsurface_ there is a final prompt to confirm that the new data " +"should be saved." msgstr "" #. type: Title === @@ -1842,11 +1842,30 @@ msgstr "" #. type: Title ==== #: ./user-manual.txt:1029 #, no-wrap +msgid "Importing from Heinrichs Weikamp OSTC Tools" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1037 +msgid "" +"_OSTC Tools_ is a Microsoft-based suite of dive download and dive management " +"tools for the OSTC family of dive computers. _OSTC Tools_ downloads dive " +"data from the dive computer and stores it as a binary file with file " +"extension _.dive_ . Subsurface can directly import these files when using " +"the universal import dialogue. From the dropdown list at the bottom right " +"select _All files_. This makes the _OSTC Tools_ dive logs visible in the " +"file list panel. Select one or more dive, then click the _Open_ button. The " +"OSTC dives are shown in the *Dive List* panel." +msgstr "" + +#. type: Title ==== +#: ./user-manual.txt:1039 +#, no-wrap msgid "Importing from Mares Dive Organiser V2.1" msgstr "" #. type: Plain text -#: ./user-manual.txt:1036 +#: ./user-manual.txt:1046 msgid "" "Since Mares utilise proprietary Windows software not compatible with " "multi-platform applications, these dive logs cannot be directly imported " @@ -1856,7 +1875,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1041 +#: ./user-manual.txt:1051 msgid "" "The dive log data from Mares Dive Organiser need to be exported to the " "user's desktop, using a _.sdf_ file name extension. Refer to " @@ -1864,7 +1883,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1047 +#: ./user-manual.txt:1057 msgid "" "Data should then be imported into _www.divelogs.de_. One needs to create a " "user account in _www.divelogs.de_, log into that web site, then select " @@ -1874,20 +1893,20 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1049 +#: ./user-manual.txt:1059 msgid "" "Finally, import the dives from _divelogs.de_ to _Subsurface_, using the " "instructions below." msgstr "" #. type: Title ==== -#: ./user-manual.txt:1052 +#: ./user-manual.txt:1062 #, no-wrap msgid "Importing dives from *divelogs.de*" msgstr "" #. type: Plain text -#: ./user-manual.txt:1065 +#: ./user-manual.txt:1075 msgid "" "The import of dive information from _divelogs.de_ is simple, using a single " "dialogue box. The _Import -> Import from Divelogs.de_ option should be " @@ -1901,19 +1920,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1066 +#: ./user-manual.txt:1076 #, no-wrap msgid "images/Divelogs1.jpg" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1069 +#: ./user-manual.txt:1079 #, no-wrap msgid "Importing data in CSV format" msgstr "" #. type: Plain text -#: ./user-manual.txt:1080 +#: ./user-manual.txt:1090 msgid "" "A comma-separated file (.csv) can be used to import dive information either " "as dive profiles (as in the case of the APD Inspiration and Evolution closed " @@ -1929,13 +1948,13 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1082 +#: ./user-manual.txt:1092 #, no-wrap msgid "Importing dives in CSV format from dive computers or other dive log software" msgstr "" #. type: Plain text -#: ./user-manual.txt:1087 +#: ./user-manual.txt:1097 msgid "" "One can view a _CSV_ file by using an ordinary text editor. It is normally " "organised into a single line that provides the headers (or _field names_ or " @@ -1944,14 +1963,14 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1089 +#: ./user-manual.txt:1099 msgid "" "There are two types of _CSV_ dive logs that can be imported into " "_Subsurface_:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1095 +#: ./user-manual.txt:1105 msgid "" "_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, " @@ -1962,7 +1981,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1104 +#: ./user-manual.txt:1114 msgid "" "_CSV dive profile_: This dive log format includes much more information " "about a single dive. For instance there may be information at 30-second " @@ -1976,14 +1995,14 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1107 +#: ./user-manual.txt:1117 msgid "" "Before being able to import the _CSV_ data to _Subsurface_ *one needs to " "know a few things about the data being imported*:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1115 +#: ./user-manual.txt:1125 msgid "" "Which character separates the different columns within a single line of " "data? This field separator should be either a comma (,) or a TAB character. " @@ -1995,7 +2014,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1119 +#: ./user-manual.txt:1129 msgid "" "Which data columns need to be imported into _Subsurface_? Is it a _CSV dive " "details_ file or a _CSV dive profile_ file? Open the file using a text " @@ -2004,12 +2023,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1121 +#: ./user-manual.txt:1131 msgid "Is the numeric information (e.g. dive depth) in metric or in imperial unis?" msgstr "" #. type: Plain text -#: ./user-manual.txt:1128 +#: ./user-manual.txt:1138 msgid "" "Armed with this information, importing the data into _Subsurface_ is " "straightforward. Select _Import -> Import Log Files_ from the main menu. In " @@ -2019,13 +2038,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1129 +#: ./user-manual.txt:1139 #, no-wrap msgid "images/csv_import1_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1140 +#: ./user-manual.txt:1150 msgid "" "Notice that, at the top left, there is a dropdown list containing " "pre-configured settings for some of the more common dive computers and " @@ -2040,7 +2059,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1154 +#: ./user-manual.txt:1164 msgid "" "The last remaining task is to ensure that all the data columns have the " "appropriate column headings. The top line of the white part of the data " @@ -2048,24 +2067,24 @@ msgid "" "row of cells immediately above these contains the names understood by " "_Subsurface_. The white area below the dropdown lists contains all the field " "names that _Subsurface_ recognises. These names are in blue balloons and can " -"be moved using a drag-and-frop action. For instance, _Subsurface_ expects " +"be moved using a drag-and-drop action. For instance, _Subsurface_ expects " "the column heading for Dive number (\" # \") to be \"Dive # \". If the " "column heading that _Subsurface_ expects is not in the blue cells, then drag " "the appropriate column heading from the upper area and drop it in the " "appropriate blue cell at the top of the table. To indicate the correct " -"column for \"Dive #\", drag the ballooned item labelled \"Dive # \" and drop " +"column for \"Dive #\", drag the ballooned item labeled \"Dive # \" and drop " "it in the blue cell immediately above the white cell containing \" # " "\". This is depicted in the image below." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1155 +#: ./user-manual.txt:1165 #, no-wrap msgid "images/csv_import2_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1161 +#: ./user-manual.txt:1171 msgid "" "Continue in this way to ensure that all the column headings in the blue row " "of cells correspond to the headings listed in the top part of the " @@ -2075,17 +2094,17 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1165 +#: ./user-manual.txt:1175 #, no-wrap msgid "*A Diver's Introduction to _CSV_ Files*\n" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1179 +#: ./user-manual.txt:1189 msgid "" "_CSV_ is an abbreviation for a data file format: _Comma-Separated " -"Variables_. It is a file format allowing someone to view or edit the " -"information using a text editor such as Notebook (Windows), gedit (Linux) or " +"Values_. It is a file format allowing someone to view or edit the " +"information using a text editor such as Notepad (Windows), gedit (Linux) or " "TextWrangler (OS/X). The two main advantages of the _CSV_ format is that the " "data are easily editable as text without any proprietary software and " "ensuring all information is human-readable, not being obscured by any custom " @@ -2098,7 +2117,7 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1188 +#: ./user-manual.txt:1198 msgid "" "_CSV_ files can be created or edited with a normal text editor. The most " "important attribute of a _CSV_ file is the _field separator_, the character " @@ -2114,7 +2133,7 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1194 +#: ./user-manual.txt:1204 #, no-wrap msgid "" "\tDive site,Dive date,Time,Dive_duration, Dive_depth,Dive buddy\n" @@ -2125,14 +2144,14 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1196 +#: ./user-manual.txt:1206 msgid "" "In this format the data are not easily read by a human. Here is the same " "information in TAB-delimited format:" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1202 +#: ./user-manual.txt:1212 #, no-wrap msgid "" "\tDive site\tDive date\tTime\tDive_duration\tDive_depth\tDive buddy\n" @@ -2143,7 +2162,7 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1210 +#: ./user-manual.txt:1220 msgid "" "It is clear why many people prefer the TAB-delimited format to the " "comma-delimited format. The disadvantage is that one cannot see the TAB " @@ -2157,7 +2176,7 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1221 +#: ./user-manual.txt:1231 #, no-wrap msgid "" "\tDive Time (s)\tDepth (m)\tpOâ‚‚ - Setpoint (Bar) \tpOâ‚‚ - C1 Cell 1 " @@ -2174,7 +2193,7 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:1227 +#: ./user-manual.txt:1237 msgid "" "When a _CSV_ file is selected for import, _Subsurface_ displays the column " "headers as well as some of the data in the first few lines of the _CSV_ " @@ -2185,7 +2204,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1241 +#: ./user-manual.txt:1251 msgid "" "The _CSV_ import has a couple of caveats. One should avoid some special " "characters like ampersand (&), less than (<), greater than (>) and double " @@ -2198,7 +2217,7 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:1244 +#: ./user-manual.txt:1254 #, no-wrap msgid "" "Importing GPS coordinates with the _Subsurface Companion App_ for mobile " @@ -2206,7 +2225,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1253 +#: ./user-manual.txt:1263 msgid "" "Using the *Subsurface Companion App* on an _Android device_ with a GPS or " "xref:S_iphone[_iPhone_], the coordinates for the diving location can be " @@ -2216,18 +2235,18 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1255 +#: ./user-manual.txt:1265 msgid "To do this:" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1256 +#: ./user-manual.txt:1266 #, no-wrap msgid "Create a Companion App account" msgstr "" #. type: Plain text -#: ./user-manual.txt:1261 +#: ./user-manual.txt:1271 msgid "" "Register on the http://api.hohndel.org/login/[_Subsurface companion web " "page_]. A confirmation email with instructions and a personal *DIVERID* " @@ -2236,7 +2255,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1266 +#: ./user-manual.txt:1276 msgid "" "Download the app from " "https://play.google.com/store/apps/details?id=org.subsurface[Google Play " @@ -2245,18 +2264,18 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1267 +#: ./user-manual.txt:1277 #, no-wrap msgid "Using the Subsurface companion app on an Android smartphone" msgstr "" #. type: Plain text -#: ./user-manual.txt:1270 +#: ./user-manual.txt:1280 msgid "On first use the app has three options:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1276 +#: ./user-manual.txt:1286 msgid "" "_Create a new account._ Equivalent to registering in _Subsurface_ companion " "page using an Internet browser. One can request a *DIVERID* using this " @@ -2266,14 +2285,14 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1279 +#: ./user-manual.txt:1289 msgid "" "_Retrieve an account._ If users forgot their *DIVERID* they will receive an " "email to recover the number." msgstr "" #. type: Plain text -#: ./user-manual.txt:1283 +#: ./user-manual.txt:1293 msgid "" "_Use an existing account._ Users are prompted for their *DIVERID*. The app " "saves this *DIVERID* and does not ask for it again unless one uses the " @@ -2281,7 +2300,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1291 +#: ./user-manual.txt:1301 msgid "" "In the _Subsurface_ main program, the *DIVERID* should also be entered on " "the Default Preferences panel, obtained by selecting _File -> Preferences -> " @@ -2290,13 +2309,13 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1292 +#: ./user-manual.txt:1302 #, no-wrap msgid "Creating new dive locations" msgstr "" #. type: Plain text -#: ./user-manual.txt:1297 +#: ./user-manual.txt:1307 msgid "" "Now one is ready to get a dive position and send it to the server. The " "Android display will look like the left hand image (*A*) below, but without " @@ -2304,21 +2323,21 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1300 +#: ./user-manual.txt:1310 msgid "" "Touch the \"+\" icon on the top right to add a new dive site, a menu will be " "showed with 3 options:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1303 +#: ./user-manual.txt:1313 msgid "" "Current: A prompt for a place name (or a request to activate the GPS if it " "is turned off) will be displayed, after which the current location is saved." msgstr "" #. type: Plain text -#: ./user-manual.txt:1312 +#: ./user-manual.txt:1322 msgid "" "Use Map: This option allows the user to fix a position by searching a world " "map. A world map is shown (see *B* below) on which one should indicate the " @@ -2331,13 +2350,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1313 +#: ./user-manual.txt:1323 #, no-wrap msgid "images/Companion_5.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1321 +#: ./user-manual.txt:1331 msgid "" "Import local GPX file: The android device searches for .gpx files and " "located archives will be shown. The selected .gpx file is opened and the " @@ -2347,13 +2366,13 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1322 +#: ./user-manual.txt:1332 #, no-wrap msgid "Dive lists of dive locations" msgstr "" #. type: Plain text -#: ./user-manual.txt:1330 +#: ./user-manual.txt:1340 msgid "" "The main screen shows a list of dive locations, each with a name, date and " "time (see *A* below). Some locations may have an arrow-up icon over the " @@ -2365,7 +2384,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1338 +#: ./user-manual.txt:1348 msgid "" "Dive locations in this list can be viewed in two ways: a list of locations " "or a map indicating the dive locations. The display mode (List or Map) is " @@ -2377,13 +2396,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1339 +#: ./user-manual.txt:1349 #, no-wrap msgid "images/Companion_4.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1345 +#: ./user-manual.txt:1355 msgid "" "When one clicks on a dive (*not* selecting the check box), the name given to " "it, date/time and GPS coordinates will be shown, with two options at the top " @@ -2391,32 +2410,32 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1347 +#: ./user-manual.txt:1357 msgid "" "Edit (pencil): Change the text name or other characteristics of the dive " "location." msgstr "" #. type: Plain text -#: ./user-manual.txt:1349 +#: ./user-manual.txt:1359 msgid "Maps: Display a map showing the dive location." msgstr "" #. type: Plain text -#: ./user-manual.txt:1352 +#: ./user-manual.txt:1362 msgid "" "After editing and saving a dive location (see *C* above), one needs to " "upload it to the web service, as explained below." msgstr "" #. type: Title ===== -#: ./user-manual.txt:1353 +#: ./user-manual.txt:1363 #, no-wrap msgid "Uploading dive locations" msgstr "" #. type: Plain text -#: ./user-manual.txt:1359 +#: ./user-manual.txt:1369 msgid "" "There are several ways to send locations to the server. The easiest is by " "simply selecting the locations (See *A* below) and then touching the right " @@ -2424,51 +2443,51 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1364 +#: ./user-manual.txt:1374 msgid "" "Users must be careful, as the trash icon on the right means exactly what it " "should; it deletes the selected dive location(s)." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1365 +#: ./user-manual.txt:1375 #, no-wrap msgid "images/Companion_1.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1370 +#: ./user-manual.txt:1380 msgid "" "After a dive trip using the Companion App, all dive locations are ready to " "be downloaded to a _Subsurface_ dive log (see below)." msgstr "" #. type: Title ===== -#: ./user-manual.txt:1372 +#: ./user-manual.txt:1382 #, no-wrap msgid "Settings on the Companion app" msgstr "" #. type: Plain text -#: ./user-manual.txt:1375 +#: ./user-manual.txt:1385 msgid "" "Selecting the _Settings_ menu option results in the right hand image above " "(*B*)." msgstr "" #. type: Title ===== -#: ./user-manual.txt:1376 +#: ./user-manual.txt:1386 #, no-wrap msgid "Server and account" msgstr "" #. type: Plain text -#: ./user-manual.txt:1379 +#: ./user-manual.txt:1389 msgid "_Web-service URL._ This is predefined (http://api.hohndel.org/)" msgstr "" #. type: Plain text -#: ./user-manual.txt:1383 +#: ./user-manual.txt:1393 msgid "" "_User ID._ The DIVERID obtained by registering as described above. The " "easiest way to obtain it is simply to copy and paste from the confirmation " @@ -2476,33 +2495,33 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1384 +#: ./user-manual.txt:1394 #, no-wrap msgid "Synchronisation" msgstr "" #. type: Plain text -#: ./user-manual.txt:1388 +#: ./user-manual.txt:1398 msgid "" "_Synchronize on startup._ If selected, dive locations in the Android device " "and those on the web service synchronise each time the app is started." msgstr "" #. type: Plain text -#: ./user-manual.txt:1391 +#: ./user-manual.txt:1401 msgid "" "_Upload new dives._ If selected, each time the user adds a dive location it " "is automatically sent to the server." msgstr "" #. type: Title ===== -#: ./user-manual.txt:1392 +#: ./user-manual.txt:1402 #, no-wrap msgid "Background service" msgstr "" #. type: Plain text -#: ./user-manual.txt:1395 +#: ./user-manual.txt:1405 msgid "" "Instead of entering a unique dive location, users can leave the service " "running in the background of their Android device, allowing the continuous " @@ -2510,35 +2529,35 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1398 +#: ./user-manual.txt:1408 msgid "The settings below define the behaviour of the service:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1401 +#: ./user-manual.txt:1411 msgid "" "_Min duration._ In minutes. The app will try to get a location every X " "minutes until stopped by the user." msgstr "" #. type: Plain text -#: ./user-manual.txt:1403 +#: ./user-manual.txt:1413 msgid "_Min distance._ In meters. Minimum distance between two locations." msgstr "" #. type: Plain text -#: ./user-manual.txt:1405 +#: ./user-manual.txt:1415 msgid "_Name template._ The name the app will use when saving the locations." msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1406 ./user-manual.txt:1503 ./user-manual.txt:1856 +#: ./user-manual.txt:1416 ./user-manual.txt:1513 ./user-manual.txt:1914 #, no-wrap msgid "images/icons/info.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1416 +#: ./user-manual.txt:1426 msgid "" "_How does the background service work?_ Assuming the user sets 5 minutes and " "50 meters in the settings above, the app will start by recording a location " @@ -2551,60 +2570,60 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1417 +#: ./user-manual.txt:1427 #, no-wrap msgid "Other" msgstr "" #. type: Plain text -#: ./user-manual.txt:1421 +#: ./user-manual.txt:1431 msgid "" "_Mailing List._ The mail box for _Subsurface_. Users can send an email to " "the Subsurface mailing list." msgstr "" #. type: Plain text -#: ./user-manual.txt:1423 +#: ./user-manual.txt:1433 msgid "_Subsurface website._ A link to the URL of Subsurface web" msgstr "" #. type: Plain text -#: ./user-manual.txt:1425 +#: ./user-manual.txt:1435 msgid "_Version._ Displays the current version of the Companion App." msgstr "" #. type: Title ===== -#: ./user-manual.txt:1426 +#: ./user-manual.txt:1436 #, no-wrap msgid "Search" msgstr "" #. type: Plain text -#: ./user-manual.txt:1429 +#: ./user-manual.txt:1439 msgid "Search the saved dive locations by name or by date and time." msgstr "" #. type: Title ===== -#: ./user-manual.txt:1430 +#: ./user-manual.txt:1440 #, no-wrap msgid "Start service" msgstr "" #. type: Plain text -#: ./user-manual.txt:1433 +#: ./user-manual.txt:1443 msgid "" "Initiates the _background service_ following the previously defined " "settings." msgstr "" #. type: Title ===== -#: ./user-manual.txt:1434 +#: ./user-manual.txt:1444 #, no-wrap msgid "Disconnect" msgstr "" #. type: Plain text -#: ./user-manual.txt:1442 +#: ./user-manual.txt:1452 msgid "" "This is a badly named option that disconnects the app from the server by " "resetting the user ID in the app, showing the first screen where an account " @@ -2614,24 +2633,24 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1443 +#: ./user-manual.txt:1453 #, no-wrap msgid "Send all locations" msgstr "" #. type: Plain text -#: ./user-manual.txt:1446 +#: ./user-manual.txt:1456 msgid "This option sends all locations stored in the Android device to the server." msgstr "" #. type: Title ==== -#: ./user-manual.txt:1448 +#: ./user-manual.txt:1458 #, no-wrap msgid "Using the Subsurface companion app on an _iPhone_ to record dive locations" msgstr "" #. type: Plain text -#: ./user-manual.txt:1453 +#: ./user-manual.txt:1463 msgid "" "The iPhone interface is quite simple. One needs to type the user ID " "(obtained during registration) into the space reserved for it, then select " @@ -2640,13 +2659,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1454 +#: ./user-manual.txt:1464 #, no-wrap msgid "images/iphone.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1461 +#: ./user-manual.txt:1471 msgid "" "Dives can be added automatically or manually. In manual mode, a dive " "location or waypoint is added to the GPS input stream. In automatic mode, a " @@ -2660,7 +2679,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1467 +#: ./user-manual.txt:1477 msgid "" "One can edit the site name afterwards by selecting the dive from the dive " "list and clicking on the site name. There are no other editable fields. The " @@ -2669,13 +2688,13 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1469 +#: ./user-manual.txt:1479 #, no-wrap msgid "Downloading dive locations to the _Subsurface_ divelog" msgstr "" #. type: Plain text -#: ./user-manual.txt:1478 +#: ./user-manual.txt:1488 msgid "" "Download dive(s) from a dive computer or enter them manually into " "_Subsurface_ before obtaining the GPS coordinates from the server. The " @@ -2687,13 +2706,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1479 +#: ./user-manual.txt:1489 #, no-wrap msgid "images/DownloadGPS.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1487 +#: ./user-manual.txt:1497 msgid "" "Note that the _Apply_ button is now active. By clicking on it, users can " "update the locations of the newly entered or uploaded dives in _Subsurface_ " @@ -2704,7 +2723,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1494 +#: ./user-manual.txt:1504 msgid "" "Since _Subsurface_ matches GPS locations from the Android device and dive " "information from the dive computer based on date-time data, automatic " @@ -2716,7 +2735,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1502 +#: ./user-manual.txt:1512 msgid "" "Similar date-times may not always be possible and there may be many reasons " "for this (e.g. time zones), or _Subsurface_ may be unable to decide which is " @@ -2730,12 +2749,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1506 +#: ./user-manual.txt:1516 msgid "TIPS:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1513 +#: ./user-manual.txt:1523 msgid "" "_Background service_, being a very powerful tool, may fill the location list " "with many unnecessary locations not corresponding to the exact dive point " @@ -2748,7 +2767,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1517 +#: ./user-manual.txt:1527 msgid "" "It may also make sense to give informative names to the locations sent to " "the web server, or at least to use an informative name in the _Name " @@ -2757,13 +2776,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:1519 +#: ./user-manual.txt:1529 #, no-wrap msgid "Adding photographs to dives" msgstr "" #. type: Plain text -#: ./user-manual.txt:1525 +#: ./user-manual.txt:1535 msgid "" "Many (if not most) divers take a camera with them and take photographs " "during a dive. One would like to associate each photograph with a specific " @@ -2772,13 +2791,13 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1526 +#: ./user-manual.txt:1536 #, no-wrap msgid "Loading photos and getting synchronisation between dive computer and camera" msgstr "" #. type: Plain text -#: ./user-manual.txt:1530 +#: ./user-manual.txt:1540 msgid "" "Left-lick on a dive or on a group of dives on the dive list. Then " "right-click on this dive or group of dives and choose the option _Load " @@ -2786,26 +2805,26 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1531 +#: ./user-manual.txt:1541 #, no-wrap msgid "images/LoadImage1_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1535 +#: ./user-manual.txt:1545 msgid "" "The system file browser appears. Select the folder and photographs that need " "to be loaded into _Subsurface_ and click the _Open_ button." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1536 +#: ./user-manual.txt:1546 #, no-wrap msgid "images/LoadImage2_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1545 +#: ./user-manual.txt:1555 msgid "" "This brings one to the time synchronisation dialog, shown below. The " "critical problem is that the time synchronisation is not perfect between the " @@ -2816,12 +2835,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1547 +#: ./user-manual.txt:1557 msgid "_Subsurface_ achieves this synchronisation in two ways:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1559 +#: ./user-manual.txt:1569 #, no-wrap msgid "" "*Manually*: If the user wrote down the exact camera time at the start of a " @@ -2848,13 +2867,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1560 +#: ./user-manual.txt:1570 #, no-wrap msgid "images/LoadImage3b_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1578 +#: ./user-manual.txt:1588 #, no-wrap msgid "" "*By photograph*: There is a very slick way of achieving synchronisation. If " @@ -2887,7 +2906,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1581 +#: ./user-manual.txt:1591 msgid "" "If the timestamp of a photograph is long before or after the dive, it is not " "placed on the dive profile. If the timestamp of the photo is within 30 " @@ -2895,62 +2914,62 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1582 +#: ./user-manual.txt:1592 #, no-wrap msgid "Viewing the photos" msgstr "" #. type: Plain text -#: ./user-manual.txt:1586 +#: ./user-manual.txt:1596 msgid "" "In order to view the photos added to a dive, activate the _show-photos_ " "button in the tool bar to the left of the dive profile:" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1587 +#: ./user-manual.txt:1597 #, no-wrap msgid "images/icons/ShowPhotos_f20.png" msgstr "" #. type: Plain text -#: ./user-manual.txt:1590 +#: ./user-manual.txt:1600 msgid "After the images have been loaded, they appear in two places:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1592 -msgid "the _Photos_ tab of the *Dive Notes* panel." +#: ./user-manual.txt:1602 +msgid "the _Photos_ tab of the *Notes* panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:1594 +#: ./user-manual.txt:1604 msgid "" "as tiny icons (stubs) on the dive profile at the appropriate positions " "reflecting the time each photograph was taken. See below:" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1595 +#: ./user-manual.txt:1605 #, no-wrap msgid "images/LoadImage4_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1599 +#: ./user-manual.txt:1609 msgid "" "If one hovers with the mouse over any of the photo icons, then a thumbnail " "photo is shown of the appropriate photo. See the image below:" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1600 +#: ./user-manual.txt:1610 #, no-wrap msgid "images/LoadImage5_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1609 +#: ./user-manual.txt:1619 msgid "" "Clicking on the thumbnail brings up a full size photo overlaid on the " "_Subsurface_ window. This allows good viewing of the photographs that have " @@ -2962,24 +2981,24 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1610 +#: ./user-manual.txt:1620 #, no-wrap msgid "images/LoadImage6_f20.jpg" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1612 +#: ./user-manual.txt:1622 #, no-wrap msgid "The _Photos_ tab" msgstr "" #. type: Plain text -#: ./user-manual.txt:1623 +#: ./user-manual.txt:1633 msgid "" "Photographs associated with a dive are shown as thumbnails in the _Photos_ " -"tab of the _Dive Notes_ panel. Photos taken in rapid succession during a " -"dive (therefore sometimes with large overlap on the dive profile) can easily " -"be accessed in the _Photos_ tab. This tab serves as a tool for individually " +"tab of the _Notes_ panel. Photos taken in rapid succession during a dive " +"(therefore sometimes with large overlap on the dive profile) can easily be " +"accessed in the _Photos_ tab. This tab serves as a tool for individually " "accessing the photos of a dive, while the stubs on the dive profile give an " "indication of when during a dive a photo was taken. By single-clicking on a " "thumbnail in the _Photos_ panel, a photo is selected. By double-clicking a " @@ -2990,13 +3009,13 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1624 +#: ./user-manual.txt:1634 #, no-wrap msgid "Photos on an external hard disk" msgstr "" #. type: Plain text -#: ./user-manual.txt:1635 +#: ./user-manual.txt:1645 msgid "" "Most underwater photographers store their photos on an external drive. If " "such a drive can be mapped (almost always the case) the photos can be " @@ -3013,20 +3032,128 @@ msgid "" "be seen in the normal way." msgstr "" +#. type: Title ==== +#: ./user-manual.txt:1647 +#, no-wrap +msgid "Moving photographs among directories, hard disks or computers" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1657 +#, no-wrap +msgid "" +"After a photograph has been loaded into _Subsurface_ and associated with a " +"specific dive, the directory\n" +" where the photo lies is stored, allowing _Subsurface_ to find the " +"photograph when the dive is\n" +" opened again. If the photo or the whole photo collection is moved to " +"another drive or to a different\n" +" machine, it is unlikely that the directory structure will remain identical " +"to that of the original uploaded\n" +" photo. When this happens, _Subsurface_ looks for the photos at their " +"original location before they were moved,\n" +" cannot find them and therefore cannot display them. Because, after moving " +"photos, large numbers of photos\n" +" may need to be deleted and re-imported from the new location, _Subsurface_ " +"has a mechanism that eases the\n" +" process of updating the directory information for each photo: automatic " +"updates using fingerprints.\n" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1662 +#, no-wrap +msgid "" +"When a photo is loaded into _Subsurface_, a fingerprint for the image is " +"calculated and stored with the\n" +" other reference information for that photo. After moving a photo collection " +"(that has already been loaded\n" +" into _Subsurface_) to a different directory, disk or computer, _Subsurface_ " +"can perform the\n" +" following steps:\n" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1664 +msgid "" +"look through a particular directory (and all its subdirectories recursively) " +"where photos have been moved" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1665 +msgid "to," +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1667 +msgid "calculate fingerprints for all photos in this directory, and" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1669 +msgid "" +"if there is a match between a calculated fingerprint and the one originally " +"calculated when a photo was" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1671 +msgid "" +"loaded into _Subsurface_ (even if the original file name has changed), to " +"automatically update the directory information so that _Subsurface_ can find " +"the photo in the new moved directory." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:1676 +#, no-wrap +msgid "" +"This is achieved by selecting from the Main Menu: _File -> Find moved " +"images_. This brings up a window within\n" +" which the NEW directory of the photos needs to be specified. Select the " +"appropriate directory and click\n" +" the _Scan_ button towards the bottom right of the panel. The process may " +"require several minutes to\n" +" complete, after which _subsurface_ will show the appropriate photographs " +"when a particular dive is opened.\n" +msgstr "" + +#. type: delimited block * +#: ./user-manual.txt:1681 +#, no-wrap +msgid "*Upgrading existing photo collections without fingerprints*\n" +msgstr "" + +#. type: delimited block * +#: ./user-manual.txt:1691 +msgid "" +"Software for the automated update of existing photo collections is under " +"developement. Currently single dives must be upgraded one at a time. Select " +"the toolbar button on the *Dive profile* panel that enables the display of " +"images. The thumbnails of images are shown on the dive profile. Then open " +"the dive and change anything in the *Notes* panel that brings up the blue " +"edit bar at the top of the notes panel to save the edits. For instance, add " +"a space character at the end of the _Notes_ text box and immediately delete " +"that space character. Select the optio _Apply changes_ in the blue edit bar " +"to save the dive information. Fingerprints are calculated while saving this " +"specific dive." +msgstr "" + #. type: Title === -#: ./user-manual.txt:1637 +#: ./user-manual.txt:1695 #, no-wrap msgid "Logging special types of dives" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1640 +#: ./user-manual.txt:1698 #, no-wrap msgid "Multicylinder dives" msgstr "" #. type: Plain text -#: ./user-manual.txt:1647 +#: ./user-manual.txt:1705 msgid "" "_Subsurface_ easily handles dives involving more than one " "cylinder. Multicylinder diving usually happens (a) if a diver does not have " @@ -3038,19 +3165,19 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1651 +#: ./user-manual.txt:1709 #, no-wrap msgid "" "*Describe the cylinders used during the dive* This is performed in the " "*Equipment tab* of\n" -"the *Dive Info* panel, as xref:cylinder_definitions[described above]. Enter " -"the cylinders one by one,\n" +"the *Info* panel, as xref:cylinder_definitions[described above]. Enter the " +"cylinders one by one,\n" "specifying the characteristics of the cylinder and the gas composition " "within each cylinder.\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:1656 +#: ./user-manual.txt:1714 #, no-wrap msgid "" "*Record the times at which switches from one cylinder to another was done:* " @@ -3063,7 +3190,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1664 +#: ./user-manual.txt:1722 #, no-wrap msgid "" "*Record the cylinder changes on the dive profile*: If the latter option\n" @@ -3074,13 +3201,13 @@ msgid "" "right-clicking, follow the context menu to \"Add gas change\" and select the " "appropriate cylinder from\n" "those defined during the first step, above (see image below). If the\n" -"*tank bar* button in the ttolbar has been activated, the cylinder switches " +"*tank bar* button in the toolbar has been activated, the cylinder switches " "are also indicated in the\n" "tank bar.\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:1668 +#: ./user-manual.txt:1726 msgid "" "Having performed these tasks, _Subsurface_ indicates the appropriate use of " "cylinders in the dive profile. Below is a multi-cylinder dive, starting off " @@ -3089,19 +3216,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1669 +#: ./user-manual.txt:1727 #, no-wrap msgid "images/multicylinder_dive.jpg" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1671 +#: ./user-manual.txt:1729 #, no-wrap msgid "Sidemount dives" msgstr "" #. type: Plain text -#: ./user-manual.txt:1677 +#: ./user-manual.txt:1735 msgid "" "Sidemount diving is just another form of multicylinder diving, often with " "both or all cylinders having the same gas mixture. Although it is a popular " @@ -3112,7 +3239,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1686 +#: ./user-manual.txt:1744 #, no-wrap msgid "" "*During the dive, record cylinder switch events*. Since sidemount diving " @@ -3134,18 +3261,18 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1689 +#: ./user-manual.txt:1747 #, no-wrap msgid "" "*Within _Subsurface_ describe the cylinders used during the dive*. The diver " "needs to provide the\n" "specifications of the different cylinders, using the *Equipment* tab of the " -"*Dive Info Panel* (see\n" +"*Info Panel* (see\n" "image below where two 12 litre cylinder were used).\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:1699 +#: ./user-manual.txt:1757 #, no-wrap msgid "" "*Indicate cylinder change events on the _Subsurface_ dive profile*. Once the " @@ -3166,36 +3293,36 @@ msgid "" "image below). After all\n" "the cylinder change events have been recorded on the dive profile, the " "correct cylinder pressures\n" -"for both cylinders are shown on the dive profile, as inthe image below.\n" +"for both cylinders are shown on the dive profile, as in the image below.\n" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1700 +#: ./user-manual.txt:1758 #, no-wrap msgid "images/sidemount1.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1703 +#: ./user-manual.txt:1761 msgid "" -"This section gives an example of the versatility of _Subsurface_ as a give " +"This section gives an example of the versatility of _Subsurface_ as a dive " "logging tool." msgstr "" #. type: Title ==== -#: ./user-manual.txt:1706 +#: ./user-manual.txt:1764 #, no-wrap msgid "Semi-closed circuit rebreather (SCR) dives" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1708 +#: ./user-manual.txt:1766 #, no-wrap msgid "images/halcyon_RB80.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1718 +#: ./user-manual.txt:1776 msgid "" "Passive semi-closed rebreathers (pSCR) comprise a technical advance in " "diving equipment that recirculates the breathing gas that a diver breathes, " @@ -3211,19 +3338,19 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1720 +#: ./user-manual.txt:1778 msgid "" "To log pSCR dives, no special procedures are required, just the normal steps " "outlined above:" msgstr "" #. type: Plain text -#: ./user-manual.txt:1722 -msgid "Select pSCR in the _Dive Mode_ dropdown list on the *Dive Info* panel." +#: ./user-manual.txt:1780 +msgid "Select pSCR in the _Dive Mode_ dropdown list on the *Info* panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:1726 +#: ./user-manual.txt:1784 msgid "" "pSCR diving often involves gas changes, requiring an additional cylinder. " "Define all the appropriate cylinders as described above and indicate the " @@ -3232,35 +3359,35 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1731 +#: ./user-manual.txt:1789 msgid "" "If a pSCR _Dive Mode_ has been selected, the dive ceiling for pSCR dives is " -"adjusted for the oxygen drop accross the mouthpiece which often requires " +"adjusted for the oxygen drop across the mouthpiece which often requires " "longer decompression periods. Below is a dive profile of a pSCR dive using " "EAN36 on the back cylinder and oxygen for decompression. Note that this dive " "lasted over two hours." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1732 +#: ./user-manual.txt:1790 #, no-wrap msgid "images/pSCR_profile.jpg" msgstr "" #. type: Title ==== -#: ./user-manual.txt:1737 +#: ./user-manual.txt:1795 #, no-wrap msgid "Closed circuit rebreather (CCR) dives" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1739 +#: ./user-manual.txt:1797 #, no-wrap msgid "images/APD.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1744 +#: ./user-manual.txt:1802 msgid "" "Closed system rebreathers use advanced technology to recirculate gas that " "has been breathed while doing two things to maintain a breathable oxygen " @@ -3268,12 +3395,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1745 +#: ./user-manual.txt:1803 msgid "remove carbon dioxide from the gas that has been exhaled" msgstr "" #. type: Plain text -#: ./user-manual.txt:1754 +#: ./user-manual.txt:1812 msgid "" "regulate the oxygen concentration to remain within safe diving limits. " "Currently, within _Subsurface_, the Poseidon MkVI Discovery is the best " @@ -3287,13 +3414,13 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1755 +#: ./user-manual.txt:1813 #, no-wrap msgid "Import a CCR dive" msgstr "" #. type: Plain text -#: ./user-manual.txt:1768 +#: ./user-manual.txt:1826 msgid "" "See the section dealing with xref:S_ImportingAlienDiveLogs[Importing dive " "information from other digital sources]. From the main menu of _Subsurface_, " @@ -3311,13 +3438,13 @@ msgid "" msgstr "" #. type: Title ===== -#: ./user-manual.txt:1769 +#: ./user-manual.txt:1827 #, no-wrap msgid "Displayed information for a CCR dive" msgstr "" #. type: Plain text -#: ./user-manual.txt:1779 +#: ./user-manual.txt:1837 msgid "" "_Partial pressures of gases_: The graph of oxygen partial pressure shows the " "information from the oxygen sensors of the CCR equipment. In contrast to " @@ -3331,12 +3458,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1781 +#: ./user-manual.txt:1839 msgid "For TWO O~2~ sensors the mean value of the two sensors are given." msgstr "" #. type: Plain text -#: ./user-manual.txt:1785 +#: ./user-manual.txt:1843 msgid "" "For THREE-sensor systems (e.g. APD), the mean value is also used. However " "differences of more than 0,1 bar in the simultaneous readings of different " @@ -3345,19 +3472,19 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1787 +#: ./user-manual.txt:1845 msgid "" "If no sensor data is available, the pO~2~ value is assumed to be equal to " "the setpoint." msgstr "" #. type: Plain text -#: ./user-manual.txt:1789 +#: ./user-manual.txt:1847 msgid "The mean pO~2~ of the sensors is indicated with a green line," msgstr "" #. type: Plain text -#: ./user-manual.txt:1797 +#: ./user-manual.txt:1855 msgid "" "The oxygen setpoint values as well as the readings from the individual " "oxygen sensors can be shown. The display of additional CCR information is " @@ -3369,13 +3496,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1798 +#: ./user-manual.txt:1856 #, no-wrap msgid "images/CCR_preferences_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1805 +#: ./user-manual.txt:1863 msgid "" "Checking any of the check boxes allows the display of additional " "oxygen-related information whenever the pO~2~ toolbar button on the " @@ -3386,13 +3513,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1806 +#: ./user-manual.txt:1864 #, no-wrap msgid "images/CCR_setpoint_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1810 +#: ./user-manual.txt:1868 msgid "" "The second checkbox allows the display of the data from each individual " "oxygen sensor of the CCR equipment. The data for each sensor is colour-coded " @@ -3400,22 +3527,22 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1812 +#: ./user-manual.txt:1870 msgid "Sensor 1: grey" msgstr "" #. type: Plain text -#: ./user-manual.txt:1813 +#: ./user-manual.txt:1871 msgid "Sensor 2: blue" msgstr "" #. type: Plain text -#: ./user-manual.txt:1814 +#: ./user-manual.txt:1872 msgid "Sensor 3: brown" msgstr "" #. type: Plain text -#: ./user-manual.txt:1818 +#: ./user-manual.txt:1876 msgid "" "The mean oxygen pO~2~ is indicated by the green line. This allows the direct " "comparison of data from each of the oxygen sensors, useful for detecting " @@ -3423,13 +3550,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1819 +#: ./user-manual.txt:1877 #, no-wrap msgid "images/CCR_sensor_data_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1824 +#: ./user-manual.txt:1882 msgid "" "The setpoint data can be overlaid on the oxygen sensor data by activating " "both of the above check boxes. Partial pressures for nitrogen (and helium, " @@ -3437,7 +3564,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1828 +#: ./user-manual.txt:1886 msgid "" "_Events_: Several events are logged, e.g. switching the mouthpiece to open " "circuit. These events are indicated by yellow triangles and, if one hovers " @@ -3446,26 +3573,26 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1836 +#: ./user-manual.txt:1894 msgid "" "_Cylinder pressures_: Some CCR dive computers like the Poseidon MkVI record " "the pressures of the oxygen and diluent cylinders. The pressures of these " "two cylinders are shown as green lines overlapping the depth profile. In " "addition, start and end pressures for both oxygen and diluent cylinders are " "shown in the _Equipment Tab_. Below is a dive profile for a CCR dive, " -"including an overaly of setpoint and oxygen sensor data, as well as the " +"including an overlay of setpoint and oxygen sensor data, as well as the " "cylinder pressure data. In this case there is good agreement from the " "readings of the two oxygen sensors." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1837 +#: ./user-manual.txt:1895 #, no-wrap msgid "images/CCR_dive_profile_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1842 +#: ./user-manual.txt:1900 msgid "" "_Equipment-specific information_: Equipment-specific information gathered by " "_Subsurface_ is shown in the xref:S_ExtraDataTab[Extra data tab]. This may " @@ -3473,7 +3600,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1845 +#: ./user-manual.txt:1903 msgid "" "More equipment-specific information for downloading CCR dive logs for " "Poseidon MkVI and APD equipment can be found in xref:S_PoseidonMkVI[Appendix " @@ -3481,29 +3608,29 @@ msgid "" msgstr "" #. type: Title == -#: ./user-manual.txt:1846 +#: ./user-manual.txt:1904 #, no-wrap msgid "Obtaining more information about dives entered into the logbook" msgstr "" #. type: Title === -#: ./user-manual.txt:1848 +#: ./user-manual.txt:1906 #, no-wrap -msgid "The *Dive Info* tab (for individual dives)" +msgid "The *Info* tab (for individual dives)" msgstr "" #. type: Plain text -#: ./user-manual.txt:1855 +#: ./user-manual.txt:1913 msgid "" -"The Dive Info tab gives some summary information about a particular dive " -"that has been selected in the *Dive List*. Useful information here includes " -"the surface interval before the dive, the maximum and mean depths of the " -"dive, the gas volume consumed, the surface air consumption (SAC) and the " -"number of oxygen toxicity units (OTU) incurred." +"The Info tab gives some summary information about a particular dive that has " +"been selected in the *Dive List*. Useful information here includes the " +"surface interval before the dive, the maximum and mean depths of the dive, " +"the gas volume consumed, the surface air consumption (SAC) and the number of " +"oxygen toxicity units (OTU) incurred." msgstr "" #. type: Plain text -#: ./user-manual.txt:1862 +#: ./user-manual.txt:1920 msgid "" "Gas consumption and SAC calculations: _Subsurface_ calculates SAC and Gas " "consumption taking in account gas incompressibility, particularly at tank " @@ -3512,13 +3639,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:1864 +#: ./user-manual.txt:1922 #, no-wrap msgid "The *Extra Data* tab (usually for individual dives)" msgstr "" #. type: Plain text -#: ./user-manual.txt:1872 +#: ./user-manual.txt:1930 msgid "" "When using a dive computer, it often reports several data items that cannot " "easily be presented in a standardised way because the nature of the " @@ -3530,19 +3657,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1873 +#: ./user-manual.txt:1931 #, no-wrap msgid "images/ExtraDataTab_f20.jpg" msgstr "" #. type: Title === -#: ./user-manual.txt:1875 +#: ./user-manual.txt:1933 #, no-wrap msgid "The *Stats* tab (for groups of dives)" msgstr "" #. type: Plain text -#: ./user-manual.txt:1886 +#: ./user-manual.txt:1944 msgid "" "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 " @@ -3555,19 +3682,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:1888 +#: ./user-manual.txt:1946 #, no-wrap msgid "The *Dive Profile*" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1890 +#: ./user-manual.txt:1948 #, no-wrap msgid "images/Profile2.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1901 +#: ./user-manual.txt:1959 msgid "" "Of all the panels in _Subsurface_, the Dive Profile contains the most " "detailed information about each dive. The Dive Profile has a *button bar* on " @@ -3580,7 +3707,7 @@ msgid "" msgstr "" #. type: delimited block | -#: ./user-manual.txt:1908 +#: ./user-manual.txt:1966 #, no-wrap msgid "" "|*Colour*|*Descent speed (m/min)*|*Ascent speed (m/min)*\n" @@ -3592,7 +3719,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1913 +#: ./user-manual.txt:1971 msgid "" "The profile also includes depth readings for the peaks and troughs in the " "graph. Thus, users should see the depth of the deepest point and other " @@ -3601,13 +3728,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1914 +#: ./user-manual.txt:1972 #, no-wrap msgid "images/icons/scale.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1919 +#: ./user-manual.txt:1977 msgid "" "In some cases the dive profile does not fill the whole area of the *Dive " "Profile* panel. Clicking the *Scale* button in the toolbar on the left of " @@ -3616,7 +3743,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1922 +#: ./user-manual.txt:1980 #, no-wrap msgid "" "*Water temperature* is displayed with its own blue line with temperature " @@ -3625,7 +3752,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1929 +#: ./user-manual.txt:1987 msgid "" "The dive profile can include graphs of the *partial pressures* of O2, N2, " "and He during the dive (see figure above) as well as a calculated and dive " @@ -3636,13 +3763,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1930 +#: ./user-manual.txt:1988 #, no-wrap msgid "images/icons/O2.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1934 +#: ./user-manual.txt:1992 msgid "" "Clicking this button allows display of the partial pressure of *oxygen* " "during the dive. This is depicted below the dive depth and water temperature " @@ -3650,26 +3777,26 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1935 +#: ./user-manual.txt:1993 #, no-wrap msgid "images/icons/N2.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1938 +#: ./user-manual.txt:1996 msgid "" "Clicking this button allows display of the partial pressure of *nitrogen* " "during the dive." msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1939 +#: ./user-manual.txt:1997 #, no-wrap msgid "images/icons/He.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1943 +#: ./user-manual.txt:2001 msgid "" "Clicking this button allows display of the partial pressure of *helium* " "during the dive. This is only of importance to divers using Trimix, " @@ -3677,7 +3804,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1956 +#: ./user-manual.txt:2014 msgid "" "The *air consumption* graph displays the tank pressure and its change during " "the dive. The air consumption takes depth into account so that even when " @@ -3692,13 +3819,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1957 +#: ./user-manual.txt:2015 #, no-wrap msgid "images/icons/Heartbutton.png" msgstr "" #. type: Plain text -#: ./user-manual.txt:1961 +#: ./user-manual.txt:2019 msgid "" "Clicking on the heart rate button will allow the display of heart rate " "information during the dive if the dive computer was attached to a heart " @@ -3706,7 +3833,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:1969 +#: ./user-manual.txt:2027 #, no-wrap msgid "" "It is possible to *zoom* into the profile graph. This is done either by " @@ -3721,19 +3848,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:1970 +#: ./user-manual.txt:2028 #, no-wrap msgid "images/MeasuringBar.png" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1972 +#: ./user-manual.txt:2030 #, no-wrap msgid "images/icons/ruler.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:1980 +#: ./user-manual.txt:2038 msgid "" "Measurements of *depth or time differences* can be achieved by using the " "*ruler button* on the left of the dive profile panel. The measurement is " @@ -3743,13 +3870,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:1981 +#: ./user-manual.txt:2039 #, no-wrap msgid "images/icons/ShowPhotos.png" msgstr "" #. type: Plain text -#: ./user-manual.txt:1988 +#: ./user-manual.txt:2046 msgid "" "Photographs that have been added to a dive can be shown on the profile by " "selecting the *Show-photo* button. The position of a photo on the profile " @@ -3758,7 +3885,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2017 +#: ./user-manual.txt:2075 msgid "" "The profile can also include the dive computer reported *ceiling* (more " "precisely, the deepest deco stop that the dive computer calculated for each " @@ -3788,13 +3915,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2018 +#: ./user-manual.txt:2076 #, no-wrap msgid "images/icons/cceiling.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2023 +#: ./user-manual.txt:2081 msgid "" "If the dive computer itself calculates a ceiling and makes it available to " "_Subsurface_ during upload of dives, this can be shown as a red area by " @@ -3802,13 +3929,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2024 +#: ./user-manual.txt:2082 #, no-wrap msgid "images/icons/ceiling1.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2029 +#: ./user-manual.txt:2087 msgid "" "If the *Calculated ceiling* button on the Profile Panel is clicked, then a " "ceiling, calculated by _Subsurface_, is shown in green if it exists for a " @@ -3817,13 +3944,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2030 +#: ./user-manual.txt:2088 #, no-wrap msgid "images/icons/ceiling2.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2034 +#: ./user-manual.txt:2092 msgid "" "If, in addition, the *show all tissues* button on the Profile Panel is " "clicked, the ceiling is shown for the tissue compartments following the " @@ -3831,32 +3958,32 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2035 +#: ./user-manual.txt:2093 #, no-wrap msgid "images/icons/ceiling3.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2039 +#: ./user-manual.txt:2097 msgid "" "If, in addition, the *3m increments* button on the Profile Panel is clicked, " "then the ceiling is indicated in 3 m increments (*C* in figure below)." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2040 +#: ./user-manual.txt:2098 #, no-wrap msgid "images/Ceilings2.jpg" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2042 +#: ./user-manual.txt:2100 #, no-wrap msgid "images/icons/ShowCylindersButton.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2048 +#: ./user-manual.txt:2106 msgid "" "By selecting this icon, the different cylinders used during a dive can be " "represented as a coloured bar at the bottom of the *Dive Profile*. In " @@ -3868,19 +3995,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2049 +#: ./user-manual.txt:2107 #, no-wrap msgid "images/ShowCylinders_f20.jpg" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2052 +#: ./user-manual.txt:2110 #, no-wrap msgid "images/tissues.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2064 +#: ./user-manual.txt:2122 msgid "" "Display inert gas tissue pressures relative to ambient inert gas pressure " "(horizontal grey line). Tissue pressures are calculated using the Bühlmann " @@ -3899,13 +4026,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2065 +#: ./user-manual.txt:2123 #, no-wrap msgid "images/tissuesGraph.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2073 +#: ./user-manual.txt:2131 msgid "" "Gradient Factor settings strongly affect the calculated ceilings and their " "depths. For more information about Gradient factors, see the section on " @@ -3918,7 +4045,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2075 +#: ./user-manual.txt:2133 #, no-wrap msgid "" " ** http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding " @@ -3926,7 +4053,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2077 +#: ./user-manual.txt:2135 #, no-wrap msgid "" " ** " @@ -3935,13 +4062,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2079 +#: ./user-manual.txt:2137 #, no-wrap msgid "The Dive Profile context menu" msgstr "" #. type: Plain text -#: ./user-manual.txt:2097 +#: ./user-manual.txt:2155 msgid "" "The context menu for the Dive Profile is accessed by right-clicking while " "the mouse cursor is over the Dive Profile panel. The menu allows the " @@ -3962,13 +4089,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2099 +#: ./user-manual.txt:2157 #, no-wrap msgid "The *Information Box*" msgstr "" #. type: Plain text -#: ./user-manual.txt:2109 +#: ./user-manual.txt:2167 msgid "" "The Information box displays a large range of information pertaining to the " "dive profile. Normally the Information Box is located to the top left of the " @@ -3981,13 +4108,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2110 +#: ./user-manual.txt:2168 #, no-wrap msgid "images/InfoBox2.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2127 +#: ./user-manual.txt:2185 msgid "" "The moment the mouse points inside the *Dive Profile* panel, the information " "box expands and shows many data items. In this situation, the data reflect " @@ -4008,20 +4135,20 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2130 +#: ./user-manual.txt:2188 msgid "" "The user has control over the display of several statistics, represented as " "four buttons on the left of the profile panel. These are:" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2131 +#: ./user-manual.txt:2189 #, no-wrap msgid "images/icons/MOD.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2138 +#: ./user-manual.txt:2196 msgid "" "Clicking this button causes the Information Box to display the *Maximum " "Operating Depth (MOD)* of the dive, given the gas mixture used. MOD is " @@ -4031,13 +4158,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2139 +#: ./user-manual.txt:2197 #, no-wrap msgid "images/icons/NDL.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2148 +#: ./user-manual.txt:2206 msgid "" "Clicking this button causes the Information Box to display the *No-deco " "Limit (NDL)* or the *Total Time to Surface (TTS)*. NDL is the time duration " @@ -4050,13 +4177,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2149 +#: ./user-manual.txt:2207 #, no-wrap msgid "images/icons/SAC.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2158 +#: ./user-manual.txt:2216 msgid "" "Clicking this button causes the Information Box to display the *Surface Air " "Consumption (SAC)*. SAC is an indication of the surface-normalised " @@ -4069,13 +4196,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:2159 +#: ./user-manual.txt:2217 #, no-wrap msgid "images/icons/EAD.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2174 +#: ./user-manual.txt:2232 msgid "" "Clicking this button displays the *Equivalent Air Depth (EAD)* for nitrox " "dives as well as the *Equivalent Narcotic Depth (END)* for trimix " @@ -4084,28 +4211,28 @@ msgid "" "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 hypothetical " +"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." +"the same narcotic effect as a diver breathing air diving at a depth equaling " +"the END." msgstr "" #. type: Plain text -#: ./user-manual.txt:2176 +#: ./user-manual.txt:2234 msgid "" "Figure (*B*) above shows an information box with a nearly complete set of " "data." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2178 +#: ./user-manual.txt:2236 #, no-wrap msgid "The Gas Pressure Bar Graph" msgstr "" #. type: Plain text -#: ./user-manual.txt:2185 +#: ./user-manual.txt:2243 msgid "" "On the left of the *Information Box* is a vertical bar graph indicating the " "pressures of the nitrogen (and other inert gases, e.g. helium, if " @@ -4116,13 +4243,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2186 +#: ./user-manual.txt:2244 #, no-wrap msgid "images/GasPressureBarGraph.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2192 +#: ./user-manual.txt:2250 msgid "" "The light green area indicates the total gas, with the top margin of the " "light green area indicating the total gas pressure inhaled by the diver and " @@ -4132,7 +4259,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2198 +#: ./user-manual.txt:2256 msgid "" "The horizontal black line underneath the light green margin indicates the " "equilibrium pressure of the inert gases inhaled by the diver, usually " @@ -4143,7 +4270,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2202 +#: ./user-manual.txt:2260 msgid "" "The dark green area at the bottom of the graph represents the pressures of " "inert gas in each of the 16 tissue compartments, following the Bühlmann " @@ -4151,7 +4278,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2207 +#: ./user-manual.txt:2265 msgid "" "The top black horizontal line indicates the gradient factor that applies to " "the depth of the diver at the particular point on the *Dive Profile*. The " @@ -4161,7 +4288,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2211 +#: ./user-manual.txt:2269 msgid "" "The bottom margin of the red area in the graph indicates the Bühlman-derived " "M-value, that is the pressure value of inert gases at which bubble formation " @@ -4169,7 +4296,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2214 +#: ./user-manual.txt:2272 msgid "" "These five values are indicated on the left in the graph above. The way the " "Gas Pressure Bar Graph changes during a dive is indicated on the right hand " @@ -4177,7 +4304,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2217 +#: ./user-manual.txt:2275 msgid "" "Graph *A* indicates the situation at the start of a dive with diver at the " "surface. The pressures in all the tissue compartments are still at the " @@ -4185,7 +4312,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2220 +#: ./user-manual.txt:2278 msgid "" "Graph *B* indicates the situation after a descent to 30 meters. Few of the " "tissue compartments have had time to respond to the descent, their gas " @@ -4193,7 +4320,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2225 +#: ./user-manual.txt:2283 msgid "" "Graph *C* represents the pressures after 30 minutes at 30 m. The fast " "compartments have attained equilibrium (i.e. they have reached the hight of " @@ -4203,7 +4330,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2231 +#: ./user-manual.txt:2289 msgid "" "Graph *D* shows the pressures after ascent to a depth of 4.5 meters. Since, " "during ascent, the total inhaled gas pressure has decreased strongly from 4 " @@ -4214,7 +4341,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2236 +#: ./user-manual.txt:2294 msgid "" "Graph *E* indicates the situation after remaining at 4.5 meters for 10 " "minutes. The fast compartments have decreased in pressure. As expected, the " @@ -4224,50 +4351,50 @@ msgid "" msgstr "" #. type: Title == -#: ./user-manual.txt:2239 +#: ./user-manual.txt:2297 #, no-wrap msgid "Organising the logbook (Manipulating groups of dives)" msgstr "" #. type: Title === -#: ./user-manual.txt:2241 +#: ./user-manual.txt:2299 #, no-wrap msgid "The Dive List context menu" msgstr "" #. type: Plain text -#: ./user-manual.txt:2246 +#: ./user-manual.txt:2303 msgid "" -"Many actions within _Subsurface_ are dependent on a context menu used mostly " -"to manipulate groups of dives. The context menu is found by selecting a dive " -"or a group of dives and then right-clicking." +"Several actions on either a single dive or a group of dives can be performed " +"using the Dive List Context Menu, found by selecting either a single dive or " +"a group of dives and then right-clicking." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2247 +#: ./user-manual.txt:2304 #, no-wrap msgid "images/ContextMenu.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2250 +#: ./user-manual.txt:2307 msgid "The context menu is used in many manipulations described below." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2251 +#: ./user-manual.txt:2308 #, no-wrap msgid "Customising the information showed in the *Dive List* panel" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2253 +#: ./user-manual.txt:2310 #, no-wrap msgid "images/DiveListOptions.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2261 +#: ./user-manual.txt:2318 msgid "" "The default information in the *Dive List* includes, for each dive, " "Dive_number, Date, Rating, Dive_depth, Dive_duration and Dive_location. This " @@ -4281,13 +4408,13 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:2262 +#: ./user-manual.txt:2319 #, no-wrap msgid "Selecting dives from a particular dive site" msgstr "" #. type: Plain text -#: ./user-manual.txt:2268 +#: ./user-manual.txt:2325 msgid "" "Many divers have long dive lists and it may be difficult to locate all the " "dives at a particular site. By pressing _Ctl-F_ on the keyboard, a text box " @@ -4297,13 +4424,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2270 +#: ./user-manual.txt:2327 #, no-wrap msgid "Renumbering the dives" msgstr "" #. type: Plain text -#: ./user-manual.txt:2282 +#: ./user-manual.txt:2339 msgid "" "Dives are normally numbered incrementally from non-recent dives (low " "sequence numbers) to recent dives (having the highest sequence numbers). The " @@ -4318,68 +4445,77 @@ msgid "" "*Dive List* panel." msgstr "" +#. type: Plain text +#: ./user-manual.txt:2344 +msgid "" +"One can also renumber a few selected dives in the dive list. Select the " +"dives that need renumbering. Right-click on the selected list and use the " +"Dive List Context Menu to perform the renumbering. A popup window appears " +"requiring the user to specify the starting number for the renumbering " +"process." +msgstr "" + #. type: Title === -#: ./user-manual.txt:2284 +#: ./user-manual.txt:2346 #, no-wrap msgid "Grouping dives into trips and manipulating trips" msgstr "" #. type: Plain text -#: ./user-manual.txt:2292 +#: ./user-manual.txt:2354 msgid "" "For regular divers, the dive list can rapidly become very long. _Subsurface_ " "can group dives into _trips_. It performs this by grouping dives that have " -"date/times that are not separated in time by more than two days, thus " -"creating a single heading for each diving trip represented in the dive " -"log. Below is an ungrouped dive list (*A*, on the left) as well as the " -"corresponding grouped dive list comprising five dive trips (*B*, on the " -"right):" +"date/times not separated in time by more than two days, thus creating a " +"single heading for each diving trip represented in the dive log. Below is an " +"ungrouped dive list (*A*, on the left) as well as the corresponding grouped " +"dive list comprising five dive trips (*B*, on the right):" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2293 +#: ./user-manual.txt:2355 #, no-wrap msgid "images/Group2.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2299 +#: ./user-manual.txt:2361 msgid "" "Grouping into trips allows a rapid way of accessing individual dives without " "having to scan a long lists of dives. In order to group the dives in a dive " -"list, (from the Main Menu) users must select _Log -> Autogroup_. The *Dive " -"List* panel now shows only the titles for the trips." +"list, (from the Main Menu) select _Log -> Autogroup_. The *Dive List* panel " +"now shows only the titles for the trips." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2300 +#: ./user-manual.txt:2362 #, no-wrap msgid "Editing the title and associated information for a particular trip" msgstr "" #. type: Plain text -#: ./user-manual.txt:2313 +#: ./user-manual.txt:2375 msgid "" "Normally, in the dive list, minimal information is included in the trip " "title. More information about a trip can be added by selecting its trip " -"title from the *Dive List*. This shows a *Trip Notes* tab in the *Dive " -"Notes* panel. Here users can add or edit information about the date/time, " -"the trip location and any other general comments about the trip as a whole " -"(e.g. the dive company that was dived with, the general weather and surface " -"conditions during the trip, etc.). After entering this information, users " -"should select *Save* from the buttons at the top right of the *Trip Notes* " -"tab. The trip title in the *Dive List* panel should now reflect some of the " -"edited information." +"title from the *Dive List*. This shows a *Trip Notes* tab in the *Notes* " +"panel. Here users can add or edit information about the date/time, the trip " +"location and any other general comments about the trip as a whole (e.g. the " +"dive company that was dived with, the general weather and surface conditions " +"during the trip, etc.). After entering this information, users should " +"select *Save* from the buttons at the top right of the *Trip Notes* tab. The " +"trip title in the *Dive List* panel should now reflect some of the edited " +"information." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2314 +#: ./user-manual.txt:2376 #, no-wrap msgid "Viewing the dives during a particular trip" msgstr "" #. type: Plain text -#: ./user-manual.txt:2319 +#: ./user-manual.txt:2381 msgid "" "Once the dives have been grouped into trips, users can expand one or more " "trips by clicking the arrow-head on the left of each trip title. This " @@ -4388,42 +4524,42 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:2320 +#: ./user-manual.txt:2382 #, no-wrap msgid "Collapsing or expanding dive information for different trips" msgstr "" #. type: Plain text -#: ./user-manual.txt:2326 +#: ./user-manual.txt:2388 msgid "" -"If a user right-clicks after selecting a particular trip in the dive list, " -"the resulting context menu allows several possibilities to expand or " -"collapse dives within trips. This includes expanding all trips, collapsing " -"all trips and collapsing all trips except the selected one." +"After selecting a particular trip in the dive list, the context menu allows " +"several possibilities to expand or collapse dives within trips. This " +"includes expanding all trips, collapsing all trips and collapsing all trips " +"except the selected one." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2327 +#: ./user-manual.txt:2389 #, no-wrap msgid "Merging dives from more than one trip into a single trip" msgstr "" #. type: Plain text -#: ./user-manual.txt:2332 +#: ./user-manual.txt:2394 msgid "" -"By right-clicking on a selected trip title in the *Dive List* panel, a " -"context menu shows up that allows the merging of trips by either merging of " -"the selected trip with the trip below or with the trip above." +"After selecting a trip title, the context menu allows the merging of trips " +"by either merging the selected trip with the trip below or with the trip " +"above.(Merge trip with trip below; Merge trip with trip above)" msgstr "" #. type: Title ==== -#: ./user-manual.txt:2333 +#: ./user-manual.txt:2395 #, no-wrap msgid "Splitting a single trip into more than one trip" msgstr "" #. type: Plain text -#: ./user-manual.txt:2343 +#: ./user-manual.txt:2405 msgid "" "If a trip includes five dives, the user can split this trip into two trips " "(trip 1: top 3 dives; trip 2: bottom 2 dives) by selecting and " @@ -4435,25 +4571,25 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2344 +#: ./user-manual.txt:2406 #, no-wrap msgid "images/SplitDive3a.jpg" msgstr "" #. type: Title === -#: ./user-manual.txt:2346 +#: ./user-manual.txt:2408 #, no-wrap msgid "Manipulating single dives" msgstr "" #. type: Title ==== -#: ./user-manual.txt:2348 +#: ./user-manual.txt:2410 #, no-wrap msgid "Delete a dive from the dive log" msgstr "" #. type: Plain text -#: ./user-manual.txt:2355 +#: ./user-manual.txt:2417 msgid "" "Dives can be permanently deleted from the dive log by selecting and " "right-clicking them to bring up the context menu, and then selecting *Delete " @@ -4463,43 +4599,43 @@ msgid "" msgstr "" #. type: Title ==== -#: ./user-manual.txt:2356 +#: ./user-manual.txt:2418 #, no-wrap msgid "Unlink a dive from a trip" msgstr "" #. type: Plain text -#: ./user-manual.txt:2363 +#: ./user-manual.txt:2425 msgid "" "Users can unlink dives from the trip to which they belong. In order to do " "this, select and right-click the relevant dives to bring up the context " "menu. Then select the option *Remove dive(s) from trip*. The dive(s) now " -"appear immediately above the trip to which they belonged." +"appear immediately above or below the trip to which they belonged, depending " +"on the date and time of the unliked dive." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2364 +#: ./user-manual.txt:2426 #, no-wrap msgid "Add a dive to the trip immediately above" msgstr "" #. type: Plain text -#: ./user-manual.txt:2371 +#: ./user-manual.txt:2431 msgid "" "Selected dives can be moved from the trip to which they belong and placed " -"within the trip immediately above the currently active trip. To do this, " -"select and right-click the dive(s) to bring up the context menu, and then " -"select *Add dive(s) to trip immediately above*." +"within a separate trip. To do this, select and right-click the dive(s) to " +"bring up the context menu, and then select *Create new trip above*." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2372 +#: ./user-manual.txt:2432 #, no-wrap msgid "Shift the start time of dive(s)" msgstr "" #. type: Plain text -#: ./user-manual.txt:2383 +#: ./user-manual.txt:2443 msgid "" "Sometimes it is necessary to adjust the start time of a dive. This may apply " "to situations where dives are performed in different time zones or when the " @@ -4508,17 +4644,17 @@ msgid "" "context menu on which the *Shift times* option should be selected. User must " "then specify the time (in hours and minutes) by which the dives should be " "adjusted and click on the option indicating whether the time adjustment " -"should be forwards or backwards." +"should be ealier or later." msgstr "" #. type: Title ==== -#: ./user-manual.txt:2384 +#: ./user-manual.txt:2444 #, no-wrap msgid "Merge dives into a single dive" msgstr "" #. type: Plain text -#: ./user-manual.txt:2394 +#: ./user-manual.txt:2454 msgid "" "Sometimes a dive is briefly interrupted, e.g. if a diver returns to the " "surface for a few minutes, resulting in two or more dives being recorded by " @@ -4526,25 +4662,41 @@ msgid "" "panel. Users can merge these dives onto a single dive by selecting the " "appropriate dives, right-clicking them to bring up the context menu and then " "selecting *Merge selected dives*. It may be necessary to edit the dive " -"information in the *Dive Notes* panel to reflect events or conditions that " -"apply to the merged dive. The figure below shows the depth profile of two " -"such dives that were merged:" +"information in the *Notes* panel to reflect events or conditions that apply " +"to the merged dive. The figure below shows the depth profile of two such " +"dives that were merged:" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2395 +#: ./user-manual.txt:2455 #, no-wrap msgid "images/MergedDive.png" msgstr "" +#. type: Title ==== +#: ./user-manual.txt:2457 +#, no-wrap +msgid "Undo dive manipulations" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:2463 +msgid "" +"Important actions on dives or trips, described above, can be undone or " +"redone. This includes: _delete dives_, _merge dives_, _renumber dives_ and " +"_shift dive times_. To do this after performing any of these actions, from " +"the *Main Menu* select _Edit_. This brings up the possibility to _Undo_ or " +"_Redo_ an action." +msgstr "" + #. type: Title === -#: ./user-manual.txt:2398 +#: ./user-manual.txt:2466 #, no-wrap msgid "Filtering the dive list" msgstr "" #. type: Plain text -#: ./user-manual.txt:2404 +#: ./user-manual.txt:2472 msgid "" "The dives in the *Dive List* panel can be filtered, that is, one can select " "only some of the dives based on their attributes, e.g. dive tags, dive site, " @@ -4554,27 +4706,27 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2413 +#: ./user-manual.txt:2481 msgid "" "To open the filter, select _Log -> Filter divelist_ from the main menu. This " "opens the _Filter Panel_ at the top of the _Subsurface_ window. Three icons " "are located at the top right hand of the filter panel. The _Filter Panel_ " -"can be reset (i.e. all current filters cleared) by selecting the *+*. The " -"_Filter Panel_ may also be minimised by selecting the middle icon. When " -"minimised, only these three icons are shown. The panel can be maximised by " -"clicking the icon that minimised the panel. The filter may also be reset and " -"closed by selecting the button with the flag. An example of the _Filter " -"Panel_ is shown in the figure below." +"can be reset (i.e. all current filters cleared) by selecting the *yellow " +"angled arrow*. The _Filter Panel_ may also be minimised by selecting the " +"*green up-arrow\". When minimised, only these three icons are shown. The " +"panel can be maximised by clicking the icon that minimised the panel. The " +"filter may also be reset and closed by selecting the *red button* with the " +"white cross. An example of the _Filter Panel_ is shown in the figure below." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2414 +#: ./user-manual.txt:2482 #, no-wrap msgid "images/Filterpanel.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2423 +#: ./user-manual.txt:2491 msgid "" "Four filter criteria may be used to filter the dive list: dive tags, person " "(buddy / dive master), dive site and dive suit, each of which is represented " @@ -4587,49 +4739,48 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2431 +#: ./user-manual.txt:2499 msgid "" -"To activate filtering of the dive list, the check box of at least one item " -"in one of the four check lists needs to be checked. The dive list is then " -"shortened to include only the dives that pertain to the selection criteria " -"specified in the check lists. The four check lists work as a filter with " -"_AND_ operators, Subsurface filters therefore for _cave_ as a tag AND _Joe " -"Smith_ as a buddy; but the filters within a category are inclusive - " -"filtering for _cave_ and _boat_ shows those dives that have either one or " -"both of these tags." +"To activate filtering of the dive list, check at least tone check box in one " +"of the four check lists. The dive list is then shortened to include only the " +"dives that pertain to the criteria specified in the check lists. The four " +"check lists work as a filter with _AND_ operators, Subsurface filters " +"therefore for _cave_ as a tag AND _Joe Smith_ as a buddy; but the filters " +"within a category are inclusive - filtering for _cave_ and _boat_ shows " +"those dives that have either one OR both of these tags." msgstr "" #. type: Title == -#: ./user-manual.txt:2433 +#: ./user-manual.txt:2501 #, no-wrap msgid "Exporting the dive log or parts of the dive log" msgstr "" #. type: Plain text -#: ./user-manual.txt:2436 +#: ./user-manual.txt:2504 msgid "There are two routes for the export of dive information from Subsurface:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2438 +#: ./user-manual.txt:2506 msgid "Export dive information to _Facebook_" msgstr "" #. type: Plain text -#: ./user-manual.txt:2440 +#: ./user-manual.txt:2508 msgid "" "xref:S_Export_other[Export dive information to other destinations or " "formats]" msgstr "" #. type: Title === -#: ./user-manual.txt:2442 +#: ./user-manual.txt:2510 #, no-wrap msgid "Exporting dive information to _Facebook_" msgstr "" #. type: Plain text -#: ./user-manual.txt:2451 +#: ./user-manual.txt:2519 msgid "" "Export of dives to _Facebook_ is handled differently from other types of " "export. This is because export to _Facebook_ needs a connection to " @@ -4642,19 +4793,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2452 +#: ./user-manual.txt:2520 #, no-wrap msgid "images/facebook1_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2465 +#: ./user-manual.txt:2533 msgid "" "Having established a login to _Facebook_, transfer of a dive profile to " -"one's _Facebook_ timeline is easy. A _Facebook_ icon appears in the *Dive " -"Notes* panel of _Subsurface_ (See image *A* below). Ensure that the dive " -"that you want to transfer to the timeline is depicted in the _Subsurface_ " -"*Dive Profile* panel. Select the _Facebook_ icon, and a dialogue is shown, " +"one's _Facebook_ timeline is easy. A _Facebook_ icon appears in the *Notes* " +"panel of _Subsurface_ (See image *A* below). Ensure that the dive that you " +"want to transfer to the timeline is depicted in the _Subsurface_ *Dive " +"Profile* panel. Select the _Facebook_ icon, and a dialogue is shown, " "determining the amount of additional information transferred with the dive " "profile (see image *B*, below). In order to transfer a dive profile to " "_Facebook_, the name of a _Facebook_ album needs to be provided. The " @@ -4669,7 +4820,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2472 +#: ./user-manual.txt:2540 msgid "" "Both the Album created and the post to your time line will be marked as " "private. In order for friends to be able to see the post you have to change " @@ -4679,13 +4830,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2473 +#: ./user-manual.txt:2541 #, no-wrap msgid "images/facebook2_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2476 +#: ./user-manual.txt:2544 msgid "" "If required, then close the _Facebook_ connection by either closing " "_Subsurface_ or by selecting _File -> Preferences -> Facebook_ from the Main " @@ -4693,13 +4844,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2478 +#: ./user-manual.txt:2546 #, no-wrap msgid "Export dive information to other destinations or formats" msgstr "" #. type: Plain text -#: ./user-manual.txt:2483 +#: ./user-manual.txt:2551 msgid "" "For non-_Facebook exports_, the export function can be reached by selecting " "_File -> Export_, which brings up the Export dialog. This dialog always " @@ -4709,23 +4860,23 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2484 +#: ./user-manual.txt:2552 #, no-wrap msgid "images/Export_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2487 +#: ./user-manual.txt:2555 msgid "A dive log or part of it can be saved in three formats:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2489 +#: ./user-manual.txt:2557 msgid "_Subsurface XML_ format. This is the native format used by _Subsurface_." msgstr "" #. type: Plain text -#: ./user-manual.txt:2493 +#: ./user-manual.txt:2561 msgid "" "Universal Dive Data Format (_UDDF_). Refer to _http://uddf.org_ for more " "information. UDDF is a generic format that enables communication among many " @@ -4733,7 +4884,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2497 +#: ./user-manual.txt:2565 msgid "" "_Divelogs.de_, an Internet-based dive log repository. In order to upload to " "_Divelogs.de_, one needs a user-ID as well as a password for " @@ -4742,15 +4893,15 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2501 +#: ./user-manual.txt:2569 msgid "" -"_DiveShare_ is also a dive log repostory on the Internet focusing on the " +"_DiveShare_ is also a dive log repository on the Internet focusing on the " "recreational dives. In order to upload dives one has to provide a used ID, " "so registration with _http://scubadiveshare.com_ is required." msgstr "" #. type: Plain text -#: ./user-manual.txt:2506 +#: ./user-manual.txt:2574 msgid "" "_CSV dive details_, that includes the most critical information of the dive " "profile. Included information of a dive is: dive number, date, time, buddy, " @@ -4759,7 +4910,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2509 +#: ./user-manual.txt:2577 msgid "" "_CSV dive profile_, that includes a large amount of detail for each dive, " "including the depth profile, temperature and pressure information of each " @@ -4767,7 +4918,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2521 +#: ./user-manual.txt:2589 msgid "" "_HTML_ format, in which the dive(s) are stored in HTML files, readable with " "an Internet browser. Most modern web browsers are supported, but JavaScript " @@ -4782,7 +4933,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2526 +#: ./user-manual.txt:2594 msgid "" "_Worldmap_ format, an HTML file with a world map upon which each dive and " "some information about it are indicated. This map is not editable. However, " @@ -4791,13 +4942,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2527 +#: ./user-manual.txt:2595 #, no-wrap msgid "images/mapview_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2534 +#: ./user-manual.txt:2602 msgid "" "_Image depths_, which creates a text file that contains the file names of " "all photos or images attached to any of the selected dives in the _Dive " @@ -4806,12 +4957,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2536 +#: ./user-manual.txt:2604 msgid "_General Settings_, under the HTML tab, provides the following options:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2544 +#: ./user-manual.txt:2612 #, no-wrap msgid "" "** Subsurface Numbers: if this option is checked, the dive(s) are exported " @@ -4828,27 +4979,27 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2547 +#: ./user-manual.txt:2615 msgid "" "Under _Style Options_ some style-related options are available like font " "size and theme." msgstr "" #. type: Plain text -#: ./user-manual.txt:2550 +#: ./user-manual.txt:2618 msgid "" "Export to other formats can be achieved through third party facilities, for " "instance _www.divelogs.de_." msgstr "" #. type: Title == -#: ./user-manual.txt:2552 +#: ./user-manual.txt:2620 #, no-wrap msgid "Keeping a _Subsurface_ dive log in the Cloud" msgstr "" #. type: Plain text -#: ./user-manual.txt:2565 +#: ./user-manual.txt:2633 msgid "" "For each diver, dive log information is highly important. Not only is it a " "record of diving activities for one's own pleasure, but it is important " @@ -4865,7 +5016,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2570 +#: ./user-manual.txt:2638 msgid "" "For instance http://www.dropbox.com/[_Dropbox_] offers a free application " "that allows files on the Dropbox servers to be seen as a local folder on " @@ -4873,13 +5024,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2571 +#: ./user-manual.txt:2639 #, no-wrap msgid "images/Cloud.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2580 +#: ./user-manual.txt:2648 msgid "" "The _Dropbox_ program creates a copy of the _Dropbox_ Internet Cloud content " "on one's desktop computer. When the computer is connected to the Internet, " @@ -4892,7 +5043,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2587 +#: ./user-manual.txt:2655 msgid "" "In this way a dive log in one's _Dropbox_ folder can be accessed seamlessly " "from the Internet and can be accessed from any place with Internet " @@ -4902,7 +5053,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2593 +#: ./user-manual.txt:2661 msgid "" "Alternatively one can use _Dropbox_ as a mechanism to backup one's dive " "log. To Store a dive log in the Cloud, select _File -> Save as_ from the " @@ -4913,20 +5064,20 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2596 +#: ./user-manual.txt:2664 msgid "" "Several paid services exist on the Internet (e.g. Google, Amazon) where the " "same process could be used for the Cloud-based storage of dive logs." msgstr "" #. type: Title == -#: ./user-manual.txt:2599 +#: ./user-manual.txt:2667 #, no-wrap msgid "Printing a dive log" msgstr "" #. type: Plain text -#: ./user-manual.txt:2603 +#: ./user-manual.txt:2671 msgid "" "_Subsurface_ provides a simple interface to print a whole dive log or only a " "few selected dives, including dive profiles and other contextual " @@ -4934,12 +5085,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2605 +#: ./user-manual.txt:2673 msgid "Before printing, two decisions are required:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2608 +#: ./user-manual.txt:2676 msgid "" "Should the whole dive log be printed or only part of it? If only part of the " "dive log is required, then the user must select the required dives from the " @@ -4947,7 +5098,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2610 +#: ./user-manual.txt:2678 msgid "" "What gas partial pressure information is required on the dive profile? Users " "should select the appropriate toggle-buttons on the button bar to the left " @@ -4955,7 +5106,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2614 +#: ./user-manual.txt:2682 msgid "" "Now the print options should be selected to match the user's needs. To do " "this, user should select _File -> Print_ from the Main menu. The following " @@ -4963,49 +5114,49 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2615 +#: ./user-manual.txt:2683 #, no-wrap msgid "images/PrintDiveLog.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2618 +#: ./user-manual.txt:2686 msgid "Under _Print type_ users need to select one of three options:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2620 +#: ./user-manual.txt:2688 msgid "Print the complete Dive List: to do this, _Table Print_ should be selected." msgstr "" #. type: Plain text -#: ./user-manual.txt:2622 +#: ./user-manual.txt:2690 msgid "" "Print the selected dives (dive profiles and all other information) at 6 " "dives per printed page: to do this, users should select _6 dives per page_." msgstr "" #. type: Plain text -#: ./user-manual.txt:2624 +#: ./user-manual.txt:2692 msgid "" "Print the selected dives (dive profiles and all other information) at 2 " "dives per printed page: to do this, users should select _2 dives per page_." msgstr "" #. type: Plain text -#: ./user-manual.txt:2626 +#: ./user-manual.txt:2694 msgid "" "Print the selected dives (dive profiles and all other information) at 1 dive " "per printed page: to do this, users should select _1 dive per page_." msgstr "" #. type: Plain text -#: ./user-manual.txt:2628 +#: ./user-manual.txt:2696 msgid "Under _Print options_ users need to select:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2632 +#: ./user-manual.txt:2700 msgid "" "Printing only the dives that have been selected from the dive list prior to " "activating the print dialogue, achieved by checking the box _Print only " @@ -5013,12 +5164,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2633 +#: ./user-manual.txt:2701 msgid "Printing in colour, achieved by checking the box with _Print in colour_." msgstr "" #. type: Plain text -#: ./user-manual.txt:2640 +#: ./user-manual.txt:2708 msgid "" "The _Ordering_ affects the layout of the page (or part of it) for each " "dive. The dive profile could be printed at the top of each dive, with the " @@ -5029,7 +5180,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2644 +#: ./user-manual.txt:2712 msgid "" "Users can _Preview_ the printed page by selecting the _Preview_ button on " "the dialogue. After preview, changes to the options in the print dialogue " @@ -5037,7 +5188,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2654 +#: ./user-manual.txt:2722 msgid "" "Next, select the _Print_ button in the dialogue. This activates the regular " "print dialogue used by the user operating system (image [*B*] in the middle, " @@ -5049,19 +5200,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2655 +#: ./user-manual.txt:2723 #, no-wrap msgid "images/Printpreview.jpg" msgstr "" #. type: Title == -#: ./user-manual.txt:2659 +#: ./user-manual.txt:2727 #, no-wrap msgid "Configuring a dive computer" msgstr "" #. type: Plain text -#: ./user-manual.txt:2667 +#: ./user-manual.txt:2735 msgid "" "_Subsurface_ enables one to configure a dive computer. Currently the " "Heinrichs-Weikamp (OSTC 2, OSTC 3) and Suunto Vyper (Stinger, Mosquito, D3, " @@ -5075,7 +5226,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2672 +#: ./user-manual.txt:2740 msgid "" "Once the dive computer is connected to the _Subsurface_ computer, select " "_File -> Configure dive computer_ from the _Main Menu_. Provide the " @@ -5085,20 +5236,20 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2673 +#: ./user-manual.txt:2741 #, no-wrap msgid "images/Configure_dc_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2676 +#: ./user-manual.txt:2744 msgid "" "Using the appropriate buttons on the configuration panel, the following " "actions can be performed:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2679 +#: ./user-manual.txt:2747 #, no-wrap msgid "" "*Retrieve available details*. This loads the existing configuration from the " @@ -5107,7 +5258,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2681 +#: ./user-manual.txt:2749 #, no-wrap msgid "" "*Save changes to device*. This changes the configuration of the\n" @@ -5116,7 +5267,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2683 +#: ./user-manual.txt:2751 #, no-wrap msgid "" "*Backup*. This saves the configuration data to a file. _Subsurface_ asks " @@ -5125,7 +5276,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2685 +#: ./user-manual.txt:2753 #, no-wrap msgid "" "*Restore backup*. This loads the information from a backup file and displays " @@ -5134,7 +5285,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2687 +#: ./user-manual.txt:2755 #, no-wrap msgid "" "*Update firmware*. If new firmware is available for the dive computer, this " @@ -5143,13 +5294,13 @@ msgid "" msgstr "" #. type: Title == -#: ./user-manual.txt:2690 +#: ./user-manual.txt:2758 #, no-wrap msgid "Setting user _Preferences_ for _Subsurface_" msgstr "" #. type: Plain text -#: ./user-manual.txt:2698 +#: ./user-manual.txt:2766 msgid "" "There are several settings within _Subsurface_ that the user can " "specify. These are found when selecting _File -> Preferences_. The settings " @@ -5161,24 +5312,24 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2699 +#: ./user-manual.txt:2767 #, no-wrap msgid "Defaults" msgstr "" #. type: Plain text -#: ./user-manual.txt:2702 +#: ./user-manual.txt:2770 msgid "There are several settings in the *Defaults* panel:" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2703 +#: ./user-manual.txt:2771 #, no-wrap msgid "images/Pref1_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2707 +#: ./user-manual.txt:2775 #, no-wrap msgid "" " ** *Lists and tables*: Here one can specify the font type and font size of " @@ -5188,7 +5339,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2712 +#: ./user-manual.txt:2780 #, no-wrap msgid "" " ** *Dives*: For the _Default Dive File_ one need to specify the directory " @@ -5201,7 +5352,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2717 +#: ./user-manual.txt:2785 #, no-wrap msgid "" " ** *Display invalid*: Dives can be marked as invalid (when a user wishes " @@ -5214,16 +5365,16 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2720 +#: ./user-manual.txt:2788 #, no-wrap msgid "" " ** *Default cylinder*: Here users can specify the default cylinder listed " "in\n" -" the *Equipment* tab of the *Dive Notes* panel.\n" +" the *Equipment* tab of the *Notes* panel.\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:2728 +#: ./user-manual.txt:2796 #, no-wrap msgid "" " ** *Animations*: Some actions in showing the dive profile are performed " @@ -5241,7 +5392,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2733 +#: ./user-manual.txt:2801 #, no-wrap msgid "" " ** *Subsurface web service*: When one subscribes to the " @@ -5254,7 +5405,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2736 +#: ./user-manual.txt:2804 #, no-wrap msgid "" " ** *Clear all settings*: As indicated in the button below this heading, " @@ -5263,19 +5414,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2737 +#: ./user-manual.txt:2805 #, no-wrap msgid "Units" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2738 +#: ./user-manual.txt:2806 #, no-wrap msgid "images/Pref2_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2745 +#: ./user-manual.txt:2813 msgid "" "Here user can choose between metric and imperial units of depth, pressure, " "volume, temperature and mass. By selecting the Metric or Imperial radio " @@ -5286,24 +5437,24 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2746 +#: ./user-manual.txt:2814 #, no-wrap msgid "Graph" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2748 +#: ./user-manual.txt:2816 #, no-wrap msgid "images/Pref3_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2752 +#: ./user-manual.txt:2820 msgid "This panel allows two type of selections:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2760 +#: ./user-manual.txt:2828 #, no-wrap msgid "" "*Show*: Here users can specify the amount of information shown as part of\n" @@ -5320,7 +5471,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2765 +#: ./user-manual.txt:2833 #, no-wrap msgid "" "** _Draw dive computer reported ceiling red_: This checkbox allows exactly " @@ -5334,7 +5485,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2767 +#: ./user-manual.txt:2835 #, no-wrap msgid "" "** _Show unused cylinders in Equipment Tab_: This checkbox allows display of " @@ -5345,7 +5496,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2772 +#: ./user-manual.txt:2841 #, no-wrap msgid "" "** _Show average depth_: Activating this checkbox causes _Subsurface_ to " @@ -5358,13 +5509,13 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2774 +#: ./user-manual.txt:2843 #, no-wrap msgid "*Misc*:\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:2786 +#: ./user-manual.txt:2855 #, no-wrap msgid "" "** Gradient Factors:* Here users can set the _gradient factors_ used while " @@ -5391,7 +5542,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2788 +#: ./user-manual.txt:2857 #, no-wrap msgid "" " *** http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding " @@ -5399,7 +5550,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2790 +#: ./user-manual.txt:2859 #, no-wrap msgid "" " *** " @@ -5408,7 +5559,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2794 +#: ./user-manual.txt:2863 #, no-wrap msgid "" " ** _CCR: Show setpoints when viewing pO2:_ With this checkbox ativated, the " @@ -5420,7 +5571,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2798 +#: ./user-manual.txt:2867 #, no-wrap msgid "" " ** _CCR: Show individual O~2~ sensor values when viewing pO~2~:_ Show the " @@ -5431,13 +5582,13 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2800 +#: ./user-manual.txt:2869 #, no-wrap msgid "*Configuring dive planning using rebreather equipment:*\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:2802 +#: ./user-manual.txt:2871 #, no-wrap msgid "" "** _Default CCR setpoint for dive planning:_ Specify the O~2~ setpoint for " @@ -5445,7 +5596,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2806 +#: ./user-manual.txt:2875 #, no-wrap msgid "" "CCR dive plan. This determines the pO~2~ that will be maintained\n" @@ -5455,7 +5606,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2808 +#: ./user-manual.txt:2877 #, no-wrap msgid "" "** _pSCR O~2~ metabolism rate:_ For a semiclosed rebreather (pSCR) system, " @@ -5463,7 +5614,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2810 +#: ./user-manual.txt:2879 #, no-wrap msgid "" "volume of oxygen used by a diver each minute. Set this value for pSCR dive " @@ -5472,7 +5623,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2812 +#: ./user-manual.txt:2881 #, no-wrap msgid "" "** _pSCR ratio:_ For pSCR equipment the dump ratio is the ratio of gas " @@ -5480,7 +5631,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2814 +#: ./user-manual.txt:2883 #, no-wrap msgid "" "environment to that of the gas recirculated to the diver. Set this value for " @@ -5489,24 +5640,24 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2816 +#: ./user-manual.txt:2885 #, no-wrap msgid "Language" msgstr "" #. type: Plain text -#: ./user-manual.txt:2818 +#: ./user-manual.txt:2887 msgid "Choose a language that _Subsurface_ will use." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2819 +#: ./user-manual.txt:2888 #, no-wrap msgid "images/Pref4_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2829 +#: ./user-manual.txt:2898 msgid "" "A checkbox allows one to use the _System Default_ language which in most " "cases will be the correct setting; with this _Subsurface_ simply runs in the " @@ -5519,26 +5670,26 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2830 +#: ./user-manual.txt:2899 #, no-wrap msgid "Network" msgstr "" #. type: Plain text -#: ./user-manual.txt:2832 +#: ./user-manual.txt:2901 msgid "" "This panel facilitates communication between _Subsurface_ and data sources " "on the Internet." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2833 +#: ./user-manual.txt:2902 #, no-wrap msgid "images/Pref5_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2846 +#: ./user-manual.txt:2915 msgid "" "This is important, for instance, when _Subsurface_ needs to communicate with " "Internet services such as the <<S_Companion,_Subsurface Companion app_>> or " @@ -5555,26 +5706,26 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:2847 +#: ./user-manual.txt:2916 #, no-wrap msgid "Facebook Accesss" msgstr "" #. type: Plain text -#: ./user-manual.txt:2850 +#: ./user-manual.txt:2919 msgid "" "This panel allows one to log into a Facebook account in order to transfer " "information from Subsurface to Facefook." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2851 +#: ./user-manual.txt:2920 #, no-wrap msgid "images/Pref6_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:2859 +#: ./user-manual.txt:2928 msgid "" "If one provides a valid Facebook userID and password, a connection to " "Facebook is created. The connection to Facebook is closed when one closes " @@ -5584,13 +5735,13 @@ msgid "" msgstr "" #. type: Title == -#: ./user-manual.txt:2861 +#: ./user-manual.txt:2930 #, no-wrap msgid "The _Subsurface_ dive planner" msgstr "" #. type: Plain text -#: ./user-manual.txt:2866 +#: ./user-manual.txt:2935 msgid "" "Dive planning is an advanced feature of _Subsurface_, accessible by " "selecting _Log -> Plan Dive_ from the main menu. It allows calculation of " @@ -5599,7 +5750,7 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:2874 +#: ./user-manual.txt:2943 msgid "" "The _Subsurface_ dive planner IS CURRENTLY EXPERIMENTAL and assumes the user " "is already familiar with the _Subsurface_ user interface. It is explicitly " @@ -5607,19 +5758,19 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:2877 +#: ./user-manual.txt:2946 msgid "" "The user is conversant with dive planning and has the necessary training to " "perform dive planning." msgstr "" #. type: delimited block * -#: ./user-manual.txt:2878 +#: ./user-manual.txt:2947 msgid "The user plans dives within his/her certification limits." msgstr "" #. type: delimited block * -#: ./user-manual.txt:2881 +#: ./user-manual.txt:2950 msgid "" "Dive planning makes large assumptions about the characteristics of the " "_average person_ and cannot compensate for individual physiology or health " @@ -5627,42 +5778,42 @@ msgid "" msgstr "" #. type: delimited block * -#: ./user-manual.txt:2882 +#: ./user-manual.txt:2951 msgid "" "The safety of a dive plan depends heavily on the way in which the planner is " "used." msgstr "" #. type: delimited block * -#: ./user-manual.txt:2883 +#: ./user-manual.txt:2952 msgid "The user is familiar with the user interface of _Subsurface_." msgstr "" #. type: delimited block * -#: ./user-manual.txt:2885 +#: ./user-manual.txt:2954 msgid "" "A user who is not absolutely sure about any of the above requirements should " "not use this feature." msgstr "" #. type: Title === -#: ./user-manual.txt:2887 +#: ./user-manual.txt:2956 #, no-wrap msgid "The _Subsurface_ dive planner screen" msgstr "" #. type: Plain text -#: ./user-manual.txt:2892 +#: ./user-manual.txt:2961 msgid "" "Like the _Subsurface_ dive log, the planner screen is divided into several " "sections (see image below). The *setup* parameters for a dive are entered " "into the several sections on the left hand side of the screen. The setup is " "divided into several sections: Available Gases, Rates, Planning, Gas Options " -"and Dive Notes." +"and Notes." msgstr "" #. type: Plain text -#: ./user-manual.txt:2896 +#: ./user-manual.txt:2965 msgid "" "At the top right hand is a green *design panel* upon which the profile of " "the dive can be manipulated directly by dragging and clicking as explained " @@ -5671,7 +5822,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2900 +#: ./user-manual.txt:2969 msgid "" "At the bottom right is a text panel with a heading of _Dive Plan " "Details_. This is where the details of the dive plan are provided in a way " @@ -5680,26 +5831,26 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:2901 +#: ./user-manual.txt:2970 #, no-wrap msgid "images/PlannerWindow1_f20.jpg" msgstr "" #. type: Title === -#: ./user-manual.txt:2904 +#: ./user-manual.txt:2973 #, no-wrap -msgid "Open circuit dives as an example of dive planning" +msgid "Open circuit dives" msgstr "" #. type: Plain text -#: ./user-manual.txt:2907 +#: ./user-manual.txt:2976 msgid "" -"Towards the left bottom of the planner (circled in blue in the image below) " -"is a dropbox with three options. Select the appropriate one of these:" +"Towards the centre bottom of the planner (circled in blue in the image " +"above) is a dropbox with three options. Select the appropriate one of these:" msgstr "" #. type: Plain text -#: ./user-manual.txt:2910 +#: ./user-manual.txt:2979 #, no-wrap msgid "" "** Open Circuit (the default)\n" @@ -5708,45 +5859,199 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2915 +#: ./user-manual.txt:2981 +msgid "Choose the Open Circuit option." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:2985 msgid "" "In the top left-hand area of the planning screen, ensure that the constant " -"dive parameters are appropriate. These are: Start date and time of the dive, " -"Atmospheric Pressure and Altitude above sea level of the dive site. The " -"atmospheric pressure can also be entered as an altitude in metres, assuming " -"an atmospheric pressure of 1.013 bar." +"dive parameters are appropriate. These are: Start date and time of the " +"intended dive, Atmospheric Pressure and Altitude above sea level of the dive " +"site. The atmospheric pressure can also be entered as an altitude in metres, " +"assuming a sea-level atmospheric pressure of 1.013 bar." msgstr "" #. type: Plain text -#: ./user-manual.txt:2924 +#: ./user-manual.txt:2994 msgid "" -"In the table labelled _Available Gases_, add the information of the " -"cylinders to be used as well as the gas composition within that " -"cylinder. This is done in a similar way as for <<S_CylinderData,providing " -"cylinder data for dive logs>>. Choose the cylinder type by double clicking " -"the cylinder type and using the dropdown list, then specify the work " -"pressure of this cylinder. By leaving the oxygen concentration (O2%) filed " -"empty, the cylinder is assumed to contain air. Otherwise enter the oxygen " -"and/or helium concentration in the boxes provided in this dialogue. Add " -"additional cylinders by using the \"+\" icon to the top righthand of the " -"dialogue." +"In the table labeled _Available Gases_, add the information of the cylinders " +"to be used as well as the gas composition within that cylinder. This is done " +"in a similar way as for <<S_CylinderData,providing cylinder data for dive " +"logs>>. Choose the cylinder type by double clicking the cylinder type and " +"using the dropdown list, then specify the work pressure of this cylinder. By " +"leaving the oxygen concentration (O2%) filed empty, the cylinder is assumed " +"to contain air. Otherwise enter the oxygen and/or helium concentration in " +"the boxes provided in this dialogue. Add additional cylinders by using the " +"\"+\" icon to the top righthand of the dialogue." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:2996 +msgid "The profile of the planned dive can be created in two ways:" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3001 +msgid "" +"Drag the waypoints (the small white circles) on the existing dive profile in " +"a way to represent the dive. Additional waypoints can be created by " +"double-clicking the existing dive profile. Waypoints can be deleted by " +"right-clicking a particular waypoint and selecting the _delete_ item from " +"the resulting context menu." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3009 +msgid "" +"The most efficient way to create a dive profile is to enter the appropriate " +"values into the table marked _Dive planner points_. The first line of the " +"table represents the duration and the final depth of the descent from the " +"surface. Subsequent segments describe the bottom phase of the dive. The _CC " +"set point_ column is only relevant for closed circuit divers. The ascent is " +"usually not specified because this is what the planner is supposed to " +"calculate. Add additional segments to the profile by selecting the \"+\" " +"icon at the top right hand of the table. Segments entered into the _Dive " +"planner points_ table automatically appear in the *Dive Profile* diagram." +msgstr "" + +#. type: Title ==== +#: ./user-manual.txt:3010 +#, no-wrap +msgid "Recreational dives" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3025 +msgid "" +"The _Subsurface_ dive planner allows a sophisticated way of planning " +"recreational dives, i.e. dives that remain within no-decompression limits. " +"The dive planner automatically takes into account the nitrogen load incurred " +"in previous dives. But conventional dive tables are also used in a way that " +"can take into account previous dives. Why use a dive planner for " +"recreational dives? Using recreational dive tables, the maximum depth of a " +"dive is taken into acount. However, few dives are undertaken at a constant " +"depth corresponding to the maximum depth (i.e. a \"square\" dive " +"profile). This means that dive tables overestimate the nitrogen load " +"incurred during previous dives. The _Subsurface_ dive planner calculates " +"nitrogen load according to the real dive profiles of all uploaded previous " +"dives, in a similar way as dive computers calculate nitrogen load during a " +"dive. This mean that the diver gets 'credit' in terms of nitrogen loading " +"for not remaining at maximum depth during previous dives, enabling planning " +"a longer subsequent dive. For the planner to work it is therefore crucial to " +"upload all previous dives onto _Subsurface_ before performing dive planning." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3028 +msgid "To plan a dive, the appropriate settings need to be defined." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3031 +msgid "" +"Ensure that the date and time is set to that of the intended dive. This " +"allows calculation of the nitrogen load incurred during previous dives." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3034 +msgid "" +"Immediately under the heading _Planning_ are two checkboxes _Recreational_ " +"and _Safety Stop_. Check these two boxes." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3038 +msgid "" +"Then define the cylinder size, the gas mixture (air or % oxygen) and the " +"starting cylinder pressure in the top left-hand section of the planner under " +"_Available gases_." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3043 +msgid "" +"The planner calculates whether the specified cylinder contains enough " +"air/gas to complete the planned dive. In order for this to be realistic, " +"under _Gas options_, specify an appropriate surface air consumption (SAC) " +"rate for _Bottom SAC_. Suitable values are between 15 l/min and 30 l/min, " +"with novice divers or difficult dives requiring SAC rates closer to 30l/min." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3046 +msgid "" +"Define the amount of gas that the cylinder must have at the end of the " +"bottom section of the dive just before ascent. A value of 50 bar is often " +"used." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3053 +msgid "" +"Define the depth of the dive by dragging the waypoints (white dots) on the " +"dive profile or (even better) defining the appropriate depths using the " +"table under _Dive planner points_ as desribed under the previous heading. If " +"this is a multilevel dive, set the appropriate dive depths to represent the " +"dive plan by adding waypoints to the dive profile or by adding appropriate " +"dive planner points to the _Dive Planner Points_ table." +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3056 +msgid "" +"The ascent speed can be changed. The default ascent speeds are those " +"considered safe for recreational divers." msgstr "" #. type: Plain text -#: ./user-manual.txt:2927 +#: ./user-manual.txt:3064 msgid "" -"The dialogue indicating _Dive Planner Points_ is usually not used at this " -"stage of the dive planning." +"The dive profile in the planner indicates the maximum dive time within " +"no-deco limits using the Bühlmann ZH-L16 algorithm and the gas and depth " +"settings specified as described above. The _Subsurface_ planner allows rapid " +"assessment of dive duration as a function of dive depth, given the nitrogen " +"load incurred during previous dives. The dive plan includes estimates of the " +"amount of air/gas used, depending on the cylinder settings specified under " +"_Available gases_. If the initial cylinder pressure is set to 0, the dive " +"duration shown is the true no-deco limit (NDL) without taking into account " +"gas used during the dive. If the surface above the dive profile is RED it " +"means that recreational dive limits are exceeded and either the dive " +"duration or the dive depth needs to be reduced." msgstr "" #. type: Plain text -#: ./user-manual.txt:2929 +#: ./user-manual.txt:3068 +msgid "" +"Below is an image of a dive plan for a recreational dive at 30 " +"metres. Although the no-deco limit (NDL) is 23 minutes, the duration of the " +"dive is limited by the amount of air in the cylinder, reflected by the " +"information in the text box at the bottom right of the panel." +msgstr "" + +#. type: Target for macro image +#: ./user-manual.txt:3069 #, no-wrap -msgid "*The planning is performed in three stages*\n" +msgid "images/rec_diveplan.jpg" +msgstr "" + +#. type: Title ==== +#: ./user-manual.txt:3071 +#, no-wrap +msgid "Non-recreational open circuit dives, including decompression" msgstr "" #. type: Plain text -#: ./user-manual.txt:2939 +#: ./user-manual.txt:3075 +msgid "" +"Non-recreational dive planning involves exceeding the no-deco limits and/or " +"using multiple breathing gases. Such dives are planned in three stages:" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3085 #, no-wrap msgid "" "*a) Nitrogen management*: This is performed by specifying the rates for " @@ -5768,21 +6073,21 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2941 +#: ./user-manual.txt:3087 msgid "" "link:http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding " "M-values by Erik Baker, _Immersed_ Vol. 3, No. 3.]" msgstr "" #. type: Plain text -#: ./user-manual.txt:2942 +#: ./user-manual.txt:3088 msgid "" "link:http://www.rebreatherworld.com/general-and-new-to-rebreather-articles/5037-gradient-factors-for-dummies.html[Gradient " "factors for dummies, by Kevin Watts]" msgstr "" #. type: Plain text -#: ./user-manual.txt:2944 +#: ./user-manual.txt:3090 msgid "" "link:http://www.amazon.com/Deco-Divers-Decompression-Theory-Physiology/dp/1905492073/ref=sr_1_1?s=books&ie=UTF8&qid=1403932320&sr=1-1&keywords=deco+for+divers[_Deco " "for Divers_, by Mark Powell (2008). Aquapress] Southend-on-Sea, UK. ISBN 10: " @@ -5790,7 +6095,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2952 +#: ./user-manual.txt:3098 msgid "" "The ascent rate is critical for nitrogen off-gassing at the end of the dive " "and is specified for several depth ranges, utilising the average (or mean) " @@ -5804,7 +6109,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2962 +#: ./user-manual.txt:3107 #, no-wrap msgid "" "*b) Oxygen management*: In the *Gas Options* part of the dive specification, " @@ -5824,7 +6129,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2976 +#: ./user-manual.txt:3121 #, no-wrap msgid "" "*c) Gas management*: With open-circuit dives this is a primary " @@ -5855,7 +6160,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:2988 +#: ./user-manual.txt:3133 msgid "" "Now (at last) one can start the detailed time-depth planning of the " "dive. _Subsurface_ offers a unique graphical interface for performing this " @@ -5874,7 +6179,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3000 +#: ./user-manual.txt:3145 msgid "" "Each waypoint on the dive profile creates a _Dive Planner Point_ in the " "table on the left of the dive planner panel. Ensure that the _Used Gas_ " @@ -5883,7 +6188,7 @@ msgid "" "features of the dive have been completed, e.g. the bottom time segment and " "deep stops (if these are implemented). Leave the remaining waypoints on the " "ascent to _Subsurface_. In most cases _Subsurface_ computes additional way " -"points in order to fulfil decompression requirements for that dive. A " +"points in order to fulfill decompression requirements for that dive. A " "waypoint can be moved by selecting that waypoint and by using the arrow " "keys. The waypoints listed in the _Dive Planner Points_ dialogue can be " "edited by hand in order to obtain a precise presentation of the dive " @@ -5892,7 +6197,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3008 +#: ./user-manual.txt:3153 msgid "" "Indicate any changes in gas cylinder used by indicating gas changes as " "explained in the section <<S_CreateProfile,hand-creating a dive " @@ -5905,7 +6210,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3017 +#: ./user-manual.txt:3162 msgid "" "A non-zero value in the \"CC set point\" column of the table of dive planner " "points indicates a valid setpoint for oxygen partial pressure and that the " @@ -5918,20 +6223,20 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3020 +#: ./user-manual.txt:3165 msgid "" "Below is an example of a dive plan to 45m using EAN26, followed by an ascent " "using EAN50 and using the settings as described above." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3021 +#: ./user-manual.txt:3166 #, no-wrap msgid "images/DivePlanner2_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3026 +#: ./user-manual.txt:3171 msgid "" "Once the above has been completed, one can save it by clicking the _Save_ " "button towards the top middle of the planner. The saved dive plan will " @@ -5939,17 +6244,17 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3028 +#: ./user-manual.txt:3173 #, no-wrap msgid "*The dive plan details*\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:3036 +#: ./user-manual.txt:3181 msgid "" "On the bottom right of the dive planner, under _Dive Plan Details_, the " "exact details of the dive plan are provided. These details may be modified " -"by checking any of the options under the _Dive Notes_ section of the dive " +"by checking any of the options under the _Notes_ section of the dive " "planner, immediately to the left of the _Dive Plan Details_. If a _Verbatim " "diveplan_ is requested, a detailed sentence-level explanation of the dive " "plan is given. If any of the management specifications have been exceeded " @@ -5958,7 +6263,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3041 +#: ./user-manual.txt:3186 msgid "" "If the option _Display segment duration_ is checked, then the duration of " "each depth level is indicated in the _Dive Plan Details_. This duration " @@ -5968,20 +6273,62 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3042 +#: ./user-manual.txt:3187 +#, no-wrap +msgid "Planning pSCR dives" +msgstr "" + +#. type: Plain text +#: ./user-manual.txt:3202 +#, no-wrap +msgid "" +"To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ " +"rather than\n" +"_Open circuit_ in the dropdown list.\n" +"The parameters of the pSCR diver can be set by selecting _File -> " +"Preferences -> Graph_\n" +"from the main menu, where the gas consumption calculation takes into account " +"the pSCR dump\n" +"ratio (default 10:1) as well as the metabolism rate. The calculation also " +"takes the oxygen drop\n" +"accross the mouthpiece of the rebreather into account. If the\n" +"pO~2~ drops below what is considered a save value, a warning appears in the " +"_Dive plan\n" +"details_. A typical pSCR configuration is with a single cylinder and one or " +"more bail-out\n" +"cylinders. Therefore the setup of the _Available gases_ and the _Dive " +"planner points_ tables\n" +"are very similar to that of a CCR dive plan, described above. However, no " +"oxygen setpoints\n" +"are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive " +"is comparable\n" +"to that of the CCR dive above, but note the longer ascent duration due to " +"the lower oxygen\n" +"in the loop due to the oxygen drop across the mouthpiece of the pSCR " +"equipment.\n" +msgstr "" + +#. type: Target for macro image +#: ./user-manual.txt:3203 +#, no-wrap +msgid "images/Planner_pSCR1_f20.jpg" +msgstr "" + +#. type: Title === +#: ./user-manual.txt:3206 #, no-wrap msgid "Planning CCR dives" msgstr "" #. type: Plain text -#: ./user-manual.txt:3046 +#: ./user-manual.txt:3210 msgid "" "To plan a dive using a closed circuit rebreather, select the _CCR_ option in " "the dropdown list, circled in blue in the image below." msgstr "" #. type: Plain text -#: ./user-manual.txt:3050 +#: ./user-manual.txt:3214 #, no-wrap msgid "" "*Available gases*: In the _Available gases_ table, enter the cylinder " @@ -5992,7 +6339,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3058 +#: ./user-manual.txt:3222 #, no-wrap msgid "" "*Entering setpoints*: Specify a default setpoint in the Preferences tab, by " @@ -6013,73 +6360,31 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3060 +#: ./user-manual.txt:3224 msgid "The dive profile for a CCR dive may look something like the image below." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3061 +#: ./user-manual.txt:3225 #, no-wrap msgid "images/Planner_CCR1_f20.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3065 +#: ./user-manual.txt:3229 msgid "" "Note that, in the _Dive plan details_, the gas consumption for a CCR segment " "is not calculated, so gas consumptions of 0 litres are the norm." msgstr "" #. type: Title === -#: ./user-manual.txt:3066 -#, no-wrap -msgid "Planning pSCR dives" -msgstr "" - -#. type: Plain text -#: ./user-manual.txt:3081 -#, no-wrap -msgid "" -"To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ " -"rather than\n" -"_Open circuit_ in the dropdown list.\n" -"The parameters of the pSCR diver can be set by selecting _File -> " -"Preferences -> Graph_\n" -"from the main menu, where the gas consumption calculation takes into account " -"the pSCR dump\n" -"ratio (default 10:1) as well as the metabolism rate. The calculation also " -"takes the oxygen drop\n" -"accross the mouthpiece of the rebreather into account. If the\n" -"pO~2~ drops below what is considered a save value, a warning apears in the " -"_Dive plan\n" -"details_. A typical pSCR configuration is with a single cylinder and one or " -"more bail-out\n" -"cylinders. Therefore the setup of the _Available gases_ and the _Dive " -"planner points_ tables\n" -"are very similar to that of a CCR dive plan, described above. However, no " -"oxygen setpoints\n" -"are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive " -"is comparable\n" -"to that of the CCR dive above, but note the longer ascent duration due to " -"the lower oxygen\n" -"in the loop due to the oxygen drop accross the mouthpiece of the pSCR " -"equipment.\n" -msgstr "" - -#. type: Target for macro image -#: ./user-manual.txt:3082 -#, no-wrap -msgid "images/Planner_pSCR1_f20.jpg" -msgstr "" - -#. type: Title === -#: ./user-manual.txt:3086 +#: ./user-manual.txt:3231 #, no-wrap msgid "Modifying an existing dive plan" msgstr "" #. type: Plain text -#: ./user-manual.txt:3093 +#: ./user-manual.txt:3238 msgid "" "Normally, when a dive plan has been saved, it is accessible from the *Dive " "List*, like any other dive log. Within the *Dive List* there is not a way to " @@ -6090,7 +6395,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3099 +#: ./user-manual.txt:3244 msgid "" "In addition there is the option \"Save new\". This keeps the original " "planned dive and adds a (possibly modified) copy to the dive list. If that " @@ -6100,13 +6405,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3100 +#: ./user-manual.txt:3245 #, no-wrap msgid "Planning for repetitive dives" msgstr "" #. type: Plain text -#: ./user-manual.txt:3107 +#: ./user-manual.txt:3252 msgid "" "Repetitive dives can easily be planned if the dates and start times of the " "repetitive dive set is specified appropriately in the top left-hand _Start " @@ -6115,7 +6420,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3113 +#: ./user-manual.txt:3258 msgid "" "If one has just completed a long/deep dive and is planning another dive, " "then highlight, in the *Dive List*, the dive that has just been completed " @@ -6125,7 +6430,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3118 +#: ./user-manual.txt:3263 msgid "" "If only a few standard configurations are used (e.g. in GUE), then a " "template dive can be created conforming to one of the configurations. If one " @@ -6135,13 +6440,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3119 +#: ./user-manual.txt:3264 #, no-wrap msgid "Printing the dive plan" msgstr "" #. type: Plain text -#: ./user-manual.txt:3124 +#: ./user-manual.txt:3269 msgid "" "Selecting the _Print_ button in the planner allows printing of the _Dive " "Plan Details_ for wet notes. Alternatively one can cut and paste the _Dive " @@ -6149,12 +6454,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3134 +#: ./user-manual.txt:3279 msgid "" "Dive plans have many characteristics in common with dive logs (dive profile, " "dive notes, etc). After a dive plan has been saved, the dive details and " -"gas calculations are saved in the *Dive Notes* tab. While a dive plan is " -"being designed, it can be printed using the _Print_ button in the dive " +"gas calculations are saved in the *Notes* tab. While a dive plan is being " +"designed, it can be printed using the _Print_ button in the dive " "planner. This prints the dive details and gas calculations in the _Dive Plan " "Details_ panel of the dive planner. However, after the plan has been saved, " "it is represented in a way very similar to a dive log and the gas " @@ -6165,13 +6470,13 @@ msgid "" msgstr "" #. type: Title == -#: ./user-manual.txt:3135 +#: ./user-manual.txt:3280 #, no-wrap msgid "Description of the Subsurface Main Menu items" msgstr "" #. type: Plain text -#: ./user-manual.txt:3140 +#: ./user-manual.txt:3285 msgid "" "This section describes the functions and operation of the items in the Main " "Menu of Subsurface. Several of the items below are links to sections of this " @@ -6179,259 +6484,259 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3141 +#: ./user-manual.txt:3286 #, no-wrap msgid "File" msgstr "" #. type: Plain text -#: ./user-manual.txt:3144 +#: ./user-manual.txt:3289 msgid "" "<<S_NewLogbook,_New Logbook_>> - Close the currently open dive logbook and " "clear all dive information." msgstr "" #. type: Plain text -#: ./user-manual.txt:3146 +#: ./user-manual.txt:3291 msgid "" "_Open logbook_ - This opens the file manager in order to select a dive " "logbook to open." msgstr "" #. type: Plain text -#: ./user-manual.txt:3147 +#: ./user-manual.txt:3292 msgid "_Save_ - Save the dive logbook that is currently open." msgstr "" #. type: Plain text -#: ./user-manual.txt:3148 +#: ./user-manual.txt:3293 msgid "_Save as_ - Save the current logbook under a different file name." msgstr "" #. type: Plain text -#: ./user-manual.txt:3149 +#: ./user-manual.txt:3294 msgid "_Close_ - Close the dive logbook that is currently open." msgstr "" #. type: Plain text -#: ./user-manual.txt:3151 +#: ./user-manual.txt:3296 msgid "" "<<S_ExportLog,_Export_>> - Export the currently open dive logbook (or the " "selected dives in the logbook) to one of several formats." msgstr "" #. type: Plain text -#: ./user-manual.txt:3152 +#: ./user-manual.txt:3297 msgid "<<S_PrintDivelog,_Print_>> - Print the currently open logbook." msgstr "" #. type: Plain text -#: ./user-manual.txt:3153 +#: ./user-manual.txt:3298 msgid "<<S_Preferences,_Preferences_>> - Set the _Subsurface_ preferences." msgstr "" #. type: Plain text -#: ./user-manual.txt:3154 +#: ./user-manual.txt:3299 msgid "" "<<S_Configure,_Configure dive computer_>> - Edit the configuration of a dive " "computer." msgstr "" #. type: Plain text -#: ./user-manual.txt:3155 +#: ./user-manual.txt:3300 msgid "_Quit_ - Quit _Subsurface_." msgstr "" #. type: Title === -#: ./user-manual.txt:3156 +#: ./user-manual.txt:3301 #, no-wrap msgid "Import" msgstr "" #. type: Plain text -#: ./user-manual.txt:3159 +#: ./user-manual.txt:3304 msgid "" "<<S_ImportDiveComputer,_Import from dive computer_>> - Import dive " "information from a dive computer." msgstr "" #. type: Plain text -#: ./user-manual.txt:3161 +#: ./user-manual.txt:3306 msgid "" "<<Unified_import,_Import Log Files_>> - Import dive information from a file " "in in a _Subsurface_-compatible format." msgstr "" #. type: Plain text -#: ./user-manual.txt:3163 +#: ./user-manual.txt:3308 msgid "" "<<S_Companion,_Import GPS data from Subsurface web service_>> - Load GPS " "coordinates from the _Subsurface_ mobile phone app." msgstr "" #. type: Plain text -#: ./user-manual.txt:3165 +#: ./user-manual.txt:3310 msgid "" "<<S_ImportingDivelogsDe,_Import from Divelogs.de_>> - Import dive " "information from _www.Divelogs.de_." msgstr "" #. type: Title === -#: ./user-manual.txt:3166 +#: ./user-manual.txt:3311 #, no-wrap msgid "Log" msgstr "" #. type: Plain text -#: ./user-manual.txt:3168 +#: ./user-manual.txt:3313 msgid "" "<<S_EnterData,_Add Dive_>> - Manually add a new dive to the *Dive List* " "panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:3169 +#: ./user-manual.txt:3314 msgid "<<S_DivePlanner,_Plan Dive_>> - This feature allows the planning of dives." msgstr "" #. type: Plain text -#: ./user-manual.txt:3170 +#: ./user-manual.txt:3315 msgid "" "<<S_Replan,_Re-plan dive_>> - Edit a dive plan that has been saved into the " "*Dive List*." msgstr "" #. type: Plain text -#: ./user-manual.txt:3172 +#: ./user-manual.txt:3317 msgid "" "<<S_CopyComponents,_Copy dive components_>> - By selecting this option, one " "can copy information from several fields of a dive log onto the clipboard." msgstr "" #. type: Plain text -#: ./user-manual.txt:3174 +#: ./user-manual.txt:3319 msgid "" "_Paste dive components_ - Paste, into the selected dives in the *Dive List*, " "the information copied using the _Copy dive components_ option." msgstr "" #. type: Plain text -#: ./user-manual.txt:3176 +#: ./user-manual.txt:3321 msgid "" "<<S_Renumber,_Renumber_>> - Renumber the dives listed in the *Dive List* " "panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:3178 +#: ./user-manual.txt:3323 msgid "" "<<S_Group,_Auto Group_>> - Group the dives in the *Dive List* panel into " "dive trips." msgstr "" #. type: Plain text -#: ./user-manual.txt:3179 +#: ./user-manual.txt:3324 msgid "" "<<S_DeviceNames,_Edit Device Names_>> - Edit the names of dive computers to " "facilitate your logs." msgstr "" #. type: Plain text -#: ./user-manual.txt:3180 +#: ./user-manual.txt:3325 msgid "" "<<S_Filter,_Filter divelist_>> - Select only some dives, based on specific " "tags or dive criteria." msgstr "" #. type: Title === -#: ./user-manual.txt:3181 +#: ./user-manual.txt:3326 #, no-wrap msgid "View" msgstr "" #. type: Plain text -#: ./user-manual.txt:3184 +#: ./user-manual.txt:3329 msgid "" "<<S_ViewPanels,_All_>> - View the four main _Subsurface_ panels " "simmultaneously." msgstr "" #. type: Plain text -#: ./user-manual.txt:3185 +#: ./user-manual.txt:3330 msgid "<<S_ViewPanels,_Dive List_>> - View only the *Dive List* panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:3186 +#: ./user-manual.txt:3331 msgid "<<S_ViewPanels,_Profile_>> - View only the *Dive Profile* panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:3187 -msgid "<<S_ViewPanels,_Info_>> - View only the *Dive Notes* panel." +#: ./user-manual.txt:3332 +msgid "<<S_ViewPanels,_Info_>> - View only the *Notes* panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:3188 +#: ./user-manual.txt:3333 msgid "<<S_ViewPanels,_Globe_>> - View only the *World Map* panel." msgstr "" #. type: Plain text -#: ./user-manual.txt:3190 +#: ./user-manual.txt:3335 msgid "" "_Yearly Statistics_ - Display summary statistics about dives during this and " "past years." msgstr "" #. type: Plain text -#: ./user-manual.txt:3191 +#: ./user-manual.txt:3336 msgid "_Prev DC_ - Switch to previous dive computer." msgstr "" #. type: Plain text -#: ./user-manual.txt:3192 +#: ./user-manual.txt:3337 msgid "_Next DC_ - Switch to next dive computer." msgstr "" #. type: Plain text -#: ./user-manual.txt:3193 +#: ./user-manual.txt:3338 msgid "_Full Screen_ - Toggles Full Screen mode." msgstr "" #. type: Title === -#: ./user-manual.txt:3194 +#: ./user-manual.txt:3339 #, no-wrap msgid "Help" msgstr "" #. type: Plain text -#: ./user-manual.txt:3197 +#: ./user-manual.txt:3342 msgid "" "_About Subsurface_ - Show a panel with the version number of _Subsurface_ as " "well as licensing information." msgstr "" #. type: Plain text -#: ./user-manual.txt:3199 +#: ./user-manual.txt:3344 msgid "" "_Check for updates_ - Find out whether a newer version of Subsurface is " "available on the http://subsurface-divelog.org/[_Subsurface_ web site]." msgstr "" #. type: Plain text -#: ./user-manual.txt:3200 +#: ./user-manual.txt:3345 msgid "" "<<S_UserSurvey,_User survey_>> - Help to make _Subsurface_ even better by " "taking part in our user survey." msgstr "" #. type: Plain text -#: ./user-manual.txt:3201 +#: ./user-manual.txt:3346 msgid "_User manual_ - Open a window showing this user manual." msgstr "" #. type: Title == -#: ./user-manual.txt:3204 +#: ./user-manual.txt:3349 #, no-wrap msgid "" "APPENDIX A: Operating system specific information for importing dive " @@ -6439,19 +6744,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3206 +#: ./user-manual.txt:3351 #, no-wrap msgid "Make sure that the OS has the required drivers installed" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3207 +#: ./user-manual.txt:3352 #, no-wrap msgid "images/icons/drivers.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3212 +#: ./user-manual.txt:3357 msgid "" "The operating system of the desktop computer needs the appropriate drivers " "in order to communicate with the dive computer in whichever way the dive " @@ -6459,7 +6764,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3218 +#: ./user-manual.txt:3363 msgid "" "On Linux users need to have the correct kernel module loaded. Most " "distributions will do this automatically, so the user does not need to load " @@ -6468,7 +6773,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3222 +#: ./user-manual.txt:3367 msgid "" "On Windows, the OS should offer to download the correct driver once the user " "connects the dive computer to the USB port and operating system sees the " @@ -6476,7 +6781,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3229 +#: ./user-manual.txt:3374 msgid "" "On a Mac users sometimes have to manually hunt for the correct driver. For " "example the correct driver for the Mares Puck devices or any other dive " @@ -6487,19 +6792,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3231 +#: ./user-manual.txt:3376 #, no-wrap msgid "How to Find the Device Name for USB devices and set its write permission" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3232 +#: ./user-manual.txt:3377 #, no-wrap msgid "images/icons/usb.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3240 +#: ./user-manual.txt:3385 msgid "" "When a user connects the dive computer by using a USB connector, usually " "_Subsurface_ will either propose a drop down list that contains the correct " @@ -6510,67 +6815,67 @@ msgid "" msgstr "" #. type: Block title -#: ./user-manual.txt:3241 ./user-manual.txt:3324 +#: ./user-manual.txt:3386 ./user-manual.txt:3469 #, no-wrap msgid "On Windows:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3245 +#: ./user-manual.txt:3390 msgid "" "Simply try COM1, COM2, etc. The drop down list should contain all connected " "COM devices." msgstr "" #. type: Block title -#: ./user-manual.txt:3246 ./user-manual.txt:3339 +#: ./user-manual.txt:3391 ./user-manual.txt:3484 #, no-wrap msgid "On MacOS:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3249 +#: ./user-manual.txt:3394 msgid "The drop down box should find all connected dive computers." msgstr "" #. type: Block title -#: ./user-manual.txt:3250 +#: ./user-manual.txt:3395 #, no-wrap msgid "On Linux:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3253 +#: ./user-manual.txt:3398 msgid "There is a definitive way to find the port:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3255 +#: ./user-manual.txt:3400 msgid "Disconnect the USB cable from the dive computer" msgstr "" #. type: Plain text -#: ./user-manual.txt:3256 +#: ./user-manual.txt:3401 msgid "Open a terminal" msgstr "" #. type: Plain text -#: ./user-manual.txt:3257 ./user-manual.txt:3259 +#: ./user-manual.txt:3402 ./user-manual.txt:3404 msgid "Type the command: 'dmesg' and press enter" msgstr "" #. type: Plain text -#: ./user-manual.txt:3258 +#: ./user-manual.txt:3403 msgid "Plug in the USB cable of the dive computer" msgstr "" #. type: Plain text -#: ./user-manual.txt:3261 +#: ./user-manual.txt:3406 msgid "A message similar to this one should appear:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3277 +#: ./user-manual.txt:3422 #, no-wrap msgid "" "\tusb 2-1.1: new full speed USB device number 14 using ehci_hcd\n" @@ -6591,7 +6896,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3282 +#: ./user-manual.txt:3427 msgid "" "The third line from the bottom shows that the FTDI USB adapter is detected " "and connected to +ttyUSB3+. This information can now be used in the import " @@ -6599,12 +6904,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3284 +#: ./user-manual.txt:3429 msgid "Ensuring that the user has write permission to the USB serial port:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3290 +#: ./user-manual.txt:3435 msgid "" "On Unix-like operating systems the USB ports can only be accessed by users " "who are members of the +dialout+ group. If one is not root, one may not be a " @@ -6613,14 +6918,14 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3294 +#: ./user-manual.txt:3439 msgid "" "As root, type: +usermod -a -G dialout johnB+ (Ubuntu users: +sudo usermod -a " "-G dialout johnB+) This makes johnB a member of the +dialout+ group." msgstr "" #. type: Plain text -#: ./user-manual.txt:3299 +#: ./user-manual.txt:3444 #, no-wrap msgid "" "Type: +id johnB+ This lists all the groups that johnB belongs to and\n" @@ -6632,7 +6937,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3301 +#: ./user-manual.txt:3446 #, no-wrap msgid "" "Under some circumstances this change takes only effect (eg. on Ubuntu) " @@ -6641,7 +6946,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3306 +#: ./user-manual.txt:3451 msgid "" "With the appropriate device name (e.g. +dev/ttyUSB3+) and with write " "permission to the USB port, the dive computer interface can connect and one " @@ -6649,19 +6954,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3308 +#: ./user-manual.txt:3453 #, no-wrap msgid "Setting up bluetooth enabled devices" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3309 +#: ./user-manual.txt:3454 #, no-wrap msgid "images/icons/bluetooth.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3315 +#: ./user-manual.txt:3460 msgid "" "For dive computers communicating through bluetooth like the Heinrichs " "Weikamp Frog or the Shearwater Predator and Petrel there is a different " @@ -6670,7 +6975,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3317 +#: ./user-manual.txt:3462 #, no-wrap msgid "" "*For the dive computer, after enabling Bluetooth, ensure it is in Upload " @@ -6678,7 +6983,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3321 +#: ./user-manual.txt:3466 msgid "" "For Bluetooth pairing of the dive computer, refer to the manufacturer's user " "guide. When using a Shearwater Predator/Petrel, select _Dive Log -> Upload " @@ -6686,13 +6991,13 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3323 +#: ./user-manual.txt:3468 #, no-wrap msgid "*Pair the _Subsurface_ computer with the dive computer.*\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:3332 +#: ./user-manual.txt:3477 msgid "" "Bluetooth is most likely already enabled. For pairing with the dive computer " "choose _Control Panel -> Bluetooth Devices -> Add Wireless Device_. This " @@ -6703,21 +7008,21 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3335 +#: ./user-manual.txt:3480 msgid "" "For downloading to _Subsurface_, the _Subsurface_ drop-down list should " "contain this COM port already. If not, enter it manually." msgstr "" #. type: Plain text -#: ./user-manual.txt:3338 +#: ./user-manual.txt:3483 msgid "" "Note: If there are issues afterwards when downloading from the dive computer " "using other software, remove the existing pairing with the dive computer." msgstr "" #. type: Plain text -#: ./user-manual.txt:3345 +#: ./user-manual.txt:3490 msgid "" "Click on the Bluetooth symbol in the menu bar and select _Set up Bluetooth " "Device..._. The dive computer should then show up in the list of " @@ -6726,20 +7031,20 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3348 +#: ./user-manual.txt:3493 msgid "" "Once the pairing is completed the correct device is shown in the 'Device or " "Mount Point' drop-down in the _Subsurface_ *Import* dialog." msgstr "" #. type: Block title -#: ./user-manual.txt:3349 +#: ./user-manual.txt:3494 #, no-wrap msgid "On Linux" msgstr "" #. type: Plain text -#: ./user-manual.txt:3357 +#: ./user-manual.txt:3502 msgid "" "Ensure Bluetooth is enabled on the _Subsurface_ computer. On most common " "distributions this should be true out of the box and pairing should be " @@ -6751,7 +7056,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3364 +#: ./user-manual.txt:3509 msgid "" "In the rare cases where the above is not true, then depending on your " "system, try +initd+ or +systemd+. This might be different and also involve " @@ -6762,12 +7067,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3366 +#: ./user-manual.txt:3511 msgid "One may also use a manual approach by using such commands:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3371 +#: ./user-manual.txt:3516 msgid "" "+hciconfig+ shows the Bluetooth devices available on your computer (not dive " "computer), most likely one will see a hci0, if not try +hcitool -a+ to see " @@ -6775,14 +7080,14 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3375 +#: ./user-manual.txt:3520 msgid "" "+hcitool scanning+ gets a list of bluetooth enabled client devices, look for " "the dive computer and remember the MAC address are shown there" msgstr "" #. type: Plain text -#: ./user-manual.txt:3379 +#: ./user-manual.txt:3524 msgid "" "+bluez-simple-agent hci0 10:00:E8:C4:BE:C4+ pairs the dive computer with the " "bluetooth stack of the _Subsurface_ computer, copy/paste the MAC address " @@ -6790,14 +7095,14 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3382 +#: ./user-manual.txt:3527 msgid "" "Unfortunately on Linux binding to a communication device has to be done " "manually by running:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3388 +#: ./user-manual.txt:3533 msgid "" "+rfcomm bind /dev/rfcomm0 10:00:E8:C4:BE:C4+ binds the dive computer to a " "communication device in the desktop computer, in case rfcomm is already " @@ -6806,32 +7111,32 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3391 +#: ./user-manual.txt:3536 msgid "" "For downloading dives in _Subsurface_ specify the device name connected to " "the MAC address in the last step above, e.g. _/dev/rfcomm0_." msgstr "" #. type: Title == -#: ./user-manual.txt:3394 +#: ./user-manual.txt:3539 #, no-wrap msgid "APPENDIX B: Dive Computer specific information for importing dive data." msgstr "" #. type: Title === -#: ./user-manual.txt:3397 +#: ./user-manual.txt:3542 #, no-wrap msgid "Importing from Uemis Zurich" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3399 +#: ./user-manual.txt:3544 #, no-wrap msgid "images/icons/iumis.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3415 +#: ./user-manual.txt:3560 msgid "" "_Subsurface_ downloads the information stored on the SDA (the built-in file " "system of the Uemis) including information about dive spots and " @@ -6848,7 +7153,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3430 +#: ./user-manual.txt:3575 msgid "" "After selecting the above device name, download the dives from the Uemis " "Zurich. One technical issue with the Uemis Zurich download implementation " @@ -6865,19 +7170,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3432 +#: ./user-manual.txt:3577 #, no-wrap msgid "Importing from Uwatec Galileo" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3434 +#: ./user-manual.txt:3579 #, no-wrap msgid "images/icons/Galileo.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3449 +#: ./user-manual.txt:3594 msgid "" "The Uwatec Galileo dive computers use infra red (IrDA) communication between " "the dive computer and Subsurface. The Uwatec hardware uses a USB dongle " @@ -6893,14 +7198,14 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3452 +#: ./user-manual.txt:3597 msgid "" "After executing this command, Subsurface will recognise the Galileo dive " "computer and download dive information." msgstr "" #. type: Plain text -#: ./user-manual.txt:3456 +#: ./user-manual.txt:3601 msgid "" "Under Windows, a similar situation exists. Drivers for the MCS7780 are " "available from some Internet web sites e.g. " @@ -6908,26 +7213,26 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3459 +#: ./user-manual.txt:3604 msgid "" "For the Apple Mac, IrDA communication via the MCS7780 link is not available " "for OSX 10.6 or higher." msgstr "" #. type: Title === -#: ./user-manual.txt:3461 +#: ./user-manual.txt:3606 #, no-wrap msgid "Importing from Heinrichs Weikamp DR5" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3463 +#: ./user-manual.txt:3608 #, no-wrap msgid "images/icons/HW_DR5.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3473 +#: ./user-manual.txt:3618 msgid "" "When mounted as a USB drive the Heinrichs Weikamp DR5 saves a single UDDF " "file for every dive. Mark all the dives you'd like to import or open. " @@ -6940,19 +7245,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3476 +#: ./user-manual.txt:3621 #, no-wrap msgid "Importing from xDEEP BLACK" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3478 +#: ./user-manual.txt:3623 #, no-wrap msgid "images/icons/HW_xdeepblack.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3487 +#: ./user-manual.txt:3632 msgid "" "Each dive has to be individually saved as UDDF file using \"Export UDDF\" " "option in BLACK's logbook menu. When mounted as a USB drive UDDF files are " @@ -6966,19 +7271,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3489 +#: ./user-manual.txt:3634 #, no-wrap msgid "Importing from Shearwater Predator using Bluetooth" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3491 +#: ./user-manual.txt:3636 #, no-wrap msgid "images/icons/predator.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3499 +#: ./user-manual.txt:3644 msgid "" "Using a Shearwater Predator one may be able to pair Bluetooth but then " "encounter issues when downloading, showing errors like _Slip RX: unexp. SLIP " @@ -6989,36 +7294,36 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3502 +#: ./user-manual.txt:3647 msgid "" "use the Bluetooth dongle which came with the Shearwater Predator instead of " "the built-in one of the _Subsurface_ computer" msgstr "" #. type: Plain text -#: ./user-manual.txt:3503 +#: ./user-manual.txt:3648 msgid "switch to different Bluetooth drivers for the same hardware" msgstr "" #. type: Plain text -#: ./user-manual.txt:3504 +#: ./user-manual.txt:3649 msgid "switch off WiFi while using Bluetooth" msgstr "" #. type: Title === -#: ./user-manual.txt:3506 +#: ./user-manual.txt:3651 #, no-wrap msgid "Importing from Poseidon MkVI Discovery" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3508 +#: ./user-manual.txt:3653 #, no-wrap msgid "images/MkVI.jpeg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3516 +#: ./user-manual.txt:3661 msgid "" "Download of dive logs from the MkVI is performed using a custom " "communications adapter and the _Poseidon PC Configuration Software_, " @@ -7030,45 +7335,45 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3519 +#: ./user-manual.txt:3664 msgid "" "Setup configuration for the dive and key dive parameters (file with a .txt " "extension)" msgstr "" #. type: Plain text -#: ./user-manual.txt:3520 +#: ./user-manual.txt:3665 msgid "Dive log details (file with a .csv extension)" msgstr "" #. type: Plain text -#: ./user-manual.txt:3522 +#: ./user-manual.txt:3667 msgid "" "Redbook format dive log (file with .cvsr extension). This is a compressed " "version of the dive log using a proprietary format." msgstr "" #. type: Plain text -#: ./user-manual.txt:3524 +#: ./user-manual.txt:3669 msgid "" "_Subsurface_ accesses the .txt and the .csv files to obtain dive log " "information." msgstr "" #. type: Title === -#: ./user-manual.txt:3526 +#: ./user-manual.txt:3671 #, no-wrap msgid "Importing from APD Inspiration CCR" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3528 +#: ./user-manual.txt:3673 #, no-wrap msgid "images/APDComputer.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3536 +#: ./user-manual.txt:3681 msgid "" "The dive logs of an APD Inspiration or similar CCR dive computer are " "downloaded using a communications adapter and _AP Communicator_, obtained " @@ -7080,82 +7385,82 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3538 +#: ./user-manual.txt:3683 msgid "Open a dive within the _AP Log Viewer_." msgstr "" #. type: Plain text -#: ./user-manual.txt:3539 +#: ./user-manual.txt:3684 msgid "Select the tab at the top of the screen, entitled \"_Data_\"." msgstr "" #. type: Plain text -#: ./user-manual.txt:3540 +#: ./user-manual.txt:3685 msgid "" "If the raw dive log data show on the screen, click on \"_Copy to " "Clipboard_\"." msgstr "" #. type: Plain text -#: ./user-manual.txt:3541 +#: ./user-manual.txt:3686 msgid "Open a text editor, e.g. Notepad (Windows), TextWrangler (Mac)." msgstr "" #. type: Plain text -#: ./user-manual.txt:3543 +#: ./user-manual.txt:3688 msgid "" "Copy the contents of the clipboard into the text editor and save the text " "file with a filename extension of .CSV" msgstr "" #. type: Plain text -#: ./user-manual.txt:3544 +#: ./user-manual.txt:3689 msgid "" "Within _Subsurface_, select _Import -> Import log files_ to open the " "xref:Unified_import[universal import dialogue]." msgstr "" #. type: Plain text -#: ./user-manual.txt:3545 +#: ./user-manual.txt:3690 msgid "" "In the dropdown list towards the bottom right of the dialogue, select \"_CSV " "files_\"." msgstr "" #. type: Plain text -#: ./user-manual.txt:3547 +#: ./user-manual.txt:3692 msgid "" "On the list of file names select the .CSV file that has been created " "above. An import dialogue opens." msgstr "" #. type: Plain text -#: ./user-manual.txt:3549 +#: ./user-manual.txt:3694 msgid "" -"In the dropdown list on the middle right labeled '_Pre-configured " -"imports_\", select _APD Log Viewer_." +"In the dropdown list on the top left labeled '_Pre-configured imports_\", " +"select _APD Log Viewer_." msgstr "" #. type: Plain text -#: ./user-manual.txt:3550 +#: ./user-manual.txt:3695 msgid "" "Ensure the other settings for the ADP dive log are appropriate, then select " "_OK_." msgstr "" #. type: Plain text -#: ./user-manual.txt:3552 +#: ./user-manual.txt:3697 msgid "The APD dive log will appear within _Subsurface_." msgstr "" #. type: Title == -#: ./user-manual.txt:3554 +#: ./user-manual.txt:3699 #, no-wrap msgid "APPENDIX C: Exporting Dive log information from external dive log software." msgstr "" #. type: Plain text -#: ./user-manual.txt:3563 +#: ./user-manual.txt:3708 msgid "" "The import of dive log data from external dive log software is mostly " "performed using the dialogue found by selecting _Import_ from the Main Menu, " @@ -7165,22 +7470,22 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3565 +#: ./user-manual.txt:3710 msgid "Export the foreign dive log data to format that is accessible from" msgstr "" #. type: Plain text -#: ./user-manual.txt:3566 +#: ./user-manual.txt:3711 msgid "_Subsurface_." msgstr "" #. type: Plain text -#: ./user-manual.txt:3567 +#: ./user-manual.txt:3712 msgid "Import the accessible dive log data into _Subsurface_." msgstr "" #. type: Plain text -#: ./user-manual.txt:3571 +#: ./user-manual.txt:3716 msgid "" "This appendix provides some information about approaches to export dive log " "data from foreign dive log software. The procedures below mostly apply to " @@ -7188,19 +7493,19 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3573 +#: ./user-manual.txt:3718 #, no-wrap msgid "Exporting from *Suunto Divemanager (DM3, DM4 or DM5)*" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3574 +#: ./user-manual.txt:3719 #, no-wrap msgid "images/icons/suuntologo.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3581 +#: ./user-manual.txt:3726 msgid "" "DiveManager is a MS Windows application for Suunto dive computers. " "Divemanager 3 (DM3) is an older version of the Suunto software. More recent " @@ -7210,67 +7515,64 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3583 +#: ./user-manual.txt:3728 #, no-wrap msgid "*Divemanager 3 (DM3):*\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:3585 +#: ./user-manual.txt:3730 msgid "Start 'Suunto Divemanager 3' and log in with the name containing the logs" msgstr "" #. type: Plain text -#: ./user-manual.txt:3586 +#: ./user-manual.txt:3731 msgid "Do not start the import wizard to import dives from the dive computer." msgstr "" #. type: Plain text -#: ./user-manual.txt:3588 +#: ./user-manual.txt:3733 msgid "" "In the navigation tree on the left side of the program-window, select the " "appropriate dives." msgstr "" #. type: Plain text -#: ./user-manual.txt:3589 +#: ./user-manual.txt:3734 msgid "Within the list of dives, select the dives you would like to import later:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3590 +#: ./user-manual.txt:3735 msgid "To select certain dives: hold 'ctrl' and click the dive" msgstr "" #. type: Plain text -#: ./user-manual.txt:3591 -msgid "To select all dives: Select the first dive, hold down shift and" -msgstr "" - -#. type: Plain text -#: ./user-manual.txt:3592 -msgid "select the last dive" +#: ./user-manual.txt:3737 +msgid "" +"To select all dives: Select the first dive, hold down shift and select the " +"last dive" msgstr "" #. type: Plain text -#: ./user-manual.txt:3593 +#: ./user-manual.txt:3738 msgid "With the dives marked, use the program menu _File -> Export_" msgstr "" #. type: Plain text -#: ./user-manual.txt:3594 +#: ./user-manual.txt:3739 msgid "" "The export pop-up will show. Within this pop-up, there is one field called " "'Export Path'." msgstr "" #. type: Plain text -#: ./user-manual.txt:3595 +#: ./user-manual.txt:3740 msgid "Click the browse button next to the field Export Path" msgstr "" #. type: Plain text -#: ./user-manual.txt:3597 +#: ./user-manual.txt:3742 #, no-wrap msgid "" "** A file-manager like window pops up\n" @@ -7278,13 +7580,13 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3598 +#: ./user-manual.txt:3743 #, no-wrap msgid "Divelog.SDE file\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:3600 +#: ./user-manual.txt:3745 #, no-wrap msgid "" "** Optionally change the name of the file for saving\n" @@ -7292,25 +7594,25 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3601 +#: ./user-manual.txt:3746 #, no-wrap msgid "Back in the Export pop-up, press the button 'Export'\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:3602 +#: ./user-manual.txt:3747 #, no-wrap msgid "The dives are now exported to the file Divelog.SDE.\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:3604 +#: ./user-manual.txt:3749 #, no-wrap msgid "*Divemanager 4 (DM4) and Divemanager 5 (DM5):*\n" msgstr "" #. type: Plain text -#: ./user-manual.txt:3609 +#: ./user-manual.txt:3754 msgid "" "DM4 and DM5 use identical mechanisms for exporting dive logs. To export a " "divelog from Divemanager one needs to locate the DM4/DM5 database where the " @@ -7319,97 +7621,103 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3611 +#: ./user-manual.txt:3756 msgid "Locating the Suunto DM4 (or DM5) database:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3613 ./user-manual.txt:3622 +#: ./user-manual.txt:3758 ./user-manual.txt:3767 msgid "Start Suunto DM4/DM5" msgstr "" #. type: Plain text -#: ./user-manual.txt:3614 +#: ./user-manual.txt:3759 msgid "Select 'Help -> About'" msgstr "" #. type: Plain text -#: ./user-manual.txt:3615 +#: ./user-manual.txt:3760 msgid "Click 'Copy' after text 'Copy log folder path to clipboard'" msgstr "" #. type: Plain text -#: ./user-manual.txt:3616 +#: ./user-manual.txt:3761 msgid "Now open Windows Explorer" msgstr "" #. type: Plain text -#: ./user-manual.txt:3617 +#: ./user-manual.txt:3762 msgid "Paste the address to the path box at the top of the File Explorer" msgstr "" #. type: Plain text -#: ./user-manual.txt:3618 +#: ./user-manual.txt:3763 msgid "The database is called DM4.db or DM5.db" msgstr "" #. type: Plain text -#: ./user-manual.txt:3620 +#: ./user-manual.txt:3765 msgid "Making a backup copy of the Suunto DM4/DM5 database:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3623 +#: ./user-manual.txt:3768 msgid "Select 'File - Create backup'" msgstr "" #. type: Plain text -#: ./user-manual.txt:3625 +#: ./user-manual.txt:3770 msgid "" "From the file menu select the location and name for the backup, we'll use " "DM4 (or DM5) in here with the default extension .bak" msgstr "" #. type: Plain text -#: ./user-manual.txt:3626 +#: ./user-manual.txt:3771 msgid "Click 'Save'" msgstr "" #. type: Plain text -#: ./user-manual.txt:3627 +#: ./user-manual.txt:3772 msgid "The dives are now exported to the file DM4.bak (or DM5.bak)" msgstr "" #. type: Title === -#: ./user-manual.txt:3629 +#: ./user-manual.txt:3774 #, no-wrap msgid "Exporting from Atomic Logbook" msgstr "" +#. type: Named 'icon' AttributeList argument for style 'icon' +#: ./user-manual.txt:3777 +#, no-wrap +msgid "images/icons/atomiclogo.jpg" +msgstr "" + #. type: Plain text -#: ./user-manual.txt:3638 +#: ./user-manual.txt:3784 msgid "" "Atomic Logbook is a Windows software by Atomic Aquatics. It allows " "downloading of dive information from Cobalt and Cobalt 2 dive computers. " -"The divelog is kept in a SQlite database at " +"The divelog is kept in a SQLite database at " "C:\\ProgramData\\AtomicsAquatics\\Cobalt-Logbook\\Cobalt.db. This file can " "be directly imported to Subsurface." msgstr "" #. type: Title === -#: ./user-manual.txt:3640 +#: ./user-manual.txt:3786 #, no-wrap msgid "Exporting from Mares Dive Organiser V2.1" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3643 +#: ./user-manual.txt:3789 #, no-wrap msgid "images/icons/mareslogo.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3651 +#: ./user-manual.txt:3797 msgid "" "Mares Dive Organiser is a Windows application. The dive log is kept as a " "Microsoft SQL Compact Edition database with a '.sdf' filename extension. The " @@ -7420,7 +7728,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3656 +#: ./user-manual.txt:3802 msgid "" "Within Dive Organiser, select _Database -> Backup_ from the main menu and " "back up the database to the desk top. This creates a zipped file " @@ -7428,36 +7736,36 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3659 +#: ./user-manual.txt:3805 msgid "" "Rename the file to DiveOrganiserxxxxx.zip. Inside the zipped directory is a " "file _DiveOrganiser.sdf_." msgstr "" #. type: Plain text -#: ./user-manual.txt:3660 +#: ./user-manual.txt:3806 msgid "Extract the _.sdf_ file from the zipped folder to your Desktop." msgstr "" #. type: Plain text -#: ./user-manual.txt:3661 +#: ./user-manual.txt:3807 msgid "The password for accessing the .zip file is _mares_." msgstr "" #. type: Title === -#: ./user-manual.txt:3663 +#: ./user-manual.txt:3809 #, no-wrap msgid "Exporting from *DivingLog 5.0*" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: ./user-manual.txt:3665 +#: ./user-manual.txt:3811 #, no-wrap msgid "images/icons/divingloglogo.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3674 +#: ./user-manual.txt:3820 msgid "" "Unfortunately DivingLog XML files give us no indication on the preferences " "set on one's system. So in order for _Subsurface_ to be able to successfully " @@ -7468,28 +7776,28 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3676 +#: ./user-manual.txt:3822 msgid "In DivingLog open the 'File -> Export -> XML' menu" msgstr "" #. type: Plain text -#: ./user-manual.txt:3677 +#: ./user-manual.txt:3823 msgid "Select the dives to export" msgstr "" #. type: Plain text -#: ./user-manual.txt:3678 +#: ./user-manual.txt:3824 msgid "Click on the export button and select the filename" msgstr "" #. type: Title == -#: ./user-manual.txt:3680 +#: ./user-manual.txt:3826 #, no-wrap msgid "APPENDIX D: Exporting a spreadsheet to CSV format" msgstr "" #. type: Plain text -#: ./user-manual.txt:3689 +#: ./user-manual.txt:3835 msgid "" "Many divers keep a diving log in some form of a digital file, commonly a " "spreadsheet with various fields of information. These logs can be easily " @@ -7502,7 +7810,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3695 +#: ./user-manual.txt:3841 msgid "" "The first step is to organize the diving data in the spreadsheet, so that " "the first row contains the names (or titles) of each column and the " @@ -7513,40 +7821,40 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3697 +#: ./user-manual.txt:3843 msgid "Date: use one of the following formats: yyyy-mm-dd, dd.mm.yyyy, mm/dd/yyyy" msgstr "" #. type: Plain text -#: ./user-manual.txt:3698 +#: ./user-manual.txt:3844 msgid "Duration: the format should be minutes:seconds." msgstr "" #. type: Plain text -#: ./user-manual.txt:3699 +#: ./user-manual.txt:3845 msgid "" -"Unit system: only one unit system shold be used (i.e., no mixture between " +"Unit system: only one unit system should be used (i.e., no mixture between " "imperial and metric units)" msgstr "" #. type: Plain text -#: ./user-manual.txt:3700 +#: ./user-manual.txt:3846 msgid "Tags and buddies: values should be separated using a comma." msgstr "" #. type: Plain text -#: ./user-manual.txt:3701 +#: ./user-manual.txt:3847 msgid "GPS position: users must use decimal degrees, e.g. 30.22496 30.821798" msgstr "" #. type: Title === -#: ./user-manual.txt:3702 +#: ./user-manual.txt:3848 #, no-wrap msgid "_LibreOffice Calc_ and _OpenOffice Calc_" msgstr "" #. type: Plain text -#: ./user-manual.txt:3706 +#: ./user-manual.txt:3852 msgid "" "These are open source spreadsheet applications forming parts of larger open " "source office suite applications. The user interaction with _LibreOffice_ " @@ -7557,13 +7865,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3707 +#: ./user-manual.txt:3853 #, no-wrap msgid "images/LOffice_spreadsheetdata.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3710 +#: ./user-manual.txt:3856 msgid "" "To export the data as a .CSV file from within LibreOffice click _File -> " "Save As_. On the dialogue that comes up, select the _Text CSV (.csv)_ as the " @@ -7571,13 +7879,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3711 +#: ./user-manual.txt:3857 #, no-wrap msgid "images/LOffice_save_as_options.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3714 +#: ./user-manual.txt:3860 msgid "" "After selecting _Save_, select the appropriate field delimiter (choose _Tab_ " "to prevent conflicts with the comma when using this as a decimal point), " @@ -7585,13 +7893,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3715 +#: ./user-manual.txt:3861 #, no-wrap msgid "images/LOffice_field_options.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3718 +#: ./user-manual.txt:3864 msgid "" "One can double check the .CSV file by opening it with a text editor, and " "then import the dive data as explained on the section " @@ -7599,13 +7907,13 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3719 +#: ./user-manual.txt:3865 #, no-wrap msgid "Microsoft _Excel_" msgstr "" #. type: Plain text -#: ./user-manual.txt:3725 +#: ./user-manual.txt:3871 msgid "" "The field delimiter (called \"_list separator_\" in Microsoft manuals) is " "not accessible from within _Excel_ and needs to be set through the " @@ -7616,19 +7924,19 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3727 +#: ./user-manual.txt:3873 msgid "" "In Microsoft Windows, click the *Start* button, and then select _Control " "Panel_ from the list on the right-hand side." msgstr "" #. type: Plain text -#: ./user-manual.txt:3728 +#: ./user-manual.txt:3874 msgid "Open the _Regional and Language Options_ dialog box." msgstr "" #. type: Plain text -#: ./user-manual.txt:3731 +#: ./user-manual.txt:3877 msgid "" "Do one of the following: ** In Windows 7, click the _Formats_ tab, and then " "click _Customize this format_. ** In Windows XP, click the _Regional " @@ -7636,48 +7944,48 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3732 +#: ./user-manual.txt:3878 msgid "" "Type a new separator in the _List separator_ box. To use a TAB-delimited " "file, type the word TAB in the box." msgstr "" #. type: Plain text -#: ./user-manual.txt:3733 +#: ./user-manual.txt:3879 msgid "Click _OK_ twice." msgstr "" #. type: Plain text -#: ./user-manual.txt:3735 +#: ./user-manual.txt:3881 msgid "Below is an image of the _Control Panel_:" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3736 +#: ./user-manual.txt:3882 #, no-wrap msgid "images/Win_SaveCSV2.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3739 +#: ./user-manual.txt:3885 msgid "To export the dive log in CSV format:" msgstr "" #. type: Plain text -#: ./user-manual.txt:3741 +#: ./user-manual.txt:3887 msgid "" "With the dive log opened in _Excel_, select the round Windows button at the " "top left, then _Save As_." msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3742 +#: ./user-manual.txt:3888 #, no-wrap msgid "images/Win_SaveCSV1.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3745 +#: ./user-manual.txt:3891 msgid "" "Click on the left-hand part of the _Save as_ option, NOT on the arrow on the " "right-hand. This brings up a dialogue for saving the spreadsheet in an " @@ -7687,13 +7995,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: ./user-manual.txt:3746 +#: ./user-manual.txt:3892 #, no-wrap msgid "images/Win_SaveCSV3.jpg" msgstr "" #. type: Plain text -#: ./user-manual.txt:3749 +#: ./user-manual.txt:3895 msgid "" "Select the _Save_ button. The CSV-formatted file is saved into the folder " "that was selected. One can double check the .CSV file by opening it with a " @@ -7702,19 +8010,19 @@ msgid "" msgstr "" #. type: Title == -#: ./user-manual.txt:3750 +#: ./user-manual.txt:3896 #, no-wrap msgid "APPENDIX E: FAQs." msgstr "" #. type: Title === -#: ./user-manual.txt:3752 +#: ./user-manual.txt:3898 #, no-wrap msgid "Subsurface appears to miscalculate gas consumption and SAC" msgstr "" #. type: Plain text -#: ./user-manual.txt:3756 +#: ./user-manual.txt:3902 msgid "" "'Question': I dived with a 12.2 l tank, starting with 220 bar and ending " "with 100 bar, and I calculate a different SAC compared what _Subsurface_ " @@ -7722,7 +8030,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3762 +#: ./user-manual.txt:3908 msgid "" "'Answer': Not really. What happens is that _Subsurface_ actually calculates " "gas consumption differently - and better - than you expect. In particular, " @@ -7732,7 +8040,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3768 +#: ./user-manual.txt:3914 msgid "" "and that's true for an ideal gas, and it's what you get taught in dive " "theory. But an \"ideal gas\" doesn't actually exist, and real gases " @@ -7742,12 +8050,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3770 +#: ./user-manual.txt:3916 msgid "+consumption = (amount_of_air_at_beginning - amount_of_air_at_end)+" msgstr "" #. type: Plain text -#: ./user-manual.txt:3776 +#: ./user-manual.txt:3922 msgid "" "where the amount of air is *not* just \"tank size times pressure in bar\". " "It's a combination of: \"take compressibility into account\" (which is a " @@ -7758,12 +8066,12 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3778 +#: ./user-manual.txt:3924 msgid "+12.2*((220-100)/1.013)+" msgstr "" #. type: Plain text -#: ./user-manual.txt:3783 +#: ./user-manual.txt:3929 msgid "" "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 " @@ -7773,7 +8081,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3789 +#: ./user-manual.txt:3935 msgid "" "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. And as " @@ -7784,7 +8092,7 @@ msgid "" msgstr "" #. type: Title === -#: ./user-manual.txt:3790 +#: ./user-manual.txt:3936 #, no-wrap msgid "" "Some dive profiles have time discrepancies with the recorded samples from my " @@ -7792,7 +8100,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3794 +#: ./user-manual.txt:3940 msgid "" "_Subsurface_ ends up ignoring surface time for many things (average depth, " "divetime, SAC, etc). 'Question': Why do dive durations in my dive computer " @@ -7800,7 +8108,7 @@ msgid "" msgstr "" #. type: Plain text -#: ./user-manual.txt:3802 +#: ./user-manual.txt:3948 msgid "" "'Answer': For example, if you end up doing a weight check (deep enough to " "trigger the \"dive started\") but then come back up and wait five minutes " diff --git a/Documentation/FAQ.wordpress b/Documentation/FAQ.wordpress index 1d7082eae..0cd64ae15 100644 --- a/Documentation/FAQ.wordpress +++ b/Documentation/FAQ.wordpress @@ -100,4 +100,15 @@ Many common programs are already supported and we are always happy to try to add 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] diff --git a/Documentation/fr/po/subsurface-manual.fr.po b/Documentation/fr/po/subsurface-manual.fr.po index 18f4a6d06..101d19b66 100644 --- a/Documentation/fr/po/subsurface-manual.fr.po +++ b/Documentation/fr/po/subsurface-manual.fr.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: subsurface@subsurface-divelog.org\n" -"POT-Creation-Date: 2015-02-06 09:16+0100\n" -"PO-Revision-Date: 2015-02-06 14:30+0100\n" +"POT-Creation-Date: 2015-05-18 11:34+0200\n" +"PO-Revision-Date: 2015-05-18 11:38+0200\n" "Last-Translator: Guillaume GARDET <guillaume.gardet@opensuse.org>\n" "Language-Team: French <opensuse-fr@opensuse.org>\n" "Language: fr\n" @@ -237,9 +237,9 @@ msgstr "Commencer à utiliser le programme" #: user-manual.txt:94 msgid "" "The _Subsurface_ window is usually divided into four panels with a *Main " -"Menu* (File Import Log View Filter Help) at the top of the window (for " -"Windows and Linux) or the top of the screen (for Mac and Ubuntu Unity). The " -"four panels are:" +"Menu* (File Import Log View Help) at the top of the window (for Windows and " +"Linux) or the top of the screen (for Mac and Ubuntu Unity). The four panels " +"are:" msgstr "" "La fenêtre _Subsurface_ est généralement divisée en 4 panneaux avec un *Menu " "principal* (Fichier Importer Journal Vue Aide) en haut de la fenêtre (pour " @@ -275,14 +275,14 @@ msgstr "" #. type: Plain text #: user-manual.txt:108 msgid "" -"The *Dive Info* to the top left, giving more detailed information on the " -"dive selected in the *Dive List*, including some statistics for the selected " -"dive or for all highlighted dive(s)." +"The *Info* to the top left, giving more detailed information on the dive " +"selected in the *Dive List*, including some statistics for the selected dive " +"or for all highlighted dive(s)." msgstr "" -"Les *informations de plongée* en haut à gauche, fournissent des informations " -"détaillées sur la plongée sélectionnée dans la *liste des plongées*, dont " -"des statistiques pour la plongée sélectionnée ou pour toutes les plongées " -"mises en surbrillance." +"Les *informations* en haut à gauche, fournissent des informations détaillées " +"sur la plongée sélectionnée dans la *liste des plongées*, dont des " +"statistiques pour la plongée sélectionnée ou pour toutes les plongées mises " +"en surbrillance." #. type: Plain text #: user-manual.txt:111 @@ -313,7 +313,7 @@ msgid "" "information and profile of the _selected dive_ are shown in the respective " "panels. On the other hand, if one highlights more than one dive the last " "highlighted dive is the _selected dive_, but summary data of all " -"_highlighted dives_ are shown in the *Stats* tab of the *Dive Info* panel " +"_highlighted dives_ are 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)." msgstr "" @@ -323,9 +323,9 @@ msgstr "" "plus d'une plongée est mise en surbrillance seule la dernière mise en " "surbrillance est la _plongée sélectionnée_, mais les données de _toutes les " "plongées mises en surbrillances_ sont affichées dans l'onglet *Stats* du " -"panneau *informations de plongée* (profondeur maximale, minimale et moyenne, " -"les durées, les températures de l'eau et le SAC (air consommé); temps total " -"et nombre de plongées sélectionnées)." +"panneau *informations* (profondeur maximale, minimale et moyenne, les " +"durées, les températures de l'eau et le SAC (air consommé); temps total et " +"nombre de plongées sélectionnées)." #. type: Target for macro image #: user-manual.txt:127 @@ -366,7 +366,7 @@ msgstr "*Profil* : affiche uniquement le profile de plongée de la plongée sél #: user-manual.txt:141 #, no-wrap msgid "" -"*Info*: Show only the Dive Notes about the last selected dive and statistics for\n" +"*Info*: Show only the Notes about the last selected dive and statistics for\n" "all highlighted dives.\n" msgstr "" "*Info* : affiche uniquement les notes de plongées de la dernière plongée sélectionnée et les statistiques pour\n" @@ -541,11 +541,11 @@ msgid "" "guide, and some remarks about the dive. _Subsurface_ can store much more " "information than this for each dive. In order to add a dive to a dive log, " "select _Log -> Add Dive_ from the Main Menu. The program then shows three " -"panels to enter information for a dive: two tabs in the *Dive Info* panel " -"(*Dive Notes* and *Equipment*), as well as the *Dive Profile* panel that " -"displays a graphical profile of each dive. These panels are respectively " -"marked [red]#A#, [red]#B# and [red]#C# in the figure below. Each of these " -"tabs will now be explained for data entry." +"panels to enter information for a dive: two tabs in the *Info* panel " +"(*Notes* and *Equipment*), as well as the *Dive Profile* panel that displays " +"a graphical profile of each dive. These panels are respectively marked " +"[red]#A#, [red]#B# and [red]#C# in the figure below. Each of these tabs will " +"now be explained for data entry." msgstr "" #. type: Target for macro image @@ -557,10 +557,10 @@ msgstr "images/AddDive1_f20.jpg" #. type: Plain text #: user-manual.txt:215 msgid "" -"When one edits a field in Dive notes or Equipment panels, _Subsurface_ " -"enters *Editing Mode*, indicated by the message in the blue box at the top " -"of the _Dive Notes_ panel (see the image below). This message is displayed " -"in all the panels under Dive notes and Equipment when in *Editing Mode*." +"When one edits a field in Notes or Equipment panels, _Subsurface_ enters " +"*Editing Mode*, indicated by the message in the blue box at the top of the " +"_Notes_ panel (see the image below). This message is displayed in all the " +"panels under Notes and Equipment when in *Editing Mode*." msgstr "" #. type: Target for macro image @@ -584,16 +584,16 @@ msgstr "" #. type: Title ==== #: user-manual.txt:224 user-manual.txt:700 #, no-wrap -msgid "Dive Notes" -msgstr "Notes de plongée" +msgid "Notes" +msgstr "Notes" #. type: Plain text #: user-manual.txt:230 msgid "" "This panel contains the date, time and place information for a particular " "dive, environmental conditions, co-divers and buddies, as well as some " -"descriptive information. If one clicks on the *Dive Notes* tab, the " -"following fields are visible:" +"descriptive information. If one clicks on the *Notes* tab, the following " +"fields are visible:" msgstr "" #. type: Target for macro image @@ -781,7 +781,7 @@ msgid "" "The *Save* and *Cancel* buttons are used to save all the information for " "tabs in the info panel and in the dive profile panel, so there's no need to " "use them until ALL other information has been added. Here is an example of a " -"completed Dive Notes panel:" +"completed Notes panel:" msgstr "" #. type: Target for macro image @@ -1031,13 +1031,13 @@ msgstr "" #. type: Plain text #: user-manual.txt:473 msgid "" -"The information entered in the *Dive Notes* tab, the *Equipment* tab as well " -"as the *Dive Profile* can now be saved in the user's logbook by using the " -"two buttons on the top right hand of the Dive Notes tab. If the _Save_ " -"button is clicked, the dive data are saved in the current logbook. If the " -"_Cancel_ button is clicked, the newly entered dive data are discarded. When " -"exiting _Subsurface_, the user will be prompted once more to save the " -"logbook with the new dive(s)." +"The information entered in the *Notes* tab, the *Equipment* tab as well as " +"the *Dive Profile* can now be saved in the user's logbook by using the two " +"buttons on the top right hand of the Notes tab. If the _Save_ button is " +"clicked, the dive data are saved in the current logbook. If the _Cancel_ " +"button is clicked, the newly entered dive data are discarded. When exiting " +"_Subsurface_, the user will be prompted once more to save the logbook with " +"the new dive(s)." msgstr "" #. type: Title === @@ -1065,7 +1065,7 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:489 user-manual.txt:2868 +#: user-manual.txt:489 user-manual.txt:2937 #, no-wrap msgid "images/icons/warning2.png" msgstr "images/icons/warning2.png" @@ -1150,7 +1150,7 @@ msgid "" "on most dive computers and also saves battery power of the dive computer (at " "least for those not charging while connected via USB). If, for some reason, " "the user wishes to import ALL dives from the dive computer, even though some " -"may already be in the logbook, then check the check box labelled _Force " +"may already be in the logbook, then check the check box labeled _Force " "download of all dives_." msgstr "" @@ -1274,8 +1274,8 @@ msgid "*PROBLEMS WITH DATA DOWNLOAD FROM A DIVE COMPUTER?*\n" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:619 user-manual.txt:1165 user-manual.txt:1231 -#: user-manual.txt:1284 user-manual.txt:1360 +#: user-manual.txt:619 user-manual.txt:1175 user-manual.txt:1241 +#: user-manual.txt:1294 user-manual.txt:1370 user-manual.txt:1681 #, no-wrap msgid "images/icons/important.png" msgstr "images/icons/important.png" @@ -1416,8 +1416,8 @@ msgstr "" msgid "" "With the uploaded dives in the *Dive List*, the information from the dive " "computer is not complete and more details must be added in order to have a " -"fuller record of the dives. To do this, the *Dive Notes* and the *Equipment* " -"tabs on the top left hand of the _Subsurface_ window should be used." +"fuller record of the dives. To do this, the *Notes* and the *Equipment* tabs " +"on the top left hand of the _Subsurface_ window should be used." msgstr "" #. type: Plain text @@ -1429,8 +1429,8 @@ msgid "" "In a few cases, (e.g. APD rebreathers) one also has to provide the date and " "time of the dive. If the contents of this tab is changed or edited in any " "way, the message in a blue box at the top of the panel indicates that the " -"dive is being edited. If one clicks on the *Dive Notes* tab, the following " -"fields are visible:" +"dive is being edited. If one clicks on the *Notes* tab, the following fields " +"are visible:" msgstr "" #. type: Target for macro image @@ -1686,17 +1686,17 @@ msgstr "" msgid "" "_METHOD 1_: After uploading dives from a dive computer, the dive profiles of " "the uploaded dives are shown in the *Dive profile* tab, as well as a few " -"items of information in the *Dive Notes* tab (e.g. water temperature) and in " -"the *Equipment* tab (e.g. gas pressures and gas composition). However the " -"other fields remain empty. It may be useful to simultaneously edit some of " -"the fields in the *Dive Notes* and *Equipment* tabs. For instance, it is " -"possible that a diver performed several dives during a single day, using " -"identical equipment while diving at the same dive site or with the same dive " -"master and/or buddy or tags. Instead of completing the information for each " -"of these dives separately, one can select all the dives for that day in the " -"*Dive List* and insert the same information in the *Dive Notes* and " -"*Equipment* fields that need identical information. This is achieved by " -"editing the dive notes or the equipment for any one of the selected dives." +"items of information in the *Notes* tab (e.g. water temperature) and in the " +"*Equipment* tab (e.g. gas pressures and gas composition). However the other " +"fields remain empty. It may be useful to simultaneously edit some of the " +"fields in the *Notes* and *Equipment* tabs. For instance, it is possible " +"that a diver performed several dives during a single day, using identical " +"equipment while diving at the same dive site or with the same dive master " +"and/or buddy or tags. Instead of completing the information for each of " +"these dives separately, one can select all the dives for that day in the " +"*Dive List* and insert the same information in the *Notes* and *Equipment* " +"fields that need identical information. This is achieved by editing the dive " +"notes or the equipment for any one of the selected dives." msgstr "" #. type: Plain text @@ -1718,15 +1718,15 @@ msgstr "" #: user-manual.txt:933 msgid "" "_METHOD 2_:There is a different way of achieving the same goal. Select a " -"dive with all the appropriate information typed into the *Dive Notes* and " +"dive with all the appropriate information typed into the *Notes* and " "*Equipment* tabs. Then, from the main menu, select _Log -> Copy dive " "components_. A box is presented with a selection of check boxes for most of " -"the fields in the *Dive Notes* and *Equipment* tabs. Select the fields to " -"be copied from the currently selected dive, then select _OK_. Now, in the " -"*Dive List*, select the dives into which this information is to be pasted. " -"Then, from the main menu, select _Log -> Paste dive components_. All the " -"selected dives now contain the data initially selected in the original " -"source dive log." +"the fields in the *Notes* and *Equipment* tabs. Select the fields to be " +"copied from the currently selected dive, then select _OK_. Now, in the *Dive " +"List*, select the dives into which this information is to be pasted. Then, " +"from the main menu, select _Log -> Paste dive components_. All the selected " +"dives now contain the data initially selected in the original source dive " +"log." msgstr "" #. type: Title ==== @@ -1787,13 +1787,13 @@ msgstr "" #. type: Plain text #: user-manual.txt:967 msgid "" -"The information entered in the *Dive Notes* tab and the *Equipment* tab can " -"be saved by using the two buttons on the top right hand of the *Dive Notes* " -"tab. If the _Save_ button is clicked, the dive data are saved. If the " -"_Cancel_ button is clicked, then the newly entered dive data are deleted, " -"although the dive profile obtained from the dive computer will be retained. " -"When the user exits _Subsurface_ there is a final prompt to confirm that the " -"new data should be saved." +"The information entered in the *Notes* tab and the *Equipment* tab can be " +"saved by using the two buttons on the top right hand of the *Notes* tab. If " +"the _Save_ button is clicked, the dive data are saved. If the _Cancel_ " +"button is clicked, then the newly entered dive data are deleted, although " +"the dive profile obtained from the dive computer will be retained. When the " +"user exits _Subsurface_ there is a final prompt to confirm that the new data " +"should be saved." msgstr "" #. type: Title === @@ -1915,11 +1915,30 @@ msgstr "" #. type: Title ==== #: user-manual.txt:1029 #, no-wrap +msgid "Importing from Heinrichs Weikamp OSTC Tools" +msgstr "" + +#. type: Plain text +#: user-manual.txt:1037 +msgid "" +"_OSTC Tools_ is a Microsoft-based suite of dive download and dive management " +"tools for the OSTC family of dive computers. _OSTC Tools_ downloads dive " +"data from the dive computer and stores it as a binary file with file " +"extension _.dive_ . Subsurface can directly import these files when using " +"the universal import dialogue. From the dropdown list at the bottom right " +"select _All files_. This makes the _OSTC Tools_ dive logs visible in the " +"file list panel. Select one or more dive, then click the _Open_ button. The " +"OSTC dives are shown in the *Dive List* panel." +msgstr "" + +#. type: Title ==== +#: user-manual.txt:1039 +#, no-wrap msgid "Importing from Mares Dive Organiser V2.1" msgstr "" #. type: Plain text -#: user-manual.txt:1036 +#: user-manual.txt:1046 msgid "" "Since Mares utilise proprietary Windows software not compatible with multi-" "platform applications, these dive logs cannot be directly imported into " @@ -1929,7 +1948,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1041 +#: user-manual.txt:1051 msgid "" "The dive log data from Mares Dive Organiser need to be exported to the " "user's desktop, using a _.sdf_ file name extension. Refer to xref:" @@ -1937,7 +1956,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1047 +#: user-manual.txt:1057 msgid "" "Data should then be imported into _www.divelogs.de_. One needs to create a " "user account in _www.divelogs.de_, log into that web site, then select " @@ -1947,20 +1966,20 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1049 +#: user-manual.txt:1059 msgid "" "Finally, import the dives from _divelogs.de_ to _Subsurface_, using the " "instructions below." msgstr "" #. type: Title ==== -#: user-manual.txt:1052 +#: user-manual.txt:1062 #, no-wrap msgid "Importing dives from *divelogs.de*" msgstr "" #. type: Plain text -#: user-manual.txt:1065 +#: user-manual.txt:1075 msgid "" "The import of dive information from _divelogs.de_ is simple, using a single " "dialogue box. The _Import -> Import from Divelogs.de_ option should be " @@ -1974,19 +1993,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1066 +#: user-manual.txt:1076 #, no-wrap msgid "images/Divelogs1.jpg" msgstr "images/Divelogs1.jpg" #. type: Title ==== -#: user-manual.txt:1069 +#: user-manual.txt:1079 #, no-wrap msgid "Importing data in CSV format" msgstr "" #. type: Plain text -#: user-manual.txt:1080 +#: user-manual.txt:1090 msgid "" "A comma-separated file (.csv) can be used to import dive information either " "as dive profiles (as in the case of the APD Inspiration and Evolution closed " @@ -2002,13 +2021,13 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1082 +#: user-manual.txt:1092 #, no-wrap msgid "Importing dives in CSV format from dive computers or other dive log software" msgstr "" #. type: Plain text -#: user-manual.txt:1087 +#: user-manual.txt:1097 msgid "" "One can view a _CSV_ file by using an ordinary text editor. It is normally " "organised into a single line that provides the headers (or _field names_ or " @@ -2017,14 +2036,14 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1089 +#: user-manual.txt:1099 msgid "" "There are two types of _CSV_ dive logs that can be imported into " "_Subsurface_:" msgstr "" #. type: Plain text -#: user-manual.txt:1095 +#: user-manual.txt:1105 msgid "" "_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, " @@ -2035,7 +2054,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1104 +#: user-manual.txt:1114 msgid "" "_CSV dive profile_: This dive log format includes much more information " "about a single dive. For instance there may be information at 30-second " @@ -2049,14 +2068,14 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1107 +#: user-manual.txt:1117 msgid "" "Before being able to import the _CSV_ data to _Subsurface_ *one needs to " "know a few things about the data being imported*:" msgstr "" #. type: Plain text -#: user-manual.txt:1115 +#: user-manual.txt:1125 msgid "" "Which character separates the different columns within a single line of " "data? This field separator should be either a comma (,) or a TAB character. " @@ -2067,7 +2086,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1119 +#: user-manual.txt:1129 msgid "" "Which data columns need to be imported into _Subsurface_? Is it a _CSV dive " "details_ file or a _CSV dive profile_ file? Open the file using a text " @@ -2076,13 +2095,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1121 +#: user-manual.txt:1131 msgid "" "Is the numeric information (e.g. dive depth) in metric or in imperial unis?" msgstr "" #. type: Plain text -#: user-manual.txt:1128 +#: user-manual.txt:1138 msgid "" "Armed with this information, importing the data into _Subsurface_ is " "straightforward. Select _Import -> Import Log Files_ from the main menu. In " @@ -2092,13 +2111,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1129 +#: user-manual.txt:1139 #, no-wrap msgid "images/csv_import1_f20.jpg" msgstr "images/csv_import1_f20.jpg" #. type: Plain text -#: user-manual.txt:1140 +#: user-manual.txt:1150 msgid "" "Notice that, at the top left, there is a dropdown list containing pre-" "configured settings for some of the more common dive computers and software " @@ -2113,7 +2132,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1154 +#: user-manual.txt:1164 msgid "" "The last remaining task is to ensure that all the data columns have the " "appropriate column headings. The top line of the white part of the data " @@ -2121,24 +2140,24 @@ msgid "" "row of cells immediately above these contains the names understood by " "_Subsurface_. The white area below the dropdown lists contains all the field " "names that _Subsurface_ recognises. These names are in blue balloons and can " -"be moved using a drag-and-frop action. For instance, _Subsurface_ expects " +"be moved using a drag-and-drop action. For instance, _Subsurface_ expects " "the column heading for Dive number (\" # \") to be \"Dive # \". If the " "column heading that _Subsurface_ expects is not in the blue cells, then drag " "the appropriate column heading from the upper area and drop it in the " "appropriate blue cell at the top of the table. To indicate the correct " -"column for \"Dive #\", drag the ballooned item labelled \"Dive # \" and drop " +"column for \"Dive #\", drag the ballooned item labeled \"Dive # \" and drop " "it in the blue cell immediately above the white cell containing \" # \". " "This is depicted in the image below." msgstr "" #. type: Target for macro image -#: user-manual.txt:1155 +#: user-manual.txt:1165 #, no-wrap msgid "images/csv_import2_f20.jpg" msgstr "images/csv_import2_f20.jpg" #. type: Plain text -#: user-manual.txt:1161 +#: user-manual.txt:1171 msgid "" "Continue in this way to ensure that all the column headings in the blue row " "of cells correspond to the headings listed in the top part of the dialogue. " @@ -2148,30 +2167,30 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:1165 +#: user-manual.txt:1175 #, no-wrap msgid "*A Diver's Introduction to _CSV_ Files*\n" msgstr "" #. type: delimited block * -#: user-manual.txt:1179 -msgid "" -"_CSV_ is an abbreviation for a data file format: _Comma-Separated " -"Variables_. It is a file format allowing someone to view or edit the " -"information using a text editor such as Notebook (Windows), gedit (Linux) or " -"TextWrangler (OS/X). The two main advantages of the _CSV_ format is that the " -"data are easily editable as text without any proprietary software and " -"ensuring all information is human-readable, not being obscured by any custom " -"or proprietary attributes that proprietary software insert into files. " -"Because of its simplicity the _CSV_ format is used as an interchange format " -"between many software packages, e.g. between spreadsheet, statistical, " -"graphics, database and diving software. Within _Subsurface_, _CSV_ files can " -"also be used to import information from other sources such as spreadsheet-" -"based dive logs and even from some dive computers." +#: user-manual.txt:1189 +msgid "" +"_CSV_ is an abbreviation for a data file format: _Comma-Separated Values_. " +"It is a file format allowing someone to view or edit the information using a " +"text editor such as Notepad (Windows), gedit (Linux) or TextWrangler (OS/X). " +"The two main advantages of the _CSV_ format is that the data are easily " +"editable as text without any proprietary software and ensuring all " +"information is human-readable, not being obscured by any custom or " +"proprietary attributes that proprietary software insert into files. Because " +"of its simplicity the _CSV_ format is used as an interchange format between " +"many software packages, e.g. between spreadsheet, statistical, graphics, " +"database and diving software. Within _Subsurface_, _CSV_ files can also be " +"used to import information from other sources such as spreadsheet-based dive " +"logs and even from some dive computers." msgstr "" #. type: delimited block * -#: user-manual.txt:1188 +#: user-manual.txt:1198 msgid "" "_CSV_ files can be created or edited with a normal text editor. The most " "important attribute of a _CSV_ file is the _field separator_, the character " @@ -2187,7 +2206,7 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:1194 +#: user-manual.txt:1204 #, no-wrap msgid "" "\tDive site,Dive date,Time,Dive_duration, Dive_depth,Dive buddy\n" @@ -2198,14 +2217,14 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:1196 +#: user-manual.txt:1206 msgid "" "In this format the data are not easily read by a human. Here is the same " "information in TAB-delimited format:" msgstr "" #. type: delimited block * -#: user-manual.txt:1202 +#: user-manual.txt:1212 #, no-wrap msgid "" "\tDive site\tDive date\tTime\tDive_duration\tDive_depth\tDive buddy\n" @@ -2216,7 +2235,7 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:1210 +#: user-manual.txt:1220 msgid "" "It is clear why many people prefer the TAB-delimited format to the comma-" "delimited format. The disadvantage is that one cannot see the TAB " @@ -2230,7 +2249,7 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:1221 +#: user-manual.txt:1231 #, no-wrap msgid "" "\tDive Time (s)\tDepth (m)\tpOâ‚‚ - Setpoint (Bar) \tpOâ‚‚ - C1 Cell 1 (Bar)\tAmbient temp. (Celsius)\n" @@ -2246,7 +2265,7 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:1227 +#: user-manual.txt:1237 msgid "" "When a _CSV_ file is selected for import, _Subsurface_ displays the column " "headers as well as some of the data in the first few lines of the _CSV_ " @@ -2257,7 +2276,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1241 +#: user-manual.txt:1251 msgid "" "The _CSV_ import has a couple of caveats. One should avoid some special " "characters like ampersand (&), less than (<), greater than (>) and double " @@ -2270,13 +2289,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:1244 +#: user-manual.txt:1254 #, no-wrap msgid "Importing GPS coordinates with the _Subsurface Companion App_ for mobile phones" msgstr "" #. type: Plain text -#: user-manual.txt:1253 +#: user-manual.txt:1263 msgid "" "Using the *Subsurface Companion App* on an _Android device_ with a GPS or " "xref:S_iphone[_iPhone_], the coordinates for the diving location can be " @@ -2286,18 +2305,18 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1255 +#: user-manual.txt:1265 msgid "To do this:" msgstr "" #. type: Title ==== -#: user-manual.txt:1256 +#: user-manual.txt:1266 #, no-wrap msgid "Create a Companion App account" msgstr "" #. type: Plain text -#: user-manual.txt:1261 +#: user-manual.txt:1271 msgid "" "Register on the http://api.hohndel.org/login/[_Subsurface companion web " "page_]. A confirmation email with instructions and a personal *DIVERID* " @@ -2306,7 +2325,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1266 +#: user-manual.txt:1276 msgid "" "Download the app from https://play.google.com/store/apps/details?id=org." "subsurface[Google Play Store] or from http://f-droid.org/repository/browse/?" @@ -2314,18 +2333,18 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:1267 +#: user-manual.txt:1277 #, no-wrap msgid "Using the Subsurface companion app on an Android smartphone" msgstr "" #. type: Plain text -#: user-manual.txt:1270 +#: user-manual.txt:1280 msgid "On first use the app has three options:" msgstr "" #. type: Plain text -#: user-manual.txt:1276 +#: user-manual.txt:1286 msgid "" "_Create a new account._ Equivalent to registering in _Subsurface_ companion " "page using an Internet browser. One can request a *DIVERID* using this " @@ -2335,14 +2354,14 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1279 +#: user-manual.txt:1289 msgid "" "_Retrieve an account._ If users forgot their *DIVERID* they will receive an " "email to recover the number." msgstr "" #. type: Plain text -#: user-manual.txt:1283 +#: user-manual.txt:1293 msgid "" "_Use an existing account._ Users are prompted for their *DIVERID*. The app " "saves this *DIVERID* and does not ask for it again unless one uses the " @@ -2350,7 +2369,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1291 +#: user-manual.txt:1301 msgid "" "In the _Subsurface_ main program, the *DIVERID* should also be entered on " "the Default Preferences panel, obtained by selecting _File -> Preferences -> " @@ -2359,13 +2378,13 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1292 +#: user-manual.txt:1302 #, no-wrap msgid "Creating new dive locations" msgstr "" #. type: Plain text -#: user-manual.txt:1297 +#: user-manual.txt:1307 msgid "" "Now one is ready to get a dive position and send it to the server. The " "Android display will look like the left hand image (*A*) below, but without " @@ -2373,21 +2392,21 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1300 +#: user-manual.txt:1310 msgid "" "Touch the \"+\" icon on the top right to add a new dive site, a menu will be " "showed with 3 options:" msgstr "" #. type: Plain text -#: user-manual.txt:1303 +#: user-manual.txt:1313 msgid "" "Current: A prompt for a place name (or a request to activate the GPS if it " "is turned off) will be displayed, after which the current location is saved." msgstr "" #. type: Plain text -#: user-manual.txt:1312 +#: user-manual.txt:1322 msgid "" "Use Map: This option allows the user to fix a position by searching a world " "map. A world map is shown (see *B* below) on which one should indicate the " @@ -2400,13 +2419,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1313 +#: user-manual.txt:1323 #, no-wrap msgid "images/Companion_5.jpg" msgstr "images/Companion_5.jpg" #. type: Plain text -#: user-manual.txt:1321 +#: user-manual.txt:1331 msgid "" "Import local GPX file: The android device searches for .gpx files and " "located archives will be shown. The selected .gpx file is opened and the " @@ -2416,13 +2435,13 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1322 +#: user-manual.txt:1332 #, no-wrap msgid "Dive lists of dive locations" msgstr "" #. type: Plain text -#: user-manual.txt:1330 +#: user-manual.txt:1340 msgid "" "The main screen shows a list of dive locations, each with a name, date and " "time (see *A* below). Some locations may have an arrow-up icon over the " @@ -2433,7 +2452,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1338 +#: user-manual.txt:1348 msgid "" "Dive locations in this list can be viewed in two ways: a list of locations " "or a map indicating the dive locations. The display mode (List or Map) is " @@ -2445,13 +2464,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1339 +#: user-manual.txt:1349 #, no-wrap msgid "images/Companion_4.jpg" msgstr "images/Companion_4.jpg" #. type: Plain text -#: user-manual.txt:1345 +#: user-manual.txt:1355 msgid "" "When one clicks on a dive (*not* selecting the check box), the name given to " "it, date/time and GPS coordinates will be shown, with two options at the top " @@ -2459,32 +2478,32 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1347 +#: user-manual.txt:1357 msgid "" "Edit (pencil): Change the text name or other characteristics of the dive " "location." msgstr "" #. type: Plain text -#: user-manual.txt:1349 +#: user-manual.txt:1359 msgid "Maps: Display a map showing the dive location." msgstr "" #. type: Plain text -#: user-manual.txt:1352 +#: user-manual.txt:1362 msgid "" "After editing and saving a dive location (see *C* above), one needs to " "upload it to the web service, as explained below." msgstr "" #. type: Title ===== -#: user-manual.txt:1353 +#: user-manual.txt:1363 #, no-wrap msgid "Uploading dive locations" msgstr "" #. type: Plain text -#: user-manual.txt:1359 +#: user-manual.txt:1369 msgid "" "There are several ways to send locations to the server. The easiest is by " "simply selecting the locations (See *A* below) and then touching the right " @@ -2492,51 +2511,51 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1364 +#: user-manual.txt:1374 msgid "" "Users must be careful, as the trash icon on the right means exactly what it " "should; it deletes the selected dive location(s)." msgstr "" #. type: Target for macro image -#: user-manual.txt:1365 +#: user-manual.txt:1375 #, no-wrap msgid "images/Companion_1.jpg" msgstr "images/Companion_1.jpg" #. type: Plain text -#: user-manual.txt:1370 +#: user-manual.txt:1380 msgid "" "After a dive trip using the Companion App, all dive locations are ready to " "be downloaded to a _Subsurface_ dive log (see below)." msgstr "" #. type: Title ===== -#: user-manual.txt:1372 +#: user-manual.txt:1382 #, no-wrap msgid "Settings on the Companion app" msgstr "" #. type: Plain text -#: user-manual.txt:1375 +#: user-manual.txt:1385 msgid "" "Selecting the _Settings_ menu option results in the right hand image above " "(*B*)." msgstr "" #. type: Title ===== -#: user-manual.txt:1376 +#: user-manual.txt:1386 #, no-wrap msgid "Server and account" msgstr "" #. type: Plain text -#: user-manual.txt:1379 +#: user-manual.txt:1389 msgid "_Web-service URL._ This is predefined (http://api.hohndel.org/)" msgstr "" #. type: Plain text -#: user-manual.txt:1383 +#: user-manual.txt:1393 msgid "" "_User ID._ The DIVERID obtained by registering as described above. The " "easiest way to obtain it is simply to copy and paste from the confirmation " @@ -2544,33 +2563,33 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1384 +#: user-manual.txt:1394 #, no-wrap msgid "Synchronisation" msgstr "" #. type: Plain text -#: user-manual.txt:1388 +#: user-manual.txt:1398 msgid "" "_Synchronize on startup._ If selected, dive locations in the Android device " "and those on the web service synchronise each time the app is started." msgstr "" #. type: Plain text -#: user-manual.txt:1391 +#: user-manual.txt:1401 msgid "" "_Upload new dives._ If selected, each time the user adds a dive location it " "is automatically sent to the server." msgstr "" #. type: Title ===== -#: user-manual.txt:1392 +#: user-manual.txt:1402 #, no-wrap msgid "Background service" msgstr "" #. type: Plain text -#: user-manual.txt:1395 +#: user-manual.txt:1405 msgid "" "Instead of entering a unique dive location, users can leave the service " "running in the background of their Android device, allowing the continuous " @@ -2578,35 +2597,35 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1398 +#: user-manual.txt:1408 msgid "The settings below define the behaviour of the service:" msgstr "" #. type: Plain text -#: user-manual.txt:1401 +#: user-manual.txt:1411 msgid "" "_Min duration._ In minutes. The app will try to get a location every X " "minutes until stopped by the user." msgstr "" #. type: Plain text -#: user-manual.txt:1403 +#: user-manual.txt:1413 msgid "_Min distance._ In meters. Minimum distance between two locations." msgstr "" #. type: Plain text -#: user-manual.txt:1405 +#: user-manual.txt:1415 msgid "_Name template._ The name the app will use when saving the locations." msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1406 user-manual.txt:1503 user-manual.txt:1856 +#: user-manual.txt:1416 user-manual.txt:1513 user-manual.txt:1914 #, no-wrap msgid "images/icons/info.jpg" msgstr "images/icons/info.jpg" #. type: Plain text -#: user-manual.txt:1416 +#: user-manual.txt:1426 msgid "" "_How does the background service work?_ Assuming the user sets 5 minutes and " "50 meters in the settings above, the app will start by recording a location " @@ -2619,59 +2638,59 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1417 +#: user-manual.txt:1427 #, no-wrap msgid "Other" msgstr "" #. type: Plain text -#: user-manual.txt:1421 +#: user-manual.txt:1431 msgid "" "_Mailing List._ The mail box for _Subsurface_. Users can send an email to " "the Subsurface mailing list." msgstr "" #. type: Plain text -#: user-manual.txt:1423 +#: user-manual.txt:1433 msgid "_Subsurface website._ A link to the URL of Subsurface web" msgstr "" #. type: Plain text -#: user-manual.txt:1425 +#: user-manual.txt:1435 msgid "_Version._ Displays the current version of the Companion App." msgstr "" #. type: Title ===== -#: user-manual.txt:1426 +#: user-manual.txt:1436 #, no-wrap msgid "Search" msgstr "" #. type: Plain text -#: user-manual.txt:1429 +#: user-manual.txt:1439 msgid "Search the saved dive locations by name or by date and time." msgstr "" #. type: Title ===== -#: user-manual.txt:1430 +#: user-manual.txt:1440 #, no-wrap msgid "Start service" msgstr "" #. type: Plain text -#: user-manual.txt:1433 +#: user-manual.txt:1443 msgid "" "Initiates the _background service_ following the previously defined settings." msgstr "" #. type: Title ===== -#: user-manual.txt:1434 +#: user-manual.txt:1444 #, no-wrap msgid "Disconnect" msgstr "" #. type: Plain text -#: user-manual.txt:1442 +#: user-manual.txt:1452 msgid "" "This is a badly named option that disconnects the app from the server by " "resetting the user ID in the app, showing the first screen where an account " @@ -2681,25 +2700,25 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1443 +#: user-manual.txt:1453 #, no-wrap msgid "Send all locations" msgstr "" #. type: Plain text -#: user-manual.txt:1446 +#: user-manual.txt:1456 msgid "" "This option sends all locations stored in the Android device to the server." msgstr "" #. type: Title ==== -#: user-manual.txt:1448 +#: user-manual.txt:1458 #, no-wrap msgid "Using the Subsurface companion app on an _iPhone_ to record dive locations" msgstr "" #. type: Plain text -#: user-manual.txt:1453 +#: user-manual.txt:1463 msgid "" "The iPhone interface is quite simple. One needs to type the user ID " "(obtained during registration) into the space reserved for it, then select " @@ -2708,13 +2727,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1454 +#: user-manual.txt:1464 #, no-wrap msgid "images/iphone.jpg" msgstr "images/iphone.jpg" #. type: Plain text -#: user-manual.txt:1461 +#: user-manual.txt:1471 msgid "" "Dives can be added automatically or manually. In manual mode, a dive " "location or waypoint is added to the GPS input stream. In automatic mode, a " @@ -2728,7 +2747,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1467 +#: user-manual.txt:1477 msgid "" "One can edit the site name afterwards by selecting the dive from the dive " "list and clicking on the site name. There are no other editable fields. The " @@ -2737,13 +2756,13 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:1469 +#: user-manual.txt:1479 #, no-wrap msgid "Downloading dive locations to the _Subsurface_ divelog" msgstr "" #. type: Plain text -#: user-manual.txt:1478 +#: user-manual.txt:1488 msgid "" "Download dive(s) from a dive computer or enter them manually into " "_Subsurface_ before obtaining the GPS coordinates from the server. The " @@ -2755,13 +2774,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1479 +#: user-manual.txt:1489 #, no-wrap msgid "images/DownloadGPS.jpg" msgstr "images/DownloadGPS.jpg" #. type: Plain text -#: user-manual.txt:1487 +#: user-manual.txt:1497 msgid "" "Note that the _Apply_ button is now active. By clicking on it, users can " "update the locations of the newly entered or uploaded dives in _Subsurface_ " @@ -2772,7 +2791,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1494 +#: user-manual.txt:1504 msgid "" "Since _Subsurface_ matches GPS locations from the Android device and dive " "information from the dive computer based on date-time data, automatic " @@ -2784,7 +2803,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1502 +#: user-manual.txt:1512 msgid "" "Similar date-times may not always be possible and there may be many reasons " "for this (e.g. time zones), or _Subsurface_ may be unable to decide which is " @@ -2798,12 +2817,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1506 +#: user-manual.txt:1516 msgid "TIPS:" msgstr "" #. type: Plain text -#: user-manual.txt:1513 +#: user-manual.txt:1523 msgid "" "_Background service_, being a very powerful tool, may fill the location list " "with many unnecessary locations not corresponding to the exact dive point " @@ -2816,7 +2835,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1517 +#: user-manual.txt:1527 msgid "" "It may also make sense to give informative names to the locations sent to " "the web server, or at least to use an informative name in the _Name " @@ -2825,13 +2844,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:1519 +#: user-manual.txt:1529 #, no-wrap msgid "Adding photographs to dives" msgstr "" #. type: Plain text -#: user-manual.txt:1525 +#: user-manual.txt:1535 msgid "" "Many (if not most) divers take a camera with them and take photographs " "during a dive. One would like to associate each photograph with a specific " @@ -2840,39 +2859,39 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:1526 +#: user-manual.txt:1536 #, no-wrap msgid "Loading photos and getting synchronisation between dive computer and camera" msgstr "" #. type: Plain text -#: user-manual.txt:1530 +#: user-manual.txt:1540 msgid "" "Left-lick on a dive or on a group of dives on the dive list. Then right-" "click on this dive or group of dives and choose the option _Load Images_:" msgstr "" #. type: Target for macro image -#: user-manual.txt:1531 +#: user-manual.txt:1541 #, no-wrap msgid "images/LoadImage1_f20.jpg" msgstr "images/LoadImage1_f20.jpg" #. type: Plain text -#: user-manual.txt:1535 +#: user-manual.txt:1545 msgid "" "The system file browser appears. Select the folder and photographs that need " "to be loaded into _Subsurface_ and click the _Open_ button." msgstr "" #. type: Target for macro image -#: user-manual.txt:1536 +#: user-manual.txt:1546 #, no-wrap msgid "images/LoadImage2_f20.jpg" msgstr "images/LoadImage2_f20.jpg" #. type: Plain text -#: user-manual.txt:1545 +#: user-manual.txt:1555 msgid "" "This brings one to the time synchronisation dialog, shown below. The " "critical problem is that the time synchronisation is not perfect between the " @@ -2883,12 +2902,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1547 +#: user-manual.txt:1557 msgid "_Subsurface_ achieves this synchronisation in two ways:" msgstr "" #. type: Plain text -#: user-manual.txt:1559 +#: user-manual.txt:1569 #, no-wrap msgid "" "*Manually*: If the user wrote down the exact camera time at the start of a dive, the\n" @@ -2905,13 +2924,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1560 +#: user-manual.txt:1570 #, no-wrap msgid "images/LoadImage3b_f20.jpg" msgstr "images/LoadImage3b_f20.jpg" #. type: Plain text -#: user-manual.txt:1578 +#: user-manual.txt:1588 #, no-wrap msgid "" "*By photograph*: There is a very slick way of achieving synchronisation. If one takes a\n" @@ -2932,7 +2951,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1581 +#: user-manual.txt:1591 msgid "" "If the timestamp of a photograph is long before or after the dive, it is not " "placed on the dive profile. If the timestamp of the photo is within 30 " @@ -2940,62 +2959,62 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:1582 +#: user-manual.txt:1592 #, no-wrap msgid "Viewing the photos" msgstr "" #. type: Plain text -#: user-manual.txt:1586 +#: user-manual.txt:1596 msgid "" "In order to view the photos added to a dive, activate the _show-photos_ " "button in the tool bar to the left of the dive profile:" msgstr "" #. type: Target for macro image -#: user-manual.txt:1587 +#: user-manual.txt:1597 #, no-wrap msgid "images/icons/ShowPhotos_f20.png" msgstr "images/icons/ShowPhotos_f20.png" #. type: Plain text -#: user-manual.txt:1590 +#: user-manual.txt:1600 msgid "After the images have been loaded, they appear in two places:" msgstr "" #. type: Plain text -#: user-manual.txt:1592 -msgid "the _Photos_ tab of the *Dive Notes* panel." +#: user-manual.txt:1602 +msgid "the _Photos_ tab of the *Notes* panel." msgstr "" #. type: Plain text -#: user-manual.txt:1594 +#: user-manual.txt:1604 msgid "" "as tiny icons (stubs) on the dive profile at the appropriate positions " "reflecting the time each photograph was taken. See below:" msgstr "" #. type: Target for macro image -#: user-manual.txt:1595 +#: user-manual.txt:1605 #, no-wrap msgid "images/LoadImage4_f20.jpg" msgstr "images/LoadImage4_f20.jpg" #. type: Plain text -#: user-manual.txt:1599 +#: user-manual.txt:1609 msgid "" "If one hovers with the mouse over any of the photo icons, then a thumbnail " "photo is shown of the appropriate photo. See the image below:" msgstr "" #. type: Target for macro image -#: user-manual.txt:1600 +#: user-manual.txt:1610 #, no-wrap msgid "images/LoadImage5_f20.jpg" msgstr "images/LoadImage5_f20.jpg" #. type: Plain text -#: user-manual.txt:1609 +#: user-manual.txt:1619 msgid "" "Clicking on the thumbnail brings up a full size photo overlaid on the " "_Subsurface_ window. This allows good viewing of the photographs that have " @@ -3007,24 +3026,24 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1610 +#: user-manual.txt:1620 #, no-wrap msgid "images/LoadImage6_f20.jpg" msgstr "images/LoadImage6_f20.jpg" #. type: Title ==== -#: user-manual.txt:1612 +#: user-manual.txt:1622 #, no-wrap msgid "The _Photos_ tab" msgstr "" #. type: Plain text -#: user-manual.txt:1623 +#: user-manual.txt:1633 msgid "" "Photographs associated with a dive are shown as thumbnails in the _Photos_ " -"tab of the _Dive Notes_ panel. Photos taken in rapid succession during a " -"dive (therefore sometimes with large overlap on the dive profile) can easily " -"be accessed in the _Photos_ tab. This tab serves as a tool for individually " +"tab of the _Notes_ panel. Photos taken in rapid succession during a dive " +"(therefore sometimes with large overlap on the dive profile) can easily be " +"accessed in the _Photos_ tab. This tab serves as a tool for individually " "accessing the photos of a dive, while the stubs on the dive profile give an " "indication of when during a dive a photo was taken. By single-clicking on a " "thumbnail in the _Photos_ panel, a photo is selected. By double-clicking a " @@ -3035,13 +3054,13 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:1624 +#: user-manual.txt:1634 #, no-wrap msgid "Photos on an external hard disk" msgstr "" #. type: Plain text -#: user-manual.txt:1635 +#: user-manual.txt:1645 msgid "" "Most underwater photographers store their photos on an external drive. If " "such a drive can be mapped (almost always the case) the photos can be " @@ -3058,20 +3077,113 @@ msgid "" "be seen in the normal way." msgstr "" +#. type: Title ==== +#: user-manual.txt:1647 +#, no-wrap +msgid "Moving photographs among directories, hard disks or computers" +msgstr "" + +#. type: Plain text +#: user-manual.txt:1657 +#, no-wrap +msgid "" +"After a photograph has been loaded into _Subsurface_ and associated with a specific dive, the directory\n" +" where the photo lies is stored, allowing _Subsurface_ to find the photograph when the dive is\n" +" opened again. If the photo or the whole photo collection is moved to another drive or to a different\n" +" machine, it is unlikely that the directory structure will remain identical to that of the original uploaded\n" +" photo. When this happens, _Subsurface_ looks for the photos at their original location before they were moved,\n" +" cannot find them and therefore cannot display them. Because, after moving photos, large numbers of photos\n" +" may need to be deleted and re-imported from the new location, _Subsurface_ has a mechanism that eases the\n" +" process of updating the directory information for each photo: automatic updates using fingerprints.\n" +msgstr "" + +#. type: Plain text +#: user-manual.txt:1662 +#, no-wrap +msgid "" +"When a photo is loaded into _Subsurface_, a fingerprint for the image is calculated and stored with the\n" +" other reference information for that photo. After moving a photo collection (that has already been loaded\n" +" into _Subsurface_) to a different directory, disk or computer, _Subsurface_ can perform the\n" +" following steps:\n" +msgstr "" + +#. type: Plain text +#: user-manual.txt:1664 +msgid "" +"look through a particular directory (and all its subdirectories recursively) " +"where photos have been moved" +msgstr "" + +#. type: Plain text +#: user-manual.txt:1665 +msgid "to," +msgstr "" + +#. type: Plain text +#: user-manual.txt:1667 +msgid "calculate fingerprints for all photos in this directory, and" +msgstr "" + +#. type: Plain text +#: user-manual.txt:1669 +msgid "" +"if there is a match between a calculated fingerprint and the one originally " +"calculated when a photo was" +msgstr "" + +#. type: Plain text +#: user-manual.txt:1671 +msgid "" +"loaded into _Subsurface_ (even if the original file name has changed), to " +"automatically update the directory information so that _Subsurface_ can find " +"the photo in the new moved directory." +msgstr "" + +#. type: Plain text +#: user-manual.txt:1676 +#, no-wrap +msgid "" +"This is achieved by selecting from the Main Menu: _File -> Find moved images_. This brings up a window within\n" +" which the NEW directory of the photos needs to be specified. Select the appropriate directory and click\n" +" the _Scan_ button towards the bottom right of the panel. The process may require several minutes to\n" +" complete, after which _subsurface_ will show the appropriate photographs when a particular dive is opened.\n" +msgstr "" + +#. type: delimited block * +#: user-manual.txt:1681 +#, no-wrap +msgid "*Upgrading existing photo collections without fingerprints*\n" +msgstr "" + +#. type: delimited block * +#: user-manual.txt:1691 +msgid "" +"Software for the automated update of existing photo collections is under " +"developement. Currently single dives must be upgraded one at a time. Select " +"the toolbar button on the *Dive profile* panel that enables the display of " +"images. The thumbnails of images are shown on the dive profile. Then open " +"the dive and change anything in the *Notes* panel that brings up the blue " +"edit bar at the top of the notes panel to save the edits. For instance, add " +"a space character at the end of the _Notes_ text box and immediately delete " +"that space character. Select the optio _Apply changes_ in the blue edit bar " +"to save the dive information. Fingerprints are calculated while saving this " +"specific dive." +msgstr "" + #. type: Title === -#: user-manual.txt:1637 +#: user-manual.txt:1695 #, no-wrap msgid "Logging special types of dives" msgstr "" #. type: Title ==== -#: user-manual.txt:1640 +#: user-manual.txt:1698 #, no-wrap msgid "Multicylinder dives" msgstr "" #. type: Plain text -#: user-manual.txt:1647 +#: user-manual.txt:1705 msgid "" "_Subsurface_ easily handles dives involving more than one cylinder. " "Multicylinder diving usually happens (a) if a diver does not have enough gas " @@ -3083,16 +3195,16 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1651 +#: user-manual.txt:1709 #, no-wrap msgid "" "*Describe the cylinders used during the dive* This is performed in the *Equipment tab* of\n" -"the *Dive Info* panel, as xref:cylinder_definitions[described above]. Enter the cylinders one by one,\n" +"the *Info* panel, as xref:cylinder_definitions[described above]. Enter the cylinders one by one,\n" "specifying the characteristics of the cylinder and the gas composition within each cylinder.\n" msgstr "" #. type: Plain text -#: user-manual.txt:1656 +#: user-manual.txt:1714 #, no-wrap msgid "" "*Record the times at which switches from one cylinder to another was done:* This is information\n" @@ -3102,7 +3214,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1664 +#: user-manual.txt:1722 #, no-wrap msgid "" "*Record the cylinder changes on the dive profile*: If the latter option\n" @@ -3110,12 +3222,12 @@ msgid "" "in time on the *Dive Profile* panel and indicating the cylinder to which the change was made. After\n" "right-clicking, follow the context menu to \"Add gas change\" and select the appropriate cylinder from\n" "those defined during the first step, above (see image below). If the\n" -"*tank bar* button in the ttolbar has been activated, the cylinder switches are also indicated in the\n" +"*tank bar* button in the toolbar has been activated, the cylinder switches are also indicated in the\n" "tank bar.\n" msgstr "" #. type: Plain text -#: user-manual.txt:1668 +#: user-manual.txt:1726 msgid "" "Having performed these tasks, _Subsurface_ indicates the appropriate use of " "cylinders in the dive profile. Below is a multi-cylinder dive, starting off " @@ -3124,19 +3236,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1669 +#: user-manual.txt:1727 #, no-wrap msgid "images/multicylinder_dive.jpg" msgstr "images/multicylinder_dive.jpg" #. type: Title ==== -#: user-manual.txt:1671 +#: user-manual.txt:1729 #, no-wrap msgid "Sidemount dives" msgstr "" #. type: Plain text -#: user-manual.txt:1677 +#: user-manual.txt:1735 msgid "" "Sidemount diving is just another form of multicylinder diving, often with " "both or all cylinders having the same gas mixture. Although it is a popular " @@ -3147,7 +3259,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1686 +#: user-manual.txt:1744 #, no-wrap msgid "" "*During the dive, record cylinder switch events*. Since sidemount diving normally involves two\n" @@ -3161,16 +3273,16 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1689 +#: user-manual.txt:1747 #, no-wrap msgid "" "*Within _Subsurface_ describe the cylinders used during the dive*. The diver needs to provide the\n" -"specifications of the different cylinders, using the *Equipment* tab of the *Dive Info Panel* (see\n" +"specifications of the different cylinders, using the *Equipment* tab of the *Info Panel* (see\n" "image below where two 12 litre cylinder were used).\n" msgstr "" #. type: Plain text -#: user-manual.txt:1699 +#: user-manual.txt:1757 #, no-wrap msgid "" "*Indicate cylinder change events on the _Subsurface_ dive profile*. Once the dive log has been imported\n" @@ -3182,36 +3294,36 @@ msgid "" "profile with a cylinder symbol. If the *Tank Bar* is activated using the toolbar to the left of the\n" "profile, then the cylinder change is also indicated on the Tank Bar (see image below). After all\n" "the cylinder change events have been recorded on the dive profile, the correct cylinder pressures\n" -"for both cylinders are shown on the dive profile, as inthe image below.\n" +"for both cylinders are shown on the dive profile, as in the image below.\n" msgstr "" #. type: Target for macro image -#: user-manual.txt:1700 +#: user-manual.txt:1758 #, no-wrap msgid "images/sidemount1.jpg" msgstr "images/sidemount1.jpg" #. type: Plain text -#: user-manual.txt:1703 +#: user-manual.txt:1761 msgid "" -"This section gives an example of the versatility of _Subsurface_ as a give " +"This section gives an example of the versatility of _Subsurface_ as a dive " "logging tool." msgstr "" #. type: Title ==== -#: user-manual.txt:1706 +#: user-manual.txt:1764 #, no-wrap msgid "Semi-closed circuit rebreather (SCR) dives" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1708 +#: user-manual.txt:1766 #, no-wrap msgid "images/halcyon_RB80.jpg" msgstr "images/halcyon_RB80.jpg" #. type: Plain text -#: user-manual.txt:1718 +#: user-manual.txt:1776 msgid "" "Passive semi-closed rebreathers (pSCR) comprise a technical advance in " "diving equipment that recirculates the breathing gas that a diver breathes, " @@ -3227,19 +3339,19 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1720 +#: user-manual.txt:1778 msgid "" "To log pSCR dives, no special procedures are required, just the normal steps " "outlined above:" msgstr "" #. type: Plain text -#: user-manual.txt:1722 -msgid "Select pSCR in the _Dive Mode_ dropdown list on the *Dive Info* panel." +#: user-manual.txt:1780 +msgid "Select pSCR in the _Dive Mode_ dropdown list on the *Info* panel." msgstr "" #. type: Plain text -#: user-manual.txt:1726 +#: user-manual.txt:1784 msgid "" "pSCR diving often involves gas changes, requiring an additional cylinder. " "Define all the appropriate cylinders as described above and indicate the " @@ -3248,35 +3360,35 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1731 +#: user-manual.txt:1789 msgid "" "If a pSCR _Dive Mode_ has been selected, the dive ceiling for pSCR dives is " -"adjusted for the oxygen drop accross the mouthpiece which often requires " +"adjusted for the oxygen drop across the mouthpiece which often requires " "longer decompression periods. Below is a dive profile of a pSCR dive using " "EAN36 on the back cylinder and oxygen for decompression. Note that this dive " "lasted over two hours." msgstr "" #. type: Target for macro image -#: user-manual.txt:1732 +#: user-manual.txt:1790 #, no-wrap msgid "images/pSCR_profile.jpg" msgstr "images/pSCR_profile.jpg" #. type: Title ==== -#: user-manual.txt:1737 +#: user-manual.txt:1795 #, no-wrap msgid "Closed circuit rebreather (CCR) dives" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1739 +#: user-manual.txt:1797 #, no-wrap msgid "images/APD.jpg" msgstr "images/APD.jpg" #. type: Plain text -#: user-manual.txt:1744 +#: user-manual.txt:1802 msgid "" "Closed system rebreathers use advanced technology to recirculate gas that " "has been breathed while doing two things to maintain a breathable oxygen " @@ -3284,12 +3396,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1745 +#: user-manual.txt:1803 msgid "remove carbon dioxide from the gas that has been exhaled" msgstr "" #. type: Plain text -#: user-manual.txt:1754 +#: user-manual.txt:1812 msgid "" "regulate the oxygen concentration to remain within safe diving limits. " "Currently, within _Subsurface_, the Poseidon MkVI Discovery is the best " @@ -3303,13 +3415,13 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1755 +#: user-manual.txt:1813 #, no-wrap msgid "Import a CCR dive" msgstr "" #. type: Plain text -#: user-manual.txt:1768 +#: user-manual.txt:1826 msgid "" "See the section dealing with xref:S_ImportingAlienDiveLogs[Importing dive " "information from other digital sources]. From the main menu of _Subsurface_, " @@ -3326,13 +3438,13 @@ msgid "" msgstr "" #. type: Title ===== -#: user-manual.txt:1769 +#: user-manual.txt:1827 #, no-wrap msgid "Displayed information for a CCR dive" msgstr "" #. type: Plain text -#: user-manual.txt:1779 +#: user-manual.txt:1837 msgid "" "_Partial pressures of gases_: The graph of oxygen partial pressure shows the " "information from the oxygen sensors of the CCR equipment. In contrast to " @@ -3346,12 +3458,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1781 +#: user-manual.txt:1839 msgid "For TWO O~2~ sensors the mean value of the two sensors are given." msgstr "" #. type: Plain text -#: user-manual.txt:1785 +#: user-manual.txt:1843 msgid "" "For THREE-sensor systems (e.g. APD), the mean value is also used. However " "differences of more than 0,1 bar in the simultaneous readings of different " @@ -3360,19 +3472,19 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1787 +#: user-manual.txt:1845 msgid "" "If no sensor data is available, the pO~2~ value is assumed to be equal to " "the setpoint." msgstr "" #. type: Plain text -#: user-manual.txt:1789 +#: user-manual.txt:1847 msgid "The mean pO~2~ of the sensors is indicated with a green line," msgstr "" #. type: Plain text -#: user-manual.txt:1797 +#: user-manual.txt:1855 msgid "" "The oxygen setpoint values as well as the readings from the individual " "oxygen sensors can be shown. The display of additional CCR information is " @@ -3384,13 +3496,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1798 +#: user-manual.txt:1856 #, no-wrap msgid "images/CCR_preferences_f20.jpg" msgstr "images/CCR_preferences_f20.jpg" #. type: Plain text -#: user-manual.txt:1805 +#: user-manual.txt:1863 msgid "" "Checking any of the check boxes allows the display of additional oxygen-" "related information whenever the pO~2~ toolbar button on the _Profile_ panel " @@ -3401,13 +3513,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1806 +#: user-manual.txt:1864 #, no-wrap msgid "images/CCR_setpoint_f20.jpg" msgstr "images/CCR_setpoint_f20.jpg" #. type: Plain text -#: user-manual.txt:1810 +#: user-manual.txt:1868 msgid "" "The second checkbox allows the display of the data from each individual " "oxygen sensor of the CCR equipment. The data for each sensor is colour-coded " @@ -3415,22 +3527,22 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1812 +#: user-manual.txt:1870 msgid "Sensor 1: grey" msgstr "" #. type: Plain text -#: user-manual.txt:1813 +#: user-manual.txt:1871 msgid "Sensor 2: blue" msgstr "" #. type: Plain text -#: user-manual.txt:1814 +#: user-manual.txt:1872 msgid "Sensor 3: brown" msgstr "" #. type: Plain text -#: user-manual.txt:1818 +#: user-manual.txt:1876 msgid "" "The mean oxygen pO~2~ is indicated by the green line. This allows the direct " "comparison of data from each of the oxygen sensors, useful for detecting " @@ -3438,13 +3550,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1819 +#: user-manual.txt:1877 #, no-wrap msgid "images/CCR_sensor_data_f20.jpg" msgstr "images/CCR_sensor_data_f20.jpg" #. type: Plain text -#: user-manual.txt:1824 +#: user-manual.txt:1882 msgid "" "The setpoint data can be overlaid on the oxygen sensor data by activating " "both of the above check boxes. Partial pressures for nitrogen (and helium, " @@ -3452,7 +3564,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1828 +#: user-manual.txt:1886 msgid "" "_Events_: Several events are logged, e.g. switching the mouthpiece to open " "circuit. These events are indicated by yellow triangles and, if one hovers " @@ -3461,26 +3573,26 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1836 +#: user-manual.txt:1894 msgid "" "_Cylinder pressures_: Some CCR dive computers like the Poseidon MkVI record " "the pressures of the oxygen and diluent cylinders. The pressures of these " "two cylinders are shown as green lines overlapping the depth profile. In " "addition, start and end pressures for both oxygen and diluent cylinders are " "shown in the _Equipment Tab_. Below is a dive profile for a CCR dive, " -"including an overaly of setpoint and oxygen sensor data, as well as the " +"including an overlay of setpoint and oxygen sensor data, as well as the " "cylinder pressure data. In this case there is good agreement from the " "readings of the two oxygen sensors." msgstr "" #. type: Target for macro image -#: user-manual.txt:1837 +#: user-manual.txt:1895 #, no-wrap msgid "images/CCR_dive_profile_f20.jpg" msgstr "images/CCR_dive_profile_f20.jpg" #. type: Plain text -#: user-manual.txt:1842 +#: user-manual.txt:1900 msgid "" "_Equipment-specific information_: Equipment-specific information gathered by " "_Subsurface_ is shown in the xref:S_ExtraDataTab[Extra data tab]. This may " @@ -3488,7 +3600,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1845 +#: user-manual.txt:1903 msgid "" "More equipment-specific information for downloading CCR dive logs for " "Poseidon MkVI and APD equipment can be found in xref:S_PoseidonMkVI[Appendix " @@ -3496,29 +3608,29 @@ msgid "" msgstr "" #. type: Title == -#: user-manual.txt:1846 +#: user-manual.txt:1904 #, no-wrap msgid "Obtaining more information about dives entered into the logbook" msgstr "" #. type: Title === -#: user-manual.txt:1848 +#: user-manual.txt:1906 #, no-wrap -msgid "The *Dive Info* tab (for individual dives)" +msgid "The *Info* tab (for individual dives)" msgstr "" #. type: Plain text -#: user-manual.txt:1855 +#: user-manual.txt:1913 msgid "" -"The Dive Info tab gives some summary information about a particular dive " -"that has been selected in the *Dive List*. Useful information here includes " -"the surface interval before the dive, the maximum and mean depths of the " -"dive, the gas volume consumed, the surface air consumption (SAC) and the " -"number of oxygen toxicity units (OTU) incurred." +"The Info tab gives some summary information about a particular dive that has " +"been selected in the *Dive List*. Useful information here includes the " +"surface interval before the dive, the maximum and mean depths of the dive, " +"the gas volume consumed, the surface air consumption (SAC) and the number of " +"oxygen toxicity units (OTU) incurred." msgstr "" #. type: Plain text -#: user-manual.txt:1862 +#: user-manual.txt:1920 msgid "" "Gas consumption and SAC calculations: _Subsurface_ calculates SAC and Gas " "consumption taking in account gas incompressibility, particularly at tank " @@ -3527,13 +3639,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:1864 +#: user-manual.txt:1922 #, no-wrap msgid "The *Extra Data* tab (usually for individual dives)" msgstr "" #. type: Plain text -#: user-manual.txt:1872 +#: user-manual.txt:1930 msgid "" "When using a dive computer, it often reports several data items that cannot " "easily be presented in a standardised way because the nature of the " @@ -3545,19 +3657,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1873 +#: user-manual.txt:1931 #, no-wrap msgid "images/ExtraDataTab_f20.jpg" msgstr "images/ExtraDataTab_f20.jpg" #. type: Title === -#: user-manual.txt:1875 +#: user-manual.txt:1933 #, no-wrap msgid "The *Stats* tab (for groups of dives)" msgstr "" #. type: Plain text -#: user-manual.txt:1886 +#: user-manual.txt:1944 msgid "" "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 " @@ -3570,19 +3682,19 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:1888 +#: user-manual.txt:1946 #, no-wrap msgid "The *Dive Profile*" msgstr "" #. type: Target for macro image -#: user-manual.txt:1890 +#: user-manual.txt:1948 #, no-wrap msgid "images/Profile2.jpg" msgstr "images/Profile2.jpg" #. type: Plain text -#: user-manual.txt:1901 +#: user-manual.txt:1959 msgid "" "Of all the panels in _Subsurface_, the Dive Profile contains the most " "detailed information about each dive. The Dive Profile has a *button bar* on " @@ -3595,7 +3707,7 @@ msgid "" msgstr "" #. type: delimited block | -#: user-manual.txt:1908 +#: user-manual.txt:1966 #, no-wrap msgid "" "|*Colour*|*Descent speed (m/min)*|*Ascent speed (m/min)*\n" @@ -3613,7 +3725,7 @@ msgstr "" "|Vert foncé|< 1.5|< 1.5\n" #. type: Plain text -#: user-manual.txt:1913 +#: user-manual.txt:1971 msgid "" "The profile also includes depth readings for the peaks and troughs in the " "graph. Thus, users should see the depth of the deepest point and other " @@ -3622,13 +3734,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1914 +#: user-manual.txt:1972 #, no-wrap msgid "images/icons/scale.jpg" msgstr "images/icons/scale.jpg" #. type: Plain text -#: user-manual.txt:1919 +#: user-manual.txt:1977 msgid "" "In some cases the dive profile does not fill the whole area of the *Dive " "Profile* panel. Clicking the *Scale* button in the toolbar on the left of " @@ -3637,7 +3749,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1922 +#: user-manual.txt:1980 #, no-wrap msgid "" "*Water temperature* is displayed with its own blue line with temperature values\n" @@ -3645,7 +3757,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1929 +#: user-manual.txt:1987 msgid "" "The dive profile can include graphs of the *partial pressures* of O2, N2, " "and He during the dive (see figure above) as well as a calculated and dive " @@ -3656,13 +3768,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1930 +#: user-manual.txt:1988 #, no-wrap msgid "images/icons/O2.jpg" msgstr "images/icons/O2.jpg" #. type: Plain text -#: user-manual.txt:1934 +#: user-manual.txt:1992 msgid "" "Clicking this button allows display of the partial pressure of *oxygen* " "during the dive. This is depicted below the dive depth and water temperature " @@ -3670,26 +3782,26 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1935 +#: user-manual.txt:1993 #, no-wrap msgid "images/icons/N2.jpg" msgstr "images/icons/N2.jpg" #. type: Plain text -#: user-manual.txt:1938 +#: user-manual.txt:1996 msgid "" "Clicking this button allows display of the partial pressure of *nitrogen* " "during the dive." msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1939 +#: user-manual.txt:1997 #, no-wrap msgid "images/icons/He.jpg" msgstr "images/icons/He.jpg" #. type: Plain text -#: user-manual.txt:1943 +#: user-manual.txt:2001 msgid "" "Clicking this button allows display of the partial pressure of *helium* " "during the dive. This is only of importance to divers using Trimix, " @@ -3697,7 +3809,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1956 +#: user-manual.txt:2014 msgid "" "The *air consumption* graph displays the tank pressure and its change during " "the dive. The air consumption takes depth into account so that even when " @@ -3712,13 +3824,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1957 +#: user-manual.txt:2015 #, no-wrap msgid "images/icons/Heartbutton.png" msgstr "images/icons/Heartbutton.png" #. type: Plain text -#: user-manual.txt:1961 +#: user-manual.txt:2019 msgid "" "Clicking on the heart rate button will allow the display of heart rate " "information during the dive if the dive computer was attached to a heart " @@ -3726,7 +3838,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:1969 +#: user-manual.txt:2027 #, no-wrap msgid "" "It is possible to *zoom* into the profile graph. This is done either by using\n" @@ -3739,19 +3851,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:1970 +#: user-manual.txt:2028 #, no-wrap msgid "images/MeasuringBar.png" msgstr "images/MeasuringBar.png" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1972 +#: user-manual.txt:2030 #, no-wrap msgid "images/icons/ruler.jpg" msgstr "images/icons/ruler.jpg" #. type: Plain text -#: user-manual.txt:1980 +#: user-manual.txt:2038 msgid "" "Measurements of *depth or time differences* can be achieved by using the " "*ruler button* on the left of the dive profile panel. The measurement is " @@ -3761,13 +3873,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:1981 +#: user-manual.txt:2039 #, no-wrap msgid "images/icons/ShowPhotos.png" msgstr "images/icons/ShowPhotos.png" #. type: Plain text -#: user-manual.txt:1988 +#: user-manual.txt:2046 msgid "" "Photographs that have been added to a dive can be shown on the profile by " "selecting the *Show-photo* button. The position of a photo on the profile " @@ -3776,7 +3888,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2017 +#: user-manual.txt:2075 msgid "" "The profile can also include the dive computer reported *ceiling* (more " "precisely, the deepest deco stop that the dive computer calculated for each " @@ -3806,13 +3918,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2018 +#: user-manual.txt:2076 #, no-wrap msgid "images/icons/cceiling.jpg" msgstr "images/icons/cceiling.jpg" #. type: Plain text -#: user-manual.txt:2023 +#: user-manual.txt:2081 msgid "" "If the dive computer itself calculates a ceiling and makes it available to " "_Subsurface_ during upload of dives, this can be shown as a red area by " @@ -3820,13 +3932,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2024 +#: user-manual.txt:2082 #, no-wrap msgid "images/icons/ceiling1.jpg" msgstr "images/icons/ceiling1.jpg" #. type: Plain text -#: user-manual.txt:2029 +#: user-manual.txt:2087 msgid "" "If the *Calculated ceiling* button on the Profile Panel is clicked, then a " "ceiling, calculated by _Subsurface_, is shown in green if it exists for a " @@ -3835,13 +3947,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2030 +#: user-manual.txt:2088 #, no-wrap msgid "images/icons/ceiling2.jpg" msgstr "images/icons/ceiling2.jpg" #. type: Plain text -#: user-manual.txt:2034 +#: user-manual.txt:2092 msgid "" "If, in addition, the *show all tissues* button on the Profile Panel is " "clicked, the ceiling is shown for the tissue compartments following the " @@ -3849,32 +3961,32 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2035 +#: user-manual.txt:2093 #, no-wrap msgid "images/icons/ceiling3.jpg" msgstr "images/icons/ceiling3.jpg" #. type: Plain text -#: user-manual.txt:2039 +#: user-manual.txt:2097 msgid "" "If, in addition, the *3m increments* button on the Profile Panel is clicked, " "then the ceiling is indicated in 3 m increments (*C* in figure below)." msgstr "" #. type: Target for macro image -#: user-manual.txt:2040 +#: user-manual.txt:2098 #, no-wrap msgid "images/Ceilings2.jpg" msgstr "images/Ceilings2.jpg" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2042 +#: user-manual.txt:2100 #, no-wrap msgid "images/icons/ShowCylindersButton.jpg" msgstr "images/icons/ShowCylindersButton.jpg" #. type: Plain text -#: user-manual.txt:2048 +#: user-manual.txt:2106 msgid "" "By selecting this icon, the different cylinders used during a dive can be " "represented as a coloured bar at the bottom of the *Dive Profile*. In " @@ -3886,19 +3998,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2049 +#: user-manual.txt:2107 #, no-wrap msgid "images/ShowCylinders_f20.jpg" msgstr "images/ShowCylinders_f20.jpg" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2052 +#: user-manual.txt:2110 #, no-wrap msgid "images/tissues.jpg" msgstr "images/tissues.jpg" #. type: Plain text -#: user-manual.txt:2064 +#: user-manual.txt:2122 msgid "" "Display inert gas tissue pressures relative to ambient inert gas pressure " "(horizontal grey line). Tissue pressures are calculated using the Bühlmann " @@ -3917,13 +4029,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2065 +#: user-manual.txt:2123 #, no-wrap msgid "images/tissuesGraph.jpg" msgstr "images/tissuesGraph.jpg" #. type: Plain text -#: user-manual.txt:2073 +#: user-manual.txt:2131 msgid "" "Gradient Factor settings strongly affect the calculated ceilings and their " "depths. For more information about Gradient factors, see the section on " @@ -3936,25 +4048,25 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2075 +#: user-manual.txt:2133 #, no-wrap msgid " ** http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding M-values by Erik Baker, _Immersed_ Vol. 3, No. 3.]\n" msgstr " ** http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding M-values by Erik Baker, _Immersed_ Vol. 3, No. 3.]\n" #. type: Plain text -#: user-manual.txt:2077 +#: user-manual.txt:2135 #, no-wrap msgid " ** link:http://www.rebreatherworld.com/general-and-new-to-rebreather-articles/5037-gradient-factors-for-dummies.html[Gradient factors for dummies, by Kevin Watts]\n" msgstr " ** link:http://www.rebreatherworld.com/general-and-new-to-rebreather-articles/5037-gradient-factors-for-dummies.html[Gradient factors for dummies, by Kevin Watts]\n" #. type: Title === -#: user-manual.txt:2079 +#: user-manual.txt:2137 #, no-wrap msgid "The Dive Profile context menu" msgstr "" #. type: Plain text -#: user-manual.txt:2097 +#: user-manual.txt:2155 msgid "" "The context menu for the Dive Profile is accessed by right-clicking while " "the mouse cursor is over the Dive Profile panel. The menu allows the " @@ -3975,13 +4087,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2099 +#: user-manual.txt:2157 #, no-wrap msgid "The *Information Box*" msgstr "" #. type: Plain text -#: user-manual.txt:2109 +#: user-manual.txt:2167 msgid "" "The Information box displays a large range of information pertaining to the " "dive profile. Normally the Information Box is located to the top left of the " @@ -3994,13 +4106,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2110 +#: user-manual.txt:2168 #, no-wrap msgid "images/InfoBox2.jpg" msgstr "images/InfoBox2.jpg" #. type: Plain text -#: user-manual.txt:2127 +#: user-manual.txt:2185 msgid "" "The moment the mouse points inside the *Dive Profile* panel, the information " "box expands and shows many data items. In this situation, the data reflect " @@ -4021,20 +4133,20 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2130 +#: user-manual.txt:2188 msgid "" "The user has control over the display of several statistics, represented as " "four buttons on the left of the profile panel. These are:" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2131 +#: user-manual.txt:2189 #, no-wrap msgid "images/icons/MOD.jpg" msgstr "images/icons/MOD.jpg" #. type: Plain text -#: user-manual.txt:2138 +#: user-manual.txt:2196 msgid "" "Clicking this button causes the Information Box to display the *Maximum " "Operating Depth (MOD)* of the dive, given the gas mixture used. MOD is " @@ -4044,13 +4156,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2139 +#: user-manual.txt:2197 #, no-wrap msgid "images/icons/NDL.jpg" msgstr "images/icons/NDL.jpg" #. type: Plain text -#: user-manual.txt:2148 +#: user-manual.txt:2206 msgid "" "Clicking this button causes the Information Box to display the *No-deco " "Limit (NDL)* or the *Total Time to Surface (TTS)*. NDL is the time duration " @@ -4063,13 +4175,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2149 +#: user-manual.txt:2207 #, no-wrap msgid "images/icons/SAC.jpg" msgstr "images/icons/SAC.jpg" #. type: Plain text -#: user-manual.txt:2158 +#: user-manual.txt:2216 msgid "" "Clicking this button causes the Information Box to display the *Surface Air " "Consumption (SAC)*. SAC is an indication of the surface-normalised " @@ -4082,13 +4194,13 @@ msgid "" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:2159 +#: user-manual.txt:2217 #, no-wrap msgid "images/icons/EAD.jpg" msgstr "images/icons/EAD.jpg" #. type: Plain text -#: user-manual.txt:2174 +#: user-manual.txt:2232 msgid "" "Clicking this button displays the *Equivalent Air Depth (EAD)* for nitrox " "dives as well as the *Equivalent Narcotic Depth (END)* for trimix dives. " @@ -4097,27 +4209,27 @@ msgid "" "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 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." +"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 equaling the END." msgstr "" #. type: Plain text -#: user-manual.txt:2176 +#: user-manual.txt:2234 msgid "" "Figure (*B*) above shows an information box with a nearly complete set of " "data." msgstr "" #. type: Title ==== -#: user-manual.txt:2178 +#: user-manual.txt:2236 #, no-wrap msgid "The Gas Pressure Bar Graph" msgstr "" #. type: Plain text -#: user-manual.txt:2185 +#: user-manual.txt:2243 msgid "" "On the left of the *Information Box* is a vertical bar graph indicating the " "pressures of the nitrogen (and other inert gases, e.g. helium, if " @@ -4128,13 +4240,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2186 +#: user-manual.txt:2244 #, no-wrap msgid "images/GasPressureBarGraph.jpg" msgstr "images/GasPressureBarGraph.jpg" #. type: Plain text -#: user-manual.txt:2192 +#: user-manual.txt:2250 msgid "" "The light green area indicates the total gas, with the top margin of the " "light green area indicating the total gas pressure inhaled by the diver and " @@ -4144,7 +4256,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2198 +#: user-manual.txt:2256 msgid "" "The horizontal black line underneath the light green margin indicates the " "equilibrium pressure of the inert gases inhaled by the diver, usually " @@ -4155,7 +4267,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2202 +#: user-manual.txt:2260 msgid "" "The dark green area at the bottom of the graph represents the pressures of " "inert gas in each of the 16 tissue compartments, following the Bühlmann " @@ -4163,7 +4275,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2207 +#: user-manual.txt:2265 msgid "" "The top black horizontal line indicates the gradient factor that applies to " "the depth of the diver at the particular point on the *Dive Profile*. The " @@ -4172,7 +4284,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2211 +#: user-manual.txt:2269 msgid "" "The bottom margin of the red area in the graph indicates the Bühlman-derived " "M-value, that is the pressure value of inert gases at which bubble formation " @@ -4180,7 +4292,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2214 +#: user-manual.txt:2272 msgid "" "These five values are indicated on the left in the graph above. The way the " "Gas Pressure Bar Graph changes during a dive is indicated on the right hand " @@ -4188,7 +4300,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2217 +#: user-manual.txt:2275 msgid "" "Graph *A* indicates the situation at the start of a dive with diver at the " "surface. The pressures in all the tissue compartments are still at the " @@ -4196,7 +4308,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2220 +#: user-manual.txt:2278 msgid "" "Graph *B* indicates the situation after a descent to 30 meters. Few of the " "tissue compartments have had time to respond to the descent, their gas " @@ -4204,7 +4316,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2225 +#: user-manual.txt:2283 msgid "" "Graph *C* represents the pressures after 30 minutes at 30 m. The fast " "compartments have attained equilibrium (i.e. they have reached the hight of " @@ -4214,7 +4326,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2231 +#: user-manual.txt:2289 msgid "" "Graph *D* shows the pressures after ascent to a depth of 4.5 meters. Since, " "during ascent, the total inhaled gas pressure has decreased strongly from 4 " @@ -4225,7 +4337,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2236 +#: user-manual.txt:2294 msgid "" "Graph *E* indicates the situation after remaining at 4.5 meters for 10 " "minutes. The fast compartments have decreased in pressure. As expected, the " @@ -4235,50 +4347,50 @@ msgid "" msgstr "" #. type: Title == -#: user-manual.txt:2239 +#: user-manual.txt:2297 #, no-wrap msgid "Organising the logbook (Manipulating groups of dives)" msgstr "" #. type: Title === -#: user-manual.txt:2241 +#: user-manual.txt:2299 #, no-wrap msgid "The Dive List context menu" msgstr "" #. type: Plain text -#: user-manual.txt:2246 +#: user-manual.txt:2303 msgid "" -"Many actions within _Subsurface_ are dependent on a context menu used mostly " -"to manipulate groups of dives. The context menu is found by selecting a dive " -"or a group of dives and then right-clicking." +"Several actions on either a single dive or a group of dives can be performed " +"using the Dive List Context Menu, found by selecting either a single dive or " +"a group of dives and then right-clicking." msgstr "" #. type: Target for macro image -#: user-manual.txt:2247 +#: user-manual.txt:2304 #, no-wrap msgid "images/ContextMenu.jpg" msgstr "images/ContextMenu.jpg" #. type: Plain text -#: user-manual.txt:2250 +#: user-manual.txt:2307 msgid "The context menu is used in many manipulations described below." msgstr "" #. type: Title ==== -#: user-manual.txt:2251 +#: user-manual.txt:2308 #, no-wrap msgid "Customising the information showed in the *Dive List* panel" msgstr "" #. type: Target for macro image -#: user-manual.txt:2253 +#: user-manual.txt:2310 #, no-wrap msgid "images/DiveListOptions.jpg" msgstr "images/DiveListOptions.jpg" #. type: Plain text -#: user-manual.txt:2261 +#: user-manual.txt:2318 msgid "" "The default information in the *Dive List* includes, for each dive, " "Dive_number, Date, Rating, Dive_depth, Dive_duration and Dive_location. This " @@ -4292,13 +4404,13 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:2262 +#: user-manual.txt:2319 #, no-wrap msgid "Selecting dives from a particular dive site" msgstr "" #. type: Plain text -#: user-manual.txt:2268 +#: user-manual.txt:2325 msgid "" "Many divers have long dive lists and it may be difficult to locate all the " "dives at a particular site. By pressing _Ctl-F_ on the keyboard, a text box " @@ -4308,13 +4420,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2270 +#: user-manual.txt:2327 #, no-wrap msgid "Renumbering the dives" msgstr "" #. type: Plain text -#: user-manual.txt:2282 +#: user-manual.txt:2339 msgid "" "Dives are normally numbered incrementally from non-recent dives (low " "sequence numbers) to recent dives (having the highest sequence numbers). The " @@ -4329,68 +4441,77 @@ msgid "" "panel." msgstr "" +#. type: Plain text +#: user-manual.txt:2344 +msgid "" +"One can also renumber a few selected dives in the dive list. Select the " +"dives that need renumbering. Right-click on the selected list and use the " +"Dive List Context Menu to perform the renumbering. A popup window appears " +"requiring the user to specify the starting number for the renumbering " +"process." +msgstr "" + #. type: Title === -#: user-manual.txt:2284 +#: user-manual.txt:2346 #, no-wrap msgid "Grouping dives into trips and manipulating trips" msgstr "" #. type: Plain text -#: user-manual.txt:2292 +#: user-manual.txt:2354 msgid "" "For regular divers, the dive list can rapidly become very long. _Subsurface_ " "can group dives into _trips_. It performs this by grouping dives that have " -"date/times that are not separated in time by more than two days, thus " -"creating a single heading for each diving trip represented in the dive log. " -"Below is an ungrouped dive list (*A*, on the left) as well as the " -"corresponding grouped dive list comprising five dive trips (*B*, on the " -"right):" +"date/times not separated in time by more than two days, thus creating a " +"single heading for each diving trip represented in the dive log. Below is an " +"ungrouped dive list (*A*, on the left) as well as the corresponding grouped " +"dive list comprising five dive trips (*B*, on the right):" msgstr "" #. type: Target for macro image -#: user-manual.txt:2293 +#: user-manual.txt:2355 #, no-wrap msgid "images/Group2.jpg" msgstr "images/Group2.jpg" #. type: Plain text -#: user-manual.txt:2299 +#: user-manual.txt:2361 msgid "" "Grouping into trips allows a rapid way of accessing individual dives without " "having to scan a long lists of dives. In order to group the dives in a dive " -"list, (from the Main Menu) users must select _Log -> Autogroup_. The *Dive " -"List* panel now shows only the titles for the trips." +"list, (from the Main Menu) select _Log -> Autogroup_. The *Dive List* panel " +"now shows only the titles for the trips." msgstr "" #. type: Title ==== -#: user-manual.txt:2300 +#: user-manual.txt:2362 #, no-wrap msgid "Editing the title and associated information for a particular trip" msgstr "" #. type: Plain text -#: user-manual.txt:2313 +#: user-manual.txt:2375 msgid "" "Normally, in the dive list, minimal information is included in the trip " "title. More information about a trip can be added by selecting its trip " -"title from the *Dive List*. This shows a *Trip Notes* tab in the *Dive " -"Notes* panel. Here users can add or edit information about the date/time, " -"the trip location and any other general comments about the trip as a whole " -"(e.g. the dive company that was dived with, the general weather and surface " -"conditions during the trip, etc.). After entering this information, users " -"should select *Save* from the buttons at the top right of the *Trip Notes* " -"tab. The trip title in the *Dive List* panel should now reflect some of the " -"edited information." +"title from the *Dive List*. This shows a *Trip Notes* tab in the *Notes* " +"panel. Here users can add or edit information about the date/time, the trip " +"location and any other general comments about the trip as a whole (e.g. the " +"dive company that was dived with, the general weather and surface conditions " +"during the trip, etc.). After entering this information, users should " +"select *Save* from the buttons at the top right of the *Trip Notes* tab. The " +"trip title in the *Dive List* panel should now reflect some of the edited " +"information." msgstr "" #. type: Title ==== -#: user-manual.txt:2314 +#: user-manual.txt:2376 #, no-wrap msgid "Viewing the dives during a particular trip" msgstr "" #. type: Plain text -#: user-manual.txt:2319 +#: user-manual.txt:2381 msgid "" "Once the dives have been grouped into trips, users can expand one or more " "trips by clicking the arrow-head on the left of each trip title. This " @@ -4399,42 +4520,42 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:2320 +#: user-manual.txt:2382 #, no-wrap msgid "Collapsing or expanding dive information for different trips" msgstr "" #. type: Plain text -#: user-manual.txt:2326 +#: user-manual.txt:2388 msgid "" -"If a user right-clicks after selecting a particular trip in the dive list, " -"the resulting context menu allows several possibilities to expand or " -"collapse dives within trips. This includes expanding all trips, collapsing " -"all trips and collapsing all trips except the selected one." +"After selecting a particular trip in the dive list, the context menu allows " +"several possibilities to expand or collapse dives within trips. This " +"includes expanding all trips, collapsing all trips and collapsing all trips " +"except the selected one." msgstr "" #. type: Title ==== -#: user-manual.txt:2327 +#: user-manual.txt:2389 #, no-wrap msgid "Merging dives from more than one trip into a single trip" msgstr "" #. type: Plain text -#: user-manual.txt:2332 +#: user-manual.txt:2394 msgid "" -"By right-clicking on a selected trip title in the *Dive List* panel, a " -"context menu shows up that allows the merging of trips by either merging of " -"the selected trip with the trip below or with the trip above." +"After selecting a trip title, the context menu allows the merging of trips " +"by either merging the selected trip with the trip below or with the trip " +"above.(Merge trip with trip below; Merge trip with trip above)" msgstr "" #. type: Title ==== -#: user-manual.txt:2333 +#: user-manual.txt:2395 #, no-wrap msgid "Splitting a single trip into more than one trip" msgstr "" #. type: Plain text -#: user-manual.txt:2343 +#: user-manual.txt:2405 msgid "" "If a trip includes five dives, the user can split this trip into two trips " "(trip 1: top 3 dives; trip 2: bottom 2 dives) by selecting and right-" @@ -4446,25 +4567,25 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2344 +#: user-manual.txt:2406 #, no-wrap msgid "images/SplitDive3a.jpg" msgstr "images/SplitDive3a.jpg" #. type: Title === -#: user-manual.txt:2346 +#: user-manual.txt:2408 #, no-wrap msgid "Manipulating single dives" msgstr "" #. type: Title ==== -#: user-manual.txt:2348 +#: user-manual.txt:2410 #, no-wrap msgid "Delete a dive from the dive log" msgstr "" #. type: Plain text -#: user-manual.txt:2355 +#: user-manual.txt:2417 msgid "" "Dives can be permanently deleted from the dive log by selecting and right-" "clicking them to bring up the context menu, and then selecting *Delete " @@ -4474,43 +4595,43 @@ msgid "" msgstr "" #. type: Title ==== -#: user-manual.txt:2356 +#: user-manual.txt:2418 #, no-wrap msgid "Unlink a dive from a trip" msgstr "" #. type: Plain text -#: user-manual.txt:2363 +#: user-manual.txt:2425 msgid "" "Users can unlink dives from the trip to which they belong. In order to do " "this, select and right-click the relevant dives to bring up the context " "menu. Then select the option *Remove dive(s) from trip*. The dive(s) now " -"appear immediately above the trip to which they belonged." +"appear immediately above or below the trip to which they belonged, depending " +"on the date and time of the unliked dive." msgstr "" #. type: Title ==== -#: user-manual.txt:2364 +#: user-manual.txt:2426 #, no-wrap msgid "Add a dive to the trip immediately above" msgstr "" #. type: Plain text -#: user-manual.txt:2371 +#: user-manual.txt:2431 msgid "" "Selected dives can be moved from the trip to which they belong and placed " -"within the trip immediately above the currently active trip. To do this, " -"select and right-click the dive(s) to bring up the context menu, and then " -"select *Add dive(s) to trip immediately above*." +"within a separate trip. To do this, select and right-click the dive(s) to " +"bring up the context menu, and then select *Create new trip above*." msgstr "" #. type: Title ==== -#: user-manual.txt:2372 +#: user-manual.txt:2432 #, no-wrap msgid "Shift the start time of dive(s)" msgstr "" #. type: Plain text -#: user-manual.txt:2383 +#: user-manual.txt:2443 msgid "" "Sometimes it is necessary to adjust the start time of a dive. This may apply " "to situations where dives are performed in different time zones or when the " @@ -4519,17 +4640,17 @@ msgid "" "context menu on which the *Shift times* option should be selected. User must " "then specify the time (in hours and minutes) by which the dives should be " "adjusted and click on the option indicating whether the time adjustment " -"should be forwards or backwards." +"should be ealier or later." msgstr "" #. type: Title ==== -#: user-manual.txt:2384 +#: user-manual.txt:2444 #, no-wrap msgid "Merge dives into a single dive" msgstr "" #. type: Plain text -#: user-manual.txt:2394 +#: user-manual.txt:2454 msgid "" "Sometimes a dive is briefly interrupted, e.g. if a diver returns to the " "surface for a few minutes, resulting in two or more dives being recorded by " @@ -4537,25 +4658,41 @@ msgid "" "Users can merge these dives onto a single dive by selecting the appropriate " "dives, right-clicking them to bring up the context menu and then selecting " "*Merge selected dives*. It may be necessary to edit the dive information in " -"the *Dive Notes* panel to reflect events or conditions that apply to the " -"merged dive. The figure below shows the depth profile of two such dives that " -"were merged:" +"the *Notes* panel to reflect events or conditions that apply to the merged " +"dive. The figure below shows the depth profile of two such dives that were " +"merged:" msgstr "" #. type: Target for macro image -#: user-manual.txt:2395 +#: user-manual.txt:2455 #, no-wrap msgid "images/MergedDive.png" msgstr "images/MergedDive.png" +#. type: Title ==== +#: user-manual.txt:2457 +#, no-wrap +msgid "Undo dive manipulations" +msgstr "" + +#. type: Plain text +#: user-manual.txt:2463 +msgid "" +"Important actions on dives or trips, described above, can be undone or " +"redone. This includes: _delete dives_, _merge dives_, _renumber dives_ and " +"_shift dive times_. To do this after performing any of these actions, from " +"the *Main Menu* select _Edit_. This brings up the possibility to _Undo_ or " +"_Redo_ an action." +msgstr "" + #. type: Title === -#: user-manual.txt:2398 +#: user-manual.txt:2466 #, no-wrap msgid "Filtering the dive list" msgstr "" #. type: Plain text -#: user-manual.txt:2404 +#: user-manual.txt:2472 msgid "" "The dives in the *Dive List* panel can be filtered, that is, one can select " "only some of the dives based on their attributes, e.g. dive tags, dive site, " @@ -4565,27 +4702,27 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2413 +#: user-manual.txt:2481 msgid "" "To open the filter, select _Log -> Filter divelist_ from the main menu. This " "opens the _Filter Panel_ at the top of the _Subsurface_ window. Three icons " "are located at the top right hand of the filter panel. The _Filter Panel_ " -"can be reset (i.e. all current filters cleared) by selecting the *+*. The " -"_Filter Panel_ may also be minimised by selecting the middle icon. When " -"minimised, only these three icons are shown. The panel can be maximised by " -"clicking the icon that minimised the panel. The filter may also be reset and " -"closed by selecting the button with the flag. An example of the _Filter " -"Panel_ is shown in the figure below." +"can be reset (i.e. all current filters cleared) by selecting the *yellow " +"angled arrow*. The _Filter Panel_ may also be minimised by selecting the " +"*green up-arrow\". When minimised, only these three icons are shown. The " +"panel can be maximised by clicking the icon that minimised the panel. The " +"filter may also be reset and closed by selecting the *red button* with the " +"white cross. An example of the _Filter Panel_ is shown in the figure below." msgstr "" #. type: Target for macro image -#: user-manual.txt:2414 +#: user-manual.txt:2482 #, no-wrap msgid "images/Filterpanel.jpg" msgstr "images/Filterpanel.jpg" #. type: Plain text -#: user-manual.txt:2423 +#: user-manual.txt:2491 msgid "" "Four filter criteria may be used to filter the dive list: dive tags, person " "(buddy / dive master), dive site and dive suit, each of which is represented " @@ -4598,37 +4735,36 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2431 +#: user-manual.txt:2499 msgid "" -"To activate filtering of the dive list, the check box of at least one item " -"in one of the four check lists needs to be checked. The dive list is then " -"shortened to include only the dives that pertain to the selection criteria " -"specified in the check lists. The four check lists work as a filter with " -"_AND_ operators, Subsurface filters therefore for _cave_ as a tag AND _Joe " -"Smith_ as a buddy; but the filters within a category are inclusive - " -"filtering for _cave_ and _boat_ shows those dives that have either one or " -"both of these tags." +"To activate filtering of the dive list, check at least tone check box in one " +"of the four check lists. The dive list is then shortened to include only the " +"dives that pertain to the criteria specified in the check lists. The four " +"check lists work as a filter with _AND_ operators, Subsurface filters " +"therefore for _cave_ as a tag AND _Joe Smith_ as a buddy; but the filters " +"within a category are inclusive - filtering for _cave_ and _boat_ shows " +"those dives that have either one OR both of these tags." msgstr "" #. type: Title == -#: user-manual.txt:2433 +#: user-manual.txt:2501 #, no-wrap msgid "Exporting the dive log or parts of the dive log" msgstr "" #. type: Plain text -#: user-manual.txt:2436 +#: user-manual.txt:2504 msgid "" "There are two routes for the export of dive information from Subsurface:" msgstr "" #. type: Plain text -#: user-manual.txt:2438 +#: user-manual.txt:2506 msgid "Export dive information to _Facebook_" msgstr "Exporter les informations de plongée vers _Facebook_" #. type: Plain text -#: user-manual.txt:2440 +#: user-manual.txt:2508 msgid "" "xref:S_Export_other[Export dive information to other destinations or formats]" msgstr "" @@ -4636,13 +4772,13 @@ msgstr "" "destinations ou formats]" #. type: Title === -#: user-manual.txt:2442 +#: user-manual.txt:2510 #, no-wrap msgid "Exporting dive information to _Facebook_" msgstr "Export des informations de plongée vers _Facebook_" #. type: Plain text -#: user-manual.txt:2451 +#: user-manual.txt:2519 msgid "" "Export of dives to _Facebook_ is handled differently from other types of " "export. This is because export to _Facebook_ needs a connection to " @@ -4664,19 +4800,19 @@ msgstr "" "connexion _Facebook_." #. type: Target for macro image -#: user-manual.txt:2452 +#: user-manual.txt:2520 #, no-wrap msgid "images/facebook1_f20.jpg" msgstr "images/facebook1_f20.jpg" #. type: Plain text -#: user-manual.txt:2465 +#: user-manual.txt:2533 msgid "" "Having established a login to _Facebook_, transfer of a dive profile to " -"one's _Facebook_ timeline is easy. A _Facebook_ icon appears in the *Dive " -"Notes* panel of _Subsurface_ (See image *A* below). Ensure that the dive " -"that you want to transfer to the timeline is depicted in the _Subsurface_ " -"*Dive Profile* panel. Select the _Facebook_ icon, and a dialogue is shown, " +"one's _Facebook_ timeline is easy. A _Facebook_ icon appears in the *Notes* " +"panel of _Subsurface_ (See image *A* below). Ensure that the dive that you " +"want to transfer to the timeline is depicted in the _Subsurface_ *Dive " +"Profile* panel. Select the _Facebook_ icon, and a dialogue is shown, " "determining the amount of additional information transferred with the dive " "profile (see image *B*, below). In order to transfer a dive profile to " "_Facebook_, the name of a _Facebook_ album needs to be provided. The " @@ -4691,7 +4827,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2472 +#: user-manual.txt:2540 msgid "" "Both the Album created and the post to your time line will be marked as " "private. In order for friends to be able to see the post you have to change " @@ -4701,13 +4837,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2473 +#: user-manual.txt:2541 #, no-wrap msgid "images/facebook2_f20.jpg" msgstr "images/facebook2_f20.jpg" #. type: Plain text -#: user-manual.txt:2476 +#: user-manual.txt:2544 msgid "" "If required, then close the _Facebook_ connection by either closing " "_Subsurface_ or by selecting _File -> Preferences -> Facebook_ from the Main " @@ -4715,13 +4851,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2478 +#: user-manual.txt:2546 #, no-wrap msgid "Export dive information to other destinations or formats" msgstr "" #. type: Plain text -#: user-manual.txt:2483 +#: user-manual.txt:2551 msgid "" "For non-_Facebook exports_, the export function can be reached by selecting " "_File -> Export_, which brings up the Export dialog. This dialog always " @@ -4731,24 +4867,24 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2484 +#: user-manual.txt:2552 #, no-wrap msgid "images/Export_f20.jpg" msgstr "images/Export_f20.jpg" #. type: Plain text -#: user-manual.txt:2487 +#: user-manual.txt:2555 msgid "A dive log or part of it can be saved in three formats:" msgstr "" #. type: Plain text -#: user-manual.txt:2489 +#: user-manual.txt:2557 msgid "" "_Subsurface XML_ format. This is the native format used by _Subsurface_." msgstr "" #. type: Plain text -#: user-manual.txt:2493 +#: user-manual.txt:2561 msgid "" "Universal Dive Data Format (_UDDF_). Refer to _http://uddf.org_ for more " "information. UDDF is a generic format that enables communication among many " @@ -4756,7 +4892,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2497 +#: user-manual.txt:2565 msgid "" "_Divelogs.de_, an Internet-based dive log repository. In order to upload to " "_Divelogs.de_, one needs a user-ID as well as a password for _Divelogs.de_. " @@ -4765,15 +4901,15 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2501 +#: user-manual.txt:2569 msgid "" -"_DiveShare_ is also a dive log repostory on the Internet focusing on the " +"_DiveShare_ is also a dive log repository on the Internet focusing on the " "recreational dives. In order to upload dives one has to provide a used ID, " "so registration with _http://scubadiveshare.com_ is required." msgstr "" #. type: Plain text -#: user-manual.txt:2506 +#: user-manual.txt:2574 msgid "" "_CSV dive details_, that includes the most critical information of the dive " "profile. Included information of a dive is: dive number, date, time, buddy, " @@ -4782,7 +4918,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2509 +#: user-manual.txt:2577 msgid "" "_CSV dive profile_, that includes a large amount of detail for each dive, " "including the depth profile, temperature and pressure information of each " @@ -4790,7 +4926,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2521 +#: user-manual.txt:2589 msgid "" "_HTML_ format, in which the dive(s) are stored in HTML files, readable with " "an Internet browser. Most modern web browsers are supported, but JavaScript " @@ -4805,7 +4941,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2526 +#: user-manual.txt:2594 msgid "" "_Worldmap_ format, an HTML file with a world map upon which each dive and " "some information about it are indicated. This map is not editable. However, " @@ -4814,13 +4950,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2527 +#: user-manual.txt:2595 #, no-wrap msgid "images/mapview_f20.jpg" msgstr "images/mapview_f20.jpg" #. type: Plain text -#: user-manual.txt:2534 +#: user-manual.txt:2602 msgid "" "_Image depths_, which creates a text file that contains the file names of " "all photos or images attached to any of the selected dives in the _Dive " @@ -4829,12 +4965,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2536 +#: user-manual.txt:2604 msgid "_General Settings_, under the HTML tab, provides the following options:" msgstr "" #. type: Plain text -#: user-manual.txt:2544 +#: user-manual.txt:2612 #, no-wrap msgid "" "** Subsurface Numbers: if this option is checked, the dive(s) are exported with the\n" @@ -4847,27 +4983,27 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2547 +#: user-manual.txt:2615 msgid "" "Under _Style Options_ some style-related options are available like font " "size and theme." msgstr "" #. type: Plain text -#: user-manual.txt:2550 +#: user-manual.txt:2618 msgid "" "Export to other formats can be achieved through third party facilities, for " "instance _www.divelogs.de_." msgstr "" #. type: Title == -#: user-manual.txt:2552 +#: user-manual.txt:2620 #, no-wrap msgid "Keeping a _Subsurface_ dive log in the Cloud" msgstr "" #. type: Plain text -#: user-manual.txt:2565 +#: user-manual.txt:2633 msgid "" "For each diver, dive log information is highly important. Not only is it a " "record of diving activities for one's own pleasure, but it is important " @@ -4884,7 +5020,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2570 +#: user-manual.txt:2638 msgid "" "For instance http://www.dropbox.com/[_Dropbox_] offers a free application " "that allows files on the Dropbox servers to be seen as a local folder on " @@ -4892,13 +5028,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2571 +#: user-manual.txt:2639 #, no-wrap msgid "images/Cloud.jpg" msgstr "images/Cloud.jpg" #. type: Plain text -#: user-manual.txt:2580 +#: user-manual.txt:2648 msgid "" "The _Dropbox_ program creates a copy of the _Dropbox_ Internet Cloud content " "on one's desktop computer. When the computer is connected to the Internet, " @@ -4911,7 +5047,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2587 +#: user-manual.txt:2655 msgid "" "In this way a dive log in one's _Dropbox_ folder can be accessed seamlessly " "from the Internet and can be accessed from any place with Internet access. " @@ -4921,7 +5057,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2593 +#: user-manual.txt:2661 msgid "" "Alternatively one can use _Dropbox_ as a mechanism to backup one's dive log. " "To Store a dive log in the Cloud, select _File -> Save as_ from the " @@ -4932,32 +5068,32 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2596 +#: user-manual.txt:2664 msgid "" "Several paid services exist on the Internet (e.g. Google, Amazon) where the " "same process could be used for the Cloud-based storage of dive logs." msgstr "" #. type: Title == -#: user-manual.txt:2599 +#: user-manual.txt:2667 #, no-wrap msgid "Printing a dive log" msgstr "" #. type: Plain text -#: user-manual.txt:2603 +#: user-manual.txt:2671 msgid "" "_Subsurface_ provides a simple interface to print a whole dive log or only a " "few selected dives, including dive profiles and other contextual information." msgstr "" #. type: Plain text -#: user-manual.txt:2605 +#: user-manual.txt:2673 msgid "Before printing, two decisions are required:" msgstr "" #. type: Plain text -#: user-manual.txt:2608 +#: user-manual.txt:2676 msgid "" "Should the whole dive log be printed or only part of it? If only part of the " "dive log is required, then the user must select the required dives from the " @@ -4965,7 +5101,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2610 +#: user-manual.txt:2678 msgid "" "What gas partial pressure information is required on the dive profile? Users " "should select the appropriate toggle-buttons on the button bar to the left " @@ -4973,7 +5109,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2614 +#: user-manual.txt:2682 msgid "" "Now the print options should be selected to match the user's needs. To do " "this, user should select _File -> Print_ from the Main menu. The following " @@ -4981,50 +5117,50 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2615 +#: user-manual.txt:2683 #, no-wrap msgid "images/PrintDiveLog.jpg" msgstr "images/PrintDiveLog.jpg" #. type: Plain text -#: user-manual.txt:2618 +#: user-manual.txt:2686 msgid "Under _Print type_ users need to select one of three options:" msgstr "" #. type: Plain text -#: user-manual.txt:2620 +#: user-manual.txt:2688 msgid "" "Print the complete Dive List: to do this, _Table Print_ should be selected." msgstr "" #. type: Plain text -#: user-manual.txt:2622 +#: user-manual.txt:2690 msgid "" "Print the selected dives (dive profiles and all other information) at 6 " "dives per printed page: to do this, users should select _6 dives per page_." msgstr "" #. type: Plain text -#: user-manual.txt:2624 +#: user-manual.txt:2692 msgid "" "Print the selected dives (dive profiles and all other information) at 2 " "dives per printed page: to do this, users should select _2 dives per page_." msgstr "" #. type: Plain text -#: user-manual.txt:2626 +#: user-manual.txt:2694 msgid "" "Print the selected dives (dive profiles and all other information) at 1 dive " "per printed page: to do this, users should select _1 dive per page_." msgstr "" #. type: Plain text -#: user-manual.txt:2628 +#: user-manual.txt:2696 msgid "Under _Print options_ users need to select:" msgstr "" #. type: Plain text -#: user-manual.txt:2632 +#: user-manual.txt:2700 msgid "" "Printing only the dives that have been selected from the dive list prior to " "activating the print dialogue, achieved by checking the box _Print only " @@ -5032,13 +5168,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2633 +#: user-manual.txt:2701 msgid "" "Printing in colour, achieved by checking the box with _Print in colour_." msgstr "" #. type: Plain text -#: user-manual.txt:2640 +#: user-manual.txt:2708 msgid "" "The _Ordering_ affects the layout of the page (or part of it) for each " "dive. The dive profile could be printed at the top of each dive, with the " @@ -5049,7 +5185,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2644 +#: user-manual.txt:2712 msgid "" "Users can _Preview_ the printed page by selecting the _Preview_ button on " "the dialogue. After preview, changes to the options in the print dialogue " @@ -5057,7 +5193,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2654 +#: user-manual.txt:2722 msgid "" "Next, select the _Print_ button in the dialogue. This activates the regular " "print dialogue used by the user operating system (image [*B*] in the middle, " @@ -5069,19 +5205,19 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2655 +#: user-manual.txt:2723 #, no-wrap msgid "images/Printpreview.jpg" msgstr "images/Printpreview.jpg" #. type: Title == -#: user-manual.txt:2659 +#: user-manual.txt:2727 #, no-wrap msgid "Configuring a dive computer" msgstr "Configurer un ordinateur de plongée" #. type: Plain text -#: user-manual.txt:2667 +#: user-manual.txt:2735 msgid "" "_Subsurface_ enables one to configure a dive computer. Currently the " "Heinrichs-Weikamp (OSTC 2, OSTC 3) and Suunto Vyper (Stinger, Mosquito, D3, " @@ -5104,7 +5240,7 @@ msgstr "" "APPENDIX A>> pour plus d'informations sur la manière de procéder." #. type: Plain text -#: user-manual.txt:2672 +#: user-manual.txt:2740 msgid "" "Once the dive computer is connected to the _Subsurface_ computer, select " "_File -> Configure dive computer_ from the _Main Menu_. Provide the " @@ -5119,13 +5255,13 @@ msgstr "" "de plongée à partir du panneau à gauche (voir l'image ci-dessous)." #. type: Target for macro image -#: user-manual.txt:2673 +#: user-manual.txt:2741 #, no-wrap msgid "images/Configure_dc_f20.jpg" msgstr "images/Configure_dc_f20.jpg" #. type: Plain text -#: user-manual.txt:2676 +#: user-manual.txt:2744 msgid "" "Using the appropriate buttons on the configuration panel, the following " "actions can be performed:" @@ -5134,7 +5270,7 @@ msgstr "" "suivantes peuvent être réalisées :" #. type: Plain text -#: user-manual.txt:2679 +#: user-manual.txt:2747 #, no-wrap msgid "" "*Retrieve available details*. This loads the existing configuration from the dive computer\n" @@ -5144,7 +5280,7 @@ msgstr "" "dans _Subsurface_, en l'affichant dans le panneau de configuration.\n" #. type: Plain text -#: user-manual.txt:2681 +#: user-manual.txt:2749 #, no-wrap msgid "" "*Save changes to device*. This changes the configuration of the\n" @@ -5154,7 +5290,7 @@ msgstr "" "de plongée pour correspondre aux informations affichées dans le panneau de configuration.\n" #. type: Plain text -#: user-manual.txt:2683 +#: user-manual.txt:2751 #, no-wrap msgid "" "*Backup*. This saves the configuration data to a file. _Subsurface_ asks for\n" @@ -5164,7 +5300,7 @@ msgstr "" "l'emplacement et le nom du fichier pour enregistrer les informations.\n" #. type: Plain text -#: user-manual.txt:2685 +#: user-manual.txt:2753 #, no-wrap msgid "" "*Restore backup*. This loads the information from a backup file and displays it\n" @@ -5174,7 +5310,7 @@ msgstr "" "dans le panneau de configuration.\n" #. type: Plain text -#: user-manual.txt:2687 +#: user-manual.txt:2755 #, no-wrap msgid "" "*Update firmware*. If new firmware is available for the dive computer, this is\n" @@ -5184,13 +5320,13 @@ msgstr "" "il sera chargé dans l'ordinateur de plongée.\n" #. type: Title == -#: user-manual.txt:2690 +#: user-manual.txt:2758 #, no-wrap msgid "Setting user _Preferences_ for _Subsurface_" msgstr "" #. type: Plain text -#: user-manual.txt:2698 +#: user-manual.txt:2766 msgid "" "There are several settings within _Subsurface_ that the user can specify. " "These are found when selecting _File -> Preferences_. The settings are " @@ -5202,24 +5338,24 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2699 +#: user-manual.txt:2767 #, no-wrap msgid "Defaults" msgstr "" #. type: Plain text -#: user-manual.txt:2702 +#: user-manual.txt:2770 msgid "There are several settings in the *Defaults* panel:" msgstr "" #. type: Target for macro image -#: user-manual.txt:2703 +#: user-manual.txt:2771 #, no-wrap msgid "images/Pref1_f20.jpg" msgstr "images/Pref1_f20.jpg" #. type: Plain text -#: user-manual.txt:2707 +#: user-manual.txt:2775 #, no-wrap msgid "" " ** *Lists and tables*: Here one can specify the font type and font size of the\n" @@ -5227,7 +5363,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2712 +#: user-manual.txt:2780 #, no-wrap msgid "" " ** *Dives*: For the _Default Dive File_ one need to specify the directory and\n" @@ -5237,7 +5373,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2717 +#: user-manual.txt:2785 #, no-wrap msgid "" " ** *Display invalid*: Dives can be marked as invalid (when a user wishes to hide\n" @@ -5247,15 +5383,15 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2720 +#: user-manual.txt:2788 #, no-wrap msgid "" " ** *Default cylinder*: Here users can specify the default cylinder listed in\n" -" the *Equipment* tab of the *Dive Notes* panel.\n" +" the *Equipment* tab of the *Notes* panel.\n" msgstr "" #. type: Plain text -#: user-manual.txt:2728 +#: user-manual.txt:2796 #, no-wrap msgid "" " ** *Animations*: Some actions in showing the dive profile are performed using\n" @@ -5268,7 +5404,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2733 +#: user-manual.txt:2801 #, no-wrap msgid "" " ** *Subsurface web service*: When one subscribes to the <<S_Companion,Subsurface web service>>, a very\n" @@ -5278,7 +5414,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2736 +#: user-manual.txt:2804 #, no-wrap msgid "" " ** *Clear all settings*: As indicated in the button below this heading, all settings are\n" @@ -5286,19 +5422,19 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2737 +#: user-manual.txt:2805 #, no-wrap msgid "Units" msgstr "" #. type: Target for macro image -#: user-manual.txt:2738 +#: user-manual.txt:2806 #, no-wrap msgid "images/Pref2_f20.jpg" msgstr "images/Pref2_f20.jpg" #. type: Plain text -#: user-manual.txt:2745 +#: user-manual.txt:2813 msgid "" "Here user can choose between metric and imperial units of depth, pressure, " "volume, temperature and mass. By selecting the Metric or Imperial radio " @@ -5309,24 +5445,24 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2746 +#: user-manual.txt:2814 #, no-wrap msgid "Graph" msgstr "" #. type: Target for macro image -#: user-manual.txt:2748 +#: user-manual.txt:2816 #, no-wrap msgid "images/Pref3_f20.jpg" msgstr "images/Pref3_f20.jpg" #. type: Plain text -#: user-manual.txt:2752 +#: user-manual.txt:2820 msgid "This panel allows two type of selections:" msgstr "" #. type: Plain text -#: user-manual.txt:2760 +#: user-manual.txt:2828 #, no-wrap msgid "" "*Show*: Here users can specify the amount of information shown as part of\n" @@ -5339,7 +5475,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2765 +#: user-manual.txt:2833 #, no-wrap msgid "" "** _Draw dive computer reported ceiling red_: This checkbox allows exactly what it says.\n" @@ -5349,13 +5485,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2767 +#: user-manual.txt:2835 #, no-wrap msgid "** _Show unused cylinders in Equipment Tab_: This checkbox allows display of information about unused cylinders when viewing the *Equipment Tab*. Conversely, if this box is not checked, and any cylinders entered using the *Equipment Tab* are not used (e.g. there was no gas switch to such a cylinder), then these cylinders are omitted from that list.\n" msgstr "" #. type: Plain text -#: user-manual.txt:2772 +#: user-manual.txt:2841 #, no-wrap msgid "" "** _Show average depth_: Activating this checkbox causes _Subsurface_ to draw a grey line across\n" @@ -5365,13 +5501,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2774 +#: user-manual.txt:2843 #, no-wrap msgid "*Misc*:\n" msgstr "" #. type: Plain text -#: user-manual.txt:2786 +#: user-manual.txt:2855 #, no-wrap msgid "" "** Gradient Factors:* Here users can set the _gradient factors_ used while diving. GF_Low is\n" @@ -5388,19 +5524,19 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2788 +#: user-manual.txt:2857 #, no-wrap msgid " *** http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding M-values by Erik Baker, _Immersed_ Vol. 3, No. 3.]\n" msgstr " *** http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding M-values by Erik Baker, _Immersed_ Vol. 3, No. 3.]\n" #. type: Plain text -#: user-manual.txt:2790 +#: user-manual.txt:2859 #, no-wrap msgid " *** link:http://www.rebreatherworld.com/general-and-new-to-rebreather-articles/5037-gradient-factors-for-dummies.html[Gradient factors for dummies, by Kevin Watts]\n" msgstr " *** link:http://www.rebreatherworld.com/general-and-new-to-rebreather-articles/5037-gradient-factors-for-dummies.html[Gradient factors for dummies, by Kevin Watts]\n" #. type: Plain text -#: user-manual.txt:2794 +#: user-manual.txt:2863 #, no-wrap msgid "" " ** _CCR: Show setpoints when viewing pO2:_ With this checkbox ativated, the pO~2~\n" @@ -5409,7 +5545,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2798 +#: user-manual.txt:2867 #, no-wrap msgid "" " ** _CCR: Show individual O~2~ sensor values when viewing pO~2~:_ Show the pO~2~\n" @@ -5418,19 +5554,19 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2800 +#: user-manual.txt:2869 #, no-wrap msgid "*Configuring dive planning using rebreather equipment:*\n" msgstr "" #. type: Plain text -#: user-manual.txt:2802 +#: user-manual.txt:2871 #, no-wrap msgid "** _Default CCR setpoint for dive planning:_ Specify the O~2~ setpoint for a\n" msgstr "" #. type: Plain text -#: user-manual.txt:2806 +#: user-manual.txt:2875 #, no-wrap msgid "" "CCR dive plan. This determines the pO~2~ that will be maintained\n" @@ -5440,13 +5576,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2808 +#: user-manual.txt:2877 #, no-wrap msgid "** _pSCR O~2~ metabolism rate:_ For a semiclosed rebreather (pSCR) system, this is the\n" msgstr "" #. type: Plain text -#: user-manual.txt:2810 +#: user-manual.txt:2879 #, no-wrap msgid "" "volume of oxygen used by a diver each minute. Set this value for pSCR dive planning\n" @@ -5454,13 +5590,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2812 +#: user-manual.txt:2881 #, no-wrap msgid "** _pSCR ratio:_ For pSCR equipment the dump ratio is the ratio of gas released to the\n" msgstr "" #. type: Plain text -#: user-manual.txt:2814 +#: user-manual.txt:2883 #, no-wrap msgid "" "environment to that of the gas recirculated to the diver. Set this value for a\n" @@ -5468,24 +5604,24 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2816 +#: user-manual.txt:2885 #, no-wrap msgid "Language" msgstr "" #. type: Plain text -#: user-manual.txt:2818 +#: user-manual.txt:2887 msgid "Choose a language that _Subsurface_ will use." msgstr "" #. type: Target for macro image -#: user-manual.txt:2819 +#: user-manual.txt:2888 #, no-wrap msgid "images/Pref4_f20.jpg" msgstr "images/Pref4_f20.jpg" #. type: Plain text -#: user-manual.txt:2829 +#: user-manual.txt:2898 msgid "" "A checkbox allows one to use the _System Default_ language which in most " "cases will be the correct setting; with this _Subsurface_ simply runs in the " @@ -5498,26 +5634,26 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2830 +#: user-manual.txt:2899 #, no-wrap msgid "Network" msgstr "" #. type: Plain text -#: user-manual.txt:2832 +#: user-manual.txt:2901 msgid "" "This panel facilitates communication between _Subsurface_ and data sources " "on the Internet." msgstr "" #. type: Target for macro image -#: user-manual.txt:2833 +#: user-manual.txt:2902 #, no-wrap msgid "images/Pref5_f20.jpg" msgstr "images/Pref5_f20.jpg" #. type: Plain text -#: user-manual.txt:2846 +#: user-manual.txt:2915 msgid "" "This is important, for instance, when _Subsurface_ needs to communicate with " "Internet services such as the <<S_Companion,_Subsurface Companion app_>> or " @@ -5534,26 +5670,26 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:2847 +#: user-manual.txt:2916 #, no-wrap msgid "Facebook Accesss" msgstr "" #. type: Plain text -#: user-manual.txt:2850 +#: user-manual.txt:2919 msgid "" "This panel allows one to log into a Facebook account in order to transfer " "information from Subsurface to Facefook." msgstr "" #. type: Target for macro image -#: user-manual.txt:2851 +#: user-manual.txt:2920 #, no-wrap msgid "images/Pref6_f20.jpg" msgstr "images/Pref6_f20.jpg" #. type: Plain text -#: user-manual.txt:2859 +#: user-manual.txt:2928 msgid "" "If one provides a valid Facebook userID and password, a connection to " "Facebook is created. The connection to Facebook is closed when one closes " @@ -5563,13 +5699,13 @@ msgid "" msgstr "" #. type: Title == -#: user-manual.txt:2861 +#: user-manual.txt:2930 #, no-wrap msgid "The _Subsurface_ dive planner" msgstr "" #. type: Plain text -#: user-manual.txt:2866 +#: user-manual.txt:2935 msgid "" "Dive planning is an advanced feature of _Subsurface_, accessible by " "selecting _Log -> Plan Dive_ from the main menu. It allows calculation of " @@ -5578,7 +5714,7 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:2874 +#: user-manual.txt:2943 msgid "" "The _Subsurface_ dive planner IS CURRENTLY EXPERIMENTAL and assumes the user " "is already familiar with the _Subsurface_ user interface. It is explicitly " @@ -5586,19 +5722,19 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:2877 +#: user-manual.txt:2946 msgid "" "The user is conversant with dive planning and has the necessary training to " "perform dive planning." msgstr "" #. type: delimited block * -#: user-manual.txt:2878 +#: user-manual.txt:2947 msgid "The user plans dives within his/her certification limits." msgstr "" #. type: delimited block * -#: user-manual.txt:2881 +#: user-manual.txt:2950 msgid "" "Dive planning makes large assumptions about the characteristics of the " "_average person_ and cannot compensate for individual physiology or health " @@ -5606,42 +5742,42 @@ msgid "" msgstr "" #. type: delimited block * -#: user-manual.txt:2882 +#: user-manual.txt:2951 msgid "" "The safety of a dive plan depends heavily on the way in which the planner is " "used." msgstr "" #. type: delimited block * -#: user-manual.txt:2883 +#: user-manual.txt:2952 msgid "The user is familiar with the user interface of _Subsurface_." msgstr "" #. type: delimited block * -#: user-manual.txt:2885 +#: user-manual.txt:2954 msgid "" "A user who is not absolutely sure about any of the above requirements should " "not use this feature." msgstr "" #. type: Title === -#: user-manual.txt:2887 +#: user-manual.txt:2956 #, no-wrap msgid "The _Subsurface_ dive planner screen" msgstr "" #. type: Plain text -#: user-manual.txt:2892 +#: user-manual.txt:2961 msgid "" "Like the _Subsurface_ dive log, the planner screen is divided into several " "sections (see image below). The *setup* parameters for a dive are entered " "into the several sections on the left hand side of the screen. The setup is " "divided into several sections: Available Gases, Rates, Planning, Gas Options " -"and Dive Notes." +"and Notes." msgstr "" #. type: Plain text -#: user-manual.txt:2896 +#: user-manual.txt:2965 msgid "" "At the top right hand is a green *design panel* upon which the profile of " "the dive can be manipulated directly by dragging and clicking as explained " @@ -5650,7 +5786,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2900 +#: user-manual.txt:2969 msgid "" "At the bottom right is a text panel with a heading of _Dive Plan Details_. " "This is where the details of the dive plan are provided in a way that can " @@ -5659,26 +5795,26 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:2901 +#: user-manual.txt:2970 #, no-wrap msgid "images/PlannerWindow1_f20.jpg" msgstr "images/PlannerWindow1_f20.jpg" #. type: Title === -#: user-manual.txt:2904 +#: user-manual.txt:2973 #, no-wrap -msgid "Open circuit dives as an example of dive planning" +msgid "Open circuit dives" msgstr "" #. type: Plain text -#: user-manual.txt:2907 +#: user-manual.txt:2976 msgid "" -"Towards the left bottom of the planner (circled in blue in the image below) " -"is a dropbox with three options. Select the appropriate one of these:" +"Towards the centre bottom of the planner (circled in blue in the image " +"above) is a dropbox with three options. Select the appropriate one of these:" msgstr "" #. type: Plain text -#: user-manual.txt:2910 +#: user-manual.txt:2979 #, no-wrap msgid "" "** Open Circuit (the default)\n" @@ -5687,44 +5823,199 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2915 +#: user-manual.txt:2981 +msgid "Choose the Open Circuit option." +msgstr "" + +#. type: Plain text +#: user-manual.txt:2985 msgid "" "In the top left-hand area of the planning screen, ensure that the constant " -"dive parameters are appropriate. These are: Start date and time of the dive, " -"Atmospheric Pressure and Altitude above sea level of the dive site. The " -"atmospheric pressure can also be entered as an altitude in metres, assuming " -"an atmospheric pressure of 1.013 bar." +"dive parameters are appropriate. These are: Start date and time of the " +"intended dive, Atmospheric Pressure and Altitude above sea level of the dive " +"site. The atmospheric pressure can also be entered as an altitude in metres, " +"assuming a sea-level atmospheric pressure of 1.013 bar." msgstr "" #. type: Plain text -#: user-manual.txt:2924 +#: user-manual.txt:2994 msgid "" -"In the table labelled _Available Gases_, add the information of the " -"cylinders to be used as well as the gas composition within that cylinder. " -"This is done in a similar way as for <<S_CylinderData,providing cylinder " -"data for dive logs>>. Choose the cylinder type by double clicking the " -"cylinder type and using the dropdown list, then specify the work pressure of " -"this cylinder. By leaving the oxygen concentration (O2%) filed empty, the " -"cylinder is assumed to contain air. Otherwise enter the oxygen and/or helium " -"concentration in the boxes provided in this dialogue. Add additional " -"cylinders by using the \"+\" icon to the top righthand of the dialogue." +"In the table labeled _Available Gases_, add the information of the cylinders " +"to be used as well as the gas composition within that cylinder. This is done " +"in a similar way as for <<S_CylinderData,providing cylinder data for dive " +"logs>>. Choose the cylinder type by double clicking the cylinder type and " +"using the dropdown list, then specify the work pressure of this cylinder. By " +"leaving the oxygen concentration (O2%) filed empty, the cylinder is assumed " +"to contain air. Otherwise enter the oxygen and/or helium concentration in " +"the boxes provided in this dialogue. Add additional cylinders by using the " +"\"+\" icon to the top righthand of the dialogue." +msgstr "" + +#. type: Plain text +#: user-manual.txt:2996 +msgid "The profile of the planned dive can be created in two ways:" msgstr "" #. type: Plain text -#: user-manual.txt:2927 +#: user-manual.txt:3001 msgid "" -"The dialogue indicating _Dive Planner Points_ is usually not used at this " -"stage of the dive planning." +"Drag the waypoints (the small white circles) on the existing dive profile in " +"a way to represent the dive. Additional waypoints can be created by double-" +"clicking the existing dive profile. Waypoints can be deleted by right-" +"clicking a particular waypoint and selecting the _delete_ item from the " +"resulting context menu." msgstr "" #. type: Plain text -#: user-manual.txt:2929 +#: user-manual.txt:3009 +msgid "" +"The most efficient way to create a dive profile is to enter the appropriate " +"values into the table marked _Dive planner points_. The first line of the " +"table represents the duration and the final depth of the descent from the " +"surface. Subsequent segments describe the bottom phase of the dive. The _CC " +"set point_ column is only relevant for closed circuit divers. The ascent is " +"usually not specified because this is what the planner is supposed to " +"calculate. Add additional segments to the profile by selecting the \"+\" " +"icon at the top right hand of the table. Segments entered into the _Dive " +"planner points_ table automatically appear in the *Dive Profile* diagram." +msgstr "" + +#. type: Title ==== +#: user-manual.txt:3010 #, no-wrap -msgid "*The planning is performed in three stages*\n" +msgid "Recreational dives" +msgstr "" + +#. type: Plain text +#: user-manual.txt:3025 +msgid "" +"The _Subsurface_ dive planner allows a sophisticated way of planning " +"recreational dives, i.e. dives that remain within no-decompression limits. " +"The dive planner automatically takes into account the nitrogen load incurred " +"in previous dives. But conventional dive tables are also used in a way that " +"can take into account previous dives. Why use a dive planner for " +"recreational dives? Using recreational dive tables, the maximum depth of a " +"dive is taken into acount. However, few dives are undertaken at a constant " +"depth corresponding to the maximum depth (i.e. a \"square\" dive profile). " +"This means that dive tables overestimate the nitrogen load incurred during " +"previous dives. The _Subsurface_ dive planner calculates nitrogen load " +"according to the real dive profiles of all uploaded previous dives, in a " +"similar way as dive computers calculate nitrogen load during a dive. This " +"mean that the diver gets 'credit' in terms of nitrogen loading for not " +"remaining at maximum depth during previous dives, enabling planning a longer " +"subsequent dive. For the planner to work it is therefore crucial to upload " +"all previous dives onto _Subsurface_ before performing dive planning." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3028 +msgid "To plan a dive, the appropriate settings need to be defined." msgstr "" #. type: Plain text -#: user-manual.txt:2939 +#: user-manual.txt:3031 +msgid "" +"Ensure that the date and time is set to that of the intended dive. This " +"allows calculation of the nitrogen load incurred during previous dives." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3034 +msgid "" +"Immediately under the heading _Planning_ are two checkboxes _Recreational_ " +"and _Safety Stop_. Check these two boxes." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3038 +msgid "" +"Then define the cylinder size, the gas mixture (air or % oxygen) and the " +"starting cylinder pressure in the top left-hand section of the planner under " +"_Available gases_." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3043 +msgid "" +"The planner calculates whether the specified cylinder contains enough air/" +"gas to complete the planned dive. In order for this to be realistic, under " +"_Gas options_, specify an appropriate surface air consumption (SAC) rate for " +"_Bottom SAC_. Suitable values are between 15 l/min and 30 l/min, with novice " +"divers or difficult dives requiring SAC rates closer to 30l/min." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3046 +msgid "" +"Define the amount of gas that the cylinder must have at the end of the " +"bottom section of the dive just before ascent. A value of 50 bar is often " +"used." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3053 +msgid "" +"Define the depth of the dive by dragging the waypoints (white dots) on the " +"dive profile or (even better) defining the appropriate depths using the " +"table under _Dive planner points_ as desribed under the previous heading. If " +"this is a multilevel dive, set the appropriate dive depths to represent the " +"dive plan by adding waypoints to the dive profile or by adding appropriate " +"dive planner points to the _Dive Planner Points_ table." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3056 +msgid "" +"The ascent speed can be changed. The default ascent speeds are those " +"considered safe for recreational divers." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3064 +msgid "" +"The dive profile in the planner indicates the maximum dive time within no-" +"deco limits using the Bühlmann ZH-L16 algorithm and the gas and depth " +"settings specified as described above. The _Subsurface_ planner allows rapid " +"assessment of dive duration as a function of dive depth, given the nitrogen " +"load incurred during previous dives. The dive plan includes estimates of the " +"amount of air/gas used, depending on the cylinder settings specified under " +"_Available gases_. If the initial cylinder pressure is set to 0, the dive " +"duration shown is the true no-deco limit (NDL) without taking into account " +"gas used during the dive. If the surface above the dive profile is RED it " +"means that recreational dive limits are exceeded and either the dive " +"duration or the dive depth needs to be reduced." +msgstr "" + +#. type: Plain text +#: user-manual.txt:3068 +msgid "" +"Below is an image of a dive plan for a recreational dive at 30 metres. " +"Although the no-deco limit (NDL) is 23 minutes, the duration of the dive is " +"limited by the amount of air in the cylinder, reflected by the information " +"in the text box at the bottom right of the panel." +msgstr "" + +#. type: Target for macro image +#: user-manual.txt:3069 +#, no-wrap +msgid "images/rec_diveplan.jpg" +msgstr "images/rec_diveplan.jpg" + +#. type: Title ==== +#: user-manual.txt:3071 +#, no-wrap +msgid "Non-recreational open circuit dives, including decompression" +msgstr "" + +#. type: Plain text +#: user-manual.txt:3075 +msgid "" +"Non-recreational dive planning involves exceeding the no-deco limits and/or " +"using multiple breathing gases. Such dives are planned in three stages:" +msgstr "" + +#. type: Plain text +#: user-manual.txt:3085 #, no-wrap msgid "" "*a) Nitrogen management*: This is performed by specifying the rates for descent and ascent,\n" @@ -5739,7 +6030,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2941 +#: user-manual.txt:3087 msgid "" "link:http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding M-" "values by Erik Baker, _Immersed_ Vol. 3, No. 3.]" @@ -5748,7 +6039,7 @@ msgstr "" "values by Erik Baker, _Immersed_ Vol. 3, No. 3.]" #. type: Plain text -#: user-manual.txt:2942 +#: user-manual.txt:3088 msgid "" "link:http://www.rebreatherworld.com/general-and-new-to-rebreather-" "articles/5037-gradient-factors-for-dummies.html[Gradient factors for " @@ -5759,7 +6050,7 @@ msgstr "" "dummies, by Kevin Watts]" #. type: Plain text -#: user-manual.txt:2944 +#: user-manual.txt:3090 msgid "" "link:http://www.amazon.com/Deco-Divers-Decompression-Theory-Physiology/" "dp/1905492073/ref=sr_1_1?s=books&ie=UTF8&qid=1403932320&sr=1-1&keywords=deco" @@ -5772,7 +6063,7 @@ msgstr "" "Sea, UK. ISBN 10: 1-905492-07-3. An excellent non-technical review." #. type: Plain text -#: user-manual.txt:2952 +#: user-manual.txt:3098 msgid "" "The ascent rate is critical for nitrogen off-gassing at the end of the dive " "and is specified for several depth ranges, utilising the average (or mean) " @@ -5786,7 +6077,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2962 +#: user-manual.txt:3107 #, no-wrap msgid "" "*b) Oxygen management*: In the *Gas Options* part of the dive specification, the maximum partial\n" @@ -5800,7 +6091,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2976 +#: user-manual.txt:3121 #, no-wrap msgid "" "*c) Gas management*: With open-circuit dives this is a primary consideration. One needs to keep within the limits of the amount of gas within the dive\n" @@ -5819,7 +6110,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:2988 +#: user-manual.txt:3133 msgid "" "Now (at last) one can start the detailed time-depth planning of the dive. " "_Subsurface_ offers a unique graphical interface for performing this part of " @@ -5837,7 +6128,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3000 +#: user-manual.txt:3145 msgid "" "Each waypoint on the dive profile creates a _Dive Planner Point_ in the " "table on the left of the dive planner panel. Ensure that the _Used Gas_ " @@ -5846,7 +6137,7 @@ msgid "" "features of the dive have been completed, e.g. the bottom time segment and " "deep stops (if these are implemented). Leave the remaining waypoints on the " "ascent to _Subsurface_. In most cases _Subsurface_ computes additional way " -"points in order to fulfil decompression requirements for that dive. A " +"points in order to fulfill decompression requirements for that dive. A " "waypoint can be moved by selecting that waypoint and by using the arrow " "keys. The waypoints listed in the _Dive Planner Points_ dialogue can be " "edited by hand in order to obtain a precise presentation of the dive plan. " @@ -5855,7 +6146,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3008 +#: user-manual.txt:3153 msgid "" "Indicate any changes in gas cylinder used by indicating gas changes as " "explained in the section <<S_CreateProfile,hand-creating a dive profile>>. " @@ -5867,7 +6158,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3017 +#: user-manual.txt:3162 msgid "" "A non-zero value in the \"CC set point\" column of the table of dive planner " "points indicates a valid setpoint for oxygen partial pressure and that the " @@ -5880,20 +6171,20 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3020 +#: user-manual.txt:3165 msgid "" "Below is an example of a dive plan to 45m using EAN26, followed by an ascent " "using EAN50 and using the settings as described above." msgstr "" #. type: Target for macro image -#: user-manual.txt:3021 +#: user-manual.txt:3166 #, no-wrap msgid "images/DivePlanner2_f20.jpg" msgstr "images/DivePlanner2_f20.jpg" #. type: Plain text -#: user-manual.txt:3026 +#: user-manual.txt:3171 msgid "" "Once the above has been completed, one can save it by clicking the _Save_ " "button towards the top middle of the planner. The saved dive plan will " @@ -5901,17 +6192,17 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3028 +#: user-manual.txt:3173 #, no-wrap msgid "*The dive plan details*\n" msgstr "" #. type: Plain text -#: user-manual.txt:3036 +#: user-manual.txt:3181 msgid "" "On the bottom right of the dive planner, under _Dive Plan Details_, the " "exact details of the dive plan are provided. These details may be modified " -"by checking any of the options under the _Dive Notes_ section of the dive " +"by checking any of the options under the _Notes_ section of the dive " "planner, immediately to the left of the _Dive Plan Details_. If a _Verbatim " "diveplan_ is requested, a detailed sentence-level explanation of the dive " "plan is given. If any of the management specifications have been exceeded " @@ -5920,7 +6211,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3041 +#: user-manual.txt:3186 msgid "" "If the option _Display segment duration_ is checked, then the duration of " "each depth level is indicated in the _Dive Plan Details_. This duration " @@ -5930,20 +6221,51 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3042 +#: user-manual.txt:3187 +#, no-wrap +msgid "Planning pSCR dives" +msgstr "" + +#. type: Plain text +#: user-manual.txt:3202 +#, no-wrap +msgid "" +"To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ rather than\n" +"_Open circuit_ in the dropdown list.\n" +"The parameters of the pSCR diver can be set by selecting _File -> Preferences -> Graph_\n" +"from the main menu, where the gas consumption calculation takes into account the pSCR dump\n" +"ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop\n" +"accross the mouthpiece of the rebreather into account. If the\n" +"pO~2~ drops below what is considered a save value, a warning appears in the _Dive plan\n" +"details_. A typical pSCR configuration is with a single cylinder and one or more bail-out\n" +"cylinders. Therefore the setup of the _Available gases_ and the _Dive planner points_ tables\n" +"are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints\n" +"are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable\n" +"to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen\n" +"in the loop due to the oxygen drop across the mouthpiece of the pSCR equipment.\n" +msgstr "" + +#. type: Target for macro image +#: user-manual.txt:3203 +#, no-wrap +msgid "images/Planner_pSCR1_f20.jpg" +msgstr "images/Planner_pSCR1_f20.jpg" + +#. type: Title === +#: user-manual.txt:3206 #, no-wrap msgid "Planning CCR dives" msgstr "" #. type: Plain text -#: user-manual.txt:3046 +#: user-manual.txt:3210 msgid "" "To plan a dive using a closed circuit rebreather, select the _CCR_ option in " "the dropdown list, circled in blue in the image below." msgstr "" #. type: Plain text -#: user-manual.txt:3050 +#: user-manual.txt:3214 #, no-wrap msgid "" "*Available gases*: In the _Available gases_ table, enter the cylinder information for the\n" @@ -5952,7 +6274,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3058 +#: user-manual.txt:3222 #, no-wrap msgid "" "*Entering setpoints*: Specify a default setpoint in the Preferences tab, by selecting _File -> Preferences -> Graph_ from the main menu. All user-entered segments in the _Dive planner points_ table\n" @@ -5965,63 +6287,32 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3060 +#: user-manual.txt:3224 msgid "" "The dive profile for a CCR dive may look something like the image below." msgstr "" #. type: Target for macro image -#: user-manual.txt:3061 +#: user-manual.txt:3225 #, no-wrap msgid "images/Planner_CCR1_f20.jpg" msgstr "images/Planner_CCR1_f20.jpg" #. type: Plain text -#: user-manual.txt:3065 +#: user-manual.txt:3229 msgid "" "Note that, in the _Dive plan details_, the gas consumption for a CCR segment " "is not calculated, so gas consumptions of 0 litres are the norm." msgstr "" #. type: Title === -#: user-manual.txt:3066 -#, no-wrap -msgid "Planning pSCR dives" -msgstr "" - -#. type: Plain text -#: user-manual.txt:3081 -#, no-wrap -msgid "" -"To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ rather than\n" -"_Open circuit_ in the dropdown list.\n" -"The parameters of the pSCR diver can be set by selecting _File -> Preferences -> Graph_\n" -"from the main menu, where the gas consumption calculation takes into account the pSCR dump\n" -"ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop\n" -"accross the mouthpiece of the rebreather into account. If the\n" -"pO~2~ drops below what is considered a save value, a warning apears in the _Dive plan\n" -"details_. A typical pSCR configuration is with a single cylinder and one or more bail-out\n" -"cylinders. Therefore the setup of the _Available gases_ and the _Dive planner points_ tables\n" -"are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints\n" -"are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable\n" -"to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen\n" -"in the loop due to the oxygen drop accross the mouthpiece of the pSCR equipment.\n" -msgstr "" - -#. type: Target for macro image -#: user-manual.txt:3082 -#, no-wrap -msgid "images/Planner_pSCR1_f20.jpg" -msgstr "images/Planner_pSCR1_f20.jpg" - -#. type: Title === -#: user-manual.txt:3086 +#: user-manual.txt:3231 #, no-wrap msgid "Modifying an existing dive plan" msgstr "" #. type: Plain text -#: user-manual.txt:3093 +#: user-manual.txt:3238 msgid "" "Normally, when a dive plan has been saved, it is accessible from the *Dive " "List*, like any other dive log. Within the *Dive List* there is not a way to " @@ -6032,7 +6323,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3099 +#: user-manual.txt:3244 msgid "" "In addition there is the option \"Save new\". This keeps the original " "planned dive and adds a (possibly modified) copy to the dive list. If that " @@ -6042,13 +6333,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3100 +#: user-manual.txt:3245 #, no-wrap msgid "Planning for repetitive dives" msgstr "" #. type: Plain text -#: user-manual.txt:3107 +#: user-manual.txt:3252 msgid "" "Repetitive dives can easily be planned if the dates and start times of the " "repetitive dive set is specified appropriately in the top left-hand _Start " @@ -6057,7 +6348,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3113 +#: user-manual.txt:3258 msgid "" "If one has just completed a long/deep dive and is planning another dive, " "then highlight, in the *Dive List*, the dive that has just been completed " @@ -6067,7 +6358,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3118 +#: user-manual.txt:3263 msgid "" "If only a few standard configurations are used (e.g. in GUE), then a " "template dive can be created conforming to one of the configurations. If one " @@ -6077,13 +6368,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3119 +#: user-manual.txt:3264 #, no-wrap msgid "Printing the dive plan" msgstr "" #. type: Plain text -#: user-manual.txt:3124 +#: user-manual.txt:3269 msgid "" "Selecting the _Print_ button in the planner allows printing of the _Dive " "Plan Details_ for wet notes. Alternatively one can cut and paste the _Dive " @@ -6091,29 +6382,29 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3134 +#: user-manual.txt:3279 msgid "" "Dive plans have many characteristics in common with dive logs (dive profile, " "dive notes, etc). After a dive plan has been saved, the dive details and " -"gas calculations are saved in the *Dive Notes* tab. While a dive plan is " -"being designed, it can be printed using the _Print_ button in the dive " -"planner. This prints the dive details and gas calculations in the _Dive Plan " -"Details_ panel of the dive planner. However, after the plan has been saved, " -"it is represented in a way very similar to a dive log and the gas " -"calculations cannot be accessed in the same way as during the planning " -"process. The only way to print the dive plan is to use the _File -> Print_ " -"facility on the main menu in the same way as for dive logs or by copy and " -"paste to a word processor." +"gas calculations are saved in the *Notes* tab. While a dive plan is being " +"designed, it can be printed using the _Print_ button in the dive planner. " +"This prints the dive details and gas calculations in the _Dive Plan Details_ " +"panel of the dive planner. However, after the plan has been saved, it is " +"represented in a way very similar to a dive log and the gas calculations " +"cannot be accessed in the same way as during the planning process. The only " +"way to print the dive plan is to use the _File -> Print_ facility on the " +"main menu in the same way as for dive logs or by copy and paste to a word " +"processor." msgstr "" #. type: Title == -#: user-manual.txt:3135 +#: user-manual.txt:3280 #, no-wrap msgid "Description of the Subsurface Main Menu items" msgstr "Description des éléments du menu principal de Subsurface" #. type: Plain text -#: user-manual.txt:3140 +#: user-manual.txt:3285 msgid "" "This section describes the functions and operation of the items in the Main " "Menu of Subsurface. Several of the items below are links to sections of this " @@ -6124,13 +6415,13 @@ msgstr "" "des sections de ce manuel traitant des opérations relatives." #. type: Title === -#: user-manual.txt:3141 +#: user-manual.txt:3286 #, no-wrap msgid "File" msgstr "Fichier" #. type: Plain text -#: user-manual.txt:3144 +#: user-manual.txt:3289 msgid "" "<<S_NewLogbook,_New Logbook_>> - Close the currently open dive logbook and " "clear all dive information." @@ -6139,7 +6430,7 @@ msgstr "" "actuellement ouvert et supprime toutes les informations de plongées." #. type: Plain text -#: user-manual.txt:3146 +#: user-manual.txt:3291 msgid "" "_Open logbook_ - This opens the file manager in order to select a dive " "logbook to open." @@ -6148,24 +6439,24 @@ msgstr "" "carnet de plongée à ouvrir." #. type: Plain text -#: user-manual.txt:3147 +#: user-manual.txt:3292 msgid "_Save_ - Save the dive logbook that is currently open." msgstr "" "_Sauvegarder_ - Enregistrer le carnet de plongée qui est actuellement ouvert." #. type: Plain text -#: user-manual.txt:3148 +#: user-manual.txt:3293 msgid "_Save as_ - Save the current logbook under a different file name." msgstr "" "_Enregsitrer sous_ - Enregistrer le carnet actuel sous un nom différent." #. type: Plain text -#: user-manual.txt:3149 +#: user-manual.txt:3294 msgid "_Close_ - Close the dive logbook that is currently open." msgstr "_Fermer_ - Fermer le carnet de plongée actuellement ouvert." #. type: Plain text -#: user-manual.txt:3151 +#: user-manual.txt:3296 msgid "" "<<S_ExportLog,_Export_>> - Export the currently open dive logbook (or the " "selected dives in the logbook) to one of several formats." @@ -6175,20 +6466,20 @@ msgstr "" "formats." #. type: Plain text -#: user-manual.txt:3152 +#: user-manual.txt:3297 msgid "<<S_PrintDivelog,_Print_>> - Print the currently open logbook." msgstr "" "<<S_PrintDivelog,_Imprimer_>> - Imprimer le carnet de plongée actuellement " "ouvert." #. type: Plain text -#: user-manual.txt:3153 +#: user-manual.txt:3298 msgid "<<S_Preferences,_Preferences_>> - Set the _Subsurface_ preferences." msgstr "" "<<S_Preferences,_Préférences_>> - Définir les préférences de _Subsurface_." #. type: Plain text -#: user-manual.txt:3154 +#: user-manual.txt:3299 msgid "" "<<S_Configure,_Configure dive computer_>> - Edit the configuration of a dive " "computer." @@ -6197,18 +6488,18 @@ msgstr "" "configuration d'un ordinateur de plongée." #. type: Plain text -#: user-manual.txt:3155 +#: user-manual.txt:3300 msgid "_Quit_ - Quit _Subsurface_." msgstr "_Quitter_ - Quitter _Subsurface_." #. type: Title === -#: user-manual.txt:3156 +#: user-manual.txt:3301 #, no-wrap msgid "Import" msgstr "Importer" #. type: Plain text -#: user-manual.txt:3159 +#: user-manual.txt:3304 msgid "" "<<S_ImportDiveComputer,_Import from dive computer_>> - Import dive " "information from a dive computer." @@ -6217,7 +6508,7 @@ msgstr "" "Importer des informations de plongées à partir de l'ordinateur de plongée." #. type: Plain text -#: user-manual.txt:3161 +#: user-manual.txt:3306 msgid "" "<<Unified_import,_Import Log Files_>> - Import dive information from a file " "in in a _Subsurface_-compatible format." @@ -6227,7 +6518,7 @@ msgstr "" "_Subsurface_." #. type: Plain text -#: user-manual.txt:3163 +#: user-manual.txt:3308 msgid "" "<<S_Companion,_Import GPS data from Subsurface web service_>> - Load GPS " "coordinates from the _Subsurface_ mobile phone app." @@ -6237,7 +6528,7 @@ msgstr "" "(téléphones et tablettes)." #. type: Plain text -#: user-manual.txt:3165 +#: user-manual.txt:3310 msgid "" "<<S_ImportingDivelogsDe,_Import from Divelogs.de_>> - Import dive " "information from _www.Divelogs.de_." @@ -6246,13 +6537,13 @@ msgstr "" "informations de plongées à partir de _www.Divelogs.de_." #. type: Title === -#: user-manual.txt:3166 +#: user-manual.txt:3311 #, no-wrap msgid "Log" msgstr "Journal (log)" #. type: Plain text -#: user-manual.txt:3168 +#: user-manual.txt:3313 msgid "" "<<S_EnterData,_Add Dive_>> - Manually add a new dive to the *Dive List* " "panel." @@ -6261,7 +6552,7 @@ msgstr "" "plongée au panneau de la *liste des plongées*." #. type: Plain text -#: user-manual.txt:3169 +#: user-manual.txt:3314 msgid "" "<<S_DivePlanner,_Plan Dive_>> - This feature allows the planning of dives." msgstr "" @@ -6269,7 +6560,7 @@ msgstr "" "planifier des plongées." #. type: Plain text -#: user-manual.txt:3170 +#: user-manual.txt:3315 msgid "" "<<S_Replan,_Re-plan dive_>> - Edit a dive plan that has been saved into the " "*Dive List*." @@ -6278,7 +6569,7 @@ msgstr "" "a été enregistrée dans la *liste des plongées*." #. type: Plain text -#: user-manual.txt:3172 +#: user-manual.txt:3317 msgid "" "<<S_CopyComponents,_Copy dive components_>> - By selecting this option, one " "can copy information from several fields of a dive log onto the clipboard." @@ -6288,7 +6579,7 @@ msgstr "" "champs d'un journal de plongée vers le presse-papier." #. type: Plain text -#: user-manual.txt:3174 +#: user-manual.txt:3319 msgid "" "_Paste dive components_ - Paste, into the selected dives in the *Dive List*, " "the information copied using the _Copy dive components_ option." @@ -6298,7 +6589,7 @@ msgstr "" "préalable avec l'option _Copier les composants de la plongée_." #. type: Plain text -#: user-manual.txt:3176 +#: user-manual.txt:3321 msgid "" "<<S_Renumber,_Renumber_>> - Renumber the dives listed in the *Dive List* " "panel." @@ -6307,7 +6598,7 @@ msgstr "" "le panneau de la *liste des plongées*." #. type: Plain text -#: user-manual.txt:3178 +#: user-manual.txt:3323 msgid "" "<<S_Group,_Auto Group_>> - Group the dives in the *Dive List* panel into " "dive trips." @@ -6316,7 +6607,7 @@ msgstr "" "*liste des plongées* dans des voyages de plongées." #. type: Plain text -#: user-manual.txt:3179 +#: user-manual.txt:3324 msgid "" "<<S_DeviceNames,_Edit Device Names_>> - Edit the names of dive computers to " "facilitate your logs." @@ -6325,7 +6616,7 @@ msgstr "" "les noms des ordinateurs de plongée pour faciliter vos journaux (logs)." #. type: Plain text -#: user-manual.txt:3180 +#: user-manual.txt:3325 msgid "" "<<S_Filter,_Filter divelist_>> - Select only some dives, based on specific " "tags or dive criteria." @@ -6334,13 +6625,13 @@ msgstr "" "certaines plongées, à partir de tags ou de critères de plongées." #. type: Title === -#: user-manual.txt:3181 +#: user-manual.txt:3326 #, no-wrap msgid "View" msgstr "Vue" #. type: Plain text -#: user-manual.txt:3184 +#: user-manual.txt:3329 msgid "" "<<S_ViewPanels,_All_>> - View the four main _Subsurface_ panels " "simmultaneously." @@ -6349,35 +6640,33 @@ msgstr "" "_Subsurface_ simultanément." #. type: Plain text -#: user-manual.txt:3185 +#: user-manual.txt:3330 msgid "<<S_ViewPanels,_Dive List_>> - View only the *Dive List* panel." msgstr "" "<<S_ViewPanels,_Liste des plongées_>> - Affiche uniquement le panneau de la " "*liste des plongées*." #. type: Plain text -#: user-manual.txt:3186 +#: user-manual.txt:3331 msgid "<<S_ViewPanels,_Profile_>> - View only the *Dive Profile* panel." msgstr "" "<<S_ViewPanels,_Profil_>> - Affiche uniquement le panneau du *profil de la " "plongée*." #. type: Plain text -#: user-manual.txt:3187 -msgid "<<S_ViewPanels,_Info_>> - View only the *Dive Notes* panel." -msgstr "" -"<<S_ViewPanels,_Info_>> - Affiche uniquement le panneau des *notes de " -"plongée*." +#: user-manual.txt:3332 +msgid "<<S_ViewPanels,_Info_>> - View only the *Notes* panel." +msgstr "<<S_ViewPanels,_Info_>> - Affiche uniquement le panneau des *notes*." #. type: Plain text -#: user-manual.txt:3188 +#: user-manual.txt:3333 msgid "<<S_ViewPanels,_Globe_>> - View only the *World Map* panel." msgstr "" "<<S_ViewPanels,_Globe_>> - Affiche uniquement le panneau de la *carte " "mondiale*." #. type: Plain text -#: user-manual.txt:3190 +#: user-manual.txt:3335 msgid "" "_Yearly Statistics_ - Display summary statistics about dives during this and " "past years." @@ -6386,28 +6675,28 @@ msgstr "" "plongées effectuées." #. type: Plain text -#: user-manual.txt:3191 +#: user-manual.txt:3336 msgid "_Prev DC_ - Switch to previous dive computer." msgstr "_Ordinateur précédent_ - Passer à l'ordinateur de plongée précédent." #. type: Plain text -#: user-manual.txt:3192 +#: user-manual.txt:3337 msgid "_Next DC_ - Switch to next dive computer." msgstr "_Ordinateur suivant_ - Passer à l'ordinateur de plongée suivant." #. type: Plain text -#: user-manual.txt:3193 +#: user-manual.txt:3338 msgid "_Full Screen_ - Toggles Full Screen mode." msgstr "_Plein écran_ - Passer en mode plein écran." #. type: Title === -#: user-manual.txt:3194 +#: user-manual.txt:3339 #, no-wrap msgid "Help" msgstr "Aide" #. type: Plain text -#: user-manual.txt:3197 +#: user-manual.txt:3342 msgid "" "_About Subsurface_ - Show a panel with the version number of _Subsurface_ as " "well as licensing information." @@ -6416,7 +6705,7 @@ msgstr "" "_Subsurface_ ainsi que les informations de licence." #. type: Plain text -#: user-manual.txt:3199 +#: user-manual.txt:3344 msgid "" "_Check for updates_ - Find out whether a newer version of Subsurface is " "available on the http://subsurface-divelog.org/[_Subsurface_ web site]." @@ -6426,7 +6715,7 @@ msgstr "" "_Subsurface_ ]." #. type: Plain text -#: user-manual.txt:3200 +#: user-manual.txt:3345 msgid "" "<<S_UserSurvey,_User survey_>> - Help to make _Subsurface_ even better by " "taking part in our user survey." @@ -6435,31 +6724,31 @@ msgstr "" "meilleur en répondant à notre sondage utilisateur." #. type: Plain text -#: user-manual.txt:3201 +#: user-manual.txt:3346 msgid "_User manual_ - Open a window showing this user manual." msgstr "" "_Manuel utilisateur_ - Ouvre une fenêtre affichant ce manuel utilisateur." #. type: Title == -#: user-manual.txt:3204 +#: user-manual.txt:3349 #, no-wrap msgid "APPENDIX A: Operating system specific information for importing dive information from a dive computer." msgstr "ANNEXE A : informations spécifiques au système d'exploitation utilisé pour importer les informations de plongées depuis un ordinateur de plongée." #. type: Title === -#: user-manual.txt:3206 +#: user-manual.txt:3351 #, no-wrap msgid "Make sure that the OS has the required drivers installed" msgstr "Assurez-vous que les pilotes (drivers) nécessaires sont installés" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3207 +#: user-manual.txt:3352 #, no-wrap msgid "images/icons/drivers.jpg" msgstr "images/icons/drivers.jpg" #. type: Plain text -#: user-manual.txt:3212 +#: user-manual.txt:3357 msgid "" "The operating system of the desktop computer needs the appropriate drivers " "in order to communicate with the dive computer in whichever way the dive " @@ -6470,7 +6759,7 @@ msgstr "" "l'ordinateur de plongée (Bluetooth, USB, infra-rouge)." #. type: Plain text -#: user-manual.txt:3218 +#: user-manual.txt:3363 msgid "" "On Linux users need to have the correct kernel module loaded. Most " "distributions will do this automatically, so the user does not need to load " @@ -6484,7 +6773,7 @@ msgstr "" "particulièrement pour certaines technologies telles que l'infra-rouge." #. type: Plain text -#: user-manual.txt:3222 +#: user-manual.txt:3367 msgid "" "On Windows, the OS should offer to download the correct driver once the user " "connects the dive computer to the USB port and operating system sees the " @@ -6495,7 +6784,7 @@ msgstr "" "port USB de son ordinateur de bureau." #. type: Plain text -#: user-manual.txt:3229 +#: user-manual.txt:3374 msgid "" "On a Mac users sometimes have to manually hunt for the correct driver. For " "example the correct driver for the Mares Puck devices or any other dive " @@ -6513,19 +6802,19 @@ msgstr "" "documents et logiciels Silicon Labs]." #. type: Title === -#: user-manual.txt:3231 +#: user-manual.txt:3376 #, no-wrap msgid "How to Find the Device Name for USB devices and set its write permission" msgstr "Comment trouver le nom du périphérique branché sur USB et paramétrer les permissions en écriture" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3232 +#: user-manual.txt:3377 #, no-wrap msgid "images/icons/usb.jpg" msgstr "images/icons/usb.jpg" #. type: Plain text -#: user-manual.txt:3240 +#: user-manual.txt:3385 msgid "" "When a user connects the dive computer by using a USB connector, usually " "_Subsurface_ will either propose a drop down list that contains the correct " @@ -6542,13 +6831,13 @@ msgstr "" "nom de votre périphérique ;" #. type: Block title -#: user-manual.txt:3241 user-manual.txt:3324 +#: user-manual.txt:3386 user-manual.txt:3469 #, no-wrap msgid "On Windows:" msgstr "Sur Windows :" #. type: Plain text -#: user-manual.txt:3245 +#: user-manual.txt:3390 msgid "" "Simply try COM1, COM2, etc. The drop down list should contain all connected " "COM devices." @@ -6557,56 +6846,56 @@ msgstr "" "tous les périphériques COM connectés." #. type: Block title -#: user-manual.txt:3246 user-manual.txt:3339 +#: user-manual.txt:3391 user-manual.txt:3484 #, no-wrap msgid "On MacOS:" msgstr "Sur MacOS :" #. type: Plain text -#: user-manual.txt:3249 +#: user-manual.txt:3394 msgid "The drop down box should find all connected dive computers." msgstr "" "La liste déroulante devrait contenir tous les ordinateurs de plongée " "connectés." #. type: Block title -#: user-manual.txt:3250 +#: user-manual.txt:3395 #, no-wrap msgid "On Linux:" msgstr "Sur Linux :" #. type: Plain text -#: user-manual.txt:3253 +#: user-manual.txt:3398 msgid "There is a definitive way to find the port:" msgstr "Il existe un moyen sûr de trouver le port :" #. type: Plain text -#: user-manual.txt:3255 +#: user-manual.txt:3400 msgid "Disconnect the USB cable from the dive computer" msgstr "Déconnecter le cable USB de l'ordinateur de plongée" #. type: Plain text -#: user-manual.txt:3256 +#: user-manual.txt:3401 msgid "Open a terminal" msgstr "Ouvrir un terminal" #. type: Plain text -#: user-manual.txt:3257 user-manual.txt:3259 +#: user-manual.txt:3402 user-manual.txt:3404 msgid "Type the command: 'dmesg' and press enter" msgstr "Taper la commande 'dmesg' et appuyer sur la touche Entrer" #. type: Plain text -#: user-manual.txt:3258 +#: user-manual.txt:3403 msgid "Plug in the USB cable of the dive computer" msgstr "Connecter le cable USB de l'ordinateur de plongée" #. type: Plain text -#: user-manual.txt:3261 +#: user-manual.txt:3406 msgid "A message similar to this one should appear:" msgstr "Un message similaire à celui-ci devrait apparaitre :" #. type: Plain text -#: user-manual.txt:3277 +#: user-manual.txt:3422 #, no-wrap msgid "" "\tusb 2-1.1: new full speed USB device number 14 using ehci_hcd\n" @@ -6642,7 +6931,7 @@ msgstr "" "\tftdi_sio: v1.6.0:USB FTDI Serial Converters Driver\n" #. type: Plain text -#: user-manual.txt:3282 +#: user-manual.txt:3427 msgid "" "The third line from the bottom shows that the FTDI USB adapter is detected " "and connected to +ttyUSB3+. This information can now be used in the import " @@ -6654,14 +6943,14 @@ msgstr "" "que Subsurface utilise le bon port USB." #. type: Plain text -#: user-manual.txt:3284 +#: user-manual.txt:3429 msgid "Ensuring that the user has write permission to the USB serial port:" msgstr "" "S'assurer que l'utilisateur possède les droits d'écriture sur le port série " "USB :" #. type: Plain text -#: user-manual.txt:3290 +#: user-manual.txt:3435 msgid "" "On Unix-like operating systems the USB ports can only be accessed by users " "who are members of the +dialout+ group. If one is not root, one may not be a " @@ -6674,7 +6963,7 @@ msgstr "" "utiliser le port USB. Si votre nom d'utilisateur est 'johnB' :" #. type: Plain text -#: user-manual.txt:3294 +#: user-manual.txt:3439 msgid "" "As root, type: +usermod -a -G dialout johnB+ (Ubuntu users: +sudo usermod -a " "-G dialout johnB+) This makes johnB a member of the +dialout+ group." @@ -6684,7 +6973,7 @@ msgstr "" "+dialout+." #. type: Plain text -#: user-manual.txt:3299 +#: user-manual.txt:3444 #, no-wrap msgid "" "Type: +id johnB+ This lists all the groups that johnB belongs to and\n" @@ -6700,7 +6989,7 @@ msgstr "" "parmi les différents IDs.\n" #. type: Plain text -#: user-manual.txt:3301 +#: user-manual.txt:3446 #, no-wrap msgid "" "Under some circumstances this change takes only effect (eg. on Ubuntu) after\n" @@ -6708,7 +6997,7 @@ msgid "" msgstr "Sous certaines circonstances, les modifications ne prennent effet qu'après une déconnexionpuis reconnexion sur l'ordinateur (sous Ubuntu, par exemple)." #. type: Plain text -#: user-manual.txt:3306 +#: user-manual.txt:3451 msgid "" "With the appropriate device name (e.g. +dev/ttyUSB3+) and with write " "permission to the USB port, the dive computer interface can connect and one " @@ -6719,19 +7008,19 @@ msgstr "" "vous devriez pouvoir importer vos plongées." #. type: Title === -#: user-manual.txt:3308 +#: user-manual.txt:3453 #, no-wrap msgid "Setting up bluetooth enabled devices" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3309 +#: user-manual.txt:3454 #, no-wrap msgid "images/icons/bluetooth.jpg" msgstr "images/icons/bluetooth.jpg" #. type: Plain text -#: user-manual.txt:3315 +#: user-manual.txt:3460 msgid "" "For dive computers communicating through bluetooth like the Heinrichs " "Weikamp Frog or the Shearwater Predator and Petrel there is a different " @@ -6740,13 +7029,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3317 +#: user-manual.txt:3462 #, no-wrap msgid "*For the dive computer, after enabling Bluetooth, ensure it is in Upload mode.*\n" msgstr "" #. type: Plain text -#: user-manual.txt:3321 +#: user-manual.txt:3466 msgid "" "For Bluetooth pairing of the dive computer, refer to the manufacturer's user " "guide. When using a Shearwater Predator/Petrel, select _Dive Log -> Upload " @@ -6754,13 +7043,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3323 +#: user-manual.txt:3468 #, no-wrap msgid "*Pair the _Subsurface_ computer with the dive computer.*\n" msgstr "" #. type: Plain text -#: user-manual.txt:3332 +#: user-manual.txt:3477 msgid "" "Bluetooth is most likely already enabled. For pairing with the dive computer " "choose _Control Panel -> Bluetooth Devices -> Add Wireless Device_. This " @@ -6771,21 +7060,21 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3335 +#: user-manual.txt:3480 msgid "" "For downloading to _Subsurface_, the _Subsurface_ drop-down list should " "contain this COM port already. If not, enter it manually." msgstr "" #. type: Plain text -#: user-manual.txt:3338 +#: user-manual.txt:3483 msgid "" "Note: If there are issues afterwards when downloading from the dive computer " "using other software, remove the existing pairing with the dive computer." msgstr "" #. type: Plain text -#: user-manual.txt:3345 +#: user-manual.txt:3490 msgid "" "Click on the Bluetooth symbol in the menu bar and select _Set up Bluetooth " "Device..._. The dive computer should then show up in the list of devices. " @@ -6794,20 +7083,20 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3348 +#: user-manual.txt:3493 msgid "" "Once the pairing is completed the correct device is shown in the 'Device or " "Mount Point' drop-down in the _Subsurface_ *Import* dialog." msgstr "" #. type: Block title -#: user-manual.txt:3349 +#: user-manual.txt:3494 #, no-wrap msgid "On Linux" msgstr "Sur Linux" #. type: Plain text -#: user-manual.txt:3357 +#: user-manual.txt:3502 msgid "" "Ensure Bluetooth is enabled on the _Subsurface_ computer. On most common " "distributions this should be true out of the box and pairing should be " @@ -6819,7 +7108,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3364 +#: user-manual.txt:3509 msgid "" "In the rare cases where the above is not true, then depending on your " "system, try +initd+ or +systemd+. This might be different and also involve " @@ -6830,12 +7119,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3366 +#: user-manual.txt:3511 msgid "One may also use a manual approach by using such commands:" msgstr "" #. type: Plain text -#: user-manual.txt:3371 +#: user-manual.txt:3516 msgid "" "+hciconfig+ shows the Bluetooth devices available on your computer (not dive " "computer), most likely one will see a hci0, if not try +hcitool -a+ to see " @@ -6843,14 +7132,14 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3375 +#: user-manual.txt:3520 msgid "" "+hcitool scanning+ gets a list of bluetooth enabled client devices, look for " "the dive computer and remember the MAC address are shown there" msgstr "" #. type: Plain text -#: user-manual.txt:3379 +#: user-manual.txt:3524 msgid "" "+bluez-simple-agent hci0 10:00:E8:C4:BE:C4+ pairs the dive computer with the " "bluetooth stack of the _Subsurface_ computer, copy/paste the MAC address " @@ -6858,14 +7147,14 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3382 +#: user-manual.txt:3527 msgid "" "Unfortunately on Linux binding to a communication device has to be done " "manually by running:" msgstr "" #. type: Plain text -#: user-manual.txt:3388 +#: user-manual.txt:3533 msgid "" "+rfcomm bind /dev/rfcomm0 10:00:E8:C4:BE:C4+ binds the dive computer to a " "communication device in the desktop computer, in case rfcomm is already " @@ -6874,32 +7163,32 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3391 +#: user-manual.txt:3536 msgid "" "For downloading dives in _Subsurface_ specify the device name connected to " "the MAC address in the last step above, e.g. _/dev/rfcomm0_." msgstr "" #. type: Title == -#: user-manual.txt:3394 +#: user-manual.txt:3539 #, no-wrap msgid "APPENDIX B: Dive Computer specific information for importing dive data." msgstr "" #. type: Title === -#: user-manual.txt:3397 +#: user-manual.txt:3542 #, no-wrap msgid "Importing from Uemis Zurich" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3399 +#: user-manual.txt:3544 #, no-wrap msgid "images/icons/iumis.jpg" msgstr "images/icons/iumis.jpg" #. type: Plain text -#: user-manual.txt:3415 +#: user-manual.txt:3560 msgid "" "_Subsurface_ downloads the information stored on the SDA (the built-in file " "system of the Uemis) including information about dive spots and equipment. " @@ -6915,7 +7204,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3430 +#: user-manual.txt:3575 msgid "" "After selecting the above device name, download the dives from the Uemis " "Zurich. One technical issue with the Uemis Zurich download implementation " @@ -6932,19 +7221,19 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3432 +#: user-manual.txt:3577 #, no-wrap msgid "Importing from Uwatec Galileo" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3434 +#: user-manual.txt:3579 #, no-wrap msgid "images/icons/Galileo.jpg" msgstr "images/icons/Galileo.jpg" #. type: Plain text -#: user-manual.txt:3449 +#: user-manual.txt:3594 msgid "" "The Uwatec Galileo dive computers use infra red (IrDA) communication between " "the dive computer and Subsurface. The Uwatec hardware uses a USB dongle " @@ -6960,14 +7249,14 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3452 +#: user-manual.txt:3597 msgid "" "After executing this command, Subsurface will recognise the Galileo dive " "computer and download dive information." msgstr "" #. type: Plain text -#: user-manual.txt:3456 +#: user-manual.txt:3601 msgid "" "Under Windows, a similar situation exists. Drivers for the MCS7780 are " "available from some Internet web sites e.g. http://www.drivers-download.com/" @@ -6975,26 +7264,26 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3459 +#: user-manual.txt:3604 msgid "" "For the Apple Mac, IrDA communication via the MCS7780 link is not available " "for OSX 10.6 or higher." msgstr "" #. type: Title === -#: user-manual.txt:3461 +#: user-manual.txt:3606 #, no-wrap msgid "Importing from Heinrichs Weikamp DR5" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3463 +#: user-manual.txt:3608 #, no-wrap msgid "images/icons/HW_DR5.jpg" msgstr "images/icons/HW_DR5.jpg" #. type: Plain text -#: user-manual.txt:3473 +#: user-manual.txt:3618 msgid "" "When mounted as a USB drive the Heinrichs Weikamp DR5 saves a single UDDF " "file for every dive. Mark all the dives you'd like to import or open. " @@ -7007,19 +7296,19 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3476 +#: user-manual.txt:3621 #, no-wrap msgid "Importing from xDEEP BLACK" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3478 +#: user-manual.txt:3623 #, no-wrap msgid "images/icons/HW_xdeepblack.jpg" msgstr "images/icons/HW_xdeepblack.jpg" #. type: Plain text -#: user-manual.txt:3487 +#: user-manual.txt:3632 msgid "" "Each dive has to be individually saved as UDDF file using \"Export UDDF\" " "option in BLACK's logbook menu. When mounted as a USB drive UDDF files are " @@ -7033,19 +7322,19 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3489 +#: user-manual.txt:3634 #, no-wrap msgid "Importing from Shearwater Predator using Bluetooth" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3491 +#: user-manual.txt:3636 #, no-wrap msgid "images/icons/predator.jpg" msgstr "images/icons/predator.jpg" #. type: Plain text -#: user-manual.txt:3499 +#: user-manual.txt:3644 msgid "" "Using a Shearwater Predator one may be able to pair Bluetooth but then " "encounter issues when downloading, showing errors like _Slip RX: unexp. SLIP " @@ -7056,36 +7345,36 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3502 +#: user-manual.txt:3647 msgid "" "use the Bluetooth dongle which came with the Shearwater Predator instead of " "the built-in one of the _Subsurface_ computer" msgstr "" #. type: Plain text -#: user-manual.txt:3503 +#: user-manual.txt:3648 msgid "switch to different Bluetooth drivers for the same hardware" msgstr "" #. type: Plain text -#: user-manual.txt:3504 +#: user-manual.txt:3649 msgid "switch off WiFi while using Bluetooth" msgstr "" #. type: Title === -#: user-manual.txt:3506 +#: user-manual.txt:3651 #, no-wrap msgid "Importing from Poseidon MkVI Discovery" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3508 +#: user-manual.txt:3653 #, no-wrap msgid "images/MkVI.jpeg" msgstr "images/MkVI.jpeg" #. type: Plain text -#: user-manual.txt:3516 +#: user-manual.txt:3661 msgid "" "Download of dive logs from the MkVI is performed using a custom " "communications adapter and the _Poseidon PC Configuration Software_, " @@ -7097,45 +7386,45 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3519 +#: user-manual.txt:3664 msgid "" "Setup configuration for the dive and key dive parameters (file with a .txt " "extension)" msgstr "" #. type: Plain text -#: user-manual.txt:3520 +#: user-manual.txt:3665 msgid "Dive log details (file with a .csv extension)" msgstr "" #. type: Plain text -#: user-manual.txt:3522 +#: user-manual.txt:3667 msgid "" "Redbook format dive log (file with .cvsr extension). This is a compressed " "version of the dive log using a proprietary format." msgstr "" #. type: Plain text -#: user-manual.txt:3524 +#: user-manual.txt:3669 msgid "" "_Subsurface_ accesses the .txt and the .csv files to obtain dive log " "information." msgstr "" #. type: Title === -#: user-manual.txt:3526 +#: user-manual.txt:3671 #, no-wrap msgid "Importing from APD Inspiration CCR" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3528 +#: user-manual.txt:3673 #, no-wrap msgid "images/APDComputer.jpg" msgstr "images/APDComputer.jpg" #. type: Plain text -#: user-manual.txt:3536 +#: user-manual.txt:3681 msgid "" "The dive logs of an APD Inspiration or similar CCR dive computer are " "downloaded using a communications adapter and _AP Communicator_, obtained " @@ -7147,82 +7436,82 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3538 +#: user-manual.txt:3683 msgid "Open a dive within the _AP Log Viewer_." msgstr "" #. type: Plain text -#: user-manual.txt:3539 +#: user-manual.txt:3684 msgid "Select the tab at the top of the screen, entitled \"_Data_\"." msgstr "" #. type: Plain text -#: user-manual.txt:3540 +#: user-manual.txt:3685 msgid "" "If the raw dive log data show on the screen, click on \"_Copy to Clipboard_" "\"." msgstr "" #. type: Plain text -#: user-manual.txt:3541 +#: user-manual.txt:3686 msgid "Open a text editor, e.g. Notepad (Windows), TextWrangler (Mac)." msgstr "" #. type: Plain text -#: user-manual.txt:3543 +#: user-manual.txt:3688 msgid "" "Copy the contents of the clipboard into the text editor and save the text " "file with a filename extension of .CSV" msgstr "" #. type: Plain text -#: user-manual.txt:3544 +#: user-manual.txt:3689 msgid "" "Within _Subsurface_, select _Import -> Import log files_ to open the xref:" "Unified_import[universal import dialogue]." msgstr "" #. type: Plain text -#: user-manual.txt:3545 +#: user-manual.txt:3690 msgid "" "In the dropdown list towards the bottom right of the dialogue, select \"_CSV " "files_\"." msgstr "" #. type: Plain text -#: user-manual.txt:3547 +#: user-manual.txt:3692 msgid "" "On the list of file names select the .CSV file that has been created above. " "An import dialogue opens." msgstr "" #. type: Plain text -#: user-manual.txt:3549 +#: user-manual.txt:3694 msgid "" -"In the dropdown list on the middle right labeled '_Pre-configured imports_" -"\", select _APD Log Viewer_." +"In the dropdown list on the top left labeled '_Pre-configured imports_\", " +"select _APD Log Viewer_." msgstr "" #. type: Plain text -#: user-manual.txt:3550 +#: user-manual.txt:3695 msgid "" "Ensure the other settings for the ADP dive log are appropriate, then select " "_OK_." msgstr "" #. type: Plain text -#: user-manual.txt:3552 +#: user-manual.txt:3697 msgid "The APD dive log will appear within _Subsurface_." msgstr "" #. type: Title == -#: user-manual.txt:3554 +#: user-manual.txt:3699 #, no-wrap msgid "APPENDIX C: Exporting Dive log information from external dive log software." msgstr "" #. type: Plain text -#: user-manual.txt:3563 +#: user-manual.txt:3708 msgid "" "The import of dive log data from external dive log software is mostly " "performed using the dialogue found by selecting _Import_ from the Main Menu, " @@ -7232,22 +7521,22 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3565 +#: user-manual.txt:3710 msgid "Export the foreign dive log data to format that is accessible from" msgstr "" #. type: Plain text -#: user-manual.txt:3566 +#: user-manual.txt:3711 msgid "_Subsurface_." msgstr "" #. type: Plain text -#: user-manual.txt:3567 +#: user-manual.txt:3712 msgid "Import the accessible dive log data into _Subsurface_." msgstr "" #. type: Plain text -#: user-manual.txt:3571 +#: user-manual.txt:3716 msgid "" "This appendix provides some information about approaches to export dive log " "data from foreign dive log software. The procedures below mostly apply to " @@ -7255,19 +7544,19 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3573 +#: user-manual.txt:3718 #, no-wrap msgid "Exporting from *Suunto Divemanager (DM3, DM4 or DM5)*" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3574 +#: user-manual.txt:3719 #, no-wrap msgid "images/icons/suuntologo.jpg" msgstr "images/icons/suuntologo.jpg" #. type: Plain text -#: user-manual.txt:3581 +#: user-manual.txt:3726 msgid "" "DiveManager is a MS Windows application for Suunto dive computers. " "Divemanager 3 (DM3) is an older version of the Suunto software. More recent " @@ -7277,69 +7566,66 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3583 +#: user-manual.txt:3728 #, no-wrap msgid "*Divemanager 3 (DM3):*\n" msgstr "" #. type: Plain text -#: user-manual.txt:3585 +#: user-manual.txt:3730 msgid "" "Start 'Suunto Divemanager 3' and log in with the name containing the logs" msgstr "" #. type: Plain text -#: user-manual.txt:3586 +#: user-manual.txt:3731 msgid "Do not start the import wizard to import dives from the dive computer." msgstr "" #. type: Plain text -#: user-manual.txt:3588 +#: user-manual.txt:3733 msgid "" "In the navigation tree on the left side of the program-window, select the " "appropriate dives." msgstr "" #. type: Plain text -#: user-manual.txt:3589 +#: user-manual.txt:3734 msgid "" "Within the list of dives, select the dives you would like to import later:" msgstr "" #. type: Plain text -#: user-manual.txt:3590 +#: user-manual.txt:3735 msgid "To select certain dives: hold 'ctrl' and click the dive" msgstr "" #. type: Plain text -#: user-manual.txt:3591 -msgid "To select all dives: Select the first dive, hold down shift and" -msgstr "" - -#. type: Plain text -#: user-manual.txt:3592 -msgid "select the last dive" +#: user-manual.txt:3737 +msgid "" +"To select all dives: Select the first dive, hold down shift and select the " +"last dive" msgstr "" #. type: Plain text -#: user-manual.txt:3593 +#: user-manual.txt:3738 msgid "With the dives marked, use the program menu _File -> Export_" msgstr "" #. type: Plain text -#: user-manual.txt:3594 +#: user-manual.txt:3739 msgid "" "The export pop-up will show. Within this pop-up, there is one field called " "'Export Path'." msgstr "" #. type: Plain text -#: user-manual.txt:3595 +#: user-manual.txt:3740 msgid "Click the browse button next to the field Export Path" msgstr "" #. type: Plain text -#: user-manual.txt:3597 +#: user-manual.txt:3742 #, no-wrap msgid "" "** A file-manager like window pops up\n" @@ -7347,13 +7633,13 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3598 +#: user-manual.txt:3743 #, no-wrap msgid "Divelog.SDE file\n" msgstr "" #. type: Plain text -#: user-manual.txt:3600 +#: user-manual.txt:3745 #, no-wrap msgid "" "** Optionally change the name of the file for saving\n" @@ -7361,25 +7647,25 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3601 +#: user-manual.txt:3746 #, no-wrap msgid "Back in the Export pop-up, press the button 'Export'\n" msgstr "" #. type: Plain text -#: user-manual.txt:3602 +#: user-manual.txt:3747 #, no-wrap msgid "The dives are now exported to the file Divelog.SDE.\n" msgstr "" #. type: Plain text -#: user-manual.txt:3604 +#: user-manual.txt:3749 #, no-wrap msgid "*Divemanager 4 (DM4) and Divemanager 5 (DM5):*\n" msgstr "" #. type: Plain text -#: user-manual.txt:3609 +#: user-manual.txt:3754 msgid "" "DM4 and DM5 use identical mechanisms for exporting dive logs. To export a " "divelog from Divemanager one needs to locate the DM4/DM5 database where the " @@ -7388,97 +7674,103 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3611 +#: user-manual.txt:3756 msgid "Locating the Suunto DM4 (or DM5) database:" msgstr "" #. type: Plain text -#: user-manual.txt:3613 user-manual.txt:3622 +#: user-manual.txt:3758 user-manual.txt:3767 msgid "Start Suunto DM4/DM5" msgstr "" #. type: Plain text -#: user-manual.txt:3614 +#: user-manual.txt:3759 msgid "Select 'Help -> About'" msgstr "" #. type: Plain text -#: user-manual.txt:3615 +#: user-manual.txt:3760 msgid "Click 'Copy' after text 'Copy log folder path to clipboard'" msgstr "" #. type: Plain text -#: user-manual.txt:3616 +#: user-manual.txt:3761 msgid "Now open Windows Explorer" msgstr "" #. type: Plain text -#: user-manual.txt:3617 +#: user-manual.txt:3762 msgid "Paste the address to the path box at the top of the File Explorer" msgstr "" #. type: Plain text -#: user-manual.txt:3618 +#: user-manual.txt:3763 msgid "The database is called DM4.db or DM5.db" msgstr "" #. type: Plain text -#: user-manual.txt:3620 +#: user-manual.txt:3765 msgid "Making a backup copy of the Suunto DM4/DM5 database:" msgstr "" #. type: Plain text -#: user-manual.txt:3623 +#: user-manual.txt:3768 msgid "Select 'File - Create backup'" msgstr "" #. type: Plain text -#: user-manual.txt:3625 +#: user-manual.txt:3770 msgid "" "From the file menu select the location and name for the backup, we'll use " "DM4 (or DM5) in here with the default extension .bak" msgstr "" #. type: Plain text -#: user-manual.txt:3626 +#: user-manual.txt:3771 msgid "Click 'Save'" msgstr "" #. type: Plain text -#: user-manual.txt:3627 +#: user-manual.txt:3772 msgid "The dives are now exported to the file DM4.bak (or DM5.bak)" msgstr "" #. type: Title === -#: user-manual.txt:3629 +#: user-manual.txt:3774 #, no-wrap msgid "Exporting from Atomic Logbook" msgstr "" +#. type: Named 'icon' AttributeList argument for style 'icon' +#: user-manual.txt:3777 +#, no-wrap +msgid "images/icons/atomiclogo.jpg" +msgstr "images/icons/atomiclogo.jpg" + #. type: Plain text -#: user-manual.txt:3638 +#: user-manual.txt:3784 msgid "" "Atomic Logbook is a Windows software by Atomic Aquatics. It allows " "downloading of dive information from Cobalt and Cobalt 2 dive computers. " -"The divelog is kept in a SQlite database at C:\\ProgramData\\AtomicsAquatics" +"The divelog is kept in a SQLite database at C:\\ProgramData\\AtomicsAquatics" "\\Cobalt-Logbook\\Cobalt.db. This file can be directly imported to " "Subsurface." msgstr "" #. type: Title === -#: user-manual.txt:3640 +#: user-manual.txt:3786 #, no-wrap msgid "Exporting from Mares Dive Organiser V2.1" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3643 +#: user-manual.txt:3789 #, no-wrap msgid "images/icons/mareslogo.jpg" msgstr "images/icons/mareslogo.jpg" #. type: Plain text -#: user-manual.txt:3651 +#: user-manual.txt:3797 msgid "" "Mares Dive Organiser is a Windows application. The dive log is kept as a " "Microsoft SQL Compact Edition database with a '.sdf' filename extension. The " @@ -7489,7 +7781,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3656 +#: user-manual.txt:3802 msgid "" "Within Dive Organiser, select _Database -> Backup_ from the main menu and " "back up the database to the desk top. This creates a zipped file " @@ -7497,36 +7789,36 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3659 +#: user-manual.txt:3805 msgid "" "Rename the file to DiveOrganiserxxxxx.zip. Inside the zipped directory is a " "file _DiveOrganiser.sdf_." msgstr "" #. type: Plain text -#: user-manual.txt:3660 +#: user-manual.txt:3806 msgid "Extract the _.sdf_ file from the zipped folder to your Desktop." msgstr "" #. type: Plain text -#: user-manual.txt:3661 +#: user-manual.txt:3807 msgid "The password for accessing the .zip file is _mares_." msgstr "" #. type: Title === -#: user-manual.txt:3663 +#: user-manual.txt:3809 #, no-wrap msgid "Exporting from *DivingLog 5.0*" msgstr "" #. type: Named 'icon' AttributeList argument for style 'icon' -#: user-manual.txt:3665 +#: user-manual.txt:3811 #, no-wrap msgid "images/icons/divingloglogo.jpg" msgstr "images/icons/divingloglogo.jpg" #. type: Plain text -#: user-manual.txt:3674 +#: user-manual.txt:3820 msgid "" "Unfortunately DivingLog XML files give us no indication on the preferences " "set on one's system. So in order for _Subsurface_ to be able to successfully " @@ -7537,28 +7829,28 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3676 +#: user-manual.txt:3822 msgid "In DivingLog open the 'File -> Export -> XML' menu" msgstr "" #. type: Plain text -#: user-manual.txt:3677 +#: user-manual.txt:3823 msgid "Select the dives to export" msgstr "" #. type: Plain text -#: user-manual.txt:3678 +#: user-manual.txt:3824 msgid "Click on the export button and select the filename" msgstr "" #. type: Title == -#: user-manual.txt:3680 +#: user-manual.txt:3826 #, no-wrap msgid "APPENDIX D: Exporting a spreadsheet to CSV format" msgstr "" #. type: Plain text -#: user-manual.txt:3689 +#: user-manual.txt:3835 msgid "" "Many divers keep a diving log in some form of a digital file, commonly a " "spreadsheet with various fields of information. These logs can be easily " @@ -7571,7 +7863,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3695 +#: user-manual.txt:3841 msgid "" "The first step is to organize the diving data in the spreadsheet, so that " "the first row contains the names (or titles) of each column and the " @@ -7582,41 +7874,41 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3697 +#: user-manual.txt:3843 msgid "" "Date: use one of the following formats: yyyy-mm-dd, dd.mm.yyyy, mm/dd/yyyy" msgstr "" #. type: Plain text -#: user-manual.txt:3698 +#: user-manual.txt:3844 msgid "Duration: the format should be minutes:seconds." msgstr "" #. type: Plain text -#: user-manual.txt:3699 +#: user-manual.txt:3845 msgid "" -"Unit system: only one unit system shold be used (i.e., no mixture between " +"Unit system: only one unit system should be used (i.e., no mixture between " "imperial and metric units)" msgstr "" #. type: Plain text -#: user-manual.txt:3700 +#: user-manual.txt:3846 msgid "Tags and buddies: values should be separated using a comma." msgstr "" #. type: Plain text -#: user-manual.txt:3701 +#: user-manual.txt:3847 msgid "GPS position: users must use decimal degrees, e.g. 30.22496 30.821798" msgstr "" #. type: Title === -#: user-manual.txt:3702 +#: user-manual.txt:3848 #, no-wrap msgid "_LibreOffice Calc_ and _OpenOffice Calc_" msgstr "" #. type: Plain text -#: user-manual.txt:3706 +#: user-manual.txt:3852 msgid "" "These are open source spreadsheet applications forming parts of larger open " "source office suite applications. The user interaction with _LibreOffice_ " @@ -7627,13 +7919,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:3707 +#: user-manual.txt:3853 #, no-wrap msgid "images/LOffice_spreadsheetdata.jpg" msgstr "images/LOffice_spreadsheetdata.jpg" #. type: Plain text -#: user-manual.txt:3710 +#: user-manual.txt:3856 msgid "" "To export the data as a .CSV file from within LibreOffice click _File -> " "Save As_. On the dialogue that comes up, select the _Text CSV (.csv)_ as the " @@ -7641,13 +7933,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:3711 +#: user-manual.txt:3857 #, no-wrap msgid "images/LOffice_save_as_options.jpg" msgstr "images/LOffice_save_as_options.jpg" #. type: Plain text -#: user-manual.txt:3714 +#: user-manual.txt:3860 msgid "" "After selecting _Save_, select the appropriate field delimiter (choose _Tab_ " "to prevent conflicts with the comma when using this as a decimal point), " @@ -7655,13 +7947,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:3715 +#: user-manual.txt:3861 #, no-wrap msgid "images/LOffice_field_options.jpg" msgstr "images/LOffice_field_options.jpg" #. type: Plain text -#: user-manual.txt:3718 +#: user-manual.txt:3864 msgid "" "One can double check the .CSV file by opening it with a text editor, and " "then import the dive data as explained on the section xref:" @@ -7669,13 +7961,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3719 +#: user-manual.txt:3865 #, no-wrap msgid "Microsoft _Excel_" msgstr "" #. type: Plain text -#: user-manual.txt:3725 +#: user-manual.txt:3871 msgid "" "The field delimiter (called \"_list separator_\" in Microsoft manuals) is " "not accessible from within _Excel_ and needs to be set through the " @@ -7686,19 +7978,19 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3727 +#: user-manual.txt:3873 msgid "" "In Microsoft Windows, click the *Start* button, and then select _Control " "Panel_ from the list on the right-hand side." msgstr "" #. type: Plain text -#: user-manual.txt:3728 +#: user-manual.txt:3874 msgid "Open the _Regional and Language Options_ dialog box." msgstr "" #. type: Plain text -#: user-manual.txt:3731 +#: user-manual.txt:3877 msgid "" "Do one of the following: ** In Windows 7, click the _Formats_ tab, and then " "click _Customize this format_. ** In Windows XP, click the _Regional " @@ -7706,48 +7998,48 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3732 +#: user-manual.txt:3878 msgid "" "Type a new separator in the _List separator_ box. To use a TAB-delimited " "file, type the word TAB in the box." msgstr "" #. type: Plain text -#: user-manual.txt:3733 +#: user-manual.txt:3879 msgid "Click _OK_ twice." msgstr "" #. type: Plain text -#: user-manual.txt:3735 +#: user-manual.txt:3881 msgid "Below is an image of the _Control Panel_:" msgstr "" #. type: Target for macro image -#: user-manual.txt:3736 +#: user-manual.txt:3882 #, no-wrap msgid "images/Win_SaveCSV2.jpg" msgstr "images/Win_SaveCSV2.jpg" #. type: Plain text -#: user-manual.txt:3739 +#: user-manual.txt:3885 msgid "To export the dive log in CSV format:" msgstr "" #. type: Plain text -#: user-manual.txt:3741 +#: user-manual.txt:3887 msgid "" "With the dive log opened in _Excel_, select the round Windows button at the " "top left, then _Save As_." msgstr "" #. type: Target for macro image -#: user-manual.txt:3742 +#: user-manual.txt:3888 #, no-wrap msgid "images/Win_SaveCSV1.jpg" msgstr "images/Win_SaveCSV1.jpg" #. type: Plain text -#: user-manual.txt:3745 +#: user-manual.txt:3891 msgid "" "Click on the left-hand part of the _Save as_ option, NOT on the arrow on the " "right-hand. This brings up a dialogue for saving the spreadsheet in an " @@ -7757,13 +8049,13 @@ msgid "" msgstr "" #. type: Target for macro image -#: user-manual.txt:3746 +#: user-manual.txt:3892 #, no-wrap msgid "images/Win_SaveCSV3.jpg" msgstr "images/Win_SaveCSV3.jpg" #. type: Plain text -#: user-manual.txt:3749 +#: user-manual.txt:3895 msgid "" "Select the _Save_ button. The CSV-formatted file is saved into the folder " "that was selected. One can double check the .CSV file by opening it with a " @@ -7772,19 +8064,19 @@ msgid "" msgstr "" #. type: Title == -#: user-manual.txt:3750 +#: user-manual.txt:3896 #, no-wrap msgid "APPENDIX E: FAQs." msgstr "" #. type: Title === -#: user-manual.txt:3752 +#: user-manual.txt:3898 #, no-wrap msgid "Subsurface appears to miscalculate gas consumption and SAC" msgstr "" #. type: Plain text -#: user-manual.txt:3756 +#: user-manual.txt:3902 msgid "" "'Question': I dived with a 12.2 l tank, starting with 220 bar and ending " "with 100 bar, and I calculate a different SAC compared what _Subsurface_ " @@ -7792,7 +8084,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3762 +#: user-manual.txt:3908 msgid "" "'Answer': Not really. What happens is that _Subsurface_ actually calculates " "gas consumption differently - and better - than you expect. In particular, " @@ -7802,7 +8094,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3768 +#: user-manual.txt:3914 msgid "" "and that's true for an ideal gas, and it's what you get taught in dive " "theory. But an \"ideal gas\" doesn't actually exist, and real gases " @@ -7812,12 +8104,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3770 +#: user-manual.txt:3916 msgid "+consumption = (amount_of_air_at_beginning - amount_of_air_at_end)+" msgstr "" #. type: Plain text -#: user-manual.txt:3776 +#: user-manual.txt:3922 msgid "" "where the amount of air is *not* just \"tank size times pressure in bar\". " "It's a combination of: \"take compressibility into account\" (which is a " @@ -7828,12 +8120,12 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3778 +#: user-manual.txt:3924 msgid "+12.2*((220-100)/1.013)+" msgstr "" #. type: Plain text -#: user-manual.txt:3783 +#: user-manual.txt:3929 msgid "" "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 " @@ -7843,7 +8135,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3789 +#: user-manual.txt:3935 msgid "" "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. And as " @@ -7854,13 +8146,13 @@ msgid "" msgstr "" #. type: Title === -#: user-manual.txt:3790 +#: user-manual.txt:3936 #, no-wrap msgid "Some dive profiles have time discrepancies with the recorded samples from my dive computer..." msgstr "" #. type: Plain text -#: user-manual.txt:3794 +#: user-manual.txt:3940 msgid "" "_Subsurface_ ends up ignoring surface time for many things (average depth, " "divetime, SAC, etc). 'Question': Why do dive durations in my dive computer " @@ -7868,7 +8160,7 @@ msgid "" msgstr "" #. type: Plain text -#: user-manual.txt:3802 +#: user-manual.txt:3948 msgid "" "'Answer': For example, if you end up doing a weight check (deep enough to " "trigger the \"dive started\") but then come back up and wait five minutes " diff --git a/Documentation/images/PlannerWindow1_f20.jpg b/Documentation/images/PlannerWindow1_f20.jpg Binary files differindex 110ad08c9..af7716aaf 100644 --- a/Documentation/images/PlannerWindow1_f20.jpg +++ b/Documentation/images/PlannerWindow1_f20.jpg diff --git a/Documentation/images/icons/atomiclogo.jpg b/Documentation/images/icons/atomiclogo.jpg Binary files differnew file mode 100644 index 000000000..2d24b290c --- /dev/null +++ b/Documentation/images/icons/atomiclogo.jpg diff --git a/Documentation/images/rec_diveplan.jpg b/Documentation/images/rec_diveplan.jpg Binary files differnew file mode 100644 index 000000000..c09a9c2b1 --- /dev/null +++ b/Documentation/images/rec_diveplan.jpg diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 78e56cab2..bcfb7d8d0 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -89,7 +89,7 @@ Start Using the Program ----------------------- The _Subsurface_ window is usually divided into four panels with a *Main -Menu* (File Import Log View Filter Help) at the top of the window (for Windows +Menu* (File Import Log View Help) at the top of the window (for Windows and Linux) or the top of the screen (for Mac and Ubuntu Unity). The four panels are: 1. The *Dive List* to the bottom left containing a list of all the dives in the @@ -102,7 +102,7 @@ between dives. The *Dive List* is an important tool for manipulating a dive log. map and centred on the site of the last dive selected in the *Dive List*. -3. The *Dive Info* to the top left, giving more detailed information on the +3. The *Info* to the top left, giving more detailed information on the dive selected in the *Dive List*, including some statistics for the selected dive or for all highlighted dive(s). @@ -119,7 +119,7 @@ and profile of the _selected dive_ are shown in the respective panels. On the other hand, if one highlights more than one dive the last highlighted dive is the _selected dive_, but summary data of all _highlighted dives_ are shown in the *Stats* tab -of the *Dive Info* panel (maximum, minimum and average depths, durations, water +of the *Info* panel (maximum, minimum and average depths, durations, water temperatures and SAC; total time and number of dives selected). [[S_ViewPanels]] @@ -136,7 +136,7 @@ display: *Profile*: Show only the Dive Profile of the selected dive. -*Info*: Show only the Dive Notes about the last selected dive and statistics for +*Info*: Show only the Notes about the last selected dive and statistics for all highlighted dives. *Globe*: Show only the world map, centred on the last selected dive. @@ -201,7 +201,7 @@ depth, the names of your dive buddy and of the dive master or dive guide, and some remarks about the dive. _Subsurface_ can store much more information than this for each dive. In order to add a dive to a dive log, select _Log -> Add Dive_ from the Main Menu. The program then shows three panels to enter -information for a dive: two tabs in the *Dive Info* panel (*Dive Notes* and +information for a dive: two tabs in the *Info* panel (*Notes* and *Equipment*), as well as the *Dive Profile* panel that displays a graphical profile of each dive. These panels are respectively marked [red]#A#, [red]#B# and [red]#C# @@ -209,9 +209,9 @@ in the figure below. Each of these tabs will now be explained for data entry. image::images/AddDive1_f20.jpg["FIGURE: Add dive",align="center"] -When one edits a field in Dive notes or Equipment panels, _Subsurface_ enters *Editing Mode*, -indicated by the message in the blue box at the top of the _Dive Notes_ panel (see the image below). This message is -displayed in all the panels under Dive notes and Equipment when in *Editing Mode*. +When one edits a field in Notes or Equipment panels, _Subsurface_ enters *Editing Mode*, +indicated by the message in the blue box at the top of the _Notes_ panel (see the image below). This message is +displayed in all the panels under Notes and Equipment when in *Editing Mode*. image::images/BlueEditBar_f20.jpg["Blue edit bar",align="center"] @@ -221,14 +221,14 @@ before saving the information. By selecting the _Save_ button, a local copy of t for this specific dive is saved in memory. When one closes Subsurface, the program will ask again, this time whether the complete dive log should be saved on disk or not. -==== Dive Notes +==== Notes This panel contains the date, time and place information for a particular dive, environmental conditions, co-divers and buddies, as well as some descriptive -information. If one clicks on the *Dive Notes* tab, the following +information. If one clicks on the *Notes* tab, the following fields are visible: -image::images/AddDive2_f20.jpg["FIGURE: The Dive Notes tab",align="center"] +image::images/AddDive2_f20.jpg["FIGURE: The Notes tab",align="center"] The *Time* field reflects the date and the time of the dive. By clicking the date, a calendar is displayed from which @@ -323,9 +323,9 @@ shown for the user to choose from. The *Save* and *Cancel* buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there's no need to use them until ALL other information has been added. Here is an example of a completed -Dive Notes panel: +Notes panel: -image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Dive Notes tab",align="center"] +image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Notes tab",align="center"] ==== Equipment @@ -461,10 +461,10 @@ image::images/DiveProfile4_f20.jpg["FIGURE: Completed dive profile",align="cente ==== Saving the hand-entered dive information -The information entered in the *Dive Notes* tab, the *Equipment* tab as well as +The information entered in the *Notes* tab, the *Equipment* tab as well as the *Dive Profile* can now be saved in the user's logbook by using the two buttons -on the top right hand of the Dive Notes tab. If the _Save_ button is clicked, +on the top right hand of the Notes tab. If the _Save_ button is clicked, the dive data are saved in the current logbook. If the _Cancel_ button is clicked, the newly entered @@ -694,10 +694,10 @@ allowing easy identification of devices. With the uploaded dives in the *Dive List*, the information from the dive computer is not complete and more details must be added in order to have a fuller record of the dives. To do this, -the *Dive Notes* and the *Equipment* tabs on the top left hand of the +the *Notes* and the *Equipment* tabs on the top left hand of the _Subsurface_ window should be used. -==== Dive Notes +==== Notes The date and time of the dive, gas mixture and (often) water temperature are usually shown as obtained from the dive computer, but the user needs to add @@ -705,10 +705,10 @@ additional information by hand in order to have a more complete dive record. In (e.g. APD rebreathers) one also has to provide the date and time of the dive. If the contents of this tab is changed or edited in any way, the message in a blue box at the top of the panel indicates that the dive is being edited. If one -clicks on the *Dive Notes* tab, the following fields are +clicks on the *Notes* tab, the following fields are visible: -image::images/AddDive3_f20.jpg["FIGURE: The Dive Notes tab",align="center"] +image::images/AddDive3_f20.jpg["FIGURE: The Notes tab",align="center"] The *Time* field reflects the date and time of the dive. By clicking the date, a calendar is displayed from which @@ -807,9 +807,9 @@ typed The *Save* and *Cancel* buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there's no need to use them until ALL other information has been added. Here is an example of a completed -Dive Notes panel: +Notes panel: -image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Dive Notes tab",align="center"] +image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Notes tab",align="center"] ==== Equipment @@ -901,14 +901,14 @@ image::images/WeightsDataEntry3_f20.jpg["FIGURE: A completed weights information _METHOD 1_: After uploading dives from a dive computer, the dive profiles of the uploaded dives are shown in the *Dive profile* tab, as well as a few items of information -in the *Dive Notes* tab (e.g. water temperature) and in the *Equipment* tab (e.g. gas pressures +in the *Notes* tab (e.g. water temperature) and in the *Equipment* tab (e.g. gas pressures and gas composition). However the other fields remain empty. It may be useful to simultaneously edit some of the -fields in the *Dive Notes* and *Equipment* tabs. For instance, it is possible +fields in the *Notes* and *Equipment* tabs. For instance, it is possible that a diver performed several dives during a single day, using identical equipment while diving at the same dive site or with the same dive master and/or buddy or tags. Instead of completing the information for each of these dives separately, one can select all the dives for that day in the *Dive List* and -insert the same information in the *Dive Notes* and *Equipment* fields that need +insert the same information in the *Notes* and *Equipment* fields that need identical information. This is achieved by editing the dive notes or the equipment for any one of the selected dives. @@ -924,8 +924,8 @@ up the completion of the dive log after several similar dives. [[S_CopyComponents]] _METHOD 2_:There is a different way of achieving the same goal. Select a dive with all the appropriate information -typed into the *Dive Notes* and *Equipment* tabs. Then, from the main menu, select _Log -> Copy dive components_. -A box is presented with a selection of check boxes for most of the fields in the *Dive Notes* and *Equipment* tabs. +typed into the *Notes* and *Equipment* tabs. Then, from the main menu, select _Log -> Copy dive components_. +A box is presented with a selection of check boxes for most of the fields in the *Notes* and *Equipment* tabs. Select the fields to be copied from the currently selected dive, then select _OK_. Now, in the *Dive List*, select the dives into which this information is to be pasted. Then, from the main menu, select _Log -> Paste dive components_. @@ -954,10 +954,10 @@ image::images/Bookmarks.jpg["FIGURE: Bookmark dialog",align="center"] ==== Saving the updated dive information -The information entered in the *Dive Notes* tab and the *Equipment* tab can be +The information entered in the *Notes* tab and the *Equipment* tab can be saved by using the -two buttons on the top right hand of the *Dive Notes* tab. If the _Save_ button +two buttons on the top right hand of the *Notes* tab. If the _Save_ button is clicked, the dive data are saved. If the _Cancel_ button is clicked, then the newly entered dive data are @@ -1026,6 +1026,16 @@ Selecting the appropriate file in the file list of the dialogue opens the imported dive log in the _Subsurface_ *Dive List*. Some other formats, not accessible through the Import dialogue are also supported, as explained below. +==== Importing from Heinrichs Weikamp OSTC Tools + +_OSTC Tools_ is a Microsoft-based suite of dive download and dive management tools for the OSTC +family of dive computers. _OSTC Tools_ downloads dive data from the dive computer and stores it +as a binary file with file extension _.dive_ . Subsurface can directly import these files when using +the universal import dialogue. From the dropdown list at the bottom right select _All files_. +This makes the _OSTC Tools_ dive logs visible in the file list panel. Select one or more +dive, then click the _Open_ button. The OSTC dives are shown in the *Dive List* panel. + + ==== Importing from Mares Dive Organiser V2.1 Since Mares utilise proprietary Windows software not compatible with @@ -1588,7 +1598,7 @@ image::images/icons/ShowPhotos_f20.png["FIGURE:Show photos toolbar button",align After the images have been loaded, they appear in two places: - - the _Photos_ tab of the *Dive Notes* panel. + - the _Photos_ tab of the *Notes* panel. - as tiny icons (stubs) on the dive profile at the appropriate positions reflecting the time each photograph was taken. See below: @@ -1611,7 +1621,7 @@ image::images/LoadImage6_f20.jpg["FIGURE: Full-screen photo on dive profile",ali ==== The _Photos_ tab -Photographs associated with a dive are shown as thumbnails in the _Photos_ tab of the _Dive Notes_ +Photographs associated with a dive are shown as thumbnails in the _Photos_ tab of the _Notes_ panel. Photos taken in rapid succession during a dive (therefore sometimes with large overlap on the dive profile) can easily be accessed in the _Photos_ tab. This tab serves as a tool for individually accessing the photos of a dive, while the stubs on the dive profile @@ -1633,6 +1643,54 @@ program only shows a small white dot where each photo should be on the dive prof In addition the _Photos_ tab only shows the file names of the photos. This is normal behaviour. If, later, the external drive with the photos is connected again, the photos can be seen in the normal way. +[[S_FindMovedImages]] +==== Moving photographs among directories, hard disks or computers + +After a photograph has been loaded into _Subsurface_ and associated with a specific dive, the directory + where the photo lies is stored, allowing _Subsurface_ to find the photograph when the dive is + opened again. If the photo or the whole photo collection is moved to another drive or to a different + machine, it is unlikely that the directory structure will remain identical to that of the original uploaded + photo. When this happens, _Subsurface_ looks for the photos at their original location before they were moved, + cannot find them and therefore cannot display them. Because, after moving photos, large numbers of photos + may need to be deleted and re-imported from the new location, _Subsurface_ has a mechanism that eases the + process of updating the directory information for each photo: automatic updates using fingerprints. + +When a photo is loaded into _Subsurface_, a fingerprint for the image is calculated and stored with the + other reference information for that photo. After moving a photo collection (that has already been loaded + into _Subsurface_) to a different directory, disk or computer, _Subsurface_ can perform the + following steps: + +- look through a particular directory (and all its subdirectories recursively) where photos have been moved + to, + +- calculate fingerprints for all photos in this directory, and + +- if there is a match between a calculated fingerprint and the one originally calculated when a photo was + loaded into _Subsurface_ (even if the original file name has changed), to automatically update the + directory information so that _Subsurface_ can find the photo in the new moved directory. + +This is achieved by selecting from the Main Menu: _File -> Find moved images_. This brings up a window within + which the NEW directory of the photos needs to be specified. Select the appropriate directory and click + the _Scan_ button towards the bottom right of the panel. The process may require several minutes to + complete, after which _subsurface_ will show the appropriate photographs when a particular dive is opened. + + +[[Image_fingerprint_upgrade]] +**** +*Upgrading existing photo collections without fingerprints* +[icon="images/icons/important.png"] +[IMPORTANT] + +Software for the automated update of existing photo collections is under developement. Currently single +dives must be upgraded one at a time. Select the toolbar button on the *Dive profile* panel that enables +the display of images. The thumbnails of images are shown on the dive profile. Then open the dive and +change anything in the *Notes* panel that brings up the blue edit bar at the top of the notes panel +to save the edits. For instance, add a space character at the end of the _Notes_ text box and immediately +delete that space character. Select the optio _Apply changes_ in the blue edit bar to save the dive information. +Fingerprints are calculated while saving this specific dive. + +**** + === Logging special types of dives @@ -1646,7 +1704,7 @@ multicylinder dives are often used by technical divers who dive deep or long. As as _Subsurface_ is concerned, there are only two types of information that need to be provided: - *Describe the cylinders used during the dive* This is performed in the *Equipment tab* of - the *Dive Info* panel, as xref:cylinder_definitions[described above]. Enter the cylinders one by one, + the *Info* panel, as xref:cylinder_definitions[described above]. Enter the cylinders one by one, specifying the characteristics of the cylinder and the gas composition within each cylinder. - *Record the times at which switches from one cylinder to another was done:* This is information @@ -1684,7 +1742,7 @@ dive logging involves, exactly as with multicylinder dives, above, three steps: has this facility) marking each cylinder switch with a bookmark that can be retrieved later. Returning from a dive with the information about cylinder changes is the only tricky 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 *Dive Info Panel* (see + specifications of the different cylinders, using the *Equipment* tab of the *Info Panel* (see image below where two 12 litre cylinder 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 indicated on the dive profile. @@ -1718,7 +1776,7 @@ breathing gas is released continuously from the back cylinder. To log pSCR dives, no special procedures are required, just the normal steps outlined above: -- Select pSCR in the _Dive Mode_ dropdown list on the *Dive Info* panel. +- Select pSCR in the _Dive Mode_ dropdown list on the *Info* panel. - pSCR diving often involves gas changes, requiring an additional cylinder. Define all the appropriate cylinders as described above @@ -1845,9 +1903,9 @@ Poseidon MkVI and APD equipment can be found in xref:S_PoseidonMkVI[Appendix B]. == Obtaining more information about dives entered into the logbook -=== The *Dive Info* tab (for individual dives) +=== The *Info* tab (for individual dives) -The Dive Info tab gives some summary information about a particular dive that +The Info tab gives some summary information about a particular dive that has been selected in the *Dive List*. Useful information here includes the surface interval before the dive, the maximum and mean depths of the dive, the gas volume consumed, the surface air consumption (SAC) and the number of oxygen @@ -2240,9 +2298,8 @@ during a dive is indicated on the right hand side of the above figure for a dive === The Dive List context menu -Many actions within _Subsurface_ are dependent on a context menu used -mostly to manipulate groups of dives. The context menu is found by selecting -a dive or a group of dives and then right-clicking. +Several actions on either a single dive or a group of dives can be performed using the Dive List +Context Menu, found by selecting either a single dive or a group of dives and then right-clicking. image::images/ContextMenu.jpg["Figure: Context Menu",align="center"] @@ -2280,12 +2337,17 @@ given a choice with respect to the lowest sequence number to be used. Completing this operation results in new sequence numbers (based on date/time) for the dives in the *Dive List* panel. +One can also renumber a few selected dives in the dive list. Select the dives that +need renumbering. Right-click on the selected list and use the Dive List Context Menu +to perform the renumbering. A popup window appears requiring the user to specify +the starting number for the renumbering process. + [[S_Group]] === Grouping dives into trips and manipulating trips For regular divers, the dive list can rapidly become very long. _Subsurface_ can group dives into _trips_. It performs this by grouping dives that have -date/times that are not separated in time by more than two days, thus creating +date/times not separated in time by more than two days, thus creating a single heading for each diving trip represented in the dive log. Below is an ungrouped dive list (*A*, on the left) as well as the corresponding grouped dive list comprising five dive trips (*B*, on the right): @@ -2294,14 +2356,14 @@ image::images/Group2.jpg["Figure: Grouping dives",align="center"] Grouping into trips allows a rapid way of accessing individual dives without having to scan a long lists of dives. In order to group the dives in a dive list, -(from the Main Menu) users must select _Log -> Autogroup_. The *Dive List* panel +(from the Main Menu) select _Log -> Autogroup_. The *Dive List* panel now shows only the titles for the trips. ==== Editing the title and associated information for a particular trip Normally, in the dive list, minimal information is included in the trip title. More information about a trip can be added by selecting its trip title from -the *Dive List*. This shows a *Trip Notes* tab in the *Dive Notes* panel. Here +the *Dive List*. This shows a *Trip Notes* tab in the *Notes* panel. Here users can add or edit information about the date/time, the trip location and any other general comments about the trip as a whole (e.g. the dive company that was dived with, the general weather and surface conditions during the trip, etc.). @@ -2319,16 +2381,16 @@ the selected trip, revealing the individual dives performed during the trip. ==== Collapsing or expanding dive information for different trips -If a user right-clicks after selecting a particular trip in the dive list, the -resulting context menu allows several possibilities to expand or collapse dives +After selecting a particular trip in the dive list, the +context menu allows several possibilities to expand or collapse dives within trips. This includes expanding all trips, collapsing all trips and collapsing all trips except the selected one. ==== Merging dives from more than one trip into a single trip -By right-clicking on a selected trip title in the *Dive List* panel, a -context menu shows up that allows the merging of trips by either merging of the selected trip -with the trip below or with the trip above. +After selecting a trip title, the context menu allows the merging +of trips by either merging the selected trip with the trip below or with the +trip above.(Merge trip with trip below; Merge trip with trip above) ==== Splitting a single trip into more than one trip @@ -2358,16 +2420,14 @@ calibration dives of the dive computer or dives of extremely short duration. Users can unlink dives from the trip to which they belong. In order to do this, select and right-click the relevant dives to bring up the context menu. Then select the option *Remove dive(s) -from trip*. The dive(s) now appear immediately above the trip to -which they belonged. +from trip*. The dive(s) now appear immediately above or below the trip to +which they belonged, depending on the date and time of the unliked dive. ==== Add a dive to the trip immediately above Selected dives can be moved from the trip to which they belong and placed within -the trip immediately above the currently active trip. To do this, select -and right-click -the dive(s) to bring up the context menu, and then select *Add dive(s) to trip -immediately above*. +a separate trip. To do this, select and right-click +the dive(s) to bring up the context menu, and then select *Create new trip above*. ==== Shift the start time of dive(s) @@ -2379,7 +2439,7 @@ adjusted. This action brings up the context menu on which the *Shift times* option should be selected. User must then specify the time (in hours and minutes) by which the dives should be adjusted and click on the -option indicating whether the time adjustment should be forwards or backwards. +option indicating whether the time adjustment should be ealier or later. ==== Merge dives into a single dive @@ -2388,12 +2448,20 @@ for a few minutes, resulting in two or more dives being recorded by the dive computer and appearing as different dives in the *Dive List* panel. Users can merge these dives onto a single dive by selecting the appropriate dives, right-clicking them to bring up the context menu and then selecting *Merge selected -dives*. It may be necessary to edit the dive information in the *Dive Notes* +dives*. It may be necessary to edit the dive information in the *Notes* panel to reflect events or conditions that apply to the merged dive. The figure below shows the depth profile of two such dives that were merged: image::images/MergedDive.png["Example: Merged dive",align="center"] +==== Undo dive manipulations + +Important actions on dives or trips, described above, can be undone or redone. +This includes: _delete dives_, _merge dives_, _renumber dives_ and _shift dive times_. +To do this after performing any of these actions, from the *Main Menu* select +_Edit_. This brings up the possibility to _Undo_ or _Redo_ an action. + + [[S_Filter]] === Filtering the dive list @@ -2405,10 +2473,10 @@ dive site, or otherwise the cave dives with a particular buddy. To open the filter, select _Log -> Filter divelist_ from the main menu. This opens the _Filter Panel_ at the top of the _Subsurface_ window. Three icons are located at the top right hand of the filter panel. The _Filter Panel_ can be reset -(i.e. all current filters cleared) by selecting the *+*. The _Filter Panel_ may also be -minimised by selecting the middle icon. When minimised, only these three icons are shown. +(i.e. all current filters cleared) by selecting the *yellow angled arrow*. The _Filter Panel_ may also be +minimised by selecting the *green up-arrow". When minimised, only these three icons are shown. The panel can be maximised by clicking the icon that minimised the panel. The filter may also be -reset and closed by selecting the button with the flag. +reset and closed by selecting the *red button* with the white cross. An example of the _Filter Panel_ is shown in the figure below. image::images/Filterpanel.jpg["Figure: Filter panel",align="center"] @@ -2421,13 +2489,13 @@ textbox above the tags check list results in the tags check list being reduced to "_cave_" and "_cavern_". Filtering of the check list enables the rapid finding of search terms for filtering the dive list. -To activate filtering of the dive list, the check box of at least one item in one of -the four check lists needs to be checked. The dive list is then shortened to include -only the dives that pertain to the selection criteria specified in the check lists. +To activate filtering of the dive list, check at least tone check box in one of +the four check lists. The dive list is then shortened to include +only the dives that pertain to the criteria specified in the check lists. The four check lists work as a filter with _AND_ operators, Subsurface filters therefore for _cave_ as a tag AND _Joe Smith_ as a buddy; but the filters within a category are inclusive - filtering for _cave_ and _boat_ -shows those dives that have either one or both of these tags. +shows those dives that have either one OR both of these tags. [[S_ExportLog]] == Exporting the dive log or parts of the dive log @@ -2452,7 +2520,7 @@ _Facebook_ connection. image::images/facebook1_f20.jpg["Figure: Facebook login",align="center"] Having established a login to _Facebook_, transfer of a dive profile to one's _Facebook_ timeline is easy. -A _Facebook_ icon appears in the *Dive Notes* panel of _Subsurface_ (See image *A* below). Ensure that the dive +A _Facebook_ icon appears in the *Notes* panel of _Subsurface_ (See image *A* below). Ensure that the dive that you want to transfer to the timeline is depicted in the _Subsurface_ *Dive Profile* panel. Select the _Facebook_ icon, and a dialogue is shown, determining the amount of additional information transferred with the dive profile (see image *B*, below). In order to transfer a dive profile to _Facebook_, the name of a @@ -2716,7 +2784,7 @@ image::images/Pref1_f20.jpg["FIGURE: Preferences defaults page",align="center"] the dive list. ** *Default cylinder*: Here users can specify the default cylinder listed in - the *Equipment* tab of the *Dive Notes* panel. + the *Equipment* tab of the *Notes* panel. ** *Animations*: Some actions in showing the dive profile are performed using animations. For instance, the axis values for depth and time change from dive to @@ -2765,6 +2833,7 @@ This panel allows two type of selections: ** _Show unused cylinders in Equipment Tab_: This checkbox allows display of information about unused cylinders when viewing the *Equipment Tab*. Conversely, if this box is not checked, and any cylinders entered using the *Equipment Tab* are not used (e.g. there was no gas switch to such a cylinder), then these cylinders are omitted from that list. +[[GradientFactors_Ref]] ** _Show average depth_: Activating this checkbox causes _Subsurface_ to draw a grey line across the dive profile, indicating the mean depth of the dive up to a particular point in time during that dive. Normally this is a u-shaped line indicating the deepest average depth just before the @@ -2888,7 +2957,7 @@ user interface. It is explicitly used under the following conditions: Like the _Subsurface_ dive log, the planner screen is divided into several sections (see image below). The *setup* parameters for a dive are entered into the several sections on the left hand side of the screen. -The setup is divided into several sections: Available Gases, Rates, Planning, Gas Options and Dive Notes. +The setup is divided into several sections: Available Gases, Rates, Planning, Gas Options and Notes. At the top right hand is a green *design panel* upon which the profile of the dive can be manipulated directly by dragging and clicking as explained below. This feature makes the @@ -2901,17 +2970,18 @@ any warning messages about the dive plan are printed. image::images/PlannerWindow1_f20.jpg["FIGURE: Dive planner startup window",align="center"] -=== Open circuit dives as an example of dive planning +=== Open circuit dives -- Towards the left bottom of the planner (circled in blue in the image below) is a dropbox with three options. Select the appropriate one of these: +- Towards the centre bottom of the planner (circled in blue in the image above) is a dropbox with three options. Select the appropriate one of these: ** Open Circuit (the default) ** CCR ** pSCR +- Choose the Open Circuit option. - In the top left-hand area of the planning screen, ensure that the constant dive parameters are - appropriate. These are: Start date and time of the dive, Atmospheric Pressure and Altitude + appropriate. These are: Start date and time of the intended dive, Atmospheric Pressure and Altitude above sea level of the dive site. The atmospheric pressure can also be entered as an altitude - in metres, assuming an atmospheric pressure of 1.013 bar. + in metres, assuming a sea-level atmospheric pressure of 1.013 bar. - In the table labeled _Available Gases_, add the information of the cylinders to be used as well as the gas composition within that cylinder. This is done in a similar way as for @@ -2922,10 +2992,86 @@ image::images/PlannerWindow1_f20.jpg["FIGURE: Dive planner startup window",align concentration in the boxes provided in this dialogue. Add additional cylinders by using the "+" icon to the top righthand of the dialogue. -- The dialogue indicating _Dive Planner Points_ is usually not used at this stage of the dive - planning. - -*The planning is performed in three stages* +- The profile of the planned dive can be created in two ways: + * Drag the waypoints + (the small white circles) on the existing dive profile in a way to represent the dive. Additional + waypoints can be created by double-clicking the existing dive profile. Waypoints can be deleted + by right-clicking a particular waypoint and selecting the _delete_ item from the resulting + context menu. + * The most efficient way to create a dive profile is to enter the appropriate values into the table + marked _Dive planner points_. The first line of the table represents the duration and the final + depth of the descent from the surface. Subsequent segments describe the bottom phase of the dive. + The _CC set point_ column is only relevant for closed circuit divers. + The ascent is usually not specified because this is what the planner is supposed to calculate. + Add additional segments to the profile by selecting the "+" icon at the top right hand of the + table. Segments entered into the _Dive planner points_ table automatically appear in the *Dive + Profile* diagram. + +==== Recreational dives + +The _Subsurface_ dive planner allows a sophisticated way of planning recreational dives, i.e. dives +that remain within no-decompression limits. +The dive planner automatically takes +into account the nitrogen load incurred in previous dives. But conventional dive tables are also used in a +way that can take into account previous dives. Why use a dive planner for recreational dives? Using +recreational dive tables, the maximum depth of a dive is taken into acount. However, few dives are +undertaken at a constant depth corresponding to the maximum depth (i.e. a "square" dive profile). This means that dive tables +overestimate the nitrogen load incurred during previous dives. The _Subsurface_ +dive planner calculates nitrogen load according to the real dive profiles of all uploaded previous dives, +in a similar way as dive computers calculate nitrogen load during a dive. This mean that the diver gets 'credit' +in terms of nitrogen loading for not remaining at maximum depth during previous dives, enabling planning a +longer subsequent dive. For the planner to work it is therefore crucial to upload all previous dives +onto _Subsurface_ before performing dive planning. + +To plan a dive, the appropriate settings need to be +defined. + +- Ensure that the date and time is set to that of the intended dive. This allows calculation of +the nitrogen load incurred during previous dives. + +- Immediately under the heading _Planning_ are two checkboxes _Recreational_ and _Safety Stop_. + Check these two boxes. + +- Then define the cylinder size, + the gas mixture (air or % oxygen) and the starting cylinder pressure in the top left-hand + section of the planner under _Available gases_. + +- The planner calculates whether the specified cylinder contains enough air/gas to complete + the planned dive. In order for this to be realistic, under _Gas options_, specify an appropriate + surface air consumption (SAC) rate for _Bottom SAC_. Suitable values are between 15 l/min and 30 l/min, + with novice divers or difficult dives requiring SAC rates closer to 30l/min. + +- Define the amount of gas that the cylinder must have at the end of the bottom section of the + dive just before ascent. A value of 50 bar is often used. + +- Define the depth of the dive by dragging the waypoints (white dots) on the dive profile or + (even better) defining the appropriate depths using the table under _Dive planner points_ as + desribed under the previous heading. If + this is a multilevel dive, set the appropriate dive depths to represent the dive plan by adding + waypoints to the dive profile or by adding appropriate dive planner points to the _Dive Planner Points_ + table. + +- The ascent speed can be changed. The default ascent speeds are those considered safe for recreational + divers. + +The dive profile in the planner indicates the maximum dive time within no-deco limits using the +Bühlmann ZH-L16 algorithm and the gas and depth settings specified as described above. The _Subsurface_ planner +allows rapid assessment of dive duration as a function of dive depth, given the nitrogen load incurred during previous dives. The +dive plan includes estimates of the amount of air/gas used, depending on the cylinder settings specified +under _Available gases_. If the initial cylinder pressure is set to 0, the dive duration shown is the +true no-deco limit (NDL) without taking into account gas used during the dive. If the surface above the dive profile is RED +it means that recreational dive limits are exceeded and either the dive duration or the dive depth needs to be reduced. + +Below is an image of a dive plan for a recreational dive at 30 metres. Although the no-deco limit (NDL) is 23 +minutes, the duration of the dive is limited by the amount of air in the cylinder, reflected by the information in the +text box at the bottom right of the panel. + +image::images/rec_diveplan.jpg["FIGURE: A recreational dive plan: setup",align="center"] + +==== Non-recreational open circuit dives, including decompression + +Non-recreational dive planning involves exceeding the no-deco limits and/or using multiple breathing gases. +Such dives are planned in three stages: *a) Nitrogen management*: This is performed by specifying the rates for descent and ascent, as well as the gradient factors (GFLow and GFHigh) under the headings _Rates_ and _Planning_ @@ -2950,7 +3096,6 @@ often in the range of 4-9 m/min. The descent rate is also specified. If the opti is activated, then the descent phase of the planned dive will be at the maximal descent rate specified in the _Rates_ section of the dive setup. - *b) Oxygen management*: In the *Gas Options* part of the dive specification, the maximum partial pressure for oxygen needs to be specified for the bottom part of the dive (_bottom po2_) as well as for the decompression part of the dive (_deco po2_). @@ -3028,7 +3173,7 @@ in the *Dive List* panel of _Subsurface_. On the bottom right of the dive planner, under _Dive Plan Details_, the exact details of the dive plan are provided. These details may be modified by checking any of the -options under the _Dive Notes_ section of the dive planner, immediately to the left +options under the _Notes_ section of the dive planner, immediately to the left of the _Dive Plan Details_. If a _Verbatim diveplan_ is requested, a detailed sentence-level explanation of the dive plan is given. If any of the management specifications have been exceeded during the planning, a warning @@ -3039,6 +3184,25 @@ level is indicated in the _Dive Plan Details_. This duration INCLUDES the transi time to get to that level. However, if the _Display transition in deco_ option is checked, the transitions are shown separately from the segment durations at a particular level. +=== Planning pSCR dives + +To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ rather than +_Open circuit_ in the dropdown list. +The parameters of the pSCR diver can be set by selecting _File -> Preferences -> Graph_ +from the main menu, where the gas consumption calculation takes into account the pSCR dump +ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop +accross the mouthpiece of the rebreather into account. If the +pO~2~ drops below what is considered a save value, a warning appears in the _Dive plan +details_. A typical pSCR configuration is with a single cylinder and one or more bail-out +cylinders. Therefore the setup of the _Available gases_ and the _Dive planner points_ tables +are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints +are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable +to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen +in the loop due to the oxygen drop across the mouthpiece of the pSCR equipment. + +image::images/Planner_pSCR1_f20.jpg["FIGURE: Planning a pSCR dive: setup",align="center"] + + === Planning CCR dives To plan a dive using a closed circuit rebreather, select the _CCR_ option in the dropdown @@ -3063,25 +3227,6 @@ image::images/Planner_CCR1_f20.jpg["FIGURE: Planning a CCR dive: setup",align="c Note that, in the _Dive plan details_, the gas consumption for a CCR segment is not calculated, so gas consumptions of 0 litres are the norm. -=== Planning pSCR dives - -To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ rather than -_Open circuit_ in the dropdown list. -The parameters of the pSCR diver can be set by selecting _File -> Preferences -> Graph_ -from the main menu, where the gas consumption calculation takes into account the pSCR dump -ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop -accross the mouthpiece of the rebreather into account. If the -pO~2~ drops below what is considered a save value, a warning appears in the _Dive plan -details_. A typical pSCR configuration is with a single cylinder and one or more bail-out -cylinders. Therefore the setup of the _Available gases_ and the _Dive planner points_ tables -are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints -are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable -to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen -in the loop due to the oxygen drop across the mouthpiece of the pSCR equipment. - -image::images/Planner_pSCR1_f20.jpg["FIGURE: Planning a pSCR dive: setup",align="center"] - - [[S_Replan]] === Modifying an existing dive plan @@ -3124,7 +3269,7 @@ inclusion in a text file or word processing document. Dive plans have many characteristics in common with dive logs (dive profile, dive notes, etc). After a dive plan has been saved, the dive details and gas calculations are saved in -the *Dive Notes* tab. While a dive plan is being designed, it can be printed using +the *Notes* tab. While a dive plan is being designed, it can be printed using the _Print_ button in the dive planner. This prints the dive details and gas calculations in the _Dive Plan Details_ panel of the dive planner. However, after the plan has been saved, it is represented in a way very similar to a dive log and the gas calculations cannot be @@ -3149,6 +3294,8 @@ dealing with the appropriate operations. - <<S_ExportLog,_Export_>> - Export the currently open dive logbook (or the selected dives in the logbook) to one of several formats. - <<S_PrintDivelog,_Print_>> - Print the currently open logbook. +- <<S_FindMovedImages, _Find moved images_>> - If photos taken during dives have been moved to + a different disk or directory, locate them and link them to the appropriate dives. - <<S_Preferences,_Preferences_>> - Set the _Subsurface_ preferences. - <<S_Configure,_Configure dive computer_>> - Edit the configuration of a dive computer. - _Quit_ - Quit _Subsurface_. @@ -3165,8 +3312,9 @@ dealing with the appropriate operations. === Log - <<S_EnterData,_Add Dive_>> - Manually add a new dive to the *Dive List* panel. +- _Edit dive_ - Edit a dive of which the profile was entered by hande and not from a dive computer. - <<S_DivePlanner,_Plan Dive_>> - This feature allows the planning of dives. -- <<S_Replan,_Re-plan dive_>> - Edit a dive plan that has been saved into the *Dive List*. +- <<S_Replan,_Edit dive in planner_>> - Edit a dive plan that has been saved into the *Dive List*. - <<S_CopyComponents,_Copy dive components_>> - By selecting this option, one can copy information from several fields of a dive log onto the clipboard. - _Paste dive components_ - Paste, into the selected dives in the *Dive List*, @@ -3183,7 +3331,7 @@ dealing with the appropriate operations. simmultaneously. - <<S_ViewPanels,_Dive List_>> - View only the *Dive List* panel. - <<S_ViewPanels,_Profile_>> - View only the *Dive Profile* panel. -- <<S_ViewPanels,_Info_>> - View only the *Dive Notes* panel. +- <<S_ViewPanels,_Info_>> - View only the *Notes* panel. - <<S_ViewPanels,_Globe_>> - View only the *World Map* panel. - _Yearly Statistics_ - Display summary statistics about dives during this and past years. @@ -3452,7 +3600,9 @@ dive computer and download dive information. Under Windows, a similar situation exists. Drivers for the MCS7780 are available from some Internet web sites e.g. -http://www.drivers-download.com/Drv/MosChip/MCS7780/[www.drivers-download.com]. +http://www.drivers-download.com/Drv/MosChip/MCS7780/[www.drivers-download.com]. Windows-based IrDA +drivers for the Uwatec can also be downloaded from the ScubaPro web site, drivers being located on +the download page for the ScubaPro SmartTrak software. For the Apple Mac, IrDA communication via the MCS7780 link is not available for OSX 10.6 or higher. @@ -3588,7 +3738,7 @@ conventions to export dive log data. 4. Within the list of dives, select the dives you would like to import later: * To select certain dives: hold 'ctrl' and click the dive * To select all dives: Select the first dive, hold down shift and - select the last dive + select the last dive 5. With the dives marked, use the program menu _File -> Export_ 6. The export pop-up will show. Within this pop-up, there is one field called 'Export Path'. * Click the browse button next to the field Export Path @@ -3629,6 +3779,7 @@ Making a backup copy of the Suunto DM4/DM5 database: === Exporting from Atomic Logbook [[Atomic_Export]] +[icon="images/icons/atomiclogo.jpg"] [NOTE] Atomic Logbook is a Windows software by Atomic Aquatics. It allows downloading of dive information from Cobalt and Cobalt 2 dive computers. diff --git a/Documentation/user-manual_es.txt b/Documentation/user-manual_es.txt index 41a5a1152..7f2e6c136 100644 --- a/Documentation/user-manual_es.txt +++ b/Documentation/user-manual_es.txt @@ -92,9 +92,9 @@ Empezar a usar el programa -------------------------- La ventana _Subsurface_ está, habitualmente, dividida en cuatro paneles con un -*Menú principal* (Archivo Importar Registro Vista Filtros 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: +*Menú principal* (Archivo Importar Registro Vista 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: 1. La *Lista de inmersiones* abajo a la izquierda. Contienen una lista de todos los buceos en tu registro. Puedes seleccionar y resaltar una inmersión de la @@ -107,7 +107,7 @@ inmersiones. mapamundi y aparece centrado en el punto de la última inmersión seleccionada de la *Lista de Inmersiones*. -3. La *Información de la inmersión* arriba a la izquierda, presentando +3. La *Información* arriba a la izquierda, presentando información más detallada de la inmersión seleccionada en la *Lista de inmersiones*, incluyendo algunas estadÃsticas de la inmersión seleccionada o de todas las inmersiones resaltadas. @@ -124,8 +124,8 @@ Si se selecciona una inmersión en la *Lista de inmersiones*, se muestra su ubicación, información detallada y su perfil en sus paneles respectivos. Por otra parte, si uno selecciona más de un buceo, el último resaltado actuará como _inmersión seleccionada_, pero los datos resumidos de las _inmersiones -resaltadas_ se mostrarán en la pestaña *EstadÃsticas* del panel *Información de -la inmersión* (máximas, mÃnimas y medias de profundidades, duraciones, +resaltadas_ se mostrarán en la pestaña *EstadÃsticas* del panel *Información* +(máximas, mÃnimas y medias de profundidades, duraciones, temperaturas del agua, consumos de gases; el tiempo total y el número de inmersiones seleccionadas). @@ -209,18 +209,18 @@ buceo o el dive master o el guÃa, y algunas anotaciones acerca de la inmersión _Subsurface_ puede conservar mucha más información por cada inmersión. Para añadir una inmersión a un registro de buceo, selecciona _Registro → Añadir Inmersión_ en el menú principal. El programa muestra entonces tres paneles para -introducir información: Dos pestañas en el panel *Información de la Inmersión* -(*Notas de la inmersión* y *Equipo*), asà como el panel perfil que muestra un +introducir información: Dos pestañas en el panel *Información* +(*Notas* y *Equipo*), asà como el panel perfil que muestra un perfil gráfico de cada buceo. Estos paneles estan marcados respectivamente como [red]#A#, [red]#B# y [red]#C# en la figura de abajo. Ahora veremos cada una de las pestañas usadas para introducir la información. image::images/AddDive1_f20.jpg["FIGURA: Añadir inmersión",align="center"] -Al editar un campo de los paneles _Notas de la Inmersión_ o _Equipo_, _Subsurface_ +Al editar un campo de los paneles _Notas_ o _Equipo_, _Subsurface_ entra en el modo de edición. Esto se indica con el mensaje en un recuadro azul -en la parte de arriba del panel _Notas de la Inmersión_. Este mensaje se -muestra en todos los paneles dependientes de _Notas de la Inmersión_ mientras +en la parte de arriba del panel _Notas_. Este mensaje se +muestra en todos los paneles dependientes de _Notas_ mientras se esté en modo de edición. image::images/BlueEditBar_f20.jpg["Blue edit bar",align="center"] @@ -233,14 +233,14 @@ en memoria una copia local de la información. Al salir de _Subsurface_, el programa preguntará de nuevo, esta vez si se guarda el diario completo en el disco o no. -==== Notas de la inmersión +==== Notas Este panel contiene la información de fecha, hora y lugar de un buceo concreto, condiciones ambientales, compañeros asà como alguna información descriptiva. Si -pulsas en la pestaña *Notas de la inmersión*, los siguientes campos aparecen +pulsas en la pestaña *Notas*, los siguientes campos aparecen visibles: -image::images/AddDive2_f20.jpg["FIGURA: La pestaña Notas de la inmersión",align="center"] +image::images/AddDive2_f20.jpg["FIGURA: La pestaña Notas",align="center"] El campo *Hora* refleja la fecha y la hora de la inmersión. Clicando la fecha se muestra un calendario desde el que seleccionar la fecha correcta. Pulsa ESC para @@ -333,9 +333,9 @@ introducirse aquÃ. Los botones *Guardar* y *Cancelar* se utilizan para guardar toda la información de los campos del panel de información y del panel de perfil, por lo que no hay necesidad de usarlos hasta que se ha añadido TODA la información. Aquà hay un -ejemplo de panel de Notas de la Inmersión completo: +ejemplo de panel de Notas completo: -image::images/CompletedDiveInfo_f20.jpg["FIGURA: Una pestaña de Notas de la Inmersión completada",align="center"] +image::images/CompletedDiveInfo_f20.jpg["FIGURA: Una pestaña de Notas completada",align="center"] ==== Equipo @@ -468,10 +468,10 @@ image::images/DiveProfile4_f20.jpg["FIGURE: Perfil de inmersión completado",ali ==== Guardar la información introducida a mano -La información introducida en las pestañas *Notas de la inmersión*, Equipo y +La información introducida en las pestañas *Notas*, Equipo y *Perfil de la inmersión* puede guardarse en el registro de inmersiones del -usuario utilizando los dos botones arriba a la derecha de la pestaña "Notas de -la Inmersión". Si se pulsa _Guardar_, los datos del buceo se guardan en el +usuario utilizando los dos botones arriba a la derecha de la pestaña "Notas". +Si se pulsa _Guardar_, los datos del buceo se guardan en el registro actual. Si se pulsa _Cancelar_ los datos recién introducidos serán descartados. Al salir de _Subsurface_ al usuario se le pedirá que guarde el registro con la nueva(s) inmersión(es). @@ -682,10 +682,10 @@ lugar del modelo, permitiendo una identificación de dispositivos más fácil. Con los buceos descargados en la *Lista de inmersiones*, la información del ordenador no está completa y es necesario añadir más detalles para tener un registro más detallado de las inmersiones. Para ello se usan las pestañas -*Notas de la Inmersión* y *Equipo* arriba a la izquierda de la ventana de +*Notas* y *Equipo* arriba a la izquierda de la ventana de _Subsurface_. -==== Notas de la inmersión +==== Notas La fecha y hora del buceo, la mezcla de gases y, a menudo, la temperatura del agua se muestran al haberse obtenido del ordenador de buceo, pero el usuario @@ -693,10 +693,10 @@ necesita añadir a mano alguna información para tener un registro más completo la inmersión. En algunos casos (p.e. rebreathers APD) también se ha de facilitar la fecha y la hora. Si se cambia o edita de alguna manera el contenido de esta pestaña, el mensaje de la barra azul arriba del panel indicará que se está -editando el buceo. Si se pulsa en la pestaña *Notas de la inmersión*, se +editando el buceo. Si se pulsa en la pestaña *Notas*, se visualizan los siguientes campos: -image::images/AddDive3_f20.jpg["FIGURA: La pestaña Notas de la inmersión",align="center"] +image::images/AddDive3_f20.jpg["FIGURA: La pestaña Notas",align="center"] El campo *Hora* refleja la fecha y la hora de la inmersión. Clicando la fecha se muestra un calendario desde el que seleccionar la fecha correcta. Pulsa ESC para @@ -783,9 +783,9 @@ y *profunda* para que elija entre ellas. Los botones *Guardar* y *Cancelar* se utilizan para guardar toda la información de los campos del panel de información y del panel de perfil, por lo que no hay necesidad de usarlos hasta que se ha añadido TODA la información. Aquà hay un -ejemplo de panel de Notas de la Inmersión completo: +ejemplo de panel de Notas completo: -image::images/CompletedDiveInfo_f20.jpg["FIGURA:Una pestaña completa de Notas de la Inmersión",align="center"] +image::images/CompletedDiveInfo_f20.jpg["FIGURA:Una pestaña completa de Notas",align="center"] ==== Equipo @@ -870,7 +870,7 @@ image::images/WeightsDataEntry3_f20.jpg["FIGURA: Tabla con información de lastr _METODO 1_: Tras descargar inmersiones de un ordenador de buceo, los perfiles de los buceos descargados se mostrarán en el panel "Perfil de la inmersión", -asà como algunas otras informaciones en las pestañas "Notas de la Inmersión" y +asà como algunas otras informaciones en las pestañas "Notas" y "Equipo". Sin embargo, otros campos permanecerán vacÃos. Puede resultar útil editar simultáneamente algunos de los campos de las "Notas @@ -879,7 +879,7 @@ efectuara varias inmersiones en un solo dÃa utilizando el mismo equipo, o en el mismo punto de buceo o con el mismo guÃa o compañero. En lugar de completar la información de las inmersiones una por una, se pueden seleccionar todos los buceos deseados en la "Lista de Inmersiones" e insertar la información común en -las "Notas de Inmersión" y "Equipo". +las "Notas" y "Equipo". La edición simultánea solo funciona con campos que no contienen aún ninguna información. Esto significa que si, para una inmersión en concreto, uno de los @@ -896,10 +896,10 @@ varios buceos similares. [[S_CopyComponents]] _METODO 2_: Hay una forma diferente de hacer lo mismo. Seleccionamos un buceo -que contenga toda la información apropiada en las pestañas *Notas de la -Inmersión* y *Equipo*. Entonces, desde el menú principal, seleccionamos +que contenga toda la información apropiada en las pestañas *Notas* y *Equipo*. +Entonces, desde el menú principal, seleccionamos _Registro -> Copiar componentes_. Aparecerá una ventana con casillas -seleccionables para la mayorÃa de campos de las pestañas *Notas de la inmersión* +seleccionables para la mayorÃa de campos de las pestañas *Notas* y *Equipo*. Selecciona los campos a copiar desde la inmersión seleccionada, luego pulsa _Aceptar_. Ahora selecciona en la *Lista de Inmersiones* los buceos a los que pegar esta información. Desde el menú principal, selecciona _Registro @@ -930,9 +930,8 @@ image::images/Bookmarks.jpg["FIGURA: Diálogo de marcadores",align="center"] ==== Guardar la información de buceo actualizada -La información introducida en las pestañas Notas de la inmersión y Equipo puede -guardarse utilizando los dos botones de arriba a la derecha de la pestaña *Notas -de la Inmersión*. Si se pulsa _Guardar_ los datos del buceo se guardan. Si se +La información introducida en las pestañas Notas y Equipo puede +guardarse utilizando los dos botones de arriba a la derecha de la pestaña *Notas*. Si se pulsa _Guardar_ los datos del buceo se guardan. Si se pulsa _Cancelar_ los datos de buceo recién introducidos se borran, aunque el perfil y los datos descargados del ordenador quedarán retenidos. Cuando el usuario salga de _Subsurface_ hay una pregunta final para confirmar si los @@ -1577,7 +1576,7 @@ perfil de la inmersión. Si está en un rango de 30 minutos, sà se muestra. Después que las imágenes han sido cargadas aparecen en dos lugares: - - La pestaña _Fotos_ del panel _Notas de la inmersión_. + - La pestaña _Fotos_ del panel _Notas_. - Como pequeños iconos (chinchetas) sobre el perfil de inmersión, en posiciones que relejan la hora en que se tomó cada fotografÃa. Ver a continuación: @@ -1645,7 +1644,7 @@ profundo y durante mucho tiempo. En lo que corresponde a _Subsurface_, solo hay dos clases de información que necesitan proporcionarse: - *Describir las botellas usadas durante el buceo*. Esto se hace en la pestaña - *Equipo* del panel *Información de la inmersión* tal como xref:cylinder_definitions[se describe anteriormente]. + *Equipo* del panel *Información* tal como xref:cylinder_definitions[se describe anteriormente]. se introducen las botellas una a una, especificando las caracterÃsticas de la botella y la composición del gas de cada una de ellas. @@ -1733,7 +1732,7 @@ Para registrar inmersiones con pSCR, no se requieren procedimientos especiales, solo los pasos normales descritos con anterioridad: - Seleccionar el modo pSCR en el desplegable _Modo de inmersión_ en el panel - *Información de la inmersión*. + *Información*. - El buceo con pSCR, a menudo, requiere cambios de gas, necesitando una botella adicional. Hay, pues, que describir todas las botellas como se indicó con @@ -1861,9 +1860,9 @@ Puede incluir información de ajustes o metadatos sobre la inmersión. == Obtener más información sobre inmersiones guardadas en el diario -=== La pestaña Información de la inmersión (para inmersiones individuales) +=== La pestaña Información (para inmersiones individuales) -La pestaña Información de la inmersión proporciona alguna información resumida +La pestaña Información proporciona alguna información resumida sobre un buceo en particular que ha sido seleccionado en la *Lista de inmersiones*. La información útil incluye el intervalo en superficie antes de la inmersión, las profundidades máxima y media, el volumen de gas consumido, el @@ -2273,10 +2272,9 @@ lado derecho de la figura anterior, para un buceador usando EAN32. === El menú contextual de la Lista de Inmersiones -Muchas acciones en _Subsurface_ dependen de un menú contextual que se usa -básicamente para manipular grupos de inmersiones. El menú contextual se -encuentra seleccionando una inmersión o un grupo de ellas y haciendo -clic-derecho. +Varias acciones sobre, bien una inmersión, bien un grupo de ellas, se pueden +efectuar utilizando el Menú Contextual de la Lista de inmersiones, al que se +accede seleccionando una inmersión o un grupo de ellas y haciendo clic-derecho. image::images/ContextMenu.jpg["Figura: Menú contextual",align="center"] @@ -2319,6 +2317,12 @@ secuencia inferior que se va a usar. Completar esta operación supone obtener nuevos números de secuencia (basados en fecha/hora) para los buceos del panel *Lista de Inmersiones*. +También se pueden renumerar algunas inmersiones seleccionadas de la lista. Se +seleccionan las inmersiones que necesiten renumerarse. Se hace clic-derecho +sobre la lista seleccionada y se utiliza la lista contextual para efectuar el +renumerado. Aparecerá una ventana solicitando al usuario que especifique el +número de inicio para el proceso de numeración. + [[S_Group]] === Agrupar las inmersiones en viajes y manipularlos @@ -2355,16 +2359,16 @@ uno o más viajes clicando la punta de flecha a la izquierda del tÃtulo. Con el se expande el viaje mostrando los buceos individuales efectuados. ==== Colapsar o expandir información de diferentes viajes -Si se hace clic-derecho después de seleccionar un viaje concreto de la lista, el -menú resultante te ofrece varias posibilidades de expandir o contraer buceos -incluidos en viajes. Entre ellas expandir todos los viajes, contraer todos los -viajes y contraer todos excepto el seleccionado. + +Tras seleccionar un viaje concreto de la lista, el menú contextual resultante +ofrece varias posibilidades de expandir o contraer buceos incluidos en viajes. +Entre ellas expandir todos los viajes, contraer todos los viajes y contraer +todos excepto el seleccionado. ==== Mezclar inmersiones de más de un viaje en uno solo -Al hacer clic-derecho en el tÃtulo de un viaje seleccionado del panel *Lista de -Inmersiones*, el menú permite mezclar viajes con el viaje de abajo o con el de -arriba. +Tras seleccionar el tÃtulo de un viaje del panel *Lista de Inmersiones*, el +menú permite mezclar viajes con el viaje de abajo o con el de arriba. ==== Separar un viaje en más de uno @@ -2392,7 +2396,8 @@ inmersiones de prueba o buceos de duración extremadamente corta. Se pueden separar inmersiones del viaje al que pertenecen. Para ello se selecciona y hace clic-derecho en los buceos para mostrar el menú. Luego se selecciona *Quitar inmersión(es) del viaje*. Las inmersiones que han sido -separadas aparecerán ahora encima del viaje al que pertenecieron. +separadas aparecerán ahora encima o debajo del viaje al que pertenecieron, en +función de la fecha y la hora de la inmersión separada. ==== Añadir una inmersión al viaje de arriba @@ -2419,8 +2424,8 @@ grabadas por el ordenador y apareciendo como buceos distintos en el panel *Lista de inmersiones*. Se pueden unir estos buceos en uno solo seleccionando las correspondientes inmersiones y haciendo clic-derecho para mostrar el menú. Entonces se selecciona *Mezclar inmersiones seleccionadas*. Puede que sea -necesario editar la información de la inmersión en el panel *Notas de la -inmersión* para reflejar situaciones o condiciones que afecten al buceo +necesario editar la información de la inmersión en el panel *Notas* para +reflejar situaciones o condiciones que afecten al buceo resultante de la fusión. La figura a continuación muestra el perfil de dos inmersiones que fueron unidas: @@ -2440,10 +2445,11 @@ Para abrir el filtrado, seleccionar _Registro -> Filtrar la lista de inmersiones desde el menú principal. Esto abrirá el _Panel de filtrado_ en la parte de arriba de la ventana de _Subsurface_. Arriba a la derecha del panel se ubican tres iconos. El _Panel de filtrado_ puede reiniciarse (p.e. limpiar todos los filtros -actuales) seleccionando el *+*. El _Panel de filtrado_ también puede minimizarse -seleccionando el icono central. 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 icono con la bandera. +actuales) seleccionando la flecha amarilla. El _Panel de filtrado_ también puede +minimizarse seleccionando la *flecha verde*. 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 *botón rojo* con la +cruz blanca. Un ejemplo del _Panel de filtrado_ se muestra en la figura a continuación. image::images/Filterpanel.jpg["Figura: Panel de filtrado",align="center"] @@ -2492,7 +2498,7 @@ image::images/facebook1_f20.jpg["Figure: Acceso a Facebook",align="center"] Tras haber establecido una conexión con _Facebook_, transferir un perfil de inmersión a nuestro perfil de _Facebook_ es sencillo. Un icono de _Facebook_ -aparece en el panel *Notas de la inmersión* de _Subsurface_ (ver imagen *A* a +aparece en el panel *Notas* de _Subsurface_ (ver imagen *A* a continuación). Asegúrate de que la inmersión que quieres transferir al historial es la que se muestra en el panel *Perfil de la inmersión*. Selecciona el icono de _Facebook_ y se mostrará un icono que determinará la cantidad de información @@ -2764,7 +2770,7 @@ image::images/Pref1_f20.jpg["FIGURA: Pantalla de Predeterminados en Preferencias inmersiones se muestran en la lista. ** *Botella por defecto*: Se puede especificar una botella por defecto de las - que aparecen listadas en la pestaña *Equipo* del panel *Notas de la inmersión*. + que aparecen listadas en la pestaña *Equipo* del panel *Notas*. Es muy cómodo si se bucea habitualmente con el mismo tipo de botella, asigna a cada nueva inmersión una botella del tipo aquà definido. @@ -2964,7 +2970,7 @@ Al igual que el diario de _Subsurface_, la pantalla del planificador se divide en varias secciones (ver imagen a continuación). Los parámetros de ajuste de una inmersión se introducen en las diversas secciones a la izquierda de la pantalla. El ajuste se divide en varias secciones: Gases disponibles, Ritmos, Planificar, -Opciones de gases y Notas de inmersión. +Opciones de gases y Notas. Arriba a la derecha hay un *panel de diseño* verde sobre el cual puede manipularse directamente el perfil de inmersión arrastrando y haciendo clic como @@ -3112,7 +3118,7 @@ guardado aparecerá en el panel *Lista de Inmersiones*. En la parte inferior derecha del planificador, bajo el encabezamiento _Detalles del plan de buceo_, se proporcionan los detalles exactos del plan de inmersión. Estos detalles pueden modificarse seleccionando cualquiera de las opciones bajo -el encabezamiento _Notas de la inmersión_ del planificador, justo a la izquierda +el encabezamiento _Notas_ del planificador, justo a la izquierda del anterior. Si se solicita un _Plan de buceo detallado_, se obtendrá un plan detallado al nivel de oraciones. Si cualquiera de los lÃmites especificados se sobrepasa, se obtendrá un mensaje de aviso bajo la información del plan. @@ -3215,7 +3221,7 @@ textos. Los planes de inmersión tienen muchas caracterÃsticas en común con los registros de buceo (perfil, notas, etc). Despues de haber guardado un plan, los detalles y -los calculos de gas quedan almacenados en la pestaña *Notas de la inmersión*. +los calculos de gas quedan almacenados en la pestaña *Notas*. Mientras se está diseñando un plan, se puede imprimir utilizando el botón _Imprimir_ del planificador. Esto imprimirá los detalles y cálculos de gases del panel _Detalles del plan de inmersión_ del planificador. Sin embargo, tras haber @@ -3286,7 +3292,7 @@ de este manual que describen las operaciones con más detalle. - <<S_ViewPanels,_Lista_de_inmersiones_>> - Se visualiza solo el panel Lista de inmersiones. - <<S_ViewPanels,_Perfil_>> - Se visualiza solo el panel Perfil de inmersión. -- <<S_ViewPanels,_Info_>> - Se visualiza solo el panel Notas de la inmersión. +- <<S_ViewPanels,_Info_>> - Se visualiza solo el panel Notas. - <<S_ViewPanels,_Globo_>> - Se presenta solo el panel Mapamundi. - _EstadÃsticas anuales_ - Muestra estadÃsticas anuales resumidas sobre las inmersiones efectuadas en este año y los pasados. diff --git a/Documentation/user-manual_fr.html.git b/Documentation/user-manual_fr.html.git index 315642988..b9f098763 100644 --- a/Documentation/user-manual_fr.html.git +++ b/Documentation/user-manual_fr.html.git @@ -508,26 +508,26 @@ nouveau sondage en démarrant <em>Subsurface</em> avec l’option <em>--sur ligne de commande.</p></div>
</div>
</div>
-<div class="sect1">
-<h2 id="S_StartUsing">3. Commencer à utiliser le programme</h2>
-<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 Importer Journal Vue Aide) en haut de 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, contenant une liste de toutes les
-plongées du journal (carnet) de plongées de l’utilisateur. Une plongée peut
-être sélectionnée et mise en surbrillance dans la liste en cliquant
+<div class="sect1"> +<h2 id="S_StartUsing">3. Commencer à utiliser le programme</h2> +<div class="sectionbody"> +<div class="paragraph"><p>The <em>Subsurface</em> window is usually divided into four panels with a <strong>Main +Menu</strong> (File Import Log View Help) at the top of the window (for Windows and +Linux) or the top of the screen (for Mac and Ubuntu Unity). The four panels +are:</p></div> +<div class="paragraph"><p>La <strong>liste des plongées</strong> en bas à gauche, contenant une liste de toutes les +plongées du journal (carnet) de plongées de l’utilisateur. Une plongée peut +être sélectionnée et mise en surbrillance dans la liste en cliquant dessus. Dans la plupart des cas, les touches haut/bas peuvent être utilisée
pour passer d’une plongée à l’autre. La <strong>liste des plongées</strong> est un outil
important pour 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’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>.</p></div>
-<div class="paragraph"><p>Les <strong>informations de plongée</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 statistiques pour la plongée sélectionnée ou pour toutes les plongées
-mises en surbrillance.</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
+statistiques pour la plongée sélectionnée ou pour toutes les plongées mises
+en surbrillance.</p></div>
<div class="paragraph"><p>Le <strong>profil de plongée</strong> en haut à droite, affiche un profil de plongée
graphique de la plongée sélectionnée dans la <strong>liste des plongées</strong>.</p></div>
<div class="paragraph"><p>Les séparateurs entre ces panneaux peuvent être déplacés pour modifier la
@@ -540,9 +540,9 @@ sélectionnée</em> sont affichées dans les panneaux respectifs. D’autre plus d’une plongée est mise en surbrillance seule la dernière mise en
surbrillance est la <em>plongée sélectionnée</em>, mais les données de <em>toutes les
plongées mises en surbrillances</em> sont affichées dans l’onglet <strong>Stats</strong> du
-panneau <strong>informations de plongée</strong> (profondeur maximale, minimale et moyenne,
-les durées, les températures de l’eau et le SAC (air consommé); temps total
-et nombre de plongées sélectionnées).</p></div>
+panneau <strong>informations</strong> (profondeur maximale, minimale et moyenne, les
+durées, les températures de l’eau et le SAC (air consommé); temps total et
+nombre de plongées sélectionnées).</p></div>
<div class="imageblock" id="S_ViewPanels" style="text-align:center;">
<div class="content">
<img src="images/main_window_f20.jpg" alt="The Main Window" />
@@ -639,20 +639,20 @@ duration, depth, the names of your dive buddy and of the dive master or dive guide, and some remarks about the dive. <em>Subsurface</em> can store much more
information than this for each dive. In order to add a dive to a dive log,
select <em>Log → Add Dive</em> from the Main Menu. The program then shows three
-panels to enter information for a dive: two tabs in the <strong>Dive Info</strong> panel
-(<strong>Dive Notes</strong> and <strong>Equipment</strong>), as well as the <strong>Dive Profile</strong> panel that
-displays a graphical profile of each dive. These panels are respectively
-marked <span class="red">A</span>, <span class="red">B</span> and <span class="red">C</span> in the figure below. Each of these
-tabs will now be explained for data entry.</p></div>
+panels to enter information for a dive: two tabs in the <strong>Info</strong> panel
+(<strong>Notes</strong> and <strong>Equipment</strong>), as well as the <strong>Dive Profile</strong> panel that displays
+a graphical profile of each dive. These panels are respectively marked
+<span class="red">A</span>, <span class="red">B</span> and <span class="red">C</span> in the figure below. Each of these tabs will
+now be explained for data entry.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/AddDive1_f20.jpg" alt="FIGURE: Add dive" />
</div>
</div>
-<div class="paragraph"><p>When one edits a field in Dive notes or Equipment panels, <em>Subsurface</em>
-enters <strong>Editing Mode</strong>, indicated by the message in the blue box at the top
-of the <em>Dive Notes</em> panel (see the image below). This message is displayed
-in all the panels under Dive notes and Equipment when in <strong>Editing Mode</strong>.</p></div>
+<div class="paragraph"><p>When one edits a field in Notes or Equipment panels, <em>Subsurface</em> enters
+<strong>Editing Mode</strong>, indicated by the message in the blue box at the top of the
+<em>Notes</em> panel (see the image below). This message is displayed in all the
+panels under Notes and Equipment when in <strong>Editing Mode</strong>.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/BlueEditBar_f20.jpg" alt="Blue edit bar" />
@@ -666,14 +666,14 @@ specific dive is saved in memory. When one closes Subsurface, the program will ask again, this time whether the complete dive log should be saved on
disk or not.</p></div>
<div class="sect3">
-<h4 id="_notes_de_plongée">5.1.1. Notes de plongée</h4>
+<h4 id="_notes">5.1.1. Notes</h4>
<div class="paragraph"><p>This panel contains the date, time and place information for a particular
dive, environmental conditions, co-divers and buddies, as well as some
-descriptive information. If one clicks on the <strong>Dive Notes</strong> tab, the
-following fields are visible:</p></div>
+descriptive information. If one clicks on the <strong>Notes</strong> tab, the following
+fields are visible:</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
-<img src="images/AddDive2_f20.jpg" alt="FIGURE: The Dive Notes tab" />
+<img src="images/AddDive2_f20.jpg" alt="FIGURE: The Notes tab" />
</div>
</div>
<div class="paragraph"><p>The <strong>Time</strong> field reflects the date and the time of the dive. By clicking the
@@ -765,10 +765,10 @@ shown for the user to choose from.</p></div> <div class="paragraph"><p>The <strong>Save</strong> and <strong>Cancel</strong> buttons are used to save all the information for
tabs in the info panel and in the dive profile panel, so there’s no need to
use them until ALL other information has been added. Here is an example of a
-completed Dive Notes panel:</p></div>
+completed Notes panel:</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
-<img src="images/CompletedDiveInfo_f20.jpg" alt="FIGURE: A completed Dive Notes tab" />
+<img src="images/CompletedDiveInfo_f20.jpg" alt="FIGURE: A completed Notes tab" />
</div>
</div>
</div>
@@ -914,13 +914,13 @@ EAN50.</p></div> </div>
<div class="sect3">
<h4 id="_saving_the_hand_entered_dive_information">5.1.4. Saving the hand-entered dive information</h4>
-<div class="paragraph"><p>The information entered in the <strong>Dive Notes</strong> tab, the <strong>Equipment</strong> tab as well
-as the <strong>Dive Profile</strong> can now be saved in the user’s logbook by using the
-two buttons on the top right hand of the Dive Notes tab. If the <em>Save</em>
-button is clicked, the dive data are saved in the current logbook. If the
-<em>Cancel</em> button is clicked, the newly entered dive data are discarded. When
-exiting <em>Subsurface</em>, the user will be prompted once more to save the
-logbook with the new dive(s).</p></div>
+<div class="paragraph"><p>The information entered in the <strong>Notes</strong> tab, the <strong>Equipment</strong> tab as well as
+the <strong>Dive Profile</strong> can now be saved in the user’s logbook by using the two
+buttons on the top right hand of the Notes tab. If the <em>Save</em> button is
+clicked, the dive data are saved in the current logbook. If the <em>Cancel</em>
+button is clicked, the newly entered dive data are discarded. When exiting
+<em>Subsurface</em>, the user will be prompted once more to save the logbook with
+the new dive(s).</p></div>
</div>
</div>
<div class="sect2">
@@ -995,7 +995,7 @@ that have not been uploaded before. This makes the download process faster on most dive computers and also saves battery power of the dive computer (at
least for those not charging while connected via USB). If, for some reason,
the user wishes to import ALL dives from the dive computer, even though some
-may already be in the logbook, then check the check box labelled <em>Force
+may already be in the logbook, then check the check box labeled <em>Force
download of all dives</em>.</p></div>
<div class="ulist"><ul>
<li>
@@ -1194,22 +1194,22 @@ device instead of the model name, allowing easy identification of devices.</p></ <h4 id="S_EditDiveInfo">5.2.3. Updating the dive information imported from the dive computer.</h4>
<div class="paragraph"><p>With the uploaded dives in the <strong>Dive List</strong>, the information from the dive
computer is not complete and more details must be added in order to have a
-fuller record of the dives. To do this, the <strong>Dive Notes</strong> and the <strong>Equipment</strong>
-tabs on the top left hand of the <em>Subsurface</em> window should be used.</p></div>
+fuller record of the dives. To do this, the <strong>Notes</strong> and the <strong>Equipment</strong> tabs
+on the top left hand of the <em>Subsurface</em> window should be used.</p></div>
</div>
<div class="sect3">
-<h4 id="_notes_de_plongée_2">5.2.4. Notes de plongée</h4>
+<h4 id="_notes_2">5.2.4. Notes</h4>
<div class="paragraph"><p>The date and time of the dive, gas mixture and (often) water temperature are
usually shown as obtained from the dive computer, but the user needs to add
additional information by hand in order to have a more complete dive
record. In a few cases, (e.g. APD rebreathers) one also has to provide the
date and time of the dive. If the contents of this tab is changed or edited
in any way, the message in a blue box at the top of the panel indicates that
-the dive is being edited. If one clicks on the <strong>Dive Notes</strong> tab, the
-following fields are visible:</p></div>
+the dive is being edited. If one clicks on the <strong>Notes</strong> tab, the following
+fields are visible:</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
-<img src="images/AddDive3_f20.jpg" alt="FIGURE: The Dive Notes tab" />
+<img src="images/AddDive3_f20.jpg" alt="FIGURE: The Notes tab" />
</div>
</div>
<div class="paragraph"><p>The <strong>Time</strong> field reflects the date and time of the dive. By clicking the
@@ -1305,10 +1305,10 @@ typed <div class="paragraph"><p>The <strong>Save</strong> and <strong>Cancel</strong> buttons are used to save all the information for
tabs in the info panel and in the dive profile panel, so there’s no need to
use them until ALL other information has been added. Here is an example of a
-completed Dive Notes panel:</p></div>
+completed Notes panel:</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
-<img src="images/CompletedDiveInfo_f20.jpg" alt="FIGURE: A completed Dive Notes tab" />
+<img src="images/CompletedDiveInfo_f20.jpg" alt="FIGURE: A completed Notes tab" />
</div>
</div>
</div>
@@ -1406,17 +1406,17 @@ weights: integrated as well as a weight belt:</p></div> <h4 id="_editing_several_selected_dives_simultaneously">5.2.6. Editing several selected dives simultaneously</h4>
<div class="paragraph"><p><em>METHOD 1</em>: After uploading dives from a dive computer, the dive profiles of
the uploaded dives are shown in the <strong>Dive profile</strong> tab, as well as a few
-items of information in the <strong>Dive Notes</strong> tab (e.g. water temperature) and in
-the <strong>Equipment</strong> tab (e.g. gas pressures and gas composition). However the
-other fields remain empty. It may be useful to simultaneously edit some of
-the fields in the <strong>Dive Notes</strong> and <strong>Equipment</strong> tabs. For instance, it is
-possible that a diver performed several dives during a single day, using
-identical equipment while diving at the same dive site or with the same dive
-master and/or buddy or tags. Instead of completing the information for each
-of these dives separately, one can select all the dives for that day in the
-<strong>Dive List</strong> and insert the same information in the <strong>Dive Notes</strong> and
-<strong>Equipment</strong> fields that need identical information. This is achieved by
-editing the dive notes or the equipment for any one of the selected dives.</p></div>
+items of information in the <strong>Notes</strong> tab (e.g. water temperature) and in the
+<strong>Equipment</strong> tab (e.g. gas pressures and gas composition). However the other
+fields remain empty. It may be useful to simultaneously edit some of the
+fields in the <strong>Notes</strong> and <strong>Equipment</strong> tabs. For instance, it is possible
+that a diver performed several dives during a single day, using identical
+equipment while diving at the same dive site or with the same dive master
+and/or buddy or tags. Instead of completing the information for each of
+these dives separately, one can select all the dives for that day in the
+<strong>Dive List</strong> and insert the same information in the <strong>Notes</strong> and <strong>Equipment</strong>
+fields that need identical information. This is achieved by editing the dive
+notes or the equipment for any one of the selected dives.</p></div>
<div class="paragraph"><p>The simultaneous editing only works with fields that do not already contain
information. This means that, if some fields have been edited for a
particular dive among the selected dives, these are not changed while
@@ -1428,15 +1428,15 @@ the edited dive is changed, even though several dives have been selected in the <strong>Dive List</strong>. This greatly speeds up the completion of the dive log after
several similar dives.</p></div>
<div class="paragraph" id="S_CopyComponents"><p><em>METHOD 2</em>:There is a different way of achieving the same goal. Select a
-dive with all the appropriate information typed into the <strong>Dive Notes</strong> and
+dive with all the appropriate information typed into the <strong>Notes</strong> and
<strong>Equipment</strong> tabs. Then, from the main menu, select <em>Log → Copy dive
components</em>. A box is presented with a selection of check boxes for most of
-the fields in the <strong>Dive Notes</strong> and <strong>Equipment</strong> tabs. Select the fields to
-be copied from the currently selected dive, then select <em>OK</em>. Now, in the
-<strong>Dive List</strong>, select the dives into which this information is to be
-pasted. Then, from the main menu, select <em>Log → Paste dive components</em>.
-All the selected dives now contain the data initially selected in the
-original source dive log.</p></div>
+the fields in the <strong>Notes</strong> and <strong>Equipment</strong> tabs. Select the fields to be
+copied from the currently selected dive, then select <em>OK</em>. Now, in the <strong>Dive
+List</strong>, select the dives into which this information is to be pasted. Then,
+from the main menu, select <em>Log → Paste dive components</em>. All the selected
+dives now contain the data initially selected in the original source dive
+log.</p></div>
</div>
<div class="sect3">
<h4 id="_adding_bookmarks_to_a_dive">5.2.7. Adding Bookmarks to a dive</h4>
@@ -1479,13 +1479,13 @@ If one hovers using the mouse over the red bookmark, the appropriate text is </div>
<div class="sect3">
<h4 id="_saving_the_updated_dive_information">5.2.8. Saving the updated dive information</h4>
-<div class="paragraph"><p>The information entered in the <strong>Dive Notes</strong> tab and the <strong>Equipment</strong> tab can
-be saved by using the two buttons on the top right hand of the <strong>Dive Notes</strong>
-tab. If the <em>Save</em> button is clicked, the dive data are saved. If the
-<em>Cancel</em> button is clicked, then the newly entered dive data are deleted,
-although the dive profile obtained from the dive computer will be
-retained. When the user exits <em>Subsurface</em> there is a final prompt to
-confirm that the new data should be saved.</p></div>
+<div class="paragraph"><p>The information entered in the <strong>Notes</strong> tab and the <strong>Equipment</strong> tab can be
+saved by using the two buttons on the top right hand of the <strong>Notes</strong> tab. If
+the <em>Save</em> button is clicked, the dive data are saved. If the <em>Cancel</em>
+button is clicked, then the newly entered dive data are deleted, although
+the dive profile obtained from the dive computer will be retained. When the
+user exits <em>Subsurface</em> there is a final prompt to confirm that the new data
+should be saved.</p></div>
</div>
</div>
<div class="sect2">
@@ -1569,13 +1569,24 @@ CSV (text-based and spreadsheet-based) dive logs, including APD CCR logs <div class="paragraph"><p>Selecting the appropriate file in the file list of the dialogue opens the
imported dive log in the <em>Subsurface</em> <strong>Dive List</strong>. Some other formats, not
accessible through the Import dialogue are also supported, as explained
-below.</p></div>
-</div>
-<div class="sect3">
-<h4 id="_importing_from_mares_dive_organiser_v2_1">5.3.2. Importing from Mares Dive Organiser V2.1</h4>
-<div class="paragraph"><p>Since Mares utilise proprietary Windows software not compatible with
-multi-platform applications, these dive logs cannot be directly imported
-into <em>Subsurface</em>. Mares dive logs need to be imported using a three-step
+below.</p></div> +</div> +<div class="sect3"> +<h4 id="_importing_from_heinrichs_weikamp_ostc_tools">5.3.2. Importing from Heinrichs Weikamp OSTC Tools</h4> +<div class="paragraph"><p><em>OSTC Tools</em> is a Microsoft-based suite of dive download and dive management +tools for the OSTC family of dive computers. <em>OSTC Tools</em> downloads dive +data from the dive computer and stores it as a binary file with file +extension <em>.dive</em> . Subsurface can directly import these files when using +the universal import dialogue. From the dropdown list at the bottom right +select <em>All files</em>. This makes the <em>OSTC Tools</em> dive logs visible in the +file list panel. Select one or more dive, then click the <em>Open</em> button. The +OSTC dives are shown in the <strong>Dive List</strong> panel.</p></div> +</div> +<div class="sect3"> +<h4 id="_importing_from_mares_dive_organiser_v2_1">5.3.3. Importing from Mares Dive Organiser V2.1</h4> +<div class="paragraph"><p>Since Mares utilise proprietary Windows software not compatible with +multi-platform applications, these dive logs cannot be directly imported +into <em>Subsurface</em>. Mares dive logs need to be imported using a three-step process, using <em>www.divelogs.de</em> as a mechanism to extract the dive log
information.</p></div>
<div class="olist arabic"><ol class="arabic">
@@ -1601,13 +1612,13 @@ Finally, import the dives from <em>divelogs.de</em> to <em>Subsurface</em>, usin instructions below.
</p>
</li>
-</ol></div>
-</div>
-<div class="sect3">
-<h4 id="S_ImportingDivelogsDe">5.3.3. Importing dives from <strong>divelogs.de</strong></h4>
-<div class="paragraph"><p>The import of dive information from <em>divelogs.de</em> is simple, using a single
-dialogue box. The <em>Import → Import from Divelogs.de</em> option should be
-selected from the Main Menu. This brings up a dialogue box (see figure on
+</ol></div> +</div> +<div class="sect3"> +<h4 id="S_ImportingDivelogsDe">5.3.4. Importing dives from <strong>divelogs.de</strong></h4> +<div class="paragraph"><p>The import of dive information from <em>divelogs.de</em> is simple, using a single +dialogue box. The <em>Import → Import from Divelogs.de</em> option should be +selected from the Main Menu. This brings up a dialogue box (see figure on left [<strong>A</strong>] below). Enter a user-ID and password for <em>divelogs.de</em> into the
appropriate fields and then select the <em>Download</em> button. Download from
<em>divelogs.de</em> starts immediately, displaying a progress bar in the dialogue
@@ -1618,13 +1629,13 @@ after which the imported dives appear in the <em>Subsurface</em> <strong>Dive Li <div class="content">
<img src="images/Divelogs1.jpg" alt="FIGURE:Download from Divelogs.de" />
</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="S_ImportingCSVData">5.3.4. Importing data in CSV format</h4>
-<div class="paragraph"><p>A comma-separated file (.csv) can be used to import dive information either
-as dive profiles (as in the case of the APD Inspiration and Evolution closed
-circuit rebreathers) or as dive metadata (in case the user keeps dive data
+</div> +</div> +<div class="sect3"> +<h4 id="S_ImportingCSVData">5.3.5. Importing data in CSV format</h4> +<div class="paragraph"><p>A comma-separated file (.csv) can be used to import dive information either +as dive profiles (as in the case of the APD Inspiration and Evolution closed +circuit rebreathers) or as dive metadata (in case the user keeps dive data in a spreadsheet). The <em>CSV</em> format is a universal simplified format that
allows for easy information exchange between different computers or software
packages. For an introduction to CSV-formatted files see <a href="#S_CSV_Intro">A
@@ -1720,12 +1731,12 @@ table contains the column headings found in the <em>CSV</em> data file. The blue row of cells immediately above these contains the names understood by
<em>Subsurface</em>. The white area below the dropdown lists contains all the field
names that <em>Subsurface</em> recognises. These names are in blue balloons and can
-be moved using a drag-and-frop action. For instance, <em>Subsurface</em> expects
+be moved using a drag-and-drop action. For instance, <em>Subsurface</em> expects
the column heading for Dive number (" # ") to be "Dive # ". If the column
heading that <em>Subsurface</em> expects is not in the blue cells, then drag the
appropriate column heading from the upper area and drop it in the
appropriate blue cell at the top of the table. To indicate the correct
-column for "Dive #", drag the ballooned item labelled "Dive # " and drop it
+column for "Dive #", drag the ballooned item labeled "Dive # " and drop it
in the blue cell immediately above the white cell containing " # ". This is
depicted in the image below.</p></div>
<div class="imageblock" style="text-align:center;">
@@ -1747,8 +1758,8 @@ in the <strong>Dive List</strong> panel.</p></div> <img src="images/icons/important.png" alt="Important" />
</td>
<td class="content"><em>CSV</em> is an abbreviation for a data file format: <em>Comma-Separated
-Variables</em>. It is a file format allowing someone to view or edit the
-information using a text editor such as Notebook (Windows), gedit (Linux) or
+Values</em>. It is a file format allowing someone to view or edit the
+information using a text editor such as Notepad (Windows), gedit (Linux) or
TextWrangler (OS/X). The two main advantages of the <em>CSV</em> format is that the
data are easily editable as text without any proprietary software and
ensuring all information is human-readable, not being obscured by any custom
@@ -2310,7 +2321,7 @@ button in the tool bar to the left of the dive profile:</p></div> <div class="ulist"><ul>
<li>
<p>
-the <em>Photos</em> tab of the <strong>Dive Notes</strong> panel.
+the <em>Photos</em> tab of the <strong>Notes</strong> panel.
</p>
</li>
<li>
@@ -2348,9 +2359,9 @@ the <em>Photos</em> tab (see text below).</p></div> <div class="sect3">
<h4 id="_the_em_photos_em_tab">5.5.3. The <em>Photos</em> tab</h4>
<div class="paragraph"><p>Photographs associated with a dive are shown as thumbnails in the <em>Photos</em>
-tab of the <em>Dive Notes</em> panel. Photos taken in rapid succession during a
-dive (therefore sometimes with large overlap on the dive profile) can easily
-be accessed in the <em>Photos</em> tab. This tab serves as a tool for individually
+tab of the <em>Notes</em> panel. Photos taken in rapid succession during a dive
+(therefore sometimes with large overlap on the dive profile) can easily be
+accessed in the <em>Photos</em> tab. This tab serves as a tool for individually
accessing the photos of a dive, while the stubs on the dive profile give an
indication of when during a dive a photo was taken. By single-clicking on a
thumbnail in the <em>Photos</em> panel, a photo is selected. By double-clicking a
@@ -2372,84 +2383,147 @@ photos any more. If the display of photos is activated (using the toolbox to the left of the <em>Dive Profile</em>), the program only shows a small white dot
where each photo should be on the dive profile. In addition the <em>Photos</em>
tab only shows the file names of the photos. This is normal behaviour. If,
-later, the external drive with the photos is connected again, the photos can
-be seen in the normal way.</p></div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="_logging_special_types_of_dives">5.6. Logging special types of dives</h3>
+later, the external drive with the photos is connected again, the photos can +be seen in the normal way.</p></div> +</div> +<div class="sect3"> +<h4 id="Moving_images">5.5.5. Moving photographs among directories, hard disks or computers</h4> +<div class="paragraph"><p>After a photograph has been loaded into <em>Subsurface</em> and associated with a specific dive, the directory + where the photo lies is stored, allowing <em>Subsurface</em> to find the photograph when the dive is + opened again. If the photo or the whole photo collection is moved to another drive or to a different + machine, it is unlikely that the directory structure will remain identical to that of the original uploaded + photo. When this happens, <em>Subsurface</em> looks for the photos at their original location before they were moved, + cannot find them and therefore cannot display them. Because, after moving photos, large numbers of photos + may need to be deleted and re-imported from the new location, <em>Subsurface</em> has a mechanism that eases the + process of updating the directory information for each photo: automatic updates using fingerprints.</p></div> +<div class="paragraph"><p>When a photo is loaded into <em>Subsurface</em>, a fingerprint for the image is calculated and stored with the + other reference information for that photo. After moving a photo collection (that has already been loaded + into <em>Subsurface</em>) to a different directory, disk or computer, <em>Subsurface</em> can perform the + following steps:</p></div> +<div class="ulist"><ul> +<li> +<p> +look through a particular directory (and all its subdirectories recursively) + where photos have been moved + to, +</p> +</li> +<li> +<p> +calculate fingerprints for all photos in this directory, and +</p> +</li> +<li> +<p> +if there is a match between a calculated fingerprint and the one originally + calculated when a photo was + loaded into <em>Subsurface</em> (even if the original file name has changed), to + automatically update the directory information so that <em>Subsurface</em> can find + the photo in the new moved directory. +</p> +</li> +</ul></div> +<div class="paragraph"><p>This is achieved by selecting from the Main Menu: <em>File → Find moved images</em>. This brings up a window within + which the NEW directory of the photos needs to be specified. Select the appropriate directory and click + the <em>Scan</em> button towards the bottom right of the panel. The process may require several minutes to + complete, after which <em>subsurface</em> will show the appropriate photographs when a particular dive is opened.</p></div> +<div class="sidebarblock" id="Image_fingerprint_upgrade"> +<div class="content"> +<div class="paragraph"><p><strong>Upgrading existing photo collections without fingerprints</strong></p></div> +<div class="admonitionblock"> +<table><tr> +<td class="icon"> +<img src="images/icons/important.png" alt="Important" /> +</td> +<td class="content">Software for the automated update of existing photo collections is under +developement. Currently single dives must be upgraded one at a time. Select +the toolbar button on the <strong>Dive profile</strong> panel that enables the display of +images. The thumbnails of images are shown on the dive profile. Then open +the dive and change anything in the <strong>Notes</strong> panel that brings up the blue +edit bar at the top of the notes panel to save the edits. For instance, add +a space character at the end of the <em>Notes</em> text box and immediately delete +that space character. Select the optio <em>Apply changes</em> in the blue edit bar +to save the dive information. Fingerprints are calculated while saving this +specific dive.</td> +</tr></table> +</div> +</div></div> +</div> +</div> +<div class="sect2"> +<h3 id="_logging_special_types_of_dives">5.6. Logging special types of dives</h3> <div class="sect3">
<h4 id="S_MulticylinderDives">5.6.1. Multicylinder dives</h4>
<div class="paragraph"><p><em>Subsurface</em> easily handles dives involving more than one
cylinder. Multicylinder diving usually happens (a) if a diver does not have
enough gas for the complete dive in a single cylinder; (b) if the diver
needs more than one gas mixture because of the depth or the decompression
-needs of the dive. For this reason multicylinder dives are often used by
-technical divers who dive deep or long. As far as <em>Subsurface</em> is concerned,
-there are only two types of information that need to be provided:</p></div>
-<div class="ulist"><ul>
-<li>
-<p>
-<strong>Describe the cylinders used during the dive</strong> This is performed in the <strong>Equipment tab</strong> of
- the <strong>Dive Info</strong> panel, as <a href="#cylinder_definitions">described above</a>. Enter the cylinders one by one,
- specifying the characteristics of the cylinder and the gas composition within each cylinder.
-</p>
-</li>
-<li>
-<p>
-<strong>Record the times at which switches from one cylinder to another was done:</strong> This is information
- provided by some dive computers (provided the diver indicated these changes to the dive computer
- by pressing specific buttons). If the dive computer does not provide the information, the diver has to
- record these changes using a different method, e.g. writing it on a slate.
-</p>
-</li>
-<li>
-<p>
-<strong>Record the cylinder changes on the dive profile</strong>: If the latter option
- was followed, the diver needs to indicate the gas change event by right-clicking at the appropriate point
- in time on the <strong>Dive Profile</strong> panel and indicating the cylinder to which the change was made. After
- right-clicking, follow the context menu to "Add gas change" and select the appropriate cylinder from
- those defined during the first step, above (see image below). If the
- <strong>tank bar</strong> button in the ttolbar has been activated, the cylinder switches are also indicated in the
- tank bar.
-</p>
-</li>
-</ul></div>
-<div class="paragraph"><p>Having performed these tasks, <em>Subsurface</em> indicates the appropriate use of
-cylinders in the dive profile. Below is a multi-cylinder dive, starting off
-with EAN28, then changing cylinders to EAN50 after 26 minutes to perform
-decompression.</p></div>
-<div class="imageblock" style="text-align:center;">
-<div class="content">
-<img src="images/multicylinder_dive.jpg" alt="FIGURE: Multicylinder profile" />
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_sidemount_dives">5.6.2. Sidemount dives</h4>
-<div class="paragraph"><p>Sidemount diving is just another form of multicylinder diving, often with
-both or all cylinders having the same gas mixture. Although it is a popular
-configuration for cave divers, sidemount diving can be performed by
-recreational divers who have completed the appropriate training. Sidemount
-dive logging involves, exactly as with multicylinder dives, above, three
-steps:</p></div>
-<div class="ulist"><ul>
-<li>
-<p>
-<strong>During the dive, record cylinder switch events</strong>. Since sidemount diving normally involves two
- cylinders with air or with the same gas mixture, <em>Subsurface</em> distinguishes among these different
- cylinders. In contrast, most dive computers that allow gas switching only distinguish among different
- <em>gases</em> used, not among different <em>cylinders</em> used. This means that when sidemount dives are downloaded
- from these dive computers, the events of switching between cylinders with the same gas are not downloaded. This may mean
- that one may have to keep a written log of cylinder switch times using a slate, or (if the dive computer
- has this facility) marking each cylinder switch with a bookmark that can be retrieved later. Returning
+needs of the dive. For this reason multicylinder dives are often used by +technical divers who dive deep or long. As far as <em>Subsurface</em> is concerned, +there are only two types of information that need to be provided:</p></div> +<div class="ulist"><ul> +<li> +<p> +<strong>Describe the cylinders used during the dive</strong> This is performed in the <strong>Equipment tab</strong> of + the <strong>Info</strong> panel, as <a href="#cylinder_definitions">described above</a>. Enter the cylinders one by one, + specifying the characteristics of the cylinder and the gas composition within each cylinder. +</p> +</li> +<li> +<p> +<strong>Record the times at which switches from one cylinder to another was done:</strong> This is information + provided by some dive computers (provided the diver indicated these changes to the dive computer + by pressing specific buttons). If the dive computer does not provide the information, the diver has to + record these changes using a different method, e.g. writing it on a slate. +</p> +</li> +<li> +<p> +<strong>Record the cylinder changes on the dive profile</strong>: If the latter option + was followed, the diver needs to indicate the gas change event by right-clicking at the appropriate point + in time on the <strong>Dive Profile</strong> panel and indicating the cylinder to which the change was made. After + right-clicking, follow the context menu to "Add gas change" and select the appropriate cylinder from + those defined during the first step, above (see image below). If the + <strong>tank bar</strong> button in the toolbar has been activated, the cylinder switches are also indicated in the + tank bar. +</p> +</li> +</ul></div> +<div class="paragraph"><p>Having performed these tasks, <em>Subsurface</em> indicates the appropriate use of +cylinders in the dive profile. Below is a multi-cylinder dive, starting off +with EAN28, then changing cylinders to EAN50 after 26 minutes to perform +decompression.</p></div> +<div class="imageblock" style="text-align:center;"> +<div class="content"> +<img src="images/multicylinder_dive.jpg" alt="FIGURE: Multicylinder profile" /> +</div> +</div> +</div> +<div class="sect3"> +<h4 id="_sidemount_dives">5.6.2. Sidemount dives</h4> +<div class="paragraph"><p>Sidemount diving is just another form of multicylinder diving, often with +both or all cylinders having the same gas mixture. Although it is a popular +configuration for cave divers, sidemount diving can be performed by +recreational divers who have completed the appropriate training. Sidemount +dive logging involves, exactly as with multicylinder dives, above, three +steps:</p></div> +<div class="ulist"><ul> +<li> +<p> +<strong>During the dive, record cylinder switch events</strong>. Since sidemount diving normally involves two + cylinders with air or with the same gas mixture, <em>Subsurface</em> distinguishes among these different + cylinders. In contrast, most dive computers that allow gas switching only distinguish among different + <em>gases</em> used, not among different <em>cylinders</em> used. This means that when sidemount dives are downloaded + from these dive computers, the events of switching between cylinders with the same gas are not downloaded. This may mean + that one may have to keep a written log of cylinder switch times using a slate, or (if the dive computer + has this facility) marking each cylinder switch with a bookmark that can be retrieved later. Returning from a dive with the information about cylinder changes is the only tricky part of logging sidemount dives.
</p>
</li>
<li>
<p>
<strong>Within <em>Subsurface</em> describe the cylinders used during the dive</strong>. The diver needs to provide the
- specifications of the different cylinders, using the <strong>Equipment</strong> tab of the <strong>Dive Info Panel</strong> (see
+ specifications of the different cylinders, using the <strong>Equipment</strong> tab of the <strong>Info Panel</strong> (see
image below where two 12 litre cylinder were used).
</p>
</li>
@@ -2464,74 +2538,74 @@ steps:</p></div> profile with a cylinder symbol. If the <strong>Tank Bar</strong> is activated using the toolbar to the left of the
profile, then the cylinder change is also indicated on the Tank Bar (see image below). After all
the cylinder change events have been recorded on the dive profile, the correct cylinder pressures
- for both cylinders are shown on the dive profile, as inthe image below.
+ for both cylinders are shown on the dive profile, as in the image below.
</p>
</li>
</ul></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/sidemount1.jpg" alt="FIGURE: Sidemount profile" />
-</div>
-</div>
-<div class="paragraph"><p>This section gives an example of the versatility of <em>Subsurface</em> as a give
-logging tool.</p></div>
-</div>
-<div class="sect3">
-<h4 id="S_sSCR_dives">5.6.3. Semi-closed circuit rebreather (SCR) dives</h4>
-<div class="admonitionblock">
-<table><tr>
-<td class="icon">
-<img src="images/halcyon_RB80.jpg" alt="Note" />
-</td>
-<td class="content">Passive semi-closed rebreathers (pSCR) comprise a technical advance in
-diving equipment that recirculates the breathing gas that a diver breathes,
-while removing carbon dioxide from the exhaled gas. While a small amount
-(typically a tenth) of the exhaled breathing gas is released into the water,
-a small amount of fresh gas is released from the back gas cylinder
-(typically containing nitrox). A diver, using a single cylinder of
-breathing gas can therefore dive for much longer periods than using a
-recreational open-circuit configuration. With pSCR equipment, a very small
-amount of breathing gas is released every time the breather inhales. With
-active SCR (aSCR) equipment, in contrast, a small amount of breathing gas is
-released continuously from the back cylinder.</td>
-</tr></table>
-</div>
-<div class="paragraph"><p>To log pSCR dives, no special procedures are required, just the normal steps
-outlined above:</p></div>
-<div class="ulist"><ul>
-<li>
-<p>
-Select pSCR in the <em>Dive Mode</em> dropdown list on the <strong>Dive Info</strong> panel.
-</p>
-</li>
-<li>
-<p>
-pSCR diving often involves gas changes, requiring an additional cylinder.
- Define all the appropriate cylinders as described above and indicate the
- cylinder/gas changes as described above in the section on
- <a href="#S_MulticylinderDives">multicylinder dives</a>.
-</p>
-</li>
-</ul></div>
-<div class="paragraph"><p>If a pSCR <em>Dive Mode</em> has been selected, the dive ceiling for pSCR dives is
-adjusted for the oxygen drop accross the mouthpiece which often requires
-longer decompression periods. Below is a dive profile of a pSCR dive using
-EAN36 on the back cylinder and oxygen for decompression. Note that this dive
-lasted over two hours.</p></div>
-<div class="imageblock" style="text-align:center;">
-<div class="content">
-<img src="images/pSCR_profile.jpg" alt="FIGURE: pSCR profile" />
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="S_CCR_dives">5.6.4. Closed circuit rebreather (CCR) dives</h4>
-<div class="admonitionblock">
-<table><tr>
-<td class="icon">
-<img src="images/APD.jpg" alt="Note" />
-</td>
-<td class="content">Closed system rebreathers use advanced technology to recirculate gas that
+</div> +</div> +<div class="paragraph"><p>This section gives an example of the versatility of <em>Subsurface</em> as a dive +logging tool.</p></div> +</div> +<div class="sect3"> +<h4 id="S_sSCR_dives">5.6.3. Semi-closed circuit rebreather (SCR) dives</h4> +<div class="admonitionblock"> +<table><tr> +<td class="icon"> +<img src="images/halcyon_RB80.jpg" alt="Note" /> +</td> +<td class="content">Passive semi-closed rebreathers (pSCR) comprise a technical advance in +diving equipment that recirculates the breathing gas that a diver breathes, +while removing carbon dioxide from the exhaled gas. While a small amount +(typically a tenth) of the exhaled breathing gas is released into the water, +a small amount of fresh gas is released from the back gas cylinder +(typically containing nitrox). A diver, using a single cylinder of +breathing gas can therefore dive for much longer periods than using a +recreational open-circuit configuration. With pSCR equipment, a very small +amount of breathing gas is released every time the breather inhales. With +active SCR (aSCR) equipment, in contrast, a small amount of breathing gas is +released continuously from the back cylinder.</td> +</tr></table> +</div> +<div class="paragraph"><p>To log pSCR dives, no special procedures are required, just the normal steps +outlined above:</p></div> +<div class="ulist"><ul> +<li> +<p> +Select pSCR in the <em>Dive Mode</em> dropdown list on the <strong>Info</strong> panel. +</p> +</li> +<li> +<p> +pSCR diving often involves gas changes, requiring an additional cylinder. + Define all the appropriate cylinders as described above and indicate the + cylinder/gas changes as described above in the section on + <a href="#S_MulticylinderDives">multicylinder dives</a>. +</p> +</li> +</ul></div> +<div class="paragraph"><p>If a pSCR <em>Dive Mode</em> has been selected, the dive ceiling for pSCR dives is +adjusted for the oxygen drop across the mouthpiece which often requires +longer decompression periods. Below is a dive profile of a pSCR dive using +EAN36 on the back cylinder and oxygen for decompression. Note that this dive +lasted over two hours.</p></div> +<div class="imageblock" style="text-align:center;"> +<div class="content"> +<img src="images/pSCR_profile.jpg" alt="FIGURE: pSCR profile" /> +</div> +</div> +</div> +<div class="sect3"> +<h4 id="S_CCR_dives">5.6.4. Closed circuit rebreather (CCR) dives</h4> +<div class="admonitionblock"> +<table><tr> +<td class="icon"> +<img src="images/APD.jpg" alt="Note" /> +</td> +<td class="content">Closed system rebreathers use advanced technology to recirculate gas that has been breathed while doing two things to maintain a breathable oxygen
concentration:
a) remove carbon dioxide from the gas that has been exhaled
@@ -2658,7 +2732,7 @@ the pressures of the oxygen and diluent cylinders. The pressures of these two cylinders are shown as green lines overlapping the depth profile. In
addition, start and end pressures for both oxygen and diluent cylinders are
shown in the <em>Equipment Tab</em>. Below is a dive profile for a CCR dive,
-including an overaly of setpoint and oxygen sensor data, as well as the
+including an overlay of setpoint and oxygen sensor data, as well as the
cylinder pressure data. In this case there is good agreement from the
readings of the two oxygen sensors.</p></div>
<div class="imageblock" style="text-align:center;">
@@ -2681,12 +2755,12 @@ B</a>.</p></div> <h2 id="_obtaining_more_information_about_dives_entered_into_the_logbook">6. Obtaining more information about dives entered into the logbook</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_the_strong_dive_info_strong_tab_for_individual_dives">6.1. The <strong>Dive Info</strong> tab (for individual dives)</h3>
-<div class="paragraph"><p>The Dive Info tab gives some summary information about a particular dive
-that has been selected in the <strong>Dive List</strong>. Useful information here includes
-the surface interval before the dive, the maximum and mean depths of the
-dive, the gas volume consumed, the surface air consumption (SAC) and the
-number of oxygen toxicity units (OTU) incurred.</p></div>
+<h3 id="_the_strong_info_strong_tab_for_individual_dives">6.1. The <strong>Info</strong> tab (for individual dives)</h3>
+<div class="paragraph"><p>The Info tab gives some summary information about a particular dive that has
+been selected in the <strong>Dive List</strong>. Useful information here includes the
+surface interval before the dive, the maximum and mean depths of the dive,
+the gas volume consumed, the surface air consumption (SAC) and the number of
+oxygen toxicity units (OTU) incurred.</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
@@ -3131,11 +3205,11 @@ other than air. Their 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 hypothetical
+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.</td>
+the same narcotic effect as a diver breathing air diving at a depth equaling
+the END.</td>
</tr></table>
</div>
<div class="paragraph"><p>Figure (<strong>B</strong>) above shows an information box with a nearly complete set of
@@ -3250,15 +3324,15 @@ Graph <strong>E</strong> indicates the situation after remaining at 4.5 meters f </div>
<div class="sect1">
<h2 id="_organising_the_logbook_manipulating_groups_of_dives">7. Organising the logbook (Manipulating groups of dives)</h2>
-<div class="sectionbody">
-<div class="sect2">
-<h3 id="_the_dive_list_context_menu">7.1. The Dive List context menu</h3>
-<div class="paragraph"><p>Many actions within <em>Subsurface</em> are dependent on a context menu used mostly
-to manipulate groups of dives. The context menu is found by selecting a dive
-or a group of dives and then right-clicking.</p></div>
-<div class="imageblock" style="text-align:center;">
-<div class="content">
-<img src="images/ContextMenu.jpg" alt="Figure: Context Menu" />
+<div class="sectionbody"> +<div class="sect2"> +<h3 id="_the_dive_list_context_menu">7.1. The Dive List context menu</h3> +<div class="paragraph"><p>Several actions on either a single dive or a group of dives can be performed +using the Dive List Context Menu, found by selecting either a single dive or +a group of dives and then right-clicking.</p></div> +<div class="imageblock" style="text-align:center;"> +<div class="content"> +<img src="images/ContextMenu.jpg" alt="Figure: Context Menu" /> </div>
</div>
<div class="paragraph"><p>The context menu is used in many manipulations described below.</p></div>
@@ -3298,40 +3372,44 @@ automatically follow on because of the dives that are more recent in date/time than the newly-added dive with an older date/time. Therefore, one
may sometimes need to renumber the dives. This is performed by selecting
(from the Main Menu) <em>Log → Renumber</em>. Users are given a choice with
-respect to the lowest sequence number to be used. Completing this operation
-results in new sequence numbers (based on date/time) for the dives in the
-<strong>Dive List</strong> panel.</p></div>
-</div>
-<div class="sect2">
-<h3 id="S_Group">7.3. Grouping dives into trips and manipulating trips</h3>
-<div class="paragraph"><p>For regular divers, the dive list can rapidly become very long. <em>Subsurface</em>
-can group dives into <em>trips</em>. It performs this by grouping dives that have
-date/times that are not separated in time by more than two days, thus
-creating a single heading for each diving trip represented in the dive
-log. Below is an ungrouped dive list (<strong>A</strong>, on the left) as well as the
-corresponding grouped dive list comprising five dive trips (<strong>B</strong>, on the
-right):</p></div>
-<div class="imageblock" style="text-align:center;">
-<div class="content">
-<img src="images/Group2.jpg" alt="Figure: Grouping dives" />
-</div>
-</div>
-<div class="paragraph"><p>Grouping into trips allows a rapid way of accessing individual dives without
-having to scan a long lists of dives. In order to group the dives in a dive
-list, (from the Main Menu) users must select <em>Log → Autogroup</em>. The <strong>Dive
-List</strong> panel now shows only the titles for the trips.</p></div>
-<div class="sect3">
-<h4 id="_editing_the_title_and_associated_information_for_a_particular_trip">7.3.1. Editing the title and associated information for a particular trip</h4>
-<div class="paragraph"><p>Normally, in the dive list, minimal information is included in the trip
+respect to the lowest sequence number to be used. Completing this operation +results in new sequence numbers (based on date/time) for the dives in the +<strong>Dive List</strong> panel.</p></div> +<div class="paragraph"><p>One can also renumber a few selected dives in the dive list. Select the +dives that need renumbering. Right-click on the selected list and use the +Dive List Context Menu to perform the renumbering. A popup window appears +requiring the user to specify the starting number for the renumbering +process.</p></div> +</div> +<div class="sect2"> +<h3 id="S_Group">7.3. Grouping dives into trips and manipulating trips</h3> +<div class="paragraph"><p>For regular divers, the dive list can rapidly become very long. <em>Subsurface</em> +can group dives into <em>trips</em>. It performs this by grouping dives that have +date/times not separated in time by more than two days, thus creating a +single heading for each diving trip represented in the dive log. Below is an +ungrouped dive list (<strong>A</strong>, on the left) as well as the corresponding grouped +dive list comprising five dive trips (<strong>B</strong>, on the right):</p></div> +<div class="imageblock" style="text-align:center;"> +<div class="content"> +<img src="images/Group2.jpg" alt="Figure: Grouping dives" /> +</div>
+</div> +<div class="paragraph"><p>Grouping into trips allows a rapid way of accessing individual dives without +having to scan a long lists of dives. In order to group the dives in a dive +list, (from the Main Menu) select <em>Log → Autogroup</em>. The <strong>Dive List</strong> panel +now shows only the titles for the trips.</p></div> +<div class="sect3"> +<h4 id="_editing_the_title_and_associated_information_for_a_particular_trip">7.3.1. Editing the title and associated information for a particular trip</h4> +<div class="paragraph"><p>Normally, in the dive list, minimal information is included in the trip title. More information about a trip can be added by selecting its trip
-title from the <strong>Dive List</strong>. This shows a <strong>Trip Notes</strong> tab in the <strong>Dive
-Notes</strong> panel. Here users can add or edit information about the date/time,
-the trip location and any other general comments about the trip as a whole
-(e.g. the dive company that was dived with, the general weather and surface
-conditions during the trip, etc.). After entering this information, users
-should select <strong>Save</strong> from the buttons at the top right of the <strong>Trip Notes</strong>
-tab. The trip title in the <strong>Dive List</strong> panel should now reflect some of the
-edited information.</p></div>
+title from the <strong>Dive List</strong>. This shows a <strong>Trip Notes</strong> tab in the <strong>Notes</strong>
+panel. Here users can add or edit information about the date/time, the trip
+location and any other general comments about the trip as a whole (e.g. the
+dive company that was dived with, the general weather and surface conditions
+during the trip, etc.). After entering this information, users should
+select <strong>Save</strong> from the buttons at the top right of the <strong>Trip Notes</strong> tab. The
+trip title in the <strong>Dive List</strong> panel should now reflect some of the edited
+information.</p></div>
</div>
<div class="sect3">
<h4 id="_viewing_the_dives_during_a_particular_trip">7.3.2. Viewing the dives during a particular trip</h4>
@@ -3339,22 +3417,22 @@ edited information.</p></div> trips by clicking the arrow-head on the left of each trip title. This
expands the selected trip, revealing the individual dives performed during
the trip.</p></div>
-</div>
-<div class="sect3">
-<h4 id="_collapsing_or_expanding_dive_information_for_different_trips">7.3.3. Collapsing or expanding dive information for different trips</h4>
-<div class="paragraph"><p>If a user right-clicks after selecting a particular trip in the dive list,
-the resulting context menu allows several possibilities to expand or
-collapse dives within trips. This includes expanding all trips, collapsing
-all trips and collapsing all trips except the selected one.</p></div>
-</div>
-<div class="sect3">
-<h4 id="_merging_dives_from_more_than_one_trip_into_a_single_trip">7.3.4. Merging dives from more than one trip into a single trip</h4>
-<div class="paragraph"><p>By right-clicking on a selected trip title in the <strong>Dive List</strong> panel, a
-context menu shows up that allows the merging of trips by either merging of
-the selected trip with the trip below or with the trip above.</p></div>
-</div>
-<div class="sect3">
-<h4 id="_splitting_a_single_trip_into_more_than_one_trip">7.3.5. Splitting a single trip into more than one trip</h4>
+</div> +<div class="sect3"> +<h4 id="_collapsing_or_expanding_dive_information_for_different_trips">7.3.3. Collapsing or expanding dive information for different trips</h4> +<div class="paragraph"><p>After selecting a particular trip in the dive list, the context menu allows +several possibilities to expand or collapse dives within trips. This +includes expanding all trips, collapsing all trips and collapsing all trips +except the selected one.</p></div> +</div> +<div class="sect3"> +<h4 id="_merging_dives_from_more_than_one_trip_into_a_single_trip">7.3.4. Merging dives from more than one trip into a single trip</h4> +<div class="paragraph"><p>After selecting a trip title, the context menu allows the merging of trips +by either merging the selected trip with the trip below or with the trip +above.(Merge trip with trip below; Merge trip with trip above)</p></div> +</div> +<div class="sect3"> +<h4 id="_splitting_a_single_trip_into_more_than_one_trip">7.3.5. Splitting a single trip into more than one trip</h4> <div class="paragraph"><p>If a trip includes five dives, the user can split this trip into two trips
(trip 1: top 3 dives; trip 2: bottom 2 dives) by selecting and
right-clicking the top three dives. The resulting context menu allows the
@@ -3381,66 +3459,74 @@ duration.</p></div> </div>
<div class="sect3">
<h4 id="_unlink_a_dive_from_a_trip">7.4.2. Unlink a dive from a trip</h4>
-<div class="paragraph"><p>Users can unlink dives from the trip to which they belong. In order to do
-this, select and right-click the relevant dives to bring up the context
-menu. Then select the option <strong>Remove dive(s) from trip</strong>. The dive(s) now
-appear immediately above the trip to which they belonged.</p></div>
-</div>
-<div class="sect3">
-<h4 id="_add_a_dive_to_the_trip_immediately_above">7.4.3. Add a dive to the trip immediately above</h4>
-<div class="paragraph"><p>Selected dives can be moved from the trip to which they belong and placed
-within the trip immediately above the currently active trip. To do this,
-select and right-click the dive(s) to bring up the context menu, and then
-select <strong>Add dive(s) to trip immediately above</strong>.</p></div>
-</div>
-<div class="sect3">
-<h4 id="_shift_the_start_time_of_dive_s">7.4.4. Shift the start time of dive(s)</h4>
+<div class="paragraph"><p>Users can unlink dives from the trip to which they belong. In order to do +this, select and right-click the relevant dives to bring up the context +menu. Then select the option <strong>Remove dive(s) from trip</strong>. The dive(s) now +appear immediately above or below the trip to which they belonged, depending +on the date and time of the unliked dive.</p></div> +</div> +<div class="sect3"> +<h4 id="_add_a_dive_to_the_trip_immediately_above">7.4.3. Add a dive to the trip immediately above</h4> +<div class="paragraph"><p>Selected dives can be moved from the trip to which they belong and placed +within a separate trip. To do this, select and right-click the dive(s) to +bring up the context menu, and then select <strong>Create new trip above</strong>.</p></div> +</div> +<div class="sect3"> +<h4 id="_shift_the_start_time_of_dive_s">7.4.4. Shift the start time of dive(s)</h4> <div class="paragraph"><p>Sometimes it is necessary to adjust the start time of a dive. This may apply
to situations where dives are performed in different time zones or when the
dive computer has an erroneous time. In order to do this, user must select
and right-click the dive(s) to be adjusted. This action brings up the
-context menu on which the <strong>Shift times</strong> option should be selected. User must
-then specify the time (in hours and minutes) by which the dives should be
-adjusted and click on the option indicating whether the time adjustment
-should be forwards or backwards.</p></div>
-</div>
-<div class="sect3">
-<h4 id="_merge_dives_into_a_single_dive">7.4.5. Merge dives into a single dive</h4>
+context menu on which the <strong>Shift times</strong> option should be selected. User must +then specify the time (in hours and minutes) by which the dives should be +adjusted and click on the option indicating whether the time adjustment +should be ealier or later.</p></div> +</div> +<div class="sect3"> +<h4 id="_merge_dives_into_a_single_dive">7.4.5. Merge dives into a single dive</h4> <div class="paragraph"><p>Sometimes a dive is briefly interrupted, e.g. if a diver returns to the
surface for a few minutes, resulting in two or more dives being recorded by
the dive computer and appearing as different dives in the <strong>Dive List</strong>
panel. Users can merge these dives onto a single dive by selecting the
appropriate dives, right-clicking them to bring up the context menu and then
selecting <strong>Merge selected dives</strong>. It may be necessary to edit the dive
-information in the <strong>Dive Notes</strong> panel to reflect events or conditions that
-apply to the merged dive. The figure below shows the depth profile of two
-such dives that were merged:</p></div>
+information in the <strong>Notes</strong> panel to reflect events or conditions that apply
+to the merged dive. The figure below shows the depth profile of two such
+dives that were merged:</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/MergedDive.png" alt="Example: Merged dive" />
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="S_Filter">7.5. Filtering the dive list</h3>
+</div> +</div> +</div> +<div class="sect3"> +<h4 id="_undo_dive_manipulations">7.4.6. Undo dive manipulations</h4> +<div class="paragraph"><p>Important actions on dives or trips, described above, can be undone or +redone. This includes: <em>delete dives</em>, <em>merge dives</em>, <em>renumber dives</em> and +<em>shift dive times</em>. To do this after performing any of these actions, from +the <strong>Main Menu</strong> select <em>Edit</em>. This brings up the possibility to <em>Undo</em> or +<em>Redo</em> an action.</p></div> +</div> +</div> +<div class="sect2"> +<h3 id="S_Filter">7.5. Filtering the dive list</h3> <div class="paragraph"><p>The dives in the <strong>Dive List</strong> panel can be filtered, that is, one can select
only some of the dives based on their attributes, e.g. dive tags, dive site,
dive master, buddy or protective clothing. For instance, filtering allows
one to list the deep dives at a particular dive site, or otherwise the cave
dives with a particular buddy.</p></div>
-<div class="paragraph"><p>To open the filter, select <em>Log → Filter divelist</em> from the main menu. This
-opens the <em>Filter Panel</em> at the top of the <em>Subsurface</em> window. Three icons
-are located at the top right hand of the filter panel. The <em>Filter Panel</em>
-can be reset (i.e. all current filters cleared) by selecting the <strong>+</strong>. The
-<em>Filter Panel</em> may also be minimised by selecting the middle icon. When
-minimised, only these three icons are shown. The panel can be maximised by
-clicking the icon that minimised the panel. The filter may also be reset and
-closed by selecting the button with the flag. An example of the <em>Filter
-Panel</em> is shown in the figure below.</p></div>
-<div class="imageblock" style="text-align:center;">
-<div class="content">
-<img src="images/Filterpanel.jpg" alt="Figure: Filter panel" />
+<div class="paragraph"><p>To open the filter, select <em>Log → Filter divelist</em> from the main menu. This +opens the <em>Filter Panel</em> at the top of the <em>Subsurface</em> window. Three icons +are located at the top right hand of the filter panel. The <em>Filter Panel</em> +can be reset (i.e. all current filters cleared) by selecting the <strong>yellow +angled arrow</strong>. The <em>Filter Panel</em> may also be minimised by selecting the +<strong>green up-arrow". When minimised, only these three icons are shown. The +panel can be maximised by clicking the icon that minimised the panel. The +filter may also be reset and closed by selecting the *red button</strong> with the +white cross. An example of the <em>Filter Panel</em> is shown in the figure below.</p></div> +<div class="imageblock" style="text-align:center;"> +<div class="content"> +<img src="images/Filterpanel.jpg" alt="Figure: Filter panel" /> </div>
</div>
<div class="paragraph"><p>Four filter criteria may be used to filter the dive list: dive tags, person
@@ -3448,20 +3534,19 @@ Panel</em> is shown in the figure below.</p></div> by a check list with check boxes. Above each check list is a second-level
filter tool, allowing the listing of only some of the attributes within that
check list. For instance, typing "<em>ca</em>" in the filter textbox above the tags
-check list results in the tags check list being reduced to "<em>cave</em>" and
-"<em>cavern</em>". Filtering of the check list enables the rapid finding of search
-terms for filtering the dive list.</p></div>
-<div class="paragraph"><p>To activate filtering of the dive list, the check box of at least one item
-in one of the four check lists needs to be checked. The dive list is then
-shortened to include only the dives that pertain to the selection criteria
-specified in the check lists. The four check lists work as a filter with
-<em>AND</em> operators, Subsurface filters therefore for <em>cave</em> as a tag AND <em>Joe
-Smith</em> as a buddy; but the filters within a category are inclusive -
-filtering for <em>cave</em> and <em>boat</em> shows those dives that have either one or
-both of these tags.</p></div>
-</div>
-</div>
-</div>
+check list results in the tags check list being reduced to "<em>cave</em>" and +"<em>cavern</em>". Filtering of the check list enables the rapid finding of search +terms for filtering the dive list.</p></div> +<div class="paragraph"><p>To activate filtering of the dive list, check at least tone check box in one +of the four check lists. The dive list is then shortened to include only the +dives that pertain to the criteria specified in the check lists. The four +check lists work as a filter with <em>AND</em> operators, Subsurface filters +therefore for <em>cave</em> as a tag AND <em>Joe Smith</em> as a buddy; but the filters +within a category are inclusive - filtering for <em>cave</em> and <em>boat</em> shows +those dives that have either one OR both of these tags.</p></div> +</div> +</div> +</div> <div class="sect1">
<h2 id="S_ExportLog">8. Exporting the dive log or parts of the dive log</h2>
<div class="sectionbody">
@@ -3496,10 +3581,10 @@ connexion <em>Facebook</em>.</p></div> </div>
</div>
<div class="paragraph"><p>Having established a login to <em>Facebook</em>, transfer of a dive profile to
-one’s <em>Facebook</em> timeline is easy. A <em>Facebook</em> icon appears in the <strong>Dive
-Notes</strong> panel of <em>Subsurface</em> (See image <strong>A</strong> below). Ensure that the dive
-that you want to transfer to the timeline is depicted in the <em>Subsurface</em>
-<strong>Dive Profile</strong> panel. Select the <em>Facebook</em> icon, and a dialogue is shown,
+one’s <em>Facebook</em> timeline is easy. A <em>Facebook</em> icon appears in the <strong>Notes</strong>
+panel of <em>Subsurface</em> (See image <strong>A</strong> below). Ensure that the dive that you
+want to transfer to the timeline is depicted in the <em>Subsurface</em> <strong>Dive
+Profile</strong> panel. Select the <em>Facebook</em> icon, and a dialogue is shown,
determining the amount of additional information transferred with the dive
profile (see image <strong>B</strong>, below). In order to transfer a dive profile to
<em>Facebook</em>, the name of a <em>Facebook</em> album needs to be provided. The
@@ -3561,7 +3646,7 @@ Universal Dive Data Format (<em>UDDF</em>). Refer to <em>http://uddf.org</em> fo </li>
<li>
<p>
-<em>DiveShare</em> is also a dive log repostory on the Internet focusing on the
+<em>DiveShare</em> is also a dive log repository on the Internet focusing on the
recreational dives. In order to upload dives one has to provide a used ID,
so registration with <em>http://scubadiveshare.com</em> is required.
</p>
@@ -3898,7 +3983,7 @@ leave the settings panel by selecting <strong>OK</strong>.</p></div> <li>
<p>
<strong>Default cylinder</strong>: Here users can specify the default cylinder listed in
- the <strong>Equipment</strong> tab of the <strong>Dive Notes</strong> panel.
+ the <strong>Equipment</strong> tab of the <strong>Notes</strong> panel.
</p>
</li>
<li>
@@ -3975,13 +4060,13 @@ the dive profile: <p>
<em>Show average depth</em>: Activating this checkbox causes <em>Subsurface</em> to draw a grey line across
the dive profile, indicating the mean depth of the dive up to a particular point in time during
- that dive. Normally this is a u-shaped line indicating the deepest average depth just before the
- ascent.
-</p>
-<div class="ulist"><ul>
-<li>
-<p>
-<strong>Misc</strong>:
+ that dive. Normally this is a u-shaped line indicating the deepest average depth just before the + ascent. +</p> +<div class="ulist" id="GradientFactors_Ref"><ul> +<li> +<p> +<strong>Misc</strong>: </p>
</li>
</ul></div>
@@ -4178,7 +4263,7 @@ A user who is not absolutely sure about any of the above requirements should sections (see image below). The <strong>setup</strong> parameters for a dive are entered
into the several sections on the left hand side of the screen. The setup is
divided into several sections: Available Gases, Rates, Planning, Gas Options
-and Dive Notes.</p></div>
+and Notes.</p></div>
<div class="paragraph"><p>At the top right hand is a green <strong>design panel</strong> upon which the profile of
the dive can be manipulated directly by dragging and clicking as explained
below. This feature makes the <em>Subsurface</em> dive planner unique in ease of
@@ -4191,18 +4276,18 @@ messages about the dive plan are printed.</p></div> <div class="content">
<img src="images/PlannerWindow1_f20.jpg" alt="FIGURE: Dive planner startup window" />
</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="_open_circuit_dives_as_an_example_of_dive_planning">13.2. Open circuit dives as an example of dive planning</h3>
-<div class="ulist"><ul>
-<li>
-<p>
-Towards the left bottom of the planner (circled in blue in the image below)
- is a dropbox with three options. Select the appropriate one of these:
-</p>
-<div class="ulist"><ul>
-<li>
+</div> +</div> +<div class="sect2"> +<h3 id="_open_circuit_dives">13.2. Open circuit dives</h3> +<div class="ulist"><ul> +<li> +<p> +Towards the centre bottom of the planner (circled in blue in the image + above) is a dropbox with three options. Select the appropriate one of these: +</p> +<div class="ulist"><ul> +<li> <p>
Open Circuit (the default)
</p>
@@ -4218,40 +4303,159 @@ pSCR </p>
</li>
</ul></div>
-</li>
-<li>
-<p>
-In the top left-hand area of the planning screen, ensure that the constant
- dive parameters are appropriate. These are: Start date and time of the dive,
- Atmospheric Pressure and Altitude above sea level of the dive site. The
- atmospheric pressure can also be entered as an altitude in metres, assuming
- an atmospheric pressure of 1.013 bar.
-</p>
-</li>
-<li>
-<p>
-In the table labelled <em>Available Gases</em>, add the information of the
- cylinders to be used as well as the gas composition within that
- cylinder. This is done in a similar way as for <a href="#S_CylinderData">providing cylinder data for dive logs</a>. Choose the cylinder type by double clicking
- the cylinder type and using the dropdown list, then specify the work
- pressure of this cylinder. By leaving the oxygen concentration (O2%) filed
- empty, the cylinder is assumed to contain air. Otherwise enter the oxygen
- and/or helium concentration in the boxes provided in this dialogue. Add
- additional cylinders by using the "+" icon to the top righthand of the
- dialogue.
-</p>
-</li>
-<li>
-<p>
-The dialogue indicating <em>Dive Planner Points</em> is usually not used at this
- stage of the dive planning.
-</p>
-</li>
-</ul></div>
-<div class="paragraph"><p><strong>The planning is performed in three stages</strong></p></div>
-<div class="paragraph"><p><strong>a) Nitrogen management</strong>: This is performed by specifying the rates for descent and ascent,
-as well as the gradient factors (GFLow and GFHigh) under the headings <em>Rates</em> and <em>Planning</em>
-to the bottom left of the planning screen. Initially, the GFHigh and GFLow values in the <em>Preferences</em>
+</li> +<li> +<p> +Choose the Open Circuit option. +</p> +</li> +<li> +<p> +In the top left-hand area of the planning screen, ensure that the constant + dive parameters are appropriate. These are: Start date and time of the + intended dive, Atmospheric Pressure and Altitude above sea level of the dive + site. The atmospheric pressure can also be entered as an altitude in metres, + assuming a sea-level atmospheric pressure of 1.013 bar. +</p> +</li> +<li> +<p>
+In the table labeled <em>Available Gases</em>, add the information of the cylinders
+ to be used as well as the gas composition within that cylinder. This is done
+ in a similar way as for <a href="#S_CylinderData">providing cylinder data for dive logs</a>. Choose the cylinder type by double clicking the cylinder type and
+ using the dropdown list, then specify the work pressure of this cylinder. By
+ leaving the oxygen concentration (O2%) filed empty, the cylinder is assumed
+ to contain air. Otherwise enter the oxygen and/or helium concentration in
+ the boxes provided in this dialogue. Add additional cylinders by using the
+ "+" icon to the top righthand of the dialogue.
+</p>
+</li> +<li> +<p> +The profile of the planned dive can be created in two ways: +</p> +<div class="ulist"><ul> +<li> +<p> +Drag the waypoints (the small white circles) on the existing dive profile in + a way to represent the dive. Additional waypoints can be created by + double-clicking the existing dive profile. Waypoints can be deleted by + right-clicking a particular waypoint and selecting the <em>delete</em> item from + the resulting context menu. +</p> +</li> +<li> +<p> +The most efficient way to create a dive profile is to enter the appropriate + values into the table marked <em>Dive planner points</em>. The first line of the + table represents the duration and the final depth of the descent from the + surface. Subsequent segments describe the bottom phase of the dive. The <em>CC + set point</em> column is only relevant for closed circuit divers. The ascent is + usually not specified because this is what the planner is supposed to + calculate. Add additional segments to the profile by selecting the "+" icon + at the top right hand of the table. Segments entered into the <em>Dive planner + points</em> table automatically appear in the <strong>Dive Profile</strong> diagram. +</p> +</li> +</ul></div> +</li> +</ul></div> +<div class="sect3"> +<h4 id="_recreational_dives">13.2.1. Recreational dives</h4> +<div class="paragraph"><p>The <em>Subsurface</em> dive planner allows a sophisticated way of planning +recreational dives, i.e. dives that remain within no-decompression limits. +The dive planner automatically takes into account the nitrogen load incurred +in previous dives. But conventional dive tables are also used in a way that +can take into account previous dives. Why use a dive planner for +recreational dives? Using recreational dive tables, the maximum depth of a +dive is taken into acount. However, few dives are undertaken at a constant +depth corresponding to the maximum depth (i.e. a "square" dive +profile). This means that dive tables overestimate the nitrogen load +incurred during previous dives. The <em>Subsurface</em> dive planner calculates +nitrogen load according to the real dive profiles of all uploaded previous +dives, in a similar way as dive computers calculate nitrogen load during a +dive. This mean that the diver gets <em>credit</em> in terms of nitrogen loading +for not remaining at maximum depth during previous dives, enabling planning +a longer subsequent dive. For the planner to work it is therefore crucial to +upload all previous dives onto <em>Subsurface</em> before performing dive planning.</p></div> +<div class="paragraph"><p>To plan a dive, the appropriate settings need to be defined.</p></div> +<div class="paragraph"><p>Ensure that the date and time is set to that of the intended dive. This +allows calculation of the nitrogen load incurred during previous dives.</p></div> +<div class="ulist"><ul> +<li> +<p> +Immediately under the heading <em>Planning</em> are two checkboxes <em>Recreational</em> + and <em>Safety Stop</em>. Check these two boxes. +</p> +</li> +<li> +<p> +Then define the cylinder size, the gas mixture (air or % oxygen) and the + starting cylinder pressure in the top left-hand section of the planner under + <em>Available gases</em>. +</p> +</li> +<li> +<p> +The planner calculates whether the specified cylinder contains enough + air/gas to complete the planned dive. In order for this to be realistic, + under <em>Gas options</em>, specify an appropriate surface air consumption (SAC) + rate for <em>Bottom SAC</em>. Suitable values are between 15 l/min and 30 l/min, + with novice divers or difficult dives requiring SAC rates closer to 30l/min. +</p> +</li> +<li> +<p> +Define the amount of gas that the cylinder must have at the end of the + bottom section of the dive just before ascent. A value of 50 bar is often + used. +</p> +</li> +<li> +<p> +Define the depth of the dive by dragging the waypoints (white dots) on the + dive profile or (even better) defining the appropriate depths using the + table under <em>Dive planner points</em> as desribed under the previous heading. If + this is a multilevel dive, set the appropriate dive depths to represent the + dive plan by adding waypoints to the dive profile or by adding appropriate + dive planner points to the <em>Dive Planner Points</em> table. +</p> +</li> +<li> +<p> +The ascent speed can be changed. The default ascent speeds are those + considered safe for recreational divers. +</p> +</li> +</ul></div> +<div class="paragraph"><p>The dive profile in the planner indicates the maximum dive time within +no-deco limits using the Bühlmann ZH-L16 algorithm and the gas and depth +settings specified as described above. The <em>Subsurface</em> planner allows rapid +assessment of dive duration as a function of dive depth, given the nitrogen +load incurred during previous dives. The dive plan includes estimates of the +amount of air/gas used, depending on the cylinder settings specified under +<em>Available gases</em>. If the initial cylinder pressure is set to 0, the dive +duration shown is the true no-deco limit (NDL) without taking into account +gas used during the dive. If the surface above the dive profile is RED it +means that recreational dive limits are exceeded and either the dive +duration or the dive depth needs to be reduced.</p></div> +<div class="paragraph"><p>Below is an image of a dive plan for a recreational dive at 30 +metres. Although the no-deco limit (NDL) is 23 minutes, the duration of the +dive is limited by the amount of air in the cylinder, reflected by the +information in the text box at the bottom right of the panel.</p></div> +<div class="imageblock" style="text-align:center;"> +<div class="content"> +<img src="images/rec_diveplan.jpg" alt="FIGURE: A recreational dive plan: setup" /> +</div> +</div> +</div> +<div class="sect3"> +<h4 id="_non_recreational_open_circuit_dives_including_decompression">13.2.2. Non-recreational open circuit dives, including decompression</h4> +<div class="paragraph"><p>Non-recreational dive planning involves exceeding the no-deco limits and/or +using multiple breathing gases. Such dives are planned in three stages:</p></div> +<div class="paragraph"><p><strong>a) Nitrogen management</strong>: This is performed by specifying the rates for descent and ascent, +as well as the gradient factors (GFLow and GFHigh) under the headings <em>Rates</em> and <em>Planning</em> +to the bottom left of the planning screen. Initially, the GFHigh and GFLow values in the <em>Preferences</em> panel of <em>Subsurface</em> is used. If these are changed within the planner (see <em>Gas Options</em> within
the planner), the new values are
used without changing the original values in the <em>Preferences</em>. Gradient Factor settings strongly affect the calculated ceilings and their depths.
@@ -4326,7 +4530,7 @@ specified in the <em>Available Gases</em> table. Add new waypoints until the ma features of the dive have been completed, e.g. the bottom time segment and
deep stops (if these are implemented). Leave the remaining waypoints on the
ascent to <em>Subsurface</em>. In most cases <em>Subsurface</em> computes additional way
-points in order to fulfil decompression requirements for that dive. A
+points in order to fulfill decompression requirements for that dive. A
waypoint can be moved by selecting that waypoint and by using the arrow
keys. The waypoints listed in the <em>Dive Planner Points</em> dialogue can be
edited by hand in order to obtain a precise presentation of the dive
@@ -4360,7 +4564,7 @@ appear in the <strong>Dive List</strong> panel of <em>Subsurface</em>.</p></div> <div class="paragraph"><p><strong>The dive plan details</strong></p></div>
<div class="paragraph"><p>On the bottom right of the dive planner, under <em>Dive Plan Details</em>, the
exact details of the dive plan are provided. These details may be modified
-by checking any of the options under the <em>Dive Notes</em> section of the dive
+by checking any of the options under the <em>Notes</em> section of the dive
planner, immediately to the left of the <em>Dive Plan Details</em>. If a <em>Verbatim
diveplan</em> is requested, a detailed sentence-level explanation of the dive
plan is given. If any of the management specifications have been exceeded
@@ -4369,14 +4573,36 @@ information.</p></div> <div class="paragraph"><p>If the option <em>Display segment duration</em> is checked, then the duration of
each depth level is indicated in the <em>Dive Plan Details</em>. This duration
INCLUDES the transition time to get to that level. However, if the <em>Display
-transition in deco</em> option is checked, the transitions are shown separately
-from the segment durations at a particular level.</p></div>
-</div>
-<div class="sect2">
-<h3 id="_planning_ccr_dives">13.3. Planning CCR dives</h3>
-<div class="paragraph"><p>To plan a dive using a closed circuit rebreather, select the <em>CCR</em> option in
-the dropdown list, circled in blue in the image below.</p></div>
-<div class="paragraph"><p><strong>Available gases</strong>: In the <em>Available gases</em> table, enter the cylinder information for the
+transition in deco</em> option is checked, the transitions are shown separately +from the segment durations at a particular level.</p></div> +</div> +</div> +<div class="sect2"> +<h3 id="_planning_pscr_dives">13.3. Planning pSCR dives</h3> +<div class="paragraph"><p>To plan a dive using a passive semi-closed rebreather (pSCR), select <em>pSCR</em> rather than +<em>Open circuit</em> in the dropdown list. +The parameters of the pSCR diver can be set by selecting <em>File → Preferences → Graph</em> +from the main menu, where the gas consumption calculation takes into account the pSCR dump +ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop +accross the mouthpiece of the rebreather into account. If the +pO<sub>2</sub> drops below what is considered a save value, a warning appears in the <em>Dive plan +details</em>. A typical pSCR configuration is with a single cylinder and one or more bail-out +cylinders. Therefore the setup of the <em>Available gases</em> and the <em>Dive planner points</em> tables +are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints +are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable +to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen +in the loop due to the oxygen drop across the mouthpiece of the pSCR equipment.</p></div> +<div class="imageblock" style="text-align:center;"> +<div class="content"> +<img src="images/Planner_pSCR1_f20.jpg" alt="FIGURE: Planning a pSCR dive: setup" /> +</div> +</div> +</div> +<div class="sect2"> +<h3 id="_planning_ccr_dives">13.4. Planning CCR dives</h3> +<div class="paragraph"><p>To plan a dive using a closed circuit rebreather, select the <em>CCR</em> option in +the dropdown list, circled in blue in the image below.</p></div> +<div class="paragraph"><p><strong>Available gases</strong>: In the <em>Available gases</em> table, enter the cylinder information for the diluent cylinder and for any bail-out cylinders. Do NOT enter the information for the oxygen
cylinder since it is implied when the <em>CCR</em> dropdown selection is made.</p></div>
<div class="paragraph"><p><strong>Entering setpoints</strong>: Specify a default setpoint in the Preferences tab, by selecting <em>File → Preferences → Graph</em> from the main menu. All user-entered segments in the <em>Dive planner points</em> table
@@ -4393,33 +4619,12 @@ algorithm does not switch deco-gases automatically while in CCR mode (i.e. when </div>
</div>
<div class="paragraph"><p>Note that, in the <em>Dive plan details</em>, the gas consumption for a CCR segment
-is not calculated, so gas consumptions of 0 litres are the norm.</p></div>
-</div>
-<div class="sect2">
-<h3 id="_planning_pscr_dives">13.4. Planning pSCR dives</h3>
-<div class="paragraph"><p>To plan a dive using a passive semi-closed rebreather (pSCR), select <em>pSCR</em> rather than
-<em>Open circuit</em> in the dropdown list.
-The parameters of the pSCR diver can be set by selecting <em>File → Preferences → Graph</em>
-from the main menu, where the gas consumption calculation takes into account the pSCR dump
-ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop
-accross the mouthpiece of the rebreather into account. If the
-pO<sub>2</sub> drops below what is considered a save value, a warning apears in the <em>Dive plan
-details</em>. A typical pSCR configuration is with a single cylinder and one or more bail-out
-cylinders. Therefore the setup of the <em>Available gases</em> and the <em>Dive planner points</em> tables
-are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints
-are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable
-to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen
-in the loop due to the oxygen drop accross the mouthpiece of the pSCR equipment.</p></div>
-<div class="imageblock" style="text-align:center;">
-<div class="content">
-<img src="images/Planner_pSCR1_f20.jpg" alt="FIGURE: Planning a pSCR dive: setup" />
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="S_Replan">13.5. Modifying an existing dive plan</h3>
-<div class="paragraph"><p>Normally, when a dive plan has been saved, it is accessible from the <strong>Dive
-List</strong>, like any other dive log. Within the <strong>Dive List</strong> there is not a way to
+is not calculated, so gas consumptions of 0 litres are the norm.</p></div> +</div> +<div class="sect2"> +<h3 id="S_Replan">13.5. Modifying an existing dive plan</h3> +<div class="paragraph"><p>Normally, when a dive plan has been saved, it is accessible from the <strong>Dive +List</strong>, like any other dive log. Within the <strong>Dive List</strong> there is not a way to change a saved dive plan. To perform changes to a dive plan, select it on
the <strong>Dive List</strong>. Then, in the main menu, select <em>Log → Re-plan dive</em>. This
will open the selected dive plan within the dive planner, allowing changes
@@ -4454,8 +4659,8 @@ Plan Details</em> for wet notes. Alternatively one can cut and paste the <em>Div Plan Details</em> for inclusion in a text file or word processing document.</p></div>
<div class="paragraph"><p>Dive plans have many characteristics in common with dive logs (dive profile,
dive notes, etc). After a dive plan has been saved, the dive details and
-gas calculations are saved in the <strong>Dive Notes</strong> tab. While a dive plan is
-being designed, it can be printed using the <em>Print</em> button in the dive
+gas calculations are saved in the <strong>Notes</strong> tab. While a dive plan is being
+designed, it can be printed using the <em>Print</em> button in the dive
planner. This prints the dive details and gas calculations in the <em>Dive Plan
Details</em> panel of the dive planner. However, after the plan has been saved,
it is represented in a way very similar to a dive log and the gas
@@ -4649,8 +4854,7 @@ des sections de ce manuel traitant des opérations relatives.</p></div> </li>
<li>
<p>
-<a href="#S_ViewPanels"><em>Info</em></a> - Affiche uniquement le panneau des <strong>notes de
- plongée</strong>.
+<a href="#S_ViewPanels"><em>Info</em></a> - Affiche uniquement le panneau des <strong>notes</strong>.
</p>
</li>
<li>
@@ -5179,7 +5383,7 @@ On the list of file names select the .CSV file that has been created </li>
<li>
<p>
-In the dropdown list on the middle right labeled '<em>Pre-configured imports</em>",
+In the dropdown list on the top left labeled '<em>Pre-configured imports</em>",
select <em>APD Log Viewer</em>.
</p>
</li>
@@ -5259,14 +5463,14 @@ Within the list of dives, select the dives you would like to import later: <p>
To select certain dives: hold <em>ctrl</em> and click the dive
</p>
-</li>
-<li>
-<p>
-To select all dives: Select the first dive, hold down shift and
- select the last dive
-</p>
-</li>
-</ul></div>
+</li> +<li> +<p> +To select all dives: Select the first dive, hold down shift and select the + last dive +</p> +</li> +</ul></div> </li>
<li>
<p>
@@ -5393,11 +5597,11 @@ The dives are now exported to the file DM4.bak (or DM5.bak) <div class="admonitionblock" id="Atomic_Export">
<table><tr>
<td class="icon">
-<img src="./images/icons/note.png" alt="Note" />
+<img src="images/icons/atomiclogo.jpg" alt="Note" />
</td>
<td class="content">Atomic Logbook is a Windows software by Atomic Aquatics. It allows
downloading of dive information from Cobalt and Cobalt 2 dive computers.
-The divelog is kept in a SQlite database at
+The divelog is kept in a SQLite database at
C:\ProgramData\AtomicsAquatics\Cobalt-Logbook\Cobalt.db. This file can be
directly imported to Subsurface.</td>
</tr></table>
@@ -5509,7 +5713,7 @@ Duration: the format should be minutes:seconds. </li>
<li>
<p>
-Unit system: only one unit system shold be used (i.e., no mixture between
+Unit system: only one unit system should be used (i.e., no mixture between
imperial and metric units)
</p>
</li>
@@ -5680,14 +5884,14 @@ 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â€.</p></div>
</div>
-</div>
-</div>
-</div>
-<div id="footnotes"><hr /></div>
-<div id="footer">
-<div id="footer-text">
-Last updated 2015-02-17 08:49:01 PST
-</div>
-</div>
-</body>
-</html>
+</div> +</div> +</div> +<div id="footnotes"><hr /></div> +<div id="footer"> +<div id="footer-text"> +Last updated 2015-05-18 11:34:51 CEST +</div> +</div> +</body> +</html> diff --git a/Documentation/user-manual_fr.txt b/Documentation/user-manual_fr.txt index 8c90f2c27..2a023f563 100644 --- a/Documentation/user-manual_fr.txt +++ b/Documentation/user-manual_fr.txt @@ -108,10 +108,10 @@ La *carte de plongée* en bas à droite, affiche les sites de plongées de l'utilisateur, sur une carte mondiale et centrée sur le site de la dernière plongée sélectionnée dans la *liste des plongées*. -Les *informations de plongée* en haut à gauche, fournissent des informations -détaillées sur la plongée sélectionnée dans la *liste des plongées*, dont -des statistiques pour la plongée sélectionnée ou pour toutes les plongées -mises en surbrillance. +Les *informations* en haut à gauche, fournissent des informations détaillées +sur la plongée sélectionnée dans la *liste des plongées*, dont des +statistiques pour la plongée sélectionnée ou pour toutes les plongées mises +en surbrillance. Le *profil de plongée* en haut à droite, affiche un profil de plongée graphique de la plongée sélectionnée dans la *liste des plongées*. @@ -127,9 +127,9 @@ sélectionnée_ sont affichées dans les panneaux respectifs. D'autre part, si plus d'une plongée est mise en surbrillance seule la dernière mise en surbrillance est la _plongée sélectionnée_, mais les données de _toutes les plongées mises en surbrillances_ sont affichées dans l'onglet *Stats* du -panneau *informations de plongée* (profondeur maximale, minimale et moyenne, -les durées, les températures de l'eau et le SAC (air consommé); temps total -et nombre de plongées sélectionnées). +panneau *informations* (profondeur maximale, minimale et moyenne, les +durées, les températures de l'eau et le SAC (air consommé); temps total et +nombre de plongées sélectionnées). [[S_ViewPanels]] @@ -217,18 +217,18 @@ duration, depth, the names of your dive buddy and of the dive master or dive guide, and some remarks about the dive. _Subsurface_ can store much more information than this for each dive. In order to add a dive to a dive log, select _Log -> Add Dive_ from the Main Menu. The program then shows three -panels to enter information for a dive: two tabs in the *Dive Info* panel -(*Dive Notes* and *Equipment*), as well as the *Dive Profile* panel that -displays a graphical profile of each dive. These panels are respectively -marked [red]#A#, [red]#B# and [red]#C# in the figure below. Each of these -tabs will now be explained for data entry. +panels to enter information for a dive: two tabs in the *Info* panel +(*Notes* and *Equipment*), as well as the *Dive Profile* panel that displays +a graphical profile of each dive. These panels are respectively marked +[red]#A#, [red]#B# and [red]#C# in the figure below. Each of these tabs will +now be explained for data entry. image::images/AddDive1_f20.jpg["FIGURE: Add dive", align="center"] -When one edits a field in Dive notes or Equipment panels, _Subsurface_ -enters *Editing Mode*, indicated by the message in the blue box at the top -of the _Dive Notes_ panel (see the image below). This message is displayed -in all the panels under Dive notes and Equipment when in *Editing Mode*. +When one edits a field in Notes or Equipment panels, _Subsurface_ enters +*Editing Mode*, indicated by the message in the blue box at the top of the +_Notes_ panel (see the image below). This message is displayed in all the +panels under Notes and Equipment when in *Editing Mode*. image::images/BlueEditBar_f20.jpg["Blue edit bar", align="center"] @@ -240,14 +240,14 @@ specific dive is saved in memory. When one closes Subsurface, the program will ask again, this time whether the complete dive log should be saved on disk or not. -==== Notes de plongée +==== Notes This panel contains the date, time and place information for a particular dive, environmental conditions, co-divers and buddies, as well as some -descriptive information. If one clicks on the *Dive Notes* tab, the -following fields are visible: +descriptive information. If one clicks on the *Notes* tab, the following +fields are visible: -image::images/AddDive2_f20.jpg["FIGURE: The Dive Notes tab", align="center"] +image::images/AddDive2_f20.jpg["FIGURE: The Notes tab", align="center"] The *Time* field reflects the date and the time of the dive. By clicking the date, a calendar is displayed from which one can choose the correct @@ -340,9 +340,9 @@ shown for the user to choose from. The *Save* and *Cancel* buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there's no need to use them until ALL other information has been added. Here is an example of a -completed Dive Notes panel: +completed Notes panel: -image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Dive Notes tab", align="center"] +image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Notes tab", align="center"] ==== Equipment @@ -471,13 +471,13 @@ image::images/DiveProfile4_f20.jpg["FIGURE: Completed dive profile", align="cent ==== Saving the hand-entered dive information -The information entered in the *Dive Notes* tab, the *Equipment* tab as well -as the *Dive Profile* can now be saved in the user's logbook by using the -two buttons on the top right hand of the Dive Notes tab. If the _Save_ -button is clicked, the dive data are saved in the current logbook. If the -_Cancel_ button is clicked, the newly entered dive data are discarded. When -exiting _Subsurface_, the user will be prompted once more to save the -logbook with the new dive(s). +The information entered in the *Notes* tab, the *Equipment* tab as well as +the *Dive Profile* can now be saved in the user's logbook by using the two +buttons on the top right hand of the Notes tab. If the _Save_ button is +clicked, the dive data are saved in the current logbook. If the _Cancel_ +button is clicked, the newly entered dive data are discarded. When exiting +_Subsurface_, the user will be prompted once more to save the logbook with +the new dive(s). [[S_ImportDiveComputer]] === Importing new dive information from a Dive Computer @@ -538,7 +538,7 @@ that have not been uploaded before. This makes the download process faster on most dive computers and also saves battery power of the dive computer (at least for those not charging while connected via USB). If, for some reason, the user wishes to import ALL dives from the dive computer, even though some -may already be in the logbook, then check the check box labelled _Force +may already be in the logbook, then check the check box labeled _Force download of all dives_. - The dialogue has two drop-down lists, *Vendor* and *Dive Computer*. On the @@ -690,10 +690,10 @@ device instead of the model name, allowing easy identification of devices. With the uploaded dives in the *Dive List*, the information from the dive computer is not complete and more details must be added in order to have a -fuller record of the dives. To do this, the *Dive Notes* and the *Equipment* -tabs on the top left hand of the _Subsurface_ window should be used. +fuller record of the dives. To do this, the *Notes* and the *Equipment* tabs +on the top left hand of the _Subsurface_ window should be used. -==== Notes de plongée +==== Notes The date and time of the dive, gas mixture and (often) water temperature are usually shown as obtained from the dive computer, but the user needs to add @@ -701,10 +701,10 @@ additional information by hand in order to have a more complete dive record. In a few cases, (e.g. APD rebreathers) one also has to provide the date and time of the dive. If the contents of this tab is changed or edited in any way, the message in a blue box at the top of the panel indicates that -the dive is being edited. If one clicks on the *Dive Notes* tab, the -following fields are visible: +the dive is being edited. If one clicks on the *Notes* tab, the following +fields are visible: -image::images/AddDive3_f20.jpg["FIGURE: The Dive Notes tab", align="center"] +image::images/AddDive3_f20.jpg["FIGURE: The Notes tab", align="center"] The *Time* field reflects the date and time of the dive. By clicking the date, a calendar is displayed from which one can choose the correct @@ -800,9 +800,9 @@ typed The *Save* and *Cancel* buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there's no need to use them until ALL other information has been added. Here is an example of a -completed Dive Notes panel: +completed Notes panel: -image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Dive Notes tab", align="center"] +image::images/CompletedDiveInfo_f20.jpg["FIGURE: A completed Notes tab", align="center"] ==== Equipment @@ -888,17 +888,17 @@ image::images/WeightsDataEntry3_f20.jpg["FIGURE: A completed weights information _METHOD 1_: After uploading dives from a dive computer, the dive profiles of the uploaded dives are shown in the *Dive profile* tab, as well as a few -items of information in the *Dive Notes* tab (e.g. water temperature) and in -the *Equipment* tab (e.g. gas pressures and gas composition). However the -other fields remain empty. It may be useful to simultaneously edit some of -the fields in the *Dive Notes* and *Equipment* tabs. For instance, it is -possible that a diver performed several dives during a single day, using -identical equipment while diving at the same dive site or with the same dive -master and/or buddy or tags. Instead of completing the information for each -of these dives separately, one can select all the dives for that day in the -*Dive List* and insert the same information in the *Dive Notes* and -*Equipment* fields that need identical information. This is achieved by -editing the dive notes or the equipment for any one of the selected dives. +items of information in the *Notes* tab (e.g. water temperature) and in the +*Equipment* tab (e.g. gas pressures and gas composition). However the other +fields remain empty. It may be useful to simultaneously edit some of the +fields in the *Notes* and *Equipment* tabs. For instance, it is possible +that a diver performed several dives during a single day, using identical +equipment while diving at the same dive site or with the same dive master +and/or buddy or tags. Instead of completing the information for each of +these dives separately, one can select all the dives for that day in the +*Dive List* and insert the same information in the *Notes* and *Equipment* +fields that need identical information. This is achieved by editing the dive +notes or the equipment for any one of the selected dives. The simultaneous editing only works with fields that do not already contain information. This means that, if some fields have been edited for a @@ -913,15 +913,15 @@ several similar dives. [[S_CopyComponents]] _METHOD 2_:There is a different way of achieving the same goal. Select a -dive with all the appropriate information typed into the *Dive Notes* and +dive with all the appropriate information typed into the *Notes* and *Equipment* tabs. Then, from the main menu, select _Log -> Copy dive components_. A box is presented with a selection of check boxes for most of -the fields in the *Dive Notes* and *Equipment* tabs. Select the fields to -be copied from the currently selected dive, then select _OK_. Now, in the -*Dive List*, select the dives into which this information is to be -pasted. Then, from the main menu, select _Log -> Paste dive components_. -All the selected dives now contain the data initially selected in the -original source dive log. +the fields in the *Notes* and *Equipment* tabs. Select the fields to be +copied from the currently selected dive, then select _OK_. Now, in the *Dive +List*, select the dives into which this information is to be pasted. Then, +from the main menu, select _Log -> Paste dive components_. All the selected +dives now contain the data initially selected in the original source dive +log. ==== Adding Bookmarks to a dive @@ -948,13 +948,13 @@ image::images/Bookmarks.jpg["FIGURE: Bookmark dialog", align="center"] ==== Saving the updated dive information -The information entered in the *Dive Notes* tab and the *Equipment* tab can -be saved by using the two buttons on the top right hand of the *Dive Notes* -tab. If the _Save_ button is clicked, the dive data are saved. If the -_Cancel_ button is clicked, then the newly entered dive data are deleted, -although the dive profile obtained from the dive computer will be -retained. When the user exits _Subsurface_ there is a final prompt to -confirm that the new data should be saved. +The information entered in the *Notes* tab and the *Equipment* tab can be +saved by using the two buttons on the top right hand of the *Notes* tab. If +the _Save_ button is clicked, the dive data are saved. If the _Cancel_ +button is clicked, then the newly entered dive data are deleted, although +the dive profile obtained from the dive computer will be retained. When the +user exits _Subsurface_ there is a final prompt to confirm that the new data +should be saved. === Importing dive information from other digital data sources or other data formats @@ -1014,6 +1014,18 @@ imported dive log in the _Subsurface_ *Dive List*. Some other formats, not accessible through the Import dialogue are also supported, as explained below. +==== Importing from Heinrichs Weikamp OSTC Tools + +_OSTC Tools_ is a Microsoft-based suite of dive download and dive management +tools for the OSTC family of dive computers. _OSTC Tools_ downloads dive +data from the dive computer and stores it as a binary file with file +extension _.dive_ . Subsurface can directly import these files when using +the universal import dialogue. From the dropdown list at the bottom right +select _All files_. This makes the _OSTC Tools_ dive logs visible in the +file list panel. Select one or more dive, then click the _Open_ button. The +OSTC dives are shown in the *Dive List* panel. + + ==== Importing from Mares Dive Organiser V2.1 Since Mares utilise proprietary Windows software not compatible with @@ -1135,12 +1147,12 @@ table contains the column headings found in the _CSV_ data file. The blue row of cells immediately above these contains the names understood by _Subsurface_. The white area below the dropdown lists contains all the field names that _Subsurface_ recognises. These names are in blue balloons and can -be moved using a drag-and-frop action. For instance, _Subsurface_ expects +be moved using a drag-and-drop action. For instance, _Subsurface_ expects the column heading for Dive number (" # ") to be "Dive # ". If the column heading that _Subsurface_ expects is not in the blue cells, then drag the appropriate column heading from the upper area and drop it in the appropriate blue cell at the top of the table. To indicate the correct -column for "Dive #", drag the ballooned item labelled "Dive # " and drop it +column for "Dive #", drag the ballooned item labeled "Dive # " and drop it in the blue cell immediately above the white cell containing " # ". This is depicted in the image below. @@ -1159,8 +1171,8 @@ in the *Dive List* panel. [IMPORTANT] _CSV_ is an abbreviation for a data file format: _Comma-Separated -Variables_. It is a file format allowing someone to view or edit the -information using a text editor such as Notebook (Windows), gedit (Linux) or +Values_. It is a file format allowing someone to view or edit the +information using a text editor such as Notepad (Windows), gedit (Linux) or TextWrangler (OS/X). The two main advantages of the _CSV_ format is that the data are easily editable as text without any proprietary software and ensuring all information is human-readable, not being obscured by any custom @@ -1601,7 +1613,7 @@ image::images/icons/ShowPhotos_f20.png["FIGURE:Show photos toolbar button", alig After the images have been loaded, they appear in two places: - - the _Photos_ tab of the *Dive Notes* panel. + - the _Photos_ tab of the *Notes* panel. - as tiny icons (stubs) on the dive profile at the appropriate positions reflecting the time each photograph was taken. See below: @@ -1625,9 +1637,9 @@ image::images/LoadImage6_f20.jpg["FIGURE: Full-screen photo on dive profile", al ==== The _Photos_ tab Photographs associated with a dive are shown as thumbnails in the _Photos_ -tab of the _Dive Notes_ panel. Photos taken in rapid succession during a -dive (therefore sometimes with large overlap on the dive profile) can easily -be accessed in the _Photos_ tab. This tab serves as a tool for individually +tab of the _Notes_ panel. Photos taken in rapid succession during a dive +(therefore sometimes with large overlap on the dive profile) can easily be +accessed in the _Photos_ tab. This tab serves as a tool for individually accessing the photos of a dive, while the stubs on the dive profile give an indication of when during a dive a photo was taken. By single-clicking on a thumbnail in the _Photos_ panel, a photo is selected. By double-clicking a @@ -1652,6 +1664,60 @@ tab only shows the file names of the photos. This is normal behaviour. If, later, the external drive with the photos is connected again, the photos can be seen in the normal way. +[[Moving_images]] +==== Moving photographs among directories, hard disks or computers + +After a photograph has been loaded into _Subsurface_ and associated with a specific dive, the directory + where the photo lies is stored, allowing _Subsurface_ to find the photograph when the dive is + opened again. If the photo or the whole photo collection is moved to another drive or to a different + machine, it is unlikely that the directory structure will remain identical to that of the original uploaded + photo. When this happens, _Subsurface_ looks for the photos at their original location before they were moved, + cannot find them and therefore cannot display them. Because, after moving photos, large numbers of photos + may need to be deleted and re-imported from the new location, _Subsurface_ has a mechanism that eases the + process of updating the directory information for each photo: automatic updates using fingerprints. + +When a photo is loaded into _Subsurface_, a fingerprint for the image is calculated and stored with the + other reference information for that photo. After moving a photo collection (that has already been loaded + into _Subsurface_) to a different directory, disk or computer, _Subsurface_ can perform the + following steps: + +- look through a particular directory (and all its subdirectories recursively) + where photos have been moved + to, + +- calculate fingerprints for all photos in this directory, and + +- if there is a match between a calculated fingerprint and the one originally + calculated when a photo was + loaded into _Subsurface_ (even if the original file name has changed), to + automatically update the directory information so that _Subsurface_ can find + the photo in the new moved directory. + +This is achieved by selecting from the Main Menu: _File -> Find moved images_. This brings up a window within + which the NEW directory of the photos needs to be specified. Select the appropriate directory and click + the _Scan_ button towards the bottom right of the panel. The process may require several minutes to + complete, after which _subsurface_ will show the appropriate photographs when a particular dive is opened. + + +[[Image_fingerprint_upgrade]] +**** +*Upgrading existing photo collections without fingerprints* +[icon="images/icons/important.png"] +[IMPORTANT] + +Software for the automated update of existing photo collections is under +developement. Currently single dives must be upgraded one at a time. Select +the toolbar button on the *Dive profile* panel that enables the display of +images. The thumbnails of images are shown on the dive profile. Then open +the dive and change anything in the *Notes* panel that brings up the blue +edit bar at the top of the notes panel to save the edits. For instance, add +a space character at the end of the _Notes_ text box and immediately delete +that space character. Select the optio _Apply changes_ in the blue edit bar +to save the dive information. Fingerprints are calculated while saving this +specific dive. + +**** + === Logging special types of dives @@ -1667,7 +1733,7 @@ technical divers who dive deep or long. As far as _Subsurface_ is concerned, there are only two types of information that need to be provided: - *Describe the cylinders used during the dive* This is performed in the *Equipment tab* of - the *Dive Info* panel, as xref:cylinder_definitions[described above]. Enter the cylinders one by one, + the *Info* panel, as xref:cylinder_definitions[described above]. Enter the cylinders one by one, specifying the characteristics of the cylinder and the gas composition within each cylinder. - *Record the times at which switches from one cylinder to another was done:* This is information @@ -1680,7 +1746,7 @@ there are only two types of information that need to be provided: in time on the *Dive Profile* panel and indicating the cylinder to which the change was made. After right-clicking, follow the context menu to "Add gas change" and select the appropriate cylinder from those defined during the first step, above (see image below). If the - *tank bar* button in the ttolbar has been activated, the cylinder switches are also indicated in the + *tank bar* button in the toolbar has been activated, the cylinder switches are also indicated in the tank bar. Having performed these tasks, _Subsurface_ indicates the appropriate use of @@ -1708,7 +1774,7 @@ steps: has this facility) marking each cylinder switch with a bookmark that can be retrieved later. Returning from a dive with the information about cylinder changes is the only tricky 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 *Dive Info Panel* (see + specifications of the different cylinders, using the *Equipment* tab of the *Info Panel* (see image below where two 12 litre cylinder 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 indicated on the dive profile. @@ -1719,11 +1785,11 @@ steps: profile with a cylinder symbol. If the *Tank Bar* is activated using the toolbar to the left of the profile, then the cylinder change is also indicated on the Tank Bar (see image below). After all the cylinder change events have been recorded on the dive profile, the correct cylinder pressures - for both cylinders are shown on the dive profile, as inthe image below. + for both cylinders are shown on the dive profile, as in the image below. image::images/sidemount1.jpg["FIGURE: Sidemount profile", align="center"] -This section gives an example of the versatility of _Subsurface_ as a give +This section gives an example of the versatility of _Subsurface_ as a dive logging tool. @@ -1747,7 +1813,7 @@ released continuously from the back cylinder. To log pSCR dives, no special procedures are required, just the normal steps outlined above: -- Select pSCR in the _Dive Mode_ dropdown list on the *Dive Info* panel. +- Select pSCR in the _Dive Mode_ dropdown list on the *Info* panel. - pSCR diving often involves gas changes, requiring an additional cylinder. Define all the appropriate cylinders as described above and indicate the @@ -1755,7 +1821,7 @@ outlined above: xref:S_MulticylinderDives[multicylinder dives]. If a pSCR _Dive Mode_ has been selected, the dive ceiling for pSCR dives is -adjusted for the oxygen drop accross the mouthpiece which often requires +adjusted for the oxygen drop across the mouthpiece which often requires longer decompression periods. Below is a dive profile of a pSCR dive using EAN36 on the back cylinder and oxygen for decompression. Note that this dive lasted over two hours. @@ -1870,7 +1936,7 @@ the pressures of the oxygen and diluent cylinders. The pressures of these two cylinders are shown as green lines overlapping the depth profile. In addition, start and end pressures for both oxygen and diluent cylinders are shown in the _Equipment Tab_. Below is a dive profile for a CCR dive, -including an overaly of setpoint and oxygen sensor data, as well as the +including an overlay of setpoint and oxygen sensor data, as well as the cylinder pressure data. In this case there is good agreement from the readings of the two oxygen sensors. @@ -1886,13 +1952,13 @@ B]. == Obtaining more information about dives entered into the logbook -=== The *Dive Info* tab (for individual dives) +=== The *Info* tab (for individual dives) -The Dive Info tab gives some summary information about a particular dive -that has been selected in the *Dive List*. Useful information here includes -the surface interval before the dive, the maximum and mean depths of the -dive, the gas volume consumed, the surface air consumption (SAC) and the -number of oxygen toxicity units (OTU) incurred. +The Info tab gives some summary information about a particular dive that has +been selected in the *Dive List*. Useful information here includes the +surface interval before the dive, the maximum and mean depths of the dive, +the gas volume consumed, the surface air consumption (SAC) and the number of +oxygen toxicity units (OTU) incurred. [icon="images/icons/info.jpg"] [NOTE] @@ -2220,11 +2286,11 @@ other than air. Their 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 hypothetical +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. +the same narcotic effect as a diver breathing air diving at a depth equaling +the END. Figure (*B*) above shows an information box with a nearly complete set of data. @@ -2305,9 +2371,9 @@ side of the above figure for a diver using EAN32. === The Dive List context menu -Many actions within _Subsurface_ are dependent on a context menu used mostly -to manipulate groups of dives. The context menu is found by selecting a dive -or a group of dives and then right-clicking. +Several actions on either a single dive or a group of dives can be performed +using the Dive List Context Menu, found by selecting either a single dive or +a group of dives and then right-clicking. image::images/ContextMenu.jpg["Figure: Context Menu", align="center"] @@ -2350,36 +2416,41 @@ respect to the lowest sequence number to be used. Completing this operation results in new sequence numbers (based on date/time) for the dives in the *Dive List* panel. +One can also renumber a few selected dives in the dive list. Select the +dives that need renumbering. Right-click on the selected list and use the +Dive List Context Menu to perform the renumbering. A popup window appears +requiring the user to specify the starting number for the renumbering +process. + [[S_Group]] === Grouping dives into trips and manipulating trips For regular divers, the dive list can rapidly become very long. _Subsurface_ can group dives into _trips_. It performs this by grouping dives that have -date/times that are not separated in time by more than two days, thus -creating a single heading for each diving trip represented in the dive -log. Below is an ungrouped dive list (*A*, on the left) as well as the -corresponding grouped dive list comprising five dive trips (*B*, on the -right): +date/times not separated in time by more than two days, thus creating a +single heading for each diving trip represented in the dive log. Below is an +ungrouped dive list (*A*, on the left) as well as the corresponding grouped +dive list comprising five dive trips (*B*, on the right): image::images/Group2.jpg["Figure: Grouping dives", align="center"] Grouping into trips allows a rapid way of accessing individual dives without having to scan a long lists of dives. In order to group the dives in a dive -list, (from the Main Menu) users must select _Log -> Autogroup_. The *Dive -List* panel now shows only the titles for the trips. +list, (from the Main Menu) select _Log -> Autogroup_. The *Dive List* panel +now shows only the titles for the trips. ==== Editing the title and associated information for a particular trip Normally, in the dive list, minimal information is included in the trip title. More information about a trip can be added by selecting its trip -title from the *Dive List*. This shows a *Trip Notes* tab in the *Dive -Notes* panel. Here users can add or edit information about the date/time, -the trip location and any other general comments about the trip as a whole -(e.g. the dive company that was dived with, the general weather and surface -conditions during the trip, etc.). After entering this information, users -should select *Save* from the buttons at the top right of the *Trip Notes* -tab. The trip title in the *Dive List* panel should now reflect some of the -edited information. +title from the *Dive List*. This shows a *Trip Notes* tab in the *Notes* +panel. Here users can add or edit information about the date/time, the trip +location and any other general comments about the trip as a whole (e.g. the +dive company that was dived with, the general weather and surface conditions +during the trip, etc.). After entering this information, users should +select *Save* from the buttons at the top right of the *Trip Notes* tab. The +trip title in the *Dive List* panel should now reflect some of the edited +information. ==== Viewing the dives during a particular trip @@ -2390,16 +2461,16 @@ the trip. ==== Collapsing or expanding dive information for different trips -If a user right-clicks after selecting a particular trip in the dive list, -the resulting context menu allows several possibilities to expand or -collapse dives within trips. This includes expanding all trips, collapsing -all trips and collapsing all trips except the selected one. +After selecting a particular trip in the dive list, the context menu allows +several possibilities to expand or collapse dives within trips. This +includes expanding all trips, collapsing all trips and collapsing all trips +except the selected one. ==== Merging dives from more than one trip into a single trip -By right-clicking on a selected trip title in the *Dive List* panel, a -context menu shows up that allows the merging of trips by either merging of -the selected trip with the trip below or with the trip above. +After selecting a trip title, the context menu allows the merging of trips +by either merging the selected trip with the trip below or with the trip +above.(Merge trip with trip below; Merge trip with trip above) ==== Splitting a single trip into more than one trip @@ -2428,14 +2499,14 @@ duration. Users can unlink dives from the trip to which they belong. In order to do this, select and right-click the relevant dives to bring up the context menu. Then select the option *Remove dive(s) from trip*. The dive(s) now -appear immediately above the trip to which they belonged. +appear immediately above or below the trip to which they belonged, depending +on the date and time of the unliked dive. ==== Add a dive to the trip immediately above Selected dives can be moved from the trip to which they belong and placed -within the trip immediately above the currently active trip. To do this, -select and right-click the dive(s) to bring up the context menu, and then -select *Add dive(s) to trip immediately above*. +within a separate trip. To do this, select and right-click the dive(s) to +bring up the context menu, and then select *Create new trip above*. ==== Shift the start time of dive(s) @@ -2446,7 +2517,7 @@ and right-click the dive(s) to be adjusted. This action brings up the context menu on which the *Shift times* option should be selected. User must then specify the time (in hours and minutes) by which the dives should be adjusted and click on the option indicating whether the time adjustment -should be forwards or backwards. +should be ealier or later. ==== Merge dives into a single dive @@ -2456,12 +2527,21 @@ the dive computer and appearing as different dives in the *Dive List* panel. Users can merge these dives onto a single dive by selecting the appropriate dives, right-clicking them to bring up the context menu and then selecting *Merge selected dives*. It may be necessary to edit the dive -information in the *Dive Notes* panel to reflect events or conditions that -apply to the merged dive. The figure below shows the depth profile of two -such dives that were merged: +information in the *Notes* panel to reflect events or conditions that apply +to the merged dive. The figure below shows the depth profile of two such +dives that were merged: image::images/MergedDive.png["Example: Merged dive", align="center"] +==== Undo dive manipulations + +Important actions on dives or trips, described above, can be undone or +redone. This includes: _delete dives_, _merge dives_, _renumber dives_ and +_shift dive times_. To do this after performing any of these actions, from +the *Main Menu* select _Edit_. This brings up the possibility to _Undo_ or +_Redo_ an action. + + [[S_Filter]] === Filtering the dive list @@ -2474,12 +2554,12 @@ dives with a particular buddy. To open the filter, select _Log -> Filter divelist_ from the main menu. This opens the _Filter Panel_ at the top of the _Subsurface_ window. Three icons are located at the top right hand of the filter panel. The _Filter Panel_ -can be reset (i.e. all current filters cleared) by selecting the *+*. The -_Filter Panel_ may also be minimised by selecting the middle icon. When -minimised, only these three icons are shown. The panel can be maximised by -clicking the icon that minimised the panel. The filter may also be reset and -closed by selecting the button with the flag. An example of the _Filter -Panel_ is shown in the figure below. +can be reset (i.e. all current filters cleared) by selecting the *yellow +angled arrow*. The _Filter Panel_ may also be minimised by selecting the +*green up-arrow". When minimised, only these three icons are shown. The +panel can be maximised by clicking the icon that minimised the panel. The +filter may also be reset and closed by selecting the *red button* with the +white cross. An example of the _Filter Panel_ is shown in the figure below. image::images/Filterpanel.jpg["Figure: Filter panel", align="center"] @@ -2492,14 +2572,13 @@ check list results in the tags check list being reduced to "_cave_" and "_cavern_". Filtering of the check list enables the rapid finding of search terms for filtering the dive list. -To activate filtering of the dive list, the check box of at least one item -in one of the four check lists needs to be checked. The dive list is then -shortened to include only the dives that pertain to the selection criteria -specified in the check lists. The four check lists work as a filter with -_AND_ operators, Subsurface filters therefore for _cave_ as a tag AND _Joe -Smith_ as a buddy; but the filters within a category are inclusive - -filtering for _cave_ and _boat_ shows those dives that have either one or -both of these tags. +To activate filtering of the dive list, check at least tone check box in one +of the four check lists. The dive list is then shortened to include only the +dives that pertain to the criteria specified in the check lists. The four +check lists work as a filter with _AND_ operators, Subsurface filters +therefore for _cave_ as a tag AND _Joe Smith_ as a buddy; but the filters +within a category are inclusive - filtering for _cave_ and _boat_ shows +those dives that have either one OR both of these tags. [[S_ExportLog]] == Exporting the dive log or parts of the dive log @@ -2527,10 +2606,10 @@ connexion _Facebook_. image::images/facebook1_f20.jpg["Figure: Facebook login", align="center"] Having established a login to _Facebook_, transfer of a dive profile to -one's _Facebook_ timeline is easy. A _Facebook_ icon appears in the *Dive -Notes* panel of _Subsurface_ (See image *A* below). Ensure that the dive -that you want to transfer to the timeline is depicted in the _Subsurface_ -*Dive Profile* panel. Select the _Facebook_ icon, and a dialogue is shown, +one's _Facebook_ timeline is easy. A _Facebook_ icon appears in the *Notes* +panel of _Subsurface_ (See image *A* below). Ensure that the dive that you +want to transfer to the timeline is depicted in the _Subsurface_ *Dive +Profile* panel. Select the _Facebook_ icon, and a dialogue is shown, determining the amount of additional information transferred with the dive profile (see image *B*, below). In order to transfer a dive profile to _Facebook_, the name of a _Facebook_ album needs to be provided. The @@ -2578,7 +2657,7 @@ A dive log or part of it can be saved in three formats: _Divelogs.de_. Log into _http://en.divelogs.de_ and subscribe to this service in order to upload dive log data from _Subsurface_. -* _DiveShare_ is also a dive log repostory on the Internet focusing on the +* _DiveShare_ is also a dive log repository on the Internet focusing on the recreational dives. In order to upload dives one has to provide a used ID, so registration with _http://scubadiveshare.com_ is required. @@ -2806,7 +2885,7 @@ image::images/Pref1_f20.jpg["FIGURE: Preferences defaults page", align="center"] the dive list. ** *Default cylinder*: Here users can specify the default cylinder listed in - the *Equipment* tab of the *Dive Notes* panel. + the *Equipment* tab of the *Notes* panel. ** *Animations*: Some actions in showing the dive profile are performed using animations. For instance, the axis values for depth and time change from dive to @@ -2856,6 +2935,7 @@ the dive profile: ** _Show unused cylinders in Equipment Tab_: This checkbox allows display of information about unused cylinders when viewing the *Equipment Tab*. Conversely, if this box is not checked, and any cylinders entered using the *Equipment Tab* are not used (e.g. there was no gas switch to such a cylinder), then these cylinders are omitted from that list. +[[GradientFactors_Ref]] ** _Show average depth_: Activating this checkbox causes _Subsurface_ to draw a grey line across the dive profile, indicating the mean depth of the dive up to a particular point in time during that dive. Normally this is a u-shaped line indicating the deepest average depth just before the @@ -2983,7 +3063,7 @@ Like the _Subsurface_ dive log, the planner screen is divided into several sections (see image below). The *setup* parameters for a dive are entered into the several sections on the left hand side of the screen. The setup is divided into several sections: Available Gases, Rates, Planning, Gas Options -and Dive Notes. +and Notes. At the top right hand is a green *design panel* upon which the profile of the dive can be manipulated directly by dragging and clicking as explained @@ -2998,35 +3078,121 @@ messages about the dive plan are printed. image::images/PlannerWindow1_f20.jpg["FIGURE: Dive planner startup window", align="center"] -=== Open circuit dives as an example of dive planning +=== Open circuit dives -- Towards the left bottom of the planner (circled in blue in the image below) - is a dropbox with three options. Select the appropriate one of these: +- Towards the centre bottom of the planner (circled in blue in the image + above) is a dropbox with three options. Select the appropriate one of these: ** Open Circuit (the default) ** CCR ** pSCR +- Choose the Open Circuit option. - In the top left-hand area of the planning screen, ensure that the constant - dive parameters are appropriate. These are: Start date and time of the dive, - Atmospheric Pressure and Altitude above sea level of the dive site. The - atmospheric pressure can also be entered as an altitude in metres, assuming - an atmospheric pressure of 1.013 bar. - -- In the table labelled _Available Gases_, add the information of the - cylinders to be used as well as the gas composition within that - cylinder. This is done in a similar way as for <<S_CylinderData,providing - cylinder data for dive logs>>. Choose the cylinder type by double clicking - the cylinder type and using the dropdown list, then specify the work - pressure of this cylinder. By leaving the oxygen concentration (O2%) filed - empty, the cylinder is assumed to contain air. Otherwise enter the oxygen - and/or helium concentration in the boxes provided in this dialogue. Add - additional cylinders by using the "+" icon to the top righthand of the - dialogue. - -- The dialogue indicating _Dive Planner Points_ is usually not used at this - stage of the dive planning. - -*The planning is performed in three stages* + dive parameters are appropriate. These are: Start date and time of the + intended dive, Atmospheric Pressure and Altitude above sea level of the dive + site. The atmospheric pressure can also be entered as an altitude in metres, + assuming a sea-level atmospheric pressure of 1.013 bar. + +- In the table labeled _Available Gases_, add the information of the cylinders + to be used as well as the gas composition within that cylinder. This is done + in a similar way as for <<S_CylinderData,providing cylinder data for dive + logs>>. Choose the cylinder type by double clicking the cylinder type and + using the dropdown list, then specify the work pressure of this cylinder. By + leaving the oxygen concentration (O2%) filed empty, the cylinder is assumed + to contain air. Otherwise enter the oxygen and/or helium concentration in + the boxes provided in this dialogue. Add additional cylinders by using the + "+" icon to the top righthand of the dialogue. + +- The profile of the planned dive can be created in two ways: + * Drag the waypoints (the small white circles) on the existing dive profile in + a way to represent the dive. Additional waypoints can be created by + double-clicking the existing dive profile. Waypoints can be deleted by + right-clicking a particular waypoint and selecting the _delete_ item from + the resulting context menu. + * The most efficient way to create a dive profile is to enter the appropriate + values into the table marked _Dive planner points_. The first line of the + table represents the duration and the final depth of the descent from the + surface. Subsequent segments describe the bottom phase of the dive. The _CC + set point_ column is only relevant for closed circuit divers. The ascent is + usually not specified because this is what the planner is supposed to + calculate. Add additional segments to the profile by selecting the "+" icon + at the top right hand of the table. Segments entered into the _Dive planner + points_ table automatically appear in the *Dive Profile* diagram. + +==== Recreational dives + +The _Subsurface_ dive planner allows a sophisticated way of planning +recreational dives, i.e. dives that remain within no-decompression limits. +The dive planner automatically takes into account the nitrogen load incurred +in previous dives. But conventional dive tables are also used in a way that +can take into account previous dives. Why use a dive planner for +recreational dives? Using recreational dive tables, the maximum depth of a +dive is taken into acount. However, few dives are undertaken at a constant +depth corresponding to the maximum depth (i.e. a "square" dive +profile). This means that dive tables overestimate the nitrogen load +incurred during previous dives. The _Subsurface_ dive planner calculates +nitrogen load according to the real dive profiles of all uploaded previous +dives, in a similar way as dive computers calculate nitrogen load during a +dive. This mean that the diver gets 'credit' in terms of nitrogen loading +for not remaining at maximum depth during previous dives, enabling planning +a longer subsequent dive. For the planner to work it is therefore crucial to +upload all previous dives onto _Subsurface_ before performing dive planning. + +To plan a dive, the appropriate settings need to be defined. + +Ensure that the date and time is set to that of the intended dive. This +allows calculation of the nitrogen load incurred during previous dives. + +- Immediately under the heading _Planning_ are two checkboxes _Recreational_ + and _Safety Stop_. Check these two boxes. + +- Then define the cylinder size, the gas mixture (air or % oxygen) and the + starting cylinder pressure in the top left-hand section of the planner under + _Available gases_. + +- The planner calculates whether the specified cylinder contains enough + air/gas to complete the planned dive. In order for this to be realistic, + under _Gas options_, specify an appropriate surface air consumption (SAC) + rate for _Bottom SAC_. Suitable values are between 15 l/min and 30 l/min, + with novice divers or difficult dives requiring SAC rates closer to 30l/min. + +- Define the amount of gas that the cylinder must have at the end of the + bottom section of the dive just before ascent. A value of 50 bar is often + used. + +- Define the depth of the dive by dragging the waypoints (white dots) on the + dive profile or (even better) defining the appropriate depths using the + table under _Dive planner points_ as desribed under the previous heading. If + this is a multilevel dive, set the appropriate dive depths to represent the + dive plan by adding waypoints to the dive profile or by adding appropriate + dive planner points to the _Dive Planner Points_ table. + +- The ascent speed can be changed. The default ascent speeds are those + considered safe for recreational divers. + +The dive profile in the planner indicates the maximum dive time within +no-deco limits using the Bühlmann ZH-L16 algorithm and the gas and depth +settings specified as described above. The _Subsurface_ planner allows rapid +assessment of dive duration as a function of dive depth, given the nitrogen +load incurred during previous dives. The dive plan includes estimates of the +amount of air/gas used, depending on the cylinder settings specified under +_Available gases_. If the initial cylinder pressure is set to 0, the dive +duration shown is the true no-deco limit (NDL) without taking into account +gas used during the dive. If the surface above the dive profile is RED it +means that recreational dive limits are exceeded and either the dive +duration or the dive depth needs to be reduced. + +Below is an image of a dive plan for a recreational dive at 30 +metres. Although the no-deco limit (NDL) is 23 minutes, the duration of the +dive is limited by the amount of air in the cylinder, reflected by the +information in the text box at the bottom right of the panel. + +image::images/rec_diveplan.jpg["FIGURE: A recreational dive plan: setup", align="center"] + +==== Non-recreational open circuit dives, including decompression + +Non-recreational dive planning involves exceeding the no-deco limits and/or +using multiple breathing gases. Such dives are planned in three stages: *a) Nitrogen management*: This is performed by specifying the rates for descent and ascent, as well as the gradient factors (GFLow and GFHigh) under the headings _Rates_ and _Planning_ @@ -3056,7 +3222,6 @@ _Drop to first depth_ is activated, then the descent phase of the planned dive will be at the maximal descent rate specified in the _Rates_ section of the dive setup. - *b) Oxygen management*: In the *Gas Options* part of the dive specification, the maximum partial pressure for oxygen needs to be specified for the bottom part of the dive (_bottom po2_) as well as for the decompression part of the dive (_deco po2_). @@ -3102,7 +3267,7 @@ specified in the _Available Gases_ table. Add new waypoints until the main features of the dive have been completed, e.g. the bottom time segment and deep stops (if these are implemented). Leave the remaining waypoints on the ascent to _Subsurface_. In most cases _Subsurface_ computes additional way -points in order to fulfil decompression requirements for that dive. A +points in order to fulfill decompression requirements for that dive. A waypoint can be moved by selecting that waypoint and by using the arrow keys. The waypoints listed in the _Dive Planner Points_ dialogue can be edited by hand in order to obtain a precise presentation of the dive @@ -3140,7 +3305,7 @@ appear in the *Dive List* panel of _Subsurface_. On the bottom right of the dive planner, under _Dive Plan Details_, the exact details of the dive plan are provided. These details may be modified -by checking any of the options under the _Dive Notes_ section of the dive +by checking any of the options under the _Notes_ section of the dive planner, immediately to the left of the _Dive Plan Details_. If a _Verbatim diveplan_ is requested, a detailed sentence-level explanation of the dive plan is given. If any of the management specifications have been exceeded @@ -3153,6 +3318,25 @@ INCLUDES the transition time to get to that level. However, if the _Display transition in deco_ option is checked, the transitions are shown separately from the segment durations at a particular level. +=== Planning pSCR dives + +To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ rather than +_Open circuit_ in the dropdown list. +The parameters of the pSCR diver can be set by selecting _File -> Preferences -> Graph_ +from the main menu, where the gas consumption calculation takes into account the pSCR dump +ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop +accross the mouthpiece of the rebreather into account. If the +pO~2~ drops below what is considered a save value, a warning appears in the _Dive plan +details_. A typical pSCR configuration is with a single cylinder and one or more bail-out +cylinders. Therefore the setup of the _Available gases_ and the _Dive planner points_ tables +are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints +are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable +to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen +in the loop due to the oxygen drop across the mouthpiece of the pSCR equipment. + +image::images/Planner_pSCR1_f20.jpg["FIGURE: Planning a pSCR dive: setup", align="center"] + + === Planning CCR dives To plan a dive using a closed circuit rebreather, select the _CCR_ option in @@ -3177,25 +3361,6 @@ image::images/Planner_CCR1_f20.jpg["FIGURE: Planning a CCR dive: setup", align=" Note that, in the _Dive plan details_, the gas consumption for a CCR segment is not calculated, so gas consumptions of 0 litres are the norm. -=== Planning pSCR dives - -To plan a dive using a passive semi-closed rebreather (pSCR), select _pSCR_ rather than -_Open circuit_ in the dropdown list. -The parameters of the pSCR diver can be set by selecting _File -> Preferences -> Graph_ -from the main menu, where the gas consumption calculation takes into account the pSCR dump -ratio (default 10:1) as well as the metabolism rate. The calculation also takes the oxygen drop -accross the mouthpiece of the rebreather into account. If the -pO~2~ drops below what is considered a save value, a warning apears in the _Dive plan -details_. A typical pSCR configuration is with a single cylinder and one or more bail-out -cylinders. Therefore the setup of the _Available gases_ and the _Dive planner points_ tables -are very similar to that of a CCR dive plan, described above. However, no oxygen setpoints -are specified for pSCR dives. Below is a dive plan for a pSCR dive. The dive is comparable -to that of the CCR dive above, but note the longer ascent duration due to the lower oxygen -in the loop due to the oxygen drop accross the mouthpiece of the pSCR equipment. - -image::images/Planner_pSCR1_f20.jpg["FIGURE: Planning a pSCR dive: setup", align="center"] - - [[S_Replan]] === Modifying an existing dive plan @@ -3239,8 +3404,8 @@ Plan Details_ for inclusion in a text file or word processing document. Dive plans have many characteristics in common with dive logs (dive profile, dive notes, etc). After a dive plan has been saved, the dive details and -gas calculations are saved in the *Dive Notes* tab. While a dive plan is -being designed, it can be printed using the _Print_ button in the dive +gas calculations are saved in the *Notes* tab. While a dive plan is being +designed, it can be printed using the _Print_ button in the dive planner. This prints the dive details and gas calculations in the _Dive Plan Details_ panel of the dive planner. However, after the plan has been saved, it is represented in a way very similar to a dive log and the gas @@ -3315,8 +3480,7 @@ des sections de ce manuel traitant des opérations relatives. *liste des plongées*. - <<S_ViewPanels,_Profil_>> - Affiche uniquement le panneau du *profil de la plongée*. -- <<S_ViewPanels,_Info_>> - Affiche uniquement le panneau des *notes de - plongée*. +- <<S_ViewPanels,_Info_>> - Affiche uniquement le panneau des *notes*. - <<S_ViewPanels,_Globe_>> - Affiche uniquement le panneau de la *carte mondiale*. - _Statistiques annuelles_ - Affiche par année le résumé des statistiques des @@ -3677,7 +3841,7 @@ _Subsurface_ as follows: files_". - On the list of file names select the .CSV file that has been created above. An import dialogue opens. -- In the dropdown list on the middle right labeled '_Pre-configured imports_", +- In the dropdown list on the top left labeled '_Pre-configured imports_", select _APD Log Viewer_. - Ensure the other settings for the ADP dive log are appropriate, then select _OK_. @@ -3719,8 +3883,8 @@ naming conventions to export dive log data. appropriate dives. 4. Within the list of dives, select the dives you would like to import later: * To select certain dives: hold 'ctrl' and click the dive - * To select all dives: Select the first dive, hold down shift and - select the last dive + * To select all dives: Select the first dive, hold down shift and select the + last dive 5. With the dives marked, use the program menu _File -> Export_ 6. The export pop-up will show. Within this pop-up, there is one field called 'Export Path'. @@ -3762,10 +3926,11 @@ Making a backup copy of the Suunto DM4/DM5 database: === Exporting from Atomic Logbook [[Atomic_Export]] +[icon="images/icons/atomiclogo.jpg"] [NOTE] Atomic Logbook is a Windows software by Atomic Aquatics. It allows downloading of dive information from Cobalt and Cobalt 2 dive computers. -The divelog is kept in a SQlite database at +The divelog is kept in a SQLite database at C:\ProgramData\AtomicsAquatics\Cobalt-Logbook\Cobalt.db. This file can be directly imported to Subsurface. @@ -3827,7 +3992,7 @@ following a few simple rules: 1. Date: use one of the following formats: yyyy-mm-dd, dd.mm.yyyy, mm/dd/yyyy 2. Duration: the format should be minutes:seconds. -3. Unit system: only one unit system shold be used (i.e., no mixture between +3. Unit system: only one unit system should be used (i.e., no mixture between imperial and metric units) 4. Tags and buddies: values should be separated using a comma. 5. GPS position: users must use decimal degrees, e.g. 30.22496 30.821798 diff --git a/Documentation/user-manual_ru.html.git b/Documentation/user-manual_ru.html.git index 96d0dbede..dce91ace8 100644 --- a/Documentation/user-manual_ru.html.git +++ b/Documentation/user-manual_ru.html.git @@ -473,7 +473,11 @@ libdivecomputer.</p></div> <h2 id="S_UserSurvey">1. Работа Ñ Ñтим руководÑтвом</h2>
<div class="sectionbody">
<div class="paragraph"><p>ЕÑли руководÑтво открыто из <em>Subsurface</em>, то вы не увидите никаких Ñлементов
+<<<<<<< HEAD +управлениÑ. Однака Ð²Ð°Ð¶Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ <em>поиÑка</em> доÑтупна по нажатию комбинации клавиш
+======= управлениÑ. Однако Ð²Ð°Ð¶Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ <em>поиÑка</em> доÑтупна по нажатию комбинации клавиш
+>>>>>>> v4.4-branch control-F или command-F. ИÑпользуйте текÑтовое поле в нижней чаÑти Ñкрана Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка
нужной информации в руководÑтве.</p></div>
</div>
@@ -572,8 +576,13 @@ control-F или command-F. ИÑпользуйте текÑтовое поле Ð <div class="sect1">
<h2 id="S_GetInformation">5. Сохранение погружений в журнале</h2>
<div class="sectionbody">
+<<<<<<< HEAD +<div class="paragraph"><p>Теперь, когда Ñоздан новый журоанл, очень проÑто добавить Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ðº нему.
+<em>Subsurface</em> предлашает неÑколько ÑпоÑобов Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ð¹, которые подробно
+======= <div class="paragraph"><p>Теперь, когда Ñоздан новый журнал, очень проÑто добавить Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ðº нему.
<em>Subsurface</em> предлагает неÑколько ÑпоÑобов Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ð¹, которые подробно
+>>>>>>> v4.4-branch опиÑаны далее:</p></div>
<div class="paragraph"><p>1) ЕÑли вы ведете бумажный журнал, храните информацию в Ñлектронной таблице или
иÑпользуете другой ручной ÑпоÑоб, данные о погружениÑÑ… могут быть добавлены Ñ
@@ -588,6 +597,11 @@ control-F или command-F. ИÑпользуйте текÑтовое поле Ð </li>
<li>
<p>
+<<<<<<< HEAD +Импорт данных из журнала, который велÑÑ Ð² Ñлектронной таблице или в виже CSV-файла.
+ ОбратитеÑÑŒ к главам <a href="#S_Appendix_D">ПРИЛОЖЕÐИЕ Г: ÐкÑпорт таблиц в CSV формат</a> и
+ <a href="#S_ImportingCSVDives">Импорт погружений в CSV формате</a>.
+======= Импорт данных из журнала, который велÑÑ Ð² Ñлектронной таблице или в виде CSV-файла.
ОбратитеÑÑŒ к главам <a href="#S_Appendix_D">ПРИЛОЖЕÐИЕ Г: ÐкÑпорт таблиц в CSV формат</a> и
<a href="#S_ImportingCSVDives">Импорт погружений в CSV формате</a>.
@@ -601,16 +615,35 @@ control-F или command-F. ИÑпользуйте текÑтовое поле Ð <li>
<p>
ÐепоÑредÑтвенно дайв-компьютера. Смотрите главу <a href="#S_ImportDiveComputer">Импорт данных нового Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¸Ð· дайв-компьютера</a> или
+>>>>>>> v4.4-branch +</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>2) ЕÑли ваши Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñаны в дайв-компьютере, вы можете получить значительное
+ количеÑтво информации, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»ÑŒ погружениÑ. ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть импортированы
+ из:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<<<<<<< HEAD +ÐепоÑредÑтвенно дайв-компьютера. Смотрите главу <a href="#S_ImportDiveComputer">Импорт данных нового Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¸Ð· дайв-компьютера</a> или
+======= +Стороннего программного обеÑпечениÑ, раÑпроÑтранÑемого производителÑми дайв-компьютеров.
+ ОбратитеÑÑŒ к <a href="#S_ImportingAlienDiveLogs">Импорт погружений из других иÑточников и форматов данных</a>.
+>>>>>>> v4.4-branch </p>
</li>
<li>
<p>
+<<<<<<< HEAD Стороннего программного обеÑпечениÑ, раÑпроÑтранÑемого производителÑми дайв-компьютеров.
ОбратитеÑÑŒ к <a href="#S_ImportingAlienDiveLogs">Импорт погружений из других иÑточников и форматов данных</a>.
</p>
</li>
<li>
<p>
+======= +>>>>>>> v4.4-branch Импорт из Ñлектронных таблиц и CSV-файлов, Ñодержащих профили погружений. Смотрите
<a href="#S_ImportingCSVDives">Импорт погружений в CSV-формате из дайв-компьютеров и другого ПО Ð´Ð»Ñ Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¾Ð²</a>.
</p>
@@ -675,6 +708,24 @@ control-F или command-F. ИÑпользуйте текÑтовое поле Ð <div class="paragraph"><p>а. Выбрать на карте, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² правой нижней чаÑти окна
<em>Subsurface</em>. Ðа карте отображаетÑÑ Ð·ÐµÐ»ÐµÐ½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа Ñ Ð½Ð°Ð´Ð¿Ð¸Ñью «Выберите меÑто
на карте двойным щелчком мыши». При двойном нажатии в ÑоответÑтвующем меÑте
+<<<<<<< HEAD +карты, Ð·ÐµÐ»ÐµÐ½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа иÑчезнет и координаты точки будут заполнены в поле.
+</p>
+</li>
+<li>
+<p>
+Координаты могут быть получены Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑпомогательного приложениÑ
+<em>Subsurface</em>, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ уÑтройÑтво Android или iPhone Ñ GPS-датчиком
+и координаты дайв-Ñайта были Ñохранены в Ñтом уÑтройÑтве.
+<a href="#S_Companion">Ðажмите, чтобы узнать больше</a>
+</p>
+</li>
+<li>
+<p>
+ЕÑли вам извеÑтны координаты, их можно ввеÑти вручную в одном из четырех
+форматов, Ñначала широта, потом долгота:
+</p>
+======= карты, Ð·ÐµÐ»ÐµÐ½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа иÑчезнет и координаты точки будут заполнены в поле.</p></div>
<div class="paragraph"><p>б. Координаты могут быть получены Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑпомогательного приложениÑ
<em>Subsurface</em>, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ уÑтройÑтво Android или iPhone Ñ GPS-датчиком
@@ -682,6 +733,7 @@ control-F или command-F. ИÑпользуйте текÑтовое поле Ð <a href="#S_Companion">Ðажмите, чтобы узнать больше</a></p></div>
<div class="paragraph"><p>в. ЕÑли вам извеÑтны координаты, их можно ввеÑти вручную в одном из четырех
форматов, Ñначала широта, потом долгота:</p></div>
+>>>>>>> v4.4-branch <div class="literalblock">
<div class="content">
<pre><code>ISO 6709 Приложение D, например 30°13'28.9"Ю 30°49'1.5"В
@@ -995,8 +1047,13 @@ Freedive (погружение без дыхательного аппарата) </li>
<li>
<p>
+<<<<<<< HEAD +Ðажмите кнопку <em>Загрузить</em>. ПоÑле уÑпешной загрузки диалоговое окно будет выглÑдет
+ как показано на риÑунке <strong>B</strong>.
+======= Ðажмите кнопку <em>Загрузить</em>. ПоÑле уÑпешной загрузки диалоговое окно будет
выглÑдеть как показано на риÑунке <strong>B</strong>.
+>>>>>>> v4.4-branch </p>
</li>
<li>
@@ -1012,7 +1069,11 @@ Freedive (погружение без дыхательного аппарата) </p>
</li>
</ul></div>
+<<<<<<< HEAD +<div class="paragraph"><p>ПоÑле загрузки погружений они отобразÑÑ‚ÑÑ Ð² ввиде таблицы в правой чаÑти окна
+======= <div class="paragraph"><p>ПоÑле загрузки погружений они отобразÑÑ‚ÑÑ Ð² в виде таблицы в правой чаÑти окна
+>>>>>>> v4.4-branch (как показано на риÑунке <strong>Ð’</strong> выше). ПроÑтавьте галочки напротив тех погружений,
которые должны быть перенеÑены в <strong>СпиÑок погружений</strong> и нажмите кнопку <strong>OK</strong>.
Окно загрузки будет закрыто, а выбранные Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑвÑÑ‚ÑÑ Ð² ÑпиÑке.</p></div>
@@ -1196,7 +1257,11 @@ Freedive (погружение без дыхательного аппарата) <div class="paragraph"><p><strong>ПримечаниÑ</strong>: Ð’ Ñто поле можно ввеÑти любую дополнительную информацию.</p></div>
<div class="paragraph"><p>Кнопка <strong>Применить изменениÑ</strong> иÑпользуютÑÑ Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ на вÑех
вкладках информационной панели и Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ, поÑтому нет необходимоÑти
+<<<<<<< HEAD +нажимать её до тех пор, пока вы не заполнили ВСЮ информацию. Ðиже приведен
+======= нажимать ее до тех пор, пока вы не заполнили ВСЮ информацию. Ðиже приведен
+>>>>>>> v4.4-branch пример полноÑтью заполненной информационной панели:</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
@@ -1382,7 +1447,11 @@ Organiser, мы рекомендуем Ñначала ÑкÑпортироват Suunto Dive Manager и Shearwater. При импорте <em>Subsurface</em> пытаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ
множеÑтвенные запиÑи отноÑÑщиеÑÑ Ðº одному погружению и объединить их. ЕÑли не
обнаружено проблем (разница во временной зоне или Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€Ð°Ð·Ð½Ð¸Ñ†Ð° во времени),
+<<<<<<< HEAD +<em>Subsurface</em> не ÑоздаcÑ‚ дубликатов погружений.</p></div>
+======= <em>Subsurface</em> не ÑоздаÑÑ‚ дубликатов погружений.</p></div>
+>>>>>>> v4.4-branch </div>
<div class="sect3">
<h4 id="_иÑпользование_универÑального_импорта">5.2.10. ИÑпользование универÑального импорта</h4>
@@ -1486,10 +1555,17 @@ divelogs.de). Ð’ поÑвившемÑÑ Ð¾ÐºÐ½Ðµ (риÑунок <strong>Ð</str <h4 id="S_ImportingCSVData">5.2.13. Импорт погружений в формате CSV</h4>
<div class="paragraph"><p>Файл Ñо значениÑми, разделенными запÑтой (.csv) может иÑпользоватьÑÑ ÐºÐ°Ðº Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°
Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ (в Ñлучае ребризеров замкнутого цикла APD Inspiration и Evolution), так
+<<<<<<< HEAD +и Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐºÐ¸ общей информации о дайвах (еÑли вы вели учет в Ñлектронной таблице). CSV
+ÑвлÑетÑÑ ÑƒÐ½Ð¸Ð²ÐµÑ€Ñальным и проÑтым форматом Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° данными между компьютерам и программами.
+Более подробно об Ñтом формате раÑÑказываетÑÑ Ð² главе <a href="#S_CSV_Intro">Формат CSV Ð´Ð»Ñ Ð´Ð°Ð¹Ð²ÐµÑ€Ð¾Ð²</a>.
+<em>Subsurface</em> позволÑет также выгружать журнал погужений Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ¹ загрузки в другие программы.
+======= и Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ общей информации о дайвах (еÑли вы вели учет в Ñлектронной таблице). CSV
ÑвлÑетÑÑ ÑƒÐ½Ð¸Ð²ÐµÑ€Ñальным и проÑтым форматом Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° данными между компьютерам и программами.
Более подробно об Ñтом формате раÑÑказываетÑÑ Ð² главе <a href="#S_CSV_Intro">Формат CSV Ð´Ð»Ñ Ð´Ð°Ð¹Ð²ÐµÑ€Ð¾Ð²</a>.
<em>Subsurface</em> позволÑет также выгружать журнал погружений Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ¹ загрузки в другие программы.
+>>>>>>> v4.4-branch ОбратитеÑÑŒ к главе <a href="#S_Appendix_D">ПРИЛОЖЕÐИЕ Г: ÐкÑпорт Ñлектронных таблиц в формат CSV</a>
за информацией по загрузке данных из Ñлектронных таблиц в <em>Subsurface</em>.</p></div>
</div>
@@ -1502,7 +1578,11 @@ divelogs.de). Ð’ поÑвившемÑÑ Ð¾ÐºÐ½Ðµ (риÑунок <strong>Ð</str <div class="olist arabic"><ol class="arabic">
<li>
<p>
+<<<<<<< HEAD +<em>ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ погружении</em>: в Ñтом Ñлучае файл Ñодержит обучную Ð´Ð»Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° информацию,
+======= <em>ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ погружении</em>: в Ñтом Ñлучае файл Ñодержит обычную Ð´Ð»Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° информацию,
+>>>>>>> v4.4-branch например, дату и времÑ, глубину, длительноÑÑ‚ÑŒ, имена партнеров и дайв-маÑтера, возможно
данные об баллонах и давлении до и поÑле погружениÑ, примечаниÑ. Ð’Ñе данные Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾
Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½ÑÑ‚ÑÑ Ð² одной Ñтроке, а порÑдке определенном в заголовке.
@@ -1519,7 +1599,11 @@ divelogs.de). Ð’ поÑвившемÑÑ Ð¾ÐºÐ½Ðµ (риÑунок <strong>Ð</str </p>
</li>
</ol></div>
+<<<<<<< HEAD +<div class="paragraph"><p>Перед импортом CSV-файла в <em>Subsurface</em> вам <strong>необходимо выÑÑнить некоторые ÑвойÑвтва Ñтого
+======= <div class="paragraph"><p>Перед импортом CSV-файла в <em>Subsurface</em> вам <strong>необходимо выÑÑнить некоторые ÑвойÑтва Ñтого
+>>>>>>> v4.4-branch файла</strong>:</p></div>
<div class="paragraph"><p>а. Какой Ñимвол Ñлужит разделителем колонок в одной Ñтроке данных? Ðтот Ñимвол должен быть
запÑтой (,) или табулÑцией? Ð’Ñ‹ можете определить Ñто, открыв файл в текÑтовом редакторе.
@@ -1540,14 +1624,22 @@ divelogs.de). Ð’ поÑвившемÑÑ Ð¾ÐºÐ½Ðµ (риÑунок <strong>Ð</str <img src="images/csv_import1_f20.jpg" alt="РиÑунок: Диалог 1 импорт CSV" />
</div>
</div>
+<<<<<<< HEAD +<div class="paragraph"><p>Обратите внимение на выпадающий ÑпиÑок в левом верхнем углу. Он Ñодержит наÑтройки длÑ
+======= <div class="paragraph"><p>Обратите внимание на выпадающий ÑпиÑок в левом верхнем углу. Он Ñодержит наÑтройки длÑ
+>>>>>>> v4.4-branch чаÑто вÑтречающихÑÑ Ð´Ð°Ð¹Ð²-компьютеров и программ. ЕÑли ваш CSV-файл еÑÑ‚ÑŒ в Ñтом ÑпиÑке,
иÑпользуйте его. Ð’ противном Ñлучае Ñледует выбрать <em>Импорт вручную</em>. Ð’ окне конфигурации
также еÑÑ‚ÑŒ выпадающие ÑпиÑок Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñимвола-разделителÑ, формата даты и длительноÑти
погружениÑ, а также иÑпользуемой ÑиÑтемы мер. Ð”Ð»Ñ ÑƒÑпешного импорта очень важно задать
правильные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтих ÑпиÑках.</p></div>
<div class="paragraph"><p>Ðа поÑледнем шаге вы должны ÑопоÑтавить Ð¿Ð¾Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… в файле их названиÑм. ÐŸÐµÑ€Ð²Ð°Ñ Ð±ÐµÐ»Ð°Ñ
+<<<<<<< HEAD +Ñтрока таблицы данных Ñодержит заголоки, найденные в CSV-файле. Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ñтрока таблицы,
+======= Ñтрока таблицы данных Ñодержит заголовки, найденные в CSV-файле. Ð“Ð¾Ð»ÑƒÐ±Ð°Ñ Ñтрока таблицы,
+>>>>>>> v4.4-branch находÑщаÑÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно на ней, Ñодержит Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ <em>Subsurface</em>. Ð’ белой облаÑти,
находÑщейÑÑ Ñразу под выпадающими ÑпиÑками, предÑтавлены полÑ-метки, которые могут быть
импортированы в <em>Subsurface</em>. Ðти метки, заключенные в овалы голубого цвета, необходимо
@@ -1571,8 +1663,13 @@ divelogs.de). Ð’ поÑвившемÑÑ Ð¾ÐºÐ½Ðµ (риÑунок <strong>Ð</str <td class="icon">
<img src="images/icons/important.png" alt="Важно" />
</td>
+<<<<<<< HEAD +<td class="content">Ðббревиатура <em>CSV</em> проиÑходит от английÑкого <em>Comma-Separated Variables</em>, что означает
+<em>зачениÑ, разделенные запÑтой</em>. Файлы Ñтого формата можно отредактировать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ текÑтового
+======= <td class="content">Ðббревиатура <em>CSV</em> проиÑходит от английÑкого <em>Comma-Separated Values</em>, что означает
<em>значениÑ, разделенные запÑтой</em>. Файлы Ñтого формата можно отредактировать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ текÑтового
+>>>>>>> v4.4-branch редактора, например Notepad (Windows), gedit (Linux) или TextWrangler(OS/X). ПреимущеÑтва
Ñтого формата заключаютÑÑ Ð² том, что а) Ð´Ð»Ñ ÐµÐ³Ð¾ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ нужно никакого Ñпециализированного
программного обеÑпечениÑ, и б) в нем нет ничего лишнего и он может легко быть
@@ -1641,7 +1738,11 @@ Pulau Weh 2012-12-20 09:46 55:56 38.6 Karaeng Bontonompo</code Файл должен быть Ñохранен в кодировке UTF-8, еÑли вы иÑпользуете Ñимволы отличные от латинÑких.
Размер файла также может быть причиной определенных проблем. Импорт 100 погружений за раз
(<em>ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ погружениÑÑ…_) врÑд ли будет проблемой, но файлы большего размера могут.
+<<<<<<< HEAD +При возникновении проблем Ñ _Импортом CSV</em> попробуйте Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° уменьшить развер файла.</td>
+======= При возникновении проблем Ñ _Импортом CSV</em> попробуйте Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° уменьшить размер файла.</td>
+>>>>>>> v4.4-branch </tr></table>
</div>
</div>
@@ -1945,21 +2046,36 @@ Pulau Weh 2012-12-20 09:46 55:56 38.6 Karaeng Bontonompo</code ниже), поÑле чего можно приÑтупать к Ñбору информации о меÑтоположении погружений.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
+<<<<<<< HEAD +<img src="images/iphone.jpg" alt="FIGURE: Using iPhone companion application" width="640" />
+</div>
+</div>
+<div class="paragraph"><p>ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть добавлены автоматичеÑки или вручную. Ð’ ручном редиме, Ñлужба получениÑ
+======= <img src="images/iphone.jpg" alt="РиÑунок: ИÑпользоване вÑпомогательного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° iPhone" width="640" />
</div>
</div>
<div class="paragraph"><p>ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть добавлены автоматичеÑки или вручную. Ð’ ручном режиме, Ñлужба получениÑ
+>>>>>>> v4.4-branch координат запуÑкаетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, а в нижней чаÑти Ñкрана поÑвлÑетÑÑ ÐºÑ€Ð°ÑÐ½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа. ПоÑле
Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼ нужно нажать на краÑной облаÑти, чтобы оÑтановить Ñлужбу
позиционированиÑ. При запущенной Ñлужбе Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹ можете добавлÑÑ‚ÑŒ погружениÑ
только в ручном режиме.</p></div>
+<<<<<<< HEAD +<div class="paragraph"><p>Позже вы можете отредактирование название меÑте погружениÑ, выбрав и нажав на него в ÑпиÑке.
+======= <div class="paragraph"><p>Позже вы можете отредактировать название меÑта погружениÑ, выбрав и нажав на него в ÑпиÑке.
+>>>>>>> v4.4-branch Другие Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупны. СпиÑок дайвов автоматичеÑки выгружаетÑÑ Ð½Ð° Ñервер,
возможно вручную Ñинхронизировать Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑутÑтвует.</p></div>
</div>
<div class="sect3">
<h4 id="_загрузка_координат_погружений_в_журнал_em_subsurface_em">5.3.6. Загрузка координат погружений в журнал <em>Subsurface</em></h4>
+<<<<<<< HEAD +<div class="paragraph"><p>Перед получением GPS-кородинат Ñ Ñервера, Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть загружены в
+======= <div class="paragraph"><p>Перед получением GPS-координат Ñ Ñервера, Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть загружены в
+>>>>>>> v4.4-branch журнал из дайв-компьютера или введены вручную. Ð”Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ координат выберите
в главном меню <em>Импорт → Импорт координат</em> или нажмите комбинацию клавиш
Ctrl-G. Вам будет предÑтавлено окно, как показано на риÑунке <strong>Ð</strong> ниже. При
@@ -2125,6 +2241,15 @@ Ctrl-G. Вам будет предÑтавлено окно, как показа будьте внимательны, кожа щелкаете мышкой на картинке. При нажатии мышкой на
миниатюрное фото (в профиле или на вкладке _Фотографии), полноразмернаÑ
Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð¾Ñ‚ÐºÑ€Ð¾ÐµÑ‚ÑÑ Ð²Ð¾ внешней программе Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра изображений:</p></div>
+<<<<<<< HEAD +<div class="paragraph"><p>image::ima
+ges/LoadImage6_f20.jpg["РиÑунок: ПроÑмотр полноразмерных фотографий",align="center"]</p></div>
+</div>
+<div class="sect3">
+<h4 id="_вкладка_em_фотографии_em">5.4.3. Вкладка <em>Фотографии</em></h4>
+<div class="paragraph"><p>Фотографии, добавленные к погружению, отображаютÑÑ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÐ½Ñ‹Ð¼Ð¸ картинками на
+вкладке <em>Фотографии</em> в <em>Информационной ппнели</em>. Снимки, Ñделанные в Ñерии и
+======= <div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/LoadImage6_f20.jpg" alt="РиÑунок: ПроÑмотр полноразмерных фотографий" />
@@ -2135,6 +2260,7 @@ Ctrl-G. Вам будет предÑтавлено окно, как показа <h4 id="_вкладка_em_фотографии_em">5.4.3. Вкладка <em>Фотографии</em></h4>
<div class="paragraph"><p>Фотографии, добавленные к погружению, отображаютÑÑ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð½Ñ‹Ð¼Ð¸ картинками на
вкладке <em>Фотографии</em> в <em>Информационной панели</em>. Снимки, Ñделанные в Ñерии и
+>>>>>>> v4.4-branch имеющие короткий временной интервал, могут перекрывать друг друга на профиле,
но легко различимы на Ñтой вкладке. Одиночный щелчок мышью на фотографии
выделÑет ее, двойной щелчок мышью открывает окно проÑмотра фото во внешней
@@ -2143,9 +2269,15 @@ Ctrl-G. Вам будет предÑтавлено окно, как показа </div>
<div class="sect3">
<h4 id="_фотографии_на_внешнем_жеÑтком_диÑке">5.4.4. Фотографии на внешнем жеÑтком диÑке</h4>
+<<<<<<< HEAD +<div class="paragraph"><p>Многие фотографы хранÑÑ‚ Ñвои Ñнимки на внешнем накопителе. ЕÑли внещний диÑк
+подключен, то <em>Subsurface</em> в большинÑтве Ñлучаев увидит его, и таким образом
+будет обеÑпечен доÑтуп к внешнему хранилищу фотографий. При Ñтом вы добавлете
+======= <div class="paragraph"><p>Многие фотографы хранÑÑ‚ Ñвои Ñнимки на внешнем накопителе. ЕÑли внешний диÑк
подключен, то <em>Subsurface</em> в большинÑтве Ñлучаев увидит его, и таким образом
будет обеÑпечен доÑтуп к внешнему хранилищу фотографий. При Ñтом вы добавлÑете
+>>>>>>> v4.4-branch фото Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ диÑка так, как опиÑан выше. Однако поÑле того, как внешний
накопитель отключен, у <em>Subsurface</em> не будет доÑтупа к фотографиÑм. ЕÑли на
панели кнопок-переключателей (Ñлева от профилÑ) нажата кнопка <em>Миниатюры
@@ -2157,6 +2289,11 @@ Ctrl-G. Вам будет предÑтавлено окно, как показа <div class="sect2">
<h3 id="_ведение_журнала_длÑ_Ñпециальных_типов_погружений">5.5. Ведение журнала Ð´Ð»Ñ Ñпециальных типов погружений</h3>
<div class="sect3">
+<<<<<<< HEAD +<h4 id="_погружениÑ_в_конфигурации_side_mount">5.5.1. ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð² конфигурации side-mount</h4>
+<div class="paragraph"><p><em>Subsurface</em> легко ÑправлÑетÑÑ Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð±Ð°Ð»Ð»Ð¾Ð½Ð½Ñ‹Ð¼Ð¸ погружениÑми. Ведение журнала Ñайд-маунт
+погружение заключаетÑÑ Ð² трех шагах:</p></div>
+======= <h4 id="S_MulticylinderDives">5.5.1. ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ð½ÐµÑколькими баллонами</h4>
<div class="paragraph"><p><em>Subsurface</em> позволÑет без проблем веÑти учет многобаллонных погружений. Такие Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾
выполнÑÑŽÑ‚ÑÑ ÐµÑли (а) не хватает воздуха Ð´Ð»Ñ ÑÐ¾Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° одном баллоне; (б) нужно более
@@ -2204,6 +2341,7 @@ Ctrl-G. Вам будет предÑтавлено окно, как показа Ð¥Ð¾Ñ‚Ñ Ñта ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ популÑра Ñреди пещерных дайвером, она может иÑпользоватьÑÑ Ð¸ длÑ
рекреационных погружений поÑле ÑоответÑтвующей подготовки. Как и в Ñлучае многобаллонных погружений,
Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð° таких погружений необходимо выполнить три шага:</p></div>
+>>>>>>> v4.4-branch <div class="ulist"><ul>
<li>
<p>
@@ -2246,6 +2384,9 @@ Ctrl-G. Вам будет предÑтавлено окно, как показа <div class="paragraph"><p>Ðта глава демонÑтрирует гибкоÑÑ‚ÑŒ <em>Subsurface</em> при ведении журналов погружений.</p></div>
</div>
<div class="sect3">
+<<<<<<< HEAD +<h4 id="S_CCR_dives">5.5.2. ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ñ€ÐµÐ±Ñ€Ð¸Ð·ÐµÑ€Ð¾Ð¼ закрытого цикла (CCR)</h4>
+======= <h4 id="S_sSCR_dives">5.5.3. ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ñ€ÐµÐ±Ñ€Ð¸Ð·ÐµÑ€Ð¾Ð¼ полузамкнутого цикла (SCR)</h4>
<div class="admonitionblock">
<table><tr>
@@ -2287,13 +2428,18 @@ Ctrl-G. Вам будет предÑтавлено окно, как показа </div>
<div class="sect3">
<h4 id="S_CCR_dives">5.5.4. ÐŸÐ¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ñ€ÐµÐ±Ñ€Ð¸Ð·ÐµÑ€Ð¾Ð¼ закрытого цикла (CCR)</h4>
+>>>>>>> v4.4-branch <div class="admonitionblock">
<table><tr>
<td class="icon">
<img src="images/APD.jpg" alt="Замечание" />
</td>
<td class="content">Ребризеры замкнутого цикла иÑпользуют передовые технологии Ð´Ð»Ñ Ñ€ÐµÑ†Ð¸Ñ€ÐºÑƒÐ»Ñции отработанного газа,
+<<<<<<< HEAD +выполнÑÑ Ð´Ð²Ðµ фукнции Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ñ†Ð¸Ð¸ киÑлорода, Ð´ÐµÐ»Ð°Ñ ÑмеÑÑ‚ пригодной Ð´Ð»Ñ Ð´Ñ‹Ñ…Ð°Ð½Ð¸Ñ:
+======= выполнÑÑ Ð´Ð²Ðµ функции Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ñ†Ð¸Ð¸ киÑлорода, Ð´ÐµÐ»Ð°Ñ ÑмеÑÑ‚ пригодной Ð´Ð»Ñ Ð´Ñ‹Ñ…Ð°Ð½Ð¸Ñ:
+>>>>>>> v4.4-branch а) удаление углекиÑлого газа из выдыхаемого воздуха
б) поддержание концентрации киÑлорода в безопаÑных пределах.
Ðа текущий момент <em>Subsurface</em> обеÑпечивает наилучшую поддержку CCR дайв-компьютера Poseidon
@@ -2317,17 +2463,30 @@ CCR не позволÑÑŽÑ‚ загружать журналы неÑкольки </div>
</div>
<div class="sect3">
+<<<<<<< HEAD +<h4 id="_информациÑ_отображаемаÑ_длÑ_ccr_погружений">5.5.3. ИнформациÑ, Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÐ¼Ð°Ñ Ð´Ð»Ñ CCR-погружений</h4>
+<div class="paragraph"><p><em>Парциальные Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð°Ð·Ð¾Ð²</em>: График парциального Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¸Ñлорода показывает информацию Ñ
+киÑлородных датчиков ребризера. Ð’ отличие от рекреационного режима, где Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ pO<sub>2</sub> выÑчитываютÑÑ
+иÑÑ…Ð¾Ð´Ñ Ð¸Ð· ÑоÑтава ÑмеÑи и глубины, Ð´Ð»Ñ CCR-погружений Ñти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÐµÑ€ÑƒÑ‚ÑÑ Ð¾Ñ‚ датчиков. Ð’ Ñтом Ñлучае
+график должнен быть доÑтаточно ровным, ÑоответÑтвую значению уÑтановки (set-point). Среднее значение
+pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением, рапортуемым датчиком, а раÑчитано <em>Subsurface</em> Ñледующим
+======= <h4 id="_информациÑ_отображаемаÑ_длÑ_ccr_погружений">5.5.5. ИнформациÑ, Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÐ¼Ð°Ñ Ð´Ð»Ñ CCR-погружений</h4>
<div class="paragraph"><p><em>Парциальные Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð°Ð·Ð¾Ð²</em>: График парциального Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¸Ñлорода показывает информацию Ñ
киÑлородных датчиков ребризера. Ð’ отличие от рекреационного режима, где Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ pO<sub>2</sub> выÑчитываютÑÑ
иÑÑ…Ð¾Ð´Ñ Ð¸Ð· ÑоÑтава ÑмеÑи и глубины, Ð´Ð»Ñ CCR-погружений Ñти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÐµÑ€ÑƒÑ‚ÑÑ Ð¾Ñ‚ датчиков. Ð’ Ñтом Ñлучае
график должен быть доÑтаточно ровным, ÑоответÑÑ‚Ð²ÑƒÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑŽ уÑтановки киÑлорода (set-point). Среднее значение
pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением от датчика, а раÑÑчитано <em>Subsurface</em> Ñледующим
+>>>>>>> v4.4-branch образом:</p></div>
<div class="ulist"><ul>
<li>
<p>
+<<<<<<< HEAD +Ð´Ð»Ñ Ð´Ð²ÑƒÑ… датчиков O<sub>2</sub> раÑчитываетÑÑ Ñреднее значение.
+======= Ð´Ð»Ñ Ð´Ð²ÑƒÑ… датчиков O<sub>2</sub> раÑÑчитываетÑÑ Ñреднее значение.
+>>>>>>> v4.4-branch </p>
</li>
<li>
@@ -2343,7 +2502,11 @@ pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением от да </p>
</li>
</ul></div>
+<<<<<<< HEAD +<div class="paragraph"><p>Среднее значание pO<sub>2</sub> ÑенÑоров отображаетÑÑ Ð·ÐµÐ»ÐµÐ½Ð¾Ð¹ линией.</p></div>
+======= <div class="paragraph"><p>Среднее значение pO<sub>2</sub> ÑенÑоров отображаетÑÑ Ð·ÐµÐ»ÐµÐ½Ð¾Ð¹ линией.</p></div>
+>>>>>>> v4.4-branch <div class="paragraph"><p>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑƒÑтановок киÑлорода, а также Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ… датчиков, могут быть показаны на
профиле. Отображение раÑширенной информации Ð´Ð»Ñ CCR-Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€ÑƒÐµÑ‚ÑÑ Ð² <em>ÐаÑтройках_ (доÑтупны
в <a href="#S_CCR_options">_Файл → ÐаÑтройки → Профиль</em></a>. Вот наÑтройки, влиÑющие на отображение pO<sub>2</sub>
@@ -2380,7 +2543,11 @@ pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением от да </p>
</li>
</ul></div>
+<<<<<<< HEAD +<div class="paragraph"><p>Среднее значение pO<sub>2</sub> показваетÑÑ Ð·ÐµÐ»ÐµÐ½Ñ‹Ð¼ цветом. Такое отображение позволÑет непоÑредÑтвенно
+======= <div class="paragraph"><p>Среднее значение pO<sub>2</sub> показываетÑÑ Ð·ÐµÐ»ÐµÐ½Ñ‹Ð¼ цветом. Такое отображение позволÑет непоÑредÑтвенно
+>>>>>>> v4.4-branch Ñравнить данные от каждого ÑенÑора и выÑвить Ñтранно низкие или абÑолютно неверные показаниÑ.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
@@ -2391,6 +2558,15 @@ pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением от да галочки напротив обоих параметров. Парциальные Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð·Ð¾Ñ‚Ð° (и гелиÑ, еÑли применимо) отображаютÑÑ
так же, как Ð´Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° открытом цикле.</p></div>
<div class="paragraph"><p><em>СобытиÑ</em>: в Ñлучае погружений Ñ Ñ€ÐµÐ±Ñ€Ð¸Ð·ÐµÑ€Ð¾Ð¼ могут быть запиÑаны дополнительные ÑобытиÑ, например,
+<<<<<<< HEAD +перевод загубника в режим открытого цикла. Такие ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ÑÑ Ð½Ð° профиле в виде жетых
+треуголников. При наведении на него ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¼Ñ‹ÑˆÐ¸, в <a href="#S_InfoBox">плавающем информационном окне</a>
+показываетÑÑ Ð¾Ð¿Ð¸Ñание ÑобытиÑ.</p></div>
+<div class="paragraph"><p><em>Давление в баллонах_: некоторые CCR дайв-компьютеры (например, Poseidon MkVI) ÑохранÑÑŽÑ‚ информацию
+о давлении в баллонах Ñ ÐºÐ¸Ñлородом и дилуентом. График давлений в Ñтих баллонах отображаетÑÑ
+зелеными линиÑми поверх Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ñ‹. Ð’ дополнение к Ñтому, Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ начальном и конечном
+давлениÑÑ… в баллонах Ñ Ð´Ð¸Ð»ÑƒÐµÐ½Ñ‚Ð¾Ð¼ и киÑлородом показываетÑÑ Ð½Ð° вкладке _СнарÑжение</em>.
+======= перевод загубника в режим открытого цикла. Такие ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ÑÑ Ð½Ð° профиле в виде желтых
треугольников. При наведении на него ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¼Ñ‹ÑˆÐ¸, в <a href="#S_InfoBox">плавающем информационном окне</a>
показываетÑÑ Ð¾Ð¿Ð¸Ñание ÑобытиÑ.</p></div>
@@ -2398,6 +2574,7 @@ pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением от да о давлении в баллонах Ñ ÐºÐ¸Ñлородом и дилуентом. График давлений в Ñтих баллонах отображаетÑÑ
зелеными линиÑми поверх Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ñ‹. Ð’ дополнение к Ñтому, Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ начальном и конечном
давлениÑÑ… в баллонах Ñ Ð´Ð¸Ð»ÑƒÐµÐ½Ñ‚Ð¾Ð¼ и киÑлородом показываетÑÑ Ð½Ð° вкладке <em>СнарÑжение</em>.
+>>>>>>> v4.4-branch Ðиже предÑтавлен профиль CCR-погружениÑ, на котором показаны графики значений уÑтановки, ÑенÑоров и
давлений в баллонах. Ð’ Ñтом Ñлучае мы видим ÑоглаÑованноÑÑ‚ÑŒ показаний двух ÑенÑоров.</p></div>
<div class="imageblock" style="text-align:center;">
@@ -2408,7 +2585,11 @@ pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением от да <div class="paragraph"><p><em>Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ</em>: ИнформациÑ, ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸Ñ‡Ð½Ð°Ñ Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð³Ð¾ оборудованиÑ, отображаетÑÑ Ð²
<em>Subsurface</em> на вкладке <a href="#S_ExtraDataTab">Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ</a>. Она может включать наÑтройки
Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ прочие данные.</p></div>
+<<<<<<< HEAD +<div class="paragraph"><p>За более детальной информацией по загружке погружений из ребризеров Poseidon MkVI и APD обратитеÑÑŒ
+======= <div class="paragraph"><p>За более детальной информацией по загрузке погружений из ребризеров Poseidon MkVI и APD обратитеÑÑŒ
+>>>>>>> v4.4-branch к <a href="#S_PoseidonMkVI">ПРИЛОЖЕÐИЮ Б</a>.</p></div>
</div>
</div>
@@ -2438,10 +2619,17 @@ pO<sub>2</sub> не ÑвлÑетÑÑ Ñредним значением от да </div>
<div class="sect2">
<h3 id="S_ExtraDataTab">6.2. Вкладка <strong>Дополнительно</strong> (обычно Ð´Ð»Ñ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ погружениÑ)</h3>
+<<<<<<< HEAD +<div class="paragraph"><p>При иÑпользовании дайв-компьютера он обычно Ñообщает дополнительную информацию, которуб невозможно
+отобразить единообразным образом, Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ Ð²Ð¾ внимание, что Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð´Ð»Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ…
+моделей. Обычно Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ в ÑÐµÐ±Ñ Ð½Ð°Ñтройки компьютера, уровень зарÑда батареи,
+беÑполетное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ уÑтановки градиент-фактора. Когда доÑтупны, Ñти данные отображаютÑÑ Ð½Ð° вкладке
+======= <div class="paragraph"><p>При иÑпользовании дайв-компьютера он обычно Ñообщает дополнительную информацию, которую невозможно
отобразить единообразным образом, Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ Ð²Ð¾ внимание, что Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð´Ð»Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ…
моделей. Обычно Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ в ÑÐµÐ±Ñ Ð½Ð°Ñтройки компьютера, уровень зарÑда батареи,
неполетное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ уÑтановки градиент-фактора. Когда доÑтупны, Ñти данные отображаютÑÑ Ð½Ð° вкладке
+>>>>>>> v4.4-branch <strong>Дополнительно</strong>. Ðа риÑунке ниже приведены дополнительные данные Ð´Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ðµ на ребризере Poseidon.</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
@@ -2681,8 +2869,13 @@ cellspacing="0" cellpadding="4"> <img src="images/icons/ShowCylindersButton.jpg" alt="Замечание" />
</td>
<td class="content">ЕÑли выбран Ñтот переключатель, то баллоны, иÑпользуемые в погружении, отображаютÑÑ Ð² виде цветной
+<<<<<<< HEAD +полоÑÑ‹ в нижней чаÑти Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ. Кодировка цветов ÑледующаÑ: киÑлород отриÑовываетÑÑ
+зеленой полоÑой, азот желтой, а гелий - краÑной. РиÑунк ниже предÑтавлÑÑ‚ профиль Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ð¿ÐµÑ€Ð²Ð¾Ð¹
+======= полоÑÑ‹ в нижней чаÑти Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ. Кодировка цветов ÑледующаÑ: киÑлород нариÑован
зеленой полоÑой, азот желтой, а гелий - краÑной. РиÑунок ниже предÑтавлÑет профиль Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ð¿ÐµÑ€Ð²Ð¾Ð¹
+>>>>>>> v4.4-branch ÑмеÑью Trimix (краÑно-Ð·ÐµÐ»ÐµÐ½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа), Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ð¼ переходом на Nitrox (желто-Ð·ÐµÐ»ÐµÐ½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа) на 23
минуте. Баллоны Ñ Ð²Ð¾Ð·Ð´ÑƒÑ…Ð¾Ð¼ предÑтавлены Ñветло-голубой полоÑой.</td>
</tr></table>
@@ -2700,12 +2893,21 @@ cellspacing="0" cellpadding="4"> <td class="content">Показывает давление инертных газов в тканÑÑ… отноÑительно внешнего Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (Ð³Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÑераÑ
линиÑ). Давление в тканÑÑ… раÑÑчитываетÑÑ Ð¿Ð¾ алгоритму Бюльмана ZH-L16 и отображаетÑÑ Ð»Ð¸Ð½Ð¸Ñми, цвет
которых варьируетÑÑ Ð¾Ñ‚ зеленого (Ñамые быÑтрые ткани) до Ñинего (Ñамые медленные ткани).
+<<<<<<< HEAD +Ð§ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ, отриÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²Ñ‹ÑˆÐµ графика внешнего давлениÑ, показывает макÑимальное допуÑтимое
+перенаÑыщение ÑоглаÑно значений градиент-фактора, указанных в <strong>ÐаÑтройках*. Ð”Ð»Ñ Ð´Ð°Ð¹Ð²ÐµÑ€Ð¾Ð², планирующих
+декомпреÑÑионные погружениÑ, Ñффективное ÑкороÑÑ‚ÑŒ раÑÑÑ‹Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð¾ÑтигаетÑÑ Ð¿Ñ€Ð¸ давлении в тканÑÑ…
+большем чем окружаещее давление (ÑÐµÑ€Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ), но меньшем чем предельное (Ñ‡ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ). Ðто
+предÑтавление отображает давление в тканÑÑ… на протÑжении вÑего погружениÑ. Ðапротив,
+<a href="#S_gas_pressure_graph">ГиÑтограмма Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð°Ð·Ð¾Ð²</a> в плавающем *Информационном окне</strong> отображает
+======= Ð§ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ, нариÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²Ñ‹ÑˆÐµ графика внешнего давлениÑ, показывает макÑимальное допуÑтимое
перенаÑыщение ÑоглаÑно значений градиент-фактора, указанных в наÑтройках. Ð”Ð»Ñ Ð´Ð°Ð¹Ð²ÐµÑ€Ð¾Ð², планирующих
декомпреÑÑионные погружениÑ, Ñффективное ÑкороÑÑ‚ÑŒ раÑÑ‹Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð¾ÑтигаетÑÑ Ð¿Ñ€Ð¸ давлении в тканÑÑ…
большем чем окружающее давление (ÑÐµÑ€Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ), но меньшем чем предельное (Ñ‡ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ). Ðто
предÑтавление отображает давление в тканÑÑ… на протÑжении вÑего погружениÑ. Ðапротив,
<a href="#S_gas_pressure_graph">ГиÑтограмма Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð°Ð·Ð¾Ð²</a> в плавающем <strong>Информационном окне</strong> отображает
+>>>>>>> v4.4-branch давление в момент времени, ÑоответÑтвующий положению ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¼Ñ‹ÑˆÐ¸ на оÑи времени.</td>
</tr></table>
</div>
@@ -2838,7 +3040,11 @@ CCR-погружений в дополнение к тем, что были им <div class="paragraph"><p>Ðа риÑунке <strong>Ð’</strong> выше показано информационное окно практичеÑки Ñо вÑей доÑтупной информацией.</p></div>
<div class="sect3">
<h4 id="S_gas_pressure_graph">6.6.1. ГиÑтограмма Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð°Ð·Ð¾Ð²</h4>
+<<<<<<< HEAD +<div class="paragraph"><p>Ð’ левой чаÑти <strong>Информационного окна</strong> раÑположена Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð³Ð¸Ñтрограмма, Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‰Ð°Ñ Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ
+======= <div class="paragraph"><p>Ð’ левой чаÑти <strong>Информационного окна</strong> раÑположена Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð³Ð¸Ñтограмма, Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‰Ð°Ñ Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ
+>>>>>>> v4.4-branch азота (и других инертных газов, например гелиÑ, там, где Ñто применимо), вдыхаемых дайвером <em>в
определенный момент времени</em>, ÑоответÑтвующий положению ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¼Ñ‹ÑˆÐ¸ на оÑи времени. РиÑунок ниже
поÑÑнÑет, что именно показывает гиÑтограмма:</p></div>
@@ -2880,7 +3086,11 @@ CCR-погружений в дополнение к тем, что были им <li>
<p>
ÐижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° краÑной облаÑти на гиÑтограмме отображает вычиÑленное по алгоритму Бюльмана
+<<<<<<< HEAD + M-значение, - давление инертного газа, при котором веÑьма вероÑтно формирование пузырикьков,
+======= M-значение, - давление инертного газа, при котором веÑьма вероÑтно формирование пузырьков,
+>>>>>>> v4.4-branch что в Ñвою очередь может привеÑти к декомпреÑÑионной болезни.
</p>
</li>
@@ -3080,9 +3290,15 @@ CCR-погружений в дополнение к тем, что были им <div class="paragraph"><p>Ð’Ñ‹ можете отфильтровать Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð² ÑпиÑке, указав те или иные атрибуты дайва (метки, напарник,
меÑто погружениÑ, коÑтюм). Ðапример, можно выбрать вÑе глубокие Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð² определенном меÑте,
либо пещерные дайвы Ñ Ð²Ð°ÑˆÐ¸Ð¼ другом.</p></div>
+<<<<<<< HEAD +<div class="paragraph"><p>Чтобы вызвать фильтр, выберите в главном меню <em>Журнал → Фильтр погружений</em>. Вам будет преÑтавлена
+<em>Панель фильтров</em>, раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð² верхней чаÑти окна <em>Subsurface</em>. Ð’ правой чаÑти Ñтой панели
+находÑÑ‚ÑÑ Ñ‚Ñ€Ð¸ кнопки, которые позволÑÑŽÑ‚ очиÑтить фильтры, ÑпрÑтать панель или вовÑе закрыть её (при
+======= <div class="paragraph"><p>Чтобы вызвать фильтр, выберите в главном меню <em>Журнал → Фильтр погружений</em>. Вам будет преlÑтавлена
<em>Панель фильтров</em>, раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð² верхней чаÑти окна <em>Subsurface</em>. Ð’ правой чаÑти Ñтой панели
находÑÑ‚ÑÑ Ñ‚Ñ€Ð¸ кнопки, которые позволÑÑŽÑ‚ очиÑтить фильтры, ÑпрÑтать панель или вовÑе закрыть ее (при
+>>>>>>> v4.4-branch Ñто фильтры очищаютÑÑ).</p></div>
<div class="imageblock" style="text-align:center;">
<div class="content">
@@ -3119,10 +3335,17 @@ CCR-погружений в дополнение к тем, что были им <h3 id="S_facebook">8.1. ÐкÑпорт информации о погружении в <em>Facebook</em></h3>
<div class="paragraph"><p>ÐкÑпорт в <em>Facebook</em> отличаетÑÑ Ð¾Ñ‚ вÑех других видов ÑкÑпорта, поÑкольку он требует подключениÑ
учетной запиÑи, что в Ñвою очередь требует от Ð²Ð°Ñ Ð»Ð¾Ð³Ð¸Ð½ и пароль <em>Facebook</em>. Ð”Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸
+<<<<<<< HEAD +необхоимо в главном меню выбрать <em>Файл → ÐаÑтройки</em> и там выбрать вкладку <em>Facebook</em>, на которой
+вам будет предÑтавлена форма авторизации (Ñм. риÑунок <strong>Ð</strong> Ñлева внизу). ÐвторизуйтеÑÑŒ Ñвоими логином
+и паролем, поÑле чего Ñкран должен выглÑдеть как показано на риÑунке <strong>Ð’</strong>. При необходимоÑти вы
+можете отключить <em>Subsurface</em> от <em>Facebook</em>, нажав на ÑоответÑтвующу кнопку.</p></div>
+======= необходимо в главном меню выбрать <em>Файл → ÐаÑтройки</em> и там выбрать вкладку <em>Facebook</em>, на которой
вам будет предÑтавлена форма авторизации (Ñм. риÑунок <strong>Ð</strong> Ñлева внизу). ÐвторизуйтеÑÑŒ Ñвоими логином
и паролем, поÑле чего Ñкран должен выглÑдеть как показано на риÑунке <strong>Ð’</strong>. При необходимоÑти вы
можете отключить <em>Subsurface</em> от <em>Facebook</em>, нажав на ÑоответÑтвующую кнопку.</p></div>
+>>>>>>> v4.4-branch <div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/facebook1_f20.jpg" alt="РиÑунок: ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Facebook" />
@@ -3131,7 +3354,11 @@ CCR-погружений в дополнение к тем, что были им <div class="paragraph"><p>ПоÑле того как Ñоединение Ñ <em>Facebook</em> уÑтановлено, Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð² вашей Хронике не
ÑоÑтавит проблем. Выберите погружение в ÑпиÑке и убедитеÑÑŒ в том, что именно Ñтот дайв должен быть
опубликован. Ðажмите кнопку Ñ Ð»Ð¾Ð³Ð¾Ñ‚Ð¸Ð¿Ð¾Ð¼ <em>Facebook</em>, раÑположенную в <strong>Информационной панели</strong> Ñправа
+<<<<<<< HEAD +от Ð¿Ð¾Ð»Ñ <em>ПрмечаниÑ</em> (Ñм. риÑунок <strong>Ð</strong> ниже). По нажатию на Ñту кнопку вам будет предÑтавлено окно, в
+======= от Ð¿Ð¾Ð»Ñ <em>ПримечаниÑ</em> (Ñм. риÑунок <strong>Ð</strong> ниже). По нажатию на Ñту кнопку вам будет предÑтавлено окно, в
+>>>>>>> v4.4-branch котором вы можете выбрать какую дополнительную информацию опубликовать вмеÑте Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»ÐµÐ¼ погружениÑ
(риÑунок <strong>Ð’</strong>). ОбÑзательным ÑвлÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ поле <em>Ðльбом</em>. Кроме ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñтандартных параметров
погружениÑ, вы можете вручную отредактировать Ñопроводительный текÑÑ‚. Ð”Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ профилÑ
@@ -3228,7 +3455,11 @@ HTML (Ñм. риÑунок <strong>Ð’</strong> выше). Ð’Ñ‹ можете вы <li>
<p>
<em>Глубины фото</em>. Создает текÑтовый файл, в котором ÑодержатÑÑ Ð¸Ð¼ÐµÐ½Ð° файлов вÑех фотографий,
+<<<<<<< HEAD +прикрепленных к погружениÑм вмеÑте Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ глубины, на котороый Ñти фотографии были Ñделаны.
+======= прикрепленных к погружениÑм вмеÑте Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ глубины, на которой Ñти фотографии были Ñделаны.
+>>>>>>> v4.4-branch </p>
</li>
<li>
@@ -3396,7 +3627,11 @@ Print</em>. Вам будет предÑтавлено диалоговое ок D3, Vyper, Vytec, Cobra, Gekko И Zoop). МножеÑтво параметров компьютера может быть Ñчитано и изменено.
Первым шагом вы должны убедитьÑÑ Ñ‡Ñ‚Ð¾ уÑтановлены вÑе необходимые драйверы Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ что вам извеÑтно
Ð¸Ð¼Ñ ÑƒÑтройÑтва. Внимательно ознакомьтеÑÑŒ Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ в <a href="#APPENDIX_A">ПРИЛОЖЕÐИИ Ð</a>.</p></div>
+<<<<<<< HEAD +<div class="paragraph"><p>ПоÑле того, как дайв-компьютер подключен, выберите <em>Файл → ÐаÑтройка дайв-компьютера</em> в главом меню.
+======= <div class="paragraph"><p>ПоÑле того, как дайв-компьютер подключен, выберите <em>Файл → ÐаÑтройка дайв-компьютера</em> в главном меню.
+>>>>>>> v4.4-branch Укажите Ð¸Ð¼Ñ ÑƒÑтройÑтва в текÑтовом поле в верхней чаÑти окна, и выберите ÑоответÑтвующую модель
дайв-компьютера в ÑпиÑке Ñлева (Ñм. риÑунок ниже).</p></div>
<div class="imageblock" style="text-align:center;">
@@ -3754,6 +3989,7 @@ ZH-L16 Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ градиент-факторов за авто </div>
<div class="sect2">
<h3 id="_пример_планированиÑ_погружениÑ_на_открытом_цикле">13.2. Пример Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° открытом цикле</h3>
+<<<<<<< HEAD <div class="ulist"><ul>
<li>
<p>
@@ -3768,10 +4004,29 @@ ZH-L16 Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ градиент-факторов за авто <li>
<p>
Ребризер замкнутого цикла (CCR)
+======= +<div class="ulist"><ul>
+<li>
+<p>
+Ð’ левой нижней чаÑти Ñкрана планировщика раÑположен выпадающий ÑпиÑок (на риÑунке ниже обведен Ñиней линией), предоÑтавлÑющий варианта типа погружениÑ:
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Открытый цикл (по умолчанию)
+>>>>>>> v4.4-branch </p>
</li>
<li>
<p>
+<<<<<<< HEAD +======= +Ребризер замкнутого цикла (CCR)
+</p>
+</li>
+<li>
+<p>
+>>>>>>> v4.4-branch ПаÑÑивный ребризер полузамкнутого цикла (pSCR)
</p>
</li>
@@ -3829,7 +4084,11 @@ GFHigh берутÑÑ Ð¸Ð· наÑтроек <em>Subsurface</em>, однако, Ð </p>
</li>
</ul></div>
+<<<<<<< HEAD +<div class="paragraph"><p>СкороÑÑ‚ÑŒ вÑÐ¿Ð»Ñ‹Ñ‚Ð¸Ñ Ð²Ð°Ð¶Ð½Ð° в фазе раÑÑÑ‹Ñ‰ÐµÐ½Ð¸Ñ Ð² конце дайва и указываетÑÑ Ð´Ð»Ñ
+======= <div class="paragraph"><p>СкороÑÑ‚ÑŒ вÑÐ¿Ð»Ñ‹Ñ‚Ð¸Ñ Ð²Ð°Ð¶Ð½Ð° в фазе раÑÑ‹Ñ‰ÐµÐ½Ð¸Ñ Ð² конце дайва и указываетÑÑ Ð´Ð»Ñ
+>>>>>>> v4.4-branch неÑкольких диапазонов глубины, Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ Ð²Ð¾ внимание Ñреднюю глубину как точку
отÑчета. СреднÑÑ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° отображаетÑÑ Ð½Ð° профиле краÑной горизонтальной линией.
СкороÑÑ‚ÑŒ вÑÐ¿Ð»Ñ‹Ñ‚Ð¸Ñ Ð½Ð° больших глубинах находитÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ в пределах 8-12 м/мин,
@@ -3887,8 +4146,13 @@ SAC отдельно Ð´Ð»Ñ Ð´Ð¾Ð½Ð½Ð¾Ð¹ фазы (<em>SAC на дне</em>) и <div class="paragraph"><p>Ðенулевое значение в колонке "УÑтановка СС" в таблице путевых точек означает корректное значение
уÑтановки и что погружение на Ñтом Ñегменте выполнÑетÑÑ Ð½Ð° CCR-ребризере. ЕÑли поÑледний вручную
введенный Ñегмент выполнÑетÑÑ Ð½Ð° CCR, декомпреÑÑионные процедуры раÑÑчитываютÑÑ ÑоглаÑно значениÑ
+<<<<<<< HEAD +указанной уÑтавновки. ЕÑли же поÑледний Ñегмент выполнÑетÑÑ Ð½Ð° открытом цикле (значение уÑтновки
+равно нулю), декомпреÑÑионные обÑзательÑтва раÑÑчитаваютÑÑ Ð² режиме ОЦ. Замена газов предуÑмотрена
+======= указанной уÑтановки. ЕÑли же поÑледний Ñегмент выполнÑетÑÑ Ð½Ð° открытом цикле (значение уÑтновки киÑлорода
равно нулю), декомпреÑÑионные обÑзательÑтва раÑÑчитываютÑÑ Ð² режиме ОЦ. Замена газов предуÑмотрена
+>>>>>>> v4.4-branch только Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¾Ð³Ð¾ цикла.</p></div>
<div class="paragraph"><p>Ðиже на риÑунке приведен пример плана Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° 45м Ñ Ð¸Ñпользованием EAN26
и вÑплытием на EAN50, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð½Ð°Ñтройки, опиÑанные выше:</p></div>
@@ -3899,7 +4163,13 @@ SAC отдельно Ð´Ð»Ñ Ð´Ð¾Ð½Ð½Ð¾Ð¹ фазы (<em>SAC на дне</em>) и </div>
<div class="paragraph"><p>ПоÑле Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ðµ, вы можете Ñохранить план, нажав на кнопку
<em>Сохранить</em>. План поÑвитÑÑ Ð² ÑпиÑке погружений.</p></div>
+<<<<<<< HEAD +</div>
+<div class="sect2">
+<h3 id="_детальный_план_погружениÑ">13.3. Детальный план погружениÑ</h3>
+======= <div class="paragraph"><p><strong>Детальный план погружениÑ</strong></p></div>
+>>>>>>> v4.4-branch <div class="paragraph"><p>Ð’ правой нижней чаÑти Ñкрана планировщика находитÑÑ Ñ‚ÐµÐºÑÑ‚Ð¾Ð²Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ Ñ
подробным ÑловеÑным опиÑанием плана погружениÑ. Ð’Ñ‹ можете изменить его
детализацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ неÑкольких параметров в Ñекции <em>Заметки погружениÑ</em>.
@@ -3912,6 +4182,22 @@ SAC отдельно Ð´Ð»Ñ Ð´Ð¾Ð½Ð½Ð¾Ð¹ фазы (<em>SAC на дне</em>) и деко</em>, то Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð¾Ð¼ показываетÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ от времени Ñегментов.</p></div>
</div>
<div class="sect2">
+<<<<<<< HEAD +<h3 id="_планирование_погружений_на_ребризере_замкнутого_цикла">13.4. Планирование погружений на ребризере замкнутого цикла</h3>
+<div class="paragraph"><p>Ð”Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… погружений выберите CCR в ÑпиÑке, как показано на риÑунке выше (ÑпиÑок
+обведен Ñиней линией).</p></div>
+<div class="paragraph"><p><strong>ДоÑтупные ÑмеÑи</strong>: добавьте в таблицу доÑтупных ÑмеÑей информацию о баллонах дилуÑнта и аварийных
+газах. ÐЕ вводите информацию о киÑлородном баллоне, поÑкольку он подразумеватÑÑ Ð¿Ñ€Ð¸ иÑпользовании
+режима CCR.</p></div>
+<div class="paragraph"><p><strong>Ввод уÑтановок</strong>: укажите значение уÑтановки по умолчанию в *ÐаÑтройках* Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (в главном меню
+выберите <em>Файл → ÐаÑтройки</em> и вкладку <em>Профиль</em>). По умолчанию Ð´Ð»Ñ Ð²Ñех дабавлÑемых Ñегментов
+точка уÑтановки беретÑÑ Ð¸Ð· наÑтроек, он вы можете поменÑÑ‚ÑŒ их по Ñвоему желанию. Значение равное
+нулю означает, что дайвер перешел на открытый цикл. ДекомпреÑÑÐ¸Ñ Ð²Ñегда раÑÑчитываетÑÑ Ð¸ÑпользуÑ
+поÑледнюю уÑтановку вручную добавленного Ñегмента. Чтобы запланировать переход на ОЦ во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´ÑŠÐµÐ¼Ð°,
+добавьте одноминутный Ñегмент Ñо значением уÑтановки равным нулю. ДекомрпеÑÑионный алгоритм
+автоматичеÑки не менÑет ÑмеÑи Ð´Ð»Ñ CCR-погружений (Ñ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ уÑтановкой).</p></div>
+<div class="paragraph"><p>Профиль Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° ребризере замкнутого типа модет выглÑдеть так:</p></div>
+======= <h3 id="_планирование_погружений_на_ребризере_замкнутого_цикла">13.3. Планирование погружений на ребризере замкнутого цикла</h3>
<div class="paragraph"><p>Ð”Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… погружений выберите CCR в ÑпиÑке, как показано на риÑунке выше (ÑпиÑок
обведен Ñиней линией).</p></div>
@@ -3926,11 +4212,53 @@ SAC отдельно Ð´Ð»Ñ Ð´Ð¾Ð½Ð½Ð¾Ð¹ фазы (<em>SAC на дне</em>) и добавьте одноминутный Ñегмент Ñо значением уÑтановки равным нулю. ДекомпреÑÑионный алгоритм
автоматичеÑки не менÑет ÑмеÑи Ð´Ð»Ñ CCR-погружений (Ñ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ уÑтановкой).</p></div>
<div class="paragraph"><p>Профиль Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° ребризере замкнутого типа может выглÑдеть так:</p></div>
+>>>>>>> v4.4-branch <div class="imageblock" style="text-align:center;">
<div class="content">
<img src="images/Planner_CCR1_f20.jpg" alt="РиÑунок: Планирование CCR-погружениÑ, наÑтройка" />
</div>
</div>
+<<<<<<< HEAD +<div class="paragraph"><p>Обратите внимание, что в <em>Детальном плане погружениÑ</em> раÑход газа Ð´Ð»Ñ CCR-Ñегментов не раÑÑчитывает
+и вÑегда равен нулю.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_планирование_погружений_на_ребризере_полузамкнутого_типа">13.5. Планирование погружений на ребризере полузамкнутого типа</h3>
+<div class="paragraph"><p>Ð”Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… погружений выберите pSCR в ÑпиÑке, как показано на риÑунке выше (ÑпиÑок
+обведен Ñиней линией).
+Параметры pSCR-погружений также задаютÑÑ Ð² *ÐаÑтройках* (в главном меню выберите <em>Файл → ÐаÑтройки</em>
+и вкладку <em>Профиль</em>). К Ñтим наÑтройкам отноÑÑÑ‚ÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ метаболизма и отношение ÑброÑа (1:10 по
+умолчанию).
+=== Печать плана погружениÑ</p></div>
+<div class="paragraph"><p>Ð’Ñ‹ можете раÑпечатать план нажатием на кнопку <em>Печать</em>. Либо можете
+Ñкопировать текÑÑ‚ плана и вÑтавить его в любой текÑтовый редактор. Ðлгоритм также принимает во
+внимание ÑÐ±Ñ€Ð¾Ñ Ð³Ð°Ð·Ð° из загубника. ЕÑли уровень pO<sub>2</sub> падает ниже безопаÑного значениÑ, в
+<em>Детальном плане погружениÑ</em> отображаетÑÑ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ. Ð¢Ð¸Ð¿Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ
+на ребризере полузамкнотого цикла включаеи один баллон и неÑколько аварийных баллонов. ПоÑтому
+Ñодержимое таблиц <em>ДоÑтупные ÑмеÑи</em> и <em>Путевые точки</em> очень похожи на те, что опиÑаны Ð´Ð»Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ð¹
+на закрытом цикле выше. Однако, Ð´Ð»Ñ pSCR погружений не указываютÑÑ ÑƒÑтановки. Ðиже приведен пример
+плана Ð´Ð»Ñ Ð¿Ð¾Ð·Ð°Ð¼ÐºÐ½ÑƒÑ‚Ð¾Ð³Ð¾ цикла. Он очень похож на профиль CCR за тем иÑключением, что Ñегменты на
+вÑплытии длиннее, что ÑвÑзано Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ Ñодержанием киÑлорода в ÑиÑтеме из-за ÑброÑа из загубника.</p></div>
+<div class="imageblock" style="text-align:center;">
+<div class="content">
+<img src="images/Planner_pSCR1_f20.jpg" alt="FIGURE: Planning a pSCR dive: setup" />
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="S_Replan">13.6. Изменение ÑущеÑтвующего плана</h3>
+<div class="paragraph"><p>Обычно, поÑле ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð°, он доÑтупен в <strong>СпиÑке погружений</strong>. <em>Subsurface</em> не предоÑтавлÑет
+возможноÑти изменить план из ÑпиÑка. Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы изменить план, выберите его в ÑпиÑке. Затем в
+главном меню выберите <em>Журнал → Перепланировать</em>. Ðто дейÑтвие откроет планировщик Ñ ÑущеÑтвующим
+планом, позволÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ его.</p></div>
+<div class="paragraph"><p>Ð’ Ñлучае Ð¿ÐµÑ€ÐµÐ¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñƒ Ð²Ð°Ñ Ð¿Ð¾ÑвлÑетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ <strong>Сохранить новый</strong> план, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы
+не перезапиÑывать Ñтарый. ЕÑли Ð½Ð¾Ð²Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑохранÑетÑÑ Ñ Ñ‚ÐµÐ¼ же временем, что и Ñтарый план, то они
+ÑчитаютÑÑ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÑ€ÑиÑми одного плана и не влиÑÑŽÑ‚ друг на друга при вычиÑлении декомпреÑÑионных
+обÑзательÑтв.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_планирование_повторных_погружений">13.7. Планирование повторных погружений</h3>
+======= <div class="paragraph"><p>Обратите внимание, что в <em>Детальном плане погружениÑ</em> раÑход газа Ð´Ð»Ñ CCR-Ñегментов не раÑÑчитываетÑÑ
и вÑегда равен нулю.</p></div>
</div>
@@ -3966,6 +4294,7 @@ SAC отдельно Ð´Ð»Ñ Ð´Ð¾Ð½Ð½Ð¾Ð¹ фазы (<em>SAC на дне</em>) и </div>
<div class="sect2">
<h3 id="_планирование_повторных_погружений">13.6. Планирование повторных погружений</h3>
+>>>>>>> v4.4-branch <div class="paragraph"><p><em>Subsurface</em> позволÑет планировать повторные Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ уÑловии, что вы
корректно укажете дату и Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°. При Ñтом учитываетÑÑ Ð¾Ñтаточное
наÑыщение поÑле предыдущего погружениÑ.</p></div>
@@ -3980,7 +4309,11 @@ SAC отдельно Ð´Ð»Ñ Ð´Ð¾Ð½Ð½Ð¾Ð¹ фазы (<em>SAC на дне</em>) и Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ плана будет иÑпользоватьÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð· шаблона.</p></div>
</div>
<div class="sect2">
+<<<<<<< HEAD +<h3 id="_печать_плана_погружениÑ">13.8. Печать плана погружениÑ</h3>
+======= <h3 id="_печать_плана_погружениÑ">13.7. Печать плана погружениÑ</h3>
+>>>>>>> v4.4-branch <div class="paragraph"><p>Ð’Ñ‹ можете раÑпечатать план Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ñ‚ÐµÐ¼ чтобы взÑÑ‚ÑŒ его Ñ Ñобой под воду, нажав кнопку <em>Печать</em>.
Ðльтернативный ÑпоÑоб - Ñкопировать текÑÑ‚ из <em>Детального плана погружениÑ</em> и вÑтавить его в в ваш
любимый текÑтовый редактор.</p></div>
@@ -4519,6 +4852,9 @@ UDDF-файл Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ погружениÑ. Выделите вÑÐ </div>
</div>
<div class="sect2">
+<<<<<<< HEAD +<h3 id="_импорт_погружений_из_shearwater_predator_иÑпользуÑ_bluetooth">16.4. Импорт погружений из Shearwater Predator иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Bluetooth</h3>
+======= <h3 id="S_ImportingXDeep">16.4. Импорт погружений из xDEEP BLACK</h3>
<div class="admonitionblock">
<table><tr>
@@ -4537,6 +4873,7 @@ UDDF-файл Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ погружениÑ. Выделите вÑÐ </div>
<div class="sect2">
<h3 id="_импорт_погружений_из_shearwater_predator_иÑпользуÑ_bluetooth">16.5. Импорт погружений из Shearwater Predator иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Bluetooth</h3>
+>>>>>>> v4.4-branch <div class="admonitionblock">
<table><tr>
<td class="icon">
@@ -4852,6 +5189,9 @@ UDDF-файл Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ погружениÑ. Выделите вÑÐ </ol></div>
</div>
<div class="sect2">
+<<<<<<< HEAD +<h3 id="_ÑкÑпорт_погружений_из_mares_dive_organiser_v2_1">17.2. ÐкÑпорт погружений из Mares Dive Organiser V2.1</h3>
+======= <h3 id="_ÑкÑпорт_погружений_из_atomic_logbook">17.2. ÐкÑпорт погружений из Atomic Logbook</h3>
<div class="admonitionblock" id="Atomic_Export">
<table><tr>
@@ -4867,6 +5207,7 @@ Windows. Оно позволÑет загружать журналы погруР</div>
<div class="sect2">
<h3 id="_ÑкÑпорт_погружений_из_mares_dive_organiser_v2_1">17.3. ÐкÑпорт погружений из Mares Dive Organiser V2.1</h3>
+>>>>>>> v4.4-branch <div class="admonitionblock" id="Mares_Export">
<table><tr>
<td class="icon">
@@ -4907,7 +5248,11 @@ Windows. Оно позволÑет загружать журналы погруР</ol></div>
</div>
<div class="sect2">
+<<<<<<< HEAD +<h3 id="S_ImportingDivinglog">17.3. ÐкÑпорт погружений из <strong>DivingLog 5.0</strong></h3>
+======= <h3 id="S_ImportingDivinglog">17.4. ÐкÑпорт погружений из <strong>DivingLog 5.0</strong></h3>
+>>>>>>> v4.4-branch <div class="admonitionblock">
<table><tr>
<td class="icon">
@@ -4941,6 +5286,15 @@ Language</em> и нажмите кнопку <em>Metric</em>). Затем вып </div>
</div>
<div class="sect1">
+<<<<<<< HEAD +<h2 id="_приложение_г_чаÑтые_вопроÑÑ‹_и_ответы">18. ПРИЛОЖЕÐИЕ Г: ЧаÑтые вопроÑÑ‹ и ответы</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_похоже_что_em_subsurface_em_неправильно_Ñчитает_раÑход_газов_и_sac">18.1. Похоже, что <em>Subsurface</em> неправильно Ñчитает раÑход газов и SAC</h3>
+<div class="paragraph" id="SAC_CALCULATION"><p><em>ВопроÑ</em>: Я погружалÑÑ Ñ Ð±Ð°Ð»Ð»Ð¾Ð½Ð¾Ð¼ 12.2л, начальное давление 220бар, конечное -
+100 бар. Мои раÑчеты SAC не Ñовпадают Ñо значением в <em>Subsurface</em>. Возможно
+ли, что <em>Subsurface</em> Ñчитает неверно?</p></div>
+======= <h2 id="S_Appendix_D">18. ПРИЛОЖЕÐИЕ Г: ÐкÑпорт Ñлектронных таблиц в CSV-формат</h2>
<div class="sectionbody">
<div class="paragraph"><p>Многие дайверы ведут журнал погружений в каком-либо Ñлектронном формате, зачаÑтую в виде таблицы
@@ -5078,6 +5432,7 @@ GPS-координаты. Следует иÑпользоватьÑÑ Ð´ÐµÑÑÑ‚ <h3 id="_похоже_что_em_subsurface_em_неправильно_Ñчитает_раÑход_газов_и_sac">19.1. Похоже, что <em>Subsurface</em> неправильно Ñчитает раÑход газов и SAC</h3>
<div class="paragraph" id="SAC_CALCULATION"><p><em>ВопроÑ</em>: Я погружалÑÑ Ñ Ð±Ð°Ð»Ð»Ð¾Ð½Ð¾Ð¼ 12.2л, начальное давление 220бар, конечное - 100 бар. Мои раÑчеты
SAC не Ñовпадают Ñо значением в <em>Subsurface</em>. Возможно ли, что <em>Subsurface</em> Ñчитает неверно?</p></div>
+>>>>>>> v4.4-branch <div class="paragraph"><p><em>Ответ</em>: Ðет. <em>Subsurface</em> раÑÑчитывает раÑход газа иначе, и даже лучше, чем вы
ожидаете. Ð’ чаÑтноÑти, мы принимаем во внимание неÑжимаемоÑÑ‚ÑŒ газа.
Традиционно, раÑход и SAC ÑчитаютÑÑ Ð¿Ð¾ формуле:
@@ -5104,7 +5459,11 @@ SAC не Ñовпадают Ñо значением в <em>Subsurface</em>. Во воздух ведет ÑÐµÐ±Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¸ как идеальный газ.</p></div>
</div>
<div class="sect2">
+<<<<<<< HEAD +<h3 id="_на_некоторых_профилÑÑ…_наблюдаютÑÑ_различиÑ_во_времени_Ñ_данных_дайв_компьютера_8230">18.2. Ðа некоторых профилÑÑ… наблюдаютÑÑ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð²Ð¾ времени Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… дайв-компьютера…</h3>
+======= <h3 id="_на_некоторых_профилÑÑ…_наблюдаютÑÑ_различиÑ_во_времени_Ñ_данных_дайв_компьютера_8230">19.2. Ðа некоторых профилÑÑ… наблюдаютÑÑ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð²Ð¾ времени Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… дайв-компьютера…</h3>
+>>>>>>> v4.4-branch <div class="paragraph"><p><em>Subsurface</em> игнорирует поверхноÑтное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸ различных раÑчетах (ÑреднÑÑ
глубина, Ð²Ñ€ÐµÐ¼Ñ Ð´Ð°Ð¹Ð²Ð°, SAC и Ñ‚.д)</p></div>
<div class="paragraph"><p><em>ВопроÑ</em>: почему Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° дайв-компьютере и в <em>Subsurface</em> различаютÑÑ?</p></div>
@@ -5124,7 +5483,11 @@ SAC не Ñовпадают Ñо значением в <em>Subsurface</em>. Во <div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
+<<<<<<< HEAD +ПоÑледнее обновление 2015-02-04 13:41:50 PST
+======= ПоÑледнее обновление 2015-02-17 08:49:01 PST
+>>>>>>> v4.4-branch </div>
</div>
</body>
diff --git a/Documentation/user-manual_ru.txt b/Documentation/user-manual_ru.txt index c6f5f1788..ed0877fca 100644 --- a/Documentation/user-manual_ru.txt +++ b/Documentation/user-manual_ru.txt @@ -3628,6 +3628,7 @@ Divemanager 3 (DM3) - ÑÑ‚Ð°Ñ€Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° погруженР=== ÐкÑпорт погружений из Atomic Logbook [[Atomic_Export]] +[icon="images/icons/atomiclogo.jpg"] [NOTE] ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Atomic Aquatics предлагает ÑобÑтвенное программное обеÑпечение Atomic Logbook Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹ Windows. Оно позволÑет загружать журналы погружений Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð¾Ð² Cobalt и Cobalt 2. Журнал хранитÑÑ @@ -33,39 +33,21 @@ effort patch in packaging/ubuntu/0001-Make-build-with-Qt4.patch that attempts to continue to allow building with Qt4, but that is not officially supported and will result in missing functionality. +As of Subsurface 4.5 we are switching our build system to cmake. qmake +based builds are no longer supported. + Build options for Subsurface ---------------------------- -The following options are recognized when passed to qmake: - - -config debug Create a debug build - -config release Create a release build - The default depends on how Qt was built. - V=1 Disable the "silent" build mode - LIBDCDEVEL=1 Search for libdivecomputer in ../libdivecomputer - LIBMARBLEDEVEL=path Search for marble library and includes in path - SPECIAL_MARBLE_PREFIX=1 Use libssrfmarblewidget as library name - This is needed when building with our marble branch - LIBGIT2DEVEL=path Search for libgit2 library and includes in path - INCLUDEPATH+=xxx Add xxx to the include paths to the compiler - (pass the actual path, without -I) - LIBS+=xxx Add xxx to the linker flags. -l and -L options are - recognized. - DEFINES+=SHOW_PLOT_INFO_TABLE=1 - Only available in debug builds, this creates a - second window that shows all elements in the - plot_info structure as a table - very useful when - debugging issues with the profile - -The INCLUDEPATH and LIBS options are useful to tell the buildsystem -about non-standard installation paths for the dependencies (such as -Marble). They can be repeated as often as needed, or multiple -arguments can be passed on the same switch, separated by a space. For -example: - - qmake LIBS+="-L$HOME/marble/lib -L$HOME/libdivecomputer/lib" \ - INCLUDEPATH+="$HOME/marble/include $HOME/libdivecomputer/include" +The following options are recognized 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 Building Subsurface 4 under Linux --------------------------------- @@ -190,21 +172,16 @@ $ make install $ cd ~/src $ git clone git://subsurface-divelog.org/subsurface.git $ cd subsurface -$ qmake SPECIAL_MARBLE_PREFIX=1 INCLUDEPATH+=/usr/local/include \ - LIBS+=-L/usr/local/lib \ - LIBS+='-L/usr/local/Cellar/libzip/0.11.2/lib -lzip -lz' \ - INCLUDEPATH+=/usr/local/Cellar/libzip/0.11.2/include V=1 \ - LIBMARBLEDEVEL=../marble-source/marble-build/ +$ mkdir build +$ cd build +$ cmake -DCMAKE_BUILD_TYPE=Release .. $ make -j4 -$ make install_mac_bundle - -After the above is done, Subsurface will be installed to /Applications. +$ make install -Another option is to create a .dmg for distribution: +After the above is done, Subsurface.app will be available in the +subsurface/build/staging directory. This folder can then be moved +to /Applications install Subsurface for every user. -$ qmake -$ make -$ make mac-create-dmg Cross-building Subsurface on Linux for Windows @@ -215,6 +192,28 @@ cross builds under Linux (currently on Fedora 20). A shell script to do that (plus the .nsi file to create the installer with makensis) are included in the packaging/windows directory. +On OpenSUSE, for mingw64 packages you should add the specific +repository from their site. After that you can run the following +command: +sudo zypper install mingw64-cross-libqt5-qttools mingw64-mpc-devel \ + mingw64-filesystem mingw64-pkg-config mingw64-cross-gcc \ + mingw64-gcc-c++ mingw64-libusb-1_0-devel \ + mingw64-cross-libqt5-qttools mingw64-libqt5-qtwebkit \ + mingw64-libqt5-qtwebkit-devel mingw64-cross-libqt5-qmake \ + mingw64-libqt5-qtscript mingw64-libqt5-qtscript-devel \ + mingw64-libqt5-qtsvg mingw64-libqt5-qtsvg-devel \ + mingw64-libqt5-qtdeclarative mingw64-libqt5-qtdeclarative-devel \ + mingw64-libssh2-devel mingw64-libzip-devel \ + mingw64-sqlite-devel mingw64-win_iconv-devel \ + mingw64-libxslt-devel mingw64-libqt5-qttools + +[Observation] - Sometimes on OpenSUSE platform there is a problem with +the mingw64-libzip-devel package(the zipconf header is not installed in +the right place) and you have to create a symbolic link using the following +command: + sudo ln -s /usr/x86_64-w64-mingw32/sys-root/mingw/lib/libzip/include/zipconf.h \ + /usr/x86_64-w64-mingw32/sys-root/mingw/include/zipconf.h + Everywhere below the mingw64- prefix is used for the cross tools. If you really need a 32bit binary you need to use mingw32- as prefix and you may also run into issues creating an installable binary with Qt5 (i.e., you @@ -258,9 +257,11 @@ $ sudo mingw64-make install To compile libgit2, use: -$ mkdir -p ~/src/libgit2/build $ git clone git://github.com/libgit2/libgit2 ~/src/libgit2 -$ cd ~/src/libgit2/build +$ mkdir ~/src/libgit2/build +$ cd ~/src/libgit2 +$ git checkout v0.21.5 +$ cd build $ mingw64-cmake .. $ mingw64-make $ sudo mingw64-make install diff --git a/ReleaseNotes/ReleaseNotes.txt b/ReleaseNotes/ReleaseNotes.txt index 7ac21fd40..9ffc41644 100644 --- a/ReleaseNotes/ReleaseNotes.txt +++ b/ReleaseNotes/ReleaseNotes.txt @@ -1,18 +1,28 @@ -// _Subsurface_ 4.4.2 Release Notes +// _Subsurface_ 4.5 pre-beta Release Notes -_Subsurface_ 4.4.2 - April 2015 +_Subsurface_ 4.5 pre-beta - April 2015 -------------------------------- -The _Subsurface_ development team proudly announces -the release of version 4.4.2 of _Subsurface_, an open -source divelog and dive planning program for Windows, Mac and Linux. +Some of the changes since _Subsurface_ 4.4.2 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Dive site handling - dive sites are now a first class citizen in +Subsurface and can be managed as such. Dives include a reference to a dive +site. This also caused changes to our file format (and we bumped the file +format version to 3). + +Improved image import and management. Subsurface now does a better job +when handling changes in image folder location and can add images from +URLs instead of just local files. + +Undo / redo support. While this does not cover all operations, yet, many +operations can now been un-done and subsequently re-done. -License: GPLv2 +Many fixes and improvements for import third part files and CSV files -_Subsurface_ can be found at: http://_Subsurface_-divelog.org +Ability to load dives exported with OSTCTools -This is another small update to _Subsurface_ 4.4, mainly intended to -add and improve support for some dive computers. +Support for more GPS coordinate formats Some of the changes since _Subsurface_ 4.4.1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/cmake/Modules/FindLIBGIT2.cmake b/cmake/Modules/FindLIBGIT2.cmake new file mode 100644 index 000000000..6e1193f50 --- /dev/null +++ b/cmake/Modules/FindLIBGIT2.cmake @@ -0,0 +1,38 @@ +# - Try to find the LibGit2 Library +# Once done this will define +# +# LIBGIT2_FOUND - system has LibGit2 +# LIBGIT2_INCLUDE_DIR - the LibGit2 include directory +# LIBGIT2_LIBRARIES +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + +# in cache already +IF ( LIBGIT2_INCLUDE_DIR AND LIBGIT2_LIBRARIES ) + SET( LIBGIT2_FIND_QUIETLY TRUE ) +ENDIF () + +FIND_PATH( LIBGIT2_INCLUDE_DIR +NAMES git2.h +HINTS + ${CMAKE_CURRENT_SOURCE_DIR}/../install-root/include + ${CMAKE_CURRENT_SOURCE_DIR}/../libgit2/include + /usr/local/include + /usr/include +) + +FIND_LIBRARY( LIBGIT2_LIBRARIES +NAMES + libgit2.a + git2 +HINTS + ${CMAKE_CURRENT_SOURCE_DIR}/../install-root/lib + ${CMAKE_CURRENT_SOURCE_DIR}/../libgit2/build + /usr/local/include + /usr/include +) +SET(LIBGIT2_LIBRARIES ${LIBGIT2_LIBRARIES} -lssl -lcrypto) + +INCLUDE( FindPackageHandleStandardArgs ) +FIND_PACKAGE_HANDLE_STANDARD_ARGS( git2 DEFAULT_MSG LIBGIT2_INCLUDE_DIR LIBGIT2_LIBRARIES ) diff --git a/cmake/Modules/FindLibdivecomputer.cmake b/cmake/Modules/FindLibdivecomputer.cmake new file mode 100644 index 000000000..1ab0fc5dc --- /dev/null +++ b/cmake/Modules/FindLibdivecomputer.cmake @@ -0,0 +1,37 @@ +# - Try to find the LIBDIVECOMPUTER Library +# Once done this will define +# +# LIBDIVECOMPUTER_FOUND - system has LIBDIVECOMPUTER +# LIBDIVECOMPUTER_INCLUDE_DIR - the LIBDIVECOMPUTER include directory +# LIBDIVECOMPUTER_LIBRARIES +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + +# in cache already +IF ( LIBDIVECOMPUTER_INCLUDE_DIR AND LIBDIVECOMPUTER_LIBRARIES ) + SET( LIBDIVECOMPUTER_FIND_QUIETLY TRUE ) +ENDIF ( LIBDIVECOMPUTER_INCLUDE_DIR AND LIBDIVECOMPUTER_LIBRARIES ) + +FIND_PATH( LIBDIVECOMPUTER_INCLUDE_DIR +NAMES libdivecomputer/hw.h +HINTS + ${CMAKE_CURRENT_SOURCE_DIR}/../install-root/include + ${CMAKE_CURRENT_SOURCE_DIR}/../libdivecomputer/include/ + /usr/local/include + /usr/include +) + +FIND_LIBRARY( LIBDIVECOMPUTER_LIBRARIES +NAMES + libdivecomputer.a + divecomputer +HINTS + ${CMAKE_CURRENT_SOURCE_DIR}/../install-root/lib + ${CMAKE_CURRENT_SOURCE_DIR}/../libdivecomputer/src/.libs/ + /usr/local/include + /usr/include +) + +INCLUDE( FindPackageHandleStandardArgs ) +FIND_PACKAGE_HANDLE_STANDARD_ARGS( Libdivecomputer DEFAULT_MSG LIBDIVECOMPUTER_INCLUDE_DIR LIBDIVECOMPUTER_LIBRARIES ) diff --git a/marbledata/FindMarble.cmake b/cmake/Modules/FindMarble.cmake index 4917c995e..b50aeca24 100644 --- a/marbledata/FindMarble.cmake +++ b/cmake/Modules/FindMarble.cmake @@ -8,13 +8,32 @@ # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # +# in cache already IF ( MARBLE_INCLUDE_DIR AND MARBLE_LIBRARIES ) - # in cache already SET( MARBLE_FIND_QUIETLY TRUE ) ENDIF ( MARBLE_INCLUDE_DIR AND MARBLE_LIBRARIES ) -FIND_PATH( MARBLE_INCLUDE_DIR NAMES marble/MarbleModel.h ) -FIND_LIBRARY( MARBLE_LIBRARIES NAMES marblewidget ) +FIND_PATH( MARBLE_INCLUDE_DIR +NAMES marble/MarbleModel.h +HINTS + ${CMAKE_CURRENT_SOURCE_DIR}/../install-root/include + ${CMAKE_CURRENT_SOURCE_DIR}/../marble/src/lib + ${CMAKE_CURRENT_SOURCE_DIR}/../marble-source/src/lib + /usr/local/include + /usr/include +) + +FIND_LIBRARY( MARBLE_LIBRARIES +NAMES + ssrfmarblewidget + marblewidget +HINTS + ${CMAKE_CURRENT_SOURCE_DIR}/../install-root/lib + ${CMAKE_CURRENT_SOURCE_DIR}/../marble + ${CMAKE_CURRENT_SOURCE_DIR}/../marble-source + /usr/local/include + /usr/include +) INCLUDE( FindPackageHandleStandardArgs ) FIND_PACKAGE_HANDLE_STANDARD_ARGS( marble DEFAULT_MSG MARBLE_INCLUDE_DIR MARBLE_LIBRARIES ) diff --git a/cmake/Modules/pkgconfig_helper.cmake b/cmake/Modules/pkgconfig_helper.cmake new file mode 100644 index 000000000..f53a1064d --- /dev/null +++ b/cmake/Modules/pkgconfig_helper.cmake @@ -0,0 +1,7 @@ +MACRO(pkg_config_library LIBNAME pcfile option) + pkg_check_modules(${LIBNAME} ${option} ${pcfile}) + include_directories(${${LIBNAME}_INCLUDE_DIRS}) + link_directories(${${LIBNAME}_LIBRARY_DIRS}) + add_definitions(${${LIBNAME}_CFLAGS_OTHER}) + set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${${LIBNAME}_LIBRARIES}) +ENDMACRO() @@ -233,6 +233,7 @@ static void cochran_parse_header(const unsigned char *decode, unsigned mod, break; default: printf ("Unknown log format v%c\n", buf[0x137]); + free(buf); exit(1); break; } diff --git a/datatrak.c b/datatrak.c new file mode 100644 index 000000000..537b09db7 --- /dev/null +++ b/datatrak.c @@ -0,0 +1,683 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <time.h> + +#include "datatrak.h" +#include "dive.h" +#include "units.h" +#include "device.h" +#include "gettext.h" + +extern struct sample *add_sample(struct sample *sample, int time, struct divecomputer *dc); + +unsigned char lector_bytes[2], lector_word[4], tmp_1byte, *byte; +unsigned int tmp_2bytes; +char is_nitrox, is_O2, is_SCR; +unsigned long tmp_4bytes; + +static unsigned int two_bytes_to_int(unsigned char x, unsigned char y) +{ + return (x << 8) + y; +} + +static unsigned long four_bytes_to_long(unsigned char x, unsigned char y, unsigned char z, unsigned char t) +{ + return ((long)x << 24) + ((long)y << 16) + ((long)z << 8) + (long)t; +} + +static unsigned char *byte_to_bits(unsigned char byte) +{ + unsigned char i, *bits = (unsigned char *)malloc(8); + + for (i = 0; i < 8; i++) + bits[i] = byte & (1 << i); + return bits; +} + +/* + * Datatrak stores the date in days since 01-01-1600, while Subsurface uses + * time_t (seconds since 00:00 01-01-1970). Function substracts + * (1970 - 1600) * 365,2425 = 135139,725 to our date variable, getting the + * days since Epoch. + */ +static time_t date_time_to_ssrfc(unsigned long date, int time) +{ + time_t tmp; + tmp = (date - 135140) * 86400 + time * 60; + return tmp; +} + +static unsigned char to_8859(unsigned char char_cp850) +{ + static const unsigned char char_8859[46] = { 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, + 0xea, 0xeb, 0xe8, 0xef, 0xee, 0xec, 0xc4, 0xc5, + 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9, + 0xff, 0xd6, 0xdc, 0xf8, 0xa3, 0xd8, 0xd7, 0x66, + 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba, + 0xbf, 0xae, 0xac, 0xbd, 0xbc, 0xa1 }; + return char_8859[char_cp850 - 0x80]; +} + +static char *to_utf8(unsigned char *in_string) +{ + int outlen, inlen, i = 0, j = 0; + inlen = strlen(in_string); + outlen = inlen * 2 + 1; + + char *out_string = calloc(outlen, 1); + for (i = 0; i < inlen; i++) { + if (in_string[i] < 127) + out_string[j] = in_string[i]; + else { + if (in_string[i] > 127 && in_string[i] <= 173) + in_string[i] = to_8859(in_string[i]); + out_string[j] = (in_string[i] >> 6) | 0xC0; + j++; + out_string[j] = (in_string[i] & 0x3F) | 0x80; + } + j++; + } + out_string[j + 1] = '\0'; + return out_string; +} + +/* + * Subsurface sample structure doesn't support the flags and alarms in the dt .log + * so will treat them as dc events. + */ +static struct sample *dtrak_profile(struct dive *dt_dive, FILE *archivo) +{ + int i, j = 1, interval, o2percent = dt_dive->cylinder[0].gasmix.o2.permille / 10; + struct sample *sample = dt_dive->dc.sample; + struct divecomputer *dc = &dt_dive->dc; + + for (i = 1; i <= dt_dive->dc.alloc_samples; i++) { + fread(&lector_bytes, 1, 2, archivo); + interval= 20 * (i + 1); + sample = add_sample(sample, interval, dc); + sample->depth.mm = (two_bytes_to_int(lector_bytes[0], lector_bytes[1]) & 0xFFC0) * 1000 / 410; + byte = byte_to_bits(two_bytes_to_int(lector_bytes[0], lector_bytes[1]) & 0x003F); + if (byte[0] != 0) + sample->in_deco = true; + else + sample->in_deco = false; + if (byte[1] != 0) + add_event(dc, sample->time.seconds, 0, 0, 0, "rbt"); + if (byte[2] != 0) + add_event(dc, sample->time.seconds, 0, 0, 0, "ascent"); + if (byte[3] != 0) + add_event(dc, sample->time.seconds, 0, 0, 0, "ceiling"); + if (byte[4] != 0) + add_event(dc, sample->time.seconds, 0, 0, 0, "workload"); + if (byte[5] != 0) + add_event(dc, sample->time.seconds, 0, 0, 0, "transmitter"); + if (j == 3) { + read_bytes(1); + if (is_O2) { + read_bytes(1); + o2percent = tmp_1byte; + } + j = 0; + } + free(byte); + + // In commit 5f44fdd setpoint replaced po2, so although this is not necesarily CCR dive ... + if (is_O2) + sample->setpoint.mbar = calculate_depth_to_mbar(sample->depth.mm, dt_dive->surface_pressure, 0) * o2percent / 100; + j++; + } + return sample; +} + +/* + * Reads the header of a file and returns the header struct + * If it's not a DATATRAK file returns header zero initalized + */ +static dtrakheader read_file_header(FILE *archivo) +{ + dtrakheader fileheader = { 0 }; + const short headerbytes = 12; + unsigned char *lector = (unsigned char *)malloc(headerbytes); + + fread(lector, 1, headerbytes, archivo); + if (two_bytes_to_int(lector[0], lector[1]) != 0xA100) { + report_error(translate("gettextFromC", "Error: the file does not appear to be a DATATRAK divelog")); + free(lector); + return fileheader; + } + fileheader.header = (lector[0] << 8) + lector[1]; + fileheader.dc_serial_1 = two_bytes_to_int(lector[2], lector[3]); + fileheader.dc_serial_2 = two_bytes_to_int(lector[4], lector[5]); + fileheader.divesNum = two_bytes_to_int(lector[7], lector[6]); + free(lector); + return fileheader; +} + + +/* + * Parses the dive extracting its data and filling a subsurface's dive structure + */ +static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive) +{ + unsigned char n; + int profile_length; + char *tmp_notes_str = NULL; + unsigned char *tmp_string1 = NULL, + *locality = NULL, + *dive_point = NULL, + buffer[1024]; + struct divecomputer *dc = &dt_dive->dc; + + is_nitrox = is_O2 = is_SCR = 0; + + /* + * Parse byte to byte till next dive entry + */ + n = 0; + fread(&lector_bytes[n], 1, 1, archivo); + while (lector_bytes[n] != 0xA0) + fread(&lector_bytes[n], 1, 1, archivo); + + /* + * Found dive header 0xA000, verify second byte + */ + fread(&lector_bytes[n+1], 1, 1, archivo); + if (two_bytes_to_int(lector_bytes[0], lector_bytes[1]) != 0xA000) { + printf("Error: byte = %4x\n", two_bytes_to_int(lector_bytes[0], lector_bytes[1])); + dt_dive = NULL; + return *dt_dive; + } + + /* + * Begin parsing + * First, Date of dive, 4 bytes + */ + read_bytes(4); + + + /* + * Next, Time in minutes since 00:00 + */ + read_bytes(2); + + dt_dive->dc.when = dt_dive->when = (timestamp_t)date_time_to_ssrfc(tmp_4bytes, tmp_2bytes); + + /* + * Now, Locality, 1st byte is long of string, rest is string + */ + read_bytes(1); + read_string(locality); + + /* + * Next, Dive point, defined as Locality + */ + read_bytes(1); + read_string(dive_point); + + /* + * Subsurface only have a location variable, so we have to merge DTrak's + * Locality and Dive points. + */ + snprintf(buffer, sizeof(buffer), "%s, %s", locality, dive_point); + dt_dive->dive_site_uuid = get_dive_site_uuid_by_name(buffer, NULL); + if (dt_dive->dive_site_uuid == 0) + dt_dive->dive_site_uuid = create_dive_site(buffer); + free(locality); + free(dive_point); + + /* + * Altitude. Don't exist in Subsurface, the equivalent would be + * surface air pressure which can, be calculated from altitude. + * As dtrak registers altitude intervals, we, arbitrarily, choose + * the lower altitude/pressure equivalence for each segment. So + * + * Datatrak table * Conversion formula: + * * + * byte = 1 0 - 700 m * P = P0 * exp(-(g * M * h ) / (R * T0)) + * byte = 2 700 - 1700m * P0 = sealevel pressure = 101325 Pa + * byte = 3 1700 - 2700 m * g = grav. acceleration = 9,80665 m/s² + * byte = 4 2700 - * m * M = molar mass (dry air) = 0,0289644 Kg/mol + * * h = altitude over sea level (m) + * * R = Universal gas constant = 8,31447 J/(mol*K) + * * T0 = sea level standard temperature = 288,15 K + */ + read_bytes(1); + switch (tmp_1byte) { + case 1: + dt_dive->dc.surface_pressure.mbar = 1013; + break; + case 2: + dt_dive->dc.surface_pressure.mbar = 932; + break; + case 3: + dt_dive->dc.surface_pressure.mbar = 828; + break; + case 4: + dt_dive->dc.surface_pressure.mbar = 735; + break; + default: + dt_dive->dc.surface_pressure.mbar = 1013; + } + + /* + * Interval (minutes) + */ + read_bytes(2); + if (tmp_2bytes != 0x7FFF) + dt_dive->dc.surfacetime.seconds = (uint32_t) tmp_2bytes * 60; + + /* + * Weather, values table, 0 to 6 + * Subsurface don't have this record but we can use tags + */ + dt_dive->tag_list = NULL; + read_bytes(1); + switch (tmp_1byte) { + case 1: + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "clear"))); + break; + case 2: + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "misty"))); + break; + case 3: + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "fog"))); + break; + case 4: + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "rain"))); + break; + case 5: + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "storm"))); + break; + case 6: + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "snow"))); + break; + default: + // unknown, do nothing + break; + } + + /* + * Air Temperature + */ + read_bytes(2); + if (tmp_2bytes != 0x7FFF) + dt_dive->dc.airtemp.mkelvin = C_to_mkelvin((double)(tmp_2bytes / 100)); + + /* + * Dive suit, values table, 0 to 6 + */ + read_bytes(1); + switch (tmp_1byte) { + case 1: + dt_dive->suit = strdup(QT_TRANSLATE_NOOP("gettextFromC", "No suit")); + break; + case 2: + dt_dive->suit = strdup(QT_TRANSLATE_NOOP("gettextFromC", "Shorty")); + break; + case 3: + dt_dive->suit = strdup(QT_TRANSLATE_NOOP("gettextFromC", "Combi")); + break; + case 4: + dt_dive->suit = strdup(QT_TRANSLATE_NOOP("gettextFromC", "Wet suit")); + break; + case 5: + dt_dive->suit = strdup(QT_TRANSLATE_NOOP("gettextFromC", "Semidry suit")); + break; + case 6: + dt_dive->suit = strdup(QT_TRANSLATE_NOOP("gettextFromC", "Dry suit")); + break; + default: + // unknown, do nothing + break; + } + + /* + * Tank, volume size in liter*100. And initialize gasmix to air (default). + * Dtrak don't record init and end pressures, but consumed bar, so let's + * init a default pressure of 200 bar. + */ + read_bytes(2); + if (tmp_2bytes != 0x7FFF) { + dt_dive->cylinder[0].type.size.mliter = tmp_2bytes * 10; + dt_dive->cylinder[0].type.description = strdup(""); + dt_dive->cylinder[0].start.mbar = 200000; + dt_dive->cylinder[0].gasmix.he.permille = 0; + dt_dive->cylinder[0].gasmix.o2.permille = 210; + dt_dive->cylinder[0].manually_added = true; + } + + /* + * Maximum depth, in cm. + */ + read_bytes(2); + if (tmp_2bytes != 0x7FFF) + dt_dive->maxdepth.mm = dt_dive->dc.maxdepth.mm = (int32_t)tmp_2bytes * 10; + + /* + * Dive time in minutes. + */ + read_bytes(2); + if (tmp_2bytes != 0x7FFF) + dt_dive->duration.seconds = dt_dive->dc.duration.seconds = (uint32_t)tmp_2bytes * 60; + + /* + * Minimum water temperature in C*100. If unknown, set it to 0K which + * is subsurface's value for "unknown" + */ + read_bytes(2); + if (tmp_2bytes != 0x7fff) + dt_dive->watertemp.mkelvin = dt_dive->dc.watertemp.mkelvin = C_to_mkelvin((double)(tmp_2bytes / 100)); + else + dt_dive->watertemp.mkelvin = 0; + + /* + * Air used in bar*100. + */ + read_bytes(2); + if (tmp_2bytes != 0x7FFF && dt_dive->cylinder[0].type.size.mliter) + dt_dive->cylinder[0].gas_used.mliter = dt_dive->cylinder[0].type.size.mliter * (tmp_2bytes / 100.0); + + /* + * Dive Type 1 - Bit table. Subsurface don't have this record, but + * will use tags. Bits 0 and 1 are not used. Reuse coincident tags. + */ + read_bytes(1); + byte = byte_to_bits(tmp_1byte); + if (byte[2] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "no stop"))); + if (byte[3] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "deco"))); + if (byte[4] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "single ascent"))); + if (byte[5] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "multiple ascent"))); + if (byte[6] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "fresh"))); + if (byte[7] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "salt water"))); + free(byte); + + /* + * Dive Type 2 - Bit table, use tags again + */ + read_bytes(1); + byte = byte_to_bits(tmp_1byte); + if (byte[0] != 0) { + taglist_add_tag(&dt_dive->tag_list, strdup("nitrox")); + is_nitrox = 1; + } + if (byte[1] != 0) { + taglist_add_tag(&dt_dive->tag_list, strdup("rebreather")); + is_SCR = 1; + dt_dive->dc.divemode = PSCR; + } + free(byte); + + /* + * Dive Activity 1 - Bit table, use tags again + */ + read_bytes(1); + byte = byte_to_bits(tmp_1byte); + if (byte[0] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "sight seeing"))); + if (byte[1] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "club dive"))); + if (byte[2] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "instructor"))); + if (byte[3] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "instruction"))); + if (byte[4] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "night"))); + if (byte[5] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "cave"))); + if (byte[6] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "ice"))); + if (byte[7] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "search"))); + free(byte); + + + /* + * Dive Activity 2 - Bit table, use tags again + */ + read_bytes(1); + byte = byte_to_bits(tmp_1byte); + if (byte[0] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "wreck"))); + if (byte[1] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "river"))); + if (byte[2] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "drift"))); + if (byte[3] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "photo"))); + if (byte[4] != 0) + taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "other"))); + free(byte); + + /* + * Other activities - String 1st byte = long + * Will put this in dive notes before the true notes + */ + read_bytes(1); + if (tmp_1byte != 0) { + read_string(tmp_string1); + snprintf(buffer, sizeof(buffer), "%s: %s\n", + QT_TRANSLATE_NOOP("gettextFromC", "Other activities"), + tmp_string1); + tmp_notes_str = strdup(buffer); + free(tmp_string1); + } + + /* + * Dive buddies + */ + read_bytes(1); + if (tmp_1byte != 0) { + read_string(tmp_string1); + dt_dive->buddy = strdup(tmp_string1); + free(tmp_string1); + } + + /* + * Dive notes + */ + read_bytes(1); + if (tmp_1byte != 0) { + read_string(tmp_string1); + int len = snprintf(buffer, sizeof(buffer), "%s%s:\n%s", + tmp_notes_str ? tmp_notes_str : "", + QT_TRANSLATE_NOOP("gettextFromC", "Datatrak/Wlog notes"), + tmp_string1); + dt_dive->notes = calloc((len +1), 1); + dt_dive->notes = memcpy(dt_dive->notes, buffer, len); + free(tmp_string1); + if (tmp_notes_str != NULL) + free(tmp_notes_str); + } + + /* + * Alarms 1 - Bit table - Not in Subsurface, we use the profile + */ + read_bytes(1); + + /* + * Alarms 2 - Bit table - Not in Subsurface, we use the profile + */ + read_bytes(1); + + /* + * Dive number (in datatrak, after import user has to renumber) + */ + read_bytes(2); + dt_dive->number = tmp_2bytes; + + /* + * Computer timestamp - Useless for Subsurface + */ + read_bytes(4); + + /* + * Model - table - Not included 0x14, 0x24, 0x41, and 0x73 + * known to exist, but not its model name - To add in the future. + * Strangely 0x00 serves for manually added dives and a dc too, at + * least in EXAMPLE.LOG file, shipped with the software. + */ + read_bytes(1); + switch (tmp_1byte) { + case 0x00: + dt_dive->dc.model = strdup(QT_TRANSLATE_NOOP("gettextFromC", "Manually entered dive")); + break; + case 0x1C: + dt_dive->dc.model = strdup("Aladin Air"); + break; + case 0x1D: + dt_dive->dc.model = strdup("Spiro Monitor 2 plus"); + break; + case 0x1E: + dt_dive->dc.model = strdup("Aladin Sport"); + break; + case 0x1F: + dt_dive->dc.model = strdup("Aladin Pro"); + break; + case 0x34: + dt_dive->dc.model = strdup("Aladin Air X"); + break; + case 0x3D: + dt_dive->dc.model = strdup("Spiro Monitor 2 plus"); + break; + case 0x3F: + dt_dive->dc.model = strdup("Mares Genius"); + break; + case 0x44: + dt_dive->dc.model = strdup("Aladin Air X"); + break; + case 0x48: + dt_dive->dc.model = strdup("Spiro Monitor 3 Air"); + break; + case 0xA4: + dt_dive->dc.model = strdup("Aladin Air X O2"); + break; + case 0xB1: + dt_dive->dc.model = strdup("Citizen Hyper Aqualand"); + break; + case 0xB2: + dt_dive->dc.model = strdup("Citizen ProMaster"); + break; + case 0xB3: + dt_dive->dc.model = strdup("Mares Guardian"); + break; + case 0xBC: + dt_dive->dc.model = strdup("Aladin Air X Nitrox"); + break; + case 0xF4: + dt_dive->dc.model = strdup("Aladin Air X Nitrox"); + break; + case 0xFF: + dt_dive->dc.model = strdup("Aladin Pro Nitrox"); + break; + default: + dt_dive->dc.model = strdup(QT_TRANSLATE_NOOP("gettextFromC", "Unknown")); + break; + } + if ((tmp_1byte & 0xF0) == 0xF0) + is_nitrox = 1; + if ((tmp_1byte & 0xF0) == 0xA0) + is_O2 = 1; + + /* + * Air usage, unknown use. Probably allows or deny manually entering gas + * comsumption based on dc model - Useless for Subsurface + */ + read_bytes(1); + fseek(archivo, 6, 1); // jump over 6 bytes whitout known use + + /* + * Profile data length + */ + read_bytes(2); + profile_length = tmp_2bytes; + if (profile_length != 0) { + /* + * 8 x 2 bytes for the tissues saturation useless for subsurface + * and other 6 bytes without known use + */ + fseek(archivo, 22, 1); + if (is_nitrox || is_O2) { + + /* + * CNS % (unsure) values table (only nitrox computers) + */ + read_bytes(1); + + /* + * % O2 in nitrox mix - (only nitrox and O2 computers but differents) + */ + read_bytes(1); + if (is_nitrox) { + dt_dive->cylinder[0].gasmix.o2.permille = + (tmp_1byte & 0x0F ? 20.0 + 2 * (tmp_1byte & 0x0F) : 21.0) * 10; + } else { + dt_dive->cylinder[0].gasmix.o2.permille = tmp_1byte * 10; + read_bytes(1) // Jump over one byte, unknown use + } + } + /* + * profileLength = Nº bytes, need to know how many samples are there. + * 2bytes per sample plus another one each three samples. Also includes the + * bytes jumped over (22) and the nitrox (2) or O2 (3). + */ + int samplenum = is_O2 ? (profile_length - 25) * 3 / 8 : (profile_length - 24) * 3 / 7; + + dc->events = calloc(samplenum, sizeof(struct event)); + dc->alloc_samples = samplenum; + dc->samples = 0; + dc->sample = calloc(samplenum, sizeof(struct sample)); + + dtrak_profile(dt_dive, archivo); + } + /* + * Initialize some dive data not supported by Datatrak/WLog + */ + if (!strcmp(dt_dive->dc.model, "Manually entered dive")) + dt_dive->dc.deviceid = 0; + else + dt_dive->dc.deviceid = 0xffffffff; + create_device_node(dt_dive->dc.model, dt_dive->dc.deviceid, "", "", dt_dive->dc.model); + dt_dive->dc.next = NULL; + if (!is_SCR && dt_dive->cylinder[0].type.size.mliter) { + dt_dive->cylinder[0].end.mbar = dt_dive->cylinder[0].start.mbar - + ((dt_dive->cylinder[0].gas_used.mliter / dt_dive->cylinder[0].type.size.mliter) * 1000); + } + return *dt_dive; +} + +void datatrak_import(const char *file, struct dive_table *table) +{ + FILE *archivo; + dtrakheader *fileheader = (dtrakheader *)malloc(sizeof(dtrakheader)); + int i = 0; + + if ((archivo = subsurface_fopen(file, "rb")) == NULL) { + report_error(translate("gettextFromC", "Error: couldn't open the file %s"), file); + free(fileheader); + return; + } + + /* + * Verify fileheader, get number of dives in datatrak divelog + */ + *fileheader = read_file_header(archivo); + while (i < fileheader->divesNum) { + struct dive *ptdive = alloc_dive(); + *ptdive = dt_dive_parser(archivo, ptdive); + if (!ptdive) + report_error(translate("gettextFromC", "Error: no dive")); + i++; + record_dive(ptdive); + } + taglist_cleanup(&g_tag_list); + fclose(archivo); + sort_table(table); + free(fileheader); +} diff --git a/datatrak.h b/datatrak.h new file mode 100644 index 000000000..a86a6af0a --- /dev/null +++ b/datatrak.h @@ -0,0 +1,34 @@ +#ifndef DATATRAK_HEADER_H +#define DATATRAK_HEADER_H + +#include <string.h> + +typedef struct dtrakheader_ { + int header; //Must be 0xA100; + int divesNum; + int dc_serial_1; + int dc_serial_2; +} dtrakheader; + +#define read_bytes(_n) \ + switch (_n) { \ + case 1: \ + fread (&lector_bytes, sizeof(char), _n, archivo); \ + tmp_1byte = lector_bytes[0]; \ + break; \ + case 2: \ + fread (&lector_bytes, sizeof(char), _n, archivo); \ + tmp_2bytes = two_bytes_to_int (lector_bytes[1], lector_bytes[0]); \ + break; \ + default: \ + fread (&lector_word, sizeof(char), _n, archivo); \ + tmp_4bytes = four_bytes_to_long(lector_word[3], lector_word[2], lector_word[1], lector_word[0]); \ + break; \ + } + +#define read_string(_property) \ + _property = (unsigned char *)calloc(tmp_1byte + 1, 1); \ + fread(_property, 1, tmp_1byte, archivo); \ + _property = strcat(to_utf8(_property), ""); + +#endif // DATATRAK_HEADER_H @@ -13,6 +13,7 @@ * it's used in the UI, but it seems to make the most sense to have it * here */ struct dive displayed_dive; +struct dive_site displayed_dive_site; struct tag_entry *g_tag_list = NULL; @@ -391,6 +392,7 @@ static void copy_pl(struct picture *sp, struct picture *dp) { *dp = *sp; dp->filename = copy_string(sp->filename); + dp->hash = copy_string(sp->hash); } /* copy an element in a list of tags */ @@ -437,7 +439,6 @@ void clear_dive(struct dive *d) /* free the strings */ free(d->buddy); free(d->divemaster); - free(d->location); free(d->notes); free(d->suit); /* free tags, additional dive computers, and pictures */ @@ -463,7 +464,6 @@ void copy_dive(struct dive *s, struct dive *d) *d = *s; d->buddy = copy_string(s->buddy); d->divemaster = copy_string(s->divemaster); - d->location = copy_string(s->location); d->notes = copy_string(s->notes); d->suit = copy_string(s->suit); for (int i = 0; i < MAX_CYLINDERS; i++) @@ -500,7 +500,6 @@ void selective_copy_dive(struct dive *s, struct dive *d, struct dive_components { if (clear) clear_dive(d); - CONDITIONAL_COPY_STRING(location); CONDITIONAL_COPY_STRING(notes); CONDITIONAL_COPY_STRING(divemaster); CONDITIONAL_COPY_STRING(buddy); @@ -509,10 +508,8 @@ void selective_copy_dive(struct dive *s, struct dive *d, struct dive_components d->rating = s->rating; if (what.visibility) d->visibility = s->visibility; - if (what.gps) { - d->longitude = s->longitude; - d->latitude = s->latitude; - } + if (what.divesite) + d->dive_site_uuid = s->dive_site_uuid; if (what.tags) STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl); if (what.cylinders) @@ -1403,7 +1400,7 @@ struct dive *fixup_dive(struct dive *dive) #define MERGE_TXT(res, a, b, n) res->n = merge_text(a->n, b->n) #define MERGE_NONZERO(res, a, b, n) res->n = a->n ? a->n : b->n -static struct sample *add_sample(struct sample *sample, int time, struct divecomputer *dc) +struct sample *add_sample(struct sample *sample, int time, struct divecomputer *dc) { struct sample *p = prepare_sample(dc); @@ -1761,7 +1758,7 @@ static void add_initial_gaschange(struct dive *dive, struct divecomputer *dc) add_gas_switch_event(dive, dc, 0, 0); } -static void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[]) +void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[]) { int i; struct event *ev; @@ -2262,7 +2259,7 @@ struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded return NULL; } -static void free_events(struct event *ev) +void free_events(struct event *ev) { while (ev) { struct event *next = ev->next; @@ -2721,7 +2718,7 @@ int count_dives_with_location(const char *location) struct dive *d; for_each_dive (i, d) { - if (same_string(d->location, location)) + if (same_string(get_dive_location(d), location)) counter++; } return counter; @@ -2766,9 +2763,6 @@ struct dive *merge_dives(struct dive *a, struct dive *b, int offset, bool prefer res->when = dl ? dl->when : a->when; res->selected = a->selected || b->selected; merge_trip(res, a, b); - MERGE_NONZERO(res, a, b, latitude.udeg); - MERGE_NONZERO(res, a, b, longitude.udeg); - MERGE_TXT(res, a, b, location); MERGE_TXT(res, a, b, notes); MERGE_TXT(res, a, b, buddy); MERGE_TXT(res, a, b, divemaster); @@ -2788,7 +2782,7 @@ struct dive *merge_dives(struct dive *a, struct dive *b, int offset, bool prefer interleave_dive_computers(&res->dc, &a->dc, &b->dc, offset); else join_dive_computers(&res->dc, &a->dc, &b->dc, 0); - + res->dive_site_uuid = a->dive_site_uuid ?: b->dive_site_uuid; fixup_dive(res); return res; } @@ -2866,15 +2860,14 @@ void set_userid(char *rUserId) prefs.userid[30]='\0'; } -int average_depth(struct diveplan *dive) +void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_depth) { int integral = 0; int last_time = 0; int last_depth = 0; struct divedatapoint *dp = dive->dp; - if (!dp) - return 0; + *max_depth = 0; while (dp) { if (dp->time) { @@ -2882,13 +2875,15 @@ int average_depth(struct diveplan *dive) integral += (dp->depth + last_depth) * (dp->time - last_time) / 2; last_time = dp->time; last_depth = dp->depth; + if (dp->depth > *max_depth) + *max_depth = dp->depth; } dp = dp->next; } if (last_time) - return integral / last_time; + *avg_depth = integral / last_time; else - return 0; + *avg_depth = *max_depth = 0; } struct picture *alloc_picture() @@ -2912,29 +2907,51 @@ static bool new_picture_for_dive(struct dive *d, char *filename) // only add pictures that have timestamps between 30 minutes before the dive and // 30 minutes after the dive ends #define D30MIN (30 * 60) -void dive_create_picture(struct dive *d, char *filename, int shift_time) +bool dive_check_picture_time(struct dive *d, int shift_time, timestamp_t timestamp) { - timestamp_t timestamp; - if (!new_picture_for_dive(d, filename)) - return; - struct picture *p = alloc_picture(); - p->filename = filename; - picture_load_exif_data(p, ×tamp); + offset_t offset; if (timestamp) { - p->offset.seconds = timestamp - d->when + shift_time; - if (p->offset.seconds < -D30MIN || p->offset.seconds > (int)d->duration.seconds + D30MIN) { - // this picture doesn't belong to this dive - free(p); - return; + offset.seconds = timestamp - d->when + shift_time; + if (offset.seconds > -D30MIN && offset.seconds < (int)d->duration.seconds + D30MIN) { + // this picture belongs to this dive + return true; } } - dive_add_picture(d, p); - dive_set_geodata_from_picture(d, p); + return false; +} + +bool picture_check_valid(char *filename, int shift_time) +{ + int i; + struct dive *dive; + + timestamp_t timestamp = picture_get_timestamp(filename); + for_each_dive (i, dive) + if (dive->selected && dive_check_picture_time(dive, shift_time, timestamp)) + return true; + return false; } -void dive_add_picture(struct dive *d, struct picture *newpic) +void dive_create_picture(struct dive *dive, char *filename, int shift_time) { - struct picture **pic_ptr = &d->picture_list; + timestamp_t timestamp = picture_get_timestamp(filename); + if (!new_picture_for_dive(dive, filename)) + return; + if (!dive_check_picture_time(dive, shift_time, timestamp)) + return; + + struct picture *picture = alloc_picture(); + picture->filename = strdup(filename); + picture->offset.seconds = timestamp - dive->when + shift_time; + picture_load_exif_data(picture); + + dive_add_picture(dive, picture); + dive_set_geodata_from_picture(dive, picture); +} + +void dive_add_picture(struct dive *dive, struct picture *newpic) +{ + struct picture **pic_ptr = &dive->picture_list; /* let's keep the list sorted by time */ while (*pic_ptr && (*pic_ptr)->offset.seconds <= newpic->offset.seconds) pic_ptr = &(*pic_ptr)->next; @@ -2943,38 +2960,45 @@ void dive_add_picture(struct dive *d, struct picture *newpic) return; } -unsigned int dive_get_picture_count(struct dive *d) +unsigned int dive_get_picture_count(struct dive *dive) { unsigned int i = 0; - FOR_EACH_PICTURE (d) + FOR_EACH_PICTURE (dive) i++; return i; } -void dive_set_geodata_from_picture(struct dive *d, struct picture *pic) +void dive_set_geodata_from_picture(struct dive *dive, struct picture *picture) { - if (!d->latitude.udeg && pic->latitude.udeg) { - d->latitude = pic->latitude; - d->longitude = pic->longitude; + struct dive_site *ds = get_dive_site_by_uuid(dive->dive_site_uuid); + if (!dive_site_has_gps_location(ds) && (picture->latitude.udeg || picture->longitude.udeg)) { + if (ds) { + ds->latitude = picture->latitude; + ds->longitude = picture->longitude; + } else { + dive->dive_site_uuid = create_dive_site_with_gps("", picture->latitude, picture->longitude); + } } } -static void picture_free(struct picture *p) +static void picture_free(struct picture *picture) { - if (!p) + if (!picture) return; - free(p->filename); - free(p); + free(picture->filename); + free(picture->hash); + free(picture); } + void dive_remove_picture(char *filename) { - struct picture **ep = ¤t_dive->picture_list; - while (ep && !same_string((*ep)->filename, filename)) - ep = &(*ep)->next; - if (ep) { - struct picture *temp = (*ep)->next; - picture_free(*ep); - *ep = temp; + struct picture **picture = ¤t_dive->picture_list; + while (picture && !same_string((*picture)->filename, filename)) + picture = &(*picture)->next; + if (picture) { + struct picture *temp = (*picture)->next; + picture_free(*picture); + *picture = temp; } } @@ -8,6 +8,7 @@ #include <zip.h> #include <sqlite3.h> #include <string.h> +#include "divesite.h" /* Windows has no MIN/MAX macros - so let's just roll our own */ #define MIN(x, y) ({ \ @@ -47,6 +48,11 @@ extern "C" { #include <stdbool.h> #endif +extern int last_xml_version; +extern bool abort_read_of_old_file; +extern bool v2_question_shown; +extern bool imported_via_xslt; + enum dive_comp_type {OC, CCR, PSCR, FREEDIVE, NUM_DC_TYPE}; // Flags (Open-circuit and Closed-circuit-rebreather) for setting dive computer type enum cylinderuse {OC_GAS, DILUENT, OXYGEN, NUM_GAS_USE}; // The different uses for cylinders @@ -320,11 +326,10 @@ struct dive { bool hidden_by_filter; bool downloaded; timestamp_t when; - char *location; + uint32_t dive_site_uuid; char *notes; char *divemaster, *buddy; int rating; - degrees_t latitude, longitude; int visibility; /* 0 - 5 star rating */ cylinder_t cylinder[MAX_CYLINDERS]; weightsystem_t weightsystem[MAX_WEIGHTSYSTEMS]; @@ -346,17 +351,17 @@ struct dive { }; extern int get_cylinder_idx_by_use(struct dive *dive, enum cylinderuse cylinder_use_type); +extern void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[]); /* when selectively copying dive information, which parts should be copied? */ struct dive_components { - unsigned int location : 1; + unsigned int divesite : 1; unsigned int notes : 1; unsigned int divemaster : 1; unsigned int buddy : 1; unsigned int suit : 1; unsigned int rating : 1; unsigned int visibility : 1; - unsigned int gps : 1; unsigned int tags : 1; unsigned int cylinders : 1; unsigned int weights : 1; @@ -365,6 +370,7 @@ struct dive_components { /* picture list and methods related to dive picture handling */ struct picture { char *filename; + char *hash; offset_t offset; degrees_t latitude; degrees_t longitude; @@ -379,31 +385,18 @@ struct picture { for (struct picture *picture = (_divestruct).picture_list; picture; picture = picture->next) extern struct picture *alloc_picture(); +extern bool dive_check_picture_time(struct dive *d, int shift_time, timestamp_t timestamp); extern void dive_create_picture(struct dive *d, char *filename, int shift_time); extern void dive_add_picture(struct dive *d, struct picture *newpic); extern void dive_remove_picture(char *filename); extern unsigned int dive_get_picture_count(struct dive *d); -extern void picture_load_exif_data(struct picture *p, timestamp_t *timestamp); +extern bool picture_check_valid(char *filename, int shift_time); +extern void picture_load_exif_data(struct picture *p); +extern timestamp_t picture_get_timestamp(char *filename); extern void dive_set_geodata_from_picture(struct dive *d, struct picture *pic); extern int explicit_first_cylinder(struct dive *dive, struct divecomputer *dc); -static inline int dive_has_gps_location(struct dive *dive) -{ - return dive->latitude.udeg || dive->longitude.udeg; -} - -static inline void copy_gps_location(struct dive *from, struct dive *to) -{ - if (from && to) { - to->latitude.udeg = from->latitude.udeg; - to->longitude.udeg = from->longitude.udeg; - if (!to->location) { - to->location = strdup(from->location); - } - } -} - static inline int get_surface_pressure_in_mbar(const struct dive *dive, bool non_null) { int mbar = dive->surface_pressure.mbar; @@ -491,18 +484,12 @@ struct dive_table { extern struct dive_table dive_table; extern struct dive displayed_dive; +extern struct dive_site displayed_dive_site; extern int selected_dive; extern unsigned int dc_number; #define current_dive (get_dive(selected_dive)) #define current_dc (get_dive_dc(current_dive, dc_number)) -static inline struct dive *get_gps_location(int nr, struct dive_table *table) -{ - if (nr >= table->nr || nr < 0) - return NULL; - return table->dives[nr]; -} - static inline struct dive *get_dive(int nr) { if (nr >= dive_table.nr || nr < 0) @@ -517,6 +504,21 @@ static inline struct dive *get_dive_from_table(int nr, struct dive_table *dt) return dt->dives[nr]; } +static inline struct dive_site *get_dive_site_for_dive(struct dive *dive) +{ + if (dive) + return get_dive_site_by_uuid(dive->dive_site_uuid); + return NULL; +} + +static inline char *get_dive_location(struct dive *dive) +{ + struct dive_site *ds = get_dive_site_by_uuid(dive->dive_site_uuid); + if (ds && ds->name) + return ds->name; + return NULL; +} + static inline unsigned int number_of_computers(struct dive *dive) { unsigned int total_number = 0; @@ -615,6 +617,16 @@ static inline int get_idx_by_uniq_id(int id) return i; } +static inline bool dive_site_has_gps_location(struct dive_site *ds) +{ + return ds && (ds->latitude.udeg || ds->longitude.udeg); +} + +static inline int dive_has_gps_location(struct dive *dive) +{ + return dive_site_has_gps_location(get_dive_site_by_uuid(dive->dive_site_uuid)); +} + #ifdef __cplusplus extern "C" { #endif @@ -642,15 +654,18 @@ extern int parse_dlf_buffer(unsigned char *buffer, size_t size); extern int parse_file(const char *filename); extern int parse_csv_file(const char *filename, int time, int depth, int temp, int po2f, int cnsf, int ndlf, int ttsf, int stopdepthf, int pressuref, int sepidx, const char *csvtemplate, int units); -extern int parse_seabear_csv_file(const char *filename, int time, int depth, int temp, int po2f, int cnsf, int ndlf, int ttsf, int stopdepthf, int pressuref, int sepidx, const char *csvtemplate, int units); +extern int parse_seabear_csv_file(const char *filename, int time, int depth, int temp, int po2f, int cnsf, int ndlf, int ttsf, int stopdepthf, int pressuref, int sepidx, const char *csvtemplate, int units, const char *delta); extern int parse_txt_file(const char *filename, const char *csv); -extern int parse_manual_file(const char *filename, int separator_index, int units, int dateformat, int durationformat, int number, int date, int time, int duration, int location, int gps, int maxdepth, int meandepth, int divemaster, int buddy, int notes, int weight, int tags, int cylsizef, int startpresf, int endpresf, int o2f, int hef, int airtempf, int watertempf); +extern int parse_manual_file(const char *filename, int separator_index, int units, int dateformat, int durationformat, int number, int date, int time, int duration, int location, int gps, int maxdepth, int meandepth, int divemaster, int buddy, int suit, int notes, int weight, int tags, int cylsizef, int startpresf, int endpresf, int o2f, int hef, int airtempf, int watertempf); extern int save_dives(const char *filename); extern int save_dives_logic(const char *filename, bool select_only); extern int save_dive(FILE *f, struct dive *dive); extern int export_dives_xslt(const char *filename, const bool selected, const int units, const char *export_xslt); +struct membuffer; +extern void save_one_dive_to_mb(struct membuffer *b, struct dive *dive); + struct git_oid; struct git_repository; #define dummy_git_repository ((git_repository *)3ul) /* Random bogus pointer, not NULL */ @@ -712,6 +727,7 @@ extern struct dive *merge_dives(struct dive *a, struct dive *b, int offset, bool extern struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded); extern void renumber_dives(int start_nr, bool selected_only); extern void copy_events(struct divecomputer *s, struct divecomputer *d); +extern void free_events(struct event *ev); extern void copy_cylinders(struct dive *s, struct dive *d, bool used_only); extern void copy_samples(struct divecomputer *s, struct divecomputer *d); extern bool is_cylinder_used(struct dive *dive, int idx); @@ -803,10 +819,10 @@ struct divedatapoint *create_dp(int time_incr, int depth, struct gasmix gasmix, #if DEBUG_PLAN void dump_plan(struct diveplan *diveplan); #endif -int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool show_disclaimer); +bool plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool show_disclaimer); void delete_single_dive(int idx); -struct event *get_next_event(struct event *event, char *name); +struct event *get_next_event(struct event *event, const char *name); /* these structs holds the information that @@ -864,7 +880,7 @@ extern depth_t string_to_depth(const char *str); extern pressure_t string_to_pressure(const char *str); extern volume_t string_to_volume(const char *str, pressure_t workp); extern fraction_t string_to_fraction(const char *str); -extern int average_depth(struct diveplan *dive); +extern void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_depth); #include "pref.h" diff --git a/divelist.c b/divelist.c index f1dd7006c..d57188a68 100644 --- a/divelist.c +++ b/divelist.c @@ -678,9 +678,9 @@ void add_dive_to_trip(struct dive *dive, dive_trip_t *trip) dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) { dive_trip_t *dive_trip = calloc(1, sizeof(dive_trip_t)); + dive_trip->when = dive->when; - if (dive->location) - dive_trip->location = strdup(dive->location); + dive_trip->location = copy_string(get_dive_location(dive)); insert_trip(&dive_trip); dive->tripflag = IN_TRIP; @@ -713,8 +713,8 @@ void autogroup_dives(void) if (lastdive && dive->when < lastdive->when + TRIP_THRESHOLD) { dive_trip_t *trip = lastdive->divetrip; add_dive_to_trip(dive, trip); - if (dive->location && !trip->location) - trip->location = strdup(dive->location); + if (get_dive_location(dive) && !trip->location) + trip->location = copy_string(get_dive_location(dive)); lastdive = dive; continue; } @@ -745,7 +745,6 @@ void delete_single_dive(int idx) dive_table.dives[--dive_table.nr] = NULL; /* free all allocations */ free(dive->dc.sample); - free((void *)dive->location); free((void *)dive->notes); free((void *)dive->divemaster); free((void *)dive->buddy); diff --git a/dives/Example.log b/dives/Example.log Binary files differnew file mode 100644 index 000000000..3cc8cd3f8 --- /dev/null +++ b/dives/Example.log diff --git a/dives/ostc_00087_04-05-2014_043m_032min.dive b/dives/ostc_00087_04-05-2014_043m_032min.dive Binary files differnew file mode 100644 index 000000000..12cb23733 --- /dev/null +++ b/dives/ostc_00087_04-05-2014_043m_032min.dive diff --git a/dives/ostc_00173_17-08-2013_027m_043min.dive b/dives/ostc_00173_17-08-2013_027m_043min.dive Binary files differnew file mode 100644 index 000000000..b95dbfa70 --- /dev/null +++ b/dives/ostc_00173_17-08-2013_027m_043min.dive diff --git a/dives/test40-42.xml b/dives/test40-42.xml new file mode 100644 index 000000000..79ffaa01e --- /dev/null +++ b/dives/test40-42.xml @@ -0,0 +1,5030 @@ +<divelog program='subsurface' version='3'> +<settings> +</settings> +<divesites> +</divesites> +<dives> +<dive number='1' date='2013-10-01' time='10:34:00' duration='45:00 min'> + <buddy>Dirk</buddy> + <suit>wet, 5mm</suit> + <divecomputer> + <depth max='18.0 m' mean='16.0 m' /> + </divecomputer> +</dive> +<dive number='2' date='2013-10-01' time='12:13:00' duration='41:00 min'> + <buddy>Linus</buddy> + <suit>wet, shorty, 3mm</suit> + <divecomputer> + <depth max='16.2 m' mean='13.5 m' /> + </divecomputer> +</dive> +<dive number='3' date='2014-10-01' time='10:02:00' duration='48:00 min'> + <buddy>Tomaz</buddy> + <suit>none</suit> + <divecomputer> + <depth max='13.3 m' mean='11.5 m' /> + </divecomputer> +</dive> +<dive number='4' date='2014-10-01' time='14:19:00' duration='34:00 min'> + <buddy>Don</buddy> + <suit>dry, Whites Fusion</suit> + <divecomputer> + <depth max='24.9 m' mean='20.1 m' /> + </divecomputer> +</dive> +<dive number='1' date='2014-04-01' time='10:00:00' duration='77:54 min'> + <notes>CCR dive</notes> + <cylinder size='2.0 l' workpressure='232.0 bar' description='Oxy2' o2='100.0%' start='190.0 bar' end='130.0 bar' use='oxygen' /> + <cylinder size='2.0 l' workpressure='232.0 bar' description='Dil2' start='185.0 bar' end='130.0 bar' use='diluent' /> + <divecomputer model='Heinrichs Weikamp OSTC 3' deviceid='01234567' diveid='76543210' dctype='CCR'> + <depth max='38.99 m' mean='17.72 m' /> + <temperature water='4.3 C' /> + <surface pressure='1.02 bar' /> + <water salinity='1000 g/l' /> + <event time='0:02 min' type='25' value='21' name='gaschange' /> + <sample time='0:02 min' depth='2.335 m' /> + <sample time='0:04 min' depth='2.916 m' /> + <sample time='0:06 min' depth='3.273 m' /> + <sample time='0:08 min' depth='3.549 m' /> + <sample time='0:10 min' depth='4.038 m' /> + <sample time='0:12 min' depth='4.517 m' temp='10.0 C' ndl='240:00 min' /> + <sample time='0:14 min' depth='5.139 m' /> + <sample time='0:16 min' depth='5.68 m' /> + <sample time='0:18 min' depth='6.088 m' /> + <sample time='0:20 min' depth='6.547 m' /> + <sample time='0:22 min' depth='6.863 m' /> + <sample time='0:24 min' depth='6.965 m' /> + <sample time='0:26 min' depth='6.995 m' /> + <sample time='0:28 min' depth='7.046 m' /> + <sample time='0:30 min' depth='6.985 m' /> + <sample time='0:32 min' depth='6.954 m' /> + <sample time='0:34 min' depth='6.995 m' /> + <sample time='0:36 min' depth='6.965 m' /> + <sample time='0:38 min' depth='6.965 m' /> + <sample time='0:40 min' depth='7.199 m' /> + <sample time='0:42 min' depth='7.271 m' /> + <sample time='0:44 min' depth='7.25 m' /> + <sample time='0:46 min' depth='7.301 m' /> + <sample time='0:48 min' depth='7.148 m' /> + <sample time='0:50 min' depth='7.036 m' /> + <sample time='0:52 min' depth='7.067 m' /> + <sample time='0:54 min' depth='6.954 m' /> + <sample time='0:56 min' depth='6.995 m' /> + <sample time='0:58 min' depth='6.995 m' /> + <sample time='1:00 min' depth='7.056 m' /> + <sample time='1:02 min' depth='7.128 m' /> + <sample time='1:04 min' depth='7.158 m' /> + <sample time='1:06 min' depth='7.067 m' /> + <sample time='1:08 min' depth='6.689 m' /> + <sample time='1:10 min' depth='6.822 m' /> + <sample time='1:12 min' depth='6.791 m' /> + <sample time='1:14 min' depth='6.893 m' /> + <sample time='1:16 min' depth='6.883 m' /> + <sample time='1:18 min' depth='6.883 m' /> + <sample time='1:20 min' depth='6.944 m' /> + <sample time='1:22 min' depth='6.751 m' /> + <sample time='1:24 min' depth='6.781 m' /> + <sample time='1:26 min' depth='6.781 m' /> + <sample time='1:28 min' depth='6.751 m' /> + <sample time='1:30 min' depth='6.74 m' /> + <sample time='1:32 min' depth='6.812 m' /> + <sample time='1:34 min' depth='6.842 m' /> + <sample time='1:36 min' depth='6.893 m' /> + <sample time='1:38 min' depth='7.005 m' /> + <sample time='1:40 min' depth='7.026 m' /> + <sample time='1:42 min' depth='6.995 m' /> + <sample time='1:44 min' depth='7.026 m' /> + <sample time='1:46 min' depth='7.077 m' /> + <sample time='1:48 min' depth='7.148 m' /> + <sample time='1:50 min' depth='7.107 m' /> + <sample time='1:52 min' depth='7.056 m' /> + <sample time='1:54 min' depth='7.036 m' /> + <sample time='1:56 min' depth='7.036 m' /> + <sample time='1:58 min' depth='7.189 m' /> + <sample time='2:00 min' depth='7.536 m' /> + <sample time='2:02 min' depth='7.729 m' /> + <sample time='2:04 min' depth='8.015 m' /> + <sample time='2:06 min' depth='8.219 m' /> + <sample time='2:08 min' depth='8.423 m' /> + <sample time='2:10 min' depth='8.239 m' /> + <sample time='2:12 min' depth='8.851 m' /> + <sample time='2:14 min' depth='9.228 m' /> + <sample time='2:16 min' depth='9.585 m' /> + <sample time='2:18 min' depth='10.003 m' /> + <sample time='2:20 min' depth='10.371 m' /> + <sample time='2:22 min' depth='10.88 m' /> + <sample time='2:24 min' depth='11.247 m' temp='9.9 C' /> + <sample time='2:26 min' depth='11.574 m' /> + <sample time='2:28 min' depth='11.92 m' /> + <sample time='2:30 min' depth='12.216 m' /> + <sample time='2:32 min' depth='12.461 m' /> + <sample time='2:34 min' depth='12.563 m' /> + <sample time='2:36 min' depth='12.716 m' temp='10.0 C' ndl='199:00 min' /> + <sample time='2:38 min' depth='13.022 m' /> + <sample time='2:40 min' depth='13.44 m' /> + <sample time='2:42 min' depth='13.889 m' /> + <sample time='2:44 min' depth='14.327 m' /> + <sample time='2:46 min' depth='14.755 m' /> + <sample time='2:48 min' depth='15.031 m' temp='9.9 C' ndl='89:00 min' /> + <sample time='2:50 min' depth='15.296 m' /> + <sample time='2:52 min' depth='15.53 m' /> + <sample time='2:54 min' depth='15.816 m' /> + <sample time='2:56 min' depth='16.05 m' /> + <sample time='2:58 min' depth='16.091 m' /> + <sample time='3:00 min' depth='16.336 m' ndl='68:00 min' /> + <sample time='3:02 min' depth='16.479 m' /> + <sample time='3:04 min' depth='16.611 m' /> + <sample time='3:06 min' depth='16.642 m' /> + <sample time='3:08 min' depth='16.876 m' /> + <sample time='3:10 min' depth='17.121 m' /> + <sample time='3:12 min' depth='17.294 m' ndl='56:00 min' cns='1%' /> + <sample time='3:14 min' depth='17.447 m' /> + <sample time='3:16 min' depth='17.498 m' /> + <sample time='3:18 min' depth='17.58 m' /> + <sample time='3:20 min' depth='17.814 m' /> + <sample time='3:22 min' depth='18.059 m' /> + <sample time='3:24 min' depth='18.345 m' ndl='46:00 min' /> + <sample time='3:26 min' depth='18.589 m' /> + <sample time='3:28 min' depth='18.855 m' /> + <sample time='3:30 min' depth='19.13 m' /> + <sample time='3:32 min' depth='19.456 m' /> + <sample time='3:34 min' depth='19.762 m' /> + <sample time='3:36 min' depth='20.007 m' temp='9.8 C' ndl='36:00 min' /> + <sample time='3:38 min' depth='20.221 m' /> + <sample time='3:40 min' depth='20.292 m' /> + <sample time='3:42 min' depth='20.252 m' /> + <sample time='3:44 min' depth='20.394 m' /> + <sample time='3:46 min' depth='20.496 m' /> + <sample time='3:48 min' depth='20.557 m' temp='9.1 C' ndl='32:00 min' /> + <sample time='3:50 min' depth='20.527 m' /> + <sample time='3:52 min' depth='20.71 m' /> + <sample time='3:54 min' depth='20.874 m' /> + <sample time='3:56 min' depth='21.027 m' /> + <sample time='3:58 min' depth='21.23 m' /> + <sample time='4:00 min' depth='21.2 m' temp='8.4 C' ndl='29:00 min' /> + <sample time='4:02 min' depth='21.19 m' /> + <sample time='4:04 min' depth='21.159 m' /> + <sample time='4:06 min' depth='21.057 m' /> + <sample time='4:08 min' depth='21.047 m' /> + <sample time='4:10 min' depth='21.088 m' /> + <sample time='4:12 min' depth='21.292 m' temp='7.8 C' /> + <sample time='4:14 min' depth='21.424 m' /> + <sample time='4:16 min' depth='21.587 m' /> + <sample time='4:18 min' depth='21.761 m' /> + <sample time='4:20 min' depth='21.924 m' /> + <sample time='4:22 min' depth='21.985 m' /> + <sample time='4:24 min' depth='22.128 m' temp='7.4 C' ndl='26:00 min' /> + <sample time='4:26 min' depth='22.281 m' /> + <sample time='4:28 min' depth='22.566 m' /> + <sample time='4:30 min' depth='22.811 m' /> + <sample time='4:32 min' depth='23.127 m' /> + <sample time='4:34 min' depth='23.413 m' /> + <sample time='4:36 min' depth='23.77 m' temp='7.0 C' ndl='22:00 min' /> + <sample time='4:38 min' depth='24.188 m' /> + <sample time='4:40 min' depth='24.534 m' /> + <sample time='4:42 min' depth='24.759 m' /> + <sample time='4:44 min' depth='24.901 m' /> + <sample time='4:46 min' depth='25.126 m' /> + <sample time='4:48 min' depth='25.279 m' temp='6.6 C' ndl='18:00 min' /> + <sample time='4:50 min' depth='25.503 m' /> + <sample time='4:52 min' depth='25.646 m' /> + <sample time='4:54 min' depth='25.799 m' /> + <sample time='4:56 min' depth='26.044 m' /> + <sample time='4:58 min' depth='26.268 m' /> + <sample time='5:00 min' depth='26.472 m' temp='6.2 C' ndl='15:00 min' /> + <sample time='5:02 min' depth='26.655 m' /> + <sample time='5:04 min' depth='26.717 m' /> + <sample time='5:06 min' depth='26.788 m' /> + <sample time='5:08 min' depth='26.839 m' /> + <sample time='5:10 min' depth='26.941 m' /> + <sample time='5:12 min' depth='27.175 m' temp='5.8 C' ndl='14:00 min' /> + <sample time='5:14 min' depth='27.441 m' /> + <sample time='5:16 min' depth='27.716 m' /> + <sample time='5:18 min' depth='28.032 m' /> + <sample time='5:20 min' depth='28.307 m' /> + <sample time='5:22 min' depth='28.491 m' /> + <sample time='5:24 min' depth='28.705 m' temp='5.6 C' ndl='12:00 min' /> + <sample time='5:26 min' depth='28.827 m' /> + <sample time='5:28 min' depth='29.011 m' /> + <sample time='5:30 min' depth='29.113 m' /> + <sample time='5:32 min' depth='29.215 m' /> + <sample time='5:34 min' depth='29.347 m' /> + <sample time='5:36 min' depth='29.623 m' temp='5.3 C' ndl='11:00 min' /> + <sample time='5:38 min' depth='29.776 m' /> + <sample time='5:40 min' depth='29.888 m' /> + <sample time='5:42 min' depth='30.01 m' /> + <sample time='5:44 min' depth='30.122 m' /> + <sample time='5:46 min' depth='30.306 m' /> + <sample time='5:48 min' depth='30.52 m' temp='5.2 C' ndl='10:00 min' /> + <sample time='5:50 min' depth='30.846 m' po2='1.2 bar' /> + <sample time='5:52 min' depth='31.05 m' /> + <sample time='5:54 min' depth='31.366 m' /> + <sample time='5:56 min' depth='31.519 m' /> + <sample time='5:58 min' depth='31.652 m' /> + <sample time='6:00 min' depth='31.815 m' temp='5.0 C' ndl='12:00 min' /> + <sample time='6:02 min' depth='32.111 m' /> + <sample time='6:04 min' depth='32.192 m' /> + <sample time='6:06 min' depth='32.437 m' /> + <sample time='6:08 min' depth='32.59 m' /> + <sample time='6:10 min' depth='32.702 m' /> + <sample time='6:12 min' depth='32.835 m' temp='4.8 C' ndl='10:00 min' /> + <sample time='6:14 min' depth='33.049 m' /> + <sample time='6:16 min' depth='33.018 m' /> + <sample time='6:18 min' depth='32.998 m' /> + <sample time='6:20 min' depth='33.569 m' /> + <sample time='6:22 min' depth='33.753 m' /> + <sample time='6:24 min' depth='33.926 m' temp='4.7 C' ndl='9:00 min' /> + <sample time='6:26 min' depth='34.038 m' /> + <sample time='6:28 min' depth='34.181 m' /> + <sample time='6:30 min' depth='34.232 m' /> + <sample time='6:32 min' depth='34.375 m' /> + <sample time='6:34 min' depth='34.364 m' /> + <sample time='6:36 min' depth='34.497 m' temp='4.6 C' /> + <sample time='6:38 min' depth='34.375 m' /> + <sample time='6:40 min' depth='34.364 m' /> + <sample time='6:42 min' depth='34.313 m' /> + <sample time='6:44 min' depth='34.354 m' /> + <sample time='6:46 min' depth='34.415 m' /> + <sample time='6:48 min' depth='34.477 m' /> + <sample time='6:50 min' depth='34.609 m' /> + <sample time='6:52 min' depth='34.721 m' /> + <sample time='6:54 min' depth='34.844 m' /> + <sample time='6:56 min' depth='34.895 m' /> + <sample time='6:58 min' depth='35.037 m' /> + <sample time='7:00 min' depth='35.109 m' temp='4.5 C' ndl='8:00 min' /> + <sample time='7:02 min' depth='35.16 m' /> + <sample time='7:04 min' depth='35.18 m' /> + <sample time='7:06 min' depth='35.17 m' /> + <sample time='7:08 min' depth='35.16 m' /> + <sample time='7:10 min' depth='35.17 m' /> + <sample time='7:12 min' depth='35.058 m' cns='2%' /> + <sample time='7:14 min' depth='34.997 m' /> + <sample time='7:16 min' depth='35.017 m' /> + <sample time='7:18 min' depth='34.905 m' /> + <sample time='7:20 min' depth='34.803 m' /> + <sample time='7:22 min' depth='34.681 m' /> + <sample time='7:24 min' depth='34.589 m' /> + <sample time='7:26 min' depth='34.436 m' /> + <sample time='7:28 min' depth='34.181 m' /> + <sample time='7:30 min' depth='34.018 m' /> + <sample time='7:32 min' depth='33.844 m' /> + <sample time='7:34 min' depth='33.681 m' /> + <sample time='7:36 min' depth='33.416 m' ndl='9:00 min' /> + <sample time='7:38 min' depth='33.039 m' /> + <sample time='7:40 min' depth='32.825 m' /> + <sample time='7:42 min' depth='32.56 m' /> + <sample time='7:44 min' depth='32.417 m' /> + <sample time='7:46 min' depth='32.305 m' /> + <sample time='7:48 min' depth='31.795 m' /> + <sample time='7:50 min' depth='31.519 m' /> + <sample time='7:52 min' depth='31.326 m' /> + <sample time='7:54 min' depth='31.652 m' /> + <sample time='7:56 min' depth='31.652 m' /> + <sample time='7:58 min' depth='31.57 m' /> + <sample time='8:00 min' depth='31.479 m' ndl='10:00 min' /> + <sample time='8:02 min' depth='31.234 m' /> + <sample time='8:04 min' depth='30.683 m' /> + <sample time='8:06 min' depth='30.255 m' /> + <sample time='8:08 min' depth='30.051 m' /> + <sample time='8:10 min' depth='30.398 m' /> + <sample time='8:12 min' depth='30.367 m' ndl='11:00 min' /> + <sample time='8:14 min' depth='30.357 m' /> + <sample time='8:16 min' depth='30.245 m' /> + <sample time='8:18 min' depth='30.133 m' /> + <sample time='8:20 min' depth='30.0 m' /> + <sample time='8:22 min' depth='29.918 m' /> + <sample time='8:24 min' depth='29.766 m' temp='4.6 C' ndl='12:00 min' /> + <sample time='8:26 min' depth='29.592 m' /> + <sample time='8:28 min' depth='29.47 m' /> + <sample time='8:30 min' depth='29.317 m' /> + <sample time='8:32 min' depth='29.164 m' /> + <sample time='8:34 min' depth='28.848 m' /> + <sample time='8:36 min' depth='28.787 m' ndl='14:00 min' /> + <sample time='8:38 min' depth='28.613 m' /> + <sample time='8:40 min' depth='28.562 m' /> + <sample time='8:42 min' depth='28.491 m' /> + <sample time='8:44 min' depth='28.318 m' /> + <sample time='8:46 min' depth='28.236 m' /> + <sample time='8:48 min' depth='28.114 m' temp='4.7 C' ndl='15:00 min' /> + <sample time='8:50 min' depth='27.93 m' /> + <sample time='8:52 min' depth='27.746 m' /> + <sample time='8:54 min' depth='27.532 m' /> + <sample time='8:56 min' depth='27.298 m' /> + <sample time='8:58 min' depth='26.992 m' /> + <sample time='9:00 min' depth='26.717 m' ndl='19:00 min' /> + <sample time='9:02 min' depth='26.207 m' /> + <sample time='9:04 min' depth='25.656 m' /> + <sample time='9:06 min' depth='25.666 m' /> + <sample time='9:08 min' depth='25.656 m' /> + <sample time='9:10 min' depth='25.503 m' /> + <sample time='9:12 min' depth='25.269 m' temp='4.8 C' ndl='25:00 min' cns='3%' /> + <sample time='9:14 min' depth='25.085 m' /> + <sample time='9:16 min' depth='24.891 m' /> + <sample time='9:18 min' depth='24.677 m' /> + <sample time='9:20 min' depth='24.483 m' /> + <sample time='9:22 min' depth='24.208 m' /> + <sample time='9:24 min' depth='23.678 m' temp='5.0 C' ndl='33:00 min' /> + <sample time='9:26 min' depth='23.229 m' /> + <sample time='9:28 min' depth='22.872 m' /> + <sample time='9:30 min' depth='23.107 m' /> + <sample time='9:32 min' depth='23.025 m' /> + <sample time='9:34 min' depth='22.964 m' /> + <sample time='9:36 min' depth='22.913 m' temp='5.2 C' ndl='41:00 min' /> + <sample time='9:38 min' depth='22.984 m' /> + <sample time='9:40 min' depth='23.046 m' /> + <sample time='9:42 min' depth='23.056 m' /> + <sample time='9:44 min' depth='23.107 m' /> + <sample time='9:46 min' depth='23.127 m' /> + <sample time='9:48 min' depth='23.158 m' temp='5.5 C' ndl='38:00 min' /> + <sample time='9:50 min' depth='23.097 m' /> + <sample time='9:52 min' depth='23.117 m' /> + <sample time='9:54 min' depth='23.158 m' /> + <sample time='9:56 min' depth='23.28 m' /> + <sample time='9:58 min' depth='23.474 m' /> + <sample time='10:00 min' depth='23.606 m' temp='5.7 C' ndl='35:00 min' /> + <sample time='10:02 min' depth='23.719 m' /> + <sample time='10:04 min' depth='23.719 m' /> + <sample time='10:06 min' depth='23.759 m' /> + <sample time='10:08 min' depth='23.729 m' /> + <sample time='10:10 min' depth='23.719 m' /> + <sample time='10:12 min' depth='23.708 m' temp='5.8 C' ndl='34:00 min' /> + <sample time='10:14 min' depth='23.729 m' /> + <sample time='10:16 min' depth='23.729 m' /> + <sample time='10:18 min' depth='23.902 m' /> + <sample time='10:20 min' depth='24.137 m' /> + <sample time='10:22 min' depth='24.249 m' /> + <sample time='10:24 min' depth='24.371 m' ndl='29:00 min' /> + <sample time='10:26 min' depth='24.565 m' /> + <sample time='10:28 min' depth='24.708 m' /> + <sample time='10:30 min' depth='24.85 m' /> + <sample time='10:32 min' depth='25.003 m' /> + <sample time='10:34 min' depth='25.156 m' /> + <sample time='10:36 min' depth='25.289 m' ndl='24:00 min' /> + <sample time='10:38 min' depth='25.279 m' /> + <sample time='10:40 min' depth='25.218 m' /> + <sample time='10:42 min' depth='25.187 m' /> + <sample time='10:44 min' depth='25.177 m' /> + <sample time='10:46 min' depth='25.187 m' /> + <sample time='10:48 min' depth='25.207 m' temp='5.6 C' /> + <sample time='10:50 min' depth='25.279 m' /> + <sample time='10:52 min' depth='25.33 m' /> + <sample time='10:54 min' depth='25.391 m' /> + <sample time='10:56 min' depth='25.422 m' /> + <sample time='10:58 min' depth='25.473 m' /> + <sample time='11:00 min' depth='25.493 m' temp='5.5 C' ndl='22:00 min' /> + <sample time='11:02 min' depth='25.564 m' /> + <sample time='11:04 min' depth='25.544 m' /> + <sample time='11:06 min' depth='25.656 m' /> + <sample time='11:08 min' depth='25.676 m' /> + <sample time='11:10 min' depth='25.697 m' /> + <sample time='11:12 min' depth='25.666 m' temp='5.4 C' ndl='21:00 min' cns='4%' /> + <sample time='11:14 min' depth='25.809 m' /> + <sample time='11:16 min' depth='25.84 m' /> + <sample time='11:18 min' depth='25.891 m' /> + <sample time='11:20 min' depth='25.972 m' /> + <sample time='11:22 min' depth='26.044 m' /> + <sample time='11:24 min' depth='26.135 m' ndl='20:00 min' /> + <sample time='11:26 min' depth='26.186 m' /> + <sample time='11:28 min' depth='26.258 m' /> + <sample time='11:30 min' depth='26.288 m' /> + <sample time='11:32 min' depth='26.349 m' /> + <sample time='11:34 min' depth='26.38 m' /> + <sample time='11:36 min' depth='26.37 m' temp='5.3 C' ndl='18:00 min' /> + <sample time='11:38 min' depth='26.349 m' /> + <sample time='11:40 min' depth='26.247 m' /> + <sample time='11:42 min' depth='26.105 m' /> + <sample time='11:44 min' depth='26.095 m' /> + <sample time='11:46 min' depth='26.054 m' /> + <sample time='11:48 min' depth='26.023 m' ndl='19:00 min' /> + <sample time='11:50 min' depth='26.033 m' /> + <sample time='11:52 min' depth='26.033 m' /> + <sample time='11:54 min' depth='26.003 m' /> + <sample time='11:56 min' depth='25.962 m' /> + <sample time='11:58 min' depth='25.942 m' /> + <sample time='12:00 min' depth='25.85 m' ndl='20:00 min' /> + <sample time='12:02 min' depth='25.789 m' /> + <sample time='12:04 min' depth='25.697 m' /> + <sample time='12:06 min' depth='25.595 m' /> + <sample time='12:08 min' depth='25.513 m' /> + <sample time='12:10 min' depth='25.36 m' /> + <sample time='12:12 min' depth='25.238 m' ndl='22:00 min' /> + <sample time='12:14 min' depth='25.136 m' /> + <sample time='12:16 min' depth='25.014 m' /> + <sample time='12:18 min' depth='24.861 m' /> + <sample time='12:20 min' depth='24.259 m' /> + <sample time='12:22 min' depth='24.147 m' /> + <sample time='12:24 min' depth='24.514 m' ndl='27:00 min' /> + <sample time='12:26 min' depth='24.555 m' /> + <sample time='12:28 min' depth='24.596 m' /> + <sample time='12:30 min' depth='24.677 m' /> + <sample time='12:32 min' depth='24.769 m' /> + <sample time='12:34 min' depth='24.861 m' /> + <sample time='12:36 min' depth='24.901 m' temp='5.4 C' ndl='24:00 min' /> + <sample time='12:38 min' depth='24.81 m' /> + <sample time='12:40 min' depth='24.698 m' /> + <sample time='12:42 min' depth='24.534 m' /> + <sample time='12:44 min' depth='24.473 m' /> + <sample time='12:46 min' depth='24.473 m' /> + <sample time='12:48 min' depth='24.463 m' ndl='27:00 min' /> + <sample time='12:50 min' depth='24.463 m' /> + <sample time='12:52 min' depth='24.463 m' /> + <sample time='12:54 min' depth='24.432 m' /> + <sample time='12:56 min' depth='24.402 m' /> + <sample time='12:58 min' depth='24.371 m' /> + <sample time='13:00 min' depth='24.31 m' temp='5.5 C' /> + <sample time='13:02 min' depth='24.259 m' /> + <sample time='13:04 min' depth='24.218 m' /> + <sample time='13:06 min' depth='24.137 m' /> + <sample time='13:08 min' depth='24.065 m' /> + <sample time='13:10 min' depth='23.974 m' /> + <sample time='13:12 min' depth='23.79 m' ndl='30:00 min' /> + <sample time='13:14 min' depth='23.627 m' /> + <sample time='13:16 min' depth='23.413 m' /> + <sample time='13:18 min' depth='23.301 m' /> + <sample time='13:20 min' depth='23.117 m' /> + <sample time='13:22 min' depth='22.791 m' /> + <sample time='13:24 min' depth='22.638 m' temp='5.7 C' ndl='39:00 min' /> + <sample time='13:26 min' depth='22.464 m' /> + <sample time='13:28 min' depth='22.291 m' /> + <sample time='13:30 min' depth='22.016 m' /> + <sample time='13:32 min' depth='21.618 m' /> + <sample time='13:34 min' depth='21.904 m' /> + <sample time='13:36 min' depth='21.842 m' temp='5.8 C' ndl='47:00 min' cns='5%' /> + <sample time='13:38 min' depth='21.771 m' /> + <sample time='13:40 min' depth='21.363 m' /> + <sample time='13:42 min' depth='20.904 m' /> + <sample time='13:44 min' depth='20.741 m' /> + <sample time='13:46 min' depth='21.078 m' /> + <sample time='13:48 min' depth='21.078 m' temp='6.1 C' ndl='55:00 min' /> + <sample time='13:50 min' depth='21.016 m' /> + <sample time='13:52 min' depth='20.955 m' /> + <sample time='13:54 min' depth='20.914 m' /> + <sample time='13:56 min' depth='20.874 m' /> + <sample time='13:58 min' depth='20.802 m' /> + <sample time='14:00 min' depth='20.68 m' temp='6.4 C' ndl='61:00 min' /> + <sample time='14:02 min' depth='20.252 m' /> + <sample time='14:04 min' depth='19.884 m' /> + <sample time='14:06 min' depth='19.589 m' /> + <sample time='14:08 min' depth='18.987 m' /> + <sample time='14:10 min' depth='18.773 m' /> + <sample time='14:12 min' depth='18.906 m' temp='6.7 C' ndl='102:00 min' /> + <sample time='14:14 min' depth='18.783 m' /> + <sample time='14:16 min' depth='18.6 m' /> + <sample time='14:18 min' depth='18.416 m' /> + <sample time='14:20 min' depth='18.222 m' /> + <sample time='14:22 min' depth='18.018 m' /> + <sample time='14:24 min' depth='17.845 m' temp='7.2 C' ndl='159:00 min' /> + <sample time='14:26 min' depth='17.529 m' /> + <sample time='14:28 min' depth='16.785 m' /> + <sample time='14:30 min' depth='16.173 m' /> + <sample time='14:32 min' depth='16.254 m' /> + <sample time='14:34 min' depth='16.193 m' /> + <sample time='14:36 min' depth='16.04 m' temp='8.1 C' ndl='240:00 min' /> + <sample time='14:38 min' depth='16.03 m' /> + <sample time='14:40 min' depth='16.091 m' /> + <sample time='14:42 min' depth='15.918 m' /> + <sample time='14:44 min' depth='15.877 m' /> + <sample time='14:46 min' depth='15.704 m' /> + <sample time='14:48 min' depth='15.53 m' temp='8.7 C' /> + <sample time='14:50 min' depth='15.337 m' /> + <sample time='14:52 min' depth='14.735 m' /> + <sample time='14:54 min' depth='14.398 m' /> + <sample time='14:56 min' depth='14.684 m' /> + <sample time='14:58 min' depth='14.511 m' /> + <sample time='15:00 min' depth='14.368 m' temp='9.2 C' /> + <sample time='15:02 min' depth='14.358 m' /> + <sample time='15:04 min' depth='14.225 m' /> + <sample time='15:06 min' depth='14.143 m' /> + <sample time='15:08 min' depth='13.929 m' /> + <sample time='15:10 min' depth='13.664 m' /> + <sample time='15:12 min' depth='13.246 m' temp='9.5 C' /> + <sample time='15:14 min' depth='12.583 m' /> + <sample time='15:16 min' depth='12.787 m' /> + <sample time='15:18 min' depth='12.767 m' /> + <sample time='15:20 min' depth='12.726 m' /> + <sample time='15:22 min' depth='12.593 m' /> + <sample time='15:24 min' depth='12.461 m' temp='9.7 C' /> + <sample time='15:26 min' depth='12.288 m' /> + <sample time='15:28 min' depth='11.747 m' /> + <sample time='15:30 min' depth='11.472 m' /> + <sample time='15:32 min' depth='11.869 m' /> + <sample time='15:34 min' depth='11.869 m' /> + <sample time='15:36 min' depth='11.91 m' temp='9.8 C' cns='6%' /> + <sample time='15:38 min' depth='11.92 m' /> + <sample time='15:40 min' depth='11.91 m' /> + <sample time='15:42 min' depth='11.859 m' /> + <sample time='15:44 min' depth='11.819 m' /> + <sample time='15:46 min' depth='11.808 m' /> + <sample time='15:48 min' depth='11.808 m' /> + <sample time='15:50 min' depth='11.829 m' /> + <sample time='15:52 min' depth='11.829 m' /> + <sample time='15:54 min' depth='11.839 m' /> + <sample time='15:56 min' depth='11.849 m' /> + <sample time='15:58 min' depth='11.92 m' /> + <sample time='16:00 min' depth='11.971 m' /> + <sample time='16:02 min' depth='11.951 m' /> + <sample time='16:04 min' depth='11.941 m' /> + <sample time='16:06 min' depth='11.951 m' /> + <sample time='16:08 min' depth='11.971 m' /> + <sample time='16:10 min' depth='12.094 m' /> + <sample time='16:12 min' depth='12.175 m' /> + <sample time='16:14 min' depth='12.277 m' /> + <sample time='16:16 min' depth='12.339 m' /> + <sample time='16:18 min' depth='12.471 m' /> + <sample time='16:20 min' depth='12.553 m' /> + <sample time='16:22 min' depth='12.665 m' /> + <sample time='16:24 min' depth='12.828 m' /> + <sample time='16:26 min' depth='12.91 m' /> + <sample time='16:28 min' depth='13.001 m' /> + <sample time='16:30 min' depth='12.94 m' /> + <sample time='16:32 min' depth='12.859 m' /> + <sample time='16:34 min' depth='12.797 m' /> + <sample time='16:36 min' depth='12.675 m' /> + <sample time='16:38 min' depth='12.634 m' /> + <sample time='16:40 min' depth='12.716 m' /> + <sample time='16:42 min' depth='12.787 m' /> + <sample time='16:44 min' depth='12.848 m' /> + <sample time='16:46 min' depth='12.93 m' /> + <sample time='16:48 min' depth='13.001 m' /> + <sample time='16:50 min' depth='13.185 m' /> + <sample time='16:52 min' depth='13.338 m' /> + <sample time='16:54 min' depth='13.562 m' /> + <sample time='16:56 min' depth='13.756 m' /> + <sample time='16:58 min' depth='14.021 m' /> + <sample time='17:00 min' depth='14.143 m' /> + <sample time='17:02 min' depth='14.347 m' /> + <sample time='17:04 min' depth='14.429 m' /> + <sample time='17:06 min' depth='14.46 m' /> + <sample time='17:08 min' depth='14.46 m' /> + <sample time='17:10 min' depth='14.47 m' /> + <sample time='17:12 min' depth='14.623 m' /> + <sample time='17:14 min' depth='14.704 m' /> + <sample time='17:16 min' depth='14.806 m' /> + <sample time='17:18 min' depth='14.878 m' /> + <sample time='17:20 min' depth='14.98 m' /> + <sample time='17:22 min' depth='15.031 m' /> + <sample time='17:24 min' depth='14.969 m' /> + <sample time='17:26 min' depth='15.102 m' /> + <sample time='17:28 min' depth='15.102 m' /> + <sample time='17:30 min' depth='15.112 m' /> + <sample time='17:32 min' depth='15.082 m' /> + <sample time='17:34 min' depth='15.041 m' /> + <sample time='17:36 min' depth='15.061 m' /> + <sample time='17:38 min' depth='15.031 m' /> + <sample time='17:40 min' depth='15.082 m' /> + <sample time='17:42 min' depth='15.153 m' /> + <sample time='17:44 min' depth='15.224 m' /> + <sample time='17:46 min' depth='15.337 m' /> + <sample time='17:48 min' depth='15.469 m' /> + <sample time='17:50 min' depth='15.602 m' /> + <sample time='17:52 min' depth='15.765 m' /> + <sample time='17:54 min' depth='15.857 m' /> + <sample time='17:56 min' depth='15.867 m' /> + <sample time='17:58 min' depth='15.867 m' /> + <sample time='18:00 min' depth='15.795 m' cns='7%' /> + <sample time='18:02 min' depth='15.785 m' /> + <sample time='18:04 min' depth='15.836 m' /> + <sample time='18:06 min' depth='15.816 m' /> + <sample time='18:08 min' depth='15.857 m' /> + <sample time='18:10 min' depth='15.877 m' /> + <sample time='18:12 min' depth='15.938 m' temp='9.9 C' /> + <sample time='18:14 min' depth='15.928 m' /> + <sample time='18:16 min' depth='15.979 m' /> + <sample time='18:18 min' depth='15.999 m' /> + <sample time='18:20 min' depth='16.02 m' /> + <sample time='18:22 min' depth='16.071 m' /> + <sample time='18:24 min' depth='16.091 m' /> + <sample time='18:26 min' depth='16.203 m' /> + <sample time='18:28 min' depth='16.275 m' /> + <sample time='18:30 min' depth='16.397 m' /> + <sample time='18:32 min' depth='16.519 m' /> + <sample time='18:34 min' depth='16.581 m' /> + <sample time='18:36 min' depth='16.795 m' /> + <sample time='18:38 min' depth='16.927 m' /> + <sample time='18:40 min' depth='17.08 m' /> + <sample time='18:42 min' depth='17.09 m' /> + <sample time='18:44 min' depth='17.101 m' /> + <sample time='18:46 min' depth='17.111 m' /> + <sample time='18:48 min' depth='17.223 m' /> + <sample time='18:50 min' depth='17.407 m' /> + <sample time='18:52 min' depth='17.519 m' /> + <sample time='18:54 min' depth='17.57 m' /> + <sample time='18:56 min' depth='17.539 m' /> + <sample time='18:58 min' depth='17.509 m' /> + <sample time='19:00 min' depth='17.478 m' ndl='205:00 min' /> + <sample time='19:02 min' depth='17.468 m' /> + <sample time='19:04 min' depth='17.447 m' /> + <sample time='19:06 min' depth='17.519 m' /> + <sample time='19:08 min' depth='17.56 m' /> + <sample time='19:10 min' depth='17.641 m' /> + <sample time='19:12 min' depth='17.702 m' ndl='179:00 min' /> + <sample time='19:14 min' depth='17.804 m' /> + <sample time='19:16 min' depth='17.916 m' /> + <sample time='19:18 min' depth='17.988 m' /> + <sample time='19:20 min' depth='18.029 m' /> + <sample time='19:22 min' depth='18.069 m' /> + <sample time='19:24 min' depth='18.171 m' ndl='139:00 min' /> + <sample time='19:26 min' depth='18.222 m' /> + <sample time='19:28 min' depth='18.294 m' /> + <sample time='19:30 min' depth='18.426 m' /> + <sample time='19:32 min' depth='18.416 m' /> + <sample time='19:34 min' depth='18.416 m' /> + <sample time='19:36 min' depth='18.426 m' temp='9.8 C' ndl='126:00 min' /> + <sample time='19:38 min' depth='18.375 m' /> + <sample time='19:40 min' depth='18.396 m' /> + <sample time='19:42 min' depth='18.447 m' /> + <sample time='19:44 min' depth='18.549 m' /> + <sample time='19:46 min' depth='18.304 m' /> + <sample time='19:48 min' depth='18.467 m' temp='9.5 C' ndl='132:00 min' /> + <sample time='19:50 min' depth='18.824 m' /> + <sample time='19:52 min' depth='18.946 m' /> + <sample time='19:54 min' depth='19.028 m' /> + <sample time='19:56 min' depth='19.008 m' /> + <sample time='19:58 min' depth='18.926 m' /> + <sample time='20:00 min' depth='18.885 m' temp='9.1 C' ndl='104:00 min' cns='8%' /> + <sample time='20:02 min' depth='19.028 m' /> + <sample time='20:04 min' depth='19.069 m' /> + <sample time='20:06 min' depth='19.16 m' /> + <sample time='20:08 min' depth='19.252 m' /> + <sample time='20:10 min' depth='19.293 m' /> + <sample time='20:12 min' depth='19.293 m' temp='8.7 C' ndl='87:00 min' /> + <sample time='20:14 min' depth='19.283 m' /> + <sample time='20:16 min' depth='19.313 m' /> + <sample time='20:18 min' depth='19.446 m' /> + <sample time='20:20 min' depth='19.548 m' /> + <sample time='20:22 min' depth='19.63 m' /> + <sample time='20:24 min' depth='19.67 m' temp='8.4 C' ndl='77:00 min' /> + <sample time='20:26 min' depth='19.721 m' /> + <sample time='20:28 min' depth='19.752 m' /> + <sample time='20:30 min' depth='19.813 m' /> + <sample time='20:32 min' depth='19.864 m' /> + <sample time='20:34 min' depth='19.905 m' /> + <sample time='20:36 min' depth='19.966 m' temp='8.1 C' ndl='71:00 min' /> + <sample time='20:38 min' depth='20.027 m' /> + <sample time='20:40 min' depth='20.078 m' /> + <sample time='20:42 min' depth='20.16 m' /> + <sample time='20:44 min' depth='20.272 m' /> + <sample time='20:46 min' depth='20.394 m' /> + <sample time='20:48 min' depth='20.527 m' temp='7.9 C' ndl='61:00 min' /> + <sample time='20:50 min' depth='20.649 m' /> + <sample time='20:52 min' depth='20.659 m' /> + <sample time='20:54 min' depth='20.68 m' /> + <sample time='20:56 min' depth='20.598 m' /> + <sample time='20:58 min' depth='20.619 m' /> + <sample time='21:00 min' depth='20.629 m' temp='7.6 C' ndl='60:00 min' /> + <sample time='21:02 min' depth='20.659 m' /> + <sample time='21:04 min' depth='20.761 m' /> + <sample time='21:06 min' depth='20.812 m' /> + <sample time='21:08 min' depth='20.863 m' /> + <sample time='21:10 min' depth='20.945 m' /> + <sample time='21:12 min' depth='20.996 m' temp='7.4 C' ndl='55:00 min' /> + <sample time='21:14 min' depth='21.057 m' /> + <sample time='21:16 min' depth='21.129 m' /> + <sample time='21:18 min' depth='21.19 m' /> + <sample time='21:20 min' depth='21.261 m' /> + <sample time='21:22 min' depth='21.404 m' /> + <sample time='21:24 min' depth='21.485 m' temp='7.3 C' ndl='49:00 min' /> + <sample time='21:26 min' depth='21.638 m' /> + <sample time='21:28 min' depth='21.659 m' /> + <sample time='21:30 min' depth='21.638 m' /> + <sample time='21:32 min' depth='21.618 m' /> + <sample time='21:34 min' depth='21.587 m' /> + <sample time='21:36 min' depth='21.598 m' temp='7.1 C' ndl='48:00 min' /> + <sample time='21:38 min' depth='21.638 m' /> + <sample time='21:40 min' depth='21.7 m' /> + <sample time='21:42 min' depth='21.771 m' /> + <sample time='21:44 min' depth='21.74 m' /> + <sample time='21:46 min' depth='21.791 m' /> + <sample time='21:48 min' depth='21.812 m' temp='7.0 C' ndl='45:00 min' /> + <sample time='21:50 min' depth='21.863 m' /> + <sample time='21:52 min' depth='21.924 m' /> + <sample time='21:54 min' depth='21.975 m' /> + <sample time='21:56 min' depth='21.954 m' /> + <sample time='21:58 min' depth='21.873 m' /> + <sample time='22:00 min' depth='21.751 m' temp='6.8 C' cns='9%' /> + <sample time='22:02 min' depth='21.669 m' /> + <sample time='22:04 min' depth='21.608 m' /> + <sample time='22:06 min' depth='21.516 m' /> + <sample time='22:08 min' depth='21.485 m' /> + <sample time='22:10 min' depth='21.455 m' /> + <sample time='22:12 min' depth='21.445 m' temp='6.7 C' ndl='48:00 min' /> + <sample time='22:14 min' depth='21.394 m' /> + <sample time='22:16 min' depth='21.353 m' /> + <sample time='22:18 min' depth='21.22 m' /> + <sample time='22:20 min' depth='21.139 m' /> + <sample time='22:22 min' depth='21.037 m' /> + <sample time='22:24 min' depth='20.955 m' ndl='54:00 min' /> + <sample time='22:26 min' depth='20.945 m' /> + <sample time='22:28 min' depth='20.925 m' /> + <sample time='22:30 min' depth='20.945 m' /> + <sample time='22:32 min' depth='20.986 m' /> + <sample time='22:34 min' depth='20.884 m' /> + <sample time='22:36 min' depth='20.843 m' temp='6.8 C' ndl='55:00 min' /> + <sample time='22:38 min' depth='20.772 m' /> + <sample time='22:40 min' depth='20.557 m' /> + <sample time='22:42 min' depth='20.374 m' /> + <sample time='22:44 min' depth='20.7 m' /> + <sample time='22:46 min' depth='20.7 m' /> + <sample time='22:48 min' depth='20.772 m' ndl='56:00 min' /> + <sample time='22:50 min' depth='20.833 m' /> + <sample time='22:52 min' depth='20.965 m' /> + <sample time='22:54 min' depth='21.19 m' /> + <sample time='22:56 min' depth='21.271 m' /> + <sample time='22:58 min' depth='21.465 m' /> + <sample time='23:00 min' depth='21.598 m' temp='6.9 C' ndl='47:00 min' /> + <sample time='23:02 min' depth='21.71 m' /> + <sample time='23:04 min' depth='21.832 m' /> + <sample time='23:06 min' depth='21.934 m' /> + <sample time='23:08 min' depth='22.016 m' /> + <sample time='23:10 min' depth='22.118 m' /> + <sample time='23:12 min' depth='22.342 m' ndl='40:00 min' /> + <sample time='23:14 min' depth='22.373 m' /> + <sample time='23:16 min' depth='22.495 m' /> + <sample time='23:18 min' depth='22.536 m' /> + <sample time='23:20 min' depth='22.515 m' /> + <sample time='23:22 min' depth='22.464 m' /> + <sample time='23:24 min' depth='22.342 m' temp='6.7 C' ndl='38:00 min' /> + <sample time='23:26 min' depth='22.271 m' /> + <sample time='23:28 min' depth='22.199 m' /> + <sample time='23:30 min' depth='22.209 m' /> + <sample time='23:32 min' depth='22.199 m' /> + <sample time='23:34 min' depth='22.158 m' /> + <sample time='23:36 min' depth='22.097 m' temp='6.6 C' ndl='40:00 min' /> + <sample time='23:38 min' depth='21.954 m' /> + <sample time='23:40 min' depth='21.863 m' /> + <sample time='23:42 min' depth='21.7 m' /> + <sample time='23:44 min' depth='21.577 m' /> + <sample time='23:46 min' depth='21.475 m' /> + <sample time='23:48 min' depth='21.383 m' ndl='48:00 min' /> + <sample time='23:50 min' depth='20.965 m' /> + <sample time='23:52 min' depth='20.68 m' /> + <sample time='23:54 min' depth='20.761 m' /> + <sample time='23:56 min' depth='20.598 m' /> + <sample time='23:58 min' depth='20.537 m' /> + <sample time='24:00 min' depth='20.201 m' ndl='60:00 min' /> + <sample time='24:02 min' depth='19.925 m' /> + <sample time='24:04 min' depth='19.976 m' /> + <sample time='24:06 min' depth='20.099 m' /> + <sample time='24:08 min' depth='20.17 m' /> + <sample time='24:10 min' depth='20.252 m' /> + <sample time='24:12 min' depth='20.313 m' temp='6.8 C' ndl='61:00 min' /> + <sample time='24:14 min' depth='20.303 m' /> + <sample time='24:16 min' depth='20.364 m' /> + <sample time='24:18 min' depth='20.343 m' /> + <sample time='24:20 min' depth='20.323 m' /> + <sample time='24:22 min' depth='20.354 m' /> + <sample time='24:24 min' depth='20.364 m' temp='7.0 C' ndl='60:00 min' cns='10%' /> + <sample time='24:26 min' depth='20.466 m' /> + <sample time='24:28 min' depth='20.547 m' /> + <sample time='24:30 min' depth='20.639 m' /> + <sample time='24:32 min' depth='20.68 m' /> + <sample time='24:34 min' depth='20.71 m' /> + <sample time='24:36 min' depth='20.782 m' ndl='54:00 min' /> + <sample time='24:38 min' depth='20.833 m' /> + <sample time='24:40 min' depth='20.772 m' /> + <sample time='24:42 min' depth='20.874 m' /> + <sample time='24:44 min' depth='21.016 m' /> + <sample time='24:46 min' depth='21.016 m' /> + <sample time='24:48 min' depth='21.088 m' ndl='50:00 min' /> + <sample time='24:50 min' depth='21.159 m' /> + <sample time='24:52 min' depth='21.383 m' /> + <sample time='24:54 min' depth='21.414 m' /> + <sample time='24:56 min' depth='21.434 m' /> + <sample time='24:58 min' depth='21.485 m' /> + <sample time='25:00 min' depth='21.598 m' ndl='45:00 min' /> + <sample time='25:02 min' depth='21.72 m' /> + <sample time='25:04 min' depth='21.751 m' /> + <sample time='25:06 min' depth='21.781 m' /> + <sample time='25:08 min' depth='21.873 m' /> + <sample time='25:10 min' depth='21.853 m' /> + <sample time='25:12 min' depth='21.771 m' temp='6.9 C' ndl='42:00 min' /> + <sample time='25:14 min' depth='21.536 m' /> + <sample time='25:16 min' depth='21.21 m' /> + <sample time='25:18 min' depth='20.7 m' /> + <sample time='25:20 min' depth='20.894 m' /> + <sample time='25:22 min' depth='20.853 m' /> + <sample time='25:24 min' depth='21.016 m' temp='6.8 C' ndl='52:00 min' /> + <sample time='25:26 min' depth='20.955 m' /> + <sample time='25:28 min' depth='20.976 m' /> + <sample time='25:30 min' depth='20.945 m' /> + <sample time='25:32 min' depth='20.976 m' /> + <sample time='25:34 min' depth='21.149 m' /> + <sample time='25:36 min' depth='21.353 m' ndl='47:00 min' /> + <sample time='25:38 min' depth='21.567 m' /> + <sample time='25:40 min' depth='21.853 m' /> + <sample time='25:42 min' depth='22.169 m' /> + <sample time='25:44 min' depth='22.505 m' /> + <sample time='25:46 min' depth='22.811 m' /> + <sample time='25:48 min' depth='23.025 m' ndl='32:00 min' /> + <sample time='25:50 min' depth='23.199 m' /> + <sample time='25:52 min' depth='23.402 m' /> + <sample time='25:54 min' depth='23.535 m' /> + <sample time='25:56 min' depth='23.79 m' /> + <sample time='25:58 min' depth='24.004 m' /> + <sample time='26:00 min' depth='24.29 m' temp='6.6 C' ndl='24:00 min' /> + <sample time='26:02 min' depth='24.606 m' /> + <sample time='26:04 min' depth='25.014 m' /> + <sample time='26:06 min' depth='25.411 m' /> + <sample time='26:08 min' depth='25.717 m' /> + <sample time='26:10 min' depth='26.033 m' /> + <sample time='26:12 min' depth='26.36 m' temp='6.4 C' ndl='17:00 min' /> + <sample time='26:14 min' depth='26.666 m' /> + <sample time='26:16 min' depth='26.87 m' /> + <sample time='26:18 min' depth='26.971 m' /> + <sample time='26:20 min' depth='27.033 m' /> + <sample time='26:22 min' depth='27.124 m' /> + <sample time='26:24 min' depth='27.196 m' temp='6.1 C' ndl='14:00 min' cns='11%' /> + <sample time='26:26 min' depth='27.369 m' /> + <sample time='26:28 min' depth='27.522 m' /> + <sample time='26:30 min' depth='27.634 m' /> + <sample time='26:32 min' depth='27.716 m' /> + <sample time='26:34 min' depth='27.818 m' /> + <sample time='26:36 min' depth='27.91 m' temp='5.8 C' ndl='12:00 min' /> + <sample time='26:38 min' depth='28.093 m' /> + <sample time='26:40 min' depth='28.399 m' /> + <sample time='26:42 min' depth='28.552 m' /> + <sample time='26:44 min' depth='28.827 m' /> + <sample time='26:46 min' depth='28.991 m' /> + <sample time='26:48 min' depth='28.97 m' temp='5.5 C' ndl='11:00 min' /> + <sample time='26:50 min' depth='29.011 m' /> + <sample time='26:52 min' depth='28.96 m' /> + <sample time='26:54 min' depth='28.817 m' /> + <sample time='26:56 min' depth='28.705 m' /> + <sample time='26:58 min' depth='28.817 m' /> + <sample time='27:00 min' depth='28.419 m' temp='5.2 C' /> + <sample time='27:02 min' depth='28.328 m' /> + <sample time='27:04 min' depth='28.267 m' /> + <sample time='27:06 min' depth='28.154 m' /> + <sample time='27:08 min' depth='28.063 m' /> + <sample time='27:10 min' depth='28.083 m' /> + <sample time='27:12 min' depth='27.971 m' temp='5.0 C' ndl='12:00 min' /> + <sample time='27:14 min' depth='27.95 m' /> + <sample time='27:16 min' depth='27.94 m' /> + <sample time='27:18 min' depth='27.91 m' /> + <sample time='27:20 min' depth='27.889 m' /> + <sample time='27:22 min' depth='27.879 m' /> + <sample time='27:24 min' depth='27.746 m' temp='4.9 C' /> + <sample time='27:26 min' depth='27.604 m' /> + <sample time='27:28 min' depth='27.492 m' /> + <sample time='27:30 min' depth='27.43 m' /> + <sample time='27:32 min' depth='27.451 m' /> + <sample time='27:34 min' depth='27.43 m' /> + <sample time='27:36 min' depth='27.226 m' temp='4.8 C' /> + <sample time='27:38 min' depth='27.084 m' /> + <sample time='27:40 min' depth='27.349 m' /> + <sample time='27:42 min' depth='27.379 m' /> + <sample time='27:44 min' depth='27.41 m' /> + <sample time='27:46 min' depth='27.502 m' /> + <sample time='27:48 min' depth='27.624 m' /> + <sample time='27:50 min' depth='27.665 m' /> + <sample time='27:52 min' depth='27.767 m' /> + <sample time='27:54 min' depth='27.787 m' /> + <sample time='27:56 min' depth='27.777 m' /> + <sample time='27:58 min' depth='27.757 m' /> + <sample time='28:00 min' depth='27.808 m' ndl='11:00 min' /> + <sample time='28:02 min' depth='27.838 m' /> + <sample time='28:04 min' depth='27.869 m' /> + <sample time='28:06 min' depth='27.869 m' /> + <sample time='28:08 min' depth='27.797 m' /> + <sample time='28:10 min' depth='27.41 m' /> + <sample time='28:12 min' depth='27.175 m' ndl='12:00 min' /> + <sample time='28:14 min' depth='27.43 m' /> + <sample time='28:16 min' depth='27.512 m' /> + <sample time='28:18 min' depth='27.645 m' /> + <sample time='28:20 min' depth='27.726 m' /> + <sample time='28:22 min' depth='27.818 m' /> + <sample time='28:24 min' depth='27.93 m' temp='4.9 C' ndl='11:00 min' cns='12%' /> + <sample time='28:26 min' depth='28.022 m' /> + <sample time='28:28 min' depth='28.022 m' /> + <sample time='28:30 min' depth='27.981 m' /> + <sample time='28:32 min' depth='27.92 m' /> + <sample time='28:34 min' depth='27.961 m' /> + <sample time='28:36 min' depth='28.022 m' temp='4.8 C' ndl='10:00 min' /> + <sample time='28:38 min' depth='28.001 m' /> + <sample time='28:40 min' depth='27.828 m' /> + <sample time='28:42 min' depth='27.828 m' /> + <sample time='28:44 min' depth='27.889 m' /> + <sample time='28:46 min' depth='28.001 m' /> + <sample time='28:48 min' depth='28.012 m' /> + <sample time='28:50 min' depth='28.012 m' /> + <sample time='28:52 min' depth='27.991 m' /> + <sample time='28:54 min' depth='27.95 m' /> + <sample time='28:56 min' depth='27.93 m' /> + <sample time='28:58 min' depth='27.92 m' /> + <sample time='29:00 min' depth='27.91 m' temp='4.7 C' /> + <sample time='29:02 min' depth='27.991 m' /> + <sample time='29:04 min' depth='28.022 m' /> + <sample time='29:06 min' depth='28.073 m' /> + <sample time='29:08 min' depth='28.063 m' /> + <sample time='29:10 min' depth='28.032 m' /> + <sample time='29:12 min' depth='28.093 m' /> + <sample time='29:14 min' depth='28.144 m' /> + <sample time='29:16 min' depth='28.256 m' /> + <sample time='29:18 min' depth='28.379 m' /> + <sample time='29:20 min' depth='28.542 m' /> + <sample time='29:22 min' depth='28.685 m' /> + <sample time='29:24 min' depth='28.817 m' ndl='9:00 min' /> + <sample time='29:26 min' depth='29.062 m' /> + <sample time='29:28 min' depth='29.164 m' /> + <sample time='29:30 min' depth='29.245 m' /> + <sample time='29:32 min' depth='29.429 m' /> + <sample time='29:34 min' depth='29.664 m' /> + <sample time='29:36 min' depth='29.888 m' ndl='7:00 min' /> + <sample time='29:38 min' depth='29.98 m' /> + <sample time='29:40 min' depth='29.949 m' /> + <sample time='29:42 min' depth='29.908 m' /> + <sample time='29:44 min' depth='29.99 m' /> + <sample time='29:46 min' depth='30.031 m' /> + <sample time='29:48 min' depth='30.184 m' /> + <sample time='29:50 min' depth='30.367 m' /> + <sample time='29:52 min' depth='30.561 m' /> + <sample time='29:54 min' depth='30.734 m' /> + <sample time='29:56 min' depth='30.775 m' /> + <sample time='29:58 min' depth='30.775 m' /> + <sample time='30:00 min' depth='30.806 m' temp='4.6 C' ndl='6:00 min' /> + <sample time='30:02 min' depth='30.836 m' /> + <sample time='30:04 min' depth='30.928 m' /> + <sample time='30:06 min' depth='31.02 m' /> + <sample time='30:08 min' depth='31.132 m' /> + <sample time='30:10 min' depth='31.336 m' /> + <sample time='30:12 min' depth='31.56 m' /> + <sample time='30:14 min' depth='31.825 m' /> + <sample time='30:16 min' depth='32.029 m' /> + <sample time='30:18 min' depth='32.192 m' /> + <sample time='30:20 min' depth='32.325 m' /> + <sample time='30:22 min' depth='32.488 m' /> + <sample time='30:24 min' depth='32.692 m' temp='4.5 C' ndl='5:00 min' /> + <sample time='30:26 min' depth='32.937 m' /> + <sample time='30:28 min' depth='33.12 m' /> + <sample time='30:30 min' depth='33.222 m' /> + <sample time='30:32 min' depth='33.284 m' /> + <sample time='30:34 min' depth='33.335 m' /> + <sample time='30:36 min' depth='33.477 m' ndl='4:00 min' /> + <sample time='30:38 min' depth='33.651 m' /> + <sample time='30:40 min' depth='33.875 m' /> + <sample time='30:42 min' depth='34.171 m' /> + <sample time='30:44 min' depth='34.375 m' /> + <sample time='30:46 min' depth='34.446 m' /> + <sample time='30:48 min' depth='34.548 m' cns='13%' /> + <sample time='30:50 min' depth='34.619 m' /> + <sample time='30:52 min' depth='34.752 m' /> + <sample time='30:54 min' depth='35.058 m' /> + <sample time='30:56 min' depth='35.17 m' /> + <sample time='30:58 min' depth='35.333 m' /> + <sample time='31:00 min' depth='35.445 m' ndl='3:00 min' /> + <sample time='31:02 min' depth='35.578 m' /> + <sample time='31:04 min' depth='35.741 m' /> + <sample time='31:06 min' depth='35.945 m' /> + <sample time='31:08 min' depth='36.169 m' /> + <sample time='31:10 min' depth='36.496 m' /> + <sample time='31:12 min' depth='36.74 m' temp='4.4 C' /> + <sample time='31:14 min' depth='36.914 m' /> + <sample time='31:16 min' depth='37.128 m' /> + <sample time='31:18 min' depth='37.424 m' /> + <sample time='31:20 min' depth='37.515 m' /> + <sample time='31:22 min' depth='37.597 m' /> + <sample time='31:24 min' depth='37.689 m' ndl='2:00 min' /> + <sample time='31:26 min' depth='37.811 m' /> + <sample time='31:28 min' depth='37.903 m' /> + <sample time='31:30 min' depth='38.046 m' /> + <sample time='31:32 min' depth='38.158 m' /> + <sample time='31:34 min' depth='38.423 m' /> + <sample time='31:36 min' depth='38.474 m' /> + <sample time='31:38 min' depth='38.535 m' /> + <sample time='31:40 min' depth='38.586 m' /> + <sample time='31:42 min' depth='38.647 m' /> + <sample time='31:44 min' depth='38.668 m' /> + <sample time='31:46 min' depth='38.668 m' /> + <sample time='31:48 min' depth='38.688 m' temp='4.3 C' /> + <sample time='31:50 min' depth='38.749 m' /> + <sample time='31:52 min' depth='38.749 m' /> + <sample time='31:54 min' depth='38.759 m' /> + <sample time='31:56 min' depth='38.77 m' /> + <sample time='31:58 min' depth='38.8 m' /> + <sample time='32:00 min' depth='38.759 m' /> + <sample time='32:02 min' depth='38.79 m' /> + <sample time='32:04 min' depth='38.759 m' /> + <sample time='32:06 min' depth='38.708 m' /> + <sample time='32:08 min' depth='38.708 m' /> + <sample time='32:10 min' depth='38.708 m' /> + <sample time='32:12 min' depth='38.729 m' ndl='1:00 min' /> + <sample time='32:14 min' depth='38.77 m' /> + <sample time='32:16 min' depth='38.861 m' /> + <sample time='32:18 min' depth='38.882 m' /> + <sample time='32:20 min' depth='38.892 m' /> + <sample time='32:22 min' depth='38.923 m' /> + <sample time='32:24 min' depth='38.974 m' /> + <sample time='32:26 min' depth='38.974 m' /> + <sample time='32:28 min' depth='38.902 m' /> + <sample time='32:30 min' depth='38.423 m' /> + <sample time='32:32 min' depth='38.606 m' /> + <sample time='32:34 min' depth='38.78 m' /> + <sample time='32:36 min' depth='38.749 m' /> + <sample time='32:38 min' depth='38.729 m' /> + <sample time='32:40 min' depth='38.739 m' /> + <sample time='32:42 min' depth='38.759 m' /> + <sample time='32:44 min' depth='38.78 m' /> + <sample time='32:46 min' depth='38.678 m' /> + <sample time='32:48 min' depth='38.79 m' cns='14%' /> + <sample time='32:50 min' depth='38.698 m' /> + <sample time='32:52 min' depth='38.596 m' /> + <sample time='32:54 min' depth='38.494 m' /> + <sample time='32:56 min' depth='38.341 m' /> + <sample time='32:58 min' depth='38.178 m' /> + <sample time='33:00 min' depth='38.076 m' /> + <sample time='33:02 min' depth='37.984 m' /> + <sample time='33:04 min' depth='37.974 m' /> + <sample time='33:06 min' depth='38.056 m' /> + <sample time='33:08 min' depth='38.107 m' /> + <sample time='33:10 min' depth='38.097 m' /> + <sample time='33:12 min' depth='38.137 m' /> + <sample time='33:14 min' depth='38.117 m' /> + <sample time='33:16 min' depth='38.046 m' /> + <sample time='33:18 min' depth='38.005 m' /> + <sample time='33:20 min' depth='37.893 m' /> + <sample time='33:22 min' depth='37.852 m' /> + <sample time='33:24 min' depth='37.811 m' ndl='0:00 min' /> + <sample time='33:26 min' depth='37.638 m' /> + <sample time='33:28 min' depth='37.546 m' /> + <sample time='33:30 min' depth='37.444 m' /> + <sample time='33:32 min' depth='37.24 m' /> + <sample time='33:34 min' depth='37.169 m' /> + <sample time='33:36 min' depth='37.077 m' /> + <sample time='33:38 min' depth='36.863 m' /> + <sample time='33:40 min' depth='36.363 m' /> + <sample time='33:42 min' depth='36.027 m' /> + <sample time='33:44 min' depth='36.292 m' /> + <sample time='33:46 min' depth='36.118 m' /> + <sample time='33:48 min' depth='36.098 m' /> + <sample time='33:50 min' depth='35.853 m' /> + <sample time='33:52 min' depth='35.67 m' /> + <sample time='33:54 min' depth='35.323 m' /> + <sample time='33:56 min' depth='34.874 m' /> + <sample time='33:58 min' depth='34.65 m' /> + <sample time='34:00 min' depth='35.017 m' temp='4.4 C' /> + <sample time='34:02 min' depth='34.905 m' /> + <sample time='34:04 min' depth='34.721 m' /> + <sample time='34:06 min' depth='34.589 m' /> + <sample time='34:08 min' depth='34.344 m' /> + <sample time='34:10 min' depth='34.028 m' /> + <sample time='34:12 min' depth='33.702 m' /> + <sample time='34:14 min' depth='33.314 m' /> + <sample time='34:16 min' depth='32.58 m' /> + <sample time='34:18 min' depth='32.08 m' /> + <sample time='34:20 min' depth='32.111 m' /> + <sample time='34:22 min' depth='32.029 m' /> + <sample time='34:24 min' depth='31.774 m' /> + <sample time='34:26 min' depth='31.53 m' /> + <sample time='34:28 min' depth='31.326 m' /> + <sample time='34:30 min' depth='31.152 m' /> + <sample time='34:32 min' depth='31.01 m' /> + <sample time='34:34 min' depth='30.816 m' /> + <sample time='34:36 min' depth='30.622 m' /> + <sample time='34:38 min' depth='30.439 m' /> + <sample time='34:40 min' depth='30.102 m' /> + <sample time='34:42 min' depth='29.449 m' /> + <sample time='34:44 min' depth='29.562 m' /> + <sample time='34:46 min' depth='29.541 m' /> + <sample time='34:48 min' depth='29.449 m' temp='4.5 C' /> + <sample time='34:50 min' depth='29.266 m' /> + <sample time='34:52 min' depth='29.052 m' /> + <sample time='34:54 min' depth='28.797 m' /> + <sample time='34:56 min' depth='28.572 m' /> + <sample time='34:58 min' depth='28.369 m' /> + <sample time='35:00 min' depth='28.256 m' /> + <sample time='35:02 min' depth='28.154 m' /> + <sample time='35:04 min' depth='27.726 m' /> + <sample time='35:06 min' depth='27.522 m' /> + <sample time='35:08 min' depth='27.838 m' /> + <sample time='35:10 min' depth='27.757 m' /> + <sample time='35:12 min' depth='27.787 m' temp='4.6 C' cns='15%' /> + <sample time='35:14 min' depth='27.757 m' /> + <sample time='35:16 min' depth='27.665 m' /> + <sample time='35:18 min' depth='27.553 m' /> + <sample time='35:20 min' depth='27.502 m' /> + <sample time='35:22 min' depth='27.42 m' /> + <sample time='35:24 min' depth='27.369 m' temp='4.7 C' /> + <sample time='35:26 min' depth='27.226 m' /> + <sample time='35:28 min' depth='27.165 m' /> + <sample time='35:30 min' depth='26.982 m' /> + <sample time='35:32 min' depth='26.829 m' /> + <sample time='35:34 min' depth='26.747 m' /> + <sample time='35:36 min' depth='26.166 m' temp='4.8 C' /> + <sample time='35:38 min' depth='25.952 m' /> + <sample time='35:40 min' depth='26.023 m' /> + <sample time='35:42 min' depth='26.023 m' /> + <sample time='35:44 min' depth='26.013 m' /> + <sample time='35:46 min' depth='26.227 m' /> + <sample time='35:48 min' depth='26.176 m' temp='4.9 C' /> + <sample time='35:50 min' depth='26.227 m' /> + <sample time='35:52 min' depth='26.166 m' /> + <sample time='35:54 min' depth='26.105 m' /> + <sample time='35:56 min' depth='26.084 m' /> + <sample time='35:58 min' depth='26.033 m' /> + <sample time='36:00 min' depth='26.044 m' temp='5.0 C' /> + <sample time='36:02 min' depth='26.033 m' /> + <sample time='36:04 min' depth='25.891 m' /> + <sample time='36:06 min' depth='25.86 m' /> + <sample time='36:08 min' depth='25.84 m' /> + <sample time='36:10 min' depth='25.36 m' /> + <sample time='36:12 min' depth='25.258 m' temp='5.1 C' /> + <sample time='36:14 min' depth='25.33 m' /> + <sample time='36:16 min' depth='25.687 m' /> + <sample time='36:18 min' depth='25.748 m' /> + <sample time='36:20 min' depth='25.809 m' /> + <sample time='36:22 min' depth='25.809 m' /> + <sample time='36:24 min' depth='25.86 m' /> + <sample time='36:26 min' depth='25.911 m' /> + <sample time='36:28 min' depth='25.799 m' /> + <sample time='36:30 min' depth='25.829 m' /> + <sample time='36:32 min' depth='25.778 m' /> + <sample time='36:34 min' depth='25.85 m' /> + <sample time='36:36 min' depth='25.88 m' /> + <sample time='36:38 min' depth='25.952 m' /> + <sample time='36:40 min' depth='26.013 m' /> + <sample time='36:42 min' depth='25.993 m' /> + <sample time='36:44 min' depth='26.003 m' /> + <sample time='36:46 min' depth='26.044 m' /> + <sample time='36:48 min' depth='26.033 m' temp='5.2 C' /> + <sample time='36:50 min' depth='26.064 m' /> + <sample time='36:52 min' depth='26.146 m' /> + <sample time='36:54 min' depth='26.156 m' /> + <sample time='36:56 min' depth='26.176 m' /> + <sample time='36:58 min' depth='26.197 m' /> + <sample time='37:00 min' depth='26.197 m' /> + <sample time='37:02 min' depth='26.258 m' /> + <sample time='37:04 min' depth='26.319 m' /> + <sample time='37:06 min' depth='26.431 m' /> + <sample time='37:08 min' depth='26.462 m' /> + <sample time='37:10 min' depth='26.513 m' /> + <sample time='37:12 min' depth='26.574 m' cns='16%' /> + <sample time='37:14 min' depth='26.645 m' /> + <sample time='37:16 min' depth='26.696 m' /> + <sample time='37:18 min' depth='26.717 m' /> + <sample time='37:20 min' depth='26.747 m' /> + <sample time='37:22 min' depth='26.737 m' /> + <sample time='37:24 min' depth='26.757 m' /> + <sample time='37:26 min' depth='26.757 m' /> + <sample time='37:28 min' depth='26.808 m' /> + <sample time='37:30 min' depth='26.849 m' /> + <sample time='37:32 min' depth='26.91 m' /> + <sample time='37:34 min' depth='27.022 m' /> + <sample time='37:36 min' depth='27.063 m' /> + <sample time='37:38 min' depth='27.114 m' /> + <sample time='37:40 min' depth='27.145 m' /> + <sample time='37:42 min' depth='27.145 m' /> + <sample time='37:44 min' depth='27.216 m' /> + <sample time='37:46 min' depth='27.206 m' /> + <sample time='37:48 min' depth='27.196 m' temp='5.1 C' /> + <sample time='37:50 min' depth='27.145 m' /> + <sample time='37:52 min' depth='27.104 m' /> + <sample time='37:54 min' depth='26.982 m' /> + <sample time='37:56 min' depth='26.87 m' /> + <sample time='37:58 min' depth='26.768 m' /> + <sample time='38:00 min' depth='26.717 m' /> + <sample time='38:02 min' depth='26.635 m' /> + <sample time='38:04 min' depth='26.594 m' /> + <sample time='38:06 min' depth='26.523 m' /> + <sample time='38:08 min' depth='26.421 m' /> + <sample time='38:10 min' depth='26.329 m' /> + <sample time='38:12 min' depth='26.217 m' /> + <sample time='38:14 min' depth='26.146 m' /> + <sample time='38:16 min' depth='25.901 m' /> + <sample time='38:18 min' depth='25.799 m' /> + <sample time='38:20 min' depth='25.707 m' /> + <sample time='38:22 min' depth='25.727 m' /> + <sample time='38:24 min' depth='25.707 m' /> + <sample time='38:26 min' depth='25.707 m' /> + <sample time='38:28 min' depth='25.595 m' /> + <sample time='38:30 min' depth='25.534 m' /> + <sample time='38:32 min' depth='25.452 m' /> + <sample time='38:34 min' depth='25.34 m' /> + <sample time='38:36 min' depth='25.32 m' temp='5.2 C' /> + <sample time='38:38 min' depth='25.33 m' /> + <sample time='38:40 min' depth='25.309 m' /> + <sample time='38:42 min' depth='25.258 m' /> + <sample time='38:44 min' depth='25.218 m' /> + <sample time='38:46 min' depth='25.279 m' /> + <sample time='38:48 min' depth='25.35 m' temp='5.3 C' /> + <sample time='38:50 min' depth='25.411 m' /> + <sample time='38:52 min' depth='25.422 m' /> + <sample time='38:54 min' depth='25.381 m' /> + <sample time='38:56 min' depth='25.34 m' /> + <sample time='38:58 min' depth='25.248 m' /> + <sample time='39:00 min' depth='25.238 m' temp='5.4 C' /> + <sample time='39:02 min' depth='25.32 m' /> + <sample time='39:04 min' depth='25.309 m' /> + <sample time='39:06 min' depth='25.299 m' /> + <sample time='39:08 min' depth='25.32 m' /> + <sample time='39:10 min' depth='25.391 m' /> + <sample time='39:12 min' depth='25.401 m' /> + <sample time='39:14 min' depth='25.422 m' /> + <sample time='39:16 min' depth='25.483 m' /> + <sample time='39:18 min' depth='25.523 m' /> + <sample time='39:20 min' depth='25.595 m' /> + <sample time='39:22 min' depth='25.789 m' /> + <sample time='39:24 min' depth='25.86 m' /> + <sample time='39:26 min' depth='25.911 m' /> + <sample time='39:28 min' depth='26.064 m' /> + <sample time='39:30 min' depth='26.105 m' /> + <sample time='39:32 min' depth='26.197 m' /> + <sample time='39:34 min' depth='26.258 m' /> + <sample time='39:36 min' depth='26.268 m' cns='17%' /> + <sample time='39:38 min' depth='26.37 m' /> + <sample time='39:40 min' depth='26.594 m' /> + <sample time='39:42 min' depth='26.625 m' /> + <sample time='39:44 min' depth='26.604 m' /> + <sample time='39:46 min' depth='26.564 m' /> + <sample time='39:48 min' depth='26.451 m' /> + <sample time='39:50 min' depth='26.625 m' /> + <sample time='39:52 min' depth='26.462 m' /> + <sample time='39:54 min' depth='26.543 m' /> + <sample time='39:56 min' depth='26.288 m' /> + <sample time='39:58 min' depth='26.37 m' /> + <sample time='40:00 min' depth='26.36 m' temp='5.3 C' /> + <sample time='40:02 min' depth='26.207 m' /> + <sample time='40:04 min' depth='26.156 m' /> + <sample time='40:06 min' depth='26.064 m' /> + <sample time='40:08 min' depth='26.003 m' /> + <sample time='40:10 min' depth='26.013 m' /> + <sample time='40:12 min' depth='25.972 m' /> + <sample time='40:14 min' depth='25.931 m' /> + <sample time='40:16 min' depth='25.86 m' /> + <sample time='40:18 min' depth='25.778 m' /> + <sample time='40:20 min' depth='25.646 m' /> + <sample time='40:22 min' depth='25.534 m' /> + <sample time='40:24 min' depth='25.473 m' /> + <sample time='40:26 min' depth='25.33 m' /> + <sample time='40:28 min' depth='25.177 m' /> + <sample time='40:30 min' depth='25.034 m' /> + <sample time='40:32 min' depth='24.891 m' /> + <sample time='40:34 min' depth='24.738 m' /> + <sample time='40:36 min' depth='24.657 m' /> + <sample time='40:38 min' depth='24.545 m' /> + <sample time='40:40 min' depth='24.443 m' /> + <sample time='40:42 min' depth='24.402 m' /> + <sample time='40:44 min' depth='24.33 m' /> + <sample time='40:46 min' depth='24.269 m' /> + <sample time='40:48 min' depth='24.218 m' temp='5.4 C' /> + <sample time='40:50 min' depth='24.228 m' /> + <sample time='40:52 min' depth='24.228 m' /> + <sample time='40:54 min' depth='23.78 m' /> + <sample time='40:56 min' depth='23.719 m' /> + <sample time='40:58 min' depth='24.075 m' /> + <sample time='41:00 min' depth='24.096 m' temp='5.6 C' /> + <sample time='41:02 min' depth='24.137 m' /> + <sample time='41:04 min' depth='24.208 m' /> + <sample time='41:06 min' depth='24.177 m' /> + <sample time='41:08 min' depth='24.218 m' /> + <sample time='41:10 min' depth='24.106 m' /> + <sample time='41:12 min' depth='23.586 m' temp='5.7 C' /> + <sample time='41:14 min' depth='23.341 m' /> + <sample time='41:16 min' depth='23.739 m' /> + <sample time='41:18 min' depth='23.719 m' /> + <sample time='41:20 min' depth='23.719 m' /> + <sample time='41:22 min' depth='23.719 m' /> + <sample time='41:24 min' depth='23.708 m' temp='5.8 C' /> + <sample time='41:26 min' depth='23.719 m' /> + <sample time='41:28 min' depth='23.759 m' /> + <sample time='41:30 min' depth='23.821 m' /> + <sample time='41:32 min' depth='23.861 m' /> + <sample time='41:34 min' depth='23.851 m' /> + <sample time='41:36 min' depth='23.872 m' temp='5.9 C' /> + <sample time='41:38 min' depth='23.861 m' /> + <sample time='41:40 min' depth='23.933 m' /> + <sample time='41:42 min' depth='24.055 m' /> + <sample time='41:44 min' depth='24.147 m' /> + <sample time='41:46 min' depth='24.259 m' /> + <sample time='41:48 min' depth='24.422 m' /> + <sample time='41:50 min' depth='24.473 m' /> + <sample time='41:52 min' depth='24.504 m' /> + <sample time='41:54 min' depth='24.483 m' /> + <sample time='41:56 min' depth='24.504 m' /> + <sample time='41:58 min' depth='24.432 m' /> + <sample time='42:00 min' depth='24.422 m' cns='18%' /> + <sample time='42:02 min' depth='24.33 m' /> + <sample time='42:04 min' depth='24.31 m' /> + <sample time='42:06 min' depth='24.351 m' /> + <sample time='42:08 min' depth='24.361 m' /> + <sample time='42:10 min' depth='24.453 m' /> + <sample time='42:12 min' depth='24.208 m' /> + <sample time='42:14 min' depth='24.177 m' /> + <sample time='42:16 min' depth='24.147 m' /> + <sample time='42:18 min' depth='24.075 m' /> + <sample time='42:20 min' depth='23.994 m' /> + <sample time='42:22 min' depth='23.943 m' /> + <sample time='42:24 min' depth='23.943 m' temp='5.8 C' /> + <sample time='42:26 min' depth='23.912 m' /> + <sample time='42:28 min' depth='23.872 m' /> + <sample time='42:30 min' depth='23.912 m' /> + <sample time='42:32 min' depth='23.963 m' /> + <sample time='42:34 min' depth='24.025 m' /> + <sample time='42:36 min' depth='24.086 m' /> + <sample time='42:38 min' depth='24.126 m' /> + <sample time='42:40 min' depth='24.157 m' /> + <sample time='42:42 min' depth='24.157 m' /> + <sample time='42:44 min' depth='24.249 m' /> + <sample time='42:46 min' depth='24.29 m' /> + <sample time='42:48 min' depth='24.351 m' /> + <sample time='42:50 min' depth='24.412 m' /> + <sample time='42:52 min' depth='24.453 m' /> + <sample time='42:54 min' depth='24.422 m' /> + <sample time='42:56 min' depth='24.453 m' /> + <sample time='42:58 min' depth='24.504 m' /> + <sample time='43:00 min' depth='24.555 m' /> + <sample time='43:02 min' depth='24.616 m' /> + <sample time='43:04 min' depth='24.657 m' /> + <sample time='43:06 min' depth='24.718 m' /> + <sample time='43:08 min' depth='24.749 m' /> + <sample time='43:10 min' depth='24.769 m' /> + <sample time='43:12 min' depth='24.779 m' /> + <sample time='43:14 min' depth='24.799 m' /> + <sample time='43:16 min' depth='24.85 m' /> + <sample time='43:18 min' depth='24.871 m' /> + <sample time='43:20 min' depth='24.901 m' /> + <sample time='43:22 min' depth='24.881 m' /> + <sample time='43:24 min' depth='24.85 m' temp='5.7 C' /> + <sample time='43:26 min' depth='24.85 m' /> + <sample time='43:28 min' depth='24.779 m' /> + <sample time='43:30 min' depth='24.698 m' /> + <sample time='43:32 min' depth='24.606 m' /> + <sample time='43:34 min' depth='24.514 m' /> + <sample time='43:36 min' depth='24.443 m' /> + <sample time='43:38 min' depth='24.341 m' /> + <sample time='43:40 min' depth='24.29 m' /> + <sample time='43:42 min' depth='24.249 m' /> + <sample time='43:44 min' depth='24.177 m' /> + <sample time='43:46 min' depth='24.106 m' /> + <sample time='43:48 min' depth='24.055 m' /> + <sample time='43:50 min' depth='24.025 m' /> + <sample time='43:52 min' depth='23.963 m' /> + <sample time='43:54 min' depth='23.974 m' /> + <sample time='43:56 min' depth='23.994 m' /> + <sample time='43:58 min' depth='24.035 m' /> + <sample time='44:00 min' depth='24.137 m' temp='5.8 C' cns='19%' /> + <sample time='44:02 min' depth='24.188 m' /> + <sample time='44:04 min' depth='24.259 m' /> + <sample time='44:06 min' depth='24.31 m' /> + <sample time='44:08 min' depth='24.341 m' /> + <sample time='44:10 min' depth='24.402 m' /> + <sample time='44:12 min' depth='24.483 m' in_deco='1' stoptime='1:00 min' stopdepth='6.0 m' /> + <sample time='44:14 min' depth='24.545 m' /> + <sample time='44:16 min' depth='24.606 m' /> + <sample time='44:18 min' depth='24.667 m' /> + <sample time='44:20 min' depth='24.749 m' /> + <sample time='44:22 min' depth='24.799 m' /> + <sample time='44:24 min' depth='24.901 m' /> + <sample time='44:26 min' depth='25.024 m' /> + <sample time='44:28 min' depth='25.136 m' /> + <sample time='44:30 min' depth='25.258 m' /> + <sample time='44:32 min' depth='25.371 m' /> + <sample time='44:34 min' depth='25.452 m' /> + <sample time='44:36 min' depth='25.513 m' /> + <sample time='44:38 min' depth='25.625 m' /> + <sample time='44:40 min' depth='25.687 m' /> + <sample time='44:42 min' depth='25.789 m' /> + <sample time='44:44 min' depth='25.809 m' /> + <sample time='44:46 min' depth='25.942 m' /> + <sample time='44:48 min' depth='25.931 m' temp='5.7 C' /> + <sample time='44:50 min' depth='26.033 m' /> + <sample time='44:52 min' depth='26.095 m' /> + <sample time='44:54 min' depth='26.054 m' /> + <sample time='44:56 min' depth='26.033 m' /> + <sample time='44:58 min' depth='25.901 m' /> + <sample time='45:00 min' depth='25.86 m' temp='5.5 C' /> + <sample time='45:02 min' depth='25.778 m' /> + <sample time='45:04 min' depth='25.727 m' /> + <sample time='45:06 min' depth='25.656 m' /> + <sample time='45:08 min' depth='25.574 m' /> + <sample time='45:10 min' depth='25.585 m' /> + <sample time='45:12 min' depth='25.574 m' /> + <sample time='45:14 min' depth='25.554 m' /> + <sample time='45:16 min' depth='25.605 m' /> + <sample time='45:18 min' depth='25.564 m' /> + <sample time='45:20 min' depth='25.564 m' /> + <sample time='45:22 min' depth='25.503 m' /> + <sample time='45:24 min' depth='25.523 m' temp='5.4 C' /> + <sample time='45:26 min' depth='25.503 m' /> + <sample time='45:28 min' depth='25.33 m' /> + <sample time='45:30 min' depth='25.34 m' /> + <sample time='45:32 min' depth='25.33 m' /> + <sample time='45:34 min' depth='25.411 m' /> + <sample time='45:36 min' depth='25.534 m' /> + <sample time='45:38 min' depth='25.564 m' /> + <sample time='45:40 min' depth='25.625 m' /> + <sample time='45:42 min' depth='25.615 m' /> + <sample time='45:44 min' depth='25.513 m' /> + <sample time='45:46 min' depth='25.279 m' /> + <sample time='45:48 min' depth='25.167 m' /> + <sample time='45:50 min' depth='24.952 m' /> + <sample time='45:52 min' depth='24.667 m' /> + <sample time='45:54 min' depth='24.341 m' /> + <sample time='45:56 min' depth='24.065 m' /> + <sample time='45:58 min' depth='23.77 m' /> + <sample time='46:00 min' depth='23.453 m' /> + <sample time='46:02 min' depth='22.821 m' /> + <sample time='46:04 min' depth='22.424 m' /> + <sample time='46:06 min' depth='22.526 m' /> + <sample time='46:08 min' depth='22.22 m' /> + <sample time='46:10 min' depth='21.791 m' /> + <sample time='46:12 min' depth='21.169 m' temp='5.6 C' /> + <sample time='46:14 min' depth='20.965 m' /> + <sample time='46:16 min' depth='21.088 m' /> + <sample time='46:18 min' depth='20.914 m' /> + <sample time='46:20 min' depth='20.772 m' /> + <sample time='46:22 min' depth='20.7 m' /> + <sample time='46:24 min' depth='20.608 m' temp='6.0 C' cns='20%' /> + <sample time='46:26 min' depth='20.466 m' /> + <sample time='46:28 min' depth='20.313 m' /> + <sample time='46:30 min' depth='20.119 m' /> + <sample time='46:32 min' depth='19.946 m' /> + <sample time='46:34 min' depth='19.946 m' /> + <sample time='46:36 min' depth='19.956 m' temp='6.3 C' /> + <sample time='46:38 min' depth='19.997 m' /> + <sample time='46:40 min' depth='19.997 m' /> + <sample time='46:42 min' depth='19.946 m' /> + <sample time='46:44 min' depth='19.915 m' /> + <sample time='46:46 min' depth='19.915 m' /> + <sample time='46:48 min' depth='19.711 m' temp='6.6 C' /> + <sample time='46:50 min' depth='19.997 m' /> + <sample time='46:52 min' depth='20.099 m' /> + <sample time='46:54 min' depth='20.109 m' /> + <sample time='46:56 min' depth='20.139 m' /> + <sample time='46:58 min' depth='20.119 m' /> + <sample time='47:00 min' depth='20.099 m' temp='6.9 C' /> + <sample time='47:02 min' depth='20.15 m' /> + <sample time='47:04 min' depth='20.201 m' /> + <sample time='47:06 min' depth='20.343 m' /> + <sample time='47:08 min' depth='20.394 m' /> + <sample time='47:10 min' depth='20.456 m' /> + <sample time='47:12 min' depth='20.557 m' temp='7.0 C' /> + <sample time='47:14 min' depth='20.68 m' /> + <sample time='47:16 min' depth='20.761 m' /> + <sample time='47:18 min' depth='20.843 m' /> + <sample time='47:20 min' depth='20.884 m' /> + <sample time='47:22 min' depth='20.904 m' /> + <sample time='47:24 min' depth='20.874 m' temp='7.1 C' /> + <sample time='47:26 min' depth='20.884 m' /> + <sample time='47:28 min' depth='20.853 m' /> + <sample time='47:30 min' depth='20.792 m' /> + <sample time='47:32 min' depth='20.772 m' /> + <sample time='47:34 min' depth='20.721 m' /> + <sample time='47:36 min' depth='20.7 m' /> + <sample time='47:38 min' depth='20.68 m' /> + <sample time='47:40 min' depth='20.659 m' /> + <sample time='47:42 min' depth='20.68 m' /> + <sample time='47:44 min' depth='20.721 m' /> + <sample time='47:46 min' depth='20.792 m' /> + <sample time='47:48 min' depth='20.7 m' temp='7.0 C' /> + <sample time='47:50 min' depth='20.629 m' /> + <sample time='47:52 min' depth='20.557 m' /> + <sample time='47:54 min' depth='20.527 m' /> + <sample time='47:56 min' depth='20.445 m' /> + <sample time='47:58 min' depth='20.445 m' /> + <sample time='48:00 min' depth='20.241 m' /> + <sample time='48:02 min' depth='20.17 m' /> + <sample time='48:04 min' depth='20.099 m' /> + <sample time='48:06 min' depth='20.068 m' /> + <sample time='48:08 min' depth='20.007 m' /> + <sample time='48:10 min' depth='20.17 m' /> + <sample time='48:12 min' depth='19.823 m' temp='7.1 C' in_deco='0' stopdepth='0.0 m' /> + <sample time='48:14 min' depth='19.803 m' /> + <sample time='48:16 min' depth='19.772 m' /> + <sample time='48:18 min' depth='19.742 m' /> + <sample time='48:20 min' depth='19.385 m' /> + <sample time='48:22 min' depth='19.069 m' /> + <sample time='48:24 min' depth='19.466 m' temp='7.2 C' cns='21%' /> + <sample time='48:26 min' depth='19.456 m' /> + <sample time='48:28 min' depth='19.436 m' /> + <sample time='48:30 min' depth='19.405 m' /> + <sample time='48:32 min' depth='19.375 m' /> + <sample time='48:34 min' depth='19.313 m' /> + <sample time='48:36 min' depth='19.222 m' temp='7.4 C' /> + <sample time='48:38 min' depth='19.12 m' /> + <sample time='48:40 min' depth='19.008 m' /> + <sample time='48:42 min' depth='18.916 m' /> + <sample time='48:44 min' depth='18.793 m' /> + <sample time='48:46 min' depth='18.742 m' /> + <sample time='48:48 min' depth='18.691 m' temp='7.6 C' /> + <sample time='48:50 min' depth='18.589 m' /> + <sample time='48:52 min' depth='18.528 m' /> + <sample time='48:54 min' depth='18.508 m' /> + <sample time='48:56 min' depth='18.61 m' /> + <sample time='48:58 min' depth='18.63 m' /> + <sample time='49:00 min' depth='18.793 m' temp='7.8 C' /> + <sample time='49:02 min' depth='18.773 m' /> + <sample time='49:04 min' depth='18.569 m' /> + <sample time='49:06 min' depth='18.447 m' /> + <sample time='49:08 min' depth='18.334 m' /> + <sample time='49:10 min' depth='18.385 m' /> + <sample time='49:12 min' depth='18.416 m' temp='8.0 C' /> + <sample time='49:14 min' depth='18.436 m' /> + <sample time='49:16 min' depth='18.498 m' /> + <sample time='49:18 min' depth='18.508 m' /> + <sample time='49:20 min' depth='18.559 m' /> + <sample time='49:22 min' depth='18.487 m' /> + <sample time='49:24 min' depth='18.406 m' temp='8.1 C' /> + <sample time='49:26 min' depth='18.345 m' /> + <sample time='49:28 min' depth='18.273 m' /> + <sample time='49:30 min' depth='18.222 m' /> + <sample time='49:32 min' depth='18.12 m' /> + <sample time='49:34 min' depth='18.09 m' /> + <sample time='49:36 min' depth='18.029 m' temp='8.3 C' /> + <sample time='49:38 min' depth='18.049 m' /> + <sample time='49:40 min' depth='18.141 m' /> + <sample time='49:42 min' depth='18.182 m' /> + <sample time='49:44 min' depth='18.131 m' /> + <sample time='49:46 min' depth='18.049 m' /> + <sample time='49:48 min' depth='18.069 m' temp='8.6 C' /> + <sample time='49:50 min' depth='18.029 m' /> + <sample time='49:52 min' depth='17.947 m' /> + <sample time='49:54 min' depth='17.865 m' /> + <sample time='49:56 min' depth='17.774 m' /> + <sample time='49:58 min' depth='17.651 m' /> + <sample time='50:00 min' depth='17.641 m' temp='8.8 C' /> + <sample time='50:02 min' depth='17.478 m' /> + <sample time='50:04 min' depth='17.233 m' /> + <sample time='50:06 min' depth='16.734 m' /> + <sample time='50:08 min' depth='16.897 m' /> + <sample time='50:10 min' depth='16.907 m' /> + <sample time='50:12 min' depth='17.019 m' temp='9.1 C' /> + <sample time='50:14 min' depth='16.815 m' /> + <sample time='50:16 min' depth='16.764 m' /> + <sample time='50:18 min' depth='16.632 m' /> + <sample time='50:20 min' depth='16.499 m' /> + <sample time='50:22 min' depth='16.295 m' /> + <sample time='50:24 min' depth='16.183 m' temp='9.4 C' cns='22%' /> + <sample time='50:26 min' depth='16.112 m' /> + <sample time='50:28 min' depth='16.163 m' /> + <sample time='50:30 min' depth='16.101 m' /> + <sample time='50:32 min' depth='15.969 m' /> + <sample time='50:34 min' depth='15.959 m' /> + <sample time='50:36 min' depth='15.704 m' temp='9.5 C' /> + <sample time='50:38 min' depth='15.122 m' /> + <sample time='50:40 min' depth='14.898 m' /> + <sample time='50:42 min' depth='15.204 m' /> + <sample time='50:44 min' depth='15.133 m' /> + <sample time='50:46 min' depth='15.082 m' /> + <sample time='50:48 min' depth='15.0 m' temp='9.7 C' /> + <sample time='50:50 min' depth='14.969 m' /> + <sample time='50:52 min' depth='14.918 m' /> + <sample time='50:54 min' depth='14.745 m' /> + <sample time='50:56 min' depth='14.613 m' /> + <sample time='50:58 min' depth='14.511 m' /> + <sample time='51:00 min' depth='14.47 m' temp='9.8 C' /> + <sample time='51:02 min' depth='14.47 m' /> + <sample time='51:04 min' depth='14.48 m' /> + <sample time='51:06 min' depth='14.46 m' /> + <sample time='51:08 min' depth='14.419 m' /> + <sample time='51:10 min' depth='14.276 m' /> + <sample time='51:12 min' depth='14.276 m' /> + <sample time='51:14 min' depth='14.256 m' /> + <sample time='51:16 min' depth='14.225 m' /> + <sample time='51:18 min' depth='14.194 m' /> + <sample time='51:20 min' depth='14.184 m' /> + <sample time='51:22 min' depth='14.082 m' /> + <sample time='51:24 min' depth='14.001 m' temp='9.9 C' /> + <sample time='51:26 min' depth='13.899 m' /> + <sample time='51:28 min' depth='13.868 m' /> + <sample time='51:30 min' depth='13.899 m' /> + <sample time='51:32 min' depth='14.001 m' /> + <sample time='51:34 min' depth='13.991 m' /> + <sample time='51:36 min' depth='14.031 m' ndl='240:00 min' /> + <sample time='51:38 min' depth='14.133 m' /> + <sample time='51:40 min' depth='14.164 m' /> + <sample time='51:42 min' depth='14.184 m' /> + <sample time='51:44 min' depth='14.215 m' /> + <sample time='51:46 min' depth='14.092 m' /> + <sample time='51:48 min' depth='13.664 m' /> + <sample time='51:50 min' depth='13.379 m' /> + <sample time='51:52 min' depth='13.746 m' /> + <sample time='51:54 min' depth='13.674 m' /> + <sample time='51:56 min' depth='13.634 m' /> + <sample time='51:58 min' depth='13.685 m' /> + <sample time='52:00 min' depth='13.654 m' /> + <sample time='52:02 min' depth='13.572 m' /> + <sample time='52:04 min' depth='13.501 m' /> + <sample time='52:06 min' depth='13.501 m' /> + <sample time='52:08 min' depth='13.552 m' /> + <sample time='52:10 min' depth='13.664 m' /> + <sample time='52:12 min' depth='13.664 m' /> + <sample time='52:14 min' depth='13.705 m' /> + <sample time='52:16 min' depth='13.685 m' /> + <sample time='52:18 min' depth='13.634 m' /> + <sample time='52:20 min' depth='13.593 m' /> + <sample time='52:22 min' depth='13.511 m' /> + <sample time='52:24 min' depth='13.419 m' /> + <sample time='52:26 min' depth='13.348 m' /> + <sample time='52:28 min' depth='13.093 m' /> + <sample time='52:30 min' depth='12.716 m' /> + <sample time='52:32 min' depth='12.543 m' /> + <sample time='52:34 min' depth='12.655 m' /> + <sample time='52:36 min' depth='12.43 m' /> + <sample time='52:38 min' depth='12.308 m' /> + <sample time='52:40 min' depth='12.247 m' /> + <sample time='52:42 min' depth='12.145 m' /> + <sample time='52:44 min' depth='11.92 m' /> + <sample time='52:46 min' depth='11.574 m' /> + <sample time='52:48 min' depth='11.951 m' cns='23%' /> + <sample time='52:50 min' depth='11.869 m' /> + <sample time='52:52 min' depth='11.839 m' /> + <sample time='52:54 min' depth='11.808 m' /> + <sample time='52:56 min' depth='11.737 m' /> + <sample time='52:58 min' depth='11.727 m' /> + <sample time='53:00 min' depth='11.757 m' /> + <sample time='53:02 min' depth='11.737 m' /> + <sample time='53:04 min' depth='11.574 m' /> + <sample time='53:06 min' depth='11.268 m' /> + <sample time='53:08 min' depth='11.574 m' /> + <sample time='53:10 min' depth='11.462 m' /> + <sample time='53:12 min' depth='11.492 m' /> + <sample time='53:14 min' depth='11.421 m' /> + <sample time='53:16 min' depth='11.37 m' /> + <sample time='53:18 min' depth='11.258 m' /> + <sample time='53:20 min' depth='11.329 m' /> + <sample time='53:22 min' depth='11.044 m' /> + <sample time='53:24 min' depth='10.778 m' /> + <sample time='53:26 min' depth='10.197 m' /> + <sample time='53:28 min' depth='9.912 m' /> + <sample time='53:30 min' depth='10.279 m' /> + <sample time='53:32 min' depth='10.258 m' /> + <sample time='53:34 min' depth='10.238 m' /> + <sample time='53:36 min' depth='10.258 m' /> + <sample time='53:38 min' depth='10.279 m' /> + <sample time='53:40 min' depth='10.238 m' /> + <sample time='53:42 min' depth='9.932 m' /> + <sample time='53:44 min' depth='9.473 m' /> + <sample time='53:46 min' depth='9.728 m' /> + <sample time='53:48 min' depth='9.718 m' /> + <sample time='53:50 min' depth='9.647 m' /> + <sample time='53:52 min' depth='9.687 m' /> + <sample time='53:54 min' depth='9.698 m' /> + <sample time='53:56 min' depth='9.708 m' /> + <sample time='53:58 min' depth='9.85 m' /> + <sample time='54:00 min' depth='9.861 m' /> + <sample time='54:02 min' depth='9.81 m' /> + <sample time='54:04 min' depth='9.759 m' /> + <sample time='54:06 min' depth='9.596 m' /> + <sample time='54:08 min' depth='9.167 m' /> + <sample time='54:10 min' depth='8.698 m' /> + <sample time='54:12 min' depth='8.433 m' temp='10.0 C' /> + <sample time='54:14 min' depth='8.708 m' /> + <sample time='54:16 min' depth='8.627 m' /> + <sample time='54:18 min' depth='8.627 m' /> + <sample time='54:20 min' depth='8.698 m' /> + <sample time='54:22 min' depth='8.688 m' /> + <sample time='54:24 min' depth='8.668 m' /> + <sample time='54:26 min' depth='8.678 m' /> + <sample time='54:28 min' depth='8.698 m' /> + <sample time='54:30 min' depth='8.698 m' /> + <sample time='54:32 min' depth='8.719 m' /> + <sample time='54:34 min' depth='8.759 m' /> + <sample time='54:36 min' depth='8.739 m' /> + <sample time='54:38 min' depth='8.678 m' /> + <sample time='54:40 min' depth='8.606 m' /> + <sample time='54:42 min' depth='8.453 m' /> + <sample time='54:44 min' depth='8.372 m' /> + <sample time='54:46 min' depth='8.321 m' /> + <sample time='54:48 min' depth='8.3 m' cns='24%' /> + <sample time='54:50 min' depth='8.239 m' /> + <sample time='54:52 min' depth='8.148 m' /> + <sample time='54:54 min' depth='8.056 m' /> + <sample time='54:56 min' depth='7.913 m' /> + <sample time='54:58 min' depth='7.78 m' /> + <sample time='55:00 min' depth='7.23 m' /> + <sample time='55:02 min' depth='6.995 m' /> + <sample time='55:04 min' depth='7.291 m' /> + <sample time='55:06 min' depth='7.158 m' /> + <sample time='55:08 min' depth='7.097 m' /> + <sample time='55:10 min' depth='7.138 m' /> + <sample time='55:12 min' depth='7.077 m' /> + <sample time='55:14 min' depth='7.077 m' /> + <sample time='55:16 min' depth='6.965 m' /> + <sample time='55:18 min' depth='6.954 m' /> + <sample time='55:20 min' depth='6.883 m' /> + <sample time='55:22 min' depth='6.873 m' /> + <sample time='55:24 min' depth='6.873 m' temp='10.1 C' /> + <sample time='55:26 min' depth='6.842 m' /> + <sample time='55:28 min' depth='6.842 m' /> + <sample time='55:30 min' depth='6.812 m' /> + <sample time='55:32 min' depth='6.852 m' /> + <sample time='55:34 min' depth='6.771 m' /> + <sample time='55:36 min' depth='6.751 m' /> + <sample time='55:38 min' depth='6.638 m' /> + <sample time='55:40 min' depth='6.628 m' /> + <sample time='55:42 min' depth='6.628 m' /> + <sample time='55:44 min' depth='6.689 m' /> + <sample time='55:46 min' depth='6.863 m' /> + <sample time='55:48 min' depth='6.863 m' temp='10.0 C' /> + <sample time='55:50 min' depth='6.863 m' /> + <sample time='55:52 min' depth='6.771 m' /> + <sample time='55:54 min' depth='6.7 m' /> + <sample time='55:56 min' depth='6.098 m' /> + <sample time='55:58 min' depth='5.731 m' /> + <sample time='56:00 min' depth='6.057 m' /> + <sample time='56:02 min' depth='6.098 m' /> + <sample time='56:04 min' depth='6.098 m' /> + <sample time='56:06 min' depth='6.21 m' /> + <sample time='56:08 min' depth='6.445 m' /> + <sample time='56:10 min' depth='6.7 m' /> + <sample time='56:12 min' depth='6.751 m' /> + <sample time='56:14 min' depth='6.852 m' /> + <sample time='56:16 min' depth='6.557 m' /> + <sample time='56:18 min' depth='6.312 m' /> + <sample time='56:20 min' depth='6.424 m' /> + <sample time='56:22 min' depth='6.434 m' /> + <sample time='56:24 min' depth='6.506 m' /> + <sample time='56:26 min' depth='6.618 m' /> + <sample time='56:28 min' depth='6.72 m' /> + <sample time='56:30 min' depth='6.822 m' /> + <sample time='56:32 min' depth='6.852 m' /> + <sample time='56:34 min' depth='6.863 m' /> + <sample time='56:36 min' depth='6.781 m' /> + <sample time='56:38 min' depth='6.751 m' /> + <sample time='56:40 min' depth='6.7 m' /> + <sample time='56:42 min' depth='6.618 m' /> + <sample time='56:44 min' depth='6.506 m' /> + <sample time='56:46 min' depth='6.414 m' /> + <sample time='56:48 min' depth='6.394 m' /> + <sample time='56:50 min' depth='6.404 m' /> + <sample time='56:52 min' depth='6.424 m' /> + <sample time='56:54 min' depth='6.475 m' /> + <sample time='56:56 min' depth='6.516 m' /> + <sample time='56:58 min' depth='6.557 m' /> + <sample time='57:00 min' depth='6.598 m' /> + <sample time='57:02 min' depth='6.649 m' /> + <sample time='57:04 min' depth='6.679 m' /> + <sample time='57:06 min' depth='6.74 m' /> + <sample time='57:08 min' depth='6.761 m' /> + <sample time='57:10 min' depth='6.791 m' /> + <sample time='57:12 min' depth='6.934 m' cns='25%' /> + <sample time='57:14 min' depth='6.873 m' /> + <sample time='57:16 min' depth='6.903 m' /> + <sample time='57:18 min' depth='6.924 m' /> + <sample time='57:20 min' depth='6.903 m' /> + <sample time='57:22 min' depth='6.883 m' /> + <sample time='57:24 min' depth='6.965 m' /> + <sample time='57:26 min' depth='6.965 m' /> + <sample time='57:28 min' depth='6.985 m' /> + <sample time='57:30 min' depth='6.995 m' /> + <sample time='57:32 min' depth='7.077 m' /> + <sample time='57:34 min' depth='7.169 m' /> + <sample time='57:36 min' depth='7.24 m' /> + <sample time='57:38 min' depth='7.322 m' /> + <sample time='57:40 min' depth='7.424 m' /> + <sample time='57:42 min' depth='7.526 m' /> + <sample time='57:44 min' depth='7.607 m' /> + <sample time='57:46 min' depth='7.678 m' /> + <sample time='57:48 min' depth='7.791 m' /> + <sample time='57:50 min' depth='7.678 m' /> + <sample time='57:52 min' depth='7.444 m' /> + <sample time='57:54 min' depth='7.373 m' /> + <sample time='57:56 min' depth='7.413 m' /> + <sample time='57:58 min' depth='7.373 m' /> + <sample time='58:00 min' depth='7.383 m' /> + <sample time='58:02 min' depth='7.403 m' /> + <sample time='58:04 min' depth='7.464 m' /> + <sample time='58:06 min' depth='7.413 m' /> + <sample time='58:08 min' depth='7.464 m' /> + <sample time='58:10 min' depth='7.393 m' /> + <sample time='58:12 min' depth='7.291 m' /> + <sample time='58:14 min' depth='7.107 m' /> + <sample time='58:16 min' depth='6.985 m' /> + <sample time='58:18 min' depth='6.975 m' /> + <sample time='58:20 min' depth='6.893 m' /> + <sample time='58:22 min' depth='6.771 m' /> + <sample time='58:24 min' depth='6.72 m' /> + <sample time='58:26 min' depth='6.557 m' /> + <sample time='58:28 min' depth='6.261 m' /> + <sample time='58:30 min' depth='5.751 m' /> + <sample time='58:32 min' depth='5.843 m' /> + <sample time='58:34 min' depth='5.639 m' /> + <sample time='58:36 min' depth='5.506 m' /> + <sample time='58:38 min' depth='5.578 m' /> + <sample time='58:40 min' depth='5.629 m' /> + <sample time='58:42 min' depth='5.731 m' /> + <sample time='58:44 min' depth='5.853 m' /> + <sample time='58:46 min' depth='5.925 m' /> + <sample time='58:48 min' depth='5.996 m' /> + <sample time='58:50 min' depth='6.037 m' /> + <sample time='58:52 min' depth='6.057 m' /> + <sample time='58:54 min' depth='6.108 m' /> + <sample time='58:56 min' depth='6.108 m' /> + <sample time='58:58 min' depth='6.128 m' /> + <sample time='59:00 min' depth='6.2 m' /> + <sample time='59:02 min' depth='6.19 m' /> + <sample time='59:04 min' depth='6.179 m' /> + <sample time='59:06 min' depth='6.128 m' /> + <sample time='59:08 min' depth='6.027 m' /> + <sample time='59:10 min' depth='5.945 m' /> + <sample time='59:12 min' depth='5.976 m' cns='26%' /> + <sample time='59:14 min' depth='6.027 m' /> + <sample time='59:16 min' depth='6.108 m' /> + <sample time='59:18 min' depth='6.22 m' /> + <sample time='59:20 min' depth='6.261 m' /> + <sample time='59:22 min' depth='6.281 m' /> + <sample time='59:24 min' depth='6.332 m' /> + <sample time='59:26 min' depth='6.343 m' /> + <sample time='59:28 min' depth='6.445 m' /> + <sample time='59:30 min' depth='6.445 m' /> + <sample time='59:32 min' depth='6.506 m' /> + <sample time='59:34 min' depth='6.577 m' /> + <sample time='59:36 min' depth='6.618 m' /> + <sample time='59:38 min' depth='6.618 m' /> + <sample time='59:40 min' depth='6.649 m' /> + <sample time='59:42 min' depth='6.689 m' /> + <sample time='59:44 min' depth='6.669 m' /> + <sample time='59:46 min' depth='6.689 m' /> + <sample time='59:48 min' depth='6.7 m' /> + <sample time='59:50 min' depth='6.74 m' /> + <sample time='59:52 min' depth='6.761 m' /> + <sample time='59:54 min' depth='6.832 m' /> + <sample time='59:56 min' depth='6.893 m' /> + <sample time='59:58 min' depth='6.863 m' /> + <sample time='60:00 min' depth='6.852 m' /> + <sample time='60:02 min' depth='6.852 m' /> + <sample time='60:04 min' depth='6.781 m' /> + <sample time='60:06 min' depth='6.802 m' /> + <sample time='60:08 min' depth='6.751 m' /> + <sample time='60:10 min' depth='6.771 m' /> + <sample time='60:12 min' depth='6.771 m' /> + <sample time='60:14 min' depth='6.761 m' /> + <sample time='60:16 min' depth='6.771 m' /> + <sample time='60:18 min' depth='6.751 m' /> + <sample time='60:20 min' depth='6.7 m' /> + <sample time='60:22 min' depth='6.659 m' /> + <sample time='60:24 min' depth='6.587 m' /> + <sample time='60:26 min' depth='6.526 m' /> + <sample time='60:28 min' depth='6.475 m' /> + <sample time='60:30 min' depth='6.455 m' /> + <sample time='60:32 min' depth='6.434 m' /> + <sample time='60:34 min' depth='6.424 m' /> + <sample time='60:36 min' depth='6.414 m' /> + <sample time='60:38 min' depth='6.394 m' /> + <sample time='60:40 min' depth='6.383 m' /> + <sample time='60:42 min' depth='6.363 m' /> + <sample time='60:44 min' depth='6.281 m' /> + <sample time='60:46 min' depth='6.23 m' /> + <sample time='60:48 min' depth='6.159 m' /> + <sample time='60:50 min' depth='6.047 m' /> + <sample time='60:52 min' depth='5.598 m' /> + <sample time='60:54 min' depth='5.69 m' /> + <sample time='60:56 min' depth='5.833 m' /> + <sample time='60:58 min' depth='5.812 m' /> + <sample time='61:00 min' depth='5.833 m' /> + <sample time='61:02 min' depth='5.884 m' /> + <sample time='61:04 min' depth='5.965 m' /> + <sample time='61:06 min' depth='6.037 m' /> + <sample time='61:08 min' depth='6.128 m' /> + <sample time='61:10 min' depth='6.302 m' /> + <sample time='61:12 min' depth='6.404 m' cns='27%' /> + <sample time='61:14 min' depth='6.516 m' /> + <sample time='61:16 min' depth='6.618 m' /> + <sample time='61:18 min' depth='6.781 m' /> + <sample time='61:20 min' depth='6.802 m' /> + <sample time='61:22 min' depth='6.71 m' /> + <sample time='61:24 min' depth='6.547 m' /> + <sample time='61:26 min' depth='6.485 m' /> + <sample time='61:28 min' depth='6.485 m' /> + <sample time='61:30 min' depth='6.587 m' /> + <sample time='61:32 min' depth='6.71 m' /> + <sample time='61:34 min' depth='6.822 m' /> + <sample time='61:36 min' depth='6.934 m' /> + <sample time='61:38 min' depth='7.026 m' /> + <sample time='61:40 min' depth='7.148 m' /> + <sample time='61:42 min' depth='7.25 m' /> + <sample time='61:44 min' depth='7.291 m' /> + <sample time='61:46 min' depth='7.311 m' /> + <sample time='61:48 min' depth='7.342 m' /> + <sample time='61:50 min' depth='7.362 m' /> + <sample time='61:52 min' depth='7.352 m' /> + <sample time='61:54 min' depth='7.311 m' /> + <sample time='61:56 min' depth='7.311 m' /> + <sample time='61:58 min' depth='7.209 m' /> + <sample time='62:00 min' depth='7.036 m' /> + <sample time='62:02 min' depth='6.893 m' /> + <sample time='62:04 min' depth='6.771 m' /> + <sample time='62:06 min' depth='6.679 m' /> + <sample time='62:08 min' depth='6.679 m' /> + <sample time='62:10 min' depth='6.74 m' /> + <sample time='62:12 min' depth='6.791 m' /> + <sample time='62:14 min' depth='6.863 m' /> + <sample time='62:16 min' depth='6.883 m' /> + <sample time='62:18 min' depth='6.883 m' /> + <sample time='62:20 min' depth='6.873 m' /> + <sample time='62:22 min' depth='6.873 m' /> + <sample time='62:24 min' depth='6.863 m' /> + <sample time='62:26 min' depth='6.842 m' /> + <sample time='62:28 min' depth='6.873 m' /> + <sample time='62:30 min' depth='6.873 m' /> + <sample time='62:32 min' depth='6.842 m' /> + <sample time='62:34 min' depth='6.802 m' /> + <sample time='62:36 min' depth='6.608 m' /> + <sample time='62:38 min' depth='6.587 m' /> + <sample time='62:40 min' depth='6.618 m' /> + <sample time='62:42 min' depth='6.649 m' /> + <sample time='62:44 min' depth='6.659 m' /> + <sample time='62:46 min' depth='6.659 m' /> + <sample time='62:48 min' depth='6.781 m' /> + <sample time='62:50 min' depth='6.751 m' /> + <sample time='62:52 min' depth='6.802 m' /> + <sample time='62:54 min' depth='6.914 m' /> + <sample time='62:56 min' depth='6.985 m' /> + <sample time='62:58 min' depth='7.036 m' /> + <sample time='63:00 min' depth='7.067 m' /> + <sample time='63:02 min' depth='6.975 m' /> + <sample time='63:04 min' depth='6.873 m' /> + <sample time='63:06 min' depth='6.771 m' /> + <sample time='63:08 min' depth='6.638 m' /> + <sample time='63:10 min' depth='6.557 m' /> + <sample time='63:12 min' depth='6.353 m' /> + <sample time='63:14 min' depth='5.894 m' /> + <sample time='63:16 min' depth='6.2 m' /> + <sample time='63:18 min' depth='6.271 m' /> + <sample time='63:20 min' depth='6.22 m' /> + <sample time='63:22 min' depth='6.169 m' /> + <sample time='63:24 min' depth='6.149 m' /> + <sample time='63:26 min' depth='6.159 m' /> + <sample time='63:28 min' depth='6.21 m' /> + <sample time='63:30 min' depth='6.19 m' /> + <sample time='63:32 min' depth='6.19 m' /> + <sample time='63:34 min' depth='6.139 m' /> + <sample time='63:36 min' depth='6.108 m' cns='28%' /> + <sample time='63:38 min' depth='5.741 m' /> + <sample time='63:40 min' depth='5.486 m' /> + <sample time='63:42 min' depth='5.853 m' /> + <sample time='63:44 min' depth='5.792 m' /> + <sample time='63:46 min' depth='5.843 m' /> + <sample time='63:48 min' depth='5.925 m' /> + <sample time='63:50 min' depth='5.996 m' /> + <sample time='63:52 min' depth='6.128 m' /> + <sample time='63:54 min' depth='6.088 m' /> + <sample time='63:56 min' depth='6.108 m' /> + <sample time='63:58 min' depth='6.118 m' /> + <sample time='64:00 min' depth='6.128 m' /> + <sample time='64:02 min' depth='6.118 m' /> + <sample time='64:04 min' depth='6.149 m' /> + <sample time='64:06 min' depth='6.251 m' /> + <sample time='64:08 min' depth='6.343 m' /> + <sample time='64:10 min' depth='6.455 m' /> + <sample time='64:12 min' depth='6.567 m' /> + <sample time='64:14 min' depth='6.689 m' /> + <sample time='64:16 min' depth='6.74 m' /> + <sample time='64:18 min' depth='6.791 m' /> + <sample time='64:20 min' depth='6.73 m' /> + <sample time='64:22 min' depth='6.751 m' /> + <sample time='64:24 min' depth='6.771 m' /> + <sample time='64:26 min' depth='6.812 m' /> + <sample time='64:28 min' depth='6.863 m' /> + <sample time='64:30 min' depth='6.914 m' /> + <sample time='64:32 min' depth='6.822 m' /> + <sample time='64:34 min' depth='6.72 m' /> + <sample time='64:36 min' depth='6.557 m' /> + <sample time='64:38 min' depth='6.353 m' /> + <sample time='64:40 min' depth='6.21 m' /> + <sample time='64:42 min' depth='5.996 m' /> + <sample time='64:44 min' depth='5.741 m' /> + <sample time='64:46 min' depth='5.425 m' /> + <sample time='64:48 min' depth='5.782 m' /> + <sample time='64:50 min' depth='5.772 m' /> + <sample time='64:52 min' depth='5.823 m' /> + <sample time='64:54 min' depth='5.935 m' /> + <sample time='64:56 min' depth='5.996 m' /> + <sample time='64:58 min' depth='6.057 m' /> + <sample time='65:00 min' depth='6.078 m' /> + <sample time='65:02 min' depth='6.088 m' /> + <sample time='65:04 min' depth='6.078 m' /> + <sample time='65:06 min' depth='6.078 m' /> + <sample time='65:08 min' depth='6.118 m' /> + <sample time='65:10 min' depth='6.159 m' /> + <sample time='65:12 min' depth='6.22 m' temp='10.1 C' /> + <sample time='65:14 min' depth='6.322 m' /> + <sample time='65:16 min' depth='6.455 m' /> + <sample time='65:18 min' depth='6.638 m' /> + <sample time='65:20 min' depth='6.638 m' /> + <sample time='65:22 min' depth='6.72 m' /> + <sample time='65:24 min' depth='6.689 m' temp='10.0 C' /> + <sample time='65:26 min' depth='6.628 m' /> + <sample time='65:28 min' depth='6.628 m' /> + <sample time='65:30 min' depth='6.271 m' /> + <sample time='65:32 min' depth='5.976 m' /> + <sample time='65:34 min' depth='6.292 m' /> + <sample time='65:36 min' depth='6.536 m' temp='10.1 C' cns='29%' /> + <sample time='65:38 min' depth='6.669 m' /> + <sample time='65:40 min' depth='6.842 m' /> + <sample time='65:42 min' depth='7.026 m' /> + <sample time='65:44 min' depth='7.005 m' /> + <sample time='65:46 min' depth='7.016 m' /> + <sample time='65:48 min' depth='7.005 m' temp='10.0 C' /> + <sample time='65:50 min' depth='7.016 m' /> + <sample time='65:52 min' depth='7.005 m' /> + <sample time='65:54 min' depth='6.995 m' /> + <sample time='65:56 min' depth='7.005 m' /> + <sample time='65:58 min' depth='6.995 m' /> + <sample time='66:00 min' depth='6.924 m' /> + <sample time='66:02 min' depth='6.985 m' /> + <sample time='66:04 min' depth='7.026 m' /> + <sample time='66:06 min' depth='7.158 m' /> + <sample time='66:08 min' depth='7.118 m' /> + <sample time='66:10 min' depth='7.067 m' /> + <sample time='66:12 min' depth='6.873 m' /> + <sample time='66:14 min' depth='6.516 m' /> + <sample time='66:16 min' depth='6.373 m' /> + <sample time='66:18 min' depth='6.557 m' /> + <sample time='66:20 min' depth='6.506 m' /> + <sample time='66:22 min' depth='6.506 m' /> + <sample time='66:24 min' depth='6.659 m' temp='10.1 C' /> + <sample time='66:26 min' depth='6.74 m' /> + <sample time='66:28 min' depth='6.751 m' /> + <sample time='66:30 min' depth='6.812 m' /> + <sample time='66:32 min' depth='6.832 m' /> + <sample time='66:34 min' depth='6.842 m' /> + <sample time='66:36 min' depth='6.781 m' temp='10.0 C' /> + <sample time='66:38 min' depth='6.74 m' /> + <sample time='66:40 min' depth='6.689 m' /> + <sample time='66:42 min' depth='6.7 m' /> + <sample time='66:44 min' depth='6.72 m' /> + <sample time='66:46 min' depth='6.791 m' /> + <sample time='66:48 min' depth='6.802 m' /> + <sample time='66:50 min' depth='6.832 m' /> + <sample time='66:52 min' depth='6.873 m' /> + <sample time='66:54 min' depth='6.842 m' /> + <sample time='66:56 min' depth='6.893 m' /> + <sample time='66:58 min' depth='6.954 m' /> + <sample time='67:00 min' depth='6.934 m' /> + <sample time='67:02 min' depth='6.924 m' /> + <sample time='67:04 min' depth='6.975 m' /> + <sample time='67:06 min' depth='7.016 m' /> + <sample time='67:08 min' depth='7.046 m' /> + <sample time='67:10 min' depth='7.107 m' /> + <sample time='67:12 min' depth='7.199 m' /> + <sample time='67:14 min' depth='7.199 m' /> + <sample time='67:16 min' depth='7.24 m' /> + <sample time='67:18 min' depth='7.209 m' /> + <sample time='67:20 min' depth='7.199 m' /> + <sample time='67:22 min' depth='7.118 m' /> + <sample time='67:24 min' depth='7.128 m' /> + <sample time='67:26 min' depth='7.097 m' /> + <sample time='67:28 min' depth='7.138 m' /> + <sample time='67:30 min' depth='7.138 m' /> + <sample time='67:32 min' depth='6.802 m' /> + <sample time='67:34 min' depth='6.791 m' /> + <sample time='67:36 min' depth='7.016 m' cns='30%' /> + <sample time='67:38 min' depth='7.199 m' /> + <sample time='67:40 min' depth='7.22 m' /> + <sample time='67:42 min' depth='7.23 m' /> + <sample time='67:44 min' depth='7.22 m' /> + <sample time='67:46 min' depth='7.373 m' /> + <sample time='67:48 min' depth='7.158 m' /> + <sample time='67:50 min' depth='7.097 m' /> + <sample time='67:52 min' depth='7.097 m' /> + <sample time='67:54 min' depth='7.169 m' /> + <sample time='67:56 min' depth='7.189 m' /> + <sample time='67:58 min' depth='7.199 m' /> + <sample time='68:00 min' depth='7.199 m' /> + <sample time='68:02 min' depth='7.209 m' /> + <sample time='68:04 min' depth='7.158 m' /> + <sample time='68:06 min' depth='7.118 m' /> + <sample time='68:08 min' depth='7.005 m' /> + <sample time='68:10 min' depth='6.995 m' /> + <sample time='68:12 min' depth='6.995 m' /> + <sample time='68:14 min' depth='6.975 m' /> + <sample time='68:16 min' depth='6.954 m' /> + <sample time='68:18 min' depth='6.954 m' /> + <sample time='68:20 min' depth='6.985 m' /> + <sample time='68:22 min' depth='7.148 m' /> + <sample time='68:24 min' depth='7.097 m' /> + <sample time='68:26 min' depth='7.026 m' /> + <sample time='68:28 min' depth='6.985 m' /> + <sample time='68:30 min' depth='6.954 m' /> + <sample time='68:32 min' depth='7.016 m' /> + <sample time='68:34 min' depth='6.975 m' /> + <sample time='68:36 min' depth='7.016 m' /> + <sample time='68:38 min' depth='7.036 m' /> + <sample time='68:40 min' depth='6.781 m' /> + <sample time='68:42 min' depth='7.005 m' /> + <sample time='68:44 min' depth='7.118 m' /> + <sample time='68:46 min' depth='7.148 m' /> + <sample time='68:48 min' depth='7.097 m' /> + <sample time='68:50 min' depth='7.097 m' /> + <sample time='68:52 min' depth='7.138 m' /> + <sample time='68:54 min' depth='7.148 m' /> + <sample time='68:56 min' depth='7.158 m' /> + <sample time='68:58 min' depth='7.158 m' /> + <sample time='69:00 min' depth='6.771 m' /> + <sample time='69:02 min' depth='7.046 m' /> + <sample time='69:04 min' depth='7.077 m' /> + <sample time='69:06 min' depth='6.995 m' /> + <sample time='69:08 min' depth='6.526 m' /> + <sample time='69:10 min' depth='6.343 m' /> + <sample time='69:12 min' depth='6.21 m' /> + <sample time='69:14 min' depth='6.638 m' /> + <sample time='69:16 min' depth='6.802 m' /> + <sample time='69:18 min' depth='6.791 m' /> + <sample time='69:20 min' depth='6.873 m' /> + <sample time='69:22 min' depth='6.965 m' /> + <sample time='69:24 min' depth='7.107 m' /> + <sample time='69:26 min' depth='7.22 m' /> + <sample time='69:28 min' depth='7.107 m' /> + <sample time='69:30 min' depth='7.097 m' /> + <sample time='69:32 min' depth='7.087 m' /> + <sample time='69:34 min' depth='7.097 m' /> + <sample time='69:36 min' depth='7.158 m' /> + <sample time='69:38 min' depth='7.199 m' /> + <sample time='69:40 min' depth='7.199 m' /> + <sample time='69:42 min' depth='7.158 m' /> + <sample time='69:44 min' depth='7.097 m' /> + <sample time='69:46 min' depth='7.138 m' /> + <sample time='69:48 min' depth='7.067 m' /> + <sample time='69:50 min' depth='6.679 m' /> + <sample time='69:52 min' depth='7.046 m' /> + <sample time='69:54 min' depth='6.985 m' /> + <sample time='69:56 min' depth='6.914 m' /> + <sample time='69:58 min' depth='6.863 m' /> + <sample time='70:00 min' depth='6.802 m' cns='31%' /> + <sample time='70:02 min' depth='6.893 m' /> + <sample time='70:04 min' depth='6.985 m' /> + <sample time='70:06 min' depth='7.036 m' /> + <sample time='70:08 min' depth='7.158 m' /> + <sample time='70:10 min' depth='7.301 m' /> + <sample time='70:12 min' depth='7.301 m' /> + <sample time='70:14 min' depth='7.22 m' /> + <sample time='70:16 min' depth='7.158 m' /> + <sample time='70:18 min' depth='7.199 m' /> + <sample time='70:20 min' depth='7.158 m' /> + <sample time='70:22 min' depth='6.934 m' /> + <sample time='70:24 min' depth='6.812 m' /> + <sample time='70:26 min' depth='6.679 m' /> + <sample time='70:28 min' depth='6.587 m' /> + <sample time='70:30 min' depth='6.496 m' /> + <sample time='70:32 min' depth='6.394 m' /> + <sample time='70:34 min' depth='6.179 m' /> + <sample time='70:36 min' depth='6.241 m' /> + <sample time='70:38 min' depth='5.914 m' /> + <sample time='70:40 min' depth='6.078 m' /> + <sample time='70:42 min' depth='6.292 m' /> + <sample time='70:44 min' depth='6.394 m' /> + <sample time='70:46 min' depth='6.353 m' /> + <sample time='70:48 min' depth='6.353 m' /> + <sample time='70:50 min' depth='6.414 m' /> + <sample time='70:52 min' depth='6.587 m' /> + <sample time='70:54 min' depth='6.781 m' /> + <sample time='70:56 min' depth='6.73 m' /> + <sample time='70:58 min' depth='6.485 m' /> + <sample time='71:00 min' depth='6.373 m' /> + <sample time='71:02 min' depth='6.587 m' /> + <sample time='71:04 min' depth='6.669 m' /> + <sample time='71:06 min' depth='6.567 m' /> + <sample time='71:08 min' depth='6.71 m' /> + <sample time='71:10 min' depth='6.883 m' /> + <sample time='71:12 min' depth='6.934 m' /> + <sample time='71:14 min' depth='6.965 m' /> + <sample time='71:16 min' depth='7.077 m' /> + <sample time='71:18 min' depth='6.995 m' /> + <sample time='71:20 min' depth='6.975 m' /> + <sample time='71:22 min' depth='6.975 m' /> + <sample time='71:24 min' depth='7.005 m' /> + <sample time='71:26 min' depth='6.903 m' /> + <sample time='71:28 min' depth='6.852 m' /> + <sample time='71:30 min' depth='6.903 m' /> + <sample time='71:32 min' depth='6.791 m' /> + <sample time='71:34 min' depth='6.567 m' /> + <sample time='71:36 min' depth='6.404 m' /> + <sample time='71:38 min' depth='6.445 m' /> + <sample time='71:40 min' depth='6.383 m' /> + <sample time='71:42 min' depth='6.485 m' /> + <sample time='71:44 min' depth='6.496 m' /> + <sample time='71:46 min' depth='6.547 m' /> + <sample time='71:48 min' depth='6.506 m' /> + <sample time='71:50 min' depth='6.383 m' /> + <sample time='71:52 min' depth='6.312 m' /> + <sample time='71:54 min' depth='6.343 m' /> + <sample time='71:56 min' depth='6.281 m' /> + <sample time='71:58 min' depth='6.251 m' /> + <sample time='72:00 min' depth='6.21 m' cns='32%' /> + <sample time='72:02 min' depth='6.128 m' /> + <sample time='72:04 min' depth='6.128 m' /> + <sample time='72:06 min' depth='6.047 m' /> + <sample time='72:08 min' depth='6.037 m' /> + <sample time='72:10 min' depth='5.996 m' /> + <sample time='72:12 min' depth='5.965 m' /> + <sample time='72:14 min' depth='5.965 m' /> + <sample time='72:16 min' depth='5.955 m' /> + <sample time='72:18 min' depth='5.843 m' /> + <sample time='72:20 min' depth='5.772 m' /> + <sample time='72:22 min' depth='5.721 m' /> + <sample time='72:24 min' depth='5.741 m' /> + <sample time='72:26 min' depth='5.741 m' /> + <sample time='72:28 min' depth='5.68 m' /> + <sample time='72:30 min' depth='5.619 m' /> + <sample time='72:32 min' depth='5.527 m' /> + <sample time='72:34 min' depth='5.486 m' /> + <sample time='72:36 min' depth='5.415 m' /> + <sample time='72:38 min' depth='5.374 m' /> + <sample time='72:40 min' depth='4.976 m' /> + <sample time='72:42 min' depth='4.915 m' /> + <sample time='72:44 min' depth='5.374 m' /> + <sample time='72:46 min' depth='5.333 m' /> + <sample time='72:48 min' depth='5.333 m' /> + <sample time='72:50 min' depth='5.354 m' /> + <sample time='72:52 min' depth='5.323 m' /> + <sample time='72:54 min' depth='5.231 m' /> + <sample time='72:56 min' depth='5.088 m' /> + <sample time='72:58 min' depth='5.088 m' /> + <sample time='73:00 min' depth='5.058 m' temp='10.1 C' /> + <sample time='73:02 min' depth='5.017 m' /> + <sample time='73:04 min' depth='5.007 m' /> + <sample time='73:06 min' depth='5.068 m' /> + <sample time='73:08 min' depth='5.058 m' /> + <sample time='73:10 min' depth='5.058 m' /> + <sample time='73:12 min' depth='5.068 m' /> + <sample time='73:14 min' depth='5.037 m' /> + <sample time='73:16 min' depth='5.007 m' /> + <sample time='73:18 min' depth='4.986 m' /> + <sample time='73:20 min' depth='4.925 m' /> + <sample time='73:22 min' depth='4.833 m' /> + <sample time='73:24 min' depth='4.813 m' temp='10.0 C' /> + <sample time='73:26 min' depth='4.793 m' /> + <sample time='73:28 min' depth='4.772 m' /> + <sample time='73:30 min' depth='4.68 m' /> + <sample time='73:32 min' depth='4.599 m' /> + <sample time='73:34 min' depth='4.64 m' /> + <sample time='73:36 min' depth='4.752 m' temp='10.1 C' /> + <sample time='73:38 min' depth='4.701 m' /> + <sample time='73:40 min' depth='4.721 m' /> + <sample time='73:42 min' depth='4.721 m' /> + <sample time='73:44 min' depth='4.701 m' /> + <sample time='73:46 min' depth='4.701 m' /> + <sample time='73:48 min' depth='4.721 m' /> + <sample time='73:50 min' depth='4.731 m' /> + <sample time='73:52 min' depth='4.68 m' /> + <sample time='73:54 min' depth='4.701 m' /> + <sample time='73:56 min' depth='4.66 m' /> + <sample time='73:58 min' depth='4.568 m' /> + <sample time='74:00 min' depth='4.589 m' /> + <sample time='74:02 min' depth='4.63 m' /> + <sample time='74:04 min' depth='4.589 m' /> + <sample time='74:06 min' depth='4.487 m' /> + <sample time='74:08 min' depth='4.375 m' /> + <sample time='74:10 min' depth='4.303 m' /> + <sample time='74:12 min' depth='3.875 m' /> + <sample time='74:14 min' depth='3.855 m' /> + <sample time='74:16 min' depth='4.303 m' /> + <sample time='74:18 min' depth='4.313 m' /> + <sample time='74:20 min' depth='4.273 m' /> + <sample time='74:22 min' depth='4.191 m' /> + <sample time='74:24 min' depth='4.109 m' cns='33%' /> + <sample time='74:26 min' depth='4.12 m' /> + <sample time='74:28 min' depth='4.089 m' /> + <sample time='74:30 min' depth='4.018 m' /> + <sample time='74:32 min' depth='4.028 m' /> + <sample time='74:34 min' depth='4.048 m' /> + <sample time='74:36 min' depth='3.997 m' /> + <sample time='74:38 min' depth='3.956 m' /> + <sample time='74:40 min' depth='3.936 m' /> + <sample time='74:42 min' depth='3.946 m' /> + <sample time='74:44 min' depth='3.865 m' /> + <sample time='74:46 min' depth='3.793 m' /> + <sample time='74:48 min' depth='3.763 m' /> + <sample time='74:50 min' depth='3.783 m' /> + <sample time='74:52 min' depth='3.753 m' /> + <sample time='74:54 min' depth='3.64 m' /> + <sample time='74:56 min' depth='3.671 m' /> + <sample time='74:58 min' depth='3.702 m' /> + <sample time='75:00 min' depth='3.681 m' /> + <sample time='75:02 min' depth='3.691 m' /> + <sample time='75:04 min' depth='3.671 m' /> + <sample time='75:06 min' depth='3.661 m' /> + <sample time='75:08 min' depth='3.661 m' /> + <sample time='75:10 min' depth='3.661 m' /> + <sample time='75:12 min' depth='3.681 m' /> + <sample time='75:14 min' depth='3.661 m' po2='0.7 bar' /> + <sample time='75:16 min' depth='3.681 m' /> + <sample time='75:18 min' depth='3.64 m' /> + <sample time='75:20 min' depth='3.569 m' /> + <sample time='75:22 min' depth='3.528 m' /> + <sample time='75:24 min' depth='3.579 m' /> + <sample time='75:26 min' depth='3.579 m' /> + <sample time='75:28 min' depth='3.508 m' /> + <sample time='75:30 min' depth='3.498 m' /> + <sample time='75:32 min' depth='3.559 m' /> + <sample time='75:34 min' depth='3.549 m' /> + <sample time='75:36 min' depth='3.549 m' /> + <sample time='75:38 min' depth='3.549 m' /> + <sample time='75:40 min' depth='3.61 m' /> + <sample time='75:42 min' depth='3.63 m' /> + <sample time='75:44 min' depth='3.64 m' /> + <sample time='75:46 min' depth='3.63 m' /> + <sample time='75:48 min' depth='3.63 m' /> + <sample time='75:50 min' depth='3.661 m' /> + <sample time='75:52 min' depth='3.651 m' /> + <sample time='75:54 min' depth='3.63 m' /> + <sample time='75:56 min' depth='3.661 m' /> + <sample time='75:58 min' depth='3.6 m' /> + <sample time='76:00 min' depth='3.528 m' /> + <sample time='76:02 min' depth='3.447 m' /> + <sample time='76:04 min' depth='3.334 m' /> + <sample time='76:06 min' depth='3.467 m' /> + <sample time='76:08 min' depth='3.416 m' /> + <sample time='76:10 min' depth='3.253 m' /> + <sample time='76:12 min' depth='3.131 m' /> + <sample time='76:14 min' depth='3.08 m' /> + <sample time='76:16 min' depth='2.967 m' /> + <sample time='76:18 min' depth='3.131 m' /> + <sample time='76:20 min' depth='3.202 m' /> + <sample time='76:22 min' depth='3.049 m' /> + <sample time='76:24 min' depth='3.008 m' /> + <sample time='76:26 min' depth='2.916 m' /> + <sample time='76:28 min' depth='2.896 m' /> + <sample time='76:30 min' depth='2.519 m' /> + <sample time='76:32 min' depth='2.427 m' /> + <sample time='76:34 min' depth='2.356 m' /> + <sample time='76:36 min' depth='3.049 m' /> + <sample time='76:38 min' depth='3.08 m' /> + <sample time='76:40 min' depth='2.967 m' /> + <sample time='76:42 min' depth='2.825 m' /> + <sample time='76:44 min' depth='2.753 m' /> + <sample time='76:46 min' depth='2.661 m' /> + <sample time='76:48 min' depth='2.539 m' /> + <sample time='76:50 min' depth='2.539 m' /> + <sample time='76:52 min' depth='2.519 m' /> + <sample time='76:54 min' depth='2.478 m' /> + <sample time='76:56 min' depth='2.407 m' /> + <sample time='76:58 min' depth='2.111 m' /> + <sample time='77:00 min' depth='1.886 m' /> + <sample time='77:02 min' depth='1.764 m' /> + <sample time='77:04 min' depth='1.723 m' /> + <sample time='77:06 min' depth='2.254 m' /> + <sample time='77:08 min' depth='2.233 m' /> + <sample time='77:10 min' depth='2.182 m' /> + <sample time='77:12 min' depth='2.111 m' /> + <sample time='77:14 min' depth='2.131 m' /> + <sample time='77:16 min' depth='2.09 m' /> + <sample time='77:18 min' depth='1.988 m' /> + <sample time='77:20 min' depth='1.927 m' /> + <sample time='77:22 min' depth='1.917 m' /> + <sample time='77:24 min' depth='1.886 m' /> + <sample time='77:26 min' depth='1.795 m' /> + <sample time='77:28 min' depth='1.723 m' /> + <sample time='77:30 min' depth='1.723 m' /> + <sample time='77:32 min' depth='1.703 m' /> + <sample time='77:34 min' depth='1.672 m' /> + <sample time='77:36 min' depth='1.581 m' /> + <sample time='77:38 min' depth='1.53 m' /> + <sample time='77:40 min' depth='1.509 m' /> + <sample time='77:42 min' depth='1.428 m' /> + <sample time='77:44 min' depth='1.295 m' /> + <sample time='77:46 min' depth='1.183 m' /> + <sample time='77:48 min' depth='1.091 m' /> + <sample time='77:50 min' depth='1.01 m' /> + <sample time='77:52 min' depth='0.887 m' /> + <sample time='77:54 min' depth='0.714 m' /> + <sample time='77:56 min' depth='0.571 m' /> + <sample time='77:58 min' depth='0.591 m' /> + <sample time='78:00 min' depth='0.571 m' cns='34%' /> + <sample time='78:02 min' depth='0.469 m' /> + <sample time='78:04 min' depth='0.265 m' /> + <sample time='78:06 min' depth='0.408 m' /> + <sample time='78:08 min' depth='0.367 m' /> + <sample time='78:10 min' depth='0.387 m' /> + <sample time='78:12 min' depth='0.408 m' /> + <sample time='78:14 min' depth='0.438 m' /> + <sample time='78:16 min' depth='0.306 m' /> + <sample time='78:18 min' depth='0.357 m' /> + <sample time='78:20 min' depth='0.398 m' /> + <sample time='78:22 min' depth='0.367 m' /> + <sample time='78:24 min' depth='0.489 m' /> + <sample time='78:26 min' depth='0.438 m' /> + <sample time='78:28 min' depth='0.255 m' /> + <sample time='78:30 min' depth='0.316 m' /> + <sample time='78:32 min' depth='0.337 m' /> + <sample time='78:34 min' depth='0.235 m' /> + <sample time='78:36 min' depth='0.306 m' /> + <sample time='78:38 min' depth='0.337 m' /> + <sample time='78:40 min' depth='0.316 m' /> + <sample time='78:42 min' depth='0.286 m' /> + <sample time='78:44 min' depth='0.255 m' /> + <sample time='78:46 min' depth='0.316 m' /> + <sample time='78:48 min' depth='0.367 m' /> + <sample time='78:50 min' depth='0.265 m' /> + <sample time='78:52 min' depth='0.337 m' /> + <sample time='78:54 min' depth='0.347 m' /> + <sample time='78:56 min' depth='0.265 m' /> + <sample time='78:58 min' depth='0.275 m' /> + <sample time='79:00 min' depth='0.337 m' /> + <sample time='79:02 min' depth='0.326 m' /> + <sample time='79:04 min' depth='0.367 m' /> + <sample time='79:06 min' depth='0.663 m' /> + <sample time='79:08 min' depth='0.724 m' /> + <sample time='79:10 min' depth='0.693 m' /> + <sample time='79:12 min' depth='0.612 m' /> + <sample time='79:14 min' depth='0.632 m' /> + <sample time='79:16 min' depth='0.52 m' /> + <sample time='79:18 min' depth='0.367 m' /> + <sample time='79:20 min' depth='0.5 m' /> + <sample time='79:22 min' depth='0.591 m' /> + <sample time='79:24 min' depth='0.571 m' /> + <sample time='79:26 min' depth='0.53 m' /> + <sample time='79:28 min' depth='0.54 m' /> + <sample time='79:30 min' depth='0.561 m' /> + <sample time='79:32 min' depth='0.357 m' /> + <sample time='79:34 min' depth='0.387 m' /> + <sample time='79:36 min' depth='0.561 m' /> + <sample time='79:38 min' depth='0.561 m' /> + <sample time='79:40 min' depth='0.581 m' /> + <sample time='79:42 min' depth='0.591 m' /> + <sample time='79:44 min' depth='0.591 m' /> + <sample time='79:46 min' depth='0.581 m' /> + <sample time='79:48 min' depth='0.418 m' /> + <sample time='79:50 min' depth='0.54 m' /> + <sample time='79:52 min' depth='0.622 m' /> + <sample time='79:54 min' depth='0.622 m' /> + <sample time='79:56 min' depth='0.591 m' /> + <sample time='79:58 min' depth='0.612 m' /> + <sample time='80:00 min' depth='0.602 m' /> + <sample time='80:02 min' depth='0.683 m' /> + <sample time='80:04 min' depth='0.653 m' /> + <sample time='80:06 min' depth='0.653 m' /> + <sample time='80:08 min' depth='0.224 m' /> + <sample time='80:10 min' depth='0.255 m' /> + <sample time='80:12 min' depth='0.235 m' /> + <sample time='80:14 min' depth='0.224 m' /> + <sample time='80:16 min' depth='0.224 m' /> + <sample time='80:18 min' depth='0.245 m' /> + <sample time='80:20 min' depth='0.235 m' /> + <sample time='80:22 min' depth='0.224 m' /> + <sample time='80:24 min' depth='0.235 m' /> + <sample time='80:26 min' depth='0.235 m' /> + <sample time='80:28 min' depth='0.224 m' /> + <sample time='80:30 min' depth='0.224 m' /> + <sample time='80:32 min' depth='0.235 m' /> + <sample time='80:34 min' depth='0.224 m' /> + <sample time='80:36 min' depth='0.224 m' /> + <sample time='80:38 min' depth='0.224 m' /> + <sample time='80:40 min' depth='0.224 m' /> + <sample time='80:42 min' depth='0.224 m' /> + <sample time='80:44 min' depth='0.224 m' /> + <sample time='80:46 min' depth='0.224 m' /> + <sample time='80:48 min' depth='0.214 m' /> + <sample time='80:50 min' depth='0.235 m' /> + <sample time='80:52 min' depth='0.224 m' /> + <sample time='80:54 min' depth='0.245 m' /> + <sample time='80:56 min' depth='0.235 m' /> + <sample time='80:58 min' depth='0.224 m' /> + <sample time='81:00 min' depth='0.316 m' temp='10.0 C' /> + <sample time='81:02 min' depth='0.235 m' /> + <sample time='81:04 min' depth='0.235 m' /> + <sample time='81:06 min' depth='0.224 m' /> + <sample time='81:08 min' depth='0.265 m' /> + <sample time='81:10 min' depth='0.265 m' /> + <sample time='81:12 min' depth='0.316 m' /> + <sample time='81:14 min' depth='0.316 m' /> + <sample time='81:16 min' depth='0.337 m' /> + <sample time='81:18 min' depth='0.306 m' /> + <sample time='81:20 min' depth='0.326 m' /> + <sample time='81:22 min' depth='0.245 m' /> + <sample time='81:24 min' depth='0.265 m' temp='10.1 C' /> + <sample time='81:26 min' depth='0.224 m' /> + <sample time='81:28 min' depth='0.235 m' /> + <sample time='81:30 min' depth='0.224 m' /> + <sample time='81:32 min' depth='0.214 m' /> + <sample time='81:34 min' depth='0.235 m' /> + <sample time='81:36 min' depth='0.224 m' /> + <sample time='81:38 min' depth='0.224 m' /> + <sample time='81:40 min' depth='0.224 m' /> + <sample time='81:42 min' depth='0.235 m' /> + <sample time='81:44 min' depth='0.235 m' /> + <sample time='81:46 min' depth='0.224 m' /> + <sample time='81:48 min' depth='0.214 m' /> + <sample time='81:50 min' depth='0.214 m' /> + <sample time='81:52 min' depth='0.214 m' /> + <sample time='81:54 min' depth='0.214 m' /> + <sample time='81:56 min' depth='0.235 m' /> + <sample time='81:58 min' depth='0.224 m' /> + <sample time='82:00 min' depth='0.224 m' temp='10.0 C' /> + <sample time='82:02 min' depth='0.235 m' /> + <sample time='82:04 min' depth='0.235 m' /> + <sample time='82:06 min' depth='0.224 m' /> + <sample time='82:08 min' depth='0.214 m' /> + <sample time='82:10 min' depth='0.235 m' /> + <sample time='82:12 min' depth='0.224 m' temp='9.9 C' /> + <sample time='82:14 min' depth='0.224 m' /> + <sample time='82:16 min' depth='0.224 m' /> + <sample time='82:18 min' depth='0.224 m' /> + <sample time='82:20 min' depth='0.235 m' /> + <sample time='82:22 min' depth='0.224 m' /> + <sample time='82:24 min' depth='0.214 m' /> + <sample time='82:26 min' depth='0.235 m' /> + <sample time='82:28 min' depth='0.235 m' /> + <sample time='82:30 min' depth='0.235 m' /> + <sample time='82:32 min' depth='0.224 m' /> + <sample time='82:34 min' depth='0.224 m' /> + <sample time='82:36 min' depth='0.235 m' temp='9.8 C' /> + <sample time='82:38 min' depth='0.224 m' /> + <sample time='82:40 min' depth='0.214 m' /> + <sample time='82:42 min' depth='0.214 m' /> + <sample time='82:44 min' depth='0.224 m' /> + <sample time='82:46 min' depth='0.224 m' /> + <sample time='82:48 min' depth='0.245 m' temp='9.7 C' /> + <sample time='82:50 min' depth='0.235 m' ndl='0:00 min' stoptime='0:00 min' cns='0%' po2='0.0 bar' /> + </divecomputer> +</dive> +<dive number='1' date='2014-04-02' time='10:00:00' duration='77:54 min'> + <notes>CCR dive</notes> + <cylinder size='2.0 l' workpressure='232.0 bar' description='Oxy2' o2='100.0%' start='190.0 bar' end='130.0 bar' use='oxygen' /> + <cylinder size='2.0 l' workpressure='232.0 bar' description='Dil2' start='185.0 bar' end='130.0 bar' use='diluent' /> + <divecomputer model='Heinrichs Weikamp OSTC 3' deviceid='01234567' diveid='76543210' dctype='CCR'> + <depth max='38.99 m' mean='17.72 m' /> + <temperature water='4.3 C' /> + <surface pressure='1.02 bar' /> + <water salinity='1000 g/l' /> + <event time='0:02 min' type='25' value='21' name='gaschange' /> + <sample time='0:02 min' depth='2.335 m' /> + <sample time='0:04 min' depth='2.916 m' /> + <sample time='0:06 min' depth='3.273 m' /> + <sample time='0:08 min' depth='3.549 m' /> + <sample time='0:10 min' depth='4.038 m' /> + <sample time='0:12 min' depth='4.517 m' temp='10.0 C' ndl='240:00 min' /> + <sample time='0:14 min' depth='5.139 m' /> + <sample time='0:16 min' depth='5.68 m' /> + <sample time='0:18 min' depth='6.088 m' /> + <sample time='0:20 min' depth='6.547 m' /> + <sample time='0:22 min' depth='6.863 m' /> + <sample time='0:24 min' depth='6.965 m' /> + <sample time='0:26 min' depth='6.995 m' /> + <sample time='0:28 min' depth='7.046 m' /> + <sample time='0:30 min' depth='6.985 m' /> + <sample time='0:32 min' depth='6.954 m' /> + <sample time='0:34 min' depth='6.995 m' /> + <sample time='0:36 min' depth='6.965 m' /> + <sample time='0:38 min' depth='6.965 m' /> + <sample time='0:40 min' depth='7.199 m' /> + <sample time='0:42 min' depth='7.271 m' /> + <sample time='0:44 min' depth='7.25 m' /> + <sample time='0:46 min' depth='7.301 m' /> + <sample time='0:48 min' depth='7.148 m' /> + <sample time='0:50 min' depth='7.036 m' /> + <sample time='0:52 min' depth='7.067 m' /> + <sample time='0:54 min' depth='6.954 m' /> + <sample time='0:56 min' depth='6.995 m' /> + <sample time='0:58 min' depth='6.995 m' /> + <sample time='1:00 min' depth='7.056 m' /> + <sample time='1:02 min' depth='7.128 m' /> + <sample time='1:04 min' depth='7.158 m' /> + <sample time='1:06 min' depth='7.067 m' /> + <sample time='1:08 min' depth='6.689 m' /> + <sample time='1:10 min' depth='6.822 m' /> + <sample time='1:12 min' depth='6.791 m' /> + <sample time='1:14 min' depth='6.893 m' /> + <sample time='1:16 min' depth='6.883 m' /> + <sample time='1:18 min' depth='6.883 m' /> + <sample time='1:20 min' depth='6.944 m' /> + <sample time='1:22 min' depth='6.751 m' /> + <sample time='1:24 min' depth='6.781 m' /> + <sample time='1:26 min' depth='6.781 m' /> + <sample time='1:28 min' depth='6.751 m' /> + <sample time='1:30 min' depth='6.74 m' /> + <sample time='1:32 min' depth='6.812 m' /> + <sample time='1:34 min' depth='6.842 m' /> + <sample time='1:36 min' depth='6.893 m' /> + <sample time='1:38 min' depth='7.005 m' /> + <sample time='1:40 min' depth='7.026 m' /> + <sample time='1:42 min' depth='6.995 m' /> + <sample time='1:44 min' depth='7.026 m' /> + <sample time='1:46 min' depth='7.077 m' /> + <sample time='1:48 min' depth='7.148 m' /> + <sample time='1:50 min' depth='7.107 m' /> + <sample time='1:52 min' depth='7.056 m' /> + <sample time='1:54 min' depth='7.036 m' /> + <sample time='1:56 min' depth='7.036 m' /> + <sample time='1:58 min' depth='7.189 m' /> + <sample time='2:00 min' depth='7.536 m' /> + <sample time='2:02 min' depth='7.729 m' /> + <sample time='2:04 min' depth='8.015 m' /> + <sample time='2:06 min' depth='8.219 m' /> + <sample time='2:08 min' depth='8.423 m' /> + <sample time='2:10 min' depth='8.239 m' /> + <sample time='2:12 min' depth='8.851 m' /> + <sample time='2:14 min' depth='9.228 m' /> + <sample time='2:16 min' depth='9.585 m' /> + <sample time='2:18 min' depth='10.003 m' /> + <sample time='2:20 min' depth='10.371 m' /> + <sample time='2:22 min' depth='10.88 m' /> + <sample time='2:24 min' depth='11.247 m' temp='9.9 C' /> + <sample time='2:26 min' depth='11.574 m' /> + <sample time='2:28 min' depth='11.92 m' /> + <sample time='2:30 min' depth='12.216 m' /> + <sample time='2:32 min' depth='12.461 m' /> + <sample time='2:34 min' depth='12.563 m' /> + <sample time='2:36 min' depth='12.716 m' temp='10.0 C' ndl='199:00 min' /> + <sample time='2:38 min' depth='13.022 m' /> + <sample time='2:40 min' depth='13.44 m' /> + <sample time='2:42 min' depth='13.889 m' /> + <sample time='2:44 min' depth='14.327 m' /> + <sample time='2:46 min' depth='14.755 m' /> + <sample time='2:48 min' depth='15.031 m' temp='9.9 C' ndl='89:00 min' /> + <sample time='2:50 min' depth='15.296 m' /> + <sample time='2:52 min' depth='15.53 m' /> + <sample time='2:54 min' depth='15.816 m' /> + <sample time='2:56 min' depth='16.05 m' /> + <sample time='2:58 min' depth='16.091 m' /> + <sample time='3:00 min' depth='16.336 m' ndl='68:00 min' /> + <sample time='3:02 min' depth='16.479 m' /> + <sample time='3:04 min' depth='16.611 m' /> + <sample time='3:06 min' depth='16.642 m' /> + <sample time='3:08 min' depth='16.876 m' /> + <sample time='3:10 min' depth='17.121 m' /> + <sample time='3:12 min' depth='17.294 m' ndl='56:00 min' cns='1%' /> + <sample time='3:14 min' depth='17.447 m' /> + <sample time='3:16 min' depth='17.498 m' /> + <sample time='3:18 min' depth='17.58 m' /> + <sample time='3:20 min' depth='17.814 m' /> + <sample time='3:22 min' depth='18.059 m' /> + <sample time='3:24 min' depth='18.345 m' ndl='46:00 min' /> + <sample time='3:26 min' depth='18.589 m' /> + <sample time='3:28 min' depth='18.855 m' /> + <sample time='3:30 min' depth='19.13 m' /> + <sample time='3:32 min' depth='19.456 m' /> + <sample time='3:34 min' depth='19.762 m' /> + <sample time='3:36 min' depth='20.007 m' temp='9.8 C' ndl='36:00 min' /> + <sample time='3:38 min' depth='20.221 m' /> + <sample time='3:40 min' depth='20.292 m' /> + <sample time='3:42 min' depth='20.252 m' /> + <sample time='3:44 min' depth='20.394 m' /> + <sample time='3:46 min' depth='20.496 m' /> + <sample time='3:48 min' depth='20.557 m' temp='9.1 C' ndl='32:00 min' /> + <sample time='3:50 min' depth='20.527 m' /> + <sample time='3:52 min' depth='20.71 m' /> + <sample time='3:54 min' depth='20.874 m' /> + <sample time='3:56 min' depth='21.027 m' /> + <sample time='3:58 min' depth='21.23 m' /> + <sample time='4:00 min' depth='21.2 m' temp='8.4 C' ndl='29:00 min' /> + <sample time='4:02 min' depth='21.19 m' /> + <sample time='4:04 min' depth='21.159 m' /> + <sample time='4:06 min' depth='21.057 m' /> + <sample time='4:08 min' depth='21.047 m' /> + <sample time='4:10 min' depth='21.088 m' /> + <sample time='4:12 min' depth='21.292 m' temp='7.8 C' /> + <sample time='4:14 min' depth='21.424 m' /> + <sample time='4:16 min' depth='21.587 m' /> + <sample time='4:18 min' depth='21.761 m' /> + <sample time='4:20 min' depth='21.924 m' /> + <sample time='4:22 min' depth='21.985 m' /> + <sample time='4:24 min' depth='22.128 m' temp='7.4 C' ndl='26:00 min' /> + <sample time='4:26 min' depth='22.281 m' /> + <sample time='4:28 min' depth='22.566 m' /> + <sample time='4:30 min' depth='22.811 m' /> + <sample time='4:32 min' depth='23.127 m' /> + <sample time='4:34 min' depth='23.413 m' /> + <sample time='4:36 min' depth='23.77 m' temp='7.0 C' ndl='22:00 min' /> + <sample time='4:38 min' depth='24.188 m' /> + <sample time='4:40 min' depth='24.534 m' /> + <sample time='4:42 min' depth='24.759 m' /> + <sample time='4:44 min' depth='24.901 m' /> + <sample time='4:46 min' depth='25.126 m' /> + <sample time='4:48 min' depth='25.279 m' temp='6.6 C' ndl='18:00 min' /> + <sample time='4:50 min' depth='25.503 m' /> + <sample time='4:52 min' depth='25.646 m' /> + <sample time='4:54 min' depth='25.799 m' /> + <sample time='4:56 min' depth='26.044 m' /> + <sample time='4:58 min' depth='26.268 m' /> + <sample time='5:00 min' depth='26.472 m' temp='6.2 C' ndl='15:00 min' /> + <sample time='5:02 min' depth='26.655 m' /> + <sample time='5:04 min' depth='26.717 m' /> + <sample time='5:06 min' depth='26.788 m' /> + <sample time='5:08 min' depth='26.839 m' /> + <sample time='5:10 min' depth='26.941 m' /> + <sample time='5:12 min' depth='27.175 m' temp='5.8 C' ndl='14:00 min' /> + <sample time='5:14 min' depth='27.441 m' /> + <sample time='5:16 min' depth='27.716 m' /> + <sample time='5:18 min' depth='28.032 m' /> + <sample time='5:20 min' depth='28.307 m' /> + <sample time='5:22 min' depth='28.491 m' /> + <sample time='5:24 min' depth='28.705 m' temp='5.6 C' ndl='12:00 min' /> + <sample time='5:26 min' depth='28.827 m' /> + <sample time='5:28 min' depth='29.011 m' /> + <sample time='5:30 min' depth='29.113 m' /> + <sample time='5:32 min' depth='29.215 m' /> + <sample time='5:34 min' depth='29.347 m' /> + <sample time='5:36 min' depth='29.623 m' temp='5.3 C' ndl='11:00 min' /> + <sample time='5:38 min' depth='29.776 m' /> + <sample time='5:40 min' depth='29.888 m' /> + <sample time='5:42 min' depth='30.01 m' /> + <sample time='5:44 min' depth='30.122 m' /> + <sample time='5:46 min' depth='30.306 m' /> + <sample time='5:48 min' depth='30.52 m' temp='5.2 C' ndl='10:00 min' /> + <sample time='5:50 min' depth='30.846 m' po2='1.2 bar' /> + <sample time='5:52 min' depth='31.05 m' /> + <sample time='5:54 min' depth='31.366 m' /> + <sample time='5:56 min' depth='31.519 m' /> + <sample time='5:58 min' depth='31.652 m' /> + <sample time='6:00 min' depth='31.815 m' temp='5.0 C' ndl='12:00 min' /> + <sample time='6:02 min' depth='32.111 m' /> + <sample time='6:04 min' depth='32.192 m' /> + <sample time='6:06 min' depth='32.437 m' /> + <sample time='6:08 min' depth='32.59 m' /> + <sample time='6:10 min' depth='32.702 m' /> + <sample time='6:12 min' depth='32.835 m' temp='4.8 C' ndl='10:00 min' /> + <sample time='6:14 min' depth='33.049 m' /> + <sample time='6:16 min' depth='33.018 m' /> + <sample time='6:18 min' depth='32.998 m' /> + <sample time='6:20 min' depth='33.569 m' /> + <sample time='6:22 min' depth='33.753 m' /> + <sample time='6:24 min' depth='33.926 m' temp='4.7 C' ndl='9:00 min' /> + <sample time='6:26 min' depth='34.038 m' /> + <sample time='6:28 min' depth='34.181 m' /> + <sample time='6:30 min' depth='34.232 m' /> + <sample time='6:32 min' depth='34.375 m' /> + <sample time='6:34 min' depth='34.364 m' /> + <sample time='6:36 min' depth='34.497 m' temp='4.6 C' /> + <sample time='6:38 min' depth='34.375 m' /> + <sample time='6:40 min' depth='34.364 m' /> + <sample time='6:42 min' depth='34.313 m' /> + <sample time='6:44 min' depth='34.354 m' /> + <sample time='6:46 min' depth='34.415 m' /> + <sample time='6:48 min' depth='34.477 m' /> + <sample time='6:50 min' depth='34.609 m' /> + <sample time='6:52 min' depth='34.721 m' /> + <sample time='6:54 min' depth='34.844 m' /> + <sample time='6:56 min' depth='34.895 m' /> + <sample time='6:58 min' depth='35.037 m' /> + <sample time='7:00 min' depth='35.109 m' temp='4.5 C' ndl='8:00 min' /> + <sample time='7:02 min' depth='35.16 m' /> + <sample time='7:04 min' depth='35.18 m' /> + <sample time='7:06 min' depth='35.17 m' /> + <sample time='7:08 min' depth='35.16 m' /> + <sample time='7:10 min' depth='35.17 m' /> + <sample time='7:12 min' depth='35.058 m' cns='2%' /> + <sample time='7:14 min' depth='34.997 m' /> + <sample time='7:16 min' depth='35.017 m' /> + <sample time='7:18 min' depth='34.905 m' /> + <sample time='7:20 min' depth='34.803 m' /> + <sample time='7:22 min' depth='34.681 m' /> + <sample time='7:24 min' depth='34.589 m' /> + <sample time='7:26 min' depth='34.436 m' /> + <sample time='7:28 min' depth='34.181 m' /> + <sample time='7:30 min' depth='34.018 m' /> + <sample time='7:32 min' depth='33.844 m' /> + <sample time='7:34 min' depth='33.681 m' /> + <sample time='7:36 min' depth='33.416 m' ndl='9:00 min' /> + <sample time='7:38 min' depth='33.039 m' /> + <sample time='7:40 min' depth='32.825 m' /> + <sample time='7:42 min' depth='32.56 m' /> + <sample time='7:44 min' depth='32.417 m' /> + <sample time='7:46 min' depth='32.305 m' /> + <sample time='7:48 min' depth='31.795 m' /> + <sample time='7:50 min' depth='31.519 m' /> + <sample time='7:52 min' depth='31.326 m' /> + <sample time='7:54 min' depth='31.652 m' /> + <sample time='7:56 min' depth='31.652 m' /> + <sample time='7:58 min' depth='31.57 m' /> + <sample time='8:00 min' depth='31.479 m' ndl='10:00 min' /> + <sample time='8:02 min' depth='31.234 m' /> + <sample time='8:04 min' depth='30.683 m' /> + <sample time='8:06 min' depth='30.255 m' /> + <sample time='8:08 min' depth='30.051 m' /> + <sample time='8:10 min' depth='30.398 m' /> + <sample time='8:12 min' depth='30.367 m' ndl='11:00 min' /> + <sample time='8:14 min' depth='30.357 m' /> + <sample time='8:16 min' depth='30.245 m' /> + <sample time='8:18 min' depth='30.133 m' /> + <sample time='8:20 min' depth='30.0 m' /> + <sample time='8:22 min' depth='29.918 m' /> + <sample time='8:24 min' depth='29.766 m' temp='4.6 C' ndl='12:00 min' /> + <sample time='8:26 min' depth='29.592 m' /> + <sample time='8:28 min' depth='29.47 m' /> + <sample time='8:30 min' depth='29.317 m' /> + <sample time='8:32 min' depth='29.164 m' /> + <sample time='8:34 min' depth='28.848 m' /> + <sample time='8:36 min' depth='28.787 m' ndl='14:00 min' /> + <sample time='8:38 min' depth='28.613 m' /> + <sample time='8:40 min' depth='28.562 m' /> + <sample time='8:42 min' depth='28.491 m' /> + <sample time='8:44 min' depth='28.318 m' /> + <sample time='8:46 min' depth='28.236 m' /> + <sample time='8:48 min' depth='28.114 m' temp='4.7 C' ndl='15:00 min' /> + <sample time='8:50 min' depth='27.93 m' /> + <sample time='8:52 min' depth='27.746 m' /> + <sample time='8:54 min' depth='27.532 m' /> + <sample time='8:56 min' depth='27.298 m' /> + <sample time='8:58 min' depth='26.992 m' /> + <sample time='9:00 min' depth='26.717 m' ndl='19:00 min' /> + <sample time='9:02 min' depth='26.207 m' /> + <sample time='9:04 min' depth='25.656 m' /> + <sample time='9:06 min' depth='25.666 m' /> + <sample time='9:08 min' depth='25.656 m' /> + <sample time='9:10 min' depth='25.503 m' /> + <sample time='9:12 min' depth='25.269 m' temp='4.8 C' ndl='25:00 min' cns='3%' /> + <sample time='9:14 min' depth='25.085 m' /> + <sample time='9:16 min' depth='24.891 m' /> + <sample time='9:18 min' depth='24.677 m' /> + <sample time='9:20 min' depth='24.483 m' /> + <sample time='9:22 min' depth='24.208 m' /> + <sample time='9:24 min' depth='23.678 m' temp='5.0 C' ndl='33:00 min' /> + <sample time='9:26 min' depth='23.229 m' /> + <sample time='9:28 min' depth='22.872 m' /> + <sample time='9:30 min' depth='23.107 m' /> + <sample time='9:32 min' depth='23.025 m' /> + <sample time='9:34 min' depth='22.964 m' /> + <sample time='9:36 min' depth='22.913 m' temp='5.2 C' ndl='41:00 min' /> + <sample time='9:38 min' depth='22.984 m' /> + <sample time='9:40 min' depth='23.046 m' /> + <sample time='9:42 min' depth='23.056 m' /> + <sample time='9:44 min' depth='23.107 m' /> + <sample time='9:46 min' depth='23.127 m' /> + <sample time='9:48 min' depth='23.158 m' temp='5.5 C' ndl='38:00 min' /> + <sample time='9:50 min' depth='23.097 m' /> + <sample time='9:52 min' depth='23.117 m' /> + <sample time='9:54 min' depth='23.158 m' /> + <sample time='9:56 min' depth='23.28 m' /> + <sample time='9:58 min' depth='23.474 m' /> + <sample time='10:00 min' depth='23.606 m' temp='5.7 C' ndl='35:00 min' /> + <sample time='10:02 min' depth='23.719 m' /> + <sample time='10:04 min' depth='23.719 m' /> + <sample time='10:06 min' depth='23.759 m' /> + <sample time='10:08 min' depth='23.729 m' /> + <sample time='10:10 min' depth='23.719 m' /> + <sample time='10:12 min' depth='23.708 m' temp='5.8 C' ndl='34:00 min' /> + <sample time='10:14 min' depth='23.729 m' /> + <sample time='10:16 min' depth='23.729 m' /> + <sample time='10:18 min' depth='23.902 m' /> + <sample time='10:20 min' depth='24.137 m' /> + <sample time='10:22 min' depth='24.249 m' /> + <sample time='10:24 min' depth='24.371 m' ndl='29:00 min' /> + <sample time='10:26 min' depth='24.565 m' /> + <sample time='10:28 min' depth='24.708 m' /> + <sample time='10:30 min' depth='24.85 m' /> + <sample time='10:32 min' depth='25.003 m' /> + <sample time='10:34 min' depth='25.156 m' /> + <sample time='10:36 min' depth='25.289 m' ndl='24:00 min' /> + <sample time='10:38 min' depth='25.279 m' /> + <sample time='10:40 min' depth='25.218 m' /> + <sample time='10:42 min' depth='25.187 m' /> + <sample time='10:44 min' depth='25.177 m' /> + <sample time='10:46 min' depth='25.187 m' /> + <sample time='10:48 min' depth='25.207 m' temp='5.6 C' /> + <sample time='10:50 min' depth='25.279 m' /> + <sample time='10:52 min' depth='25.33 m' /> + <sample time='10:54 min' depth='25.391 m' /> + <sample time='10:56 min' depth='25.422 m' /> + <sample time='10:58 min' depth='25.473 m' /> + <sample time='11:00 min' depth='25.493 m' temp='5.5 C' ndl='22:00 min' /> + <sample time='11:02 min' depth='25.564 m' /> + <sample time='11:04 min' depth='25.544 m' /> + <sample time='11:06 min' depth='25.656 m' /> + <sample time='11:08 min' depth='25.676 m' /> + <sample time='11:10 min' depth='25.697 m' /> + <sample time='11:12 min' depth='25.666 m' temp='5.4 C' ndl='21:00 min' cns='4%' /> + <sample time='11:14 min' depth='25.809 m' /> + <sample time='11:16 min' depth='25.84 m' /> + <sample time='11:18 min' depth='25.891 m' /> + <sample time='11:20 min' depth='25.972 m' /> + <sample time='11:22 min' depth='26.044 m' /> + <sample time='11:24 min' depth='26.135 m' ndl='20:00 min' /> + <sample time='11:26 min' depth='26.186 m' /> + <sample time='11:28 min' depth='26.258 m' /> + <sample time='11:30 min' depth='26.288 m' /> + <sample time='11:32 min' depth='26.349 m' /> + <sample time='11:34 min' depth='26.38 m' /> + <sample time='11:36 min' depth='26.37 m' temp='5.3 C' ndl='18:00 min' /> + <sample time='11:38 min' depth='26.349 m' /> + <sample time='11:40 min' depth='26.247 m' /> + <sample time='11:42 min' depth='26.105 m' /> + <sample time='11:44 min' depth='26.095 m' /> + <sample time='11:46 min' depth='26.054 m' /> + <sample time='11:48 min' depth='26.023 m' ndl='19:00 min' /> + <sample time='11:50 min' depth='26.033 m' /> + <sample time='11:52 min' depth='26.033 m' /> + <sample time='11:54 min' depth='26.003 m' /> + <sample time='11:56 min' depth='25.962 m' /> + <sample time='11:58 min' depth='25.942 m' /> + <sample time='12:00 min' depth='25.85 m' ndl='20:00 min' /> + <sample time='12:02 min' depth='25.789 m' /> + <sample time='12:04 min' depth='25.697 m' /> + <sample time='12:06 min' depth='25.595 m' /> + <sample time='12:08 min' depth='25.513 m' /> + <sample time='12:10 min' depth='25.36 m' /> + <sample time='12:12 min' depth='25.238 m' ndl='22:00 min' /> + <sample time='12:14 min' depth='25.136 m' /> + <sample time='12:16 min' depth='25.014 m' /> + <sample time='12:18 min' depth='24.861 m' /> + <sample time='12:20 min' depth='24.259 m' /> + <sample time='12:22 min' depth='24.147 m' /> + <sample time='12:24 min' depth='24.514 m' ndl='27:00 min' /> + <sample time='12:26 min' depth='24.555 m' /> + <sample time='12:28 min' depth='24.596 m' /> + <sample time='12:30 min' depth='24.677 m' /> + <sample time='12:32 min' depth='24.769 m' /> + <sample time='12:34 min' depth='24.861 m' /> + <sample time='12:36 min' depth='24.901 m' temp='5.4 C' ndl='24:00 min' /> + <sample time='12:38 min' depth='24.81 m' /> + <sample time='12:40 min' depth='24.698 m' /> + <sample time='12:42 min' depth='24.534 m' /> + <sample time='12:44 min' depth='24.473 m' /> + <sample time='12:46 min' depth='24.473 m' /> + <sample time='12:48 min' depth='24.463 m' ndl='27:00 min' /> + <sample time='12:50 min' depth='24.463 m' /> + <sample time='12:52 min' depth='24.463 m' /> + <sample time='12:54 min' depth='24.432 m' /> + <sample time='12:56 min' depth='24.402 m' /> + <sample time='12:58 min' depth='24.371 m' /> + <sample time='13:00 min' depth='24.31 m' temp='5.5 C' /> + <sample time='13:02 min' depth='24.259 m' /> + <sample time='13:04 min' depth='24.218 m' /> + <sample time='13:06 min' depth='24.137 m' /> + <sample time='13:08 min' depth='24.065 m' /> + <sample time='13:10 min' depth='23.974 m' /> + <sample time='13:12 min' depth='23.79 m' ndl='30:00 min' /> + <sample time='13:14 min' depth='23.627 m' /> + <sample time='13:16 min' depth='23.413 m' /> + <sample time='13:18 min' depth='23.301 m' /> + <sample time='13:20 min' depth='23.117 m' /> + <sample time='13:22 min' depth='22.791 m' /> + <sample time='13:24 min' depth='22.638 m' temp='5.7 C' ndl='39:00 min' /> + <sample time='13:26 min' depth='22.464 m' /> + <sample time='13:28 min' depth='22.291 m' /> + <sample time='13:30 min' depth='22.016 m' /> + <sample time='13:32 min' depth='21.618 m' /> + <sample time='13:34 min' depth='21.904 m' /> + <sample time='13:36 min' depth='21.842 m' temp='5.8 C' ndl='47:00 min' cns='5%' /> + <sample time='13:38 min' depth='21.771 m' /> + <sample time='13:40 min' depth='21.363 m' /> + <sample time='13:42 min' depth='20.904 m' /> + <sample time='13:44 min' depth='20.741 m' /> + <sample time='13:46 min' depth='21.078 m' /> + <sample time='13:48 min' depth='21.078 m' temp='6.1 C' ndl='55:00 min' /> + <sample time='13:50 min' depth='21.016 m' /> + <sample time='13:52 min' depth='20.955 m' /> + <sample time='13:54 min' depth='20.914 m' /> + <sample time='13:56 min' depth='20.874 m' /> + <sample time='13:58 min' depth='20.802 m' /> + <sample time='14:00 min' depth='20.68 m' temp='6.4 C' ndl='61:00 min' /> + <sample time='14:02 min' depth='20.252 m' /> + <sample time='14:04 min' depth='19.884 m' /> + <sample time='14:06 min' depth='19.589 m' /> + <sample time='14:08 min' depth='18.987 m' /> + <sample time='14:10 min' depth='18.773 m' /> + <sample time='14:12 min' depth='18.906 m' temp='6.7 C' ndl='102:00 min' /> + <sample time='14:14 min' depth='18.783 m' /> + <sample time='14:16 min' depth='18.6 m' /> + <sample time='14:18 min' depth='18.416 m' /> + <sample time='14:20 min' depth='18.222 m' /> + <sample time='14:22 min' depth='18.018 m' /> + <sample time='14:24 min' depth='17.845 m' temp='7.2 C' ndl='159:00 min' /> + <sample time='14:26 min' depth='17.529 m' /> + <sample time='14:28 min' depth='16.785 m' /> + <sample time='14:30 min' depth='16.173 m' /> + <sample time='14:32 min' depth='16.254 m' /> + <sample time='14:34 min' depth='16.193 m' /> + <sample time='14:36 min' depth='16.04 m' temp='8.1 C' ndl='240:00 min' /> + <sample time='14:38 min' depth='16.03 m' /> + <sample time='14:40 min' depth='16.091 m' /> + <sample time='14:42 min' depth='15.918 m' /> + <sample time='14:44 min' depth='15.877 m' /> + <sample time='14:46 min' depth='15.704 m' /> + <sample time='14:48 min' depth='15.53 m' temp='8.7 C' /> + <sample time='14:50 min' depth='15.337 m' /> + <sample time='14:52 min' depth='14.735 m' /> + <sample time='14:54 min' depth='14.398 m' /> + <sample time='14:56 min' depth='14.684 m' /> + <sample time='14:58 min' depth='14.511 m' /> + <sample time='15:00 min' depth='14.368 m' temp='9.2 C' /> + <sample time='15:02 min' depth='14.358 m' /> + <sample time='15:04 min' depth='14.225 m' /> + <sample time='15:06 min' depth='14.143 m' /> + <sample time='15:08 min' depth='13.929 m' /> + <sample time='15:10 min' depth='13.664 m' /> + <sample time='15:12 min' depth='13.246 m' temp='9.5 C' /> + <sample time='15:14 min' depth='12.583 m' /> + <sample time='15:16 min' depth='12.787 m' /> + <sample time='15:18 min' depth='12.767 m' /> + <sample time='15:20 min' depth='12.726 m' /> + <sample time='15:22 min' depth='12.593 m' /> + <sample time='15:24 min' depth='12.461 m' temp='9.7 C' /> + <sample time='15:26 min' depth='12.288 m' /> + <sample time='15:28 min' depth='11.747 m' /> + <sample time='15:30 min' depth='11.472 m' /> + <sample time='15:32 min' depth='11.869 m' /> + <sample time='15:34 min' depth='11.869 m' /> + <sample time='15:36 min' depth='11.91 m' temp='9.8 C' cns='6%' /> + <sample time='15:38 min' depth='11.92 m' /> + <sample time='15:40 min' depth='11.91 m' /> + <sample time='15:42 min' depth='11.859 m' /> + <sample time='15:44 min' depth='11.819 m' /> + <sample time='15:46 min' depth='11.808 m' /> + <sample time='15:48 min' depth='11.808 m' /> + <sample time='15:50 min' depth='11.829 m' /> + <sample time='15:52 min' depth='11.829 m' /> + <sample time='15:54 min' depth='11.839 m' /> + <sample time='15:56 min' depth='11.849 m' /> + <sample time='15:58 min' depth='11.92 m' /> + <sample time='16:00 min' depth='11.971 m' /> + <sample time='16:02 min' depth='11.951 m' /> + <sample time='16:04 min' depth='11.941 m' /> + <sample time='16:06 min' depth='11.951 m' /> + <sample time='16:08 min' depth='11.971 m' /> + <sample time='16:10 min' depth='12.094 m' /> + <sample time='16:12 min' depth='12.175 m' /> + <sample time='16:14 min' depth='12.277 m' /> + <sample time='16:16 min' depth='12.339 m' /> + <sample time='16:18 min' depth='12.471 m' /> + <sample time='16:20 min' depth='12.553 m' /> + <sample time='16:22 min' depth='12.665 m' /> + <sample time='16:24 min' depth='12.828 m' /> + <sample time='16:26 min' depth='12.91 m' /> + <sample time='16:28 min' depth='13.001 m' /> + <sample time='16:30 min' depth='12.94 m' /> + <sample time='16:32 min' depth='12.859 m' /> + <sample time='16:34 min' depth='12.797 m' /> + <sample time='16:36 min' depth='12.675 m' /> + <sample time='16:38 min' depth='12.634 m' /> + <sample time='16:40 min' depth='12.716 m' /> + <sample time='16:42 min' depth='12.787 m' /> + <sample time='16:44 min' depth='12.848 m' /> + <sample time='16:46 min' depth='12.93 m' /> + <sample time='16:48 min' depth='13.001 m' /> + <sample time='16:50 min' depth='13.185 m' /> + <sample time='16:52 min' depth='13.338 m' /> + <sample time='16:54 min' depth='13.562 m' /> + <sample time='16:56 min' depth='13.756 m' /> + <sample time='16:58 min' depth='14.021 m' /> + <sample time='17:00 min' depth='14.143 m' /> + <sample time='17:02 min' depth='14.347 m' /> + <sample time='17:04 min' depth='14.429 m' /> + <sample time='17:06 min' depth='14.46 m' /> + <sample time='17:08 min' depth='14.46 m' /> + <sample time='17:10 min' depth='14.47 m' /> + <sample time='17:12 min' depth='14.623 m' /> + <sample time='17:14 min' depth='14.704 m' /> + <sample time='17:16 min' depth='14.806 m' /> + <sample time='17:18 min' depth='14.878 m' /> + <sample time='17:20 min' depth='14.98 m' /> + <sample time='17:22 min' depth='15.031 m' /> + <sample time='17:24 min' depth='14.969 m' /> + <sample time='17:26 min' depth='15.102 m' /> + <sample time='17:28 min' depth='15.102 m' /> + <sample time='17:30 min' depth='15.112 m' /> + <sample time='17:32 min' depth='15.082 m' /> + <sample time='17:34 min' depth='15.041 m' /> + <sample time='17:36 min' depth='15.061 m' /> + <sample time='17:38 min' depth='15.031 m' /> + <sample time='17:40 min' depth='15.082 m' /> + <sample time='17:42 min' depth='15.153 m' /> + <sample time='17:44 min' depth='15.224 m' /> + <sample time='17:46 min' depth='15.337 m' /> + <sample time='17:48 min' depth='15.469 m' /> + <sample time='17:50 min' depth='15.602 m' /> + <sample time='17:52 min' depth='15.765 m' /> + <sample time='17:54 min' depth='15.857 m' /> + <sample time='17:56 min' depth='15.867 m' /> + <sample time='17:58 min' depth='15.867 m' /> + <sample time='18:00 min' depth='15.795 m' cns='7%' /> + <sample time='18:02 min' depth='15.785 m' /> + <sample time='18:04 min' depth='15.836 m' /> + <sample time='18:06 min' depth='15.816 m' /> + <sample time='18:08 min' depth='15.857 m' /> + <sample time='18:10 min' depth='15.877 m' /> + <sample time='18:12 min' depth='15.938 m' temp='9.9 C' /> + <sample time='18:14 min' depth='15.928 m' /> + <sample time='18:16 min' depth='15.979 m' /> + <sample time='18:18 min' depth='15.999 m' /> + <sample time='18:20 min' depth='16.02 m' /> + <sample time='18:22 min' depth='16.071 m' /> + <sample time='18:24 min' depth='16.091 m' /> + <sample time='18:26 min' depth='16.203 m' /> + <sample time='18:28 min' depth='16.275 m' /> + <sample time='18:30 min' depth='16.397 m' /> + <sample time='18:32 min' depth='16.519 m' /> + <sample time='18:34 min' depth='16.581 m' /> + <sample time='18:36 min' depth='16.795 m' /> + <sample time='18:38 min' depth='16.927 m' /> + <sample time='18:40 min' depth='17.08 m' /> + <sample time='18:42 min' depth='17.09 m' /> + <sample time='18:44 min' depth='17.101 m' /> + <sample time='18:46 min' depth='17.111 m' /> + <sample time='18:48 min' depth='17.223 m' /> + <sample time='18:50 min' depth='17.407 m' /> + <sample time='18:52 min' depth='17.519 m' /> + <sample time='18:54 min' depth='17.57 m' /> + <sample time='18:56 min' depth='17.539 m' /> + <sample time='18:58 min' depth='17.509 m' /> + <sample time='19:00 min' depth='17.478 m' ndl='205:00 min' /> + <sample time='19:02 min' depth='17.468 m' /> + <sample time='19:04 min' depth='17.447 m' /> + <sample time='19:06 min' depth='17.519 m' /> + <sample time='19:08 min' depth='17.56 m' /> + <sample time='19:10 min' depth='17.641 m' /> + <sample time='19:12 min' depth='17.702 m' ndl='179:00 min' /> + <sample time='19:14 min' depth='17.804 m' /> + <sample time='19:16 min' depth='17.916 m' /> + <sample time='19:18 min' depth='17.988 m' /> + <sample time='19:20 min' depth='18.029 m' /> + <sample time='19:22 min' depth='18.069 m' /> + <sample time='19:24 min' depth='18.171 m' ndl='139:00 min' /> + <sample time='19:26 min' depth='18.222 m' /> + <sample time='19:28 min' depth='18.294 m' /> + <sample time='19:30 min' depth='18.426 m' /> + <sample time='19:32 min' depth='18.416 m' /> + <sample time='19:34 min' depth='18.416 m' /> + <sample time='19:36 min' depth='18.426 m' temp='9.8 C' ndl='126:00 min' /> + <sample time='19:38 min' depth='18.375 m' /> + <sample time='19:40 min' depth='18.396 m' /> + <sample time='19:42 min' depth='18.447 m' /> + <sample time='19:44 min' depth='18.549 m' /> + <sample time='19:46 min' depth='18.304 m' /> + <sample time='19:48 min' depth='18.467 m' temp='9.5 C' ndl='132:00 min' /> + <sample time='19:50 min' depth='18.824 m' /> + <sample time='19:52 min' depth='18.946 m' /> + <sample time='19:54 min' depth='19.028 m' /> + <sample time='19:56 min' depth='19.008 m' /> + <sample time='19:58 min' depth='18.926 m' /> + <sample time='20:00 min' depth='18.885 m' temp='9.1 C' ndl='104:00 min' cns='8%' /> + <sample time='20:02 min' depth='19.028 m' /> + <sample time='20:04 min' depth='19.069 m' /> + <sample time='20:06 min' depth='19.16 m' /> + <sample time='20:08 min' depth='19.252 m' /> + <sample time='20:10 min' depth='19.293 m' /> + <sample time='20:12 min' depth='19.293 m' temp='8.7 C' ndl='87:00 min' /> + <sample time='20:14 min' depth='19.283 m' /> + <sample time='20:16 min' depth='19.313 m' /> + <sample time='20:18 min' depth='19.446 m' /> + <sample time='20:20 min' depth='19.548 m' /> + <sample time='20:22 min' depth='19.63 m' /> + <sample time='20:24 min' depth='19.67 m' temp='8.4 C' ndl='77:00 min' /> + <sample time='20:26 min' depth='19.721 m' /> + <sample time='20:28 min' depth='19.752 m' /> + <sample time='20:30 min' depth='19.813 m' /> + <sample time='20:32 min' depth='19.864 m' /> + <sample time='20:34 min' depth='19.905 m' /> + <sample time='20:36 min' depth='19.966 m' temp='8.1 C' ndl='71:00 min' /> + <sample time='20:38 min' depth='20.027 m' /> + <sample time='20:40 min' depth='20.078 m' /> + <sample time='20:42 min' depth='20.16 m' /> + <sample time='20:44 min' depth='20.272 m' /> + <sample time='20:46 min' depth='20.394 m' /> + <sample time='20:48 min' depth='20.527 m' temp='7.9 C' ndl='61:00 min' /> + <sample time='20:50 min' depth='20.649 m' /> + <sample time='20:52 min' depth='20.659 m' /> + <sample time='20:54 min' depth='20.68 m' /> + <sample time='20:56 min' depth='20.598 m' /> + <sample time='20:58 min' depth='20.619 m' /> + <sample time='21:00 min' depth='20.629 m' temp='7.6 C' ndl='60:00 min' /> + <sample time='21:02 min' depth='20.659 m' /> + <sample time='21:04 min' depth='20.761 m' /> + <sample time='21:06 min' depth='20.812 m' /> + <sample time='21:08 min' depth='20.863 m' /> + <sample time='21:10 min' depth='20.945 m' /> + <sample time='21:12 min' depth='20.996 m' temp='7.4 C' ndl='55:00 min' /> + <sample time='21:14 min' depth='21.057 m' /> + <sample time='21:16 min' depth='21.129 m' /> + <sample time='21:18 min' depth='21.19 m' /> + <sample time='21:20 min' depth='21.261 m' /> + <sample time='21:22 min' depth='21.404 m' /> + <sample time='21:24 min' depth='21.485 m' temp='7.3 C' ndl='49:00 min' /> + <sample time='21:26 min' depth='21.638 m' /> + <sample time='21:28 min' depth='21.659 m' /> + <sample time='21:30 min' depth='21.638 m' /> + <sample time='21:32 min' depth='21.618 m' /> + <sample time='21:34 min' depth='21.587 m' /> + <sample time='21:36 min' depth='21.598 m' temp='7.1 C' ndl='48:00 min' /> + <sample time='21:38 min' depth='21.638 m' /> + <sample time='21:40 min' depth='21.7 m' /> + <sample time='21:42 min' depth='21.771 m' /> + <sample time='21:44 min' depth='21.74 m' /> + <sample time='21:46 min' depth='21.791 m' /> + <sample time='21:48 min' depth='21.812 m' temp='7.0 C' ndl='45:00 min' /> + <sample time='21:50 min' depth='21.863 m' /> + <sample time='21:52 min' depth='21.924 m' /> + <sample time='21:54 min' depth='21.975 m' /> + <sample time='21:56 min' depth='21.954 m' /> + <sample time='21:58 min' depth='21.873 m' /> + <sample time='22:00 min' depth='21.751 m' temp='6.8 C' cns='9%' /> + <sample time='22:02 min' depth='21.669 m' /> + <sample time='22:04 min' depth='21.608 m' /> + <sample time='22:06 min' depth='21.516 m' /> + <sample time='22:08 min' depth='21.485 m' /> + <sample time='22:10 min' depth='21.455 m' /> + <sample time='22:12 min' depth='21.445 m' temp='6.7 C' ndl='48:00 min' /> + <sample time='22:14 min' depth='21.394 m' /> + <sample time='22:16 min' depth='21.353 m' /> + <sample time='22:18 min' depth='21.22 m' /> + <sample time='22:20 min' depth='21.139 m' /> + <sample time='22:22 min' depth='21.037 m' /> + <sample time='22:24 min' depth='20.955 m' ndl='54:00 min' /> + <sample time='22:26 min' depth='20.945 m' /> + <sample time='22:28 min' depth='20.925 m' /> + <sample time='22:30 min' depth='20.945 m' /> + <sample time='22:32 min' depth='20.986 m' /> + <sample time='22:34 min' depth='20.884 m' /> + <sample time='22:36 min' depth='20.843 m' temp='6.8 C' ndl='55:00 min' /> + <sample time='22:38 min' depth='20.772 m' /> + <sample time='22:40 min' depth='20.557 m' /> + <sample time='22:42 min' depth='20.374 m' /> + <sample time='22:44 min' depth='20.7 m' /> + <sample time='22:46 min' depth='20.7 m' /> + <sample time='22:48 min' depth='20.772 m' ndl='56:00 min' /> + <sample time='22:50 min' depth='20.833 m' /> + <sample time='22:52 min' depth='20.965 m' /> + <sample time='22:54 min' depth='21.19 m' /> + <sample time='22:56 min' depth='21.271 m' /> + <sample time='22:58 min' depth='21.465 m' /> + <sample time='23:00 min' depth='21.598 m' temp='6.9 C' ndl='47:00 min' /> + <sample time='23:02 min' depth='21.71 m' /> + <sample time='23:04 min' depth='21.832 m' /> + <sample time='23:06 min' depth='21.934 m' /> + <sample time='23:08 min' depth='22.016 m' /> + <sample time='23:10 min' depth='22.118 m' /> + <sample time='23:12 min' depth='22.342 m' ndl='40:00 min' /> + <sample time='23:14 min' depth='22.373 m' /> + <sample time='23:16 min' depth='22.495 m' /> + <sample time='23:18 min' depth='22.536 m' /> + <sample time='23:20 min' depth='22.515 m' /> + <sample time='23:22 min' depth='22.464 m' /> + <sample time='23:24 min' depth='22.342 m' temp='6.7 C' ndl='38:00 min' /> + <sample time='23:26 min' depth='22.271 m' /> + <sample time='23:28 min' depth='22.199 m' /> + <sample time='23:30 min' depth='22.209 m' /> + <sample time='23:32 min' depth='22.199 m' /> + <sample time='23:34 min' depth='22.158 m' /> + <sample time='23:36 min' depth='22.097 m' temp='6.6 C' ndl='40:00 min' /> + <sample time='23:38 min' depth='21.954 m' /> + <sample time='23:40 min' depth='21.863 m' /> + <sample time='23:42 min' depth='21.7 m' /> + <sample time='23:44 min' depth='21.577 m' /> + <sample time='23:46 min' depth='21.475 m' /> + <sample time='23:48 min' depth='21.383 m' ndl='48:00 min' /> + <sample time='23:50 min' depth='20.965 m' /> + <sample time='23:52 min' depth='20.68 m' /> + <sample time='23:54 min' depth='20.761 m' /> + <sample time='23:56 min' depth='20.598 m' /> + <sample time='23:58 min' depth='20.537 m' /> + <sample time='24:00 min' depth='20.201 m' ndl='60:00 min' /> + <sample time='24:02 min' depth='19.925 m' /> + <sample time='24:04 min' depth='19.976 m' /> + <sample time='24:06 min' depth='20.099 m' /> + <sample time='24:08 min' depth='20.17 m' /> + <sample time='24:10 min' depth='20.252 m' /> + <sample time='24:12 min' depth='20.313 m' temp='6.8 C' ndl='61:00 min' /> + <sample time='24:14 min' depth='20.303 m' /> + <sample time='24:16 min' depth='20.364 m' /> + <sample time='24:18 min' depth='20.343 m' /> + <sample time='24:20 min' depth='20.323 m' /> + <sample time='24:22 min' depth='20.354 m' /> + <sample time='24:24 min' depth='20.364 m' temp='7.0 C' ndl='60:00 min' cns='10%' /> + <sample time='24:26 min' depth='20.466 m' /> + <sample time='24:28 min' depth='20.547 m' /> + <sample time='24:30 min' depth='20.639 m' /> + <sample time='24:32 min' depth='20.68 m' /> + <sample time='24:34 min' depth='20.71 m' /> + <sample time='24:36 min' depth='20.782 m' ndl='54:00 min' /> + <sample time='24:38 min' depth='20.833 m' /> + <sample time='24:40 min' depth='20.772 m' /> + <sample time='24:42 min' depth='20.874 m' /> + <sample time='24:44 min' depth='21.016 m' /> + <sample time='24:46 min' depth='21.016 m' /> + <sample time='24:48 min' depth='21.088 m' ndl='50:00 min' /> + <sample time='24:50 min' depth='21.159 m' /> + <sample time='24:52 min' depth='21.383 m' /> + <sample time='24:54 min' depth='21.414 m' /> + <sample time='24:56 min' depth='21.434 m' /> + <sample time='24:58 min' depth='21.485 m' /> + <sample time='25:00 min' depth='21.598 m' ndl='45:00 min' /> + <sample time='25:02 min' depth='21.72 m' /> + <sample time='25:04 min' depth='21.751 m' /> + <sample time='25:06 min' depth='21.781 m' /> + <sample time='25:08 min' depth='21.873 m' /> + <sample time='25:10 min' depth='21.853 m' /> + <sample time='25:12 min' depth='21.771 m' temp='6.9 C' ndl='42:00 min' /> + <sample time='25:14 min' depth='21.536 m' /> + <sample time='25:16 min' depth='21.21 m' /> + <sample time='25:18 min' depth='20.7 m' /> + <sample time='25:20 min' depth='20.894 m' /> + <sample time='25:22 min' depth='20.853 m' /> + <sample time='25:24 min' depth='21.016 m' temp='6.8 C' ndl='52:00 min' /> + <sample time='25:26 min' depth='20.955 m' /> + <sample time='25:28 min' depth='20.976 m' /> + <sample time='25:30 min' depth='20.945 m' /> + <sample time='25:32 min' depth='20.976 m' /> + <sample time='25:34 min' depth='21.149 m' /> + <sample time='25:36 min' depth='21.353 m' ndl='47:00 min' /> + <sample time='25:38 min' depth='21.567 m' /> + <sample time='25:40 min' depth='21.853 m' /> + <sample time='25:42 min' depth='22.169 m' /> + <sample time='25:44 min' depth='22.505 m' /> + <sample time='25:46 min' depth='22.811 m' /> + <sample time='25:48 min' depth='23.025 m' ndl='32:00 min' /> + <sample time='25:50 min' depth='23.199 m' /> + <sample time='25:52 min' depth='23.402 m' /> + <sample time='25:54 min' depth='23.535 m' /> + <sample time='25:56 min' depth='23.79 m' /> + <sample time='25:58 min' depth='24.004 m' /> + <sample time='26:00 min' depth='24.29 m' temp='6.6 C' ndl='24:00 min' /> + <sample time='26:02 min' depth='24.606 m' /> + <sample time='26:04 min' depth='25.014 m' /> + <sample time='26:06 min' depth='25.411 m' /> + <sample time='26:08 min' depth='25.717 m' /> + <sample time='26:10 min' depth='26.033 m' /> + <sample time='26:12 min' depth='26.36 m' temp='6.4 C' ndl='17:00 min' /> + <sample time='26:14 min' depth='26.666 m' /> + <sample time='26:16 min' depth='26.87 m' /> + <sample time='26:18 min' depth='26.971 m' /> + <sample time='26:20 min' depth='27.033 m' /> + <sample time='26:22 min' depth='27.124 m' /> + <sample time='26:24 min' depth='27.196 m' temp='6.1 C' ndl='14:00 min' cns='11%' /> + <sample time='26:26 min' depth='27.369 m' /> + <sample time='26:28 min' depth='27.522 m' /> + <sample time='26:30 min' depth='27.634 m' /> + <sample time='26:32 min' depth='27.716 m' /> + <sample time='26:34 min' depth='27.818 m' /> + <sample time='26:36 min' depth='27.91 m' temp='5.8 C' ndl='12:00 min' /> + <sample time='26:38 min' depth='28.093 m' /> + <sample time='26:40 min' depth='28.399 m' /> + <sample time='26:42 min' depth='28.552 m' /> + <sample time='26:44 min' depth='28.827 m' /> + <sample time='26:46 min' depth='28.991 m' /> + <sample time='26:48 min' depth='28.97 m' temp='5.5 C' ndl='11:00 min' /> + <sample time='26:50 min' depth='29.011 m' /> + <sample time='26:52 min' depth='28.96 m' /> + <sample time='26:54 min' depth='28.817 m' /> + <sample time='26:56 min' depth='28.705 m' /> + <sample time='26:58 min' depth='28.817 m' /> + <sample time='27:00 min' depth='28.419 m' temp='5.2 C' /> + <sample time='27:02 min' depth='28.328 m' /> + <sample time='27:04 min' depth='28.267 m' /> + <sample time='27:06 min' depth='28.154 m' /> + <sample time='27:08 min' depth='28.063 m' /> + <sample time='27:10 min' depth='28.083 m' /> + <sample time='27:12 min' depth='27.971 m' temp='5.0 C' ndl='12:00 min' /> + <sample time='27:14 min' depth='27.95 m' /> + <sample time='27:16 min' depth='27.94 m' /> + <sample time='27:18 min' depth='27.91 m' /> + <sample time='27:20 min' depth='27.889 m' /> + <sample time='27:22 min' depth='27.879 m' /> + <sample time='27:24 min' depth='27.746 m' temp='4.9 C' /> + <sample time='27:26 min' depth='27.604 m' /> + <sample time='27:28 min' depth='27.492 m' /> + <sample time='27:30 min' depth='27.43 m' /> + <sample time='27:32 min' depth='27.451 m' /> + <sample time='27:34 min' depth='27.43 m' /> + <sample time='27:36 min' depth='27.226 m' temp='4.8 C' /> + <sample time='27:38 min' depth='27.084 m' /> + <sample time='27:40 min' depth='27.349 m' /> + <sample time='27:42 min' depth='27.379 m' /> + <sample time='27:44 min' depth='27.41 m' /> + <sample time='27:46 min' depth='27.502 m' /> + <sample time='27:48 min' depth='27.624 m' /> + <sample time='27:50 min' depth='27.665 m' /> + <sample time='27:52 min' depth='27.767 m' /> + <sample time='27:54 min' depth='27.787 m' /> + <sample time='27:56 min' depth='27.777 m' /> + <sample time='27:58 min' depth='27.757 m' /> + <sample time='28:00 min' depth='27.808 m' ndl='11:00 min' /> + <sample time='28:02 min' depth='27.838 m' /> + <sample time='28:04 min' depth='27.869 m' /> + <sample time='28:06 min' depth='27.869 m' /> + <sample time='28:08 min' depth='27.797 m' /> + <sample time='28:10 min' depth='27.41 m' /> + <sample time='28:12 min' depth='27.175 m' ndl='12:00 min' /> + <sample time='28:14 min' depth='27.43 m' /> + <sample time='28:16 min' depth='27.512 m' /> + <sample time='28:18 min' depth='27.645 m' /> + <sample time='28:20 min' depth='27.726 m' /> + <sample time='28:22 min' depth='27.818 m' /> + <sample time='28:24 min' depth='27.93 m' temp='4.9 C' ndl='11:00 min' cns='12%' /> + <sample time='28:26 min' depth='28.022 m' /> + <sample time='28:28 min' depth='28.022 m' /> + <sample time='28:30 min' depth='27.981 m' /> + <sample time='28:32 min' depth='27.92 m' /> + <sample time='28:34 min' depth='27.961 m' /> + <sample time='28:36 min' depth='28.022 m' temp='4.8 C' ndl='10:00 min' /> + <sample time='28:38 min' depth='28.001 m' /> + <sample time='28:40 min' depth='27.828 m' /> + <sample time='28:42 min' depth='27.828 m' /> + <sample time='28:44 min' depth='27.889 m' /> + <sample time='28:46 min' depth='28.001 m' /> + <sample time='28:48 min' depth='28.012 m' /> + <sample time='28:50 min' depth='28.012 m' /> + <sample time='28:52 min' depth='27.991 m' /> + <sample time='28:54 min' depth='27.95 m' /> + <sample time='28:56 min' depth='27.93 m' /> + <sample time='28:58 min' depth='27.92 m' /> + <sample time='29:00 min' depth='27.91 m' temp='4.7 C' /> + <sample time='29:02 min' depth='27.991 m' /> + <sample time='29:04 min' depth='28.022 m' /> + <sample time='29:06 min' depth='28.073 m' /> + <sample time='29:08 min' depth='28.063 m' /> + <sample time='29:10 min' depth='28.032 m' /> + <sample time='29:12 min' depth='28.093 m' /> + <sample time='29:14 min' depth='28.144 m' /> + <sample time='29:16 min' depth='28.256 m' /> + <sample time='29:18 min' depth='28.379 m' /> + <sample time='29:20 min' depth='28.542 m' /> + <sample time='29:22 min' depth='28.685 m' /> + <sample time='29:24 min' depth='28.817 m' ndl='9:00 min' /> + <sample time='29:26 min' depth='29.062 m' /> + <sample time='29:28 min' depth='29.164 m' /> + <sample time='29:30 min' depth='29.245 m' /> + <sample time='29:32 min' depth='29.429 m' /> + <sample time='29:34 min' depth='29.664 m' /> + <sample time='29:36 min' depth='29.888 m' ndl='7:00 min' /> + <sample time='29:38 min' depth='29.98 m' /> + <sample time='29:40 min' depth='29.949 m' /> + <sample time='29:42 min' depth='29.908 m' /> + <sample time='29:44 min' depth='29.99 m' /> + <sample time='29:46 min' depth='30.031 m' /> + <sample time='29:48 min' depth='30.184 m' /> + <sample time='29:50 min' depth='30.367 m' /> + <sample time='29:52 min' depth='30.561 m' /> + <sample time='29:54 min' depth='30.734 m' /> + <sample time='29:56 min' depth='30.775 m' /> + <sample time='29:58 min' depth='30.775 m' /> + <sample time='30:00 min' depth='30.806 m' temp='4.6 C' ndl='6:00 min' /> + <sample time='30:02 min' depth='30.836 m' /> + <sample time='30:04 min' depth='30.928 m' /> + <sample time='30:06 min' depth='31.02 m' /> + <sample time='30:08 min' depth='31.132 m' /> + <sample time='30:10 min' depth='31.336 m' /> + <sample time='30:12 min' depth='31.56 m' /> + <sample time='30:14 min' depth='31.825 m' /> + <sample time='30:16 min' depth='32.029 m' /> + <sample time='30:18 min' depth='32.192 m' /> + <sample time='30:20 min' depth='32.325 m' /> + <sample time='30:22 min' depth='32.488 m' /> + <sample time='30:24 min' depth='32.692 m' temp='4.5 C' ndl='5:00 min' /> + <sample time='30:26 min' depth='32.937 m' /> + <sample time='30:28 min' depth='33.12 m' /> + <sample time='30:30 min' depth='33.222 m' /> + <sample time='30:32 min' depth='33.284 m' /> + <sample time='30:34 min' depth='33.335 m' /> + <sample time='30:36 min' depth='33.477 m' ndl='4:00 min' /> + <sample time='30:38 min' depth='33.651 m' /> + <sample time='30:40 min' depth='33.875 m' /> + <sample time='30:42 min' depth='34.171 m' /> + <sample time='30:44 min' depth='34.375 m' /> + <sample time='30:46 min' depth='34.446 m' /> + <sample time='30:48 min' depth='34.548 m' cns='13%' /> + <sample time='30:50 min' depth='34.619 m' /> + <sample time='30:52 min' depth='34.752 m' /> + <sample time='30:54 min' depth='35.058 m' /> + <sample time='30:56 min' depth='35.17 m' /> + <sample time='30:58 min' depth='35.333 m' /> + <sample time='31:00 min' depth='35.445 m' ndl='3:00 min' /> + <sample time='31:02 min' depth='35.578 m' /> + <sample time='31:04 min' depth='35.741 m' /> + <sample time='31:06 min' depth='35.945 m' /> + <sample time='31:08 min' depth='36.169 m' /> + <sample time='31:10 min' depth='36.496 m' /> + <sample time='31:12 min' depth='36.74 m' temp='4.4 C' /> + <sample time='31:14 min' depth='36.914 m' /> + <sample time='31:16 min' depth='37.128 m' /> + <sample time='31:18 min' depth='37.424 m' /> + <sample time='31:20 min' depth='37.515 m' /> + <sample time='31:22 min' depth='37.597 m' /> + <sample time='31:24 min' depth='37.689 m' ndl='2:00 min' /> + <sample time='31:26 min' depth='37.811 m' /> + <sample time='31:28 min' depth='37.903 m' /> + <sample time='31:30 min' depth='38.046 m' /> + <sample time='31:32 min' depth='38.158 m' /> + <sample time='31:34 min' depth='38.423 m' /> + <sample time='31:36 min' depth='38.474 m' /> + <sample time='31:38 min' depth='38.535 m' /> + <sample time='31:40 min' depth='38.586 m' /> + <sample time='31:42 min' depth='38.647 m' /> + <sample time='31:44 min' depth='38.668 m' /> + <sample time='31:46 min' depth='38.668 m' /> + <sample time='31:48 min' depth='38.688 m' temp='4.3 C' /> + <sample time='31:50 min' depth='38.749 m' /> + <sample time='31:52 min' depth='38.749 m' /> + <sample time='31:54 min' depth='38.759 m' /> + <sample time='31:56 min' depth='38.77 m' /> + <sample time='31:58 min' depth='38.8 m' /> + <sample time='32:00 min' depth='38.759 m' /> + <sample time='32:02 min' depth='38.79 m' /> + <sample time='32:04 min' depth='38.759 m' /> + <sample time='32:06 min' depth='38.708 m' /> + <sample time='32:08 min' depth='38.708 m' /> + <sample time='32:10 min' depth='38.708 m' /> + <sample time='32:12 min' depth='38.729 m' ndl='1:00 min' /> + <sample time='32:14 min' depth='38.77 m' /> + <sample time='32:16 min' depth='38.861 m' /> + <sample time='32:18 min' depth='38.882 m' /> + <sample time='32:20 min' depth='38.892 m' /> + <sample time='32:22 min' depth='38.923 m' /> + <sample time='32:24 min' depth='38.974 m' /> + <sample time='32:26 min' depth='38.974 m' /> + <sample time='32:28 min' depth='38.902 m' /> + <sample time='32:30 min' depth='38.423 m' /> + <sample time='32:32 min' depth='38.606 m' /> + <sample time='32:34 min' depth='38.78 m' /> + <sample time='32:36 min' depth='38.749 m' /> + <sample time='32:38 min' depth='38.729 m' /> + <sample time='32:40 min' depth='38.739 m' /> + <sample time='32:42 min' depth='38.759 m' /> + <sample time='32:44 min' depth='38.78 m' /> + <sample time='32:46 min' depth='38.678 m' /> + <sample time='32:48 min' depth='38.79 m' cns='14%' /> + <sample time='32:50 min' depth='38.698 m' /> + <sample time='32:52 min' depth='38.596 m' /> + <sample time='32:54 min' depth='38.494 m' /> + <sample time='32:56 min' depth='38.341 m' /> + <sample time='32:58 min' depth='38.178 m' /> + <sample time='33:00 min' depth='38.076 m' /> + <sample time='33:02 min' depth='37.984 m' /> + <sample time='33:04 min' depth='37.974 m' /> + <sample time='33:06 min' depth='38.056 m' /> + <sample time='33:08 min' depth='38.107 m' /> + <sample time='33:10 min' depth='38.097 m' /> + <sample time='33:12 min' depth='38.137 m' /> + <sample time='33:14 min' depth='38.117 m' /> + <sample time='33:16 min' depth='38.046 m' /> + <sample time='33:18 min' depth='38.005 m' /> + <sample time='33:20 min' depth='37.893 m' /> + <sample time='33:22 min' depth='37.852 m' /> + <sample time='33:24 min' depth='37.811 m' ndl='0:00 min' /> + <sample time='33:26 min' depth='37.638 m' /> + <sample time='33:28 min' depth='37.546 m' /> + <sample time='33:30 min' depth='37.444 m' /> + <sample time='33:32 min' depth='37.24 m' /> + <sample time='33:34 min' depth='37.169 m' /> + <sample time='33:36 min' depth='37.077 m' /> + <sample time='33:38 min' depth='36.863 m' /> + <sample time='33:40 min' depth='36.363 m' /> + <sample time='33:42 min' depth='36.027 m' /> + <sample time='33:44 min' depth='36.292 m' /> + <sample time='33:46 min' depth='36.118 m' /> + <sample time='33:48 min' depth='36.098 m' /> + <sample time='33:50 min' depth='35.853 m' /> + <sample time='33:52 min' depth='35.67 m' /> + <sample time='33:54 min' depth='35.323 m' /> + <sample time='33:56 min' depth='34.874 m' /> + <sample time='33:58 min' depth='34.65 m' /> + <sample time='34:00 min' depth='35.017 m' temp='4.4 C' /> + <sample time='34:02 min' depth='34.905 m' /> + <sample time='34:04 min' depth='34.721 m' /> + <sample time='34:06 min' depth='34.589 m' /> + <sample time='34:08 min' depth='34.344 m' /> + <sample time='34:10 min' depth='34.028 m' /> + <sample time='34:12 min' depth='33.702 m' /> + <sample time='34:14 min' depth='33.314 m' /> + <sample time='34:16 min' depth='32.58 m' /> + <sample time='34:18 min' depth='32.08 m' /> + <sample time='34:20 min' depth='32.111 m' /> + <sample time='34:22 min' depth='32.029 m' /> + <sample time='34:24 min' depth='31.774 m' /> + <sample time='34:26 min' depth='31.53 m' /> + <sample time='34:28 min' depth='31.326 m' /> + <sample time='34:30 min' depth='31.152 m' /> + <sample time='34:32 min' depth='31.01 m' /> + <sample time='34:34 min' depth='30.816 m' /> + <sample time='34:36 min' depth='30.622 m' /> + <sample time='34:38 min' depth='30.439 m' /> + <sample time='34:40 min' depth='30.102 m' /> + <sample time='34:42 min' depth='29.449 m' /> + <sample time='34:44 min' depth='29.562 m' /> + <sample time='34:46 min' depth='29.541 m' /> + <sample time='34:48 min' depth='29.449 m' temp='4.5 C' /> + <sample time='34:50 min' depth='29.266 m' /> + <sample time='34:52 min' depth='29.052 m' /> + <sample time='34:54 min' depth='28.797 m' /> + <sample time='34:56 min' depth='28.572 m' /> + <sample time='34:58 min' depth='28.369 m' /> + <sample time='35:00 min' depth='28.256 m' /> + <sample time='35:02 min' depth='28.154 m' /> + <sample time='35:04 min' depth='27.726 m' /> + <sample time='35:06 min' depth='27.522 m' /> + <sample time='35:08 min' depth='27.838 m' /> + <sample time='35:10 min' depth='27.757 m' /> + <sample time='35:12 min' depth='27.787 m' temp='4.6 C' cns='15%' /> + <sample time='35:14 min' depth='27.757 m' /> + <sample time='35:16 min' depth='27.665 m' /> + <sample time='35:18 min' depth='27.553 m' /> + <sample time='35:20 min' depth='27.502 m' /> + <sample time='35:22 min' depth='27.42 m' /> + <sample time='35:24 min' depth='27.369 m' temp='4.7 C' /> + <sample time='35:26 min' depth='27.226 m' /> + <sample time='35:28 min' depth='27.165 m' /> + <sample time='35:30 min' depth='26.982 m' /> + <sample time='35:32 min' depth='26.829 m' /> + <sample time='35:34 min' depth='26.747 m' /> + <sample time='35:36 min' depth='26.166 m' temp='4.8 C' /> + <sample time='35:38 min' depth='25.952 m' /> + <sample time='35:40 min' depth='26.023 m' /> + <sample time='35:42 min' depth='26.023 m' /> + <sample time='35:44 min' depth='26.013 m' /> + <sample time='35:46 min' depth='26.227 m' /> + <sample time='35:48 min' depth='26.176 m' temp='4.9 C' /> + <sample time='35:50 min' depth='26.227 m' /> + <sample time='35:52 min' depth='26.166 m' /> + <sample time='35:54 min' depth='26.105 m' /> + <sample time='35:56 min' depth='26.084 m' /> + <sample time='35:58 min' depth='26.033 m' /> + <sample time='36:00 min' depth='26.044 m' temp='5.0 C' /> + <sample time='36:02 min' depth='26.033 m' /> + <sample time='36:04 min' depth='25.891 m' /> + <sample time='36:06 min' depth='25.86 m' /> + <sample time='36:08 min' depth='25.84 m' /> + <sample time='36:10 min' depth='25.36 m' /> + <sample time='36:12 min' depth='25.258 m' temp='5.1 C' /> + <sample time='36:14 min' depth='25.33 m' /> + <sample time='36:16 min' depth='25.687 m' /> + <sample time='36:18 min' depth='25.748 m' /> + <sample time='36:20 min' depth='25.809 m' /> + <sample time='36:22 min' depth='25.809 m' /> + <sample time='36:24 min' depth='25.86 m' /> + <sample time='36:26 min' depth='25.911 m' /> + <sample time='36:28 min' depth='25.799 m' /> + <sample time='36:30 min' depth='25.829 m' /> + <sample time='36:32 min' depth='25.778 m' /> + <sample time='36:34 min' depth='25.85 m' /> + <sample time='36:36 min' depth='25.88 m' /> + <sample time='36:38 min' depth='25.952 m' /> + <sample time='36:40 min' depth='26.013 m' /> + <sample time='36:42 min' depth='25.993 m' /> + <sample time='36:44 min' depth='26.003 m' /> + <sample time='36:46 min' depth='26.044 m' /> + <sample time='36:48 min' depth='26.033 m' temp='5.2 C' /> + <sample time='36:50 min' depth='26.064 m' /> + <sample time='36:52 min' depth='26.146 m' /> + <sample time='36:54 min' depth='26.156 m' /> + <sample time='36:56 min' depth='26.176 m' /> + <sample time='36:58 min' depth='26.197 m' /> + <sample time='37:00 min' depth='26.197 m' /> + <sample time='37:02 min' depth='26.258 m' /> + <sample time='37:04 min' depth='26.319 m' /> + <sample time='37:06 min' depth='26.431 m' /> + <sample time='37:08 min' depth='26.462 m' /> + <sample time='37:10 min' depth='26.513 m' /> + <sample time='37:12 min' depth='26.574 m' cns='16%' /> + <sample time='37:14 min' depth='26.645 m' /> + <sample time='37:16 min' depth='26.696 m' /> + <sample time='37:18 min' depth='26.717 m' /> + <sample time='37:20 min' depth='26.747 m' /> + <sample time='37:22 min' depth='26.737 m' /> + <sample time='37:24 min' depth='26.757 m' /> + <sample time='37:26 min' depth='26.757 m' /> + <sample time='37:28 min' depth='26.808 m' /> + <sample time='37:30 min' depth='26.849 m' /> + <sample time='37:32 min' depth='26.91 m' /> + <sample time='37:34 min' depth='27.022 m' /> + <sample time='37:36 min' depth='27.063 m' /> + <sample time='37:38 min' depth='27.114 m' /> + <sample time='37:40 min' depth='27.145 m' /> + <sample time='37:42 min' depth='27.145 m' /> + <sample time='37:44 min' depth='27.216 m' /> + <sample time='37:46 min' depth='27.206 m' /> + <sample time='37:48 min' depth='27.196 m' temp='5.1 C' /> + <sample time='37:50 min' depth='27.145 m' /> + <sample time='37:52 min' depth='27.104 m' /> + <sample time='37:54 min' depth='26.982 m' /> + <sample time='37:56 min' depth='26.87 m' /> + <sample time='37:58 min' depth='26.768 m' /> + <sample time='38:00 min' depth='26.717 m' /> + <sample time='38:02 min' depth='26.635 m' /> + <sample time='38:04 min' depth='26.594 m' /> + <sample time='38:06 min' depth='26.523 m' /> + <sample time='38:08 min' depth='26.421 m' /> + <sample time='38:10 min' depth='26.329 m' /> + <sample time='38:12 min' depth='26.217 m' /> + <sample time='38:14 min' depth='26.146 m' /> + <sample time='38:16 min' depth='25.901 m' /> + <sample time='38:18 min' depth='25.799 m' /> + <sample time='38:20 min' depth='25.707 m' /> + <sample time='38:22 min' depth='25.727 m' /> + <sample time='38:24 min' depth='25.707 m' /> + <sample time='38:26 min' depth='25.707 m' /> + <sample time='38:28 min' depth='25.595 m' /> + <sample time='38:30 min' depth='25.534 m' /> + <sample time='38:32 min' depth='25.452 m' /> + <sample time='38:34 min' depth='25.34 m' /> + <sample time='38:36 min' depth='25.32 m' temp='5.2 C' /> + <sample time='38:38 min' depth='25.33 m' /> + <sample time='38:40 min' depth='25.309 m' /> + <sample time='38:42 min' depth='25.258 m' /> + <sample time='38:44 min' depth='25.218 m' /> + <sample time='38:46 min' depth='25.279 m' /> + <sample time='38:48 min' depth='25.35 m' temp='5.3 C' /> + <sample time='38:50 min' depth='25.411 m' /> + <sample time='38:52 min' depth='25.422 m' /> + <sample time='38:54 min' depth='25.381 m' /> + <sample time='38:56 min' depth='25.34 m' /> + <sample time='38:58 min' depth='25.248 m' /> + <sample time='39:00 min' depth='25.238 m' temp='5.4 C' /> + <sample time='39:02 min' depth='25.32 m' /> + <sample time='39:04 min' depth='25.309 m' /> + <sample time='39:06 min' depth='25.299 m' /> + <sample time='39:08 min' depth='25.32 m' /> + <sample time='39:10 min' depth='25.391 m' /> + <sample time='39:12 min' depth='25.401 m' /> + <sample time='39:14 min' depth='25.422 m' /> + <sample time='39:16 min' depth='25.483 m' /> + <sample time='39:18 min' depth='25.523 m' /> + <sample time='39:20 min' depth='25.595 m' /> + <sample time='39:22 min' depth='25.789 m' /> + <sample time='39:24 min' depth='25.86 m' /> + <sample time='39:26 min' depth='25.911 m' /> + <sample time='39:28 min' depth='26.064 m' /> + <sample time='39:30 min' depth='26.105 m' /> + <sample time='39:32 min' depth='26.197 m' /> + <sample time='39:34 min' depth='26.258 m' /> + <sample time='39:36 min' depth='26.268 m' cns='17%' /> + <sample time='39:38 min' depth='26.37 m' /> + <sample time='39:40 min' depth='26.594 m' /> + <sample time='39:42 min' depth='26.625 m' /> + <sample time='39:44 min' depth='26.604 m' /> + <sample time='39:46 min' depth='26.564 m' /> + <sample time='39:48 min' depth='26.451 m' /> + <sample time='39:50 min' depth='26.625 m' /> + <sample time='39:52 min' depth='26.462 m' /> + <sample time='39:54 min' depth='26.543 m' /> + <sample time='39:56 min' depth='26.288 m' /> + <sample time='39:58 min' depth='26.37 m' /> + <sample time='40:00 min' depth='26.36 m' temp='5.3 C' /> + <sample time='40:02 min' depth='26.207 m' /> + <sample time='40:04 min' depth='26.156 m' /> + <sample time='40:06 min' depth='26.064 m' /> + <sample time='40:08 min' depth='26.003 m' /> + <sample time='40:10 min' depth='26.013 m' /> + <sample time='40:12 min' depth='25.972 m' /> + <sample time='40:14 min' depth='25.931 m' /> + <sample time='40:16 min' depth='25.86 m' /> + <sample time='40:18 min' depth='25.778 m' /> + <sample time='40:20 min' depth='25.646 m' /> + <sample time='40:22 min' depth='25.534 m' /> + <sample time='40:24 min' depth='25.473 m' /> + <sample time='40:26 min' depth='25.33 m' /> + <sample time='40:28 min' depth='25.177 m' /> + <sample time='40:30 min' depth='25.034 m' /> + <sample time='40:32 min' depth='24.891 m' /> + <sample time='40:34 min' depth='24.738 m' /> + <sample time='40:36 min' depth='24.657 m' /> + <sample time='40:38 min' depth='24.545 m' /> + <sample time='40:40 min' depth='24.443 m' /> + <sample time='40:42 min' depth='24.402 m' /> + <sample time='40:44 min' depth='24.33 m' /> + <sample time='40:46 min' depth='24.269 m' /> + <sample time='40:48 min' depth='24.218 m' temp='5.4 C' /> + <sample time='40:50 min' depth='24.228 m' /> + <sample time='40:52 min' depth='24.228 m' /> + <sample time='40:54 min' depth='23.78 m' /> + <sample time='40:56 min' depth='23.719 m' /> + <sample time='40:58 min' depth='24.075 m' /> + <sample time='41:00 min' depth='24.096 m' temp='5.6 C' /> + <sample time='41:02 min' depth='24.137 m' /> + <sample time='41:04 min' depth='24.208 m' /> + <sample time='41:06 min' depth='24.177 m' /> + <sample time='41:08 min' depth='24.218 m' /> + <sample time='41:10 min' depth='24.106 m' /> + <sample time='41:12 min' depth='23.586 m' temp='5.7 C' /> + <sample time='41:14 min' depth='23.341 m' /> + <sample time='41:16 min' depth='23.739 m' /> + <sample time='41:18 min' depth='23.719 m' /> + <sample time='41:20 min' depth='23.719 m' /> + <sample time='41:22 min' depth='23.719 m' /> + <sample time='41:24 min' depth='23.708 m' temp='5.8 C' /> + <sample time='41:26 min' depth='23.719 m' /> + <sample time='41:28 min' depth='23.759 m' /> + <sample time='41:30 min' depth='23.821 m' /> + <sample time='41:32 min' depth='23.861 m' /> + <sample time='41:34 min' depth='23.851 m' /> + <sample time='41:36 min' depth='23.872 m' temp='5.9 C' /> + <sample time='41:38 min' depth='23.861 m' /> + <sample time='41:40 min' depth='23.933 m' /> + <sample time='41:42 min' depth='24.055 m' /> + <sample time='41:44 min' depth='24.147 m' /> + <sample time='41:46 min' depth='24.259 m' /> + <sample time='41:48 min' depth='24.422 m' /> + <sample time='41:50 min' depth='24.473 m' /> + <sample time='41:52 min' depth='24.504 m' /> + <sample time='41:54 min' depth='24.483 m' /> + <sample time='41:56 min' depth='24.504 m' /> + <sample time='41:58 min' depth='24.432 m' /> + <sample time='42:00 min' depth='24.422 m' cns='18%' /> + <sample time='42:02 min' depth='24.33 m' /> + <sample time='42:04 min' depth='24.31 m' /> + <sample time='42:06 min' depth='24.351 m' /> + <sample time='42:08 min' depth='24.361 m' /> + <sample time='42:10 min' depth='24.453 m' /> + <sample time='42:12 min' depth='24.208 m' /> + <sample time='42:14 min' depth='24.177 m' /> + <sample time='42:16 min' depth='24.147 m' /> + <sample time='42:18 min' depth='24.075 m' /> + <sample time='42:20 min' depth='23.994 m' /> + <sample time='42:22 min' depth='23.943 m' /> + <sample time='42:24 min' depth='23.943 m' temp='5.8 C' /> + <sample time='42:26 min' depth='23.912 m' /> + <sample time='42:28 min' depth='23.872 m' /> + <sample time='42:30 min' depth='23.912 m' /> + <sample time='42:32 min' depth='23.963 m' /> + <sample time='42:34 min' depth='24.025 m' /> + <sample time='42:36 min' depth='24.086 m' /> + <sample time='42:38 min' depth='24.126 m' /> + <sample time='42:40 min' depth='24.157 m' /> + <sample time='42:42 min' depth='24.157 m' /> + <sample time='42:44 min' depth='24.249 m' /> + <sample time='42:46 min' depth='24.29 m' /> + <sample time='42:48 min' depth='24.351 m' /> + <sample time='42:50 min' depth='24.412 m' /> + <sample time='42:52 min' depth='24.453 m' /> + <sample time='42:54 min' depth='24.422 m' /> + <sample time='42:56 min' depth='24.453 m' /> + <sample time='42:58 min' depth='24.504 m' /> + <sample time='43:00 min' depth='24.555 m' /> + <sample time='43:02 min' depth='24.616 m' /> + <sample time='43:04 min' depth='24.657 m' /> + <sample time='43:06 min' depth='24.718 m' /> + <sample time='43:08 min' depth='24.749 m' /> + <sample time='43:10 min' depth='24.769 m' /> + <sample time='43:12 min' depth='24.779 m' /> + <sample time='43:14 min' depth='24.799 m' /> + <sample time='43:16 min' depth='24.85 m' /> + <sample time='43:18 min' depth='24.871 m' /> + <sample time='43:20 min' depth='24.901 m' /> + <sample time='43:22 min' depth='24.881 m' /> + <sample time='43:24 min' depth='24.85 m' temp='5.7 C' /> + <sample time='43:26 min' depth='24.85 m' /> + <sample time='43:28 min' depth='24.779 m' /> + <sample time='43:30 min' depth='24.698 m' /> + <sample time='43:32 min' depth='24.606 m' /> + <sample time='43:34 min' depth='24.514 m' /> + <sample time='43:36 min' depth='24.443 m' /> + <sample time='43:38 min' depth='24.341 m' /> + <sample time='43:40 min' depth='24.29 m' /> + <sample time='43:42 min' depth='24.249 m' /> + <sample time='43:44 min' depth='24.177 m' /> + <sample time='43:46 min' depth='24.106 m' /> + <sample time='43:48 min' depth='24.055 m' /> + <sample time='43:50 min' depth='24.025 m' /> + <sample time='43:52 min' depth='23.963 m' /> + <sample time='43:54 min' depth='23.974 m' /> + <sample time='43:56 min' depth='23.994 m' /> + <sample time='43:58 min' depth='24.035 m' /> + <sample time='44:00 min' depth='24.137 m' temp='5.8 C' cns='19%' /> + <sample time='44:02 min' depth='24.188 m' /> + <sample time='44:04 min' depth='24.259 m' /> + <sample time='44:06 min' depth='24.31 m' /> + <sample time='44:08 min' depth='24.341 m' /> + <sample time='44:10 min' depth='24.402 m' /> + <sample time='44:12 min' depth='24.483 m' in_deco='1' stoptime='1:00 min' stopdepth='6.0 m' /> + <sample time='44:14 min' depth='24.545 m' /> + <sample time='44:16 min' depth='24.606 m' /> + <sample time='44:18 min' depth='24.667 m' /> + <sample time='44:20 min' depth='24.749 m' /> + <sample time='44:22 min' depth='24.799 m' /> + <sample time='44:24 min' depth='24.901 m' /> + <sample time='44:26 min' depth='25.024 m' /> + <sample time='44:28 min' depth='25.136 m' /> + <sample time='44:30 min' depth='25.258 m' /> + <sample time='44:32 min' depth='25.371 m' /> + <sample time='44:34 min' depth='25.452 m' /> + <sample time='44:36 min' depth='25.513 m' /> + <sample time='44:38 min' depth='25.625 m' /> + <sample time='44:40 min' depth='25.687 m' /> + <sample time='44:42 min' depth='25.789 m' /> + <sample time='44:44 min' depth='25.809 m' /> + <sample time='44:46 min' depth='25.942 m' /> + <sample time='44:48 min' depth='25.931 m' temp='5.7 C' /> + <sample time='44:50 min' depth='26.033 m' /> + <sample time='44:52 min' depth='26.095 m' /> + <sample time='44:54 min' depth='26.054 m' /> + <sample time='44:56 min' depth='26.033 m' /> + <sample time='44:58 min' depth='25.901 m' /> + <sample time='45:00 min' depth='25.86 m' temp='5.5 C' /> + <sample time='45:02 min' depth='25.778 m' /> + <sample time='45:04 min' depth='25.727 m' /> + <sample time='45:06 min' depth='25.656 m' /> + <sample time='45:08 min' depth='25.574 m' /> + <sample time='45:10 min' depth='25.585 m' /> + <sample time='45:12 min' depth='25.574 m' /> + <sample time='45:14 min' depth='25.554 m' /> + <sample time='45:16 min' depth='25.605 m' /> + <sample time='45:18 min' depth='25.564 m' /> + <sample time='45:20 min' depth='25.564 m' /> + <sample time='45:22 min' depth='25.503 m' /> + <sample time='45:24 min' depth='25.523 m' temp='5.4 C' /> + <sample time='45:26 min' depth='25.503 m' /> + <sample time='45:28 min' depth='25.33 m' /> + <sample time='45:30 min' depth='25.34 m' /> + <sample time='45:32 min' depth='25.33 m' /> + <sample time='45:34 min' depth='25.411 m' /> + <sample time='45:36 min' depth='25.534 m' /> + <sample time='45:38 min' depth='25.564 m' /> + <sample time='45:40 min' depth='25.625 m' /> + <sample time='45:42 min' depth='25.615 m' /> + <sample time='45:44 min' depth='25.513 m' /> + <sample time='45:46 min' depth='25.279 m' /> + <sample time='45:48 min' depth='25.167 m' /> + <sample time='45:50 min' depth='24.952 m' /> + <sample time='45:52 min' depth='24.667 m' /> + <sample time='45:54 min' depth='24.341 m' /> + <sample time='45:56 min' depth='24.065 m' /> + <sample time='45:58 min' depth='23.77 m' /> + <sample time='46:00 min' depth='23.453 m' /> + <sample time='46:02 min' depth='22.821 m' /> + <sample time='46:04 min' depth='22.424 m' /> + <sample time='46:06 min' depth='22.526 m' /> + <sample time='46:08 min' depth='22.22 m' /> + <sample time='46:10 min' depth='21.791 m' /> + <sample time='46:12 min' depth='21.169 m' temp='5.6 C' /> + <sample time='46:14 min' depth='20.965 m' /> + <sample time='46:16 min' depth='21.088 m' /> + <sample time='46:18 min' depth='20.914 m' /> + <sample time='46:20 min' depth='20.772 m' /> + <sample time='46:22 min' depth='20.7 m' /> + <sample time='46:24 min' depth='20.608 m' temp='6.0 C' cns='20%' /> + <sample time='46:26 min' depth='20.466 m' /> + <sample time='46:28 min' depth='20.313 m' /> + <sample time='46:30 min' depth='20.119 m' /> + <sample time='46:32 min' depth='19.946 m' /> + <sample time='46:34 min' depth='19.946 m' /> + <sample time='46:36 min' depth='19.956 m' temp='6.3 C' /> + <sample time='46:38 min' depth='19.997 m' /> + <sample time='46:40 min' depth='19.997 m' /> + <sample time='46:42 min' depth='19.946 m' /> + <sample time='46:44 min' depth='19.915 m' /> + <sample time='46:46 min' depth='19.915 m' /> + <sample time='46:48 min' depth='19.711 m' temp='6.6 C' /> + <sample time='46:50 min' depth='19.997 m' /> + <sample time='46:52 min' depth='20.099 m' /> + <sample time='46:54 min' depth='20.109 m' /> + <sample time='46:56 min' depth='20.139 m' /> + <sample time='46:58 min' depth='20.119 m' /> + <sample time='47:00 min' depth='20.099 m' temp='6.9 C' /> + <sample time='47:02 min' depth='20.15 m' /> + <sample time='47:04 min' depth='20.201 m' /> + <sample time='47:06 min' depth='20.343 m' /> + <sample time='47:08 min' depth='20.394 m' /> + <sample time='47:10 min' depth='20.456 m' /> + <sample time='47:12 min' depth='20.557 m' temp='7.0 C' /> + <sample time='47:14 min' depth='20.68 m' /> + <sample time='47:16 min' depth='20.761 m' /> + <sample time='47:18 min' depth='20.843 m' /> + <sample time='47:20 min' depth='20.884 m' /> + <sample time='47:22 min' depth='20.904 m' /> + <sample time='47:24 min' depth='20.874 m' temp='7.1 C' /> + <sample time='47:26 min' depth='20.884 m' /> + <sample time='47:28 min' depth='20.853 m' /> + <sample time='47:30 min' depth='20.792 m' /> + <sample time='47:32 min' depth='20.772 m' /> + <sample time='47:34 min' depth='20.721 m' /> + <sample time='47:36 min' depth='20.7 m' /> + <sample time='47:38 min' depth='20.68 m' /> + <sample time='47:40 min' depth='20.659 m' /> + <sample time='47:42 min' depth='20.68 m' /> + <sample time='47:44 min' depth='20.721 m' /> + <sample time='47:46 min' depth='20.792 m' /> + <sample time='47:48 min' depth='20.7 m' temp='7.0 C' /> + <sample time='47:50 min' depth='20.629 m' /> + <sample time='47:52 min' depth='20.557 m' /> + <sample time='47:54 min' depth='20.527 m' /> + <sample time='47:56 min' depth='20.445 m' /> + <sample time='47:58 min' depth='20.445 m' /> + <sample time='48:00 min' depth='20.241 m' /> + <sample time='48:02 min' depth='20.17 m' /> + <sample time='48:04 min' depth='20.099 m' /> + <sample time='48:06 min' depth='20.068 m' /> + <sample time='48:08 min' depth='20.007 m' /> + <sample time='48:10 min' depth='20.17 m' /> + <sample time='48:12 min' depth='19.823 m' temp='7.1 C' in_deco='0' stopdepth='0.0 m' /> + <sample time='48:14 min' depth='19.803 m' /> + <sample time='48:16 min' depth='19.772 m' /> + <sample time='48:18 min' depth='19.742 m' /> + <sample time='48:20 min' depth='19.385 m' /> + <sample time='48:22 min' depth='19.069 m' /> + <sample time='48:24 min' depth='19.466 m' temp='7.2 C' cns='21%' /> + <sample time='48:26 min' depth='19.456 m' /> + <sample time='48:28 min' depth='19.436 m' /> + <sample time='48:30 min' depth='19.405 m' /> + <sample time='48:32 min' depth='19.375 m' /> + <sample time='48:34 min' depth='19.313 m' /> + <sample time='48:36 min' depth='19.222 m' temp='7.4 C' /> + <sample time='48:38 min' depth='19.12 m' /> + <sample time='48:40 min' depth='19.008 m' /> + <sample time='48:42 min' depth='18.916 m' /> + <sample time='48:44 min' depth='18.793 m' /> + <sample time='48:46 min' depth='18.742 m' /> + <sample time='48:48 min' depth='18.691 m' temp='7.6 C' /> + <sample time='48:50 min' depth='18.589 m' /> + <sample time='48:52 min' depth='18.528 m' /> + <sample time='48:54 min' depth='18.508 m' /> + <sample time='48:56 min' depth='18.61 m' /> + <sample time='48:58 min' depth='18.63 m' /> + <sample time='49:00 min' depth='18.793 m' temp='7.8 C' /> + <sample time='49:02 min' depth='18.773 m' /> + <sample time='49:04 min' depth='18.569 m' /> + <sample time='49:06 min' depth='18.447 m' /> + <sample time='49:08 min' depth='18.334 m' /> + <sample time='49:10 min' depth='18.385 m' /> + <sample time='49:12 min' depth='18.416 m' temp='8.0 C' /> + <sample time='49:14 min' depth='18.436 m' /> + <sample time='49:16 min' depth='18.498 m' /> + <sample time='49:18 min' depth='18.508 m' /> + <sample time='49:20 min' depth='18.559 m' /> + <sample time='49:22 min' depth='18.487 m' /> + <sample time='49:24 min' depth='18.406 m' temp='8.1 C' /> + <sample time='49:26 min' depth='18.345 m' /> + <sample time='49:28 min' depth='18.273 m' /> + <sample time='49:30 min' depth='18.222 m' /> + <sample time='49:32 min' depth='18.12 m' /> + <sample time='49:34 min' depth='18.09 m' /> + <sample time='49:36 min' depth='18.029 m' temp='8.3 C' /> + <sample time='49:38 min' depth='18.049 m' /> + <sample time='49:40 min' depth='18.141 m' /> + <sample time='49:42 min' depth='18.182 m' /> + <sample time='49:44 min' depth='18.131 m' /> + <sample time='49:46 min' depth='18.049 m' /> + <sample time='49:48 min' depth='18.069 m' temp='8.6 C' /> + <sample time='49:50 min' depth='18.029 m' /> + <sample time='49:52 min' depth='17.947 m' /> + <sample time='49:54 min' depth='17.865 m' /> + <sample time='49:56 min' depth='17.774 m' /> + <sample time='49:58 min' depth='17.651 m' /> + <sample time='50:00 min' depth='17.641 m' temp='8.8 C' /> + <sample time='50:02 min' depth='17.478 m' /> + <sample time='50:04 min' depth='17.233 m' /> + <sample time='50:06 min' depth='16.734 m' /> + <sample time='50:08 min' depth='16.897 m' /> + <sample time='50:10 min' depth='16.907 m' /> + <sample time='50:12 min' depth='17.019 m' temp='9.1 C' /> + <sample time='50:14 min' depth='16.815 m' /> + <sample time='50:16 min' depth='16.764 m' /> + <sample time='50:18 min' depth='16.632 m' /> + <sample time='50:20 min' depth='16.499 m' /> + <sample time='50:22 min' depth='16.295 m' /> + <sample time='50:24 min' depth='16.183 m' temp='9.4 C' cns='22%' /> + <sample time='50:26 min' depth='16.112 m' /> + <sample time='50:28 min' depth='16.163 m' /> + <sample time='50:30 min' depth='16.101 m' /> + <sample time='50:32 min' depth='15.969 m' /> + <sample time='50:34 min' depth='15.959 m' /> + <sample time='50:36 min' depth='15.704 m' temp='9.5 C' /> + <sample time='50:38 min' depth='15.122 m' /> + <sample time='50:40 min' depth='14.898 m' /> + <sample time='50:42 min' depth='15.204 m' /> + <sample time='50:44 min' depth='15.133 m' /> + <sample time='50:46 min' depth='15.082 m' /> + <sample time='50:48 min' depth='15.0 m' temp='9.7 C' /> + <sample time='50:50 min' depth='14.969 m' /> + <sample time='50:52 min' depth='14.918 m' /> + <sample time='50:54 min' depth='14.745 m' /> + <sample time='50:56 min' depth='14.613 m' /> + <sample time='50:58 min' depth='14.511 m' /> + <sample time='51:00 min' depth='14.47 m' temp='9.8 C' /> + <sample time='51:02 min' depth='14.47 m' /> + <sample time='51:04 min' depth='14.48 m' /> + <sample time='51:06 min' depth='14.46 m' /> + <sample time='51:08 min' depth='14.419 m' /> + <sample time='51:10 min' depth='14.276 m' /> + <sample time='51:12 min' depth='14.276 m' /> + <sample time='51:14 min' depth='14.256 m' /> + <sample time='51:16 min' depth='14.225 m' /> + <sample time='51:18 min' depth='14.194 m' /> + <sample time='51:20 min' depth='14.184 m' /> + <sample time='51:22 min' depth='14.082 m' /> + <sample time='51:24 min' depth='14.001 m' temp='9.9 C' /> + <sample time='51:26 min' depth='13.899 m' /> + <sample time='51:28 min' depth='13.868 m' /> + <sample time='51:30 min' depth='13.899 m' /> + <sample time='51:32 min' depth='14.001 m' /> + <sample time='51:34 min' depth='13.991 m' /> + <sample time='51:36 min' depth='14.031 m' ndl='240:00 min' /> + <sample time='51:38 min' depth='14.133 m' /> + <sample time='51:40 min' depth='14.164 m' /> + <sample time='51:42 min' depth='14.184 m' /> + <sample time='51:44 min' depth='14.215 m' /> + <sample time='51:46 min' depth='14.092 m' /> + <sample time='51:48 min' depth='13.664 m' /> + <sample time='51:50 min' depth='13.379 m' /> + <sample time='51:52 min' depth='13.746 m' /> + <sample time='51:54 min' depth='13.674 m' /> + <sample time='51:56 min' depth='13.634 m' /> + <sample time='51:58 min' depth='13.685 m' /> + <sample time='52:00 min' depth='13.654 m' /> + <sample time='52:02 min' depth='13.572 m' /> + <sample time='52:04 min' depth='13.501 m' /> + <sample time='52:06 min' depth='13.501 m' /> + <sample time='52:08 min' depth='13.552 m' /> + <sample time='52:10 min' depth='13.664 m' /> + <sample time='52:12 min' depth='13.664 m' /> + <sample time='52:14 min' depth='13.705 m' /> + <sample time='52:16 min' depth='13.685 m' /> + <sample time='52:18 min' depth='13.634 m' /> + <sample time='52:20 min' depth='13.593 m' /> + <sample time='52:22 min' depth='13.511 m' /> + <sample time='52:24 min' depth='13.419 m' /> + <sample time='52:26 min' depth='13.348 m' /> + <sample time='52:28 min' depth='13.093 m' /> + <sample time='52:30 min' depth='12.716 m' /> + <sample time='52:32 min' depth='12.543 m' /> + <sample time='52:34 min' depth='12.655 m' /> + <sample time='52:36 min' depth='12.43 m' /> + <sample time='52:38 min' depth='12.308 m' /> + <sample time='52:40 min' depth='12.247 m' /> + <sample time='52:42 min' depth='12.145 m' /> + <sample time='52:44 min' depth='11.92 m' /> + <sample time='52:46 min' depth='11.574 m' /> + <sample time='52:48 min' depth='11.951 m' cns='23%' /> + <sample time='52:50 min' depth='11.869 m' /> + <sample time='52:52 min' depth='11.839 m' /> + <sample time='52:54 min' depth='11.808 m' /> + <sample time='52:56 min' depth='11.737 m' /> + <sample time='52:58 min' depth='11.727 m' /> + <sample time='53:00 min' depth='11.757 m' /> + <sample time='53:02 min' depth='11.737 m' /> + <sample time='53:04 min' depth='11.574 m' /> + <sample time='53:06 min' depth='11.268 m' /> + <sample time='53:08 min' depth='11.574 m' /> + <sample time='53:10 min' depth='11.462 m' /> + <sample time='53:12 min' depth='11.492 m' /> + <sample time='53:14 min' depth='11.421 m' /> + <sample time='53:16 min' depth='11.37 m' /> + <sample time='53:18 min' depth='11.258 m' /> + <sample time='53:20 min' depth='11.329 m' /> + <sample time='53:22 min' depth='11.044 m' /> + <sample time='53:24 min' depth='10.778 m' /> + <sample time='53:26 min' depth='10.197 m' /> + <sample time='53:28 min' depth='9.912 m' /> + <sample time='53:30 min' depth='10.279 m' /> + <sample time='53:32 min' depth='10.258 m' /> + <sample time='53:34 min' depth='10.238 m' /> + <sample time='53:36 min' depth='10.258 m' /> + <sample time='53:38 min' depth='10.279 m' /> + <sample time='53:40 min' depth='10.238 m' /> + <sample time='53:42 min' depth='9.932 m' /> + <sample time='53:44 min' depth='9.473 m' /> + <sample time='53:46 min' depth='9.728 m' /> + <sample time='53:48 min' depth='9.718 m' /> + <sample time='53:50 min' depth='9.647 m' /> + <sample time='53:52 min' depth='9.687 m' /> + <sample time='53:54 min' depth='9.698 m' /> + <sample time='53:56 min' depth='9.708 m' /> + <sample time='53:58 min' depth='9.85 m' /> + <sample time='54:00 min' depth='9.861 m' /> + <sample time='54:02 min' depth='9.81 m' /> + <sample time='54:04 min' depth='9.759 m' /> + <sample time='54:06 min' depth='9.596 m' /> + <sample time='54:08 min' depth='9.167 m' /> + <sample time='54:10 min' depth='8.698 m' /> + <sample time='54:12 min' depth='8.433 m' temp='10.0 C' /> + <sample time='54:14 min' depth='8.708 m' /> + <sample time='54:16 min' depth='8.627 m' /> + <sample time='54:18 min' depth='8.627 m' /> + <sample time='54:20 min' depth='8.698 m' /> + <sample time='54:22 min' depth='8.688 m' /> + <sample time='54:24 min' depth='8.668 m' /> + <sample time='54:26 min' depth='8.678 m' /> + <sample time='54:28 min' depth='8.698 m' /> + <sample time='54:30 min' depth='8.698 m' /> + <sample time='54:32 min' depth='8.719 m' /> + <sample time='54:34 min' depth='8.759 m' /> + <sample time='54:36 min' depth='8.739 m' /> + <sample time='54:38 min' depth='8.678 m' /> + <sample time='54:40 min' depth='8.606 m' /> + <sample time='54:42 min' depth='8.453 m' /> + <sample time='54:44 min' depth='8.372 m' /> + <sample time='54:46 min' depth='8.321 m' /> + <sample time='54:48 min' depth='8.3 m' cns='24%' /> + <sample time='54:50 min' depth='8.239 m' /> + <sample time='54:52 min' depth='8.148 m' /> + <sample time='54:54 min' depth='8.056 m' /> + <sample time='54:56 min' depth='7.913 m' /> + <sample time='54:58 min' depth='7.78 m' /> + <sample time='55:00 min' depth='7.23 m' /> + <sample time='55:02 min' depth='6.995 m' /> + <sample time='55:04 min' depth='7.291 m' /> + <sample time='55:06 min' depth='7.158 m' /> + <sample time='55:08 min' depth='7.097 m' /> + <sample time='55:10 min' depth='7.138 m' /> + <sample time='55:12 min' depth='7.077 m' /> + <sample time='55:14 min' depth='7.077 m' /> + <sample time='55:16 min' depth='6.965 m' /> + <sample time='55:18 min' depth='6.954 m' /> + <sample time='55:20 min' depth='6.883 m' /> + <sample time='55:22 min' depth='6.873 m' /> + <sample time='55:24 min' depth='6.873 m' temp='10.1 C' /> + <sample time='55:26 min' depth='6.842 m' /> + <sample time='55:28 min' depth='6.842 m' /> + <sample time='55:30 min' depth='6.812 m' /> + <sample time='55:32 min' depth='6.852 m' /> + <sample time='55:34 min' depth='6.771 m' /> + <sample time='55:36 min' depth='6.751 m' /> + <sample time='55:38 min' depth='6.638 m' /> + <sample time='55:40 min' depth='6.628 m' /> + <sample time='55:42 min' depth='6.628 m' /> + <sample time='55:44 min' depth='6.689 m' /> + <sample time='55:46 min' depth='6.863 m' /> + <sample time='55:48 min' depth='6.863 m' temp='10.0 C' /> + <sample time='55:50 min' depth='6.863 m' /> + <sample time='55:52 min' depth='6.771 m' /> + <sample time='55:54 min' depth='6.7 m' /> + <sample time='55:56 min' depth='6.098 m' /> + <sample time='55:58 min' depth='5.731 m' /> + <sample time='56:00 min' depth='6.057 m' /> + <sample time='56:02 min' depth='6.098 m' /> + <sample time='56:04 min' depth='6.098 m' /> + <sample time='56:06 min' depth='6.21 m' /> + <sample time='56:08 min' depth='6.445 m' /> + <sample time='56:10 min' depth='6.7 m' /> + <sample time='56:12 min' depth='6.751 m' /> + <sample time='56:14 min' depth='6.852 m' /> + <sample time='56:16 min' depth='6.557 m' /> + <sample time='56:18 min' depth='6.312 m' /> + <sample time='56:20 min' depth='6.424 m' /> + <sample time='56:22 min' depth='6.434 m' /> + <sample time='56:24 min' depth='6.506 m' /> + <sample time='56:26 min' depth='6.618 m' /> + <sample time='56:28 min' depth='6.72 m' /> + <sample time='56:30 min' depth='6.822 m' /> + <sample time='56:32 min' depth='6.852 m' /> + <sample time='56:34 min' depth='6.863 m' /> + <sample time='56:36 min' depth='6.781 m' /> + <sample time='56:38 min' depth='6.751 m' /> + <sample time='56:40 min' depth='6.7 m' /> + <sample time='56:42 min' depth='6.618 m' /> + <sample time='56:44 min' depth='6.506 m' /> + <sample time='56:46 min' depth='6.414 m' /> + <sample time='56:48 min' depth='6.394 m' /> + <sample time='56:50 min' depth='6.404 m' /> + <sample time='56:52 min' depth='6.424 m' /> + <sample time='56:54 min' depth='6.475 m' /> + <sample time='56:56 min' depth='6.516 m' /> + <sample time='56:58 min' depth='6.557 m' /> + <sample time='57:00 min' depth='6.598 m' /> + <sample time='57:02 min' depth='6.649 m' /> + <sample time='57:04 min' depth='6.679 m' /> + <sample time='57:06 min' depth='6.74 m' /> + <sample time='57:08 min' depth='6.761 m' /> + <sample time='57:10 min' depth='6.791 m' /> + <sample time='57:12 min' depth='6.934 m' cns='25%' /> + <sample time='57:14 min' depth='6.873 m' /> + <sample time='57:16 min' depth='6.903 m' /> + <sample time='57:18 min' depth='6.924 m' /> + <sample time='57:20 min' depth='6.903 m' /> + <sample time='57:22 min' depth='6.883 m' /> + <sample time='57:24 min' depth='6.965 m' /> + <sample time='57:26 min' depth='6.965 m' /> + <sample time='57:28 min' depth='6.985 m' /> + <sample time='57:30 min' depth='6.995 m' /> + <sample time='57:32 min' depth='7.077 m' /> + <sample time='57:34 min' depth='7.169 m' /> + <sample time='57:36 min' depth='7.24 m' /> + <sample time='57:38 min' depth='7.322 m' /> + <sample time='57:40 min' depth='7.424 m' /> + <sample time='57:42 min' depth='7.526 m' /> + <sample time='57:44 min' depth='7.607 m' /> + <sample time='57:46 min' depth='7.678 m' /> + <sample time='57:48 min' depth='7.791 m' /> + <sample time='57:50 min' depth='7.678 m' /> + <sample time='57:52 min' depth='7.444 m' /> + <sample time='57:54 min' depth='7.373 m' /> + <sample time='57:56 min' depth='7.413 m' /> + <sample time='57:58 min' depth='7.373 m' /> + <sample time='58:00 min' depth='7.383 m' /> + <sample time='58:02 min' depth='7.403 m' /> + <sample time='58:04 min' depth='7.464 m' /> + <sample time='58:06 min' depth='7.413 m' /> + <sample time='58:08 min' depth='7.464 m' /> + <sample time='58:10 min' depth='7.393 m' /> + <sample time='58:12 min' depth='7.291 m' /> + <sample time='58:14 min' depth='7.107 m' /> + <sample time='58:16 min' depth='6.985 m' /> + <sample time='58:18 min' depth='6.975 m' /> + <sample time='58:20 min' depth='6.893 m' /> + <sample time='58:22 min' depth='6.771 m' /> + <sample time='58:24 min' depth='6.72 m' /> + <sample time='58:26 min' depth='6.557 m' /> + <sample time='58:28 min' depth='6.261 m' /> + <sample time='58:30 min' depth='5.751 m' /> + <sample time='58:32 min' depth='5.843 m' /> + <sample time='58:34 min' depth='5.639 m' /> + <sample time='58:36 min' depth='5.506 m' /> + <sample time='58:38 min' depth='5.578 m' /> + <sample time='58:40 min' depth='5.629 m' /> + <sample time='58:42 min' depth='5.731 m' /> + <sample time='58:44 min' depth='5.853 m' /> + <sample time='58:46 min' depth='5.925 m' /> + <sample time='58:48 min' depth='5.996 m' /> + <sample time='58:50 min' depth='6.037 m' /> + <sample time='58:52 min' depth='6.057 m' /> + <sample time='58:54 min' depth='6.108 m' /> + <sample time='58:56 min' depth='6.108 m' /> + <sample time='58:58 min' depth='6.128 m' /> + <sample time='59:00 min' depth='6.2 m' /> + <sample time='59:02 min' depth='6.19 m' /> + <sample time='59:04 min' depth='6.179 m' /> + <sample time='59:06 min' depth='6.128 m' /> + <sample time='59:08 min' depth='6.027 m' /> + <sample time='59:10 min' depth='5.945 m' /> + <sample time='59:12 min' depth='5.976 m' cns='26%' /> + <sample time='59:14 min' depth='6.027 m' /> + <sample time='59:16 min' depth='6.108 m' /> + <sample time='59:18 min' depth='6.22 m' /> + <sample time='59:20 min' depth='6.261 m' /> + <sample time='59:22 min' depth='6.281 m' /> + <sample time='59:24 min' depth='6.332 m' /> + <sample time='59:26 min' depth='6.343 m' /> + <sample time='59:28 min' depth='6.445 m' /> + <sample time='59:30 min' depth='6.445 m' /> + <sample time='59:32 min' depth='6.506 m' /> + <sample time='59:34 min' depth='6.577 m' /> + <sample time='59:36 min' depth='6.618 m' /> + <sample time='59:38 min' depth='6.618 m' /> + <sample time='59:40 min' depth='6.649 m' /> + <sample time='59:42 min' depth='6.689 m' /> + <sample time='59:44 min' depth='6.669 m' /> + <sample time='59:46 min' depth='6.689 m' /> + <sample time='59:48 min' depth='6.7 m' /> + <sample time='59:50 min' depth='6.74 m' /> + <sample time='59:52 min' depth='6.761 m' /> + <sample time='59:54 min' depth='6.832 m' /> + <sample time='59:56 min' depth='6.893 m' /> + <sample time='59:58 min' depth='6.863 m' /> + <sample time='60:00 min' depth='6.852 m' /> + <sample time='60:02 min' depth='6.852 m' /> + <sample time='60:04 min' depth='6.781 m' /> + <sample time='60:06 min' depth='6.802 m' /> + <sample time='60:08 min' depth='6.751 m' /> + <sample time='60:10 min' depth='6.771 m' /> + <sample time='60:12 min' depth='6.771 m' /> + <sample time='60:14 min' depth='6.761 m' /> + <sample time='60:16 min' depth='6.771 m' /> + <sample time='60:18 min' depth='6.751 m' /> + <sample time='60:20 min' depth='6.7 m' /> + <sample time='60:22 min' depth='6.659 m' /> + <sample time='60:24 min' depth='6.587 m' /> + <sample time='60:26 min' depth='6.526 m' /> + <sample time='60:28 min' depth='6.475 m' /> + <sample time='60:30 min' depth='6.455 m' /> + <sample time='60:32 min' depth='6.434 m' /> + <sample time='60:34 min' depth='6.424 m' /> + <sample time='60:36 min' depth='6.414 m' /> + <sample time='60:38 min' depth='6.394 m' /> + <sample time='60:40 min' depth='6.383 m' /> + <sample time='60:42 min' depth='6.363 m' /> + <sample time='60:44 min' depth='6.281 m' /> + <sample time='60:46 min' depth='6.23 m' /> + <sample time='60:48 min' depth='6.159 m' /> + <sample time='60:50 min' depth='6.047 m' /> + <sample time='60:52 min' depth='5.598 m' /> + <sample time='60:54 min' depth='5.69 m' /> + <sample time='60:56 min' depth='5.833 m' /> + <sample time='60:58 min' depth='5.812 m' /> + <sample time='61:00 min' depth='5.833 m' /> + <sample time='61:02 min' depth='5.884 m' /> + <sample time='61:04 min' depth='5.965 m' /> + <sample time='61:06 min' depth='6.037 m' /> + <sample time='61:08 min' depth='6.128 m' /> + <sample time='61:10 min' depth='6.302 m' /> + <sample time='61:12 min' depth='6.404 m' cns='27%' /> + <sample time='61:14 min' depth='6.516 m' /> + <sample time='61:16 min' depth='6.618 m' /> + <sample time='61:18 min' depth='6.781 m' /> + <sample time='61:20 min' depth='6.802 m' /> + <sample time='61:22 min' depth='6.71 m' /> + <sample time='61:24 min' depth='6.547 m' /> + <sample time='61:26 min' depth='6.485 m' /> + <sample time='61:28 min' depth='6.485 m' /> + <sample time='61:30 min' depth='6.587 m' /> + <sample time='61:32 min' depth='6.71 m' /> + <sample time='61:34 min' depth='6.822 m' /> + <sample time='61:36 min' depth='6.934 m' /> + <sample time='61:38 min' depth='7.026 m' /> + <sample time='61:40 min' depth='7.148 m' /> + <sample time='61:42 min' depth='7.25 m' /> + <sample time='61:44 min' depth='7.291 m' /> + <sample time='61:46 min' depth='7.311 m' /> + <sample time='61:48 min' depth='7.342 m' /> + <sample time='61:50 min' depth='7.362 m' /> + <sample time='61:52 min' depth='7.352 m' /> + <sample time='61:54 min' depth='7.311 m' /> + <sample time='61:56 min' depth='7.311 m' /> + <sample time='61:58 min' depth='7.209 m' /> + <sample time='62:00 min' depth='7.036 m' /> + <sample time='62:02 min' depth='6.893 m' /> + <sample time='62:04 min' depth='6.771 m' /> + <sample time='62:06 min' depth='6.679 m' /> + <sample time='62:08 min' depth='6.679 m' /> + <sample time='62:10 min' depth='6.74 m' /> + <sample time='62:12 min' depth='6.791 m' /> + <sample time='62:14 min' depth='6.863 m' /> + <sample time='62:16 min' depth='6.883 m' /> + <sample time='62:18 min' depth='6.883 m' /> + <sample time='62:20 min' depth='6.873 m' /> + <sample time='62:22 min' depth='6.873 m' /> + <sample time='62:24 min' depth='6.863 m' /> + <sample time='62:26 min' depth='6.842 m' /> + <sample time='62:28 min' depth='6.873 m' /> + <sample time='62:30 min' depth='6.873 m' /> + <sample time='62:32 min' depth='6.842 m' /> + <sample time='62:34 min' depth='6.802 m' /> + <sample time='62:36 min' depth='6.608 m' /> + <sample time='62:38 min' depth='6.587 m' /> + <sample time='62:40 min' depth='6.618 m' /> + <sample time='62:42 min' depth='6.649 m' /> + <sample time='62:44 min' depth='6.659 m' /> + <sample time='62:46 min' depth='6.659 m' /> + <sample time='62:48 min' depth='6.781 m' /> + <sample time='62:50 min' depth='6.751 m' /> + <sample time='62:52 min' depth='6.802 m' /> + <sample time='62:54 min' depth='6.914 m' /> + <sample time='62:56 min' depth='6.985 m' /> + <sample time='62:58 min' depth='7.036 m' /> + <sample time='63:00 min' depth='7.067 m' /> + <sample time='63:02 min' depth='6.975 m' /> + <sample time='63:04 min' depth='6.873 m' /> + <sample time='63:06 min' depth='6.771 m' /> + <sample time='63:08 min' depth='6.638 m' /> + <sample time='63:10 min' depth='6.557 m' /> + <sample time='63:12 min' depth='6.353 m' /> + <sample time='63:14 min' depth='5.894 m' /> + <sample time='63:16 min' depth='6.2 m' /> + <sample time='63:18 min' depth='6.271 m' /> + <sample time='63:20 min' depth='6.22 m' /> + <sample time='63:22 min' depth='6.169 m' /> + <sample time='63:24 min' depth='6.149 m' /> + <sample time='63:26 min' depth='6.159 m' /> + <sample time='63:28 min' depth='6.21 m' /> + <sample time='63:30 min' depth='6.19 m' /> + <sample time='63:32 min' depth='6.19 m' /> + <sample time='63:34 min' depth='6.139 m' /> + <sample time='63:36 min' depth='6.108 m' cns='28%' /> + <sample time='63:38 min' depth='5.741 m' /> + <sample time='63:40 min' depth='5.486 m' /> + <sample time='63:42 min' depth='5.853 m' /> + <sample time='63:44 min' depth='5.792 m' /> + <sample time='63:46 min' depth='5.843 m' /> + <sample time='63:48 min' depth='5.925 m' /> + <sample time='63:50 min' depth='5.996 m' /> + <sample time='63:52 min' depth='6.128 m' /> + <sample time='63:54 min' depth='6.088 m' /> + <sample time='63:56 min' depth='6.108 m' /> + <sample time='63:58 min' depth='6.118 m' /> + <sample time='64:00 min' depth='6.128 m' /> + <sample time='64:02 min' depth='6.118 m' /> + <sample time='64:04 min' depth='6.149 m' /> + <sample time='64:06 min' depth='6.251 m' /> + <sample time='64:08 min' depth='6.343 m' /> + <sample time='64:10 min' depth='6.455 m' /> + <sample time='64:12 min' depth='6.567 m' /> + <sample time='64:14 min' depth='6.689 m' /> + <sample time='64:16 min' depth='6.74 m' /> + <sample time='64:18 min' depth='6.791 m' /> + <sample time='64:20 min' depth='6.73 m' /> + <sample time='64:22 min' depth='6.751 m' /> + <sample time='64:24 min' depth='6.771 m' /> + <sample time='64:26 min' depth='6.812 m' /> + <sample time='64:28 min' depth='6.863 m' /> + <sample time='64:30 min' depth='6.914 m' /> + <sample time='64:32 min' depth='6.822 m' /> + <sample time='64:34 min' depth='6.72 m' /> + <sample time='64:36 min' depth='6.557 m' /> + <sample time='64:38 min' depth='6.353 m' /> + <sample time='64:40 min' depth='6.21 m' /> + <sample time='64:42 min' depth='5.996 m' /> + <sample time='64:44 min' depth='5.741 m' /> + <sample time='64:46 min' depth='5.425 m' /> + <sample time='64:48 min' depth='5.782 m' /> + <sample time='64:50 min' depth='5.772 m' /> + <sample time='64:52 min' depth='5.823 m' /> + <sample time='64:54 min' depth='5.935 m' /> + <sample time='64:56 min' depth='5.996 m' /> + <sample time='64:58 min' depth='6.057 m' /> + <sample time='65:00 min' depth='6.078 m' /> + <sample time='65:02 min' depth='6.088 m' /> + <sample time='65:04 min' depth='6.078 m' /> + <sample time='65:06 min' depth='6.078 m' /> + <sample time='65:08 min' depth='6.118 m' /> + <sample time='65:10 min' depth='6.159 m' /> + <sample time='65:12 min' depth='6.22 m' temp='10.1 C' /> + <sample time='65:14 min' depth='6.322 m' /> + <sample time='65:16 min' depth='6.455 m' /> + <sample time='65:18 min' depth='6.638 m' /> + <sample time='65:20 min' depth='6.638 m' /> + <sample time='65:22 min' depth='6.72 m' /> + <sample time='65:24 min' depth='6.689 m' temp='10.0 C' /> + <sample time='65:26 min' depth='6.628 m' /> + <sample time='65:28 min' depth='6.628 m' /> + <sample time='65:30 min' depth='6.271 m' /> + <sample time='65:32 min' depth='5.976 m' /> + <sample time='65:34 min' depth='6.292 m' /> + <sample time='65:36 min' depth='6.536 m' temp='10.1 C' cns='29%' /> + <sample time='65:38 min' depth='6.669 m' /> + <sample time='65:40 min' depth='6.842 m' /> + <sample time='65:42 min' depth='7.026 m' /> + <sample time='65:44 min' depth='7.005 m' /> + <sample time='65:46 min' depth='7.016 m' /> + <sample time='65:48 min' depth='7.005 m' temp='10.0 C' /> + <sample time='65:50 min' depth='7.016 m' /> + <sample time='65:52 min' depth='7.005 m' /> + <sample time='65:54 min' depth='6.995 m' /> + <sample time='65:56 min' depth='7.005 m' /> + <sample time='65:58 min' depth='6.995 m' /> + <sample time='66:00 min' depth='6.924 m' /> + <sample time='66:02 min' depth='6.985 m' /> + <sample time='66:04 min' depth='7.026 m' /> + <sample time='66:06 min' depth='7.158 m' /> + <sample time='66:08 min' depth='7.118 m' /> + <sample time='66:10 min' depth='7.067 m' /> + <sample time='66:12 min' depth='6.873 m' /> + <sample time='66:14 min' depth='6.516 m' /> + <sample time='66:16 min' depth='6.373 m' /> + <sample time='66:18 min' depth='6.557 m' /> + <sample time='66:20 min' depth='6.506 m' /> + <sample time='66:22 min' depth='6.506 m' /> + <sample time='66:24 min' depth='6.659 m' temp='10.1 C' /> + <sample time='66:26 min' depth='6.74 m' /> + <sample time='66:28 min' depth='6.751 m' /> + <sample time='66:30 min' depth='6.812 m' /> + <sample time='66:32 min' depth='6.832 m' /> + <sample time='66:34 min' depth='6.842 m' /> + <sample time='66:36 min' depth='6.781 m' temp='10.0 C' /> + <sample time='66:38 min' depth='6.74 m' /> + <sample time='66:40 min' depth='6.689 m' /> + <sample time='66:42 min' depth='6.7 m' /> + <sample time='66:44 min' depth='6.72 m' /> + <sample time='66:46 min' depth='6.791 m' /> + <sample time='66:48 min' depth='6.802 m' /> + <sample time='66:50 min' depth='6.832 m' /> + <sample time='66:52 min' depth='6.873 m' /> + <sample time='66:54 min' depth='6.842 m' /> + <sample time='66:56 min' depth='6.893 m' /> + <sample time='66:58 min' depth='6.954 m' /> + <sample time='67:00 min' depth='6.934 m' /> + <sample time='67:02 min' depth='6.924 m' /> + <sample time='67:04 min' depth='6.975 m' /> + <sample time='67:06 min' depth='7.016 m' /> + <sample time='67:08 min' depth='7.046 m' /> + <sample time='67:10 min' depth='7.107 m' /> + <sample time='67:12 min' depth='7.199 m' /> + <sample time='67:14 min' depth='7.199 m' /> + <sample time='67:16 min' depth='7.24 m' /> + <sample time='67:18 min' depth='7.209 m' /> + <sample time='67:20 min' depth='7.199 m' /> + <sample time='67:22 min' depth='7.118 m' /> + <sample time='67:24 min' depth='7.128 m' /> + <sample time='67:26 min' depth='7.097 m' /> + <sample time='67:28 min' depth='7.138 m' /> + <sample time='67:30 min' depth='7.138 m' /> + <sample time='67:32 min' depth='6.802 m' /> + <sample time='67:34 min' depth='6.791 m' /> + <sample time='67:36 min' depth='7.016 m' cns='30%' /> + <sample time='67:38 min' depth='7.199 m' /> + <sample time='67:40 min' depth='7.22 m' /> + <sample time='67:42 min' depth='7.23 m' /> + <sample time='67:44 min' depth='7.22 m' /> + <sample time='67:46 min' depth='7.373 m' /> + <sample time='67:48 min' depth='7.158 m' /> + <sample time='67:50 min' depth='7.097 m' /> + <sample time='67:52 min' depth='7.097 m' /> + <sample time='67:54 min' depth='7.169 m' /> + <sample time='67:56 min' depth='7.189 m' /> + <sample time='67:58 min' depth='7.199 m' /> + <sample time='68:00 min' depth='7.199 m' /> + <sample time='68:02 min' depth='7.209 m' /> + <sample time='68:04 min' depth='7.158 m' /> + <sample time='68:06 min' depth='7.118 m' /> + <sample time='68:08 min' depth='7.005 m' /> + <sample time='68:10 min' depth='6.995 m' /> + <sample time='68:12 min' depth='6.995 m' /> + <sample time='68:14 min' depth='6.975 m' /> + <sample time='68:16 min' depth='6.954 m' /> + <sample time='68:18 min' depth='6.954 m' /> + <sample time='68:20 min' depth='6.985 m' /> + <sample time='68:22 min' depth='7.148 m' /> + <sample time='68:24 min' depth='7.097 m' /> + <sample time='68:26 min' depth='7.026 m' /> + <sample time='68:28 min' depth='6.985 m' /> + <sample time='68:30 min' depth='6.954 m' /> + <sample time='68:32 min' depth='7.016 m' /> + <sample time='68:34 min' depth='6.975 m' /> + <sample time='68:36 min' depth='7.016 m' /> + <sample time='68:38 min' depth='7.036 m' /> + <sample time='68:40 min' depth='6.781 m' /> + <sample time='68:42 min' depth='7.005 m' /> + <sample time='68:44 min' depth='7.118 m' /> + <sample time='68:46 min' depth='7.148 m' /> + <sample time='68:48 min' depth='7.097 m' /> + <sample time='68:50 min' depth='7.097 m' /> + <sample time='68:52 min' depth='7.138 m' /> + <sample time='68:54 min' depth='7.148 m' /> + <sample time='68:56 min' depth='7.158 m' /> + <sample time='68:58 min' depth='7.158 m' /> + <sample time='69:00 min' depth='6.771 m' /> + <sample time='69:02 min' depth='7.046 m' /> + <sample time='69:04 min' depth='7.077 m' /> + <sample time='69:06 min' depth='6.995 m' /> + <sample time='69:08 min' depth='6.526 m' /> + <sample time='69:10 min' depth='6.343 m' /> + <sample time='69:12 min' depth='6.21 m' /> + <sample time='69:14 min' depth='6.638 m' /> + <sample time='69:16 min' depth='6.802 m' /> + <sample time='69:18 min' depth='6.791 m' /> + <sample time='69:20 min' depth='6.873 m' /> + <sample time='69:22 min' depth='6.965 m' /> + <sample time='69:24 min' depth='7.107 m' /> + <sample time='69:26 min' depth='7.22 m' /> + <sample time='69:28 min' depth='7.107 m' /> + <sample time='69:30 min' depth='7.097 m' /> + <sample time='69:32 min' depth='7.087 m' /> + <sample time='69:34 min' depth='7.097 m' /> + <sample time='69:36 min' depth='7.158 m' /> + <sample time='69:38 min' depth='7.199 m' /> + <sample time='69:40 min' depth='7.199 m' /> + <sample time='69:42 min' depth='7.158 m' /> + <sample time='69:44 min' depth='7.097 m' /> + <sample time='69:46 min' depth='7.138 m' /> + <sample time='69:48 min' depth='7.067 m' /> + <sample time='69:50 min' depth='6.679 m' /> + <sample time='69:52 min' depth='7.046 m' /> + <sample time='69:54 min' depth='6.985 m' /> + <sample time='69:56 min' depth='6.914 m' /> + <sample time='69:58 min' depth='6.863 m' /> + <sample time='70:00 min' depth='6.802 m' cns='31%' /> + <sample time='70:02 min' depth='6.893 m' /> + <sample time='70:04 min' depth='6.985 m' /> + <sample time='70:06 min' depth='7.036 m' /> + <sample time='70:08 min' depth='7.158 m' /> + <sample time='70:10 min' depth='7.301 m' /> + <sample time='70:12 min' depth='7.301 m' /> + <sample time='70:14 min' depth='7.22 m' /> + <sample time='70:16 min' depth='7.158 m' /> + <sample time='70:18 min' depth='7.199 m' /> + <sample time='70:20 min' depth='7.158 m' /> + <sample time='70:22 min' depth='6.934 m' /> + <sample time='70:24 min' depth='6.812 m' /> + <sample time='70:26 min' depth='6.679 m' /> + <sample time='70:28 min' depth='6.587 m' /> + <sample time='70:30 min' depth='6.496 m' /> + <sample time='70:32 min' depth='6.394 m' /> + <sample time='70:34 min' depth='6.179 m' /> + <sample time='70:36 min' depth='6.241 m' /> + <sample time='70:38 min' depth='5.914 m' /> + <sample time='70:40 min' depth='6.078 m' /> + <sample time='70:42 min' depth='6.292 m' /> + <sample time='70:44 min' depth='6.394 m' /> + <sample time='70:46 min' depth='6.353 m' /> + <sample time='70:48 min' depth='6.353 m' /> + <sample time='70:50 min' depth='6.414 m' /> + <sample time='70:52 min' depth='6.587 m' /> + <sample time='70:54 min' depth='6.781 m' /> + <sample time='70:56 min' depth='6.73 m' /> + <sample time='70:58 min' depth='6.485 m' /> + <sample time='71:00 min' depth='6.373 m' /> + <sample time='71:02 min' depth='6.587 m' /> + <sample time='71:04 min' depth='6.669 m' /> + <sample time='71:06 min' depth='6.567 m' /> + <sample time='71:08 min' depth='6.71 m' /> + <sample time='71:10 min' depth='6.883 m' /> + <sample time='71:12 min' depth='6.934 m' /> + <sample time='71:14 min' depth='6.965 m' /> + <sample time='71:16 min' depth='7.077 m' /> + <sample time='71:18 min' depth='6.995 m' /> + <sample time='71:20 min' depth='6.975 m' /> + <sample time='71:22 min' depth='6.975 m' /> + <sample time='71:24 min' depth='7.005 m' /> + <sample time='71:26 min' depth='6.903 m' /> + <sample time='71:28 min' depth='6.852 m' /> + <sample time='71:30 min' depth='6.903 m' /> + <sample time='71:32 min' depth='6.791 m' /> + <sample time='71:34 min' depth='6.567 m' /> + <sample time='71:36 min' depth='6.404 m' /> + <sample time='71:38 min' depth='6.445 m' /> + <sample time='71:40 min' depth='6.383 m' /> + <sample time='71:42 min' depth='6.485 m' /> + <sample time='71:44 min' depth='6.496 m' /> + <sample time='71:46 min' depth='6.547 m' /> + <sample time='71:48 min' depth='6.506 m' /> + <sample time='71:50 min' depth='6.383 m' /> + <sample time='71:52 min' depth='6.312 m' /> + <sample time='71:54 min' depth='6.343 m' /> + <sample time='71:56 min' depth='6.281 m' /> + <sample time='71:58 min' depth='6.251 m' /> + <sample time='72:00 min' depth='6.21 m' cns='32%' /> + <sample time='72:02 min' depth='6.128 m' /> + <sample time='72:04 min' depth='6.128 m' /> + <sample time='72:06 min' depth='6.047 m' /> + <sample time='72:08 min' depth='6.037 m' /> + <sample time='72:10 min' depth='5.996 m' /> + <sample time='72:12 min' depth='5.965 m' /> + <sample time='72:14 min' depth='5.965 m' /> + <sample time='72:16 min' depth='5.955 m' /> + <sample time='72:18 min' depth='5.843 m' /> + <sample time='72:20 min' depth='5.772 m' /> + <sample time='72:22 min' depth='5.721 m' /> + <sample time='72:24 min' depth='5.741 m' /> + <sample time='72:26 min' depth='5.741 m' /> + <sample time='72:28 min' depth='5.68 m' /> + <sample time='72:30 min' depth='5.619 m' /> + <sample time='72:32 min' depth='5.527 m' /> + <sample time='72:34 min' depth='5.486 m' /> + <sample time='72:36 min' depth='5.415 m' /> + <sample time='72:38 min' depth='5.374 m' /> + <sample time='72:40 min' depth='4.976 m' /> + <sample time='72:42 min' depth='4.915 m' /> + <sample time='72:44 min' depth='5.374 m' /> + <sample time='72:46 min' depth='5.333 m' /> + <sample time='72:48 min' depth='5.333 m' /> + <sample time='72:50 min' depth='5.354 m' /> + <sample time='72:52 min' depth='5.323 m' /> + <sample time='72:54 min' depth='5.231 m' /> + <sample time='72:56 min' depth='5.088 m' /> + <sample time='72:58 min' depth='5.088 m' /> + <sample time='73:00 min' depth='5.058 m' temp='10.1 C' /> + <sample time='73:02 min' depth='5.017 m' /> + <sample time='73:04 min' depth='5.007 m' /> + <sample time='73:06 min' depth='5.068 m' /> + <sample time='73:08 min' depth='5.058 m' /> + <sample time='73:10 min' depth='5.058 m' /> + <sample time='73:12 min' depth='5.068 m' /> + <sample time='73:14 min' depth='5.037 m' /> + <sample time='73:16 min' depth='5.007 m' /> + <sample time='73:18 min' depth='4.986 m' /> + <sample time='73:20 min' depth='4.925 m' /> + <sample time='73:22 min' depth='4.833 m' /> + <sample time='73:24 min' depth='4.813 m' temp='10.0 C' /> + <sample time='73:26 min' depth='4.793 m' /> + <sample time='73:28 min' depth='4.772 m' /> + <sample time='73:30 min' depth='4.68 m' /> + <sample time='73:32 min' depth='4.599 m' /> + <sample time='73:34 min' depth='4.64 m' /> + <sample time='73:36 min' depth='4.752 m' temp='10.1 C' /> + <sample time='73:38 min' depth='4.701 m' /> + <sample time='73:40 min' depth='4.721 m' /> + <sample time='73:42 min' depth='4.721 m' /> + <sample time='73:44 min' depth='4.701 m' /> + <sample time='73:46 min' depth='4.701 m' /> + <sample time='73:48 min' depth='4.721 m' /> + <sample time='73:50 min' depth='4.731 m' /> + <sample time='73:52 min' depth='4.68 m' /> + <sample time='73:54 min' depth='4.701 m' /> + <sample time='73:56 min' depth='4.66 m' /> + <sample time='73:58 min' depth='4.568 m' /> + <sample time='74:00 min' depth='4.589 m' /> + <sample time='74:02 min' depth='4.63 m' /> + <sample time='74:04 min' depth='4.589 m' /> + <sample time='74:06 min' depth='4.487 m' /> + <sample time='74:08 min' depth='4.375 m' /> + <sample time='74:10 min' depth='4.303 m' /> + <sample time='74:12 min' depth='3.875 m' /> + <sample time='74:14 min' depth='3.855 m' /> + <sample time='74:16 min' depth='4.303 m' /> + <sample time='74:18 min' depth='4.313 m' /> + <sample time='74:20 min' depth='4.273 m' /> + <sample time='74:22 min' depth='4.191 m' /> + <sample time='74:24 min' depth='4.109 m' cns='33%' /> + <sample time='74:26 min' depth='4.12 m' /> + <sample time='74:28 min' depth='4.089 m' /> + <sample time='74:30 min' depth='4.018 m' /> + <sample time='74:32 min' depth='4.028 m' /> + <sample time='74:34 min' depth='4.048 m' /> + <sample time='74:36 min' depth='3.997 m' /> + <sample time='74:38 min' depth='3.956 m' /> + <sample time='74:40 min' depth='3.936 m' /> + <sample time='74:42 min' depth='3.946 m' /> + <sample time='74:44 min' depth='3.865 m' /> + <sample time='74:46 min' depth='3.793 m' /> + <sample time='74:48 min' depth='3.763 m' /> + <sample time='74:50 min' depth='3.783 m' /> + <sample time='74:52 min' depth='3.753 m' /> + <sample time='74:54 min' depth='3.64 m' /> + <sample time='74:56 min' depth='3.671 m' /> + <sample time='74:58 min' depth='3.702 m' /> + <sample time='75:00 min' depth='3.681 m' /> + <sample time='75:02 min' depth='3.691 m' /> + <sample time='75:04 min' depth='3.671 m' /> + <sample time='75:06 min' depth='3.661 m' /> + <sample time='75:08 min' depth='3.661 m' /> + <sample time='75:10 min' depth='3.661 m' /> + <sample time='75:12 min' depth='3.681 m' /> + <sample time='75:14 min' depth='3.661 m' po2='0.7 bar' /> + <sample time='75:16 min' depth='3.681 m' /> + <sample time='75:18 min' depth='3.64 m' /> + <sample time='75:20 min' depth='3.569 m' /> + <sample time='75:22 min' depth='3.528 m' /> + <sample time='75:24 min' depth='3.579 m' /> + <sample time='75:26 min' depth='3.579 m' /> + <sample time='75:28 min' depth='3.508 m' /> + <sample time='75:30 min' depth='3.498 m' /> + <sample time='75:32 min' depth='3.559 m' /> + <sample time='75:34 min' depth='3.549 m' /> + <sample time='75:36 min' depth='3.549 m' /> + <sample time='75:38 min' depth='3.549 m' /> + <sample time='75:40 min' depth='3.61 m' /> + <sample time='75:42 min' depth='3.63 m' /> + <sample time='75:44 min' depth='3.64 m' /> + <sample time='75:46 min' depth='3.63 m' /> + <sample time='75:48 min' depth='3.63 m' /> + <sample time='75:50 min' depth='3.661 m' /> + <sample time='75:52 min' depth='3.651 m' /> + <sample time='75:54 min' depth='3.63 m' /> + <sample time='75:56 min' depth='3.661 m' /> + <sample time='75:58 min' depth='3.6 m' /> + <sample time='76:00 min' depth='3.528 m' /> + <sample time='76:02 min' depth='3.447 m' /> + <sample time='76:04 min' depth='3.334 m' /> + <sample time='76:06 min' depth='3.467 m' /> + <sample time='76:08 min' depth='3.416 m' /> + <sample time='76:10 min' depth='3.253 m' /> + <sample time='76:12 min' depth='3.131 m' /> + <sample time='76:14 min' depth='3.08 m' /> + <sample time='76:16 min' depth='2.967 m' /> + <sample time='76:18 min' depth='3.131 m' /> + <sample time='76:20 min' depth='3.202 m' /> + <sample time='76:22 min' depth='3.049 m' /> + <sample time='76:24 min' depth='3.008 m' /> + <sample time='76:26 min' depth='2.916 m' /> + <sample time='76:28 min' depth='2.896 m' /> + <sample time='76:30 min' depth='2.519 m' /> + <sample time='76:32 min' depth='2.427 m' /> + <sample time='76:34 min' depth='2.356 m' /> + <sample time='76:36 min' depth='3.049 m' /> + <sample time='76:38 min' depth='3.08 m' /> + <sample time='76:40 min' depth='2.967 m' /> + <sample time='76:42 min' depth='2.825 m' /> + <sample time='76:44 min' depth='2.753 m' /> + <sample time='76:46 min' depth='2.661 m' /> + <sample time='76:48 min' depth='2.539 m' /> + <sample time='76:50 min' depth='2.539 m' /> + <sample time='76:52 min' depth='2.519 m' /> + <sample time='76:54 min' depth='2.478 m' /> + <sample time='76:56 min' depth='2.407 m' /> + <sample time='76:58 min' depth='2.111 m' /> + <sample time='77:00 min' depth='1.886 m' /> + <sample time='77:02 min' depth='1.764 m' /> + <sample time='77:04 min' depth='1.723 m' /> + <sample time='77:06 min' depth='2.254 m' /> + <sample time='77:08 min' depth='2.233 m' /> + <sample time='77:10 min' depth='2.182 m' /> + <sample time='77:12 min' depth='2.111 m' /> + <sample time='77:14 min' depth='2.131 m' /> + <sample time='77:16 min' depth='2.09 m' /> + <sample time='77:18 min' depth='1.988 m' /> + <sample time='77:20 min' depth='1.927 m' /> + <sample time='77:22 min' depth='1.917 m' /> + <sample time='77:24 min' depth='1.886 m' /> + <sample time='77:26 min' depth='1.795 m' /> + <sample time='77:28 min' depth='1.723 m' /> + <sample time='77:30 min' depth='1.723 m' /> + <sample time='77:32 min' depth='1.703 m' /> + <sample time='77:34 min' depth='1.672 m' /> + <sample time='77:36 min' depth='1.581 m' /> + <sample time='77:38 min' depth='1.53 m' /> + <sample time='77:40 min' depth='1.509 m' /> + <sample time='77:42 min' depth='1.428 m' /> + <sample time='77:44 min' depth='1.295 m' /> + <sample time='77:46 min' depth='1.183 m' /> + <sample time='77:48 min' depth='1.091 m' /> + <sample time='77:50 min' depth='1.01 m' /> + <sample time='77:52 min' depth='0.887 m' /> + <sample time='77:54 min' depth='0.714 m' /> + <sample time='77:56 min' depth='0.571 m' /> + <sample time='77:58 min' depth='0.591 m' /> + <sample time='78:00 min' depth='0.571 m' cns='34%' /> + <sample time='78:02 min' depth='0.469 m' /> + <sample time='78:04 min' depth='0.265 m' /> + <sample time='78:06 min' depth='0.408 m' /> + <sample time='78:08 min' depth='0.367 m' /> + <sample time='78:10 min' depth='0.387 m' /> + <sample time='78:12 min' depth='0.408 m' /> + <sample time='78:14 min' depth='0.438 m' /> + <sample time='78:16 min' depth='0.306 m' /> + <sample time='78:18 min' depth='0.357 m' /> + <sample time='78:20 min' depth='0.398 m' /> + <sample time='78:22 min' depth='0.367 m' /> + <sample time='78:24 min' depth='0.489 m' /> + <sample time='78:26 min' depth='0.438 m' /> + <sample time='78:28 min' depth='0.255 m' /> + <sample time='78:30 min' depth='0.316 m' /> + <sample time='78:32 min' depth='0.337 m' /> + <sample time='78:34 min' depth='0.235 m' /> + <sample time='78:36 min' depth='0.306 m' /> + <sample time='78:38 min' depth='0.337 m' /> + <sample time='78:40 min' depth='0.316 m' /> + <sample time='78:42 min' depth='0.286 m' /> + <sample time='78:44 min' depth='0.255 m' /> + <sample time='78:46 min' depth='0.316 m' /> + <sample time='78:48 min' depth='0.367 m' /> + <sample time='78:50 min' depth='0.265 m' /> + <sample time='78:52 min' depth='0.337 m' /> + <sample time='78:54 min' depth='0.347 m' /> + <sample time='78:56 min' depth='0.265 m' /> + <sample time='78:58 min' depth='0.275 m' /> + <sample time='79:00 min' depth='0.337 m' /> + <sample time='79:02 min' depth='0.326 m' /> + <sample time='79:04 min' depth='0.367 m' /> + <sample time='79:06 min' depth='0.663 m' /> + <sample time='79:08 min' depth='0.724 m' /> + <sample time='79:10 min' depth='0.693 m' /> + <sample time='79:12 min' depth='0.612 m' /> + <sample time='79:14 min' depth='0.632 m' /> + <sample time='79:16 min' depth='0.52 m' /> + <sample time='79:18 min' depth='0.367 m' /> + <sample time='79:20 min' depth='0.5 m' /> + <sample time='79:22 min' depth='0.591 m' /> + <sample time='79:24 min' depth='0.571 m' /> + <sample time='79:26 min' depth='0.53 m' /> + <sample time='79:28 min' depth='0.54 m' /> + <sample time='79:30 min' depth='0.561 m' /> + <sample time='79:32 min' depth='0.357 m' /> + <sample time='79:34 min' depth='0.387 m' /> + <sample time='79:36 min' depth='0.561 m' /> + <sample time='79:38 min' depth='0.561 m' /> + <sample time='79:40 min' depth='0.581 m' /> + <sample time='79:42 min' depth='0.591 m' /> + <sample time='79:44 min' depth='0.591 m' /> + <sample time='79:46 min' depth='0.581 m' /> + <sample time='79:48 min' depth='0.418 m' /> + <sample time='79:50 min' depth='0.54 m' /> + <sample time='79:52 min' depth='0.622 m' /> + <sample time='79:54 min' depth='0.622 m' /> + <sample time='79:56 min' depth='0.591 m' /> + <sample time='79:58 min' depth='0.612 m' /> + <sample time='80:00 min' depth='0.602 m' /> + <sample time='80:02 min' depth='0.683 m' /> + <sample time='80:04 min' depth='0.653 m' /> + <sample time='80:06 min' depth='0.653 m' /> + <sample time='80:08 min' depth='0.224 m' /> + <sample time='80:10 min' depth='0.255 m' /> + <sample time='80:12 min' depth='0.235 m' /> + <sample time='80:14 min' depth='0.224 m' /> + <sample time='80:16 min' depth='0.224 m' /> + <sample time='80:18 min' depth='0.245 m' /> + <sample time='80:20 min' depth='0.235 m' /> + <sample time='80:22 min' depth='0.224 m' /> + <sample time='80:24 min' depth='0.235 m' /> + <sample time='80:26 min' depth='0.235 m' /> + <sample time='80:28 min' depth='0.224 m' /> + <sample time='80:30 min' depth='0.224 m' /> + <sample time='80:32 min' depth='0.235 m' /> + <sample time='80:34 min' depth='0.224 m' /> + <sample time='80:36 min' depth='0.224 m' /> + <sample time='80:38 min' depth='0.224 m' /> + <sample time='80:40 min' depth='0.224 m' /> + <sample time='80:42 min' depth='0.224 m' /> + <sample time='80:44 min' depth='0.224 m' /> + <sample time='80:46 min' depth='0.224 m' /> + <sample time='80:48 min' depth='0.214 m' /> + <sample time='80:50 min' depth='0.235 m' /> + <sample time='80:52 min' depth='0.224 m' /> + <sample time='80:54 min' depth='0.245 m' /> + <sample time='80:56 min' depth='0.235 m' /> + <sample time='80:58 min' depth='0.224 m' /> + <sample time='81:00 min' depth='0.316 m' temp='10.0 C' /> + <sample time='81:02 min' depth='0.235 m' /> + <sample time='81:04 min' depth='0.235 m' /> + <sample time='81:06 min' depth='0.224 m' /> + <sample time='81:08 min' depth='0.265 m' /> + <sample time='81:10 min' depth='0.265 m' /> + <sample time='81:12 min' depth='0.316 m' /> + <sample time='81:14 min' depth='0.316 m' /> + <sample time='81:16 min' depth='0.337 m' /> + <sample time='81:18 min' depth='0.306 m' /> + <sample time='81:20 min' depth='0.326 m' /> + <sample time='81:22 min' depth='0.245 m' /> + <sample time='81:24 min' depth='0.265 m' temp='10.1 C' /> + <sample time='81:26 min' depth='0.224 m' /> + <sample time='81:28 min' depth='0.235 m' /> + <sample time='81:30 min' depth='0.224 m' /> + <sample time='81:32 min' depth='0.214 m' /> + <sample time='81:34 min' depth='0.235 m' /> + <sample time='81:36 min' depth='0.224 m' /> + <sample time='81:38 min' depth='0.224 m' /> + <sample time='81:40 min' depth='0.224 m' /> + <sample time='81:42 min' depth='0.235 m' /> + <sample time='81:44 min' depth='0.235 m' /> + <sample time='81:46 min' depth='0.224 m' /> + <sample time='81:48 min' depth='0.214 m' /> + <sample time='81:50 min' depth='0.214 m' /> + <sample time='81:52 min' depth='0.214 m' /> + <sample time='81:54 min' depth='0.214 m' /> + <sample time='81:56 min' depth='0.235 m' /> + <sample time='81:58 min' depth='0.224 m' /> + <sample time='82:00 min' depth='0.224 m' temp='10.0 C' /> + <sample time='82:02 min' depth='0.235 m' /> + <sample time='82:04 min' depth='0.235 m' /> + <sample time='82:06 min' depth='0.224 m' /> + <sample time='82:08 min' depth='0.214 m' /> + <sample time='82:10 min' depth='0.235 m' /> + <sample time='82:12 min' depth='0.224 m' temp='9.9 C' /> + <sample time='82:14 min' depth='0.224 m' /> + <sample time='82:16 min' depth='0.224 m' /> + <sample time='82:18 min' depth='0.224 m' /> + <sample time='82:20 min' depth='0.235 m' /> + <sample time='82:22 min' depth='0.224 m' /> + <sample time='82:24 min' depth='0.214 m' /> + <sample time='82:26 min' depth='0.235 m' /> + <sample time='82:28 min' depth='0.235 m' /> + <sample time='82:30 min' depth='0.235 m' /> + <sample time='82:32 min' depth='0.224 m' /> + <sample time='82:34 min' depth='0.224 m' /> + <sample time='82:36 min' depth='0.235 m' temp='9.8 C' /> + <sample time='82:38 min' depth='0.224 m' /> + <sample time='82:40 min' depth='0.214 m' /> + <sample time='82:42 min' depth='0.214 m' /> + <sample time='82:44 min' depth='0.224 m' /> + <sample time='82:46 min' depth='0.224 m' /> + <sample time='82:48 min' depth='0.245 m' temp='9.7 C' /> + <sample time='82:50 min' depth='0.235 m' ndl='0:00 min' stoptime='0:00 min' cns='0%' po2='0.0 bar' /> + </divecomputer> +</dive> +</dives> +</divelog> diff --git a/dives/test41.csv b/dives/test41.csv new file mode 100644 index 000000000..a67915b82 --- /dev/null +++ b/dives/test41.csv @@ -0,0 +1,6 @@ +#Nr date time duration maxdepth avgdepth buddy suit +1 10/1/13 10:34 45:00 18 16 Dirk wet, 5mm +2 10/1/13 12:13 41:00 16.2 13.5 Linus wet, shorty, 3mm +3 10/1/14 10:02 48:00 13.3 11.5 Tomaz none +4 10/1/14 14:19 34:00 24.9 20.1 Don dry, Whites Fusion + diff --git a/dives/test42.xml b/dives/test42.xml new file mode 100644 index 000000000..373aae1bb --- /dev/null +++ b/dives/test42.xml @@ -0,0 +1,2505 @@ +<divelog program='subsurface' version='3'> +<settings> +</settings> +<divesites> +</divesites> +<dives> +<dive number='1' date='2014-04-02' time='10:00:00' duration='77:54 min'> + <notes>CCR dive</notes> + <cylinder size='2.0 l' workpressure='232.0 bar' description='Oxy2' o2='100.0%' start='190.0 bar' end='130.0 bar' use='oxygen' /> + <cylinder size='2.0 l' workpressure='232.0 bar' description='Dil2' start='185.0 bar' end='130.0 bar' use='diluent' /> + <divecomputer model='Heinrichs Weikamp OSTC 3' deviceid='01234567' diveid='76543210' dctype='CCR'> + <depth max='38.99 m' mean='17.72 m' /> + <temperature water='4.3 C' /> + <surface pressure='1.02 bar' /> + <water salinity='1000 g/l' /> + <event time='0:02 min' type='25' value='21' name='gaschange' /> + <sample time='0:02 min' depth='2.335 m' /> + <sample time='0:04 min' depth='2.916 m' /> + <sample time='0:06 min' depth='3.273 m' /> + <sample time='0:08 min' depth='3.549 m' /> + <sample time='0:10 min' depth='4.038 m' /> + <sample time='0:12 min' depth='4.517 m' temp='10.0 C' ndl='240:00 min' /> + <sample time='0:14 min' depth='5.139 m' /> + <sample time='0:16 min' depth='5.68 m' /> + <sample time='0:18 min' depth='6.088 m' /> + <sample time='0:20 min' depth='6.547 m' /> + <sample time='0:22 min' depth='6.863 m' /> + <sample time='0:24 min' depth='6.965 m' /> + <sample time='0:26 min' depth='6.995 m' /> + <sample time='0:28 min' depth='7.046 m' /> + <sample time='0:30 min' depth='6.985 m' /> + <sample time='0:32 min' depth='6.954 m' /> + <sample time='0:34 min' depth='6.995 m' /> + <sample time='0:36 min' depth='6.965 m' /> + <sample time='0:38 min' depth='6.965 m' /> + <sample time='0:40 min' depth='7.199 m' /> + <sample time='0:42 min' depth='7.271 m' /> + <sample time='0:44 min' depth='7.25 m' /> + <sample time='0:46 min' depth='7.301 m' /> + <sample time='0:48 min' depth='7.148 m' /> + <sample time='0:50 min' depth='7.036 m' /> + <sample time='0:52 min' depth='7.067 m' /> + <sample time='0:54 min' depth='6.954 m' /> + <sample time='0:56 min' depth='6.995 m' /> + <sample time='0:58 min' depth='6.995 m' /> + <sample time='1:00 min' depth='7.056 m' /> + <sample time='1:02 min' depth='7.128 m' /> + <sample time='1:04 min' depth='7.158 m' /> + <sample time='1:06 min' depth='7.067 m' /> + <sample time='1:08 min' depth='6.689 m' /> + <sample time='1:10 min' depth='6.822 m' /> + <sample time='1:12 min' depth='6.791 m' /> + <sample time='1:14 min' depth='6.893 m' /> + <sample time='1:16 min' depth='6.883 m' /> + <sample time='1:18 min' depth='6.883 m' /> + <sample time='1:20 min' depth='6.944 m' /> + <sample time='1:22 min' depth='6.751 m' /> + <sample time='1:24 min' depth='6.781 m' /> + <sample time='1:26 min' depth='6.781 m' /> + <sample time='1:28 min' depth='6.751 m' /> + <sample time='1:30 min' depth='6.74 m' /> + <sample time='1:32 min' depth='6.812 m' /> + <sample time='1:34 min' depth='6.842 m' /> + <sample time='1:36 min' depth='6.893 m' /> + <sample time='1:38 min' depth='7.005 m' /> + <sample time='1:40 min' depth='7.026 m' /> + <sample time='1:42 min' depth='6.995 m' /> + <sample time='1:44 min' depth='7.026 m' /> + <sample time='1:46 min' depth='7.077 m' /> + <sample time='1:48 min' depth='7.148 m' /> + <sample time='1:50 min' depth='7.107 m' /> + <sample time='1:52 min' depth='7.056 m' /> + <sample time='1:54 min' depth='7.036 m' /> + <sample time='1:56 min' depth='7.036 m' /> + <sample time='1:58 min' depth='7.189 m' /> + <sample time='2:00 min' depth='7.536 m' /> + <sample time='2:02 min' depth='7.729 m' /> + <sample time='2:04 min' depth='8.015 m' /> + <sample time='2:06 min' depth='8.219 m' /> + <sample time='2:08 min' depth='8.423 m' /> + <sample time='2:10 min' depth='8.239 m' /> + <sample time='2:12 min' depth='8.851 m' /> + <sample time='2:14 min' depth='9.228 m' /> + <sample time='2:16 min' depth='9.585 m' /> + <sample time='2:18 min' depth='10.003 m' /> + <sample time='2:20 min' depth='10.371 m' /> + <sample time='2:22 min' depth='10.88 m' /> + <sample time='2:24 min' depth='11.247 m' temp='9.9 C' /> + <sample time='2:26 min' depth='11.574 m' /> + <sample time='2:28 min' depth='11.92 m' /> + <sample time='2:30 min' depth='12.216 m' /> + <sample time='2:32 min' depth='12.461 m' /> + <sample time='2:34 min' depth='12.563 m' /> + <sample time='2:36 min' depth='12.716 m' temp='10.0 C' ndl='199:00 min' /> + <sample time='2:38 min' depth='13.022 m' /> + <sample time='2:40 min' depth='13.44 m' /> + <sample time='2:42 min' depth='13.889 m' /> + <sample time='2:44 min' depth='14.327 m' /> + <sample time='2:46 min' depth='14.755 m' /> + <sample time='2:48 min' depth='15.031 m' temp='9.9 C' ndl='89:00 min' /> + <sample time='2:50 min' depth='15.296 m' /> + <sample time='2:52 min' depth='15.53 m' /> + <sample time='2:54 min' depth='15.816 m' /> + <sample time='2:56 min' depth='16.05 m' /> + <sample time='2:58 min' depth='16.091 m' /> + <sample time='3:00 min' depth='16.336 m' ndl='68:00 min' /> + <sample time='3:02 min' depth='16.479 m' /> + <sample time='3:04 min' depth='16.611 m' /> + <sample time='3:06 min' depth='16.642 m' /> + <sample time='3:08 min' depth='16.876 m' /> + <sample time='3:10 min' depth='17.121 m' /> + <sample time='3:12 min' depth='17.294 m' ndl='56:00 min' cns='1%' /> + <sample time='3:14 min' depth='17.447 m' /> + <sample time='3:16 min' depth='17.498 m' /> + <sample time='3:18 min' depth='17.58 m' /> + <sample time='3:20 min' depth='17.814 m' /> + <sample time='3:22 min' depth='18.059 m' /> + <sample time='3:24 min' depth='18.345 m' ndl='46:00 min' /> + <sample time='3:26 min' depth='18.589 m' /> + <sample time='3:28 min' depth='18.855 m' /> + <sample time='3:30 min' depth='19.13 m' /> + <sample time='3:32 min' depth='19.456 m' /> + <sample time='3:34 min' depth='19.762 m' /> + <sample time='3:36 min' depth='20.007 m' temp='9.8 C' ndl='36:00 min' /> + <sample time='3:38 min' depth='20.221 m' /> + <sample time='3:40 min' depth='20.292 m' /> + <sample time='3:42 min' depth='20.252 m' /> + <sample time='3:44 min' depth='20.394 m' /> + <sample time='3:46 min' depth='20.496 m' /> + <sample time='3:48 min' depth='20.557 m' temp='9.1 C' ndl='32:00 min' /> + <sample time='3:50 min' depth='20.527 m' /> + <sample time='3:52 min' depth='20.71 m' /> + <sample time='3:54 min' depth='20.874 m' /> + <sample time='3:56 min' depth='21.027 m' /> + <sample time='3:58 min' depth='21.23 m' /> + <sample time='4:00 min' depth='21.2 m' temp='8.4 C' ndl='29:00 min' /> + <sample time='4:02 min' depth='21.19 m' /> + <sample time='4:04 min' depth='21.159 m' /> + <sample time='4:06 min' depth='21.057 m' /> + <sample time='4:08 min' depth='21.047 m' /> + <sample time='4:10 min' depth='21.088 m' /> + <sample time='4:12 min' depth='21.292 m' temp='7.8 C' /> + <sample time='4:14 min' depth='21.424 m' /> + <sample time='4:16 min' depth='21.587 m' /> + <sample time='4:18 min' depth='21.761 m' /> + <sample time='4:20 min' depth='21.924 m' /> + <sample time='4:22 min' depth='21.985 m' /> + <sample time='4:24 min' depth='22.128 m' temp='7.4 C' ndl='26:00 min' /> + <sample time='4:26 min' depth='22.281 m' /> + <sample time='4:28 min' depth='22.566 m' /> + <sample time='4:30 min' depth='22.811 m' /> + <sample time='4:32 min' depth='23.127 m' /> + <sample time='4:34 min' depth='23.413 m' /> + <sample time='4:36 min' depth='23.77 m' temp='7.0 C' ndl='22:00 min' /> + <sample time='4:38 min' depth='24.188 m' /> + <sample time='4:40 min' depth='24.534 m' /> + <sample time='4:42 min' depth='24.759 m' /> + <sample time='4:44 min' depth='24.901 m' /> + <sample time='4:46 min' depth='25.126 m' /> + <sample time='4:48 min' depth='25.279 m' temp='6.6 C' ndl='18:00 min' /> + <sample time='4:50 min' depth='25.503 m' /> + <sample time='4:52 min' depth='25.646 m' /> + <sample time='4:54 min' depth='25.799 m' /> + <sample time='4:56 min' depth='26.044 m' /> + <sample time='4:58 min' depth='26.268 m' /> + <sample time='5:00 min' depth='26.472 m' temp='6.2 C' ndl='15:00 min' /> + <sample time='5:02 min' depth='26.655 m' /> + <sample time='5:04 min' depth='26.717 m' /> + <sample time='5:06 min' depth='26.788 m' /> + <sample time='5:08 min' depth='26.839 m' /> + <sample time='5:10 min' depth='26.941 m' /> + <sample time='5:12 min' depth='27.175 m' temp='5.8 C' ndl='14:00 min' /> + <sample time='5:14 min' depth='27.441 m' /> + <sample time='5:16 min' depth='27.716 m' /> + <sample time='5:18 min' depth='28.032 m' /> + <sample time='5:20 min' depth='28.307 m' /> + <sample time='5:22 min' depth='28.491 m' /> + <sample time='5:24 min' depth='28.705 m' temp='5.6 C' ndl='12:00 min' /> + <sample time='5:26 min' depth='28.827 m' /> + <sample time='5:28 min' depth='29.011 m' /> + <sample time='5:30 min' depth='29.113 m' /> + <sample time='5:32 min' depth='29.215 m' /> + <sample time='5:34 min' depth='29.347 m' /> + <sample time='5:36 min' depth='29.623 m' temp='5.3 C' ndl='11:00 min' /> + <sample time='5:38 min' depth='29.776 m' /> + <sample time='5:40 min' depth='29.888 m' /> + <sample time='5:42 min' depth='30.01 m' /> + <sample time='5:44 min' depth='30.122 m' /> + <sample time='5:46 min' depth='30.306 m' /> + <sample time='5:48 min' depth='30.52 m' temp='5.2 C' ndl='10:00 min' /> + <sample time='5:50 min' depth='30.846 m' po2='1.2 bar' /> + <sample time='5:52 min' depth='31.05 m' /> + <sample time='5:54 min' depth='31.366 m' /> + <sample time='5:56 min' depth='31.519 m' /> + <sample time='5:58 min' depth='31.652 m' /> + <sample time='6:00 min' depth='31.815 m' temp='5.0 C' ndl='12:00 min' /> + <sample time='6:02 min' depth='32.111 m' /> + <sample time='6:04 min' depth='32.192 m' /> + <sample time='6:06 min' depth='32.437 m' /> + <sample time='6:08 min' depth='32.59 m' /> + <sample time='6:10 min' depth='32.702 m' /> + <sample time='6:12 min' depth='32.835 m' temp='4.8 C' ndl='10:00 min' /> + <sample time='6:14 min' depth='33.049 m' /> + <sample time='6:16 min' depth='33.018 m' /> + <sample time='6:18 min' depth='32.998 m' /> + <sample time='6:20 min' depth='33.569 m' /> + <sample time='6:22 min' depth='33.753 m' /> + <sample time='6:24 min' depth='33.926 m' temp='4.7 C' ndl='9:00 min' /> + <sample time='6:26 min' depth='34.038 m' /> + <sample time='6:28 min' depth='34.181 m' /> + <sample time='6:30 min' depth='34.232 m' /> + <sample time='6:32 min' depth='34.375 m' /> + <sample time='6:34 min' depth='34.364 m' /> + <sample time='6:36 min' depth='34.497 m' temp='4.6 C' /> + <sample time='6:38 min' depth='34.375 m' /> + <sample time='6:40 min' depth='34.364 m' /> + <sample time='6:42 min' depth='34.313 m' /> + <sample time='6:44 min' depth='34.354 m' /> + <sample time='6:46 min' depth='34.415 m' /> + <sample time='6:48 min' depth='34.477 m' /> + <sample time='6:50 min' depth='34.609 m' /> + <sample time='6:52 min' depth='34.721 m' /> + <sample time='6:54 min' depth='34.844 m' /> + <sample time='6:56 min' depth='34.895 m' /> + <sample time='6:58 min' depth='35.037 m' /> + <sample time='7:00 min' depth='35.109 m' temp='4.5 C' ndl='8:00 min' /> + <sample time='7:02 min' depth='35.16 m' /> + <sample time='7:04 min' depth='35.18 m' /> + <sample time='7:06 min' depth='35.17 m' /> + <sample time='7:08 min' depth='35.16 m' /> + <sample time='7:10 min' depth='35.17 m' /> + <sample time='7:12 min' depth='35.058 m' cns='2%' /> + <sample time='7:14 min' depth='34.997 m' /> + <sample time='7:16 min' depth='35.017 m' /> + <sample time='7:18 min' depth='34.905 m' /> + <sample time='7:20 min' depth='34.803 m' /> + <sample time='7:22 min' depth='34.681 m' /> + <sample time='7:24 min' depth='34.589 m' /> + <sample time='7:26 min' depth='34.436 m' /> + <sample time='7:28 min' depth='34.181 m' /> + <sample time='7:30 min' depth='34.018 m' /> + <sample time='7:32 min' depth='33.844 m' /> + <sample time='7:34 min' depth='33.681 m' /> + <sample time='7:36 min' depth='33.416 m' ndl='9:00 min' /> + <sample time='7:38 min' depth='33.039 m' /> + <sample time='7:40 min' depth='32.825 m' /> + <sample time='7:42 min' depth='32.56 m' /> + <sample time='7:44 min' depth='32.417 m' /> + <sample time='7:46 min' depth='32.305 m' /> + <sample time='7:48 min' depth='31.795 m' /> + <sample time='7:50 min' depth='31.519 m' /> + <sample time='7:52 min' depth='31.326 m' /> + <sample time='7:54 min' depth='31.652 m' /> + <sample time='7:56 min' depth='31.652 m' /> + <sample time='7:58 min' depth='31.57 m' /> + <sample time='8:00 min' depth='31.479 m' ndl='10:00 min' /> + <sample time='8:02 min' depth='31.234 m' /> + <sample time='8:04 min' depth='30.683 m' /> + <sample time='8:06 min' depth='30.255 m' /> + <sample time='8:08 min' depth='30.051 m' /> + <sample time='8:10 min' depth='30.398 m' /> + <sample time='8:12 min' depth='30.367 m' ndl='11:00 min' /> + <sample time='8:14 min' depth='30.357 m' /> + <sample time='8:16 min' depth='30.245 m' /> + <sample time='8:18 min' depth='30.133 m' /> + <sample time='8:20 min' depth='30.0 m' /> + <sample time='8:22 min' depth='29.918 m' /> + <sample time='8:24 min' depth='29.766 m' temp='4.6 C' ndl='12:00 min' /> + <sample time='8:26 min' depth='29.592 m' /> + <sample time='8:28 min' depth='29.47 m' /> + <sample time='8:30 min' depth='29.317 m' /> + <sample time='8:32 min' depth='29.164 m' /> + <sample time='8:34 min' depth='28.848 m' /> + <sample time='8:36 min' depth='28.787 m' ndl='14:00 min' /> + <sample time='8:38 min' depth='28.613 m' /> + <sample time='8:40 min' depth='28.562 m' /> + <sample time='8:42 min' depth='28.491 m' /> + <sample time='8:44 min' depth='28.318 m' /> + <sample time='8:46 min' depth='28.236 m' /> + <sample time='8:48 min' depth='28.114 m' temp='4.7 C' ndl='15:00 min' /> + <sample time='8:50 min' depth='27.93 m' /> + <sample time='8:52 min' depth='27.746 m' /> + <sample time='8:54 min' depth='27.532 m' /> + <sample time='8:56 min' depth='27.298 m' /> + <sample time='8:58 min' depth='26.992 m' /> + <sample time='9:00 min' depth='26.717 m' ndl='19:00 min' /> + <sample time='9:02 min' depth='26.207 m' /> + <sample time='9:04 min' depth='25.656 m' /> + <sample time='9:06 min' depth='25.666 m' /> + <sample time='9:08 min' depth='25.656 m' /> + <sample time='9:10 min' depth='25.503 m' /> + <sample time='9:12 min' depth='25.269 m' temp='4.8 C' ndl='25:00 min' cns='3%' /> + <sample time='9:14 min' depth='25.085 m' /> + <sample time='9:16 min' depth='24.891 m' /> + <sample time='9:18 min' depth='24.677 m' /> + <sample time='9:20 min' depth='24.483 m' /> + <sample time='9:22 min' depth='24.208 m' /> + <sample time='9:24 min' depth='23.678 m' temp='5.0 C' ndl='33:00 min' /> + <sample time='9:26 min' depth='23.229 m' /> + <sample time='9:28 min' depth='22.872 m' /> + <sample time='9:30 min' depth='23.107 m' /> + <sample time='9:32 min' depth='23.025 m' /> + <sample time='9:34 min' depth='22.964 m' /> + <sample time='9:36 min' depth='22.913 m' temp='5.2 C' ndl='41:00 min' /> + <sample time='9:38 min' depth='22.984 m' /> + <sample time='9:40 min' depth='23.046 m' /> + <sample time='9:42 min' depth='23.056 m' /> + <sample time='9:44 min' depth='23.107 m' /> + <sample time='9:46 min' depth='23.127 m' /> + <sample time='9:48 min' depth='23.158 m' temp='5.5 C' ndl='38:00 min' /> + <sample time='9:50 min' depth='23.097 m' /> + <sample time='9:52 min' depth='23.117 m' /> + <sample time='9:54 min' depth='23.158 m' /> + <sample time='9:56 min' depth='23.28 m' /> + <sample time='9:58 min' depth='23.474 m' /> + <sample time='10:00 min' depth='23.606 m' temp='5.7 C' ndl='35:00 min' /> + <sample time='10:02 min' depth='23.719 m' /> + <sample time='10:04 min' depth='23.719 m' /> + <sample time='10:06 min' depth='23.759 m' /> + <sample time='10:08 min' depth='23.729 m' /> + <sample time='10:10 min' depth='23.719 m' /> + <sample time='10:12 min' depth='23.708 m' temp='5.8 C' ndl='34:00 min' /> + <sample time='10:14 min' depth='23.729 m' /> + <sample time='10:16 min' depth='23.729 m' /> + <sample time='10:18 min' depth='23.902 m' /> + <sample time='10:20 min' depth='24.137 m' /> + <sample time='10:22 min' depth='24.249 m' /> + <sample time='10:24 min' depth='24.371 m' ndl='29:00 min' /> + <sample time='10:26 min' depth='24.565 m' /> + <sample time='10:28 min' depth='24.708 m' /> + <sample time='10:30 min' depth='24.85 m' /> + <sample time='10:32 min' depth='25.003 m' /> + <sample time='10:34 min' depth='25.156 m' /> + <sample time='10:36 min' depth='25.289 m' ndl='24:00 min' /> + <sample time='10:38 min' depth='25.279 m' /> + <sample time='10:40 min' depth='25.218 m' /> + <sample time='10:42 min' depth='25.187 m' /> + <sample time='10:44 min' depth='25.177 m' /> + <sample time='10:46 min' depth='25.187 m' /> + <sample time='10:48 min' depth='25.207 m' temp='5.6 C' /> + <sample time='10:50 min' depth='25.279 m' /> + <sample time='10:52 min' depth='25.33 m' /> + <sample time='10:54 min' depth='25.391 m' /> + <sample time='10:56 min' depth='25.422 m' /> + <sample time='10:58 min' depth='25.473 m' /> + <sample time='11:00 min' depth='25.493 m' temp='5.5 C' ndl='22:00 min' /> + <sample time='11:02 min' depth='25.564 m' /> + <sample time='11:04 min' depth='25.544 m' /> + <sample time='11:06 min' depth='25.656 m' /> + <sample time='11:08 min' depth='25.676 m' /> + <sample time='11:10 min' depth='25.697 m' /> + <sample time='11:12 min' depth='25.666 m' temp='5.4 C' ndl='21:00 min' cns='4%' /> + <sample time='11:14 min' depth='25.809 m' /> + <sample time='11:16 min' depth='25.84 m' /> + <sample time='11:18 min' depth='25.891 m' /> + <sample time='11:20 min' depth='25.972 m' /> + <sample time='11:22 min' depth='26.044 m' /> + <sample time='11:24 min' depth='26.135 m' ndl='20:00 min' /> + <sample time='11:26 min' depth='26.186 m' /> + <sample time='11:28 min' depth='26.258 m' /> + <sample time='11:30 min' depth='26.288 m' /> + <sample time='11:32 min' depth='26.349 m' /> + <sample time='11:34 min' depth='26.38 m' /> + <sample time='11:36 min' depth='26.37 m' temp='5.3 C' ndl='18:00 min' /> + <sample time='11:38 min' depth='26.349 m' /> + <sample time='11:40 min' depth='26.247 m' /> + <sample time='11:42 min' depth='26.105 m' /> + <sample time='11:44 min' depth='26.095 m' /> + <sample time='11:46 min' depth='26.054 m' /> + <sample time='11:48 min' depth='26.023 m' ndl='19:00 min' /> + <sample time='11:50 min' depth='26.033 m' /> + <sample time='11:52 min' depth='26.033 m' /> + <sample time='11:54 min' depth='26.003 m' /> + <sample time='11:56 min' depth='25.962 m' /> + <sample time='11:58 min' depth='25.942 m' /> + <sample time='12:00 min' depth='25.85 m' ndl='20:00 min' /> + <sample time='12:02 min' depth='25.789 m' /> + <sample time='12:04 min' depth='25.697 m' /> + <sample time='12:06 min' depth='25.595 m' /> + <sample time='12:08 min' depth='25.513 m' /> + <sample time='12:10 min' depth='25.36 m' /> + <sample time='12:12 min' depth='25.238 m' ndl='22:00 min' /> + <sample time='12:14 min' depth='25.136 m' /> + <sample time='12:16 min' depth='25.014 m' /> + <sample time='12:18 min' depth='24.861 m' /> + <sample time='12:20 min' depth='24.259 m' /> + <sample time='12:22 min' depth='24.147 m' /> + <sample time='12:24 min' depth='24.514 m' ndl='27:00 min' /> + <sample time='12:26 min' depth='24.555 m' /> + <sample time='12:28 min' depth='24.596 m' /> + <sample time='12:30 min' depth='24.677 m' /> + <sample time='12:32 min' depth='24.769 m' /> + <sample time='12:34 min' depth='24.861 m' /> + <sample time='12:36 min' depth='24.901 m' temp='5.4 C' ndl='24:00 min' /> + <sample time='12:38 min' depth='24.81 m' /> + <sample time='12:40 min' depth='24.698 m' /> + <sample time='12:42 min' depth='24.534 m' /> + <sample time='12:44 min' depth='24.473 m' /> + <sample time='12:46 min' depth='24.473 m' /> + <sample time='12:48 min' depth='24.463 m' ndl='27:00 min' /> + <sample time='12:50 min' depth='24.463 m' /> + <sample time='12:52 min' depth='24.463 m' /> + <sample time='12:54 min' depth='24.432 m' /> + <sample time='12:56 min' depth='24.402 m' /> + <sample time='12:58 min' depth='24.371 m' /> + <sample time='13:00 min' depth='24.31 m' temp='5.5 C' /> + <sample time='13:02 min' depth='24.259 m' /> + <sample time='13:04 min' depth='24.218 m' /> + <sample time='13:06 min' depth='24.137 m' /> + <sample time='13:08 min' depth='24.065 m' /> + <sample time='13:10 min' depth='23.974 m' /> + <sample time='13:12 min' depth='23.79 m' ndl='30:00 min' /> + <sample time='13:14 min' depth='23.627 m' /> + <sample time='13:16 min' depth='23.413 m' /> + <sample time='13:18 min' depth='23.301 m' /> + <sample time='13:20 min' depth='23.117 m' /> + <sample time='13:22 min' depth='22.791 m' /> + <sample time='13:24 min' depth='22.638 m' temp='5.7 C' ndl='39:00 min' /> + <sample time='13:26 min' depth='22.464 m' /> + <sample time='13:28 min' depth='22.291 m' /> + <sample time='13:30 min' depth='22.016 m' /> + <sample time='13:32 min' depth='21.618 m' /> + <sample time='13:34 min' depth='21.904 m' /> + <sample time='13:36 min' depth='21.842 m' temp='5.8 C' ndl='47:00 min' cns='5%' /> + <sample time='13:38 min' depth='21.771 m' /> + <sample time='13:40 min' depth='21.363 m' /> + <sample time='13:42 min' depth='20.904 m' /> + <sample time='13:44 min' depth='20.741 m' /> + <sample time='13:46 min' depth='21.078 m' /> + <sample time='13:48 min' depth='21.078 m' temp='6.1 C' ndl='55:00 min' /> + <sample time='13:50 min' depth='21.016 m' /> + <sample time='13:52 min' depth='20.955 m' /> + <sample time='13:54 min' depth='20.914 m' /> + <sample time='13:56 min' depth='20.874 m' /> + <sample time='13:58 min' depth='20.802 m' /> + <sample time='14:00 min' depth='20.68 m' temp='6.4 C' ndl='61:00 min' /> + <sample time='14:02 min' depth='20.252 m' /> + <sample time='14:04 min' depth='19.884 m' /> + <sample time='14:06 min' depth='19.589 m' /> + <sample time='14:08 min' depth='18.987 m' /> + <sample time='14:10 min' depth='18.773 m' /> + <sample time='14:12 min' depth='18.906 m' temp='6.7 C' ndl='102:00 min' /> + <sample time='14:14 min' depth='18.783 m' /> + <sample time='14:16 min' depth='18.6 m' /> + <sample time='14:18 min' depth='18.416 m' /> + <sample time='14:20 min' depth='18.222 m' /> + <sample time='14:22 min' depth='18.018 m' /> + <sample time='14:24 min' depth='17.845 m' temp='7.2 C' ndl='159:00 min' /> + <sample time='14:26 min' depth='17.529 m' /> + <sample time='14:28 min' depth='16.785 m' /> + <sample time='14:30 min' depth='16.173 m' /> + <sample time='14:32 min' depth='16.254 m' /> + <sample time='14:34 min' depth='16.193 m' /> + <sample time='14:36 min' depth='16.04 m' temp='8.1 C' ndl='240:00 min' /> + <sample time='14:38 min' depth='16.03 m' /> + <sample time='14:40 min' depth='16.091 m' /> + <sample time='14:42 min' depth='15.918 m' /> + <sample time='14:44 min' depth='15.877 m' /> + <sample time='14:46 min' depth='15.704 m' /> + <sample time='14:48 min' depth='15.53 m' temp='8.7 C' /> + <sample time='14:50 min' depth='15.337 m' /> + <sample time='14:52 min' depth='14.735 m' /> + <sample time='14:54 min' depth='14.398 m' /> + <sample time='14:56 min' depth='14.684 m' /> + <sample time='14:58 min' depth='14.511 m' /> + <sample time='15:00 min' depth='14.368 m' temp='9.2 C' /> + <sample time='15:02 min' depth='14.358 m' /> + <sample time='15:04 min' depth='14.225 m' /> + <sample time='15:06 min' depth='14.143 m' /> + <sample time='15:08 min' depth='13.929 m' /> + <sample time='15:10 min' depth='13.664 m' /> + <sample time='15:12 min' depth='13.246 m' temp='9.5 C' /> + <sample time='15:14 min' depth='12.583 m' /> + <sample time='15:16 min' depth='12.787 m' /> + <sample time='15:18 min' depth='12.767 m' /> + <sample time='15:20 min' depth='12.726 m' /> + <sample time='15:22 min' depth='12.593 m' /> + <sample time='15:24 min' depth='12.461 m' temp='9.7 C' /> + <sample time='15:26 min' depth='12.288 m' /> + <sample time='15:28 min' depth='11.747 m' /> + <sample time='15:30 min' depth='11.472 m' /> + <sample time='15:32 min' depth='11.869 m' /> + <sample time='15:34 min' depth='11.869 m' /> + <sample time='15:36 min' depth='11.91 m' temp='9.8 C' cns='6%' /> + <sample time='15:38 min' depth='11.92 m' /> + <sample time='15:40 min' depth='11.91 m' /> + <sample time='15:42 min' depth='11.859 m' /> + <sample time='15:44 min' depth='11.819 m' /> + <sample time='15:46 min' depth='11.808 m' /> + <sample time='15:48 min' depth='11.808 m' /> + <sample time='15:50 min' depth='11.829 m' /> + <sample time='15:52 min' depth='11.829 m' /> + <sample time='15:54 min' depth='11.839 m' /> + <sample time='15:56 min' depth='11.849 m' /> + <sample time='15:58 min' depth='11.92 m' /> + <sample time='16:00 min' depth='11.971 m' /> + <sample time='16:02 min' depth='11.951 m' /> + <sample time='16:04 min' depth='11.941 m' /> + <sample time='16:06 min' depth='11.951 m' /> + <sample time='16:08 min' depth='11.971 m' /> + <sample time='16:10 min' depth='12.094 m' /> + <sample time='16:12 min' depth='12.175 m' /> + <sample time='16:14 min' depth='12.277 m' /> + <sample time='16:16 min' depth='12.339 m' /> + <sample time='16:18 min' depth='12.471 m' /> + <sample time='16:20 min' depth='12.553 m' /> + <sample time='16:22 min' depth='12.665 m' /> + <sample time='16:24 min' depth='12.828 m' /> + <sample time='16:26 min' depth='12.91 m' /> + <sample time='16:28 min' depth='13.001 m' /> + <sample time='16:30 min' depth='12.94 m' /> + <sample time='16:32 min' depth='12.859 m' /> + <sample time='16:34 min' depth='12.797 m' /> + <sample time='16:36 min' depth='12.675 m' /> + <sample time='16:38 min' depth='12.634 m' /> + <sample time='16:40 min' depth='12.716 m' /> + <sample time='16:42 min' depth='12.787 m' /> + <sample time='16:44 min' depth='12.848 m' /> + <sample time='16:46 min' depth='12.93 m' /> + <sample time='16:48 min' depth='13.001 m' /> + <sample time='16:50 min' depth='13.185 m' /> + <sample time='16:52 min' depth='13.338 m' /> + <sample time='16:54 min' depth='13.562 m' /> + <sample time='16:56 min' depth='13.756 m' /> + <sample time='16:58 min' depth='14.021 m' /> + <sample time='17:00 min' depth='14.143 m' /> + <sample time='17:02 min' depth='14.347 m' /> + <sample time='17:04 min' depth='14.429 m' /> + <sample time='17:06 min' depth='14.46 m' /> + <sample time='17:08 min' depth='14.46 m' /> + <sample time='17:10 min' depth='14.47 m' /> + <sample time='17:12 min' depth='14.623 m' /> + <sample time='17:14 min' depth='14.704 m' /> + <sample time='17:16 min' depth='14.806 m' /> + <sample time='17:18 min' depth='14.878 m' /> + <sample time='17:20 min' depth='14.98 m' /> + <sample time='17:22 min' depth='15.031 m' /> + <sample time='17:24 min' depth='14.969 m' /> + <sample time='17:26 min' depth='15.102 m' /> + <sample time='17:28 min' depth='15.102 m' /> + <sample time='17:30 min' depth='15.112 m' /> + <sample time='17:32 min' depth='15.082 m' /> + <sample time='17:34 min' depth='15.041 m' /> + <sample time='17:36 min' depth='15.061 m' /> + <sample time='17:38 min' depth='15.031 m' /> + <sample time='17:40 min' depth='15.082 m' /> + <sample time='17:42 min' depth='15.153 m' /> + <sample time='17:44 min' depth='15.224 m' /> + <sample time='17:46 min' depth='15.337 m' /> + <sample time='17:48 min' depth='15.469 m' /> + <sample time='17:50 min' depth='15.602 m' /> + <sample time='17:52 min' depth='15.765 m' /> + <sample time='17:54 min' depth='15.857 m' /> + <sample time='17:56 min' depth='15.867 m' /> + <sample time='17:58 min' depth='15.867 m' /> + <sample time='18:00 min' depth='15.795 m' cns='7%' /> + <sample time='18:02 min' depth='15.785 m' /> + <sample time='18:04 min' depth='15.836 m' /> + <sample time='18:06 min' depth='15.816 m' /> + <sample time='18:08 min' depth='15.857 m' /> + <sample time='18:10 min' depth='15.877 m' /> + <sample time='18:12 min' depth='15.938 m' temp='9.9 C' /> + <sample time='18:14 min' depth='15.928 m' /> + <sample time='18:16 min' depth='15.979 m' /> + <sample time='18:18 min' depth='15.999 m' /> + <sample time='18:20 min' depth='16.02 m' /> + <sample time='18:22 min' depth='16.071 m' /> + <sample time='18:24 min' depth='16.091 m' /> + <sample time='18:26 min' depth='16.203 m' /> + <sample time='18:28 min' depth='16.275 m' /> + <sample time='18:30 min' depth='16.397 m' /> + <sample time='18:32 min' depth='16.519 m' /> + <sample time='18:34 min' depth='16.581 m' /> + <sample time='18:36 min' depth='16.795 m' /> + <sample time='18:38 min' depth='16.927 m' /> + <sample time='18:40 min' depth='17.08 m' /> + <sample time='18:42 min' depth='17.09 m' /> + <sample time='18:44 min' depth='17.101 m' /> + <sample time='18:46 min' depth='17.111 m' /> + <sample time='18:48 min' depth='17.223 m' /> + <sample time='18:50 min' depth='17.407 m' /> + <sample time='18:52 min' depth='17.519 m' /> + <sample time='18:54 min' depth='17.57 m' /> + <sample time='18:56 min' depth='17.539 m' /> + <sample time='18:58 min' depth='17.509 m' /> + <sample time='19:00 min' depth='17.478 m' ndl='205:00 min' /> + <sample time='19:02 min' depth='17.468 m' /> + <sample time='19:04 min' depth='17.447 m' /> + <sample time='19:06 min' depth='17.519 m' /> + <sample time='19:08 min' depth='17.56 m' /> + <sample time='19:10 min' depth='17.641 m' /> + <sample time='19:12 min' depth='17.702 m' ndl='179:00 min' /> + <sample time='19:14 min' depth='17.804 m' /> + <sample time='19:16 min' depth='17.916 m' /> + <sample time='19:18 min' depth='17.988 m' /> + <sample time='19:20 min' depth='18.029 m' /> + <sample time='19:22 min' depth='18.069 m' /> + <sample time='19:24 min' depth='18.171 m' ndl='139:00 min' /> + <sample time='19:26 min' depth='18.222 m' /> + <sample time='19:28 min' depth='18.294 m' /> + <sample time='19:30 min' depth='18.426 m' /> + <sample time='19:32 min' depth='18.416 m' /> + <sample time='19:34 min' depth='18.416 m' /> + <sample time='19:36 min' depth='18.426 m' temp='9.8 C' ndl='126:00 min' /> + <sample time='19:38 min' depth='18.375 m' /> + <sample time='19:40 min' depth='18.396 m' /> + <sample time='19:42 min' depth='18.447 m' /> + <sample time='19:44 min' depth='18.549 m' /> + <sample time='19:46 min' depth='18.304 m' /> + <sample time='19:48 min' depth='18.467 m' temp='9.5 C' ndl='132:00 min' /> + <sample time='19:50 min' depth='18.824 m' /> + <sample time='19:52 min' depth='18.946 m' /> + <sample time='19:54 min' depth='19.028 m' /> + <sample time='19:56 min' depth='19.008 m' /> + <sample time='19:58 min' depth='18.926 m' /> + <sample time='20:00 min' depth='18.885 m' temp='9.1 C' ndl='104:00 min' cns='8%' /> + <sample time='20:02 min' depth='19.028 m' /> + <sample time='20:04 min' depth='19.069 m' /> + <sample time='20:06 min' depth='19.16 m' /> + <sample time='20:08 min' depth='19.252 m' /> + <sample time='20:10 min' depth='19.293 m' /> + <sample time='20:12 min' depth='19.293 m' temp='8.7 C' ndl='87:00 min' /> + <sample time='20:14 min' depth='19.283 m' /> + <sample time='20:16 min' depth='19.313 m' /> + <sample time='20:18 min' depth='19.446 m' /> + <sample time='20:20 min' depth='19.548 m' /> + <sample time='20:22 min' depth='19.63 m' /> + <sample time='20:24 min' depth='19.67 m' temp='8.4 C' ndl='77:00 min' /> + <sample time='20:26 min' depth='19.721 m' /> + <sample time='20:28 min' depth='19.752 m' /> + <sample time='20:30 min' depth='19.813 m' /> + <sample time='20:32 min' depth='19.864 m' /> + <sample time='20:34 min' depth='19.905 m' /> + <sample time='20:36 min' depth='19.966 m' temp='8.1 C' ndl='71:00 min' /> + <sample time='20:38 min' depth='20.027 m' /> + <sample time='20:40 min' depth='20.078 m' /> + <sample time='20:42 min' depth='20.16 m' /> + <sample time='20:44 min' depth='20.272 m' /> + <sample time='20:46 min' depth='20.394 m' /> + <sample time='20:48 min' depth='20.527 m' temp='7.9 C' ndl='61:00 min' /> + <sample time='20:50 min' depth='20.649 m' /> + <sample time='20:52 min' depth='20.659 m' /> + <sample time='20:54 min' depth='20.68 m' /> + <sample time='20:56 min' depth='20.598 m' /> + <sample time='20:58 min' depth='20.619 m' /> + <sample time='21:00 min' depth='20.629 m' temp='7.6 C' ndl='60:00 min' /> + <sample time='21:02 min' depth='20.659 m' /> + <sample time='21:04 min' depth='20.761 m' /> + <sample time='21:06 min' depth='20.812 m' /> + <sample time='21:08 min' depth='20.863 m' /> + <sample time='21:10 min' depth='20.945 m' /> + <sample time='21:12 min' depth='20.996 m' temp='7.4 C' ndl='55:00 min' /> + <sample time='21:14 min' depth='21.057 m' /> + <sample time='21:16 min' depth='21.129 m' /> + <sample time='21:18 min' depth='21.19 m' /> + <sample time='21:20 min' depth='21.261 m' /> + <sample time='21:22 min' depth='21.404 m' /> + <sample time='21:24 min' depth='21.485 m' temp='7.3 C' ndl='49:00 min' /> + <sample time='21:26 min' depth='21.638 m' /> + <sample time='21:28 min' depth='21.659 m' /> + <sample time='21:30 min' depth='21.638 m' /> + <sample time='21:32 min' depth='21.618 m' /> + <sample time='21:34 min' depth='21.587 m' /> + <sample time='21:36 min' depth='21.598 m' temp='7.1 C' ndl='48:00 min' /> + <sample time='21:38 min' depth='21.638 m' /> + <sample time='21:40 min' depth='21.7 m' /> + <sample time='21:42 min' depth='21.771 m' /> + <sample time='21:44 min' depth='21.74 m' /> + <sample time='21:46 min' depth='21.791 m' /> + <sample time='21:48 min' depth='21.812 m' temp='7.0 C' ndl='45:00 min' /> + <sample time='21:50 min' depth='21.863 m' /> + <sample time='21:52 min' depth='21.924 m' /> + <sample time='21:54 min' depth='21.975 m' /> + <sample time='21:56 min' depth='21.954 m' /> + <sample time='21:58 min' depth='21.873 m' /> + <sample time='22:00 min' depth='21.751 m' temp='6.8 C' cns='9%' /> + <sample time='22:02 min' depth='21.669 m' /> + <sample time='22:04 min' depth='21.608 m' /> + <sample time='22:06 min' depth='21.516 m' /> + <sample time='22:08 min' depth='21.485 m' /> + <sample time='22:10 min' depth='21.455 m' /> + <sample time='22:12 min' depth='21.445 m' temp='6.7 C' ndl='48:00 min' /> + <sample time='22:14 min' depth='21.394 m' /> + <sample time='22:16 min' depth='21.353 m' /> + <sample time='22:18 min' depth='21.22 m' /> + <sample time='22:20 min' depth='21.139 m' /> + <sample time='22:22 min' depth='21.037 m' /> + <sample time='22:24 min' depth='20.955 m' ndl='54:00 min' /> + <sample time='22:26 min' depth='20.945 m' /> + <sample time='22:28 min' depth='20.925 m' /> + <sample time='22:30 min' depth='20.945 m' /> + <sample time='22:32 min' depth='20.986 m' /> + <sample time='22:34 min' depth='20.884 m' /> + <sample time='22:36 min' depth='20.843 m' temp='6.8 C' ndl='55:00 min' /> + <sample time='22:38 min' depth='20.772 m' /> + <sample time='22:40 min' depth='20.557 m' /> + <sample time='22:42 min' depth='20.374 m' /> + <sample time='22:44 min' depth='20.7 m' /> + <sample time='22:46 min' depth='20.7 m' /> + <sample time='22:48 min' depth='20.772 m' ndl='56:00 min' /> + <sample time='22:50 min' depth='20.833 m' /> + <sample time='22:52 min' depth='20.965 m' /> + <sample time='22:54 min' depth='21.19 m' /> + <sample time='22:56 min' depth='21.271 m' /> + <sample time='22:58 min' depth='21.465 m' /> + <sample time='23:00 min' depth='21.598 m' temp='6.9 C' ndl='47:00 min' /> + <sample time='23:02 min' depth='21.71 m' /> + <sample time='23:04 min' depth='21.832 m' /> + <sample time='23:06 min' depth='21.934 m' /> + <sample time='23:08 min' depth='22.016 m' /> + <sample time='23:10 min' depth='22.118 m' /> + <sample time='23:12 min' depth='22.342 m' ndl='40:00 min' /> + <sample time='23:14 min' depth='22.373 m' /> + <sample time='23:16 min' depth='22.495 m' /> + <sample time='23:18 min' depth='22.536 m' /> + <sample time='23:20 min' depth='22.515 m' /> + <sample time='23:22 min' depth='22.464 m' /> + <sample time='23:24 min' depth='22.342 m' temp='6.7 C' ndl='38:00 min' /> + <sample time='23:26 min' depth='22.271 m' /> + <sample time='23:28 min' depth='22.199 m' /> + <sample time='23:30 min' depth='22.209 m' /> + <sample time='23:32 min' depth='22.199 m' /> + <sample time='23:34 min' depth='22.158 m' /> + <sample time='23:36 min' depth='22.097 m' temp='6.6 C' ndl='40:00 min' /> + <sample time='23:38 min' depth='21.954 m' /> + <sample time='23:40 min' depth='21.863 m' /> + <sample time='23:42 min' depth='21.7 m' /> + <sample time='23:44 min' depth='21.577 m' /> + <sample time='23:46 min' depth='21.475 m' /> + <sample time='23:48 min' depth='21.383 m' ndl='48:00 min' /> + <sample time='23:50 min' depth='20.965 m' /> + <sample time='23:52 min' depth='20.68 m' /> + <sample time='23:54 min' depth='20.761 m' /> + <sample time='23:56 min' depth='20.598 m' /> + <sample time='23:58 min' depth='20.537 m' /> + <sample time='24:00 min' depth='20.201 m' ndl='60:00 min' /> + <sample time='24:02 min' depth='19.925 m' /> + <sample time='24:04 min' depth='19.976 m' /> + <sample time='24:06 min' depth='20.099 m' /> + <sample time='24:08 min' depth='20.17 m' /> + <sample time='24:10 min' depth='20.252 m' /> + <sample time='24:12 min' depth='20.313 m' temp='6.8 C' ndl='61:00 min' /> + <sample time='24:14 min' depth='20.303 m' /> + <sample time='24:16 min' depth='20.364 m' /> + <sample time='24:18 min' depth='20.343 m' /> + <sample time='24:20 min' depth='20.323 m' /> + <sample time='24:22 min' depth='20.354 m' /> + <sample time='24:24 min' depth='20.364 m' temp='7.0 C' ndl='60:00 min' cns='10%' /> + <sample time='24:26 min' depth='20.466 m' /> + <sample time='24:28 min' depth='20.547 m' /> + <sample time='24:30 min' depth='20.639 m' /> + <sample time='24:32 min' depth='20.68 m' /> + <sample time='24:34 min' depth='20.71 m' /> + <sample time='24:36 min' depth='20.782 m' ndl='54:00 min' /> + <sample time='24:38 min' depth='20.833 m' /> + <sample time='24:40 min' depth='20.772 m' /> + <sample time='24:42 min' depth='20.874 m' /> + <sample time='24:44 min' depth='21.016 m' /> + <sample time='24:46 min' depth='21.016 m' /> + <sample time='24:48 min' depth='21.088 m' ndl='50:00 min' /> + <sample time='24:50 min' depth='21.159 m' /> + <sample time='24:52 min' depth='21.383 m' /> + <sample time='24:54 min' depth='21.414 m' /> + <sample time='24:56 min' depth='21.434 m' /> + <sample time='24:58 min' depth='21.485 m' /> + <sample time='25:00 min' depth='21.598 m' ndl='45:00 min' /> + <sample time='25:02 min' depth='21.72 m' /> + <sample time='25:04 min' depth='21.751 m' /> + <sample time='25:06 min' depth='21.781 m' /> + <sample time='25:08 min' depth='21.873 m' /> + <sample time='25:10 min' depth='21.853 m' /> + <sample time='25:12 min' depth='21.771 m' temp='6.9 C' ndl='42:00 min' /> + <sample time='25:14 min' depth='21.536 m' /> + <sample time='25:16 min' depth='21.21 m' /> + <sample time='25:18 min' depth='20.7 m' /> + <sample time='25:20 min' depth='20.894 m' /> + <sample time='25:22 min' depth='20.853 m' /> + <sample time='25:24 min' depth='21.016 m' temp='6.8 C' ndl='52:00 min' /> + <sample time='25:26 min' depth='20.955 m' /> + <sample time='25:28 min' depth='20.976 m' /> + <sample time='25:30 min' depth='20.945 m' /> + <sample time='25:32 min' depth='20.976 m' /> + <sample time='25:34 min' depth='21.149 m' /> + <sample time='25:36 min' depth='21.353 m' ndl='47:00 min' /> + <sample time='25:38 min' depth='21.567 m' /> + <sample time='25:40 min' depth='21.853 m' /> + <sample time='25:42 min' depth='22.169 m' /> + <sample time='25:44 min' depth='22.505 m' /> + <sample time='25:46 min' depth='22.811 m' /> + <sample time='25:48 min' depth='23.025 m' ndl='32:00 min' /> + <sample time='25:50 min' depth='23.199 m' /> + <sample time='25:52 min' depth='23.402 m' /> + <sample time='25:54 min' depth='23.535 m' /> + <sample time='25:56 min' depth='23.79 m' /> + <sample time='25:58 min' depth='24.004 m' /> + <sample time='26:00 min' depth='24.29 m' temp='6.6 C' ndl='24:00 min' /> + <sample time='26:02 min' depth='24.606 m' /> + <sample time='26:04 min' depth='25.014 m' /> + <sample time='26:06 min' depth='25.411 m' /> + <sample time='26:08 min' depth='25.717 m' /> + <sample time='26:10 min' depth='26.033 m' /> + <sample time='26:12 min' depth='26.36 m' temp='6.4 C' ndl='17:00 min' /> + <sample time='26:14 min' depth='26.666 m' /> + <sample time='26:16 min' depth='26.87 m' /> + <sample time='26:18 min' depth='26.971 m' /> + <sample time='26:20 min' depth='27.033 m' /> + <sample time='26:22 min' depth='27.124 m' /> + <sample time='26:24 min' depth='27.196 m' temp='6.1 C' ndl='14:00 min' cns='11%' /> + <sample time='26:26 min' depth='27.369 m' /> + <sample time='26:28 min' depth='27.522 m' /> + <sample time='26:30 min' depth='27.634 m' /> + <sample time='26:32 min' depth='27.716 m' /> + <sample time='26:34 min' depth='27.818 m' /> + <sample time='26:36 min' depth='27.91 m' temp='5.8 C' ndl='12:00 min' /> + <sample time='26:38 min' depth='28.093 m' /> + <sample time='26:40 min' depth='28.399 m' /> + <sample time='26:42 min' depth='28.552 m' /> + <sample time='26:44 min' depth='28.827 m' /> + <sample time='26:46 min' depth='28.991 m' /> + <sample time='26:48 min' depth='28.97 m' temp='5.5 C' ndl='11:00 min' /> + <sample time='26:50 min' depth='29.011 m' /> + <sample time='26:52 min' depth='28.96 m' /> + <sample time='26:54 min' depth='28.817 m' /> + <sample time='26:56 min' depth='28.705 m' /> + <sample time='26:58 min' depth='28.817 m' /> + <sample time='27:00 min' depth='28.419 m' temp='5.2 C' /> + <sample time='27:02 min' depth='28.328 m' /> + <sample time='27:04 min' depth='28.267 m' /> + <sample time='27:06 min' depth='28.154 m' /> + <sample time='27:08 min' depth='28.063 m' /> + <sample time='27:10 min' depth='28.083 m' /> + <sample time='27:12 min' depth='27.971 m' temp='5.0 C' ndl='12:00 min' /> + <sample time='27:14 min' depth='27.95 m' /> + <sample time='27:16 min' depth='27.94 m' /> + <sample time='27:18 min' depth='27.91 m' /> + <sample time='27:20 min' depth='27.889 m' /> + <sample time='27:22 min' depth='27.879 m' /> + <sample time='27:24 min' depth='27.746 m' temp='4.9 C' /> + <sample time='27:26 min' depth='27.604 m' /> + <sample time='27:28 min' depth='27.492 m' /> + <sample time='27:30 min' depth='27.43 m' /> + <sample time='27:32 min' depth='27.451 m' /> + <sample time='27:34 min' depth='27.43 m' /> + <sample time='27:36 min' depth='27.226 m' temp='4.8 C' /> + <sample time='27:38 min' depth='27.084 m' /> + <sample time='27:40 min' depth='27.349 m' /> + <sample time='27:42 min' depth='27.379 m' /> + <sample time='27:44 min' depth='27.41 m' /> + <sample time='27:46 min' depth='27.502 m' /> + <sample time='27:48 min' depth='27.624 m' /> + <sample time='27:50 min' depth='27.665 m' /> + <sample time='27:52 min' depth='27.767 m' /> + <sample time='27:54 min' depth='27.787 m' /> + <sample time='27:56 min' depth='27.777 m' /> + <sample time='27:58 min' depth='27.757 m' /> + <sample time='28:00 min' depth='27.808 m' ndl='11:00 min' /> + <sample time='28:02 min' depth='27.838 m' /> + <sample time='28:04 min' depth='27.869 m' /> + <sample time='28:06 min' depth='27.869 m' /> + <sample time='28:08 min' depth='27.797 m' /> + <sample time='28:10 min' depth='27.41 m' /> + <sample time='28:12 min' depth='27.175 m' ndl='12:00 min' /> + <sample time='28:14 min' depth='27.43 m' /> + <sample time='28:16 min' depth='27.512 m' /> + <sample time='28:18 min' depth='27.645 m' /> + <sample time='28:20 min' depth='27.726 m' /> + <sample time='28:22 min' depth='27.818 m' /> + <sample time='28:24 min' depth='27.93 m' temp='4.9 C' ndl='11:00 min' cns='12%' /> + <sample time='28:26 min' depth='28.022 m' /> + <sample time='28:28 min' depth='28.022 m' /> + <sample time='28:30 min' depth='27.981 m' /> + <sample time='28:32 min' depth='27.92 m' /> + <sample time='28:34 min' depth='27.961 m' /> + <sample time='28:36 min' depth='28.022 m' temp='4.8 C' ndl='10:00 min' /> + <sample time='28:38 min' depth='28.001 m' /> + <sample time='28:40 min' depth='27.828 m' /> + <sample time='28:42 min' depth='27.828 m' /> + <sample time='28:44 min' depth='27.889 m' /> + <sample time='28:46 min' depth='28.001 m' /> + <sample time='28:48 min' depth='28.012 m' /> + <sample time='28:50 min' depth='28.012 m' /> + <sample time='28:52 min' depth='27.991 m' /> + <sample time='28:54 min' depth='27.95 m' /> + <sample time='28:56 min' depth='27.93 m' /> + <sample time='28:58 min' depth='27.92 m' /> + <sample time='29:00 min' depth='27.91 m' temp='4.7 C' /> + <sample time='29:02 min' depth='27.991 m' /> + <sample time='29:04 min' depth='28.022 m' /> + <sample time='29:06 min' depth='28.073 m' /> + <sample time='29:08 min' depth='28.063 m' /> + <sample time='29:10 min' depth='28.032 m' /> + <sample time='29:12 min' depth='28.093 m' /> + <sample time='29:14 min' depth='28.144 m' /> + <sample time='29:16 min' depth='28.256 m' /> + <sample time='29:18 min' depth='28.379 m' /> + <sample time='29:20 min' depth='28.542 m' /> + <sample time='29:22 min' depth='28.685 m' /> + <sample time='29:24 min' depth='28.817 m' ndl='9:00 min' /> + <sample time='29:26 min' depth='29.062 m' /> + <sample time='29:28 min' depth='29.164 m' /> + <sample time='29:30 min' depth='29.245 m' /> + <sample time='29:32 min' depth='29.429 m' /> + <sample time='29:34 min' depth='29.664 m' /> + <sample time='29:36 min' depth='29.888 m' ndl='7:00 min' /> + <sample time='29:38 min' depth='29.98 m' /> + <sample time='29:40 min' depth='29.949 m' /> + <sample time='29:42 min' depth='29.908 m' /> + <sample time='29:44 min' depth='29.99 m' /> + <sample time='29:46 min' depth='30.031 m' /> + <sample time='29:48 min' depth='30.184 m' /> + <sample time='29:50 min' depth='30.367 m' /> + <sample time='29:52 min' depth='30.561 m' /> + <sample time='29:54 min' depth='30.734 m' /> + <sample time='29:56 min' depth='30.775 m' /> + <sample time='29:58 min' depth='30.775 m' /> + <sample time='30:00 min' depth='30.806 m' temp='4.6 C' ndl='6:00 min' /> + <sample time='30:02 min' depth='30.836 m' /> + <sample time='30:04 min' depth='30.928 m' /> + <sample time='30:06 min' depth='31.02 m' /> + <sample time='30:08 min' depth='31.132 m' /> + <sample time='30:10 min' depth='31.336 m' /> + <sample time='30:12 min' depth='31.56 m' /> + <sample time='30:14 min' depth='31.825 m' /> + <sample time='30:16 min' depth='32.029 m' /> + <sample time='30:18 min' depth='32.192 m' /> + <sample time='30:20 min' depth='32.325 m' /> + <sample time='30:22 min' depth='32.488 m' /> + <sample time='30:24 min' depth='32.692 m' temp='4.5 C' ndl='5:00 min' /> + <sample time='30:26 min' depth='32.937 m' /> + <sample time='30:28 min' depth='33.12 m' /> + <sample time='30:30 min' depth='33.222 m' /> + <sample time='30:32 min' depth='33.284 m' /> + <sample time='30:34 min' depth='33.335 m' /> + <sample time='30:36 min' depth='33.477 m' ndl='4:00 min' /> + <sample time='30:38 min' depth='33.651 m' /> + <sample time='30:40 min' depth='33.875 m' /> + <sample time='30:42 min' depth='34.171 m' /> + <sample time='30:44 min' depth='34.375 m' /> + <sample time='30:46 min' depth='34.446 m' /> + <sample time='30:48 min' depth='34.548 m' cns='13%' /> + <sample time='30:50 min' depth='34.619 m' /> + <sample time='30:52 min' depth='34.752 m' /> + <sample time='30:54 min' depth='35.058 m' /> + <sample time='30:56 min' depth='35.17 m' /> + <sample time='30:58 min' depth='35.333 m' /> + <sample time='31:00 min' depth='35.445 m' ndl='3:00 min' /> + <sample time='31:02 min' depth='35.578 m' /> + <sample time='31:04 min' depth='35.741 m' /> + <sample time='31:06 min' depth='35.945 m' /> + <sample time='31:08 min' depth='36.169 m' /> + <sample time='31:10 min' depth='36.496 m' /> + <sample time='31:12 min' depth='36.74 m' temp='4.4 C' /> + <sample time='31:14 min' depth='36.914 m' /> + <sample time='31:16 min' depth='37.128 m' /> + <sample time='31:18 min' depth='37.424 m' /> + <sample time='31:20 min' depth='37.515 m' /> + <sample time='31:22 min' depth='37.597 m' /> + <sample time='31:24 min' depth='37.689 m' ndl='2:00 min' /> + <sample time='31:26 min' depth='37.811 m' /> + <sample time='31:28 min' depth='37.903 m' /> + <sample time='31:30 min' depth='38.046 m' /> + <sample time='31:32 min' depth='38.158 m' /> + <sample time='31:34 min' depth='38.423 m' /> + <sample time='31:36 min' depth='38.474 m' /> + <sample time='31:38 min' depth='38.535 m' /> + <sample time='31:40 min' depth='38.586 m' /> + <sample time='31:42 min' depth='38.647 m' /> + <sample time='31:44 min' depth='38.668 m' /> + <sample time='31:46 min' depth='38.668 m' /> + <sample time='31:48 min' depth='38.688 m' temp='4.3 C' /> + <sample time='31:50 min' depth='38.749 m' /> + <sample time='31:52 min' depth='38.749 m' /> + <sample time='31:54 min' depth='38.759 m' /> + <sample time='31:56 min' depth='38.77 m' /> + <sample time='31:58 min' depth='38.8 m' /> + <sample time='32:00 min' depth='38.759 m' /> + <sample time='32:02 min' depth='38.79 m' /> + <sample time='32:04 min' depth='38.759 m' /> + <sample time='32:06 min' depth='38.708 m' /> + <sample time='32:08 min' depth='38.708 m' /> + <sample time='32:10 min' depth='38.708 m' /> + <sample time='32:12 min' depth='38.729 m' ndl='1:00 min' /> + <sample time='32:14 min' depth='38.77 m' /> + <sample time='32:16 min' depth='38.861 m' /> + <sample time='32:18 min' depth='38.882 m' /> + <sample time='32:20 min' depth='38.892 m' /> + <sample time='32:22 min' depth='38.923 m' /> + <sample time='32:24 min' depth='38.974 m' /> + <sample time='32:26 min' depth='38.974 m' /> + <sample time='32:28 min' depth='38.902 m' /> + <sample time='32:30 min' depth='38.423 m' /> + <sample time='32:32 min' depth='38.606 m' /> + <sample time='32:34 min' depth='38.78 m' /> + <sample time='32:36 min' depth='38.749 m' /> + <sample time='32:38 min' depth='38.729 m' /> + <sample time='32:40 min' depth='38.739 m' /> + <sample time='32:42 min' depth='38.759 m' /> + <sample time='32:44 min' depth='38.78 m' /> + <sample time='32:46 min' depth='38.678 m' /> + <sample time='32:48 min' depth='38.79 m' cns='14%' /> + <sample time='32:50 min' depth='38.698 m' /> + <sample time='32:52 min' depth='38.596 m' /> + <sample time='32:54 min' depth='38.494 m' /> + <sample time='32:56 min' depth='38.341 m' /> + <sample time='32:58 min' depth='38.178 m' /> + <sample time='33:00 min' depth='38.076 m' /> + <sample time='33:02 min' depth='37.984 m' /> + <sample time='33:04 min' depth='37.974 m' /> + <sample time='33:06 min' depth='38.056 m' /> + <sample time='33:08 min' depth='38.107 m' /> + <sample time='33:10 min' depth='38.097 m' /> + <sample time='33:12 min' depth='38.137 m' /> + <sample time='33:14 min' depth='38.117 m' /> + <sample time='33:16 min' depth='38.046 m' /> + <sample time='33:18 min' depth='38.005 m' /> + <sample time='33:20 min' depth='37.893 m' /> + <sample time='33:22 min' depth='37.852 m' /> + <sample time='33:24 min' depth='37.811 m' ndl='0:00 min' /> + <sample time='33:26 min' depth='37.638 m' /> + <sample time='33:28 min' depth='37.546 m' /> + <sample time='33:30 min' depth='37.444 m' /> + <sample time='33:32 min' depth='37.24 m' /> + <sample time='33:34 min' depth='37.169 m' /> + <sample time='33:36 min' depth='37.077 m' /> + <sample time='33:38 min' depth='36.863 m' /> + <sample time='33:40 min' depth='36.363 m' /> + <sample time='33:42 min' depth='36.027 m' /> + <sample time='33:44 min' depth='36.292 m' /> + <sample time='33:46 min' depth='36.118 m' /> + <sample time='33:48 min' depth='36.098 m' /> + <sample time='33:50 min' depth='35.853 m' /> + <sample time='33:52 min' depth='35.67 m' /> + <sample time='33:54 min' depth='35.323 m' /> + <sample time='33:56 min' depth='34.874 m' /> + <sample time='33:58 min' depth='34.65 m' /> + <sample time='34:00 min' depth='35.017 m' temp='4.4 C' /> + <sample time='34:02 min' depth='34.905 m' /> + <sample time='34:04 min' depth='34.721 m' /> + <sample time='34:06 min' depth='34.589 m' /> + <sample time='34:08 min' depth='34.344 m' /> + <sample time='34:10 min' depth='34.028 m' /> + <sample time='34:12 min' depth='33.702 m' /> + <sample time='34:14 min' depth='33.314 m' /> + <sample time='34:16 min' depth='32.58 m' /> + <sample time='34:18 min' depth='32.08 m' /> + <sample time='34:20 min' depth='32.111 m' /> + <sample time='34:22 min' depth='32.029 m' /> + <sample time='34:24 min' depth='31.774 m' /> + <sample time='34:26 min' depth='31.53 m' /> + <sample time='34:28 min' depth='31.326 m' /> + <sample time='34:30 min' depth='31.152 m' /> + <sample time='34:32 min' depth='31.01 m' /> + <sample time='34:34 min' depth='30.816 m' /> + <sample time='34:36 min' depth='30.622 m' /> + <sample time='34:38 min' depth='30.439 m' /> + <sample time='34:40 min' depth='30.102 m' /> + <sample time='34:42 min' depth='29.449 m' /> + <sample time='34:44 min' depth='29.562 m' /> + <sample time='34:46 min' depth='29.541 m' /> + <sample time='34:48 min' depth='29.449 m' temp='4.5 C' /> + <sample time='34:50 min' depth='29.266 m' /> + <sample time='34:52 min' depth='29.052 m' /> + <sample time='34:54 min' depth='28.797 m' /> + <sample time='34:56 min' depth='28.572 m' /> + <sample time='34:58 min' depth='28.369 m' /> + <sample time='35:00 min' depth='28.256 m' /> + <sample time='35:02 min' depth='28.154 m' /> + <sample time='35:04 min' depth='27.726 m' /> + <sample time='35:06 min' depth='27.522 m' /> + <sample time='35:08 min' depth='27.838 m' /> + <sample time='35:10 min' depth='27.757 m' /> + <sample time='35:12 min' depth='27.787 m' temp='4.6 C' cns='15%' /> + <sample time='35:14 min' depth='27.757 m' /> + <sample time='35:16 min' depth='27.665 m' /> + <sample time='35:18 min' depth='27.553 m' /> + <sample time='35:20 min' depth='27.502 m' /> + <sample time='35:22 min' depth='27.42 m' /> + <sample time='35:24 min' depth='27.369 m' temp='4.7 C' /> + <sample time='35:26 min' depth='27.226 m' /> + <sample time='35:28 min' depth='27.165 m' /> + <sample time='35:30 min' depth='26.982 m' /> + <sample time='35:32 min' depth='26.829 m' /> + <sample time='35:34 min' depth='26.747 m' /> + <sample time='35:36 min' depth='26.166 m' temp='4.8 C' /> + <sample time='35:38 min' depth='25.952 m' /> + <sample time='35:40 min' depth='26.023 m' /> + <sample time='35:42 min' depth='26.023 m' /> + <sample time='35:44 min' depth='26.013 m' /> + <sample time='35:46 min' depth='26.227 m' /> + <sample time='35:48 min' depth='26.176 m' temp='4.9 C' /> + <sample time='35:50 min' depth='26.227 m' /> + <sample time='35:52 min' depth='26.166 m' /> + <sample time='35:54 min' depth='26.105 m' /> + <sample time='35:56 min' depth='26.084 m' /> + <sample time='35:58 min' depth='26.033 m' /> + <sample time='36:00 min' depth='26.044 m' temp='5.0 C' /> + <sample time='36:02 min' depth='26.033 m' /> + <sample time='36:04 min' depth='25.891 m' /> + <sample time='36:06 min' depth='25.86 m' /> + <sample time='36:08 min' depth='25.84 m' /> + <sample time='36:10 min' depth='25.36 m' /> + <sample time='36:12 min' depth='25.258 m' temp='5.1 C' /> + <sample time='36:14 min' depth='25.33 m' /> + <sample time='36:16 min' depth='25.687 m' /> + <sample time='36:18 min' depth='25.748 m' /> + <sample time='36:20 min' depth='25.809 m' /> + <sample time='36:22 min' depth='25.809 m' /> + <sample time='36:24 min' depth='25.86 m' /> + <sample time='36:26 min' depth='25.911 m' /> + <sample time='36:28 min' depth='25.799 m' /> + <sample time='36:30 min' depth='25.829 m' /> + <sample time='36:32 min' depth='25.778 m' /> + <sample time='36:34 min' depth='25.85 m' /> + <sample time='36:36 min' depth='25.88 m' /> + <sample time='36:38 min' depth='25.952 m' /> + <sample time='36:40 min' depth='26.013 m' /> + <sample time='36:42 min' depth='25.993 m' /> + <sample time='36:44 min' depth='26.003 m' /> + <sample time='36:46 min' depth='26.044 m' /> + <sample time='36:48 min' depth='26.033 m' temp='5.2 C' /> + <sample time='36:50 min' depth='26.064 m' /> + <sample time='36:52 min' depth='26.146 m' /> + <sample time='36:54 min' depth='26.156 m' /> + <sample time='36:56 min' depth='26.176 m' /> + <sample time='36:58 min' depth='26.197 m' /> + <sample time='37:00 min' depth='26.197 m' /> + <sample time='37:02 min' depth='26.258 m' /> + <sample time='37:04 min' depth='26.319 m' /> + <sample time='37:06 min' depth='26.431 m' /> + <sample time='37:08 min' depth='26.462 m' /> + <sample time='37:10 min' depth='26.513 m' /> + <sample time='37:12 min' depth='26.574 m' cns='16%' /> + <sample time='37:14 min' depth='26.645 m' /> + <sample time='37:16 min' depth='26.696 m' /> + <sample time='37:18 min' depth='26.717 m' /> + <sample time='37:20 min' depth='26.747 m' /> + <sample time='37:22 min' depth='26.737 m' /> + <sample time='37:24 min' depth='26.757 m' /> + <sample time='37:26 min' depth='26.757 m' /> + <sample time='37:28 min' depth='26.808 m' /> + <sample time='37:30 min' depth='26.849 m' /> + <sample time='37:32 min' depth='26.91 m' /> + <sample time='37:34 min' depth='27.022 m' /> + <sample time='37:36 min' depth='27.063 m' /> + <sample time='37:38 min' depth='27.114 m' /> + <sample time='37:40 min' depth='27.145 m' /> + <sample time='37:42 min' depth='27.145 m' /> + <sample time='37:44 min' depth='27.216 m' /> + <sample time='37:46 min' depth='27.206 m' /> + <sample time='37:48 min' depth='27.196 m' temp='5.1 C' /> + <sample time='37:50 min' depth='27.145 m' /> + <sample time='37:52 min' depth='27.104 m' /> + <sample time='37:54 min' depth='26.982 m' /> + <sample time='37:56 min' depth='26.87 m' /> + <sample time='37:58 min' depth='26.768 m' /> + <sample time='38:00 min' depth='26.717 m' /> + <sample time='38:02 min' depth='26.635 m' /> + <sample time='38:04 min' depth='26.594 m' /> + <sample time='38:06 min' depth='26.523 m' /> + <sample time='38:08 min' depth='26.421 m' /> + <sample time='38:10 min' depth='26.329 m' /> + <sample time='38:12 min' depth='26.217 m' /> + <sample time='38:14 min' depth='26.146 m' /> + <sample time='38:16 min' depth='25.901 m' /> + <sample time='38:18 min' depth='25.799 m' /> + <sample time='38:20 min' depth='25.707 m' /> + <sample time='38:22 min' depth='25.727 m' /> + <sample time='38:24 min' depth='25.707 m' /> + <sample time='38:26 min' depth='25.707 m' /> + <sample time='38:28 min' depth='25.595 m' /> + <sample time='38:30 min' depth='25.534 m' /> + <sample time='38:32 min' depth='25.452 m' /> + <sample time='38:34 min' depth='25.34 m' /> + <sample time='38:36 min' depth='25.32 m' temp='5.2 C' /> + <sample time='38:38 min' depth='25.33 m' /> + <sample time='38:40 min' depth='25.309 m' /> + <sample time='38:42 min' depth='25.258 m' /> + <sample time='38:44 min' depth='25.218 m' /> + <sample time='38:46 min' depth='25.279 m' /> + <sample time='38:48 min' depth='25.35 m' temp='5.3 C' /> + <sample time='38:50 min' depth='25.411 m' /> + <sample time='38:52 min' depth='25.422 m' /> + <sample time='38:54 min' depth='25.381 m' /> + <sample time='38:56 min' depth='25.34 m' /> + <sample time='38:58 min' depth='25.248 m' /> + <sample time='39:00 min' depth='25.238 m' temp='5.4 C' /> + <sample time='39:02 min' depth='25.32 m' /> + <sample time='39:04 min' depth='25.309 m' /> + <sample time='39:06 min' depth='25.299 m' /> + <sample time='39:08 min' depth='25.32 m' /> + <sample time='39:10 min' depth='25.391 m' /> + <sample time='39:12 min' depth='25.401 m' /> + <sample time='39:14 min' depth='25.422 m' /> + <sample time='39:16 min' depth='25.483 m' /> + <sample time='39:18 min' depth='25.523 m' /> + <sample time='39:20 min' depth='25.595 m' /> + <sample time='39:22 min' depth='25.789 m' /> + <sample time='39:24 min' depth='25.86 m' /> + <sample time='39:26 min' depth='25.911 m' /> + <sample time='39:28 min' depth='26.064 m' /> + <sample time='39:30 min' depth='26.105 m' /> + <sample time='39:32 min' depth='26.197 m' /> + <sample time='39:34 min' depth='26.258 m' /> + <sample time='39:36 min' depth='26.268 m' cns='17%' /> + <sample time='39:38 min' depth='26.37 m' /> + <sample time='39:40 min' depth='26.594 m' /> + <sample time='39:42 min' depth='26.625 m' /> + <sample time='39:44 min' depth='26.604 m' /> + <sample time='39:46 min' depth='26.564 m' /> + <sample time='39:48 min' depth='26.451 m' /> + <sample time='39:50 min' depth='26.625 m' /> + <sample time='39:52 min' depth='26.462 m' /> + <sample time='39:54 min' depth='26.543 m' /> + <sample time='39:56 min' depth='26.288 m' /> + <sample time='39:58 min' depth='26.37 m' /> + <sample time='40:00 min' depth='26.36 m' temp='5.3 C' /> + <sample time='40:02 min' depth='26.207 m' /> + <sample time='40:04 min' depth='26.156 m' /> + <sample time='40:06 min' depth='26.064 m' /> + <sample time='40:08 min' depth='26.003 m' /> + <sample time='40:10 min' depth='26.013 m' /> + <sample time='40:12 min' depth='25.972 m' /> + <sample time='40:14 min' depth='25.931 m' /> + <sample time='40:16 min' depth='25.86 m' /> + <sample time='40:18 min' depth='25.778 m' /> + <sample time='40:20 min' depth='25.646 m' /> + <sample time='40:22 min' depth='25.534 m' /> + <sample time='40:24 min' depth='25.473 m' /> + <sample time='40:26 min' depth='25.33 m' /> + <sample time='40:28 min' depth='25.177 m' /> + <sample time='40:30 min' depth='25.034 m' /> + <sample time='40:32 min' depth='24.891 m' /> + <sample time='40:34 min' depth='24.738 m' /> + <sample time='40:36 min' depth='24.657 m' /> + <sample time='40:38 min' depth='24.545 m' /> + <sample time='40:40 min' depth='24.443 m' /> + <sample time='40:42 min' depth='24.402 m' /> + <sample time='40:44 min' depth='24.33 m' /> + <sample time='40:46 min' depth='24.269 m' /> + <sample time='40:48 min' depth='24.218 m' temp='5.4 C' /> + <sample time='40:50 min' depth='24.228 m' /> + <sample time='40:52 min' depth='24.228 m' /> + <sample time='40:54 min' depth='23.78 m' /> + <sample time='40:56 min' depth='23.719 m' /> + <sample time='40:58 min' depth='24.075 m' /> + <sample time='41:00 min' depth='24.096 m' temp='5.6 C' /> + <sample time='41:02 min' depth='24.137 m' /> + <sample time='41:04 min' depth='24.208 m' /> + <sample time='41:06 min' depth='24.177 m' /> + <sample time='41:08 min' depth='24.218 m' /> + <sample time='41:10 min' depth='24.106 m' /> + <sample time='41:12 min' depth='23.586 m' temp='5.7 C' /> + <sample time='41:14 min' depth='23.341 m' /> + <sample time='41:16 min' depth='23.739 m' /> + <sample time='41:18 min' depth='23.719 m' /> + <sample time='41:20 min' depth='23.719 m' /> + <sample time='41:22 min' depth='23.719 m' /> + <sample time='41:24 min' depth='23.708 m' temp='5.8 C' /> + <sample time='41:26 min' depth='23.719 m' /> + <sample time='41:28 min' depth='23.759 m' /> + <sample time='41:30 min' depth='23.821 m' /> + <sample time='41:32 min' depth='23.861 m' /> + <sample time='41:34 min' depth='23.851 m' /> + <sample time='41:36 min' depth='23.872 m' temp='5.9 C' /> + <sample time='41:38 min' depth='23.861 m' /> + <sample time='41:40 min' depth='23.933 m' /> + <sample time='41:42 min' depth='24.055 m' /> + <sample time='41:44 min' depth='24.147 m' /> + <sample time='41:46 min' depth='24.259 m' /> + <sample time='41:48 min' depth='24.422 m' /> + <sample time='41:50 min' depth='24.473 m' /> + <sample time='41:52 min' depth='24.504 m' /> + <sample time='41:54 min' depth='24.483 m' /> + <sample time='41:56 min' depth='24.504 m' /> + <sample time='41:58 min' depth='24.432 m' /> + <sample time='42:00 min' depth='24.422 m' cns='18%' /> + <sample time='42:02 min' depth='24.33 m' /> + <sample time='42:04 min' depth='24.31 m' /> + <sample time='42:06 min' depth='24.351 m' /> + <sample time='42:08 min' depth='24.361 m' /> + <sample time='42:10 min' depth='24.453 m' /> + <sample time='42:12 min' depth='24.208 m' /> + <sample time='42:14 min' depth='24.177 m' /> + <sample time='42:16 min' depth='24.147 m' /> + <sample time='42:18 min' depth='24.075 m' /> + <sample time='42:20 min' depth='23.994 m' /> + <sample time='42:22 min' depth='23.943 m' /> + <sample time='42:24 min' depth='23.943 m' temp='5.8 C' /> + <sample time='42:26 min' depth='23.912 m' /> + <sample time='42:28 min' depth='23.872 m' /> + <sample time='42:30 min' depth='23.912 m' /> + <sample time='42:32 min' depth='23.963 m' /> + <sample time='42:34 min' depth='24.025 m' /> + <sample time='42:36 min' depth='24.086 m' /> + <sample time='42:38 min' depth='24.126 m' /> + <sample time='42:40 min' depth='24.157 m' /> + <sample time='42:42 min' depth='24.157 m' /> + <sample time='42:44 min' depth='24.249 m' /> + <sample time='42:46 min' depth='24.29 m' /> + <sample time='42:48 min' depth='24.351 m' /> + <sample time='42:50 min' depth='24.412 m' /> + <sample time='42:52 min' depth='24.453 m' /> + <sample time='42:54 min' depth='24.422 m' /> + <sample time='42:56 min' depth='24.453 m' /> + <sample time='42:58 min' depth='24.504 m' /> + <sample time='43:00 min' depth='24.555 m' /> + <sample time='43:02 min' depth='24.616 m' /> + <sample time='43:04 min' depth='24.657 m' /> + <sample time='43:06 min' depth='24.718 m' /> + <sample time='43:08 min' depth='24.749 m' /> + <sample time='43:10 min' depth='24.769 m' /> + <sample time='43:12 min' depth='24.779 m' /> + <sample time='43:14 min' depth='24.799 m' /> + <sample time='43:16 min' depth='24.85 m' /> + <sample time='43:18 min' depth='24.871 m' /> + <sample time='43:20 min' depth='24.901 m' /> + <sample time='43:22 min' depth='24.881 m' /> + <sample time='43:24 min' depth='24.85 m' temp='5.7 C' /> + <sample time='43:26 min' depth='24.85 m' /> + <sample time='43:28 min' depth='24.779 m' /> + <sample time='43:30 min' depth='24.698 m' /> + <sample time='43:32 min' depth='24.606 m' /> + <sample time='43:34 min' depth='24.514 m' /> + <sample time='43:36 min' depth='24.443 m' /> + <sample time='43:38 min' depth='24.341 m' /> + <sample time='43:40 min' depth='24.29 m' /> + <sample time='43:42 min' depth='24.249 m' /> + <sample time='43:44 min' depth='24.177 m' /> + <sample time='43:46 min' depth='24.106 m' /> + <sample time='43:48 min' depth='24.055 m' /> + <sample time='43:50 min' depth='24.025 m' /> + <sample time='43:52 min' depth='23.963 m' /> + <sample time='43:54 min' depth='23.974 m' /> + <sample time='43:56 min' depth='23.994 m' /> + <sample time='43:58 min' depth='24.035 m' /> + <sample time='44:00 min' depth='24.137 m' temp='5.8 C' cns='19%' /> + <sample time='44:02 min' depth='24.188 m' /> + <sample time='44:04 min' depth='24.259 m' /> + <sample time='44:06 min' depth='24.31 m' /> + <sample time='44:08 min' depth='24.341 m' /> + <sample time='44:10 min' depth='24.402 m' /> + <sample time='44:12 min' depth='24.483 m' in_deco='1' stoptime='1:00 min' stopdepth='6.0 m' /> + <sample time='44:14 min' depth='24.545 m' /> + <sample time='44:16 min' depth='24.606 m' /> + <sample time='44:18 min' depth='24.667 m' /> + <sample time='44:20 min' depth='24.749 m' /> + <sample time='44:22 min' depth='24.799 m' /> + <sample time='44:24 min' depth='24.901 m' /> + <sample time='44:26 min' depth='25.024 m' /> + <sample time='44:28 min' depth='25.136 m' /> + <sample time='44:30 min' depth='25.258 m' /> + <sample time='44:32 min' depth='25.371 m' /> + <sample time='44:34 min' depth='25.452 m' /> + <sample time='44:36 min' depth='25.513 m' /> + <sample time='44:38 min' depth='25.625 m' /> + <sample time='44:40 min' depth='25.687 m' /> + <sample time='44:42 min' depth='25.789 m' /> + <sample time='44:44 min' depth='25.809 m' /> + <sample time='44:46 min' depth='25.942 m' /> + <sample time='44:48 min' depth='25.931 m' temp='5.7 C' /> + <sample time='44:50 min' depth='26.033 m' /> + <sample time='44:52 min' depth='26.095 m' /> + <sample time='44:54 min' depth='26.054 m' /> + <sample time='44:56 min' depth='26.033 m' /> + <sample time='44:58 min' depth='25.901 m' /> + <sample time='45:00 min' depth='25.86 m' temp='5.5 C' /> + <sample time='45:02 min' depth='25.778 m' /> + <sample time='45:04 min' depth='25.727 m' /> + <sample time='45:06 min' depth='25.656 m' /> + <sample time='45:08 min' depth='25.574 m' /> + <sample time='45:10 min' depth='25.585 m' /> + <sample time='45:12 min' depth='25.574 m' /> + <sample time='45:14 min' depth='25.554 m' /> + <sample time='45:16 min' depth='25.605 m' /> + <sample time='45:18 min' depth='25.564 m' /> + <sample time='45:20 min' depth='25.564 m' /> + <sample time='45:22 min' depth='25.503 m' /> + <sample time='45:24 min' depth='25.523 m' temp='5.4 C' /> + <sample time='45:26 min' depth='25.503 m' /> + <sample time='45:28 min' depth='25.33 m' /> + <sample time='45:30 min' depth='25.34 m' /> + <sample time='45:32 min' depth='25.33 m' /> + <sample time='45:34 min' depth='25.411 m' /> + <sample time='45:36 min' depth='25.534 m' /> + <sample time='45:38 min' depth='25.564 m' /> + <sample time='45:40 min' depth='25.625 m' /> + <sample time='45:42 min' depth='25.615 m' /> + <sample time='45:44 min' depth='25.513 m' /> + <sample time='45:46 min' depth='25.279 m' /> + <sample time='45:48 min' depth='25.167 m' /> + <sample time='45:50 min' depth='24.952 m' /> + <sample time='45:52 min' depth='24.667 m' /> + <sample time='45:54 min' depth='24.341 m' /> + <sample time='45:56 min' depth='24.065 m' /> + <sample time='45:58 min' depth='23.77 m' /> + <sample time='46:00 min' depth='23.453 m' /> + <sample time='46:02 min' depth='22.821 m' /> + <sample time='46:04 min' depth='22.424 m' /> + <sample time='46:06 min' depth='22.526 m' /> + <sample time='46:08 min' depth='22.22 m' /> + <sample time='46:10 min' depth='21.791 m' /> + <sample time='46:12 min' depth='21.169 m' temp='5.6 C' /> + <sample time='46:14 min' depth='20.965 m' /> + <sample time='46:16 min' depth='21.088 m' /> + <sample time='46:18 min' depth='20.914 m' /> + <sample time='46:20 min' depth='20.772 m' /> + <sample time='46:22 min' depth='20.7 m' /> + <sample time='46:24 min' depth='20.608 m' temp='6.0 C' cns='20%' /> + <sample time='46:26 min' depth='20.466 m' /> + <sample time='46:28 min' depth='20.313 m' /> + <sample time='46:30 min' depth='20.119 m' /> + <sample time='46:32 min' depth='19.946 m' /> + <sample time='46:34 min' depth='19.946 m' /> + <sample time='46:36 min' depth='19.956 m' temp='6.3 C' /> + <sample time='46:38 min' depth='19.997 m' /> + <sample time='46:40 min' depth='19.997 m' /> + <sample time='46:42 min' depth='19.946 m' /> + <sample time='46:44 min' depth='19.915 m' /> + <sample time='46:46 min' depth='19.915 m' /> + <sample time='46:48 min' depth='19.711 m' temp='6.6 C' /> + <sample time='46:50 min' depth='19.997 m' /> + <sample time='46:52 min' depth='20.099 m' /> + <sample time='46:54 min' depth='20.109 m' /> + <sample time='46:56 min' depth='20.139 m' /> + <sample time='46:58 min' depth='20.119 m' /> + <sample time='47:00 min' depth='20.099 m' temp='6.9 C' /> + <sample time='47:02 min' depth='20.15 m' /> + <sample time='47:04 min' depth='20.201 m' /> + <sample time='47:06 min' depth='20.343 m' /> + <sample time='47:08 min' depth='20.394 m' /> + <sample time='47:10 min' depth='20.456 m' /> + <sample time='47:12 min' depth='20.557 m' temp='7.0 C' /> + <sample time='47:14 min' depth='20.68 m' /> + <sample time='47:16 min' depth='20.761 m' /> + <sample time='47:18 min' depth='20.843 m' /> + <sample time='47:20 min' depth='20.884 m' /> + <sample time='47:22 min' depth='20.904 m' /> + <sample time='47:24 min' depth='20.874 m' temp='7.1 C' /> + <sample time='47:26 min' depth='20.884 m' /> + <sample time='47:28 min' depth='20.853 m' /> + <sample time='47:30 min' depth='20.792 m' /> + <sample time='47:32 min' depth='20.772 m' /> + <sample time='47:34 min' depth='20.721 m' /> + <sample time='47:36 min' depth='20.7 m' /> + <sample time='47:38 min' depth='20.68 m' /> + <sample time='47:40 min' depth='20.659 m' /> + <sample time='47:42 min' depth='20.68 m' /> + <sample time='47:44 min' depth='20.721 m' /> + <sample time='47:46 min' depth='20.792 m' /> + <sample time='47:48 min' depth='20.7 m' temp='7.0 C' /> + <sample time='47:50 min' depth='20.629 m' /> + <sample time='47:52 min' depth='20.557 m' /> + <sample time='47:54 min' depth='20.527 m' /> + <sample time='47:56 min' depth='20.445 m' /> + <sample time='47:58 min' depth='20.445 m' /> + <sample time='48:00 min' depth='20.241 m' /> + <sample time='48:02 min' depth='20.17 m' /> + <sample time='48:04 min' depth='20.099 m' /> + <sample time='48:06 min' depth='20.068 m' /> + <sample time='48:08 min' depth='20.007 m' /> + <sample time='48:10 min' depth='20.17 m' /> + <sample time='48:12 min' depth='19.823 m' temp='7.1 C' in_deco='0' stopdepth='0.0 m' /> + <sample time='48:14 min' depth='19.803 m' /> + <sample time='48:16 min' depth='19.772 m' /> + <sample time='48:18 min' depth='19.742 m' /> + <sample time='48:20 min' depth='19.385 m' /> + <sample time='48:22 min' depth='19.069 m' /> + <sample time='48:24 min' depth='19.466 m' temp='7.2 C' cns='21%' /> + <sample time='48:26 min' depth='19.456 m' /> + <sample time='48:28 min' depth='19.436 m' /> + <sample time='48:30 min' depth='19.405 m' /> + <sample time='48:32 min' depth='19.375 m' /> + <sample time='48:34 min' depth='19.313 m' /> + <sample time='48:36 min' depth='19.222 m' temp='7.4 C' /> + <sample time='48:38 min' depth='19.12 m' /> + <sample time='48:40 min' depth='19.008 m' /> + <sample time='48:42 min' depth='18.916 m' /> + <sample time='48:44 min' depth='18.793 m' /> + <sample time='48:46 min' depth='18.742 m' /> + <sample time='48:48 min' depth='18.691 m' temp='7.6 C' /> + <sample time='48:50 min' depth='18.589 m' /> + <sample time='48:52 min' depth='18.528 m' /> + <sample time='48:54 min' depth='18.508 m' /> + <sample time='48:56 min' depth='18.61 m' /> + <sample time='48:58 min' depth='18.63 m' /> + <sample time='49:00 min' depth='18.793 m' temp='7.8 C' /> + <sample time='49:02 min' depth='18.773 m' /> + <sample time='49:04 min' depth='18.569 m' /> + <sample time='49:06 min' depth='18.447 m' /> + <sample time='49:08 min' depth='18.334 m' /> + <sample time='49:10 min' depth='18.385 m' /> + <sample time='49:12 min' depth='18.416 m' temp='8.0 C' /> + <sample time='49:14 min' depth='18.436 m' /> + <sample time='49:16 min' depth='18.498 m' /> + <sample time='49:18 min' depth='18.508 m' /> + <sample time='49:20 min' depth='18.559 m' /> + <sample time='49:22 min' depth='18.487 m' /> + <sample time='49:24 min' depth='18.406 m' temp='8.1 C' /> + <sample time='49:26 min' depth='18.345 m' /> + <sample time='49:28 min' depth='18.273 m' /> + <sample time='49:30 min' depth='18.222 m' /> + <sample time='49:32 min' depth='18.12 m' /> + <sample time='49:34 min' depth='18.09 m' /> + <sample time='49:36 min' depth='18.029 m' temp='8.3 C' /> + <sample time='49:38 min' depth='18.049 m' /> + <sample time='49:40 min' depth='18.141 m' /> + <sample time='49:42 min' depth='18.182 m' /> + <sample time='49:44 min' depth='18.131 m' /> + <sample time='49:46 min' depth='18.049 m' /> + <sample time='49:48 min' depth='18.069 m' temp='8.6 C' /> + <sample time='49:50 min' depth='18.029 m' /> + <sample time='49:52 min' depth='17.947 m' /> + <sample time='49:54 min' depth='17.865 m' /> + <sample time='49:56 min' depth='17.774 m' /> + <sample time='49:58 min' depth='17.651 m' /> + <sample time='50:00 min' depth='17.641 m' temp='8.8 C' /> + <sample time='50:02 min' depth='17.478 m' /> + <sample time='50:04 min' depth='17.233 m' /> + <sample time='50:06 min' depth='16.734 m' /> + <sample time='50:08 min' depth='16.897 m' /> + <sample time='50:10 min' depth='16.907 m' /> + <sample time='50:12 min' depth='17.019 m' temp='9.1 C' /> + <sample time='50:14 min' depth='16.815 m' /> + <sample time='50:16 min' depth='16.764 m' /> + <sample time='50:18 min' depth='16.632 m' /> + <sample time='50:20 min' depth='16.499 m' /> + <sample time='50:22 min' depth='16.295 m' /> + <sample time='50:24 min' depth='16.183 m' temp='9.4 C' cns='22%' /> + <sample time='50:26 min' depth='16.112 m' /> + <sample time='50:28 min' depth='16.163 m' /> + <sample time='50:30 min' depth='16.101 m' /> + <sample time='50:32 min' depth='15.969 m' /> + <sample time='50:34 min' depth='15.959 m' /> + <sample time='50:36 min' depth='15.704 m' temp='9.5 C' /> + <sample time='50:38 min' depth='15.122 m' /> + <sample time='50:40 min' depth='14.898 m' /> + <sample time='50:42 min' depth='15.204 m' /> + <sample time='50:44 min' depth='15.133 m' /> + <sample time='50:46 min' depth='15.082 m' /> + <sample time='50:48 min' depth='15.0 m' temp='9.7 C' /> + <sample time='50:50 min' depth='14.969 m' /> + <sample time='50:52 min' depth='14.918 m' /> + <sample time='50:54 min' depth='14.745 m' /> + <sample time='50:56 min' depth='14.613 m' /> + <sample time='50:58 min' depth='14.511 m' /> + <sample time='51:00 min' depth='14.47 m' temp='9.8 C' /> + <sample time='51:02 min' depth='14.47 m' /> + <sample time='51:04 min' depth='14.48 m' /> + <sample time='51:06 min' depth='14.46 m' /> + <sample time='51:08 min' depth='14.419 m' /> + <sample time='51:10 min' depth='14.276 m' /> + <sample time='51:12 min' depth='14.276 m' /> + <sample time='51:14 min' depth='14.256 m' /> + <sample time='51:16 min' depth='14.225 m' /> + <sample time='51:18 min' depth='14.194 m' /> + <sample time='51:20 min' depth='14.184 m' /> + <sample time='51:22 min' depth='14.082 m' /> + <sample time='51:24 min' depth='14.001 m' temp='9.9 C' /> + <sample time='51:26 min' depth='13.899 m' /> + <sample time='51:28 min' depth='13.868 m' /> + <sample time='51:30 min' depth='13.899 m' /> + <sample time='51:32 min' depth='14.001 m' /> + <sample time='51:34 min' depth='13.991 m' /> + <sample time='51:36 min' depth='14.031 m' ndl='240:00 min' /> + <sample time='51:38 min' depth='14.133 m' /> + <sample time='51:40 min' depth='14.164 m' /> + <sample time='51:42 min' depth='14.184 m' /> + <sample time='51:44 min' depth='14.215 m' /> + <sample time='51:46 min' depth='14.092 m' /> + <sample time='51:48 min' depth='13.664 m' /> + <sample time='51:50 min' depth='13.379 m' /> + <sample time='51:52 min' depth='13.746 m' /> + <sample time='51:54 min' depth='13.674 m' /> + <sample time='51:56 min' depth='13.634 m' /> + <sample time='51:58 min' depth='13.685 m' /> + <sample time='52:00 min' depth='13.654 m' /> + <sample time='52:02 min' depth='13.572 m' /> + <sample time='52:04 min' depth='13.501 m' /> + <sample time='52:06 min' depth='13.501 m' /> + <sample time='52:08 min' depth='13.552 m' /> + <sample time='52:10 min' depth='13.664 m' /> + <sample time='52:12 min' depth='13.664 m' /> + <sample time='52:14 min' depth='13.705 m' /> + <sample time='52:16 min' depth='13.685 m' /> + <sample time='52:18 min' depth='13.634 m' /> + <sample time='52:20 min' depth='13.593 m' /> + <sample time='52:22 min' depth='13.511 m' /> + <sample time='52:24 min' depth='13.419 m' /> + <sample time='52:26 min' depth='13.348 m' /> + <sample time='52:28 min' depth='13.093 m' /> + <sample time='52:30 min' depth='12.716 m' /> + <sample time='52:32 min' depth='12.543 m' /> + <sample time='52:34 min' depth='12.655 m' /> + <sample time='52:36 min' depth='12.43 m' /> + <sample time='52:38 min' depth='12.308 m' /> + <sample time='52:40 min' depth='12.247 m' /> + <sample time='52:42 min' depth='12.145 m' /> + <sample time='52:44 min' depth='11.92 m' /> + <sample time='52:46 min' depth='11.574 m' /> + <sample time='52:48 min' depth='11.951 m' cns='23%' /> + <sample time='52:50 min' depth='11.869 m' /> + <sample time='52:52 min' depth='11.839 m' /> + <sample time='52:54 min' depth='11.808 m' /> + <sample time='52:56 min' depth='11.737 m' /> + <sample time='52:58 min' depth='11.727 m' /> + <sample time='53:00 min' depth='11.757 m' /> + <sample time='53:02 min' depth='11.737 m' /> + <sample time='53:04 min' depth='11.574 m' /> + <sample time='53:06 min' depth='11.268 m' /> + <sample time='53:08 min' depth='11.574 m' /> + <sample time='53:10 min' depth='11.462 m' /> + <sample time='53:12 min' depth='11.492 m' /> + <sample time='53:14 min' depth='11.421 m' /> + <sample time='53:16 min' depth='11.37 m' /> + <sample time='53:18 min' depth='11.258 m' /> + <sample time='53:20 min' depth='11.329 m' /> + <sample time='53:22 min' depth='11.044 m' /> + <sample time='53:24 min' depth='10.778 m' /> + <sample time='53:26 min' depth='10.197 m' /> + <sample time='53:28 min' depth='9.912 m' /> + <sample time='53:30 min' depth='10.279 m' /> + <sample time='53:32 min' depth='10.258 m' /> + <sample time='53:34 min' depth='10.238 m' /> + <sample time='53:36 min' depth='10.258 m' /> + <sample time='53:38 min' depth='10.279 m' /> + <sample time='53:40 min' depth='10.238 m' /> + <sample time='53:42 min' depth='9.932 m' /> + <sample time='53:44 min' depth='9.473 m' /> + <sample time='53:46 min' depth='9.728 m' /> + <sample time='53:48 min' depth='9.718 m' /> + <sample time='53:50 min' depth='9.647 m' /> + <sample time='53:52 min' depth='9.687 m' /> + <sample time='53:54 min' depth='9.698 m' /> + <sample time='53:56 min' depth='9.708 m' /> + <sample time='53:58 min' depth='9.85 m' /> + <sample time='54:00 min' depth='9.861 m' /> + <sample time='54:02 min' depth='9.81 m' /> + <sample time='54:04 min' depth='9.759 m' /> + <sample time='54:06 min' depth='9.596 m' /> + <sample time='54:08 min' depth='9.167 m' /> + <sample time='54:10 min' depth='8.698 m' /> + <sample time='54:12 min' depth='8.433 m' temp='10.0 C' /> + <sample time='54:14 min' depth='8.708 m' /> + <sample time='54:16 min' depth='8.627 m' /> + <sample time='54:18 min' depth='8.627 m' /> + <sample time='54:20 min' depth='8.698 m' /> + <sample time='54:22 min' depth='8.688 m' /> + <sample time='54:24 min' depth='8.668 m' /> + <sample time='54:26 min' depth='8.678 m' /> + <sample time='54:28 min' depth='8.698 m' /> + <sample time='54:30 min' depth='8.698 m' /> + <sample time='54:32 min' depth='8.719 m' /> + <sample time='54:34 min' depth='8.759 m' /> + <sample time='54:36 min' depth='8.739 m' /> + <sample time='54:38 min' depth='8.678 m' /> + <sample time='54:40 min' depth='8.606 m' /> + <sample time='54:42 min' depth='8.453 m' /> + <sample time='54:44 min' depth='8.372 m' /> + <sample time='54:46 min' depth='8.321 m' /> + <sample time='54:48 min' depth='8.3 m' cns='24%' /> + <sample time='54:50 min' depth='8.239 m' /> + <sample time='54:52 min' depth='8.148 m' /> + <sample time='54:54 min' depth='8.056 m' /> + <sample time='54:56 min' depth='7.913 m' /> + <sample time='54:58 min' depth='7.78 m' /> + <sample time='55:00 min' depth='7.23 m' /> + <sample time='55:02 min' depth='6.995 m' /> + <sample time='55:04 min' depth='7.291 m' /> + <sample time='55:06 min' depth='7.158 m' /> + <sample time='55:08 min' depth='7.097 m' /> + <sample time='55:10 min' depth='7.138 m' /> + <sample time='55:12 min' depth='7.077 m' /> + <sample time='55:14 min' depth='7.077 m' /> + <sample time='55:16 min' depth='6.965 m' /> + <sample time='55:18 min' depth='6.954 m' /> + <sample time='55:20 min' depth='6.883 m' /> + <sample time='55:22 min' depth='6.873 m' /> + <sample time='55:24 min' depth='6.873 m' temp='10.1 C' /> + <sample time='55:26 min' depth='6.842 m' /> + <sample time='55:28 min' depth='6.842 m' /> + <sample time='55:30 min' depth='6.812 m' /> + <sample time='55:32 min' depth='6.852 m' /> + <sample time='55:34 min' depth='6.771 m' /> + <sample time='55:36 min' depth='6.751 m' /> + <sample time='55:38 min' depth='6.638 m' /> + <sample time='55:40 min' depth='6.628 m' /> + <sample time='55:42 min' depth='6.628 m' /> + <sample time='55:44 min' depth='6.689 m' /> + <sample time='55:46 min' depth='6.863 m' /> + <sample time='55:48 min' depth='6.863 m' temp='10.0 C' /> + <sample time='55:50 min' depth='6.863 m' /> + <sample time='55:52 min' depth='6.771 m' /> + <sample time='55:54 min' depth='6.7 m' /> + <sample time='55:56 min' depth='6.098 m' /> + <sample time='55:58 min' depth='5.731 m' /> + <sample time='56:00 min' depth='6.057 m' /> + <sample time='56:02 min' depth='6.098 m' /> + <sample time='56:04 min' depth='6.098 m' /> + <sample time='56:06 min' depth='6.21 m' /> + <sample time='56:08 min' depth='6.445 m' /> + <sample time='56:10 min' depth='6.7 m' /> + <sample time='56:12 min' depth='6.751 m' /> + <sample time='56:14 min' depth='6.852 m' /> + <sample time='56:16 min' depth='6.557 m' /> + <sample time='56:18 min' depth='6.312 m' /> + <sample time='56:20 min' depth='6.424 m' /> + <sample time='56:22 min' depth='6.434 m' /> + <sample time='56:24 min' depth='6.506 m' /> + <sample time='56:26 min' depth='6.618 m' /> + <sample time='56:28 min' depth='6.72 m' /> + <sample time='56:30 min' depth='6.822 m' /> + <sample time='56:32 min' depth='6.852 m' /> + <sample time='56:34 min' depth='6.863 m' /> + <sample time='56:36 min' depth='6.781 m' /> + <sample time='56:38 min' depth='6.751 m' /> + <sample time='56:40 min' depth='6.7 m' /> + <sample time='56:42 min' depth='6.618 m' /> + <sample time='56:44 min' depth='6.506 m' /> + <sample time='56:46 min' depth='6.414 m' /> + <sample time='56:48 min' depth='6.394 m' /> + <sample time='56:50 min' depth='6.404 m' /> + <sample time='56:52 min' depth='6.424 m' /> + <sample time='56:54 min' depth='6.475 m' /> + <sample time='56:56 min' depth='6.516 m' /> + <sample time='56:58 min' depth='6.557 m' /> + <sample time='57:00 min' depth='6.598 m' /> + <sample time='57:02 min' depth='6.649 m' /> + <sample time='57:04 min' depth='6.679 m' /> + <sample time='57:06 min' depth='6.74 m' /> + <sample time='57:08 min' depth='6.761 m' /> + <sample time='57:10 min' depth='6.791 m' /> + <sample time='57:12 min' depth='6.934 m' cns='25%' /> + <sample time='57:14 min' depth='6.873 m' /> + <sample time='57:16 min' depth='6.903 m' /> + <sample time='57:18 min' depth='6.924 m' /> + <sample time='57:20 min' depth='6.903 m' /> + <sample time='57:22 min' depth='6.883 m' /> + <sample time='57:24 min' depth='6.965 m' /> + <sample time='57:26 min' depth='6.965 m' /> + <sample time='57:28 min' depth='6.985 m' /> + <sample time='57:30 min' depth='6.995 m' /> + <sample time='57:32 min' depth='7.077 m' /> + <sample time='57:34 min' depth='7.169 m' /> + <sample time='57:36 min' depth='7.24 m' /> + <sample time='57:38 min' depth='7.322 m' /> + <sample time='57:40 min' depth='7.424 m' /> + <sample time='57:42 min' depth='7.526 m' /> + <sample time='57:44 min' depth='7.607 m' /> + <sample time='57:46 min' depth='7.678 m' /> + <sample time='57:48 min' depth='7.791 m' /> + <sample time='57:50 min' depth='7.678 m' /> + <sample time='57:52 min' depth='7.444 m' /> + <sample time='57:54 min' depth='7.373 m' /> + <sample time='57:56 min' depth='7.413 m' /> + <sample time='57:58 min' depth='7.373 m' /> + <sample time='58:00 min' depth='7.383 m' /> + <sample time='58:02 min' depth='7.403 m' /> + <sample time='58:04 min' depth='7.464 m' /> + <sample time='58:06 min' depth='7.413 m' /> + <sample time='58:08 min' depth='7.464 m' /> + <sample time='58:10 min' depth='7.393 m' /> + <sample time='58:12 min' depth='7.291 m' /> + <sample time='58:14 min' depth='7.107 m' /> + <sample time='58:16 min' depth='6.985 m' /> + <sample time='58:18 min' depth='6.975 m' /> + <sample time='58:20 min' depth='6.893 m' /> + <sample time='58:22 min' depth='6.771 m' /> + <sample time='58:24 min' depth='6.72 m' /> + <sample time='58:26 min' depth='6.557 m' /> + <sample time='58:28 min' depth='6.261 m' /> + <sample time='58:30 min' depth='5.751 m' /> + <sample time='58:32 min' depth='5.843 m' /> + <sample time='58:34 min' depth='5.639 m' /> + <sample time='58:36 min' depth='5.506 m' /> + <sample time='58:38 min' depth='5.578 m' /> + <sample time='58:40 min' depth='5.629 m' /> + <sample time='58:42 min' depth='5.731 m' /> + <sample time='58:44 min' depth='5.853 m' /> + <sample time='58:46 min' depth='5.925 m' /> + <sample time='58:48 min' depth='5.996 m' /> + <sample time='58:50 min' depth='6.037 m' /> + <sample time='58:52 min' depth='6.057 m' /> + <sample time='58:54 min' depth='6.108 m' /> + <sample time='58:56 min' depth='6.108 m' /> + <sample time='58:58 min' depth='6.128 m' /> + <sample time='59:00 min' depth='6.2 m' /> + <sample time='59:02 min' depth='6.19 m' /> + <sample time='59:04 min' depth='6.179 m' /> + <sample time='59:06 min' depth='6.128 m' /> + <sample time='59:08 min' depth='6.027 m' /> + <sample time='59:10 min' depth='5.945 m' /> + <sample time='59:12 min' depth='5.976 m' cns='26%' /> + <sample time='59:14 min' depth='6.027 m' /> + <sample time='59:16 min' depth='6.108 m' /> + <sample time='59:18 min' depth='6.22 m' /> + <sample time='59:20 min' depth='6.261 m' /> + <sample time='59:22 min' depth='6.281 m' /> + <sample time='59:24 min' depth='6.332 m' /> + <sample time='59:26 min' depth='6.343 m' /> + <sample time='59:28 min' depth='6.445 m' /> + <sample time='59:30 min' depth='6.445 m' /> + <sample time='59:32 min' depth='6.506 m' /> + <sample time='59:34 min' depth='6.577 m' /> + <sample time='59:36 min' depth='6.618 m' /> + <sample time='59:38 min' depth='6.618 m' /> + <sample time='59:40 min' depth='6.649 m' /> + <sample time='59:42 min' depth='6.689 m' /> + <sample time='59:44 min' depth='6.669 m' /> + <sample time='59:46 min' depth='6.689 m' /> + <sample time='59:48 min' depth='6.7 m' /> + <sample time='59:50 min' depth='6.74 m' /> + <sample time='59:52 min' depth='6.761 m' /> + <sample time='59:54 min' depth='6.832 m' /> + <sample time='59:56 min' depth='6.893 m' /> + <sample time='59:58 min' depth='6.863 m' /> + <sample time='60:00 min' depth='6.852 m' /> + <sample time='60:02 min' depth='6.852 m' /> + <sample time='60:04 min' depth='6.781 m' /> + <sample time='60:06 min' depth='6.802 m' /> + <sample time='60:08 min' depth='6.751 m' /> + <sample time='60:10 min' depth='6.771 m' /> + <sample time='60:12 min' depth='6.771 m' /> + <sample time='60:14 min' depth='6.761 m' /> + <sample time='60:16 min' depth='6.771 m' /> + <sample time='60:18 min' depth='6.751 m' /> + <sample time='60:20 min' depth='6.7 m' /> + <sample time='60:22 min' depth='6.659 m' /> + <sample time='60:24 min' depth='6.587 m' /> + <sample time='60:26 min' depth='6.526 m' /> + <sample time='60:28 min' depth='6.475 m' /> + <sample time='60:30 min' depth='6.455 m' /> + <sample time='60:32 min' depth='6.434 m' /> + <sample time='60:34 min' depth='6.424 m' /> + <sample time='60:36 min' depth='6.414 m' /> + <sample time='60:38 min' depth='6.394 m' /> + <sample time='60:40 min' depth='6.383 m' /> + <sample time='60:42 min' depth='6.363 m' /> + <sample time='60:44 min' depth='6.281 m' /> + <sample time='60:46 min' depth='6.23 m' /> + <sample time='60:48 min' depth='6.159 m' /> + <sample time='60:50 min' depth='6.047 m' /> + <sample time='60:52 min' depth='5.598 m' /> + <sample time='60:54 min' depth='5.69 m' /> + <sample time='60:56 min' depth='5.833 m' /> + <sample time='60:58 min' depth='5.812 m' /> + <sample time='61:00 min' depth='5.833 m' /> + <sample time='61:02 min' depth='5.884 m' /> + <sample time='61:04 min' depth='5.965 m' /> + <sample time='61:06 min' depth='6.037 m' /> + <sample time='61:08 min' depth='6.128 m' /> + <sample time='61:10 min' depth='6.302 m' /> + <sample time='61:12 min' depth='6.404 m' cns='27%' /> + <sample time='61:14 min' depth='6.516 m' /> + <sample time='61:16 min' depth='6.618 m' /> + <sample time='61:18 min' depth='6.781 m' /> + <sample time='61:20 min' depth='6.802 m' /> + <sample time='61:22 min' depth='6.71 m' /> + <sample time='61:24 min' depth='6.547 m' /> + <sample time='61:26 min' depth='6.485 m' /> + <sample time='61:28 min' depth='6.485 m' /> + <sample time='61:30 min' depth='6.587 m' /> + <sample time='61:32 min' depth='6.71 m' /> + <sample time='61:34 min' depth='6.822 m' /> + <sample time='61:36 min' depth='6.934 m' /> + <sample time='61:38 min' depth='7.026 m' /> + <sample time='61:40 min' depth='7.148 m' /> + <sample time='61:42 min' depth='7.25 m' /> + <sample time='61:44 min' depth='7.291 m' /> + <sample time='61:46 min' depth='7.311 m' /> + <sample time='61:48 min' depth='7.342 m' /> + <sample time='61:50 min' depth='7.362 m' /> + <sample time='61:52 min' depth='7.352 m' /> + <sample time='61:54 min' depth='7.311 m' /> + <sample time='61:56 min' depth='7.311 m' /> + <sample time='61:58 min' depth='7.209 m' /> + <sample time='62:00 min' depth='7.036 m' /> + <sample time='62:02 min' depth='6.893 m' /> + <sample time='62:04 min' depth='6.771 m' /> + <sample time='62:06 min' depth='6.679 m' /> + <sample time='62:08 min' depth='6.679 m' /> + <sample time='62:10 min' depth='6.74 m' /> + <sample time='62:12 min' depth='6.791 m' /> + <sample time='62:14 min' depth='6.863 m' /> + <sample time='62:16 min' depth='6.883 m' /> + <sample time='62:18 min' depth='6.883 m' /> + <sample time='62:20 min' depth='6.873 m' /> + <sample time='62:22 min' depth='6.873 m' /> + <sample time='62:24 min' depth='6.863 m' /> + <sample time='62:26 min' depth='6.842 m' /> + <sample time='62:28 min' depth='6.873 m' /> + <sample time='62:30 min' depth='6.873 m' /> + <sample time='62:32 min' depth='6.842 m' /> + <sample time='62:34 min' depth='6.802 m' /> + <sample time='62:36 min' depth='6.608 m' /> + <sample time='62:38 min' depth='6.587 m' /> + <sample time='62:40 min' depth='6.618 m' /> + <sample time='62:42 min' depth='6.649 m' /> + <sample time='62:44 min' depth='6.659 m' /> + <sample time='62:46 min' depth='6.659 m' /> + <sample time='62:48 min' depth='6.781 m' /> + <sample time='62:50 min' depth='6.751 m' /> + <sample time='62:52 min' depth='6.802 m' /> + <sample time='62:54 min' depth='6.914 m' /> + <sample time='62:56 min' depth='6.985 m' /> + <sample time='62:58 min' depth='7.036 m' /> + <sample time='63:00 min' depth='7.067 m' /> + <sample time='63:02 min' depth='6.975 m' /> + <sample time='63:04 min' depth='6.873 m' /> + <sample time='63:06 min' depth='6.771 m' /> + <sample time='63:08 min' depth='6.638 m' /> + <sample time='63:10 min' depth='6.557 m' /> + <sample time='63:12 min' depth='6.353 m' /> + <sample time='63:14 min' depth='5.894 m' /> + <sample time='63:16 min' depth='6.2 m' /> + <sample time='63:18 min' depth='6.271 m' /> + <sample time='63:20 min' depth='6.22 m' /> + <sample time='63:22 min' depth='6.169 m' /> + <sample time='63:24 min' depth='6.149 m' /> + <sample time='63:26 min' depth='6.159 m' /> + <sample time='63:28 min' depth='6.21 m' /> + <sample time='63:30 min' depth='6.19 m' /> + <sample time='63:32 min' depth='6.19 m' /> + <sample time='63:34 min' depth='6.139 m' /> + <sample time='63:36 min' depth='6.108 m' cns='28%' /> + <sample time='63:38 min' depth='5.741 m' /> + <sample time='63:40 min' depth='5.486 m' /> + <sample time='63:42 min' depth='5.853 m' /> + <sample time='63:44 min' depth='5.792 m' /> + <sample time='63:46 min' depth='5.843 m' /> + <sample time='63:48 min' depth='5.925 m' /> + <sample time='63:50 min' depth='5.996 m' /> + <sample time='63:52 min' depth='6.128 m' /> + <sample time='63:54 min' depth='6.088 m' /> + <sample time='63:56 min' depth='6.108 m' /> + <sample time='63:58 min' depth='6.118 m' /> + <sample time='64:00 min' depth='6.128 m' /> + <sample time='64:02 min' depth='6.118 m' /> + <sample time='64:04 min' depth='6.149 m' /> + <sample time='64:06 min' depth='6.251 m' /> + <sample time='64:08 min' depth='6.343 m' /> + <sample time='64:10 min' depth='6.455 m' /> + <sample time='64:12 min' depth='6.567 m' /> + <sample time='64:14 min' depth='6.689 m' /> + <sample time='64:16 min' depth='6.74 m' /> + <sample time='64:18 min' depth='6.791 m' /> + <sample time='64:20 min' depth='6.73 m' /> + <sample time='64:22 min' depth='6.751 m' /> + <sample time='64:24 min' depth='6.771 m' /> + <sample time='64:26 min' depth='6.812 m' /> + <sample time='64:28 min' depth='6.863 m' /> + <sample time='64:30 min' depth='6.914 m' /> + <sample time='64:32 min' depth='6.822 m' /> + <sample time='64:34 min' depth='6.72 m' /> + <sample time='64:36 min' depth='6.557 m' /> + <sample time='64:38 min' depth='6.353 m' /> + <sample time='64:40 min' depth='6.21 m' /> + <sample time='64:42 min' depth='5.996 m' /> + <sample time='64:44 min' depth='5.741 m' /> + <sample time='64:46 min' depth='5.425 m' /> + <sample time='64:48 min' depth='5.782 m' /> + <sample time='64:50 min' depth='5.772 m' /> + <sample time='64:52 min' depth='5.823 m' /> + <sample time='64:54 min' depth='5.935 m' /> + <sample time='64:56 min' depth='5.996 m' /> + <sample time='64:58 min' depth='6.057 m' /> + <sample time='65:00 min' depth='6.078 m' /> + <sample time='65:02 min' depth='6.088 m' /> + <sample time='65:04 min' depth='6.078 m' /> + <sample time='65:06 min' depth='6.078 m' /> + <sample time='65:08 min' depth='6.118 m' /> + <sample time='65:10 min' depth='6.159 m' /> + <sample time='65:12 min' depth='6.22 m' temp='10.1 C' /> + <sample time='65:14 min' depth='6.322 m' /> + <sample time='65:16 min' depth='6.455 m' /> + <sample time='65:18 min' depth='6.638 m' /> + <sample time='65:20 min' depth='6.638 m' /> + <sample time='65:22 min' depth='6.72 m' /> + <sample time='65:24 min' depth='6.689 m' temp='10.0 C' /> + <sample time='65:26 min' depth='6.628 m' /> + <sample time='65:28 min' depth='6.628 m' /> + <sample time='65:30 min' depth='6.271 m' /> + <sample time='65:32 min' depth='5.976 m' /> + <sample time='65:34 min' depth='6.292 m' /> + <sample time='65:36 min' depth='6.536 m' temp='10.1 C' cns='29%' /> + <sample time='65:38 min' depth='6.669 m' /> + <sample time='65:40 min' depth='6.842 m' /> + <sample time='65:42 min' depth='7.026 m' /> + <sample time='65:44 min' depth='7.005 m' /> + <sample time='65:46 min' depth='7.016 m' /> + <sample time='65:48 min' depth='7.005 m' temp='10.0 C' /> + <sample time='65:50 min' depth='7.016 m' /> + <sample time='65:52 min' depth='7.005 m' /> + <sample time='65:54 min' depth='6.995 m' /> + <sample time='65:56 min' depth='7.005 m' /> + <sample time='65:58 min' depth='6.995 m' /> + <sample time='66:00 min' depth='6.924 m' /> + <sample time='66:02 min' depth='6.985 m' /> + <sample time='66:04 min' depth='7.026 m' /> + <sample time='66:06 min' depth='7.158 m' /> + <sample time='66:08 min' depth='7.118 m' /> + <sample time='66:10 min' depth='7.067 m' /> + <sample time='66:12 min' depth='6.873 m' /> + <sample time='66:14 min' depth='6.516 m' /> + <sample time='66:16 min' depth='6.373 m' /> + <sample time='66:18 min' depth='6.557 m' /> + <sample time='66:20 min' depth='6.506 m' /> + <sample time='66:22 min' depth='6.506 m' /> + <sample time='66:24 min' depth='6.659 m' temp='10.1 C' /> + <sample time='66:26 min' depth='6.74 m' /> + <sample time='66:28 min' depth='6.751 m' /> + <sample time='66:30 min' depth='6.812 m' /> + <sample time='66:32 min' depth='6.832 m' /> + <sample time='66:34 min' depth='6.842 m' /> + <sample time='66:36 min' depth='6.781 m' temp='10.0 C' /> + <sample time='66:38 min' depth='6.74 m' /> + <sample time='66:40 min' depth='6.689 m' /> + <sample time='66:42 min' depth='6.7 m' /> + <sample time='66:44 min' depth='6.72 m' /> + <sample time='66:46 min' depth='6.791 m' /> + <sample time='66:48 min' depth='6.802 m' /> + <sample time='66:50 min' depth='6.832 m' /> + <sample time='66:52 min' depth='6.873 m' /> + <sample time='66:54 min' depth='6.842 m' /> + <sample time='66:56 min' depth='6.893 m' /> + <sample time='66:58 min' depth='6.954 m' /> + <sample time='67:00 min' depth='6.934 m' /> + <sample time='67:02 min' depth='6.924 m' /> + <sample time='67:04 min' depth='6.975 m' /> + <sample time='67:06 min' depth='7.016 m' /> + <sample time='67:08 min' depth='7.046 m' /> + <sample time='67:10 min' depth='7.107 m' /> + <sample time='67:12 min' depth='7.199 m' /> + <sample time='67:14 min' depth='7.199 m' /> + <sample time='67:16 min' depth='7.24 m' /> + <sample time='67:18 min' depth='7.209 m' /> + <sample time='67:20 min' depth='7.199 m' /> + <sample time='67:22 min' depth='7.118 m' /> + <sample time='67:24 min' depth='7.128 m' /> + <sample time='67:26 min' depth='7.097 m' /> + <sample time='67:28 min' depth='7.138 m' /> + <sample time='67:30 min' depth='7.138 m' /> + <sample time='67:32 min' depth='6.802 m' /> + <sample time='67:34 min' depth='6.791 m' /> + <sample time='67:36 min' depth='7.016 m' cns='30%' /> + <sample time='67:38 min' depth='7.199 m' /> + <sample time='67:40 min' depth='7.22 m' /> + <sample time='67:42 min' depth='7.23 m' /> + <sample time='67:44 min' depth='7.22 m' /> + <sample time='67:46 min' depth='7.373 m' /> + <sample time='67:48 min' depth='7.158 m' /> + <sample time='67:50 min' depth='7.097 m' /> + <sample time='67:52 min' depth='7.097 m' /> + <sample time='67:54 min' depth='7.169 m' /> + <sample time='67:56 min' depth='7.189 m' /> + <sample time='67:58 min' depth='7.199 m' /> + <sample time='68:00 min' depth='7.199 m' /> + <sample time='68:02 min' depth='7.209 m' /> + <sample time='68:04 min' depth='7.158 m' /> + <sample time='68:06 min' depth='7.118 m' /> + <sample time='68:08 min' depth='7.005 m' /> + <sample time='68:10 min' depth='6.995 m' /> + <sample time='68:12 min' depth='6.995 m' /> + <sample time='68:14 min' depth='6.975 m' /> + <sample time='68:16 min' depth='6.954 m' /> + <sample time='68:18 min' depth='6.954 m' /> + <sample time='68:20 min' depth='6.985 m' /> + <sample time='68:22 min' depth='7.148 m' /> + <sample time='68:24 min' depth='7.097 m' /> + <sample time='68:26 min' depth='7.026 m' /> + <sample time='68:28 min' depth='6.985 m' /> + <sample time='68:30 min' depth='6.954 m' /> + <sample time='68:32 min' depth='7.016 m' /> + <sample time='68:34 min' depth='6.975 m' /> + <sample time='68:36 min' depth='7.016 m' /> + <sample time='68:38 min' depth='7.036 m' /> + <sample time='68:40 min' depth='6.781 m' /> + <sample time='68:42 min' depth='7.005 m' /> + <sample time='68:44 min' depth='7.118 m' /> + <sample time='68:46 min' depth='7.148 m' /> + <sample time='68:48 min' depth='7.097 m' /> + <sample time='68:50 min' depth='7.097 m' /> + <sample time='68:52 min' depth='7.138 m' /> + <sample time='68:54 min' depth='7.148 m' /> + <sample time='68:56 min' depth='7.158 m' /> + <sample time='68:58 min' depth='7.158 m' /> + <sample time='69:00 min' depth='6.771 m' /> + <sample time='69:02 min' depth='7.046 m' /> + <sample time='69:04 min' depth='7.077 m' /> + <sample time='69:06 min' depth='6.995 m' /> + <sample time='69:08 min' depth='6.526 m' /> + <sample time='69:10 min' depth='6.343 m' /> + <sample time='69:12 min' depth='6.21 m' /> + <sample time='69:14 min' depth='6.638 m' /> + <sample time='69:16 min' depth='6.802 m' /> + <sample time='69:18 min' depth='6.791 m' /> + <sample time='69:20 min' depth='6.873 m' /> + <sample time='69:22 min' depth='6.965 m' /> + <sample time='69:24 min' depth='7.107 m' /> + <sample time='69:26 min' depth='7.22 m' /> + <sample time='69:28 min' depth='7.107 m' /> + <sample time='69:30 min' depth='7.097 m' /> + <sample time='69:32 min' depth='7.087 m' /> + <sample time='69:34 min' depth='7.097 m' /> + <sample time='69:36 min' depth='7.158 m' /> + <sample time='69:38 min' depth='7.199 m' /> + <sample time='69:40 min' depth='7.199 m' /> + <sample time='69:42 min' depth='7.158 m' /> + <sample time='69:44 min' depth='7.097 m' /> + <sample time='69:46 min' depth='7.138 m' /> + <sample time='69:48 min' depth='7.067 m' /> + <sample time='69:50 min' depth='6.679 m' /> + <sample time='69:52 min' depth='7.046 m' /> + <sample time='69:54 min' depth='6.985 m' /> + <sample time='69:56 min' depth='6.914 m' /> + <sample time='69:58 min' depth='6.863 m' /> + <sample time='70:00 min' depth='6.802 m' cns='31%' /> + <sample time='70:02 min' depth='6.893 m' /> + <sample time='70:04 min' depth='6.985 m' /> + <sample time='70:06 min' depth='7.036 m' /> + <sample time='70:08 min' depth='7.158 m' /> + <sample time='70:10 min' depth='7.301 m' /> + <sample time='70:12 min' depth='7.301 m' /> + <sample time='70:14 min' depth='7.22 m' /> + <sample time='70:16 min' depth='7.158 m' /> + <sample time='70:18 min' depth='7.199 m' /> + <sample time='70:20 min' depth='7.158 m' /> + <sample time='70:22 min' depth='6.934 m' /> + <sample time='70:24 min' depth='6.812 m' /> + <sample time='70:26 min' depth='6.679 m' /> + <sample time='70:28 min' depth='6.587 m' /> + <sample time='70:30 min' depth='6.496 m' /> + <sample time='70:32 min' depth='6.394 m' /> + <sample time='70:34 min' depth='6.179 m' /> + <sample time='70:36 min' depth='6.241 m' /> + <sample time='70:38 min' depth='5.914 m' /> + <sample time='70:40 min' depth='6.078 m' /> + <sample time='70:42 min' depth='6.292 m' /> + <sample time='70:44 min' depth='6.394 m' /> + <sample time='70:46 min' depth='6.353 m' /> + <sample time='70:48 min' depth='6.353 m' /> + <sample time='70:50 min' depth='6.414 m' /> + <sample time='70:52 min' depth='6.587 m' /> + <sample time='70:54 min' depth='6.781 m' /> + <sample time='70:56 min' depth='6.73 m' /> + <sample time='70:58 min' depth='6.485 m' /> + <sample time='71:00 min' depth='6.373 m' /> + <sample time='71:02 min' depth='6.587 m' /> + <sample time='71:04 min' depth='6.669 m' /> + <sample time='71:06 min' depth='6.567 m' /> + <sample time='71:08 min' depth='6.71 m' /> + <sample time='71:10 min' depth='6.883 m' /> + <sample time='71:12 min' depth='6.934 m' /> + <sample time='71:14 min' depth='6.965 m' /> + <sample time='71:16 min' depth='7.077 m' /> + <sample time='71:18 min' depth='6.995 m' /> + <sample time='71:20 min' depth='6.975 m' /> + <sample time='71:22 min' depth='6.975 m' /> + <sample time='71:24 min' depth='7.005 m' /> + <sample time='71:26 min' depth='6.903 m' /> + <sample time='71:28 min' depth='6.852 m' /> + <sample time='71:30 min' depth='6.903 m' /> + <sample time='71:32 min' depth='6.791 m' /> + <sample time='71:34 min' depth='6.567 m' /> + <sample time='71:36 min' depth='6.404 m' /> + <sample time='71:38 min' depth='6.445 m' /> + <sample time='71:40 min' depth='6.383 m' /> + <sample time='71:42 min' depth='6.485 m' /> + <sample time='71:44 min' depth='6.496 m' /> + <sample time='71:46 min' depth='6.547 m' /> + <sample time='71:48 min' depth='6.506 m' /> + <sample time='71:50 min' depth='6.383 m' /> + <sample time='71:52 min' depth='6.312 m' /> + <sample time='71:54 min' depth='6.343 m' /> + <sample time='71:56 min' depth='6.281 m' /> + <sample time='71:58 min' depth='6.251 m' /> + <sample time='72:00 min' depth='6.21 m' cns='32%' /> + <sample time='72:02 min' depth='6.128 m' /> + <sample time='72:04 min' depth='6.128 m' /> + <sample time='72:06 min' depth='6.047 m' /> + <sample time='72:08 min' depth='6.037 m' /> + <sample time='72:10 min' depth='5.996 m' /> + <sample time='72:12 min' depth='5.965 m' /> + <sample time='72:14 min' depth='5.965 m' /> + <sample time='72:16 min' depth='5.955 m' /> + <sample time='72:18 min' depth='5.843 m' /> + <sample time='72:20 min' depth='5.772 m' /> + <sample time='72:22 min' depth='5.721 m' /> + <sample time='72:24 min' depth='5.741 m' /> + <sample time='72:26 min' depth='5.741 m' /> + <sample time='72:28 min' depth='5.68 m' /> + <sample time='72:30 min' depth='5.619 m' /> + <sample time='72:32 min' depth='5.527 m' /> + <sample time='72:34 min' depth='5.486 m' /> + <sample time='72:36 min' depth='5.415 m' /> + <sample time='72:38 min' depth='5.374 m' /> + <sample time='72:40 min' depth='4.976 m' /> + <sample time='72:42 min' depth='4.915 m' /> + <sample time='72:44 min' depth='5.374 m' /> + <sample time='72:46 min' depth='5.333 m' /> + <sample time='72:48 min' depth='5.333 m' /> + <sample time='72:50 min' depth='5.354 m' /> + <sample time='72:52 min' depth='5.323 m' /> + <sample time='72:54 min' depth='5.231 m' /> + <sample time='72:56 min' depth='5.088 m' /> + <sample time='72:58 min' depth='5.088 m' /> + <sample time='73:00 min' depth='5.058 m' temp='10.1 C' /> + <sample time='73:02 min' depth='5.017 m' /> + <sample time='73:04 min' depth='5.007 m' /> + <sample time='73:06 min' depth='5.068 m' /> + <sample time='73:08 min' depth='5.058 m' /> + <sample time='73:10 min' depth='5.058 m' /> + <sample time='73:12 min' depth='5.068 m' /> + <sample time='73:14 min' depth='5.037 m' /> + <sample time='73:16 min' depth='5.007 m' /> + <sample time='73:18 min' depth='4.986 m' /> + <sample time='73:20 min' depth='4.925 m' /> + <sample time='73:22 min' depth='4.833 m' /> + <sample time='73:24 min' depth='4.813 m' temp='10.0 C' /> + <sample time='73:26 min' depth='4.793 m' /> + <sample time='73:28 min' depth='4.772 m' /> + <sample time='73:30 min' depth='4.68 m' /> + <sample time='73:32 min' depth='4.599 m' /> + <sample time='73:34 min' depth='4.64 m' /> + <sample time='73:36 min' depth='4.752 m' temp='10.1 C' /> + <sample time='73:38 min' depth='4.701 m' /> + <sample time='73:40 min' depth='4.721 m' /> + <sample time='73:42 min' depth='4.721 m' /> + <sample time='73:44 min' depth='4.701 m' /> + <sample time='73:46 min' depth='4.701 m' /> + <sample time='73:48 min' depth='4.721 m' /> + <sample time='73:50 min' depth='4.731 m' /> + <sample time='73:52 min' depth='4.68 m' /> + <sample time='73:54 min' depth='4.701 m' /> + <sample time='73:56 min' depth='4.66 m' /> + <sample time='73:58 min' depth='4.568 m' /> + <sample time='74:00 min' depth='4.589 m' /> + <sample time='74:02 min' depth='4.63 m' /> + <sample time='74:04 min' depth='4.589 m' /> + <sample time='74:06 min' depth='4.487 m' /> + <sample time='74:08 min' depth='4.375 m' /> + <sample time='74:10 min' depth='4.303 m' /> + <sample time='74:12 min' depth='3.875 m' /> + <sample time='74:14 min' depth='3.855 m' /> + <sample time='74:16 min' depth='4.303 m' /> + <sample time='74:18 min' depth='4.313 m' /> + <sample time='74:20 min' depth='4.273 m' /> + <sample time='74:22 min' depth='4.191 m' /> + <sample time='74:24 min' depth='4.109 m' cns='33%' /> + <sample time='74:26 min' depth='4.12 m' /> + <sample time='74:28 min' depth='4.089 m' /> + <sample time='74:30 min' depth='4.018 m' /> + <sample time='74:32 min' depth='4.028 m' /> + <sample time='74:34 min' depth='4.048 m' /> + <sample time='74:36 min' depth='3.997 m' /> + <sample time='74:38 min' depth='3.956 m' /> + <sample time='74:40 min' depth='3.936 m' /> + <sample time='74:42 min' depth='3.946 m' /> + <sample time='74:44 min' depth='3.865 m' /> + <sample time='74:46 min' depth='3.793 m' /> + <sample time='74:48 min' depth='3.763 m' /> + <sample time='74:50 min' depth='3.783 m' /> + <sample time='74:52 min' depth='3.753 m' /> + <sample time='74:54 min' depth='3.64 m' /> + <sample time='74:56 min' depth='3.671 m' /> + <sample time='74:58 min' depth='3.702 m' /> + <sample time='75:00 min' depth='3.681 m' /> + <sample time='75:02 min' depth='3.691 m' /> + <sample time='75:04 min' depth='3.671 m' /> + <sample time='75:06 min' depth='3.661 m' /> + <sample time='75:08 min' depth='3.661 m' /> + <sample time='75:10 min' depth='3.661 m' /> + <sample time='75:12 min' depth='3.681 m' /> + <sample time='75:14 min' depth='3.661 m' po2='0.7 bar' /> + <sample time='75:16 min' depth='3.681 m' /> + <sample time='75:18 min' depth='3.64 m' /> + <sample time='75:20 min' depth='3.569 m' /> + <sample time='75:22 min' depth='3.528 m' /> + <sample time='75:24 min' depth='3.579 m' /> + <sample time='75:26 min' depth='3.579 m' /> + <sample time='75:28 min' depth='3.508 m' /> + <sample time='75:30 min' depth='3.498 m' /> + <sample time='75:32 min' depth='3.559 m' /> + <sample time='75:34 min' depth='3.549 m' /> + <sample time='75:36 min' depth='3.549 m' /> + <sample time='75:38 min' depth='3.549 m' /> + <sample time='75:40 min' depth='3.61 m' /> + <sample time='75:42 min' depth='3.63 m' /> + <sample time='75:44 min' depth='3.64 m' /> + <sample time='75:46 min' depth='3.63 m' /> + <sample time='75:48 min' depth='3.63 m' /> + <sample time='75:50 min' depth='3.661 m' /> + <sample time='75:52 min' depth='3.651 m' /> + <sample time='75:54 min' depth='3.63 m' /> + <sample time='75:56 min' depth='3.661 m' /> + <sample time='75:58 min' depth='3.6 m' /> + <sample time='76:00 min' depth='3.528 m' /> + <sample time='76:02 min' depth='3.447 m' /> + <sample time='76:04 min' depth='3.334 m' /> + <sample time='76:06 min' depth='3.467 m' /> + <sample time='76:08 min' depth='3.416 m' /> + <sample time='76:10 min' depth='3.253 m' /> + <sample time='76:12 min' depth='3.131 m' /> + <sample time='76:14 min' depth='3.08 m' /> + <sample time='76:16 min' depth='2.967 m' /> + <sample time='76:18 min' depth='3.131 m' /> + <sample time='76:20 min' depth='3.202 m' /> + <sample time='76:22 min' depth='3.049 m' /> + <sample time='76:24 min' depth='3.008 m' /> + <sample time='76:26 min' depth='2.916 m' /> + <sample time='76:28 min' depth='2.896 m' /> + <sample time='76:30 min' depth='2.519 m' /> + <sample time='76:32 min' depth='2.427 m' /> + <sample time='76:34 min' depth='2.356 m' /> + <sample time='76:36 min' depth='3.049 m' /> + <sample time='76:38 min' depth='3.08 m' /> + <sample time='76:40 min' depth='2.967 m' /> + <sample time='76:42 min' depth='2.825 m' /> + <sample time='76:44 min' depth='2.753 m' /> + <sample time='76:46 min' depth='2.661 m' /> + <sample time='76:48 min' depth='2.539 m' /> + <sample time='76:50 min' depth='2.539 m' /> + <sample time='76:52 min' depth='2.519 m' /> + <sample time='76:54 min' depth='2.478 m' /> + <sample time='76:56 min' depth='2.407 m' /> + <sample time='76:58 min' depth='2.111 m' /> + <sample time='77:00 min' depth='1.886 m' /> + <sample time='77:02 min' depth='1.764 m' /> + <sample time='77:04 min' depth='1.723 m' /> + <sample time='77:06 min' depth='2.254 m' /> + <sample time='77:08 min' depth='2.233 m' /> + <sample time='77:10 min' depth='2.182 m' /> + <sample time='77:12 min' depth='2.111 m' /> + <sample time='77:14 min' depth='2.131 m' /> + <sample time='77:16 min' depth='2.09 m' /> + <sample time='77:18 min' depth='1.988 m' /> + <sample time='77:20 min' depth='1.927 m' /> + <sample time='77:22 min' depth='1.917 m' /> + <sample time='77:24 min' depth='1.886 m' /> + <sample time='77:26 min' depth='1.795 m' /> + <sample time='77:28 min' depth='1.723 m' /> + <sample time='77:30 min' depth='1.723 m' /> + <sample time='77:32 min' depth='1.703 m' /> + <sample time='77:34 min' depth='1.672 m' /> + <sample time='77:36 min' depth='1.581 m' /> + <sample time='77:38 min' depth='1.53 m' /> + <sample time='77:40 min' depth='1.509 m' /> + <sample time='77:42 min' depth='1.428 m' /> + <sample time='77:44 min' depth='1.295 m' /> + <sample time='77:46 min' depth='1.183 m' /> + <sample time='77:48 min' depth='1.091 m' /> + <sample time='77:50 min' depth='1.01 m' /> + <sample time='77:52 min' depth='0.887 m' /> + <sample time='77:54 min' depth='0.714 m' /> + <sample time='77:56 min' depth='0.571 m' /> + <sample time='77:58 min' depth='0.591 m' /> + <sample time='78:00 min' depth='0.571 m' cns='34%' /> + <sample time='78:02 min' depth='0.469 m' /> + <sample time='78:04 min' depth='0.265 m' /> + <sample time='78:06 min' depth='0.408 m' /> + <sample time='78:08 min' depth='0.367 m' /> + <sample time='78:10 min' depth='0.387 m' /> + <sample time='78:12 min' depth='0.408 m' /> + <sample time='78:14 min' depth='0.438 m' /> + <sample time='78:16 min' depth='0.306 m' /> + <sample time='78:18 min' depth='0.357 m' /> + <sample time='78:20 min' depth='0.398 m' /> + <sample time='78:22 min' depth='0.367 m' /> + <sample time='78:24 min' depth='0.489 m' /> + <sample time='78:26 min' depth='0.438 m' /> + <sample time='78:28 min' depth='0.255 m' /> + <sample time='78:30 min' depth='0.316 m' /> + <sample time='78:32 min' depth='0.337 m' /> + <sample time='78:34 min' depth='0.235 m' /> + <sample time='78:36 min' depth='0.306 m' /> + <sample time='78:38 min' depth='0.337 m' /> + <sample time='78:40 min' depth='0.316 m' /> + <sample time='78:42 min' depth='0.286 m' /> + <sample time='78:44 min' depth='0.255 m' /> + <sample time='78:46 min' depth='0.316 m' /> + <sample time='78:48 min' depth='0.367 m' /> + <sample time='78:50 min' depth='0.265 m' /> + <sample time='78:52 min' depth='0.337 m' /> + <sample time='78:54 min' depth='0.347 m' /> + <sample time='78:56 min' depth='0.265 m' /> + <sample time='78:58 min' depth='0.275 m' /> + <sample time='79:00 min' depth='0.337 m' /> + <sample time='79:02 min' depth='0.326 m' /> + <sample time='79:04 min' depth='0.367 m' /> + <sample time='79:06 min' depth='0.663 m' /> + <sample time='79:08 min' depth='0.724 m' /> + <sample time='79:10 min' depth='0.693 m' /> + <sample time='79:12 min' depth='0.612 m' /> + <sample time='79:14 min' depth='0.632 m' /> + <sample time='79:16 min' depth='0.52 m' /> + <sample time='79:18 min' depth='0.367 m' /> + <sample time='79:20 min' depth='0.5 m' /> + <sample time='79:22 min' depth='0.591 m' /> + <sample time='79:24 min' depth='0.571 m' /> + <sample time='79:26 min' depth='0.53 m' /> + <sample time='79:28 min' depth='0.54 m' /> + <sample time='79:30 min' depth='0.561 m' /> + <sample time='79:32 min' depth='0.357 m' /> + <sample time='79:34 min' depth='0.387 m' /> + <sample time='79:36 min' depth='0.561 m' /> + <sample time='79:38 min' depth='0.561 m' /> + <sample time='79:40 min' depth='0.581 m' /> + <sample time='79:42 min' depth='0.591 m' /> + <sample time='79:44 min' depth='0.591 m' /> + <sample time='79:46 min' depth='0.581 m' /> + <sample time='79:48 min' depth='0.418 m' /> + <sample time='79:50 min' depth='0.54 m' /> + <sample time='79:52 min' depth='0.622 m' /> + <sample time='79:54 min' depth='0.622 m' /> + <sample time='79:56 min' depth='0.591 m' /> + <sample time='79:58 min' depth='0.612 m' /> + <sample time='80:00 min' depth='0.602 m' /> + <sample time='80:02 min' depth='0.683 m' /> + <sample time='80:04 min' depth='0.653 m' /> + <sample time='80:06 min' depth='0.653 m' /> + <sample time='80:08 min' depth='0.224 m' /> + <sample time='80:10 min' depth='0.255 m' /> + <sample time='80:12 min' depth='0.235 m' /> + <sample time='80:14 min' depth='0.224 m' /> + <sample time='80:16 min' depth='0.224 m' /> + <sample time='80:18 min' depth='0.245 m' /> + <sample time='80:20 min' depth='0.235 m' /> + <sample time='80:22 min' depth='0.224 m' /> + <sample time='80:24 min' depth='0.235 m' /> + <sample time='80:26 min' depth='0.235 m' /> + <sample time='80:28 min' depth='0.224 m' /> + <sample time='80:30 min' depth='0.224 m' /> + <sample time='80:32 min' depth='0.235 m' /> + <sample time='80:34 min' depth='0.224 m' /> + <sample time='80:36 min' depth='0.224 m' /> + <sample time='80:38 min' depth='0.224 m' /> + <sample time='80:40 min' depth='0.224 m' /> + <sample time='80:42 min' depth='0.224 m' /> + <sample time='80:44 min' depth='0.224 m' /> + <sample time='80:46 min' depth='0.224 m' /> + <sample time='80:48 min' depth='0.214 m' /> + <sample time='80:50 min' depth='0.235 m' /> + <sample time='80:52 min' depth='0.224 m' /> + <sample time='80:54 min' depth='0.245 m' /> + <sample time='80:56 min' depth='0.235 m' /> + <sample time='80:58 min' depth='0.224 m' /> + <sample time='81:00 min' depth='0.316 m' temp='10.0 C' /> + <sample time='81:02 min' depth='0.235 m' /> + <sample time='81:04 min' depth='0.235 m' /> + <sample time='81:06 min' depth='0.224 m' /> + <sample time='81:08 min' depth='0.265 m' /> + <sample time='81:10 min' depth='0.265 m' /> + <sample time='81:12 min' depth='0.316 m' /> + <sample time='81:14 min' depth='0.316 m' /> + <sample time='81:16 min' depth='0.337 m' /> + <sample time='81:18 min' depth='0.306 m' /> + <sample time='81:20 min' depth='0.326 m' /> + <sample time='81:22 min' depth='0.245 m' /> + <sample time='81:24 min' depth='0.265 m' temp='10.1 C' /> + <sample time='81:26 min' depth='0.224 m' /> + <sample time='81:28 min' depth='0.235 m' /> + <sample time='81:30 min' depth='0.224 m' /> + <sample time='81:32 min' depth='0.214 m' /> + <sample time='81:34 min' depth='0.235 m' /> + <sample time='81:36 min' depth='0.224 m' /> + <sample time='81:38 min' depth='0.224 m' /> + <sample time='81:40 min' depth='0.224 m' /> + <sample time='81:42 min' depth='0.235 m' /> + <sample time='81:44 min' depth='0.235 m' /> + <sample time='81:46 min' depth='0.224 m' /> + <sample time='81:48 min' depth='0.214 m' /> + <sample time='81:50 min' depth='0.214 m' /> + <sample time='81:52 min' depth='0.214 m' /> + <sample time='81:54 min' depth='0.214 m' /> + <sample time='81:56 min' depth='0.235 m' /> + <sample time='81:58 min' depth='0.224 m' /> + <sample time='82:00 min' depth='0.224 m' temp='10.0 C' /> + <sample time='82:02 min' depth='0.235 m' /> + <sample time='82:04 min' depth='0.235 m' /> + <sample time='82:06 min' depth='0.224 m' /> + <sample time='82:08 min' depth='0.214 m' /> + <sample time='82:10 min' depth='0.235 m' /> + <sample time='82:12 min' depth='0.224 m' temp='9.9 C' /> + <sample time='82:14 min' depth='0.224 m' /> + <sample time='82:16 min' depth='0.224 m' /> + <sample time='82:18 min' depth='0.224 m' /> + <sample time='82:20 min' depth='0.235 m' /> + <sample time='82:22 min' depth='0.224 m' /> + <sample time='82:24 min' depth='0.214 m' /> + <sample time='82:26 min' depth='0.235 m' /> + <sample time='82:28 min' depth='0.235 m' /> + <sample time='82:30 min' depth='0.235 m' /> + <sample time='82:32 min' depth='0.224 m' /> + <sample time='82:34 min' depth='0.224 m' /> + <sample time='82:36 min' depth='0.235 m' temp='9.8 C' /> + <sample time='82:38 min' depth='0.224 m' /> + <sample time='82:40 min' depth='0.214 m' /> + <sample time='82:42 min' depth='0.214 m' /> + <sample time='82:44 min' depth='0.224 m' /> + <sample time='82:46 min' depth='0.224 m' /> + <sample time='82:48 min' depth='0.245 m' temp='9.7 C' /> + <sample time='82:50 min' depth='0.235 m' ndl='0:00 min' stoptime='0:00 min' cns='0%' po2='0.0 bar' /> + </divecomputer> +</dive> +</dives> +</divelog> diff --git a/dives/test43.xml b/dives/test43.xml new file mode 100644 index 000000000..9b75754bc --- /dev/null +++ b/dives/test43.xml @@ -0,0 +1,29 @@ +<divelog program='subsurface' version='3'> +<settings> +<divecomputerid model='Suunto Vyper' deviceid='7fffffff' serial='00522075' firmware='0.0.33'/> +<divecomputerid model='Suunto Vyper' deviceid='e9237b0a' nickname='Suunto Vyper (e9237b0a)'/> + <autogroup state='1' /> +</settings> +<divesites> +<site uuid='47b3e28c' gps='47.934500 11.334500'/> +</divesites> +<dives> +<trip date='2012-01-08' time='15:30:03'> +<dive number='1' divesiteid='47b3e28c' date='2012-01-08' time='15:30:03' duration='46:06 min'> + <notes>This is a dive with an image on a remote server.</notes> + <cylinder size='24.0 l' workpressure='232.0 bar' description='D12 232 bar' /> + <divecomputer model='manually added dive' date='2014-01-09' time='14:22:03'> + <depth max='15.0 m' mean='13.698 m' /> + <sample time='0:00 min' depth='0.0 m' /> + <sample time='0:50 min' depth='15.0 m' /> + <sample time='1:00 min' depth='15.0 m' /> + <sample time='40:00 min' depth='15.0 m' /> + <sample time='42:00 min' depth='5.0 m' /> + <sample time='45:00 min' depth='5.0 m' /> + <sample time='46:06 min' depth='0.0 m' /> + </divecomputer> + <picture filename='http://euve10195.vserver.de/~robert/wreck.jpg' offset='+21:01 min' /> +</dive> +</trip> +</dives> +</divelog> diff --git a/dives/test50.xml b/dives/test50.xml new file mode 100644 index 000000000..36df5b38e --- /dev/null +++ b/dives/test50.xml @@ -0,0 +1,28 @@ +<divelog program='subsurface' version='2'> +<settings> +</settings> +<dives> +<dive number='1' date='2015-1-1' time='10:00:00' duration='30:00 min'> + <location gps='7.132557 134.224213'>Blue Corner</location> + <notes>This dive is at the Blue Corner with the correct coordinates</notes> + <divecomputer model='Heinrichs Weikamp OSTC 3' deviceid='01234567' diveid='76543210'> + <depth max='30.00 m' mean='17.72 m' /> + </divecomputer> +</dive> +<dive number='2' date='2015-1-2' time='10:00:00' duration='30:00 min'> + <location gps='7.132557 134.224213'>Yellow Corner</location> + <notes>This dive is at the Yellow Corner but with the coordinates of Blue Corner</notes> + <divecomputer model='Heinrichs Weikamp OSTC 3' deviceid='01234567' diveid='76543210'> + <depth max='30.00 m' mean='17.72 m' /> + </divecomputer> +</dive> +<dive number='1' date='2015-1-3' time='10:00:00' duration='30:00 min'> + <location>Blue Corner</location> + <location gps='7.132557 34.224213'>Blue Corner</location> + <notes>This dive is at the Blue Corner but the coordinates are wrong. In order to trigger the right behavior here I had to mess with the XML file; it contains two sets of location tags, the first just with the name and only the second then adds the gps coordinates. Otherwise the gps coordinates get parsed first and create a new dive site and we don't even notice the duplicate name.</notes> + <divecomputer model='Heinrichs Weikamp OSTC 3' deviceid='01234567' diveid='76543210'> + <depth max='30.00 m' mean='17.72 m' /> + </divecomputer> +</dive> +</dives> +</divelog> diff --git a/divesite.c b/divesite.c new file mode 100644 index 000000000..f7f6afea1 --- /dev/null +++ b/divesite.c @@ -0,0 +1,122 @@ +/* divesite.c */ +#include "divesite.h" +#include "dive.h" + +struct dive_site_table dive_site_table; + +/* there could be multiple sites of the same name - return the first one */ +uint32_t get_dive_site_uuid_by_name(const char *name, struct dive_site **dsp) +{ + int i; + struct dive_site *ds; + for_each_dive_site (i, ds) { + if (same_string(ds->name, name)) { + if (dsp) + *dsp = ds; + return ds->uuid; + } + } + return 0; +} + +/* there could be multiple sites at the same GPS fix - return the first one */ +uint32_t get_dive_site_uuid_by_gps(degrees_t latitude, degrees_t longitude, struct dive_site **dsp) +{ + int i; + struct dive_site *ds; + for_each_dive_site (i, ds) { + if (ds->latitude.udeg == latitude.udeg && ds->longitude.udeg == longitude.udeg) { + if (dsp) + *dsp = ds; + return ds->uuid; + } + } + return 0; +} + +/* try to create a uniqe ID - fingers crossed */ +static uint32_t dive_site_getUniqId() +{ + uint32_t id = 0; + + while (id == 0 || get_dive_site_by_uuid(id)) { + id = rand() & 0xff; + id |= (rand() & 0xff) << 8; + id |= (rand() & 0xff) << 16; + id |= (rand() & 0xff) << 24; + } + + return id; +} + +struct dive_site *alloc_dive_site() +{ + int nr = dive_site_table.nr, allocated = dive_site_table.allocated; + struct dive_site **sites = dive_site_table.dive_sites; + + if (nr >= allocated) { + allocated = (nr + 32) * 3 / 2; + sites = realloc(sites, allocated * sizeof(struct dive_site *)); + if (!sites) + exit(1); + dive_site_table.dive_sites = sites; + dive_site_table.allocated = allocated; + } + struct dive_site *ds = calloc(1, sizeof(*ds)); + if (!ds) + exit(1); + sites[nr] = ds; + dive_site_table.nr = nr + 1; + ds->uuid = dive_site_getUniqId(); + return ds; +} + +void delete_dive_site(uint32_t id) +{ + int nr = dive_site_table.nr; + for (int i = 0; i < nr; i++) { + struct dive_site *ds = get_dive_site(i); + if (ds->uuid == id) { + free(ds->name); + free(ds->notes); + free(ds); + if (nr - 1 > i) + memmove(&dive_site_table.dive_sites[i], + &dive_site_table.dive_sites[i+1], + (nr - 1 - i) * sizeof(dive_site_table.dive_sites[0])); + dive_site_table.nr = nr - 1; + break; + } + } +} + +/* allocate a new site and add it to the table */ +uint32_t create_dive_site(const char *name) +{ + struct dive_site *ds = alloc_dive_site(); + ds->name = copy_string(name); + + return ds->uuid; +} + +/* same as before, but with GPS data */ +uint32_t create_dive_site_with_gps(const char *name, degrees_t latitude, degrees_t longitude) +{ + struct dive_site *ds = alloc_dive_site(); + ds->uuid = dive_site_getUniqId(); + ds->name = copy_string(name); + ds->latitude = latitude; + ds->longitude = longitude; + + return ds->uuid; +} + +/* a uuid is always present - but if all the other fields are empty, the dive site is pointless */ +bool dive_site_is_empty(struct dive_site *ds) +{ + return same_string(ds->name, "") && + same_string(ds->description, "") && + same_string(ds->notes, "") && + ds->latitude.udeg == 0 && + ds->longitude.udeg == 0; +} diff --git a/divesite.h b/divesite.h new file mode 100644 index 000000000..ca650259a --- /dev/null +++ b/divesite.h @@ -0,0 +1,61 @@ +#ifndef DIVESITE_H +#define DIVESITE_H + +#include "units.h" +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#else +#include <stdbool.h> +#endif + +struct dive_site +{ + uint32_t uuid; + char *name; + degrees_t latitude, longitude; + char *description; + char *notes; +}; + +struct dive_site_table { + int nr, allocated; + struct dive_site **dive_sites; +}; + +extern struct dive_site_table dive_site_table; + +static inline struct dive_site *get_dive_site(int nr) +{ + if (nr >= dive_site_table.nr || nr < 0) + return NULL; + return dive_site_table.dive_sites[nr]; +} + +/* iterate over each dive site */ +#define for_each_dive_site(_i, _x) \ + for ((_i) = 0; ((_x) = get_dive_site(_i)) != NULL; (_i)++) + +static inline struct dive_site *get_dive_site_by_uuid(uint32_t uuid) +{ + int i; + struct dive_site *ds; + for_each_dive_site (i, ds) + if (ds->uuid == uuid) + return get_dive_site(i); + return NULL; +} + +struct dive_site *alloc_dive_site(); +void delete_dive_site(uint32_t id); +uint32_t create_dive_site(const char *name); +uint32_t create_dive_site_with_gps(const char *name, degrees_t latitude, degrees_t longitude); +uint32_t get_dive_site_uuid_by_name(const char *name, struct dive_site **dsp); +uint32_t get_dive_site_uuid_by_gps(degrees_t latitude, degrees_t longitude, struct dive_site **dsp); +bool dive_site_is_empty(struct dive_site *ds); + +#ifdef __cplusplus +} +#endif +#endif // DIVESITE_H diff --git a/divesitehelpers.cpp b/divesitehelpers.cpp new file mode 100644 index 000000000..cc45851f3 --- /dev/null +++ b/divesitehelpers.cpp @@ -0,0 +1,76 @@ +// +// infrastructure to deal with dive sites +// + +#include "divesitehelpers.h" + +#include "divesite.h" +#include "helpers.h" +#include "usersurvey.h" +#include "membuffer.h" +#include <QJsonDocument> +#include <QJsonArray> +#include <QJsonObject> +#include <QNetworkReply> +#include <QNetworkRequest> +#include <QNetworkAccessManager> +#include <QUrlQuery> +#include <QEventLoop> + +struct GeoLoockupInfo { + degrees_t lat; + degrees_t lon; + uint32_t uuid; +}; + +QVector<GeoLoockupInfo> geo_loockup_data; + +ReverseGeoLoockupThread* ReverseGeoLoockupThread::instance() { + static ReverseGeoLoockupThread* self = new ReverseGeoLoockupThread(); + return self; +} + +ReverseGeoLoockupThread::ReverseGeoLoockupThread(QObject *obj) : QThread(obj) +{ +} + +void ReverseGeoLoockupThread::run() { + if (geo_loockup_data.isEmpty()) + return; + + QNetworkRequest request; + QNetworkAccessManager *rgl = new QNetworkAccessManager(); + request.setRawHeader("Accept", "text/json"); + request.setRawHeader("User-Agent", getUserAgent().toUtf8()); + QEventLoop loop; + QString apiCall("http://open.mapquestapi.com/nominatim/v1/reverse.php?format=json&accept-language=%1&lat=%2&lon=%3"); + Q_FOREACH (const GeoLoockupInfo& info, geo_loockup_data ) { + request.setUrl(apiCall.arg(uiLanguage(NULL)).arg(info.lat.udeg / 1000000.0).arg(info.lon.udeg / 1000000.0)); + QNetworkReply *reply = rgl->get(request); + QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + QJsonParseError errorObject; + QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &errorObject); + if (errorObject.error != QJsonParseError::NoError) { + qDebug() << errorObject.errorString(); + } else { + QJsonObject obj = jsonDoc.object(); + QJsonObject address = obj.value("address").toObject(); + qDebug() << "found country:" << address.value("country").toString(); + struct dive_site *ds = get_dive_site_by_uuid(info.uuid); + ds->notes = add_to_string(ds->notes, "countrytag: %s", address.value("country").toString().toUtf8().data()); + } + + reply->deleteLater(); + } + rgl->deleteLater(); +} + +extern "C" void add_geo_information_for_loockup(degrees_t latitude, degrees_t longitude, uint32_t uuid) { + GeoLoockupInfo info; + info.lat = latitude; + info.lon = longitude; + info.uuid = uuid; + + geo_loockup_data.append(info); +} diff --git a/divesitehelpers.h b/divesitehelpers.h new file mode 100644 index 000000000..68c195674 --- /dev/null +++ b/divesitehelpers.h @@ -0,0 +1,17 @@ +#ifndef DIVESITEHELPERS_H +#define DIVESITEHELPERS_H + +#include "units.h" +#include <QThread> + +class ReverseGeoLoockupThread : public QThread { +Q_OBJECT +public: + static ReverseGeoLoockupThread *instance(); + void run() Q_DECL_OVERRIDE; + +private: + ReverseGeoLoockupThread(QObject *parent = 0); +}; + +#endif // DIVESITEHELPERS_H @@ -454,6 +454,18 @@ int parse_file(const char *filename) return -1; } + /* DataTrak/Wlog */ + if (fmt && !strcasecmp(fmt + 1, "LOG")) { + datatrak_import(filename, &dive_table); + return 0; + } + + /* OSTCtools */ + if (fmt && (!strcasecmp(fmt + 1, "DIVE"))) { + ostctools_import(filename, &dive_table); + return 0; + } + ret = parse_file_buffer(filename, &mem); free(mem.buffer); return ret; @@ -644,6 +656,7 @@ int parse_txt_file(const char *filename, const char *csv) QT_TRANSLATE_NOOP("gettextFromC", "Mouth piece position not connected")); break; } + break; case 3: //Power Off event add_event(dc, cur_sampletime, 0, 0, 0, @@ -900,11 +913,12 @@ int parse_csv_file(const char *filename, int timef, int depthf, int tempf, int p return ret; } -int parse_seabear_csv_file(const char *filename, int timef, int depthf, int tempf, int po2f, int cnsf, int ndlf, int ttsf, int stopdepthf, int pressuref, int sepidx, const char *csvtemplate, int unitidx) +#define SBPARAMS 29 +int parse_seabear_csv_file(const char *filename, int timef, int depthf, int tempf, int po2f, int cnsf, int ndlf, int ttsf, int stopdepthf, int pressuref, int sepidx, const char *csvtemplate, int unitidx, const char *delta) { int ret; struct memblock mem; - char *params[27]; + char *params[SBPARAMS]; char timebuf[MAXCOLDIGITS]; char depthbuf[MAXCOLDIGITS]; char tempbuf[MAXCOLDIGITS]; @@ -916,12 +930,13 @@ int parse_seabear_csv_file(const char *filename, int timef, int depthf, int temp char pressurebuf[MAXCOLDIGITS]; char unitbuf[MAXCOLDIGITS]; char separator_index[MAXCOLDIGITS]; + char deltabuf[MAXCOLDIGITS]; time_t now; struct tm *timep = NULL; char curdate[DATESTR]; char curtime[TIMESTR]; char *ptr, *ptr_old = NULL; - char *NL; + char *NL = NULL; if (timef >= MAXCOLS || depthf >= MAXCOLS || tempf >= MAXCOLS || po2f >= MAXCOLS || cnsf >= MAXCOLS || ndlf >= MAXCOLS || cnsf >= MAXCOLS || stopdepthf >= MAXCOLS || pressuref >= MAXCOLS) return report_error(translate("gettextFromC", "Maximum number of supported columns on CSV import is %d"), MAXCOLS); @@ -942,24 +957,24 @@ int parse_seabear_csv_file(const char *filename, int timef, int depthf, int temp NL = "\r\n"; } - /* - * If file does not contain empty lines, it is not a valid - * Seabear CSV file. - */ - if (!ptr) - return -1; - if (!ptr_old) { while ((ptr = strstr(ptr, "\n\n")) != NULL) { ptr_old = ptr; ptr += 1; + NL = "\n"; } ptr_old += 2; - NL = "\n"; } else ptr_old += 4; /* + * If file does not contain empty lines, it is not a valid + * Seabear CSV file. + */ + if (NL == NULL) + return -1; + + /* * On my current sample of Seabear DC log file, the date is * without any identifier. Thus we must search for the previous * line and step through from there. @@ -982,6 +997,11 @@ int parse_seabear_csv_file(const char *filename, int timef, int depthf, int temp params[21][5] = 0; } + snprintf(deltabuf, MAXCOLDIGITS, "%s", delta); + params[SBPARAMS - 3] = "delta"; + params[SBPARAMS - 2] = deltabuf; + params[SBPARAMS - 1] = NULL; + /* Move the CSV data to the start of mem buffer */ memmove(mem.buffer, ptr_old, mem.size - (ptr_old - (char*)mem.buffer)); mem.size = (int)mem.size - (ptr_old - (char*)mem.buffer); @@ -994,11 +1014,20 @@ int parse_seabear_csv_file(const char *filename, int timef, int depthf, int temp return ret; } -int parse_manual_file(const char *filename, int sepidx, int units, int dateformat, int durationformat, int numberf, int datef, int timef, int durationf, int locationf, int gpsf, int maxdepthf, int meandepthf, int divemasterf, int buddyf, int notesf, int weightf, int tagsf, int cylsizef, int startpresf, int endpresf, int o2f, int hef, int airtempf, int watertempf) +int parse_manual_file(const char *filename, int sepidx, int units, int dateformat, int durationformat, + int numberf, int datef, int timef, int durationf, int locationf, int gpsf, int maxdepthf, int meandepthf, + int divemasterf, int buddyf, int suitf, int notesf, int weightf, int tagsf, int cylsizef, int startpresf, int endpresf, + int o2f, int hef, int airtempf, int watertempf) { + if (verbose > 4) { + fprintf(stderr, "filename %s, sepidx %d, units %d, dateformat %d, durationformat %d\n", filename, sepidx, units, dateformat, durationformat); + fprintf(stderr, "numberf %d, datef %d, timef %d, durationf %d, locationf %d, gpsf %d, maxdepthf %d, meandepthf %d\n", numberf, datef, timef, durationf, locationf, gpsf, maxdepthf, meandepthf); + fprintf(stderr, "divemasterf %d, buddyf %d, suitf %d, notesf %d, weightf %d, tagsf %d, cylsizef %d, startpresf %d, endpresf %d\n", divemasterf, buddyf, suitf, notesf, weightf, tagsf, cylsizef, startpresf, endpresf); + fprintf(stderr, "o2f %d, hef %d, airtempf %d, watertempf %d\n", o2f, hef, airtempf, watertempf); + } struct memblock mem; int pnr = 0; - char *params[53]; + char *params[55]; char numberbuf[MAXCOLDIGITS]; char datebuf[MAXCOLDIGITS]; char timebuf[MAXCOLDIGITS]; @@ -1009,6 +1038,7 @@ int parse_manual_file(const char *filename, int sepidx, int units, int dateforma char meandepthbuf[MAXCOLDIGITS]; char divemasterbuf[MAXCOLDIGITS]; char buddybuf[MAXCOLDIGITS]; + char suitbuf[MAXCOLDIGITS]; char notesbuf[MAXCOLDIGITS]; char weightbuf[MAXCOLDIGITS]; char tagsbuf[MAXCOLDIGITS]; @@ -1029,7 +1059,7 @@ int parse_manual_file(const char *filename, int sepidx, int units, int dateforma char curtime[6]; int ret; - if (numberf >= MAXCOLS || datef >= MAXCOLS || timef >= MAXCOLS || durationf >= MAXCOLS || locationf >= MAXCOLS || gpsf >= MAXCOLS || maxdepthf >= MAXCOLS || meandepthf >= MAXCOLS || buddyf >= MAXCOLS || notesf >= MAXCOLS || weightf >= MAXCOLS || tagsf >= MAXCOLS || cylsizef >= MAXCOLS || startpresf >= MAXCOLS || endpresf >= MAXCOLS || o2f >= MAXCOLS || hef >= MAXCOLS || airtempf >= MAXCOLS || watertempf >= MAXCOLS) + if (numberf >= MAXCOLS || datef >= MAXCOLS || timef >= MAXCOLS || durationf >= MAXCOLS || locationf >= MAXCOLS || gpsf >= MAXCOLS || maxdepthf >= MAXCOLS || meandepthf >= MAXCOLS || buddyf >= MAXCOLS || suitf >= MAXCOLS || notesf >= MAXCOLS || weightf >= MAXCOLS || tagsf >= MAXCOLS || cylsizef >= MAXCOLS || startpresf >= MAXCOLS || endpresf >= MAXCOLS || o2f >= MAXCOLS || hef >= MAXCOLS || airtempf >= MAXCOLS || watertempf >= MAXCOLS) return report_error(translate("gettextFromC", "Maximum number of supported columns on CSV import is %d"), MAXCOLS); snprintf(numberbuf, MAXCOLDIGITS, "%d", numberf); @@ -1042,6 +1072,7 @@ int parse_manual_file(const char *filename, int sepidx, int units, int dateforma snprintf(meandepthbuf, MAXCOLDIGITS, "%d", meandepthf); snprintf(divemasterbuf, MAXCOLDIGITS, "%d", divemasterf); snprintf(buddybuf, MAXCOLDIGITS, "%d", buddyf); + snprintf(suitbuf, MAXCOLDIGITS, "%d", suitf); snprintf(notesbuf, MAXCOLDIGITS, "%d", notesf); snprintf(weightbuf, MAXCOLDIGITS, "%d", weightf); snprintf(tagsbuf, MAXCOLDIGITS, "%d", tagsf); @@ -1084,6 +1115,8 @@ int parse_manual_file(const char *filename, int sepidx, int units, int dateforma params[pnr++] = divemasterbuf; params[pnr++] = "buddyField"; params[pnr++] = buddybuf; + params[pnr++] = "suitField"; + params[pnr++] = suitbuf; params[pnr++] = "notesField"; params[pnr++] = notesbuf; params[pnr++] = "weightField"; @@ -1125,7 +1158,17 @@ int parse_manual_file(const char *filename, int sepidx, int units, int dateforma if (try_to_xslt_open_csv(filename, &mem, "manualCSV")) return -1; + // right now input files created by XSLT processing report being v2 XML which makes + // the parse function abort until the dialog about importing v2 files has been shown. + // Until the XSLT has been updated we just override this check + // + // FIXME + // + bool remember = v2_question_shown; + v2_question_shown = true; ret = parse_xml_buffer(filename, mem.buffer, mem.size, &dive_table, (const char **)params); + v2_question_shown = remember; + free(mem.buffer); return ret; } @@ -8,6 +8,8 @@ struct memblock { extern int try_to_open_cochran(const char *filename, struct memblock *mem); extern int try_to_open_liquivision(const char *filename, struct memblock *mem); +extern void datatrak_import(const char *file, struct dive_table *table); +extern void ostctools_import(const char *file, struct dive_table *table); #ifdef __cplusplus extern "C" { diff --git a/git-access.c b/git-access.c new file mode 100644 index 000000000..bc8903331 --- /dev/null +++ b/git-access.c @@ -0,0 +1,278 @@ +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <stdlib.h> +#include <errno.h> +#include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <git2.h> + +#include "dive.h" +#include "membuffer.h" + +/* + * The libgit2 people are incompetent at making libraries. They randomly change + * the interfaces, often just renaming things without any sane way to know which + * version you should check for etc etc. It's a disgrace. + */ +#if !LIBGIT2_VER_MAJOR && LIBGIT2_VER_MINOR < 22 + #define git_remote_lookup(res, repo, name) git_remote_load(res, repo, name) + #if LIBGIT2_VER_MINOR <= 20 + #define git_remote_fetch(remote, refspecs, signature, reflog) git_remote_fetch(remote) + #else + #define git_remote_fetch(remote, refspecs, signature, reflog) git_remote_fetch(remote, signature, reflog) + #endif +#endif + +static char *get_local_dir(const char *remote, const char *branch) +{ + SHA_CTX ctx; + unsigned char hash[20]; + + // That zero-byte update is so that we don't get hash + // collisions for "repo1 branch" vs "repo 1branch". + SHA1_Init(&ctx); + SHA1_Update(&ctx, remote, strlen(remote)); + SHA1_Update(&ctx, "", 1); + SHA1_Update(&ctx, branch, strlen(branch)); + SHA1_Final(hash, &ctx); + + return format_string("%s/%02x%02x%02x%02x%02x%02x%02x%02x", + system_default_directory(), + hash[0], hash[1], hash[2], hash[3], + hash[4], hash[5], hash[6], hash[7]); +} + +static int check_clean(const char *path, unsigned int status, void *payload) +{ + status &= ~GIT_STATUS_CURRENT | GIT_STATUS_IGNORED; + if (!status) + return 0; + report_error("WARNING: Git cache directory modified (path %s)", path); + return 1; +} + +static int try_to_update(git_repository *rep, git_reference *local, git_reference *remote) +{ + if (!git_reference_cmp(local, remote)) + return 0; + return report_error("Local and remote do not match, not updating"); +} + +static git_repository *update_local_repo(const char *localdir, const char *remote, const char *branch) +{ + int error; + git_repository *repo = NULL; + git_remote *origin; + git_reference *local_ref, *remote_ref; + + error = git_repository_open(&repo, localdir); + if (error) { + report_error("Unable to open git cache repository at %s: %s", + localdir, giterr_last()->message); + return NULL; + } + + /* + * NOTE! Remote errors are reported, but are nonfatal: + * we still successfully return the local repository. + */ + error = git_remote_lookup(&origin, repo, "origin"); + if (error) { + report_error("Repository '%s' origin lookup failed (%s)", + remote, giterr_last()->message); + return repo; + } + + // NOTE! A fetch error is not fatal, we just report it + error = git_remote_fetch(origin, NULL, NULL, NULL); + git_remote_free(origin); + if (error) { + report_error("Unable to update cache for remote '%s'", remote); + return repo; + } + + // Dirty modified state in the working tree? We're not going + // to tru to update + if (git_status_foreach(repo, check_clean, NULL)) + return repo; + + if (git_branch_lookup(&local_ref, repo, branch, GIT_BRANCH_LOCAL)) { + report_error("Git cache branch %s no longer exists", branch); + return repo; + } + + if (git_branch_upstream(&remote_ref, local_ref)) { + report_error("Git cache branch %s no longer has an upstream branch", branch); + git_reference_free(local_ref); + return repo; + } + + try_to_update(repo, local_ref, remote_ref); + git_reference_free(local_ref); + git_reference_free(remote_ref); + return repo; +} + +static git_repository *create_local_repo(const char *localdir, const char *remote, const char *branch) +{ + int error; + git_repository *cloned_repo = NULL; + git_clone_options opts = GIT_CLONE_OPTIONS_INIT; + + opts.checkout_branch = branch; + error = git_clone(&cloned_repo, remote, localdir, &opts); + if (error) { + report_error("git clone of %s failed (%s)", remote, giterr_last()->message); + return NULL; + } + return cloned_repo; +} + +static struct git_repository *get_remote_repo(const char *localdir, const char *remote, const char *branch) +{ + struct stat st; + + /* Do we already have a local cache? */ + if (!stat(localdir, &st)) { + if (!S_ISDIR(st.st_mode)) { + report_error("local git cache at '%s' is corrupt"); + return NULL; + } + return update_local_repo(localdir, remote, branch); + } + return create_local_repo(localdir, remote, branch); +} + +/* + * This turns a remote repository into a local one if possible. + * + * The recognized formats are + * git://host/repo[branch] + * ssh://host/repo[branch] + * http://host/repo[branch] + * https://host/repo[branch] + * file://repo[branch] + */ +static struct git_repository *is_remote_git_repository(const char *remote, const char *branch) +{ + char c, *localdir; + const char *p = remote; + + while ((c = *p++) >= 'a' && c <= 'z') + /* nothing */; + if (c != ':') + return NULL; + if (*p++ != '/' || *p++ != '/') + return NULL; + + /* Special-case "file://", since it's already local */ + if (!strncmp(remote, "file://", 7)) + remote += 7; + + /* + * Ok, we found "[a-z]*://", we've simplified the + * local repo case (because libgit2 is insanely slow + * for that), and we think we have a real "remote + * git" format. + * + * We now create the SHA1 hash of the whole thing, + * including the branch name. That will be our unique + * unique local repository name. + * + * NOTE! We will create a local repository per branch, + * because + * + * (a) libgit2 remote tracking branch support seems to + * be a bit lacking + * (b) we'll actually check the branch out so that we + * can do merges etc too. + * + * so even if you have a single remote git repo with + * multiple branches for different people, the local + * caches will sadly force that to split into multiple + * individual repositories. + */ + localdir = get_local_dir(remote, branch); + if (!localdir) + return NULL; + + return get_remote_repo(localdir, remote, branch); +} + +/* + * If it's not a git repo, return NULL. Be very conservative. + */ +struct git_repository *is_git_repository(const char *filename, const char **branchp) +{ + int flen, blen, ret; + struct stat st; + git_repository *repo; + char *loc, *branch; + + flen = strlen(filename); + if (!flen || filename[--flen] != ']') + return NULL; + + /* Find the matching '[' */ + blen = 0; + while (flen && filename[--flen] != '[') + blen++; + + /* Ignore slashes at the end of the repo name */ + while (flen && filename[flen-1] == '/') + flen--; + + if (!flen) + return NULL; + + /* + * This is the "point of no return": the name matches + * the git repository name rules, and we will no longer + * return NULL. + * + * We will either return "dummy_git_repository" and the + * branch pointer will have the _whole_ filename in it, + * or we will return a real git repository with the + * branch pointer being filled in with just the branch + * name. + * + * The actual git reading/writing routines can use this + * to generate proper error messages. + */ + *branchp = filename; + loc = format_string("%.*s", flen, filename); + if (!loc) + return dummy_git_repository; + + branch = format_string("%.*s", blen, filename+flen+1); + if (!branch) { + free(loc); + return dummy_git_repository; + } + + repo = is_remote_git_repository(loc, branch); + if (repo) { + free(loc); + *branchp = branch; + return repo; + } + + if (stat(loc, &st) < 0 || !S_ISDIR(st.st_mode)) { + free(loc); + free(branch); + return dummy_git_repository; + } + + ret = git_repository_open(&repo, loc); + free(loc); + if (ret < 0) { + free(branch); + return dummy_git_repository; + } + *branchp = branch; + return repo; +} @@ -37,6 +37,7 @@ QString uiLanguage(QLocale *callerLoc); QLocale getLocale(); QString getDateFormat(); void selectedDivesGasUsed(QVector<QPair<QString, int> > &gasUsed); +QString getUserAgent(); #if defined __APPLE__ #define TITLE_OR_TEXT(_t, _m) "", _t + "\n" + _m diff --git a/libdivecomputer.c b/libdivecomputer.c index 942b1ec14..f07023f88 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -9,6 +9,9 @@ #include "display.h" #include "libdivecomputer.h" +#include <libdivecomputer/uwatec.h> +#include <libdivecomputer/hw.h> + /* Christ. Libdivecomputer has the worst configuration system ever. */ #ifdef HW_FROG_H @@ -26,13 +29,46 @@ double progress_bar_fraction = 0.0; static int stoptime, stopdepth, ndl, po2, cns; static bool in_deco, first_temp_is_air; +/* + * Directly taken from libdivecomputer's examples/common.c to improve + * the error messages resulting from libdc's return codes + */ +const char *errmsg (dc_status_t rc) +{ + switch (rc) { + case DC_STATUS_SUCCESS: + return "Success"; + case DC_STATUS_UNSUPPORTED: + return "Unsupported operation"; + case DC_STATUS_INVALIDARGS: + return "Invalid arguments"; + case DC_STATUS_NOMEMORY: + return "Out of memory"; + case DC_STATUS_NODEVICE: + return "No device found"; + case DC_STATUS_NOACCESS: + return "Access denied"; + case DC_STATUS_IO: + return "Input/output error"; + case DC_STATUS_TIMEOUT: + return "Timeout"; + case DC_STATUS_PROTOCOL: + return "Protocol error"; + case DC_STATUS_DATAFORMAT: + return "Data format error"; + case DC_STATUS_CANCELLED: + return "Cancelled"; + default: + return "Unknown error"; + } +} + static dc_status_t create_parser(device_data_t *devdata, dc_parser_t **parser) { return dc_parser_new(parser, devdata->device); } -static int parse_gasmixes(device_data_t *devdata, struct dive *dive, dc_parser_t *parser, int ngases, - const unsigned char *data) +static int parse_gasmixes(device_data_t *devdata, struct dive *dive, dc_parser_t *parser, int ngases) { static bool shown_warning = false; int i, rc; @@ -107,7 +143,7 @@ static int parse_gasmixes(device_data_t *devdata, struct dive *dive, dc_parser_t * dive computer, fill in the default tank information (if set) */ fill_default_cylinder(&dive->cylinder[i]); } - /* whatever happens, make sure there is a name for the cylidner */ + /* whatever happens, make sure there is a name for the cylinder */ if (same_string(dive->cylinder[i].type.description, "")) dive->cylinder[i].type.description = strdup(translate("gettextFromC", "unknown")); } @@ -400,45 +436,19 @@ static void parse_string_field(struct dive *dive, dc_field_string_t *str) } #endif -/* returns true if we want libdivecomputer's dc_device_foreach() to continue, - * false otherwise */ -static int dive_cb(const unsigned char *data, unsigned int size, - const unsigned char *fingerprint, unsigned int fsize, - void *userdata) +static dc_status_t libdc_header_parser(dc_parser_t *parser, struct device_data_t *devdata, struct dive *dive) { - int rc; - dc_parser_t *parser = NULL; - device_data_t *devdata = userdata; + dc_status_t rc = 0; dc_datetime_t dt = { 0 }; struct tm tm; - struct dive *dive = NULL; - - /* reset the deco / ndl data */ - ndl = stoptime = stopdepth = 0; - in_deco = false; - - rc = create_parser(devdata, &parser); - if (rc != DC_STATUS_SUCCESS) { - dev_info(devdata, translate("gettextFromC", "Unable to create parser for %s %s"), devdata->vendor, devdata->product); - return false; - } - - rc = dc_parser_set_data(parser, data, size); - if (rc != DC_STATUS_SUCCESS) { - dev_info(devdata, translate("gettextFromC", "Error registering the data")); - goto error_exit; - } - import_dive_number++; - dive = alloc_dive(); rc = dc_parser_get_datetime(parser, &dt); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error parsing the datetime")); - goto error_exit; + return rc; } - dive->dc.model = strdup(devdata->model); + dive->dc.deviceid = devdata->deviceid; - dive->dc.diveid = calculate_diveid(fingerprint, fsize); if (rc == DC_STATUS_SUCCESS) { tm.tm_year = dt.year; @@ -449,13 +459,14 @@ static int dive_cb(const unsigned char *data, unsigned int size, tm.tm_sec = dt.second; dive->when = dive->dc.when = utc_mktime(&tm); } + // Parse the divetime. dev_info(devdata, translate("gettextFromC", "Dive %d: %s"), import_dive_number, get_dive_date_c_string(dive->when)); unsigned int divetime = 0; rc = dc_parser_get_field(parser, DC_FIELD_DIVETIME, 0, &divetime); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error parsing the divetime")); - goto error_exit; + return rc; } if (rc == DC_STATUS_SUCCESS) dive->dc.duration.seconds = divetime; @@ -465,7 +476,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, rc = dc_parser_get_field(parser, DC_FIELD_MAXDEPTH, 0, &maxdepth); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error parsing the maxdepth")); - goto error_exit; + return rc; } if (rc == DC_STATUS_SUCCESS) dive->dc.maxdepth.mm = rint(maxdepth * 1000); @@ -484,7 +495,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, rc = dc_parser_get_field(parser, temp_fields[i], 0, &temperature); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error parsing temperature")); - goto error_exit; + return rc; } if (rc == DC_STATUS_SUCCESS) switch(i) { @@ -504,7 +515,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, rc = dc_parser_get_field(parser, DC_FIELD_GASMIX_COUNT, 0, &ngases); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error parsing the gas mix count")); - goto error_exit; + return rc; } #if DC_VERSION_CHECK(0, 3, 0) @@ -516,7 +527,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, rc = dc_parser_get_field(parser, DC_FIELD_SALINITY, 0, &salinity); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error obtaining water salinity")); - goto error_exit; + return rc; } if (rc == DC_STATUS_SUCCESS) dive->dc.salinity = rint(salinity.density * 10.0); @@ -525,7 +536,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, rc = dc_parser_get_field(parser, DC_FIELD_ATMOSPHERIC, 0, &surface_pressure); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error obtaining surface pressure")); - goto error_exit; + return rc; } if (rc == DC_STATUS_SUCCESS) dive->dc.surface_pressure.mbar = rint(surface_pressure * 1000.0); @@ -550,7 +561,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, rc = dc_parser_get_field(parser, DC_FIELD_DIVEMODE, 0, &divemode); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error obtaining divemode")); - goto error_exit; + return rc; } if (rc == DC_STATUS_SUCCESS) switch(divemode) { @@ -567,12 +578,57 @@ static int dive_cb(const unsigned char *data, unsigned int size, } #endif - rc = parse_gasmixes(devdata, dive, parser, ngases, data); - if (rc != DC_STATUS_SUCCESS) { + rc = parse_gasmixes(devdata, dive, parser, ngases); + if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC", "Error parsing the gas mix")); + return rc; + } + + return DC_STATUS_SUCCESS; +} + +/* returns true if we want libdivecomputer's dc_device_foreach() to continue, + * false otherwise */ +static int dive_cb(const unsigned char *data, unsigned int size, + const unsigned char *fingerprint, unsigned int fsize, + void *userdata) +{ + int rc; + dc_parser_t *parser = NULL; + device_data_t *devdata = userdata; + dc_datetime_t dt = { 0 }; + struct tm tm; + struct dive *dive = NULL; + + /* reset the deco / ndl data */ + ndl = stoptime = stopdepth = 0; + in_deco = false; + + rc = create_parser(devdata, &parser); + if (rc != DC_STATUS_SUCCESS) { + dev_info(devdata, translate("gettextFromC", "Unable to create parser for %s %s"), devdata->vendor, devdata->product); + return false; + } + + rc = dc_parser_set_data(parser, data, size); + if (rc != DC_STATUS_SUCCESS) { + dev_info(devdata, translate("gettextFromC", "Error registering the data")); + goto error_exit; + } + + import_dive_number++; + dive = alloc_dive(); + + // Parse the dive's header data + rc = libdc_header_parser (parser, devdata, dive); + if (rc != DC_STATUS_SUCCESS) { + dev_info(devdata, translate("getextFromC", "Error parsing the header")); goto error_exit; } + dive->dc.model = strdup(devdata->model); + dive->dc.diveid = calculate_diveid(fingerprint, fsize); + // Initialize the sample data. rc = parse_samples(devdata, &dive->dc, parser); if (rc != DC_STATUS_SUCCESS) { @@ -876,3 +932,66 @@ const char *do_libdivecomputer_import(device_data_t *data) return err; } + +/* + * Parse data buffers instead of dc devices downloaded data. + * Intended to be used to parse profile data from binary files during import tasks. + * Actually included Uwatec families because of works on datatrak and smartrak logs + * and OSTC families for OSTCTools logs import. + * For others, simply include them in the switch (check parameters). + * Note that dc_descriptor_t in data *must* have been filled using dc_descriptor_iterator() + * calls. + */ +dc_status_t libdc_buffer_parser(struct dive *dive, device_data_t *data, unsigned char *buffer, int size) +{ + dc_status_t rc; + dc_parser_t *parser = NULL; + + switch (data->descriptor->type) { + case DC_FAMILY_UWATEC_ALADIN: + case DC_FAMILY_UWATEC_MEMOMOUSE: + rc = uwatec_memomouse_parser_create(&parser, data->context, 0, 0); + break; + case DC_FAMILY_UWATEC_SMART: + case DC_FAMILY_UWATEC_MERIDIAN: + rc = uwatec_smart_parser_create (&parser, data->context, data->descriptor->model, 0, 0); + break; + case DC_FAMILY_HW_OSTC: + rc = hw_ostc_parser_create (&parser, data->context, data->deviceid, 0); + break; + case DC_FAMILY_HW_FROG: + case DC_FAMILY_HW_OSTC3: + rc = hw_ostc_parser_create (&parser, data->context, data->deviceid, 1); + break; + default: + report_error("Device type not handled!"); + return DC_STATUS_UNSUPPORTED; + } + if (rc != DC_STATUS_SUCCESS) { + report_error("Error creating parser."); + dc_parser_destroy (parser); + return rc; + } + rc = dc_parser_set_data(parser, buffer, size); + if (rc != DC_STATUS_SUCCESS) { + report_error("Error registering the data."); + dc_parser_destroy (parser); + return rc; + } + // Do not parse Aladin/Memomouse headers as they are fakes + // Do not return on error, we can still parse the samples + if (data->descriptor->type != DC_FAMILY_UWATEC_ALADIN && data->descriptor->type != DC_FAMILY_UWATEC_MEMOMOUSE) { + rc = libdc_header_parser (parser, data, dive); + if (rc != DC_STATUS_SUCCESS) { + report_error("Error parsing the dive header data. Dive # %d\nStatus = %s", dive->number, errmsg(rc)); + } + } + rc = dc_parser_samples_foreach (parser, sample_cb, &dive->dc); + if (rc != DC_STATUS_SUCCESS) { + report_error("Error parsing the sample data. Dive # %d\nStatus = %s", dive->number, errmsg(rc)); + dc_parser_destroy (parser); + return rc; + } + dc_parser_destroy(parser); + return(DC_STATUS_SUCCESS); +} diff --git a/libdivecomputer.h b/libdivecomputer.h index 91548bac3..2e4fb9aab 100644 --- a/libdivecomputer.h +++ b/libdivecomputer.h @@ -13,6 +13,13 @@ extern "C" { #endif +struct dc_descriptor_t { + const char *vendor; + const char *product; + dc_family_t type; + unsigned int model; +}; + /* don't forget to include the UI toolkit specific display-XXX.h first to get the definition of progressbar_t */ typedef struct device_data_t @@ -34,8 +41,10 @@ typedef struct device_data_t struct dive_table *download_table; } device_data_t; +const char *errmsg (dc_status_t rc); const char *do_libdivecomputer_import(device_data_t *data); const char *do_uemis_import(device_data_t *data); +dc_status_t libdc_buffer_parser(struct dive *dive, device_data_t *data, unsigned char *buffer, int size); extern int import_thread_cancelled; extern const char *progress_bar_text; diff --git a/liquivision.c b/liquivision.c index a42c35aab..6eefdc123 100644 --- a/liquivision.c +++ b/liquivision.c @@ -35,6 +35,8 @@ struct lv_event { } pressure; }; +uint16_t primary_sensor; + static int handle_event_ver2(int code, const unsigned char *ps, unsigned int ps_ptr, struct lv_event *event) { // Skip 4 bytes @@ -45,6 +47,7 @@ static int handle_event_ver2(int code, const unsigned char *ps, unsigned int ps_ static int handle_event_ver3(int code, const unsigned char *ps, unsigned int ps_ptr, struct lv_event *event) { int skip = 4; + uint16_t current_sensor; switch (code) { case 0x0002: // Unknown @@ -67,8 +70,23 @@ static int handle_event_ver3(int code, const unsigned char *ps, unsigned int ps_ case 0x000f: // Tank pressure event->time = array_uint32_le(ps + ps_ptr); - event->pressure.sensor = 0; //array_uint16_le(ps + ps_ptr + 4); - event->pressure.mbar = array_uint16_le(ps + ps_ptr + 6) * 10; // cb->mb + + /* As far as I know, Liquivision supports 2 sensors, own and buddie's. This is my + * best guess how it is represented. */ + + current_sensor = array_uint16_le(ps + ps_ptr + 4); + if (primary_sensor == 0) { + primary_sensor = current_sensor; + } + if (current_sensor == primary_sensor) { + event->pressure.sensor = 0; + event->pressure.mbar = array_uint16_le(ps + ps_ptr + 6) * 10; // cb->mb + } else { + /* Ignoring the buddy sensor for no as we cannot draw it on the profile. + event->pressure.sensor = 1; + event->pressure.mbar = array_uint16_le(ps + ps_ptr + 6) * 10; // cb->mb + */ + } // 1 byte PSR // 1 byte ST skip = 10; @@ -97,9 +115,15 @@ static void parse_dives (int log_version, const unsigned char *buf, unsigned int struct sample *sample; while (ptr < buf_size) { + int i; dive = alloc_dive(); + primary_sensor = 0; dc = &dive->dc; + /* Just the main cylinder until we can handle the buddy cylinder porperly */ + for (i = 0; i < 1; i++) + fill_default_cylinder(&dive->cylinder[i]); + // Model 0=Xen, 1,2=Xeo, 4=Lynx, other=Liquivision model = *(buf + ptr); switch (model) { @@ -121,20 +145,27 @@ static void parse_dives (int log_version, const unsigned char *buf, unsigned int // Dive location, assemble Location and Place unsigned int len, place_len; + char *location; len = array_uint32_le(buf + ptr); ptr += 4; place_len = array_uint32_le(buf + ptr + len); if (len && place_len) { - dive->location = malloc(len + place_len + 4); - memset(dive->location, 0, len + place_len + 4); - memcpy(dive->location, buf + ptr, len); - memcpy(dive->location + len, ", ", 2); - memcpy(dive->location + len + 2, buf + ptr + len + 4, place_len); + location = malloc(len + place_len + 4); + memset(location, 0, len + place_len + 4); + memcpy(location, buf + ptr, len); + memcpy(location + len, ", ", 2); + memcpy(location + len + 2, buf + ptr + len + 4, place_len); } else if (len) { - dive->location = strndup(buf + ptr, len); + location = strndup(buf + ptr, len); } else if (place_len) { - dive->location = strndup(buf + ptr + len + 4, place_len); + location = strndup(buf + ptr + len + 4, place_len); + } + + /* Store the location only if we have one */ + if (len || place_len) { + dive->dive_site_uuid = create_dive_site(location); + free(location); } ptr += len + 4 + place_len; diff --git a/load-git.c b/load-git.c index 1cdb44cff..d8052a550 100644 --- a/load-git.c +++ b/load-git.c @@ -10,6 +10,8 @@ #include <fcntl.h> #include <git2.h> +#include "gettext.h" + #include "dive.h" #include "device.h" #include "membuffer.h" @@ -23,13 +25,6 @@ struct keyword_action { #define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0])) extern degrees_t parse_degrees(char *buf, char **end); -static void parse_dive_gps(char *line, struct membuffer *str, void *_dive) -{ - struct dive *dive = _dive; - - dive->latitude = parse_degrees(line, &line); - dive->longitude = parse_degrees(line, &line); -} static char *get_utf8(struct membuffer *b) { @@ -145,8 +140,59 @@ static int get_index(const char *line) static int get_hex(const char *line) { return strtoul(line, NULL, 16); } +/* this is in qthelper.cpp, so including the .h file is a pain */ +extern const char *printGPSCoords(int lat, int lon); + +static void parse_dive_gps(char *line, struct membuffer *str, void *_dive) +{ + uint32_t uuid; + degrees_t latitude = parse_degrees(line, &line); + degrees_t longitude = parse_degrees(line, &line); + struct dive *dive = _dive; + struct dive_site *ds = get_dive_site_for_dive(dive); + if (!ds) { + uuid = get_dive_site_uuid_by_gps(latitude, longitude, NULL); + if (!uuid) + uuid = create_dive_site_with_gps("", latitude, longitude); + dive->dive_site_uuid = uuid; + } else { + if (dive_site_has_gps_location(ds) && + (ds->latitude.udeg != latitude.udeg || ds->longitude.udeg != longitude.udeg)) { + // we have a dive site that already has GPS coordinates + ds->notes = add_to_string(ds->notes, translate("gettextFromC", "multiple gps locations for this dive site; also %s\n"), + printGPSCoords(latitude.udeg, longitude.udeg)); + } + ds->latitude = latitude; + ds->longitude = longitude; + } + +} + static void parse_dive_location(char *line, struct membuffer *str, void *_dive) -{ struct dive *dive = _dive; dive->location = get_utf8(str); } +{ + uint32_t uuid; + char *name = get_utf8(str); + struct dive *dive = _dive; + struct dive_site *ds = get_dive_site_for_dive(dive); + fprintf(stderr, "looking for a site named {%s} ", name); + if (!ds) { + uuid = get_dive_site_uuid_by_name(name, NULL); + if (!uuid) { fprintf(stderr, "found none, creating\n"); + uuid = create_dive_site(name); + } else { fprintf(stderr, "found one with uuid %8x\n", uuid); } + dive->dive_site_uuid = uuid; + } else { + // we already had a dive site linked to the dive + fprintf(stderr, "dive had site with uuid %8x and name {%s}\n", ds->uuid, ds->name); + if (same_string(ds->name, "")) { + ds->name = name; + } else { + // and that dive site had a name. that's weird - if our name is different, add it to the notes + if (!same_string(ds->name, name)) + ds->notes = add_to_string(ds->notes, translate("gettextFromC", "additional name for site: %s\n"), name); + } + } +} static void parse_dive_divemaster(char *line, struct membuffer *str, void *_dive) { struct dive *dive = _dive; dive->divemaster = get_utf8(str); } @@ -160,6 +206,9 @@ static void parse_dive_suit(char *line, struct membuffer *str, void *_dive) static void parse_dive_notes(char *line, struct membuffer *str, void *_dive) { struct dive *dive = _dive; dive->notes = get_utf8(str); } +static void parse_dive_divesiteid(char *line, struct membuffer *str, void *_dive) +{ struct dive *dive = _dive; dive->dive_site_uuid = get_hex(line); } + /* * We can have multiple tags in the membuffer. They are separated by * NUL bytes. @@ -205,6 +254,24 @@ static void parse_dive_visibility(char *line, struct membuffer *str, void *_dive static void parse_dive_notrip(char *line, struct membuffer *str, void *_dive) { struct dive *dive = _dive; dive->tripflag = NO_TRIP; } +static void parse_site_description(char *line, struct membuffer *str, void *_ds) +{ struct dive_site *ds = _ds; ds->description = strdup(mb_cstring(str)); } + +static void parse_site_name(char *line, struct membuffer *str, void *_ds) +{ struct dive_site *ds = _ds; ds->name = strdup(mb_cstring(str)); } + +static void parse_site_notes(char *line, struct membuffer *str, void *_ds) +{ struct dive_site *ds = _ds; ds->notes = strdup(mb_cstring(str)); } + +extern degrees_t parse_degrees(char *buf, char **end); +static void parse_site_gps(char *line, struct membuffer *str, void *_ds) +{ + struct dive_site *ds = _ds; + + ds->latitude = parse_degrees(line, &line); + ds->longitude = parse_degrees(line, &line); +} + /* Parse key=val parts of samples and cylinders etc */ static char *parse_keyvalue_entry(void (*fn)(void *, const char *, const char *), void *fndata, char *line) { @@ -672,7 +739,7 @@ static void parse_settings_userid(char *line, struct membuffer *str, void *_unus * *can* do some day. And if we do change the version, this warning will show if * you read with a version of subsurface that doesn't know about it. */ -#define VERSION 2 +#define VERSION 3 static void parse_settings_version(char *line, struct membuffer *str, void *_unused) { int version = atoi(line); @@ -761,6 +828,12 @@ static void parse_picture_gps(char *line, struct membuffer *str, void *_pic) pic->longitude = parse_degrees(line, &line); } +static void parse_picture_hash(char *line, struct membuffer *str, void *_pic) +{ + struct picture *pic = _pic; + pic->hash = get_utf8(str); +} + /* These need to be sorted! */ struct keyword_action dc_action[] = { #undef D @@ -783,7 +856,7 @@ static void divecomputer_parser(char *line, struct membuffer *str, void *_dc) struct keyword_action dive_action[] = { #undef D #define D(x) { #x, parse_dive_ ## x } - D(airtemp), D(buddy), D(cylinder), D(divemaster), D(duration), + D(airtemp), D(buddy), D(cylinder), D(divemaster), D(divesiteid), D(duration), D(gps), D(location), D(notes), D(notrip), D(rating), D(suit), D(tags), D(visibility), D(watertemp), D(weightsystem) }; @@ -794,6 +867,18 @@ static void dive_parser(char *line, struct membuffer *str, void *_dive) } /* These need to be sorted! */ +struct keyword_action site_action[] = { +#undef D +#define D(x) { #x, parse_site_ ## x } + D(description), D(gps), D(name), D(notes) +}; + +static void site_parser(char *line, struct membuffer *str, void *_ds) +{ + match_action(line, str, _ds, site_action, ARRAY_SIZE(site_action)); +} + +/* These need to be sorted! */ struct keyword_action trip_action[] = { #undef D #define D(x) { #x, parse_trip_ ## x } @@ -821,7 +906,7 @@ static void settings_parser(char *line, struct membuffer *str, void *_unused) static struct keyword_action picture_action[] = { #undef D #define D(x) { #x, parse_picture_ ## x } - D(filename), D(gps) + D(filename), D(gps), D(hash) }; static void picture_parser(char *line, struct membuffer *str, void *_pic) @@ -1190,6 +1275,9 @@ static int walk_tree_directory(const char *root, const git_tree_entry *entry) if (!strcmp(name, "Pictures")) return picture_directory(root, name); + if (!strcmp(name, "01-Divesites")) + return GIT_WALK_OK; + while (isdigit(c = name[digits])) digits++; @@ -1284,6 +1372,20 @@ static int parse_dive_entry(git_repository *repo, const git_tree_entry *entry, c return 0; } +static int parse_site_entry(git_repository *repo, const git_tree_entry *entry, const char *suffix) +{ + if (*suffix == '\0') + return report_error("Dive site without uuid"); + struct dive_site *ds = alloc_dive_site(); + ds->uuid = strtol(suffix, NULL, 16); + git_blob *blob = git_tree_entry_blob(repo, entry); + if (!blob) + return report_error("Unable to read dive site file"); + for_each_line(blob, site_parser, ds); + git_blob_free(blob); + return 0; +} + static int parse_trip_entry(git_repository *repo, const git_tree_entry *entry) { git_blob *blob = git_tree_entry_blob(repo, entry); @@ -1343,7 +1445,6 @@ static int walk_tree_file(const char *root, const git_tree_entry *entry, git_rep struct dive *dive = active_dive; dive_trip_t *trip = active_trip; const char *name = git_tree_entry_name(entry); - switch (*name) { /* Picture file? They are saved as time offsets in the dive */ case '-': case '+': @@ -1356,6 +1457,10 @@ static int walk_tree_file(const char *root, const git_tree_entry *entry, git_rep if (dive && !strncmp(name, "Dive", 4)) return parse_dive_entry(repo, entry, name+4); break; + case 'S': + if (!strncmp(name, "Site", 4)) + return parse_site_entry(repo, entry, name + 5); + break; case '0': if (trip && !strcmp(name, "00-Trip")) return parse_trip_entry(repo, entry); @@ -10,6 +10,7 @@ #include "subsurfacestartup.h" #include "qt-ui/mainwindow.h" #include "qt-ui/diveplanner.h" +#include "qt-ui/graphicsview-common.h" #include <QStringList> #include <git2.h> diff --git a/membuffer.c b/membuffer.c index c8a06662f..2889a0cdc 100644 --- a/membuffer.c +++ b/membuffer.c @@ -6,12 +6,18 @@ #include "dive.h" #include "membuffer.h" -void free_buffer(struct membuffer *b) +char *detach_buffer(struct membuffer *b) { - free(b->buffer); + char *result = b->buffer; b->buffer = NULL; b->len = 0; b->alloc = 0; + return result; +} + +void free_buffer(struct membuffer *b) +{ + free(detach_buffer(b)); } void flush_buffer(struct membuffer *b, FILE *f) @@ -100,6 +106,26 @@ void put_vformat(struct membuffer *b, const char *fmt, va_list args) } } +/* Silly helper using membuffer */ +char *vformat_string(const char *fmt, va_list args) +{ + struct membuffer mb = { 0 }; + put_vformat(&mb, fmt, args); + mb_cstring(&mb); + return detach_buffer(&mb); +} + +char *format_string(const char *fmt, ...) +{ + va_list args; + char *result; + + va_start(args, fmt); + result = vformat_string(fmt, args); + va_end(args); + return result; +} + void put_format(struct membuffer *b, const char *fmt, ...) { va_list args; @@ -228,3 +254,32 @@ void put_quoted(struct membuffer *b, const char *text, int is_attribute, int is_ text = p; } } + +char *add_to_string_va(const char *old, const char *fmt, va_list args) +{ + char *res; + struct membuffer o = { 0 }, n = { 0 }; + put_vformat(&n, fmt, args); + put_format(&o, "%s\n%s", old ?: "", mb_cstring(&n)); + res = strdup(mb_cstring(&o)); + free_buffer(&o); + free_buffer(&n); + free((void *)old); + return res; +} + +/* this is a convenience function that cleverly adds text to a string, using our membuffer + * infrastructure. + * WARNING - this will free(old), the intended pattern is + * string = add_to_string(string, fmt, ...) + */ +char *add_to_string(const char *old, const char *fmt, ...) +{ + char *res; + va_list args; + + va_start(args, fmt); + res = add_to_string_va(old, fmt, args); + va_end(args); + return res; +} diff --git a/membuffer.h b/membuffer.h index 153815fd8..434b34c71 100644 --- a/membuffer.h +++ b/membuffer.h @@ -18,6 +18,7 @@ struct membuffer { #define __printf(x, y) #endif +extern char *detach_buffer(struct membuffer *b); extern void free_buffer(struct membuffer *); extern void flush_buffer(struct membuffer *, FILE *); extern void put_bytes(struct membuffer *, const char *, int); @@ -27,6 +28,13 @@ extern void strip_mb(struct membuffer *); extern const char *mb_cstring(struct membuffer *); extern __printf(2, 0) void put_vformat(struct membuffer *, const char *, va_list); extern __printf(2, 3) void put_format(struct membuffer *, const char *fmt, ...); +extern __printf(2, 0) char *add_to_string_va(const char *old, const char *fmt, va_list args); +extern __printf(2, 3) char *add_to_string(const char *old, const char *fmt, ...); + +/* Helpers that use membuffers internally */ +extern __printf(1, 0) char *vformat_string(const char *, va_list); +extern __printf(1, 2) char *format_string(const char *, ...); + /* Output one of our "milli" values with type and pre/post data */ extern void put_milli(struct membuffer *, const char *, int, const char *); diff --git a/ostctools.c b/ostctools.c new file mode 100644 index 000000000..68b7da01f --- /dev/null +++ b/ostctools.c @@ -0,0 +1,159 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "dive.h" +#include "gettext.h" +#include "divelist.h" +#include "libdivecomputer.h" + +/* + * Returns a dc_descriptor_t structure based on dc model's number and family. + */ + +static dc_descriptor_t *ostc_get_data_descriptor(int data_model, dc_family_t data_fam) +{ + dc_descriptor_t *descriptor = NULL, *current = NULL;; + dc_iterator_t *iterator = NULL; + dc_status_t rc; + + rc = dc_descriptor_iterator(&iterator); + if (rc != DC_STATUS_SUCCESS) { + fprintf(stderr,"Error creating the device descriptor iterator.\n"); + return current; + } + while ((dc_iterator_next(iterator, &descriptor)) == DC_STATUS_SUCCESS) { + int desc_model = dc_descriptor_get_model(descriptor); + dc_family_t desc_fam = dc_descriptor_get_type(descriptor); + if (data_model == desc_model && data_fam == desc_fam) { + current = descriptor; + break; + } + dc_descriptor_free(descriptor); + } + dc_iterator_free(iterator); + return current; +} + +/* + * Fills a device_data_t structure with known dc data and a descriptor. + */ +static void ostc_prepare_data(int data_model, dc_family_t dc_fam, device_data_t *dev_data) +{ + device_data_t *ldc_dat = calloc(1, sizeof(device_data_t)); + dc_descriptor_t *data_descriptor; + + *ldc_dat = *dev_data; + ldc_dat->device = NULL; + ldc_dat->context = NULL; + + data_descriptor = ostc_get_data_descriptor(data_model, dc_fam); + if (data_descriptor) { + ldc_dat->descriptor = data_descriptor; + ldc_dat->vendor = copy_string(data_descriptor->vendor); + ldc_dat->model = copy_string(data_descriptor->product); + *dev_data = *ldc_dat; + } + free(ldc_dat); +} + +/* + * OSTCTools stores the raw dive data in heavily padded files, one dive + * each file. So it's not necesary to iterate once and again on a parsing + * function. Actually there's only one kind of archive for every DC model. + */ +void ostctools_import(const char *file, struct dive_table *divetable) +{ + FILE *archive; + device_data_t *devdata = calloc(1, sizeof(device_data_t)); + dc_family_t dc_fam; + unsigned char *buffer = calloc(65536, 1), + *tmp; + struct dive *ostcdive = alloc_dive(); + dc_status_t rc = 0; + int model = 0, i = 0; + unsigned int serial; + struct extra_data *ptr; + + // Open the archive + if ((archive = subsurface_fopen(file, "rb")) == NULL) { + report_error(translate("gettextFromC", "Error: couldn't open the file")); + free(devdata); + free(buffer); + free(ostcdive); + return; + } + + // Read dive number from the log + tmp = calloc(2,1); + fseek(archive, 258, 0); + fread(tmp, 1, 2, archive); + ostcdive->number = tmp[0] + (tmp[1] << 8); + free(tmp); + + // Read device's serial number + tmp = calloc(2, 1); + fseek(archive, 265, 0); + fread(tmp, 1, 2, archive); + serial = tmp[0] + (tmp[1] << 8); + free(tmp); + + // Read dive's raw data, header + profile + fseek(archive, 456, 0); + while (!feof(archive)) { + fread(buffer+i, 1, 1, archive); + if (buffer[i] == 0xFD && buffer[i-1] == 0xFD) + break; + i++; + } + + // Try to determine the dc family based on the header type + switch (buffer[2]) { + case 0x20: + case 0x21: + dc_fam = DC_FAMILY_HW_OSTC; + break; + case 0x22: + dc_fam = DC_FAMILY_HW_FROG; + break; + case 0x23: + dc_fam = DC_FAMILY_HW_OSTC3; + break; + } + + // Prepare data to pass to libdivecomputer. OSTC protocol doesn't include + // a model number so will use 0. + ostc_prepare_data(model, dc_fam, devdata); + tmp = calloc(strlen(devdata->vendor)+strlen(devdata->model)+28,1); + sprintf(tmp,"%s %s (Imported from OSTCTools)", devdata->vendor, devdata->model); + ostcdive->dc.model = copy_string(tmp); + free(tmp); + + // Parse the dive data + rc = libdc_buffer_parser(ostcdive, devdata, buffer, i+1); + if (rc != DC_STATUS_SUCCESS) + report_error("Libdc returned error -%s- for dive %d", errmsg(rc), ostcdive->number); + + // Serial number is not part of the header nor the profile, so libdc won't + // catch it. If Serial is part of the extra_data, and set to zero, remove + // it from the list and add again. + tmp = calloc(12,1); + sprintf(tmp, "%d", serial); + ostcdive->dc.serial = copy_string(tmp); + free(tmp); + + ptr = ostcdive->dc.extra_data; + while (strcmp(ptr->key, "Serial")) + ptr = ptr->next; + if (!strcmp(ptr->value, "0")) { + add_extra_data(&ostcdive->dc, "Serial", ostcdive->dc.serial); + *ptr = *(ptr)->next; + } + + free(devdata); + free(buffer); + record_dive_to_table(ostcdive, divetable); + mark_divelist_changed(true); + sort_table(divetable); + fclose(archive); +} diff --git a/packaging/OBS/subsurfacedaily.spec b/packaging/OBS/subsurfacedaily.spec index ad6783ed7..b39149c65 100644 --- a/packaging/OBS/subsurfacedaily.spec +++ b/packaging/OBS/subsurfacedaily.spec @@ -4,21 +4,16 @@ # Copyright (c) 2014 Dirk Hohndel # -%define latestVersion 4.3 - - -%define gitVersion 155 - - +%define latestVersion 4.4.1.363 Name: subsurfacedaily -Version: %latestVersion.%gitVersion +Version: %latestVersion Release: 0 License: GPL v2 Summary: Open source dive log Url: http://subsurface-divelog.org Group: Productivity/Other -Source: subsurfacedaily-%latestVersion.%gitVersion.orig.tar.xz +Source: subsurface-%latestVersion.orig.tar.xz Conflicts: subsurface BuildRequires: desktop-file-utils BuildRequires: fdupes @@ -36,9 +31,8 @@ BuildRequires: kde4-filesystem BuildRequires: libzip-devel BuildRequires: libxml2-devel BuildRequires: libxslt-devel -BuildRequires: libgit2-devel -# for libgit2 %if 0%{?fedora_version} || 0%{?rhel_version} || 0%{?centos_version} +BuildRequires: netpbm-devel BuildRequires: openssl-devel BuildRequires: libsqlite3x-devel BuildRequires: libusbx-devel @@ -60,6 +54,7 @@ BuildRequires: sqlite3-devel BuildRequires: libusb-1_0-devel BuildRequires: libqt5-qtbase-devel BuildRequires: libqt5-qtsvg-devel +BuildRequires: libqt5-linguist BuildRequires: libqt5-linguist-devel BuildRequires: libqt5-qttools-devel BuildRequires: libQt5WebKit5-devel @@ -67,6 +62,13 @@ BuildRequires: libQt5WebKitWidgets-devel BuildRequires: libqt5-qtscript-devel BuildRequires: libqt5-qtdeclarative-devel %endif +# Recommends Qt5 translations package +%if 0%{?suse_version} +Recommends: libqt5-qttranslations +%endif +%if 0%{?fedora_version} >= 21 +Recommends: qt5-qttranslations +%endif BuildRoot: %{_tmppath}/subsurface%{version}-build %description @@ -77,6 +79,7 @@ This is the official Subsurface build, including our own custom libdivecomputer %build (cd libdivecomputer ; autoreconf --install ; ./configure --disable-shared ; make %{?_smp_mflags} ) +(cd libgit2; mkdir build; cd build; cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_CLAR=OFF .. ; make ) (mkdir marble-build ; cd marble-build ; \ cmake -DQTONLY=ON -DQT5BUILD=ON \ -DBUILD_MARBLE_APPS=OFF -DBUILD_MARBLE_EXAMPLES=OFF \ @@ -84,14 +87,22 @@ This is the official Subsurface build, including our own custom libdivecomputer -DBUILD_TESTING=OFF -DWITH_DESIGNER_PLUGIN=OFF \ -DBUILD_WITH_DBUS=OFF ../marble-source ; \ make %{?_smp_mflags} ; \ + ln -s src/lib/marble lib ; \ mkdir include ; cd include ; for i in `find ../../marble-source -name \*.h` ; do ln -s -f $i . ; done ; \ ln -s -f . marble ) -qmake-qt5 LIBDCDEVEL=./libdivecomputer LIBMARBLEDEVEL=./marble-build SPECIAL_MARBLE_PREFIX=1 subsurface.pro -make %{?_smp_mflags} +(mkdir subsurface-build ; cd subsurface-build ; \ + cmake -DCMAKE_BUILD_TYPE=Release \ + -DLIBDCDEVEL=$(pwd)/../libdivecomputer -DLIBDCSTATIC=1 \ + -DLIBGIT2DEVEL=$(pwd)/../libgit2 -DLIBGIT2STATIC=1 \ + -DLIBMARBLEDEVEL=$(pwd)/../marble-build \ + -DLRELEASE=lrelease-qt5 \ + -DCMAKE_INSTALL_PREFIX=%{buildroot}/usr \ + $(pwd)/.. ; \ + make VERBOSE=1 %{?_smp_mflags} subsurface) %install mkdir -p %{buildroot}/%{_libdir} -make prefix=%{buildroot}/usr install +(cd subsurface-build ; make VERBOSE=1 install ) %if 0%{?fedora_version} || 0%{?rhel_version} || 0%{?centos_version} desktop-file-install --dir=%{buildroot}/%{_datadir}/applications subsurface.desktop %else @@ -114,7 +125,6 @@ desktop-file-install --dir=%{buildroot}/%{_datadir}/applications subsurface.desk %{_datadir}/applications/subsurface.desktop %{_datadir}/icons/hicolor/*/apps/subsurface-icon.* %{_datadir}/subsurface/ -%{_mandir}/man1/subsurface.1%{?ext_man} /usr/lib*/libssrfmarblewidget.so* %changelog diff --git a/packaging/android/.gitignore b/packaging/android/.gitignore new file mode 100644 index 000000000..d25632a41 --- /dev/null +++ b/packaging/android/.gitignore @@ -0,0 +1,9 @@ +*.tar.* +*-build-*/ +libusb-*/ +libxml2-*/ +libxslt-*/ +libzip-*/ +libgit2-*/ +ndk-*/ +sqlite-autoconf-*/ diff --git a/packaging/android/README b/packaging/android/README new file mode 100644 index 000000000..7168fc1c1 --- /dev/null +++ b/packaging/android/README @@ -0,0 +1,41 @@ +Tool repo to crosscompile subsurface to android-arm +--------------------------------------------------- + +Dependencies: + +1. android_sdk, android_ndk and Qt5.4. See step 0. +2. cmake +3. ant +4. Java JDK +5. working adb is recommended +6. dependencies of libdivecomputer and subsurface - + visit http://subsurface.hohndel.org/documentation/building/ + +Steps to install: + +Step 0. +Grab.. +Android ndk from: http://developer.android.com/tools/sdk/ndk/index.html +Android sdk from: http://developer.android.com/sdk/index.html#download +And QT for android from: http://qt-project.org/downloads + +Step 1. +Extract and install these into known directories. +Have a look in the top of build.sh for where the cross build tool expects +them. By default thats is: ../../../android-ndk-r9d ../../../android-sdk-linux +and ../../../Qt/5.4 + +Step 2. +Run bash build.sh in the terminal. By default it builds for arm but you +can pass x86 as first arg to build.sh to have it build for x86. Nice when +debugging in a fast emulator. +The script will download and build the whole dependency chain. + +After this, subsurface will be built for android. + +The output folder is subsurface-build-arm/android_build and your newly +created apk shows up as: +subsurface-build-arm/android_build/bin/QtApp-debug.apk + +Where the x86 apk shows up when built for x86 is left as a exercise for the +reader. diff --git a/packaging/android/build.sh b/packaging/android/build.sh new file mode 100644 index 000000000..fa029e5e0 --- /dev/null +++ b/packaging/android/build.sh @@ -0,0 +1,164 @@ +#!/bin/bash +set -e + +# Configure where we can find things here +export ANDROID_NDK_ROOT=$PWD/../../../android-ndk-r10d +export ANDROID_SDK_ROOT=$PWD/../../../android-sdk-linux +export QT5_ANDROID=$PWD/../../../Qt/5.4 +export ANDROID_NDK_HOST=linux-x86 + +# Which versions are we building against? +SQLITE_VERSION=3080704 +LIBXML2_VERSION=2.9.2 +LIBXSLT_VERSION=1.1.28 +LIBZIP_VERSION=0.11.2 +LIBGIT2_VERSION=0.21.2 +LIBUSB_VERSION=1.0.19 + +# arm or x86 +export ARCH=${1-arm} + +if [ "$ARCH" = "arm" ] ; then + QT_ARCH="armv7" + BUILDCHAIN=arm-linux-androideabi +elif [ "$ARCH" = "x86" ] ; then + QT_ARCH=$ARCH + BUILDCHAIN=i686-linux-android +fi +export QT5_ANDROID_BIN=${QT5_ANDROID}/android_${QT_ARCH}/bin + +if [ ! -e ndk-$ARCH ] ; then + $ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --arch=$ARCH --install-dir=ndk-$ARCH --platform=android-14 +fi +export BUILDROOT=$PWD +export PATH=${BUILDROOT}/ndk-$ARCH/bin:$PATH +export PREFIX=${BUILDROOT}/ndk-$ARCH/sysroot/usr +export PKG_CONFIG_LIBDIR=${PREFIX}/lib/pkgconfig +export CC=${BUILDCHAIN}-gcc +export CXX=${BUILDCHAIN}-g++ + +if [ ! -e sqlite-autoconf-${SQLITE_VERSION}.tar.gz ] ; then + wget http://www.sqlite.org/2014/sqlite-autoconf-${SQLITE_VERSION}.tar.gz +fi +if [ ! -e sqlite-autoconf-${SQLITE_VERSION} ] ; then + tar -zxf sqlite-autoconf-${SQLITE_VERSION}.tar.gz +fi +if [ ! -e $PKG_CONFIG_LIBDIR/sqlite3.pc ] ; then + mkdir -p sqlite-build-$ARCH + pushd sqlite-build-$ARCH + ../sqlite-autoconf-${SQLITE_VERSION}/configure --host=${BUILDCHAIN} --prefix=${PREFIX} --enable-static --disable-shared + make -j4 + make install + popd +fi + +if [ ! -e libxml2-${LIBXML2_VERSION}.tar.gz ] ; then + wget ftp://xmlsoft.org/libxml2/libxml2-${LIBXML2_VERSION}.tar.gz +fi +if [ ! -e libxml2-${LIBXML2_VERSION} ] ; then + tar -zxf libxml2-${LIBXML2_VERSION}.tar.gz +fi +if [ ! -e $PKG_CONFIG_LIBDIR/libxml-2.0.pc ] ; then + mkdir -p libxml2-build-$ARCH + pushd libxml2-build-$ARCH + ../libxml2-${LIBXML2_VERSION}/configure --host=${BUILDCHAIN} --prefix=${PREFIX} --without-python --without-iconv --enable-static --disable-shared + perl -pi -e 's/runtest\$\(EXEEXT\)//' Makefile + perl -pi -e 's/testrecurse\$\(EXEEXT\)//' Makefile + make -j4 + make install + popd +fi + +if [ ! -e libxslt-${LIBXSLT_VERSION}.tar.gz ] ; then + wget ftp://xmlsoft.org/libxml2/libxslt-${LIBXSLT_VERSION}.tar.gz +fi +if [ ! -e libxslt-${LIBXSLT_VERSION} ] ; then + tar -zxf libxslt-${LIBXSLT_VERSION}.tar.gz + # libxslt have too old config.sub for android + cp libxml2-${LIBXML2_VERSION}/config.sub libxslt-${LIBXSLT_VERSION} +fi +if [ ! -e $PKG_CONFIG_LIBDIR/libxslt.pc ] ; then + mkdir -p libxslt-build-$ARCH + pushd libxslt-build-$ARCH + ../libxslt-${LIBXSLT_VERSION}/configure --host=${BUILDCHAIN} --prefix=${PREFIX} --with-libxml-prefix=${PREFIX} --without-python --without-crypto --enable-static --disable-shared + make + make install + popd +fi + +if [ ! -e libzip-${LIBZIP_VERSION}.tar.gz ] ; then + wget http://www.nih.at/libzip/libzip-${LIBZIP_VERSION}.tar.gz +fi +if [ ! -e libzip-${LIBZIP_VERSION} ] ; then + tar -zxf libzip-${LIBZIP_VERSION}.tar.gz +fi +if [ ! -e $PKG_CONFIG_LIBDIR/libzip.pc ] ; then + mkdir -p libzip-build-$ARCH + pushd libzip-build-$ARCH + ../libzip-${LIBZIP_VERSION}/configure --host=${BUILDCHAIN} --prefix=${PREFIX} --enable-static --disable-shared + make + make install + popd +fi + +if [ ! -e libgit2-${LIBGIT2_VERSION}.tar.gz ] ; then + wget -O libgit2-${LIBGIT2_VERSION}.tar.gz https://github.com/libgit2/libgit2/archive/v${LIBGIT2_VERSION}.tar.gz +fi +if [ ! -e libgit2-${LIBGIT2_VERSION} ] ; then + tar -zxf libgit2-${LIBGIT2_VERSION}.tar.gz +fi +if [ ! -e $PKG_CONFIG_LIBDIR/libgit2.pc ] ; then + mkdir -p libgit2-build-$ARCH + pushd libgit2-build-$ARCH + # -DCMAKE_CXX_COMPILER=arm-linux-androideabi-g++ + cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_VERSION=Android -DCMAKE_C_COMPILER=${CC} -DCMAKE_FIND_ROOT_PATH=${PREFIX} -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY -DANDROID=ON -DSHA1_TYPE=builtin -DBUILD_CLAR=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=${PREFIX} ../libgit2-${LIBGIT2_VERSION}/ + make + make install + # Patch away pkg-config dependency to zlib, its there, i promise + perl -pi -e 's/^(Requires.private:.*)zlib(.*)$/$1 $2/' $PKG_CONFIG_LIBDIR/libgit2.pc + popd +fi + +if [ ! -e libusb-${LIBUSB_VERSION}.tar.gz ] ; then + wget -O libusb-${LIBUSB_VERSION}.tar.gz https://github.com/libusb/libusb/archive/v${LIBUSB_VERSION}.tar.gz +fi +if [ ! -e libusb-${LIBUSB_VERSION} ] ; then + tar -zxf libusb-${LIBUSB_VERSION}.tar.gz +fi +if [ ! -e libusb-${LIBUSB_VERSION}/configure ] ; then + pushd libusb-${LIBUSB_VERSION} + mkdir m4 + autoreconf -i + popd +fi +if [ ! -e $PKG_CONFIG_LIBDIR/libusb-1.0.pc ] ; then + mkdir -p libusb-build-$ARCH + pushd libusb-build-$ARCH + ../libusb-${LIBUSB_VERSION}/configure --host=${BUILDCHAIN} --prefix=${PREFIX} --enable-static --disable-shared --disable-udev + make + make install + popd + # Patch libusb-1.0.pc due to bug in there + # Fix comming in 1.0.20 + sed -ie 's/Libs.private: -c/Libs.private: /' $PKG_CONFIG_LIBDIR/libusb-1.0.pc +fi + +if [ ! -e $PKG_CONFIG_LIBDIR/libdivecomputer.pc ] ; then + mkdir -p libdivecomputer-build-$ARCH + pushd libdivecomputer-build-$ARCH + ../../../../libdivecomputer/configure --host=${BUILDCHAIN} --prefix=${PREFIX} --enable-static --disable-shared + make + make install + popd +fi + +mkdir -p subsurface-build-$ARCH +cd subsurface-build-$ARCH +if [ ! -e Makefile ] ; then + $QT5_ANDROID_BIN/qmake V=1 QT_CONFIG=+pkg-config ../../../ +fi +make -j4 +make install INSTALL_ROOT=android_build +# bug in androiddeployqt? why is it looking for something with the builddir in it? +ln -fs android-libsubsurface.so-deployment-settings.json android-libsubsurface-build-${ARCH}.so-deployment-settings.json +$QT5_ANDROID_BIN/androiddeployqt --output android_build diff --git a/packaging/macosx/README b/packaging/macosx/README deleted file mode 100644 index b996413c5..000000000 --- a/packaging/macosx/README +++ /dev/null @@ -1,77 +0,0 @@ -Creating a Subsurface bundle -============================ - -(we now have a small shell script that should automate this process; - look for make-package.sh) - -After you build Subsurface and install it on your Mac - -make install-macosx - -you need gtk-mac-bundler (this has been tested with version 0.7.3); run - - $ gtk-mac-bundler subsurface.bundle - -This should install an almost self-contained Subsurface application under -./staging/Subsurface.app - -Sadly because of the way gettext accesses the gtk20.mo file, this fails -for localized use - so I ended up building MacPorts with --prefix /Applications/Subsurface.app/Contents/Resources -And then things work correctly IFF the app gets installed with that path. - -What a pain. - -Worse, gtk-mac-bundler fails to catch the .so files that are part of the -gdk-pixbuf loader infrastructure. So we need to manually adjust the load -paths in them: - -cd packaging/macosx/staging/Subsurface.app/Contents -for i in Resources/lib/gdk-pixbuf-2.0/2.10.0/loaders/* ; do \ - ~/gtk-mac-bundler/bundler/run-install-name-tool-change.sh $i \ - /Applications/Subsurface.app/Contents/Resources Resources change ; \ -done - -Finally, you need to change the IDs of the libraries: - -for i in Resources/lib/*.dylib; do install_name_tool -id "@executable_path/../$i" $i; done - -Next you should sign your binaries if you plan to use them 10.8 (or later). - -Then you can use git://github.com/dirkhh/yoursway-create-dmg.git to create -a DMG (use the readlink-fix branch - unless this has been pulled into the -main project by the time you read this). - -Here is roughly how I run this to create the official DMG - -~/yoursway-create-dmg/create-dmg --background ./Subsurface-Background.png \ - --window-size 500 300 --icon-size 96 \ - --volname "Subsurface-${VERSION}" --app-drop-link 380 205 \ - --volicon ~/subsurface/packaging/macosx/Subsurface.icns \ - --icon "Subsurface" 110 205 ./Subsurface-${VERSION}.dmg ./staging - -The --volicon doesn't appear to work for me even though it does create the -correct file in the DMG. I'm leaving it in here to remind me to -investigate this issue. - -Caveats -------- - -* You need (at least with MacPorts) to build pango like this: - - $ sudo port install pango +builtin_modules +no_x11 +quartz - -Without the builtin modules the installed application fails to find the -modules and doesn't render any text. - -Also note the comment above about the -prefix - -* It seems that gtk-mac-bundler expects the charset.alias file to be - in the ${prefix}/lib folder which it isn't with the current version of - MacPorts. The following fixes that: - - $ sudo cp /usr/lib/charset.alias /opt/local/lib - -* libdivecomputer needs to be configured with - --with-prefix=/Applications/Subsurface.app/Contents/Resources - as well. diff --git a/packaging/macosx/make-package.sh b/packaging/macosx/make-package.sh index e820b1588..c4dc71b2e 100755 --- a/packaging/macosx/make-package.sh +++ b/packaging/macosx/make-package.sh @@ -16,29 +16,30 @@ DMGCREATE=../yoursway-create-dmg/create-dmg # for the naming of volume and dmg we don't need the "always 3 digits" # darwin version - the 'regular' version that has 2 digits for releases # is better -VERSION=$(./scripts/get-version linux) +VERSION=$(cd ../subsurface; ./scripts/get-version linux) # first build and install Subsurface and then clean up the staging area rm -rf ./Subsurface.app make -j8 -make mac-deploy +make install install_name_tool -change /Users/hohndel/src/marble/install/libssrfmarblewidget.0.19.2.dylib @executable_path/../Frameworks/libssrfmarblewidget.0.19.2.dylib Subsurface.app/Contents/MacOS/Subsurface +install_name_tool -change /Users/hohndel/src/libgit2/build/libgit2.22.dylib @executable_path/../Frameworks/libgit2.22.dylib Subsurface.app/Contents/MacOS/Subsurface # copy things into staging so we can create a nice DMG rm -rf ./staging mkdir ./staging cp -a ./Subsurface.app ./staging -sh ./packaging/macosx/sign +sh ../subsurface/packaging/macosx/sign if [ -f ./Subsurface-$VERSION.dmg ]; then rm ./Subsurface-$VERSION.dmg.bak mv ./Subsurface-$VERSION.dmg ./Subsurface-$VERSION.dmg.bak fi -$DMGCREATE --background ./packaging/macosx/DMG-Background.png \ +$DMGCREATE --background ../subsurface/packaging/macosx/DMG-Background.png \ --window-size 500 300 --icon-size 96 --volname Subsurface-$VERSION \ --app-drop-link 380 205 \ - --volicon ~/src/subsurface/packaging/macosx/Subsurface.icns \ + --volicon ../subsurface/packaging/macosx/Subsurface.icns \ --icon "Subsurface" 110 205 ./Subsurface-$VERSION.dmg ./staging diff --git a/packaging/ubuntu/0001-Make-build-with-Qt4.patch b/packaging/ubuntu/0001-Make-build-with-Qt4.patch index 6220f61f3..a1e44fe0c 100644 --- a/packaging/ubuntu/0001-Make-build-with-Qt4.patch +++ b/packaging/ubuntu/0001-Make-build-with-Qt4.patch @@ -1,19 +1,33 @@ -From a5da35bf6fea4424d387ec5d1f94f520834ef77b Mon Sep 17 00:00:00 2001 +From 936f3bab5be5d6c7d8da0a2d2d7e9da42bcd96c1 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel <dirk@hohndel.org> -Date: Tue, 17 Feb 2015 13:23:33 -0800 +Date: Thu, 19 Feb 2015 21:51:22 -0800 Subject: [PATCH] Make build with Qt4 This is just a best effort patch - Qt4 is no longer officially supported Signed-off-by: Dirk Hohndel <dirk@hohndel.org> --- + helpers.h | 1 + qt-ui/divelogexportdialog.cpp | 7 ++++++- qt-ui/divelogexportdialog.h | 4 ++++ qt-ui/divelogimportdialog.cpp | 34 ++++++++++++++++++++++++++++++++++ qt-ui/downloadfromdivecomputer.cpp | 12 ++++++++++++ qt-ui/plannerSettings.ui | 4 ++-- - 5 files changed, 58 insertions(+), 3 deletions(-) + qthelper.cpp | 10 ++++++++++ + 7 files changed, 69 insertions(+), 3 deletions(-) +diff --git a/helpers.h b/helpers.h +index 885b73e58235..64fdc9ed5d27 100644 +--- a/helpers.h ++++ b/helpers.h +@@ -8,6 +8,7 @@ + #define HELPERS_H + + #include <QString> ++#include <QPair> + #include "dive.h" + #include "qthelper.h" + diff --git a/qt-ui/divelogexportdialog.cpp b/qt-ui/divelogexportdialog.cpp index 43c41550f145..8c6d2899f0f0 100644 --- a/qt-ui/divelogexportdialog.cpp @@ -66,10 +80,10 @@ index 14f8f453980f..524416414a8e 100644 void showExplanation(); void exportHtmlInit(const QString &filename); diff --git a/qt-ui/divelogimportdialog.cpp b/qt-ui/divelogimportdialog.cpp -index bb4701ce36d3..4b9c8f8c0740 100644 +index ce12ef7ec34b..f4e43ef9068f 100644 --- a/qt-ui/divelogimportdialog.cpp +++ b/qt-ui/divelogimportdialog.cpp -@@ -376,14 +376,22 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) +@@ -377,14 +377,22 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) seabear = true; firstLine = "Sample time;Sample depth;Sample NDL;Sample TTS;Sample stopdepth;Sample temperature;Sample pressure"; blockSignals(true); @@ -92,7 +106,7 @@ index bb4701ce36d3..4b9c8f8c0740 100644 blockSignals(false); } -@@ -392,9 +400,17 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) +@@ -393,9 +401,17 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) apd=true; firstLine = "Sample time\tSample depth\t\t\t\t\tSample pOâ‚‚\t\t\t\t\t\t\t\t\tSample temperature\t\tSample CNS\tSample stopdepth"; blockSignals(true); @@ -110,7 +124,7 @@ index bb4701ce36d3..4b9c8f8c0740 100644 blockSignals(false); } -@@ -413,7 +429,16 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) +@@ -414,7 +430,16 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) separator = ";"; if (ui->CSVSeparator->currentText() != separator) { blockSignals(true); @@ -127,7 +141,7 @@ index bb4701ce36d3..4b9c8f8c0740 100644 blockSignals(false); currColumns = firstLine.split(separator); } -@@ -464,7 +489,16 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) +@@ -465,7 +490,16 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) if (ui->CSVSeparator->currentText() != separator || separator == "Tab") { ui->CSVSeparator->blockSignals(true); @@ -145,10 +159,10 @@ index bb4701ce36d3..4b9c8f8c0740 100644 if (separator == "Tab") separator = "\t"; diff --git a/qt-ui/downloadfromdivecomputer.cpp b/qt-ui/downloadfromdivecomputer.cpp -index cd3dd90d0cc2..e5ddab840b03 100644 +index c57aa1ef2c00..4e5b27c6b21f 100644 --- a/qt-ui/downloadfromdivecomputer.cpp +++ b/qt-ui/downloadfromdivecomputer.cpp -@@ -600,19 +600,31 @@ QVariant DiveImportedModel::data(const QModelIndex &index, int role) const +@@ -602,19 +602,31 @@ QVariant DiveImportedModel::data(const QModelIndex &index, int role) const void DiveImportedModel::changeSelected(QModelIndex clickedIndex) { checkStates[clickedIndex.row()] = !checkStates[clickedIndex.row()]; @@ -181,7 +195,7 @@ index cd3dd90d0cc2..e5ddab840b03 100644 Qt::ItemFlags DiveImportedModel::flags(const QModelIndex &index) const diff --git a/qt-ui/plannerSettings.ui b/qt-ui/plannerSettings.ui -index af03fd1fbfb9..aaf99750e26f 100644 +index 440fb534a6b5..89ffc89e1c38 100644 --- a/qt-ui/plannerSettings.ui +++ b/qt-ui/plannerSettings.ui @@ -338,8 +338,8 @@ @@ -195,6 +209,60 @@ index af03fd1fbfb9..aaf99750e26f 100644 </property> <property name="maxVisibleItems"> <number>6</number> +diff --git a/qthelper.cpp b/qthelper.cpp +index b26bdf467dec..1981571b2007 100644 +--- a/qthelper.cpp ++++ b/qthelper.cpp +@@ -12,6 +12,7 @@ + #include <QDir> + #include <QDebug> + #include <QSettings> ++#if QT_VERSION >= 0x050000 + #include <QStandardPaths> + #include <QJsonDocument> + #include <QJsonArray> +@@ -21,6 +22,9 @@ + #include <QNetworkAccessManager> + #include <QUrlQuery> + #include <QEventLoop> ++#else ++#include <QDesktopServices> ++#endif + + #include <libxslt/documents.h> + +@@ -304,6 +308,7 @@ extern "C" const char *system_default_directory(void) + static char filename[PATH_MAX]; + + if (!*filename) { ++#if QT_VERSION >= 0x050000 + enum QStandardPaths::StandardLocation location; + #if QT_VERSION >= 0x050400 + location = QStandardPaths::AppDataLocation; +@@ -311,6 +316,9 @@ extern "C" const char *system_default_directory(void) + location = QStandardPaths::DataLocation; + #endif + QString name = QStandardPaths::standardLocations(location).first(); ++#else ++ QString name = QDesktopServices::storageLocation(QDesktopServices::DataLocation); ++#endif + QDir dir(name); + dir.mkpath(name); + // Why no "dir.encodeName()"? Crazy Qt +@@ -379,6 +387,7 @@ void selectedDivesGasUsed(QVector<QPair<QString, int> > &gasUsedOrdered) + + extern "C" void reverseGeoLookup(degrees_t latitude, degrees_t longitude, uint32_t uuid) + { ++#if QT_VERSION >= 0x050000 + QNetworkRequest request; + QNetworkAccessManager *rgl = new QNetworkAccessManager(); + request.setUrl(QString("http://open.mapquestapi.com/nominatim/v1/reverse.php?format=json&accept-language=%1&lat=%2&lon=%3") +@@ -400,4 +409,5 @@ extern "C" void reverseGeoLookup(degrees_t latitude, degrees_t longitude, uint32 + struct dive_site *ds = get_dive_site_by_uuid(uuid); + ds->notes = add_to_string(ds->notes, "countrytag: %s", address.value("country").toString().toUtf8().data()); + } ++#endif + } -- 1.8.0.rc0.18.gf84667d diff --git a/packaging/ubuntu/debian/copyright b/packaging/ubuntu/debian/copyright index 75e69b368..f8f20b50e 100644 --- a/packaging/ubuntu/debian/copyright +++ b/packaging/ubuntu/debian/copyright @@ -7,8 +7,8 @@ Copyright: 2011-2014 Dirk Hohndel, Linus Torvalds, Tomaz Canabrava and others License: GPL-2.0 Files: debian/* -Copyright: 2014 Dirk Hohndel <dirk@hohndel.org> -License: GPL-2.0 +Copyright: 2012 Khalid El Fathi <khalid@elfathi.fr>, 2013-2014 Sylvestre Ledru <sylvestre@debian.org>, 2014-2015 Dirk Hohndel <dirk@hohndel.org> +License: GPL-2.0+ License: GPL-2.0 This package is free software; you can redistribute it and/or modify diff --git a/packaging/ubuntu/debian/rules b/packaging/ubuntu/debian/rules index ef197521c..e1ad26a3d 100755 --- a/packaging/ubuntu/debian/rules +++ b/packaging/ubuntu/debian/rules @@ -3,10 +3,11 @@ # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 - +export DEB_BUILD_OPTIONS+=nocheck +export DEB_CMAKE_INSTALL_PREFIX=/usr %: - dh $@ + dh $@ --buildsystem=cmake --builddirectory=subsurface-build --parallel override_dh_auto_clean: (cd libdivecomputer ; make clean || true) @@ -32,7 +33,16 @@ override_dh_auto_configure: ln -s src/lib/marble lib ; \ mkdir include ; cd include ; for i in `find ../../marble-source -name \*.h` ; do ln -s $$i . ; done ; \ ln -s . marble ) - qmake LIBDCDEVEL=./libdivecomputer LIBGIT2DEVEL=./libgit2 LIBGIT2STATIC=1 LIBMARBLEDEVEL=./marble-build SPECIAL_MARBLE_PREFIX=1 subsurface.pro + (mkdir subsurface-build ; cd subsurface-build ; \ + cmake -DCMAKE_BUILD_TYPE=Release \ + -DPREFER_GIT_FROMSOURCE=1 \ + -DLIBGIT2_INCLUDE_DIR=$$(pwd)/../libgit2/include \ + -DLIBGIT2_LIBRARIES=$$(pwd)/../libgit2/build/libgit2.a \ + -DLIBDIVECOMPUTER_INCLUDE_DIR=$$(pwd)/../libdivecomputer/include \ + -DLIBDIVECOMPUTER_LIBRARIES=$$(pwd)/../libdivecomputer/src/.libs/libdivecomputer.a \ + -DMARBLE_INCLUDE_DIR=$$(pwd)/../marble-build/include \ + -DMARBLE_LIBRARIES=$$(pwd)/../marble-build/lib/libssrfmarblewidget.so \ + $$(pwd)/.. ; ) override_dh_installchangelogs: dh_installchangelogs diff --git a/packaging/ubuntu/make-package.sh b/packaging/ubuntu/make-package.sh index 6063e1b50..15e59a001 100644 --- a/packaging/ubuntu/make-package.sh +++ b/packaging/ubuntu/make-package.sh @@ -1,5 +1,12 @@ #!/bin/bash # start from the directory above the combined subsurface & subsurface/libdivecomputer directory +# +# in order to be able to make changes to the debian/* files without changing the source +# this script assumes that the debian/* files plus a separate debian.changelog are in +# this directory as well - this makes testing builds on launchpad easier +# for most people all it should take is to run +# cp -a packaging/ubuntu/debian . +# if [[ $(pwd | grep "subsurface$") || ! -d subsurface || ! -d subsurface/libdivecomputer || ! -d subsurface/libgit2 ]] ; then echo "Please start this script from the folder ABOVE the subsurface source directory" echo "which includes libdivecomputer and libgit2 as subdirectories)." @@ -15,55 +22,50 @@ LIBDCREVISION=$(cd subsurface/libdivecomputer ; git rev-parse --verify HEAD) # echo "building Subsurface" $VERSION "with libdivecomputer" $LIBDCREVISION # -if [[ -d subsurface_$VERSION ]]; then - rm -rf subsurface_$VERSION.bak.prev - mv subsurface_$VERSION.bak subsurface_$VERSION.bak.prev - mv subsurface_$VERSION subsurface_$VERSION.bak -fi -mkdir subsurface_$VERSION -if [[ "x$GITREVISION" != "x" ]] ; then - rm -f subsurfacedaily-$VERSION - ln -s subsurface_$VERSION subsurfacedaily-$VERSION -else - rm -f subsurfacebeta-$VERSION - ln -s subsurface_$VERSION subsurfacebeta-$VERSION -fi +if [[ ! -d subsurface_$VERSION ]]; then + mkdir subsurface_$VERSION + if [[ "x$GITREVISION" != "x" ]] ; then + rm -f subsurfacedaily-$VERSION + ln -s subsurface_$VERSION subsurfacedaily-$VERSION + else + rm -f subsurfacebeta-$VERSION + ln -s subsurface_$VERSION subsurfacebeta-$VERSION + fi -# -# -echo "copying sources" -# -(cd subsurface ; tar cf - . ) | (cd subsurface_$VERSION ; tar xf - ) -cd subsurface_$VERSION -rm -rf .git libdivecomputer/.git libgit2/.git marble-source/.git -echo $GITVERSION > .gitversion -echo $LIBDCREVISION > libdivecomputer/revision -# dh_make --email dirk@hohndel.org -c gpl2 --createorig --single --yes -p subsurface_$VERSION -# rm debian/*.ex debian/*.EX debian/README.* -# -# -echo "creating source tar file for OBS and Ununtu PPA" -# -if [[ "x$GITREVISION" != "x" ]] ; then - (cd .. ; tar ch subsurfacedaily-$VERSION | xz > home:Subsurface-Divelog/Subsurface-daily/subsurface-$VERSION.orig.tar.xz) & + # + # + echo "copying sources" + # + (cd subsurface ; tar cf - . ) | (cd subsurface_$VERSION ; tar xf - ) + cd subsurface_$VERSION; + rm -rf .git libdivecomputer/.git libgit2/.git marble-source/.git + echo $GITVERSION > .gitversion + echo $LIBDCREVISION > libdivecomputer/revision + # dh_make --email dirk@hohndel.org -c gpl2 --createorig --single --yes -p subsurface_$VERSION + # rm debian/*.ex debian/*.EX debian/README.* + # + # + echo "creating source tar file for OBS and Ununtu PPA" + # + if [[ "x$GITREVISION" != "x" ]] ; then + (cd .. ; tar ch subsurfacedaily-$VERSION | xz > home:Subsurface-Divelog/Subsurface-daily/subsurface-$VERSION.orig.tar.xz) & + else + (cd .. ; tar ch subsurfacebeta-$VERSION | xz > home:Subsurface-Divelog/Subsurface-beta/subsurface-$VERSION.orig.tar.xz) & + fi + tar cf - . | xz > ../subsurface_$VERSION.orig.tar.xz else - (cd .. ; tar ch subsurfacebeta-$VERSION | xz > home:Subsurface-Divelog/Subsurface-beta/subsurface-$VERSION.orig.tar.xz) & + echo "using existing source tree" + cd subsurface_$VERSION fi -tar cf - . | xz > ../subsurface_$VERSION.orig.tar.xz # # echo "preparint the debian directory" # export DEBEMAIL=dirk@hohndel.org +rm -rf debian mkdir -p debian -cp -a packaging/ubuntu/debian . +cp -a ../debian . cp ../debian.changelog debian/changelog -# do something clever with changelog -#mv debian/changelog debian/autocl -#head -1 debian/autocl | sed -e 's/)/~trusty)/' -e 's/unstable/trusty/' > debian/changelog -#cat ../subsurface/packaging/ubuntu/debian/changelog >> debian/changelog -#tail -1 debian/autocl >> debian/changelog -#rm -f debian/autocl rev=0 while [ $rev -le "99" ] @@ -77,22 +79,30 @@ dch -v $VERSION-$rev~trusty -D trusty -M -m "next daily build" mv ~/src/debian.changelog ~/src/debian.changelog.previous cp debian/changelog ~/src/debian.changelog -debuild -S +debuild -S -# and now for utopic (precise can't build Qt5 based packages) +# and now for utopic prev=trusty rel=utopic sed -i "s/${prev}/${rel}/g" debian/changelog debuild -S -# and now for precise +# and now for vivid prev=utopic -rel=precise +rel=vivid sed -i "s/${prev}/${rel}/g" debian/changelog -cp debian/12.04.control debian/control -cp debian/12.04.rules debian/rules debuild -S +# and now for precise (precise can't build Qt5 based packages) +# with the switch to cmake the amount of effort to build Qt4 packages +# on precise just doesn't seem worth it anymore +#prev=vivid +#rel=precise +#sed -i "s/${prev}/${rel}/g" debian/changelog +#cp debian/12.04.control debian/control +#cp debian/12.04.rules debian/rules +#debuild -S + cd .. if [[ "$1x" = "postx" ]] ; then diff --git a/packaging/windows/mingw-make.sh b/packaging/windows/mingw-make.sh index 578847c4c..f242a7e44 100755 --- a/packaging/windows/mingw-make.sh +++ b/packaging/windows/mingw-make.sh @@ -16,8 +16,10 @@ rm $BASEDIR/../../ssrf-version.h > /dev/null 2>&1 if [[ $1 == "Qt5-64" ]] ; then export PATH=/usr/x86_64-w64-mingw32/sys-root/mingw/bin:$PATH + MINGW_MAKE="mingw64-make" else export PATH=/usr/i686-w64-mingw32/sys-root/mingw/bin:$PATH + MINGW_MAKE="mingw32-make" fi export objdump=mingw-objdump @@ -74,4 +76,4 @@ else $BASEDIR/../../subsurface.pro fi -mingw32-make $@ +$MINGW_MAKE $@ diff --git a/packaging/windows/mxe-based-build.sh b/packaging/windows/mxe-based-build.sh index 0eb634a98..9e6542f69 100755 --- a/packaging/windows/mxe-based-build.sh +++ b/packaging/windows/mxe-based-build.sh @@ -25,6 +25,7 @@ # /libgit2 # /marble # /subsurface +# /install-root <- target for our temporary installs # # then start this script from ~/src/win/win32 # @@ -39,6 +40,7 @@ if [[ ! -d libgit2 || ! -d marble || ! -d subsurface ]] ; then fi BASEDIR=$(cd "`dirname $0`/.."; pwd) +INSTALL_ROOT=$(pwd)/install-root echo "Building in $BASEDIR ..." @@ -82,17 +84,11 @@ cd .. cd libgit2 || exit 1 cmake -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/mxe/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake \ + -DCMAKE_INSTALL_PREFIX=$INSTALL_ROOT \ -DBUILD_CLAR=OFF \ $BASEDIR/../subsurface/libgit2 make -j12 - -# fake install -if [ ! -h include ] ; then - ln -s $BASEDIR/../subsurface/libgit2/include . -fi -if [ ! -h build ] ; then - ln -s . build -fi +make install cd .. # libdivecomputer (can't figure out how to do out-of tree builds?) @@ -100,8 +96,9 @@ cd .. cd libdivecomputer || exit 1 git pull autoreconf --install -./configure --host=i686-w64-mingw32.shared --enable-static --disable-shared +./configure --host=i686-w64-mingw32.shared --enable-static --disable-shared --prefix=$INSTALL_ROOT make -j12 +make install cd .. # marble: @@ -109,26 +106,15 @@ cd .. cd marble cmake -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/mxe/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake \ -DCMAKE_PREFIX_PATH=$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5 \ + -DCMAKE_INSTALL_PREFIX=$INSTALL_ROOT \ -DQTONLY=ON -DQT5BUILD=ON \ -DBUILD_MARBLE_APPS=OFF -DBUILD_MARBLE_EXAMPLES=OFF \ -DBUILD_MARBLE_TESTS=OFF -DBUILD_MARBLE_TOOLS=OFF \ -DBUILD_TESTING=OFF -DWITH_DESIGNER_PLUGIN=OFF \ -DBUILD_WITH_DBUS=OFF $BASEDIR/../subsurface/marble-source make -j12 +make install -# fake install -if [ ! -d include ] ; then - mkdir include - cd include - for i in $(find $BASEDIR/../subsurface/marble-source -name \*.h); do ln -s $i .; done - ln -s . marble - cd .. -fi -if [ ! -d lib ] ; then - mkdir lib -fi -cp src/lib/marble/libssrfmarblewidget.dll lib -cd .. ############### fi @@ -148,16 +134,17 @@ if [ ! -d staging ] ; then cd ../.. fi -export objdump=$BASEDIR/mxe/usr/bin/i686-w64-mingw32.shared-objdump - -i686-w64-mingw32.shared-qmake-qt5 \ - LIBMARBLEDEVEL=../marble \ - LIBGIT2DEVEL=../libgit2 CONFIG+=libgit21-api \ - LIBDCDEVEL=../libdivecomputer \ - QMAKE_LRELEASE=$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5/bin/lrelease \ - SPECIAL_MARBLE_PREFIX=1 \ - MAKENSIS=i686-w64-mingw32.shared-makensis \ - $BASEDIR/../subsurface/subsurface.pro - - -make -j12 $@ +cmake -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/mxe/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake \ + -DCMAKE_PREFIX_PATH=$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5 \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIBGIT2_INCLUDE_DIR=$(INSTALL_ROOT)/include \ + -DLIBGIT2_LIBRARIES=$(INSTALL_ROOT)/lib/libgit2.a \ + -DLIBDIVECOMPUTER_INCLUDE_DIR=$(INSTALL_ROOT)/include \ + -DLIBDIVECOMPUTER_LIBRARIES=$(INSTALL_ROOT)/lib/libdivecomputer.a \ + -DMARBLE_INCLUDE_DIR=$(INSTALL_ROOT)/include \ + -DMARBLE_LIBRARIES=$(INSTALL_ROOT)/lib/libssrfmarblewidget.dll \ + -DQT_TRANSLATION_DIR=$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5/translations \ + -DMAKENSIS=i686-w64-mingw32.shared-makensis \ + $BASEDIR/../subsurface + +make -j12 VERBOSE=1 $@ diff --git a/parse-xml.c b/parse-xml.c index 9f1e64a0e..c5ed21a54 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -21,6 +21,10 @@ int verbose, quit; int metric = 1; +int last_xml_version = -1; +bool abort_read_of_old_file = false; +bool v2_question_shown = false; +bool imported_via_xslt = false; static xmlDoc *test_xslt_transforms(xmlDoc *doc, const char **params); @@ -128,6 +132,7 @@ const struct units IMPERIAL_units = IMPERIAL_UNITS; #define MAX_EVENT_NAME 128 static struct divecomputer *cur_dc; static struct dive *cur_dive; +static struct dive_site *cur_dive_site; static dive_trip_t *cur_trip = NULL; static struct sample *cur_sample; static struct picture *cur_picture; @@ -746,6 +751,9 @@ static void try_to_match_autogroup(const char *name, char *buf) void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx) { + /* sanity check so we don't crash */ + if (idx < 0 || idx >= MAX_CYLINDERS) + return; /* The gas switch event format is insane for historical reasons */ struct gasmix *mix = &dive->cylinder[idx].gasmix; int o2 = get_o2(mix); @@ -933,10 +941,8 @@ static void try_to_fill_sample(struct sample *sample, const char *name, char *bu return; if (MATCH("sensor3.sample", double_to_o2pressure, &sample->o2sensor[2])) // up to 3 CCR sensors return; - if (MATCH("po2.sample", double_to_o2pressure, &sample->setpoint)) { - cur_dive->dc.divemode = CCR; + if (MATCH("po2.sample", double_to_o2pressure, &sample->setpoint)) return; - } if (MATCH("heartbeat", get_uint8, &sample->heartbeat)) return; if (MATCH("bearing", get_bearing, &sample->bearing)) @@ -968,22 +974,20 @@ void try_to_fill_userid(const char *name, char *buf) static const char *country, *city; -static void divinglog_place(char *place, char **location) +static void divinglog_place(char *place, uint32_t *uuid) { - char buffer[1024], *p; - int len; + char buffer[1024]; - len = snprintf(buffer, sizeof(buffer), - "%s%s%s%s%s", - place, - city ? ", " : "", - city ? city : "", - country ? ", " : "", - country ? country : ""); - - p = malloc(len + 1); - memcpy(p, buffer, len + 1); - *location = p; + snprintf(buffer, sizeof(buffer), + "%s%s%s%s%s", + place, + city ? ", " : "", + city ? city : "", + country ? ", " : "", + country ? country : ""); + *uuid = get_dive_site_uuid_by_name(buffer, NULL); + if (*uuid == 0) + *uuid = create_dive_site(buffer); city = NULL; country = NULL; @@ -1005,7 +1009,7 @@ static int divinglog_dive_match(struct dive *dive, const char *name, char *buf) MATCH("names.buddy", utf8_string, &dive->buddy) || MATCH("name.country", utf8_string, &country) || MATCH("name.city", utf8_string, &city) || - MATCH("name.place", divinglog_place, &dive->location) || + MATCH("name.place", divinglog_place, &dive->dive_site_uuid) || 0; } @@ -1127,23 +1131,119 @@ degrees_t parse_degrees(char *buf, char **end) static void gps_lat(char *buffer, struct dive *dive) { char *end; - - dive->latitude = parse_degrees(buffer, &end); + degrees_t latitude = parse_degrees(buffer, &end); + struct dive_site *ds = get_dive_site_for_dive(dive); + if (!ds) { + dive->dive_site_uuid = create_dive_site_with_gps(NULL, latitude, (degrees_t){0}); + } else { + if (ds->latitude.udeg && ds->latitude.udeg != latitude.udeg) + fprintf(stderr, "Oops, changing the latitude of existing dive site id %8x name %s; not good\n", ds->uuid, ds->name ?: "(unknown)"); + ds->latitude = latitude; + } } static void gps_long(char *buffer, struct dive *dive) { char *end; + degrees_t longitude = parse_degrees(buffer, &end); + struct dive_site *ds = get_dive_site_for_dive(dive); + if (!ds) { + dive->dive_site_uuid = create_dive_site_with_gps(NULL, (degrees_t){0}, longitude); + } else { + if (ds->longitude.udeg && ds->longitude.udeg != longitude.udeg) + fprintf(stderr, "Oops, changing the longitude of existing dive site id %8x name %s; not good\n", ds->uuid, ds->name ?: "(unknown)"); + ds->longitude = longitude; + } - dive->longitude = parse_degrees(buffer, &end); } -static void gps_location(char *buffer, struct dive *dive) +static void gps_location(char *buffer, struct dive_site *ds) { char *end; - dive->latitude = parse_degrees(buffer, &end); - dive->longitude = parse_degrees(end, &end); + ds->latitude = parse_degrees(buffer, &end); + ds->longitude = parse_degrees(end, &end); +} + +/* this is in qthelper.cpp, so including the .h file is a pain */ +extern const char *printGPSCoords(int lat, int lon); +extern void add_geo_information_for_loockup(degrees_t latitude, degrees_t longitude, uint32_t uuid); + +static void gps_in_dive(char *buffer, struct dive *dive) +{ + char *end; + struct dive_site *ds = NULL; + degrees_t latitude = parse_degrees(buffer, &end); + degrees_t longitude = parse_degrees(end, &end); + fprintf(stderr, "got lat %f lon %f\n", latitude.udeg / 1000000.0, longitude.udeg / 1000000.0); + uint32_t uuid = dive->dive_site_uuid; + if (uuid == 0) { + uuid = get_dive_site_uuid_by_gps(latitude, longitude, &ds); + if (ds) { + fprintf(stderr, "found dive site {%s} with these coordinates\n", ds->name); + dive->dive_site_uuid = uuid; + } else { + fprintf(stderr, "found no uuid in dive, no existing dive site with these coordinates, creating a new divesite without name and above GPS\n"); + dive->dive_site_uuid = create_dive_site_with_gps("", latitude, longitude); + ds = get_dive_site_by_uuid(dive->dive_site_uuid); + } + } else { + fprintf(stderr, "found uuid in dive, checking to see if we should add GPS\n"); + ds = get_dive_site_by_uuid(uuid); + if (dive_site_has_gps_location(ds) && + (latitude.udeg != 0 || longitude.udeg != 0) && + (ds->latitude.udeg != latitude.udeg || ds->longitude.udeg != longitude.udeg)) { + // Houston, we have a problem + fprintf(stderr, "dive site uuid in dive, but gps location (%10.6f/%10.6f) different from dive location (%10.6f/%10.6f)\n", + ds->latitude.udeg / 1000000.0, ds->longitude.udeg / 1000000.0, + latitude.udeg / 1000000.0, longitude.udeg / 1000000.0); + ds->notes = add_to_string(ds->notes, translate("gettextFromC", "multiple gps locations for this dive site; also %s\n"), + printGPSCoords(latitude.udeg, longitude.udeg)); + } else { + fprintf(stderr, "let's add the gps coordinates to divesite with uuid %8x and name %s\n", ds->uuid, ds->name ?: "(none)"); + ds->latitude = latitude; + ds->longitude = longitude; + } + } + if (ds && (!ds->notes || strstr(ds->notes, "countrytag:") == NULL)) + add_geo_information_for_loockup(latitude, longitude, dive->dive_site_uuid); +} + +static void add_dive_site(char *buffer, struct dive *dive) +{ + fprintf(stderr, "add_dive_site with name %s\n", buffer); + int size = trimspace(buffer); + if(size) { + uint32_t uuid = dive->dive_site_uuid; + struct dive_site *ds = get_dive_site_by_uuid(uuid); + if (uuid && !ds) { + // that's strange - we have a uuid but it doesn't exist - let's just ignore it + fprintf(stderr, "dive contains a non-existing dive site uuid %x\n", dive->dive_site_uuid); + uuid = 0; + } + if (!uuid) + // if the dive doesn't have a uuid, check if there's already a dive site by this name + uuid = get_dive_site_uuid_by_name(buffer, &ds); + if (ds) { + // we have a uuid, let's hope there isn't a different name + fprintf(stderr, "have existing site with name {%s} gps %f/%f ", ds->name, ds->latitude.udeg / 1000000.0, ds->longitude.udeg / 1000000.0); + if (same_string(ds->name, "")) { + fprintf(stderr, "so now add name {%s}\n", buffer); + ds->name = copy_string(buffer); + } else if (!same_string(ds->name, buffer)) { + // coin toss, let's just keep the first name we found and add the new one to the notes + fprintf(stderr, "which means the dive already links to dive site of different name {%s} / {%s}\n", ds->name, buffer); + ds->notes = add_to_string(ds->notes, translate("gettextFromC", "additional name for site: %s\n"), buffer); + } else { + // add the existing dive site to the current dive + fprintf(stderr, "we have an existing location, using {%s}\n", ds->name); + dive->dive_site_uuid = uuid; + } + } else { + fprintf(stderr, "no uuid, create new dive site with name {%s}\n", buffer); + dive->dive_site_uuid = create_dive_site(buffer); + } + } } static void gps_picture_location(char *buffer, struct picture *pic) @@ -1173,7 +1273,8 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) default: break; } - + if (MATCH("divesiteid", hex_value, &dive->dive_site_uuid)) + return; if (MATCH("number", get_index, &dive->number)) return; if (MATCH("tags", divetags, &dive->tag_list)) @@ -1199,13 +1300,15 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) return; if (MATCH("gps.picture", gps_picture_location, cur_picture)) return; + if (MATCH("hash.picture", utf8_string, &cur_picture->hash)) + return; if (MATCH("cylinderstartpressure", pressure, &dive->cylinder[0].start)) return; if (MATCH("cylinderendpressure", pressure, &dive->cylinder[0].end)) return; - if (MATCH("gps", gps_location, dive)) + if (MATCH("gps", gps_in_dive, dive)) return; - if (MATCH("Place", gps_location, dive)) + if (MATCH("Place", gps_in_dive, dive)) return; if (MATCH("latitude", gps_lat, dive)) return; @@ -1219,9 +1322,9 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) return; if (MATCH("lon", gps_long, dive)) return; - if (MATCH("location", utf8_string, &dive->location)) + if (MATCH("location", add_dive_site, dive)) return; - if (MATCH("name.dive", utf8_string, &dive->location)) + if (MATCH("name.dive", add_dive_site, dive)) return; if (MATCH("suit", utf8_string, &dive->suit)) return; @@ -1290,6 +1393,27 @@ static void try_to_fill_trip(dive_trip_t **dive_trip_p, const char *name, char * nonmatch("trip", name, buf); } +/* We're processing a divesite entry - try to fill the components */ +static void try_to_fill_dive_site(struct dive_site **ds_p, const char *name, char *buf) +{ + start_match("divesite", name, buf); + + struct dive_site *ds = *ds_p; + + if (MATCH("uuid", hex_value, &ds->uuid)) + return; + if (MATCH("name", utf8_string, &ds->name)) + return; + if (MATCH("description", utf8_string, &ds->description)) + return; + if (MATCH("notes", utf8_string, &ds->notes)) + return; + if (MATCH("gps", gps_location, ds)) + return; + + nonmatch("divesite", name, buf); +} + /* * While in some formats file boundaries are dive boundaries, in many * others (as for example in our native format) there are @@ -1305,7 +1429,7 @@ static void try_to_fill_trip(dive_trip_t **dive_trip_p, const char *name, char * static bool is_dive(void) { return (cur_dive && - (cur_dive->location || cur_dive->when || cur_dive->dc.samples)); + (cur_dive->dive_site_uuid || cur_dive->when || cur_dive->dc.samples)); } static void reset_dc_info(struct divecomputer *dc) @@ -1349,6 +1473,32 @@ static void dc_settings_end(void) reset_dc_settings(); } +static void dive_site_start(void) +{ + if (cur_dive_site) + return; + cur_dive_site = calloc(1, sizeof(struct dive_site)); +} + +static void dive_site_end(void) +{ + if (!cur_dive_site) + return; + if (cur_dive_site->uuid) { + uint32_t tmp = create_dive_site_with_gps(cur_dive_site->name, cur_dive_site->latitude, cur_dive_site->longitude); + struct dive_site *ds = get_dive_site_by_uuid(tmp); + ds->uuid = cur_dive_site->uuid; + ds->notes = cur_dive_site->notes; + ds->description = cur_dive_site->description; + if (verbose > 3) + printf("completed dive site uuid %x8 name {%s}\n", ds->uuid, ds->name); + } + free(cur_dive_site); + cur_dive_site = NULL; +} + +// now we need to add the code to parse the parts of the divesite enry + static void dive_start(void) { if (cur_dive) @@ -1527,37 +1677,54 @@ static void userid_stop(void) in_userid = false; } -static void entry(const char *name, char *buf) +static bool entry(const char *name, char *buf) { + if (!strncmp(name, "version.program", sizeof("version.program") - 1) || + !strncmp(name, "version.divelog", sizeof("version.divelog") - 1)) { + last_xml_version = atoi(buf); + if (last_xml_version < 3 && !v2_question_shown && !imported_via_xslt) { + // let's ask the user what they want to do about reverse geo coding + // and warn them that opening older XML files can take a while + // since C code shouldn't call the UI we set a global flag and bail + // from reading the file for now + abort_read_of_old_file = true; + return false; + } + } if (in_userid) { try_to_fill_userid(name, buf); - return; + return true; } if (in_settings) { try_to_fill_dc_settings(name, buf); try_to_match_autogroup(name, buf); - return; + return true; + } + if (cur_dive_site) { + try_to_fill_dive_site(&cur_dive_site, name, buf); + return true; } if (!cur_event.deleted) { try_to_fill_event(name, buf); - return; + return true; } if (cur_sample) { try_to_fill_sample(cur_sample, name, buf); - return; + return true; } if (cur_dc) { try_to_fill_dc(cur_dc, name, buf); - return; + return true; } if (cur_dive) { try_to_fill_dive(cur_dive, name, buf); - return; + return true; } if (cur_trip) { try_to_fill_trip(&cur_trip, name, buf); - return; + return true; } + return true; } static const char *nodename(xmlNode *node, char *buf, int len) @@ -1599,7 +1766,7 @@ static const char *nodename(xmlNode *node, char *buf, int len) #define MAXNAME 32 -static void visit_one_node(xmlNode *node) +static bool visit_one_node(xmlNode *node) { char *content; static char buffer[MAXNAME]; @@ -1607,28 +1774,29 @@ static void visit_one_node(xmlNode *node) content = node->content; if (!content || xmlIsBlankNode(node)) - return; + return true; name = nodename(node, buffer, sizeof(buffer)); - entry(name, content); + return entry(name, content); } -static void traverse(xmlNode *root); +static bool traverse(xmlNode *root); -static void traverse_properties(xmlNode *node) +static bool traverse_properties(xmlNode *node) { xmlAttr *p; + bool ret = true; for (p = node->properties; p; p = p->next) - traverse(p->children); + if ((ret = traverse(p->children)) == false) + break; + return ret; } -static void visit(xmlNode *n) +static bool visit(xmlNode *n) { - visit_one_node(n); - traverse_properties(n); - traverse(n->children); + return visit_one_node(n) && traverse_properties(n) && traverse(n->children); } static void DivingLog_importer(void) @@ -1666,6 +1834,7 @@ static struct nesting { } nesting[] = { { "divecomputerid", dc_settings_start, dc_settings_end }, { "settings", settings_start, settings_end }, + { "site", dive_site_start, dive_site_end }, { "dive", dive_start, dive_end }, { "Dive", dive_start, dive_end }, { "trip", trip_start, trip_end }, @@ -1690,15 +1859,17 @@ static struct nesting { { NULL, } }; -static void traverse(xmlNode *root) +static bool traverse(xmlNode *root) { xmlNode *n; + bool ret = true; for (n = root; n; n = n->next) { struct nesting *rule = nesting; if (!n->name) { - visit(n); + if ((ret = visit(n)) == false) + break; continue; } @@ -1710,10 +1881,12 @@ static void traverse(xmlNode *root) if (rule->start) rule->start(); - visit(n); + if ((ret = visit(n)) == false) + break; if (rule->end) rule->end(); } + return ret; } /* Per-file reset */ @@ -1760,6 +1933,7 @@ int parse_xml_buffer(const char *url, const char *buffer, int size, { xmlDoc *doc; const char *res = preprocess_divelog_de(buffer); + int ret = 0; target_table = table; doc = xmlReadMemory(res, strlen(res), url, NULL, 0); @@ -1774,11 +1948,14 @@ int parse_xml_buffer(const char *url, const char *buffer, int size, reset_all(); dive_start(); doc = test_xslt_transforms(doc, params); - traverse(xmlDocGetRootElement(doc)); + if (!traverse(xmlDocGetRootElement(doc))) { + // we decided to give up on parsing... why? + ret = -1; + } dive_end(); xmlFreeDoc(doc); - - return 0; + imported_via_xslt = false; + return ret; } void parse_mkvi_buffer(struct membuffer *txt, struct membuffer *csv, const char *starttime) @@ -1861,13 +2038,24 @@ extern int dm4_events(void *handle, int columns, char **data, char **column) strcpy(cur_event.name, "deco"); break; case 22: + case 32: /* 22 Mandatory safety stop violation */ + /* 32 Deep stop violation */ strcpy(cur_event.name, "violation"); break; + case 30: + /* Tissue level warning */ + strcpy(cur_event.name, "tissue warning"); + break; + case 37: + /* Tank pressure alarm */ + strcpy(cur_event.name, "tank pressure"); + break; case 257: /* 257 Dive active */ - /* This seems to be given after surface - * when descending again. Ignoring it. */ + /* This seems to be given after surface when + * descending again. */ + strcpy(cur_event.name, "surface"); break; case 258: /* 258 Bookmark */ @@ -1878,6 +2066,23 @@ extern int dm4_events(void *handle, int columns, char **data, char **column) strcpy(cur_event.name, "bookmark"); } break; + case 259: + /* Deep stop */ + strcpy(cur_event.name, "Deep stop"); + break; + case 260: + /* Deep stop */ + strcpy(cur_event.name, "Deep stop cleared"); + break; + case 266: + /* Mandatory safety stop activated */ + strcpy(cur_event.name, "safety stop (mandatory)"); + break; + case 267: + /* Mandatory safety stop deactivated */ + /* DM5 shows this only on event list, not on the + * profile so skipping as well for now */ + break; default: strcpy(cur_event.name, "unknown"); cur_event.value = atoi(data[2]); @@ -1889,6 +2094,44 @@ extern int dm4_events(void *handle, int columns, char **data, char **column) return 0; } +extern int dm5_cylinders(void *handle, int columns, char **data, char **column) +{ + cylinder_start(); + if (data[7] && atoi(data[7]) > 0 && atoi(data[7]) < 350000) + cur_dive->cylinder[cur_cylinder_index].start.mbar = atoi(data[7]); + if (data[8] && atoi(data[8]) > 0 && atoi(data[8]) < 350000) + cur_dive->cylinder[cur_cylinder_index].end.mbar = (atoi(data[8])); + if (data[6]) { + /* DM5 shows tank size of 12 liters when the actual + * value is 0 (and using metric units). So we just use + * the same 12 liters when size is not available */ + if (atof(data[6]) == 0.0 && cur_dive->cylinder[cur_cylinder_index].start.mbar) + cur_dive->cylinder[cur_cylinder_index].type.size.mliter = 12000; + else + cur_dive->cylinder[cur_cylinder_index].type.size.mliter = (atof(data[6])) * 1000; + } + if (data[2]) + cur_dive->cylinder[cur_cylinder_index].gasmix.o2.permille = atoi(data[2]) * 10; + if (data[3]) + cur_dive->cylinder[cur_cylinder_index].gasmix.he.permille = atoi(data[3]) * 10; + cylinder_end(); + return 0; +} + +extern int dm5_gaschange(void *handle, int columns, char **data, char **column) +{ + event_start(); + if (data[0]) + cur_event.time.seconds = atoi(data[0]); + if (data[1]) { + strcpy(cur_event.name, "gaschange"); + cur_event.value = atof(data[1]); + } + event_end(); + + return 0; +} + extern int dm4_tags(void *handle, int columns, char **data, char **column) { if (data[0]) @@ -2031,7 +2274,9 @@ extern int dm5_dive(void *param, int columns, char **data, char **column) char *err = NULL; char get_events_template[] = "select * from Mark where DiveId = %d"; char get_tags_template[] = "select Text from DiveTag where DiveId = %d"; - char get_events[64]; + char get_cylinders_template[] = "select * from DiveMixture where DiveId = %d"; + char get_gaschange_template[] = "select GasChangeTime,Oxygen,Helium from DiveGasChange join DiveMixture on DiveGasChange.DiveMixtureId=DiveMixture.DiveMixtureId where DiveId = %d"; + char get_events[512]; dive_start(); cur_dive->number = atoi(data[0]); @@ -2050,12 +2295,13 @@ extern int dm5_dive(void *param, int columns, char **data, char **column) */ settings_start(); dc_settings_start(); - if (data[4]) + if (data[4]) { utf8_string(data[4], &cur_settings.dc.serial_nr); + cur_settings.dc.deviceid = atoi(data[4]); + } if (data[5]) utf8_string(data[5], &cur_settings.dc.model); - cur_settings.dc.deviceid = 0xffffffff; dc_settings_end(); settings_end(); @@ -2066,30 +2312,21 @@ extern int dm5_dive(void *param, int columns, char **data, char **column) if (data[9]) cur_dive->dc.watertemp.mkelvin = C_to_mkelvin(atoi(data[9])); - /* - * TODO: handle multiple cylinders - */ - cylinder_start(); - if (data[22] && atoi(data[22]) > 0) - cur_dive->cylinder[cur_cylinder_index].start.mbar = atoi(data[22]); - else if (data[10] && atoi(data[10]) > 0) - cur_dive->cylinder[cur_cylinder_index].start.mbar = atoi(data[10]); - if (data[23] && atoi(data[23]) > 0) - cur_dive->cylinder[cur_cylinder_index].end.mbar = (atoi(data[23])); - if (data[11] && atoi(data[11]) > 0) - cur_dive->cylinder[cur_cylinder_index].end.mbar = (atoi(data[11])); - if (data[12]) - cur_dive->cylinder[cur_cylinder_index].type.size.mliter = (atof(data[12])) * 1000; - if (data[13]) - cur_dive->cylinder[cur_cylinder_index].type.workingpressure.mbar = (atoi(data[13])); - if (data[20]) - cur_dive->cylinder[cur_cylinder_index].gasmix.o2.permille = atoi(data[20]) * 10; - if (data[21]) - cur_dive->cylinder[cur_cylinder_index].gasmix.he.permille = atoi(data[21]) * 10; - cylinder_end(); + if (data[4]) { + cur_dive->dc.deviceid = atoi(data[4]); + } + if (data[5]) + utf8_string(data[5], &cur_dive->dc.model); + + snprintf(get_events, sizeof(get_events) - 1, get_cylinders_template, cur_dive->number); + retval = sqlite3_exec(handle, get_events, &dm5_cylinders, 0, &err); + if (retval != SQLITE_OK) { + fprintf(stderr, "%s", translate("gettextFromC", "Database query dm5_cylinders failed.\n")); + return 1; + } if (data[14]) - cur_dive->dc.surface_pressure.mbar = (atoi(data[14]) * 1000); + cur_dive->dc.surface_pressure.mbar = (atoi(data[14]) / 100); interval = data[16] ? atoi(data[16]) : 0; sampleBlob = (unsigned const char *)data[24]; @@ -2141,6 +2378,13 @@ extern int dm5_dive(void *param, int columns, char **data, char **column) } } + snprintf(get_events, sizeof(get_events) - 1, get_gaschange_template, cur_dive->number); + retval = sqlite3_exec(handle, get_events, &dm5_gaschange, 0, &err); + if (retval != SQLITE_OK) { + fprintf(stderr, "%s", translate("gettextFromC", "Database query dm5_gaschange failed.\n")); + return 1; + } + snprintf(get_events, sizeof(get_events) - 1, get_events_template, cur_dive->number); retval = sqlite3_exec(handle, get_events, &dm4_events, 0, &err); if (retval != SQLITE_OK) { @@ -2191,7 +2435,7 @@ int parse_dm5_buffer(sqlite3 *handle, const char *url, const char *buffer, int s /* StartTime is converted from Suunto's nano seconds to standard * time. We also need epoch, not seconds since year 1. */ - char get_dives[] = "select D.DiveId,StartTime/10000000-62135596800,Note,Duration,SourceSerialNumber,Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,D.StartPressure,D.EndPressure,Size,CylinderWorkPressure,SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,Oxygen,Helium,MIX.StartPressure,MIX.EndPressure,SampleBlob FROM Dive AS D JOIN DiveMixture AS MIX ON D.DiveId=MIX.DiveId"; + char get_dives[] = "select DiveId,StartTime/10000000-62135596800,Note,Duration,coalesce(SourceSerialNumber,SerialNumber),Source,MaxDepth,SampleInterval,StartTemperature,BottomTemperature,StartPressure,EndPressure,'','',SurfacePressure,DiveTime,SampleInterval,ProfileBlob,TemperatureBlob,PressureBlob,'','','','',SampleBlob FROM Dive where Deleted is null"; retval = sqlite3_exec(handle, get_dives, &dm5_dive, handle, &err); @@ -2291,7 +2535,7 @@ extern int shearwater_dive(void *param, int columns, char **data, char **column) cur_dive->when = (time_t)(atol(data[1])); if (data[2]) - utf8_string(data[2], &cur_dive->location); + add_dive_site(data[2], cur_dive); if (data[3]) utf8_string(data[3], &cur_dive->buddy); if (data[4]) @@ -2388,19 +2632,21 @@ extern int cobalt_visibility(void *handle, int columns, char **data, char **colu extern int cobalt_location(void *handle, int columns, char **data, char **column) { + static char *location = NULL; if (data[0]) { - if (cur_dive->location) { - char *tmp = malloc(strlen(cur_dive->location) + strlen(data[0]) + 4); + if (location) { + char *tmp = malloc(strlen(location) + strlen(data[0]) + 4); if (!tmp) return -1; - sprintf(tmp, "%s / %s", cur_dive->location, data[0]); - free(cur_dive->location); - cur_dive->location = tmp; + sprintf(tmp, "%s / %s", location, data[0]); + free(location); + location = NULL; + cur_dive->dive_site_uuid = create_dive_site(tmp); + free(tmp); } else { - utf8_string(data[0], &cur_dive->location); + location = strdup(data[0]); } } - return 0; } @@ -2448,13 +2694,20 @@ extern int cobalt_dive(void *param, int columns, char **data, char **column) */ settings_start(); dc_settings_start(); - if (data[9]) + if (data[9]) { utf8_string(data[9], &cur_settings.dc.serial_nr); + cur_settings.dc.deviceid = atoi(data[9]); + cur_settings.dc.model = strdup("Cobalt import"); + } - cur_settings.dc.deviceid = 0xffffffff; dc_settings_end(); settings_end(); + if (data[9]) { + cur_dive->dc.deviceid = atoi(data[9]); + cur_dive->dc.model = strdup("Cobalt import"); + } + snprintf(get_buffer, sizeof(get_buffer) - 1, get_cylinder_template, cur_dive->number); retval = sqlite3_exec(handle, get_buffer, &cobalt_cylinders, 0, &err); if (retval != SQLITE_OK) { @@ -2529,7 +2782,7 @@ int parse_cobalt_buffer(sqlite3 *handle, const char *url, const char *buffer, in char *err = NULL; target_table = table; - char get_dives[] = "select Id,strftime('%s',DiveStartTime),LocationId,'buddy','notes',Units,(MaxDepthPressure*10000/SurfacePressure)-10000,DiveMinutes,SurfacePressure,SerialNumber,'model' from Dive"; + char get_dives[] = "select Id,strftime('%s',DiveStartTime),LocationId,'buddy','notes',Units,(MaxDepthPressure*10000/SurfacePressure)-10000,DiveMinutes,SurfacePressure,SerialNumber,'model' from Dive where IsViewDeleted = 0"; retval = sqlite3_exec(handle, get_dives, &cobalt_dive, handle, &err); @@ -2563,8 +2816,8 @@ int parse_dlf_buffer(unsigned char *buffer, size_t size) // (ptr[7] << 8) + ptr[6] Is "Serial" snprintf(serial, sizeof(serial), "%d", (ptr[7] << 8) + ptr[6]); cur_dc->serial = strdup(serial); - // Dive start time in seconds since 2000-01-01 12:00 UTC +0 - cur_dc->when = (ptr[11] << 24) + (ptr[10] << 16) + (ptr[9] << 8) + ptr[8] + 946728000; + // Dive start time in seconds since 2000-01-01 00:00 + cur_dc->when = (ptr[11] << 24) + (ptr[10] << 16) + (ptr[9] << 8) + ptr[8] + 946684800; cur_dive->when = cur_dc->when; cur_dc->duration.seconds = ((ptr[14] & 0xFE) << 16) + (ptr[13] << 8) + ptr[12]; @@ -2903,7 +3156,7 @@ static xmlDoc *test_xslt_transforms(xmlDoc *doc, const char **params) } free((void *)attribute); } - + imported_via_xslt = true; xmlSubstituteEntitiesDefault(1); xslt = get_stylesheet(info->file); if (xslt == NULL) { @@ -115,7 +115,7 @@ int get_gasidx(struct dive *dive, struct gasmix *mix) int gasidx = -1; while (++gasidx < MAX_CYLINDERS) - if (gasmix_distance(&dive->cylinder[gasidx].gasmix, mix) < 200) + if (gasmix_distance(&dive->cylinder[gasidx].gasmix, mix) < 100) return gasidx; return -1; } @@ -210,7 +210,7 @@ static int verify_gas_exists(struct gasmix mix_in) cyl = displayed_dive.cylinder + i; if (cylinder_nodata(cyl)) continue; - if (gasmix_distance(&cyl->gasmix, &mix_in) < 200) + if (gasmix_distance(&cyl->gasmix, &mix_in) < 100) return i; } fprintf(stderr, "this gas %s should have been on the cylinder list\nThings will fail now\n", gasname(&mix_in)); @@ -307,11 +307,10 @@ static void create_dive_from_plan(struct diveplan *diveplan, bool track_gas) /* Check for SetPoint change */ if (oldpo2 != po2) { - if (lasttime) - /* this is a bad idea - we should get a different SAMPLE_EVENT type - * reserved for this in libdivecomputer... overloading SMAPLE_EVENT_PO2 - * with a different meaning will only cause confusion elsewhere in the code */ - add_event(dc, lasttime, SAMPLE_EVENT_PO2, 0, po2, "SP change"); + /* this is a bad idea - we should get a different SAMPLE_EVENT type + * reserved for this in libdivecomputer... overloading SMAPLE_EVENT_PO2 + * with a different meaning will only cause confusion elsewhere in the code */ + add_event(dc, lasttime, SAMPLE_EVENT_PO2, 0, po2, "SP change"); oldpo2 = po2; } @@ -521,7 +520,7 @@ static unsigned int *sort_stops(int *dstops, int dnr, struct gaschanges *gstops, static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool show_disclaimer, int error) { - char buffer[20000], temp[1000]; + char buffer[2000000], temp[100000]; int len, lastdepth = 0, lasttime = 0, lastsetpoint = -1, newdepth = 0, lastprintdepth = 0; struct divedatapoint *dp = diveplan->dp; bool gaschange = !plan_verbatim, postponed = plan_verbatim; @@ -780,7 +779,7 @@ static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool dive->notes = strdup(buffer); } -int ascend_velocity(int depth, int avg_depth, int bottom_time) +int ascent_velocity(int depth, int avg_depth, int bottom_time) { /* We need to make this configurable */ @@ -801,7 +800,62 @@ int ascend_velocity(int depth, int avg_depth, int bottom_time) } } -int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool show_disclaimer) +void track_ascent_gas(int depth, cylinder_t *cylinder, int avg_depth, int bottom_time, bool safety_stop) +{ + while (depth > 0) { + int deltad = ascent_velocity(depth, avg_depth, bottom_time) * TIMESTEP; + if (deltad > depth) + deltad = depth; + update_cylinder_pressure(&displayed_dive, depth, depth - deltad, TIMESTEP, prefs.decosac, cylinder, true); + if (depth <= 5000 && depth >= (5000 - deltad) && safety_stop) { + update_cylinder_pressure(&displayed_dive, 5000, 5000, 180, prefs.decosac, cylinder, true); + safety_stop = false; + } + depth -= deltad; + } +} + +bool trial_ascent(int trial_depth, int stoplevel, int avg_depth, int bottom_time, double tissue_tolerance, struct gasmix *gasmix, int po2, double surface_pressure) +{ + + bool clear_to_ascend = true; + char *trial_cache = NULL; + + cache_deco_state(tissue_tolerance, &trial_cache); + while (trial_depth > stoplevel) { + int deltad = ascent_velocity(trial_depth, avg_depth, bottom_time) * TIMESTEP; + if (deltad > trial_depth) /* don't test against depth above surface */ + deltad = trial_depth; + tissue_tolerance = add_segment(depth_to_mbar(trial_depth, &displayed_dive) / 1000.0, + gasmix, + TIMESTEP, po2, &displayed_dive, prefs.decosac); + if (deco_allowed_depth(tissue_tolerance, surface_pressure, &displayed_dive, 1) > trial_depth - deltad) { + /* We should have stopped */ + clear_to_ascend = false; + break; + } + trial_depth -= deltad; + } + restore_deco_state(trial_cache); + return clear_to_ascend; +} + +bool enough_gas(int current_cylinder) +{ + cylinder_t *cyl; + cyl = &displayed_dive.cylinder[current_cylinder]; + + if (!cyl->start.mbar) + return true; + if (cyl->type.size.mliter) + return (float) (cyl->end.mbar - prefs.reserve_gas) * cyl->type.size.mliter / 1000.0 > (float) cyl->deco_gas_used.mliter; + else + return true; +} + +// Work out the stops. Return value is if there were any mandatory stops. + +bool plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool show_disclaimer) { struct sample *sample; int po2; @@ -813,11 +867,10 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s struct gaschanges *gaschanges = NULL; int gaschangenr; int *stoplevels = NULL; - char *trial_cache = NULL; bool stopping = false; bool clear_to_ascend; int clock, previous_point_time; - int avg_depth, bottom_time = 0; + int avg_depth, max_depth, bottom_time = 0; int last_ascend_rate; int best_first_ascend_cylinder; struct gasmix gas; @@ -825,12 +878,24 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s int breaktime = -1; int breakcylinder = 0; int error = 0; + bool decodive = false; set_gf(diveplan->gflow, diveplan->gfhigh, prefs.gf_low_at_maxdepth); if (!diveplan->surface_pressure) diveplan->surface_pressure = SURFACE_PRESSURE; create_dive_from_plan(diveplan, is_planner); + if (prefs.verbatim_plan) + plan_verbatim = true; + if (prefs.display_runtime) + plan_display_runtime = true; + if (prefs.display_duration) + plan_display_duration = true; + if (prefs.display_transitions) + plan_display_transitions = true; + if (prefs.last_stop) + decostoplevels[1] = 6000; + /* Let's start at the last 'sample', i.e. the last manually entered waypoint. */ sample = &displayed_dive.dc.sample[displayed_dive.dc.samples - 1]; @@ -842,15 +907,15 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s current_cylinder = 0; } depth = displayed_dive.dc.sample[displayed_dive.dc.samples - 1].depth.mm; - avg_depth = average_depth(diveplan); - last_ascend_rate = ascend_velocity(depth, avg_depth, bottom_time); + average_max_depth(diveplan, &avg_depth, &max_depth); + last_ascend_rate = ascent_velocity(depth, avg_depth, bottom_time); /* if all we wanted was the dive just get us back to the surface */ if (!is_planner) { transitiontime = depth / 75; /* this still needs to be made configurable */ plan_add_segment(diveplan, transitiontime, 0, gas, po2, false); create_dive_from_plan(diveplan, is_planner); - return(error); + return(false); } tissue_tolerance = tissue_at_end(&displayed_dive, cached_datap); @@ -881,6 +946,57 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s /* Keep time during the ascend */ bottom_time = clock = previous_point_time = displayed_dive.dc.sample[displayed_dive.dc.samples - 1].time.seconds; gi = gaschangenr - 1; + if(prefs.recreational_mode) { + bool safety_stop = prefs.safetystop && max_depth >= 10000; + track_ascent_gas(depth, &displayed_dive.cylinder[current_cylinder], avg_depth, bottom_time, safety_stop); + // How long can we stay at the current depth and still directly ascent to the surface? + while (trial_ascent(depth, 0, avg_depth, bottom_time, tissue_tolerance, &displayed_dive.cylinder[current_cylinder].gasmix, + po2, diveplan->surface_pressure / 1000.0) && + enough_gas(current_cylinder)) { + tissue_tolerance = add_segment(depth_to_mbar(depth, &displayed_dive) / 1000.0, + &displayed_dive.cylinder[current_cylinder].gasmix, + DECOTIMESTEP, po2, &displayed_dive, prefs.bottomsac); + update_cylinder_pressure(&displayed_dive, depth, depth, DECOTIMESTEP, prefs.bottomsac, &displayed_dive.cylinder[current_cylinder], false); + clock += DECOTIMESTEP; + } + clock -= DECOTIMESTEP; + plan_add_segment(diveplan, clock - previous_point_time, depth, gas, po2, true); + previous_point_time = clock; + do { + /* Ascend to surface */ + int deltad = ascent_velocity(depth, avg_depth, bottom_time) * TIMESTEP; + if (ascent_velocity(depth, avg_depth, bottom_time) != last_ascend_rate) { + plan_add_segment(diveplan, clock - previous_point_time, depth, gas, po2, false); + previous_point_time = clock; + last_ascend_rate = ascent_velocity(depth, avg_depth, bottom_time); + } + if (depth - deltad < 0) + deltad = depth; + + tissue_tolerance = add_segment(depth_to_mbar(depth, &displayed_dive) / 1000.0, + &displayed_dive.cylinder[current_cylinder].gasmix, + TIMESTEP, po2, &displayed_dive, prefs.decosac); + clock += TIMESTEP; + depth -= deltad; + if (depth <= 5000 && depth >= (5000 - deltad) && safety_stop) { + plan_add_segment(diveplan, clock - previous_point_time, 5000, gas, po2, false); + previous_point_time = clock; + clock += 180; + plan_add_segment(diveplan, clock - previous_point_time, 5000, gas, po2, false); + previous_point_time = clock; + safety_stop = false; + } + } while (depth > 0); + plan_add_segment(diveplan, clock - previous_point_time, 0, gas, po2, false); + create_dive_from_plan(diveplan, is_planner); + add_plan_to_notes(diveplan, &displayed_dive, show_disclaimer, error); + fixup_dc_duration(&displayed_dive.dc); + + free(stoplevels); + free(gaschanges); + + return(false); + } if (best_first_ascend_cylinder != current_cylinder) { stopping = true; @@ -897,12 +1013,12 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s /* We will break out when we hit the surface */ do { /* Ascend to next stop depth */ - int deltad = ascend_velocity(depth, avg_depth, bottom_time) * TIMESTEP; - if (ascend_velocity(depth, avg_depth, bottom_time) != last_ascend_rate) { + int deltad = ascent_velocity(depth, avg_depth, bottom_time) * TIMESTEP; + if (ascent_velocity(depth, avg_depth, bottom_time) != last_ascend_rate) { plan_add_segment(diveplan, clock - previous_point_time, depth, gas, po2, false); previous_point_time = clock; stopping = false; - last_ascend_rate = ascend_velocity(depth, avg_depth, bottom_time); + last_ascend_rate = ascent_velocity(depth, avg_depth, bottom_time); } if (depth - deltad < stoplevels[stopidx]) deltad = depth - stoplevels[stopidx]; @@ -936,31 +1052,14 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s --stopidx; /* Save the current state and try to ascend to the next stopdepth */ - int trial_depth = depth; - cache_deco_state(tissue_tolerance, &trial_cache); while (1) { /* Check if ascending to next stop is clear, go back and wait if we hit the ceiling on the way */ - clear_to_ascend = true; - while (trial_depth > stoplevels[stopidx]) { - int deltad = ascend_velocity(trial_depth, avg_depth, bottom_time) * TIMESTEP; - if (deltad > trial_depth) /* don't test against depth above surface */ - deltad = trial_depth; - tissue_tolerance = add_segment(depth_to_mbar(trial_depth, &displayed_dive) / 1000.0, - &displayed_dive.cylinder[current_cylinder].gasmix, - TIMESTEP, po2, &displayed_dive, prefs.decosac); - if (deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, &displayed_dive, 1) > trial_depth - deltad) { - /* We should have stopped */ - clear_to_ascend = false; - break; - } - trial_depth -= deltad; - } - restore_deco_state(trial_cache); - - if (clear_to_ascend) + if (trial_ascent(depth, stoplevels[stopidx], avg_depth, bottom_time, tissue_tolerance, + &displayed_dive.cylinder[current_cylinder].gasmix, po2, diveplan->surface_pressure / 1000.0)) break; /* We did not hit the ceiling */ /* Add a minute of deco time and then try again */ + decodive = true; if (!stopping) { /* The last segment was an ascend segment. * Add a waypoint for start of this deco stop */ @@ -971,7 +1070,6 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s tissue_tolerance = add_segment(depth_to_mbar(depth, &displayed_dive) / 1000.0, &displayed_dive.cylinder[current_cylinder].gasmix, DECOTIMESTEP, po2, &displayed_dive, prefs.decosac); - cache_deco_state(tissue_tolerance, &trial_cache); clock += DECOTIMESTEP; /* Finish infinite deco */ if(clock >= 48 * 3600 && depth >= 6000) { @@ -1003,7 +1101,6 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s } } } - trial_depth = depth; } if (stopping) { /* Next we will ascend again. Add a waypoint if we have spend deco time */ @@ -1023,7 +1120,7 @@ int plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool s free(stoplevels); free(gaschanges); - return error; + return decodive; } /* @@ -1082,6 +1179,10 @@ int validate_gas(const char *text, struct gasmix *gas) o2 = O2_IN_AIR; he = 0; text += strlen(translate("gettextFromC", "air")); + } else if (!strcasecmp(text, translate("gettextFromC", "oxygen"))) { + o2 = 1000; + he = 0; + text += strlen(translate("gettextFromC", "oxygen")); } else if (!strncasecmp(text, translate("gettextFromC", "ean"), 3)) { o2 = get_permille(text + 3, &text); he = 0; @@ -2,6 +2,7 @@ #define PLANNER_H #define LONGDECO 1 +#define NOT_RECREATIONAL 2 #ifdef __cplusplus extern "C" { @@ -48,6 +48,7 @@ struct preferences { short display_invalid_dives; short unit_system; struct units units; + bool coordinates_traditional; short show_sac; short display_unused_tanks; short show_average_depth; @@ -73,6 +74,14 @@ struct preferences { char *proxy_pass; bool doo2breaks; bool drop_stone_mode; + bool last_stop; + bool verbatim_plan; + bool display_runtime; + bool display_duration; + bool display_transitions; + bool recreational_mode; + bool safetystop; + int reserve_gas; int bottomsac; int decosac; int o2consumption; // ml per min @@ -94,6 +103,8 @@ extern struct preferences prefs, default_prefs; extern const char *system_divelist_default_font; extern double system_divelist_default_font_size; + +extern const char *system_default_directory(void); extern const char *system_default_filename(); extern bool subsurface_ignore_font(const char *font); extern void subsurface_OS_pref_setup(); @@ -336,7 +336,7 @@ int get_cylinder_index(struct dive *dive, struct event *ev) return best; } -struct event *get_next_event(struct event *event, char *name) +struct event *get_next_event(struct event *event, const char *name) { if (!name || !*name) return NULL; diff --git a/qt-gui.cpp b/qt-gui.cpp index e007a2563..474622e99 100644 --- a/qt-gui.cpp +++ b/qt-gui.cpp @@ -1,122 +1,24 @@ /* qt-gui.cpp */ /* Qt UI implementation */ -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <ctype.h> - #include "dive.h" -#include "divelist.h" #include "display.h" -#include "uemis.h" -#include "device.h" -#include "webservice.h" -#include "libdivecomputer.h" #include "qt-ui/mainwindow.h" #include "helpers.h" -#include "qthelper.h" #include <QApplication> -#include <QFileDialog> -#include <QFileInfo> -#include <QStringList> -#include <QTextCodec> -#include <QTranslator> -#include <QSettings> #include <QDesktopWidget> -#include <QStyle> -#include <QMap> -#include <QMultiMap> #include <QNetworkProxy> -#include <QDateTime> -#include <QRegExp> -#include <QResource> #include <QLibraryInfo> - -#include <gettextfromc.h> - -// this will create a warning when executing lupdate -#define translate(_context, arg) gettextFromC::instance()->tr(arg) +#include <QTextCodec> static QApplication *application = NULL; static MainWindow *window = NULL; -int error_count; -const char *existing_filename; -static QString shortDateFormat; -static QString dateFormat; -static QString timeFormat; -static QLocale loc; - -#if defined(Q_OS_WIN) && QT_VERSION < 0x050000 -static QByteArray encodeUtf8(const QString &fname) -{ - return fname.toUtf8(); -} - -static QString decodeUtf8(const QByteArray &fname) -{ - return QString::fromUtf8(fname); -} -#endif - void init_qt(int *argcp, char ***argvp) { application = new QApplication(*argcp, *argvp); } -QString uiLanguage(QLocale *callerLoc) -{ - QSettings s; - s.beginGroup("Language"); - - if (!s.value("UseSystemLanguage", true).toBool()) { - loc = QLocale(s.value("UiLanguage", QLocale().uiLanguages().first()).toString()); - } else { - loc = QLocale(QLocale().uiLanguages().first()); - } - - QString uiLang = loc.uiLanguages().first(); - s.endGroup(); - - // there's a stupid Qt bug on MacOS where uiLanguages doesn't give us the country info - if (!uiLang.contains('-') && uiLang != loc.bcp47Name()) { - QLocale loc2(loc.bcp47Name()); - loc = loc2; - uiLang = loc2.uiLanguages().first(); - } - if (callerLoc) - *callerLoc = loc; - - // the short format is fine - // the long format uses long weekday and month names, so replace those with the short ones - // for time we don't want the time zone designator and don't want leading zeroes on the hours - shortDateFormat = loc.dateFormat(QLocale::ShortFormat); - dateFormat = loc.dateFormat(QLocale::LongFormat); - dateFormat.replace("dddd,", "ddd").replace("dddd", "ddd").replace("MMMM", "MMM"); - // special hack for Swedish as our switching from long weekday names to short weekday names - // messes things up there - dateFormat.replace("'en' 'den' d:'e'", " d"); - timeFormat = loc.timeFormat(); - timeFormat.replace("(t)", "").replace(" t", "").replace("t", "").replace("hh", "h").replace("HH", "H").replace("'kl'.", ""); - timeFormat.replace(".ss", "").replace(":ss", "").replace("ss", ""); - return uiLang; -} - -QLocale getLocale() -{ - return loc; -} - -QString getDateFormat() -{ - return dateFormat; -} - void init_ui(void) { // tell Qt to use system proxies @@ -194,275 +96,10 @@ void exit_ui(void) free((void *)default_dive_computer_device); } -void set_filename(const char *filename, bool force) -{ - if (!force && existing_filename) - return; - free((void *)existing_filename); - if (filename) - existing_filename = strdup(filename); - else - existing_filename = NULL; -} - -const QString get_dc_nickname(const char *model, uint32_t deviceid) -{ - const DiveComputerNode *existNode = dcList.getExact(model, deviceid); - - if (existNode && !existNode->nickName.isEmpty()) - return existNode->nickName; - else - return model; -} - -QString get_depth_string(int mm, bool showunit, bool showdecimal) -{ - if (prefs.units.length == units::METERS) { - double meters = mm / 1000.0; - return QString("%1%2").arg(meters, 0, 'f', (showdecimal && meters < 20.0) ? 1 : 0).arg(showunit ? translate("gettextFromC", "m") : ""); - } else { - double feet = mm_to_feet(mm); - return QString("%1%2").arg(feet, 0, 'f', 0).arg(showunit ? translate("gettextFromC", "ft") : ""); - } -} - -QString get_depth_string(depth_t depth, bool showunit, bool showdecimal) -{ - return get_depth_string(depth.mm, showunit, showdecimal); -} - -QString get_depth_unit() -{ - if (prefs.units.length == units::METERS) - return QString("%1").arg(translate("gettextFromC", "m")); - else - return QString("%1").arg(translate("gettextFromC", "ft")); -} - -QString get_weight_string(weight_t weight, bool showunit) -{ - QString str = weight_string(weight.grams); - if (get_units()->weight == units::KG) { - str = QString("%1%2").arg(str).arg(showunit ? translate("gettextFromC", "kg") : ""); - } else { - str = QString("%1%2").arg(str).arg(showunit ? translate("gettextFromC", "lbs") : ""); - } - return (str); -} - -QString get_weight_unit() -{ - if (prefs.units.weight == units::KG) - return QString("%1").arg(translate("gettextFromC", "kg")); - else - return QString("%1").arg(translate("gettextFromC", "lbs")); -} - -/* these methods retrieve used gas per cylinder */ -static unsigned start_pressure(cylinder_t *cyl) -{ - return cyl->start.mbar ?: cyl->sample_start.mbar; -} - -static unsigned end_pressure(cylinder_t *cyl) -{ - return cyl->end.mbar ?: cyl->sample_end.mbar; -} - -QString get_cylinder_used_gas_string(cylinder_t *cyl, bool showunit) -{ - int decimals; - const char *unit; - double gas_usage; - /* Get the cylinder gas use in mbar */ - gas_usage = start_pressure(cyl) - end_pressure(cyl); - /* Can we turn it into a volume? */ - if (cyl->type.size.mliter) { - gas_usage = bar_to_atm(gas_usage / 1000); - gas_usage *= cyl->type.size.mliter; - gas_usage = get_volume_units(gas_usage, &decimals, &unit); - } else { - gas_usage = get_pressure_units(gas_usage, &unit); - decimals = 0; - } - // translate("gettextFromC","%.*f %s" - return QString("%1 %2").arg(gas_usage, 0, 'f', decimals).arg(showunit ? unit : ""); -} - -QString get_temperature_string(temperature_t temp, bool showunit) -{ - if (temp.mkelvin == 0) { - return ""; //temperature not defined - } else if (prefs.units.temperature == units::CELSIUS) { - double celsius = mkelvin_to_C(temp.mkelvin); - return QString("%1%2%3").arg(celsius, 0, 'f', 1).arg(showunit ? (UTF8_DEGREE) : "").arg(showunit ? translate("gettextFromC", "C") : ""); - } else { - double fahrenheit = mkelvin_to_F(temp.mkelvin); - return QString("%1%2%3").arg(fahrenheit, 0, 'f', 1).arg(showunit ? (UTF8_DEGREE) : "").arg(showunit ? translate("gettextFromC", "F") : ""); - } -} - -QString get_temp_unit() -{ - if (prefs.units.temperature == units::CELSIUS) - return QString(UTF8_DEGREE "C"); - else - return QString(UTF8_DEGREE "F"); -} - -QString get_volume_string(volume_t volume, bool showunit, int mbar) -{ - const char *unit; - int decimals; - double value = get_volume_units(volume.mliter, &decimals, &unit); - if (mbar) { - // we are showing a tank size - // fix the weird imperial way of denominating size and provide - // reasonable number of decimals - if (prefs.units.volume == units::CUFT) - value *= bar_to_atm(mbar / 1000.0); - decimals = (value > 20.0) ? 0 : (value > 2.0) ? 1 : 2; - } - return QString("%1%2").arg(value, 0, 'f', decimals).arg(showunit ? unit : ""); -} - -QString get_volume_unit() -{ - const char *unit; - (void) get_volume_units(0, NULL, &unit); - return QString(unit); -} - -QString get_pressure_string(pressure_t pressure, bool showunit) -{ - if (prefs.units.pressure == units::BAR) { - double bar = pressure.mbar / 1000.0; - return QString("%1%2").arg(bar, 0, 'f', 1).arg(showunit ? translate("gettextFromC", "bar") : ""); - } else { - double psi = mbar_to_PSI(pressure.mbar); - return QString("%1%2").arg(psi, 0, 'f', 0).arg(showunit ? translate("gettextFromC", "psi") : ""); - } -} - double get_screen_dpi() { QDesktopWidget *mydesk = application->desktop(); return mydesk->physicalDpiX(); } -QString getSubsurfaceDataPath(QString folderToFind) -{ - QString execdir; - QDir folder; - - // first check if we are running in the build dir, so the path that we - // are looking for is just a subdirectory of the execution path; - // this also works on Windows as there we install the dirs - // under the application path - execdir = QCoreApplication::applicationDirPath(); - folder = QDir(execdir.append(QDir::separator()).append(folderToFind)); - if (folder.exists()) - return folder.absolutePath(); - - // next check for the Linux typical $(prefix)/share/subsurface - execdir = QCoreApplication::applicationDirPath(); - if (execdir.contains("bin")) { - folder = QDir(execdir.replace("bin", "share/subsurface/").append(folderToFind)); - if (folder.exists()) - return folder.absolutePath(); - } - // then look for the usual locations on a Mac - execdir = QCoreApplication::applicationDirPath(); - folder = QDir(execdir.append("/../Resources/share/").append(folderToFind)); - if (folder.exists()) - return folder.absolutePath(); - execdir = QCoreApplication::applicationDirPath(); - folder = QDir(execdir.append("/../Resources/").append(folderToFind)); - if (folder.exists()) - return folder.absolutePath(); - return QString(""); -} - -int gettimezoneoffset(timestamp_t when) -{ - QDateTime dt1, dt2; - if (when == 0) - dt1 = QDateTime::currentDateTime(); - else - dt1 = QDateTime::fromMSecsSinceEpoch(when * 1000); - dt2 = dt1.toUTC(); - dt1.setTimeSpec(Qt::UTC); - return dt2.secsTo(dt1); -} - -int parseTemperatureToMkelvin(const QString &text) -{ - int mkelvin; - QString numOnly = text; - numOnly.replace(",", ".").remove(QRegExp("[^-0-9.]")); - if (numOnly.isEmpty()) - return 0; - double number = numOnly.toDouble(); - switch (prefs.units.temperature) { - case units::CELSIUS: - mkelvin = C_to_mkelvin(number); - break; - case units::FAHRENHEIT: - mkelvin = F_to_mkelvin(number); - break; - default: - mkelvin = 0; - } - return mkelvin; -} - -QString get_dive_duration_string(timestamp_t when, QString hourText, QString minutesText) -{ - int hrs, mins; - mins = (when + 59) / 60; - hrs = mins / 60; - mins -= hrs * 60; - - QString displayTime; - if (hrs) - displayTime = QString("%1%2%3%4").arg(hrs).arg(hourText).arg(mins, 2, 10, QChar('0')).arg(minutesText); - else - displayTime = QString("%1%2").arg(mins).arg(minutesText); - return displayTime; -} - -QString get_dive_date_string(timestamp_t when) -{ - QDateTime ts; - ts.setMSecsSinceEpoch(when * 1000L); - return loc.toString(ts.toUTC(), dateFormat + " " + timeFormat); -} - -QString get_short_dive_date_string(timestamp_t when) -{ - QDateTime ts; - ts.setMSecsSinceEpoch(when * 1000L); - return loc.toString(ts.toUTC(), shortDateFormat + " " + timeFormat); -} - -const char *get_dive_date_c_string(timestamp_t when) -{ - QString text = get_dive_date_string(when); - return strdup(text.toUtf8().data()); -} - -QString get_trip_date_string(timestamp_t when, int nr) -{ - struct tm tm; - utc_mkdate(when, &tm); - if (nr != 1) - return translate("gettextFromC", "%1 %2 (%3 dives)") - .arg(monthname(tm.tm_mon)) - .arg(tm.tm_year + 1900) - .arg(nr); - else - return translate("gettextFromC", "%1 %2 (1 dive)") - .arg(monthname(tm.tm_mon)) - .arg(tm.tm_year + 1900); -} diff --git a/qt-ui/about.cpp b/qt-ui/about.cpp index 361031599..203357010 100644 --- a/qt-ui/about.cpp +++ b/qt-ui/about.cpp @@ -1,5 +1,5 @@ #include "about.h" -#include "ssrf-version.h" +#include "version.h" #include <QDesktopServices> #include <QUrl> #include <QShortcut> @@ -9,7 +9,7 @@ SubsurfaceAbout::SubsurfaceAbout(QWidget *parent, Qt::WindowFlags f) : QDialog(p ui.setupUi(this); setWindowModality(Qt::ApplicationModal); - QString versionString(GIT_VERSION_STRING); + QString versionString(subsurface_git_version()); QStringList readableVersions = QStringList() << "4.3.950" << "4.4 Beta 1" << "4.3.960" << "4.4 Beta 2" << "4.3.970" << "4.4 Beta 3"; diff --git a/qt-ui/completionmodels.cpp b/qt-ui/completionmodels.cpp index fd3cc7504..f2e70afd1 100644 --- a/qt-ui/completionmodels.cpp +++ b/qt-ui/completionmodels.cpp @@ -40,9 +40,21 @@ CREATE_CSV_UPDATE_METHOD(BuddyCompletionModel, buddy); CREATE_CSV_UPDATE_METHOD(DiveMasterCompletionModel, divemaster); -CREATE_UPDATE_METHOD(LocationCompletionModel, location); CREATE_UPDATE_METHOD(SuitCompletionModel, suit); +void LocationCompletionModel::updateModel() +{ + QStringList list; + struct dive_site *ds; + int i = 0; + for_each_dive_site(i, ds) { + if (!list.contains(ds->name)) + list.append(ds->name); + } + std::sort(list.begin(), list.end()); + setStringList(list); +} + void TagCompletionModel::updateModel() { if (g_tag_list == NULL) diff --git a/qt-ui/configuredivecomputerdialog.cpp b/qt-ui/configuredivecomputerdialog.cpp index 95bc0f882..172a1a480 100644 --- a/qt-ui/configuredivecomputerdialog.cpp +++ b/qt-ui/configuredivecomputerdialog.cpp @@ -2,6 +2,8 @@ #include "helpers.h" #include "mainwindow.h" +#include "display.h" + #include <QFileDialog> #include <QMessageBox> #include <QSettings> diff --git a/qt-ui/divecomponentselection.ui b/qt-ui/divecomponentselection.ui index dbd0839ba..7eade039b 100644 --- a/qt-ui/divecomponentselection.ui +++ b/qt-ui/divecomponentselection.ui @@ -9,8 +9,8 @@ <rect> <x>0</x> <y>0</y> - <width>308</width> - <height>263</height> + <width>401</width> + <height>317</height> </rect> </property> <property name="sizePolicy"> @@ -41,9 +41,9 @@ </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> - <widget class="QCheckBox" name="location"> + <widget class="QCheckBox" name="divesite"> <property name="text"> - <string>Location</string> + <string>Dive site</string> </property> </widget> </item> @@ -54,34 +54,6 @@ </property> </widget> </item> - <item row="1" column="0"> - <widget class="QCheckBox" name="gps"> - <property name="text"> - <string>GPS coordinates</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QCheckBox" name="divemaster"> - <property name="text"> - <string>Divemaster</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QCheckBox" name="buddy"> - <property name="text"> - <string>Buddy</string> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QCheckBox" name="rating"> - <property name="text"> - <string>Rating</string> - </property> - </widget> - </item> <item row="5" column="0"> <widget class="QCheckBox" name="visibility"> <property name="text"> @@ -117,6 +89,27 @@ </property> </widget> </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="divemaster"> + <property name="text"> + <string>Divemaster</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QCheckBox" name="buddy"> + <property name="text"> + <string>Buddy</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QCheckBox" name="rating"> + <property name="text"> + <string>Rating</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/qt-ui/divecomputermanagementdialog.cpp b/qt-ui/divecomputermanagementdialog.cpp index 742facdcb..552f6058f 100644 --- a/qt-ui/divecomputermanagementdialog.cpp +++ b/qt-ui/divecomputermanagementdialog.cpp @@ -1,6 +1,7 @@ #include "divecomputermanagementdialog.h" #include "mainwindow.h" #include "helpers.h" +#include "models.h" #include <QMessageBox> #include <QShortcut> diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index d4e744237..16033dca9 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -4,13 +4,22 @@ * classes for the divelist of Subsurface * */ -#include "divelistview.h" #include "filtermodels.h" #include "modeldelegates.h" #include "mainwindow.h" +#include "divepicturewidget.h" +#include "display.h" +#include <unistd.h> #include <QSettings> +#include <QKeyEvent> #include <QFileDialog> +#include <QNetworkAccessManager> +#include <QNetworkReply> +#include <QStandardPaths> +#include <QMessageBox> #include "qthelper.h" +#include "undocommands.h" +#include "divelistview.h" // # Date Rtg Dpth Dur Tmp Wght Suit Cyl Gas SAC OTU CNS Loc static int defaultWidth[] = { 70, 140, 90, 50, 50, 50, 50, 70, 50, 50, 70, 50, 50, 500}; @@ -30,6 +39,7 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec setSortingEnabled(false); setContextMenuPolicy(Qt::DefaultContextMenu); + setSelectionMode(ExtendedSelection); header()->setContextMenuPolicy(Qt::ActionsContextMenu); const QFontMetrics metrics(defaultModelFont()); @@ -39,7 +49,7 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec // Fixes for the layout needed for mac #ifdef Q_OS_MAC int ht = metrics.height(); - header()->setMinimumHeight(ht + 10); + header()->setMinimumHeight(ht + 4); #endif // TODO FIXME we need this to get the header names @@ -84,6 +94,8 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec header()->setStretchLastSection(true); + + installEventFilter(this); } DiveListView::~DiveListView() @@ -175,8 +187,13 @@ void DiveListView::rememberSelection() if (index.column() != 0) // We only care about the dives, so, let's stick to rows and discard columns. continue; struct dive *d = (struct dive *)index.data(DiveTripModel::DIVE_ROLE).value<void *>(); - if (d) + if (d) { selectedDives.insert(d->divetrip, get_divenr(d)); + } else { + struct dive_trip *t = (struct dive_trip *)index.data(DiveTripModel::TRIP_ROLE).value<void *>(); + if (t) + selectedDives.insert(t, -1); + } } selectionSaved = true; } @@ -195,8 +212,10 @@ void DiveListView::restoreSelection() QList<int> selectedDivesOnTrip = selectedDives.values(trip); // Only select trip if all of its dives were selected - if (trip != NULL && divesOnTrip.count() == selectedDivesOnTrip.count()) + if(selectedDivesOnTrip.contains(-1)) { selectTrip(trip); + selectedDivesOnTrip.removeAll(-1); + } selectDives(selectedDivesOnTrip); } } @@ -343,6 +362,10 @@ bool DiveListView::eventFilter(QObject *, QEvent *event) if (event->type() != QEvent::KeyPress) return false; QKeyEvent *keyEv = static_cast<QKeyEvent *>(event); + if (keyEv->key() == Qt::Key_Delete) { + contextMenuIndex = currentIndex(); + deleteDive(); + } if (keyEv->key() != Qt::Key_Escape) return false; return true; @@ -492,6 +515,8 @@ void DiveListView::toggleColumnVisibilityByIndex() void DiveListView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { + if (!isVisible()) + return; if (!current.isValid()) return; scrollTo(current); @@ -542,15 +567,32 @@ void DiveListView::selectionChanged(const QItemSelection &selected, const QItemS Q_EMIT currentDiveChanged(selected_dive); } -static bool can_merge(const struct dive *a, const struct dive *b) +enum asked_user {NOTYET, MERGE, DONTMERGE}; + +static bool can_merge(const struct dive *a, const struct dive *b, enum asked_user *have_asked) { if (!a || !b) return false; if (a->when > b->when) return false; /* Don't merge dives if there's more than half an hour between them */ - if (a->when + a->duration.seconds + 30 * 60 < b->when) - return false; + if (a->when + a->duration.seconds + 30 * 60 < b->when) { + if (*have_asked == NOTYET) { + if (QMessageBox::warning(MainWindow::instance(), + MainWindow::instance()->tr("Warning"), + MainWindow::instance()->tr("Trying to merge dives with %1min interval in between").arg( + (b->when - a->when - a->duration.seconds) / 60), + QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) { + *have_asked = DONTMERGE; + return false; + } else { + *have_asked = MERGE; + return true; + } + } else { + return *have_asked == MERGE ? true : false; + } + } return true; } @@ -558,10 +600,11 @@ void DiveListView::mergeDives() { int i; struct dive *dive, *maindive = NULL; + enum asked_user have_asked = NOTYET; for_each_dive (i, dive) { if (dive->selected) { - if (!can_merge(maindive, dive)) { + if (!can_merge(maindive, dive, &have_asked)) { maindive = dive; } else { maindive = merge_two_dives(maindive, dive); @@ -611,10 +654,14 @@ void DiveListView::removeFromTrip() //TODO: move this to C-code. int i; struct dive *d; + QMap<struct dive*, dive_trip*> divesToRemove; for_each_dive (i, d) { if (d->selected) - remove_dive_from_trip(d, false); + divesToRemove.insert(d, d->divetrip); } + UndoRemoveDivesFromTrip *undoCommand = new UndoRemoveDivesFromTrip(divesToRemove); + MainWindow::instance()->undoStack->push(undoCommand); + rememberSelection(); reload(currentLayout, false); fixMessyQtModelBehaviour(); @@ -721,13 +768,19 @@ void DiveListView::deleteDive() // so instead of using the for_each_dive macro I'm using an explicit for loop // to make this easier to understand int lastDiveNr = -1; + QList<struct dive*> deletedDives; //a list of all deleted dives to be stored in the undo command for_each_dive (i, d) { if (!d->selected) continue; + struct dive* undo_entry = alloc_dive(); + copy_dive(get_dive(i), undo_entry); + deletedDives.append(undo_entry); delete_single_dive(i); i--; // so the next dive isn't skipped... it's now #i lastDiveNr = i; } + UndoDeleteDive *undoEntry = new UndoDeleteDive(deletedDives); + MainWindow::instance()->undoStack->push(undoEntry); if (amount_selected == 0) { MainWindow::instance()->cleanUpEmpty(); } @@ -765,9 +818,32 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event) dive_trip_t *trip = (dive_trip_t *)contextMenuIndex.data(DiveTripModel::TRIP_ROLE).value<void *>(); QMenu popup(this); if (currentLayout == DiveTripModel::TREE) { - popup.addAction(tr("Expand all"), this, SLOT(expandAll())); - popup.addAction(tr("Collapse all"), this, SLOT(collapseAll())); - collapseAction = popup.addAction(tr("Collapse others"), this, SLOT(collapseAll())); + // verify if there is a node that`s not expanded. + bool needs_expand = false; + bool needs_collapse = false; + uint expanded_nodes = 0; + for(int i = 0, end = model()->rowCount(); i < end; i++) { + QModelIndex idx = model()->index(i, 0); + if (idx.data(DiveTripModel::DIVE_ROLE).value<void *>()) + continue; + + if (!isExpanded(idx)) { + needs_expand = true; + } else { + needs_collapse = true; + expanded_nodes ++; + } + } + if (needs_expand) + popup.addAction(tr("Expand all"), this, SLOT(expandAll())); + if (needs_collapse) + popup.addAction(tr("Collapse all"), this, SLOT(collapseAll())); + + // verify if there`s a need for collapse others + if (expanded_nodes > 1) + collapseAction = popup.addAction(tr("Collapse others"), this, SLOT(collapseAll())); + + if (d) { popup.addAction(tr("Remove dive(s) from trip"), this, SLOT(removeFromTrip())); popup.addAction(tr("Create new trip above"), this, SLOT(newTripAbove())); @@ -804,8 +880,9 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event) popup.addAction(tr("Merge selected dives"), this, SLOT(mergeDives())); if (amount_selected >= 1) { popup.addAction(tr("Renumber dive(s)"), this, SLOT(renumberDives())); - popup.addAction(tr("Shift times"), this, SLOT(shiftTimes())); - popup.addAction(tr("Load images"), this, SLOT(loadImages())); + popup.addAction(tr("Shift dive times"), this, SLOT(shiftTimes())); + popup.addAction(tr("Load image(s) from file(s)"), this, SLOT(loadImages())); + popup.addAction(tr("Load image(s) from web"), this, SLOT(loadWebImages())); } // "collapse all" really closes all trips, @@ -831,11 +908,16 @@ void DiveListView::loadImages() QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open image files"), lastUsedImageDir(), tr("Image files (*.jpg *.jpeg *.pnm *.tif *.tiff)")); if (fileNames.isEmpty()) return; - updateLastUsedImageDir(QFileInfo(fileNames[0]).dir().path()); - ShiftImageTimesDialog shiftDialog(this); + matchImagesToDives(fileNames); +} + +void DiveListView::matchImagesToDives(QStringList fileNames) +{ + ShiftImageTimesDialog shiftDialog(this, fileNames); shiftDialog.setOffset(lastImageTimeOffset()); - shiftDialog.exec(); + if (!shiftDialog.exec()) + return; updateLastImageTimeOffset(shiftDialog.amount()); Q_FOREACH (const QString &fileName, fileNames) { @@ -844,7 +926,7 @@ void DiveListView::loadImages() for_each_dive (j, dive) { if (!dive->selected) continue; - dive_create_picture(dive, qstrdup(fileName.toUtf8().data()), shiftDialog.amount()); + dive_create_picture(dive, copy_string(fileName.toUtf8().data()), shiftDialog.amount()); } } @@ -853,6 +935,60 @@ void DiveListView::loadImages() DivePictureModel::instance()->updateDivePictures(); } +void DiveListView::loadWebImages() +{ + URLDialog urlDialog(this); + if (!urlDialog.exec()) + return; + loadImageFromURL(QUrl::fromUserInput(urlDialog.url())); + +} + +void DiveListView::loadImageFromURL(QUrl url) +{ + if (url.isValid()) { + QEventLoop loop; + QNetworkRequest request(url); + QNetworkReply *reply = manager.get(request); + while (reply->isRunning()) { + loop.processEvents(); + sleep(1); + } + QByteArray imageData = reply->readAll(); + + QImage image = QImage(); + image.loadFromData(imageData); + if (image.isNull()) + // If this is not an image, maybe it's an html file and Miika can provide some xslr magic to extract images. + // In this case we would call the function recursively on the list of image source urls; + return; + + // Since we already downloaded the image we can cache it as well. + QCryptographicHash hash(QCryptographicHash::Sha1); + hash.addData(imageData); + QString path = QStandardPaths::standardLocations(QStandardPaths::CacheLocation).first(); + QDir dir(path); + if (!dir.exists()) + dir.mkpath(path); + QFile imageFile(path.append("/").append(hash.result().toHex())); + if (imageFile.open(QIODevice::WriteOnly)) { + QDataStream stream(&imageFile); + stream.writeRawData(imageData.data(), imageData.length()); + imageFile.waitForBytesWritten(-1); + imageFile.close(); + add_hash(imageFile.fileName(), hash.result()); + struct picture picture; + picture.hash = NULL; + picture.filename = strdup(url.toString().toUtf8().data()); + learnHash(&picture, hash.result()); + matchImagesToDives(QStringList(url.toString())); + } + } + + +} + + QString DiveListView::lastUsedImageDir() { QSettings settings; diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h index a6522fa9a..6e9a18215 100644 --- a/qt-ui/divelistview.h +++ b/qt-ui/divelistview.h @@ -13,6 +13,7 @@ #include <QTreeView> #include <QLineEdit> +#include <QNetworkAccessManager> #include "models.h" class DiveListView : public QTreeView { @@ -51,6 +52,7 @@ slots: void renumberDives(); void shiftTimes(); void loadImages(); + void loadWebImages(); static QString lastUsedImageDir(); signals: @@ -78,6 +80,9 @@ private: void updateLastImageTimeOffset(int offset); int lastImageTimeOffset(); void addToTrip(int delta); + void matchImagesToDives(QStringList fileNames); + void loadImageFromURL(QUrl url); + QNetworkAccessManager manager; }; #endif // DIVELISTVIEW_H diff --git a/qt-ui/divelogexportdialog.cpp b/qt-ui/divelogexportdialog.cpp index 43c41550f..12a8c320f 100644 --- a/qt-ui/divelogexportdialog.cpp +++ b/qt-ui/divelogexportdialog.cpp @@ -9,6 +9,7 @@ #include "subsurfacewebservices.h" #include "worldmap-save.h" #include "save-html.h" +#include "mainwindow.h" #define GET_UNIT(name, field, f, t) \ v = settings.value(QString(name)); \ @@ -55,6 +56,9 @@ DiveLogExportDialog::DiveLogExportDialog(QWidget *parent) : QDialog(parent), if (settings.contains("listOnly")) { ui->exportListOnly->setChecked(settings.value("listOnly").toBool()); } + if (settings.contains("exportPhotos")) { + ui->exportPhotos->setChecked(settings.value("exportPhotos").toBool()); + } settings.endGroup(); } @@ -104,8 +108,12 @@ void DiveLogExportDialog::exportHtmlInit(const QString &filename) QString json_settings = exportFiles + QDir::separator() + "settings.js"; QString translation = exportFiles + QDir::separator() + "translation.js"; QString stat_file = exportFiles + QDir::separator() + "stat.js"; - QString photos_directory = exportFiles + QDir::separator() + "photos" + QDir::separator(); - mainDir.mkdir(photos_directory); + + QString photos_directory; + if (ui->exportPhotos->isChecked()) { + photos_directory = exportFiles + QDir::separator() + "photos" + QDir::separator(); + mainDir.mkdir(photos_directory); + } exportFiles += "/"; exportHTMLsettings(json_settings); @@ -142,6 +150,7 @@ void DiveLogExportDialog::exportHTMLsettings(const QString &filename) settings.setValue("subsurfaceNumbers", ui->exportSubsurfaceNumber->isChecked()); settings.setValue("yearlyStatistics", ui->exportStatistics->isChecked()); settings.setValue("listOnly", ui->exportListOnly->isChecked()); + settings.setValue("exportPhotos", ui->exportPhotos->isChecked()); settings.endGroup(); QString fontSize = ui->fontSizeSelection->currentText(); @@ -312,8 +321,11 @@ void DiveLogExportDialog::on_buttonBox_accepted() settings.setValue("LastDir", fileInfo.dir().path()); settings.endGroup(); // the non XSLT exports are called directly above, the XSLT based ons are called here - if (!stylesheet.isEmpty()) + if (!stylesheet.isEmpty()) { future = QtConcurrent::run(export_dives_xslt, filename.toUtf8(), ui->exportSelected->isChecked(), ui->CSVUnits_2->currentIndex(), stylesheet.toUtf8()); + MainWindow::instance()->getNotificationWidget()->showNotification(tr("Please Wait, Exporting..."), KMessageWidget::Information); + MainWindow::instance()->getNotificationWidget()->setFuture(future); + } } } diff --git a/qt-ui/divelogexportdialog.ui b/qt-ui/divelogexportdialog.ui index 7514a6551..1f3675ef4 100644 --- a/qt-ui/divelogexportdialog.ui +++ b/qt-ui/divelogexportdialog.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>507</width> - <height>423</height> + <height>468</height> </rect> </property> <property name="windowTitle"> @@ -233,9 +233,9 @@ </layout> </widget> <widget class="QGroupBox" name="groupBox"> - <property name="enabled"> - <bool>false</bool> - </property> + <property name="enabled"> + <bool>false</bool> + </property> <property name="geometry"> <rect> <x>0</x> @@ -338,13 +338,23 @@ </attribute> </widget> </item> - <item row="2" column="0"> + <item row="3" column="0"> <widget class="QCheckBox" name="exportListOnly"> <property name="text"> <string>Export list only</string> </property> </widget> </item> + <item row="2" column="0"> + <widget class="QCheckBox" name="exportPhotos"> + <property name="text"> + <string>Export photos</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> </layout> </widget> </item> @@ -363,6 +373,9 @@ <bool>false</bool> </property> <layout class="QFormLayout" name="formLayout"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::AllNonFixedFieldsGrow</enum> + </property> <item row="0" column="0"> <widget class="QLabel" name="fontLabel"> <property name="text"> @@ -513,20 +526,40 @@ </hints> </connection> <connection> - <sender>exportCSV</sender> - <signal>toggled(bool)</signal> - <receiver>groupBox</receiver> - <slot>setEnabled(bool)</slot> + <sender>exportCSV</sender> + <signal>toggled(bool)</signal> + <receiver>groupBox</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> </connection> <connection> - <sender>exportCSVDetails</sender> - <signal>toggled(bool)</signal> - <receiver>groupBox</receiver> - <slot>setEnabled(bool)</slot> + <sender>exportCSVDetails</sender> + <signal>toggled(bool)</signal> + <receiver>groupBox</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> </connection> </connections> <buttongroups> - <buttongroup name="exportGroup"/> <buttongroup name="buttonGroup"/> + <buttongroup name="exportGroup"/> </buttongroups> </ui> diff --git a/qt-ui/divelogimportdialog.cpp b/qt-ui/divelogimportdialog.cpp index bb4701ce3..409064833 100644 --- a/qt-ui/divelogimportdialog.cpp +++ b/qt-ui/divelogimportdialog.cpp @@ -1,5 +1,6 @@ #include "divelogimportdialog.h" #include "mainwindow.h" +#include "color.h" #include "ui_divelogimportdialog.h" #include <QShortcut> #include <QDrag> @@ -23,7 +24,7 @@ const DiveLogImportDialog::CSVAppConfig DiveLogImportDialog::CSVApps[CSVAPPS] = ColumnNameProvider::ColumnNameProvider(QObject *parent) : QAbstractListModel(parent) { columnNames << tr("Dive #") << tr("Date") << tr("Time") << tr("Duration") << tr("Location") << tr("GPS") << tr("Weight") << tr("Cyl. size") << tr("Start pressure") << - tr("End pressure") << tr("Max. depth") << tr("Avg. depth") << tr("Divemaster") << tr("Buddy") << tr("Notes") << tr("Tags") << tr("Air temp.") << tr("Water temp.") << + tr("End pressure") << tr("Max. depth") << tr("Avg. depth") << tr("Divemaster") << tr("Buddy") << tr("Suit") << tr("Notes") << tr("Tags") << tr("Air temp.") << tr("Water temp.") << tr("Oâ‚‚") << tr("He") << tr("Sample time") << tr("Sample depth") << tr("Sample temperature") << tr("Sample pOâ‚‚") << tr("Sample CNS") << tr("Sample NDL") << tr("Sample TTS") << tr("Sample stopdepth") << tr("Sample pressure"); } @@ -315,6 +316,7 @@ DiveLogImportDialog::DiveLogImportDialog(QStringList fn, QWidget *parent) : QDia ui->setupUi(this); fileNames = fn; column = 0; + delta = "0"; /* Add indexes of XSLTs requiring special handling to the list */ specialCSV << 3; @@ -374,7 +376,53 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) QString firstLine = f.readLine(); if (firstLine.contains("SEABEAR")) { seabear = true; - firstLine = "Sample time;Sample depth;Sample NDL;Sample TTS;Sample stopdepth;Sample temperature;Sample pressure"; + + /* + * Parse header - currently only interested in sample + * interval, or if we have old format (if interval value + * is missing from the header). + */ + + while ((firstLine = f.readLine()).length() > 3 && !f.atEnd()) { + if (firstLine.contains("//Log interval: ")) + delta = firstLine.remove(QString::fromLatin1("//Log interval: ")).trimmed(); + } + + /* + * Parse CSV fields + * The pO2 values from CCR diving are ignored later on. + */ + + firstLine = f.readLine().trimmed(); + + currColumns = firstLine.split(';'); + Q_FOREACH (QString columnText, currColumns) { + if (columnText == "Time") { + headers.append("Sample time"); + } else if (columnText == "Depth") { + headers.append("Sample depth"); + } else if (columnText == "Temperature") { + headers.append("Sample temperature"); + } else if (columnText == "NDT") { + headers.append("Sample NDL"); + } else if (columnText == "TTS") { + headers.append("Sample TTS"); + } else if (columnText == "pO2_1") { + headers.append("Sample pO2_1"); + } else if (columnText == "pO2_2") { + headers.append("Sample pO2_2"); + } else if (columnText == "pO2_3") { + headers.append("Sample pO2_3"); + } else if (columnText == "Ceiling") { + headers.append("Sample ceiling"); + } else { + // We do not know about this value + qDebug() << "Seabear import found an un-handled field: " << columnText; + headers.append(""); + } + } + + firstLine = headers.join(";"); blockSignals(true); ui->knownImports->setCurrentText("Seabear CSV"); blockSignals(false); @@ -513,7 +561,7 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) } while (rows < 10 && !f.atEnd()) { - QString currLine = f.readLine(); + QString currLine = f.readLine().trimmed(); currColumns = currLine.split(separator); fileColumns.append(currColumns); rows += 1; @@ -526,6 +574,7 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy) void DiveLogImportDialog::on_buttonBox_accepted() { + imported_via_xslt = true; QStringList r = resultModel->result(); if (ui->knownImports->currentText() != "Manual import") { for (int i = 0; i < fileNames.size(); ++i) { @@ -542,10 +591,12 @@ void DiveLogImportDialog::on_buttonBox_accepted() r.indexOf(tr("Sample pressure")), ui->CSVSeparator->currentIndex(), specialCSV.contains(ui->knownImports->currentIndex()) ? CSVApps[ui->knownImports->currentIndex()].name.toUtf8().data() : "csv", - ui->CSVUnits->currentIndex() - ) < 0) + ui->CSVUnits->currentIndex(), + delta.toUtf8().data() + ) < 0) { + imported_via_xslt = false; return; - + } // Seabear CSV stores NDL and TTS in Minutes, not seconds struct dive *dive = dive_table.dives[dive_table.nr - 1]; for(int s_nr = 0 ; s_nr <= dive->dc.samples ; s_nr++) { @@ -585,9 +636,10 @@ void DiveLogImportDialog::on_buttonBox_accepted() r.indexOf(tr("Location")), r.indexOf(tr("GPS")), r.indexOf(tr("Max. depth")), - r.indexOf(tr("Mean depth")), + r.indexOf(tr("Avg. depth")), r.indexOf(tr("Divemaster")), r.indexOf(tr("Buddy")), + r.indexOf(tr("Suit")), r.indexOf(tr("Notes")), r.indexOf(tr("Weight")), r.indexOf(tr("Tags")), @@ -618,6 +670,7 @@ void DiveLogImportDialog::on_buttonBox_accepted() } process_dives(true, false); MainWindow::instance()->refreshDisplay(); + imported_via_xslt = false; } TagDragDelegate::TagDragDelegate(QObject *parent) : QStyledItemDelegate(parent) diff --git a/qt-ui/divelogimportdialog.h b/qt-ui/divelogimportdialog.h index 9281b2b10..e7d068a81 100644 --- a/qt-ui/divelogimportdialog.h +++ b/qt-ui/divelogimportdialog.h @@ -95,6 +95,7 @@ private: QList<int> specialCSV; int column; ColumnNameResult *resultModel; + QString delta; struct CSVAppConfig { QString name; diff --git a/qt-ui/divepicturewidget.cpp b/qt-ui/divepicturewidget.cpp index 92695b6a6..8c1cb3571 100644 --- a/qt-ui/divepicturewidget.cpp +++ b/qt-ui/divepicturewidget.cpp @@ -2,8 +2,90 @@ #include "metrics.h" #include "dive.h" #include "divelist.h" +#include <unistd.h> #include <QtConcurrentMap> +#include <QtConcurrentRun> +#include <QFuture> #include <QDir> +#include <QCryptographicHash> +#include <QNetworkAccessManager> +#include <QNetworkReply> +#include <mainwindow.h> +#include <qthelper.h> +#include <QStandardPaths> + +void loadPicuture(struct picture *picture) +{ + ImageDownloader download(picture); + download.load(); +} + +SHashedImage::SHashedImage(struct picture *picture) : QImage() +{ + QUrl url = QUrl::fromUserInput(QString(picture->filename)); + if(url.isLocalFile()) + load(url.toLocalFile()); + if (isNull()) { + // Hash lookup. + load(fileFromHash(picture->hash)); + if (!isNull()) { + QtConcurrent::run(updateHash, picture); + } else { + QtConcurrent::run(loadPicuture, picture); + } + } else { + QByteArray hash = hashFile(url.toLocalFile()); + free(picture->hash); + picture->hash = strdup(hash.toHex().data()); + } +} + +ImageDownloader::ImageDownloader(struct picture *pic) +{ + picture = pic; +} + +void ImageDownloader::load(){ + QUrl url = QUrl::fromUserInput(QString(picture->filename)); + if (url.isValid()) { + QEventLoop loop; + QNetworkRequest request(url); + connect(&manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveImage(QNetworkReply *))); + QNetworkReply *reply = manager.get(request); + while (reply->isRunning()) { + loop.processEvents(); + sleep(1); + } + } + +} + +void ImageDownloader::saveImage(QNetworkReply *reply) +{ + QByteArray imageData = reply->readAll(); + QImage image = QImage(); + image.loadFromData(imageData); + if (image.isNull()) + return; + QCryptographicHash hash(QCryptographicHash::Sha1); + hash.addData(imageData); + QString path = QStandardPaths::standardLocations(QStandardPaths::CacheLocation).first(); + QDir dir(path); + if (!dir.exists()) + dir.mkpath(path); + QFile imageFile(path.append("/").append(hash.result().toHex())); + if (imageFile.open(QIODevice::WriteOnly)) { + QDataStream stream(&imageFile); + stream.writeRawData(imageData.data(), imageData.length()); + imageFile.waitForBytesWritten(-1); + imageFile.close(); + add_hash(imageFile.fileName(), hash.result()); + learnHash(picture, hash.result()); + DivePictureModel::instance()->updateDivePictures(); + } + reply->manager()->deleteLater(); + reply->deleteLater(); +} DivePictureModel *DivePictureModel::instance() { @@ -15,25 +97,36 @@ DivePictureModel::DivePictureModel() : numberOfPictures(0) { } -typedef QPair<QString, QImage> SPixmap; -typedef QList<SPixmap> SPixmapList; +typedef struct picture *picturepointer; +typedef QPair<picturepointer, QImage> SPixmap; +typedef QList<struct picture *> SPictureList; -SPixmap scaleImages(const QString &s) +SPixmap scaleImages(picturepointer picture) { static QHash <QString, QImage > cache; SPixmap ret; - ret.first = s; - if (cache.contains(s)) { - ret.second = cache.value(s); + ret.first = picture; + if (cache.contains(picture->filename) && !cache.value(picture->filename).isNull()) { + ret.second = cache.value(picture->filename); } else { int dim = defaultIconMetrics().sz_pic; - QImage p = QImage(s).scaled(dim, dim, Qt::KeepAspectRatio); - cache.insert(s, p); + QImage p = SHashedImage(picture); + if(!p.isNull()) + p = p.scaled(dim, dim, Qt::KeepAspectRatio); + cache.insert(picture->filename, p); ret.second = p; } return ret; } +void DivePictureModel::updateDivePicturesWhenDone(QList<QFuture<void> > futures) +{ + Q_FOREACH (QFuture<void> f, futures) { + f.waitForFinished(); + } + updateDivePictures(); +} + void DivePictureModel::updateDivePictures() { if (numberOfPictures != 0) { @@ -49,14 +142,15 @@ void DivePictureModel::updateDivePictures() } stringPixmapCache.clear(); - QStringList pictures; + SPictureList pictures; FOR_EACH_PICTURE_NON_PTR(displayed_dive) { stringPixmapCache[QString(picture->filename)].offsetSeconds = picture->offset.seconds; - pictures.push_back(QString(picture->filename)); + pictures.push_back(picture); } - Q_FOREACH (const SPixmap &pixmap, QtConcurrent::blockingMapped<SPixmapList>(pictures, scaleImages)) - stringPixmapCache[pixmap.first].image = pixmap.second; + QList<SPixmap> list = QtConcurrent::blockingMapped(pictures, scaleImages); + Q_FOREACH (const SPixmap &pixmap, list) + stringPixmapCache[pixmap.first->filename].image = pixmap.second; beginInsertRows(QModelIndex(), 0, numberOfPictures - 1); endInsertRows(); @@ -121,5 +215,5 @@ DivePictureWidget::DivePictureWidget(QWidget *parent) : QListView(parent) void DivePictureWidget::doubleClicked(const QModelIndex &index) { QString filePath = model()->data(index, Qt::DisplayPropertyRole).toString(); - emit photoDoubleClicked(filePath); + emit photoDoubleClicked(localFilePath(filePath)); } diff --git a/qt-ui/divepicturewidget.h b/qt-ui/divepicturewidget.h index aa524e1a6..2ce228daf 100644 --- a/qt-ui/divepicturewidget.h +++ b/qt-ui/divepicturewidget.h @@ -4,12 +4,33 @@ #include <QAbstractTableModel> #include <QListView> #include <QThread> +#include <QFuture> +#include <QNetworkReply> + +typedef QPair<QString, QByteArray> SHashedFilename; struct PhotoHelper { QImage image; int offsetSeconds; }; +class SHashedImage : public QImage { +public: + SHashedImage(struct picture *picture); +}; + +class ImageDownloader : public QObject { + Q_OBJECT; +public: + ImageDownloader(struct picture *picture); + void load(); +private: + struct picture *picture; + QNetworkAccessManager manager; +private slots: + void saveImage(QNetworkReply *reply); +}; + class DivePictureModel : public QAbstractTableModel { Q_OBJECT public: @@ -18,6 +39,7 @@ public: virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; void updateDivePictures(); + void updateDivePicturesWhenDone(QList<QFuture<void> >); void removePicture(const QString& fileUrl); private: diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp index 7831cc6d9..c82bc0463 100644 --- a/qt-ui/diveplanner.cpp +++ b/qt-ui/diveplanner.cpp @@ -3,6 +3,8 @@ #include "mainwindow.h" #include "planner.h" #include "helpers.h" +#include "models.h" +#include "profile/profilewidget2.h" #include <QGraphicsSceneMouseEvent> #include <QMessageBox> @@ -42,15 +44,6 @@ void DivePlannerPointsModel::removeSelectedPoints(const QVector<int> &rows) QVector<int> v2 = rows; std::sort(v2.begin(), v2.end(), intLessThan); - /* - * If we end up having divepoints that are not within the dive - * profile, we need to just skip the removal to prevent - * crashing due to index out of range. - */ - - if (rowCount() >= divepoints.count()) - return; - beginRemoveRows(QModelIndex(), firstRow, rowCount() - 1); for (int i = v2.count() - 1; i >= 0; i--) { divepoints.remove(v2[i]); @@ -74,7 +67,7 @@ void DivePlannerPointsModel::createSimpleDive() if (!prefs.drop_stone_mode) plannerModel->addStop(M_OR_FT(15, 45), 1 * 60, &gas, 0, true); - plannerModel->addStop(M_OR_FT(15, 45), 40 * 60, &gas, 0, true); + plannerModel->addStop(M_OR_FT(15, 45), 20 * 60, &gas, 0, true); if (!isPlanner()) { plannerModel->addStop(M_OR_FT(5, 15), 42 * 60, &gas, 0, true); plannerModel->addStop(M_OR_FT(5, 15), 45 * 60, &gas, 0, true); @@ -99,10 +92,13 @@ void DivePlannerPointsModel::setupStartTime() void DivePlannerPointsModel::loadFromDive(dive *d) { + int depthsum = 0; + int samplecount = 0; bool oldRec = recalc; recalc = false; CylindersModel::instance()->updateDive(); duration_t lasttime = {}; + duration_t newtime = {}; struct gasmix gas; free_dps(&diveplan); diveplan.when = d->when; @@ -111,13 +107,27 @@ void DivePlannerPointsModel::loadFromDive(dive *d) // if it is we only add the manually entered samples as waypoints to the diveplan // otherwise we have to add all of them bool hasMarkedSamples = d->dc.sample[0].manually_entered; - for (int i = 0; i < d->dc.samples - 1; i++) { - const sample &s = d->dc.sample[i]; - if (s.time.seconds == 0 || (hasMarkedSamples && !s.manually_entered)) - continue; - get_gas_at_time(d, &d->dc, lasttime, &gas); - plannerModel->addStop(s.depth.mm, s.time.seconds, &gas, 0, true); - lasttime = s.time; + // if this dive has more than 100 samples (so it is probably a logged dive), + // average samples so we end up with a total of 100 samples. + int plansamples = d->dc.samples <= 100 ? d->dc.samples : 100; + int j = 0; + for (int i = 0; i < plansamples - 1; i++) { + while (j * plansamples <= i * d->dc.samples) { + const sample &s = d->dc.sample[j]; + if (s.time.seconds != 0 && (!hasMarkedSamples || s.manually_entered)) { + depthsum += s.depth.mm; + ++samplecount; + newtime = s.time; + } + j++; + } + if (samplecount) { + get_gas_at_time(d, &d->dc, lasttime, &gas); + plannerModel->addStop(depthsum / samplecount, newtime.seconds, &gas, 0, true); + lasttime = newtime; + depthsum = 0; + samplecount = 0; + } } recalc = oldRec; emitDataChanged(); @@ -231,7 +241,7 @@ void DiveHandler::changeGas() { QAction *action = qobject_cast<QAction *>(sender()); QModelIndex index = plannerModel->index(parentIndex(), DivePlannerPointsModel::GAS); - plannerModel->setData(index, action->text()); + plannerModel->gaschange(index.sibling(index.row() + 1, index.column()), action->text()); } void DiveHandler::mouseMoveEvent(QGraphicsSceneMouseEvent *event) @@ -383,6 +393,15 @@ void PlannerSettingsWidget::decoSacChanged(const double decosac) plannerModel->setDecoSac(decosac); } +void PlannerSettingsWidget::disableDecoElements(bool value) +{ + ui.lastStop->setDisabled(value); + ui.backgasBreaks->setDisabled(value); + ui.bottompo2->setDisabled(value); + ui.decopo2->setDisabled(value); + ui.reserve_gas->setDisabled(!value); +} + void DivePlannerWidget::printDecoPlan() { MainWindow::instance()->printPlan(); @@ -395,6 +414,14 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) QSettings s; QStringList rebreater_modes; s.beginGroup("Planner"); + prefs.last_stop = s.value("last_stop", prefs.last_stop).toBool(); + prefs.verbatim_plan = s.value("verbatim_plan", prefs.verbatim_plan).toBool(); + prefs.display_duration = s.value("display_duration", prefs.display_duration).toBool(); + prefs.display_runtime = s.value("display_runtime", prefs.display_runtime).toBool(); + prefs.display_transitions = s.value("display_transitions", prefs.display_transitions).toBool(); + prefs.recreational_mode = s.value("recreational_mode", prefs.recreational_mode).toBool(); + prefs.safetystop = s.value("safetystop", prefs.safetystop).toBool(); + prefs.reserve_gas = s.value("reserve_gas", prefs.reserve_gas).toInt(); prefs.ascrate75 = s.value("ascrate75", prefs.ascrate75).toInt(); prefs.ascrate50 = s.value("ascrate50", prefs.ascrate50).toInt(); prefs.ascratestops = s.value("ascratestops", prefs.ascratestops).toInt(); @@ -411,6 +438,14 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) s.endGroup(); updateUnitsUI(); + ui.lastStop->setChecked(prefs.last_stop); + ui.verbatim_plan->setChecked(prefs.verbatim_plan); + ui.display_duration->setChecked(prefs.display_duration); + ui.display_runtime->setChecked(prefs.display_runtime); + ui.display_transitions->setChecked(prefs.display_transitions); + ui.recreational_mode->setChecked(prefs.recreational_mode); + ui.safetystop->setChecked(prefs.safetystop); + ui.reserve_gas->setValue(prefs.reserve_gas / 1000); ui.bottompo2->setValue(prefs.bottompo2 / 1000.0); ui.decopo2->setValue(prefs.decopo2 / 1000.0); ui.backgasBreaks->setChecked(prefs.doo2breaks); @@ -424,6 +459,9 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) connect(ui.display_duration, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayDuration(bool))); connect(ui.display_runtime, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayRuntime(bool))); connect(ui.display_transitions, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayTransitions(bool))); + connect(ui.safetystop, SIGNAL(toggled(bool)), plannerModel, SLOT(setSafetyStop(bool))); + connect(ui.recreational_mode, SIGNAL(toggled(bool)), plannerModel, SLOT(setRecreationalMode(bool))); + connect(ui.reserve_gas, SIGNAL(valueChanged(int)), plannerModel, SLOT(setReserveGas(int))); connect(ui.ascRate75, SIGNAL(valueChanged(int)), this, SLOT(setAscRate75(int))); connect(ui.ascRate75, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged())); connect(ui.ascRate50, SIGNAL(valueChanged(int)), this, SLOT(setAscRate50(int))); @@ -445,6 +483,8 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) connect(ui.gflow, SIGNAL(editingFinished()), plannerModel, SLOT(triggerGFLow())); connect(ui.backgasBreaks, SIGNAL(toggled(bool)), this, SLOT(setBackgasBreaks(bool))); connect(ui.rebreathermode, SIGNAL(currentIndexChanged(int)), plannerModel, SLOT(setRebreatherMode(int))); + connect(DivePlannerPointsModel::instance(), SIGNAL(recreationChanged(bool)), this, SLOT(disableDecoElements(bool))); + settingsChanged(); ui.gflow->setValue(prefs.gflow); ui.gfhigh->setValue(prefs.gfhigh); @@ -466,6 +506,14 @@ PlannerSettingsWidget::~PlannerSettingsWidget() { QSettings s; s.beginGroup("Planner"); + s.setValue("last_stop", prefs.last_stop); + s.setValue("verbatim_plan", prefs.verbatim_plan); + s.setValue("display_duration", prefs.display_duration); + s.setValue("display_runtime", prefs.display_runtime); + s.setValue("display_transitions", prefs.display_transitions); + s.setValue("recreational_mode", prefs.recreational_mode); + s.setValue("safetystop", prefs.safetystop); + s.setValue("reserve_gas", prefs.reserve_gas); s.setValue("ascrate75", prefs.ascrate75); s.setValue("ascrate50", prefs.ascrate50); s.setValue("ascratestops", prefs.ascratestops); @@ -693,6 +741,18 @@ bool DivePlannerPointsModel::setData(const QModelIndex &index, const QVariant &v return QAbstractItemModel::setData(index, value, role); } +void DivePlannerPointsModel::gaschange(const QModelIndex &index, QString newgas) +{ + int i = index.row(); + gasmix oldgas = divepoints[i].gasmix; + gasmix gas = { 0 }; + if (!validate_gas(newgas.toUtf8().data(), &gas)) + return; + while (i < plannerModel->rowCount() && gasmix_distance(&oldgas, &divepoints[i].gasmix) == 0) + divepoints[i++].gasmix = gas; + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); +} + QVariant DivePlannerPointsModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { @@ -729,6 +789,7 @@ int DivePlannerPointsModel::rowCount(const QModelIndex &parent) const DivePlannerPointsModel::DivePlannerPointsModel(QObject *parent) : QAbstractTableModel(parent), mode(NOTHING), + recalc(false), tempGFHigh(100), tempGFLow(100) { @@ -820,30 +881,54 @@ int DivePlannerPointsModel::getSurfacePressure() void DivePlannerPointsModel::setLastStop6m(bool value) { set_last_stop(value); + prefs.last_stop = value; emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); } void DivePlannerPointsModel::setVerbatim(bool value) { set_verbatim(value); + prefs.verbatim_plan = value; emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); } void DivePlannerPointsModel::setDisplayRuntime(bool value) { set_display_runtime(value); + prefs.display_runtime = value; emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); } void DivePlannerPointsModel::setDisplayDuration(bool value) { set_display_duration(value); + prefs.display_duration = value; emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); } void DivePlannerPointsModel::setDisplayTransitions(bool value) { set_display_transitions(value); + prefs.display_transitions = value; + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); +} + +void DivePlannerPointsModel::setRecreationalMode(bool value) +{ + prefs.recreational_mode = value; + emit recreationChanged(value); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS -1)); +} + +void DivePlannerPointsModel::setSafetyStop(bool value) +{ + prefs.safetystop = value; + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS -1)); +} + +void DivePlannerPointsModel::setReserveGas(int reserve) +{ + prefs.reserve_gas = reserve * 1000; emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); } @@ -1110,7 +1195,7 @@ bool DivePlannerPointsModel::tankInUse(struct gasmix gasmix) continue; if (!p.entered) // removing deco gases is ok continue; - if (gasmix_distance(&p.gasmix, &gasmix) < 200) + if (gasmix_distance(&p.gasmix, &gasmix) < 100) return true; } return false; @@ -1137,7 +1222,7 @@ void DivePlannerPointsModel::tanksUpdated() struct gasmix gas; gas.o2.permille = oldGases.at(i).first; gas.he.permille = oldGases.at(i).second; - if (gasmix_distance(&gas, &p.gasmix) < 200) { + if (gasmix_distance(&gas, &p.gasmix) < 100) { p.gasmix.o2.permille = gases.at(i).first; p.gasmix.he.permille = gases.at(i).second; } @@ -1237,7 +1322,7 @@ void DivePlannerPointsModel::createPlan(bool replanCopy) plannerModel->setRecalc(oldRecalc); //TODO: C-based function here? - plan(&diveplan, &cache, isPlanner(), true); + bool did_deco = plan(&diveplan, &cache, isPlanner(), true); if (!current_dive || displayed_dive.id != current_dive->id) { // we were planning a new dive, not re-planning an existing on record_dive(clone_dive(&displayed_dive)); @@ -1255,6 +1340,12 @@ void DivePlannerPointsModel::createPlan(bool replanCopy) if (current_dive->divetrip) add_dive_to_trip(copy, current_dive->divetrip); record_dive(copy); + QString oldnotes(current_dive->notes); + if (oldnotes.indexOf(QString(disclaimer)) >= 0) + oldnotes.truncate(oldnotes.indexOf(QString(disclaimer))); + if (did_deco) + oldnotes.append(displayed_dive.notes); + displayed_dive.notes = strdup(oldnotes.toUtf8().data()); } copy_dive(&displayed_dive, current_dive); } @@ -1266,3 +1357,8 @@ void DivePlannerPointsModel::createPlan(bool replanCopy) setPlanMode(NOTHING); planCreated(); } + +PlannerDetails::PlannerDetails(QWidget *parent) : QWidget(parent) +{ + ui.setupUi(this); +} diff --git a/qt-ui/diveplanner.h b/qt-ui/diveplanner.h index 4093bacd1..42e0dc44a 100644 --- a/qt-ui/diveplanner.h +++ b/qt-ui/diveplanner.h @@ -35,6 +35,7 @@ public: virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); virtual Qt::ItemFlags flags(const QModelIndex &index) const; + void gaschange(const QModelIndex &index, QString newgas); void removeSelectedPoints(const QVector<int> &rows); void setPlanMode(Mode mode); bool isPlanner(); @@ -82,6 +83,8 @@ slots: void setDisplayRuntime(bool value); void setDisplayDuration(bool value); void setDisplayTransitions(bool value); + void setRecreationalMode(bool value); + void setSafetyStop(bool value); void savePlan(); void saveDuplicatePlan(); void remove(const QModelIndex &index); @@ -91,12 +94,14 @@ slots: void loadFromDive(dive *d); void emitDataChanged(); void setRebreatherMode(int mode); + void setReserveGas(int reserve); signals: void planCreated(); void planCanceled(); void cylinderModelEdited(); void startTimeChanged(QDateTime); + void recreationChanged(bool); private: explicit DivePlannerPointsModel(QObject *parent = 0); @@ -180,12 +185,27 @@ slots: void setBottomPo2(double po2); void setDecoPo2(double po2); void setBackgasBreaks(bool dobreaks); + void disableDecoElements(bool value); private: Ui::plannerSettingsWidget ui; void updateUnitsUI(); }; +#include "ui_plannerDetails.h" + +class PlannerDetails : public QWidget { + Q_OBJECT +public: + explicit PlannerDetails(QWidget *parent = 0); + QPushButton *printPlan() const { return ui.printPlan; } + QTextEdit *divePlanOutput() const { return ui.divePlanOutput; } + +private: + Ui::plannerDetails ui; +}; + + QString dpGasToStr(const divedatapoint &p); #endif // DIVEPLANNER_H diff --git a/qt-ui/diveshareexportdialog.cpp b/qt-ui/diveshareexportdialog.cpp index 9e8e69ad6..40670d7fc 100644 --- a/qt-ui/diveshareexportdialog.cpp +++ b/qt-ui/diveshareexportdialog.cpp @@ -4,6 +4,7 @@ #include "save-html.h" #include "usersurvey.h" #include "subsurfacewebservices.h" +#include "helpers.h" #include <QDesktopServices> #include <QSettings> @@ -130,7 +131,7 @@ void DiveShareExportDialog::doUpload() else request.setUrl(QUrl(DIVESHARE_BASE_URI "/upload")); - request.setRawHeader("User-Agent", UserSurvey::getUserAgent().toUtf8()); + request.setRawHeader("User-Agent", getUserAgent().toUtf8()); if (ui->txtUID->text().length() != 0) request.setRawHeader("X-UID", ui->txtUID->text().toUtf8()); diff --git a/qt-ui/downloadfromdivecomputer.cpp b/qt-ui/downloadfromdivecomputer.cpp index c59fb0d7b..e6b51a513 100644 --- a/qt-ui/downloadfromdivecomputer.cpp +++ b/qt-ui/downloadfromdivecomputer.cpp @@ -557,8 +557,8 @@ void DownloadThread::run() } DiveImportedModel::DiveImportedModel(QObject *o) : QAbstractTableModel(o), - lastIndex(-1), firstIndex(0), + lastIndex(-1), checkStates(0) { } diff --git a/qt-ui/filtermodels.cpp b/qt-ui/filtermodels.cpp index e2597a634..be26a253b 100644 --- a/qt-ui/filtermodels.cpp +++ b/qt-ui/filtermodels.cpp @@ -1,5 +1,8 @@ #include "filtermodels.h" #include "mainwindow.h" +#include "models.h" +#include "divelistview.h" +#include "display.h" #define CREATE_INSTANCE_METHOD( CLASS ) \ CLASS *CLASS::instance() \ @@ -61,12 +64,12 @@ CREATE_MODEL_SET_DATA_METHOD( CLASS ); \ CREATE_INSTANCE_METHOD( CLASS ); \ CREATE_DATA_METHOD( CLASS, COUNTER_FUNCTION ) -CREATE_COMMON_METHODS_FOR_FILTER(TagFilterModel, count_dives_with_tag); -CREATE_COMMON_METHODS_FOR_FILTER(BuddyFilterModel, count_dives_with_person); -CREATE_COMMON_METHODS_FOR_FILTER(LocationFilterModel, count_dives_with_location); -CREATE_COMMON_METHODS_FOR_FILTER(SuitsFilterModel, count_dives_with_suit); +CREATE_COMMON_METHODS_FOR_FILTER(TagFilterModel, count_dives_with_tag) +CREATE_COMMON_METHODS_FOR_FILTER(BuddyFilterModel, count_dives_with_person) +CREATE_COMMON_METHODS_FOR_FILTER(LocationFilterModel, count_dives_with_location) +CREATE_COMMON_METHODS_FOR_FILTER(SuitsFilterModel, count_dives_with_suit) -CREATE_INSTANCE_METHOD(MultiFilterSortModel); +CREATE_INSTANCE_METHOD(MultiFilterSortModel) SuitsFilterModel::SuitsFilterModel(QObject *parent) : QStringListModel(parent) { @@ -246,7 +249,7 @@ bool LocationFilterModel::doFilter(struct dive *d, QModelIndex &index0, QAbstrac return true; } // Checked means 'Show', Unchecked means 'Hide'. - QString location(d->location); + QString location(get_dive_location(d)); // only show empty location dives if the user checked that. if (location.isEmpty()) { if (rowCount() > 0) @@ -274,7 +277,7 @@ void LocationFilterModel::repopulate() struct dive *dive; int i = 0; for_each_dive (i, dive) { - QString location(dive->location); + QString location(get_dive_location(dive)); if (!location.isEmpty() && !list.contains(location)) { list.append(location); } diff --git a/qt-ui/filtermodels.h b/qt-ui/filtermodels.h index 1406b8272..9d8724173 100644 --- a/qt-ui/filtermodels.h +++ b/qt-ui/filtermodels.h @@ -6,7 +6,7 @@ class MultiFilterInterface { public: - MultiFilterInterface() : checkState(NULL){}; + MultiFilterInterface() : checkState(NULL), anyChecked(false) {} virtual bool doFilter(struct dive *d, QModelIndex &index0, QAbstractItemModel *sourceModel) const = 0; virtual void clearFilter() = 0; bool *checkState; diff --git a/qt-ui/globe.cpp b/qt-ui/globe.cpp index 1e4639d5c..ea0c0f231 100644 --- a/qt-ui/globe.cpp +++ b/qt-ui/globe.cpp @@ -2,7 +2,13 @@ #ifndef NO_MARBLE #include "mainwindow.h" #include "helpers.h" +#include "divelistview.h" +#include "maintab.h" +#include "display.h" + #include <QTimer> +#include <QContextMenuEvent> +#include <QMouseEvent> #include <marble/AbstractFloatItem.h> #include <marble/GeoDataPlacemark.h> @@ -158,10 +164,11 @@ void GlobeGPS::mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) QList<int> selectedDiveIds; for_each_dive (idx, dive) { long lat_diff, lon_diff; - if (!dive_has_gps_location(dive)) + struct dive_site *ds = get_dive_site_for_dive(dive); + if (!dive_site_has_gps_location(ds)) continue; - lat_diff = labs(dive->latitude.udeg - lat_udeg); - lon_diff = labs(dive->longitude.udeg - lon_udeg); + lat_diff = labs(ds->latitude.udeg - lat_udeg); + lon_diff = labs(ds->longitude.udeg - lon_udeg); if (lat_diff > 180000000) lat_diff = 360000000 - lat_diff; if (lon_diff > 180000000) @@ -180,6 +187,7 @@ void GlobeGPS::mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) void GlobeGPS::repopulateLabels() { + struct dive_site *ds; if (loadedDives) { model()->treeModel()->removeDocument(loadedDives); delete loadedDives; @@ -198,12 +206,16 @@ void GlobeGPS::repopulateLabels() // don't show that flag, it's either already shown as displayed_dive // or it's the one that we are moving right now... continue; - if (dive_has_gps_location(dive)) { - GeoDataPlacemark *place = new GeoDataPlacemark(dive->location); - place->setCoordinate(dive->longitude.udeg / 1000000.0, dive->latitude.udeg / 1000000.0, 0, GeoDataCoordinates::Degree); + if (idx == -1) + ds = &displayed_dive_site; + else + ds = get_dive_site_for_dive(dive); + if (dive_site_has_gps_location(ds)) { + GeoDataPlacemark *place = new GeoDataPlacemark(ds->name); + place->setCoordinate(ds->longitude.udeg / 1000000.0, ds->latitude.udeg / 1000000.0, 0, GeoDataCoordinates::Degree); // don't add dive locations twice, unless they are at least 50m apart - if (locationMap[QString(dive->location)]) { - GeoDataCoordinates existingLocation = locationMap[QString(dive->location)]->coordinate(); + if (locationMap[QString(ds->name)]) { + GeoDataCoordinates existingLocation = locationMap[QString(ds->name)]->coordinate(); GeoDataLineString segment = GeoDataLineString(); segment.append(existingLocation); GeoDataCoordinates newLocation = place->coordinate(); @@ -214,7 +226,7 @@ void GlobeGPS::repopulateLabels() if (dist < 0.05) continue; } - locationMap[QString(dive->location)] = place; + locationMap[QString(ds->name)] = place; loadedDives->append(place); } } @@ -230,23 +242,23 @@ void GlobeGPS::reload() void GlobeGPS::centerOnCurrentDive() { - struct dive *dive = current_dive; + struct dive_site *ds = get_dive_site_for_dive(current_dive); // dive has changed, if we had the 'editingDive', hide it. - if (messageWidget->isVisible() && (!dive || dive_has_gps_location(dive) || amount_selected != 1)) + if (messageWidget->isVisible() && (!ds || dive_site_has_gps_location(ds) || amount_selected != 1)) messageWidget->hide(); editingDiveLocation = false; - if (!dive) + if (!ds) return; - qreal longitude = dive->longitude.udeg / 1000000.0; - qreal latitude = dive->latitude.udeg / 1000000.0; + qreal longitude = ds->longitude.udeg / 1000000.0; + qreal latitude = ds->latitude.udeg / 1000000.0; - if ((!dive_has_gps_location(dive) || MainWindow::instance()->information()->isEditing()) && amount_selected == 1) { + if ((!dive_site_has_gps_location(ds) || MainWindow::instance()->information()->isEditing()) && amount_selected == 1) { prepareForGetDiveCoordinates(); return; } - if (!dive_has_gps_location(dive)) { + if (!dive_site_has_gps_location(ds)) { zoomOutForNoGPS(); return; } @@ -282,7 +294,7 @@ void GlobeGPS::zoomOutForNoGPS() // we show a dive with GPS location we need to zoom in again if (fixZoomTimer->isActive()) fixZoomTimer->stop(); - setZoom(1200, Marble::Automatic); + setZoom(0, Marble::Automatic); if (!needResetZoom) { needResetZoom = true; currentZoomLevel = zoom(); @@ -303,8 +315,10 @@ void GlobeGPS::prepareForGetDiveCoordinates() } } +// This needs to update the dive site, not just this dive void GlobeGPS::changeDiveGeoPosition(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) { + struct dive_site *ds; messageWidget->hide(); if (MainWindow::instance()->dive_list()->selectionModel()->selection().isEmpty()) @@ -318,8 +332,8 @@ void GlobeGPS::changeDiveGeoPosition(qreal lon, qreal lat, GeoDataCoordinates::U centerOn(lon, lat, true); // change the location of the displayed_dive and put the UI in edit mode - displayed_dive.latitude.udeg = lrint(lat * 1000000.0); - displayed_dive.longitude.udeg = lrint(lon * 1000000.0); + displayed_dive_site.latitude.udeg = lrint(lat * 1000000.0); + displayed_dive_site.longitude.udeg = lrint(lon * 1000000.0); emit(coordinatesChanged()); repopulateLabels(); editingDiveLocation = false; @@ -335,7 +349,12 @@ void GlobeGPS::mousePressEvent(QMouseEvent *event) // there could be two scenarios that got us here; let's check if we are editing a dive if (MainWindow::instance()->information()->isEditing() && clickOnGlobe) { - MainWindow::instance()->information()->updateCoordinatesText(lat, lon); + // + // FIXME + // TODO + // + // this needs to do this on the dive site screen + // MainWindow::instance()->information()->updateCoordinatesText(lat, lon); repopulateLabels(); } else if (clickOnGlobe) { changeDiveGeoPosition(lon, lat, GeoDataCoordinates::Degree); diff --git a/qt-ui/globe.h b/qt-ui/globe.h index b6a33bbbe..4f9d7c611 100644 --- a/qt-ui/globe.h +++ b/qt-ui/globe.h @@ -19,7 +19,7 @@ class GlobeGPS : public MarbleWidget { Q_OBJECT public: using MarbleWidget::centerOn; - GlobeGPS(QWidget *parent); + GlobeGPS(QWidget *parent = 0); void reload(); void repopulateLabels(); void centerOnCurrentDive(); diff --git a/qt-ui/locationInformation.ui b/qt-ui/locationInformation.ui new file mode 100644 index 000000000..38eb36145 --- /dev/null +++ b/qt-ui/locationInformation.ui @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>LocationInformation</class> + <widget class="QGroupBox" name="LocationInformation"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>556</width> + <height>584</height> + </rect> + </property> + <property name="windowTitle"> + <string>GroupBox</string> + </property> + <property name="title"> + <string>Dive Site</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="bottomMargin"> + <number>12</number> + </property> + <property name="horizontalSpacing"> + <number>2</number> + </property> + <property name="verticalSpacing"> + <number>-1</number> + </property> + <item row="1" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Current Location</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>1</number> + </property> + <item> + <widget class="QComboBox" name="currentLocation"/> + </item> + <item> + <widget class="QToolButton" name="addLocation"> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../subsurface.qrc"> + <normaloff>:/plus</normaloff>:/plus</iconset> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="editLocation"> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../subsurface.qrc"> + <normaloff>:/edit</normaloff>:/edit</iconset> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="removeLocation"> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../subsurface.qrc"> + <normaloff>:/trash</normaloff>:/trash</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Name</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="diveSiteName"/> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Coordinates</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="diveSiteCoordinates"/> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Description</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLineEdit" name="diveSiteDescription"/> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Notes</string> + </property> + </widget> + </item> + <item row="5" column="1" rowspan="2" colspan="2"> + <widget class="QPlainTextEdit" name="diveSiteNotes"/> + </item> + <item row="6" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="0" colspan="3"> + <widget class="KMessageWidget" name="diveSiteMessage" native="true"/> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>KMessageWidget</class> + <extends>QWidget</extends> + <header>kmessagewidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources> + <include location="../subsurface.qrc"/> + </resources> + <connections/> +</ui> diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp new file mode 100644 index 000000000..18f780983 --- /dev/null +++ b/qt-ui/locationinformation.cpp @@ -0,0 +1,241 @@ +#include "locationinformation.h" +#include "dive.h" +#include "mainwindow.h" +#include "divelistview.h" +#include "qthelper.h" + +#include <QDebug> +#include <QShowEvent> + +LocationInformationModel::LocationInformationModel(QObject *obj) : QAbstractListModel(obj), internalRowCount(0) +{ +} + +int LocationInformationModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return internalRowCount; +} + +QVariant LocationInformationModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + struct dive_site *ds = get_dive_site(index.row()); + + switch(role) { + case Qt::DisplayRole : return qPrintable(ds->name); + } + + return QVariant(); +} + +void LocationInformationModel::update() +{ + int i; + struct dive_site *ds; + for_each_dive_site (i, ds); + + if (rowCount()) { + beginRemoveRows(QModelIndex(), 0, rowCount()-1); + endRemoveRows(); + } + if (i) { + beginInsertRows(QModelIndex(), 0, i); + internalRowCount = i; + endInsertRows(); + } +} + +LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBox(parent), modified(false) +{ + ui.setupUi(this); + ui.diveSiteMessage->setCloseButtonVisible(false); + ui.diveSiteMessage->show(); + + // create the three buttons and only show the close button for now + closeAction = new QAction(tr("Close"), this); + connect(closeAction, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); + + acceptAction = new QAction(tr("Apply changes"), this); + connect(acceptAction, SIGNAL(triggered(bool)), this, SLOT(acceptChanges())); + + rejectAction = new QAction(tr("Discard changes"), this); + connect(rejectAction, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); + + ui.diveSiteMessage->setText(tr("Dive site management")); + ui.diveSiteMessage->addAction(closeAction); + + ui.currentLocation->setModel(new LocationInformationModel()); + connect(ui.currentLocation, SIGNAL(currentIndexChanged(int)), this, SLOT(setCurrentDiveSite(int))); +} + +void LocationInformationWidget::setCurrentDiveSite(int dive_nr) +{ + currentDs = get_dive_site(dive_nr); + if (currentDs) + setLocationId(currentDs->uuid); + else + setLocationId(displayed_dive.dive_site_uuid); +} + +void LocationInformationWidget::setLocationId(uint32_t uuid) +{ + currentDs = get_dive_site_by_uuid(uuid); + + if (!currentDs) { + currentDs = get_dive_site_by_uuid(create_dive_site("")); + displayed_dive.dive_site_uuid = currentDs->uuid; + ui.diveSiteName->clear(); + ui.diveSiteDescription->clear(); + ui.diveSiteNotes->clear(); + ui.diveSiteCoordinates->clear(); + } + displayed_dive_site = *currentDs; + if (displayed_dive_site.name) + ui.diveSiteName->setText(displayed_dive_site.name); + else + ui.diveSiteName->clear(); + if (displayed_dive_site.description) + ui.diveSiteDescription->setText(displayed_dive_site.description); + else + ui.diveSiteDescription->clear(); + if (displayed_dive_site.notes) + ui.diveSiteNotes->setPlainText(displayed_dive_site.notes); + else + ui.diveSiteNotes->clear(); + if (displayed_dive_site.latitude.udeg || displayed_dive_site.longitude.udeg) + ui.diveSiteCoordinates->setText(printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg)); + else + ui.diveSiteCoordinates->clear(); +} + +void LocationInformationWidget::updateGpsCoordinates() +{ + ui.diveSiteCoordinates->setText(printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg)); + MainWindow::instance()->setApplicationState("EditDiveSite"); +} + +void LocationInformationWidget::acceptChanges() +{ + char *uiString; + currentDs->latitude = displayed_dive_site.latitude; + currentDs->longitude = displayed_dive_site.longitude; + uiString = ui.diveSiteName->text().toUtf8().data(); + if (!same_string(uiString, currentDs->name)) { + free(currentDs->name); + currentDs->name = copy_string(uiString); + } + uiString = ui.diveSiteDescription->text().toUtf8().data(); + if (!same_string(uiString, currentDs->description)) { + free(currentDs->description); + currentDs->description = copy_string(uiString); + } + uiString = ui.diveSiteNotes->document()->toPlainText().toUtf8().data(); + if (!same_string(uiString, currentDs->notes)) { + free(currentDs->notes); + currentDs->notes = copy_string(uiString); + } + if (dive_site_is_empty(currentDs)) { + delete_dive_site(currentDs->uuid); + displayed_dive.dive_site_uuid = 0; + setLocationId(0); + } else { + setLocationId(currentDs->uuid); + } + mark_divelist_changed(true); + resetState(); + emit informationManagementEnded(); +} + +void LocationInformationWidget::rejectChanges() +{ + Q_ASSERT(currentDs != NULL); + if (dive_site_is_empty(currentDs)) { + delete_dive_site(currentDs->uuid); + displayed_dive.dive_site_uuid = 0; + setLocationId(0); + } else { + setLocationId(currentDs->uuid); + } + resetState(); + emit informationManagementEnded(); +} + +void LocationInformationWidget::showEvent(QShowEvent *ev) +{ + LocationInformationModel *m = (LocationInformationModel*) ui.currentLocation->model(); + ui.diveSiteMessage->setCloseButtonVisible(false); + m->update(); + QGroupBox::showEvent(ev); + +} + +void LocationInformationWidget::markChangedWidget(QWidget *w) +{ + QPalette p; + qreal h, s, l, a; + if (!modified) + enableEdition(); + qApp->palette().color(QPalette::Text).getHslF(&h, &s, &l, &a); + p.setBrush(QPalette::Base, (l <= 0.3) ? QColor(Qt::yellow).lighter() : (l <= 0.6) ? QColor(Qt::yellow).light() : /* else */ QColor(Qt::yellow).darker(300)); + w->setPalette(p); + modified = true; +} + +void LocationInformationWidget::resetState() +{ + modified = false; + resetPallete(); + MainWindow::instance()->dive_list()->setEnabled(true); + MainWindow::instance()->setEnabledToolbar(true); + ui.diveSiteMessage->setText(tr("Dive site management")); + ui.diveSiteMessage->addAction(closeAction); + ui.diveSiteMessage->removeAction(acceptAction); + ui.diveSiteMessage->removeAction(rejectAction); + ui.diveSiteMessage->setCloseButtonVisible(false); +} + +void LocationInformationWidget::enableEdition() +{ + MainWindow::instance()->dive_list()->setEnabled(false); + MainWindow::instance()->setEnabledToolbar(false); + ui.diveSiteMessage->setText(tr("You are editing a dive site")); + ui.diveSiteMessage->removeAction(closeAction); + ui.diveSiteMessage->addAction(acceptAction); + ui.diveSiteMessage->addAction(rejectAction); + ui.diveSiteMessage->setCloseButtonVisible(false); +} + +void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString& text) +{ + if (!same_string(qPrintable(text), printGPSCoords(currentDs->latitude.udeg, currentDs->longitude.udeg))) + markChangedWidget(ui.diveSiteCoordinates); +} + +void LocationInformationWidget::on_diveSiteDescription_textChanged(const QString& text) +{ + if (!same_string(qPrintable(text), currentDs->description)) + markChangedWidget(ui.diveSiteDescription); +} + +void LocationInformationWidget::on_diveSiteName_textChanged(const QString& text) +{ + if (!same_string(qPrintable(text), currentDs->name)) + markChangedWidget(ui.diveSiteName); +} + +void LocationInformationWidget::on_diveSiteNotes_textChanged() +{ + if (!same_string(qPrintable(ui.diveSiteNotes->toPlainText()), currentDs->notes)) + markChangedWidget(ui.diveSiteNotes); +} + +void LocationInformationWidget::resetPallete() +{ + QPalette p; + ui.diveSiteCoordinates->setPalette(p); + ui.diveSiteDescription->setPalette(p); + ui.diveSiteName->setPalette(p); + ui.diveSiteNotes->setPalette(p); +} diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h new file mode 100644 index 000000000..82105c333 --- /dev/null +++ b/qt-ui/locationinformation.h @@ -0,0 +1,50 @@ +#ifndef LOCATIONINFORMATION_H +#define LOCATIONINFORMATION_H + +#include "ui_locationInformation.h" +#include <stdint.h> +#include <QAbstractListModel> + +class LocationInformationModel : public QAbstractListModel { +Q_OBJECT +public: + LocationInformationModel(QObject *obj = 0); + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index = QModelIndex(), int role = Qt::DisplayRole) const; + void update(); +private: + int internalRowCount; +}; + +class LocationInformationWidget : public QGroupBox { +Q_OBJECT +public: + LocationInformationWidget(QWidget *parent = 0); +protected: + void showEvent(QShowEvent *); +\ +public slots: + void acceptChanges(); + void rejectChanges(); + void setLocationId(uint32_t uuid); + void updateGpsCoordinates(void); + void markChangedWidget(QWidget *w); + void enableEdition(); + void resetState(); + void resetPallete(); + void setCurrentDiveSite(int dive_nr); + void on_diveSiteCoordinates_textChanged(const QString& text); + void on_diveSiteDescription_textChanged(const QString& text); + void on_diveSiteName_textChanged(const QString& text); + void on_diveSiteNotes_textChanged(); +signals: + void informationManagementEnded(); + +private: + struct dive_site *currentDs; + Ui::LocationInformation ui; + bool modified; + QAction *closeAction, *acceptAction, *rejectAction; +}; + +#endif diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index 2fafb65ff..fd760445b 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -6,9 +6,16 @@ */ #include "maintab.h" #include "mainwindow.h" +#include "globe.h" #include "helpers.h" #include "statistics.h" #include "modeldelegates.h" +#include "models.h" +#include "divelistview.h" +#include "display.h" +#include "profile/profilewidget2.h" +#include "diveplanner.h" +#include "divesitehelpers.h" #if defined(FBSUPPORT) #include "socialnetworks.h" @@ -20,6 +27,7 @@ #include <QShortcut> #include <QMessageBox> #include <QDesktopServices> +#include <QStringList> MainTab::MainTab(QWidget *parent) : QTabWidget(parent), weightModel(new WeightModel(this)), @@ -43,18 +51,19 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent), ui.extraData->setModel(extraDataModel); closeMessage(); + connect(ui.manageDiveSite, SIGNAL(clicked()), this, SLOT(prepareDiveSiteEdit())); + QAction *action = new QAction(tr("Apply changes"), this); connect(action, SIGNAL(triggered(bool)), this, SLOT(acceptChanges())); addMessageAction(action); action = new QAction(tr("Discard changes"), this); connect(action, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); + addMessageAction(action); QShortcut *closeKey = new QShortcut(QKeySequence(Qt::Key_Escape), this); connect(closeKey, SIGNAL(activated()), this, SLOT(escDetected())); - addMessageAction(action); - if (qApp->style()->objectName() == "oxygen") setDocumentMode(true); else @@ -64,21 +73,6 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent), // filled from a dive, they are made writeable setEnabled(false); - ui.location->installEventFilter(this); - ui.coordinates->installEventFilter(this); - ui.divemaster->installEventFilter(this); - ui.buddy->installEventFilter(this); - ui.suit->installEventFilter(this); - ui.notes->viewport()->installEventFilter(this); - ui.rating->installEventFilter(this); - ui.visibility->installEventFilter(this); - ui.airtemp->installEventFilter(this); - ui.watertemp->installEventFilter(this); - ui.dateEdit->installEventFilter(this); - ui.timeEdit->installEventFilter(this); - ui.tagWidget->installEventFilter(this); - ui.DiveType->installEventFilter(this); - Q_FOREACH (QObject *obj, ui.statisticsTab->children()) { QLabel *label = qobject_cast<QLabel *>(obj); if (label) @@ -192,6 +186,15 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent), ui.socialNetworks->setVisible(false); #endif + ui.waitingSpinner->setRoundness(70.0); + ui.waitingSpinner->setMinimumTrailOpacity(15.0); + ui.waitingSpinner->setTrailFadePercentage(70.0); + ui.waitingSpinner->setNumberOfLines(8); + ui.waitingSpinner->setLineLength(5); + ui.waitingSpinner->setLineWidth(3); + ui.waitingSpinner->setInnerRadius(5); + ui.waitingSpinner->setRevolutionsPerSecond(1); + acceptingEdit = false; } @@ -206,6 +209,22 @@ MainTab::~MainTab() } } +void MainTab::enableGeoLoockupEdition() +{ + ui.waitingSpinner->stop(); + ui.manageDiveSite->show(); +} + +void MainTab::disableGeoLoockupEdition() +{ + ui.waitingSpinner->start(); + ui.manageDiveSite->hide(); +} + +void MainTab::prepareDiveSiteEdit() { + emit requestDiveSiteEdit(displayed_dive.dive_site_uuid); +} + void MainTab::toggleTriggeredColumn() { QAction *action = qobject_cast<QAction *>(sender()); @@ -284,11 +303,15 @@ void MainTab::updateTextLabels(bool showUnits) void MainTab::enableEdition(EditMode newEditMode) { + const bool isTripEdit = MainWindow::instance() && + MainWindow::instance()->dive_list()->selectedTrips().count() == 1; + if (((newEditMode == DIVE || newEditMode == NONE) && current_dive == NULL) || editMode != NONE) return; modified = false; copyPaste = false; if ((newEditMode == DIVE || newEditMode == NONE) && + !isTripEdit && current_dive->dc.model && strcmp(current_dive->dc.model, "manually added dive") == 0) { // editCurrentDive will call enableEdition with newEditMode == MANUALLY_ADDED_DIVE @@ -310,7 +333,7 @@ void MainTab::enableEdition(EditMode newEditMode) if (amount_selected == 1 && newEditMode != ADD) MainWindow::instance()->globe()->prepareForGetDiveCoordinates(); - if (MainWindow::instance() && MainWindow::instance()->dive_list()->selectedTrips().count() == 1) { + if (isTripEdit) { // we are editing trip location and notes displayMessage(tr("This trip is being edited.")); memset(&displayedTrip, 0, sizeof(displayedTrip)); @@ -385,12 +408,17 @@ bool MainTab::isEditing() return editMode != NONE; } +void MainTab::showLocation() +{ + ui.location->setText(get_dive_location(&displayed_dive)); +} + void MainTab::updateDiveInfo(bool clear) { // don't execute this while adding / planning a dive if (editMode == ADD || editMode == MANUALLY_ADDED_DIVE || MainWindow::instance()->graphics()->isPlanner()) return; - if (!isEnabled() && !clear) + if (!isEnabled() && !clear ) setEnabled(true); if (isEnabled() && clear) setEnabled(false); @@ -418,9 +446,7 @@ void MainTab::updateDiveInfo(bool clear) else ui.notes->setPlainText(tmp); } - UPDATE_TEXT(displayed_dive, notes); - UPDATE_TEXT(displayed_dive, location); UPDATE_TEXT(displayed_dive, suit); UPDATE_TEXT(displayed_dive, divemaster); UPDATE_TEXT(displayed_dive, buddy); @@ -429,7 +455,11 @@ void MainTab::updateDiveInfo(bool clear) ui.DiveType->setCurrentIndex(displayed_dive.dc.divemode); if (!clear) { - updateGpsCoordinates(); + struct dive_site *ds = get_dive_site_by_uuid(displayed_dive.dive_site_uuid); + if (ds) + ui.location->setText(ds->name); + else + ui.location->clear(); // Subsurface always uses "local time" as in "whatever was the local time at the location" // so all time stamps have no time zone information and are in UTC QDateTime localTime = QDateTime::fromTime_t(displayed_dive.when - gettimezoneoffset(displayed_dive.when)); @@ -440,8 +470,6 @@ void MainTab::updateDiveInfo(bool clear) setTabText(0, tr("Trip notes")); currentTrip = *MainWindow::instance()->dive_list()->selectedTrips().begin(); // only use trip relevant fields - ui.coordinates->setVisible(false); - ui.CoordinatedLabel->setVisible(false); ui.divemaster->setVisible(false); ui.DivemasterLabel->setVisible(false); ui.buddy->setVisible(false); @@ -468,11 +496,9 @@ void MainTab::updateDiveInfo(bool clear) clearEquipment(); ui.equipmentTab->setEnabled(false); } else { - setTabText(0, tr("Dive notes")); + setTabText(0, tr("Notes")); currentTrip = NULL; // make all the fields visible writeable - ui.coordinates->setVisible(true); - ui.CoordinatedLabel->setVisible(true); ui.divemaster->setVisible(true); ui.buddy->setVisible(true); ui.suit->setVisible(true); @@ -641,8 +667,8 @@ void MainTab::updateDiveInfo(bool clear) clearStats(); clearEquipment(); ui.rating->setCurrentStars(0); - ui.coordinates->clear(); ui.visibility->setCurrentStars(0); + ui.location->clear(); } editMode = NONE; ui.cylinders->view()->hideColumn(CylindersModel::DEPTH); @@ -750,19 +776,13 @@ void MainTab::acceptChanges() copy_samples(&displayed_dive.dc, ¤t_dive->dc); } struct dive *cd = current_dive; - //Reset coordinates field, in case it contains garbage. - updateGpsCoordinates(); // now check if something has changed and if yes, edit the selected dives that // were identical with the master dive shown (and mark the divelist as changed) - if (!same_string(displayed_dive.buddy, cd->buddy)) - MODIFY_SELECTED_DIVES(EDIT_TEXT(buddy)); if (!same_string(displayed_dive.suit, cd->suit)) MODIFY_SELECTED_DIVES(EDIT_TEXT(suit)); if (!same_string(displayed_dive.notes, cd->notes)) MODIFY_SELECTED_DIVES(EDIT_TEXT(notes)); if (!same_string(displayed_dive.divemaster, cd->divemaster)) - MODIFY_SELECTED_DIVES(EDIT_TEXT(divemaster)); - if (displayed_dive.rating != cd->rating) MODIFY_SELECTED_DIVES(EDIT_VALUE(rating)); if (displayed_dive.visibility != cd->visibility) MODIFY_SELECTED_DIVES(EDIT_VALUE(visibility)); @@ -779,18 +799,12 @@ void MainTab::acceptChanges() time_t offset = cd->when - displayed_dive.when; MODIFY_SELECTED_DIVES(mydive->when -= offset;); } - if (displayed_dive.latitude.udeg != cd->latitude.udeg || - displayed_dive.longitude.udeg != cd->longitude.udeg) - MODIFY_SELECTED_DIVES( - if (copyPaste || - (same_string(mydive->location, cd->location) && - mydive->latitude.udeg == cd->latitude.udeg && - mydive->longitude.udeg == cd->longitude.udeg)) - gpsHasChanged(mydive, cd, ui.coordinates->text(), 0); - ); - if (!same_string(displayed_dive.location, cd->location)) - MODIFY_SELECTED_DIVES(EDIT_TEXT(location)); + if (displayed_dive.dive_site_uuid != cd->dive_site_uuid) + MODIFY_SELECTED_DIVES(EDIT_VALUE(dive_site_uuid)); + // three text fields are somewhat special and are represented as tags + // in the UI - they need somewhat smarter handling + saveTaggedStrings(); saveTags(); if (editMode != ADD && cylindersModel->changed) { @@ -821,6 +835,16 @@ void MainTab::acceptChanges() cd->cylinder[i] = displayed_dive.cylinder[i]; cd->cylinder[i].type.description = copy_string(displayed_dive.cylinder[i].type.description); } + /* if cylinders changed we may have changed gas change events + * - so far this is ONLY supported for a single selected dive */ + struct divecomputer *tdc = ¤t_dive->dc; + struct divecomputer *sdc = &displayed_dive.dc; + while(tdc && sdc) { + free_events(tdc->events); + copy_events(sdc, tdc); + tdc = tdc->next; + sdc = sdc->next; + } do_replot = true; } @@ -895,7 +919,6 @@ void MainTab::resetPallete() ui.buddy->setPalette(p); ui.notes->setPalette(p); ui.location->setPalette(p); - ui.coordinates->setPalette(p); ui.divemaster->setPalette(p); ui.suit->setPalette(p); ui.airtemp->setPalette(p); @@ -970,10 +993,7 @@ void MainTab::markChangedWidget(QWidget *w) qApp->palette().color(QPalette::Text).getHslF(&h, &s, &l, &a); p.setBrush(QPalette::Base, (l <= 0.3) ? QColor(Qt::yellow).lighter() : (l <= 0.6) ? QColor(Qt::yellow).light() : /* else */ QColor(Qt::yellow).darker(300)); w->setPalette(p); - if (!modified) { - modified = true; - enableEdition(); - } + modified = true; } void MainTab::on_buddy_textChanged() @@ -1137,6 +1157,73 @@ void MainTab::saveTags() ); } +// buddy and divemaster are represented in the UI just like the tags, but the internal +// representation is just a string (with commas as delimiters). So we need to do the same +// thing we did for tags, just differently +void MainTab::saveTaggedStrings() +{ + QStringList addedList, removedList; + struct dive *cd = current_dive; + + diffTaggedStrings(cd->buddy, displayed_dive.buddy, addedList, removedList); + MODIFY_SELECTED_DIVES( + QStringList oldList = QString(mydive->buddy).split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts); + QString newString; + QString comma; + Q_FOREACH (const QString tag, oldList) { + if (!removedList.contains(tag, Qt::CaseInsensitive)) { + newString += comma + tag; + comma = ", "; + } + } + Q_FOREACH (const QString tag, addedList) { + if (!oldList.contains(tag, Qt::CaseInsensitive)) { + newString += comma + tag; + comma = ", "; + } + } + free(mydive->buddy); + mydive->buddy = copy_string(qPrintable(newString)); + ); + addedList.clear(); + removedList.clear(); + diffTaggedStrings(cd->divemaster, displayed_dive.divemaster, addedList, removedList); + MODIFY_SELECTED_DIVES( + QStringList oldList = QString(mydive->divemaster).split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts); + QString newString; + QString comma; + Q_FOREACH (const QString tag, oldList) { + if (!removedList.contains(tag, Qt::CaseInsensitive)) { + newString += comma + tag; + comma = ", "; + } + } + Q_FOREACH (const QString tag, addedList) { + if (!oldList.contains(tag, Qt::CaseInsensitive)) { + newString += comma + tag; + comma = ", "; + } + } + free(mydive->divemaster); + mydive->divemaster = copy_string(qPrintable(newString)); + ); +} + +void MainTab::diffTaggedStrings(QString currentString, QString displayedString, QStringList &addedList, QStringList &removedList) +{ + QStringList displayedList, currentList; + currentList = currentString.split(',', QString::SkipEmptyParts); + displayedList = displayedString.split(',', QString::SkipEmptyParts); + Q_FOREACH ( const QString tag, currentList) { + if (!displayedList.contains(tag, Qt::CaseInsensitive)) + removedList << tag.trimmed(); + } + Q_FOREACH (const QString tag, displayedList) { + if (!currentList.contains(tag, Qt::CaseInsensitive)) + addedList << tag.trimmed(); + } +} + void MainTab::on_tagWidget_textChanged() { char buf[1024]; @@ -1158,9 +1245,6 @@ void MainTab::on_location_textChanged(const QString &text) if (currentTrip) { free(displayedTrip.location); displayedTrip.location = strdup(ui.location->text().toUtf8().data()); - } else { - free(displayed_dive.location); - displayed_dive.location = strdup(ui.location->text().toUtf8().data()); } markChangedWidget(ui.location); } @@ -1168,25 +1252,13 @@ void MainTab::on_location_textChanged(const QString &text) // If we have GPS data for the location entered, add it. void MainTab::on_location_editingFinished() { - // if we have a location and no GPS data, look up the GPS data; - // but if the GPS data was intentionally cleared then don't - if (!currentTrip && - !same_string(displayed_dive.location, "") && - ui.coordinates->text().trimmed().isEmpty() && - !(editMode == DIVE && dive_has_gps_location(current_dive))) { - struct dive *dive; - int i = 0; - for_each_dive (i, dive) { - if (same_string(displayed_dive.location, dive->location) && - (dive->latitude.udeg || dive->longitude.udeg)) { - displayed_dive.latitude = dive->latitude; - displayed_dive.longitude = dive->longitude; - MainWindow::instance()->globe()->reload(); - updateGpsCoordinates(); - break; - } - } - } + // find the dive site or create it + const char *name = copy_string(qPrintable(ui.location->text())); + uint32_t uuid = get_dive_site_uuid_by_name(name, NULL); + if (!uuid) + uuid = create_dive_site(name); + displayed_dive.dive_site_uuid = uuid; + free((void*)name); } void MainTab::on_suit_textChanged(const QString &text) @@ -1219,6 +1291,7 @@ void MainTab::on_notes_textChanged() markChangedWidget(ui.notes); } +#if 0 // we'll need something like this for the dive site management void MainTab::on_coordinates_textChanged(const QString &text) { if (editMode == IGNORE || acceptingEdit == true) @@ -1235,6 +1308,7 @@ void MainTab::on_coordinates_textChanged(const QString &text) ui.coordinates->setPalette(p); // marks things red } } +#endif void MainTab::on_rating_valueChanged(int value) { @@ -1286,6 +1360,7 @@ void MainTab::editWeightWidget(const QModelIndex &index) ui.weights->edit(index); } +#if 0 // we'll need this for dive sites void MainTab::updateCoordinatesText(qreal lat, qreal lon) { int ulat = rint(lat * 1000000); @@ -1298,9 +1373,16 @@ void MainTab::updateGpsCoordinates() if (editMode == NONE) enableEdition(); - ui.coordinates->setText(printGPSCoords(displayed_dive.latitude.udeg, displayed_dive.longitude.udeg)); - ui.coordinates->setModified(displayed_dive.latitude.udeg || displayed_dive.longitude.udeg); + struct dive_site *ds = get_dive_site_by_uuid(displayed_dive.dive_site_uuid); + if (ds && dive_site_has_gps_location(ds)) { + ui.coordinates->setText(printGPSCoords(ds->latitude.udeg, ds->longitude.udeg)); + ui.coordinates->setModified(true); + } else if (!ui.coordinates->text().isEmpty()) { + ui.coordinates->setModified(true); + ui.coordinates->clear(); + } } +#endif void MainTab::escDetected() { @@ -1332,7 +1414,6 @@ void MainTab::showAndTriggerEditSelective(struct dive_components what) // take the data in our copyPasteDive and apply it to selected dives enableEdition(); copyPaste = true; - SHOW_SELECTIVE(location); SHOW_SELECTIVE(buddy); SHOW_SELECTIVE(divemaster); SHOW_SELECTIVE(suit); @@ -1347,8 +1428,8 @@ void MainTab::showAndTriggerEditSelective(struct dive_components what) ui.rating->setCurrentStars(displayed_dive.rating); if (what.visibility) ui.visibility->setCurrentStars(displayed_dive.visibility); - if (what.gps) - updateGpsCoordinates(); + if (what.divesite) + ui.location->setText(get_dive_location(&displayed_dive)); if (what.tags) { char buf[1024]; taglist_get_tagstring(displayed_dive.tag_list, buf, 1024); diff --git a/qt-ui/maintab.h b/qt-ui/maintab.h index 71703e3f1..4a44c03b3 100644 --- a/qt-ui/maintab.h +++ b/qt-ui/maintab.h @@ -10,6 +10,7 @@ #include <QTabWidget> #include <QDialog> #include <QMap> +#include <QUuid> #include "ui_maintab.h" #include "completionmodels.h" @@ -40,7 +41,7 @@ public: IGNORE }; - MainTab(QWidget *parent); + MainTab(QWidget *parent = 0); ~MainTab(); void clearStats(); void clearInfo(); @@ -55,7 +56,7 @@ public: signals: void addDiveFinished(); void dateTimeChanged(); - + void requestDiveSiteEdit(uint32_t uuid); public slots: void addCylinder_clicked(); @@ -65,7 +66,6 @@ slots: void rejectChanges(); void on_location_textChanged(const QString &text); void on_location_editingFinished(); - void on_coordinates_textChanged(const QString &text); void on_divemaster_textChanged(); void on_buddy_textChanged(); void on_suit_textChanged(const QString &text); @@ -92,7 +92,10 @@ slots: void escDetected(void); void photoDoubleClicked(const QString filePath); void removeSelectedPhotos(); - void updateGpsCoordinates(); + void prepareDiveSiteEdit(); + void showLocation(); + void enableGeoLoockupEdition(); + void disableGeoLoockupEdition(); private: Ui::MainTab ui; @@ -111,6 +114,8 @@ private: bool copyPaste; void resetPallete(); void saveTags(); + void saveTaggedStrings(); + void diffTaggedStrings(QString currentString, QString displayedString, QStringList &addedList, QStringList &removedList); void markChangedWidget(QWidget *w); dive_trip_t *currentTrip; dive_trip_t displayedTrip; diff --git a/qt-ui/maintab.ui b/qt-ui/maintab.ui index bffbac97a..da8cabecb 100644 --- a/qt-ui/maintab.ui +++ b/qt-ui/maintab.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>443</width> + <width>463</width> <height>815</height> </rect> </property> @@ -15,7 +15,7 @@ </property> <widget class="QWidget" name="notesTab"> <attribute name="title"> - <string>Dive notes</string> + <string>Notes</string> </attribute> <layout class="QGridLayout" name="diveNotesLayout"> <property name="spacing"> @@ -40,113 +40,137 @@ <rect> <x>0</x> <y>0</y> - <width>397</width> + <width>417</width> <height>744</height> </rect> </property> - <layout class="QGridLayout" name="diveNotesScrollAreaLayout"> - <property name="spacing"> - <number>0</number> - </property> - <item row="4" column="0" colspan="3"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="sizeConstraint"> - <enum>QLayout::SetNoConstraint</enum> - </property> - <item> - <widget class="QLabel" name="CoordinatedLabel"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Date</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Time</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="airTempLabel"> + <property name="text"> + <string>Air temp.</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QLabel" name="waterTempLabel"> + <property name="text"> + <string>Water temp.</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QDateEdit" name="dateEdit"> + <property name="calendarPopup"> + <bool>true</bool> + </property> + <property name="timeSpec"> + <enum>Qt::UTC</enum> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QTimeEdit" name="timeEdit"> <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Coordinates</string> + <property name="timeSpec"> + <enum>Qt::UTC</enum> </property> </widget> </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="airtemp"> + <property name="readOnly"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QLineEdit" name="watertemp"> + <property name="readOnly"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="LocationLabelLayout"> <item> - <widget class="QLabel" name="TypeLabel"> + <widget class="QLabel" name="LocationLabel"> <property name="text"> - <string>Dive mode</string> + <string>Location</string> </property> </widget> </item> </layout> </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Date</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Time</string> - </property> - </widget> - </item> - <item row="0" column="2"> - <layout class="QHBoxLayout" name="temperatureLabels"> - <property name="spacing"> - <number>0</number> - </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QLabel" name="airTempLabel"> - <property name="text"> - <string>Air temp.</string> + <widget class="QLineEdit" name="location"> + <property name="readOnly"> + <bool>false</bool> </property> </widget> </item> <item> - <widget class="QLabel" name="waterTempLabel"> + <widget class="QPushButton" name="manageDiveSite"> <property name="text"> - <string>Water temp.</string> + <string>manage</string> </property> </widget> </item> + <item> + <widget class="QtWaitingSpinner" name="waitingSpinner" native="true"/> + </item> </layout> </item> - <item row="1" column="1"> - <widget class="QTimeEdit" name="timeEdit"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="timeSpec"> - <enum>Qt::UTC</enum> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QDateEdit" name="dateEdit"> - <property name="calendarPopup"> - <bool>true</bool> - </property> - <property name="timeSpec"> - <enum>Qt::UTC</enum> - </property> - </widget> - </item> - <item row="1" column="2"> - <layout class="QHBoxLayout" name="airWaterTempLayout"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="QLineEdit" name="airtemp"> + <item> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QLabel" name="DivemasterLabel"> + <property name="text"> + <string>Divemaster</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="BuddyLabel"> + <property name="text"> + <string>Buddy</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="TagWidget" name="divemaster"> <property name="readOnly"> <bool>false</bool> </property> </widget> </item> - <item> - <widget class="QLineEdit" name="watertemp"> + <item row="1" column="1"> + <widget class="TagWidget" name="buddy"> <property name="readOnly"> <bool>false</bool> </property> @@ -154,47 +178,9 @@ </item> </layout> </item> - <item row="2" column="0"> - <widget class="QLabel" name="LocationLabel"> - <property name="text"> - <string>Location</string> - </property> - </widget> - </item> - <item row="10" column="0"> - <widget class="QLabel" name="DivemasterLabel"> - <property name="text"> - <string>Divemaster</string> - </property> - </widget> - </item> - <item row="10" column="2"> - <widget class="QLabel" name="BuddyLabel"> - <property name="text"> - <string>Buddy</string> - </property> - </widget> - </item> - <item row="11" column="0" colspan="2"> - <widget class="TagWidget" name="divemaster"> - <property name="readOnly"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="11" column="2"> - <widget class="TagWidget" name="buddy"> - <property name="readOnly"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="12" column="0" colspan="2"> - <layout class="QHBoxLayout" name="ratingVisibilityLabels"> - <property name="spacing"> - <number>0</number> - </property> - <item> + <item> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> <widget class="QLabel" name="RatingLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> @@ -207,7 +193,7 @@ </property> </widget> </item> - <item> + <item row="0" column="1"> <widget class="QLabel" name="visibilityLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> @@ -220,28 +206,14 @@ </property> </widget> </item> - </layout> - </item> - <item row="12" column="2"> - <widget class="QLabel" name="SuitLabel"> - <property name="text"> - <string>Suit</string> - </property> - </widget> - </item> - <item row="13" column="2"> - <widget class="QLineEdit" name="suit"> - <property name="readOnly"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="13" column="0" colspan="2"> - <layout class="QHBoxLayout" name="ratingVisibilityWidgets"> - <property name="spacing"> - <number>0</number> - </property> - <item> + <item row="0" column="2"> + <widget class="QLabel" name="SuitLabel"> + <property name="text"> + <string>Suit</string> + </property> + </widget> + </item> + <item row="1" column="0"> <widget class="StarWidget" name="rating" native="true"> <property name="sizePolicy"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> @@ -254,7 +226,7 @@ </property> </widget> </item> - <item> + <item row="1" column="1"> <widget class="StarWidget" name="visibility" native="true"> <property name="sizePolicy"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> @@ -267,55 +239,69 @@ </property> </widget> </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="suit"> + <property name="readOnly"> + <bool>false</bool> + </property> + </widget> + </item> </layout> </item> - <item row="14" column="0"> - <widget class="QLabel" name="TagLabel"> - <property name="text"> - <string>Tags</string> - </property> - </widget> + <item> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="1" column="1"> + <widget class="QComboBox" name="DiveType"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="TagLabel"> + <property name="text"> + <string>Tags</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="TypeLabel"> + <property name="text"> + <string>Dive mode</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="TagWidget" name="tagWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="lineWrapMode"> + <enum>QPlainTextEdit::NoWrap</enum> + </property> + </widget> + </item> + </layout> </item> - <item row="16" column="0"> + <item> <widget class="QLabel" name="NotesLabel"> <property name="text"> <string>Notes</string> </property> </widget> </item> - <item row="15" column="0" colspan="3"> - <widget class="TagWidget" name="tagWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="verticalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> - </property> - <property name="horizontalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> - </property> - <property name="lineWrapMode"> - <enum>QPlainTextEdit::NoWrap</enum> - </property> - </widget> - </item> - <item row="3" column="0" colspan="3"> - <widget class="QLineEdit" name="location"> - <property name="readOnly"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="17" column="0" colspan="3"> + <item> <layout class="QHBoxLayout" name="notesAndSocialNetworksLayout"> <property name="spacing"> <number>0</number> @@ -371,20 +357,6 @@ </item> </layout> </item> - <item row="7" column="0" colspan="3"> - <layout class="QHBoxLayout" name="coordinatesDiveTypeLayout"> - <item> - <widget class="QLineEdit" name="coordinates"> - <property name="readOnly"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="DiveType"/> - </item> - </layout> - </item> </layout> </widget> </widget> @@ -415,8 +387,8 @@ <rect> <x>0</x> <y>0</y> - <width>397</width> - <height>734</height> + <width>98</width> + <height>55</height> </rect> </property> <layout class="QGridLayout" name="equipmentTabScrollAreaLayout"> @@ -449,7 +421,7 @@ </widget> <widget class="QWidget" name="infoTab"> <attribute name="title"> - <string>Dive info</string> + <string>Info</string> </attribute> <layout class="QGridLayout" name="diveInfoLayout"> <item row="0" column="0"> @@ -471,8 +443,8 @@ <rect> <x>0</x> <y>0</y> - <width>397</width> - <height>734</height> + <width>330</width> + <height>334</height> </rect> </property> <layout class="QGridLayout" name="diveInfoScrollAreaLayout"> @@ -788,8 +760,8 @@ <rect> <x>0</x> <y>0</y> - <width>397</width> - <height>734</height> + <width>328</width> + <height>208</height> </rect> </property> <layout class="QGridLayout" name="statsScrollAreaLayout"> @@ -1039,6 +1011,12 @@ <extends>QListView</extends> <header>divepicturewidget.h</header> </customwidget> + <customwidget> + <class>QtWaitingSpinner</class> + <extends>QWidget</extends> + <header>qtwaitingspinner.h</header> + <container>1</container> + </customwidget> </customwidgets> <tabstops> <tabstop>dateEdit</tabstop> @@ -1051,7 +1029,6 @@ <tabstop>rating</tabstop> <tabstop>visibility</tabstop> <tabstop>suit</tabstop> - <tabstop>tagWidget</tabstop> <tabstop>notes</tabstop> </tabstops> <resources> diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 82eaaac57..a06a2c227 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -11,7 +11,8 @@ #include <QSettings> #include <QShortcut> #include <QToolBar> -#include "ssrf-version.h" +#include "version.h" +#include "divelistview.h" #include "downloadfromdivecomputer.h" #include "preferences.h" #include "subsurfacewebservices.h" @@ -20,6 +21,10 @@ #include "updatemanager.h" #include "planner.h" #include "filtermodels.h" +#include "profile/profilewidget2.h" +#include "globe.h" +#include "maintab.h" +#include "diveplanner.h" #ifndef NO_PRINTING #include <QPrintDialog> #include "printdialog.h" @@ -27,10 +32,15 @@ #include "divelogimportdialog.h" #include "divelogexportdialog.h" #include "usersurvey.h" +#include "divesitehelpers.h" +#include "locationinformation.h" #ifndef NO_USERMANUAL #include "usermanual.h" #endif #include <QNetworkProxy> +#include <QUndoStack> +#include <qthelper.h> +#include <QtConcurrentRun> MainWindow *MainWindow::m_Instance = NULL; @@ -44,7 +54,26 @@ MainWindow::MainWindow() : QMainWindow(), Q_ASSERT_X(m_Instance == NULL, "MainWindow", "MainWindow recreated!"); m_Instance = this; ui.setupUi(this); - ui.multiFilter->hide(); + read_hashes(); + // Define the States of the Application Here, Currently the states are situations where the different + // widgets will change on the mainwindow. + + // for the "default" mode + MainTab *mainTab = new MainTab(); + DiveListView *diveListView = new DiveListView(); + ProfileWidget2 *profileWidget = new ProfileWidget2(); + +#ifndef NO_MARBLE + GlobeGPS *globeGps = new GlobeGPS(); +#else + QWidget *globeGps = NULL; +#endif + + PlannerSettingsWidget *plannerSettings = new PlannerSettingsWidget(); + DivePlannerWidget *plannerWidget = new DivePlannerWidget(); + PlannerDetails *plannerDetails = new PlannerDetails(); + LocationInformationWidget *locationInformation = new LocationInformationWidget(); + // what is a sane order for those icons? we should have the ones the user is // most likely to want towards the top so they are always visible // and the ones that someone likely sets and then never touches again towards the bottom @@ -57,69 +86,82 @@ MainWindow::MainWindow() : QMainWindow(), ui.profEad << ui.profSAC << ui.profHR << // very few dive computers support this ui.profTissues; // maybe less frequently used + + QToolBar *toolBar = new QToolBar(); + Q_FOREACH (QAction *a, profileToolbarActions) + toolBar->addAction(a); + toolBar->setOrientation(Qt::Vertical); + toolBar->setIconSize(QSize(24,24)); + + QWidget *profileContainer = new QWidget(); + QHBoxLayout *profLayout = new QHBoxLayout(); + profLayout->addWidget(toolBar); + profLayout->addWidget(profileWidget); + profileContainer->setLayout(profLayout); + + registerApplicationState("Default", mainTab, profileContainer, diveListView, globeGps ); + registerApplicationState("AddDive", mainTab, profileContainer, diveListView, globeGps ); + registerApplicationState("EditDive", mainTab, profileContainer, diveListView, globeGps ); + registerApplicationState("PlanDive", plannerWidget, profileContainer, plannerSettings, plannerDetails ); + registerApplicationState("EditPlannedDive", plannerWidget, profileContainer, diveListView, globeGps ); + registerApplicationState("EditDiveSite",locationInformation, profileContainer, diveListView, globeGps ); + + setApplicationState("Default"); + + ui.multiFilter->hide(); + setWindowIcon(QIcon(":subsurface-icon")); if (!QIcon::hasThemeIcon("window-close")) { QIcon::setThemeName("subsurface"); } - connect(ui.ListWidget, SIGNAL(currentDiveChanged(int)), this, SLOT(current_dive_changed(int))); + connect(dive_list(), SIGNAL(currentDiveChanged(int)), this, SLOT(current_dive_changed(int))); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), this, SLOT(readSettings())); - connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.ListWidget, SLOT(update())); - connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.ListWidget, SLOT(reloadHeaderActions())); - connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.InfoWidget, SLOT(updateDiveInfo())); - connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.divePlannerWidget, SLOT(settingsChanged())); - connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.plannerSettingsWidget, SLOT(settingsChanged())); + connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), diveListView, SLOT(update())); + connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), diveListView, SLOT(reloadHeaderActions())); + connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), information(), SLOT(updateDiveInfo())); + connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), divePlannerWidget(), SLOT(settingsChanged())); + connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), divePlannerSettingsWidget(), SLOT(settingsChanged())); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), TankInfoModel::instance(), SLOT(update())); connect(ui.actionRecent1, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool))); connect(ui.actionRecent2, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool))); connect(ui.actionRecent3, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool))); connect(ui.actionRecent4, SIGNAL(triggered(bool)), this, SLOT(recentFileTriggered(bool))); - connect(information(), SIGNAL(addDiveFinished()), ui.newProfile, SLOT(setProfileState())); + connect(information(), SIGNAL(addDiveFinished()), graphics(), SLOT(setProfileState())); connect(DivePlannerPointsModel::instance(), SIGNAL(planCreated()), this, SLOT(planCreated())); connect(DivePlannerPointsModel::instance(), SIGNAL(planCanceled()), this, SLOT(planCanceled())); - connect(ui.printPlan, SIGNAL(pressed()), ui.divePlannerWidget, SLOT(printDecoPlan())); + connect(plannerDetails->printPlan(), SIGNAL(pressed()), divePlannerWidget(), SLOT(printDecoPlan())); + connect(mainTab, SIGNAL(requestDiveSiteEdit(uint32_t)), this, SLOT(enableDiveSiteEdit(uint32_t))); + connect(locationInformation, SIGNAL(informationManagementEnded()), this, SLOT(setDefaultState())); + connect(locationInformation, SIGNAL(informationManagementEnded()), information(), SLOT(showLocation())); + #ifdef NO_PRINTING - ui.printPlan->hide(); + plannerDetails->printPlan()->hide(); + ui.menuFile->removeAction(ui.actionPrint); #endif ui.mainErrorMessage->hide(); - ui.newProfile->setEmptyState(); + graphics()->setEmptyState(); initialUiSetup(); readSettings(); - ui.ListWidget->reload(DiveTripModel::TREE); - ui.ListWidget->reloadHeaderActions(); - ui.ListWidget->setFocus(); - ui.globe->reload(); - ui.ListWidget->expand(ui.ListWidget->model()->index(0, 0)); - ui.ListWidget->scrollTo(ui.ListWidget->model()->index(0, 0), QAbstractItemView::PositionAtCenter); - ui.divePlannerWidget->settingsChanged(); - ui.plannerSettingsWidget->settingsChanged(); + diveListView->reload(DiveTripModel::TREE); + diveListView->reloadHeaderActions(); + diveListView->setFocus(); + globe()->reload(); + diveListView->expand(dive_list()->model()->index(0, 0)); + diveListView->scrollTo(dive_list()->model()->index(0, 0), QAbstractItemView::PositionAtCenter); + divePlannerWidget()->settingsChanged(); + divePlannerSettingsWidget()->settingsChanged(); #ifdef NO_MARBLE - ui.globePane->hide(); ui.menuView->removeAction(ui.actionViewGlobe); #else - connect(ui.globe, SIGNAL(coordinatesChanged()), ui.InfoWidget, SLOT(updateGpsCoordinates())); + connect(globe(), SIGNAL(coordinatesChanged()), locationInformation, SLOT(updateGpsCoordinates())); #endif #ifdef NO_USERMANUAL ui.menuHelp->removeAction(ui.actionUserManual); #endif -#ifdef NO_PRINTING - ui.menuFile->removeAction(ui.actionPrint); -#endif memset(©PasteDive, 0, sizeof(copyPasteDive)); memset(&what, 0, sizeof(what)); - QToolBar *toolBar = new QToolBar(); - Q_FOREACH (QAction *a, profileToolbarActions) - toolBar->addAction(a); - toolBar->setOrientation(Qt::Vertical); - toolBar->setIconSize(QSize(24,24)); - // since I'm adding the toolBar by hand, because designer - // has no concept of "toolbar" for a non-mainwindow widget (...) - // I need to take the current item that's in the toolbar Position - // and reposition it alongside the grid layout. - QLayoutItem *p = ui.profileInnerLayout->takeAt(0); - ui.profileInnerLayout->addWidget(toolBar, 0, 0); - ui.profileInnerLayout->addItem(p, 0, 1); // and now for some layout hackery // this gets us consistent margins everywhere and a much more balanced look @@ -146,19 +188,52 @@ MainWindow::MainWindow() : QMainWindow(), else layout->setContentsMargins(margins); } - margins = QMargins(0, 5, 5, 5); - ui.profileInnerLayout->setContentsMargins(margins); - ui.profileInnerLayout->setSpacing(0); toolBar->setContentsMargins(zeroMargins); updateManager = new UpdateManager(this); + + undoStack = new QUndoStack(this); + QAction *undoAction = undoStack->createUndoAction(this, tr("&Undo")); + QAction *redoAction = undoStack->createRedoAction(this, tr("&Redo")); + undoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z)); + redoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Z)); + QList<QAction*>undoRedoActions; + undoRedoActions.append(undoAction); + undoRedoActions.append(redoAction); + ui.menu_Edit->addActions(undoRedoActions); + + ReverseGeoLoockupThread *geoLoockup = ReverseGeoLoockupThread::instance(); + connect(geoLoockup, SIGNAL(started()),information(), SLOT(disableGeoLoockupEdition())); + connect(geoLoockup, SIGNAL(finished()), information(), SLOT(enableGeoLoockupEdition())); } MainWindow::~MainWindow() { + write_hashes(); m_Instance = NULL; } +PlannerDetails *MainWindow::plannerDetails() const { + return qobject_cast<PlannerDetails*>(applicationState["PlanDive"].bottomRight); +} + +PlannerSettingsWidget *MainWindow::divePlannerSettingsWidget() { + return qobject_cast<PlannerSettingsWidget*>(applicationState["PlanDive"].bottomLeft); +} + +LocationInformationWidget *MainWindow::locationInformationWidget() { + return qobject_cast<LocationInformationWidget*>(applicationState["EditDiveSite"].topLeft); +} + +void MainWindow::enableDiveSiteEdit(uint32_t id) { + locationInformationWidget()->setLocationId(displayed_dive.dive_site_uuid); + setApplicationState("EditDiveSite"); +} + +void MainWindow::setDefaultState() { + setApplicationState("Default"); +} + void MainWindow::setLoadedWithFiles(bool f) { filesAsArguments = f; @@ -177,19 +252,16 @@ MainWindow *MainWindow::instance() // this gets called after we download dives from a divecomputer void MainWindow::refreshDisplay(bool doRecreateDiveList) { - showError(get_error_string()); - ui.InfoWidget->reload(); + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); + information()->reload(); TankInfoModel::instance()->update(); - ui.globe->reload(); + globe()->reload(); if (doRecreateDiveList) recreateDiveList(); - ui.diveListPane->setCurrentIndex(0); // switch to the dive list -#ifdef NO_MARBLE - ui.globePane->hide(); -#endif - ui.globePane->setCurrentIndex(0); - ui.ListWidget->setEnabled(true); - ui.ListWidget->setFocus(); + + setApplicationState("Default"); + dive_list()->setEnabled(true); + dive_list()->setFocus(); WSInfoModel::instance()->updateInfo(); if (amount_selected == 0) cleanUpEmpty(); @@ -197,7 +269,7 @@ void MainWindow::refreshDisplay(bool doRecreateDiveList) void MainWindow::recreateDiveList() { - ui.ListWidget->reload(DiveTripModel::CURRENT); + dive_list()->reload(DiveTripModel::CURRENT); TagFilterModel::instance()->repopulate(); BuddyFilterModel::instance()->repopulate(); LocationFilterModel::instance()->repopulate(); @@ -208,10 +280,11 @@ void MainWindow::current_dive_changed(int divenr) { if (divenr >= 0) { select_dive(divenr); - ui.globe->centerOnCurrentDive(); + globe()->centerOnCurrentDive(); } - ui.newProfile->plotDive(); - ui.InfoWidget->updateDiveInfo(); + graphics()->plotDive(); + information()->updateDiveInfo(); + locationInformationWidget()->setLocationId(displayed_dive.dive_site_uuid); } void MainWindow::on_actionNew_triggered() @@ -252,20 +325,49 @@ void MainWindow::on_actionSaveAs_triggered() file_save_as(); } +void learnImageDirs(QStringList dirnames) +{ + QList<QFuture<void> > futures; + foreach (QString dir, dirnames) { + futures << QtConcurrent::run(learnImages, QDir(dir), 10, false); + } + DivePictureModel::instance()->updateDivePicturesWhenDone(futures); +} + +void MainWindow::on_actionHash_images_triggered() +{ + QFuture<void> future; + QFileDialog dialog(this, tr("Traverse image directories"), lastUsedDir(), filter()); + dialog.setFileMode(QFileDialog::Directory); + dialog.setViewMode(QFileDialog::Detail); + dialog.setLabelText(QFileDialog::Accept, tr("Scan")); + dialog.setLabelText(QFileDialog::Reject, tr("Cancel")); + QStringList dirnames; + if (dialog.exec()) + dirnames = dialog.selectedFiles(); + if (dirnames.isEmpty()) + return; + future = QtConcurrent::run(learnImageDirs,dirnames); + MainWindow::instance()->getNotificationWidget()->showNotification(tr("Scanning images...(this can take a while)"), KMessageWidget::Information); + MainWindow::instance()->getNotificationWidget()->setFuture(future); + +} + ProfileWidget2 *MainWindow::graphics() const { - return ui.newProfile; + return qobject_cast<ProfileWidget2*>(applicationState["Default"].topRight->layout()->itemAt(1)->widget()); } void MainWindow::cleanUpEmpty() { - ui.InfoWidget->clearStats(); - ui.InfoWidget->clearInfo(); - ui.InfoWidget->clearEquipment(); - ui.InfoWidget->updateDiveInfo(true); - ui.newProfile->setEmptyState(); - ui.ListWidget->reload(DiveTripModel::TREE); - ui.globe->reload(); + information()->clearStats(); + information()->clearInfo(); + information()->clearEquipment(); + information()->updateDiveInfo(true); + graphics()->setEmptyState(); + dive_list()->reload(DiveTripModel::TREE); + locationInformationWidget()->setLocationId(0); + globe()->reload(); if (!existing_filename) setTitle(MWTF_DEFAULT); disableShortcuts(); @@ -274,7 +376,8 @@ void MainWindow::cleanUpEmpty() bool MainWindow::okToClose(QString message) { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || - ui.InfoWidget->isEditing()) { + information()->isEditing() || + currentApplicationState == "EditDiveSite") { QMessageBox::warning(this, tr("Warning"), message); return false; } @@ -286,11 +389,13 @@ bool MainWindow::okToClose(QString message) void MainWindow::closeCurrentFile() { - ui.newProfile->setEmptyState(); + graphics()->setEmptyState(); /* free the dives and trips */ clear_git_id(); while (dive_table.nr) delete_single_dive(0); + while (dive_site_table.nr) + delete_dive_site(get_dive_site(0)->uuid); free((void *)existing_filename); existing_filename = NULL; @@ -362,8 +467,8 @@ void MainWindow::enableShortcuts() void MainWindow::showProfile() { enableShortcuts(); - ui.newProfile->setProfileState(); - ui.infoPane->setCurrentIndex(MAINTAB); + graphics()->setProfileState(); + setApplicationState("Default"); } void MainWindow::on_actionPreferences_triggered() @@ -373,9 +478,9 @@ void MainWindow::on_actionPreferences_triggered() void MainWindow::on_actionQuit_triggered() { - if (ui.InfoWidget->isEditing()) { - ui.InfoWidget->rejectChanges(); - if (ui.InfoWidget->isEditing()) + if (information()->isEditing()) { + information()->rejectChanges(); + if (information()->isEditing()) // didn't discard the edits return; } @@ -421,7 +526,7 @@ void MainWindow::on_actionEditDeviceNames_triggered() bool MainWindow::plannerStateClean() { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || - ui.InfoWidget->isEditing()) { + information()->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before trying to add a dive.")); return false; } @@ -433,16 +538,16 @@ void MainWindow::planCanceled() // while planning we might have modified the displayed_dive // let's refresh what's shown on the profile showProfile(); - ui.newProfile->replot(); + graphics()->replot(); refreshDisplay(false); - ui.newProfile->plotDive(get_dive(selected_dive)); + graphics()->plotDive(get_dive(selected_dive)); DivePictureModel::instance()->updateDivePictures(); } void MainWindow::planCreated() { // get the new dive selected and assign a number if reasonable - ui.newProfile->setProfileState(); + graphics()->setProfileState(); if (displayed_dive.id == 0) { // we might have added a new dive (so displayed_dive was cleared out by clone_dive() dive_list()->unselectDives(); @@ -451,20 +556,20 @@ void MainWindow::planCreated() set_dive_nr_for_current_dive(); } // make sure our UI is in a consistent state - ui.InfoWidget->updateDiveInfo(); + information()->updateDiveInfo(); showProfile(); refreshDisplay(); } void MainWindow::setPlanNotes(const char *notes) { - ui.divePlanOutput->setHtml(notes); + plannerDetails()->divePlanOutput()->setHtml(notes); } void MainWindow::printPlan() { #ifndef NO_PRINTING - QString diveplan = ui.divePlanOutput->toHtml(); + QString diveplan = plannerDetails()->divePlanOutput()->toHtml(); QString withDisclaimer = QString("<img height=50 src=\":subsurface-icon\"> ") + diveplan + QString(disclaimer); QPrinter printer; @@ -473,9 +578,9 @@ void MainWindow::printPlan() if (dialog->exec() != QDialog::Accepted) return; - ui.divePlanOutput->setHtml(withDisclaimer); - ui.divePlanOutput->print(&printer); - ui.divePlanOutput->setHtml(diveplan); + plannerDetails()->divePlanOutput()->setHtml(withDisclaimer); + plannerDetails()->divePlanOutput()->print(&printer); + plannerDetails()->divePlanOutput()->setHtml(diveplan); #endif } @@ -489,31 +594,28 @@ void MainWindow::setupForAddAndPlan(const char *model) // setup the dive cylinders DivePlannerPointsModel::instance()->clear(); DivePlannerPointsModel::instance()->setupCylinders(); + locationInformationWidget()->setLocationId(0); } void MainWindow::on_actionReplanDive_triggered() { - if (!plannerStateClean()) - return; - if (!current_dive || !current_dive->dc.model || strcmp(current_dive->dc.model, "planned dive")) { - qDebug() << "trying to replan a dive that's not a planned dive:" << current_dive->dc.model; + if (!plannerStateClean() || !current_dive || !current_dive->dc.model) return; + else if (strcmp(current_dive->dc.model, "planned dive")) { + if (QMessageBox::warning(this, tr("Warning"), tr("trying to replan a dive that's not a planned dive."), + QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) + return; } // put us in PLAN mode DivePlannerPointsModel::instance()->clear(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN); - ui.newProfile->setPlanState(); - ui.newProfile->clearHandlers(); - ui.infoPane->setCurrentIndex(PLANNERWIDGET); - ui.divePlannerWidget->setReplanButton(true); + graphics()->setPlanState(); + graphics()->clearHandlers(); + setApplicationState("PlanDive"); + divePlannerWidget()->setReplanButton(true); DivePlannerPointsModel::instance()->loadFromDive(current_dive); reset_cylinders(&displayed_dive, true); - ui.diveListPane->setCurrentIndex(1); // switch to the plan output - ui.globePane->setCurrentIndex(1); -#ifdef NO_MARBLE - ui.globePane->show(); -#endif } void MainWindow::on_actionDivePlanner_triggered() @@ -523,22 +625,20 @@ void MainWindow::on_actionDivePlanner_triggered() // put us in PLAN mode DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN); + setApplicationState("PlanDive"); - ui.newProfile->setPlanState(); - ui.infoPane->setCurrentIndex(PLANNERWIDGET); + graphics()->setPlanState(); - // create a simple starting dive, using the first gas from the just copied cylidners + // create a simple starting dive, using the first gas from the just copied cylinders setupForAddAndPlan("planned dive"); // don't translate, stored in XML file DivePlannerPointsModel::instance()->setupStartTime(); DivePlannerPointsModel::instance()->createSimpleDive(); DivePictureModel::instance()->updateDivePictures(); - ui.divePlannerWidget->setReplanButton(false); + divePlannerWidget()->setReplanButton(false); +} - ui.diveListPane->setCurrentIndex(1); // switch to the plan output - ui.globePane->setCurrentIndex(1); -#ifdef NO_MARBLE - ui.globePane->show(); -#endif +DivePlannerWidget* MainWindow::divePlannerWidget() { + return qobject_cast<DivePlannerWidget*>(applicationState["PlanDive"].topLeft); } void MainWindow::on_actionAddDive_triggered() @@ -551,23 +651,45 @@ void MainWindow::on_actionAddDive_triggered() dive_list()->clearSelection(); } + setApplicationState("AddDive"); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); // setup things so we can later create our starting dive setupForAddAndPlan("manually added dive"); // don't translate, stored in the XML file // now show the mostly empty main tab - ui.InfoWidget->updateDiveInfo(); + information()->updateDiveInfo(); // show main tab - ui.InfoWidget->setCurrentIndex(0); + information()->setCurrentIndex(0); - ui.InfoWidget->addDiveStarted(); - ui.infoPane->setCurrentIndex(MAINTAB); + information()->addDiveStarted(); - ui.newProfile->setAddState(); + graphics()->setAddState(); DivePlannerPointsModel::instance()->createSimpleDive(); - ui.newProfile->plotDive(); + graphics()->plotDive(); +} + +void MainWindow::on_actionEditDive_triggered() +{ + if (information()->isEditing() || DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING) { + QMessageBox::warning(this, tr("Warning"), tr("Please, first finish the current edition before trying to do another.")); + return; + } + + const bool isTripEdit = dive_list()->selectedTrips().count() >= 1; + if (!current_dive || isTripEdit || strcmp(current_dive->dc.model, "manually added dive")) { + QMessageBox::warning(this, tr("Warning"), tr("Trying to edit a dive that's not a manually added dive.")); + return; + } + + DivePlannerPointsModel::instance()->clear(); + disableShortcuts(); + DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); + graphics()->setAddState(); + setApplicationState("EditDive"); + DivePlannerPointsModel::instance()->loadFromDive(current_dive); + information()->enableEdition(MainTab::MANUALLY_ADDED_DIVE); } void MainWindow::on_actionRenumber_triggered() @@ -612,16 +734,16 @@ void MainWindow::on_actionYearlyStatistics_triggered() #define TOGGLE_COLLAPSABLE( X ) \ ui.mainSplitter->setCollapsible(0, X); \ ui.mainSplitter->setCollapsible(1, X); \ - ui.infoProfileSplitter->setCollapsible(0, X); \ - ui.infoProfileSplitter->setCollapsible(1, X); \ - ui.listGlobeSplitter->setCollapsible(0, X); \ - ui.listGlobeSplitter->setCollapsible(1, X); + ui.topSplitter->setCollapsible(0, X); \ + ui.topSplitter->setCollapsible(1, X); \ + ui.bottomSplitter->setCollapsible(0, X); \ + ui.bottomSplitter->setCollapsible(1, X); void MainWindow::on_actionViewList_triggered() { TOGGLE_COLLAPSABLE( true ); beginChangeState(LIST_MAXIMIZED); - ui.listGlobeSplitter->setSizes(BEHAVIOR << EXPANDED << COLLAPSED); + ui.topSplitter->setSizes(BEHAVIOR << EXPANDED << COLLAPSED); ui.mainSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); } @@ -629,7 +751,7 @@ void MainWindow::on_actionViewProfile_triggered() { TOGGLE_COLLAPSABLE( true ); beginChangeState(PROFILE_MAXIMIZED); - ui.infoProfileSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); + ui.topSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); ui.mainSplitter->setSizes(BEHAVIOR << EXPANDED << COLLAPSED); } @@ -637,7 +759,7 @@ void MainWindow::on_actionViewInfo_triggered() { TOGGLE_COLLAPSABLE( true ); beginChangeState(INFO_MAXIMIZED); - ui.infoProfileSplitter->setSizes(BEHAVIOR << EXPANDED << COLLAPSED); + ui.topSplitter->setSizes(BEHAVIOR << EXPANDED << COLLAPSED); ui.mainSplitter->setSizes(BEHAVIOR << EXPANDED << COLLAPSED); } @@ -646,7 +768,7 @@ void MainWindow::on_actionViewGlobe_triggered() TOGGLE_COLLAPSABLE( true ); beginChangeState(GLOBE_MAXIMIZED); ui.mainSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); - ui.listGlobeSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); + ui.bottomSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); } #undef BEHAVIOR @@ -677,26 +799,26 @@ void MainWindow::on_actionViewAll_triggered() settings.beginGroup("MainWindow"); if (settings.value("mainSplitter").isValid()) { ui.mainSplitter->restoreState(settings.value("mainSplitter").toByteArray()); - ui.infoProfileSplitter->restoreState(settings.value("infoProfileSplitter").toByteArray()); - ui.listGlobeSplitter->restoreState(settings.value("listGlobeSplitter").toByteArray()); + ui.topSplitter->restoreState(settings.value("topSplitter").toByteArray()); + ui.bottomSplitter->restoreState(settings.value("bottomSplitter").toByteArray()); if (ui.mainSplitter->sizes().first() == 0 || ui.mainSplitter->sizes().last() == 0) ui.mainSplitter->setSizes(mainSizes); - if (ui.infoProfileSplitter->sizes().first() == 0 || ui.infoProfileSplitter->sizes().last() == 0) - ui.infoProfileSplitter->setSizes(infoProfileSizes); - if (ui.listGlobeSplitter->sizes().first() == 0 || ui.listGlobeSplitter->sizes().last() == 0) - ui.listGlobeSplitter->setSizes(listGlobeSizes); + if (ui.topSplitter->sizes().first() == 0 || ui.topSplitter->sizes().last() == 0) + ui.topSplitter->setSizes(infoProfileSizes); + if (ui.bottomSplitter->sizes().first() == 0 || ui.bottomSplitter->sizes().last() == 0) + ui.bottomSplitter->setSizes(listGlobeSizes); } else { ui.mainSplitter->setSizes(mainSizes); - ui.infoProfileSplitter->setSizes(infoProfileSizes); - ui.listGlobeSplitter->setSizes(listGlobeSizes); + ui.topSplitter->setSizes(infoProfileSizes); + ui.bottomSplitter->setSizes(listGlobeSizes); } ui.mainSplitter->setCollapsible(0, false); ui.mainSplitter->setCollapsible(1, false); - ui.infoProfileSplitter->setCollapsible(0, false); - ui.infoProfileSplitter->setCollapsible(1, false); - ui.listGlobeSplitter->setCollapsible(0,false); - ui.listGlobeSplitter->setCollapsible(1,false); + ui.topSplitter->setCollapsible(0, false); + ui.topSplitter->setCollapsible(1, false); + ui.bottomSplitter->setCollapsible(0,false); + ui.bottomSplitter->setCollapsible(1,false); } #undef TOGGLE_COLLAPSABLE @@ -714,24 +836,24 @@ void MainWindow::saveSplitterSizes() QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("mainSplitter", ui.mainSplitter->saveState()); - settings.setValue("infoProfileSplitter", ui.infoProfileSplitter->saveState()); - settings.setValue("listGlobeSplitter", ui.listGlobeSplitter->saveState()); + settings.setValue("topSplitter", ui.topSplitter->saveState()); + settings.setValue("bottomSplitter", ui.bottomSplitter->saveState()); } void MainWindow::on_actionPreviousDC_triggered() { unsigned nrdc = number_of_computers(current_dive); dc_number = (dc_number + nrdc - 1) % nrdc; - ui.newProfile->plotDive(); - ui.InfoWidget->updateDiveInfo(); + graphics()->plotDive(); + information()->updateDiveInfo(); } void MainWindow::on_actionNextDC_triggered() { unsigned nrdc = number_of_computers(current_dive); dc_number = (dc_number + 1) % nrdc; - ui.newProfile->plotDive(); - ui.InfoWidget->updateDiveInfo(); + graphics()->plotDive(); + information()->updateDiveInfo(); } void MainWindow::on_actionFullScreen_triggered(bool checked) @@ -802,6 +924,7 @@ QString MainWindow::filter() f += "UDDF (*.uddf *.UDDF);;"; f += "XML (*.xml *.XML)"; f += "Divesoft (*.dlf *.DLF)"; + f += "Datatrak/WLog Files (*.log *.LOG)"; return f; } @@ -937,7 +1060,7 @@ void MainWindow::checkSurvey(QSettings *s) s->setValue("FirstUse42", value); } // wait a week for production versions, but not at all for non-tagged builds - QString ver(VERSION_STRING); + QString ver(subsurface_version()); int waitTime = 7; QDate firstUse42 = s->value("FirstUse42").toDate(); if (run_survey || (firstUse42.daysTo(QDate().currentDate()) > waitTime && !s->contains("SurveyDone"))) { @@ -965,7 +1088,7 @@ void MainWindow::writeSettings() void MainWindow::closeEvent(QCloseEvent *event) { if (DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || - ui.InfoWidget->isEditing()) { + information()->isEditing()) { on_actionQuit_triggered(); event->ignore(); return; @@ -994,17 +1117,17 @@ void MainWindow::closeEvent(QCloseEvent *event) DiveListView *MainWindow::dive_list() { - return ui.ListWidget; + return qobject_cast<DiveListView*>(applicationState["Default"].bottomLeft); } GlobeGPS *MainWindow::globe() { - return ui.globe; + return qobject_cast<GlobeGPS*>(applicationState["Default"].bottomRight); } MainTab *MainWindow::information() { - return ui.InfoWidget; + return qobject_cast<MainTab*>(applicationState["Default"].topLeft); } void MainWindow::loadRecentFiles(QSettings *s) @@ -1174,20 +1297,31 @@ int MainWindow::file_save_as(void) { QString filename; const char *default_filename = existing_filename; - filename = QFileDialog::getSaveFileName(this, tr("Save file as"), default_filename, - tr("Subsurface XML files (*.ssrf *.xml *.XML)")); + + // create a file dialog that allows us to save to a new file + QFileDialog selection_dialog(this, tr("Save file as"), default_filename, + tr("Subsurface XML files (*.ssrf *.xml *.XML)")); + selection_dialog.setAcceptMode(QFileDialog::AcceptSave); + selection_dialog.setFileMode(QFileDialog::AnyFile); + + /* if the exit/cancel button is pressed return */ + if (!selection_dialog.exec()) + return 0; + + /* get the first selected file */ + filename = selection_dialog.selectedFiles().at(0); if (filename.isNull() || filename.isEmpty()) return report_error("No filename to save into"); - if (ui.InfoWidget->isEditing()) - ui.InfoWidget->acceptChanges(); + if (information()->isEditing()) + information()->acceptChanges(); if (save_dives(filename.toUtf8().data())) { - showError(get_error_string()); + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); return -1; } - showError(get_error_string()); + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); set_filename(filename.toUtf8().data(), true); setTitle(MWTF_FILENAME); mark_divelist_changed(false); @@ -1202,8 +1336,8 @@ int MainWindow::file_save(void) if (!existing_filename) return file_save_as(); - if (ui.InfoWidget->isEditing()) - ui.InfoWidget->acceptChanges(); + if (information()->isEditing()) + information()->acceptChanges(); current_default = prefs.default_filename; if (strcmp(existing_filename, current_default) == 0) { @@ -1214,23 +1348,18 @@ int MainWindow::file_save(void) current_def_dir.mkpath(current_def_dir.absolutePath()); } if (save_dives(existing_filename)) { - showError(get_error_string()); + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); return -1; } - showError(get_error_string()); + getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); mark_divelist_changed(false); addRecentFile(QStringList() << QString(existing_filename)); return 0; } -void MainWindow::showError(QString message) +NotificationWidget *MainWindow::getNotificationWidget() { - if (message.isEmpty()) - return; - ui.mainErrorMessage->setText(message); - ui.mainErrorMessage->setCloseButtonVisible(true); - ui.mainErrorMessage->setMessageType(KMessageWidget::Error); - ui.mainErrorMessage->animatedShow(); + return ui.mainErrorMessage; } void MainWindow::setTitle(enum MainWindowTitleFormat format) @@ -1284,6 +1413,18 @@ void MainWindow::importTxtFiles(const QStringList fileNames) refreshDisplay(); } +void MainWindow::showV2Dialog() +{ + // here we need to ask the user if / how they want to do the reverse geo coding + // for now this is just a warning that things could take a long time + QMessageBox d(QMessageBox::Information, + tr("Welcom to Subsurface %1").arg(subsurface_version()), + tr("Importing data files from earlier versions of Subsurface can take a significant amount of time"), + QMessageBox::Ok, + this); + d.exec(); +} + void MainWindow::loadFiles(const QStringList fileNames) { if (fileNames.isEmpty()) @@ -1301,14 +1442,26 @@ void MainWindow::loadFiles(const QStringList fileNames) set_filename(fileNamePtr.data(), true); setTitle(MWTF_FILENAME); } else { + if (!v2_question_shown && abort_read_of_old_file) { + v2_question_shown = true; + abort_read_of_old_file = false; + showV2Dialog(); + getNotificationWidget()->showNotification(tr("Please Wait, Importing your files..."), KMessageWidget::Information); + i--; // so we re-try this file + continue; + } failedParses.append(fileNames.at(i)); } } - + getNotificationWidget()->hideNotification(); process_dives(false, false); addRecentFile(fileNames); removeRecentFile(failedParses); + // searches for geo lookup information in a thread so it doesn`t + // freezes the ui. + ReverseGeoLoockupThread::instance()->start(); + refreshDisplay(); ui.actionAutoGroup->setChecked(autogroup); } @@ -1316,18 +1469,21 @@ void MainWindow::loadFiles(const QStringList fileNames) void MainWindow::on_actionImportDiveLog_triggered() { QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open dive log file"), lastUsedDir(), - tr("Dive log files (*.ssrf *.can *.csv *.db *.dld *.jlb *.lvd *.sde *.udcf *.uddf *.xml *.txt *.dlf *.apd);;" - "Cochran files (*.can);;" - "CSV files (*.csv);;" - "DiveLog.de files (*.dld);;" - "JDiveLog files (*.jlb);;" - "Liquivision files (*.lvd);;" - "MkVI files (*.txt);;" - "Suunto files (*.sde *.db);;" - "Divesoft files (*.dlf);;" - "UDDF/UDCF files (*.uddf *.udcf);;" - "XML files (*.xml);;" - "APD log viewer (*.apd);;" + tr("Dive log files (*.ssrf *.can *.csv *.db *.dld *.jlb *.lvd *.sde *.udcf *.uddf *.xml *.txt *.dlf *.apd" + "*.SSRF *.CAN *.CSV *.DB *.DLD *.JLB *.LVD *.SDE *.UDCF *.UDDF *.xml *.TXT *.DLF *.APD);;" + "Cochran files (*.can *.CAN);;" + "CSV files (*.csv *.CSV);;" + "DiveLog.de files (*.dld *.DLD);;" + "JDiveLog files (*.jlb *.JLB);;" + "Liquivision files (*.lvd *.LVD);;" + "MkVI files (*.txt *.TXT);;" + "Suunto files (*.sde *.db *.SDE *.DB);;" + "Divesoft files (*.dlf *.DLF);;" + "UDDF/UDCF files (*.uddf *.udcf *.UDDF *.UDCF);;" + "XML files (*.xml *.XML);;" + "APD log viewer (*.apd *.APD);;" + "Datatrak/WLog Files (*.log *.LOG);;" + "OSTCtools Files (*.dive *.DIVE);;" "All files (*)")); if (fileNames.isEmpty()) @@ -1368,20 +1524,16 @@ void MainWindow::editCurrentDive() if (defaultDC == "manually added dive") { disableShortcuts(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); - ui.newProfile->setAddState(); - ui.infoPane->setCurrentIndex(MAINTAB); + graphics()->setAddState(); + setApplicationState("EditDive"); DivePlannerPointsModel::instance()->loadFromDive(d); - ui.InfoWidget->enableEdition(MainTab::MANUALLY_ADDED_DIVE); + information()->enableEdition(MainTab::MANUALLY_ADDED_DIVE); } else if (defaultDC == "planned dive") { disableShortcuts(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN); - //TODO: I BROKE THIS BY COMMENTING THE LINE BELOW - // and I'm sleepy now, so I think I should not try to fix right away. - // we don't setCurrentIndex anymore, we ->setPlanState() or ->setAddState() on the ProfileView. - //ui.stackedWidget->setCurrentIndex(PLANNERPROFILE); // Planner. - ui.infoPane->setCurrentIndex(PLANNERWIDGET); + setApplicationState("EditPlannedDive"); DivePlannerPointsModel::instance()->loadFromDive(d); - ui.InfoWidget->enableEdition(MainTab::MANUALLY_ADDED_DIVE); + information()->enableEdition(MainTab::MANUALLY_ADDED_DIVE); } } @@ -1456,7 +1608,7 @@ void MainWindow::on_paste_triggered() { // take the data in our copyPasteDive and apply it to selected dives selective_copy_dive(©PasteDive, &displayed_dive, what, false); - ui.InfoWidget->showAndTriggerEditSelective(what); + information()->showAndTriggerEditSelective(what); } void MainWindow::on_actionFilterTags_triggered() @@ -1466,3 +1618,43 @@ void MainWindow::on_actionFilterTags_triggered() else ui.multiFilter->setVisible(true); } + +void MainWindow::registerApplicationState(const QByteArray& state, QWidget *topLeft, QWidget *topRight, QWidget *bottomLeft, QWidget *bottomRight) +{ + applicationState[state] = WidgetForQuadrant(topLeft, topRight, bottomLeft, bottomRight); + if (ui.topLeft->indexOf(topLeft) == -1 && topLeft) { + ui.topLeft->addWidget(topLeft); + } + if (ui.topRight->indexOf(topRight) == -1 && topRight) { + ui.topRight->addWidget(topRight); + } + if (ui.bottomLeft->indexOf(bottomLeft) == -1 && bottomLeft) { + ui.bottomLeft->addWidget(bottomLeft); + } + if(ui.bottomRight->indexOf(bottomRight) == -1 && bottomRight) { + ui.bottomRight->addWidget(bottomRight); + } +} + +void MainWindow::setApplicationState(const QByteArray& state) { + if (!applicationState.keys().contains(state)) + return; + + if (currentApplicationState == state) + return; + + currentApplicationState = state; +#define SET_CURRENT_INDEX( X ) \ + if (applicationState[state].X) { \ + ui.X->setCurrentWidget( applicationState[state].X); \ + ui.X->show(); \ + } else { \ + ui.X->hide(); \ + } + + SET_CURRENT_INDEX( topLeft ) + SET_CURRENT_INDEX( topRight ) + SET_CURRENT_INDEX( bottomLeft ) + SET_CURRENT_INDEX( bottomRight ) +#undef SET_CURRENT_INDEX +} diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index 2364caadc..f963330cc 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -10,8 +10,10 @@ #include <QMainWindow> #include <QAction> #include <QUrl> +#include <QUuid> #include "ui_mainwindow.h" +#include "notificationwidget.h" struct DiveList; class QSortFilterProxyModel; @@ -30,6 +32,12 @@ class QWebView; class QSettings; class UpdateManager; class UserManual; +class DivePlannerWidget; +class ProfileWidget2; +class PlannerDetails; +class PlannerSettingsWidget; +class QUndoStack; +class LocationInformationWidget; enum MainWindowTitleFormat { MWTF_DEFAULT, @@ -43,10 +51,7 @@ public: COLLAPSED, EXPANDED }; - enum InfoWidgetIndexes { - MAINTAB, - PLANNERWIDGET - }; + enum CurrentState { VIEWALL, GLOBE_MAXIMIZED, @@ -64,7 +69,9 @@ public: void removeRecentFile(QStringList failedFiles); DiveListView *dive_list(); GlobeGPS *globe(); - void showError(QString message); + DivePlannerWidget *divePlannerWidget(); + PlannerSettingsWidget *divePlannerSettingsWidget(); + LocationInformationWidget *locationInformationWidget(); void setTitle(enum MainWindowTitleFormat format); // Some shortcuts like "change DC" or "copy/paste dive components" @@ -77,11 +84,16 @@ public: void cleanUpEmpty(); void setToolButtonsEnabled(bool enabled); ProfileWidget2 *graphics() const; + PlannerDetails *plannerDetails() const; void setLoadedWithFiles(bool filesFromCommandLine); bool filesFromCommandLine() const; void setPlanNotes(const char *notes); void printPlan(); void checkSurvey(QSettings *s); + void setApplicationState(const QByteArray& state); + void showV2Dialog(); + QUndoStack *undoStack; + NotificationWidget *getNotificationWidget(); private slots: /* file menu action */ @@ -94,6 +106,7 @@ slots: void on_actionPrint_triggered(); void on_actionPreferences_triggered(); void on_actionQuit_triggered(); + void on_actionHash_images_triggered(); /* log menu actions */ void on_actionDownloadDC_triggered(); @@ -101,6 +114,7 @@ slots: void on_actionDivelogs_de_triggered(); void on_actionEditDeviceNames_triggered(); void on_actionAddDive_triggered(); + void on_actionEditDive_triggered(); void on_actionRenumber_triggered(); void on_actionAutoGroup_triggered(); void on_actionYearlyStatistics_triggered(); @@ -151,6 +165,8 @@ slots: void on_paste_triggered(); void on_actionFilterTags_triggered(); void on_actionConfigure_Dive_Computer_triggered(); + void enableDiveSiteEdit(uint32_t id); + void setDefaultState(); protected: void closeEvent(QCloseEvent *); @@ -185,6 +201,7 @@ private: void saveSplitterSizes(); QString lastUsedDir(); void updateLastUsedDir(const QString &s); + void registerApplicationState(const QByteArray& state, QWidget *topLeft, QWidget *topRight, QWidget *bottomLeft, QWidget *bottomRight); bool filesAsArguments; UpdateManager *updateManager; @@ -194,6 +211,17 @@ private: struct dive copyPasteDive; struct dive_components what; QList<QAction *> profileToolbarActions; + + struct WidgetForQuadrant { + WidgetForQuadrant(QWidget *tl = 0, QWidget *tr = 0, QWidget *bl = 0, QWidget *br = 0) : + topLeft(tl), topRight(tr), bottomLeft(bl), bottomRight(br) {} + QWidget *topLeft; + QWidget *topRight; + QWidget *bottomLeft; + QWidget *bottomRight; + }; + QHash<QByteArray, WidgetForQuadrant> applicationState; + QByteArray currentApplicationState; }; #endif // MAINWINDOW_H diff --git a/qt-ui/mainwindow.ui b/qt-ui/mainwindow.ui index 8ffb8bbd8..8e98bed6c 100644 --- a/qt-ui/mainwindow.ui +++ b/qt-ui/mainwindow.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>1682</width> - <height>1151</height> + <width>861</width> + <height>800</height> </rect> </property> <widget class="QWidget" name="centralwidget"> @@ -23,169 +23,24 @@ <property name="orientation"> <enum>Qt::Vertical</enum> </property> - <widget class="QSplitter" name="infoProfileSplitter"> + <widget class="QSplitter" name="topSplitter"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <widget class="QStackedWidget" name="infoPane"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="page"> - <layout class="QHBoxLayout" name="mainTabOuterLayout"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="MainTab" name="InfoWidget" native="true"/> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_2"> - <property name="enabled"> - <bool>true</bool> - </property> - <layout class="QHBoxLayout" name="divePlannerLayout"> - <item> - <widget class="DivePlannerWidget" name="divePlannerWidget" native="true"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - </widget> - <widget class="QWidget" name="ProfileWidget"> - <layout class="QGridLayout" name="profileInnerLayout"> - <item row="0" column="0" rowspan="3"> - <widget class="ProfileWidget2" name="newProfile"/> - </item> - </layout> - </widget> + <widget class="QStackedWidget" name="topLeft"/> + <widget class="QStackedWidget" name="topRight"/> </widget> - <widget class="QSplitter" name="listGlobeSplitter"> + <widget class="QSplitter" name="bottomSplitter"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <widget class="QStackedWidget" name="diveListPane"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="page_3"> - <layout class="QVBoxLayout" name="diveListLayout"> - <item> - <widget class="DiveListView" name="ListWidget"> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="PlannerSettingsWidget" name="plannerSettingsWidget"/> - </widget> - <widget class="QStackedWidget" name="globePane"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="stackedWidgetPage1"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <layout class="QVBoxLayout" name="globeLayout"> - <item> - <widget class="GlobeGPS" name="globe" native="true"/> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_5"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <layout class="QHBoxLayout" name="divePlanLayout"> - <item> - <widget class="QLabel" name="divePlanOutputLabel"> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>20</height> - </size> - </property> - <property name="text"> - <string><html><head/><body><p><span style=" font-weight:600;">Dive plan details</span></p></body></html></string> - </property> - <property name="textFormat"> - <enum>Qt::RichText</enum> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="printPlan"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Print</string> - </property> - <property name="autoDefault"> - <bool>false</bool> - </property> - <property name="default"> - <bool>false</bool> - </property> - <property name="flat"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QTextEdit" name="divePlanOutput"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="styleSheet"> - <string notr="true">font: 13pt "Courier";</string> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - <property name="html"> - <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Courier'; font-size:13pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'.Curier New';"><br /></p></body></html></string> - </property> - </widget> - </item> - </layout> - </widget> - </widget> + <widget class="QStackedWidget" name="bottomLeft"/> + <widget class="QStackedWidget" name="bottomRight"/> </widget> </widget> </item> <item> - <widget class="KMessageWidget" name="mainErrorMessage" native="true"/> + <widget class="NotificationWidget" name="mainErrorMessage" native="true"/> </item> </layout> </widget> @@ -194,8 +49,8 @@ p, li { white-space: pre-wrap; } <rect> <x>0</x> <y>0</y> - <width>1682</width> - <height>27</height> + <width>861</width> + <height>22</height> </rect> </property> <widget class="QMenu" name="menuFile"> @@ -212,6 +67,7 @@ p, li { white-space: pre-wrap; } <addaction name="actionPrint"/> <addaction name="actionPreferences"/> <addaction name="separator"/> + <addaction name="actionHash_images"/> <addaction name="actionConfigure_Dive_Computer"/> <addaction name="separator"/> <addaction name="actionRecent1"/> @@ -226,6 +82,7 @@ p, li { white-space: pre-wrap; } <string>&Log</string> </property> <addaction name="actionAddDive"/> + <addaction name="actionEditDive"/> <addaction name="actionDivePlanner"/> <addaction name="actionReplanDive"/> <addaction name="copy"/> @@ -271,7 +128,13 @@ p, li { white-space: pre-wrap; } <addaction name="actionDownloadWeb"/> <addaction name="actionDivelogs_de"/> </widget> + <widget class="QMenu" name="menu_Edit"> + <property name="title"> + <string>&Edit</string> + </property> + </widget> <addaction name="menuFile"/> + <addaction name="menu_Edit"/> <addaction name="menuImport"/> <addaction name="menuLog"/> <addaction name="menuView"/> @@ -391,6 +254,11 @@ p, li { white-space: pre-wrap; } <string>Ctrl++</string> </property> </action> + <action name="actionEditDive"> + <property name="text"> + <string>&Edit dive</string> + </property> + </action> <action name="copy"> <property name="text"> <string>&Copy dive components</string> @@ -590,7 +458,7 @@ p, li { white-space: pre-wrap; } </action> <action name="actionReplanDive"> <property name="text"> - <string>Re-plan &dive</string> + <string>Edit &dive in planner</string> </property> </action> <action name="profPO2"> @@ -813,46 +681,33 @@ p, li { white-space: pre-wrap; } <string>User &survey</string> </property> </action> + <action name="action_Undo"> + <property name="text"> + <string>&Undo</string> + </property> + <property name="shortcut"> + <string>Ctrl+Z</string> + </property> + </action> + <action name="action_Redo"> + <property name="text"> + <string>&Redo</string> + </property> + <property name="shortcut"> + <string>Ctrl+Shift+Z</string> + </property> + </action> + <action name="actionHash_images"> + <property name="text"> + <string>Find moved images</string> + </property> + </action> </widget> <customwidgets> <customwidget> - <class>KMessageWidget</class> - <extends>QWidget</extends> - <header>kmessagewidget.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>MainTab</class> - <extends>QWidget</extends> - <header>qt-ui/maintab.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>DiveListView</class> - <extends>QTreeView</extends> - <header>divelistview.h</header> - </customwidget> - <customwidget> - <class>GlobeGPS</class> - <extends>QWidget</extends> - <header>globe.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>DivePlannerWidget</class> - <extends>QWidget</extends> - <header>diveplanner.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ProfileWidget2</class> - <extends>QGraphicsView</extends> - <header>qt-ui/profile/profilewidget2.h</header> - </customwidget> - <customwidget> - <class>PlannerSettingsWidget</class> + <class>NotificationWidget</class> <extends>QWidget</extends> - <header>diveplanner.h</header> + <header>notificationwidget.h</header> <container>1</container> </customwidget> <customwidget> diff --git a/qt-ui/modeldelegates.cpp b/qt-ui/modeldelegates.cpp index ee7dc6cf5..66533b652 100644 --- a/qt-ui/modeldelegates.cpp +++ b/qt-ui/modeldelegates.cpp @@ -2,8 +2,13 @@ #include "dive.h" #include "gettextfromc.h" #include "mainwindow.h" +#include "models.h" +#include "starwidget.h" +#include "profile/profilewidget2.h" #include <QCompleter> +#include <QKeyEvent> +#include <QTextDocument> QSize DiveListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { @@ -247,7 +252,7 @@ TankInfoDelegate::TankInfoDelegate(QObject *parent) : ComboBoxDelegate(TankInfoM void TankInfoDelegate::reenableReplot(QWidget *widget, QAbstractItemDelegate::EndEditHint hint) { MainWindow::instance()->graphics()->setReplot(true); - // FIXME: We need to replot after a cylidner is selected but the replot below overwrites + // FIXME: We need to replot after a cylinder is selected but the replot below overwrites // the newly selected cylinder. // MainWindow::instance()->graphics()->replot(); } diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index fec7d02ed..69a276bfb 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -14,6 +14,7 @@ #include "qthelper.h" #include "gettextfromc.h" #include "display.h" +#include "color.h" #include <QCoreApplication> #include <QDebug> @@ -387,6 +388,7 @@ Qt::ItemFlags CylindersModel::flags(const QModelIndex &index) const void CylindersModel::remove(const QModelIndex &index) { + int mapping[MAX_CYLINDERS]; if (index.column() != REMOVE) { return; } @@ -394,6 +396,7 @@ void CylindersModel::remove(const QModelIndex &index) cylinder_t *cyl = &displayed_dive.cylinder[index.row()]; struct gasmix *mygas = &cyl->gasmix; for (int i = 0; i < MAX_CYLINDERS; i++) { + mapping[i] = i; if (i == index.row() || cylinder_none(&displayed_dive.cylinder[i])) continue; struct gasmix *gas2 = &displayed_dive.cylinder[i].gasmix; @@ -404,7 +407,7 @@ void CylindersModel::remove(const QModelIndex &index) ((DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING && DivePlannerPointsModel::instance()->tankInUse(cyl->gasmix)) || (DivePlannerPointsModel::instance()->currentMode() == DivePlannerPointsModel::NOTHING && - (cyl->manually_added || is_cylinder_used(&displayed_dive, index.row()))))) { + is_cylinder_used(&displayed_dive, index.row())))) { QMessageBox::warning(MainWindow::instance(), TITLE_OR_TEXT( tr("Cylinder cannot be removed"), tr("This gas is in use. Only cylinders that are not used in the dive can be removed.")), @@ -418,11 +421,24 @@ void CylindersModel::remove(const QModelIndex &index) // as first gas memmove(cyl, &displayed_dive.cylinder[same_gas], sizeof(*cyl)); remove_cylinder(&displayed_dive, same_gas); + mapping[same_gas] = 0; + for (int i = same_gas + 1; i < MAX_CYLINDERS; i++) + mapping[i] = i - 1; } else { remove_cylinder(&displayed_dive, index.row()); + if (same_gas > index.row()) + same_gas--; + mapping[index.row()] = same_gas; + for (int i = index.row() + 1; i < MAX_CYLINDERS; i++) + mapping[i] = i - 1; } changed = true; endRemoveRows(); + struct divecomputer *dc = &displayed_dive.dc; + while (dc) { + dc_cylinder_renumber(&displayed_dive, dc, mapping); + dc = dc->next; + } } WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent), @@ -1191,7 +1207,7 @@ QVariant DiveItem::data(int column, int role) const retVal = dive->maxcns; break; case LOCATION: - retVal = QString(dive->location); + retVal = QString(get_dive_location(dive)); break; } break; @@ -1232,7 +1248,7 @@ QVariant DiveItem::data(int column, int role) const retVal = dive->maxcns; break; case LOCATION: - retVal = QString(dive->location); + retVal = QString(get_dive_location(dive)); break; case GAS: const char *gas_string = get_dive_gas_string(dive); @@ -1356,15 +1372,19 @@ QString DiveItem::displayDepthWithUnit() const QString DiveItem::displayDuration() const { - int hrs, mins; + int hrs, mins, fullmins, secs; struct dive *dive = get_dive_by_uniq_id(diveId); mins = (dive->duration.seconds + 59) / 60; + fullmins = dive->duration.seconds / 60; + secs = dive->duration.seconds - 60 * fullmins; hrs = mins / 60; mins -= hrs * 60; QString displayTime; if (hrs) displayTime = QString("%1:%2").arg(hrs).arg(mins, 2, 10, QChar('0')); + else if (mins < 15 || dive->dc.divemode == FREEDIVE) + displayTime = QString("%1m%2s").arg(fullmins).arg(secs, 2, 10, QChar('0')); else displayTime = QString("%1").arg(mins); return displayTime; @@ -2110,7 +2130,7 @@ QVariant ProfilePrintModel::data(const QModelIndex &index, int role) const } if (row == 1) { if (col == 0) - return QString(dive->location); + return QString(get_dive_location(dive)); if (col == 3) return QString(tr("Duration: %1 min")).arg(di.displayDuration()); } diff --git a/qt-ui/notificationwidget.cpp b/qt-ui/notificationwidget.cpp new file mode 100644 index 000000000..44e2eed1b --- /dev/null +++ b/qt-ui/notificationwidget.cpp @@ -0,0 +1,37 @@ +#include "notificationwidget.h" + +NotificationWidget::NotificationWidget(QWidget *parent) : KMessageWidget(parent) +{ + future_watcher = new QFutureWatcher<void>(); + connect(future_watcher, SIGNAL(finished()), this, SLOT(finish())); +} + +void NotificationWidget::showNotification(QString message, KMessageWidget::MessageType type) +{ + if (message.isEmpty()) + return; + setText(message); + setCloseButtonVisible(true); + setMessageType(type); + animatedShow(); +} + +void NotificationWidget::hideNotification() +{ + animatedHide(); +} + +void NotificationWidget::setFuture(const QFuture<void> &future) +{ + future_watcher->setFuture(future); +} + +void NotificationWidget::finish() +{ + hideNotification(); +} + +NotificationWidget::~NotificationWidget() +{ + delete future_watcher; +} diff --git a/qt-ui/notificationwidget.h b/qt-ui/notificationwidget.h new file mode 100644 index 000000000..7a3f93b4d --- /dev/null +++ b/qt-ui/notificationwidget.h @@ -0,0 +1,31 @@ +#ifndef NOTIFICATIONWIDGET_H +#define NOTIFICATIONWIDGET_H + +#include <QWidget> +#include <QFutureWatcher> + +#include <kmessagewidget.h> + +namespace Ui { + class NotificationWidget; +} + +class NotificationWidget : public KMessageWidget { + Q_OBJECT + +public: + explicit NotificationWidget(QWidget *parent = 0); + void setFuture(const QFuture<void> &future); + void showNotification(QString message, KMessageWidget::MessageType type); + void hideNotification(); + ~NotificationWidget(); + +private: + QFutureWatcher<void> *future_watcher; + +private +slots: + void finish(); +}; + +#endif // NOTIFICATIONWIDGET_H diff --git a/qt-ui/plannerDetails.ui b/qt-ui/plannerDetails.ui new file mode 100644 index 000000000..349ec536a --- /dev/null +++ b/qt-ui/plannerDetails.ui @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>plannerDetails</class> + <widget class="QWidget" name="plannerDetails"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="divePlanOutputLabel"> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>20</height> + </size> + </property> + <property name="text"> + <string><html><head/><body><p><span style=" font-weight:600;">Dive plan details</span></p></body></html></string> + </property> + <property name="textFormat"> + <enum>Qt::RichText</enum> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="printPlan"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Print</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="default"> + <bool>false</bool> + </property> + <property name="flat"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTextEdit" name="divePlanOutput"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="styleSheet"> + <string notr="true">font: 13pt "Courier";</string> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="html"> + <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Courier'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'.Curier New';"><br /></p></body></html></string> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/qt-ui/plannerSettings.ui b/qt-ui/plannerSettings.ui index af03fd1fb..02d829c42 100644 --- a/qt-ui/plannerSettings.ui +++ b/qt-ui/plannerSettings.ui @@ -262,8 +262,22 @@ <property name="spacing"> <number>2</number> </property> - <item row="0" column="2"> - <widget class="QSpinBox" name="gflow"> + <item row="6" column="1"> + <widget class="QLabel" name="label_16"> + <property name="text"> + <string>GF high</string> + </property> + </widget> + </item> + <item row="9" column="1" colspan="2"> + <widget class="QCheckBox" name="backgasBreaks"> + <property name="text"> + <string>Plan backgas breaks</string> + </property> + </widget> + </item> + <item row="6" column="2"> + <widget class="QSpinBox" name="gfhigh"> <property name="suffix"> <string>%</string> </property> @@ -275,28 +289,44 @@ </property> </widget> </item> - <item row="0" column="1"> - <widget class="QLabel" name="label_15"> + <item row="8" column="1" colspan="2"> + <widget class="QCheckBox" name="lastStop"> <property name="text"> - <string>GF low</string> + <string>Last stop at 6m</string> </property> </widget> </item> - <item row="1" column="1"> - <widget class="QLabel" name="label_16"> - <property name="text"> - <string>GF high</string> + <item row="10" column="1"> + <widget class="QComboBox" name="rebreathermode"> + <property name="currentText"> + <string/> + </property> + <property name="maxVisibleItems"> + <number>6</number> </property> </widget> </item> - <item row="4" column="1" colspan="2"> - <widget class="QCheckBox" name="backgasBreaks"> + <item row="5" column="2"> + <widget class="QSpinBox" name="gflow"> + <property name="suffix"> + <string>%</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>150</number> + </property> + </widget> + </item> + <item row="7" column="1" colspan="2"> + <widget class="QCheckBox" name="drop_stone_mode"> <property name="text"> - <string>Plan backgas breaks</string> + <string>Drop to first depth</string> </property> </widget> </item> - <item row="6" column="1"> + <item row="11" column="1"> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -309,40 +339,53 @@ </property> </spacer> </item> - <item row="3" column="1" colspan="2"> - <widget class="QCheckBox" name="lastStop"> + <item row="5" column="1"> + <widget class="QLabel" name="label_15"> <property name="text"> - <string>Last stop at 6m</string> + <string>GF low</string> </property> </widget> </item> - <item row="1" column="2"> - <widget class="QSpinBox" name="gfhigh"> - <property name="suffix"> - <string>%</string> + <item row="0" column="1"> + <widget class="QCheckBox" name="recreational_mode"> + <property name="text"> + <string>Recreational mode</string> </property> - <property name="minimum"> - <number>1</number> + </widget> + </item> + <item row="1" column="1"> + <widget class="QCheckBox" name="safetystop"> + <property name="text"> + <string>Safety stop</string> </property> - <property name="maximum"> - <number>150</number> + <property name="tristate"> + <bool>false</bool> </property> </widget> </item> - <item row="2" column="1" colspan="2"> - <widget class="QCheckBox" name="drop_stone_mode"> + <item row="2" column="1"> + <widget class="QLabel" name="label_3"> <property name="text"> - <string>Drop to first depth</string> + <string>Reserve gas</string> </property> </widget> </item> - <item row="5" column="1"> - <widget class="QComboBox" name="rebreathermode"> - <property name="currentText"> + <item row="2" column="2"> + <widget class="QSpinBox" name="reserve_gas"> + <property name="suffix"> + <string>bar</string> + </property> + <property name="prefix"> <string/> </property> - <property name="maxVisibleItems"> - <number>6</number> + <property name="minimum"> + <number>10</number> + </property> + <property name="maximum"> + <number>99</number> + </property> + <property name="value"> + <number>40</number> </property> </widget> </item> @@ -475,7 +518,7 @@ <item> <widget class="QGroupBox" name="groupBox_6"> <property name="title"> - <string>Dive notes</string> + <string>Notes</string> </property> <layout class="QGridLayout" name="gridLayout_6"> <property name="leftMargin"> @@ -501,9 +544,6 @@ <property name="text"> <string>Display runtime</string> </property> - <property name="checked"> - <bool>true</bool> - </property> </widget> </item> <item row="1" column="0"> @@ -517,9 +557,6 @@ <property name="text"> <string>Display segment duration</string> </property> - <property name="checked"> - <bool>false</bool> - </property> </widget> </item> <item row="2" column="0"> diff --git a/qt-ui/preferences.cpp b/qt-ui/preferences.cpp index ab241f358..aeccc961c 100644 --- a/qt-ui/preferences.cpp +++ b/qt-ui/preferences.cpp @@ -1,5 +1,7 @@ #include "preferences.h" #include "mainwindow.h" +#include "models.h" + #include <QSettings> #include <QFileDialog> #include <QMessageBox> @@ -144,6 +146,8 @@ void PreferencesDialog::setUiFromPrefs() ui.imperial->setChecked(true); else ui.personalize->setChecked(true); + ui.gpsTraditional->setChecked(prefs.coordinates_traditional); + ui.gpsDecimal->setChecked(!prefs.coordinates_traditional); ui.celsius->setChecked(prefs.units.temperature == units::CELSIUS); ui.fahrenheit->setChecked(prefs.units.temperature == units::FAHRENHEIT); @@ -304,6 +308,7 @@ void PreferencesDialog::syncSettings() s.setValue("volume", ui.cuft->isChecked() ? units::CUFT : units::LITER); s.setValue("weight", ui.lbs->isChecked() ? units::LBS : units::KG); s.setValue("vertical_speed_time", ui.vertical_speed_minutes->isChecked() ? units::MINUTES : units::SECONDS); + s.setValue("coordinates", ui.gpsTraditional->isChecked()); s.endGroup(); // Defaults @@ -382,6 +387,7 @@ void PreferencesDialog::loadSettings() GET_UNIT("weight", weight, units::LBS, units::KG); } GET_UNIT("vertical_speed_time", vertical_speed_time, units::MINUTES, units::SECONDS); + GET_BOOL("coordinates", coordinates_traditional); s.endGroup(); s.beginGroup("TecDetails"); GET_BOOL("po2graph", pp_graphs.po2); diff --git a/qt-ui/preferences.ui b/qt-ui/preferences.ui index e67925f56..84c90d7ff 100644 --- a/qt-ui/preferences.ui +++ b/qt-ui/preferences.ui @@ -22,127 +22,6 @@ <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QListWidget" name="listWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>80</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>80</width> - <height>16777215</height> - </size> - </property> - <property name="iconSize"> - <size> - <width>40</width> - <height>40</height> - </size> - </property> - <property name="textElideMode"> - <enum>Qt::ElideNone</enum> - </property> - <property name="movement"> - <enum>QListView::Static</enum> - </property> - <property name="isWrapping" stdset="0"> - <bool>true</bool> - </property> - <property name="layoutMode"> - <enum>QListView::Batched</enum> - </property> - <property name="spacing"> - <number>0</number> - </property> - <property name="gridSize"> - <size> - <width>70</width> - <height>60</height> - </size> - </property> - <property name="viewMode"> - <enum>QListView::IconMode</enum> - </property> - <property name="uniformItemSizes"> - <bool>false</bool> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - <property name="currentRow"> - <number>-1</number> - </property> - <item> - <property name="text"> - <string>Defaults</string> - </property> - <property name="icon"> - <iconset> - <normalon>:/subsurface-icon</normalon> - </iconset> - </property> - </item> - <item> - <property name="text"> - <string>Units</string> - </property> - <property name="icon"> - <iconset> - <normalon>:/units</normalon> - </iconset> - </property> - </item> - <item> - <property name="text"> - <string>Graph</string> - </property> - <property name="icon"> - <iconset> - <normalon>:/graph</normalon> - </iconset> - </property> - </item> - <item> - <property name="text"> - <string>Language</string> - </property> - <property name="icon"> - <iconset> - <normalon>:/advanced</normalon> - </iconset> - </property> - </item> - <item> - <property name="text"> - <string>Network</string> - </property> - <property name="icon"> - <iconset> - <normalon>:/network</normalon> - </iconset> - </property> - </item> - <item> - <property name="text"> - <string>Facebook</string> - </property> - <property name="icon"> - <iconset> - <normalon>:/facebook</normalon> - </iconset> - </property> - </item> - </widget> - </item> - <item> <widget class="QStackedWidget" name="stackedWidget"> <property name="sizePolicy"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> @@ -585,6 +464,42 @@ </layout> </item> <item> + <widget class="QGroupBox" name="groupBox_11"> + <property name="title"> + <string>GPS coordinates</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_12"> + <item> + <widget class="QLabel" name="label_27"> + <property name="text"> + <string>Location Display</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="gpsTraditional"> + <property name="text"> + <string>traditional (dms)</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">buttonGroup_7</string> + </attribute> + </widget> + </item> + <item> + <widget class="QRadioButton" name="gpsDecimal"> + <property name="text"> + <string>decimal</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">buttonGroup_7</string> + </attribute> + </widget> + </item> + </layout> + </widget> + </item> + <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -1077,6 +992,127 @@ </widget> </widget> </item> + <item> + <widget class="QListWidget" name="listWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>80</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>80</width> + <height>16777215</height> + </size> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>40</height> + </size> + </property> + <property name="textElideMode"> + <enum>Qt::ElideNone</enum> + </property> + <property name="movement"> + <enum>QListView::Static</enum> + </property> + <property name="isWrapping" stdset="0"> + <bool>true</bool> + </property> + <property name="layoutMode"> + <enum>QListView::Batched</enum> + </property> + <property name="spacing"> + <number>0</number> + </property> + <property name="gridSize"> + <size> + <width>70</width> + <height>60</height> + </size> + </property> + <property name="viewMode"> + <enum>QListView::IconMode</enum> + </property> + <property name="uniformItemSizes"> + <bool>false</bool> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="currentRow"> + <number>-1</number> + </property> + <item> + <property name="text"> + <string>Defaults</string> + </property> + <property name="icon"> + <iconset> + <normalon>:/subsurface-icon</normalon> + </iconset> + </property> + </item> + <item> + <property name="text"> + <string>Units</string> + </property> + <property name="icon"> + <iconset> + <normalon>:/units</normalon> + </iconset> + </property> + </item> + <item> + <property name="text"> + <string>Graph</string> + </property> + <property name="icon"> + <iconset> + <normalon>:/graph</normalon> + </iconset> + </property> + </item> + <item> + <property name="text"> + <string>Language</string> + </property> + <property name="icon"> + <iconset> + <normalon>:/advanced</normalon> + </iconset> + </property> + </item> + <item> + <property name="text"> + <string>Network</string> + </property> + <property name="icon"> + <iconset> + <normalon>:/network</normalon> + </iconset> + </property> + </item> + <item> + <property name="text"> + <string>Facebook</string> + </property> + <property name="icon"> + <iconset> + <normalon>:/facebook</normalon> + </iconset> + </property> + </item> + </widget> + </item> </layout> </item> <item> @@ -1431,12 +1467,13 @@ </connection> </connections> <buttongroups> - <buttongroup name="buttonGroup"/> + <buttongroup name="verticalSpeed"/> <buttongroup name="buttonGroup_2"/> <buttongroup name="buttonGroup_3"/> <buttongroup name="buttonGroup_4"/> <buttongroup name="buttonGroup_5"/> + <buttongroup name="buttonGroup"/> <buttongroup name="buttonGroup_6"/> - <buttongroup name="verticalSpeed"/> + <buttongroup name="buttonGroup_7"/> </buttongroups> </ui> diff --git a/qt-ui/printlayout.cpp b/qt-ui/printlayout.cpp index 6b88f0d29..4be5fef73 100644 --- a/qt-ui/printlayout.cpp +++ b/qt-ui/printlayout.cpp @@ -3,11 +3,14 @@ #include <QPicture> #include <QMessageBox> #include <QPointer> +#include <QTableView> #include "mainwindow.h" #include "printdialog.h" #include "printlayout.h" #include "modeldelegates.h" +#include "models.h" +#include "profile/profilewidget2.h" PrintLayout::PrintLayout(PrintDialog *dialogPtr, QPrinter *printerPtr, struct print_options *optionsPtr) { @@ -459,7 +462,7 @@ void PrintLayout::addTablePrintDataRow(TablePrintModel *model, int row, struct d model->setData(model->index(row, 3), di.displayDuration(), Qt::DisplayRole); model->setData(model->index(row, 4), dive->divemaster, Qt::DisplayRole); model->setData(model->index(row, 5), dive->buddy, Qt::DisplayRole); - model->setData(model->index(row, 6), dive->location, Qt::DisplayRole); + model->setData(model->index(row, 6), get_dive_location(dive), Qt::DisplayRole); } void PrintLayout::addTablePrintHeadingRow(TablePrintModel *model, int row) const diff --git a/qt-ui/profile/divecartesianaxis.cpp b/qt-ui/profile/divecartesianaxis.cpp index 467a8b978..41d94a9a0 100644 --- a/qt-ui/profile/divecartesianaxis.cpp +++ b/qt-ui/profile/divecartesianaxis.cpp @@ -5,6 +5,8 @@ #include "diveplotdatamodel.h" #include "animationfunctions.h" #include "mainwindow.h" +#include "divelineitem.h" +#include "profilewidget2.h" static QPen gridPen() { diff --git a/qt-ui/profile/diveeventitem.cpp b/qt-ui/profile/diveeventitem.cpp index 700430007..0d81e7b45 100644 --- a/qt-ui/profile/diveeventitem.cpp +++ b/qt-ui/profile/diveeventitem.cpp @@ -135,7 +135,9 @@ bool DiveEventItem::shouldBeHidden() * Don't bother showing those */ struct sample *first_sample = &get_dive_dc(&displayed_dive, dc_number)->sample[0]; - if (!strcmp(event->name, "gaschange") && first_sample && event->time.seconds == first_sample->time.seconds) + if (!strcmp(event->name, "gaschange") && + (event->time.seconds == 0 || + (first_sample && event->time.seconds == first_sample->time.seconds))) return true; for (int i = 0; i < evn_used; i++) { diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp index 3bc79832e..7d29d28b4 100644 --- a/qt-ui/profile/diveprofileitem.cpp +++ b/qt-ui/profile/diveprofileitem.cpp @@ -9,6 +9,9 @@ #include "helpers.h" #include "libdivecomputer/parser.h" #include "mainwindow.h" +#include "maintab.h" +#include "profile/profilewidget2.h" +#include "diveplanner.h" #include <QSettings> @@ -166,7 +169,7 @@ void DiveProfileItem::modelDataChanged(const QModelIndex &topLeft, const QModelI for (int i = 0; i < dataModel->rowCount(); i++, entry++) { int max = maxCeiling(i); // Don't scream if we violate the ceiling by a few cm - if (entry->depth < max - 100) { + if (entry->depth < max - 100 && entry->sec > 0) { profileColor = QColor(Qt::red); if (!eventAdded) { add_event(&displayed_dive.dc, entry->sec, SAMPLE_EVENT_CEILING, -1, max / 1000, "planned waypoint above ceiling"); @@ -682,8 +685,8 @@ void DiveGasPressureItem::modelDataChanged(const QModelIndex &topLeft, const QMo bool offsets_initialised = false; int o2cyl = -1, dilcyl = -1; - QFlags<Qt::AlignmentFlag> alignVar, align_dil = Qt::AlignBottom, align_o2 = Qt::AlignBottom; - double axisRange = (vAxis->maximum() - vAxis->minimum())/1000; + QFlags<Qt::AlignmentFlag> alignVar= Qt::AlignTop, align_dil = Qt::AlignBottom, align_o2 = Qt::AlignTop; + double axisRange = (vAxis->maximum() - vAxis->minimum())/1000; // Convert axis pressure range to bar double axisLog = log10(log10(axisRange)); for (int i = 0, count = dataModel->rowCount(); i < count; i++) { entry = dataModel->data().entry + i; @@ -691,23 +694,17 @@ void DiveGasPressureItem::modelDataChanged(const QModelIndex &topLeft, const QMo if (displayed_dive.dc.divemode == CCR && displayed_dive.oxygen_cylinder_index >= 0) o2mbar = GET_O2CYLINDER_PRESSURE(entry); - if (o2mbar) { + if (o2mbar) { // If there is an o2mbar value then this is a CCR dive. Then do: // The first time an o2 value is detected, see if the oxygen cyl pressure graph starts above or below the dil graph if (!offsets_initialised) { // Initialise the parameters for placing the text correctly near the graph line: o2cyl = displayed_dive.oxygen_cylinder_index; dilcyl = displayed_dive.diluent_cylinder_index; if ((o2mbar > mbar)) { // If above, write o2 start cyl pressure above graph and diluent pressure below graph: - print_y_offset[o2cyl][0] = -7 * axisLog; // y offset for oxygen gas lable (above) - print_y_offset[o2cyl][1] = -0.5; // y offset for oxygen start pressure value (above) + print_y_offset[o2cyl][0] = -7 * axisLog; // y offset for oxygen gas lable (above); pressure offsets=-0.5, already initialised print_y_offset[dilcyl][0] = 5 * axisLog; // y offset for diluent gas lable (below) - print_y_offset[dilcyl][1] = 0; // y offset for diluent start pressure value (below) - align_dil = Qt::AlignBottom; - align_o2 = Qt::AlignTop; - } else { // ... else write o2 start cyl pressure below graph: - print_y_offset[o2cyl][0] = 5 * axisLog; // o2 lable & pressure below graph, - print_y_offset[o2cyl][1] = 0; - print_y_offset[dilcyl][0] = -7 * axisLog; // and diluent lable above graph. - print_y_offset[dilcyl][1] = -0.5; // and diluent pressure above graph. + } else { // ... else write o2 start cyl pressure below graph: + print_y_offset[o2cyl][0] = 5 * axisLog; // o2 lable & pressure below graph; pressure offsets=-0.5, already initialised + print_y_offset[dilcyl][0] = -7.8 * axisLog; // and diluent lable above graph. align_dil = Qt::AlignTop; align_o2 = Qt::AlignBottom; } @@ -722,9 +719,6 @@ void DiveGasPressureItem::modelDataChanged(const QModelIndex &topLeft, const QMo last_pressure[displayed_dive.oxygen_cylinder_index] = o2mbar; last_time[displayed_dive.oxygen_cylinder_index] = entry->sec; alignVar = align_dil; - } else { - alignVar = Qt::AlignBottom; - align_dil = Qt::AlignTop; } if (!mbar) @@ -733,29 +727,19 @@ void DiveGasPressureItem::modelDataChanged(const QModelIndex &topLeft, const QMo if (cyl != entry->cylinderindex) { // Pressure value near the left hand edge of the profile - other cylinders: cyl = entry->cylinderindex; // For each other cylinder, write the gas lable and pressure if (!seen_cyl[cyl]) { - plotPressureValue(mbar, entry->sec, alignVar, print_y_offset[cyl][0]); - plotGasValue(mbar, entry->sec, displayed_dive.cylinder[cyl].gasmix, align_dil, print_y_offset[cyl][1]); + plotPressureValue(mbar, entry->sec, alignVar, print_y_offset[cyl][1]); + plotGasValue(mbar, entry->sec, displayed_dive.cylinder[cyl].gasmix, align_dil, print_y_offset[cyl][0]); seen_cyl[cyl] = true; } } last_pressure[cyl] = mbar; last_time[cyl] = entry->sec; } - // Now, for the cylinder pressure written near the right edge of the profile: - if ((o2cyl >= 0) && (dilcyl >= 0)) { // At first, skip uninitialised values of o2cyl and dilcyl - if (last_pressure[o2cyl] > last_pressure[dilcyl]) { // If oxygen cyl pressure graph ends above diluent graph: - align_dil = Qt::AlignTop; // initialise to write diluent cyl end pressure underneath the graph - align_o2 = Qt::AlignBottom; - } else { - align_dil = Qt::AlignBottom; // else initialise to write diluent cyl end pressure above the graph - align_o2 = Qt::AlignTop; - } - } for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) { // For each cylinder, on right hand side of profile, write cylinder pressure alignVar = ((o2cyl >= 0) && (cyl == displayed_dive.oxygen_cylinder_index)) ? align_o2 : align_dil; if (last_time[cyl]) { - plotPressureValue(last_pressure[cyl], last_time[cyl], (alignVar | Qt::AlignLeft), print_y_offset[cyl][0]); + plotPressureValue(last_pressure[cyl], last_time[cyl], (alignVar | Qt::AlignLeft), print_y_offset[cyl][1]); } } } @@ -808,12 +792,14 @@ DiveCalculatedCeiling::DiveCalculatedCeiling() : is3mIncrement(false), gradientF gradientFactor->setY(0); gradientFactor->setBrush(getColor(PRESSURE_TEXT)); gradientFactor->setAlignment(Qt::AlignHCenter | Qt::AlignBottom); - connect(MainWindow::instance()->information(), SIGNAL(dateTimeChanged()), this, SLOT(recalc())); settingsChanged(); } void DiveCalculatedCeiling::modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { + if (MainWindow::instance()->information()) + connect(MainWindow::instance()->information(), SIGNAL(dateTimeChanged()), this, SLOT(recalc()), Qt::UniqueConnection); + // We don't have enougth data to calculate things, quit. if (!shouldCalculateStuff(topLeft, bottomRight)) return; diff --git a/qt-ui/profile/divetextitem.cpp b/qt-ui/profile/divetextitem.cpp index 85e046638..4c0137177 100644 --- a/qt-ui/profile/divetextitem.cpp +++ b/qt-ui/profile/divetextitem.cpp @@ -1,5 +1,6 @@ #include "divetextitem.h" #include "mainwindow.h" +#include "profilewidget2.h" DiveTextItem::DiveTextItem(QGraphicsItem *parent) : QGraphicsItemGroup(parent), internalAlignFlags(Qt::AlignHCenter | Qt::AlignVCenter), diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp index f04d16b3f..a426ceef2 100644 --- a/qt-ui/profile/profilewidget2.cpp +++ b/qt-ui/profile/profilewidget2.cpp @@ -10,12 +10,18 @@ #include "ruleritem.h" #include "tankitem.h" #include "pref.h" +#include "divepicturewidget.h" +#include "models.h" +#include "maintab.h" +#include "diveplanner.h" + #include <libdivecomputer/parser.h> #include <QScrollBar> #include <QtCore/qmath.h> #include <QMessageBox> #include <QInputDialog> #include <QDebug> +#include <QWheelEvent> #ifndef QT_NO_DEBUG #include <QTableView> @@ -644,7 +650,7 @@ void ProfileWidget2::plotDive(struct dive *d, bool force) // so if we are calculation TTS / NDL then let's force that off. if (measureDuration.elapsed() > 1000 && prefs.calcndltts) { MainWindow::instance()->turnOffNdlTts(); - MainWindow::instance()->showError(tr("Show NDL / TTS was disabled because of excessive processing time")); + MainWindow::instance()->getNotificationWidget()->showNotification(tr("Show NDL / TTS was disabled because of excessive processing time"), KMessageWidget::Error); } } @@ -727,6 +733,8 @@ void ProfileWidget2::resizeEvent(QResizeEvent *event) void ProfileWidget2::mousePressEvent(QMouseEvent *event) { + if (zoomLevel) + return; QGraphicsView::mousePressEvent(event); if (currentState == PLAN) shouldCalculateMaxTime = false; @@ -734,18 +742,24 @@ void ProfileWidget2::mousePressEvent(QMouseEvent *event) void ProfileWidget2::divePlannerHandlerClicked() { + if (zoomLevel) + return; shouldCalculateMaxDepth = false; replot(); } void ProfileWidget2::divePlannerHandlerReleased() { + if (zoomLevel) + return; shouldCalculateMaxDepth = true; replot(); } void ProfileWidget2::mouseReleaseEvent(QMouseEvent *event) { + if (zoomLevel) + return; QGraphicsView::mouseReleaseEvent(event); if (currentState == PLAN) { shouldCalculateMaxTime = true; @@ -1039,6 +1053,7 @@ void ProfileWidget2::clearHandlers() if (handles.count()) { foreach (DiveHandler *handle, handles) { scene()->removeItem(handle); + delete handle; } handles.clear(); } @@ -1054,6 +1069,7 @@ void ProfileWidget2::setAddState() if (currentState == ADD) return; + clearHandlers(); setProfileState(); mouseFollowerHorizontal->setVisible(true); mouseFollowerVertical->setVisible(true); @@ -1206,6 +1222,10 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event) setpointAction->setData(event->globalPos()); QAction *action = m.addAction(tr("Add bookmark"), this, SLOT(addBookmark())); action->setData(event->globalPos()); + + if (same_string(current_dc->model, "manually added dive")) + QAction *editProfileAction = m.addAction(tr("Edit the profile"), MainWindow::instance(), SLOT(editCurrentDive())); + if (DiveEventItem *item = dynamic_cast<DiveEventItem *>(sceneItem)) { action = new QAction(&m); action->setText(tr("Remove event")); @@ -1375,8 +1395,21 @@ void ProfileWidget2::changeGas() // backup the things on the dataModel, since we will clear that out. struct gasmix gasmix; - int seconds = timeAxis->valueAt(scenePos); + qreal sec_val = timeAxis->valueAt(scenePos); + + // no gas changes before the dive starts + unsigned int seconds = (sec_val < 0.0) ? 0 : (unsigned int)sec_val; + // if there is a gas change at this time stamp, remove it before adding the new one + struct event *gasChangeEvent = current_dc->events; + while ((gasChangeEvent = get_next_event(gasChangeEvent, "gaschange")) != NULL) { + if (gasChangeEvent->time.seconds == seconds) { + remove_event(gasChangeEvent); + gasChangeEvent = current_dc->events; + } else { + gasChangeEvent = gasChangeEvent->next; + } + } validate_gas(gas.toUtf8().constData(), &gasmix); QRegExp rx("\\(\\D*(\\d+)"); int tank; @@ -1504,6 +1537,7 @@ void ProfileWidget2::repositionDiveHandlers() { DivePlannerPointsModel *plannerModel = DivePlannerPointsModel::instance(); // Re-position the user generated dive handlers + struct gasmix mix, lastmix; for (int i = 0; i < plannerModel->rowCount(); i++) { struct divedatapoint datapoint = plannerModel->at(i); if (datapoint.time == 0) // those are the magic entries for tanks @@ -1528,8 +1562,9 @@ void ProfileWidget2::repositionDiveHandlers() QLineF line(p1, p2); QPointF pos = line.pointAt(0.5); gases[i]->setPos(pos); - gases[i]->setVisible(datapoint.entered); - gases[i]->setText(dpGasToStr(plannerModel->at(i))); + gases[i]->setText(dpGasToStr(datapoint)); + gases[i]->setVisible(datapoint.entered && + (i == 0 || gases[i]->text() != gases[i-1]->text())); } } diff --git a/qt-ui/profile/ruleritem.cpp b/qt-ui/profile/ruleritem.cpp index c88a3353d..d5742ef1d 100644 --- a/qt-ui/profile/ruleritem.cpp +++ b/qt-ui/profile/ruleritem.cpp @@ -1,6 +1,8 @@ #include "ruleritem.h" #include "preferences.h" #include "mainwindow.h" +#include "profilewidget2.h" +#include "display.h" #include <qgraphicssceneevent.h> @@ -81,7 +83,11 @@ void RulerItem2::settingsChanged() ProfileWidget2 *profWidget = NULL; if (scene() && scene()->views().count()) profWidget = qobject_cast<ProfileWidget2 *>(scene()->views().first()); - setVisible(profWidget->currentState == ProfileWidget2::PROFILE ? prefs.rulergraph : false); + + if (profWidget && profWidget->currentState == ProfileWidget2::PROFILE) + setVisible(prefs.rulergraph); + else + setVisible(false); } void RulerItem2::recalculate() diff --git a/qt-ui/qtwaitingspinner.cpp b/qt-ui/qtwaitingspinner.cpp new file mode 100644 index 000000000..14e8669b0 --- /dev/null +++ b/qt-ui/qtwaitingspinner.cpp @@ -0,0 +1,288 @@ + +/* Original Work Copyright (c) 2012-2014 Alexander Turkin + Modified 2014 by William Hallatt + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +#include <cmath> +#include <algorithm> + +#include <QPainter> +#include <QTimer> + +#include "qtwaitingspinner.h" + +/*----------------------------------------------------------------------------*/ + +// Defaults +const QColor c_color(Qt::black); +const qreal c_roundness(70.0); +const qreal c_minTrailOpacity(15.0); +const qreal c_trailFadePercentage(70.0); +const int c_lines(12); +const int c_lineLength(10); +const int c_lineWidth(5); +const int c_innerRadius(10); +const int c_revPerSec(1); + +/*----------------------------------------------------------------------------*/ + +QtWaitingSpinner::QtWaitingSpinner(QWidget *parent) + : QWidget(parent), + + // Configurable settings. + m_color(c_color), m_roundness(c_roundness), + m_minTrailOpacity(c_minTrailOpacity), + m_trailFadePercentage(c_trailFadePercentage), m_revPerSec(c_revPerSec), + m_numberOfLines(c_lines), m_lineLength(c_lineLength + c_lineWidth), + m_lineWidth(c_lineWidth), m_innerRadius(c_innerRadius), + + // Other + m_timer(NULL), m_parent(parent), m_centreOnParent(false), + m_currentCounter(0), m_isSpinning(false) { + initialise(); +} + +/*----------------------------------------------------------------------------*/ + +QtWaitingSpinner::QtWaitingSpinner(Qt::WindowModality modality, QWidget *parent, + bool centreOnParent) + : QWidget(parent, Qt::Dialog | Qt::FramelessWindowHint), + + // Configurable settings. + m_color(c_color), m_roundness(c_roundness), + m_minTrailOpacity(c_minTrailOpacity), + m_trailFadePercentage(c_trailFadePercentage), m_revPerSec(c_revPerSec), + m_numberOfLines(c_lines), m_lineLength(c_lineLength + c_lineWidth), + m_lineWidth(c_lineWidth), m_innerRadius(c_innerRadius), + + // Other + m_timer(NULL), m_parent(parent), m_centreOnParent(centreOnParent), + m_currentCounter(0) { + initialise(); + + // We need to set the window modality AFTER we've hidden the + // widget for the first time since changing this property while + // the widget is visible has no effect. + this->setWindowModality(modality); + this->setAttribute(Qt::WA_TranslucentBackground); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::initialise() { + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(rotate())); + updateSize(); + updateTimer(); + this->hide(); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::paintEvent(QPaintEvent * /*ev*/) { + QPainter painter(this); + painter.fillRect(this->rect(), Qt::transparent); + painter.setRenderHint(QPainter::Antialiasing, true); + + if (m_currentCounter >= m_numberOfLines) { + m_currentCounter = 0; + } + painter.setPen(Qt::NoPen); + for (int i = 0; i < m_numberOfLines; ++i) { + painter.save(); + painter.translate(m_innerRadius + m_lineLength, + m_innerRadius + m_lineLength); + qreal rotateAngle = + static_cast<qreal>(360 * i) / static_cast<qreal>(m_numberOfLines); + painter.rotate(rotateAngle); + painter.translate(m_innerRadius, 0); + int distance = + lineCountDistanceFromPrimary(i, m_currentCounter, m_numberOfLines); + QColor color = + currentLineColor(distance, m_numberOfLines, m_trailFadePercentage, + m_minTrailOpacity, m_color); + painter.setBrush(color); + // TODO improve the way rounded rect is painted + painter.drawRoundedRect( + QRect(0, -m_lineWidth / 2, m_lineLength, m_lineWidth), m_roundness, + m_roundness, Qt::RelativeSize); + painter.restore(); + } +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::start() { + updatePosition(); + m_isSpinning = true; + this->show(); + if (!m_timer->isActive()) { + m_timer->start(); + m_currentCounter = 0; + } +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::stop() { + m_isSpinning = false; + this->hide(); + if (m_timer->isActive()) { + m_timer->stop(); + m_currentCounter = 0; + } +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setNumberOfLines(int lines) { + m_numberOfLines = lines; + m_currentCounter = 0; + updateTimer(); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setLineLength(int length) { + m_lineLength = length; + updateSize(); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setLineWidth(int width) { + m_lineWidth = width; + updateSize(); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setInnerRadius(int radius) { + m_innerRadius = radius; + updateSize(); +} + +/*----------------------------------------------------------------------------*/ + +bool QtWaitingSpinner::isSpinning() const { return m_isSpinning; } + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setRoundness(qreal roundness) { + m_roundness = std::max(0.0, std::min(100.0, roundness)); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setColor(QColor color) { m_color = color; } + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setRevolutionsPerSecond(int rps) { + m_revPerSec = rps; + updateTimer(); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setTrailFadePercentage(qreal trail) { + m_trailFadePercentage = trail; +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::setMinimumTrailOpacity(qreal minOpacity) { + m_minTrailOpacity = minOpacity; +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::rotate() { + ++m_currentCounter; + if (m_currentCounter >= m_numberOfLines) { + m_currentCounter = 0; + } + update(); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::updateSize() { + int size = (m_innerRadius + m_lineLength) * 2; + setFixedSize(size, size); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::updateTimer() { + m_timer->setInterval(calculateTimerInterval(m_numberOfLines, m_revPerSec)); +} + +/*----------------------------------------------------------------------------*/ + +void QtWaitingSpinner::updatePosition() { + if (m_parent && m_centreOnParent) { + this->move(m_parent->frameGeometry().topLeft() + m_parent->rect().center() - + this->rect().center()); + } +} + +/*----------------------------------------------------------------------------*/ + +int QtWaitingSpinner::calculateTimerInterval(int lines, int speed) { + return 1000 / (lines * speed); +} + +/*----------------------------------------------------------------------------*/ + +int QtWaitingSpinner::lineCountDistanceFromPrimary(int current, int primary, + int totalNrOfLines) { + int distance = primary - current; + if (distance < 0) { + distance += totalNrOfLines; + } + return distance; +} + +/*----------------------------------------------------------------------------*/ + +QColor QtWaitingSpinner::currentLineColor(int countDistance, int totalNrOfLines, + qreal trailFadePerc, qreal minOpacity, + QColor color) { + if (countDistance == 0) { + return color; + } + const qreal minAlphaF = minOpacity / 100.0; + int distanceThreshold = + static_cast<int>(ceil((totalNrOfLines - 1) * trailFadePerc / 100.0)); + if (countDistance > distanceThreshold) { + color.setAlphaF(minAlphaF); + } else { + qreal alphaDiff = color.alphaF() - minAlphaF; + qreal gradient = alphaDiff / static_cast<qreal>(distanceThreshold + 1); + qreal resultAlpha = color.alphaF() - gradient * countDistance; + + // If alpha is out of bounds, clip it. + resultAlpha = std::min(1.0, std::max(0.0, resultAlpha)); + color.setAlphaF(resultAlpha); + } + return color; +} + +/*----------------------------------------------------------------------------*/ diff --git a/qt-ui/qtwaitingspinner.h b/qt-ui/qtwaitingspinner.h new file mode 100644 index 000000000..254b52ec7 --- /dev/null +++ b/qt-ui/qtwaitingspinner.h @@ -0,0 +1,103 @@ +/* Original Work Copyright (c) 2012-2014 Alexander Turkin + Modified 2014 by William Hallatt + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +#ifndef QTWAITINGSPINNER_H +#define QTWAITINGSPINNER_H + +#include <QWidget> + +#include <QTimer> +#include <QColor> + +class QtWaitingSpinner : public QWidget { + Q_OBJECT +public: + /*! Constructor for "standard" widget behaviour - use this + * constructor if you wish to, e.g. embed your widget in another. */ + QtWaitingSpinner(QWidget *parent = 0); + + /*! Constructor - use this constructor to automatically create a modal + * ("blocking") spinner on top of the calling widget/window. If a valid + * parent widget is provided, "centreOnParent" will ensure that + * QtWaitingSpinner automatically centres itself on it, if not, + * "centreOnParent" is ignored. */ + QtWaitingSpinner(Qt::WindowModality modality, QWidget *parent = 0, + bool centreOnParent = true); + +public Q_SLOTS: + void start(); + void stop(); + +public: + void setColor(QColor color); + void setRoundness(qreal roundness); + void setMinimumTrailOpacity(qreal minOpacity); + void setTrailFadePercentage(qreal trail); + void setRevolutionsPerSecond(int rps); + void setNumberOfLines(int lines); + void setLineLength(int length); + void setLineWidth(int width); + void setInnerRadius(int radius); + + bool isSpinning() const; + +private Q_SLOTS: + void rotate(); + +protected: + void paintEvent(QPaintEvent *ev); + +private: + static int calculateTimerInterval(int lines, int speed); + static int lineCountDistanceFromPrimary(int current, int primary, + int totalNrOfLines); + static QColor currentLineColor(int distance, int totalNrOfLines, + qreal trailFadePerc, qreal minOpacity, + QColor color); + + void initialise(); + void updateSize(); + void updateTimer(); + void updatePosition(); + +private: + // Configurable settings. + QColor m_color; + qreal m_roundness; // 0..100 + qreal m_minTrailOpacity; + qreal m_trailFadePercentage; + int m_revPerSec; // revolutions per second + int m_numberOfLines; + int m_lineLength; + int m_lineWidth; + int m_innerRadius; + +private: + QtWaitingSpinner(const QtWaitingSpinner&); + QtWaitingSpinner& operator=(const QtWaitingSpinner&); + + QTimer *m_timer; + QWidget *m_parent; + bool m_centreOnParent; + int m_currentCounter; + bool m_isSpinning; +}; + +#endif // QTWAITINGSPINNER_H diff --git a/qt-ui/shiftimagetimes.ui b/qt-ui/shiftimagetimes.ui index cce51e888..56a222856 100644 --- a/qt-ui/shiftimagetimes.ui +++ b/qt-ui/shiftimagetimes.ui @@ -117,6 +117,31 @@ </widget> </item> <item> + <widget class="QLabel" name="warningLabel"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="styleSheet"> + <string notr="true">color: red;</string> + </property> + <property name="text"> + <string>Warning! +Not all images have timestamps in the range between +30 minutes before the start and 30 minutes after the end of any selected dive.</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="invalidLabel"> + <property name="styleSheet"> + <string notr="true">color: red; </string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> diff --git a/qt-ui/simplewidgets.cpp b/qt-ui/simplewidgets.cpp index f8f4c2493..430609c7b 100644 --- a/qt-ui/simplewidgets.cpp +++ b/qt-ui/simplewidgets.cpp @@ -5,12 +5,17 @@ #include <QFileDialog> #include <QShortcut> #include <QCalendarWidget> +#include <QKeyEvent> +#include <QAction> #include "file.h" #include "mainwindow.h" #include "helpers.h" #include "libdivecomputer/parser.h" - +#include "divelistview.h" +#include "display.h" +#include "profile/profilewidget2.h" +#include "undocommands.h" class MinMaxAvgWidgetPrivate { public: @@ -137,8 +142,17 @@ void RenumberDialog::renumberOnlySelected(bool selected) void RenumberDialog::buttonClicked(QAbstractButton *button) { - if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) - renumber_dives(ui.spinBox->value(), selectedOnly); + if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) { + QMap<int,int> renumberedDives; + int i; + struct dive *dive = NULL; + for_each_dive (i, dive) { + if (!selectedOnly || dive->selected) + renumberedDives.insert(dive->id, dive->number); + } + UndoRenumberDives *undoCommand = new UndoRenumberDives(renumberedDives, ui.spinBox->value()); + MainWindow::instance()->undoStack->push(undoCommand); + } } RenumberDialog::RenumberDialog(QWidget *parent) : QDialog(parent), selectedOnly(false) @@ -169,7 +183,6 @@ void SetpointDialog::buttonClicked(QAbstractButton *button) add_event(dc, time, SAMPLE_EVENT_PO2, 0, (int)(1000.0 * ui.spinbox->value()), "SP change"); mark_divelist_changed(true); MainWindow::instance()->graphics()->replot(); - } SetpointDialog::SetpointDialog(QWidget *parent) : QDialog(parent) @@ -198,7 +211,16 @@ void ShiftTimesDialog::buttonClicked(QAbstractButton *button) amount *= -1; if (amount != 0) { // DANGER, DANGER - this could get our dive_table unsorted... - shift_times(amount); + int i; + struct dive *dive; + QList<int> affectedDives; + for_each_dive (i, dive) { + if (!dive->selected) + continue; + + affectedDives.append(dive->id); + } + MainWindow::instance()->undoStack->push(new UndoShiftTime(affectedDives, amount)); sort_table(&dive_table); mark_divelist_changed(true); MainWindow::instance()->dive_list()->rememberSelection(); @@ -250,9 +272,6 @@ void ShiftImageTimesDialog::buttonClicked(QAbstractButton *button) void ShiftImageTimesDialog::syncCameraClicked() { - struct memblock mem; - EXIFInfo exiv; - int retval; QPixmap picture; QDateTime dcDateTime = QDateTime(); QStringList fileNames = QFileDialog::getOpenFileNames(this, @@ -268,13 +287,8 @@ void ShiftImageTimesDialog::syncCameraClicked() scene->addPixmap(picture.scaled(ui.DCImage->size())); ui.DCImage->setScene(scene); - if (readfile(fileNames.at(0).toUtf8().data(), &mem) <= 0) - return; - retval = exiv.parseFrom((const unsigned char *)mem.buffer, (unsigned)mem.size); - free(mem.buffer); - if (retval != PARSE_EXIF_SUCCESS) - return; - dcImageEpoch = exiv.epoch(); + + dcImageEpoch = picture_get_timestamp(fileNames.at(0).toUtf8().data()); dcDateTime.setTime_t(dcImageEpoch); ui.dcTime->setDateTime(dcDateTime); connect(ui.dcTime, SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(dcDateTimeChanged(const QDateTime &))); @@ -287,11 +301,12 @@ void ShiftImageTimesDialog::dcDateTimeChanged(const QDateTime &newDateTime) setOffset(newDateTime.toTime_t() - dcImageEpoch); } -ShiftImageTimesDialog::ShiftImageTimesDialog(QWidget *parent) : QDialog(parent), m_amount(0) +ShiftImageTimesDialog::ShiftImageTimesDialog(QWidget *parent, QStringList fileNames) : QDialog(parent), fileNames(fileNames), m_amount(0) { ui.setupUi(this); connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(buttonClicked(QAbstractButton *))); connect(ui.syncCamera, SIGNAL(clicked()), this, SLOT(syncCameraClicked())); + connect(ui.timeEdit, SIGNAL(timeChanged(const QTime &)), this, SLOT(timeEditChanged(const QTime &))); dcImageEpoch = (time_t)0; } @@ -311,6 +326,55 @@ void ShiftImageTimesDialog::setOffset(time_t offset) ui.timeEdit->setTime(QTime(offset / 3600, (offset % 3600) / 60, offset % 60)); } +void ShiftImageTimesDialog::updateInvalid() +{ + timestamp_t timestamp; + QDateTime time; + bool allValid = true; + ui.warningLabel->hide(); + ui.invalidLabel->hide(); + ui.invalidLabel->clear(); + + Q_FOREACH (const QString &fileName, fileNames) { + if (picture_check_valid(fileName.toUtf8().data(), m_amount)) + continue; + + // We've found invalid image + timestamp = picture_get_timestamp(fileName.toUtf8().data()); + dcImageEpoch = timestamp; + time.setTime_t(timestamp + m_amount); + ui.invalidLabel->setText(ui.invalidLabel->text() + fileName + " " + time.toString() + "\n"); + allValid = false; + } + + if (!allValid){ + ui.warningLabel->show(); + ui.invalidLabel->show(); + } +} + +void ShiftImageTimesDialog::timeEditChanged(const QTime &time) +{ + m_amount = time.hour() * 3600 + time.minute() * 60; + if (ui.backwards->isChecked()) + m_amount *= -1; + updateInvalid(); +} + +URLDialog::URLDialog(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); + QShortcut *close = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this); + connect(close, SIGNAL(activated()), this, SLOT(close())); + QShortcut *quit = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this); + connect(quit, SIGNAL(activated()), parent, SLOT(close())); +} + +QString URLDialog::url() const +{ + return ui.urlField->toPlainText(); +} + bool isGnome3Session() { #if defined(QT_OS_WIW) || defined(QT_OS_MAC) @@ -454,8 +518,7 @@ DiveComponentSelection::DiveComponentSelection(QWidget *parent, struct dive *tar { ui.setupUi(this); what = _what; - UI_FROM_COMPONENT(location); - UI_FROM_COMPONENT(gps); + UI_FROM_COMPONENT(divesite); UI_FROM_COMPONENT(divemaster); UI_FROM_COMPONENT(buddy); UI_FROM_COMPONENT(rating); @@ -475,8 +538,7 @@ DiveComponentSelection::DiveComponentSelection(QWidget *parent, struct dive *tar void DiveComponentSelection::buttonClicked(QAbstractButton *button) { if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) { - COMPONENT_FROM_UI(location); - COMPONENT_FROM_UI(gps); + COMPONENT_FROM_UI(divesite); COMPONENT_FROM_UI(divemaster); COMPONENT_FROM_UI(buddy); COMPONENT_FROM_UI(rating); diff --git a/qt-ui/simplewidgets.h b/qt-ui/simplewidgets.h index 8d5b4f73c..17f628392 100644 --- a/qt-ui/simplewidgets.h +++ b/qt-ui/simplewidgets.h @@ -6,6 +6,7 @@ class QAbstractButton; class QNetworkReply; #include <QWidget> +#include <QGroupBox> #include <QDialog> #include <stdint.h> @@ -13,6 +14,7 @@ class QNetworkReply; #include "ui_setpoint.h" #include "ui_shifttimes.h" #include "ui_shiftimagetimes.h" +#include "ui_urldialog.h" #include "ui_divecomponentselection.h" #include "ui_listfilter.h" #include "ui_filterwidget.h" @@ -96,7 +98,7 @@ private: class ShiftImageTimesDialog : public QDialog { Q_OBJECT public: - explicit ShiftImageTimesDialog(QWidget *parent); + explicit ShiftImageTimesDialog(QWidget *parent, QStringList fileNames); time_t amount() const; void setOffset(time_t offset); private @@ -104,13 +106,25 @@ slots: void buttonClicked(QAbstractButton *button); void syncCameraClicked(); void dcDateTimeChanged(const QDateTime &); + void timeEditChanged(const QTime &time); + void updateInvalid(); private: + QStringList fileNames; Ui::ShiftImageTimesDialog ui; time_t m_amount; time_t dcImageEpoch; }; +class URLDialog : public QDialog { + Q_OBJECT +public: + explicit URLDialog(QWidget *parent); + QString url() const; +private: + Ui::URLDialog ui; +}; + class QCalendarWidget; class DateWidget : public QWidget { diff --git a/qt-ui/socialnetworks.cpp b/qt-ui/socialnetworks.cpp index 21ccf9354..6a81d5db7 100644 --- a/qt-ui/socialnetworks.cpp +++ b/qt-ui/socialnetworks.cpp @@ -302,7 +302,7 @@ void SocialNetworkDialog::selectionChanged() tr("min", "abbreviation for minutes"))); } if (ui->Location->isChecked()) { - fullText += tr("Dive location: %1 \n").arg(d->location); + fullText += tr("Dive location: %1 \n").arg(get_dive_location(d)); } if (ui->Buddy->isChecked()) { fullText += tr("Buddy: %1 \n").arg(d->buddy); diff --git a/qt-ui/subsurfacewebservices.cpp b/qt-ui/subsurfacewebservices.cpp index fe7605ad7..fad542de6 100644 --- a/qt-ui/subsurfacewebservices.cpp +++ b/qt-ui/subsurfacewebservices.cpp @@ -1,7 +1,13 @@ #include "subsurfacewebservices.h" +#include "helpers.h" #include "webservice.h" #include "mainwindow.h" #include "usersurvey.h" +#include "divelist.h" +#include "globe.h" +#include "maintab.h" +#include "display.h" +#include "membuffer.h" #include <errno.h> #include <QDir> @@ -26,7 +32,25 @@ #endif struct dive_table gps_location_table; -static bool merge_locations_into_dives(void); + +// we don't overwrite any existing GPS info in the dive +// so get the dive site and if there is none or there is one without GPS fix, add it +static void copy_gps_location(struct dive *from, struct dive *to) +{ + struct dive_site *ds = get_dive_site_for_dive(to); + if (!ds || !dive_site_has_gps_location(ds)) { + struct dive_site *gds = get_dive_site_for_dive(from); + if (!ds) { + // simply link to the one created for the fake dive + to->dive_site_uuid = gds->uuid; + } else { + ds->latitude = gds->latitude; + ds->longitude = gds->longitude; + if (same_string(ds->name, "")) + ds->name = copy_string(gds->name); + } + } +} #define SAME_GROUP 6 * 3600 // six hours //TODO: C Code. static functions are not good if we plan to have a test for them. @@ -39,14 +63,14 @@ static bool merge_locations_into_dives(void) for_each_dive (i, dive) { if (!dive_has_gps_location(dive)) { - for (j = tracer; (gpsfix = get_gps_location(j, &gps_location_table)) !=NULL; j++) { + for (j = tracer; (gpsfix = get_dive_from_table(j, &gps_location_table)) !=NULL; j++) { if (dive_within_time_range (dive, gpsfix->when, SAME_GROUP)) { /* * If position is fixed during dive. This is the good one. * Asign and mark position, and end gps_location loop */ if ((dive->when <= gpsfix->when && gpsfix->when <= dive->when + dive->duration.seconds)) { - copy_gps_location(gpsfix,dive); + copy_gps_location(gpsfix, dive); changed++; tracer = j; break; @@ -54,7 +78,7 @@ static bool merge_locations_into_dives(void) /* * If it is not, check if there are more position fixes in SAME_GROUP range */ - if ((nextgpsfix = get_gps_location(j+1,&gps_location_table)) && + if ((nextgpsfix = get_dive_from_table(j+1,&gps_location_table)) && dive_within_time_range (dive, nextgpsfix->when, SAME_GROUP)) { /* * If distance from gpsfix to end of dive is shorter than distance between @@ -62,7 +86,7 @@ static bool merge_locations_into_dives(void) * If not, simply fail and nextgpsfix will be evaluated in next iteration. */ if ((dive->when + dive->duration.seconds - gpsfix->when) < (nextgpsfix->when - gpsfix->when)) { - copy_gps_location(gpsfix,dive); + copy_gps_location(gpsfix, dive); tracer = j; break; } @@ -70,7 +94,7 @@ static bool merge_locations_into_dives(void) * If no more positions in range, the actual is the one. Asign, mark and end loop. */ } else { - copy_gps_location(gpsfix,dive); + copy_gps_location(gpsfix, dive); changed++; tracer = j; break; @@ -122,11 +146,12 @@ bool DivelogsDeWebServices::prepare_dives_for_divelogs(const QString &tempfile, /* walk the dive list in chronological order */ int i; struct dive *dive; + struct membuffer mb = { 0 }; for_each_dive (i, dive) { FILE *f; char filename[PATH_MAX]; int streamsize; - char *membuf; + const char *membuf; xmlDoc *transformed; struct zip_source *s; @@ -136,29 +161,11 @@ bool DivelogsDeWebServices::prepare_dives_for_divelogs(const QString &tempfile, */ if (selected && !dive->selected) continue; - QString innerTmpFile = tempfile; - QString tmpSuffix = QString::number(qrand() % 9999) + ".tmp"; - innerTmpFile.replace(".dld", tmpSuffix); - f = subsurface_fopen(QFile::encodeName(QDir::toNativeSeparators(innerTmpFile)), "w+"); - if (!f) { - report_error(tr("cannot create temporary file: %s").toUtf8(), qt_error_string().toUtf8().data()); - goto error_close_zip; - } - save_dive(f, dive); - fseek(f, 0, SEEK_END); - streamsize = ftell(f); - rewind(f); - - membuf = (char *)malloc(streamsize + 1); - if (!membuf || (streamsize = fread(membuf, 1, streamsize, f)) == 0) { - report_error(tr("internal error: %s").toUtf8(), qt_error_string().toUtf8().data()); - fclose(f); - free((void *)membuf); - goto error_close_zip; - } - membuf[streamsize] = 0; - fclose(f); - unlink(QFile::encodeName(QDir::toNativeSeparators(innerTmpFile))); + /* make sure the buffer is empty and add the dive */ + mb.len = 0; + save_one_dive_to_mb(&mb, dive); + membuf = mb_cstring(&mb); + streamsize = strlen(membuf); /* * Parse the memory buffer into XML document and * transform it to divelogs.de format, finally dumping @@ -168,7 +175,6 @@ bool DivelogsDeWebServices::prepare_dives_for_divelogs(const QString &tempfile, if (!doc) { qWarning() << errPrefix << "could not parse back into memory the XML file we've just created!"; report_error(tr("internal error").toUtf8()); - free((void *)membuf); goto error_close_zip; } free((void *)membuf); @@ -210,7 +216,7 @@ WebServices::WebServices(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); timeout.setSingleShot(true); defaultApplyText = ui.buttonBox->button(QDialogButtonBox::Apply)->text(); - userAgent = UserSurvey::getUserAgent(); + userAgent = getUserAgent(); } void WebServices::hidePassword() @@ -326,10 +332,19 @@ void SubsurfaceWebServices::buttonClicked(QAbstractButton *button) ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); switch (ui.buttonBox->buttonRole(button)) { case QDialogButtonBox::ApplyRole: { + int i; + struct dive *d; + struct dive_site *ds; clear_table(&gps_location_table); QByteArray url = tr("Webservice").toLocal8Bit(); parse_xml_buffer(url.data(), downloadedData.data(), downloadedData.length(), &gps_location_table, NULL); - + // make sure we mark all the dive sites that were created + for (i = 0; i < gps_location_table.nr; i++) { + d = get_dive_from_table(i, &gps_location_table); + ds = get_dive_site_by_uuid(d->dive_site_uuid); + if (ds) + ds->notes = strdup("SubsurfaceWebservice"); + } /* now merge the data in the gps_location table into the dive_table */ if (merge_locations_into_dives()) { mark_divelist_changed(true); @@ -358,6 +373,16 @@ void SubsurfaceWebServices::buttonClicked(QAbstractButton *button) hide(); close(); resetState(); + /* and now clean up and remove all the extra dive sites that were created */ + QSet<uint32_t> usedUuids; + for_each_dive(i, d) { + if (d->dive_site_uuid) + usedUuids.insert(d->dive_site_uuid); + } + for_each_dive_site(i, ds) { + if (!usedUuids.contains(ds->uuid) && same_string(ds->notes, "SubsurfaceWebservice")) + delete_dive_site(ds->uuid); + } } break; case QDialogButtonBox::RejectRole: if (reply != NULL && reply->isOpen()) { @@ -606,8 +631,10 @@ void DivelogsDeWebServices::prepareDivesForUpload(bool selected) f.remove(); return; } + } else { + report_error("Failed to create upload file %s\n", qPrintable(filename)); } - MainWindow::instance()->showError(get_error_string()); + MainWindow::instance()->getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); } void DivelogsDeWebServices::uploadDives(QIODevice *dldContent) @@ -638,7 +665,9 @@ void DivelogsDeWebServices::uploadDives(QIODevice *dldContent) } } -DivelogsDeWebServices::DivelogsDeWebServices(QWidget *parent, Qt::WindowFlags f) : WebServices(parent, f), uploadMode(false) +DivelogsDeWebServices::DivelogsDeWebServices(QWidget *parent, Qt::WindowFlags f) : WebServices(parent, f), + multipart(NULL), + uploadMode(false) { QSettings s; ui.userID->setText(s.value("divelogde_user").toString()); diff --git a/qt-ui/tableview.cpp b/qt-ui/tableview.cpp index 78a0bce10..e412d77e9 100644 --- a/qt-ui/tableview.cpp +++ b/qt-ui/tableview.cpp @@ -12,11 +12,9 @@ TableView::TableView(QWidget *parent) : QGroupBox(parent) QFontMetrics fm(defaultModelFont()); int text_ht = fm.height(); - int text_em = fm.width('m'); metrics.icon = &defaultIconMetrics(); - metrics.col_width = 7*text_em; metrics.rm_col_width = metrics.icon->sz_small + 2*metrics.icon->spacing; metrics.header_ht = text_ht + 10; // TODO DPI @@ -138,7 +136,8 @@ void TableView::edit(const QModelIndex &index) int TableView::defaultColumnWidth(int col) { - return col == CylindersModel::REMOVE ? metrics.rm_col_width : metrics.col_width; + QString text = ui.tableView->model()->headerData(col, Qt::Horizontal).toString(); + return text.isEmpty() ? metrics.rm_col_width : defaultModelFontMetrics().width(text) + 4; // add small margin } QTableView *TableView::view() diff --git a/qt-ui/tableview.h b/qt-ui/tableview.h index 36eef907a..f72b256ea 100644 --- a/qt-ui/tableview.h +++ b/qt-ui/tableview.h @@ -21,7 +21,6 @@ class TableView : public QGroupBox { struct TableMetrics { const IconMetrics* icon; // icon metrics - int col_width; // generic column width int rm_col_width; // column width of REMOVE column int header_ht; // height of the header }; diff --git a/qt-ui/tagwidget.cpp b/qt-ui/tagwidget.cpp index 8365a2ea7..3b61b492a 100644 --- a/qt-ui/tagwidget.cpp +++ b/qt-ui/tagwidget.cpp @@ -1,5 +1,6 @@ #include "tagwidget.h" #include "mainwindow.h" +#include "maintab.h" #include <QCompleter> TagWidget::TagWidget(QWidget *parent) : GroupedLineEdit(parent), m_completer(NULL), lastFinishedTag(false) diff --git a/qt-ui/undocommands.cpp b/qt-ui/undocommands.cpp new file mode 100644 index 000000000..aad264e24 --- /dev/null +++ b/qt-ui/undocommands.cpp @@ -0,0 +1,123 @@ +#include "undocommands.h" +#include "mainwindow.h" +#include "divelist.h" + +UndoDeleteDive::UndoDeleteDive(QList<dive *> deletedDives) + : diveList(deletedDives) +{ + setText("delete dive"); + if (diveList.count() > 1) + setText(QString("delete %1 dives").arg(QString::number(diveList.count()))); +} + +void UndoDeleteDive::undo() +{ + for (int i = 0; i < diveList.count(); i++) + record_dive(diveList.at(i)); + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); +} + +void UndoDeleteDive::redo() +{ + QList<struct dive*> newList; + for (int i = 0; i < diveList.count(); i++) { + //make a copy of the dive before deleting it + struct dive* d = alloc_dive(); + copy_dive(diveList.at(i), d); + newList.append(d); + //delete the dive + delete_single_dive(get_divenr(diveList.at(i))); + } + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); + diveList.clear(); + diveList = newList; +} + + +UndoShiftTime::UndoShiftTime(QList<int> changedDives, int amount) + : diveList(changedDives), timeChanged(amount) +{ + setText("shift time"); +} + +void UndoShiftTime::undo() +{ + for (int i = 0; i < diveList.count(); i++) { + struct dive* d = get_dive_by_uniq_id(diveList.at(i)); + d->when -= timeChanged; + } + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); +} + +void UndoShiftTime::redo() +{ + for (int i = 0; i < diveList.count(); i++) { + struct dive* d = get_dive_by_uniq_id(diveList.at(i)); + d->when += timeChanged; + } + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); +} + + +UndoRenumberDives::UndoRenumberDives(QMap<int, int> originalNumbers, int startNumber) +{ + oldNumbers = originalNumbers; + start = startNumber; + setText("renumber dive"); + if (oldNumbers.count() > 1) + setText(QString("renumber %1 dives").arg(QString::number(oldNumbers.count()))); +} + +void UndoRenumberDives::undo() +{ + foreach (int key, oldNumbers.keys()) { + struct dive* d = get_dive_by_uniq_id(key); + d->number = oldNumbers.value(key); + } + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); +} + +void UndoRenumberDives::redo() +{ + int i = start; + foreach (int key, oldNumbers.keys()) { + struct dive* d = get_dive_by_uniq_id(key); + d->number = i++; + } + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); +} + + +UndoRemoveDivesFromTrip::UndoRemoveDivesFromTrip(QMap<dive *, dive_trip *> removedDives) +{ + divesToUndo = removedDives; + setText("remove dive(s) from trip"); +} + +void UndoRemoveDivesFromTrip::undo() +{ + QMapIterator<dive*, dive_trip*> i(divesToUndo); + while (i.hasNext()) { + i.next(); + add_dive_to_trip(i.key (), i.value()); + } + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); +} + +void UndoRemoveDivesFromTrip::redo() +{ + QMapIterator<dive*, dive_trip*> i(divesToUndo); + while (i.hasNext()) { + i.next(); + remove_dive_from_trip(i.key(), false); + } + mark_divelist_changed(true); + MainWindow::instance()->refreshDisplay(); +} diff --git a/qt-ui/undocommands.h b/qt-ui/undocommands.h new file mode 100644 index 000000000..bd8530d77 --- /dev/null +++ b/qt-ui/undocommands.h @@ -0,0 +1,50 @@ +#ifndef UNDOCOMMANDS_H +#define UNDOCOMMANDS_H + +#include <QUndoCommand> +#include <QMap> +#include "dive.h" + +class UndoDeleteDive : public QUndoCommand { +public: + UndoDeleteDive(QList<struct dive*> deletedDives); + virtual void undo(); + virtual void redo(); + +private: + QList<struct dive*> diveList; +}; + +class UndoShiftTime : public QUndoCommand { +public: + UndoShiftTime(QList<int> changedDives, int amount); + virtual void undo(); + virtual void redo(); + +private: + QList<int> diveList; + int timeChanged; +}; + +class UndoRenumberDives : public QUndoCommand { +public: + UndoRenumberDives(QMap<int,int> originalNumbers, int startNumber); + virtual void undo(); + virtual void redo(); + +private: + QMap<int,int> oldNumbers; + int start; +}; + +class UndoRemoveDivesFromTrip : public QUndoCommand { +public: + UndoRemoveDivesFromTrip(QMap<struct dive*, dive_trip*> removedDives); + virtual void undo(); + virtual void redo(); + +private: + QMap<struct dive*, dive_trip*> divesToUndo; +}; + +#endif // UNDOCOMMANDS_H diff --git a/qt-ui/updatemanager.cpp b/qt-ui/updatemanager.cpp index 3fff8b45d..8a22400b9 100644 --- a/qt-ui/updatemanager.cpp +++ b/qt-ui/updatemanager.cpp @@ -1,10 +1,11 @@ #include "updatemanager.h" #include "usersurvey.h" +#include "helpers.h" #include <QtNetwork> #include <QMessageBox> #include <QUuid> #include "subsurfacewebservices.h" -#include "ssrf-version.h" +#include "version.h" #include "mainwindow.h" UpdateManager::UpdateManager(QObject *parent) : QObject(parent) @@ -16,9 +17,9 @@ UpdateManager::UpdateManager(QObject *parent) : QObject(parent) return; if (settings.contains("LastVersionUsed")) { // we have checked at least once before - if (settings.value("LastVersionUsed").toString() != GIT_VERSION_STRING) { + if (settings.value("LastVersionUsed").toString() != subsurface_git_version()) { // we have just updated - wait two weeks before you check again - settings.setValue("LastVersionUsed", QString(GIT_VERSION_STRING)); + settings.setValue("LastVersionUsed", QString(subsurface_git_version())); settings.setValue("NextCheck", QDateTime::currentDateTime().addDays(14).toString(Qt::ISODate)); } else { // is it time to check again? @@ -28,7 +29,7 @@ UpdateManager::UpdateManager(QObject *parent) : QObject(parent) return; } } - settings.setValue("LastVersionUsed", QString(GIT_VERSION_STRING)); + settings.setValue("LastVersionUsed", QString(subsurface_git_version())); settings.setValue("NextCheck", QDateTime::currentDateTime().addDays(14).toString(Qt::ISODate)); checkForUpdates(true); } @@ -47,13 +48,13 @@ void UpdateManager::checkForUpdates(bool automatic) os = "unknown"; #endif isAutomaticCheck = automatic; - QString version = CANONICAL_VERSION_STRING; + QString version = subsurface_canonical_version(); QString uuidString = getUUID(); QString url = QString("http://subsurface-divelog.org/updatecheck.html?os=%1&version=%2&uuid=%3").arg(os, version, uuidString); QNetworkRequest request; request.setUrl(url); request.setRawHeader("Accept", "text/xml"); - QString userAgent = UserSurvey::getUserAgent(); + QString userAgent = getUserAgent(); request.setRawHeader("User-Agent", userAgent.toUtf8()); connect(SubsurfaceWebServices::manager()->get(request), SIGNAL(finished()), this, SLOT(requestReceived()), Qt::UniqueConnection); } diff --git a/qt-ui/urldialog.ui b/qt-ui/urldialog.ui new file mode 100644 index 000000000..397f90a64 --- /dev/null +++ b/qt-ui/urldialog.ui @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>URLDialog</class> + <widget class="QDialog" name="URLDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>397</width> + <height>103</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="geometry"> + <rect> + <x>40</x> + <y>60</y> + <width>341</width> + <height>32</height> + </rect> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + <widget class="QPlainTextEdit" name="urlField"> + <property name="geometry"> + <rect> + <x>10</x> + <y>30</y> + <width>371</width> + <height>21</height> + </rect> + </property> + </widget> + <widget class="QLabel" name="label"> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>151</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>Enter URL for images</string> + </property> + </widget> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>URLDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>URLDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/qt-ui/usersurvey.cpp b/qt-ui/usersurvey.cpp index 4061d46df..05da582a1 100644 --- a/qt-ui/usersurvey.cpp +++ b/qt-ui/usersurvey.cpp @@ -4,7 +4,7 @@ #include "usersurvey.h" #include "ui_usersurvey.h" -#include "ssrf-version.h" +#include "version.h" #include "subsurfacewebservices.h" #include "updatemanager.h" @@ -22,12 +22,12 @@ UserSurvey::UserSurvey(QWidget *parent) : QDialog(parent), QShortcut *quitKey = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this); connect(quitKey, SIGNAL(activated()), parent, SLOT(close())); - os = QString("ssrfVers=%1").arg(VERSION_STRING); + os = QString("ssrfVers=%1").arg(subsurface_version()); os.append(QString("&prettyOsName=%1").arg(SubsurfaceSysInfo::prettyOsName())); - QString arch = SubsurfaceSysInfo::cpuArchitecture(); + QString arch = SubsurfaceSysInfo::buildCpuArchitecture(); os.append(QString("&appCpuArch=%1").arg(arch)); if (arch == "i386") { - QString osArch = SubsurfaceSysInfo::osArch(); + QString osArch = SubsurfaceSysInfo::currentCpuArchitecture(); os.append(QString("&osCpuArch=%1").arg(osArch)); } os.append(QString("&uiLang=%1").arg(uiLanguage(NULL))); @@ -39,32 +39,16 @@ QString UserSurvey::getVersion() { QString arch; // fill in the system data - QString sysInfo = QString("Subsurface %1").arg(VERSION_STRING); + QString sysInfo = QString("Subsurface %1").arg(subsurface_version()); sysInfo.append(tr("\nOperating system: %1").arg(SubsurfaceSysInfo::prettyOsName())); - arch = SubsurfaceSysInfo::cpuArchitecture(); + arch = SubsurfaceSysInfo::buildCpuArchitecture(); sysInfo.append(tr("\nCPU architecture: %1").arg(arch)); if (arch == "i386") - sysInfo.append(tr("\nOS CPU architecture: %1").arg(SubsurfaceSysInfo::osArch())); + sysInfo.append(tr("\nOS CPU architecture: %1").arg(SubsurfaceSysInfo::currentCpuArchitecture())); sysInfo.append(tr("\nLanguage: %1").arg(uiLanguage(NULL))); return sysInfo; } -QString UserSurvey::getUserAgent() -{ - QString arch; - // fill in the system data - use ':' as separator - // replace all other ':' with ' ' so that this is easy to parse - QString userAgent = QString("Subsurface:%1:").arg(VERSION_STRING); - userAgent.append(SubsurfaceSysInfo::prettyOsName().replace(':', ' ') + ":"); - arch = SubsurfaceSysInfo::cpuArchitecture().replace(':', ' '); - userAgent.append(arch); - if (arch == "i386") - userAgent.append("/" + SubsurfaceSysInfo::osArch()); - userAgent.append(":" + uiLanguage(NULL)); - return userAgent; - -} - UserSurvey::~UserSurvey() { delete ui; diff --git a/qt-ui/usersurvey.h b/qt-ui/usersurvey.h index 55140521e..1dd5aaab3 100644 --- a/qt-ui/usersurvey.h +++ b/qt-ui/usersurvey.h @@ -16,7 +16,6 @@ public: explicit UserSurvey(QWidget *parent = 0); ~UserSurvey(); static QString getVersion(); - static QString getUserAgent(); private slots: diff --git a/qthelper.cpp b/qthelper.cpp index acb1e103a..bbe908e6f 100644 --- a/qthelper.cpp +++ b/qthelper.cpp @@ -1,6 +1,15 @@ #include "qthelper.h" +#include "helpers.h" #include "gettextfromc.h" #include "statistics.h" +#include "usersurvey.h" +#include "membuffer.h" +#include "subsurfacesysinfo.h" +#include "version.h" +#include "divecomputer.h" +#include "time.h" +#include "gettextfromc.h" +#include <sys/time.h> #include <exif.h> #include "file.h" #include <QFile> @@ -8,8 +17,42 @@ #include <QDir> #include <QDebug> #include <QSettings> +#include <QStandardPaths> +#include <QJsonDocument> +#include <QJsonArray> +#include <QJsonObject> +#include <QNetworkReply> +#include <QNetworkRequest> +#include <QNetworkAccessManager> +#include <QUrlQuery> +#include <QEventLoop> +#include <QDateTime> +#include <QSaveFile> +#include <QDir> +#include <QImageReader> +#include <QtConcurrent> +#include "divepicturewidget.h" + #include <libxslt/documents.h> +const char *existing_filename; +static QString shortDateFormat; +static QString dateFormat; +static QString timeFormat; +static QLocale loc; + +#if defined(Q_OS_WIN) && QT_VERSION < 0x050000 +static QByteArray encodeUtf8(const QString &fname) +{ + return fname.toUtf8(); +} + +static QString decodeUtf8(const QByteArray &fname) +{ + return QString::fromUtf8(fname); +} +#endif + #define translate(_context, arg) trGettext(arg) static const QString DEGREE_SIGNS("dD" UTF8_DEGREE); @@ -31,7 +74,7 @@ QString weight_string(int weight_in_grams) return (str); } -QString printGPSCoords(int lat, int lon) +extern "C" const char *printGPSCoords(int lat, int lon) { unsigned int latdeg, londeg; unsigned int latmin, lonmin; @@ -39,24 +82,31 @@ QString printGPSCoords(int lat, int lon) QString lath, lonh, result; if (!lat && !lon) - return QString(); - - lath = lat >= 0 ? translate("gettextFromC", "N") : translate("gettextFromC", "S"); - lonh = lon >= 0 ? translate("gettextFromC", "E") : translate("gettextFromC", "W"); - lat = abs(lat); - lon = abs(lon); - latdeg = lat / 1000000U; - londeg = lon / 1000000U; - latmin = (lat % 1000000U) * 60U; - lonmin = (lon % 1000000U) * 60U; - latsec = (latmin % 1000000) * 60; - lonsec = (lonmin % 1000000) * 60; - result.sprintf("%u%s%02d\'%06.3f\"%s %u%s%02d\'%06.3f\"%s", - latdeg, UTF8_DEGREE, latmin / 1000000, latsec / 1000000, lath.toUtf8().data(), - londeg, UTF8_DEGREE, lonmin / 1000000, lonsec / 1000000, lonh.toUtf8().data()); - return result; + return strdup(""); + + if (prefs.coordinates_traditional) { + lath = lat >= 0 ? translate("gettextFromC", "N") : translate("gettextFromC", "S"); + lonh = lon >= 0 ? translate("gettextFromC", "E") : translate("gettextFromC", "W"); + lat = abs(lat); + lon = abs(lon); + latdeg = lat / 1000000U; + londeg = lon / 1000000U; + latmin = (lat % 1000000U) * 60U; + lonmin = (lon % 1000000U) * 60U; + latsec = (latmin % 1000000) * 60; + lonsec = (lonmin % 1000000) * 60; + result.sprintf("%u%s%02d\'%06.3f\"%s %u%s%02d\'%06.3f\"%s", + latdeg, UTF8_DEGREE, latmin / 1000000, latsec / 1000000, lath.toUtf8().data(), + londeg, UTF8_DEGREE, lonmin / 1000000, lonsec / 1000000, lonh.toUtf8().data()); + } else { + result.sprintf("%f %f", (double) lat / 1000000.0, (double) lon / 1000000.0); + } + return strdup(result.toUtf8().data()); } +/** +* Try to parse in a generic manner a coordinate. +*/ static bool parseCoord(const QString& txt, int& pos, const QString& positives, const QString& negatives, const QString& others, double& value) @@ -78,7 +128,7 @@ static bool parseCoord(const QString& txt, int& pos, const QString& positives, numberDefined = true; posBeforeNumber = pos; pos += numberRe.cap(1).size() - 1; - } else if (positives.indexOf(txt[pos].toUpper()) >= 0) { + } else if (positives.indexOf(txt[pos]) >= 0) { if (sign != 0) return false; sign = 1; @@ -88,7 +138,7 @@ static bool parseCoord(const QString& txt, int& pos, const QString& positives, ++pos; break; } - } else if (negatives.indexOf(txt[pos].toUpper()) >= 0) { + } else if (negatives.indexOf(txt[pos]) >= 0) { if (sign != 0) { if (others.indexOf(txt[pos]) >= 0) //special case for the '-' sign => next coordinate @@ -102,10 +152,11 @@ static bool parseCoord(const QString& txt, int& pos, const QString& positives, ++pos; break; } - } else if (others.indexOf(txt[pos].toUpper()) >= 0) { + } else if (others.indexOf(txt[pos]) >= 0) { //we are at the next coordinate. break; - } else if (DEGREE_SIGNS.indexOf(txt[pos]) >= 0) { + } else if (DEGREE_SIGNS.indexOf(txt[pos]) >= 0 || + (txt[pos].isSpace() && !degreesDefined && numberDefined)) { if (!numberDefined) return false; if (degreesDefined) { @@ -117,20 +168,18 @@ static bool parseCoord(const QString& txt, int& pos, const QString& positives, value += number; numberDefined = false; degreesDefined = true; - } else if (txt[pos] == '\'') { + } else if (txt[pos] == '\'' || (txt[pos].isSpace() && !minutesDefined && numberDefined)) { if (!numberDefined || minutesDefined) return false; value += number / 60.0; numberDefined = false; minutesDefined = true; - } else if (txt[pos] == '"') { + } else if (txt[pos] == '"' || (txt[pos].isSpace() && !secondsDefined && numberDefined)) { if (!numberDefined || secondsDefined) return false; value += number / 3600.0; numberDefined = false; secondsDefined = true; - } else if (txt[pos] == ' ' || txt[pos] == '\t') { - //ignore spaces } else { return false; } @@ -138,33 +187,56 @@ static bool parseCoord(const QString& txt, int& pos, const QString& positives, } if (!degreesDefined && numberDefined) { value = number; //just a single number => degrees - numberDefined = false; - degreesDefined = true; - } - if (!degreesDefined || numberDefined) + } else if (!minutesDefined && numberDefined) { + value += number / 60.0; + } else if (!secondsDefined && numberDefined) { + value += number / 3600.0; + } else if (numberDefined) { return false; + } if (sign == -1) value *= -1.0; return true; } +/** +* Parse special coordinate formats that cannot be handled by parseCoord. +*/ +static bool parseSpecialCoords(const QString& txt, double& latitude, double& longitude) { + QRegExp xmlFormat("(-?\\d+(?:\\.\\d+)?)\\s+(-?\\d+(?:\\.\\d+)?)"); + if (xmlFormat.exactMatch(txt)) { + latitude = xmlFormat.cap(1).toDouble(); + longitude = xmlFormat.cap(2).toDouble(); + return true; + } + return false; +} + bool parseGpsText(const QString &gps_text, double *latitude, double *longitude) { - const QString trimmed = gps_text.trimmed(); - if (trimmed.isEmpty()) { + static const QString POS_LAT = QString("+N") + translate("gettextFromC", "N"); + static const QString NEG_LAT = QString("-S") + translate("gettextFromC", "S"); + static const QString POS_LON = QString("+E") + translate("gettextFromC", "E"); + static const QString NEG_LON = QString("-W") + translate("gettextFromC", "W"); + + //remove the useless spaces (but keep the ones separating numbers) + static const QRegExp SPACE_CLEANER("\\s*([" + POS_LAT + NEG_LAT + POS_LON + + NEG_LON + DEGREE_SIGNS + "'\"\\s])\\s*"); + const QString normalized = gps_text.trimmed().toUpper().replace(SPACE_CLEANER, "\\1"); + + if (normalized.isEmpty()) { *latitude = 0.0; *longitude = 0.0; return true; } + if (parseSpecialCoords(normalized, *latitude, *longitude)) + return true; int pos = 0; - static const QString POS_LAT = QString("+N") + translate("gettextFromC", "N"); - static const QString NEG_LAT = QString("-S") + translate("gettextFromC", "S"); - static const QString POS_LON = QString("+E") + translate("gettextFromC", "E"); - static const QString NEG_LON = QString("-W") + translate("gettextFromC", "W"); - return parseCoord(gps_text, pos, POS_LAT, NEG_LAT, POS_LON + NEG_LON, *latitude) && - parseCoord(gps_text, pos, POS_LON, NEG_LON, "", *longitude) && - pos == gps_text.size(); + return parseCoord(normalized, pos, POS_LAT, NEG_LAT, POS_LON + NEG_LON, *latitude) && + parseCoord(normalized, pos, POS_LON, NEG_LON, "", *longitude) && + pos == normalized.size(); } +#if 0 // we'll need something like this for the dive site management, eventually bool gpsHasChanged(struct dive *dive, struct dive *master, const QString &gps_text, bool *parsed_out) { double latitude, longitude; @@ -193,6 +265,7 @@ bool gpsHasChanged(struct dive *dive, struct dive *master, const QString &gps_te dive->longitude.udeg = longudeg; return true; } +#endif QList<int> getDivesInTrip(dive_trip_t *trip) { @@ -235,9 +308,12 @@ int dive_getUniqID(struct dive *d) static xmlDocPtr get_stylesheet_doc(const xmlChar *uri, xmlDictPtr, int, void *, xsltLoadType) { QFile f(QLatin1String(":/xslt/") + (const char *)uri); - if (!f.open(QIODevice::ReadOnly)) - return NULL; - + if (!f.open(QIODevice::ReadOnly)) { + if (verbose > 0) { + qDebug() << "cannot open stylesheet" << QLatin1String(":/xslt/") + (const char *)uri; + return NULL; + } + } /* Load and parse the data */ QByteArray source = f.readAll(); @@ -265,22 +341,41 @@ extern "C" xsltStylesheetPtr get_stylesheet(const char *name) return xslt; } -extern "C" void picture_load_exif_data(struct picture *p, timestamp_t *timestamp) + +extern "C" timestamp_t picture_get_timestamp(char *filename) { EXIFInfo exif; memblock mem; + int retval; - if (readfile(p->filename, &mem) <= 0) - goto picture_load_exit; - if (exif.parseFrom((const unsigned char *)mem.buffer, (unsigned)mem.size) != PARSE_EXIF_SUCCESS) - goto picture_load_exit; - *timestamp = exif.epoch(); - p->longitude.udeg= lrint(1000000.0 * exif.GeoLocation.Longitude); - p->latitude.udeg = lrint(1000000.0 * exif.GeoLocation.Latitude); - -picture_load_exit: + // filename might not be the actual filename, so let's go via the hash. + if (readfile(localFilePath(QString(filename)).toUtf8().data(), &mem) <= 0) + return 0; + retval = exif.parseFrom((const unsigned char *)mem.buffer, (unsigned)mem.size); free(mem.buffer); - return; + if (retval != PARSE_EXIF_SUCCESS) + return 0; + return exif.epoch(); +} + +extern "C" const char *system_default_directory(void) +{ + static char filename[PATH_MAX]; + + if (!*filename) { + enum QStandardPaths::StandardLocation location; +#if QT_VERSION >= 0x050400 + location = QStandardPaths::AppDataLocation; +#else + location = QStandardPaths::DataLocation; +#endif + QString name = QStandardPaths::standardLocations(location).first(); + QDir dir(name); + dir.mkpath(name); + // Why no "dir.encodeName()"? Crazy Qt + strncpy(filename, QFile::encodeName(name), PATH_MAX-1); + } + return filename; } extern "C" char *get_file_name(const char *fileName) @@ -340,3 +435,477 @@ void selectedDivesGasUsed(QVector<QPair<QString, int> > &gasUsedOrdered) } qSort(gasUsedOrdered.begin(), gasUsedOrdered.end(), lessThan); } + +QString getUserAgent() +{ + QString arch; + // fill in the system data - use ':' as separator + // replace all other ':' with ' ' so that this is easy to parse + QString userAgent = QString("Subsurface:%1:").arg(subsurface_version()); + userAgent.append(SubsurfaceSysInfo::prettyOsName().replace(':', ' ') + ":"); + arch = SubsurfaceSysInfo::buildCpuArchitecture().replace(':', ' '); + userAgent.append(arch); + if (arch == "i386") + userAgent.append("/" + SubsurfaceSysInfo::currentCpuArchitecture()); + userAgent.append(":" + uiLanguage(NULL)); + return userAgent; + +} + +QString uiLanguage(QLocale *callerLoc) +{ + QSettings s; + s.beginGroup("Language"); + + if (!s.value("UseSystemLanguage", true).toBool()) { + loc = QLocale(s.value("UiLanguage", QLocale().uiLanguages().first()).toString()); + } else { + loc = QLocale(QLocale().uiLanguages().first()); + } + + QString uiLang = loc.uiLanguages().first(); + s.endGroup(); + + // there's a stupid Qt bug on MacOS where uiLanguages doesn't give us the country info + if (!uiLang.contains('-') && uiLang != loc.bcp47Name()) { + QLocale loc2(loc.bcp47Name()); + loc = loc2; + uiLang = loc2.uiLanguages().first(); + } + if (callerLoc) + *callerLoc = loc; + + // the short format is fine + // the long format uses long weekday and month names, so replace those with the short ones + // for time we don't want the time zone designator and don't want leading zeroes on the hours + shortDateFormat = loc.dateFormat(QLocale::ShortFormat); + dateFormat = loc.dateFormat(QLocale::LongFormat); + dateFormat.replace("dddd,", "ddd").replace("dddd", "ddd").replace("MMMM", "MMM"); + // special hack for Swedish as our switching from long weekday names to short weekday names + // messes things up there + dateFormat.replace("'en' 'den' d:'e'", " d"); + timeFormat = loc.timeFormat(); + timeFormat.replace("(t)", "").replace(" t", "").replace("t", "").replace("hh", "h").replace("HH", "H").replace("'kl'.", ""); + timeFormat.replace(".ss", "").replace(":ss", "").replace("ss", ""); + return uiLang; +} + +QLocale getLocale() +{ + return loc; +} + +QString getDateFormat() +{ + return dateFormat; +} +void set_filename(const char *filename, bool force) +{ + if (!force && existing_filename) + return; + free((void *)existing_filename); + if (filename) + existing_filename = strdup(filename); + else + existing_filename = NULL; +} + +const QString get_dc_nickname(const char *model, uint32_t deviceid) +{ + const DiveComputerNode *existNode = dcList.getExact(model, deviceid); + + if (existNode && !existNode->nickName.isEmpty()) + return existNode->nickName; + else + return model; +} + +QString get_depth_string(int mm, bool showunit, bool showdecimal) +{ + if (prefs.units.length == units::METERS) { + double meters = mm / 1000.0; + return QString("%1%2").arg(meters, 0, 'f', (showdecimal && meters < 20.0) ? 1 : 0).arg(showunit ? translate("gettextFromC", "m") : ""); + } else { + double feet = mm_to_feet(mm); + return QString("%1%2").arg(feet, 0, 'f', 0).arg(showunit ? translate("gettextFromC", "ft") : ""); + } +} + +QString get_depth_string(depth_t depth, bool showunit, bool showdecimal) +{ + return get_depth_string(depth.mm, showunit, showdecimal); +} + +QString get_depth_unit() +{ + if (prefs.units.length == units::METERS) + return QString("%1").arg(translate("gettextFromC", "m")); + else + return QString("%1").arg(translate("gettextFromC", "ft")); +} + +QString get_weight_string(weight_t weight, bool showunit) +{ + QString str = weight_string(weight.grams); + if (get_units()->weight == units::KG) { + str = QString("%1%2").arg(str).arg(showunit ? translate("gettextFromC", "kg") : ""); + } else { + str = QString("%1%2").arg(str).arg(showunit ? translate("gettextFromC", "lbs") : ""); + } + return (str); +} + +QString get_weight_unit() +{ + if (prefs.units.weight == units::KG) + return QString("%1").arg(translate("gettextFromC", "kg")); + else + return QString("%1").arg(translate("gettextFromC", "lbs")); +} + +/* these methods retrieve used gas per cylinder */ +static unsigned start_pressure(cylinder_t *cyl) +{ + return cyl->start.mbar ?: cyl->sample_start.mbar; +} + +static unsigned end_pressure(cylinder_t *cyl) +{ + return cyl->end.mbar ?: cyl->sample_end.mbar; +} + +QString get_cylinder_used_gas_string(cylinder_t *cyl, bool showunit) +{ + int decimals; + const char *unit; + double gas_usage; + /* Get the cylinder gas use in mbar */ + gas_usage = start_pressure(cyl) - end_pressure(cyl); + /* Can we turn it into a volume? */ + if (cyl->type.size.mliter) { + gas_usage = bar_to_atm(gas_usage / 1000); + gas_usage *= cyl->type.size.mliter; + gas_usage = get_volume_units(gas_usage, &decimals, &unit); + } else { + gas_usage = get_pressure_units(gas_usage, &unit); + decimals = 0; + } + // translate("gettextFromC","%.*f %s" + return QString("%1 %2").arg(gas_usage, 0, 'f', decimals).arg(showunit ? unit : ""); +} + +QString get_temperature_string(temperature_t temp, bool showunit) +{ + if (temp.mkelvin == 0) { + return ""; //temperature not defined + } else if (prefs.units.temperature == units::CELSIUS) { + double celsius = mkelvin_to_C(temp.mkelvin); + return QString("%1%2%3").arg(celsius, 0, 'f', 1).arg(showunit ? (UTF8_DEGREE) : "").arg(showunit ? translate("gettextFromC", "C") : ""); + } else { + double fahrenheit = mkelvin_to_F(temp.mkelvin); + return QString("%1%2%3").arg(fahrenheit, 0, 'f', 1).arg(showunit ? (UTF8_DEGREE) : "").arg(showunit ? translate("gettextFromC", "F") : ""); + } +} + +QString get_temp_unit() +{ + if (prefs.units.temperature == units::CELSIUS) + return QString(UTF8_DEGREE "C"); + else + return QString(UTF8_DEGREE "F"); +} + +QString get_volume_string(volume_t volume, bool showunit, int mbar) +{ + const char *unit; + int decimals; + double value = get_volume_units(volume.mliter, &decimals, &unit); + if (mbar) { + // we are showing a tank size + // fix the weird imperial way of denominating size and provide + // reasonable number of decimals + if (prefs.units.volume == units::CUFT) + value *= bar_to_atm(mbar / 1000.0); + decimals = (value > 20.0) ? 0 : (value > 2.0) ? 1 : 2; + } + return QString("%1%2").arg(value, 0, 'f', decimals).arg(showunit ? unit : ""); +} + +QString get_volume_unit() +{ + const char *unit; + (void) get_volume_units(0, NULL, &unit); + return QString(unit); +} + +QString get_pressure_string(pressure_t pressure, bool showunit) +{ + if (prefs.units.pressure == units::BAR) { + double bar = pressure.mbar / 1000.0; + return QString("%1%2").arg(bar, 0, 'f', 1).arg(showunit ? translate("gettextFromC", "bar") : ""); + } else { + double psi = mbar_to_PSI(pressure.mbar); + return QString("%1%2").arg(psi, 0, 'f', 0).arg(showunit ? translate("gettextFromC", "psi") : ""); + } +} + +QString getSubsurfaceDataPath(QString folderToFind) +{ + QString execdir; + QDir folder; + + // first check if we are running in the build dir, so the path that we + // are looking for is just a subdirectory of the execution path; + // this also works on Windows as there we install the dirs + // under the application path + execdir = QCoreApplication::applicationDirPath(); + folder = QDir(execdir.append(QDir::separator()).append(folderToFind)); + if (folder.exists()) + return folder.absolutePath(); + + // next check for the Linux typical $(prefix)/share/subsurface + execdir = QCoreApplication::applicationDirPath(); + if (execdir.contains("bin")) { + folder = QDir(execdir.replace("bin", "share/subsurface/").append(folderToFind)); + if (folder.exists()) + return folder.absolutePath(); + } + // then look for the usual locations on a Mac + execdir = QCoreApplication::applicationDirPath(); + folder = QDir(execdir.append("/../Resources/share/").append(folderToFind)); + if (folder.exists()) + return folder.absolutePath(); + execdir = QCoreApplication::applicationDirPath(); + folder = QDir(execdir.append("/../Resources/").append(folderToFind)); + if (folder.exists()) + return folder.absolutePath(); + return QString(""); +} + +int gettimezoneoffset(timestamp_t when) +{ + QDateTime dt1, dt2; + if (when == 0) + dt1 = QDateTime::currentDateTime(); + else + dt1 = QDateTime::fromMSecsSinceEpoch(when * 1000); + dt2 = dt1.toUTC(); + dt1.setTimeSpec(Qt::UTC); + return dt2.secsTo(dt1); +} + +int parseTemperatureToMkelvin(const QString &text) +{ + int mkelvin; + QString numOnly = text; + numOnly.replace(",", ".").remove(QRegExp("[^-0-9.]")); + if (numOnly.isEmpty()) + return 0; + double number = numOnly.toDouble(); + switch (prefs.units.temperature) { + case units::CELSIUS: + mkelvin = C_to_mkelvin(number); + break; + case units::FAHRENHEIT: + mkelvin = F_to_mkelvin(number); + break; + default: + mkelvin = 0; + } + return mkelvin; +} + +QString get_dive_duration_string(timestamp_t when, QString hourText, QString minutesText) +{ + int hrs, mins; + mins = (when + 59) / 60; + hrs = mins / 60; + mins -= hrs * 60; + + QString displayTime; + if (hrs) + displayTime = QString("%1%2%3%4").arg(hrs).arg(hourText).arg(mins, 2, 10, QChar('0')).arg(minutesText); + else + displayTime = QString("%1%2").arg(mins).arg(minutesText); + + return displayTime; +} + +QString get_dive_date_string(timestamp_t when) +{ + QDateTime ts; + ts.setMSecsSinceEpoch(when * 1000L); + return loc.toString(ts.toUTC(), dateFormat + " " + timeFormat); +} + +QString get_short_dive_date_string(timestamp_t when) +{ + QDateTime ts; + ts.setMSecsSinceEpoch(when * 1000L); + return loc.toString(ts.toUTC(), shortDateFormat + " " + timeFormat); +} + +const char *get_dive_date_c_string(timestamp_t when) +{ + QString text = get_dive_date_string(when); + return strdup(text.toUtf8().data()); +} + +QString get_trip_date_string(timestamp_t when, int nr) +{ + struct tm tm; + utc_mkdate(when, &tm); + if (nr != 1) { + QString ret = translate("gettextFromC", "%1 %2 (%3 dives)"); + return ret.arg(monthname(tm.tm_mon)) + .arg(tm.tm_year + 1900) + .arg(nr); + } else { + QString ret = translate("gettextFromC", "%1 %2 (1 dive)"); + return ret.arg(monthname(tm.tm_mon)) + .arg(tm.tm_year + 1900); + } +} + +extern "C" void reverseGeoLookup(degrees_t latitude, degrees_t longitude, uint32_t uuid) +{ + QNetworkRequest request; + QNetworkAccessManager *rgl = new QNetworkAccessManager(); + request.setUrl(QString("http://open.mapquestapi.com/nominatim/v1/reverse.php?format=json&accept-language=%1&lat=%2&lon=%3") + .arg(uiLanguage(NULL)).arg(latitude.udeg / 1000000.0).arg(longitude.udeg / 1000000.0)); + request.setRawHeader("Accept", "text/json"); + request.setRawHeader("User-Agent", getUserAgent().toUtf8()); + QNetworkReply *reply = rgl->get(request); + QEventLoop loop; + QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); + loop.exec(); + QJsonParseError errorObject; + QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &errorObject); + if (errorObject.error != QJsonParseError::NoError) { + qDebug() << errorObject.errorString(); + } else { + QJsonObject obj = jsonDoc.object(); + QJsonObject address = obj.value("address").toObject(); + qDebug() << "found country:" << address.value("country").toString(); + struct dive_site *ds = get_dive_site_by_uuid(uuid); + ds->notes = add_to_string(ds->notes, "countrytag: %s", address.value("country").toString().toUtf8().data()); + } +} + +QHash<QString, QByteArray> hashOf; +QMutex hashOfMutex; +QHash<QByteArray, QString> localFilenameOf; + +extern "C" char * hashstring(char * filename) +{ + return hashOf[QString(filename)].toHex().data(); +} + +void read_hashes() +{ + QFile hashfile(QString(system_default_directory()).append("/hashes")); + if (hashfile.open(QIODevice::ReadOnly)) { + QDataStream stream(&hashfile); + stream >> localFilenameOf; + hashfile.close(); + } +} + +void write_hashes() +{ + QSaveFile hashfile(QString(system_default_directory()).append("/hashes")); + if (hashfile.open(QIODevice::WriteOnly)) { + QDataStream stream(&hashfile); + stream << localFilenameOf; + hashfile.commit(); + } else { + qDebug() << "cannot open" << hashfile.fileName(); + } +} + +void add_hash(const QString filename, QByteArray hash) +{ + QMutexLocker locker(&hashOfMutex); + hashOf[filename] = hash; + localFilenameOf[hash] = filename; +} + +QByteArray hashFile(const QString filename) +{ + QCryptographicHash hash(QCryptographicHash::Sha1); + QFile imagefile(filename); + imagefile.open(QIODevice::ReadOnly); + hash.addData(&imagefile); + add_hash(filename, hash.result()); + return hash.result(); +} + +void learnHash(struct picture *picture, QByteArray hash) +{ + if (picture->hash) + free(picture->hash); + QMutexLocker locker(&hashOfMutex); + hashOf[QString(picture->filename)] = hash; + picture->hash = strdup(hash.toHex()); +} + +QString localFilePath(const QString originalFilename) +{ + if (hashOf.contains(originalFilename) && localFilenameOf.contains(hashOf[originalFilename])) + return localFilenameOf[hashOf[originalFilename]]; + else + return originalFilename; +} + +QString fileFromHash(char *hash) +{ + return localFilenameOf[QByteArray::fromHex(hash)]; +} + +void updateHash(struct picture *picture) { + QByteArray hash = hashFile(fileFromHash(picture->hash)); + QMutexLocker locker(&hashOfMutex); + hashOf[QString(picture->filename)] = hash; + char *old = picture->hash; + picture->hash = strdup(hash.toHex()); + free(old); +} + +void learnImages(const QDir dir, int max_recursions, bool recursed) +{ + QDir current(dir); + QStringList filters, files; + + if (max_recursions) { + foreach (QString dirname, dir.entryList(QStringList(), QDir::NoDotAndDotDot | QDir::Dirs)) { + learnImages(QDir(dir.filePath(dirname)), max_recursions - 1, true); + } + } + + foreach (QString format, QImageReader::supportedImageFormats()) { + filters.append(QString("*.").append(format)); + } + + foreach (QString file, dir.entryList(filters, QDir::Files)) { + files.append(dir.absoluteFilePath(file)); + } + + QtConcurrent::blockingMap(files, hashFile); +} + +extern "C" void picture_load_exif_data(struct picture *p) +{ + EXIFInfo exif; + memblock mem; + + if (readfile(localFilePath(QString(p->filename)).toUtf8().data(), &mem) <= 0) + goto picture_load_exit; + if (exif.parseFrom((const unsigned char *)mem.buffer, (unsigned)mem.size) != PARSE_EXIF_SUCCESS) + goto picture_load_exit; + p->longitude.udeg= lrint(1000000.0 * exif.GeoLocation.Longitude); + p->latitude.udeg = lrint(1000000.0 * exif.GeoLocation.Latitude); + +picture_load_exit: + free(mem.buffer); + return; +} diff --git a/qthelper.h b/qthelper.h index ccc57bc93..b0765aeda 100644 --- a/qthelper.h +++ b/qthelper.h @@ -7,14 +7,23 @@ #include "dive.h" #include "divelist.h" #include <QTranslator> +#include <QDir> // global pointers for our translation extern QTranslator *qtTranslator, *ssrfTranslator; QString weight_string(int weight_in_grams); bool gpsHasChanged(struct dive *dive, struct dive *master, const QString &gps_text, bool *parsed_out = 0); -QString printGPSCoords(int lat, int lon); +extern "C" const char *printGPSCoords(int lat, int lon); QList<int> getDivesInTrip(dive_trip_t *trip); QString gasToStr(struct gasmix gas); - +void read_hashes(); +void write_hashes(); +void updateHash(struct picture *picture); +QByteArray hashFile(const QString filename); +void learnImages(const QDir dir, int max_recursions, bool recursed); +void add_hash(const QString filename, QByteArray hash); +QString localFilePath(const QString originalFilename); +QString fileFromHash(char *hash); +void learnHash(struct picture *picture, QByteArray hash); #endif // QTHELPER_H diff --git a/save-git.c b/save-git.c index 6c2587bf8..a7b51446a 100644 --- a/save-git.c +++ b/save-git.c @@ -13,7 +13,7 @@ #include "dive.h" #include "device.h" #include "membuffer.h" -#include "ssrf-version.h" +#include "version.h" /* * handle libgit2 revision 0.20 and earlier @@ -104,8 +104,6 @@ static void show_utf8(struct membuffer *b, const char *prefix, const char *value static void save_overview(struct membuffer *b, struct dive *dive) { - show_gps(b, dive->latitude, dive->longitude); - show_utf8(b, "location ", dive->location, "\n"); show_utf8(b, "divemaster ", dive->divemaster, "\n"); show_utf8(b, "buddy ", dive->buddy, "\n"); show_utf8(b, "suit ", dive->suit, "\n"); @@ -390,6 +388,7 @@ static void create_dive_buffer(struct dive *dive, struct membuffer *b) SAVE("visibility", visibility); cond_put_format(dive->tripflag == NO_TRIP, b, "notrip\n"); save_tags(b, dive->tag_list); + cond_put_format(dive->dive_site_uuid, b, "divesiteid %08x\n", dive->dive_site_uuid); save_overview(b, dive); save_cylinder_info(b, dive); @@ -586,6 +585,7 @@ static int save_one_picture(git_repository *repo, struct dir *dir, struct pictur show_utf8(&buf, "filename ", pic->filename, "\n"); show_gps(&buf, pic->latitude, pic->longitude); + show_utf8(&buf, "hash ", pic->hash, "\n"); /* Picture loading will load even negative offsets.. */ if (offset < 0) { @@ -804,7 +804,7 @@ static void save_one_device(void *_b, const char *model, uint32_t deviceid, put_string(b, "\n"); } -#define VERSION 2 +#define VERSION 3 static void save_settings(git_repository *repo, struct dir *tree) { @@ -818,6 +818,38 @@ static void save_settings(git_repository *repo, struct dir *tree) blob_insert(repo, tree, &b, "00-Subsurface"); } +static void save_divesites(git_repository *repo, struct dir *tree) +{ + struct dir *subdir; + struct membuffer dirname = { 0 }; + put_format(&dirname, "01-Divesites"); + subdir = new_directory(repo, tree, &dirname); + + for (int i = 0; i < dive_site_table.nr; i++) { + struct membuffer b = { 0 }; + struct dive_site *ds = get_dive_site(i); + if (dive_site_is_empty(ds)) { + int j; + struct dive *d; + for_each_dive(j, d) { + if (d->dive_site_uuid == ds->uuid) + d->dive_site_uuid = 0; + } + delete_dive_site(get_dive_site(i)->uuid); + i--; // since we just deleted that one + continue; + } + int size = sizeof("Site-012345678"); + char name[size]; + snprintf(name, size, "Site-%08x", ds->uuid); + show_utf8(&b, "name ", ds->name, "\n"); + show_utf8(&b, "description ", ds->description, "\n"); + show_utf8(&b, "notes ", ds->notes, "\n"); + show_gps(&b, ds->latitude, ds->longitude); + blob_insert(repo, subdir, &b, name); + } +} + static int create_git_tree(git_repository *repo, struct dir *root, bool select_only) { int i; @@ -826,6 +858,8 @@ static int create_git_tree(git_repository *repo, struct dir *root, bool select_o save_settings(repo, root); + save_divesites(repo, root); + for (trip = dive_trip_list; trip != NULL; trip = trip->next) trip->index = 0; @@ -938,7 +972,7 @@ static void create_commit_message(struct membuffer *msg) if (dive) { dive_trip_t *trip = dive->divetrip; - const char *location = dive->location ? : "no location"; + const char *location = get_dive_location(dive) ? : "no location"; struct divecomputer *dc = &dive->dc; const char *sep = "\n"; @@ -957,7 +991,7 @@ static void create_commit_message(struct membuffer *msg) } while ((dc = dc->next) != NULL); put_format(msg, "\n"); } - put_format(msg, "Created by subsurface %s\n", VERSION_STRING); + put_format(msg, "Created by subsurface %s\n", subsurface_version()); } static int create_new_commit(git_repository *repo, const char *branch, git_oid *tree_id) @@ -1094,73 +1128,6 @@ static int do_git_save(git_repository *repo, const char *branch, bool select_onl return create_new_commit(repo, branch, &id); } -/* - * If it's not a git repo, return NULL. Be very conservative. - */ -struct git_repository *is_git_repository(const char *filename, const char **branchp) -{ - int flen, blen, ret; - struct stat st; - git_repository *repo; - char *loc, *branch; - - flen = strlen(filename); - if (!flen || filename[--flen] != ']') - return NULL; - - /* Find the matching '[' */ - blen = 0; - while (flen && filename[--flen] != '[') - blen++; - - if (!flen) - return NULL; - - /* - * This is the "point of no return": the name matches - * the git repository name rules, and we will no longer - * return NULL. - * - * We will either return "dummy_git_repository" and the - * branch pointer will have the _whole_ filename in it, - * or we will return a real git repository with the - * branch pointer being filled in with just the branch - * name. - * - * The actual git reading/writing routines can use this - * to generate proper error messages. - */ - *branchp = filename; - loc = malloc(flen+1); - if (!loc) - return dummy_git_repository; - memcpy(loc, filename, flen); - loc[flen] = 0; - - branch = malloc(blen+1); - if (!branch) { - free(loc); - return dummy_git_repository; - } - memcpy(branch, filename+flen+1, blen); - branch[blen] = 0; - - if (stat(loc, &st) < 0 || !S_ISDIR(st.st_mode)) { - free(loc); - free(branch); - return dummy_git_repository; - } - - ret = git_repository_open(&repo, loc); - free(loc); - if (ret < 0) { - free(branch); - return dummy_git_repository; - } - *branchp = branch; - return repo; -} - int git_save_dives(struct git_repository *repo, const char *branch, bool select_only) { int ret; diff --git a/save-html.c b/save-html.c index d67931d8f..d15ac962f 100644 --- a/save-html.c +++ b/save-html.c @@ -140,10 +140,12 @@ static void put_cylinder_HTML(struct membuffer *b, struct dive *dive) } if (cylinder->gasmix.o2.permille) { - put_format(b, "\"O2\":\"%u.%u%%\"", FRACTION(cylinder->gasmix.o2.permille, 10)); + put_format(b, "\"O2\":\"%u.%u%%\",", FRACTION(cylinder->gasmix.o2.permille, 10)); + put_format(b, "\"He\":\"%u.%u%%\"", FRACTION(cylinder->gasmix.he.permille, 10)); } else { write_attribute(b, "O2", "Air", ""); } + put_string(b, "}"); } @@ -172,8 +174,11 @@ void put_HTML_samples(struct membuffer *b, struct dive *dive) void put_HTML_coordinates(struct membuffer *b, struct dive *dive) { - degrees_t latitude = dive->latitude; - degrees_t longitude = dive->longitude; + struct dive_site *ds = get_dive_site_for_dive(dive); + if (!ds) + return; + degrees_t latitude = ds->latitude; + degrees_t longitude = ds->longitude; //don't put coordinates if in (0,0) if (!latitude.udeg && !longitude.udeg) @@ -304,7 +309,7 @@ void write_one_dive(struct membuffer *b, struct dive *dive, const char *photos_d put_format(b, "\"subsurface_number\":%d,", dive->number); put_HTML_date(b, dive, "\"date\":\"", "\","); put_HTML_time(b, dive, "\"time\":\"", "\","); - write_attribute(b, "location", dive->location, ", "); + write_attribute(b, "location", get_dive_location(dive), ", "); put_HTML_coordinates(b, dive); put_format(b, "\"rating\":%d,", dive->rating); put_format(b, "\"visibility\":%d,", dive->visibility); @@ -324,7 +329,7 @@ void write_one_dive(struct membuffer *b, struct dive *dive, const char *photos_d put_HTML_samples(b, dive); put_HTML_bookmarks(b, dive); write_dive_status(b, dive); - if (photos_dir) + if (photos_dir && strcmp(photos_dir, "")) save_photos(b, photos_dir, dive); write_divecomputers(b, dive); } diff --git a/save-xml.c b/save-xml.c index 8ca2bfd38..15c667d35 100644 --- a/save-xml.c +++ b/save-xml.c @@ -110,38 +110,8 @@ static void save_salinity(struct membuffer *b, struct divecomputer *dc) put_string(b, " />\n"); } -static void show_location(struct membuffer *b, struct dive *dive) -{ - degrees_t latitude = dive->latitude; - degrees_t longitude = dive->longitude; - - /* Should we write a location tag at all? */ - if (!(latitude.udeg || longitude.udeg) && !dive->location) - return; - - put_string(b, " <location"); - - /* - * Ok, theoretically I guess you could dive at - * exactly 0,0. But we don't support that. So - * if you do, just fudge it a bit, and say that - * you dove a few meters away. - */ - if (latitude.udeg || longitude.udeg) { - put_degrees(b, latitude, " gps='", " "); - put_degrees(b, longitude, "", "'"); - } - - /* Do we have a location name or should we write a empty tag? */ - if (dive->location && dive->location[0] != '\0') - show_utf8(b, dive->location, ">", "</location>\n", 0); - else - put_string(b, "/>\n"); -} - static void save_overview(struct membuffer *b, struct dive *dive) { - show_location(b, dive); show_utf8(b, dive->divemaster, " <divemaster>", "</divemaster>\n", 0); show_utf8(b, dive->buddy, " <buddy>", "</buddy>\n", 0); show_utf8(b, dive->notes, " <notes>", "</notes>\n", 0); @@ -389,6 +359,8 @@ static void save_dc(struct membuffer *b, struct dive *dive, struct divecomputer put_format(b, " </divecomputer>\n"); } +extern char * hashstring(char * filename); + static void save_picture(struct membuffer *b, struct picture *pic) { put_string(b, " <picture filename='"); @@ -407,10 +379,13 @@ static void save_picture(struct membuffer *b, struct picture *pic) put_degrees(b, pic->latitude, " gps='", " "); put_degrees(b, pic->longitude, "", "'"); } + if (hashstring(pic->filename)) + put_format(b, " hash='%s'", hashstring(pic->filename)); + put_string(b, "/>\n"); } -void save_one_dive(struct membuffer *b, struct dive *dive) +void save_one_dive_to_mb(struct membuffer *b, struct dive *dive) { struct divecomputer *dc; @@ -424,7 +399,8 @@ void save_one_dive(struct membuffer *b, struct dive *dive) if (dive->visibility) put_format(b, " visibility='%d'", dive->visibility); save_tags(b, dive->tag_list); - + if (dive->dive_site_uuid) + put_format(b, " divesiteid='%8x'", dive->dive_site_uuid); show_date(b, dive->when); put_format(b, " duration='%u:%02u min'>\n", FRACTION(dive->dc.duration.seconds, 60)); @@ -444,7 +420,7 @@ int save_dive(FILE *f, struct dive *dive) { struct membuffer buf = { 0 }; - save_one_dive(&buf, dive); + save_one_dive_to_mb(&buf, dive); flush_buffer(&buf, f); /* Error handling? */ return 0; @@ -469,7 +445,7 @@ static void save_trip(struct membuffer *b, dive_trip_t *trip) */ for_each_dive(i, dive) { if (dive->divetrip == trip) - save_one_dive(b, dive); + save_one_dive_to_mb(b, dive); } put_format(b, "</trip>\n"); @@ -507,7 +483,7 @@ static void save_one_device(void *_f, const char *model, uint32_t deviceid, put_format(b, "/>\n"); } -#define VERSION 2 +#define VERSION 3 int save_dives(const char *filename) { @@ -529,8 +505,34 @@ void save_dives_buffer(struct membuffer *b, const bool select_only) call_for_each_dc(b, save_one_device); if (autogroup) put_format(b, " <autogroup state='1' />\n"); - put_format(b, "</settings>\n<dives>\n"); - + put_format(b, "</settings>\n"); + + /* save the dive sites */ + put_format(b, "<divesites>\n"); + for (i = 0; i < dive_site_table.nr; i++) { + struct dive_site *ds = get_dive_site(i); + if (dive_site_is_empty(ds)) { + int j; + struct dive *d; + for_each_dive(j, d) { + if (d->dive_site_uuid == ds->uuid) + d->dive_site_uuid = 0; + } + delete_dive_site(get_dive_site(i)->uuid); + i--; // since we just deleted that one + continue; + } + put_format(b, "<site uuid='%8x'", ds->uuid); + show_utf8(b, ds->name, " name='", "'", 1); + if (ds->latitude.udeg || ds->longitude.udeg) { + put_degrees(b, ds->latitude, " gps='", " "); + put_degrees(b, ds->longitude, "", "'"); + } + show_utf8(b, ds->description, " description='", "'", 1); + show_utf8(b, ds->notes, " notes='", "'", 1); + put_format(b, "/>\n"); + } + put_format(b, "</divesites>\n<dives>\n"); for (trip = dive_trip_list; trip != NULL; trip = trip->next) trip->index = 0; @@ -540,14 +542,14 @@ void save_dives_buffer(struct membuffer *b, const bool select_only) if (!dive->selected) continue; - save_one_dive(b, dive); + save_one_dive_to_mb(b, dive); } else { trip = dive->divetrip; /* Bare dive without a trip? */ if (!trip) { - save_one_dive(b, dive); + save_one_dive_to_mb(b, dive); continue; } @@ -605,7 +607,15 @@ static void try_to_backup(const char *filename) while (extension[i][0] != '\0') { int elen = strlen(extension[i]); if (strcasecmp(filename + flen - elen, extension[i]) == 0) { - save_backup(filename, extension[i], "bak"); + if (last_xml_version < VERSION) { + int se_len = strlen(extension[i]) + 5; + char *special_ext = malloc(se_len); + snprintf(special_ext, se_len, "%s.v%d", extension[i], last_xml_version); + save_backup(filename, extension[i], special_ext); + free(special_ext); + } else { + save_backup(filename, extension[i], "bak"); + } break; } i++; diff --git a/scripts/build.sh b/scripts/build.sh index 9ea0f4f76..f4db5518d 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -8,32 +8,27 @@ # /libdivecomputer # # the script will build these three libraries from source, even if -# they are installed as part of the host OS since we have seen +# they are installed as part of the host OS since we have seen # numerous cases where building with random versions (especially older, # but sometimes also newer versions than recommended here) will lead # to all kinds of unnecessary pain +# +# it installs the libraries and subsurface in the install-root subdirectory +# of the current directory (except on Mac where the Subsurface.app ends up +# in subsurface/build SRC=$(pwd) +PLATFORM=$(uname) + if [[ ! -d "subsurface" ]] ; then echo "please start this script from the directory containing the Subsurface source directory" exit 1 fi -# qmake or qmake-qt5 ? -qmake -v | grep "version 5" > /dev/null 2>&1 -if [[ $? -eq 0 ]] ; then - QMAKE=qmake -else - qmake-qt5 -v | grep "version 5" > /dev/null 2>&1 - if [[ $? -eq 0 ]] ; then - QMAKE=qmake-qt5 - else - echo "can't find a working qmake for Qt5" - exit 1 - fi -fi +mkdir -p install-root +INSTALL_ROOT=$SRC/install-root -mkdir -p install +echo Building in $SRC, installing in $INSTALL_ROOT # build libgit2 @@ -45,12 +40,22 @@ if [ ! -d libgit2 ] ; then fi fi cd libgit2 -git checkout v0.21.5 +git checkout v0.22.0 mkdir -p build cd build -cmake -DCMAKE_INSTALL_PREFIX=$SRC/install -DCMAKE_BUILD_TYPE=Release -DBUILD_CLAR=OFF .. +cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_ROOT -DCMAKE_BUILD_TYPE=Release -DBUILD_CLAR=OFF .. cmake --build . --target install +if [ $PLATFORM = Darwin ] ; then + # in order for macdeployqt to do its job correctly, we need the full path in the dylib ID + cd $INSTALL_ROOT/lib + NAME=$(otool -L libgit2.dylib | grep -v : | head -1 | cut -f1 -d\ | tr -d '\t') + echo $NAME | grep / > /dev/null 2>&1 + if [ $? -eq 1 ] ; then + install_name_tool -id "$INSTALL_ROOT/lib/$NAME" "$INSTALL_ROOT/lib/$NAME" + fi +fi + cd $SRC # build libdivecomputer @@ -66,8 +71,8 @@ cd libdivecomputer git checkout Subsurface-4.4 if [ ! -f configure ] ; then autoreconf --install - ./configure --prefix=$SRC/install fi +./configure --prefix=$INSTALL_ROOT make -j4 make install @@ -87,7 +92,7 @@ git checkout Subsurface-4.4 mkdir -p build cd build cmake -DCMAKE_BUILD_TYPE=Release -DQTONLY=TRUE -DQT5BUILD=ON \ - -DCMAKE_INSTALL_PREFIX=$SRC/install \ + -DCMAKE_INSTALL_PREFIX=$INSTALL_ROOT \ -DBUILD_MARBLE_TESTS=NO \ -DWITH_DESIGNER_PLUGIN=NO \ -DBUILD_MARBLE_APPS=NO \ @@ -96,7 +101,22 @@ cd src/lib/marble make -j4 make install +if [ $PLATFORM = Darwin ] ; then + SH_LIB_EXT=dylib +else + SH_LIB_EXT=so +fi + cd $SRC/subsurface -$QMAKE CONFIG+=setRpath LIBDCDEVEL=1 LIBMARBLEDEVEL=$SRC/install SPECIAL_MARBLE_PREFIX=1 LIBGIT2DEVEL=$SRC/libgit2 subsurface.pro -make -j4 +mkdir -p build +cd build +cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$INSTALL_ROOT .. \ + -DLIBGIT2_INCLUDE_DIR=$INSTALL_ROOT/include \ + -DLIBGIT2_LIBRARIES=$INSTALL_ROOT/lib/libgit2.$SH_LIB_EXT \ + -DLIBDIVECOMPUTER_INCLUDE_DIR=$INSTALL_ROOT/include \ + -DLIBDIVECOMPUTER_LIBRARIES=$INSTALL_ROOT/lib/libdivecomputer.a \ + -DMARBLE_INCLUDE_DIR=$INSTALL_ROOT/include \ + -DMARBLE_LIBRARIES=$INSTALL_ROOT/lib/libssrfmarblewidget.$SH_LIB_EXT +make -j4 +make install diff --git a/scripts/get-version b/scripts/get-version index eb93a3322..27f02f640 100755 --- a/scripts/get-version +++ b/scripts/get-version @@ -19,7 +19,7 @@ if [ $# -eq 2 ] && [ "$2" ]; then v0=$2 else cmd="git describe --tags --abbrev=12" - v0=$($cmd) || croak "odd; command '$cmd' failed" + v0=$($cmd) || v0=$(cat .gitversion) || croak "odd; command '$cmd' failed" fi # strip off the 'v' prefix, if any diff --git a/scripts/write-version b/scripts/write-version new file mode 100644 index 000000000..81562fbb8 --- /dev/null +++ b/scripts/write-version @@ -0,0 +1,49 @@ +#!/bin/sh + +# +# arguments: +# $1 - target H file +# $2 - fallback version string +# $3 - os name {linux|darwin|win} +# +# doesn't have much error checking! +# should be started from where .git is! +# + +if [ "$#" -lt 3 ]; then + echo "ERROR: missing arguments"; + exit 1; +fi + +# set OS and TARGET +TARGET=$1 +TARGET_TEMP=$TARGET.tmp +VERSION=$2 +OS=$3 + +# get the full version: git based or hardcoded from .gitversion or the fallback version string +if gitpwd=`git rev-parse --show-toplevel 2> /dev/null`; then + FULL_VER=`sh "$gitpwd/scripts/get-version" linux` +else + FULL_VER=`cat .gitversion 2> /dev/null || echo $VERSION` +fi + +# grab some strings from get-version +CANONICAL_VER=`sh ./scripts/get-version full $FULL_VER` +OS_USABLE_VER=`sh ./scripts/get-version $OS $FULL_VER` + +# write to a temp file +echo "#define VERSION_STRING \"$OS_USABLE_VER\"" > $TARGET_TEMP +echo "#define GIT_VERSION_STRING \"$FULL_VER\"" >> $TARGET_TEMP +echo "#define CANONICAL_VERSION_STRING \"$CANONICAL_VER\"" >> $TARGET_TEMP + +# if the target file is missing create it +if [ ! -f $TARGET ]; then + CMD=`touch $TARGET` +fi + +# if the temp file and the target file differ, replace the target file with the temp file +CMD=`diff -q $TARGET $TARGET_TEMP || cp $TARGET_TEMP $TARGET` + +# remove the temp file +CMD=`rm -f $TARGET_TEMP` diff --git a/statistics.c b/statistics.c index 17176f714..1b2a1a6d3 100644 --- a/statistics.c +++ b/statistics.c @@ -306,7 +306,8 @@ bool is_cylinder_used(struct dive *dive, int idx) for_each_dc(dive, dc) { struct event *event = get_next_event(dc->events, "gaschange"); while (event) { - if (dc->sample && event->time.seconds == dc->sample[0].time.seconds) + if (dc->sample && (event->time.seconds == 0 || + (dc->samples && dc->sample[0].time.seconds == event->time.seconds))) firstGasExplicit = true; if (get_cylinder_index(dive, event) == idx) return true; diff --git a/subsurface-configure.pri b/subsurface-configure.pri index 9c0cfdfc5..4ec44e82c 100644 --- a/subsurface-configure.pri +++ b/subsurface-configure.pri @@ -141,7 +141,11 @@ isEmpty(LIBGIT2DEVEL) { setRpath: QMAKE_RPATHDIR += $$LIBGIT2DEVEL/build LIBS += -L$$LIBGIT2DEVEL/build -lgit2 -lz -lcrypto } else { - LIBS += $$LIBGIT2DEVEL/build/libgit2.a -Wl,-Bstatic -lz -lssl -lcrypto -Wl,-Bdynamic -ldl + contains(LIBGIT2STATIC, "full") { + LIBS += $$LIBGIT2DEVEL/build/libgit2.a -Wl,-Bstatic -lz -lssl -lcrypto -Wl,-Bdynamic -ldl + } else { + LIBS += $$LIBGIT2DEVEL/build/libgit2.a -lz -lssl -lcrypto + } } } diff --git a/subsurface-gen-version.pri b/subsurface-gen-version.pri index 7d4cda513..1e62b0d6d 100644 --- a/subsurface-gen-version.pri +++ b/subsurface-gen-version.pri @@ -1,40 +1,23 @@ # Generate the ssrf-version.h file -VERSION_FILE = ssrf-version.h macx: VER_OS = darwin unix: !macx: VER_OS = linux win32: VER_OS = win -exists(.git/HEAD): { - win32: SET_GIT_DIR = set GIT_DIR - else: SET_GIT_DIR = GIT_DIR - GIT_HEAD = .git/HEAD - VERSION_SCRIPT = $$PWD/scripts/get-version - # always use linux here -------------------vvv so we get the true full version - FULL_VERSION = "`$$VERSION_SCRIPT linux`" - VERSION = $$system("sh scripts/get-version full || echo $${VERSION}") - PRODVERSION_STRING = $$system("sh scripts/get-version win $$FULL_VERSION || echo $${VERSION}.0.0-git") - VERSION_STRING = $$system("sh scripts/get-version linux $$FULL_VERSION || echo $${VERSION}-git") - version_h.depends = $$VERSION_SCRIPT $$PWD/.git/$$system("$$SET_GIT_DIR=$$PWD/.git git rev-parse --symbolic-full-name HEAD") - version_h.commands = echo \\$${LITERAL_HASH}define VERSION_STRING \\\"`GIT_DIR=$$PWD/.git $$VERSION_SCRIPT $$VER_OS || echo $$VERSION-git`\\\" > ${QMAKE_FILE_OUT} - version_h.commands += $$escape_expand(\\n)$$escape_expand(\\t) - version_h.commands += echo \\$${LITERAL_HASH}define GIT_VERSION_STRING \\\"`GIT_DIR=$$PWD/.git $$VERSION_SCRIPT linux || echo $$VERSION-git`\\\" >> ${QMAKE_FILE_OUT} - version_h.commands += $$escape_expand(\\n)$$escape_expand(\\t) - version_h.commands += echo \\$${LITERAL_HASH}define CANONICAL_VERSION_STRING \\\"`GIT_DIR=$$PWD/.git $$VERSION_SCRIPT full || echo $$VERSION-git`\\\" >> ${QMAKE_FILE_OUT} - version_h.input = GIT_HEAD - version_h.output = $$VERSION_FILE - version_h.variable_out = GENERATED_FILES - version_h.CONFIG = ignore_no_exist - QMAKE_EXTRA_COMPILERS += version_h -} else { - # This is probably a package - exists(.gitversion): { - FULL_VERSION = $$system("cat .gitversion") - } else { - FULL_VERSION = $$VERSION - } - CANONICAL_VERSION = $$system("sh scripts/get-version full $$FULL_VERSION") - OS_USABLE_VERSION = $$system("sh scripts/get-version $$VER_OS $$FULL_VERSION") - system(echo \\$${LITERAL_HASH}define VERSION_STRING \\\"$$OS_USABLE_VERSION\\\" > $$VERSION_FILE) - system(echo \\$${LITERAL_HASH}define GIT_VERSION_STRING \\\"$$FULL_VERSION\\\" >> $$VERSION_FILE) - system(echo \\$${LITERAL_HASH}define CANONICAL_VERSION_STRING \\\"$$CANONICAL_VERSION\\\" >> $$VERSION_FILE) - QMAKE_CLEAN += $$VERSION_FILE -} + +# use a compiler target that has a phony input and is forced on each `make` invocation +# the resulted file is not a link target and is cleared with `make clean` +PHONY_DEPS = . +version_h.input = PHONY_DEPS +version_h.depends = FORCE +version_h.output = $$VERSION_FILE +version_h.commands = cd $$PWD && sh $$PWD/scripts/write-version $$VERSION_FILE $$VERSION $$VER_OS +silent: version_h.commands = @echo Checking $$VERSION_FILE && $$version_h.commands +version_h.CONFIG += no_link +QMAKE_EXTRA_COMPILERS += version_h +QMAKE_CLEAN += $$VERSION_FILE + +# some qmake-time variables needed by subsurface-install.pri +VERSION_SCRIPT = sh scripts/get-version +FULL_VERSION = $$system("$$VERSION_SCRIPT linux") +VERSION = $$system("$$VERSION_SCRIPT full || echo $${VERSION}") +PRODVERSION_STRING = $$system("$$VERSION_SCRIPT win $$FULL_VERSION || echo $${VERSION}.0.0-git") +VERSION_STRING = $$system("$$VERSION_SCRIPT linux $$FULL_VERSION || echo $${VERSION}-git") diff --git a/subsurface.1 b/subsurface.1 deleted file mode 100644 index d5a38f3ee..000000000 --- a/subsurface.1 +++ /dev/null @@ -1,32 +0,0 @@ -.TH subsurface 1 "Dec 15, 2013" -.SH NAME -subsurface \- a logbook program for scuba divers -.SH SYNOPSIS -.B subsurface -[options] [FILE...] [\-import] [FILE...] -.SH DESCRIPTION -.B subsurface -allows you to manage your dive logs that you can download from your dive computer or import from existing XML files. -.PP -You can click on the column headings to sort the dives based on this column. -.PP -Additional dives that get imported will be assigned numbers if they -don't already have numbers, are after all currently stored dives and -the last of those dives is numbered. -.PP -For full usage information see Subsurface User Manual, available on-line -at http://subsurface-divelog.org/ and locally under Help menu. -.SH OPTIONS -.B \-v -show more output during processing -.PP -.B \-\-import -all further files should be processed as import, not open -.PP -.B \-\-help -command line usage help -.PP -.B \-\-version -print Subsurface version information -.SH BUGS -If you find bugs, report at http://trac.subsurface-divelog.org diff --git a/subsurface.pro b/subsurface.pro index 331c9735a..d052d9639 100644 --- a/subsurface.pro +++ b/subsurface.pro @@ -20,8 +20,13 @@ else: TARGET = subsurface QMAKE_CLEAN += $$TARGET VERSION = 4.4.2 +VERSION_FILE = $$OUT_PWD/ssrf-version.h +# create a blank VERSION_FILE if missing +system(cat $$VERSION_FILE > /dev/null 2>&1 || touch $$VERSION_FILE) HEADERS = \ + $$VERSION_FILE \ + version.h \ cochran.h \ color.h \ deco.h \ @@ -29,6 +34,7 @@ HEADERS = \ display.h \ dive.h \ divelist.h \ + divesite.h \ file.h \ gettextfromc.h \ gettext.h \ @@ -99,12 +105,15 @@ HEADERS = \ configuredivecomputer.h \ configuredivecomputerthreads.h \ devicedetails.h \ + datatrak.h \ qt-ui/statistics/monthstatistics.h \ qt-ui/statistics/statisticswidget.h \ qt-ui/statistics/statisticsbar.h \ qt-ui/statistics/yearstatistics.h \ qt-ui/diveshareexportdialog.h \ - qt-ui/filtermodels.h + qt-ui/filtermodels.h \ + qt-ui/undocommands.h \ + qt-ui/notificationwidget.h android: HEADERS -= \ qt-ui/usermanual.h \ @@ -113,14 +122,18 @@ android: HEADERS -= \ qt-ui/printoptions.h SOURCES = \ + version.c \ cochran.c \ + datatrak.c \ deco.c \ device.c \ dive.c \ divelist.c \ + divesite.c \ equipment.c \ file.c \ gettextfromc.cpp \ + git-access.c \ libdivecomputer.c \ liquivision.c \ load-git.c \ @@ -198,7 +211,10 @@ SOURCES = \ qt-ui/statistics/statisticsbar.cpp \ qt-ui/statistics/monthstatistics.cpp \ qt-ui/diveshareexportdialog.cpp \ - qt-ui/filtermodels.cpp + qt-ui/filtermodels.cpp \ + qt-ui/undocommands.cpp \ + qt-ui/notificationwidget.cpp \ + ostctools.c android: SOURCES += android.cpp else: win32: SOURCES += windows.c @@ -235,7 +251,10 @@ FORMS = \ qt-ui/configuredivecomputerdialog.ui \ qt-ui/listfilter.ui \ qt-ui/diveshareexportdialog.ui \ - qt-ui/filterwidget.ui + qt-ui/filterwidget.ui \ + qt-ui/plannerDetails.ui \ + qt-ui/urldialog.ui \ + qt-ui/locationInformation.ui # Nether usermanual or printing is supported on android right now android: FORMS -= qt-ui/printoptions.ui diff --git a/subsurfacestartup.c b/subsurfacestartup.c index 0722e954e..886365a16 100644 --- a/subsurfacestartup.c +++ b/subsurfacestartup.c @@ -1,5 +1,5 @@ #include "subsurfacestartup.h" -#include "ssrf-version.h" +#include "version.h" #include <stdbool.h> #include <string.h> #include "gettext.h" @@ -7,6 +7,7 @@ struct preferences prefs; struct preferences default_prefs = { .units = SI_UNITS, .unit_system = METRIC, + .coordinates_traditional = true, .pp_graphs = { .po2 = false, .pn2 = false, @@ -45,8 +46,16 @@ struct preferences default_prefs = { .decopo2 = 1600, .doo2breaks = false, .drop_stone_mode = false, + .last_stop = false, + .verbatim_plan = false, + .display_runtime = true, + .display_duration = true, + .display_transitions = true, + .recreational_mode = false, + .safetystop = true, .bottomsac = 20000, .decosac = 17000, + .reserve_gas=40000, .o2consumption = 720, .pscr_ratio = 100, .show_pictures_in_profile = true, @@ -110,7 +119,7 @@ bool imported = false; static void print_version() { - printf("Subsurface v%s, ", GIT_VERSION_STRING); + printf("Subsurface v%s, ", subsurface_git_version()); printf("built with libdivecomputer v%s\n", dc_version(NULL)); } diff --git a/subsurfacesysinfo.cpp b/subsurfacesysinfo.cpp index 4a55e7315..58301b0c8 100644 --- a/subsurfacesysinfo.cpp +++ b/subsurfacesysinfo.cpp @@ -42,16 +42,19 @@ #include "subsurfacesysinfo.h" #include <QString> -#include <QFile> -#include <QSettings> -#include <QTextStream> + +#ifdef Q_OS_UNIX +#include <sys/utsname.h> +#endif + +#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0) #ifndef QStringLiteral # define QStringLiteral QString::fromUtf8 #endif #ifdef Q_OS_UNIX -#include <sys/utsname.h> +#include <qplatformdefs.h> #endif #ifdef __APPLE__ @@ -132,6 +135,7 @@ #define ARCH_FULL ARCH_PROCESSOR "-" ARCH_ENDIANNESS "-" ARCH_POINTER ARCH_ABI // --- end of archdetect.cpp --- +// copied from Qt 5.4.1's src/corelib/global/qglobal.cpp #if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN) || defined(Q_OS_WINCE) || defined(Q_OS_WINRT) @@ -140,33 +144,50 @@ QT_BEGIN_INCLUDE_NAMESPACE QT_END_INCLUDE_NAMESPACE #ifndef Q_OS_WINRT +# ifndef Q_OS_WINCE +// Fallback for determining Windows versions >= 8 by looping using the +// version check macros. Note that it will return build number=0 to avoid +// inefficient looping. +static inline void determineWinOsVersionFallbackPost8(OSVERSIONINFO *result) +{ + result->dwBuildNumber = 0; + DWORDLONG conditionMask = 0; + VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); + VER_SET_CONDITION(conditionMask, VER_PLATFORMID, VER_EQUAL); + OSVERSIONINFOEX checkVersion = { sizeof(OSVERSIONINFOEX), result->dwMajorVersion, 0, + result->dwBuildNumber, result->dwPlatformId, {'\0'}, 0, 0, 0, 0, 0 }; + for ( ; VerifyVersionInfo(&checkVersion, VER_MAJORVERSION | VER_PLATFORMID, conditionMask); ++checkVersion.dwMajorVersion) + result->dwMajorVersion = checkVersion.dwMajorVersion; + conditionMask = 0; + checkVersion.dwMajorVersion = result->dwMajorVersion; + checkVersion.dwMinorVersion = 0; + VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_EQUAL); + VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); + VER_SET_CONDITION(conditionMask, VER_PLATFORMID, VER_EQUAL); + for ( ; VerifyVersionInfo(&checkVersion, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID, conditionMask); ++checkVersion.dwMinorVersion) + result->dwMinorVersion = checkVersion.dwMinorVersion; +} + +# endif // !Q_OS_WINCE + static inline OSVERSIONINFO winOsVersion() { OSVERSIONINFO result = { sizeof(OSVERSIONINFO), 0, 0, 0, 0, {'\0'}}; // GetVersionEx() has been deprecated in Windows 8.1 and will return // only Windows 8 from that version on. -# if defined(_MSC_VER) && _MSC_VER >= 1800 -# pragma warning( push ) -# pragma warning( disable : 4996 ) -# endif +# if defined(_MSC_VER) && _MSC_VER >= 1800 +# pragma warning( push ) +# pragma warning( disable : 4996 ) +# endif GetVersionEx(&result); -# if defined(_MSC_VER) && _MSC_VER >= 1800 -# pragma warning( pop ) -# endif -# ifndef Q_OS_WINCE - if (result.dwMajorVersion == 6 && result.dwMinorVersion == 2) { - // This could be Windows 8.1 or higher. Note that as of Windows 9, - // the major version needs to be checked as well. - DWORDLONG conditionMask = 0; - VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION(conditionMask, VER_PLATFORMID, VER_EQUAL); - OSVERSIONINFOEX checkVersion = { sizeof(OSVERSIONINFOEX), result.dwMajorVersion, result.dwMinorVersion, - result.dwBuildNumber, result.dwPlatformId, {'\0'}, 0, 0, 0, 0, 0 }; - for ( ; VerifyVersionInfo(&checkVersion, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID, conditionMask); ++checkVersion.dwMinorVersion) - result.dwMinorVersion = checkVersion.dwMinorVersion; - } -# endif // !Q_OS_WINCE +# if defined(_MSC_VER) && _MSC_VER >= 1800 +# pragma warning( pop ) +# endif +# ifndef Q_OS_WINCE + if (result.dwMajorVersion == 6 && result.dwMinorVersion == 2) { + determineWinOsVersionFallbackPost8(&result); + } +# endif // !Q_OS_WINCE return result; } #endif // !Q_OS_WINRT @@ -206,105 +227,217 @@ static const char *winVer_helper() #endif #if defined(Q_OS_UNIX) -# if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD) -# define USE_ETC_OS_RELEASE -# endif +# if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD) +# define USE_ETC_OS_RELEASE struct QUnixOSVersion { - // from uname(2) - QString sysName; - QString sysNameLower; - QString sysRelease; - -# if !defined(Q_OS_ANDROID) && !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_MAC) - // from /etc/os-release or guessed - QString versionIdentifier; // ${ID}_$VERSION_ID - QString versionText; // $PRETTY_NAME -# endif + // from /etc/os-release + QString productType; // $ID + QString productVersion; // $VERSION_ID + QString prettyName; // $PRETTY_NAME }; +static QString unquote(const char *begin, const char *end) +{ + if (*begin == '"') { + Q_ASSERT(end[-1] == '"'); + return QString::fromLatin1(begin + 1, end - begin - 2); + } + return QString::fromLatin1(begin, end - begin); +} -#ifdef USE_ETC_OS_RELEASE static bool readEtcOsRelease(QUnixOSVersion &v) { - QFile osRelease("/etc/os-release"); - if (osRelease.exists()) { - QSettings parse("/etc/os-release", QSettings::IniFormat); - if (parse.contains("PRETTY_NAME")) { - v.versionText = parse.value("PRETTY_NAME").toString(); - } - return true; + // we're avoiding QFile here + int fd = QT_OPEN("/etc/os-release", O_RDONLY); + if (fd == -1) + return false; + + QT_STATBUF sbuf; + if (QT_FSTAT(fd, &sbuf) == -1) { + QT_CLOSE(fd); + return false; } - QFile lsbRelease("/etc/lsb-release"); - if (lsbRelease.exists()) { - QSettings parse("/etc/lsb-release", QSettings::IniFormat); - if (parse.contains("DISTRIB_DESCRIPTION")) { - v.versionText = parse.value("DISTRIB_DESCRIPTION").toString(); - if (v.versionText == "PCLinuxOS") { - QFile release("/etc/release"); - if (release.exists()) { - if (release.open(QFile::ReadOnly | QFile::Text)) { - QTextStream in(&release); - v.versionText = in.readAll(); - // need to get rid of the redundant text after '(' - int i = v.versionText.indexOf('('); - v.versionText.remove(i, 1000); - } - } - } + + QByteArray buffer(sbuf.st_size, Qt::Uninitialized); + buffer.resize(QT_READ(fd, buffer.data(), sbuf.st_size)); + QT_CLOSE(fd); + + const char *ptr = buffer.constData(); + const char *end = buffer.constEnd(); + const char *eol; + for ( ; ptr != end; ptr = eol + 1) { + static const char idString[] = "ID="; + static const char prettyNameString[] = "PRETTY_NAME="; + static const char versionIdString[] = "VERSION_ID="; + + // find the end of the line after ptr + eol = static_cast<const char *>(memchr(ptr, '\n', end - ptr)); + if (!eol) + eol = end - 1; + + // note: we're doing a binary search here, so comparison + // must always be sorted + int cmp = strncmp(ptr, idString, strlen(idString)); + if (cmp < 0) + continue; + if (cmp == 0) { + ptr += strlen(idString); + v.productType = unquote(ptr, eol); + continue; + } + + cmp = strncmp(ptr, prettyNameString, strlen(prettyNameString)); + if (cmp < 0) + continue; + if (cmp == 0) { + ptr += strlen(prettyNameString); + v.prettyName = unquote(ptr, eol); + continue; + } + + cmp = strncmp(ptr, versionIdString, strlen(versionIdString)); + if (cmp < 0) + continue; + if (cmp == 0) { + ptr += strlen(versionIdString); + v.productVersion = unquote(ptr, eol); + continue; } - return true; } - return false; + + return true; } -#endif // USE_ETC_OS_RELEASE +# endif // USE_ETC_OS_RELEASE +#endif // Q_OS_UNIX -static QUnixOSVersion detectUnixVersion() +static QString unknownText() { - QUnixOSVersion v; - struct utsname u; - if (uname(&u) != -1) { - v.sysName = QString::fromLatin1(u.sysname); - v.sysNameLower = v.sysName.toLower(); - v.sysRelease = QString::fromLatin1(u.release); - } else { - v.sysName = QLatin1String("Detection failed"); - // leave sysNameLower & sysRelease unset - } + return QStringLiteral("unknown"); +} -# if !defined(Q_OS_ANDROID) && !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_MAC) -# ifdef USE_ETC_OS_RELEASE - if (readEtcOsRelease(v)) - return v; -# endif +QString SubsurfaceSysInfo::buildCpuArchitecture() +{ + return QStringLiteral(ARCH_PROCESSOR); +} - if (!v.sysNameLower.isEmpty()) { - // will produce "qnx_6.5" or "sunos_5.9" - v.versionIdentifier = v.sysNameLower + QLatin1Char('_') + v.sysRelease; +QString SubsurfaceSysInfo::currentCpuArchitecture() +{ +#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) + // We don't need to catch all the CPU architectures in this function; + // only those where the host CPU might be different than the build target + // (usually, 64-bit platforms). + SYSTEM_INFO info; + GetNativeSystemInfo(&info); + switch (info.wProcessorArchitecture) { +# ifdef PROCESSOR_ARCHITECTURE_AMD64 + case PROCESSOR_ARCHITECTURE_AMD64: + return QStringLiteral("x86_64"); +# endif +# ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 + case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: +# endif + case PROCESSOR_ARCHITECTURE_IA64: + return QStringLiteral("ia64"); } +#elif defined(Q_OS_UNIX) + long ret = -1; + struct utsname u; + +# if defined(Q_OS_SOLARIS) + // We need a special call for Solaris because uname(2) on x86 returns "i86pc" for + // both 32- and 64-bit CPUs. Reference: + // http://docs.oracle.com/cd/E18752_01/html/816-5167/sysinfo-2.html#REFMAN2sysinfo-2 + // http://fxr.watson.org/fxr/source/common/syscall/systeminfo.c?v=OPENSOLARIS + // http://fxr.watson.org/fxr/source/common/conf/param.c?v=OPENSOLARIS;im=10#L530 + if (ret == -1) + ret = sysinfo(SI_ARCHITECTURE_64, u.machine, sizeof u.machine); # endif - return v; -} + if (ret == -1) + ret = uname(&u); + + // we could use detectUnixVersion() above, but we only need a field no other function does + if (ret != -1) { + // the use of QT_BUILD_INTERNAL here is simply to ensure all branches build + // as we don't often build on some of the less common platforms +# if defined(Q_PROCESSOR_ARM) || defined(QT_BUILD_INTERNAL) + if (strcmp(u.machine, "aarch64") == 0) + return QStringLiteral("arm64"); + if (strncmp(u.machine, "armv", 4) == 0) + return QStringLiteral("arm"); +# endif +# if defined(Q_PROCESSOR_POWER) || defined(QT_BUILD_INTERNAL) + // harmonize "powerpc" and "ppc" to "power" + if (strncmp(u.machine, "ppc", 3) == 0) + return QLatin1String("power") + QLatin1String(u.machine + 3); + if (strncmp(u.machine, "powerpc", 7) == 0) + return QLatin1String("power") + QLatin1String(u.machine + 7); + if (strcmp(u.machine, "Power Macintosh") == 0) + return QLatin1String("power"); +# endif +# if defined(Q_PROCESSOR_SPARC) || defined(QT_BUILD_INTERNAL) + // Solaris sysinfo(2) (above) uses "sparcv9", but uname -m says "sun4u"; + // Linux says "sparc64" + if (strcmp(u.machine, "sun4u") == 0 || strcmp(u.machine, "sparc64") == 0) + return QStringLiteral("sparcv9"); + if (strcmp(u.machine, "sparc32") == 0) + return QStringLiteral("sparc"); +# endif +# if defined(Q_PROCESSOR_X86) || defined(QT_BUILD_INTERNAL) + // harmonize all "i?86" to "i386" + if (strlen(u.machine) == 4 && u.machine[0] == 'i' + && u.machine[2] == '8' && u.machine[3] == '6') + return QStringLiteral("i386"); + if (strcmp(u.machine, "amd64") == 0) // Solaris + return QStringLiteral("x86_64"); +# endif + return QString::fromLatin1(u.machine); + } #endif + return buildCpuArchitecture(); +} -static QString unknownText() + +QString SubsurfaceSysInfo::buildAbi() { - return QStringLiteral("unknown"); + return QLatin1String(ARCH_FULL); } -QString SubsurfaceSysInfo::cpuArchitecture() +QString SubsurfaceSysInfo::kernelType() { - return QStringLiteral(ARCH_PROCESSOR); +#if defined(Q_OS_WINCE) + return QStringLiteral("wince"); +#elif defined(Q_OS_WIN) + return QStringLiteral("winnt"); +#elif defined(Q_OS_UNIX) + struct utsname u; + if (uname(&u) == 0) + return QString::fromLatin1(u.sysname).toLower(); +#endif + return unknownText(); } -QString SubsurfaceSysInfo::fullCpuArchitecture() +QString SubsurfaceSysInfo::kernelVersion() { - return QLatin1String(ARCH_FULL); +#ifdef Q_OS_WINRT + // TBD + return QString(); +#elif defined(Q_OS_WIN) + const OSVERSIONINFO osver = winOsVersion(); + return QString::number(int(osver.dwMajorVersion)) + QLatin1Char('.') + QString::number(int(osver.dwMinorVersion)) + + QLatin1Char('.') + QString::number(int(osver.dwBuildNumber)); +#else + struct utsname u; + if (uname(&u) == 0) + return QString::fromLatin1(u.release); + return QString(); +#endif } -QString SubsurfaceSysInfo::osType() +QString SubsurfaceSysInfo::productType() { + // similar, but not identical to QFileSelectorPrivate::platformSelectors #if defined(Q_OS_WINPHONE) return QStringLiteral("winphone"); #elif defined(Q_OS_WINRT) @@ -321,8 +454,6 @@ QString SubsurfaceSysInfo::osType() #elif defined(Q_OS_ANDROID) return QStringLiteral("android"); -#elif defined(Q_OS_LINUX) - return QStringLiteral("linux"); #elif defined(Q_OS_IOS) return QStringLiteral("ios"); @@ -331,31 +462,16 @@ QString SubsurfaceSysInfo::osType() #elif defined(Q_OS_DARWIN) return QStringLiteral("darwin"); -#elif defined(Q_OS_FREEBSD_KERNEL) - return QStringLiteral("freebsd"); -#elif defined(Q_OS_UNIX) - QUnixOSVersion unixOsVersion = detectUnixVersion(); - if (!unixOsVersion.sysNameLower.isEmpty()) - return unixOsVersion.sysNameLower; +#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX + QUnixOSVersion unixOsVersion; + readEtcOsRelease(unixOsVersion); + if (!unixOsVersion.productType.isEmpty()) + return unixOsVersion.productType; #endif return unknownText(); } -QString SubsurfaceSysInfo::osKernelVersion() -{ -#ifdef Q_OS_WINRT - // TBD - return QString(); -#elif defined(Q_OS_WIN) - const OSVERSIONINFO osver = winOsVersion(); - return QString::number(int(osver.dwMajorVersion)) + QLatin1Char('.') + QString::number(int(osver.dwMinorVersion)) - + QLatin1Char('.') + QString::number(int(osver.dwBuildNumber)); -#else - return detectUnixVersion().sysRelease; -#endif -} - -QString SubsurfaceSysInfo::osVersion() +QString SubsurfaceSysInfo::productVersion() { #if defined(Q_OS_IOS) int major = (int(MacintoshVersion) >> 4) & 0xf; @@ -392,24 +508,34 @@ QString SubsurfaceSysInfo::osVersion() deviceinfo_free_details(&deviceInfo); return bbVersion; } -#elif defined(Q_OS_UNIX) - QUnixOSVersion unixOsVersion = detectUnixVersion(); - if (!unixOsVersion.versionIdentifier.isEmpty()) - return unixOsVersion.versionIdentifier; +#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX + QUnixOSVersion unixOsVersion; + readEtcOsRelease(unixOsVersion); + if (!unixOsVersion.productVersion.isEmpty()) + return unixOsVersion.productVersion; #endif // fallback return unknownText(); } -QString SubsurfaceSysInfo::prettyOsName() +QString SubsurfaceSysInfo::prettyProductName() { #if defined(Q_OS_IOS) - return QLatin1String("iOS ") + osVersion(); + return QLatin1String("iOS ") + productVersion(); #elif defined(Q_OS_OSX) // get the known codenames const char *basename = 0; switch (int(MacintoshVersion)) { + case MV_CHEETAH: + case MV_PUMA: + case MV_JAGUAR: + case MV_PANTHER: + case MV_TIGER: + // This version of Qt does not run on those versions of OS X + // so this case label will never be reached + Q_UNREACHABLE(); + break; case MV_LEOPARD: basename = "Mac OS X Leopard ("; break; @@ -422,11 +548,7 @@ QString SubsurfaceSysInfo::prettyOsName() case MV_MOUNTAINLION: basename = "OS X Mountain Lion ("; break; -#ifdef MV_MAVERICKS case MV_MAVERICKS: -#else - case 0x000B: // MV_MAVERICKS -#endif basename = "OS X Mavericks ("; break; #ifdef MV_YOSEMITE @@ -438,63 +560,54 @@ QString SubsurfaceSysInfo::prettyOsName() break; } if (basename) - return QLatin1String(basename) + osVersion() + QLatin1Char(')'); + return QLatin1String(basename) + productVersion() + QLatin1Char(')'); // a future version of OS X - return QLatin1String("OS X ") + osVersion(); + return QLatin1String("OS X ") + productVersion(); #elif defined(Q_OS_WINPHONE) return QLatin1String("Windows Phone ") + QLatin1String(winVer_helper()); #elif defined(Q_OS_WIN) return QLatin1String("Windows ") + QLatin1String(winVer_helper()); #elif defined(Q_OS_ANDROID) - return QLatin1String("Android ") + osVersion(); + return QLatin1String("Android ") + productVersion(); #elif defined(Q_OS_BLACKBERRY) - return QLatin1String("BlackBerry ") + osVersion(); + return QLatin1String("BlackBerry ") + productVersion(); #elif defined(Q_OS_UNIX) - QUnixOSVersion unixOsVersion = detectUnixVersion(); - if (unixOsVersion.versionText.isEmpty()) - return unixOsVersion.sysName; - else - return unixOsVersion.sysName + QLatin1String(" (") + unixOsVersion.versionText + QLatin1Char(')'); -#else - return unknownText(); +# ifdef USE_ETC_OS_RELEASE + QUnixOSVersion unixOsVersion; + readEtcOsRelease(unixOsVersion); + if (!unixOsVersion.prettyName.isEmpty()) + return unixOsVersion.prettyName; +# endif + struct utsname u; + if (uname(&u) == 0) + return QString::fromLatin1(u.sysname) + QLatin1Char(' ') + QString::fromLatin1(u.release); #endif + return unknownText(); } -// detect if the OS we are running on is 64 or 32bit -// we only care when building on Intel for 32bit -QString SubsurfaceSysInfo::osArch() +#endif // Qt >= 5.4 + +QString SubsurfaceSysInfo::prettyOsName() { - QString res = ""; -#if defined(Q_PROCESSOR_X86_32) -#if defined(Q_OS_UNIX) + // Matches the pre-release version of Qt 5.4 + QString pretty = prettyProductName(); +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID) + // QSysInfo::kernelType() returns lowercase ("linux" instead of "Linux") struct utsname u; - if (uname(&u) != -1) { - res = u.machine; - } -#elif defined(Q_OS_WIN) - - /* this code is from - * http://mark.koli.ch/reliably-checking-os-bitness-32-or-64-bit-on-windows-with-a-tiny-c-app - * there is no license given, but 5 lines of code should be fine to reuse unless explicitly forbidden */ - typedef BOOL (WINAPI *IW64PFP)(HANDLE, BOOL *); - BOOL os64 = FALSE; - IW64PFP IW64P = (IW64PFP)GetProcAddress( - GetModuleHandle((LPCSTR)"kernel32"), "IsWow64Process"); - - if(IW64P != NULL){ - IW64P(GetCurrentProcess(), &os64); - } - res = os64 ? "x86_64" : "i386"; + if (uname(&u) == 0) + return QString::fromLatin1(u.sysname) + QLatin1String(" (") + pretty + QLatin1Char(')'); #endif -#endif - return res; + return pretty; } extern "C" { bool isWin7Or8() { - QString os = SubsurfaceSysInfo::prettyOsName(); - return os == "Windows 7" || os.startsWith("Windows 8"); +#ifdef Q_OS_WIN + return (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based) >= QSysInfo::WV_WINDOWS7; +#else + return false; +#endif } } diff --git a/subsurfacesysinfo.h b/subsurfacesysinfo.h index 99ee35239..23c7011bc 100644 --- a/subsurfacesysinfo.h +++ b/subsurfacesysinfo.h @@ -205,14 +205,18 @@ class SubsurfaceSysInfo : public QSysInfo { public: - static QString cpuArchitecture(); - static QString fullCpuArchitecture(); - static QString osType(); - static QString osKernelVersion(); - static QString osVersion(); +#if QT_VERSION < 0x050400 + static QString buildCpuArchitecture(); + static QString currentCpuArchitecture(); + static QString buildAbi(); + + static QString kernelType(); + static QString kernelVersion(); + static QString productType(); + static QString productVersion(); + static QString prettyProductName(); +#endif static QString prettyOsName(); - - static QString osArch(); }; diff --git a/tests/testgpscoords.cpp b/tests/testgpscoords.cpp index a38dcc807..c5a4d22a4 100644 --- a/tests/testgpscoords.cpp +++ b/tests/testgpscoords.cpp @@ -77,6 +77,29 @@ void TestGpsCoords::testSpaceDecimalParse() coord2double(52.83), coord2double(1.61)); } +void TestGpsCoords::testXmlFormatParse() +{ + testParseOK("46.473881 6.784696", + coord2double(46.473881), coord2double(6.784696)); +} + +void TestGpsCoords::testNegativeXmlFormatParse() +{ + testParseOK("46.473881 -6.784696", + coord2double(46.473881), -coord2double(6.784696)); +} + +void TestGpsCoords::testNoUnitParse() +{ + testParseOK("48 51.491n 2 17.677e", + coord2double(48, 51.491), coord2double(2, 17.677)); +} + +void TestGpsCoords::testPrefixNoUnitParse() +{ + testParseOK("n48 51.491 w2 17.677", + coord2double(48, 51.491), -coord2double(2, 17.677)); +} void TestGpsCoords::testParseOK(const QString &txt, double expectedLat, double expectedLon) diff --git a/tests/testgpscoords.h b/tests/testgpscoords.h index 5add3da93..784bc302e 100644 --- a/tests/testgpscoords.h +++ b/tests/testgpscoords.h @@ -18,6 +18,10 @@ private slots: void testDecimalParse(); void testSpaceDecimalParse(); void testDecimalInversedParse(); + void testXmlFormatParse(); + void testNoUnitParse(); + void testNegativeXmlFormatParse(); + void testPrefixNoUnitParse(); private: static void testParseOK(const QString &txt, double expectedLat, diff --git a/tests/testparse.cpp b/tests/testparse.cpp new file mode 100644 index 000000000..e5abbaa6a --- /dev/null +++ b/tests/testparse.cpp @@ -0,0 +1,57 @@ +#include "testparse.h" +#include "dive.h" +#include <QTextStream> + +void TestParse::testParseCSV() +{ + // some basic file parsing tests + // + // even with the V2 question not shown, CSV import should work + v2_question_shown = false; + verbose = 1; + QCOMPARE(parse_manual_file(SUBSURFACE_SOURCE "/dives/test41.csv", + 0, // tab separator + 0, // metric units + 1, // mm/dd/yyyy + 2, // min:sec + 0, 1, 2, 3, -1, -1, 4, 5, // Dive #, date, time, duration, maxdepth, avgdepth + -1, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), 0); // buddy, suit + fprintf(stderr, "number of dives %d \n", dive_table.nr); +} + +void TestParse::testParseV2NoQuestion() +{ + // but parsing of a V2 file should fail + v2_question_shown = false; + QCOMPARE(parse_file(SUBSURFACE_SOURCE "/dives/test40.xml"), -1); +} + +void TestParse::testParseV3() +{ + // while parsing of a V3 files should succeed + v2_question_shown = false; + QCOMPARE(parse_file(SUBSURFACE_SOURCE "/dives/test42.xml"), 0); +} + +void TestParse::testParseV2YesQuestion() +{ + // once we claim to have shown the V2 question, parsing the V2 file should work as well + v2_question_shown = true; + QCOMPARE(parse_file(SUBSURFACE_SOURCE "/dives/test40.xml"), 0); +} + +void TestParse::testParseCompareOutput() +{ + QCOMPARE(save_dives("./testout.ssrf"), 0); + QFile org(SUBSURFACE_SOURCE "/dives/test40-42.xml"); + org.open(QFile::ReadOnly); + QFile out("./testout.ssrf"); + out.open(QFile::ReadOnly); + QTextStream orgS(&org); + QTextStream outS(&out); + QString readin = orgS.readAll(); + QString written = outS.readAll(); + QCOMPARE(readin, written); +} + +QTEST_MAIN(TestParse) diff --git a/tests/testparse.h b/tests/testparse.h new file mode 100644 index 000000000..df0afa9f5 --- /dev/null +++ b/tests/testparse.h @@ -0,0 +1,16 @@ +#ifndef TESTPARSE_H +#define TESTPARSE_H + +#include <QtTest> + +class TestParse : public QObject{ + Q_OBJECT +private slots: + void testParseCSV(); + void testParseV2NoQuestion(); + void testParseV2YesQuestion(); + void testParseV3(); + void testParseCompareOutput(); +}; + +#endif diff --git a/theme/dive_export.html b/theme/dive_export.html index e171b070f..e7c643e0f 100644 --- a/theme/dive_export.html +++ b/theme/dive_export.html @@ -121,6 +121,7 @@ window.onload=function(){ searchingModules["tags"].Enter_search_tag(items[i].tags,i); } + set_units(); sizeofpage=10; showAllDives(); document.getElementById("divePanel").style.display='none'; @@ -132,8 +133,6 @@ window.onload=function(){ document.onkeydown = switchDives; - set_units(); - //translate Page translate_page(); getDefaultColor(); @@ -214,8 +213,8 @@ function changeAdvSearch(e){ <div id="date_header" onClick="change_sort_col('2')" class="item">Date</div> <div id="time_header" onClick="change_sort_col('3')" class="item">Time</div> <div id="location_header" onClick="change_sort_col('6')" class="item_large">Location</div> - <div id="air_temp_header" onClick="change_sort_col('4')" class="item">Air temp</div> - <div id="water_temp_header" onClick="change_sort_col('5')" class="item">Water temp</div> + <div id="duration_header" onClick="change_sort_col('4')" class="item">Duration</div> + <div id="maxdepth_header" onClick="change_sort_col('5')" class="item">Max Depth</div> </div> <div id="diveslist"> </div> diff --git a/theme/list_lib.js b/theme/list_lib.js index 6fde5417c..6ca82ea51 100644 --- a/theme/list_lib.js +++ b/theme/list_lib.js @@ -47,7 +47,7 @@ function updateView(start, end) var divelist = document.getElementById('diveslist'); divelist.innerHTML = ""; for (var i = start; i <= end; i++) { - divelist.innerHTML += '<ul id="' + itemsToShow[i] + '" onclick="toggleExpantion(this)"</ul>'; + divelist.innerHTML += '<ul id="' + itemsToShow[i] + '" onclick="toggleExpantion(event, this)"</ul>'; expand(document.getElementById(itemsToShow[i])); items[itemsToShow[i]].expanded = true; }; @@ -63,7 +63,7 @@ function addHTML(indexes) var divelist = document.getElementById('diveslist'); divelist.innerHTML = ""; for (var i = 0; i < indexes.length; i++) { - divelist.innerHTML += '<ul id="' + indexes[i] + '" onclick="toggleExpantion(this)"</ul>'; + divelist.innerHTML += '<ul id="' + indexes[i] + '" onclick="toggleExpantion(event, this)"</ul>'; expand(document.getElementById(indexes[i])); itemsToShow[indexes[i]].expanded = true; }; @@ -165,8 +165,11 @@ function setNumberOfDives(e) viewInPage(); } -function toggleExpantion(ul) +function toggleExpantion(e, ul) { + if (e.toElement.localName === "a" ) { + return; + } if (!items[ul.id].expanded) { expand(ul); items[ul.id].expanded = true; @@ -200,8 +203,8 @@ function getlimited(dive) '<div class="item">' + dive.date + '</div>' + '<div class="item">' + dive.time + '</div>' + '<div class="item_large">' + dive.location + '</div>' + - '<div class="item">' + dive.temperature.air + '</div>' + - '<div class="item">' + dive.temperature.water + '</div></div>'; + '<div class="item">' + dive.dive_duration + '</div>' + + '<div class="item">' + put_depth_unit(dive.maxdepth) + " " + depth_unit + '</div></div>'; }; function getExpanded(dive) @@ -214,7 +217,7 @@ function getExpanded(dive) '</td></tr></table>' + '<table><tr><td class="words">' + translate.Air_Temp + ': </td><td>' + dive.temperature.air + '</td><td class="words"> ' + translate.Water_Temp + ': </td><td>' + dive.temperature.water + - '</td></tr></table><table><tr><td class="words">' + translate.Duration + ': </td><td>' + dive.dive_duration + + '</td></tr></table><table><tr><td class="words">' + translate.Max_Depth + ': </td><td>' + put_depth_unit(dive.maxdepth) + " " + depth_unit + '</td></tr><tr><td class="words">' + translate.Duration + ': </td><td>' + dive.dive_duration + '</td></tr><tr><td class="words">' + translate.DiveMaster + ': </td><td>' + dive.divemaster + '</td></tr><tr><td class="words"><p>' + translate.Buddy + ': </p></td><td>' + dive.buddy + '</td></tr><tr><td class="words">' + translate.Suit + ': </td><td>' + dive.suit + @@ -266,8 +269,8 @@ each col. sorted asc or des var number = true; var time = true; var date = true; -var air = true; -var water = true; +var duration = true; +var depth = true; var locat = true; /* @@ -307,18 +310,18 @@ function list_sort(sortOn) sort_it(sortOn, cmpTimeAsc); } break; - case '4': //Air temp - if (air) { - sort_it(sortOn, cmpAtempDes); + case '4': //Duration + if (duration) { + sort_it(sortOn, cmpDurDes); } else { - sort_it(sortOn, cmpAtempAsc); + sort_it(sortOn, cmpDurAsc); } break; - case '5': //Water temp - if (water) { - sort_it(sortOn, cmpWtempDes); + case '5': //Max Depth + if (depth) { + sort_it(sortOn, cmpDepthDes); } else { - sort_it(sortOn, cmpWtempAsc); + sort_it(sortOn, cmpDepthAsc); } break; case '6': //Location @@ -343,11 +346,11 @@ function toggle_sort_state(sortOn) case '3': //time time = 1 - time; break; - case '4': //Air temp - air = 1 - air; + case '4': //Duration + duration = 1 - duration; break; - case '5': //Water temp - water = 1 - water; + case '5': //depth + depth = 1 - depth; break; case '6': //Location locat = 1 - locat; @@ -404,24 +407,24 @@ function cmpDateDes(j, iSmaller) return items[j].date > items[iSmaller].date; } -function cmpAtempAsc(j, iSmaller) +function cmpDurAsc(j, iSmaller) { - return parseFloat(items[j].temperature.air, 10) < parseFloat(items[iSmaller].temperature.air, 10); + return items[j].duration < items[iSmaller].duration; } -function cmpAtempDes(j, iSmaller) +function cmpDurDes(j, iSmaller) { - return parseFloat(items[j].temperature.air, 10) > parseFloat(items[iSmaller].temperature.air, 10); + return items[j].duration > items[iSmaller].duration; } -function cmpWtempAsc(j, iSmaller) +function cmpDepthAsc(j, iSmaller) { - return parseFloat(items[j].temperature.water, 10) < parseFloat(items[iSmaller].temperature.water, 10); + return items[j].maxdepth < items[iSmaller].maxdepth; } -function cmpWtempDes(j, iSmaller) +function cmpDepthDes(j, iSmaller) { - return parseFloat(items[j].temperature.water, 10) > parseFloat(items[iSmaller].temperature.water, 10); + return items[j].maxdepth > items[iSmaller].maxdepth; } function sort_it(sortOn, function_) @@ -773,7 +776,7 @@ function expand_trip(trip) trips[trip].expanded = true; var d = document.getElementById("trip_dive_list_" + trip); for (var j in trips[trip].dives) { - d.innerHTML += '<ul id="' + trips[trip].dives[j].number + '" onclick="toggleExpantion(this)" onmouseover="highlight(this)"' + + d.innerHTML += '<ul id="' + trips[trip].dives[j].number + '" onclick="toggleExpantion(event, this)" onmouseover="highlight(this)"' + ' onmouseout="unhighlight(this)">' + getlimited(trips[trip].dives[j]) + '</ul>'; } } @@ -805,6 +808,14 @@ var points; //reference to the samples array of the shown dive. var ZERO_C_IN_MKELVIN = 273150; var plot1; +function firstNonZero() +{ + for(var i = 0; i <= items[dive_id].samples.length-1; i++){ + if(items[dive_id].samples[i][2] !== 0) + return items[dive_id].samples[i][2]; + } +} + function lastNonZero() { for(var i = items[dive_id].samples.length-1; i >= 0; i--){ @@ -847,7 +858,8 @@ function get_cylinder_HTML(cylinder) var cEPressure = cylinder.EPressure; if (cSPressure === "--") { - cSPressure = Math.round(put_pressure_unit(items[dive_id].samples[0][2])).toFixed(1) + " " + pressure_unit; + var nonZeroCSPressure = firstNonZero(); + cSPressure = Math.round(put_pressure_unit(nonZeroCSPressure)).toFixed(1) + " " + pressure_unit; } if (cEPressure === "--") { @@ -855,7 +867,14 @@ function get_cylinder_HTML(cylinder) cEPressure = Math.round(put_pressure_unit(nonZeroCEPressure)).toFixed(1) + " " + pressure_unit; } - return '<tr><td class="Cyl">' + cylinder.Type + '</td><td class="Cyl">' + cylinder.Size + '</td><td class="Cyl">' + cylinder.WPressure + '</td>' + '<td class="Cyl">' + cSPressure + '</td><td class="Cyl">' + cEPressure + '</td><td class="Cyl">' + cylinder.O2 + '</td></tr>'; + var pressure_string = cylinder.O2; + if (cylinder.O2 !== "Air") { + pressure_string = 'O2: ' + cylinder.O2; + } + if (cylinder.He && cylinder.He !== "0.0%") { + pressure_string += ' / He: ' + cylinder.He; + } + return '<tr><td class="Cyl">' + cylinder.Type + '</td><td class="Cyl">' + cylinder.Size + '</td><td class="Cyl">' + cylinder.WPressure + '</td>' + '<td class="Cyl">' + cSPressure + '</td><td class="Cyl">' + cEPressure + '</td><td class="Cyl">' + pressure_string + '</td></tr>'; } /** @@ -880,7 +899,7 @@ function get_event_value(event) if (event.type == 11 || event.type == 25) { // gas change var he = event.value >> 16; var o2 = event.value & 0xffff; - return 'He: ' + he + ' - O2: ' + o2; + return 'O2: ' + o2 + ' / He: ' + he; } if (event.type == 23) { // heading return event.value; @@ -940,7 +959,7 @@ function get_dive_HTML(dive) '</td></tr></table>' + '<table><tr><td class="words">' + translate.Air_Temp + ': </td><td>' + dive.temperature.air + '</td><td class="words"> ' + translate.Water_Temp + ': </td><td>' + dive.temperature.water + - '</td></tr></table><table><tr><td class="words">' + translate.Duration + ': </td><td>' + dive.dive_duration + + '</td></tr></table><table><tr><td class="words">' + translate.Max_Depth + ': </td><td>' + put_depth_unit(dive.maxdepth) + " " + depth_unit + '</td></tr><tr><td class="words">' + translate.Duration + ': </td><td>' + dive.dive_duration + '</td></tr><tr><td class="words">' + translate.DiveMaster + ': </td><td>' + dive.divemaster + '</td></tr><tr><td class="words"><p>' + translate.Buddy + ': </p></td><td>' + dive.buddy + '</td></tr><tr><td class="words">' + translate.Suit + ': </td><td>' + dive.suit + @@ -978,19 +997,93 @@ function get_status_HTML(dive) '</td><td class="words"> CNS: </td><td>' + dive.cns + '</td></tr></table>'; }; -function get_dive_photos(dive) +/** +* Dive Photo View +*/ + +var success; +var error; +var missing_ids; + +function show_loaded_photos() +{ + //dive photos in the current dive + var dive = items[dive_id]; + var slider = ""; + document.getElementById("divephotos").style.display = 'block'; + for (var i = 0; i < dive.photos.length; i++) { + slider += '<img src="' + location.pathname + '_files/photos/' + dive.photos[i].filename + '" alt="" height="240" width="240">'; + } + document.getElementById("slider").innerHTML = slider; +} + +function remove_missing_photos() { + //dive photos in the current dive + var dive = items[dive_id]; + var actually_removed = 0; + + console.log(missing_ids.length); + for(i = 0; i < missing_ids.length; i++){ + dive.photos.splice(missing_ids[i] - actually_removed, 1); + actually_removed++; + } +} + +function check_loaded_photos() +{ + //hide the photos div if all photos are missing + if (error >= items[dive_id].photos.length) { + document.getElementById("divephotos").style.display = 'none'; + return; + } + + //remove missing photos from the list + remove_missing_photos(); + + //view all remaining photos + show_loaded_photos(); +} + +function check_loading_finished() +{ + //if all images wasn't loaded yet + if (success + error < items[dive_id].photos.length) + return; + + check_loaded_photos(); +} + +function load_photo(url, i) { + var img = new Image(); + img.onload = function() { + success++; + check_loading_finished(); + }; + img.onerror = function() { + error++; + missing_ids.push(i); + check_loading_finished(); + }; + img.src = url; +} + +function load_all_photos(dive) +{ + //init + success = 0; + error = 0; + missing_ids = new Array(); + + //exit if no photos in this dive. if (!dive.photos || dive.photos.length <= 0) { document.getElementById("divephotos").style.display = 'none'; return ""; } - var slider = ""; - document.getElementById("divephotos").style.display = 'block'; + for (var i = 0; i < dive.photos.length; i++) { - slider += '<img src="' + location.pathname + - '_files/photos/' + dive.photos[i].filename + '" alt="" height="240" width="240">'; + load_photo(location.pathname + '_files/photos/' + dive.photos[i].filename, i); } - return slider; } function prev_photo() @@ -1001,7 +1094,7 @@ function prev_photo() items[dive_id].photos[i] = items[dive_id].photos[i + 1] } items[dive_id].photos[i] = temp; - document.getElementById("slider").innerHTML = get_dive_photos(items[dive_id]); + show_loaded_photos(); } function next_photo() @@ -1012,9 +1105,12 @@ function next_photo() items[dive_id].photos[i] = items[dive_id].photos[i - 1] } items[dive_id].photos[0] = temp; - document.getElementById("slider").innerHTML = get_dive_photos(items[dive_id]); + show_loaded_photos(); } +/** +* Helper functions +*/ function mkelvin_to_C(mkelvin) { return (mkelvin - ZERO_C_IN_MKELVIN) / 1000.0; @@ -1250,7 +1346,7 @@ function showDiveDetails(dive) document.getElementById("dive_equipment").innerHTML += get_weights_HTML(items[dive_id]); document.getElementById("bookmarks").innerHTML = get_bookmarks_HTML(items[dive_id]); document.getElementById("divestats").innerHTML = get_status_HTML(items[dive_id]); - document.getElementById("slider").innerHTML = get_dive_photos(items[dive_id]); + load_all_photos(items[dive_id]); setDiveTitle(items[dive_id]); //hide the list of dives and show the canvas. @@ -1328,8 +1424,8 @@ function translate_page() document.getElementById("date_header").innerHTML = translate.Date; document.getElementById("time_header").innerHTML = translate.Time; document.getElementById("location_header").innerHTML = translate.Location; - document.getElementById("air_temp_header").innerHTML = translate.Air_Temp; - document.getElementById("water_temp_header").innerHTML = translate.Water_Temp; + document.getElementById("duration_header").innerHTML = translate.Duration; + document.getElementById("maxdepth_header").innerHTML = translate.Max_Depth; document.getElementById("adv_srch_sp").innerHTML = translate.Advanced_Search; document.getElementById("expnd_all_btn").innerHTML = translate.Expand_All; document.getElementById("claps_all_btn").innerHTML = translate.Collapse_All; diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt new file mode 100644 index 000000000..71ffa6d39 --- /dev/null +++ b/translations/CMakeLists.txt @@ -0,0 +1,34 @@ +QT5_ADD_TRANSLATION(TRANSLATIONS + subsurface_source.ts + subsurface_bg_BG.ts + subsurface_cs.ts + subsurface_da_DK.ts + subsurface_de_CH.ts + subsurface_de_DE.ts + subsurface_en_GB.ts + subsurface_es_ES.ts + subsurface_et_EE.ts + subsurface_fi_FI.ts + subsurface_fr_FR.ts + subsurface_it_IT.ts + subsurface_lv_LV.ts + subsurface_nb_NO.ts + subsurface_nl_NL.ts + subsurface_pl_PL.ts + subsurface_pt_BR.ts + subsurface_pt_PT.ts + subsurface_ru_RU.ts + subsurface_sk_SK.ts + subsurface_sv_SE.ts + subsurface_tr.ts + subsurface_zh_TW.ts +) + +# disabled translations as they are below 50%: +# translations/subsurface_el_GR.ts \ +# translations/subsurface_he.ts \ +# translations/subsurface_hu.ts \ +# translations/subsurface_ro_RO.ts \ + +SET(TRANSLATIONS ${TRANSLATIONS} PARENT_SCOPE) +ADD_CUSTOM_TARGET (translations ALL DEPENDS ${TRANSLATIONS}) diff --git a/uemis-downloader.c b/uemis-downloader.c index 20a01e527..986aeb5b3 100644 --- a/uemis-downloader.c +++ b/uemis-downloader.c @@ -644,12 +644,12 @@ static void parse_divespot(char *buf) uemis_set_divelocation(divespot, locationstring, longitude, latitude); } -static void track_divespot(char *val, int diveid, char **location, degrees_t *latitude, degrees_t *longitude) +static void track_divespot(char *val, int diveid, uint32_t dive_site_uuid) { int id = atoi(val); if (id >= 0 && id > nr_divespots) nr_divespots = id; - uemis_mark_divelocation(diveid, id, location, latitude, longitude); + uemis_mark_divelocation(diveid, id, dive_site_uuid); return; } @@ -748,6 +748,7 @@ static bool process_raw_buffer(device_data_t *devdata, uint32_t deviceid, char * fprintf(debugfile, "p_r_b entry deleted\n"); #endif /* oops, this one isn't valid, suggest to try the previous one */ + free(buf); return false; } } @@ -789,7 +790,8 @@ static bool process_raw_buffer(device_data_t *devdata, uint32_t deviceid, char * if (for_dive) *for_dive = atoi(val); } else if (!log && dive && !strcmp(tag, "divespot_id")) { - track_divespot(val, dive->dc.diveid, &dive->location, &dive->latitude, &dive->longitude); + dive->dive_site_uuid = create_dive_site("from Uemis"); + track_divespot(val, dive->dc.diveid, dive->dive_site_uuid); } else if (dive) { parse_tag(dive, tag, val); } @@ -865,8 +867,10 @@ const char *do_uemis_import(device_data_t *data) if (dive_table.nr == 0) keep_number = true; uemis_info(translate("gettextFromC", "Initialise communication")); - if (!uemis_init(mountpath)) + if (!uemis_init(mountpath)) { + free(reqtxt_path); return translate("gettextFromC", "Uemis init failed"); + } if (!uemis_get_answer(mountpath, "getDeviceId", 0, 1, &result)) goto bail; deviceid = strdup(param_buff[0]); @@ -1001,5 +1005,6 @@ bail: result = param_buff[2]; } free(deviceid); + free(reqtxt_path); return result; } @@ -103,9 +103,7 @@ struct uemis_helper { int diveid; int lbs; int divespot; - char **location; - degrees_t *latitude; - degrees_t *longitude; + int dive_site_uuid; struct uemis_helper *next; }; static struct uemis_helper *uemis_helper = NULL; @@ -150,27 +148,22 @@ int uemis_get_weight_unit(int diveid) return 0; } -void uemis_mark_divelocation(int diveid, int divespot, char **location, degrees_t *latitude, degrees_t *longitude) +void uemis_mark_divelocation(int diveid, int divespot, uint32_t dive_site_uuid) { struct uemis_helper *hp = uemis_get_helper(diveid); hp->divespot = divespot; - hp->location = location; - hp->longitude = longitude; - hp->latitude = latitude; + hp->dive_site_uuid = dive_site_uuid; } void uemis_set_divelocation(int divespot, char *text, double longitude, double latitude) { struct uemis_helper *hp = uemis_helper; -#if 0 /* seems overkill */ - if (!g_utf8_validate(text, -1, NULL)) - return; -#endif while (hp) { - if (hp->divespot == divespot && hp->location) { - *hp->location = strdup(text); - hp->longitude->udeg = round(longitude * 1000000); - hp->latitude->udeg = round(latitude * 1000000); + if (hp->divespot == divespot) { + struct dive_site *ds = get_dive_site_by_uuid(hp->dive_site_uuid); + ds->name = strdup(text); + ds->longitude.udeg = round(longitude * 1000000); + ds->latitude.udeg = round(latitude * 1000000); } hp = hp->next; } @@ -14,7 +14,7 @@ extern "C" { void uemis_parse_divelog_binary(char *base64, void *divep); int uemis_get_weight_unit(int diveid); -void uemis_mark_divelocation(int diveid, int divespot, char **location, degrees_t *latitude, degrees_t *longitude); +void uemis_mark_divelocation(int diveid, int divespot, uint32_t dive_site_uuid); void uemis_set_divelocation(int divespot, char *text, double longitude, double latitude); void uemis_set_max_diveid_from_dialog(int diveid); diff --git a/version.c b/version.c new file mode 100644 index 000000000..5b54bf4c7 --- /dev/null +++ b/version.c @@ -0,0 +1,16 @@ +#include "ssrf-version.h" + +const char *subsurface_version(void) +{ + return VERSION_STRING; +} + +const char *subsurface_git_version(void) +{ + return GIT_VERSION_STRING; +} + +const char *subsurface_canonical_version(void) +{ + return CANONICAL_VERSION_STRING; +} diff --git a/version.h b/version.h new file mode 100644 index 000000000..bc0aac00d --- /dev/null +++ b/version.h @@ -0,0 +1,16 @@ +#ifndef VERSION_H +#define VERSION_H + +#ifdef __cplusplus +extern "C" { +#endif + +const char *subsurface_version(void); +const char *subsurface_git_version(void); +const char *subsurface_canonical_version(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/worldmap-save.c b/worldmap-save.c index c28a52d5f..25c5ee33f 100644 --- a/worldmap-save.c +++ b/worldmap-save.c @@ -27,11 +27,11 @@ void writeMarkers(struct membuffer *b, const bool selected_only) if (!dive->selected) continue; } - if (dive->latitude.udeg == 0 && dive->longitude.udeg == 0) + struct dive_site *ds = get_dive_site_for_dive(dive); + if (!ds || !dive_site_has_gps_location(ds)) continue; - - put_degrees(b, dive->latitude, "temp = new google.maps.Marker({position: new google.maps.LatLng(", ""); - put_degrees(b, dive->longitude, ",", ")});\n"); + put_degrees(b, ds->latitude, "temp = new google.maps.Marker({position: new google.maps.LatLng(", ""); + put_degrees(b, ds->longitude, ",", ")});\n"); put_string(b, "markers.push(temp);\ntempinfowindow = new google.maps.InfoWindow({content: '<div id=\"content\">'+'<div id=\"siteNotice\">'+'</div>'+'<div id=\"bodyContent\">"); snprintf(pre, sizeof(pre), "<p>%s ", translate("gettextFromC", "Date:")); put_HTML_date(b, dive, pre, "</p>"); @@ -51,7 +51,7 @@ void writeMarkers(struct membuffer *b, const bool selected_only) put_HTML_watertemp(b, dive, " ", "</p>"); snprintf(pre, sizeof(pre), "<p>%s <b>", translate("gettextFromC", "Location:")); put_string(b, pre); - put_HTML_quoted(b, dive->location); + put_HTML_quoted(b, get_dive_location(dive)); put_string(b, "</b></p>"); snprintf(pre, sizeof(pre), "<p> %s ", translate("gettextFromC", "Notes:")); put_HTML_notes(b, dive, pre, " </p>"); diff --git a/xslt/MacDive.xslt b/xslt/MacDive.xslt index 444876721..59b05c3fe 100644 --- a/xslt/MacDive.xslt +++ b/xslt/MacDive.xslt @@ -1,5 +1,6 @@ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:strip-space elements="*"/> + <xsl:include href="commonTemplates.xsl"/> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> @@ -67,7 +68,16 @@ </xsl:attribute> <xsl:attribute name="tags"> - <xsl:value-of select="entryType"/> + <xsl:for-each select="tags/tag|entryType"> + <xsl:choose> + <xsl:when test="position() = 1"> + <xsl:value-of select="."/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="concat(',', .)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> </xsl:attribute> <xsl:variable name="delta"> @@ -79,10 +89,10 @@ <location debug="true"> <xsl:for-each select="site/country|site/location|site/name"> <xsl:choose> - <xsl:when test="following-sibling::location[1] != ''"> + <xsl:when test="following-sibling::location[1] != '' and . != ''"> <xsl:value-of select="concat(., ' / ')"/> </xsl:when> - <xsl:when test="following-sibling::name[1] != ''"> + <xsl:when test="following-sibling::name[1] != '' and . != ''"> <xsl:value-of select="concat(., ' / ')"/> </xsl:when> <xsl:otherwise> @@ -104,10 +114,10 @@ <location> <xsl:for-each select="country|location|site"> <xsl:choose> - <xsl:when test="following-sibling::location[1] != ''"> + <xsl:when test="following-sibling::location[1] != '' and . != ''"> <xsl:value-of select="concat(., ' / ')"/> </xsl:when> - <xsl:when test="following-sibling::site[1] != ''"> + <xsl:when test="following-sibling::site[1] != '' and . != ''"> <xsl:value-of select="concat(., ' / ')"/> </xsl:when> <xsl:otherwise> @@ -198,6 +208,21 @@ </cylinder> </xsl:for-each> + <xsl:for-each select="gases/gas"> + <event name="gaschange"> + <xsl:attribute name="time"> + <xsl:call-template name="sec2time"> + <xsl:with-param name="timeSec"> + <xsl:value-of select="sum(preceding-sibling::gas/duration)"/> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="value"> + <xsl:value-of select="helium * 65536 + oxygen"/> + </xsl:attribute> + </event> + </xsl:for-each> + <xsl:if test="diveMaster"> <divemaster> <xsl:value-of select="diveMaster"/> @@ -387,7 +412,7 @@ </xsl:if> </sample> - <xsl:if test="alarm != ''"> + <xsl:if test="alarm != '' and alarm != gas_change"> <event> <xsl:attribute name="time"> <xsl:call-template name="timeConvert"> @@ -543,18 +568,6 @@ </xsl:template> <!-- end convert weight --> - <xsl:template name="temperatureSamples"> - <xsl:param name="units"/> - <xsl:choose> - <xsl:when test="$units = 'Imperial'"> - <xsl:value-of select="count(descendant::temperature[. != 32])"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="count(descendant::temperature[. != 0])"/> - </xsl:otherwise> - </xsl:choose> - </xsl:template> - <xsl:template name="pressureSamples"> <xsl:value-of select="count(descendant::pressure[. > 0])"/> </xsl:template> diff --git a/xslt/csv2xml.xslt b/xslt/csv2xml.xslt index dba207052..05f9e23c6 100644 --- a/xslt/csv2xml.xslt +++ b/xslt/csv2xml.xslt @@ -16,6 +16,7 @@ <xsl:param name="time" select="time"/> <xsl:param name="units" select="units"/> <xsl:param name="separatorIndex" select="separatorIndex"/> + <xsl:param name="delta" select="delta"/> <xsl:output method="xml" indent="yes"/> <xsl:variable name="lf"><xsl:text> @@ -41,6 +42,7 @@ <divecomputerid deviceid="ffffffff" model="csv" /> <xsl:call-template name="printLine"> <xsl:with-param name="line" select="substring-before(//csv, $lf)"/> + <xsl:with-param name="lineno" select="'1'"/> <xsl:with-param name="remaining" select="substring-after(//csv, $lf)"/> </xsl:call-template> </dive> @@ -50,33 +52,47 @@ <xsl:template name="printLine"> <xsl:param name="line"/> + <xsl:param name="lineno"/> <xsl:param name="remaining"/> <!-- We only want to process lines with different time stamps, and timeField is not necessarily the first field --> <xsl:if test="$line != substring-before($remaining, $lf)"> - <xsl:variable name="curTime"> - <xsl:call-template name="getFieldByIndex"> - <xsl:with-param name="index" select="$timeField"/> - <xsl:with-param name="line" select="$line"/> - </xsl:call-template> - </xsl:variable> - <xsl:variable name="prevTime"> - <xsl:call-template name="getFieldByIndex"> - <xsl:with-param name="index" select="$timeField"/> - <xsl:with-param name="line" select="substring-before($remaining, $lf)"/> - </xsl:call-template> - </xsl:variable> - - <xsl:if test="$curTime != $prevTime"> - <xsl:call-template name="printFields"> - <xsl:with-param name="line" select="$line"/> - </xsl:call-template> - </xsl:if> + <xsl:choose> + <xsl:when test="$delta != '' and $delta > 0"> + <xsl:variable name="curTime"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$timeField"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="prevTime"> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$timeField"/> + <xsl:with-param name="line" select="substring-before($remaining, $lf)"/> + </xsl:call-template> + </xsl:variable> + + <xsl:if test="$curTime != $prevTime"> + <xsl:call-template name="printFields"> + <xsl:with-param name="line" select="$line"/> + <xsl:with-param name="lineno" select="$lineno"/> + </xsl:call-template> + </xsl:if> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="printFields"> + <xsl:with-param name="line" select="$line"/> + <xsl:with-param name="lineno" select="'0'"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:if> <xsl:if test="$remaining != ''"> <xsl:call-template name="printLine"> <xsl:with-param name="line" select="substring-before($remaining, $lf)"/> + <xsl:with-param name="lineno" select="$lineno + 1"/> <xsl:with-param name="remaining" select="substring-after($remaining, $lf)"/> </xsl:call-template> </xsl:if> @@ -84,18 +100,34 @@ <xsl:template name="printFields"> <xsl:param name="line"/> + <xsl:param name="lineno"/> <xsl:variable name="value"> - <xsl:call-template name="getFieldByIndex"> - <xsl:with-param name="index" select="$timeField"/> - <xsl:with-param name="line" select="$line"/> - </xsl:call-template> + <xsl:choose> + <xsl:when test="$delta != '' and $delta > 0"> + <xsl:value-of select="'1'"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$timeField"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> </xsl:variable> + <xsl:if test="number($value) = $value or number(substring-before($value, ':')) = substring-before($value, ':')"> <sample> <xsl:attribute name="time"> <xsl:choose> + <xsl:when test="$delta != '' and $delta > 0"> + <xsl:call-template name="sec2time"> + <xsl:with-param name="timeSec"> + <xsl:value-of select="$lineno * 1"/> + </xsl:with-param> + </xsl:call-template> + </xsl:when> <xsl:when test="number($value) = $value"> <!-- We assume time in seconds --> diff --git a/xslt/manualcsv2xml.xslt b/xslt/manualcsv2xml.xslt index 15eb8f00d..83c543581 100644 --- a/xslt/manualcsv2xml.xslt +++ b/xslt/manualcsv2xml.xslt @@ -17,6 +17,7 @@ <xsl:param name="meanDepthField" select="meanDepthField"/> <xsl:param name="divemasterField" select="divemasterField"/> <xsl:param name="buddyField" select="buddyField"/> + <xsl:param name="suitField" select="suitField"/> <xsl:param name="notesField" select="notesField"/> <xsl:param name="weightField" select="weightField"/> <xsl:param name="dateformat" select="dateformat"/> @@ -343,6 +344,15 @@ </buddy> </xsl:if> + <xsl:if test="$suitField >= 0"> + <suit> + <xsl:call-template name="getFieldByIndex"> + <xsl:with-param name="index" select="$suitField"/> + <xsl:with-param name="line" select="$line"/> + </xsl:call-template> + </suit> + </xsl:if> + <xsl:if test="$notesField >= 0"> <notes> <xsl:call-template name="getFieldByIndex"> diff --git a/xslt/uddf-export.xslt b/xslt/uddf-export.xslt index d1d46a9b9..4365702dc 100644 --- a/xslt/uddf-export.xslt +++ b/xslt/uddf-export.xslt @@ -279,11 +279,75 @@ <xsl:value-of select="format-number(substring-before(., ' ') + 273.15, '0.00')"/> </airtemperature> </xsl:for-each> + <xsl:variable name="trimmedweightlist"> + <xsl:for-each select="weightsystem"> + <weight> + <xsl:value-of select="substring-before(@weight, ' ')"/> + </weight> + </xsl:for-each> + </xsl:variable> + <xsl:if test="sum(xt:node-set($trimmedweightlist)/node()) >= 0"> + <equipmentused> + <leadquantity> + <xsl:value-of select="sum(xt:node-set($trimmedweightlist)/node())"/> + </leadquantity> + </equipmentused> + </xsl:if> <xsl:if test="parent::trip"> <tripmembership ref="trip{generate-id(..)}"/> </xsl:if> </informationbeforedive> + <xsl:for-each select="cylinder"> + <tankdata> + <link> + <xsl:attribute name="ref"> + <xsl:choose> + <xsl:when test="@o2 != ''"> + <xsl:value-of select="concat('mix', substring-before(@o2, '.'))"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="'mix21'"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </link> + + <xsl:if test="@size"> + + <tankvolume> + <xsl:value-of select="substring-before(@size, ' ')"/> + </tankvolume> + </xsl:if> + <xsl:choose> + <xsl:when test="@start"> + <tankpressurebegin> + <xsl:value-of select="substring-before(@start, ' ') * 100000"/> + </tankpressurebegin> + </xsl:when> + <xsl:otherwise> + <tankpressurebegin> + <xsl:value-of select="substring-before(divecomputer[1]/sample[@pressure]/@pressure[1], ' ') * 100000"/> + </tankpressurebegin> + </xsl:otherwise> + </xsl:choose> + + <xsl:choose> + <xsl:when test="@end"> + <tankpressureend> + <xsl:value-of select="substring-before(@end, ' ') * 100000"/> + </tankpressureend> + </xsl:when> + <xsl:otherwise> + <tankpressureend> + <xsl:value-of select="substring-before(divecomputer[1]/sample[@pressure][last()]/@pressure, ' ') * 100000"/> + </tankpressureend> + </xsl:otherwise> + </xsl:choose> + + </tankdata> + </xsl:for-each> + <samples> <xsl:for-each select="divecomputer[1]/event | divecomputer[1]/sample"> @@ -483,65 +547,7 @@ </xsl:for-each> </samples> - <xsl:for-each select="cylinder"> - <tankdata> - <link> - <xsl:attribute name="ref"> - <xsl:choose> - <xsl:when test="@o2 != ''"> - <xsl:value-of select="concat('mix', substring-before(@o2, '.'))"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="'mix21'"/> - </xsl:otherwise> - </xsl:choose> - </xsl:attribute> - </link> - - <xsl:if test="@size"> - - <tankvolume> - <xsl:value-of select="substring-before(@size, ' ')"/> - </tankvolume> - </xsl:if> - <xsl:choose> - <xsl:when test="@start"> - <tankpressurebegin> - <xsl:value-of select="substring-before(@start, ' ') * 100000"/> - </tankpressurebegin> - </xsl:when> - <xsl:otherwise> - <tankpressurebegin> - <xsl:value-of select="substring-before(divecomputer[1]/sample[@pressure]/@pressure[1], ' ') * 100000"/> - </tankpressurebegin> - </xsl:otherwise> - </xsl:choose> - - <xsl:choose> - <xsl:when test="@end"> - <tankpressureend> - <xsl:value-of select="substring-before(@end, ' ') * 100000"/> - </tankpressureend> - </xsl:when> - <xsl:otherwise> - <tankpressureend> - <xsl:value-of select="substring-before(divecomputer[1]/sample[@pressure][last()]/@pressure, ' ') * 100000"/> - </tankpressureend> - </xsl:otherwise> - </xsl:choose> - - </tankdata> - </xsl:for-each> - <informationafterdive> - <xsl:variable name="trimmedweightlist"> - <xsl:for-each select="weightsystem"> - <weight> - <xsl:value-of select="substring-before(@weight, ' ')"/> - </weight> - </xsl:for-each> - </xsl:variable> - <xsl:if test="node()/depth/@max != ''"> <greatestdepth> <xsl:value-of select="substring-before(node()/depth/@max, ' ')"/> @@ -605,14 +611,6 @@ </xsl:when> </xsl:choose> </visibility> - <equipmentused> - <leadquantity> - <xsl:if test="sum(xt:node-set($trimmedweightlist)/node()) >= 0"> - <xsl:value-of select="sum(xt:node-set($trimmedweightlist)/node())"/> - </xsl:if> - </leadquantity> - </equipmentused> - </informationafterdive> </dive> |