Esempio n. 1
0
int sendLanding(BD_MANAGER_t *deviceManager)
{
    int sentStatus = 1;
    u_int8_t cmdBuffer[128];
    int32_t cmdSize = 0;
    eARCOMMANDS_GENERATOR_ERROR cmdError;
    eARNETWORK_ERROR netError = ARNETWORK_ERROR;
    
    ARSAL_PRINT(ARSAL_PRINT_INFO, TAG, "- Send landing");
    
    // Send landing command
    cmdError = ARCOMMANDS_Generator_GenerateARDrone3PilotingLanding(cmdBuffer, sizeof(cmdBuffer), &cmdSize);
    if (cmdError == ARCOMMANDS_GENERATOR_OK)
    {
		printf("send Landing\n");
        netError = ARNETWORK_Manager_SendData(deviceManager->netManager, BD_NET_CD_ACK_ID, cmdBuffer, cmdSize, NULL, &(arnetworkCmdCallback), 1);
		printf("Landing sent\n");
    }
    
    if ((cmdError != ARCOMMANDS_GENERATOR_OK) || (netError != ARNETWORK_OK))
    {
		printf("Landing error\n");
        ARSAL_PRINT(ARSAL_PRINT_WARNING, TAG, "Failed to send landing command. cmdError:%d netError:%s", cmdError, ARNETWORK_Error_ToString(netError));
        sentStatus = 0;
    }
    
    return sentStatus;
}
Esempio n. 2
0
void* ARSTREAM_Reader_RunAckThread (void *ARSTREAM_Reader_t_Param)
{
    ARSTREAM_NetworkHeaders_AckPacket_t sendPacket = {0};
    ARSTREAM_Reader_t *reader = (ARSTREAM_Reader_t *)ARSTREAM_Reader_t_Param;
    memset(&sendPacket, 0, sizeof(sendPacket));

    ARSAL_PRINT (ARSAL_PRINT_DEBUG, ARSTREAM_READER_TAG, "Ack sender thread running");
    reader->ackThreadStarted = 1;

    while (reader->threadsShouldStop == 0)
    {
        int isPeriodicAck = 0;
        ARSAL_Mutex_Lock (&(reader->ackSendMutex));
        if (reader->maxAckInterval <= 0)
        {
            ARSAL_Cond_Wait (&(reader->ackSendCond), &(reader->ackSendMutex));
        }
        else
        {
            int retval = ARSAL_Cond_Timedwait (&(reader->ackSendCond), &(reader->ackSendMutex), reader->maxAckInterval);
            if (retval == -1 && errno == ETIMEDOUT)
            {
                isPeriodicAck = 1;
            }
        }
        ARSAL_Mutex_Unlock (&(reader->ackSendMutex));

        /* Only send an ACK if the maxAckInterval value allows it. */
        if ((reader->maxAckInterval > 0) ||
            ((reader->maxAckInterval == 0) && (isPeriodicAck == 0)))
        {
            ARSAL_Mutex_Lock (&(reader->ackPacketMutex));
            sendPacket.frameNumber = htods  (reader->ackPacket.frameNumber);
            sendPacket.highPacketsAck = htodll (reader->ackPacket.highPacketsAck);
            sendPacket.lowPacketsAck  = htodll (reader->ackPacket.lowPacketsAck);
            ARSAL_Mutex_Unlock (&(reader->ackPacketMutex));
            ARNETWORK_Manager_SendData (reader->manager, reader->ackBufferID, (uint8_t *)&sendPacket, sizeof (sendPacket), NULL, ARSTREAM_Reader_NetworkCallback, 1);
        }
    }

    ARSAL_PRINT (ARSAL_PRINT_DEBUG, ARSTREAM_READER_TAG, "Ack sender thread ended");
    reader->ackThreadStarted = 0;
    return (void *)0;
}
eARCONTROLLER_ERROR ARCONTROLLER_Network_SendData (ARCONTROLLER_Network_t *networkController, void *data, int dataSize, eARCONTROLLER_NETWORK_SENDING_DATA_TYPE dataType, eARNETWORK_MANAGER_CALLBACK_RETURN timeoutPolicy, eARNETWORK_ERROR *netError)
{
    // -- Send data through the Network --
    
    eARCONTROLLER_ERROR error = ARCONTROLLER_OK;
    eARNETWORK_ERROR localNetError = ARNETWORK_OK;
    ARCONTROLLER_NETWORK_SendingConfiguration_t *sendingConfig = NULL;
    int bufferID = -1; 
    
    // Check parameters
    if ((networkController == NULL) ||
        (data == NULL) || (dataSize <= 0) ||
        (dataType == ARCONTROLLER_NETWORK_SENDING_DATA_TYPE_MAX))
    {
        error = ARCONTROLLER_ERROR_BAD_PARAMETER;
    }
    // No Else: the checking parameters sets error to ARNETWORK_ERROR_BAD_PARAMETER and stop the processing
    
    if (error == ARCONTROLLER_OK)
    {
        sendingConfig = malloc(sizeof(ARCONTROLLER_NETWORK_SendingConfiguration_t));
        if (sendingConfig != NULL)
        {
            sendingConfig->timeoutPolicy = timeoutPolicy;
            sendingConfig->customData = NULL;
        }
        else
        {
            error = ARCONTROLLER_ERROR_ALLOC;
        }
    }
    
    if (error == ARCONTROLLER_OK)
    {
        // find bufferID to send
        switch (dataType)
        {
            case ARCONTROLLER_NETWORK_SENDING_DATA_TYPE_NOT_ACK:
                bufferID = networkController->networkConfig.controllerToDeviceNotAckId;
                break;
                
            case ARCONTROLLER_NETWORK_SENDING_DATA_TYPE_ACK:
                bufferID = networkController->networkConfig.controllerToDeviceAckId;
                break;
                
            case ARCONTROLLER_NETWORK_SENDING_DATA_TYPE_HIGH_PRIORITY:
                bufferID = networkController->networkConfig.controllerToDeviceHightPriority;
                break;
                
            case ARCONTROLLER_NETWORK_SENDING_DATA_TYPE_STREAM:
                bufferID = networkController->networkConfig.controllerToDeviceARStreamAck;
                break;

            default:
                ARSAL_PRINT (ARSAL_PRINT_ERROR, ARCONTROLLER_NETWORK_TAG, "DataType : %d not known", dataType);
                error = ARCONTROLLER_ERROR;
                break;
        }
    }
    
    if (error == ARCONTROLLER_OK)
    {
        localNetError = ARNETWORK_Manager_SendData(networkController->networkManager, bufferID, data, dataSize, sendingConfig, &(ARCONTROLLER_Network_SendingCallback), 1);
        
        if (localNetError != ARNETWORK_OK)
        {
            error = ARCONTROLLER_ERROR_NOT_SENT;
        }
    }
    
    // Return netError
    if(netError != NULL)
    {
        *netError = localNetError;
    }

    if (error != ARCONTROLLER_OK)
        free(sendingConfig);

    return error;
}