/*
 *
 *    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 _WFX_RSI_H_
#define _WFX_RSI_H_
/*
 * Interface to RSI Sapis
 */

#define WFX_RSI_WLAN_TASK_SZ (1024 + 512 + 256) /* Unknown how big this should be 	*/
#define WFX_RSI_TASK_SZ (1024 + 1024)           /* Stack for the WFX/RSI task		*/
#define WFX_RSI_BUF_SZ (1024 * 10)              /* May need tweak 			*/
#define WFX_RSI_CONFIG_MAX_JOIN (5)             /* Max join retries			*/
#define WFX_RSI_NUM_TIMERS (2)                  /* Number of RSI timers to alloc	*/

/*
 * Various events fielded by the wfx_rsi task
 * Make sure that we only use 8 bits (otherwise freeRTOS - may need some changes)
 */
#define WFX_EVT_STA_CONN (0x01)
#define WFX_EVT_STA_DISCONN (0x02)
#define WFX_EVT_AP_START (0x04)
#define WFX_EVT_AP_STOP (0x08)
#define WFX_EVT_SCAN (0x10) /* This is used as scan result and start */
#define WFX_EVT_STA_START_JOIN (0x20)
#define WFX_EVT_STA_DO_DHCP (0x40)
#define WFX_EVT_STA_DHCP_DONE (0x80)

#define WFX_RSI_ST_DEV_READY (0x01)
#define WFX_RSI_ST_AP_READY (0x02)
#define WFX_RSI_ST_STA_PROVISIONED (0x04)
#define WFX_RSI_ST_STA_CONNECTING (0x08)
#define WFX_RSI_ST_STA_CONNECTED (0x10)
#define WFX_RSI_ST_STA_DHCP_DONE (0x40) /* Requested to do DHCP after conn	*/
#define WFX_RSI_ST_STA_MODE (0x80)      /* Enable Station Mode			*/
#define WFX_RSI_ST_AP_MODE (0x100)      /* Enable AP Mode			*/
#define WFX_RSI_ST_STA_READY (WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE)
#define WFX_RSI_ST_STARTED (0x200)     /* RSI task started			*/
#define WFX_RSI_ST_SCANSTARTED (0x400) /* Scan Started				*/

struct wfx_rsi
{
    EventGroupHandle_t events;
    TaskHandle_t drv_task;
    TaskHandle_t wlan_task;
#ifdef RSI_BLE_ENABLE
    TaskHandle_t ble_task;
#endif
    uint16_t dev_state;
    uint16_t ap_chan; /* The chan our STA is using	*/
    wfx_wifi_provision_t sec;
#ifdef SL_WFX_CONFIG_SCAN
    void (*scan_cb)(wfx_wifi_scan_result_t *);
    char * scan_ssid; /* Which one are we scanning for */
#endif
#ifdef SL_WFX_CONFIG_SOFTAP
    sl_wfx_mac_address_t softap_mac;
#endif
    sl_wfx_mac_address_t sta_mac;
    sl_wfx_mac_address_t ap_mac;   /* To which our STA is connected */
    sl_wfx_mac_address_t ap_bssid; /* To which our STA is connected */
    uint16_t join_retries;
    uint8_t ip4_addr[4]; /* Not sure if this is enough */
};

extern struct wfx_rsi wfx_rsi;
#ifdef __cplusplus
extern "C" {
#endif
void wfx_rsidev_init(void);
void wfx_rsi_task(void * arg);
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
void wfx_ip_changed_notify(int got_ip);
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap);
int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
int32_t wfx_rsi_reset_count();
int32_t wfx_rsi_disconnect();
#if CHIP_DEVICE_CONFIG_ENABLE_SED
int32_t wfx_rsi_power_save();
#endif /* CHIP_DEVICE_CONFIG_ENABLE_SED */

#ifdef __cplusplus
}
#endif

#endif /* _WFX_RSI_H_ */
