Difference between revisions of "AirborneCodeReorg"

From PaparazziUAV
Jump to navigation Jump to search
Line 48: Line 48:
=Proposed Directory structure=
=Proposed Directory structure=
relative to sw/airborne
relative to sw/airborne
   baloo (target)
   baloo/ (a target)
   fixedwing(or a new name, another target)
   fixedwing/(or a new name, another target)
   radio_control (a subsystem)
   radio_control/ (a subsystem)
   gps
   gps/ (another subsystem)
   ...(more subsystems)
   ...(more subsystems)
   imu.[ch]
   imu.[ch]
   imu
   imu/
   modules
   modules/
   arch
   arch/
     avr
     avr/
     lpc21
     lpc21/
     stm32
     stm32/
     omap
     omap/


each susbsystem having several implementations gets a subdirectory
each susbsystem having several implementations gets a subdirectory
   imu.[ch]
   imu.[ch]
   imu
   imu/
     imu_xsense.[ch]
     imu_xsense.[ch]
     imu_b2.[ch]
     imu_b2.[ch]
Line 72: Line 72:


   imu.h
   imu.h
   imu
   imu/
     imu_xsense.[ch]
     imu_xsense.[ch]
     imu_b2.[ch]
     imu_b2.[ch]
   arch
   arch/
     lpc21
     lpc21/
       imu
       imu/
         imu_xsense_arch.[ch]
         imu_xsense_arch.[ch]
         imu_b2_arch.[ch]
         imu_b2_arch.[ch]
     stm32
     stm32/
       imu
       imu/
         imu_xsense_arch.[ch]
         imu_xsense_arch.[ch]
         imu_b2_arch.[ch]
         imu_b2_arch.[ch]

Revision as of 10:01, 17 August 2010

Problem statement

Current airborne code has gone a little bit out of control and is in deep need of a reorganization.

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

 ap.srcs += commands.c
 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

 include $(PAPARAZZI_SRC)/conf/autopilot/booz2_common.makefile
 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 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
  • processor specific code (stm32, lpc21, avr, etc...)
  • plateforme specific code (tiny, booz, lisa, etc...)

Coding Style

Names

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 )

Proposed reorganization

  1. Move more code to modules
  2. 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")
  3. Send mailing list message requesting to change the makefile section of airframes into new include structure
  4. Once many users have this in place and the wiki page is good, we can start to move code

cdewagter

Proposed Directory structure

relative to sw/airborne

 baloo/ (a target)
 fixedwing/(or a new name, another target)
 radio_control/ (a subsystem)
 gps/ (another subsystem)
 ...(more subsystems)
 imu.[ch]
 imu/
 modules/
 arch/
   avr/
   lpc21/
   stm32/
   omap/

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

 imu.h
 imu/
   imu_xsense.[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]
 

Test Code

Replace makefile section with xml

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

airframe.xml => Makefile.ac
 <target name="booz2_autopilot">
    <subsystem name="radio_control" type="ppm"/>
    <subsystem name="actuators" type="mkk"/>
    <subsystem name="imu" type="b2v1"/>
 </target>
include $(PAPARAZZI_SRC)/conf/autopilot/booz2_common.makefile
 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


put defines in here that get written in airframe.h

airframe.xml => Makefile.ac
<target name="booz2_autopilot">
    <subsystem name="actuators" type="mkk">
      <define name="NB" value="4"/>
      <define name="ADDR" value="{ 0x52, 0x54, 0x56, 0x58 }"/>
    </subsystem> 
    <subsystem name="imu" type="b2v1"/>
 </target>
include $(PAPARAZZI_SRC)/conf/autopilot/booz2_common.makefile
  include $(CFG_BOOZ)/subsystems/booz2_radio_control_ppm.makefile
  include $(CFG_BOOZ)/subsystems/booz2_imu_b2v1.makefile
airframe.h
#define ACTUATORS_MKK_NB 4
#define ACTUATORS_MKK_ADDR {0x52,0x54,0x56,0x58}

set makefile variables

airframe.xml => Makefile.ac
 <target name="booz2_autopilot">
    <subsystem name="gps" type="ubx">
      <param name="GPS_UART_NR" value="1"/>
      <param name="GPS_BAUD"    value="38400"/>
    </subsystem> 
 </target>
GPS_UART_NR=1
GPS_BAUD=38400
include $(CFG_BOOZ)/subsystems/booz2_gps_ubx.makefile

Include guards

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

#ifndef <MODULE>_<TARGET>_<FILENAME>_H
#define <MODULE>_<TARGET>_<FILENAME>_H

#endif /* <MODULE>_<TARGET>_<FILENAME>_H */

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

#ifndef CSC_AP_AIRSPEED_H
#define CSC_AP_AIRSPEED_H

#endif /* CSC_AP_AIRSPEED_H */

Misc

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