sig
  module NXT :
    sig
      type usb
      type bluetooth
      type 'a conn
      val connect_bluetooth : ?check_status:bool -> string -> bluetooth conn
      module USB :
        sig
          type device
          val bricks : unit -> device list
          val connect : ?check_status:bool -> device -> usb conn
        end
      val close : 'a conn -> unit
      type error =
          No_more_handles
        | No_space
        | No_more_files
        | EOF_expected
        | Not_a_linear_file
        | No_linear_space
        | Undefined_error
        | File_is_busy
        | No_write_buffers
        | Append_not_possible
        | File_is_full
        | File_exists
        | Module_not_found
        | Out_of_boundary
        | Illegal_file_name
        | Pending
        | Empty_mailbox
        | Failed
        | Unknown
        | Insane
        | Out_of_range
        | Bus_error
        | Buffer_full
        | Invalid_conn
        | Busy_conn
        | No_program
        | Bad_size
        | Bad_mailbox
        | Bad_field
        | Bad_io
        | Out_of_memory
        | Bad_arg
      exception Error of error
      exception File_not_found
      module Program :
        sig
          val start : ?check_status:bool -> 'a conn -> string -> unit
          val stop : ?check_status:bool -> 'a conn -> unit
          val name : 'a conn -> string
        end
      module Motor :
        sig
          type port
          val a : port
          val b : port
          val c : port
          val all : port
          type regulation = [ `Idle | `Motor_speed | `Motor_sync ]
          type run_state = [ `Idle | `Ramp_down | `Ramp_up | `Running ]
          type state = {
            speed : int;
            motor_on : bool;
            brake : bool;
            regulation : regulation;
            turn_ratio : int;
            run_state : run_state;
            tach_limit : int;
          }
          val speed :
            ?tach_limit:int ->
            ?brake:bool -> ?sync:bool -> ?turn_ratio:int -> int -> state
          val set : ?check_status:bool -> 'a conn -> port -> state -> unit
          val get : 'a conn -> port -> state * int * int * int
          val reset_pos :
            ?check_status:bool -> 'a conn -> ?relative:bool -> port -> unit
        end
      module Sensor :
        sig
          type t
          type port = [ `S1 | `S2 | `S3 | `S4 ]
          type sensor_type =
              [ `Angle
              | `Color_blue
              | `Color_full
              | `Color_green
              | `Color_none
              | `Color_red
              | `Custom
              | `Highspeed
              | `Light_active
              | `Light_inactive
              | `Lowspeed
              | `Lowspeed_9v
              | `No_sensor
              | `Reflection
              | `Sound_db
              | `Sound_dba
              | `Switch
              | `Temperature ]
          type mode =
              [ `Angle_steps
              | `Bool
              | `Celsius
              | `Fahrenheit
              | `Pct_full_scale
              | `Period_counter
              | `Raw
              | `Slope_mask
              | `Transition_cnt ]
          val set :
            ?check_status:bool ->
            'a conn -> port -> sensor_type -> mode -> unit
          type data = {
            sensor_type : sensor_type;
            mode : mode;
            valid : bool;
            raw : int;
            normalized : int;
            scaled : int;
          }
          val get : 'a conn -> port -> data
          val color_of_data :
            data -> [ `Black | `Blue | `Green | `Red | `White | `Yellow ]
          val reset_scaled : ?check_status:bool -> 'a conn -> port -> unit
          val get_status : 'a conn -> port -> int
          val write :
            ?check_status:bool ->
            'a conn -> port -> ?rx_length:int -> string -> unit
          val read : 'a conn -> port -> string
          module Ultrasonic :
            sig
              type 'a t
              val make : 'a conn -> port -> 'a t
              val set :
                ?check_status:bool ->
                'a t ->
                [ `Event
                | `Meas
                | `Meas_cont
                | `Meas_interval of int
                | `Off
                | `Reset
                | `Scale_div of int
                | `Scale_mul of int
                | `Zero of int ] -> unit
              val get :
                'a t ->
                [ `Byte0
                | `Byte1
                | `Byte2
                | `Byte3
                | `Byte4
                | `Byte5
                | `Byte6
                | `Byte7
                | `Meas_interval
                | `Scale_div
                | `Scale_mul
                | `Zero ] -> int
              val get_state :
                'a t -> [ `Event | `Meas | `Meas_cont | `Off | `Reset ]
            end
        end
      module Sound :
        sig
          val play :
            ?check_status:bool -> 'a conn -> ?loop:bool -> string -> unit
          val stop : ?check_status:bool -> 'a conn -> unit
          val play_tone : ?check_status:bool -> 'a conn -> int -> int -> unit
        end
      module Message :
        sig
          type mailbox =
              [ `B0 | `B1 | `B2 | `B3 | `B4 | `B5 | `B6 | `B7 | `B8 | `B9 ]
          type remote =
              [ `R0 | `R1 | `R2 | `R3 | `R4 | `R5 | `R6 | `R7 | `R8 | `R9 ]
          val write :
            ?check_status:bool -> 'a conn -> mailbox -> string -> unit
          val read :
            'a conn ->
            ?remove:bool ->
            [ `B0
            | `B1
            | `B2
            | `B3
            | `B4
            | `B5
            | `B6
            | `B7
            | `B8
            | `B9
            | `R0
            | `R1
            | `R2
            | `R3
            | `R4
            | `R5
            | `R6
            | `R7
            | `R8
            | `R9 ] -> string
        end
      type 'a in_channel
      val open_in : 'a conn -> string -> 'a in_channel
      val in_channel_length : 'a in_channel -> int
      val close_in : 'a in_channel -> unit
      val input : 'a in_channel -> Bytes.t -> int -> int -> int
      type 'a out_channel
      type out_flag =
          [ `Append | `Data of int | `File of int | `Linear of int ]
      val open_out : 'a conn -> out_flag -> string -> 'a out_channel
      val close_out : 'a out_channel -> unit
      val output : 'a out_channel -> string -> int -> int -> int
      val remove : 'a conn -> string -> unit
      module Find :
        sig
          type 'a iterator
          val patt : 'a conn -> string -> 'a iterator
          val current : 'a iterator -> string
          val current_size : 'a iterator -> int
          val next : 'a iterator -> unit
          val close : 'a iterator -> unit
          val iter : 'a conn -> f:(string -> int -> unit) -> string -> unit
          val map : 'a conn -> f:(string -> int -> 'b) -> string -> 'b list
          val fold :
            'a conn -> f:(string -> int -> '-> 'b) -> string -> '-> 'b
        end
      val firmware_version : 'a conn -> int * int * int * int
      val set_brick_name : ?check_status:bool -> 'a conn -> string -> unit
      type brick_info = {
        brick_name : string;
        bluetooth_addr : string;
        signal_strength : int;
        free_user_flash : int;
      }
      val get_device_info : 'a conn -> brick_info
      val keep_alive : 'a conn -> int
      val battery_level : 'a conn -> int
      val delete_user_flash : 'a conn -> unit
      val bluetooth_reset : usb conn -> unit
      val boot : usb conn -> unit
      val poll_length :
        'a conn -> [ `High_speed_buffer | `Poll_buffer ] -> int
      val poll_command :
        'a conn ->
        [ `High_speed_buffer | `Poll_buffer ] -> int -> int * string
    end
  module EV3 :
    sig
      type usb
      type bluetooth
      type 'a conn
      val connect_bluetooth : string -> bluetooth conn
      val close : 'a conn -> unit
      module Sound :
        sig val tone : 'a conn -> vol:int -> freq:int -> ms:int -> unit end
    end
end