paparazzi-commits
[Top][All Lists]
Advanced

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

[paparazzi-commits] [4750] add papget for multi message fields expressio


From: Pascal Brisset
Subject: [paparazzi-commits] [4750] add papget for multi message fields expressions
Date: Mon, 29 Mar 2010 15:16:16 +0000

Revision: 4750
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4750
Author:   hecto
Date:     2010-03-29 15:16:16 +0000 (Mon, 29 Mar 2010)
Log Message:
-----------
 add papget for multi message fields expressions
 

Modified Paths:
--------------
    paparazzi3/trunk/sw/lib/ocaml/Makefile
    paparazzi3/trunk/sw/lib/ocaml/papget.ml
    paparazzi3/trunk/sw/lib/ocaml/papget.mli
    paparazzi3/trunk/sw/lib/ocaml/papget_renderer.ml

Added Paths:
-----------
    paparazzi3/trunk/sw/lib/ocaml/expr_lexer.mll
    paparazzi3/trunk/sw/lib/ocaml/expr_parser.mly
    paparazzi3/trunk/sw/lib/ocaml/expr_syntax.ml
    paparazzi3/trunk/sw/lib/ocaml/expr_syntax.mli

Modified: paparazzi3/trunk/sw/lib/ocaml/Makefile
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/Makefile      2010-03-29 15:15:33 UTC (rev 
4749)
+++ paparazzi3/trunk/sw/lib/ocaml/Makefile      2010-03-29 15:16:16 UTC (rev 
4750)
@@ -26,10 +26,12 @@
 XINCLUDES= -I +lablgl -I +lablgtk2 -I +xml-light
 OCAMLC=ocamlc
 OCAMLOPT=ocamlopt
+OCAMLLEX=ocamllex
+OCAMLYACC=ocamlyacc
 OCAMLLIBDIR=$(shell ocamlc -where)
 
 
-SRC = fig.ml debug.ml base64.ml serial.ml ocaml_tools.ml extXml.ml env.ml 
xml2h.ml latlong.ml egm96.ml srtm.ml http.ml gm.ml iGN.ml geometry_2d.ml 
cserial.o convert.o ubx.ml pprz.ml xbee.ml logpprz.ml xmlCom.ml editAirframe.ml
+SRC = fig.ml debug.ml base64.ml serial.ml ocaml_tools.ml expr_syntax.ml 
expr_parser.ml expr_lexer.ml extXml.ml env.ml xml2h.ml latlong.ml egm96.ml 
srtm.ml http.ml gm.ml iGN.ml geometry_2d.ml cserial.o convert.o ubx.ml pprz.ml 
xbee.ml logpprz.ml xmlCom.ml editAirframe.ml
 CMO = $(SRC:.ml=.cmo)
 CMX = $(SRC:.ml=.cmx)
 
@@ -104,8 +106,23 @@
 
 %.cmi : %.ml
        @echo OC $<
-       $(Q)$(OCAMLC) $(XINCLUDES) $<
+       $(Q)$(OCAMLC) $(XINCLUDES) -c $<
 
+%.ml : %.mll
+       @echo OCL $<
+       $(Q)$(OCAMLLEX) $<
+
+%.ml %.mli : %.mly
+       @echo OCY $<
+       $(Q)$(OCAMLYACC) $<
+
+expr_parser.cmo expr_parser.cmx : expr_parser.cmi expr_syntax.cmi
+expr_parser.cmi : expr_parser.ml expr_syntax.cmi
+expr_lexer.cmi : expr_syntax.cmi
+expr_lexer.cmo : expr_lexer.cmi
+expr_syntax.cmo : expr_syntax.cmi
+
+
 gtk_papget_editor.ml : widgets.glade
        lablgladecc2 -root papget_editor -hide-default $< | grep -B 1000000 "  
end" > $@
 
@@ -116,7 +133,7 @@
        lablgladecc2 -root table_gauge_editor -hide-default $< | grep -B 
1000000 "  end" > $@
 
 clean :
-       rm -f *~ *.cm* *.out *.opt .depend *.a *.o *.so tests gtk_papget_*.ml
+       rm -f *~ *.cm* *.out *.opt .depend *.a *.o *.so tests gtk_papget_*.ml 
expr_parser.ml expr_parser.mli expr_lexer.ml expr_lexer.mli
 
 
 #

