/*
 * Copyright (c) 2020, Arm Limited and affiliates.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MAC_CCA_THRESHOLD_H_
#define MAC_CCA_THRESHOLD_H_

#define CCA_THRESHOLD_STEP  1
#define CCA_FAILED_DBM      0x7F

typedef struct mac_cca_threshold {
    int8_t *ch_thresholds;
    int8_t high_limit;
    int8_t low_limit;
    int8_t default_dbm;
    uint8_t number_of_channels;
} mac_cca_threshold_s;

/**
 * @brief Initialize automatic CCA threshold.
 * @param rf_ptr Pointer to MAC instance.
 * @param number_of_channels Number of MAC channels.
 * @param default_dbm Default threshold.
 * @param high_limit Highest allowed CCA threshold.
 * @param low_limit Lowest allowed CCA threshold.
 * @return 0 Success, negative Failed.
 */
int8_t mac_cca_thr_init(protocol_interface_rf_mac_setup_s *rf_ptr, uint8_t number_of_channels, int8_t default_dbm, int8_t high_limit, int8_t low_limit);

/**
 * @brief Deinitialize automatic CCA threshold.
 * @param rf_ptr Pointer to MAC instance.
 * @return 0 Success, negative Not found.
 */
int8_t mac_cca_thr_deinit(protocol_interface_rf_mac_setup_s *rf_ptr);

/**
 * @brief Read CCA threshold of specific channel.
 * @param rf_ptr Pointer to MAC instance.
 * @param channel Channel.
 * @return CCA threshold (dBm), CCA_FAILED_DBM Feature not enabled.
 */
int8_t mac_cca_thr_get_dbm(protocol_interface_rf_mac_setup_s *rf_ptr, uint8_t channel);

/**
 * @brief Update CCA threshold of specific channel.
 * @param rf_ptr Pointer to MAC instance.
 * @param channel Channel.
 * @param dbm CCA threshold (dBm).
 * @return 0 Updated, negative Already using this value.
 */
int8_t mac_cca_threshold_update(protocol_interface_rf_mac_setup_s *rf_ptr, uint8_t channel, int8_t dbm);

/**
 * @brief Get pointer to CCA threshold table.
 * @param rf_ptr Pointer to MAC instance.
 * @return CCA threshold table.
 */
mac_cca_threshold_s *mac_get_cca_threshold_table(protocol_interface_rf_mac_setup_s *rf_ptr);

#endif /* MAC_CCA_THRESHOLD_H_ */
