#define LOG_TAG "oslo_packages_test"

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <string.h>
#include <math.h>

#include <cutils/log.h>

#include <linux/mfd/adnc/iaxxx-odsp.h>
#include <linux/mfd/adnc/iaxxx-system-identifiers.h>
#include <tinyalsa/asoundlib.h>

#define ODSP_NODE "/dev/iaxxx-odsp-celldrv"

#define BUFFER_PACKAGE      "BufferPackage.bin"
#define BUFFER_CONFIG_OSLO_VAL      "BufferConfigValOslo.bin"
#define SENSOR_PACKAGE   "OsloSensorPackage.bin"

#define PLUGIN3_SRC_ID 0x30FF

static struct mixer* open_mixer_ctl()
{
    return mixer_open(0);
}

static void close_mixer_ctl(struct mixer *mixer)
{
    if (mixer) {
        mixer_close(mixer);
    }
}

static int set_mixer_ctl_val(struct mixer *mixer, char *id, int value)
{
    struct mixer_ctl *ctl = NULL;
    int err = 0;

    if ((NULL == mixer) || (NULL == id)) {
        ALOGE("%s: ERROR Null argument passed", __func__);
        err = -EINVAL;
        goto exit;
    }

    ctl = mixer_get_ctl_by_name(mixer, id);
    if (NULL == ctl) {
        ALOGE("%s: ERROR Invalid control name: %s", __func__, id);
        err = -1;
        goto exit;
    }

    if (mixer_ctl_set_value(ctl, 0, value)) {
        ALOGE("%s: ERROR Invalid value for %s", __func__, id);
        err = -1;
        goto exit;
    }

exit:
    return err;
}

static int set_mixer_ctl_string(struct mixer *mixer, char *id, const char *string)
{
    struct mixer_ctl *ctl = NULL;
    int err = 0;

    if ((NULL == mixer) || (NULL == id)) {
        ALOGE("%s: ERROR Null argument passed", __func__);
        err = -EINVAL;
        goto exit;
    }

    ctl = mixer_get_ctl_by_name(mixer, id);
    if (NULL == ctl) {
        ALOGE("%s: ERROR Invalid control name: %s", __func__, id);
        err = -1;
        goto exit;
    }

    if (mixer_ctl_set_enum_by_string(ctl, string)) {
        ALOGE("%s: ERROR Invalid string for %s", __func__, id);
        err = -1;
        goto exit;
    }

exit:
    return err;
}

void usage()
{
    fputs("\
    USAGE -\n\
    -------\n\
    1) Oslo_packages_test 1\n\
    2) Oslo_packages_test 0\n\
    \n\
    1 means load all packages\n\
    0 means unload.\n\
    ", stdout);

    exit(EXIT_FAILURE);
}