Added: paparazzi3/trunk/sw/lib/ocaml/expr_lexer.mll
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/expr_lexer.mll                                
(rev 0)
+++ paparazzi3/trunk/sw/lib/ocaml/expr_lexer.mll        2010-03-29 15:16:16 UTC 
(rev 4750)
@@ -0,0 +1,73 @@
+(* 
+ * $Id$
+ *
+ * Lexical tokens \xE0 la C
+ *  
+ * Copyright (C) 2003-2010 Antoine Drouin, Pascal Brisset, ENAC
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi 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 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi 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 paparazzi; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *)
+{
+open Expr_parser
+}
+rule token = parse
+    [' ' '\t' '\n'] { token lexbuf}
+  | "/*"([^'*']|'*'[^'/'])*'*'*'/' { token lexbuf}
+  | ['0'-'9']+ { INT (int_of_string (Lexing.lexeme lexbuf)) }
+  | ['0'-'9']+'.'['0'-'9']* { FLOAT (float_of_string (Lexing.lexeme lexbuf)) }
+  | '$'?['a'-'z' '_' 'A'-'Z'] (['a'-'z' 'A'-'Z' '_' '0'-'9']*) { IDENT 
(Lexing.lexeme lexbuf) }
+  | '\''[^'\'']+'\'' { let s = Lexing.lexeme lexbuf in IDENT (String.sub s 1 
(String.length s - 2)) }
+  | ',' { COMMA }
+  | '.' { DOT }
+  | ';' { SEMICOLON }
+  | ':' { COLON }
+  | '(' { LP }
+  | ')' { RP }
+  | '{' { LC }
+  | '}' { RC }
+  | '[' { LB } 
+  | ']' { RB }
+  | "==" { EQ }
+  | "&&" { AND }
+  | "||" { OR }
+  | ">" { GT }
+  | "%" { MOD }
+  | ">=" { GEQ }
+  | "+" { PLUS }
+  | "=" { ASSIGN }
+  | "-" { MINUS }
+  | "*" { MULT }
+  | "/" { DIV }
+  | "!" { NOT }
+  | eof { EOF }
+
+{
+  let parse = fun s ->
+    let lexbuf = Lexing.from_string s in
+    try
+      Expr_parser.expression token lexbuf
+    with
+      Failure("lexing: empty token") ->
+       Printf.fprintf stderr "Lexing error in '%s': unexpected char: '%c' \n"
+         s (Lexing.lexeme_char lexbuf 0);
+       exit 1
+    | Parsing.Parse_error ->
+       Printf.fprintf stderr "Parsing error in '%s', token '%s' ?\n"
+         s (Lexing.lexeme lexbuf);
+       exit 1
+}

