/*
 * Created by jiaqiang.ye@lnxall.com
 *
 * GPIO input/output as modbus TCP
 *
 * 2022/05/12
 */

#ifndef DIDO_MODBUS_H
#define DIDO_MODBUS_H 1

#include <modbus.h>
#include <pthread.h>
#include <vm1220/vm1220_io.h>

#define WLOSANY_EM1000 "WLOSANY_EM1000"
#define BAU_B30_003 "BAU-B30-003"
#define WLOS_BAU_B30_003 "WLOSANY_BAU-B30-003"
#define VM_1220_T "VM-1220-T"

#ifdef __cplusplus
extern "C" {
#endif

#define NB_CONNECTION      32

#define WOOLINK_DO_MAX     128
#define WOOLINK_DI_MAX     128
#define WOOLINK_DIDO_MAX   (WOOLINK_DO_MAX + WOOLINK_DI_MAX)
#define WOOLINK_DO_OFFSET  0
#define WOOLINK_DI_OFFSET  128

struct dido_single {
    uint32_t dio_val;
};

struct dido_modbus {
    int                    dm_num_di;    /* number of di */
    int                    dm_num_do;   /* number of do */
    int                    dm_num_dio;    /* number of dio */
    struct dido_single   * dm_dios;
    modbus_t             * dm_ctx;          /* modbus context */
    modbus_mapping_t     * dm_map;          /* modbus data mapping */
    pthread_t              dm_thread;       /* GPIO monitor thread */
    pthread_mutex_t        dm_lock;         /* mutex lock for multiple threads */
    int                    dm_sock;         /* modbus TCP listening socket */
    int                    dm_verbose;
    uint8_t                dm_query[MODBUS_TCP_MAX_ADU_LENGTH];
};

/*
 * Get the numbers of output and input GPIO Pins
 */
struct dido_modbus * dido_modbus_create(struct dido_modbus * pdm);

int dido_modbus_opentcp(struct dido_modbus * dido, const char * hostaddr, int portno);

void dido_modbus_free(struct dido_modbus * dido);

int dido_getval(struct dido_single * dios, int gnum);

int do_setval(uint8_t n, uint32_t val);

int dio_setval(uint8_t n, uint32_t val);

#ifdef __cplusplus
};
#endif
#endif
