#ifndef __CLOUD_MQTT_COMMON_H
#define __CLOUD_MQTT_COMMON_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <errno.h>
#include <math.h>

#include "ipc_session.h"
#include "lnxall_list.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_db.h"
#include "dy_utils/dy_ipc.h"
#include "uart.h"

#define RA06_CFG "/app/config/lora_cfg_%d.json"
#define SUB_TOPIC "ipc/+/LORA_2/device/+/data/Set_Rglt_Raw"

#define DEFAULT_SF 4096
#define DEFAULT_BW 125000
#define DEFAULT_FREQ 475000000
#define DEFAULT_POWER 20
#define DEFAULT_ADDR 1
#define DEFAULT_CR "4/6"

// --speed 9600 --stop 1 --parity 2 --bit 8
#define SPEED 9600
#define STOP 1
#define PARITY 2
#define BITS 8

typedef struct
{
    int sf;     //扩频因子
    int bw;     //带宽
    char cr[4]; //编码率
    int freq;   //频率
    int power;  //发射功率
    int addr;   //本地节点地址
} lora_cfg_t;

typedef struct
{
    node_cfg_t *node;
    int addr;
} node_t;

typedef struct
{
    int node_cnt;
    node_t *nodes;
} node_table_t;

typedef struct ra06_var_s
{
    int fd;
    int slot; //插槽
    lora_cfg_t lora_cfg;
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    ipc_session_t *session;            //内部broker的MQTT client，用于进程间通信
    node_table_t nodes_table;
    int poll_timer;
    char sn_str[SN_MAX_LEN];
} ra06_var_t;

extern void *recv_loop(void *param);
extern int mqtt_handle_recv_msg(void *obj, ipc_msg_t *mqtt_msg);
extern int modem_send_data(int fd, char *buf, int len, char *expect);

static inline int get_sf_value(int sf)
{
    int val = 12;
    switch (sf)
    {
    case 64:
        val = 6;
        break;
    case 128:
        val = 7;
        break;
    case 256:
        val = 8;
        break;
    case 512:
        val = 9;
        break;
    case 1024:
        val = 10;
        break;
    case 2048:
        val = 11;
        break;
    case 4096:
        val = 12;
        break;
    default:
        break;
    }

    return val;
}

static inline int get_bw_value(int bw)
{
    int val;
    val = -1;

    switch (bw)
    {
    case 7800:
        val = 0;
        break;
    case 10400:
        val = 1;
        break;
    case 15600:
        val = 2;
        break;
    case 20800:
        val = 3;
        break;
    case 31200:
        val = 4;
        break;
    case 41600:
        val = 5;
        break;
    case 62500:
        val = 6;
        break;
    case 125000:
        val = 7;
        break;
    case 250000:
        val = 8;
        break;
    case 500000:
        val = 9;
        break;
    default:
        break;
    }

    return val;
}

static inline int get_cr_value(char *cr)
{
    int val = -1;
    if (strcmp(cr, "4/5") == 0)
    {
        val = 1;
    }
    else if (strcmp(cr, "4/6") == 0)
    {
        val = 2;
    }
    else if (strcmp(cr, "4/7") == 0)
    {
        val = 3;
    }
    else if (strcmp(cr, "4/8") == 0)
    {
        val = 4;
    }
}

#endif /* __CLOUD_MQTT_COMMON_H */
