/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    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 _HAL_RSI_HAL_H_
#define _HAL_RSI_HAL_H_
#include "rsi_board_configuration.h"

#define RSI_HAL_NO_COM_PORT /* This will be done by the project */

/* Should be enums */
#define RSI_HAL_RESET_PIN 0
#define RSI_HAL_MODULE_INTERRUPT 1
#define RSI_HAL_SLEEP_CONFIRM_PIN 2
#define RSI_HAL_WAKEUP_INDICATION_PIN 3
#define RSI_HAL_MODULE_INTERRUPT_PIN 4

//! Timer related macros
//! Macro to configure timer type in single shot
#define RSI_HAL_TIMER_TYPE_SINGLE_SHOT 0

// Macro to configure timer type in periodic
#define RSI_HAL_TIMER_TYPE_PERIODIC 1

// Macro to configure timer in micro seconds mode
#define RSI_HAL_TIMER_MODE_MICRO 0

// Macro to configure timer in milli seconds mode
#define RSI_HAL_TIMER_MODE_MILLI 1

//! GPIO Pins related Macros
//! Macro to configure GPIO in output mode
#define RSI_HAL_GPIO_OUTPUT_MODE 1

// Macro to configure GPIO in input mode
#define RSI_HAL_GPIO_INPUT_MODE 0

// Macro to drive low value on GPIO
#define RSI_HAL_GPIO_LOW 0

// Macro to drive high value on GPIO
#define RSI_HAL_GPIO_HIGH 1

// Macro to drive LDMA channel number
#define RSI_LDMA_TRANSFER_CHANNEL_NUM 3

// Macro to drive semaphore block minimun timer in milli seconds
#define RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS 50

/******************************************************
 * *               Function Declarations
 * ******************************************************/

void rsi_hal_board_init(void);
void rsi_switch_to_high_clk_freq(void);
void rsi_hal_intr_config(void (*rsi_interrupt_handler)(void));
void rsi_hal_intr_mask(void);
void rsi_hal_intr_unmask(void);
void rsi_hal_intr_clear(void);
uint8_t rsi_hal_intr_pin_status(void);
void rsi_hal_config_gpio(uint8_t gpio_number, uint8_t mode, uint8_t value);
void rsi_hal_set_gpio(uint8_t gpio_number);
uint8_t rsi_hal_get_gpio(uint8_t gpio_number);
void rsi_hal_clear_gpio(uint8_t gpio_number);
int16_t rsi_spi_transfer(uint8_t * tx_buff, uint8_t * rx_buff, uint16_t transfer_length, uint8_t mode);
int16_t rsi_uart_send(uint8_t * ptrBuf, uint16_t bufLen);
int16_t rsi_uart_recv(uint8_t * ptrBuf, uint16_t bufLen);
int16_t rsi_com_port_send(uint8_t * ptrBuf, uint16_t bufLen);
int16_t rsi_com_port_receive(uint8_t * ptrBuf, uint16_t bufLen);
uint32_t rsi_get_random_number(void);
int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_expiry_handler)(void));
int32_t rsi_timer_stop(uint8_t timer_node);
uint32_t rsi_timer_read(uint8_t timer_node);
void rsi_delay_us(uint32_t delay_us);
void rsi_delay_ms(uint32_t delay_ms);
uint32_t rsi_hal_gettickcount(void);
void SysTick_Handler(void);

void rsi_interrupt_handler(void);
void ABRD(void);

void Error_Handler(void);

/* RTC Related API's */
uint32_t rsi_rtc_get_time(void);
int32_t rsi_rtc_set_time(uint32_t time);
/* End - RTC Related API's */

#ifdef LOGGING_STATS
void rsi_hal_log_stats_intr_config(void (*rsi_give_wakeup_indication)());
#endif /* LOGGING_STATS */
#ifdef RSI_WITH_OS
void rsi_os_delay_ms(uint32_t delay_ms);
void PORTD_IRQHandler(void);

#endif /* RSI_WITH_OS */

#endif
