blob: b1aee34788b4bb86d02d83a3f899386918e0b5b4 [file] [log] [blame]
/*
* Copyright (c) 2023 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "friendship_common.h"
#include "mesh_test.h"
#define LOG_MODULE_NAME friendship_common
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(LOG_MODULE_NAME);
static uint16_t bt_mesh_test_friend_lpn_addr;
static ATOMIC_DEFINE(bt_mesh_test_friendship_state, BT_MESH_TEST_FRIENDSHIP_FLAGS);
static struct k_sem bt_mesh_test_friendship_events[BT_MESH_TEST_FRIENDSHIP_FLAGS];
static void evt_signal(enum bt_mesh_test_friendship_evt_flags evt)
{
atomic_set_bit(bt_mesh_test_friendship_state, evt);
k_sem_give(&bt_mesh_test_friendship_events[evt]);
}
int bt_mesh_test_friendship_evt_wait(enum bt_mesh_test_friendship_evt_flags evt,
k_timeout_t timeout)
{
return k_sem_take(&bt_mesh_test_friendship_events[evt], timeout);
}
void bt_mesh_test_friendship_evt_clear(enum bt_mesh_test_friendship_evt_flags evt)
{
atomic_clear_bit(bt_mesh_test_friendship_state, evt);
k_sem_reset(&bt_mesh_test_friendship_events[evt]);
}
bool bt_mesh_test_friendship_state_check(enum bt_mesh_test_friendship_evt_flags evt)
{
return atomic_test_bit(bt_mesh_test_friendship_state, evt);
}
uint16_t bt_mesh_test_friendship_addr_get(void)
{
return bt_mesh_test_friend_lpn_addr;
}
void bt_mesh_test_friendship_init(int max_evt_count)
{
for (int i = 0; i < ARRAY_SIZE(bt_mesh_test_friendship_events); i++) {
k_sem_init(&bt_mesh_test_friendship_events[i], 0, max_evt_count);
}
}
static void friend_established(uint16_t net_idx, uint16_t lpn_addr,
uint8_t recv_delay, uint32_t polltimeout)
{
LOG_INF("Friend: established with 0x%04x", lpn_addr);
bt_mesh_test_friend_lpn_addr = lpn_addr;
evt_signal(BT_MESH_TEST_FRIEND_ESTABLISHED);
}
static void friend_terminated(uint16_t net_idx, uint16_t lpn_addr)
{
LOG_INF("Friend: terminated with 0x%04x", lpn_addr);
evt_signal(BT_MESH_TEST_FRIEND_TERMINATED);
}
static void friend_polled(uint16_t net_idx, uint16_t lpn_addr)
{
LOG_INF("Friend: Poll from 0x%04x", lpn_addr);
evt_signal(BT_MESH_TEST_FRIEND_POLLED);
}
BT_MESH_FRIEND_CB_DEFINE(friend) = {
.established = friend_established,
.terminated = friend_terminated,
.polled = friend_polled,
};
static void lpn_established(uint16_t net_idx, uint16_t friend_addr,
uint8_t queue_size, uint8_t recv_window)
{
LOG_INF("LPN: established with 0x%04x", friend_addr);
evt_signal(BT_MESH_TEST_LPN_ESTABLISHED);
}
static void lpn_terminated(uint16_t net_idx, uint16_t friend_addr)
{
LOG_INF("LPN: terminated with 0x%04x", friend_addr);
evt_signal(BT_MESH_TEST_LPN_TERMINATED);
}
static void lpn_polled(uint16_t net_idx, uint16_t friend_addr, bool retry)
{
LOG_INF("LPN: Polling 0x%04x (%s)", friend_addr,
retry ? "retry" : "initial");
evt_signal(BT_MESH_TEST_LPN_POLLED);
}
BT_MESH_LPN_CB_DEFINE(lpn) = {
.established = lpn_established,
.polled = lpn_polled,
.terminated = lpn_terminated,
};