Beispiel #1
0
/**
 * 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));
}