Difference between revisions of "AirborneCodeReorg"

From PaparazziUAV
Jump to: navigation, search
m (supported boards)
m
 
(45 intermediate revisions by 7 users not shown)
Line 1: Line 1:
==Problem statement==
+
== Our Challenge ==
  
Current airborne code has gone a little bit out of control and is in deep need of a reorganization.
+
The current airborne sourcecode has gone a little bit out of control. Everyone was working on it enthusiastically, which is great! However, we feel now the moment has arrived where deep reorganization of the code would benefit us all.
  
Fixed wing airframes have makefile directly in them - we can't change anything in the airborne code without breaking everybody's airframe
+
It is really appreciated if you want to help out in this quest. Therefore remarks and suggestions [[Talk:AirborneCodeReorg | can be placed on the page designed specifically for this]]. Of-course feel free to use the mailinglist also.
  
  ap.srcs += commands.c
+
== Problem areas ==
  ap.CFLAGS += -DACTUATORS=\"servos_4015_MAT_hw.h\" -DSERVOS_4015_MAT
 
  ap.srcs += $(SRC_ARCH)/servos_4015_MAT_hw.c actuators.c
 
  ap.CFLAGS += -DRADIO_CONTROL
 
  ap.srcs += radio_control.c $(SRC_ARCH)/ppm_hw.c
 
  [...]
 
  ap.CFLAGS += -DNAV -DAGR_CLIMB -DLOITER_TRIM -DALT_KALMAN -DWIND_INFO
 
  ap.srcs += nav.c fw_h_ctl.c fw_v_ctl.c
 
  
Booz uses "susbsystem" Makefiles
+
Fixed wing airframes have makefile directly in them - we can't change anything in the airborne code without breaking everybody's airframe
  
  include $(PAPARAZZI_SRC)/conf/autopilot/booz2_common.makefile
+
--> use the subsystems
  include $(CFG_BOOZ)/booz2_autopilot.makefile
 
  include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
 
  include $(CFG_BOOZ)/subsystems/booz2_actuators_mkk.makefile
 
  include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
 
 
 
This is the Makefile part of a booz vehicle using a booz2 IMU, mikrokopter actuators and ppm radio control
 
  
 
There is also the "module" facility which is very good for optional features.
 
There is also the "module" facility which is very good for optional features.
 
  
 
There are 3 kinds of code in the airborne directory
 
