#include <ecm.h>
#include <stdio.h>
#include <pthread.h>

#define ECM2_EVENT_MASK     (ECM_EVENT_LOCAL | ECM_EVENT_CFG          |   \
                            ECM_EVENT_WCNT   | ECM_EVENT_STATE_CHANGE |   \
                            ECM_EVENT_SLV)

static int ecmEventHandler(ECM_EVENT *pEvent)
{
    char szBuffer[40];
    switch(pEvent->ulEvent)
    {
    case ECM_EVENT_STATE_CHANGE:
        printf("Master state change to ");
        switch(pEvent->ulArg1)
        {
        case ECM_DEVICE_STATE_UNKNOWN:
            printf("UNKNOWN\n");
            break;
        case ECM_DEVICE_STATE_INIT:
            printf("INIT\n");
            break;
        case ECM_DEVICE_STATE_PREOP:
            printf("PREOP\n");
            break;
        case ECM_DEVICE_STATE_SAFEOP:
            printf("SAFEOP\n");
            break;
        case ECM_DEVICE_STATE_OP:
            printf("OP\n");
            break;
        default:
            printf("???\n");
            break;
        }
        break;
    }
    return(0);
}

void *stopServer(void *arg)
{
    ecmSleep(1000000); // after 1000 seconds, stop the server.
    printf("Terminate remote server ...\n");
    ecmStopRemotingServer();
}

int main(int argc, char *argv[])
{
    int result;
    ECM_LIB_INIT libInitData;
    pthread_t thread_id1;

    ECM_INIT(libInitData);
    libInitData.ulEventMask = ECM2_EVENT_MASK;
    libInitData.pfnEventHandler = ecmEventHandler;
    result = ecmInitLibrary(&libInitData);
    if (result != 0) {
      printf("ecmInitLibrary() returned with %d\n", result);
      return(-1);
    }

    if(pthread_create(&thread_id1,NULL,stopServer,NULL))
    {
        printf("pthread_create() failed.\n");
        return -1;
    }

    printf("Start remote server -- control mode ... \n");
    result = ecmStartRemotingServer("Stream:0.0.0.0@6368", ECM_FLAG_REMOTE_CONTROL_MODE);
    if (result != ECM_SUCCESS) {
        printf(" - ecmStartRemotingServer() Failed with %s\n", ecmResultToString(result));
        ecmInitLibrary(NULL);
        return(-1);
    }

    ecmInitLibrary(NULL);
    return 0;
}