Added: paparazzi3/trunk/sw/lib/ocaml/expr_parser.mly
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/expr_parser.mly                               
(rev 0)
+++ paparazzi3/trunk/sw/lib/ocaml/expr_parser.mly       2010-03-29 15:16:16 UTC 
(rev 4750)
@@ -0,0 +1,77 @@
+/*
+ * $Id$
+ *
+ * Grammar \xE0 la C
+ *  
+ * Copyright (C) 2003-2010 Antoine Drouin, Pascal Brisset, ENAC
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi 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 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi 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 paparazzi; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+%{
+open Expr_syntax
+%}
+%token <int> INT
+%token <float> FLOAT
+%token <string> IDENT
+%token EOF
+%token DOT COMMA SEMICOLON LP RP LC RC LB RB AND COLON OR
+%token EQ GT ASSIGN GEQ NOT
+%token PLUS MINUS
+%token MULT DIV MOD
+
+%left AND OR   /* lowest precedence */
+%left EQ GT ASSIGN GEQ
+%left PLUS MINUS
+%left MULT DIV MOD
+%nonassoc NOT
+%nonassoc UMINUS       /* highest precedence */
+
+%start expression      /* the entry point */
+%type <Expr_syntax.expression> expression
+
+%%
+
+expression:
+    expression GT expression { CallOperator (">",[$1;$3]) }
+  | expression GEQ expression { CallOperator (">=",[$1;$3]) }
+  | expression EQ expression { CallOperator ("==",[$1;$3]) }
+  | expression AND expression { CallOperator ("&&",[$1;$3]) }
+  | expression OR expression { CallOperator ("||",[$1;$3]) }
+  | expression PLUS expression { CallOperator ("+",[$1;$3]) }
+  | expression MINUS expression { CallOperator ("-",[$1;$3]) }
+  | expression MULT expression { CallOperator ("*",[$1;$3]) }
+  | expression DIV expression { CallOperator ("/",[$1;$3]) }
+  | expression MOD expression { CallOperator ("%",[$1;$3]) }
+  | MINUS expression %prec UMINUS { CallOperator ("-",[$2]) }
+  | NOT expression { CallOperator ("!",[$2]) }
+  | INT { Int $1 }
+  | FLOAT { Float $1 }
+  | IDENT { Ident $1 }
+  | IDENT DOT IDENT { Field ($1,$3) }
+  | IDENT LP Args RP { Call ($1, $3) }
+  | LP expression RP { $2 }
+  | IDENT LB expression RB { Index ($1, $3) }
+;
+
+Args: { [] }
+  | expression NextArgs { $1::$2 }
+;
+
+NextArgs: { [] }
+  | COMMA expression NextArgs { $2::$3 }
+;

Added: paparazzi3/trunk/sw/lib/ocaml/expr_syntax.ml
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/expr_syntax.ml                                
(rev 0)
+++ paparazzi3/trunk/sw/lib/ocaml/expr_syntax.ml        2010-03-29 15:16:16 UTC 
(rev 4750)
@@ -0,0 +1,115 @@
+(*
+ * $Id$
+ *
+ * Syntax of expressions \xE0 la C
+ *  
+ * Copyright (C) 2003-2010 Antoine Drouin, Pascal Brisset, ENAC
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi 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 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi 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 paparazzi; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA. 
+ *
+ *)
+
+open Printf
+
+type ident = string
+
+type operator = string
+type expression =
+  | Ident of ident
+  | Int of int
+  | Float of float
+  | Call of ident * (expression list)
+  | CallOperator of ident * (expression list)
+  | Index of ident * expression
+  | Field of ident * ident
+
+let c_var_of_ident = fun x -> "_var_" ^ x
+
+let rec sprint = function
+    Ident i when i.[0] = '$' -> sprintf "%s" (c_var_of_ident (String.sub i 1 
(String.length i - 1)))
+  | Ident i -> sprintf "%s" i
+  | Int i -> sprintf "%d" i
+  | Float i -> sprintf "%f" i
+  | CallOperator (op, [e1;e2]) ->
+      sprintf "(%s%s%s)" (sprint e1) op (sprint e2)
+  | CallOperator (op, [e1]) ->
+      sprintf "%s(%s)" op (sprint e1)
+  | CallOperator (_,_) -> failwith "Operator should be binary or unary"
+  | Call (i, es) ->
+      let ses = List.map sprint es in
+      sprintf "%s(%s)" i (String.concat "," ses)
+  | Index (i,e) -> sprintf "%s[%s]" i (sprint e)
+  | Field (i,f) -> sprintf "%s.%s" i f
+
+(* Valid functions : FIXME *)
+let functions = [
+  "Qdr";
+  "And";
+  "Or";
+  "RcRoll";
+  "RcEvent1";
+  "RcEvent2";
+  "RadOfDeg"]
+
+(* Valid identifiers : FIXME *)
+let variables = [
+  "launch";
+  "estimator_z";
+  "estimator_flight_time";
+  "estimator_hspeed_mod";
+  "estimator_theta";
+  "circle_count";
+  "vsupply";
+  "stage_time";
+  "stage_time_ds";
+  "block_time";
+  "SECURITY_ALT";
+  "ground_alt"; "GROUND_ALT";
+  "TRUE";
+  "FALSE";
+  "QFU";
+  "gps_mode"; "gps_utm_east"; "gps_utm_north"; "gps_utm_zone";
+  "nav_utm_east0"; "nav_utm_north0"; "nav_utm_zone0"; "cruise_throttle"; 
"gps_lost"
+
+]
+
+exception Unknown_ident of string
+exception Unknown_operator of string
+exception Unknown_function of string
+
+let unexpected = fun kind x ->
+  fprintf stderr "Warning: unexpected %s in expression: '%s' \n" kind x
+
+let rec check_expression = fun e ->
+  match e with
+    Ident i when i.[0] = '$' -> ()
+  | Ident i ->
+      if not (List.mem i variables) then
+       unexpected "ident" i
+  | Int _  | Float _ | CallOperator _ -> ()
+  | Call (i, es) ->
+      if not (List.mem i functions) then
+       unexpected "function" i;
+      List.iter check_expression es
+  | Index (i,e) ->
+      if not (List.mem i variables) then
+       unexpected "ident" i;
+      check_expression e
+  | Field (i, _field) ->
+      if not (List.mem i variables) then
+       unexpected "ident" i

