]> sigrok.org Git - libsigrok.git/blobdiff - src/libsigrok-internal.h
binary_helpers: Add support for 24 bits wide integers.
[libsigrok.git] / src / libsigrok-internal.h
index 22ef892b7d1fc5733678b920c3e9a69c5996021a..bb7e2a9c4334f3cb7e9fc3eee2e4b61dbd13898d 100644 (file)
@@ -172,6 +172,23 @@ static inline uint32_t read_u24le(const uint8_t *p)
        return u;
 }
 
+/**
+ * Read a 24 bits big endian unsigned integer out of memory.
+ * @param x a pointer to the input memory
+ * @return the corresponding unsigned integer
+ */
+static inline uint32_t read_u24be(const uint8_t *p)
+{
+       uint32_t u;
+
+       u = 0;
+       u <<= 8; u |= p[0];
+       u <<= 8; u |= p[1];
+       u <<= 8; u |= p[2];
+
+       return u;
+}
+
 /**
  * Read a 32 bits big endian unsigned integer out of memory.
  * @param x a pointer to the input memory
@@ -615,6 +632,30 @@ static inline uint8_t read_u8_inc(const uint8_t **p)
        return v;
 }
 
+/**
+ * Read unsigned 8bit integer, check length, increment read position.
+ * @param[in, out] p Pointer into byte stream.
+ * @param[in, out] l Remaining input payload length.
+ * @return Retrieved integer value, unsigned.
+ */
+static inline uint8_t read_u8_inc_len(const uint8_t **p, size_t *l)
+{
+       uint8_t v;
+
+       if (!p || !*p)
+               return 0;
+       if (l && *l < sizeof(v)) {
+               *l = 0;
+               return 0;
+       }
+       v = read_u8(*p);
+       *p += sizeof(v);
+       if (l)
+               *l -= sizeof(v);
+
+       return v;
+}
+
 /**
  * Read signed 8bit integer from raw memory, increment read position.
  * @param[in, out] p Pointer into byte stream.
@@ -666,6 +707,30 @@ static inline uint16_t read_u16le_inc(const uint8_t **p)
        return v;
 }
 
+/**
+ * Read unsigned 16bit integer (LE format), check length, increment position.
+ * @param[in, out] p Pointer into byte stream.
+ * @param[in, out] l Remaining input payload length.
+ * @return Retrieved integer value, unsigned.
+ */
+static inline uint16_t read_u16le_inc_len(const uint8_t **p, size_t *l)
+{
+       uint16_t v;
+
+       if (!p || !*p)
+               return 0;
+       if (l && *l < sizeof(v)) {
+               *l = 0;
+               return 0;
+       }
+       v = read_u16le(*p);
+       *p += sizeof(v);
+       if (l)
+               *l -= sizeof(v);
+
+       return v;
+}
+
 /**
  * Read signed 16bit integer from raw memory (big endian format), increment read position.
  * @param[in, out] p Pointer into byte stream.
@@ -1572,6 +1637,9 @@ struct sr_serial_dev_inst {
                SER_BT_CONN_BLE122,     /**!< BLE, BLE122 module, indications */
                SER_BT_CONN_NRF51,      /**!< BLE, Nordic nRF51, notifications */
                SER_BT_CONN_CC254x,     /**!< BLE, TI CC254x, notifications */
+               SER_BT_CONN_AC6328,     /**!< BLE, JL AC6328B, notifications */
+               SER_BT_CONN_DIALOG,     /**!< BLE, dialog DA14580, notifications */
+               SER_BT_CONN_NOTIFY,     /**!< BLE, generic notifications */
                SER_BT_CONN_MAX,        /**!< sentinel */
        } bt_conn_type;
        char *bt_addr_local;
@@ -1581,6 +1649,7 @@ struct sr_serial_dev_inst {
        uint16_t bt_notify_handle_write;
        uint16_t bt_notify_handle_cccd;
        uint16_t bt_notify_value_cccd;
+       uint16_t bt_ble_mtu;
        struct sr_bt_desc *bt_desc;
        GSList *bt_source_args;
 #endif
@@ -2096,7 +2165,8 @@ SR_PRIV int sr_bt_config_addr_remote(struct sr_bt_desc *desc, const char *addr);
 SR_PRIV int sr_bt_config_rfcomm(struct sr_bt_desc *desc, size_t channel);
 SR_PRIV int sr_bt_config_notify(struct sr_bt_desc *desc,
        uint16_t read_handle, uint16_t write_handle,
-       uint16_t cccd_handle, uint16_t cccd_value);
+       uint16_t cccd_handle, uint16_t cccd_value,
+       uint16_t ble_mtu);
 
 SR_PRIV int sr_bt_scan_le(struct sr_bt_desc *desc, int duration);
 SR_PRIV int sr_bt_scan_bt(struct sr_bt_desc *desc, int duration);
@@ -2151,11 +2221,13 @@ enum binary_value_type {
        BVT_LE_UINT8 = BVT_UINT8,
 
        BVT_BE_UINT16,
+       BVT_BE_UINT24,
        BVT_BE_UINT32,
        BVT_BE_UINT64,
        BVT_BE_FLOAT,
 
        BVT_LE_UINT16,
+       BVT_LE_UINT24,
        BVT_LE_UINT32,
        BVT_LE_UINT64,
        BVT_LE_FLOAT,
@@ -2163,22 +2235,12 @@ enum binary_value_type {
 
 /** Binary value specification */
 struct binary_value_spec {
-       size_t offset;                  /**!< Offset into binary blob */
+       size_t offset;                  /**!< Offset into binary image */
        enum binary_value_type type;    /**!< Data type to decode */
-       float scale;                    /**!< Scale factor to native units */
-};
-
-/** Binary channel definition */
-struct binary_analog_channel {
-       const char *name;               /**!< Channel name */
-       struct binary_value_spec spec;  /**!< Binary value in data stream */
-       int digits;                     /**!< Significant digits */
-       enum sr_mq mq;                  /**!< Measured quantity */
-       enum sr_unit unit;              /**!< Measured unit */
 };
 
 /**
- * Read extract a value from a binary blob.
+ * Read extract a value from a binary data image.
  *
  * @param[out] out Pointer to output buffer (conversion result)
  * @param[in] spec Binary value specification
@@ -2190,22 +2252,6 @@ struct binary_analog_channel {
 SR_PRIV int bv_get_value(float *out, const struct binary_value_spec *spec,
        const void *data, size_t length);
 
-/**
- * Send an analog channel packet based on a binary analog channel
- * specification.
- *
- * @param[in] sdi Device instance
- * @param[in] ch Sigrok channel
- * @param[in] spec Channel specification
- * @param[in] data Pointer to binary blob
- * @param[in] length Size of binary blob
- *
- * @return SR_OK on success, SR_ERR_* error code on failure.
- */
-SR_PRIV int bv_send_analog_channel(const struct sr_dev_inst *sdi,
-       struct sr_channel *ch, const struct binary_analog_channel *spec,
-       const void *data, size_t length);
-
 /*--- crc.c -----------------------------------------------------------------*/
 
 #define SR_CRC16_DEFAULT_INIT 0xffffU