simulator starts !

This commit is contained in:
Pascal Brisset
2006-04-21 17:00:33 +00:00
parent 308091a3dc
commit 0bbcad70e0
19 changed files with 99 additions and 157 deletions
+2 -6
View File
@@ -49,9 +49,9 @@ test: static ac1 ac2
PAPARAZZI_HOME=$(PAPARAZZI_SRC) PAPARAZZI_SRC=$(PAPARAZZI_SRC) $(SUPERVISION)
ac1 : conf sim_static
make AIRCRAFT=Twin1 PAPARAZZI_HOME=$(PAPARAZZI_SRC) sim_ac
make AIRCRAFT=Twin1 PAPARAZZI_HOME=$(PAPARAZZI_SRC) sim
ac2 : conf sim_static
make AIRCRAFT=Twin2 PAPARAZZI_HOME=$(PAPARAZZI_SRC) sim_ac
make AIRCRAFT=Twin2 PAPARAZZI_HOME=$(PAPARAZZI_SRC) sim
lib:
cd $(LIB)/ocaml; $(MAKE)
@@ -69,9 +69,6 @@ configurator: lib
sim_static :
cd $(SIMULATOR); $(MAKE) PAPARAZZI_SRC=$(PAPARAZZI_SRC)
sim_sitl :
cd $(SIMULATOR); $(MAKE) sim_sitl PAPARAZZI_HOME=$(PAPARAZZI_SRC) PAPARAZZI_SRC=$(PAPARAZZI_SRC) AIRCRAFT=$(AIRCRAFT)
fbw fly_by_wire: ac_h
cd $(AIRBORNE); $(MAKE) TARGET=fbw all
@@ -136,7 +133,6 @@ static_h :
ac_h : tools static_h
PAPARAZZI_HOME=`pwd` PAPARAZZI_SRC=`pwd` $(TOOLS)/gen_aircraft.out $(AIRCRAFT)
sim_ac: ac_h sim_sitl
hard_ac: ac_h fbw ap
ac: hard_ac
+12 -5
View File
@@ -31,8 +31,10 @@ SRC_ARCH = $(PAPARAZZI_SRC)/sw/airborne/sim
CC = gcc
OCAMLC = ocamlc
CAMLINCLUDES = -I +lablgtk2 -I $(PAPARAZZI_SRC)/sw/lib/ocaml -I $(PAPARAZZI_SRC)/sw/simulator
SITLCMA = $(PAPARAZZI_SRC)/sw/simulator/sitl.cma
SIMDIR = $(PAPARAZZI_SRC)/sw/simulator
CAMLINCLUDES = -I +lablgtk2 -I $(PAPARAZZI_SRC)/sw/lib/ocaml -I $(SIMDIR)
SIMSITLML = $(OBJDIR)/simsitl.ml
SITLCMA = $(SIMDIR)/sitl.cma
#
@@ -41,7 +43,7 @@ SITLCMA = $(PAPARAZZI_SRC)/sw/simulator/sitl.cma
CFLAGS = \
-W -Wall \
-W -Wall -Werror \
$(INCLUDES) \
-Wstrict-prototypes \
$($(TARGET).CFLAGS) \
@@ -60,10 +62,15 @@ $(TARGET).objs = $($(TARGET).objso:%.S=$(OBJDIR)/%.o)
all compile: $(OBJDIR)/simsitl
$(OBJDIR)/simsitl : $($(TARGET).objs) $(SITLCMA)
$(OCAMLC) -custom $(CAMLINCLUDES) -o $@ glibivy-ocaml.cma lib-pprz.cma lablgtk.cma gtkInit.cmo $^
$(OBJDIR)/simsitl : $($(TARGET).objs) $(SITLCMA) $(SIMSITLML)
$(OCAMLC) -custom $(CAMLINCLUDES) -o $@ glibivy-ocaml.cma lib-pprz.cma lablgtk.cma $($(TARGET).objs) gtkInit.cmo $(SITLCMA) $(SIMSITLML)
# The id of the A/C is hardcoded in the code (to be improved with dynlink ?)
$(SIMSITLML) : $(SIMDIR)/simsitl.ml
@echo "Sim.ac_name := \"$(AIRCRAFT)\"" > $@
@cat $< >> $@
%.s: %.c
$(CC) $(CFLAGS) -S -o $@ $<
-5
View File
@@ -106,11 +106,6 @@
<makefile>
include $(PAPARAZZI_SRC)/conf/autopilot/v1_2_1.makefile
include $(PAPARAZZI_SRC)/conf/autopilot/twin_mcu_avr.makefile
include $(PAPARAZZI_SRC)/conf/autopilot/sitl.makefile
sim.CFLAGS += -Werror
# ap.CFLAGS += -DDATALINK
# ap.EXTRA_SRCS += traffic_info.c datalink.c
</makefile>
</airframe>
+9 -32
View File
@@ -107,40 +107,17 @@
<define name="PHI0" value="-30" unit="deg"/>
</section>
<section name="DOWNLINK" prefix="DOWNLINK_">
<define name="FBW_DEVICE" value="uart0"/>
<define name="AP_DEVICE" value="uart0"/>
</section>
<makefile>
include $(PAPARAZZI_SRC)/conf/autopilot/v1_2_1.makefile
include $(PAPARAZZI_SRC)/conf/autopilot/twin_mcu_avr.makefile
include $(PAPARAZZI_SRC)/conf/autopilot/sitl.makefile
fbw.srcs += commands.c
fbw.CFLAGS += -DACTUATORS=\"servos_4017.h\" -DSERVOS_4017
fbw.srcs += $(SRC_ARCH)/servos_4017.c
fbw.CFLAGS += -DRADIO_CONTROL
fbw.srcs += radio_control.c $(SRC_ARCH)/ppm_hw.c
fbw.CFLAGS += -DDOWNLINK -DUART0 -DDOWNLINK_TRANSPORT=PprzTransport -DDOWNLINK_FBW_DEVICE=uart0
fbw.srcs += fbw_downlink.c $(SRC_ARCH)/uart_hw.c
fbw.CFLAGS += -DINTER_MCU -DMCU_SPI_LINK
fbw.srcs += inter_mcu.c $(SRC_ARCH)/spi_hw.c
fbw.CFLAGS += -Werror
ap.CFLAGS += -DDOWNLINK -DUSE_UART0 -DDOWNLINK_TRANSPORT=PprzTransport -DDOWNLINK_AP_DEVICE=uart0
ap.srcs += downlink.c $(SRC_ARCH)/uart_hw.c
ap.CFLAGS += -DGPS -DUBX -DINFRARED -DRADIO_CONTROL
ap.CFLAGS += -DDATALINK
ap.EXTRA_SRCS += traffic_info.c datalink.c
ap.CFLAGS += -DMOBILE_CAM
# ap.CFLAGS += -DWAVECARD
# ap.EXTRA_SRCS += wavecard.c
ap.CFLAGS += -DMAXSTREAM
ap.EXTRA_SRCS += maxstream.c
sim.CFLAGS += -DDATALINK -DMOBILE_CAM
sim.EXTRA_SRCS += traffic_info.c datalink.c
#ap.CFLAGS += -DWAVECARD
#ap.EXTRA_SRCS += wavecard.c
#ap.CFLAGS += -DMAXSTREAM
#ap.EXTRA_SRCS += maxstream.c
</makefile>
</airframe>
+2 -2
View File
@@ -2,8 +2,8 @@ sim.ARCHDIR = $(ARCHI)
sim.ARCH = sitl
sim.TARGET = autopilot
sim.TARGETDIR = autopilot
sim.CFLAGS += -DSITL -DAP -DFBW -DRADIO_CONTROL -DINTER_MCU
sim.CFLAGS += -DSITL -DAP -DFBW -DRADIO_CONTROL -DINTER_MCU -DDOWNLINK -DDOWNLINK_TRANSPORT=IvyTransport
# ap.CFLAGS += -DGPS -DUBX -DINFRARED -DDOWNLINK
#ap.CFLAGS += -DACTUATORS=\"servos_4017.h\" -DSERVOS_4017
#ap.srcs += $(SRC_ARCH)/servos_4017.c
sim.srcs = radio_control.c downlink.c commands.c gps.c inter_mcu.c link_mcu.c infrared.c pid.c nav.c estimator.c cam.c sys_time.c main_fbw.c main_ap.c $(SRC_ARCH)/ppm_hw.c $(SRC_ARCH)/sim_gps.c $(SRC_ARCH)/sim_ir.c $(SRC_ARCH)/sim_ap.c
sim.srcs = radio_control.c downlink.c commands.c gps.c inter_mcu.c link_mcu.c infrared.c pid.c nav.c estimator.c cam.c sys_time.c main_fbw.c main_ap.c $(SRC_ARCH)/ppm_hw.c $(SRC_ARCH)/sim_gps.c $(SRC_ARCH)/sim_ir.c $(SRC_ARCH)/sim_ap.c $(SRC_ARCH)/ivy_transport.c
+7 -2
View File
@@ -26,7 +26,12 @@
#define DOWNLINK_H
#include <inttypes.h>
#ifdef SITL
#include "ivy_transport.h"
#else
#include "pprz_transport.h"
#endif
extern uint8_t downlink_nb_ovrn;
@@ -50,10 +55,10 @@ extern uint8_t downlink_nb_ovrn;
#define DonwlinkOverrun() downlink_nb_ovrn++;
#define DownlinkStartMessage(msg_id, payload_len) { \
#define DownlinkStartMessage(_name, msg_id, payload_len) { \
Transport(Header(payload_len)); \
Transport(PutUint8(AC_ID)); \
Transport(PutUint8(msg_id)); \
Transport(PutNamedUint8(_name, msg_id)); \
}
#define DownlinkEndMessage() Transport(Trailer())
+1
View File
@@ -40,6 +40,7 @@
#include "link_mcu.h"
#include "sys_time.h"
#include "flight_plan.h"
#include "datalink.h"
#ifdef LED
#include "led.h"
+2
View File
@@ -60,6 +60,8 @@ extern uint8_t ck_a, ck_b;
PprzTransportPut1Byte(_byte); \
}
#define PprzTransportPutNamedUint8(_name, _byte) PprzTransportPutUint8(_byte)
#define PprzTransportPut1ByteByAddr(_byte) { \
uint8_t _x = *(_byte); \
PprzTransportPutUint8(_x); \
+2 -2
View File
@@ -28,11 +28,11 @@ exception Error of string
val child : Xml.xml -> ?select:(Xml.xml -> bool) -> string -> Xml.xml
(** [child xml ?p i] If [i] is an integer, returns the [i]'th child of [xml].
Else returns the child of [xml] with tag [i] (the first one satisfying [p]
if specified *)
if specified). Else raises [Not_found]. *)
val get : Xml.xml -> string -> Xml.xml
(** [get xml path] Returns the son of [xml] specified by [path] (where
separator is [.] *)
separator is [.]). May raise [Not_found]. *)
val get_attrib : Xml.xml -> string -> string -> string
(** [get_attrib xml path attrib_name] *)
+12 -16
View File
@@ -57,8 +57,8 @@ sim_sitl : $(OBJDIR)/simsitl
simhitl.out : $(SIMHCMO) simhitl.cmo
$(OCAMLC) $(INCLUDES) -o $@ str.cma xml-light.cma unix.cma lib.cma lablgtk.cma gtkInit.cmo $^
sitl.cma : $(SIMSCMO)
ocamlc -o $@ -a $^
sitl.cma : fg.o $(SIMSCMO)
ocamlmklib -o sitl $^
fg.o : fg.c
$(OCAMLC) -c fg.c
@@ -97,10 +97,6 @@ $(OBJDIR)/simsitl.cmo : $(OBJDIR)/simsitl.ml
$(OBJDIR)/simsitl.cmx : $(OBJDIR)/simsitl.ml
$(OCAMLOPT) $(INCLUDES) -c -o $@ $<
$(OBJDIR)/simsitl.ml : simsitl.ml
@echo "Sim.ac_name := \"$(AIRCRAFT)\"" > $@
@cat $< >> $@
%.cmo : %.ml
$(OCAMLC) $(INCLUDES) -c $<
@@ -116,13 +112,13 @@ $(OBJDIR)/simsitl.ml : simsitl.ml
clean :
\rm -f *.cm* *~ *.out .depend *.o *.a *.so gaia
flightModel.cmo: flightModel.cmi
hitl.cmo: hitl.cmi
sim.cmo: flightModel.cmi sim.cmi
simhitl.cmo: hitl.cmi sim.cmi
simsitl.cmo: sim.cmi sitl.cmi
sitl.cmo: sitl.cmi
sitl.cmi: sim.cmi
data.cmo : data.cmi
stdlib.cmo : stdlib.cmi
gps.cmo : gps.cmi
#
# Dependencies
#
.depend:
ocamldep *.ml* > .depend
ifneq ($(MAKECMDGOALS),clean)
-include .depend
endif
+2 -2
View File
@@ -38,9 +38,9 @@ let messages_ap =
(* let xml = Xml.parse_file (pprz_conf_path // "messages.xml") in *)
let xml = Xml.parse_file (user_conf_path // "messages.xml") in
try
ExtXml.child xml ~select:(fun x -> Xml.attrib x "name" = "telemetry_ap") "class"
ExtXml.child xml ~select:(fun x -> Xml.attrib x "name" = "telemetry") "class"
with
Not_found -> failwith "'telemetry_ap' class missing in messages.xml"
Not_found -> failwith "'telemetry' class missing in messages.xml"
type aircraft = {
name : string;
+23 -64
View File
@@ -3,7 +3,7 @@
*
* Basic flight model for simulation
*
* Copyright (C) 2004-2005 Pascal Brisset, Antoine Drouin
* Copyright (C) 2004-2006 Pascal Brisset, Antoine Drouin
*
* This file is part of paparazzi.
*
@@ -25,6 +25,7 @@
*)
open Stdlib
open Printf
let ios = fun x ->
try int_of_string x with _ -> failwith (Printf.sprintf "int_of_string: '%s'" x)
@@ -123,12 +124,20 @@ module Make(A:Data.MISSION) = struct
let servos =
let commands =
try
ExtXml.child A.ac.airframe "servos"
let l = ExtXml.child A.ac.airframe "commands" in
let rec loop i = function
[] -> []
| x::xs -> (ExtXml.attrib x "name", i)::loop (i+1) xs in
loop 0 (Xml.children l)
with
Not_found ->
failwith (Printf.sprintf "Child 'servos' expected in '%s'\n" (Xml.to_string A.ac.airframe))
failwith (Printf.sprintf "Child 'commands' expected in '%s'\n" (Xml.to_string A.ac.airframe))
let command = fun n ->
try List.assoc n commands with
Not_found -> failwith (sprintf "Unknown command '%s'" n)
let misc_section = section "MISC"
@@ -139,70 +148,20 @@ module Make(A:Data.MISSION) = struct
let adc_roll_neutral = ios (defined_value infrared_section "ADC_ROLL_NEUTRAL")
let roll_neutral_default = rad_of_deg (float_value infrared_section "ROLL_NEUTRAL_DEFAULT")
let get_servo name =
try
ExtXml.child servos ~select:(fun x -> ExtXml.attrib x "name" = name) "servo"
with
Not_found ->
failwith (Printf.sprintf "Child 'servo' with name='%s' expected in '%s'\n" name (Xml.to_string servos))
let us_attrib = fun x a -> int_of_string (ExtXml.attrib x a)
let gaz = try get_servo "GAZ" with _ -> get_servo "MOTOR_RIGHT"
let min_thrust = us_attrib gaz "min"
let max_thrust = us_attrib gaz "max"
let min_thrust = 0
let max_thrust = max_pprz
type servo_id = int
type ppm = int
let no_thrust = int_of_string (ExtXml.attrib gaz "no")
let some_aileron_left = try Some (get_servo "AILERON_LEFT") with _ -> None
let some_ailevon_left = try Some (get_servo "AILEVON_LEFT") with _ -> None
let some_ailevon_right = try Some (get_servo "AILEVON_RIGHT") with _ -> None
let command_throttle = command "THROTTLE"
let command_roll = command "ROLL"
let float_attrib = fun x a -> float_of_string (ExtXml.attrib x a)
let int_attrib = fun x a -> int_of_string (ExtXml.attrib x a)
let sign = fun x ->
if float_attrib x "min" < float_attrib x "max" then 1 else -1
let do_thrust = fun state servo ->
state.thrust <- (float (servo.(no_thrust) - min_thrust) /. float (max_thrust - min_thrust))
let do_commands = fun state commands ->
let c_lda = 1e-4 in (* FIXME *)
state.delta_a <- c_lda *. float commands.(command_roll);
state.thrust <- (float (commands.(command_throttle) - min_thrust) /. float (max_thrust - min_thrust))
let do_servos =
match some_aileron_left, some_ailevon_left, some_ailevon_right with
Some aileron_left, None, None ->
let c_lda = 16. *. 9e-5 in (* phi_dot_dot from aileron *)
let sign_aileron_left = sign aileron_left
and n_delta_a = us_attrib aileron_left "neutral"
and no_aileron_left = int_attrib aileron_left "no" in
fun state servo ->
let left = - sign_aileron_left * (servo.(no_aileron_left) - n_delta_a) in
(** if left <> 0 then Printf.printf "left=%d\n" (servo.(no_aileron_left) - n_delta_a); flush stdout; **)
state.delta_a <- c_lda *. float left;
do_thrust state servo
| None, Some ailevon_left, Some ailevon_right ->
let c_lda = 2.5e-4 in (* phi_dot_dot from aileron *)
let sign_ailevon_left = sign ailevon_left
and sign_ailevon_right = sign ailevon_right
and left_neutral = us_attrib ailevon_left "neutral"
and right_neutral = us_attrib ailevon_right "neutral"
and left_travel = float (us_attrib ailevon_left "max" - us_attrib ailevon_left "min") /. 1200.
and right_travel = float (us_attrib ailevon_right "max" - us_attrib ailevon_right "min") /. 1200.
and no_ailevon_left = int_attrib ailevon_left "no"
and no_ailevon_right = int_attrib ailevon_right "no" in
fun state servo ->
do_thrust state servo;
let sum = (float (servo.(no_ailevon_left) - left_neutral) /. left_travel +.
float (servo.(no_ailevon_right) - right_neutral) /. right_travel) /. 2. in
(* Printf.printf "%d %f\n" (servo no_ailevon_left - left_neutral) sum; flush stdout; *)
state.delta_a <- c_lda *. (-. sum)
| _ -> failwith "Aileron or Ailevon left and right PLEASE"
let nb_servos = 10 (* 4017 *)
let nb_commands = 10 (* FIXME *)
end
+3 -3
View File
@@ -3,7 +3,7 @@
*
* Basic flight model for simulation
*
* Copyright (C) 2004-2005 Pascal Brisset, Antoine Drouin
* Copyright (C) 2004-2006 Pascal Brisset, Antoine Drouin
*
* This file is part of paparazzi.
*
@@ -42,8 +42,8 @@ val set_air_speed : state -> meter_s -> unit
module Make :
functor (A : Data.MISSION) ->
sig
val do_servos : state -> Stdlib.us array -> unit
val nb_servos : int
val do_commands : state -> Stdlib.pprz_t array -> unit
val nb_commands : int
val nominal_airspeed : float (* m/s *)
val roll_neutral_default : float (* rad *)
val state_update : state -> float * float -> float -> unit
+6 -6
View File
@@ -1,9 +1,9 @@
(*
* $Id$
*
* Hardware in the loop basic simulator (handling GPS, infrared and servos)
* Hardware in the loop basic simulator (handling GPS, infrared and commands)
*
* Copyright (C) 2004 Pascal Brisset, Antoine Drouin
* Copyright (C) 2004-2006 Pascal Brisset, Antoine Drouin
*
* This file is part of paparazzi.
*
@@ -43,7 +43,7 @@ module type AIRCRAFT =
val boot : Stdlib.value -> unit
(** [boot time_acceleration] *)
val servos : us array -> unit
val commands : pprz_t array -> unit
(** Called once at init *)
val infrared : float -> float -> float -> unit
@@ -109,9 +109,9 @@ module Make(AircraftItl : AIRCRAFT_ITL) = struct
let reset = fun () -> state := initial_state in
let servos = Array.create FM.nb_servos 0 in
let commands = Array.create FM.nb_commands 0 in
Aircraft.servos servos;
Aircraft.commands commands;
let north_label = GMisc.label ~text:"000" ()
and east_label = GMisc.label ~text:"000" ()
@@ -140,7 +140,7 @@ module Make(AircraftItl : AIRCRAFT_ITL) = struct
let fm_task = fun () ->
FM.do_servos !state servos;
FM.do_commands !state commands;
FM.state_update !state (!wind_x, !wind_y) fm_period
and ir_task = fun () ->
+1 -1
View File
@@ -8,7 +8,7 @@ module type AIRCRAFT =
sig
val init : int -> GPack.box -> unit
val boot : Stdlib.value -> unit
val servos : Stdlib.us array -> unit
val commands : Stdlib.pprz_t array -> unit
val infrared : float -> float -> float -> unit
val gps : Gps.state -> unit
end
+9 -8
View File
@@ -1,7 +1,7 @@
(*
* $Id$
*
* Software in the loop basic simulator (handling GPS, infrared and servos)
* Software in the loop basic simulator (handling GPS, infrared and commands)
*
* Copyright (C) 2004 Pascal Brisset, Antoine Drouin
*
@@ -41,24 +41,27 @@ module Make(A:Data.MISSION) = struct
ExtXml.child Data.messages_ap ~select:(fun x -> ExtXml.attrib x "name" = name) "message"
(* Servos handling (rservos is the intermediate storage) *)
(* Commands handling (rcommands is the intermediate storage) *)
let rc_channels = Array.of_list (Xml.children A.ac.Data.radio)
let nb_channels = Array.length rc_channels
let rc_channel_no = fun x ->
List.assoc x (Array.to_list (Array.mapi (fun i c -> Xml.attrib c "function", i) rc_channels))
let rservos = ref [||]
let rcommands = ref [||]
let adj_bat = GData.adjustment ~value:12.5 ~lower:0. ~upper:23. ~step_incr:0.1 ()
external get_commands : Stdlib.us array -> int = "get_commands"
external get_commands : Stdlib.pprz_t array -> int = "get_commands"
(** Returns gaz servo value (us) *)
let energy = ref 0.
(** Get the commands from the autopilot, store them
(to be used by the flight model)
Computes an energy consumption from throttle level *)
let update_servos =
let accu = ref 0. in
fun bat_button () ->
let gaz = get_commands !rservos in
let gaz = get_commands !rcommands in
(* 100% = 1W *)
if bat_button#active then
let energy = float (gaz-1000) /. 1000. *. servos_period in
@@ -109,7 +112,6 @@ module Make(A:Data.MISSION) = struct
window#show ()
external periodic_task : unit -> unit = "sim_periodic_task"
external rc_task : unit -> unit = "sim_rc_task"
external sim_init : int -> unit = "sim_init"
external update_bat : int -> unit = "update_bat"
@@ -182,7 +184,6 @@ module Make(A:Data.MISSION) = struct
let boot = fun time_scale ->
Stdlib.timer ~scale:time_scale servos_period (update_servos bat_button);
Stdlib.timer ~scale:time_scale periodic_period periodic_task;
Stdlib.timer ~scale:time_scale rc_period rc_task;
ignore (Ground_Pprz.message_bind "FLIGHT_PARAM" get_flight_param);
ignore (Ground_Pprz.message_bind "MOVE_WAYPOINT" get_move_waypoint);
ignore (Ground_Pprz.message_bind "SEND_EVENT" get_send_event);
@@ -190,7 +191,7 @@ module Make(A:Data.MISSION) = struct
ignore (Ground_Pprz.message_bind "DL_SETTING" get_dl_setting)
(* Functions called by the simulator *)
let servos = fun s -> rservos := s
let commands = fun s -> rcommands := s
external set_ir : int -> int -> unit = "set_ir"
let infrared = fun ir_left ir_front ir_top ->
+3 -1
View File
@@ -24,7 +24,9 @@
*
*)
type us = int
type pprz_t = int
let max_pprz = 9600
let pi = 4. *. atan 1.
let rec norm_angle = fun x ->
+2 -1
View File
@@ -24,7 +24,8 @@
*
*)
type us = int
type pprz_t = int
val max_pprz : pprz_t
val pi : float
val norm_angle : float -> float
val deg_of_rad : float -> float
+1 -1
View File
@@ -161,7 +161,7 @@ module Gen_onboard = struct
fprintf avr_h "){ \\\n";
let size = (size_fields fields "0") in
fprintf avr_h "\tif (DownlinkCheckFreeSpace(DownlinkSizeOf(%s))) {\\\n" size;
fprintf avr_h "\t DownlinkStartMessage(DL_%s,%s) \\\n" s size;
fprintf avr_h "\t DownlinkStartMessage(\"%s\", DL_%s, %s) \\\n" s s size;
List.iter (print_avr_field avr_h) fields;
fprintf avr_h "\t DownlinkEndMessage() \\\n";
fprintf avr_h "\t} else \\\n";