/*
 * Copyright (C) 2020, Samsung Electronics Co., Ltd.
 *
 * TUI LL common definitions for all drivers: os, touch and display
 */

#pragma once

#include <atomic.h>
#include <tees_driver.h>
#include <udf.h>

#include "tuill_defs.h"
#include "tuill_socket_lib.h"

typedef int (*drv_ioctl_t)(struct drv_info *info, int ioctl_cmd, struct ioctl_arg *arg);
typedef ssize_t (*drv_read_t)(struct drv_info *info, void *buf, size_t len);
typedef ssize_t (*drv_write_t)(struct drv_info *info, const void *buf, size_t len);

enum drv_state {
    DRV_STATE_DISCONNECTED = 0,
    DRV_STATE_CONNECTED,
};

enum ioctl_operation_state {
    IOCTL_PERIPHERAL_GET_STATE_TABLE = TUILLDRV_IOCTL_MAX,
    IOCTL_PERIPHERAL_SET_STATE,
    IOCTL_PERIPHERAL_GET_STATE
};

struct tuill_client_drv_context {
    struct usr_drv_info *driver_info;
    char *drv_name;
    unsigned int drv_id;
    struct fops file_ops;
    uint32_t drv_type;
    drv_ioctl_t drv_ioctl;
    drv_read_t drv_read;
    drv_write_t drv_write;
    struct socket_callbacks *drv_cb;
    void *connect_ctx; //connecting thread data
    uint32_t drv_state_machine;
    struct tuill_drv_ctx tuilldrv;
};

extern struct tuill_client_drv_context drv_ctx;

int32_t register_driver(void);
int32_t unregister_driver(void);

int tuilld_open(struct drv_info *info, _unused_ const char *drv_path, ...);
int tuilld_close(_unused_ struct drv_info *info);
int tuilld_ioctl(struct drv_info *info, int ioctl_cmd, struct ioctl_arg *arg);
ssize_t tuilld_read(struct drv_info *filp, void *buf, size_t len);
ssize_t tuilld_write(struct drv_info *filp, void *buf, size_t len);
int tuilld_fsync(_unused_ struct drv_info *info);

int init_tuill_driver(void);
void uninit_tuill_driver(void);
int32_t tuild_send_cmd(struct tuill_internal_command *cmd);
void drv_send_state(void);

void uninit_all(void);
