/* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
 * All rights reserved.
 *
 * This software is supplied "AS IS" without any warranties.
 * RDA assumes no responsibility or liability for the use of the software,
 * conveys no license or title under any patent, copyright, or mask work
 * right to the product. RDA reserves the right to make changes in the
 * software without notification.  RDA also make no representation or
 * warranty that such application will be suitable for the specified use
 * without further testing or modification.
 */
/**
 *@file cfw_utility.h
 *@author UNISOC
 *@email
 *@version
 *@data
  */
#ifndef _CFW_UTILITY_H_
#define _CFW_UTILITY_H_

#ifdef __cplusplus
extern "C" {
#endif

typedef enum
{
    CFW_SIM_0 = 0x00,
    CFW_SIM_1 = 0x01,
    CFW_SIM_END = 0xFF,
    CFW_SIM_ENUM_FILL = 0x7FFFFFFF
} CFW_SIM_ID;

#define MAX_NUM_EVENT_LIST 11 ///<  11 type of events

#define CFW_SAT_MAX_ALPHA_STR_LEN 255
#define CFW_SAT_MAX_ADDR_LEN 20
#define CFW_MAX_SMS_PDU_LEN 176
#define CFW_MAX_SMS_DATA_LEN 160
#define CFW_SAT_MAX_TEXT_STR_LEN 255
#define CFW_SAT_MAX_SS_STR_LEN 255
#define CFW_SAT_MAX_USSD_STR_LEN 255
#define CFW_SAT_MAX_FILE_LIST_LEN 252
#define CFW_SAT_MAX_DTMF_LEN 252
#define CFW_SAT_MAX_BEARER_DESC_LEN 255
#define CFW_SAT_MAX_NW_ACCESS_NAME_LEN 255
#define CFW_SAT_MAX_CHANNEL_DATA_STR_LEN 255
#define CFW_SAT_MAX_URL_LEN 255
#define CFW_SAT_MAX_LIST_BEARER_LEN 255
#define CFW_SAT_MAX_PROVISIONING_FILE_LEN 255
#define CFW_SAT_MAX_DTMF_STR_LEN 255

#define CFW_SIM_COUNT CONFIG_NUMBER_OF_SIM

#define CFW_TIME_ZONE_SECOND (15 * 60)

#define CFW_CC_IND_UTI 0x01
#define CFW_SS_IND_UTI 0x02
#define CFW_NW_IND_UTI 0x03
#define CFW_SIM_IND_UTI 0x04
#define CFW_PBK_IND_UTI 0x05
#define CFW_SMS_PATH_GSM 0
#define CFW_SMS_PATH_GPRS 1

#define CFW_NW_SRV_ID 0     ///<  Indicate the network management  Service
#define CFW_SIM_SRV_ID 1    ///<  Indicate the SIM management  Service
#define CFW_CC_SRV_ID 2     ///<  Indicate the Call management Service
#define CFW_SS_SRV_ID 3     ///<  Indicate the SS Service
#define CFW_SMS_MO_SRV_ID 4 ///<  Indicate the SMS MO management  Service
#define CFW_SMS_MT_SRV_ID 5 ///<  Indicate the SMS MT management  Service
#define CFW_SMS_CB_ID 6     ///<  Indicate the SMS CB management  Service

#define CFW_GPRS_SRV_ID 7
#define CFW_PDP_SRV_ID 7
#define CFW_PSD_SRV_ID 7

#define CFW_CSD_SRV_ID 8
#define CFW_EMOD_SRV_ID 9 ///<  Engineering Mode
#define CFW_APP_SRV_ID 10
#define CFW_TIMER_SRV_ID 11

#define CFW_MAX_SRV_ID (11 * CFW_SIM_COUNT)

#define CFW_PBK_SRV_ID CFW_APP_SRV_ID

#define CFW_SRV_NW_EV_RSP (0)
#define CFW_SRV_CC_EV_RSP (1)
#define CFW_SRV_SS_EV_RSP (2)
#define CFW_SRV_SIM_EV_RSP (3)
#define CFW_SRV_SMS_EV_RSP (4)
#define CFW_SRV_PBK_EV_RSP (5)
#define CFW_SRV_GPRS_EV_RSP (6)
#define CFW_SRV_FAX_EV_RSP (7)
#define CFW_SRV_EV_IND (8)
#define CFW_SRV_EV_MAX (8)

#define CFW_SRV_EV_UNKNOW (0xFF)

#define CFW_TELNUMBER_TYPE_INTERNATIONAL 145 ///< International number
#define CFW_TELNUMBER_TYPE_NATIONAL 161      ///< National number.
#define CFW_TELNUMBER_TYPE_UNKNOWN 129       ///< Unknown number type (default)

//
// Basic Utility Macros
//
#define CFW_SET_BIT(val, n) ((val) |= (1 << n))
#define CFW_CLR_BIT(val, n) ((val) &= ~(1 << n))
#define CFW_IS_BIT_SET(val, n) ((val) & (1 << n))
#define CFW_IS_BIT_CLR(val, n) (~((val) & (1 << n)))
#define CFW_SWITCH_BIT(val, n) ((val) ^= (1 << n))
#define CFW_GET_BIT(val, n) (((val) >> n) & 1)

#define CFW_CFG_RECEIVE_STORAGE(sms, bm, sr) ((sms) | (bm) | (sr))
#define CFW_CFG_SET_ALARM_RECUR(mon, tue, wed, thu, fri, sta, sun) ((1 << mon | 1 << tue | 1 << wed | 1 << thu | 1 << fri | 1 << sta | 1 << sun) & 0xFE)
#define CFW_CFG_CMER(mode, keyp, disp, ind, bfr) ((mode) | ((keyp) << 2) | ((disp) << 4) | ((ind) << 6) | ((bfr) << 8))
#define CFW_CFG_CMER_MODE(cmer) (cmer & 0x03)
#define CFW_CFG_CMER_KEYP(cmer) (cmer >> 2 & 0x03)
#define CFW_CFG_CMER_DISP(cmer) (cmer >> 4 & 0x03)
#define CFW_CFG_CMER_IND(cmer) (cmer >> 6 & 0x03)
#define CFW_CFG_CMER_BFR(cmer) (cmer >> 8 & 0x03)

#define AT_DEFAULT_APN_MAX_NUM 60

#ifdef AT_EXT_CONF_SUPPORT
#define CFW_CALL_MAX_EXT_CONF_NUM 5
#endif

#define CFW_CFG_IND_BC_EVENT (1 << 0)
#define CFW_CFG_IND_SQ_EVENT (1 << 1)
#define CFW_CFG_IND_NW_EVENT (1 << 2)
#define CFW_CFG_IND_SOUNDER_EVENT (1 << 3)
#define CFW_CFG_IND_SMS_RECEIVE_EVENT (1 << 4)
#define CFW_CFG_IND_CALL_EVENT (1 << 5)
#define CFW_CFG_IND_VOX_EVENT (1 << 6)
#define CFW_CFG_IND_ROAM_EVENT (1 << 7)
#define CFW_CFG_IND_SMS_FULL_EVENT (1 << 8)
#define CFW_CFG_IND_BIT_ERR_EVENT (1 << 9)
#define CFW_CFG_IND_USER_SQ_EVENT (1 << 10)

#define CFW_CFG_IND_EVENT(bc, sq, nw, sounder, sms_receive, call, vox, roam, sms_full, biterr) \
    ((bc)|((sq)<<1)|((nw)<<2)|((sounder)<<3)|((sms_receive)<<4)|((call)<<5)|((vox)<<6)|((roam)<<7)|((sms_full)<<8|biterr<<9)

#define IS_CFG_IND_BC_EVENT(ind) (ind >> 0 & 1)
#define IS_CFG_IND_SQ_EVENT(ind) (ind >> 1 & 1)
#define IS_CFG_IND_NW_EVENT(ind) (ind >> 2 & 1)
#define IS_CFG_IND_SOUNDER_EVENT(ind) (ind >> 3 & 1)
#define IS_CFG_IND_SMS_RECEIVE_EVENT(ind) (ind >> 4 & 1)
#define IS_CFG_IND_CALL_EVENT(ind) (ind >> 5 & 1)
#define IS_CFG_IND_VOX_EVENT(ind) (ind >> 6 & 1)
#define IS_CFG_IND_ROAM_EVENT(ind) (ind >> 7 & 1)
#define IS_CFG_IND_SMS_FULL_EVENT(ind) (ind >> 8 & 1)
#define IS_CFG_IND_BIT_ERR_EVENT(ind) (ind >> 9 & 1)

#endif