Added: paparazzi3/trunk/sw/lib/ocaml/expr_syntax.mli
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/expr_syntax.mli                               
(rev 0)
+++ paparazzi3/trunk/sw/lib/ocaml/expr_syntax.mli       2010-03-29 15:16:16 UTC 
(rev 4750)
@@ -0,0 +1,49 @@
+(*
+ * $Id$
+ *
+ * Syntax of expressions \xE0 la C
+ *  
+ * Copyright (C) 2003-2010 CENA/ENAC, Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi 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 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi 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 paparazzi; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA. 
+ *
+ *)
+
+type ident = string
+type operator = string
+type expression =
+  | Ident of ident
+  | Int of int
+  | Float of float
+  | Call of ident * expression list
+  | CallOperator of ident * expression list
+  | Index of ident * expression
+  | Field of ident * ident
+
+val c_var_of_ident : ident -> string
+(** Encapsulate a user ident into a C variable *)
+
+val sprint : expression -> string
+
+exception Unknown_ident of string
+exception Unknown_operator of string
+exception Unknown_function of string
+
+val check_expression : expression -> unit
+(** May raise [Unknown_ident], [Unknown_operator] or [Unknown_function]
+   exceptions *)

Modified: paparazzi3/trunk/sw/lib/ocaml/papget.ml
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/papget.ml     2010-03-29 15:15:33 UTC (rev 
4749)
+++ paparazzi3/trunk/sw/lib/ocaml/papget.ml     2010-03-29 15:16:16 UTC (rev 
4750)
@@ -27,6 +27,7 @@
 open Printf
 module PC = Papget_common
 module PR = Papget_renderer
