paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [5771] add a "module" attribute in telemetry definit


From: Gautier Hattenberger
Subject: [paparazzi-commits] [5771] add a "module" attribute in telemetry definition
Date: Tue, 31 Aug 2010 16:24:28 +0000

Revision: 5771
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=5771
Author:   gautier
Date:     2010-08-31 16:24:28 +0000 (Tue, 31 Aug 2010)
Log Message:
-----------
add a "module" attribute in telemetry definition
a PERIODIC_SEND_XXX is generated only if the corresponding module is loaded

Modified Paths:
--------------
    paparazzi3/trunk/Makefile.ac
    paparazzi3/trunk/conf/telemetry/telemetry.dtd
    paparazzi3/trunk/sw/tools/gen_periodic.ml

Modified: paparazzi3/trunk/Makefile.ac
===================================================================
--- paparazzi3/trunk/Makefile.ac        2010-08-31 16:04:01 UTC (rev 5770)
+++ paparazzi3/trunk/Makefile.ac        2010-08-31 16:24:28 UTC (rev 5771)
@@ -96,9 +96,9 @@
 -include $(MAKEFILE_AC)
 endif
 
-$(PERIODIC_H) : $(MESSAGES_XML) $(CONF_XML) $(CONF)/$(TELEMETRY) $(MAKEFILE_AC)
+$(PERIODIC_H) : $(CONF)/$(AIRFRAME_XML) $(MESSAGES_XML) $(CONF_XML) 
$(CONF)/$(TELEMETRY) $(MAKEFILE_AC)
        @echo BUILD $@
-       $(Q)$(TOOLS)/gen_periodic.out $(MESSAGES_XML) $(CONF)/$(TELEMETRY) 
$(PERIODIC_FREQ) > $@
+       $(Q)$(TOOLS)/gen_periodic.out $(CONF)/$(AIRFRAME_XML) $(MESSAGES_XML) 
$(CONF)/$(TELEMETRY) $(PERIODIC_FREQ) > $@
        $(Q)chmod a+r $@
        $(Q)cp $< $(AIRCRAFT_CONF_DIR)
        $(Q)cp $(CONF)/$(TELEMETRY) $(AIRCRAFT_CONF_DIR)/telemetry
@@ -160,10 +160,10 @@
        lpc21isp -control $(AIRBORNE)/arm7/test/bootloader/bl.hex 
$(BOOTLOADER_DEVICE) 38400 12000
 
 jsbsim jsbsim.compile: ac_h
-       cd $(AIRBORNE); $(MAKE) TARGET=jsbsim ARCHI=jsbsim all
+       cd $(AIRBORNE); $(MAKE) TARGET=jsbsim ARCHI=jsbsim ARCH=jsbsim all
 
 sim: ac_h
-       cd $(AIRBORNE); $(MAKE) TARGET=sim ARCHI=sim all
+       cd $(AIRBORNE); $(MAKE) TARGET=sim ARCHI=sim ARCH=sim all
 
 # Rules for backward compatibility (old guys are used to !)
 fbw : fbw.compile

Modified: paparazzi3/trunk/conf/telemetry/telemetry.dtd
===================================================================
--- paparazzi3/trunk/conf/telemetry/telemetry.dtd       2010-08-31 16:04:01 UTC 
(rev 5770)
+++ paparazzi3/trunk/conf/telemetry/telemetry.dtd       2010-08-31 16:24:28 UTC 
(rev 5771)
@@ -15,4 +15,5 @@
   name CDATA #REQUIRED
   period CDATA #REQUIRED
   phase CDATA #IMPLIED
+  module CDATA #IMPLIED
 >

Modified: paparazzi3/trunk/sw/tools/gen_periodic.ml
===================================================================
--- paparazzi3/trunk/sw/tools/gen_periodic.ml   2010-08-31 16:04:01 UTC (rev 
5770)
+++ paparazzi3/trunk/sw/tools/gen_periodic.ml   2010-08-31 16:24:28 UTC (rev 
5771)
@@ -26,7 +26,12 @@
 
 open Printf
 
