/*
 * Created by jiaqiang.ye@lnxall.com
 *
 * 创业惠康 Protocol support
 *
 * 2022/01/10
 */

#ifndef CYHK_PROTOCOL_H
#define CYHK_PROTOCOL_H 1

#include <pthread.h>

#ifdef __cplusplus
extern "C" {
#endif

#define CYHK_VISIBLE __attribute__((visibility("hidden")))

#define CYHK_PRODUCT_KEY "LNXALL_CYHK_PRODUCTKEY"
/**
 * structure for CYKH supervisor
 */
struct cyhk_proto_var {
    void *               sess;          /* MQTT session */
    void *               sess_local;    /* local IPC session */
    char *               data_topic;    /* topic for data upload to CYHK cloud */
    char *               productKey;    /* dynamically allocated buffer to hold productKey */
    char *               macAddr;       /* dynamically allocated buffer to hold MAC address, for eth0 */
    char *               svrAddr;       /* address of IPC/MQTT broker */
    unsigned long        svrPort;       /* portnumber of IPC/MQTT broker */
    char *               userName;      /* login user name for IPC/MQTT broker */
    char *               userPass;      /* login password for IPC/MQTT broker */

    pthread_mutex_t      mlock;         /* mutex lock between main thread and working thread */
    pthread_cond_t       condition;     /* posix thread condition variable */

    pthread_t            tidwork;       /* thread-id for working thread */
    unsigned int         msgid;         /* incrementing message-id */
    volatile int         loopflag;      /* looping flag, main thread use the flag to terminate working thread */
    void *               cyhk_msgs;     /* linked list of MQTT messages to be sent */
};
typedef struct cyhk_proto_var cyhk_proto_t;

/**
 * Create MQTT connection for cyhk-protocol
 *
 * @param cyhk: pointer to a CYHK instance
 * @return 0 on success, negative values on error
 */
int cyhk_create_session(cyhk_proto_t * cyhk) CYHK_VISIBLE;

/**
 * Destroy a CYHK instance.
 *
 * @param cyhk: pointer to a CYHK instance
 */
void cyhk_close_session(cyhk_proto_t * cyhk) CYHK_VISIBLE;


/**
 * Get an used message id, and then increment the id by 1.
 *
 * @param cyhk: pointer to CYHK instance
 */
unsigned int cyhk_messageid(cyhk_proto_t * cyhk) CYHK_VISIBLE;

/**
 * CYHK payload format, Magic(4)
 */
struct cyhk_magic {
    unsigned char        serial_id;     /* 序例化标识-(00-ff) */
    unsigned char        struct_class;  /* 结构体分类-(00-ff)  */
    unsigned short       struct_id;     /* 结构体标识-(0000-ffff) */
} __attribute__((__packed__));

#define CYHK_SERIAL_JSON                100
#define CYHK_HEAD_SIZE                  sizeof(struct cyhk_magic)

/**
 * Command definitions for 创业惠康 protocol
 */
enum cyhk_cmd {
    CYHK_CMD_HEARTBEAT          = 111,  /* gateway -> cloud 心跳请求 */
    CYHK_CMD_HEARTBEAT_RSP      = 112,  /* cloud -> gateway */

    CYHK_CMD_CONNECT            = 101,  /* gateway -> cloud 入网请求 */
    CYHK_CMD_CONNECT_RSP        = 102,  /* cloud -> gateway */

    CYHK_CMD_NTP_SETTING        = 121,  /* cloud -> gateway NTP 服务器配置 */
    CYHK_CMD_NTP_SETTING_RSP    = 122,  /* gateway -> cloud */

    CYHK_CMD_NET_SETTING        = 131,  /* cloud -> gateway 网络配置 */
    CYHK_CMD_NET_SETTING_RSP    = 132,  /* gateway -> cloud */

    CYHK_CMD_STATUS             = 133,  /* cloud -> gateway 网络状态获取 */
    CYHK_CMD_STATUS_RSP         = 134,  /* gateway -> cloud */

    CYHK_CMD_FWUPGRADE          = 171,  /* cloud -> gateway 固件升级 */
    CYHK_CMD_FWUPGRADE_RSP      = 172,  /* gateway -> cloud */

    CYHK_CMD_REBOOT             = 201,  /* cloud -> gateway 网关重启 */
    CYHK_CMD_REBOOT_RSP         = 202,  /* gateway -> cloud */

    CYHK_CMD_PARAMS             = 141,  /* cloud -> gateway 运行参数配置 */
    CYHK_CMD_PARAMS_RSP         = 142,  /* gateway -> cloud */

    CYHK_CMD_DATA_REPORT        = 161,  /* gateway -> cloud 数据主动上报或回复平台数据请求 */
    CYHK_CMD_DATA_REPLY         = 163,  /* cloud -> gateway 平台回复或平台下发数据 */

    CYHK_CMD_STATUS_HOURLY      = 222,  /* cloud -> gateway 网关运行状态主动获取，间隔1小时 */
    CYHK_CMD_STATUS_HOURLY_RSP  = 221,  /* gateway -> cloud */

    CYHK_INVALID_CMD            = 0xFFFFFFFFu,
};

enum cyhk_struct_ids {
    CYHK_SID_HEARTBEAT          = 11800,
    CYHK_SID_HEARTBEAT_RSP      = 11801,

    CYHK_SID_CONNECT            = 11802,
    CYHK_SID_CONNECT_RSP        = 11803,

    CYHK_SID_NTP_SETTING        = 11804,
    CYHK_SID_NTP_SETTING_RSP    = 11805,

    CYHK_SID_NET_SETTING        = 11806,
    CYHK_SID_NET_SETTING_RSP    = 11807,

    CYHK_SID_STATUS             = 11808,
    CYHK_SID_STATUS_RSP         = 11809,

    CYHK_SID_FWUPGRADE          = 11810,
    CYHK_SID_FWUPGRADE_RSP      = 11811,

    CYHK_SID_REBOOT             = 11812,
    CYHK_SID_REBOOT_RSP         = 11813,

    CYHK_SID_PARAMS             = 11814,
    CYHK_SID_PARAMS_RSP         = 11815,

    CYHK_SID_DATA_REPORT        = 11816,
    CYHK_SID_DATA_REPLY         = 11817,

    CYHK_SID_STATUS_HOURLY      = 11818,
    CYHK_SID_STATUS_HOURLY_RSP  = 11819,
};

#ifdef __cplusplus
};
#endif
#endif
