diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 7e9163fae..b598f969b 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -1,24 +1,24 @@ ##### # Project: OpenPilot - # - # + # + # # Makefile for OpenPilot project build PiOS and the AP. # # The OpenPilot Team, http://www.openpilot.org, Copyright (C) 2009. - # - # - # This program is free software; you can redistribute it and/or modify - # it under the terms of the GNU General Public License as published by - # the Free Software Foundation; either version 3 of the License, or + # + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. - # - # This program is distributed in the hope that it will be useful, but - # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. - # - # You should have received a copy of the GNU General Public License along - # with this program; if not, write to the Free Software Foundation, Inc., + # + # You should have received a copy of the GNU General Public License along + # with this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ##### @@ -30,7 +30,7 @@ DEBUG ?= YES # Set to YES to use the Servo output pins for debugging via scope or logic analyser ENABLE_DEBUG_PINS ?= NO -# Set to Yes to enable the AUX UART which is mapped on the S1 (Tx) and S2 (Rx) servo outputs +# Set to Yes to enable the AUX UART which is mapped on the S1 (Tx) and S2 (Rx) servo outputs ENABLE_AUX_UART ?= NO # @@ -38,7 +38,7 @@ USE_BOOTLOADER ?= NO # Set to YES when using Code Sourcery toolchain -CODE_SOURCERY ?= NO +CODE_SOURCERY ?= YES # Toolchain prefix (i.e arm-elf- -> arm-elf-gcc.exe) TCHAIN_PREFIX ?= arm-none-eabi- @@ -52,15 +52,21 @@ endif FLASH_TOOL = OPENOCD -# YES enables -mthumb option to flags for source-files listed +# YES enables -mthumb option to flags for source-files listed # in SRC and CPPSRC USE_THUMB_MODE = YES # List of modules to include -MODULES = Telemetry GPS ManualControl Actuator Altitude AHRSComms Stabilization/simple/Stabilization Watchdog +MODULES = Telemetry GPS ManualControl Altitude AHRSComms Stabilization/simple/Stabilization Watchdog +#matrix based actuator mixer +#MODULES += Actuator/matrix/Actuator +#original actuator with separate mixers for fixed wing, heli and VTOL +MODULES += Actuator + + #MODULES = Telemetry Example #MODULES = Telemetry MK/MKSerial -#MODULES = Telemetry +#MODULES = Telemetry #MODULES += Osd/OsdEtStd @@ -120,7 +126,7 @@ DOXYGENDIR = ../Doc/Doxygen # List C source files here. (C dependencies are automatically generated.) # use file-extension c for "c-only"-files -MODNAMES = $(notdir ${MODULES}) +MODNAMES = $(notdir ${MODULES}) ifndef TESTAPP ## MODULES @@ -180,6 +186,9 @@ SRC += $(OPUAVOBJ)/homelocation.c SRC += $(OPUAVOBJ)/attitudesettings.c SRC += $(OPUAVOBJ)/vtolsettings.c SRC += $(OPUAVOBJ)/vtolstatus.c +SRC += $(OPUAVOBJ)/mixersettings.c +SRC += $(OPUAVOBJ)/mixerstatus.c +#SRC += $(OPUAVOBJ)/lesstabilizationsettings.c endif ## PIOS Hardware (STM32F10x) @@ -254,11 +263,11 @@ SRC += $(STMUSBSRCDIR)/usb_regs.c SRC += $(STMUSBSRCDIR)/usb_sil.c ## RTOS -SRC += $(RTOSSRCDIR)/list.c -SRC += $(RTOSSRCDIR)/queue.c +SRC += $(RTOSSRCDIR)/list.c +SRC += $(RTOSSRCDIR)/queue.c SRC += $(RTOSSRCDIR)/tasks.c -## RTOS Portable +## RTOS Portable SRC += $(RTOSSRCDIR)/portable/GCC/ARM_CM3/port.c SRC += $(RTOSSRCDIR)/portable/MemMang/heap_2.c @@ -277,16 +286,16 @@ SRC += $(DOSFSDIR)/dfs_sdcard.c # List C source files here which must be compiled in ARM-Mode (no -mthumb). # use file-extension c for "c-only"-files ## just for testing, timer.c could be compiled in thumb-mode too -SRCARM = +SRCARM = # List C++ source files here. # use file-extension .cpp for C++-files (not .C) -CPPSRC = +CPPSRC = # List C++ source files here which must be compiled in ARM-Mode. # use file-extension .cpp for C++-files (not .C) #CPPSRCARM = $(TARGET).cpp -CPPSRCARM = +CPPSRCARM = # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s @@ -298,7 +307,7 @@ CPPSRCARM = ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)_OP.S # List Assembler source files here which must be assembled in ARM-Mode.. -ASRCARM = +ASRCARM = # List any extra directories to look for include files here. # Each directory must be seperated by a space. @@ -330,11 +339,11 @@ EXTRAINCDIRS += ${foreach MOD, ${MODULES}, Modules/${MOD}/inc} ${OPMODULEDIR}/Sy # Also add directories where the linker should search for # includes from linker-script to the list # Each directory must be seperated by a space. -EXTRA_LIBDIRS = +EXTRA_LIBDIRS = # Extra Libraries # Each library-name must be seperated by a space. -# i.e. to link with libxyz.a, libabc.a and libefsl.a: +# i.e. to link with libxyz.a, libabc.a and libefsl.a: # EXTRA_LIBS = xyz abc efsl # for newlib-lpc (file: libnewlibc-lpc.a): # EXTRA_LIBS = newlib-lpc @@ -343,7 +352,7 @@ EXTRA_LIBS = # Path to Linker-Scripts LINKERSCRIPTPATH = $(PIOSSTM32F10X) -# Optimization level, can be [0, 1, 2, 3, s]. +# Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) @@ -354,7 +363,7 @@ OPT = s endif # Output format. (can be ihex or binary or both) -# binary to create a load-image in raw-binary format i.e. for SAM-BA, +# binary to create a load-image in raw-binary format i.e. for SAM-BA, # ihex to create a load-image in Intel hex format #LOADFORMAT = ihex #LOADFORMAT = binary @@ -363,7 +372,7 @@ LOADFORMAT = both # Debugging format. DEBUGF = dwarf-2 -# Place project-specific -D (define) and/or +# Place project-specific -D (define) and/or # -U options for C here. CDEFS = -DSTM32F10X_$(MODEL) CDEFS += -DUSE_STDPERIPH_DRIVER @@ -379,7 +388,7 @@ CDEFS += -DUSE_BOOTLOADER endif -# Place project-specific -D and/or -U options for +# Place project-specific -D and/or -U options for # Assembler with preprocessor here. #ADEFS = -DUSE_IRQ_ASM_WRAPPER ADEFS = -D__ASSEMBLY__ @@ -413,18 +422,20 @@ CFLAGS += -mcpu=$(MCU) -mthumb CFLAGS += $(CDEFS) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -I. -CFLAGS += -mapcs-frame +CFLAGS += -mapcs-frame CFLAGS += -fomit-frame-pointer +ifeq ($(CODE_SOURCERY), YES) CFLAGS += -fpromote-loop-indices +endif -CFLAGS += -Wall +CFLAGS += -Wall CFLAGS += -Werror CFLAGS += -Wa,-adhlns=$(addprefix $(OUTDIR)/, $(notdir $(addsuffix .lst, $(basename $<)))) # Compiler flags to generate dependency files: CFLAGS += -MD -MP -MF $(OUTDIR)/dep/$(@F).d # flags only for C -#CONLYFLAGS += -Wnested-externs +#CONLYFLAGS += -Wnested-externs CONLYFLAGS += $(CSTANDARD) # Assembler flags. @@ -446,7 +457,7 @@ LDFLAGS += $(patsubst %,-L%,$(EXTRA_LIBDIRS)) LDFLAGS += -lc LDFLAGS += $(patsubst %,-l%,$(EXTRA_LIBS)) LDFLAGS += $(MATH_LIB) -LDFLAGS += -lc -lgcc +LDFLAGS += -lc -lgcc # Set linker-script name depending on selected submodel name LDFLAGS +=-T$(LINKERSCRIPTPATH)/link_stm32f10x_$(BOOT_MODEL).ld @@ -465,7 +476,7 @@ UNAME := $(shell uname) ifeq ($(UNAME), Darwin) OOCD_CL+=-f ../Project/OpenOCD/floss-jtag.openpilot.osx.cfg -f ../Project/OpenOCD/stm32.cfg else - OOCD_CL+=-f ../Project/OpenOCD/floss-jtag.openpilot.cfg -f ../Project/OpenOCD/stm32.cfg + OOCD_CL+=-f ../Project/OpenOCD/floss-jtag-revb.cfg -f ../Project/OpenOCD/stm32.cfg endif # initialize OOCD_CL+=-c init @@ -473,10 +484,10 @@ OOCD_CL+=-c init OOCD_CL+=-c targets # commands to prepare flash-write OOCD_CL+= -c "reset halt" -# flash erase +# flash erase OOCD_CL+=-c "stm32x mass_erase 0" # flash-write -OOCD_CL+=-c "flash write_image $(OOCD_LOADFILE)" +OOCD_CL+=-c "flash write_image $(OOCD_LOADFILE)" # Verify OOCD_CL+=-c "verify_image $(OOCD_LOADFILE)" # reset target @@ -506,7 +517,7 @@ MSG_ERRORS_NONE = Errors: none MSG_BEGIN = ${quote}-------- begin (mode: $(RUN_MODE)) --------${quote} MSG_END = ${quote}-------- end --------${quote} MSG_MODINIT = ${quote}**** Generating ModInit.c${quote} -MSG_SIZE_BEFORE = ${quote}Size before:${quote} +MSG_SIZE_BEFORE = ${quote}Size before:${quote} MSG_SIZE_AFTER = ${quote}Size after build:${quote} MSG_LOAD_FILE = ${quote}Creating load file:${quote} MSG_EXTENDED_LISTING = ${quote}Creating Extended Listing/Disassembly:${quote} @@ -536,7 +547,7 @@ LSTFILES = $(addprefix $(OUTDIR)/, $(addsuffix .lst, $(ALLSRCBASE))) # Define all depedency-files (used for make clean). DEPFILES = $(addprefix $(OUTDIR)/dep/, $(addsuffix .o.d, $(ALLSRCBASE))) -elf: $(OUTDIR)/$(TARGET).elf +elf: $(OUTDIR)/$(TARGET).elf lss: $(OUTDIR)/$(TARGET).lss sym: $(OUTDIR)/$(TARGET).sym hex: $(OUTDIR)/$(TARGET).hex @@ -548,13 +559,13 @@ all: begin gccversion build sizeafter finished end ifeq ($(LOADFORMAT),ihex) build: elf hex lss sym -else +else ifeq ($(LOADFORMAT),binary) build: elf bin lss sym -else +else ifeq ($(LOADFORMAT),both) build: elf hex bin lss sym -else +else $(error "$(MSG_FORMATERROR) $(FORMAT)") endif endif @@ -565,17 +576,17 @@ result = ${shell echo "test"} ifeq (${result}, test) quote = ' else - quote = + quote = endif ${OUTDIR}/InitMods.c: Makefile @echo ${MSG_MODINIT} - @echo ${quote}// Autogenerated file${quote} > ${OUTDIR}/InitMods.c + @echo ${quote}// Autogenerated file${quote} > ${OUTDIR}/InitMods.c @echo ${quote}${foreach MOD, ${MODNAMES}, extern unsigned int ${MOD}Initialize(void);}${quote} >> ${OUTDIR}/InitMods.c @echo ${quote}void InitModules() {${quote} >> ${OUTDIR}/InitMods.c @echo ${quote}${foreach MOD, ${MODNAMES}, ${MOD}Initialize();}${quote} >> ${OUTDIR}/InitMods.c @echo ${quote}}${quote} >> ${OUTDIR}/InitMods.c - + # Eye candy. begin: ## @echo @@ -598,9 +609,9 @@ sizeafter: # @if [ -f $(OUTDIR)/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi @echo $(MSG_SIZE_AFTER) $(ELFSIZE) - + # Display compiler version information. -gccversion : +gccversion : @$(CC) --version # @echo $(ALLOBJ) @@ -624,7 +635,7 @@ endif ## @echo @echo $(MSG_LOAD_FILE) $@ $(OBJCOPY) -O ihex $< $@ - + # Create final output file (.bin) from ELF output file. %.bin: %.elf ## @echo @@ -660,18 +671,18 @@ define ASSEMBLE_TEMPLATE $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) ## @echo @echo $(MSG_ASSEMBLING) $$< to $$@ - $(CC) -c $(THUMB) $$(ASFLAGS) $$< -o $$@ + $(CC) -c $(THUMB) $$(ASFLAGS) $$< -o $$@ endef -$(foreach src, $(ASRC), $(eval $(call ASSEMBLE_TEMPLATE, $(src)))) +$(foreach src, $(ASRC), $(eval $(call ASSEMBLE_TEMPLATE, $(src)))) # Assemble: create object files from assembler source files. ARM-only define ASSEMBLE_ARM_TEMPLATE $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) ## @echo @echo $(MSG_ASSEMBLING_ARM) $$< to $$@ - $(CC) -c $$(ASFLAGS) $$< -o $$@ + $(CC) -c $$(ASFLAGS) $$< -o $$@ endef -$(foreach src, $(ASRCARM), $(eval $(call ASSEMBLE_ARM_TEMPLATE, $(src)))) +$(foreach src, $(ASRCARM), $(eval $(call ASSEMBLE_ARM_TEMPLATE, $(src)))) # Compile: create object files from C source files. @@ -679,18 +690,18 @@ define COMPILE_C_TEMPLATE $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) ## @echo @echo $(MSG_COMPILING) $$< to $$@ - $(CC) -c $(THUMB) $$(CFLAGS) $$(CONLYFLAGS) $$< -o $$@ + $(CC) -c $(THUMB) $$(CFLAGS) $$(CONLYFLAGS) $$< -o $$@ endef -$(foreach src, $(SRC), $(eval $(call COMPILE_C_TEMPLATE, $(src)))) +$(foreach src, $(SRC), $(eval $(call COMPILE_C_TEMPLATE, $(src)))) # Compile: create object files from C source files. ARM-only define COMPILE_C_ARM_TEMPLATE $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) ## @echo @echo $(MSG_COMPILING_ARM) $$< to $$@ - $(CC) -c $$(CFLAGS) $$(CONLYFLAGS) $$< -o $$@ + $(CC) -c $$(CFLAGS) $$(CONLYFLAGS) $$< -o $$@ endef -$(foreach src, $(SRCARM), $(eval $(call COMPILE_C_ARM_TEMPLATE, $(src)))) +$(foreach src, $(SRCARM), $(eval $(call COMPILE_C_ARM_TEMPLATE, $(src)))) # Compile: create object files from C++ source files. @@ -698,18 +709,18 @@ define COMPILE_CPP_TEMPLATE $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) ## @echo @echo $(MSG_COMPILINGCPP) $$< to $$@ - $(CC) -c $(THUMB) $$(CFLAGS) $$(CPPFLAGS) $$< -o $$@ + $(CC) -c $(THUMB) $$(CFLAGS) $$(CPPFLAGS) $$< -o $$@ endef -$(foreach src, $(CPPSRC), $(eval $(call COMPILE_CPP_TEMPLATE, $(src)))) +$(foreach src, $(CPPSRC), $(eval $(call COMPILE_CPP_TEMPLATE, $(src)))) # Compile: create object files from C++ source files. ARM-only define COMPILE_CPP_ARM_TEMPLATE $(OUTDIR)/$(notdir $(basename $(1))).o : $(1) ## @echo @echo $(MSG_COMPILINGCPP_ARM) $$< to $$@ - $(CC) -c $$(CFLAGS) $$(CPPFLAGS) $$< -o $$@ + $(CC) -c $$(CFLAGS) $$(CPPFLAGS) $$< -o $$@ endef -$(foreach src, $(CPPSRCARM), $(eval $(call COMPILE_CPP_ARM_TEMPLATE, $(src)))) +$(foreach src, $(CPPSRCARM), $(eval $(call COMPILE_CPP_ARM_TEMPLATE, $(src)))) # Compile: create assembler files from C source files. ARM/Thumb @@ -725,7 +736,7 @@ $(SRCARM:.c=.s) : %.s : %.c # Generate Doxygen documents docs: doxygen $(DOXYGENDIR)/doxygen.cfg - + # Target: clean project. clean: begin clean_list finished end diff --git a/flight/OpenPilot/Modules/Actuator/actuator.c b/flight/OpenPilot/Modules/Actuator/actuator.c index 335512736..5741c6702 100644 --- a/flight/OpenPilot/Modules/Actuator/actuator.c +++ b/flight/OpenPilot/Modules/Actuator/actuator.c @@ -1,11 +1,11 @@ /** ****************************************************************************** * @addtogroup OpenPilotModules OpenPilot Modules - * @{ + * @{ * @addtogroup ActuatorModule Actuator Module * @brief Compute servo/motor settings based on @ref ActuatorDesired "desired actuator positions" and aircraft type. * This is where all the mixing of channels is computed. - * @{ + * @{ * * @file actuator.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. @@ -195,15 +195,15 @@ static void actuatorTask(void* parameters) // Update output object ActuatorCommandSet(&cmd); - // Update in case read only (eg. during servo configuration) + // Update in case read only (eg. during servo configuration) ActuatorCommandGet(&cmd); - + // Update servo outputs for (int n = 0; n < ACTUATORCOMMAND_CHANNEL_NUMELEM; ++n) { PIOS_Servo_Set( n, cmd.Channel[n] ); } - + // Wait until next update vTaskDelayUntil(&lastSysTime, settings.UpdatePeriod / portTICK_RATE_MS ); @@ -216,7 +216,7 @@ static void actuatorTask(void* parameters) */ static int32_t mixerFixedWing(const ActuatorSettingsData* settings, const ActuatorDesiredData* desired, ActuatorCommandData* cmd) { - + // Check settings if ( settings->FixedWingPitch1 == ACTUATORSETTINGS_FIXEDWINGPITCH1_NONE || settings->FixedWingRoll1 == ACTUATORSETTINGS_FIXEDWINGROLL1_NONE || @@ -227,7 +227,7 @@ static int32_t mixerFixedWing(const ActuatorSettingsData* settings, const Actuat ManualControlCommandData manualControl; ManualControlCommandGet(&manualControl); - + // Set pitch servo command cmd->Channel[ settings->FixedWingPitch1 ] = scaleChannel(desired->Pitch, settings->ChannelMax[ settings->FixedWingPitch1 ], settings->ChannelMin[ settings->FixedWingPitch1 ], @@ -263,7 +263,7 @@ static int32_t mixerFixedWing(const ActuatorSettingsData* settings, const Actuat cmd->Channel[ settings->FixedWingThrottle ] = scaleChannel(desired->Throttle, settings->ChannelMax[ settings->FixedWingThrottle ], settings->ChannelMin[ settings->FixedWingThrottle ], settings->ChannelNeutral[ settings->FixedWingThrottle ]); - else + else cmd->Channel[ settings->FixedWingThrottle ] = -1; // Done @@ -283,10 +283,10 @@ static int32_t mixerFixedWingElevon(const ActuatorSettingsData* settings, const { return -1; } - + ManualControlCommandData manualControl; ManualControlCommandGet(&manualControl); - + // Set first elevon servo command cmd->Channel[ settings->FixedWingRoll1 ] = scaleChannel(desired->Pitch + desired->Roll, settings->ChannelMax[ settings->FixedWingRoll1 ], settings->ChannelMin[ settings->FixedWingRoll1 ], @@ -296,24 +296,24 @@ static int32_t mixerFixedWingElevon(const ActuatorSettingsData* settings, const cmd->Channel[ settings->FixedWingRoll2 ] = scaleChannel(desired->Pitch - desired->Roll, settings->ChannelMax[ settings->FixedWingRoll2 ], settings->ChannelMin[ settings->FixedWingRoll2 ], settings->ChannelNeutral[ settings->FixedWingRoll2 ]); - + // Set throttle servo command if(manualControl.Armed == MANUALCONTROLCOMMAND_ARMED_TRUE) cmd->Channel[ settings->FixedWingThrottle ] = scaleChannel(desired->Throttle, settings->ChannelMax[ settings->FixedWingThrottle ], settings->ChannelMin[ settings->FixedWingThrottle ], settings->ChannelNeutral[ settings->FixedWingThrottle ]); - else + else cmd->Channel[ settings->FixedWingThrottle ] = -1; - + // Done return 0; } /** * Mixer for VTOL (quads and octo copters). Converts desired roll,pitch,yaw and throttle to servo outputs. - * - * I will probably add settings to change the weighting for each control to each motor. This will allow more - * flexible support for various motor topologies. For now hard coding in simple versions and lettings the + * + * I will probably add settings to change the weighting for each control to each motor. This will allow more + * flexible support for various motor topologies. For now hard coding in simple versions and lettings the * scaling capabilities fix the subtlties. * * Also, because of how the Throttle ranges from 0 to 1, the motors should too! @@ -326,32 +326,32 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes VTOLStatusData vtolStatus; VTOLSettingsGet(&vtolSettings); VTOLStatusGet(&vtolStatus); - + ManualControlCommandData manualControl; ManualControlCommandGet(&manualControl); - + const int vtolMin = -1; int vtolMax = -1; - + if((manualControl.Armed == MANUALCONTROLCOMMAND_ARMED_TRUE) && (desired->Throttle >= 0)) vtolMax = 1; - else - vtolMax = -1; - - if(((settings->VTOLMotorN != ACTUATORSETTINGS_VTOLMOTORN_NONE) + - (settings->VTOLMotorNE != ACTUATORSETTINGS_VTOLMOTORS_NONE) + - (settings->VTOLMotorE != ACTUATORSETTINGS_VTOLMOTORE_NONE) + - (settings->VTOLMotorSE != ACTUATORSETTINGS_VTOLMOTORSE_NONE) + - (settings->VTOLMotorS != ACTUATORSETTINGS_VTOLMOTORS_NONE) + - (settings->VTOLMotorSW != ACTUATORSETTINGS_VTOLMOTORSW_NONE) + - (settings->VTOLMotorW != ACTUATORSETTINGS_VTOLMOTORW_NONE) + + else + vtolMax = -1; + + if(((settings->VTOLMotorN != ACTUATORSETTINGS_VTOLMOTORN_NONE) + + (settings->VTOLMotorNE != ACTUATORSETTINGS_VTOLMOTORS_NONE) + + (settings->VTOLMotorE != ACTUATORSETTINGS_VTOLMOTORE_NONE) + + (settings->VTOLMotorSE != ACTUATORSETTINGS_VTOLMOTORSE_NONE) + + (settings->VTOLMotorS != ACTUATORSETTINGS_VTOLMOTORS_NONE) + + (settings->VTOLMotorSW != ACTUATORSETTINGS_VTOLMOTORSW_NONE) + + (settings->VTOLMotorW != ACTUATORSETTINGS_VTOLMOTORW_NONE) + (settings->VTOLMotorNW != ACTUATORSETTINGS_VTOLMOTORNW_NONE)) <= 2) { return -1; // can't fly with 2 or less engines (i believe) } - + if(settings->VTOLMotorN != ACTUATORSETTINGS_VTOLMOTORN_NONE) { - vtolStatus.MotorN = desired->Throttle * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_THROTTLE] + + vtolStatus.MotorN = desired->Throttle * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_THROTTLE] + desired->Pitch * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_PITCH] + desired->Roll * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_ROLL] + desired->Yaw * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_YAW]; @@ -361,7 +361,7 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes settings->ChannelNeutral[settings->VTOLMotorN]); } if(settings->VTOLMotorNE != ACTUATORSETTINGS_VTOLMOTORNE_NONE) { - vtolStatus.MotorNE = desired->Throttle * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_THROTTLE] + + vtolStatus.MotorNE = desired->Throttle * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_THROTTLE] + desired->Pitch * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_PITCH] + desired->Roll * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_ROLL] + desired->Yaw * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_YAW]; @@ -371,7 +371,7 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes settings->ChannelNeutral[settings->VTOLMotorNE]); } if(settings->VTOLMotorE != ACTUATORSETTINGS_VTOLMOTORE_NONE) { - vtolStatus.MotorE = desired->Throttle * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_THROTTLE] + + vtolStatus.MotorE = desired->Throttle * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_THROTTLE] + desired->Pitch * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_PITCH] + desired->Roll * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_ROLL] + desired->Yaw * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_YAW]; @@ -381,7 +381,7 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes settings->ChannelNeutral[settings->VTOLMotorE]); } if(settings->VTOLMotorSE != ACTUATORSETTINGS_VTOLMOTORSE_NONE) { - vtolStatus.MotorSE = desired->Throttle * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_THROTTLE] + + vtolStatus.MotorSE = desired->Throttle * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_THROTTLE] + desired->Pitch * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_PITCH] + desired->Roll * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_ROLL] + desired->Yaw * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_YAW]; @@ -391,7 +391,7 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes settings->ChannelNeutral[settings->VTOLMotorSE]); } if(settings->VTOLMotorS != ACTUATORSETTINGS_VTOLMOTORS_NONE) { - vtolStatus.MotorS = desired->Throttle * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_THROTTLE] + + vtolStatus.MotorS = desired->Throttle * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_THROTTLE] + desired->Pitch * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_PITCH] + desired->Roll * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_ROLL] + desired->Yaw * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_YAW]; @@ -401,17 +401,17 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes settings->ChannelNeutral[settings->VTOLMotorS]); } if(settings->VTOLMotorSW != ACTUATORSETTINGS_VTOLMOTORSW_NONE) { - vtolStatus.MotorSW = bound(desired->Throttle * vtolSettings.MotorSW[VTOLSETTINGS_MOTORSW_THROTTLE] + + vtolStatus.MotorSW = bound(desired->Throttle * vtolSettings.MotorSW[VTOLSETTINGS_MOTORSW_THROTTLE] + desired->Pitch * vtolSettings.MotorSW[VTOLSETTINGS_MOTORSW_PITCH] + desired->Roll * vtolSettings.MotorSW[VTOLSETTINGS_MOTORSW_ROLL] + desired->Yaw * vtolSettings.MotorSW[VTOLSETTINGS_MOTORSW_YAW],vtolMin,vtolMax); - cmd->Channel[settings->VTOLMotorSW] = scaleChannel(vtolStatus.MotorSW, + cmd->Channel[settings->VTOLMotorSW] = scaleChannel(vtolStatus.MotorSW, settings->ChannelMax[settings->VTOLMotorSW], settings->ChannelMin[settings->VTOLMotorSW], settings->ChannelNeutral[settings->VTOLMotorSW]); } if(settings->VTOLMotorW != ACTUATORSETTINGS_VTOLMOTORW_NONE) { - vtolStatus.MotorW = desired->Throttle * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_THROTTLE] + + vtolStatus.MotorW = desired->Throttle * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_THROTTLE] + desired->Pitch * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_PITCH] + desired->Roll * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_ROLL] + desired->Yaw * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_YAW]; @@ -421,7 +421,7 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes settings->ChannelNeutral[settings->VTOLMotorW]); } if(settings->VTOLMotorNW != ACTUATORSETTINGS_VTOLMOTORNW_NONE) { - vtolStatus.MotorNW = desired->Throttle * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_THROTTLE] + + vtolStatus.MotorNW = desired->Throttle * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_THROTTLE] + desired->Pitch * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_PITCH] + desired->Roll * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_ROLL] + desired->Yaw * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_YAW]; @@ -431,7 +431,7 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes settings->ChannelNeutral[settings->VTOLMotorNW]); } VTOLStatusSet(&vtolStatus); - + return 0; } @@ -645,7 +645,7 @@ static int16_t scaleChannel(float value, int16_t max, int16_t min, int16_t neutr { valueScaled = (int16_t)(value*((float)(neutral-min))) + neutral; } - + if (max>min) { if( valueScaled > max ) valueScaled = max; @@ -706,7 +706,7 @@ static float bound(float val, float min, float max) return val; } -/** +/** * @} * @} */ diff --git a/flight/OpenPilot/Modules/Actuator/matrixmixer/Actuator/actuator.c b/flight/OpenPilot/Modules/Actuator/matrixmixer/Actuator/actuator.c new file mode 100644 index 000000000..174aab70d --- /dev/null +++ b/flight/OpenPilot/Modules/Actuator/matrixmixer/Actuator/actuator.c @@ -0,0 +1,373 @@ +/** + ****************************************************************************** + * @addtogroup OpenPilotModules OpenPilot Modules + * @{ + * @addtogroup ActuatorModule Actuator Module + * @brief Compute servo/motor settings based on @ref ActuatorDesired "desired actuator positions" and aircraft type. + * This is where all the mixing of channels is computed. + * @{ + * + * @file actuator.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Actuator module. Drives the actuators (servos, motors etc). + * + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "openpilot.h" +#include "actuator.h" +#include "actuatorsettings.h" +//#include "vtolsettings.h" +#include "systemsettings.h" +#include "actuatordesired.h" +#include "actuatorcommand.h" +#include "manualcontrolcommand.h" +#include "mixersettings.h" +#include "mixerstatus.h" + + +// Private constants +#define MAX_QUEUE_SIZE 2 +#define STACK_SIZE configMINIMAL_STACK_SIZE +#define TASK_PRIORITY (tskIDLE_PRIORITY+4) +#define FAILSAFE_TIMEOUT_MS 100 + +// Private types + + +// Private variables +static xQueueHandle queue; +static xTaskHandle taskHandle; + +// Private functions +static void actuatorTask(void* parameters); +static int32_t RunMixers(ActuatorCommandData * command, ActuatorSettingsData* settings); +static int16_t scaleChannel(float value, int16_t max, int16_t min, int16_t neutral); +static void setFailsafe(); +static float MixerCurve(const float throttle, const float* curve); +float ProcessMixer(const int index, const float curve1, const float curve2, + MixerSettingsData* mixerSettings, ActuatorDesiredData* desired, + const float period); + + +/** + * @brief Module initialization + * @return 0 + */ +int32_t ActuatorInitialize() +{ + // Create object queue + queue = xQueueCreate(MAX_QUEUE_SIZE, sizeof(UAVObjEvent)); + + // Listen for ExampleObject1 updates + ActuatorDesiredConnectQueue(queue); + + // Start main task + xTaskCreate(actuatorTask, (signed char*)"Actuator", STACK_SIZE, NULL, TASK_PRIORITY, &taskHandle); + + return 0; +} + +/** + * @brief Main module task + */ +static void actuatorTask(void* parameters) +{ +// UAVObjEvent ev; + portTickType lastSysTime; + ActuatorCommandData command; + ActuatorSettingsData settings; + + // Set servo update frequency (done only on start-up) + ActuatorSettingsGet(&settings); + PIOS_Servo_SetHz(settings.ChannelUpdateFreq[0], settings.ChannelUpdateFreq[1]); + + // Go to the neutral (failsafe) values until an ActuatorDesired update is received + setFailsafe(); + + // Main task loop + lastSysTime = xTaskGetTickCount(); + while (1) + { + + ActuatorCommandGet(&command); + ActuatorSettingsGet(&settings); + if ( RunMixers(&command, &settings) == -1 ) + { + AlarmsSet(SYSTEMALARMS_ALARM_ACTUATOR, SYSTEMALARMS_ALARM_CRITICAL); + } + else + { + AlarmsClear(SYSTEMALARMS_ALARM_ACTUATOR); + } + + // Update output object + ActuatorCommandSet(&command); + // Update in case read only (eg. during servo configuration) + ActuatorCommandGet(&command); + + // Update servo outputs + for (int n = 0; n < ACTUATORCOMMAND_CHANNEL_NUMELEM; ++n) + { + PIOS_Servo_Set( n, command.Channel[n] ); + } + // Wait until next update + vTaskDelayUntil(&lastSysTime, settings.UpdatePeriod / portTICK_RATE_MS ); + + } +} + +/** + * Universal matrix based mixer for VTOL, helis and fixed wing. + * Converts desired roll,pitch,yaw and throttle to servo/ESC outputs. + * + * Because of how the Throttle ranges from 0 to 1, the motors should too! + * + * Note this code depends on the UAVObjects for the mixers being all being the same + * and in sequence. If you change the object definition, make sure you check the code! + * + * @return -1 if error, 0 if success + */ + +//this structure is equivalent to the UAVObjects for one mixer. +typedef struct { + uint8_t type; + float matrix[5]; +} __attribute__((packed)) Mixer_t; + + +#define MAX_MIX_ACTUATORS ACTUATORCOMMAND_CHANNEL_NUMELEM + +static int32_t RunMixers(ActuatorCommandData* command, ActuatorSettingsData* settings) +{ + SystemSettingsData sysSettings; + MixerSettingsData mixerSettings; + ActuatorDesiredData desired; + MixerStatusData mixerStatus; + + SystemSettingsGet(&sysSettings); + MixerStatusGet(&mixerStatus); + MixerSettingsGet (&mixerSettings); + ActuatorDesiredGet(&desired); + + float * status = (float *)&mixerStatus; //access status objects as an array of floats + + + int nMixers = 0; + Mixer_t * mixers = (Mixer_t *)&mixerSettings.Mixer0Type; + for(int ct=0; ct < MAX_MIX_ACTUATORS; ct++) + { + if(mixers[ct].type != MIXERSETTINGS_MIXER0TYPE_DISABLED) + { + nMixers ++; + } + } + if(nMixers < 2) //Nothing can fly with less than two mixers. + { + return(-1); + } + + ManualControlCommandData manualControl; + ManualControlCommandGet(&manualControl); + + + float curve1 = MixerCurve(desired.Throttle,mixerSettings.ThrottleCurve1); + float curve2 = MixerCurve(desired.Throttle,mixerSettings.ThrottleCurve2); + for(int ct=0; ct < MAX_MIX_ACTUATORS; ct++) + { + if(mixers[ct].type != MIXERSETTINGS_MIXER0TYPE_DISABLED) + { + status[ct] = scaleChannel(ProcessMixer(ct, curve1, curve2, &mixerSettings, &desired, settings->UpdatePeriod), + settings->ChannelMax[ct], + settings->ChannelMin[ct], + settings->ChannelNeutral[ct]); + if(manualControl.Armed != MANUALCONTROLCOMMAND_ARMED_TRUE && + mixers[ct].type == MIXERSETTINGS_MIXER0TYPE_MOTOR) + { + command->Channel[ct] = -1; //force zero throttle + }else + { + command->Channel[ct] = status[ct]; //servos always follow command + } + } + } + MixerStatusSet(&mixerStatus); + return(0); +} + +/** + *Process mixing for one actuator +*/ + +float ProcessMixer(const int index, const float curve1, const float curve2, + MixerSettingsData* mixerSettings, ActuatorDesiredData* desired, const float period) +{ + static float lastResult[MAX_MIX_ACTUATORS]={0,0,0,0,0,0,0,0}; + static float lastFilteredResult[MAX_MIX_ACTUATORS]={0,0,0,0,0,0,0,0}; + static float filterAccumulator[MAX_MIX_ACTUATORS]={0,0,0,0,0,0,0,0}; + Mixer_t * mixers = (Mixer_t *)&mixerSettings->Mixer0Type; //pointer to array of mixers in UAVObjects + Mixer_t * mixer = &mixers[index]; + float result = (mixer->matrix[MIXERSETTINGS_MIXER0MATRIX_THROTTLECURVE1] * curve1) + + (mixer->matrix[MIXERSETTINGS_MIXER0MATRIX_THROTTLECURVE2] * curve2) + + (mixer->matrix[MIXERSETTINGS_MIXER0MATRIX_ROLL] * desired->Roll) + + (mixer->matrix[MIXERSETTINGS_MIXER0MATRIX_PITCH] * desired->Pitch) + + (mixer->matrix[MIXERSETTINGS_MIXER0MATRIX_YAW] * desired->Yaw); + if(mixer->type == MIXERSETTINGS_MIXER0TYPE_MOTOR) + { + if(result < 0) //idle throttle + { + result = 0; + } + + //feed forward + float accumulator = filterAccumulator[index]; + accumulator += (result - lastResult[index]) * mixerSettings->FeedForward; + lastResult[index] = result; + result += accumulator; + if(accumulator > 0) + { + float filter = mixerSettings->AccelTime / period; + if(filter <1) + { + filter = 1; + } + accumulator -= accumulator / filter; + }else + { + float filter = mixerSettings->DecelTime / period; + if(filter <1) + { + filter = 1; + } + accumulator -= accumulator / filter; + } + filterAccumulator[index] = accumulator; + result += accumulator; + + //acceleration limit + float dt = result - lastFilteredResult[index]; + float maxDt = mixerSettings->MaxAccel * (period / 1000); + if(dt > maxDt) //we are accelerating too hard + { + result = lastFilteredResult[index] + maxDt; + } + lastFilteredResult[index] = result; + } + return(result); +} + + +/** + *Interpolate a throttle curve. Throttle input should be in the range 0 to 1. + *Output is in the range 0 to 1. +*/ + +#define MIXER_CURVE_ENTRIES 5 + +static float MixerCurve(const float throttle, const float* curve) +{ + float scale = throttle * MIXER_CURVE_ENTRIES; + int idx1 = scale; + scale -= (float)idx1; //remainder + if(curve[0] < -1) + { + return(throttle); + } + if (idx1 < 0) + { + idx1 = 0; //clamp to lowest entry in table + scale = 0; + } + int idx2 = idx1 + 1; + if(idx2 >= MIXER_CURVE_ENTRIES) + { + idx2 = MIXER_CURVE_ENTRIES -1; //clamp to highest entry in table + if(idx1 >= MIXER_CURVE_ENTRIES) + { + idx1 = MIXER_CURVE_ENTRIES -1; + } + } + return((curve[idx1] * (1 - scale)) + (curve[idx2] * scale)); +} + + +/** + * Convert channel from -1/+1 to servo pulse duration in microseconds + */ +static int16_t scaleChannel(float value, int16_t max, int16_t min, int16_t neutral) +{ + int16_t valueScaled; + // Scale + if ( value >= 0.0) + { + valueScaled = (int16_t)(value*((float)(max-neutral))) + neutral; + } + else + { + valueScaled = (int16_t)(value*((float)(neutral-min))) + neutral; + } + + if (max>min) + { + if( valueScaled > max ) valueScaled = max; + if( valueScaled < min ) valueScaled = min; + } + else + { + if( valueScaled < max ) valueScaled = max; + if( valueScaled > min ) valueScaled = min; + } + + return valueScaled; +} + +/** + * Set actuator output to the neutral values (failsafe) + */ +static void setFailsafe() +{ + ActuatorCommandData command; + ActuatorSettingsData settings; + + ActuatorCommandGet(&command); + ActuatorSettingsGet(&settings); + // Reset ActuatorCommand to neutral values + for (int n = 0; n < ACTUATORCOMMAND_CHANNEL_NUMELEM; ++n) + { + command.Channel[n] = settings.ChannelNeutral[n]; + } + + // Set alarm + AlarmsSet(SYSTEMALARMS_ALARM_ACTUATOR, SYSTEMALARMS_ALARM_CRITICAL); + + // Update servo outputs + for (int n = 0; n < ACTUATORCOMMAND_CHANNEL_NUMELEM; ++n) + { + PIOS_Servo_Set( n, command.Channel[n] ); + } + + // Update output object + ActuatorCommandSet(&command); +} + + +/** + * @} + * @} + */ diff --git a/flight/OpenPilot/Modules/Actuator/matrixmixer/Actuator/inc/actuator.h b/flight/OpenPilot/Modules/Actuator/matrixmixer/Actuator/inc/actuator.h new file mode 100644 index 000000000..e0a6afc24 --- /dev/null +++ b/flight/OpenPilot/Modules/Actuator/matrixmixer/Actuator/inc/actuator.h @@ -0,0 +1,42 @@ +/** + ****************************************************************************** + * @addtogroup OpenPilotModules OpenPilot Modules + * @{ + * @addtogroup ActuatorModule Actuator Module + * @brief Compute servo/motor settings based on @ref ActuatorDesired "desired actuator positions" and aircraft type. + * This is where all the mixing of channels is computed. + * @{ + * + * @file actuator.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Actuator module. Drives the actuators (servos, motors etc). + * + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef ACTUATOR_H +#define ACTUATOR_H + +int32_t ActuatorInitialize(); + +#endif // ACTUATOR_H + +/** + * @} + * @} + */ diff --git a/flight/OpenPilot/UAVObjects/uavobjectsinit.c b/flight/OpenPilot/UAVObjects/uavobjectsinit.c index c5923a863..477cf91b5 100644 --- a/flight/OpenPilot/UAVObjects/uavobjectsinit.c +++ b/flight/OpenPilot/UAVObjects/uavobjectsinit.c @@ -52,6 +52,8 @@ #include "homelocation.h" #include "manualcontrolcommand.h" #include "manualcontrolsettings.h" +#include "mixersettings.h" +#include "mixerstatus.h" #include "navigationdesired.h" #include "navigationsettings.h" #include "objectpersistence.h" @@ -95,6 +97,8 @@ void UAVObjectsInitializeAll() HomeLocationInitialize(); ManualControlCommandInitialize(); ManualControlSettingsInitialize(); + MixerSettingsInitialize(); + MixerStatusInitialize(); NavigationDesiredInitialize(); NavigationSettingsInitialize(); ObjectPersistenceInitialize(); diff --git a/ground/src/plugins/uavobjects/uavobjects.pro b/ground/src/plugins/uavobjects/uavobjects.pro index dc3d301e6..ce35dc1b1 100644 --- a/ground/src/plugins/uavobjects/uavobjects.pro +++ b/ground/src/plugins/uavobjects/uavobjects.pro @@ -1,91 +1,95 @@ -TEMPLATE = lib -TARGET = UAVObjects -DEFINES += UAVOBJECTS_LIBRARY -include(../../openpilotgcsplugin.pri) -include(uavobjects_dependencies.pri) -HEADERS += uavobjects_global.h \ - uavobject.h \ - uavmetaobject.h \ - uavobjectmanager.h \ - uavdataobject.h \ - uavobjectfield.h \ - uavobjectsinit.h \ - uavobjectsplugin.h \ - examplesettings.h \ - ahrsstatus.h \ - ahrscalibration.h \ - baroaltitude.h \ - attitudeactual.h \ - ahrssettings.h \ - exampleobject2.h \ - exampleobject1.h \ - gcstelemetrystats.h \ - attituderaw.h \ - flighttelemetrystats.h \ - systemstats.h \ - systemalarms.h \ - objectpersistence.h \ - telemetrysettings.h \ - systemsettings.h \ - stabilizationsettings.h \ - flightsituationactual.h \ - manualcontrolsettings.h \ - manualcontrolcommand.h \ - attitudedesired.h \ - actuatorsettings.h \ - actuatordesired.h \ - actuatorcommand.h \ - navigationsettings.h \ - navigationdesired.h \ - gpsposition.h \ - gpstime.h \ - gpssatellites.h \ - positionactual.h \ - flightbatterystate.h \ - homelocation.h \ - vtolsettings.h \ - vtolstatus.h \ - attitudesettings.h -SOURCES += uavobject.cpp \ - uavmetaobject.cpp \ - uavobjectmanager.cpp \ - uavdataobject.cpp \ - uavobjectfield.cpp \ - uavobjectsinit.cpp \ - uavobjectsplugin.cpp \ - ahrsstatus.cpp \ - ahrscalibration.cpp \ - baroaltitude.cpp \ - attitudeactual.cpp \ - ahrssettings.cpp \ - examplesettings.cpp \ - exampleobject2.cpp \ - exampleobject1.cpp \ - gcstelemetrystats.cpp \ - attituderaw.cpp \ - flighttelemetrystats.cpp \ - systemstats.cpp \ - systemalarms.cpp \ - objectpersistence.cpp \ - telemetrysettings.cpp \ - systemsettings.cpp \ - stabilizationsettings.cpp \ - flightsituationactual.cpp \ - manualcontrolsettings.cpp \ - manualcontrolcommand.cpp \ - attitudedesired.cpp \ - actuatorsettings.cpp \ - actuatordesired.cpp \ - actuatorcommand.cpp \ - navigationsettings.cpp \ - navigationdesired.cpp \ - gpsposition.cpp \ - gpstime.cpp \ - gpssatellites.cpp \ - positionactual.cpp \ - flightbatterystate.cpp \ - homelocation.cpp \ - vtolsettings.cpp \ - vtolstatus.cpp \ - attitudesettings.cpp -OTHER_FILES += UAVObjects.pluginspec +TEMPLATE = lib +TARGET = UAVObjects +DEFINES += UAVOBJECTS_LIBRARY +include(../../openpilotgcsplugin.pri) +include(uavobjects_dependencies.pri) +HEADERS += uavobjects_global.h \ + uavobject.h \ + uavmetaobject.h \ + uavobjectmanager.h \ + uavdataobject.h \ + uavobjectfield.h \ + uavobjectsinit.h \ + uavobjectsplugin.h \ + examplesettings.h \ + ahrsstatus.h \ + ahrscalibration.h \ + baroaltitude.h \ + attitudeactual.h \ + ahrssettings.h \ + exampleobject2.h \ + exampleobject1.h \ + gcstelemetrystats.h \ + attituderaw.h \ + flighttelemetrystats.h \ + systemstats.h \ + systemalarms.h \ + objectpersistence.h \ + telemetrysettings.h \ + systemsettings.h \ + stabilizationsettings.h \ + flightsituationactual.h \ + manualcontrolsettings.h \ + manualcontrolcommand.h \ + attitudedesired.h \ + actuatorsettings.h \ + actuatordesired.h \ + actuatorcommand.h \ + navigationsettings.h \ + navigationdesired.h \ + gpsposition.h \ + gpstime.h \ + gpssatellites.h \ + positionactual.h \ + flightbatterystate.h \ + homelocation.h \ + vtolsettings.h \ + vtolstatus.h \ + attitudesettings.h \ + mixersettings.h \ + mixerstatus.h +SOURCES += uavobject.cpp \ + uavmetaobject.cpp \ + uavobjectmanager.cpp \ + uavdataobject.cpp \ + uavobjectfield.cpp \ + uavobjectsinit.cpp \ + uavobjectsplugin.cpp \ + ahrsstatus.cpp \ + ahrscalibration.cpp \ + baroaltitude.cpp \ + attitudeactual.cpp \ + ahrssettings.cpp \ + examplesettings.cpp \ + exampleobject2.cpp \ + exampleobject1.cpp \ + gcstelemetrystats.cpp \ + attituderaw.cpp \ + flighttelemetrystats.cpp \ + systemstats.cpp \ + systemalarms.cpp \ + objectpersistence.cpp \ + telemetrysettings.cpp \ + systemsettings.cpp \ + stabilizationsettings.cpp \ + flightsituationactual.cpp \ + manualcontrolsettings.cpp \ + manualcontrolcommand.cpp \ + attitudedesired.cpp \ + actuatorsettings.cpp \ + actuatordesired.cpp \ + actuatorcommand.cpp \ + navigationsettings.cpp \ + navigationdesired.cpp \ + gpsposition.cpp \ + gpstime.cpp \ + gpssatellites.cpp \ + positionactual.cpp \ + flightbatterystate.cpp \ + homelocation.cpp \ + vtolsettings.cpp \ + vtolstatus.cpp \ + attitudesettings.cpp \ + mixersettings.cpp \ + mixerstatus.cpp +OTHER_FILES += UAVObjects.pluginspec diff --git a/ground/src/plugins/uavobjects/uavobjectsinit.cpp b/ground/src/plugins/uavobjects/uavobjectsinit.cpp index b82f0817d..c264562ff 100644 --- a/ground/src/plugins/uavobjects/uavobjectsinit.cpp +++ b/ground/src/plugins/uavobjects/uavobjectsinit.cpp @@ -54,6 +54,8 @@ #include "homelocation.h" #include "manualcontrolcommand.h" #include "manualcontrolsettings.h" +#include "mixersettings.h" +#include "mixerstatus.h" #include "navigationdesired.h" #include "navigationsettings.h" #include "objectpersistence.h" @@ -97,6 +99,8 @@ void UAVObjectsInitialize(UAVObjectManager* objMngr) objMngr->registerObject( new HomeLocation() ); objMngr->registerObject( new ManualControlCommand() ); objMngr->registerObject( new ManualControlSettings() ); + objMngr->registerObject( new MixerSettings() ); + objMngr->registerObject( new MixerStatus() ); objMngr->registerObject( new NavigationDesired() ); objMngr->registerObject( new NavigationSettings() ); objMngr->registerObject( new ObjectPersistence() ); diff --git a/ground/src/shared/uavobjectdefinition/mixersettings.xml b/ground/src/shared/uavobjectdefinition/mixersettings.xml new file mode 100644 index 000000000..6033e7f53 --- /dev/null +++ b/ground/src/shared/uavobjectdefinition/mixersettings.xml @@ -0,0 +1,31 @@ + + + Settings for the @ref ActuatorModule that controls the channel assignments for the mixer based on AircraftType + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ground/src/shared/uavobjectdefinition/mixerstatus.xml b/ground/src/shared/uavobjectdefinition/mixerstatus.xml new file mode 100644 index 000000000..7ed04e486 --- /dev/null +++ b/ground/src/shared/uavobjectdefinition/mixerstatus.xml @@ -0,0 +1,17 @@ + + + Status for the matrix mixer showing the output of each mixer after all scaling + + + + + + + + + + + + + +