int main(int argc, char *argv[])
{
    FILE *odsp_node = NULL;
    struct iaxxx_pkg_mgmt_info pkg_info;
    struct iaxxx_plugin_info pi;
    struct iaxxx_plugin_create_cfg pcc;
    struct iaxxx_set_event se;
    struct iaxxx_evt_info ei;

    uint32_t buffer_id;
    uint32_t sensor_pkg_id;
    int param;
    int err = 0;

    struct mixer *mixer = NULL;

    if (argc <= 1 || argc > 2) {
        usage();
    }

    param = strtol(argv[1], NULL, 0);
    if (param > 1 || param < 0) {
        usage();
    }

    /* Open Host Driver File node */
    if((odsp_node = fopen(ODSP_NODE, "rw")) == NULL) {
        printf("file %s open for write error: %s\n", ODSP_NODE,
                strerror(errno));
        ALOGE("file %s open for write error: %s\n", ODSP_NODE,
                strerror(errno));
        err = -EIO;
        goto exit;
    }

    mixer = open_mixer_ctl();
    if (NULL == mixer) {
        ALOGE("%s: ERROR: Failed to open the mixer control", __func__);
        err = -EINVAL;
        goto exit;
    }

    if (param == 1) {
        /* Load all pacakge */

        /* Sensor Plugin */
        strcpy(pkg_info.pkg_name, SENSOR_PACKAGE);
        pkg_info.pkg_id = 0;
        pkg_info.proc_id = 0;
        err = ioctl(fileno(odsp_node), ODSP_LOAD_PACKAGE, (unsigned long)&pkg_info);
        if (err) {
            printf("%s: ERROR: SENSOR ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: SENSOR ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }
        printf("%s: SENSOR ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
        ALOGD("%s: SENSOR ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
        sensor_pkg_id = pkg_info.proc_id;

        /* Buffer Plugin */
        strcpy(pkg_info.pkg_name, BUFFER_PACKAGE);
        pkg_info.pkg_id = 4;
        pkg_info.proc_id = 0;
        err = ioctl(fileno(odsp_node), ODSP_LOAD_PACKAGE, (unsigned long)&pkg_info);
        if (err) {
            printf("%s: ERROR: Buffer ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: Buffer ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }
        printf("%s: Buffer ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
        ALOGD("%s: Buffer ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
        buffer_id = pkg_info.proc_id;

        /* if buffer plugin Loaded */
        strcpy(pcc.file_name, BUFFER_CONFIG_OSLO_VAL);
        pcc.inst_id = 2;
        pcc.block_id = 1;
        pcc.cfg_size = 12;
        pcc.cfg_val = 0;

        err = ioctl(fileno(odsp_node), ODSP_PLG_SET_CREATE_CFG, (unsigned long)&pcc);
        if (err) {
            printf("%s: ERROR: ODSP_PLG_SET_CREATE_CFG IOCTL failed to set create config %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_PLG_SET_CREATE_CFG IOCTL failed to set create config %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        /* Create Buffer plugin */
        pi.plg_idx  = 0;
        pi.pkg_id = buffer_id;
        pi.block_id = 1;
        pi.inst_id  = 2;
        pi.priority = 1;
        err = ioctl(fileno(odsp_node), ODSP_PLG_CREATE, (unsigned long)&pi);
        if (err) {
            printf("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        /* Create Dummy sensor plugin */
        pi.plg_idx  = 0;
        pi.pkg_id = sensor_pkg_id;
        pi.block_id = 1;
        pi.inst_id  = 3;
        pi.priority = 1;
        err = ioctl(fileno(odsp_node), ODSP_PLG_CREATE, (unsigned long)&pi);
        if (err) {
            printf("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        /* Set the events and params */
        se.inst_id           = 3;
        se.event_enable_mask = 0x7;
        se.block_id          = 1;
        err = ioctl(fileno(odsp_node), ODSP_PLG_SET_EVENT, (unsigned long)&se);
        if (err) {
            printf("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        printf("Registering for 3 sensor mode switch events\n");
        ALOGD("Registering for 3 sensor mode switch events\n");

        /* Subscribe for events */
        ei.src_id       = PLUGIN3_SRC_ID;
        ei.event_id     = 0;    // 0 - Mode switch to presence mode
        ei.dst_id       = IAXXX_SYSID_SCRIPT_MGR;
        ei.dst_opaque   = 0x1201;
        err = ioctl(fileno(odsp_node), ODSP_EVENT_SUBSCRIBE, (unsigned long)&ei);
        if (err) {
            printf("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            goto exit;
        }

        /* Subscribe for events */
        ei.src_id       = PLUGIN3_SRC_ID;
        ei.event_id     = 1;    // 1 - Mode switch to detected mode.
        ei.dst_id       = IAXXX_SYSID_SCRIPT_MGR;
        ei.dst_opaque   = 0x1202;
        err = ioctl(fileno(odsp_node), ODSP_EVENT_SUBSCRIBE, (unsigned long)&ei);
        if (err) {
            printf("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            goto exit;
        }

        /* Subscribe for events */
        ei.src_id       = PLUGIN3_SRC_ID;
        ei.event_id     = 2;    // 2 - Mode switch to max mode
        ei.dst_id       = IAXXX_SYSID_HOST;  // update this to HOST_1 for Customer
        ei.dst_opaque   = 0;
        err = ioctl(fileno(odsp_node), ODSP_EVENT_SUBSCRIBE, (unsigned long)&ei);
        if (err) {
            printf("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            goto exit;
        }

        /* setup routing */
        set_mixer_ctl_val(mixer, "sensor0 En", 1);

        set_mixer_ctl_string(mixer, "Plgin2Ip Ep0 Conf", "SensorOut0");
        set_mixer_ctl_string(mixer, "Plgin3Ip Ep0 Conf", "plugin2Out0");

        set_mixer_ctl_val(mixer, "Plgin2Blk1En", 1);
        set_mixer_ctl_val(mixer, "Plgin3Blk1En", 1);
    } else {
        /* disconnect the route */
        set_mixer_ctl_val(mixer, "Plgin3Blk1En", 0);
        set_mixer_ctl_val(mixer, "Plgin2Blk1En", 0);
        set_mixer_ctl_val(mixer, "sensor0 En", 0);

        /* Unload all pacakge */
        printf("UnSubscribe 3 sensor mode switch events\n");
        ALOGD("UnSubscribe 3 sensor mode switch events\n");

        /* UnSubscribe for events */
        ei.src_id       = PLUGIN3_SRC_ID;
        ei.event_id     = 2;    // 2 - Mode switch to max mode
        ei.dst_id       = IAXXX_SYSID_HOST;  // update this to HOST_1 for Customer
        ei.dst_opaque   = 0;
        err = ioctl(fileno(odsp_node), ODSP_EVENT_UNSUBSCRIBE, (unsigned long)&ei);
        if (err) {
            printf("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            goto exit;
        }

        /* UnSubscribe for events */
        ei.src_id       = PLUGIN3_SRC_ID;
        ei.event_id     = 1;    // 1 - Mode switch to detected mode.
        ei.dst_id       = IAXXX_SYSID_SCRIPT_MGR;
        ei.dst_opaque   = 0x1202;
        err = ioctl(fileno(odsp_node), ODSP_EVENT_UNSUBSCRIBE, (unsigned long)&ei);
        if (err) {
            printf("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            goto exit;
        }

        /* UnSubscribe for events */
        ei.src_id       = PLUGIN3_SRC_ID;
        ei.event_id     = 0;    // 0 - Mode switch to presence mode
        ei.dst_id       = IAXXX_SYSID_SCRIPT_MGR;
        ei.dst_opaque   = 0x1201;
        err = ioctl(fileno(odsp_node), ODSP_EVENT_UNSUBSCRIBE, (unsigned long)&ei);
        if (-1 == err) {
            printf("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
                        __func__, ei.event_id, ei.src_id, errno, strerror(errno));
            goto exit;
        }

        /* Set the events and params */
        se.inst_id           = 3;
        se.event_enable_mask = 0x0;
        se.block_id          = 1;
        err = ioctl(fileno(odsp_node), ODSP_PLG_SET_EVENT, (unsigned long)&se);
        if (err) {
            printf("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        /* destroy Dummy sensor plugin */
        pi.block_id = 1;
        pi.inst_id  = 3;
        err = ioctl(fileno(odsp_node), ODSP_PLG_DESTROY, (unsigned long)&pi);
        if (err) {
            printf("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        /* destroy Buffer plugin */
        pi.block_id = 1;
        pi.inst_id  = 2;
        err = ioctl(fileno(odsp_node), ODSP_PLG_DESTROY, (unsigned long)&pi);
        if (err) {
            printf("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        /*Unload Buffer Plugin */

        pkg_info.pkg_id = 4;
        pkg_info.proc_id = 4;
        err = ioctl(fileno(odsp_node), ODSP_UNLOAD_PACKAGE, (unsigned long)&pkg_info);
        if (err) {
            printf("%s: ERROR: SENSOR ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: SENSOR ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        printf("%s: SENSOR ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
        ALOGD("%s: SENSOR ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);

        /*Unload Sensor Plugin */
        pkg_info.pkg_id = 0;
        pkg_info.proc_id = 4;
        err = ioctl(fileno(odsp_node), ODSP_UNLOAD_PACKAGE, (unsigned long)&pkg_info);
        if (err) {
            printf("%s: ERROR: Buffer ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            ALOGE("%s: ERROR: Buffer ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
            goto exit;
        }

        printf("%s: Buffer ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
        ALOGD("%s: Buffer ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
    }
exit:
    if (odsp_node)
        fclose(odsp_node);
    if (mixer)
        close_mixer_ctl(mixer);
    return err;
}