There are 3 kinds of code in the airborne directory
  
 
*generic code (that doesn't depend on any architecture or plateforme) - there's a lot of it and it should probably be sorted by type of functionalities
 
*generic code (that doesn't depend on any architecture or plateforme) - there's a lot of it and it should probably be sorted by type of functionalities
**fixed_wings/main.c
+
**fixedwing/main.c
 
**thrust_vectoring/main.c
 
**thrust_vectoring/main.c
 
**gps.[ch]
 
**gps.[ch]
Line 40: Line 26:
 
==Coding Style==
 
==Coding Style==
  
==Names==
+
* 2 spaces for indent
Booz both stands for the LPC2148 quad board and the quadrotor autopilot code - Let's call the quadrotor autopilot "Baloo" ( if you got a better name, don't hesitate, but be quick). What about a name for the fixedwing code ? (which has been called Paparazzi until now and collides with the name of the project itself )
+
* please no trailing whitespaces (e.g. fix with M-x whitespace-cleanup in emacs)
 +
 
 +
== Proposals and RFC ==
  
==Proposed reorganization==
 
  
#Move more code to modules
+
=== Directory structure proposals ===
#Move Makefile out of the airframe file as much as possible (modules have there own makefile / booz include makefile approach: "conf/autopilot/fixedwing_common.makefile")
 
#Send mailing list message requesting to change the makefile section of airframes into new include structure
 
#Once many users have this in place and the wiki page is good, we can start to move code
 
[[User:Cdewagter|cdewagter]]
 
  
==Proposed Directory structure==
 
 
relative to sw/airborne
 
relative to sw/airborne
   baloo/ (a target)
+
 
  fixedwing/(or a new name, another target)
+
   firmware/
   radio_control/ (a subsystem)
+
      rotorcraft/
  gps/ (another subsystem)
+
          rotorcraft.makefile
  ...(more subsystems)
+
          rotorcraft.xml // list of subsystems: maybe autogenerate as this should reflect the directory structure
  imu.[ch]
+
          foo/
   imu/
+
              foo.c
 +
              foo_2.c
 +
      fixedwing/
 +
          control/
 +
              control.c
 +
              control_adaptive.c
 +
   subsystems/
 +
      imu/              // a general subsystem with several implementations and arch depended code (initialization, interrupts, ...)
 +
          imu_xsense.c
 +
          imu_b2.c
 +
          calibration_routines/    // might be useful to have subdirectories
 +
      gps/             // another general subsystem
 +
          ....
 +
      radio_control/    // another general subsystem
 +
          ....
 +
      actuator
 +
          stm - lpc - arm - omap - ...
 +
   boards/
 +
      test_tiny
 +
      test_lisa
 
   modules/
 
   modules/
 +
      ....
 
   arch/
 
   arch/
    avr/
+
      subsystems/
    lpc21/
+
          imu/
    stm32/
+
              lcp21/
    omap/
+
                  imu_xsense_arch.[ch]
 +
                  imu_b2_arch.[ch]
 +
              stm32/
 +
                  imu_xsense_arch.[ch]
 +
                  imu_b2_arch.[ch]
 +
              sim/
 +
      firmware/
 +
          fixedwing/
 +
              control/
 +
                  lcp21/
 +
                      control_arch.[ch]
 +
                      control_adaptive_arch.[ch]
 +
                  stm32/
 +
                      control_arch.[ch]
 +
                      control_adaptive_arch.[ch]
 +
                  sim/
  
each susbsystem having several implementations gets a subdirectory
 
  imu.[ch]
 
  imu/
 
    imu_xsense.[ch]
 
    imu_b2.[ch]
 
  
  
in each of the directory under arch, a replication of the toplevel directory containing architecture specific implementations
+
each general susbsystem having several implementations gets a subdirectory under subsystems
 
+
   imu.[ch]
   imu.h
 
 
   imu/
 
   imu/
 
     imu_xsense.[ch]
 
     imu_xsense.[ch]
 
     imu_b2.[ch]
 
     imu_b2.[ch]
  arch/
 
    lpc21/
 
      imu/
 
        imu_xsense_arch.[ch]
 
        imu_b2_arch.[ch]
 
    stm32/
 
      imu/
 
        imu_xsense_arch.[ch]
 
        imu_b2_arch.[ch]
 
 
 
  
==supported boards==
+
Rationale for the subsystem directory:
* twog_1
+
# to have less directories in the airborne root
* tiny_2.11
+
# to help auto-documentation tools: "all subfolders in airborne/subsystems/ are subsystems. if you put them directly in airborne it becomes: all directories in airborne are subsystems except arch/firmware/modules/... etc
* tiny_2.1
+
# it's less obvious how the imu code is used (is it standalone/firmware/modules) to newcommers than with the extra dir.
* tiny_1.1
 
* tiny_0.99
 
* booz
 
* lisa
 
  
 
==Test Code==
 
==Test Code==
  
 +
Testing code is specifically for UAS of utmost importance. To test we could opt to make small cases in Testlink for everyone to try and report the outcome.
  
==Replace makefile section with xml==
+
==Replace makefile section with xml - [READY]==
 
of course leave the possibility to have a makefile section, but the normal user would have something like
 
of course leave the possibility to have a makefile section, but the normal user would have something like
 
{| border=1 width=100%
 
{| border=1 width=100%
Line 111: Line 109:
 
|-
 
|-
 
|
 
|
   <target name="booz2_autopilot">
+
   <firmware name=rotorcraft>
    <subsystem name="radio_control" type="ppm"/>
+
    <!-- this set of firmware fits in 2 targets: -->
    <subsystem name="actuators" type="mkk"/>
+
    <target name="ap" board="booz"/>
    <subsystem name="imu" type="b2v1"/>
+
    <target name="sim" board="sim" />
   </target>
+
 
 +
    <!-- these subsystems are used for all targets in this firmware -->
 +
    <subsystem name="radio_control" type="ppm"/>
 +
    <subsystem name="actuators" type="mkk"/>
 +
    <subsystem name="imu" type="b2v1"/>
 +
   </firmware >
 +
  <firmware name="setup" >
 +
    <target name="tunnel" />
 +
    <target name="test_actuators" />
 +
  </firmware>
 
|  
 
|  
include $(PAPARAZZI_SRC)/conf/autopilot/booz2_common.makefile
+
 
   include $(CFG_BOOZ)/booz2_autopilot.makefile
+
  ifeq ($(TARGET),ap)
 +
  include $(PAPARAZZI_SRC)/conf/board/booz.makefile
 +
   include $(PAPARAZZI_SRC)/conf/autopilot/rotorcraft.makefile
 
   include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
 
   include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
 
   include $(CFG_BOOZ)/subsystems/booz2_actuators_mkk.makefile
 
   include $(CFG_BOOZ)/subsystems/booz2_actuators_mkk.makefile
 
   include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
 
   include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
 +
  endif
 +
 +
  ifeq ($(TARGET),sim)
 +
  include $(PAPARAZZI_SRC)/conf/board/pc.makefile
 +
  include $(PAPARAZZI_SRC)/conf/autopilot/rotorcraft.makefile
 +
  include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
 +
  include $(CFG_BOOZ)/subsystems/booz2_actuators_mkk.makefile
 +
  include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
 +
  endif
 +
 +
  ifeq ($(TARGET),tunnel)
 +
  include $(PAPARAZZI_SRC)/conf/board/booz.makefile
 +
  include $(PAPARAZZI_SRC)/conf/autopilot/setup.makefile
 +
  endif
 +
 
|}
 
|}
  
 
   
 
   
put defines in here that get written in airframe.h
+
?? put defines in here that get written in airframe.h ??
 +
 
 +
[[User:Cdewagter|cdewagter]] I'm not really sure this is needed as otherwise you might put all other data of the airframe file in here too next to the submodule it belongs too. I think it is more readable with less defines in here. I would suggest to only have global compile defines that need to be in the Makefile.ac here...
 +
 
 
{| border=1 width=100%
 
{| border=1 width=100%
 
| airframe.xml  
 
| airframe.xml  
Line 132: Line 159:
 
|-
 
|-
 
|rowspan=4|
 
|rowspan=4|
<target name="booz2_autopilot">
+
 
    <subsystem name="actuators" type="mkk">
+
  <firmware name=fixedwing>
      <define name="NB" value="4"/>
+
    <!-- this set of firmware fits in 2 targets: -->
      <define name="ADDR" value="{ 0x52, 0x54, 0x56, 0x58 }"/>
+
    <target name="ap" board="tiny_2.11">
    </subsystem>  
+
      <define name="ALT_KALMAN"/>
    <subsystem name="imu" type="b2v1"/>
+
    </target>
   </target>
+
    <subsystem name="led" />
 +
   </firmware >
 +
 
 
|-
 
|-
 
|
 
|
include $(PAPARAZZI_SRC)/conf/autopilot/booz2_common.makefile
+
  FLASH_MODE = IAP
   include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
+
  include $(PAPARAZZI_SRC)/conf/board/tiny_2.11.makefile
   include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
+
   include $(PAPARAZZI_SRC)/conf/autopilot/fixedwing.makefile
 +
  ap.CFLAGS += -DALT_KALMAN
 +
   include $(SRCS_FIXEDWING)/led.makefile
 
|-
 
|-
 
| airframe.h
 
| airframe.h
 
|-
 
|-
 
|
 
|
#define ACTUATORS_MKK_NB 4
+
 
#define ACTUATORS_MKK_ADDR {0x52,0x54,0x56,0x58}
+
  #define USE_LED
 +
 
 
|}
 
|}
  
Line 160: Line 192:
 
|-
 
|-
 
|
 
|
   <target name="booz2_autopilot">
+
   <subsystem name="gps" type="ubx">
    <subsystem name="gps" type="ubx">
+
    <configure name="GPS_PORT" value="1"/>
      <param name="GPS_UART_NR" value="1"/>
+
    <configure name="GPS_BAUD"    value="B38400"/>
      <param name="GPS_BAUD"    value="38400"/>
+
    <configure name="GPS_LED"    value="2"/>
    </subsystem>  
+
   </subsystem>  
   </target>
 
 
|
 
|
  GPS_UART_NR=1
+
  GPS_PORT=1
  GPS_BAUD=38400
+
  GPS_BAUD=B38400
  include $(CFG_BOOZ)/subsystems/booz2_gps_ubx.makefile
+
GPS_LED=2
 +
  include $(CFG_FIXEDWING)/subsystems/gps_ubx.makefile
 
|}
 
