diff HardwareOperations.h @ 1:0b3630a29ad8

Initial version based on previous repository. Project was ported to QT6 and in now cmake based.
author Ideenmodellierer <tiefenrauscher@web.de>
date Thu, 27 Nov 2025 18:40:28 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HardwareOperations.h	Thu Nov 27 18:40:28 2025 +0100
@@ -0,0 +1,401 @@
+//////////////////////////////////////////////////////////////////////////////
+/// \file   HardwareOperations.h
+/// \brief  API for HW dive computer drivers.
+/// \author JD Gascuel.
+/// \sa     OSTC3Operations.h
+///
+/// \copyright (c) 2011-2016 JD Gascuel. All rights reserved.
+/// $Id$
+//////////////////////////////////////////////////////////////////////////////
+//
+// BSD 2-Clause License:
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
+//
+//////////////////////////////////////////////////////////////////////////////
+// HISTORY
+//  2012-09-22 : [jDG] Initial version, made for OSTC Companion.
+//  2014-07-07 : [jDG] Cleanups for Subsurface google-summer-of-code.
+//  2014-07-25 : [jDG] BSD 2-clause license.
+//  2016-07-14 : ÍjDG] Adding codes for hardware variants of OSTC2/3/4.
+
+#ifndef HARDWARE_OPERATIONS_H
+#define HARDWARE_OPERATIONS_H
+
+#include <QDateTime>
+#include <QImage>
+#include <QString>
+#include <QStringList>
+#include <QSize>
+#include <QRegularExpression>
+
+#ifdef TEST_MODE
+#   include "test/SerialTest.h"
+#else
+#   include "Serial.h"
+#endif
+
+class HexFile;
+
+//////////////////////////////////////////////////////////////////////////////
+/// \brief  API for HW dive computer drivers.
+///
+/// This class include high level commands used by the *Companion* GUI,
+/// and other generic services:
+/// - List of currently known serial ports:
+///   listBluetoothPorts() or listUSBPorts().
+///
+/// - Send a command, and wait for the proper acknowledge: retryCommand().
+///
+/// \sa OSTCFrogOperations, OSTC2cOperations, OSTC3Operations,
+/// \nosubgrouping
+class HardwareOperations
+{
+protected:
+#ifdef TEST_MODE
+    /// \brief Fake communication port used for mockup operations.
+    SerialTest  _serial;
+#else
+    /// \brief Communication port used for all I/O operations.
+    ///
+    /// Note that in *emulation mode*, aka TEST_MODE, this is replaced by
+    /// an instance of SerialTest.
+    Serial      _serial;
+#endif
+
+public:
+    //////////////////////////////////////////////////////////////////////////
+    /// \name Class management
+    /// \{
+    ///
+    /// Managing the hierarchy of driver classes used to handle the various
+    /// existing H&W devices.
+
+    /// \brief mandatory (and empty) virtual descructor in the base class.
+    virtual ~HardwareOperations() {}
+
+    //------------------------------------------------------------------------
+    /// \brief The name of the computer driver.
+    /// \returns the name of a particular driver implementation,
+    /// eg. "OSTCSport", "OSTC2c", "OSTC3", ...
+    virtual QString model() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Gives access to serial port in use.
+    /// Used for other high and low level operations, eg. in *OSTC Planner*.
+    inline Serial& serial() { return _serial; }
+
+    /// \}
+    //////////////////////////////////////////////////////////////////////////
+    /// \name Introspection
+    /// \{
+    ///
+    /// Methods available to ask the connected device what it does support,
+    /// and how to manage it.
+
+    //------------------------------------------------------------------------
+    /// \brief Optional features present in the dive computer hardware.
+    ///
+    /// 8 bit mask. See HardwareDescriptor for known combinations.
+    ///
+    enum HardwareOption {
+        HW_CHARGEABLE_BATTERY= 0x01,    ///< Recharge option.
+        HW_LIGHT_SENSOR      = 0x02,    ///< Detects light level, and tune screen.
+        HW_S8_COM            = 0x04,    ///< Analog connector to O2 cells.
+        HW_OPTICAL_COM       = 0x08,    ///< Digital connector to O2 cells.
+        HW_BLUETOOTH_COM     = 0x10,    ///< Bluetooth, hence no USB connection.
+        HW_DUALCORE          = 0x20,    ///< Dual core processor.
+    };
+
+    ///-----------------------------------------------------------------------
+    /// \brief Dive computer set of features.
+    ///
+    /// Set of features present on a given H&W dive computers.
+    /// \note that several versions exists of a given computer, and there
+    /// is not a uniq mapping of a given feature set to a dive computer
+    /// (eg. 0x13 is ambiguous).
+    ///
+    enum HardwareDescriptor {
+        HW_UNKNOWN_OSTC = 0,
+        HW_Frog        = HW_BLUETOOTH_COM,
+        HW_OSTCSport_a = HW_LIGHT_SENSOR | HW_BLUETOOTH_COM,
+        HW_OSTCSport_b = HW_OSTCSport_a | HW_CHARGEABLE_BATTERY,
+        HW_OSTC2c      = HW_CHARGEABLE_BATTERY,
+        HW_OSTC2_a     = HW_CHARGEABLE_BATTERY | HW_BLUETOOTH_COM,
+        HW_OSTC2_b     = HW_OSTCSport_b,
+        HW_OSTC2_c     = HW_OSTC2_b | HW_OPTICAL_COM,
+        HW_OSTC3       = HW_LIGHT_SENSOR | HW_OPTICAL_COM,
+        HW_OSTC3p_a    = HW_LIGHT_SENSOR | HW_OPTICAL_COM | HW_BLUETOOTH_COM,
+        HW_OSTC3p_b    = HW_OSTCSport_b,
+        HW_OSTCcR_a    = HW_CHARGEABLE_BATTERY | HW_S8_COM,
+        HW_OSTCcR_b    = HW_OSTCcR_a | HW_LIGHT_SENSOR,
+        HW_OSTC4       = HW_DUALCORE|HW_BLUETOOTH_COM|
+                         HW_OPTICAL_COM|HW_LIGHT_SENSOR|HW_CHARGEABLE_BATTERY
+    };
+
+    //------------------------------------------------------------------------
+    /// \brief Ask the connect device for its hardware options.
+    ///
+    /// This is used to guess the device model, even if there is no unicity.
+    HardwareDescriptor hardwareDescriptor();
+
+    //------------------------------------------------------------------------
+    /// \brief Features supported by OSTC Companion on the connected device.
+    ///
+    /// Each driver (instance of this class) is requested to tell *Companion*
+    /// what are the supported command.
+    ///
+    enum CompanionFeatures {
+        PARAMETERS   = (1<<0),  ///< Download/Edit/Upload various parameters.
+        DATE         = (1<<1),  ///< Set date & time.
+        NAME         = (1<<2),  ///< Set custom text displayed on main screen.
+        ICON         = (1<<3),  ///< Set custom image displayed on main screen.
+        DUMPSCREEN   = (1<<4),  ///< Makes copy of current screen.
+        FIRMWARE     = (1<<5),  ///< Do firmware upgrades.
+        HELIUM_DIVE  = (1<<6),  ///< Computes deco stops for trimix dives.
+        CCR_DIVE     = (1<<7),  ///< Computes deco stops for rebreather dives.
+        BLUETOOTH    = (1<<8),  ///< Use Bluetooh communication (instead of USB)
+        VPM_MODEL    = (1<<9),  ///< Also propose VPM deco stops.
+        SIGNAL_CHECK = (1<<10)  ///< Echo signal quality for bluetooth computer
+    };
+
+    /// \brief Tells what is supported for a given computer.
+    virtual CompanionFeatures supported() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Length of the custom text displayed by the device.
+    ///
+    /// \returns (w,h), where \a w is text width (in chars), and \a h is the
+    /// number of lines.
+    /// Used by *Companion* GUI to format user input.
+    virtual QSize nameSize() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief filename matching template for compatible firmware.
+    ///
+    /// Used by the *Upgrade Firmware...* command to propose only firmwares
+    /// designed for the connected device.
+    virtual QString firmwareTemplate() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Read in the specific firmware file format.
+    ///
+    /// History is a bit complex here, and the published firmware have
+    /// different file formats (due to support tool, and/or need for
+    /// encryption).
+    /// So each driver have to implement its specific loader.
+    virtual void loadFirmware(HexFile&, const QString& fileName) const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Regular expression to filter *USB* or *Bluetooth* port names.
+    ///
+    /// Used to propose only the list of ports that matches the serial ports
+    /// compatible with USB/Bluetooth emulation and the connected dive
+    /// computer.
+ //   virtual QRegExp portTemplate() const = 0;
+    virtual QRegularExpression portTemplate() const = 0;
+    /// \}
+    //////////////////////////////////////////////////////////////////////////
+    /// \name High level commands
+    /// \{
+    ///
+    /// Commands that implement the specific protocol for a device, to perform
+    /// all services needed by *OSTC Copmanion*.
+
+    //------------------------------------------------------------------------
+    /// \brief Open download mode communication to the dive computer.
+    ///
+    /// Open comm port, start download mode, check the blessed reply,
+    /// and get the computer identity (for description() ).
+    ///
+    /// \note this mode allows common commands to be processed, but not
+    ///       firmware upgrade.
+    ///
+    /// \returns TRUE is everything went well.
+    /// \sa connectServiceMode() and disconnect().
+    virtual bool connect() = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Open service mode communication to the dive computer.
+    ///
+    /// Open comm port, start service mode, check the blessed reply.
+    /// \note this mode is mandatory to allow upgradeFW().
+    ///
+    /// \returns TRUE is everything went well.
+    /// \sa connect() and disconnect().
+    virtual void connectServiceMode() = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Echo a message on the connected device screen.
+    ///
+    /// Used on most devices to display commands as they are processed,
+    /// so the user can see *OSTC Companion* is working properly, by seeing
+    /// progress on the dive computer itself.
+    virtual void writeText(const QString& msg) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Set HW dive computer date and time.
+    virtual void setDate(const QDateTime& date) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Set HW dive computer user text.
+    virtual void setName(const QString& newName) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Display signal quality at OSTC.
+    virtual void getSignal() = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Read all header from OSTC
+    virtual void getAllHeader(unsigned char* pBuffer) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Write all header from OSTC
+    virtual void writeAllHeader(unsigned char* pBuffer) = 0;
+
+
+    //------------------------------------------------------------------------
+    /// \brief Read all samples from OSTC
+    virtual void getAllSamples(unsigned char* pBuffer) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Write all samples to OSTC
+    virtual void writeAllSamples(unsigned char* pBuffer) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Set HW dive computer icon set
+    ///
+    /// *Currently only supported by Frog dive computer*.
+    virtual void setIcons(const QString& fileName) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Take a snapshot of the connected computer's screen.
+    ///
+    /// *Currently only supported by OSTC mk2/2n/2c dive computers*.
+    virtual QImage dumpScreen() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Upgrade HW dive computer firmware.
+    ///
+    /// \note needs service mode connection.
+    /// \sa connectServiceMode().
+    virtual void upgradeFW(const QString& fileName) = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Close connection.
+    ///
+    /// Exit service mode, and close everything.
+    /// \p closing should be set when ending Companion, so
+    /// an error make a won't crash if the interface is already
+    /// deleted.
+    virtual bool disconnect(bool closing = false) = 0;
+
+    /// \}
+    //////////////////////////////////////////////////////////////////////////
+    /// \name Low level protocol
+    /// \{
+    ///
+    /// Command and methods that have to be implemented for each device
+    /// to retrieve device descriptions.
+
+    //------------------------------------------------------------------------
+    /// \brief List all communication ports
+    ///
+    /// That are (or might be) used by HW dive computers.
+    virtual QStringList listPorts() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief Send a command, wait ack, and retry on error.
+    ///
+    /// Service common to all current H&W dive computer: send a command byte,
+    /// and wait it is dully acknowledged.
+    /// Allow up to 10x retries when the computer does not answer anything,
+    /// or reply something else.
+    ///
+    /// \param [in,out] serial: the connected port to use.
+    /// \param [in]        cmd: command byte to send.
+    /// \param [in]    retries: Optional max number of retries. Default to 10.
+    ///
+    /// \returns the ack byte (if any), or 0xFF if never received.
+    static  unsigned char retryCommand(Serial& serial,
+                                             unsigned char cmd,
+                                             int retries = 10);
+
+    //------------------------------------------------------------------------
+    /// \brief Read and check connected dive computer identity.
+    ///
+    /// Read fw's version, serial number and custom text from connected computer.
+    ///
+    /// \throws when the connected device does not matches the driver
+    /// implementation.
+    ///
+    /// \sa description(), firmware(), serialNumber() and customtext().
+    virtual void getIdentity() = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief The fw's version found during the last getIdentty().
+    /// \sa getIDentity().
+    virtual int firmware() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief The serial number found during the last getIdentty().
+    /// \sa getIDentity().
+    virtual int serialNumber() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief The user-defined string found during the last getIdentty().
+    /// \sa getIDentity().
+    virtual QString customText() const = 0;
+
+    //------------------------------------------------------------------------
+    /// \brief A human readable description of connected computer.
+    ///
+    /// Returns driver name, and identity data found during the last call to
+    /// getIdentity().
+    ///
+    /// \sa model(), getIntentity()
+    virtual QString description() = 0;
+
+    /// \}
+    //////////////////////////////////////////////////////////////////////////
+
+protected:
+    //------------------------------------------------------------------------
+    /// \brief List serial ports for *Bluetooth* based devices.
+    ///
+    /// Ask *OS* for the list of *Bluetooth* serial emulations whose name
+    /// matches the portTemplate() regular expression.
+    ///
+    QStringList listBluetoothPorts() const;
+
+    //------------------------------------------------------------------------
+    /// \brief List serial ports for USB based devices.
+    ///
+    /// Ask *OS* for the list of USB serial emulation currently connected whose name
+    /// matches the portTemplate() regular expression.
+    QStringList listUSBPorts() const;
+
+};
+
+#endif // COMPUTEROPERATIONS_H