Ejemplo n.º 1
0
static void *messageThreadFunc(void *arg)
{
    int *clientId = (int *)arg;
    messageThreadRunning = 1;
    while (messageThreadRunning) {
        phDal4Nfc_Message_Wrapper_t message;
        int ret = phDal4Nfc_msgrcv(*clientId, &message,
                                   sizeof(phLibNfc_Message_t), 0, 0);
        if (ret == -1) {
            fprintf(stderr, "Failed to receive message from NFC stack.\n");
            continue;
        }

        switch (message.msg.eMsgType) {
        case PH_LIBNFC_DEFERREDCALL_MSG: {
            phLibNfc_DeferredCall_t *msg = (phLibNfc_DeferredCall_t *)message.msg.pMsgData;
            if (msg->pCallback)
                msg->pCallback(msg->pParameter);
            break;
        }
        default:
            fprintf(stderr, "Unknown message type %d.", message.msg.eMsgType);
        }

        pthread_cond_signal(&cond);
    }

    return 0;
}
/*******************************************************************************
**
** Function         phNxpNciHal_test_rx_thread
**
** Description      Thread to fetch and process messages from message queue.
**
** Returns          NULL
**
*******************************************************************************/
static void *phNxpNciHal_test_rx_thread(void *arg)
{
    phLibNfc_Message_t msg;

    NXPLOG_NCIHAL_D("Self test thread started");

    thread_running = 1;

    while (thread_running == 1)
    {
        /* Fetch next message from the NFC stack message queue */
        if (phDal4Nfc_msgrcv(gDrvCfg.nClientId,
                &msg, 0, 0) == -1)
        {
            NXPLOG_NCIHAL_E("Received bad message");
            continue;
        }

        if(thread_running == 0)
        {
            break;
        }

        switch (msg.eMsgType)
        {
            case PH_LIBNFC_DEFERREDCALL_MSG:
            {
                phLibNfc_DeferredCall_t *deferCall =
                        (phLibNfc_DeferredCall_t *) (msg.pMsgData);

                REENTRANCE_LOCK();
                deferCall->pCallback(deferCall->pParameter);
                REENTRANCE_UNLOCK();

                break;
            }
        }
    }

    NXPLOG_NCIHAL_D("Self test thread stopped");

    return NULL;
}