LCOV - code coverage report
Current view: top level - zephyr/bluetooth/mesh - blob_srv.h Hit Total Coverage
Test: new.info Lines: 14 32 43.8 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2020 Nordic Semiconductor ASA
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_
       8             : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_
       9             : 
      10             : #include <zephyr/bluetooth/mesh/access.h>
      11             : #include <zephyr/bluetooth/mesh/blob.h>
      12             : 
      13             : #ifdef __cplusplus
      14             : extern "C" {
      15             : #endif
      16             : 
      17             : /**
      18             :  * @defgroup bt_mesh_blob_srv Bluetooth Mesh BLOB Transfer Server model API
      19             :  * @ingroup bt_mesh
      20             :  * @{
      21             :  */
      22             : 
      23             : struct bt_mesh_blob_srv;
      24             : 
      25             : /**
      26             :  *
      27             :  *  @brief Max number of blocks in a single transfer.
      28             :  */
      29             : #if defined(CONFIG_BT_MESH_BLOB_SRV)
      30             : #define BT_MESH_BLOB_BLOCKS_MAX                                                \
      31             :         (DIV_ROUND_UP(CONFIG_BT_MESH_BLOB_SIZE_MAX,                        \
      32             :                           CONFIG_BT_MESH_BLOB_BLOCK_SIZE_MIN))
      33             : #else
      34           1 : #define BT_MESH_BLOB_BLOCKS_MAX 1
      35             : #endif
      36             : 
      37             : /**
      38             :  *
      39             :  *  @brief BLOB Transfer Server model composition data entry.
      40             :  *
      41             :  *  @param _srv Pointer to a @ref bt_mesh_blob_srv instance.
      42             :  */
      43           1 : #define BT_MESH_MODEL_BLOB_SRV(_srv)                                           \
      44             :         BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_BLOB_SRV, _bt_mesh_blob_srv_op,      \
      45             :                          NULL, _srv, &_bt_mesh_blob_srv_cb)
      46             : 
      47             : /** @brief BLOB Transfer Server model event handlers.
      48             :  *
      49             :  *  All callbacks are optional.
      50             :  */
      51           1 : struct bt_mesh_blob_srv_cb {
      52             :         /** @brief Transfer start callback.
      53             :          *
      54             :          *  Called when the transfer has started with the prepared BLOB ID.
      55             :          *
      56             :          *  @param srv  BLOB Transfer Server instance.
      57             :          *  @param ctx  Message context for the incoming start message. The
      58             :          *              entire transfer will be sent from the same source
      59             :          *              address.
      60             :          *  @param xfer Transfer parameters.
      61             :          *
      62             :          *  @return 0 on success, or (negative) error code to reject the
      63             :          *          transfer.
      64             :          */
      65           1 :         int (*start)(struct bt_mesh_blob_srv *srv, struct bt_mesh_msg_ctx *ctx,
      66             :                      struct bt_mesh_blob_xfer *xfer);
      67             : 
      68             :         /** @brief Transfer end callback.
      69             :          *
      70             :          *  Called when the transfer ends, either because it was cancelled, or
      71             :          *  because it finished successfully. A new transfer may be prepared.
      72             :          *
      73             :          *  @note The transfer may end before it's started if the start
      74             :          *        parameters are invalid.
      75             :          *
      76             :          *  @param srv     BLOB Transfer Server instance.
      77             :          *  @param id      BLOB ID of the cancelled transfer.
      78             :          *  @param success Whether the transfer was successful.
      79             :          */
      80           1 :         void (*end)(struct bt_mesh_blob_srv *srv, uint64_t id, bool success);
      81             : 
      82             :         /** @brief Transfer suspended callback.
      83             :          *
      84             :          *  Called if the Server timed out while waiting for a transfer packet.
      85             :          *  A suspended transfer may resume later from the start of the current
      86             :          *  block. Any received chunks in the current block should be discarded,
      87             :          *  they will be received again if the transfer resumes.
      88             :          *
      89             :          *  The transfer will call @c resumed again when resuming.
      90             :          *
      91             :          *  @note The BLOB Transfer Server does not run a timer in the suspended state,
      92             :          *        and it's up to the application to determine whether the
      93             :          *        transfer should be permanently cancelled. Without interaction,
      94             :          *        the transfer will be suspended indefinitely, and the BLOB Transfer
      95             :          *        Server will not accept any new transfers.
      96             :          *
      97             :          *  @param srv BLOB Transfer Server instance.
      98             :          */
      99           1 :         void (*suspended)(struct bt_mesh_blob_srv *srv);
     100             : 
     101             :         /** @brief Transfer resume callback.
     102             :          *
     103             :          *  Called if the transfer is resumed after being suspended.
     104             :          *
     105             :          *  @param srv BLOB Transfer Server instance.
     106             :          */
     107           1 :         void (*resume)(struct bt_mesh_blob_srv *srv);
     108             : 
     109             :         /** @brief Transfer recovery callback.
     110             :          *
     111             :          *  Called when the Bluetooth Mesh subsystem is started if the device is rebooted
     112             :          *  in the middle of a transfer.
     113             :          *
     114             :          *  Transfers will not be resumed after a reboot if this callback is not
     115             :          *  defined.
     116             :          *
     117             :          *  @param srv  BLOB Transfer Server instance.
     118             :          *  @param xfer Transfer to resume.
     119             :          *  @param io   BLOB stream return parameter. Must be set to a valid
     120             :          *              BLOB stream by the callback.
     121             :          *
     122             :          *  @return 0 on success, or (negative) error code to abandon the
     123             :          *          transfer.
     124             :          */
     125           1 :         int (*recover)(struct bt_mesh_blob_srv *srv,
     126             :                        struct bt_mesh_blob_xfer *xfer,
     127             :                        const struct bt_mesh_blob_io **io);
     128             : };
     129             : 
     130             : /** @brief BLOB Transfer Server model instance. */
     131           1 : struct bt_mesh_blob_srv {
     132             :         /** Event handler callbacks. */
     133           1 :         const struct bt_mesh_blob_srv_cb *cb;
     134             : 
     135             :         /* Runtime state: */
     136           0 :         const struct bt_mesh_blob_io *io;
     137           0 :         struct k_work_delayable rx_timeout;
     138           0 :         struct bt_mesh_blob_block block;
     139           0 :         const struct bt_mesh_model *mod;
     140           0 :         enum bt_mesh_blob_xfer_phase phase;
     141             : 
     142           0 :         struct bt_mesh_blob_srv_state {
     143           0 :                 struct bt_mesh_blob_xfer xfer;
     144           0 :                 uint16_t cli;
     145           0 :                 uint16_t app_idx;
     146           0 :                 uint16_t timeout_base;
     147           0 :                 uint16_t mtu_size;
     148           0 :                 uint8_t ttl;
     149             : 
     150             :                 /* Bitfield of pending blocks. */
     151           0 :                 ATOMIC_DEFINE(blocks, BT_MESH_BLOB_BLOCKS_MAX);
     152           0 :         } state;
     153             : 
     154             :         /* Pull mode (Pull BLOB Transfer Mode) behavior. */
     155             :         struct {
     156           0 :                 uint16_t chunk_idx;
     157           0 :                 struct k_work_delayable report;
     158           0 :         } pull;
     159             : };
     160             : 
     161             : /** @brief Prepare BLOB Transfer Server for an incoming transfer.
     162             :  *
     163             :  *  Before a BLOB Transfer Server can receive a transfer, the transfer must be prepared
     164             :  *  through some application level mechanism. The BLOB Transfer Server will only accept
     165             :  *  incoming transfers with a matching BLOB ID.
     166             :  *
     167             :  *  @param srv          BLOB Transfer Server instance.
     168             :  *  @param id           BLOB ID to accept.
     169             :  *  @param io           BLOB stream to write the incoming BLOB to.
     170             :  *  @param ttl          Time to live value to use in responses to the BLOB Transfer Client.
     171             :  *  @param timeout_base Extra time for the Client to respond in addition to the
     172             :  *                      base 10 seconds, in 10-second increments.
     173             :  *
     174             :  *  @return 0 on success, or (negative) error code on failure.
     175             :  */
     176           1 : int bt_mesh_blob_srv_recv(struct bt_mesh_blob_srv *srv, uint64_t id,
     177             :                           const struct bt_mesh_blob_io *io, uint8_t ttl,
     178             :                           uint16_t timeout_base);
     179             : 
     180             : /** @brief Cancel the current BLOB transfer.
     181             :  *
     182             :  *  Tells the BLOB Transfer Client to drop this device from the list of Targets for the
     183             :  *  current transfer. Note that the client may continue sending the transfer to
     184             :  *  other Targets.
     185             :  *
     186             :  *  @param srv BLOB Transfer Server instance.
     187             :  *
     188             :  *  @return 0 on success, or (negative) error code on failure.
     189             :  */
     190           1 : int bt_mesh_blob_srv_cancel(struct bt_mesh_blob_srv *srv);
     191             : 
     192             : /** @brief Get the current state of the BLOB Transfer Server.
     193             :  *
     194             :  *  @param srv BLOB Transfer Server instance.
     195             :  *
     196             :  *  @return true if the BLOB Transfer Server is currently participating in a transfer,
     197             :  *          false otherwise.
     198             :  */
     199           1 : bool bt_mesh_blob_srv_is_busy(const struct bt_mesh_blob_srv *srv);
     200             : 
     201             : /** @brief Get the current progress of the active transfer in percent.
     202             :  *
     203             :  *  @param srv BLOB Transfer Server instance.
     204             :  *
     205             :  *  @return The current transfer progress, or 0 if no transfer is active.
     206             :  */
     207           1 : uint8_t bt_mesh_blob_srv_progress(const struct bt_mesh_blob_srv *srv);
     208             : 
     209             : /** @cond INTERNAL_HIDDEN */
     210             : extern const struct bt_mesh_model_op _bt_mesh_blob_srv_op[];
     211             : extern const struct bt_mesh_model_cb _bt_mesh_blob_srv_cb;
     212             : /** @endcond */
     213             : 
     214             : /** @} */
     215             : 
     216             : #ifdef __cplusplus
     217             : }
     218             : #endif
     219             : 
     220             : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_ */

Generated by: LCOV version 1.14