|}
 +
 +
* Note that now a subsystem can be enabled for all targets in that firmware by using
 +
 +
  $(TARGET).srcs += navigation.c
 +
 +
* Note that you only 1 time in the board file (e.g. /boards/tiny_2.11.makefile)
 +
 +
  $(TARGET).arch = lpc21
 +
 +
instead having this in the firmware/subsystem makefiles
 +
 +
  tunnel.ARCH = lpc21
 +
  ap.ARCH = lpc21
 +
  fbw.ARCH = lpc21
 +
  ...
  
 
==Include guards==
 
==Include guards==
Line 187: Line 234:
 
  [code]
 
  [code]
 
  #endif /* CSC_AP_AIRSPEED_H */
 
  #endif /* CSC_AP_AIRSPEED_H */
 +
 +
 +
Here is a list of headers know not to include guards please remove any that you update from the list.
 +
 +
sw/in_progress/videolizer/spook/conf_parse.h
 +
sw/in_progress/videolizer/spook/rtp.h
 +
sw/in_progress/videolizer/spook/stream.h
 +
sw/in_progress/videolizer/spook/log.h
 +
sw/in_progress/videolizer/spook/pmsg.h
 +
sw/in_progress/videolizer/spook/global_config.h
 +
sw/in_progress/videolizer/spook/outputs.h
 +
