2023-03-20 06:25:10 -04:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "hal/ieee802154_ll.h"
|
|
|
|
#include "esp_ieee802154_pib.h"
|
|
|
|
#include "esp_ieee802154_util.h"
|
|
|
|
|
|
|
|
static ieee802154_pib_t s_ieee802154_pib;
|
|
|
|
static bool is_pending = false;
|
|
|
|
|
|
|
|
static inline void set_pending(void)
|
|
|
|
{
|
|
|
|
is_pending = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void clr_pending(void)
|
|
|
|
{
|
|
|
|
is_pending = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool inline ieee802154_pib_is_pending(void)
|
|
|
|
{
|
|
|
|
return is_pending;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_init(void)
|
|
|
|
{
|
|
|
|
memset(&s_ieee802154_pib, 0, sizeof(ieee802154_pib_t));
|
|
|
|
s_ieee802154_pib.auto_ack_rx = true;
|
|
|
|
s_ieee802154_pib.auto_ack_tx = true;
|
|
|
|
s_ieee802154_pib.enhance_ack_tx = true;
|
|
|
|
s_ieee802154_pib.coordinator = false;
|
|
|
|
s_ieee802154_pib.promiscuous = true;
|
|
|
|
s_ieee802154_pib.rx_when_idle = false;
|
|
|
|
s_ieee802154_pib.channel = 11;
|
|
|
|
s_ieee802154_pib.cca_threshold = CONFIG_IEEE802154_CCA_THRESHOLD;
|
|
|
|
s_ieee802154_pib.cca_mode = CONFIG_IEEE802154_CCA_MODE;
|
|
|
|
s_ieee802154_pib.txpower = IEEE802154_TXPOWER_VALUE_MAX;
|
|
|
|
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
|
|
|
|
static uint8_t ieee802154_txpower_convert(int8_t txpower)
|
|
|
|
{
|
2023-06-19 04:58:09 -04:00
|
|
|
uint8_t ieee820154_txpower_index = 0;
|
|
|
|
if (txpower >= IEEE802154_TXPOWER_VALUE_MAX) {
|
|
|
|
ieee820154_txpower_index = 15;
|
|
|
|
} else if (txpower <= IEEE802154_TXPOWER_VALUE_MIN) {
|
|
|
|
ieee820154_txpower_index = IEEE802154_TXPOWER_INDEX_MIN;
|
2023-03-20 06:25:10 -04:00
|
|
|
} else {
|
2023-06-19 04:58:09 -04:00
|
|
|
ieee820154_txpower_index = (uint8_t)((txpower - IEEE802154_TXPOWER_VALUE_MIN) / 3) + IEEE802154_TXPOWER_INDEX_MIN;
|
2023-03-20 06:25:10 -04:00
|
|
|
}
|
2023-06-19 04:58:09 -04:00
|
|
|
return ieee820154_txpower_index;
|
2023-03-20 06:25:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_update(void)
|
|
|
|
{
|
|
|
|
if (ieee802154_pib_is_pending()) {
|
|
|
|
ieee802154_ll_set_freq(ieee802154_channel_to_freq(s_ieee802154_pib.channel));
|
|
|
|
ieee802154_ll_set_power(ieee802154_txpower_convert(s_ieee802154_pib.txpower));
|
|
|
|
|
|
|
|
ieee802154_ll_set_cca_mode(s_ieee802154_pib.cca_mode);
|
|
|
|
ieee802154_ll_set_cca_threshold(s_ieee802154_pib.cca_threshold);
|
|
|
|
|
|
|
|
ieee802154_ll_set_tx_auto_ack(s_ieee802154_pib.auto_ack_tx);
|
|
|
|
ieee802154_ll_set_rx_auto_ack(s_ieee802154_pib.auto_ack_rx);
|
|
|
|
ieee802154_ll_set_tx_enhance_ack(s_ieee802154_pib.enhance_ack_tx);
|
|
|
|
|
|
|
|
ieee802154_ll_set_coordinator(s_ieee802154_pib.coordinator);
|
|
|
|
ieee802154_ll_set_promiscuous(s_ieee802154_pib.promiscuous);
|
|
|
|
ieee802154_ll_set_pending_mode(s_ieee802154_pib.pending_mode == IEEE802154_AUTO_PENDING_ENHANCED);
|
|
|
|
|
|
|
|
clr_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t ieee802154_pib_get_channel(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.channel;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_channel(uint8_t channel)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.channel != channel) {
|
|
|
|
s_ieee802154_pib.channel = channel;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int8_t ieee802154_pib_get_power(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.txpower;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_power(int8_t power)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.txpower != power) {
|
|
|
|
s_ieee802154_pib.txpower = power;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ieee802154_pib_get_promiscuous(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.promiscuous;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_promiscuous(bool enable)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.promiscuous != enable) {
|
|
|
|
s_ieee802154_pib.promiscuous = enable;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int8_t ieee802154_pib_get_cca_threshold(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.cca_threshold;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_cca_threshold(int8_t cca_threshold)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.cca_threshold != cca_threshold) {
|
|
|
|
s_ieee802154_pib.cca_threshold = cca_threshold;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ieee802154_ll_cca_mode_t ieee802154_pib_get_cca_mode(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.cca_mode;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_cca_mode(ieee802154_ll_cca_mode_t cca_mode)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.cca_mode != cca_mode) {
|
|
|
|
s_ieee802154_pib.cca_mode = cca_mode;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ieee802154_pib_get_auto_ack_tx(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.auto_ack_tx;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_auto_ack_tx(bool enable)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.auto_ack_tx != enable) {
|
|
|
|
s_ieee802154_pib.auto_ack_tx = enable;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ieee802154_pib_get_auto_ack_rx(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.auto_ack_rx;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_auto_ack_rx(bool enable)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.auto_ack_rx != enable) {
|
|
|
|
s_ieee802154_pib.auto_ack_rx = enable;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ieee802154_pib_get_enhance_ack_tx(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.enhance_ack_tx;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_enhance_ack_tx(bool enable)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.enhance_ack_tx != enable) {
|
|
|
|
s_ieee802154_pib.enhance_ack_tx = enable;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ieee802154_pib_get_coordinator(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.coordinator;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_coordinator(bool enable)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.coordinator != enable) {
|
|
|
|
s_ieee802154_pib.coordinator = enable;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ieee802154_ll_pending_mode_t ieee802154_pib_get_pending_mode(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.pending_mode;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_pending_mode(ieee802154_ll_pending_mode_t pending_mode)
|
|
|
|
{
|
|
|
|
if (s_ieee802154_pib.pending_mode != pending_mode) {
|
|
|
|
s_ieee802154_pib.pending_mode = pending_mode;
|
|
|
|
set_pending();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ieee802154_pib_set_rx_when_idle(bool enable)
|
|
|
|
{
|
|
|
|
s_ieee802154_pib.rx_when_idle = enable;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ieee802154_pib_get_rx_when_idle(void)
|
|
|
|
{
|
|
|
|
return s_ieee802154_pib.rx_when_idle;
|
|
|
|
}
|