+module E = Expr_syntax
 let (//) = Filename.concat
 
 class type item = object
@@ -34,6 +35,16 @@
   method deleted : bool
 end
 
+class type value =
+  object
+    method last_value : string
+    method connect : (string -> unit) -> unit
+    method config : unit -> Xml.xml list
+    method type_ : string
+  end
+
+
+
 (** [index_of_fields s] Returns i if s matches x[i] else 0. *)
 let base_and_index =
   let field_regexp = Str.regexp "\\([^\\.]+\\)\\[\\([0-9]+\\)\\]" in
@@ -44,36 +55,110 @@
     else
       (field_descr, 0)
 
-class message = fun ?sender ?(class_name="telemetry") msg_name ->
+
+class message_field = fun ?sender ?(class_name="telemetry") msg_name 
field_descr ->
   object
     val mutable callbacks = []
-    method connect = fun f cb -> callbacks <- (f, cb) :: callbacks
-    method msg_name = msg_name
+    val mutable last_value = "0."
+
+    method last_value = last_value
+
+    method connect = fun cb -> callbacks <- cb :: callbacks
+    method config = fun () ->
+      let field = sprintf "%s:%s" msg_name field_descr in
+      [ PC.property "field" field ]
+    method type_ = "message_field"
+
     initializer
       let module P = Pprz.Messages (struct let name = class_name end) in
-      let cb = fun _sender values -> 
-       List.iter 
-         (fun (field_descr, cb) ->
-           let (field_name, index) = base_and_index field_descr in
-           let value =
-             match Pprz.assoc field_name values with
-               Pprz.Array array -> array.(index)
-             | scalar -> scalar in
-           cb (Pprz.string_of_value value)) 
-         callbacks  in
-      ignore (P.message_bind ?sender msg_name cb)
+      let process_message = fun _sender values -> 
+       let (field_name, index) = base_and_index field_descr in
+       let value =
+         match Pprz.assoc field_name values with
+           Pprz.Array array -> array.(index)
+         | scalar -> scalar in
+
+       last_value <- Pprz.string_of_value value;
+
+       List.iter (fun cb -> cb last_value) callbacks in
+      ignore (P.message_bind ?sender msg_name process_message)
   end
 
-class field = fun msg_obj field_name ->
-  object (self)
-    val mutable last_val = ""
-    method update_field = fun value -> last_val <- value
+
+let hash_vars = fun expr ->
+  let htable = Hashtbl.create 3 in
+  let rec loop = function
+      E.Ident i -> prerr_endline i
+    | E.Int _ | E.Float _ -> ()
+    | E.Call (_id, list) | E.CallOperator (_id, list) -> List.iter loop list
+    | E.Index (_id, e) -> loop e
+    | E.Field (i, f) ->
+       if not (Hashtbl.mem htable (i,f)) then
+         let msg_obj = new message_field i f in
+         Hashtbl.add htable (i, f) msg_obj in
+  loop expr;
+  htable
+
+
+let wrap = fun f ->
+  fun x y -> string_of_float (f (float_of_string x) (float_of_string y))
+let eval_bin_op = function
+    "*" -> wrap ( *. )
+  | "+" -> wrap ( +. )
+  | "-" -> wrap ( -. )
+  | "/" -> wrap ( /. )
+  | op -> failwith (sprintf "Papget.eval_expr '%s'" op)
+
+let eval_expr = fun (extra_functions:(string * (string list -> string)) list) 
h e ->
+  let rec loop = function
+      E.Ident ident -> failwith (sprintf "Papget.eval_expr '%s'" ident)
+    | E.Int int -> string_of_int int
+    | E.Float float -> string_of_float float
+    | E.CallOperator (ident, [e1; e2]) ->
+       eval_bin_op ident (loop e1) (loop e2)
+    | E.Call (ident, args) when List.mem_assoc ident extra_functions ->
+       (List.assoc ident extra_functions) (List.map loop args)
+    | E.Call (ident, _l) | E.CallOperator (ident, _l) ->
+       failwith (sprintf "Papget.eval_expr '%s(...)'" ident)
+    | E.Index (ident, _e) -> failwith (sprintf "Papget.eval_expr '%s[...]'" 
ident)
+    | E.Field (i, f) ->
+       try
+         (Hashtbl.find h (i,f))#last_value
+       with
+         Not_found -> failwith (sprintf "Papget.eval_expr '%s.%s'" i f)
+  in loop e
+
+
+
+class expression = fun ?(extra_functions=[]) expr ->
+  let h = hash_vars expr in
+  object
+    val mutable callbacks = []
+    val mutable last_value = "0."
+
+    method last_value = last_value
+
+    method connect = fun cb -> callbacks <- cb :: callbacks
+
+    method config = fun () ->
+      [ PC.property "expr" (Expr_syntax.sprint expr)]
+
+    method type_ = "expression"
+
     initializer
-      msg_obj#connect field_name self#update_field
+      Hashtbl.iter
+       (fun (i,f) (msg_obj:value) ->
+         let val_updated = fun _new_val ->
+           last_value <- eval_expr extra_functions h expr;
+           List.iter (fun cb -> cb last_value) callbacks
+         in
+         msg_obj#connect val_updated)
+       h
   end
 
 
 
+
 class type canvas_item_type = 
   object
     method connect : unit -> unit
@@ -221,9 +306,14 @@
     val mutable affine = "1"
        
     method update = fun value ->
-      let (a, b) =  Ocaml_tools.affine_transform affine
-      and fvalue = float_of_string value in
-      super#update (string_of_float (fvalue *. a +. b))
+      let scaled_value =
+       try
+         let (a, b) =  Ocaml_tools.affine_transform affine
+         and fvalue = float_of_string value in
+         string_of_float (fvalue *. a +. b)
+       with
+         _ -> value in
+      super#update scaled_value
 
     method edit = fun () ->
       super#edit ();
@@ -240,48 +330,33 @@
   end
 
 
-class canvas_display_float_item = fun ~config (msg_obj:message) field_name 
(canvas_renderer:PR.t) ->
-  object
-    inherit field msg_obj field_name as super
+class canvas_display_float_item = fun ~config (msg_obj:value) 
(canvas_renderer:PR.t) ->
+  object (self)
     inherit canvas_float_item ~config canvas_renderer as item
 
     initializer
-      affine <- PC.get_prop "scale" config "1"
+      affine <- PC.get_prop "scale" config "1";
+      msg_obj#connect self#update_field
 
     method update_field = fun value ->
       if not deleted then begin
-       super#update_field value;
        item#update value
       end
 
     method config = fun () ->
-      let props = renderer#config () in
-      let field = sprintf "%s:%s" msg_obj#msg_name field_name in
-      let field_prop = PC.property "field" field
+      let renderer_props = renderer#config ()
+      and val_props = msg_obj#config ()
       and scale_prop = PC.property "scale" affine in
       let (x, y) = item#xy in
       let attrs =
-       [ "type", "message_field";
+       [ "type", msg_obj#type_;
          "display", String.lowercase item#renderer#tag;
          "x", sprintf "%.0f" x; "y", sprintf "%.0f" y ] in
-      Xml.Element ("papget", attrs, field_prop::scale_prop::props)
+      Xml.Element ("papget", attrs, scale_prop::address@hidden)
   end
 
 
 (****************************************************************************)
-class canvas_setting_item = fun ~config variable canvas_renderer ->
-  object
-    inherit canvas_float_item ~config canvas_renderer as item
-
-    method clicked = fun value ->
-      (variable#set : float -> unit) value
-
-    initializer
-      variable#connect item#update
-  end
-
-
-(****************************************************************************)
 (** A clickable item is not editable: The #edit method is overiden with a
     provided callback *)
 class canvas_clickable_item = fun type_ properties callback canvas_renderer ->

Modified: paparazzi3/trunk/sw/lib/ocaml/papget.mli
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/papget.mli    2010-03-29 15:15:33 UTC (rev 
4749)
+++ paparazzi3/trunk/sw/lib/ocaml/papget.mli    2010-03-29 15:16:16 UTC (rev 
4750)
@@ -30,15 +30,25 @@
     method deleted : bool
   end
 
-class message :
+class type value =
+  object
+    method last_value : string
+    method connect : (string -> unit) -> unit
+    method config : unit -> Xml.xml list
+    method type_ : string
+  end
+
+class message_field :
   ?sender:string ->
   ?class_name:string ->
   string ->
-  object
-    method connect : string -> (string -> unit) -> unit
-    method msg_name : string
-  end
+  string ->
+    value
 
+class expression :
+    ?extra_functions:(string * (string list -> string)) list ->
+    Expr_syntax.expression ->
+      value
 
 class type canvas_item_type = 
   object
@@ -53,8 +63,7 @@
 
 class canvas_display_float_item :
   config:Xml.xml list ->
-  message ->
-  string ->
+  value ->
   Papget_renderer.t ->
   object
     inherit canvas_item_type

Modified: paparazzi3/trunk/sw/lib/ocaml/papget_renderer.ml
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/papget_renderer.ml    2010-03-29 15:15:33 UTC 
(rev 4749)
+++ paparazzi3/trunk/sw/lib/ocaml/papget_renderer.ml    2010-03-29 15:16:16 UTC 
(rev 4750)
@@ -60,7 +60,8 @@
        PC.float_property "size" size;
        PC.property "color" color ]
     method update = fun (value : string) ->
-      let renderer = fun x -> sprintf (Obj.magic format) (float_of_string x) in
+      let renderer = fun x ->
+       try sprintf (Obj.magic format) (float_of_string x) with _ -> x in
       text#set [`SIZE_POINTS size; `TEXT (renderer value); `FILL_COLOR color; 
`ANCHOR `NW]
 
 





reply via email to

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