sw/in_progress/videolizer/spook/jpeg_tables.h
 +
sw/in_progress/videolizer/spook/frame.h
 +
sw/in_progress/videolizer/spook/inputs.h
 +
sw/in_progress/videolizer/spook/event.h
 +
sw/in_progress/videolizer/spook/mpegaudio.h
 +
sw/in_progress/videolizer/spook/encoders.h
 +
sw/in_progress/videolizer/spook/base64_table.h
 +
sw/in_progress/videolizer/spook/rtp_media.h
 +
sw/in_progress/videolizer/wis-go7007-linux/kernel/go7007-priv.h
 +
sw/in_progress/videolizer/ws-go7007-linux/kernel/wis-i2c.h
 +
sw/in_progress/videolizer/wis-go7007-linux/include/go7007.h
 +
sw/in_progress/inertial/C/tilt_display.h sw/airborne/fms/packet_header.h
 +
sw/airborne/arm7/interrupt_hw.h
 +
sw/airborne/arm7/lpcusb/usbhw_lpc.h
 +
sw/airborne/arm7/lpcusb/usbdebug.h
 +
sw/airborne/arm7/lpcusb/examples/console.h
 +
sw/airborne/arm7/lpcusb/examples/startup.h
 +
sw/airborne/arm7/lpcusb/examples/msc_bot.h
 +
sw/airborne/arm7/lpcusb/examples/spi.h
 +
sw/airborne/arm7/lpcusb/examples/msc_scsi.h
 +
sw/airborne/arm7/lpcusb/examples/blockdev.h
 +
sw/airborne/arm7/lpcusb/usbapi.h
 +
sw/airborne/arm7/test/bootloader/console.h
 +
sw/airborne/arm7/test/bootloader/usbhw_lpc.h
 +
sw/airborne/arm7/test/bootloader/startup.h
 +
sw/airborne/arm7/test/bootloader/usbdebug.h
 +
sw/airborne/arm7/test/bootloader/usbapi.h
 +
sw/airborne/arm7/test/bootloader/lpc21iap.h
 +
sw/airborne/arm7/test/welcome.h
 +
sw/airborne/csc/csc_vane.h
 +
sw/airborne/csc/csc_airspeed.h
 +
sw/airborne/vor/lo.h
 +
sw/airborne/coaxial/tl_gps_configure.h
 +
sw/airborne/flightzone.h
 +
sw/airborne/booz/arch/stm32/radio_control/booz_radio_control_ppm_arch.h
 +
sw/airborne/sd_card/sd_card.h
 +
sw/airborne/ism/uart_hw.h
 +
sw/airborne/sim/sim_uart.h
 +
sw/airborne/sim/ivy_transport.h
 +
sw/airborne/sim/led_hw.h
 +
sw/airborne/osam_imu_ugear.h
 +
sw/airborne/wind_tunnel/wt_baro.h
  
 
==Misc==
 
==Misc==
  
 
* All headers are defined relative to sw/airborne (limit the -I to -Isw/airborne and the generated code)
 
* All headers are defined relative to sw/airborne (limit the -I to -Isw/airborne and the generated code)
   #include "baloo/whatever.h"
+
   #include "foo/whatever.h"
 
