Bluenet  5.7.0
Bluenet, firmware for nRF52 smart home devices
Loading...
Searching...
No Matches
cs_MeshModelMulticastAcked.h
Go to the documentation of this file.
1/*
2 * Author: Crownstone Team
3 * Copyright: Crownstone (https://crownstone.rocks)
4 * Date: Apr 1, 2020
5 * License: LGPLv3+, Apache License 2.0, and/or MIT (triple-licensed)
6 */
7
8#pragma once
9
10#include <mesh/cs_MeshCommon.h>
11#include <third/std/function.h>
13
14extern "C" {
15#include <access.h>
16}
17
25public:
27 typedef function<void(MeshMsgEvent& msg)> callback_msg_t;
28
32 void registerMsgHandler(const callback_msg_t& closure);
33
37 void init(uint16_t modelId);
38
44 void configureSelf(dsm_handle_t appkeyHandle);
45
53
58
62 void tick(uint32_t tickCount);
63
65 void handleMsg(const access_message_rx_t* accessMsg);
66
67private:
68 const static uint8_t QUEUE_SIZE = 5;
69
70 const static uint8_t QUEUE_INDEX_NONE = 255;
71
72 struct __attribute__((__packed__)) cs_multicast_acked_queue_item_t {
74 uint8_t numStoneIds;
77 uint8_t msgSize;
78 uint8_t* msgPtr = nullptr;
79 };
80
81 access_model_handle_t _accessModelHandle = ACCESS_HANDLE_INVALID;
82
83 dsm_handle_t _groupAddressHandle = DSM_HANDLE_INVALID;
84
86
88
93
97 uint8_t _queueIndexNext = 0;
98
104
108 TYPIFY(CONFIG_CROWNSTONE_ID) _ownStoneId = 0;
109
114
118 void cancelQueueItem(uint8_t index);
119
123 void remQueueItem(uint8_t index);
124
129
136 int getNextItemInQueue(bool priority);
137
143
148
152 cs_ret_code_t sendMsg(const uint8_t* data, uint16_t len);
153
157 void sendReply(const access_message_rx_t* accessMsg, const uint8_t* data, uint16_t len);
158
163
168 void checkDone();
169
173 void retryMsg();
174};
Class that holds a bitmask of variable size.
Definition: cs_BitmaskVarSize.h:17
Class that:
Definition: cs_MeshModelMulticastAcked.h:24
dsm_handle_t _groupAddressHandle
Definition: cs_MeshModelMulticastAcked.h:83
BitmaskVarSize _ackedStonesBitmask
Bitmask of acked stones.
Definition: cs_MeshModelMulticastAcked.h:103
void tick(uint32_t tickCount)
To be called at a regular interval.
bool sendMsgFromQueue()
Get a msg from the queue, and send it.
bool prepareForMsg(cs_multicast_acked_queue_item_t *item)
Prepare for sending a new message.
access_model_handle_t _accessModelHandle
Definition: cs_MeshModelMulticastAcked.h:81
void processQueue()
Send messages from queue.
void cancelQueueItem(uint8_t index)
If item at index is in progress, cancel it.
cs_multicast_acked_queue_item_t _queue[QUEUE_SIZE]
Definition: cs_MeshModelMulticastAcked.h:87
int getNextItemInQueue(bool priority)
Check if there is a msg in queue with more than 0 transmissions.
void configureSelf(dsm_handle_t appkeyHandle)
Configure the model.
uint8_t _queueIndexNext
Next index in queue to send.
Definition: cs_MeshModelMulticastAcked.h:97
void handleMsg(const access_message_rx_t *accessMsg)
Internal usage.
void handleReply(MeshMsgEvent &msg)
Handle an ack message.
static const uint8_t QUEUE_INDEX_NONE
Definition: cs_MeshModelMulticastAcked.h:70
static const uint8_t QUEUE_SIZE
Definition: cs_MeshModelMulticastAcked.h:68
void retryMsg()
Retry sending (parts of) the message.
cs_ret_code_t remFromQueue(cs_mesh_model_msg_type_t type, uint16_t id)
Remove a msg from the queue.
callback_msg_t _msgCallback
Definition: cs_MeshModelMulticastAcked.h:85
cs_ret_code_t addToQueue(MeshUtil::cs_mesh_queue_item_t &item)
Add a msg to an empty spot in the queue (transmissions == 0).
function< void(MeshMsgEvent &msg)> callback_msg_t
Callback function definition.
Definition: cs_MeshModelMulticastAcked.h:27
void checkDone()
Check if ack from every stone ID in the list has been received.
void sendReply(const access_message_rx_t *accessMsg, const uint8_t *data, uint16_t len)
Send an ack message.
void registerMsgHandler(const callback_msg_t &closure)
Register a callback function that's called when a message from the mesh is received.
uint16_t _processCallsLeft
Number of processQueue() calls left until timeout.
Definition: cs_MeshModelMulticastAcked.h:113
void init(uint16_t modelId)
Init the model.
cs_ret_code_t sendMsg(const uint8_t *data, uint16_t len)
Send a message over the mesh via publish, without reply.
void remQueueItem(uint8_t index)
Remove an item from the queue.
TYPIFY(CONFIG_CROWNSTONE_ID) _ownStoneId=0
uint8_t _queueIndexInProgress
Queue index of message currently being sent.
Definition: cs_MeshModelMulticastAcked.h:92
Definition: cs_MeshMsgEvent.h:71
cs_mesh_model_msg_type_t
Definition: cs_MeshModelPackets.h:61
uint16_t cs_control_cmd_t
Definition: cs_Typedefs.h:22
uint8_t stone_id_t
Definition: cs_Typedefs.h:23
uint16_t cs_ret_code_t
Definition: cs_Typedefs.h:21
@ CONFIG_CROWNSTONE_ID
Definition: cs_MeshModelMulticastAcked.h:72
uint8_t numStoneIds
Definition: cs_MeshModelMulticastAcked.h:74
stone_id_t * stoneIdsPtr
Definition: cs_MeshModelMulticastAcked.h:75
MeshUtil::cs_mesh_queue_item_meta_data_t metaData
Definition: cs_MeshModelMulticastAcked.h:73
uint8_t msgSize
Definition: cs_MeshModelMulticastAcked.h:77
cs_control_cmd_t controlCommand
Definition: cs_MeshModelMulticastAcked.h:76
Data needed in each model queue.
Definition: cs_MeshCommon.h:22
Struct to queue an item.
Definition: cs_MeshCommon.h:48