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; }
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; }