Skip to content
Snippets Groups Projects
Select Git revision
  • v4.0.1_stable
  • master default protected
  • thesis
  • fmics-2021
  • vanadium
  • afadl-2021
  • functional-verification
  • v5.17_devel
  • v5.16.0_stable
  • v5.15_devel
  • v5.14.0_stable
  • v5.13.0_testing
  • v5.13_devel
  • v5.12_stable
  • v5.11_devel
  • v5.10_stable
  • v5.9.0_testing
  • v5.8.2_stable
  • v5.8.1_stable
  • v5.9_devel
  • v5.8.0_stable
  • v5.7.1_testing
  • v5.7.0_testing
  • v5.7_devel
  • v5.6.0_stable
  • v5.5.2_testing
  • v5.5.1_testing
27 results

stdlib.ml

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    stdlib.ml 1.91 KiB
    (*
     *  $Id$
     *
     * Utilities for the simulators
     *
     * Copyright (C) 2004 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 pprz_t = int
    
    let max_pprz = 9600
    
    let pi = 4. *. atan 1.
    let rec norm_angle = fun x ->
      if x > pi then norm_angle (x-.2.*.pi)
      else if x < -.pi then norm_angle (x+.2.*.pi)
      else x
    
    let deg_of_rad = fun rad -> rad /. pi *. 180.
    
    let rad_of_deg = fun x -> x /. 180. *. pi
    
    let set_float = fun option var name ->
      (option, Arg.Set_float var, Printf.sprintf "%s (%f)" name !var)
    let set_string = fun option var name ->
      (option, Arg.Set_string var, Printf.sprintf "%s (%s)" name !var)
    
    let ms x = max 0 (truncate (1000.*.x))
    (* Non derivating timer *)
    class type value = object method value : float end
    
    let timer ?scale p f =
      let scale =
        match scale with
          None -> object method value = 1. end
        | Some s -> (s :> value) in
      let rec loop = fun expected ->
        let next = expected +. p /. scale#value in
        let dt = ms (next -. Unix.gettimeofday()) in
        if dt < 1 then begin (* No timer needed, simply loop *)
          f (); loop next
        end else
          GMain.Timeout.add
    	dt
    	(fun () ->
    	  ignore (loop next);
    	  f ();
    	  false) in
      ignore (loop (Unix.gettimeofday()))