* Generated headers are indicated by their directory
 
* Generated headers are indicated by their directory
 
   #include "generated/airframe.h"
 
   #include "generated/airframe.h"
Line 202: Line 302:
 
I could not agree more!
 
I could not agree more!
  
Let's start with a subsystem that is both simple enough yet representative, I suggest radio control
 
For now people using fixed wing have
 
 
  ap.CFLAGS += -DRADIO_CONTROL
 
  ap.srcs += radio_control.c $(SRC_ARCH)/ppm_hw.c
 
 
Let's ask people to remove those lines from their makefile and replace with
 
 
  <target name="fixed_wings" board="tiny_2.11">
 
    <subsystem name="radio_control" type="ppm"/>
 
  </target>
 
 
which will generate the following in Makefile.ac
 
 
  include $(PAPARAZZI_SRC)/conf/autopilot/fixed_wing.makefile
 
  include $(PAPARAZZI_SRC)/conf/boards/tiny_2.11.makefile
 
  include $(CFG_FIXED_WINGS)/radio_control_ppm.makefile
 
 
and the following in airframe.f
 
 
#define USE_RADIO_CONTROL 1
 
 
==Outcomes (Currently in no particular order)==
 
 
Replacing the makefile section of the airframe file with xml should:-
 
 
#Provide a simpler to understand and consistent syntax for end users.
 
#Enable Paparazzi centre to provide a list of all targets for an airframe.
 
#Simplify the design of tools that automatically generate airframe files.
 
#Simplify the process of documenting the airframe file and any future additions to it.
 
 
  
The reorganisation of directory structures is aimed at simplifying development and maintainance. The aim here is to provide :
+
== things discuss or cleanup/remove ==
 +
* remove sw/include/std.h?  was for old avr stuff
 +
* cleanup TODO file
 +
* <strike>there is wind_tunnel under sw/airborne and under sw/in_progress</strike>
 +
* make a bin and/or build dir where all the ground sw build files and binaries go (paparazzicenter, gen_tools) to only have source files under sw
  
#A consistent structure for all targets, all architectures and all subsystems.
+
[[Category:Software]] [[Category:Developer_Documentation]]
#A structure that informs the naming of files.
 
#A route to eventually enable the merging of fixed wing and rotor craft code bases.
 

Latest revision as of 09:16, 18 March 2013

Our Challenge

The current airborne sourcecode has gone a little bit out of control. Everyone was working on it enthusiastically, which is great! However, we feel now the moment has arrived where deep reorganization of the code would benefit us all.

It is really appreciated if you want to help out in this quest. Therefore remarks and suggestions can be placed on the page designed specifically for this. Of-course feel free to use the mailinglist also.

Problem areas

Fixed wing airframes have makefile directly in them - we can't change anything in the airborne code without breaking everybody's airframe

--> use the subsystems

There is also the "module" facility which is very good for optional features.

