/*
 * Created by jiaqiang.ye@lnxall.com
 *
 * IEC104 Server/Slave
 *
 * 2022/03/02
 */

#ifndef LNXALL_IEC104_H
#define LNXALL_IEC104_H 1

#include <dy_pp.h>
#include <ipc_session.h>
#include <stdint.h>
#include <pthread.h>
#include "lnxall_ubuslog.h"

#include "lib60870/cs104_slave.h"

#include <hiredis/hiredis.h>

#ifdef __cplusplus
extern "C" {
#endif

#define CMD_MAX_LENGTH 256
#define REDIS_SERVER_IP "127.0.0.1"
#define REDIS_SERVER_PORT 6379
#define TABLE_NAME_LENGTH 10

#define REDIS_DATA_U8 1
#define REDIS_DATA_U16 2
#define REDIS_DATA_I16 3
#define REDIS_DATA_U32 4
#define REDIS_DATA_I32 5
#define REDIS_DATA_F32 6

union iec104_data {
    int32_t         val_int32;
    uint32_t        val_uint32;
    float           val_float;
};

struct iec104_point {
    const object_property_cfg_t * prop; /* corresponding property structure */
    union iec104_data pointd;           /* IEC104 point data */
    unsigned int changed;               /* mark the data as changed */
} __attribute__((aligned(4)));

#define IEC104_DEVSN_LEN 64

struct iec104_var {
    ipc_session_t *session;
    char sn_str[SN_MAX_LEN];
    pthread_cond_t thread_cond;
    pthread_mutex_t thread_lock;
    CS104_Slave slave;
    int lastoaddr;
    int lastcaddr;
    redisContext *context;
};

struct iec104_var * iec104_server_new_init(void);

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

uint64_t iec104_upmsec(uint64_t * msecp);

#ifdef __cplusplus
}
#endif
#endif
