/**
  @file
  ql_wifi_msg.h

  @brief
  Quectel wifi msg api header.

*/
/*============================================================================
  Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.
  Quectel Wireless Solution Proprietary and Confidential.
 =============================================================================*/
/*===========================================================================

                        EDIT HISTORY FOR MODULE

This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.


WHEN        WHO            WHAT, WHERE, WHY
----------  ------------   ----------------------------------------------------

=============================================================================*/
#ifndef QL_WIFI_MSG_H
#define QL_WIFI_MSG_H

#include "ql_osi_def.h"
#include "ql_api_osi.h"

#ifdef __cplusplus
extern "C" {
#endif
/*========================================================================
 *	Macro Definition
 *========================================================================*/
#define QUEC_PROTOCOL_HEAD_MAX_SIZE 6
#define QUEC_PROTOCOL_MSG_DATA_MAX_LEN 1600
#define QUEC_PROTOCOL_MSG_MAX_LEN (QUEC_PROTOCOL_HEAD_MAX_SIZE + QUEC_PROTOCOL_MSG_DATA_MAX_LEN)
#define QUEC_MSG_CACHE_MAX_LEN (QUEC_PROTOCOL_MSG_MAX_LEN * 4)

/*========================================================================
 *  Enumeration Definition
 *========================================================================*/
typedef enum
{
    QL_WIFI_MSG_SUCCESS = 0,
    QL_WIFI_MSG_EXECUTE_ERR = 1 | (QL_COMPONENT_LWIP_WIFI << 16),
    QL_WIFI_MSG_INVALID_PARAM_ERR,
    QL_WIFI_MSG_TASK_CREATE_ERR,
    QL_WIFI_MSG_MUTEX_CREATE_ERR,
} ql_wifi_msg_errcode_e;

typedef enum
{
    QL_WIFI_NPTO_PARSE_RESULT_SUCC = 0,
    QL_WIFI_NPTO_PARSE_RESULT_NOMAGIC = 101, // No protocol header
    QL_WIFI_NPTO_PARSE_RESULT_TOOSMALL,      // Data too small
    QL_WIFI_NPTO_PARSE_RESULT_ERRCRC,        // CRC error
    QL_WIFI_NPTO_PARSE_RESULT_UNKNOWN,
}ql_wifi_npto_parse_result_e;

typedef enum
{
    QL_WIFI_NPTO_802_3_STREAM = 0,
    QL_WIFI_NPTO_STA_IP_START_CMD = 1,
    QL_WIFI_NPTO_STA_IP_DOWN_CMD = 2,
    QL_WIFI_NPTO_UAP_IP_START_CMD = 3,
    QL_WIFI_NPTO_UAP_IP_DOWN_CMD = 4,
    QL_WIFI_NPTO_IP_ADDR_SET_CMD = 5,
    QL_WIFI_NPTO_WLAN_CREATE_CMD = 6,
    QL_WIFI_NPTO_WLAN_DESTROY_CMD = 7,
    QL_WIFI_NPTO_STATUS_UPDATE_CMD = 8,

    QL_WIFI_APP_STA_ENABLE_CMD = 20,
    QL_WIFI_APP_STA_DISABLE_CMD = 21,
    QL_WIFI_APP_AP_ENABLE_CMD = 23,
    QL_WIFI_APP_AP_DISABLE_CMD = 24,
    QL_WIFI_APP_EVENT_NOTIFY = 25,
    QL_WIFI_APP_SCAN_START_CMD = 26,
    QL_WIFI_APP_STA_STATUS_CMD = 27,

    QUEC_WIFI_APP_RESET_CMD = 28,

    QL_WIFI_SIO_TEST = 30, /* [test] */

    QL_WIFI_APP_CMD_MAX
} ql_wifi_npto_cmd_t;

/*========================================================================
 *  Type Definition
 *========================================================================*/
typedef void (*ql_wifi_msg_net_notify_cb)(void *ctx);
typedef void (*ql_wifi_msg_app_notify_cb)(void *ctx);

typedef struct
{
    int msg_id;
    void *msg_info;
} ql_wifi_msg_cmd_info_s;

typedef struct
{
    unsigned int data_len;
    unsigned int pos;
    char *data;
} ql_wifi_msg_protocol_info_s;

typedef struct
{
    unsigned char magic0;   // Must be 0xAA
    unsigned char magic1;   // Must be 0x55
    unsigned short cmdlen;  // Command length
    unsigned char command;  // Command.Set bit 8 to 1 means command feedback.
    unsigned char checksum;
    unsigned char *data;
} ql_wifi_msg_protocol_head_info_s;

typedef struct
{
    uint8_t *data;
    int data_len;
    int cmd;
} ql_wifi_msg_output_data_info_s;
/*========================================================================
 *  function Definition
 *========================================================================*/

/*****************************************************************
 * Function: ql_wifi_msg_net_notify_cb_register
 *
 * Description: Register Wi-Fi NET engine notification from MSG callback.
 *
 * Parameters:
 * cb        [in]   Wi-Fi NET engine notification from MSG callback.
 *                  Once the MSG engine parses the corresponding command,the command will be passed to NET engine.
 *
 * Return:
 *  0           success
 *  other       error code
 *
 *****************************************************************/
ql_wifi_msg_errcode_e ql_wifi_msg_net_notify_cb_register(ql_wifi_msg_net_notify_cb cb);

/*****************************************************************
 * Function: ql_wifi_msg_app_notify_cb_register
 *
 * Description: Register Wi-Fi APP engine notification from MSG engine callback.
 *
 * Parameters:
 * cb        [in]   Wi-Fi APP engine notification from MSG engine callback.
 *                  Once the MSG engine parses the corresponding command,the command will be passed to APP engine.
 *
 * Return:
 *  0           success
 *  other       error code
 *
 *****************************************************************/
ql_wifi_msg_errcode_e ql_wifi_msg_app_notify_cb_register(ql_wifi_msg_app_notify_cb cb);

/*****************************************************************
 * Function: ql_wifi_msg_init
 *
 * Description: Initialize Wi-Fi msg engine.
 *
 * Parameters:
 * argv        [in]        No defined yet.
 *
 * Return:
 *  0           success
 *  other       error code
 *
 *****************************************************************/
ql_wifi_msg_errcode_e ql_wifi_msg_init(void *argv);

/*****************************************************************
 * Function: ql_wifi_msg_deinit
 *
 * Description: Deinitialize Wi-Fi msg engine.
 *
 * Parameters:
 * argv        [in]        No defined yet.
 *
 * Return:
 *  0           success
 *  other       error code
 *
 *****************************************************************/
ql_wifi_msg_errcode_e ql_wifi_msg_deinit(void *argv);
#ifdef __cplusplus
} /*"C" */
#endif

#endif