There are 3 kinds of code in the airborne directory

  • generic code (that doesn't depend on any architecture or plateforme) - there's a lot of it and it should probably be sorted by type of functionalities
    • fixedwing/main.c
    • thrust_vectoring/main.c
    • gps.[ch]
  • processor specific code (stm32, lpc21, avr, etc...)
    • arch/lpc21/uart_arch.[ch]
  • plateforme specific code (tiny, booz, lisa, etc...)
    • blaaaaa

Coding Style

  • 2 spaces for indent
  • please no trailing whitespaces (e.g. fix with M-x whitespace-cleanup in emacs)

Proposals and RFC

Directory structure proposals

relative to sw/airborne

 firmware/
     rotorcraft/
         rotorcraft.makefile
         rotorcraft.xml // list of subsystems: maybe autogenerate as this should reflect the directory structure
         foo/
             foo.c
             foo_2.c
     fixedwing/
         control/
             control.c
             control_adaptive.c
 subsystems/
     imu/              // a general subsystem with several implementations and arch depended code (initialization, interrupts, ...)
         imu_xsense.c
         imu_b2.c
         calibration_routines/    // might be useful to have subdirectories
     gps/              // another general subsystem
         ....
     radio_control/    // another general subsystem
         ....
     actuator
         stm - lpc - arm - omap - ...
 boards/
     test_tiny
     test_lisa
 modules/
     ....
 arch/
     subsystems/
         imu/
             lcp21/
                 imu_xsense_arch.[ch]
                 imu_b2_arch.[ch]
             stm32/
                 imu_xsense_arch.[ch]
                 imu_b2_arch.[ch]
             sim/
     firmware/
         fixedwing/
             control/
                 lcp21/
                     control_arch.[ch]
                     control_adaptive_arch.[ch]
                 stm32/
                     control_arch.[ch]
                     control_adaptive_arch.[ch]
                 sim/


each general susbsystem having several implementations gets a subdirectory under subsystems

 imu.[ch]
 imu/
   imu_xsense.[ch]
   imu_b2.[ch]

Rationale for the subsystem directory:

  1. to have less directories in the airborne root
  2. to help auto-documentation tools: "all subfolders in airborne/subsystems/ are subsystems. if you put them directly in airborne it becomes: all directories in airborne are subsystems except arch/firmware/modules/... etc
  3. it's less obvious how the imu code is used (is it standalone/firmware/modules) to newcommers than with the extra dir.

Test Code

Testing code is specifically for UAS of utmost importance. To test we could opt to make small cases in Testlink for everyone to try and report the outcome.

Replace makefile section with xml - [READY]

of course leave the possibility to have a makefile section, but the normal user would have something like

airframe.xml => Makefile.ac
 <firmware name=rotorcraft>
   <target name="ap" board="booz"/>
   <target name="sim" board="sim" />
   <subsystem name="radio_control" type="ppm"/>
   <subsystem name="actuators" type="mkk"/>
   <subsystem name="imu" type="b2v1"/>
 </firmware >
 <firmware name="setup" >
   <target name="tunnel" />
   <target name="test_actuators" />
 </firmware>
 ifeq ($(TARGET),ap)
 include $(PAPARAZZI_SRC)/conf/board/booz.makefile
 include $(PAPARAZZI_SRC)/conf/autopilot/rotorcraft.makefile
 include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
 include $(CFG_BOOZ)/subsystems/booz2_actuators_mkk.makefile
 include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
 endif
 ifeq ($(TARGET),sim)
 include $(PAPARAZZI_SRC)/conf/board/pc.makefile
 include $(PAPARAZZI_SRC)/conf/autopilot/rotorcraft.makefile
 include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
 include $(CFG_BOOZ)/subsystems/booz2_actuators_mkk.makefile
 include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
 endif
 ifeq ($(TARGET),tunnel)
 include $(PAPARAZZI_SRC)/conf/board/booz.makefile
 include $(PAPARAZZI_SRC)/conf/autopilot/setup.makefile
 endif


?? put defines in here that get written in airframe.h ??

cdewagter I'm not really sure this is needed as otherwise you might put all other data of the airframe file in here too next to the submodule it belongs too. I think it is more readable with less defines in here. I would suggest to only have global compile defines that need to be in the Makefile.ac here...

airframe.xml => Makefile.ac
 <firmware name=fixedwing>
   <target name="ap" board="tiny_2.11">
     <define name="ALT_KALMAN"/>
   </target>
   <subsystem name="led" />
 </firmware >
  FLASH_MODE = IAP
  include $(PAPARAZZI_SRC)/conf/board/tiny_2.11.makefile
  include $(PAPARAZZI_SRC)/conf/autopilot/fixedwing.makefile
  ap.CFLAGS += -DALT_KALMAN
  include $(SRCS_FIXEDWING)/led.makefile
airframe.h
 #define USE_LED

set makefile variables

airframe.xml => Makefile.ac
 <subsystem name="gps" type="ubx">
   <configure name="GPS_PORT" value="1"/>
   <configure name="GPS_BAUD"    value="B38400"/>
   <configure name="GPS_LED"     value="2"/>
 </subsystem> 
GPS_PORT=1
GPS_BAUD=B38400
GPS_LED=2
include $(CFG_FIXEDWING)/subsystems/gps_ubx.makefile
  • Note that now a subsystem can be enabled for all targets in that firmware by using
 $(TARGET).srcs += navigation.c
  • Note that you only 1 time in the board file (e.g. /boards/tiny_2.11.makefile)
 $(TARGET).arch = lpc21

instead having this in the firmware/subsystem makefiles

 tunnel.ARCH = lpc21
 ap.ARCH = lpc21
 fbw.ARCH = lpc21
 ...

Include guards

All headers have to be checked for missing include guards, style template:

#ifndef <MODULE>_<TARGET>_<FILENAME>_H
#define <MODULE>_<TARGET>_<FILENAME>_H
[code]
#endif /* <MODULE>_<TARGET>_<FILENAME>_H */

Example for sw/airborne/csc/airspeed.h:

#ifndef CSC_AP_AIRSPEED_H
#define CSC_AP_AIRSPEED_H
[code]
#endif /* CSC_AP_AIRSPEED_H */


Here is a list of headers know not to include guards please remove any that you update from the list.

sw/in_progress/videolizer/spook/conf_parse.h
sw/in_progress/videolizer/spook/rtp.h
sw/in_progress/videolizer/spook/stream.h
sw/in_progress/videolizer/spook/log.h
sw/in_progress/videolizer/spook/pmsg.h
sw/in_progress/videolizer/spook/global_config.h
sw/in_progress/videolizer/spook/outputs.h
sw/in_progress/videolizer/spook/jpeg_tables.h
sw/in_progress/videolizer/spook/frame.h
sw/in_progress/videolizer/spook/inputs.h
sw/in_progress/videolizer/spook/event.h
sw/in_progress/videolizer/spook/mpegaudio.h
sw/in_progress/videolizer/spook/encoders.h
sw/in_progress/videolizer/spook/base64_table.h
sw/in_progress/videolizer/spook/rtp_media.h
sw/in_progress/videolizer/wis-go7007-linux/kernel/go7007-priv.h 
sw/in_progress/videolizer/ws-go7007-linux/kernel/wis-i2c.h 
sw/in_progress/videolizer/wis-go7007-linux/include/go7007.h 
sw/in_progress/inertial/C/tilt_display.h sw/airborne/fms/packet_header.h 
sw/airborne/arm7/interrupt_hw.h 
sw/airborne/arm7/lpcusb/usbhw_lpc.h
sw/airborne/arm7/lpcusb/usbdebug.h 
sw/airborne/arm7/lpcusb/examples/console.h 
sw/airborne/arm7/lpcusb/examples/startup.h 
sw/airborne/arm7/lpcusb/examples/msc_bot.h 
sw/airborne/arm7/lpcusb/examples/spi.h 
sw/airborne/arm7/lpcusb/examples/msc_scsi.h
sw/airborne/arm7/lpcusb/examples/blockdev.h
sw/airborne/arm7/lpcusb/usbapi.h
sw/airborne/arm7/test/bootloader/console.h
sw/airborne/arm7/test/bootloader/usbhw_lpc.h
sw/airborne/arm7/test/bootloader/startup.h 
sw/airborne/arm7/test/bootloader/usbdebug.h 
sw/airborne/arm7/test/bootloader/usbapi.h 
sw/airborne/arm7/test/bootloader/lpc21iap.h 
sw/airborne/arm7/test/welcome.h 
sw/airborne/csc/csc_vane.h 
sw/airborne/csc/csc_airspeed.h 
sw/airborne/vor/lo.h 
sw/airborne/coaxial/tl_gps_configure.h 
sw/airborne/flightzone.h 
sw/airborne/booz/arch/stm32/radio_control/booz_radio_control_ppm_arch.h 
sw/airborne/sd_card/sd_card.h 
sw/airborne/ism/uart_hw.h 
sw/airborne/sim/sim_uart.h 
sw/airborne/sim/ivy_transport.h 
sw/airborne/sim/led_hw.h 
sw/airborne/osam_imu_ugear.h 
sw/airborne/wind_tunnel/wt_baro.h

Misc

  • All headers are defined relative to sw/airborne (limit the -I to -Isw/airborne and the generated code)
 #include "foo/whatever.h"
  • Generated headers are indicated by their directory
 #include "generated/airframe.h"

Proposed methodology

[6:50:19 PM] Christophe De Wagter: "builing a new road is easy: nobody can ride until it is finished." ... "for road-works on an existing road there are 2 options: a) a non-important road can be closed for a while during roadworks b) but for roads that are too important: you need to keep a lane open: that is more work than closing it down but in the end keeps the total traffic problem minimal" [6:51:05 PM] Christophe De Wagter: I think that a gradual approach might be slightly more work, but keeps the road open and developments running.

I could not agree more!


things discuss or cleanup/remove

  • remove sw/include/std.h? was for old avr stuff
  • cleanup TODO file
  • there is wind_tunnel under sw/airborne and under sw/in_progress
  • make a bin and/or build dir where all the ground sw build files and binaries go (paparazzicenter, gen_tools) to only have source files under sw