/** * Function called in response to object updates. * Used to force kill the VM thread. */ static void objectUpdatedCb(UAVObjEvent * ev) { FlightPlanControlData controlData; FlightPlanStatusData statusData; // If the object updated was the FlightPlanControl execute requested action if ( ev->obj == FlightPlanControlHandle() ) { // Get data FlightPlanControlGet(&controlData); // Execute command if ( controlData.Command == FLIGHTPLANCONTROL_COMMAND_START ) { // Start VM task if not running already if ( taskHandle == NULL ) { xTaskCreate(flightPlanTask, (signed char *)"FlightPlan", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &taskHandle); TaskMonitorAdd(TASKINFO_RUNNING_FLIGHTPLAN, taskHandle); } } else if ( controlData.Command == FLIGHTPLANCONTROL_COMMAND_KILL ) { // Force kill VM task if it is already running // (NOTE: the STOP command is preferred as it allows the script to terminate without killing the VM) if ( taskHandle != NULL ) { // Kill VM TaskMonitorRemove(TASKINFO_RUNNING_FLIGHTPLAN); vTaskDelete(taskHandle); taskHandle = NULL; // Update status object statusData.Status = FLIGHTPLANSTATUS_STATUS_STOPPED; statusData.ErrorFileID = 0; statusData.ErrorLineNum = 0; statusData.ErrorType = FLIGHTPLANSTATUS_ERRORTYPE_NONE; statusData.Debug[0] = 0.0; statusData.Debug[1] = 0.0; FlightPlanStatusSet(&statusData); } } } }
void FlightPlanControlCommandGet( uint8_t *NewCommand ) { UAVObjGetDataField(FlightPlanControlHandle(), (void*)NewCommand, offsetof( FlightPlanControlData, Command), sizeof(uint8_t)); }