/**
 * Connects IVS to CONTROL via IPC.
 *
 * @copyright 2008, Research In Motion Ltd.
 *
 * @version $Id: //depot/rel/dsp/ecall/2/c/testlab/ivs.c#1 $
 */

#include <stdlib.h>

#include "rimtypes.h"
#include "msg.h"
#include "ipc.h"
#include "testlab.h"
#include "modem.h"

static IpcConn *conn;

BOOL IvsRun(void) {
    Msg msg;

    if (IpcRecv(&msg) == NULL) return FALSE;

    if (msg.id == MsgIvsReset) {
        LogInfo("Received MsgIvsReset");
        if (msg.u.ivsReset.n <= MSD_MAX_LENGTH) {
            IvsReset(msg.u.ivsReset.msd, msg.u.ivsReset.n);
            msg.id = MsgReady;
        }
        else {
            sprintf(msg.u.error.msg, "MSD length too big %d >= %d",
                                     msg.u.ivsReset.n, MSD_MAX_LENGTH);
            msg.id = MsgError;
        }
    }
    else if (msg.id = MsgPcmData) {
        IvsProcess(msg.u.pcmData.pcm);
    }
    else {
        sprintf(msg.u.error.msg, "Unknown msg type %d", msg.id);
        msg.id = MsgError;
    }
    IpcSend(conn, &msg);

    return TRUE;
}

void IvsInit(const char *host, const char *port) {
    LogInfo("Starting IVS");
    conn = IpcConnect(host, port);
    IpcRegisterTask(conn, IvsRun);
}
