/*
 * Created by jiaqiang.ye@lnxall.com
 *
 * MHMP protocol implmentation
 *
 * 2022/03/29
 */

#ifndef LNXALL_MHMP_H
#define LNXALL_MHMP_H 1

#include <stdint.h>
#include <time.h>
#include <dy_utils/dy_pp.h>
#include <ipc_session.h>

#ifdef __cplusplus
extern "C" {
#endif

#define TCP_MHMP_PORT 49010
#define TCP_MHMP_SVRIP "172.23.10.15"
#define TCP_MHMP_HBINTERVAL 30
#define TCP_MHMP_REQUEST_INTERVAL 60
#define TCP_MHMP_TIME_TAGFILE "/app/mhmp_history_time.txt"
#define TCP_MHMP_MAX_BUFSIZ 0x2000000 /* 32MB */
#define TCP_MHMP_MAX_HIST (7 * 24 * 3600)

struct mhmp_var {
    char * svraddr;              /* server ipaddr */
    int sockfd;                  /* tcp socket file descriptor */
    int svrport;                 /* server TCP port number */
    unsigned int msgid;          /* message id */
    unsigned int last_hb;        /* last heart-beat, in system boot time */
    unsigned int last_hb_recv;   /* last time when heart-beat reply received */
    unsigned int req_intval;     /* information request interval */
    unsigned int last_req;       /* last request time */

    nodes_cfg_table_t * nodecfg;
    template_table_t * tempcfg;
    object_table_t * objcfg;
    ipc_session_t * ipcsess;
    char board_sn[64];
};

struct egwIP_vibration {
    double ev_x;
    double ev_y;
    double ev_z;

    double ev_xa;
    double ev_xd;

    double ev_ya;
    double ev_yd;

    double ev_za;
    double ev_zd;

    const char * ev_xaf;
    const char * ev_xvf;

    const char * ev_yaf;
    const char * ev_yvf;

    const char * ev_zaf;
    const char * ev_zvf;
};

#define EGWIP_NAME_MAX   64
#define EGWIP_TIME_LEN 32

#define EGWIP_TEMP_NUM   8
#define EGWIP_VIBR_NUM   1

struct egwIP_info {
    char deviceID[EGWIP_NAME_MAX];
    char deviceName[EGWIP_NAME_MAX];
    char egwip_id[EGWIP_NAME_MAX];
    char startTime[EGWIP_TIME_LEN];
    double temperature;
    int index_no;
    struct egwIP_vibration vibration;
};

struct egwIP_warninfo {
    char deviceID[EGWIP_NAME_MAX];
    char deviceName[EGWIP_NAME_MAX];
    char egwip_id[EGWIP_NAME_MAX];
    int index_no;
    const char * warnID;
    const char * warnType;
    const char * pushType;
    const char * monitoringSite;
    const char * monitoringSiteName;
    const char * diagCode;
    const char * startTime;
    const char * endTime;
    const char * warnValue;
};

struct mhmp_head {
    char tecommhm[8];
    unsigned int reserved;
    unsigned int length;
} __attribute__((__packed__));

/* MHMP message verbosity value: */
extern int mhmp_verbose __attribute__((visibility("hidden")));

extern const char * const MHMP_GETREALTIMEDATA;
extern const char * const MHMP_GETHISTORYDATA;
extern const char * const MHMP_GETWARNINGINFO;
extern const char * const MHMP_GETHISTORYWARNDATA;
extern const char * const MHMP_KEEPALIVE;
extern const char * const MHMP_PUSHWARNINGINFO;
extern const char * const MHMP_ALL;

struct mhmp_var * mhmp_create(const char * svraddr, int portno);

unsigned int mhmp_uptime(unsigned int * secp,
    unsigned int * nsecp);

void mhmp_destory(struct mhmp_var * mvar);

int mhmp_connect(struct mhmp_var * mvar,
    const char * svraddr, int portno, int timeo);

int mhmp_ipc_init(struct mhmp_var * mvar);

int mhmp_recvmsg(struct mhmp_var * mvar,
    int timeout, int * pkterr, unsigned char * * ppkt);

int mhmp_writemsg(struct mhmp_var * mvar,
    const char * mptr, unsigned int mlen);

int mhmp_periodic(struct mhmp_var * mvar);

unsigned char * mhmp_loadfile(const char * filp,
    size_t maxsize, size_t * fsize);

void mhmp_process_msg(struct mhmp_var * mvar,
    const char * msgbuf, int msglen);

int mhmp_write_last_timetag(const char * tagfile, int overwrite);

int mhmp_get_time(char * tstr, size_t tlen, time_t * pnowt, int hasslh);

int mhmp_request_history(struct mhmp_var * mvar);

#ifdef __cplusplus
};
#endif
#endif
