/**
 * Connects PSAP to CONTROL via IPC.
 *
 * @copyright 2008, Research In Motion Ltd.
 *
 * @version $Id: //depot/main/dsp/ecall/c/testlab/psap.c#10 $
 */

#include <stdio.h>

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

static IpcConn *conn;

BOOL PsapRun(void) {
    Msg msg;

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

    if (msg.id == MsgPsapReset) {
        LogInfo("Received MsgPsapReset");
        PsapReset();
        msg.id = MsgReady;
        IpcSend(conn, &msg);
    }
    else if (msg.id == MsgPcmData) {
        PsapProcess(msg.u.pcmData.pcm);
        IpcSend(conn, &msg);
    }
    else if (msg.id == MsgPsapTx) {
        LogInfo("Received MsgPsapStart");
        PsapSendStart();
    }
    else {
        sprintf(msg.u.error.msg, "Unknown msg type %d", msg.id);
        msg.id = MsgError;
        IpcSend(conn, &msg);
    }

    return TRUE;
}

void PsapInit(const char *host, const char *port) {
    LogInfo("Starting PSAP");
    conn = IpcConnect(host, port);
    IpcRegisterTask(conn, PsapRun);
}

void PsapReceiveMsd(const Ord8 *msd, int length) {
    Msg msg;
    msg.id = MsgPsapRx;
    msg.u.psapRx.n = length;
    memcpy(msg.u.psapRx.msd, msd, length);
    IpcSend(conn, &msg);
}