+let (//) = Filename.concat
 
+let paparazzi_conf = Env.paparazzi_home // "conf" 
+let modules_dir = paparazzi_conf // "modules"
+
+
 let margin = ref 0
 let step = 2
 
@@ -48,7 +53,7 @@
   loop (List.sort compare l)
 
 
-let output_modes = fun avr_h process_name channel_name modes freq ->       
+let output_modes = fun avr_h process_name channel_name modes freq modules ->   
    
   let min_period = 1./.float freq in
   let max_period = 65536. /. float freq in
   (** For each mode in this process *)
@@ -58,24 +63,23 @@
       lprintf avr_h "if (telemetry_mode_%s_%s == TELEMETRY_MODE_%s_%s_%s) 
{\\\n" process_name channel_name process_name channel_name mode_name;
       right ();  
 
+      (** Filter message list to remove messages linked to unloaded modules *)
+      let filtered_msg = List.filter (fun msg ->
+        try let att = Xml.attrib msg "module" in List.exists (fun name -> 
String.compare name att = 0) modules with _ -> true
+        ) (Xml.children mode) in
       (** Computes the required modulos *)
-      let messages =
-       List.map
-         (fun x -> 
-           let p = float_of_string (ExtXml.attrib x "period") in
-           if p < min_period || p > max_period then
-             fprintf stderr "Warning: period is bound between %.3fs and %.3fs 
for message %s\n%!" min_period max_period (ExtXml.attrib x "name");
-           (x, min 65535 (max 1 (int_of_float (p*.float_of_int freq)))))
-         (Xml.children mode)
-      in
+      let messages = List.map (fun x -> 
+        let p = float_of_string (ExtXml.attrib x "period") in
+        if p < min_period || p > max_period then
+          fprintf stderr "Warning: period is bound between %.3fs and %.3fs for 
message %s\n%!" min_period max_period (ExtXml.attrib x "name");
+        (x, min 65535 (max 1 (int_of_float (p*.float_of_int freq))))
+        ) filtered_msg in
       let modulos = remove_dup (List.map snd messages) in
-      List.iter
-       (fun m ->
-         let v = sprintf "i%d" m in
-         let _type = if m >= 256 then "uint16_t" else "uint8_t" in
-         lprintf avr_h "static %s %s = 0; %s++; if (%s>=%d) %s=0;\\\n" _type v 
v v m v;
-       )
-       modulos;
+      List.iter (fun m ->
+        let v = sprintf "i%d" m in
+        let _type = if m >= 256 then "uint16_t" else "uint8_t" in
+        lprintf avr_h "static %s %s = 0; %s++; if (%s>=%d) %s=0;\\\n" _type v 
v v m v;
+        ) modulos;
       
       (** For each message in this mode *)
       let messages = List.sort (fun (_,p) (_,p') -> compare p p') messages in
@@ -83,43 +87,58 @@
       let phase = ref 0 in
       let l = ref [] in
       List.iter
-       (fun (message, p) ->
-         let message_name = ExtXml.attrib message "name" in
-         i := !i mod p;
-         (* if phase attribute is present, use it, otherwise shedule at 10Hz *)
-         let message_phase = try int_of_float (float_of_string (ExtXml.attrib 
message "phase")*.float_of_int freq) with _ -> !i in
-         phase := message_phase;
-         let else_ = if List.mem_assoc p !l && not (List.mem (p, !phase) !l) 
then "else " else "" in
-         lprintf avr_h "%sif (i%d == %d) {\\\n" else_ p !phase;
-         l := (p, !phase) :: !l;
-         i := !i + freq/10;
-         right ();
-         lprintf avr_h "PERIODIC_SEND_%s(%s);\\\n" message_name channel_name;
-         left ();
-         lprintf avr_h "} \\\n"
-       )
-       messages;
+        (fun (message, p) ->
+          let message_name = ExtXml.attrib message "name" in
+          i := !i mod p;
+          (* if phase attribute is present, use it, otherwise shedule at 10Hz 
*)
+          let message_phase = try int_of_float (float_of_string (ExtXml.attrib 
message "phase")*.float_of_int freq) with _ -> !i in
+          phase := message_phase;
+          let else_ = if List.mem_assoc p !l && not (List.mem (p, !phase) !l) 
then "else " else "" in
+          lprintf avr_h "%sif (i%d == %d) {\\\n" else_ p !phase;
+          l := (p, !phase) :: !l;
+          i := !i + freq/10;
+          right ();
+          lprintf avr_h "PERIODIC_SEND_%s(%s);\\\n" message_name channel_name;
+          left ();
+          lprintf avr_h "} \\\n"
+        )
+        messages;
       left ();
       lprintf avr_h "}\\\n")
     modes
 
+(** [get_modules_name dir xml] Returns a list of modules name *)
+let get_modules_name = fun dir xml ->
+  (* extract all "modules" sections *)
+  let modules = List.map (fun x ->
+    match String.lowercase (Xml.tag x) with
+      "modules" -> Xml.children x
+    | _ -> []
+    ) (Xml.children xml) in
+  (* flatten the list (result is a list of "load" xml nodes) *)
+  let modules = List.flatten modules in
+  (* return a list of modules name *)
+  let modules = List.map (fun m -> ExtXml.parse_file (dir // ExtXml.attrib m 
"name")) modules in
+  List.map (fun m -> ExtXml.attrib m "name") modules
 
+
 let _ =
-  if Array.length Sys.argv <> 4 then begin
-    failwith (sprintf "Usage: %s <messages.xml> <telemetry.xml> 
frequency_in_hz" Sys.argv.(0)) 
+  if Array.length Sys.argv <> 5 then begin
+    failwith (sprintf "Usage: %s <airframe.xml> <messages.xml> <telemetry.xml> 
frequency_in_hz" Sys.argv.(0)) 
   end;
 
-  let freq = int_of_string(Sys.argv.(3)) in
+  let freq = int_of_string(Sys.argv.(4)) in
   let telemetry_xml = 
     try
-      Xml.parse_file Sys.argv.(2)
+      Xml.parse_file Sys.argv.(3)
     with Dtd.Check_error e -> failwith (Dtd.check_error e)
       
   in
+  let modules_name = get_modules_name modules_dir (ExtXml.parse_file 
Sys.argv.(1)) in
 
   let avr_h = stdout in
 
-  fprintf avr_h "/* This file has been generated from %s and %s */\n" 
Sys.argv.(1) Sys.argv.(2);
+  fprintf avr_h "/* This file has been generated from %s and %s */\n" 
Sys.argv.(2) Sys.argv.(3);
   fprintf avr_h "/* Please DO NOT EDIT */\n\n";
   fprintf avr_h "#ifndef _VAR_PERIODIC_H_\n";
   fprintf avr_h "#define _VAR_PERIODIC_H_\n";
@@ -137,21 +156,21 @@
       let i = ref 0 in
       (** For each mode of this process *)
       List.iter (fun mode ->
-       let name = ExtXml.attrib mode "name" in
-       Xml2h.define (sprintf "TELEMETRY_MODE_%s_%s_%s" process_name 
channel_name name) (string_of_int !i);
-       (* Output the periods of the messages *)
-       List.iter
-         (fun x -> 
-           let p = ExtXml.attrib x "period"
-           and n = ExtXml.attrib x "name" in
-           Xml2h.define (sprintf "PERIOD_%s_%s_%s_%d" n process_name 
channel_name !i) (sprintf "(%s)" p))
-         (Xml.children mode);
-       incr i)
-       modes;
+        let name = ExtXml.attrib mode "name" in
+        Xml2h.define (sprintf "TELEMETRY_MODE_%s_%s_%s" process_name 
channel_name name) (string_of_int !i);
+        (* Output the periods of the messages *)
+        List.iter
+          (fun x -> 
+            let p = ExtXml.attrib x "period"
+            and n = ExtXml.attrib x "name" in
+            Xml2h.define (sprintf "PERIOD_%s_%s_%s_%d" n process_name 
channel_name !i) (sprintf "(%s)" p))
+          (Xml.children mode);
+        incr i)
+        modes;
 
       lprintf avr_h "#define PeriodicSend%s(%s) {  /* %dHz */ \\\n" 
process_name channel_name freq;
       right ();
-      output_modes avr_h process_name channel_name modes freq;
+      output_modes avr_h process_name channel_name modes freq modules_name;
       left ();
       lprintf avr_h "}\n"
     )




reply via email to

[Prev in Thread] Current Thread [Next in Thread]