More typing

This commit is contained in:
Pascal Brisset
2005-05-26 16:33:23 +00:00
parent c463b05431
commit 87922c31e5
3 changed files with 125 additions and 48 deletions
+9 -7
View File
@@ -1,4 +1,6 @@
(* ocamlc -I ../../lib/ocaml unix.cma -I +lablgtk2 lablgtk.cma lib.cma bilink.ml *)
(* ocamlc -I ../../lib/ocaml unix.cma -I +lablgtk2 lablgtk.cma lib-pprz.cma bilink.ml *)
module W = Wavecard
(* Adresse carte sol : 01 18 04 c0 00 4f *)
(* Adresse carte embarquee : 01 18 04 c0 00 51 *)
@@ -16,11 +18,11 @@ let send = fun fd com ->
let send_ack = fun delay fd ->
GMain.Timeout.add delay (fun _ -> send ("ACK", ""))
ignore (GMain.Timeout.add delay (fun _ -> send fd (W.ACK, ""); false))
let print_cmd = fun (name, data) ->
Printf.fprintf stderr "%s:" name;
let print_cmd = fun (cmd, data) ->
Printf.fprintf stderr "%2x:" (W.code_of_cmd cmd);
for i = 0 to String.length data - 1 do
Printf.fprintf stderr " %02x" (Char.code data.[i])
done;
@@ -35,10 +37,10 @@ let _ =
let fd = if !dev = "" then Unix.stdin else Serial.opendev !dev Serial.B9600 in
ignore (GMain.Timeout.add 2000 (fun _ -> send fd; true));
ignore (GMain.Timeout.add 2000 (fun _ -> send fd (W.REQ_READ_RADIO_PARAM,"\000"); true));
let cb = Wavecard.receive ~ack:(send_ack 100) print_cmd in
let cb = Wavecard.receive ~ack:(fun () -> send_ack 100 fd) print_cmd in
ignore (GMain.Io.add_watch `IN (fun () -> cb fd; true) (GMain.Io.channel_of_descr fd));
ignore (GMain.Io.add_watch [`IN] (fun _ -> cb fd; true) (GMain.Io.channel_of_descr fd));
GMain.Main.main ()
+77 -40
View File
@@ -26,55 +26,92 @@
open Printf
type cmd_name = string
type cmd_name =
ACK
| NAK
| ERROR
| REQ_WRITE_RADIO_PARAM
| RES_WRITE_RADIO_PARAM
| REQ_READ_RADIO_PARAM
| RES_READ_RADIO_PARAM
| REQ_SELECT_CHANNEL
| RES_SELECT_CHANNEL
| REQ_READ_CHANNEL
| RES_READ_CHANNEL
| REQ_SELECT_PHYCONFIG
| RES_SELECT_PHYCONFIG
| REQ_READ_PHYCONFIG
| RES_READ_PHYCONFIG
| REQ_READ_REMOTE_RSSI
| RES_READ_REMOTE_RSSI
| REQ_READ_LOCAL_RSSI
| RES_READ_LOCAL_RSSI
| REQ_FIRMWARE_VERSION
| RES_FIRMWARE_VERSION
| MODE_TEST
| REQ_SEND_FRAME
| RES_SEND_FRAME
| REQ_SEND_MESSAGE
| REQ_SEND_POLLING
| REQ_SEND_BROADCAST
| RECEIVED_FRAME
| RECEPTION_ERROR
| RECEIVED_FRAME_POLLING
| RECEIVED_FRAME_BROADCAST
| RECEIVED_MULTIFRAME
| REQ_SEND_SERVICE
| RES_SEND_SERVICE
| SERVICE_RESPONSE
type data = string
type cmd = cmd_name * string
let cmd_names = [
0x06, "ACK";
0x15, "NAK";
0x00, "ERROR";
0x40, "REQ_WRITE_RADIO_PARAM";
0x41, "RES_WRITE_RADIO_PARAM";
0x50, "REQ_READ_RADIO_PARAM";
0x51, "RES_READ_RADIO_PARAM";
0x60, "REQ_SELECT_CHANNEL";
0x61, "RES_SELECT_CHANNEL";
0x62, "REQ_READ_CHANNEL";
0x63, "RES_READ_CHANNEL";
0x64, "REQ_SELECT_PHYCONFIG";
0x65, "RES_SELECT_PHYCONFIG";
0x66, "REQ_READ_PHYCONFIG";
0x67, "RES_READ_PHYCONFIG";
0x68, "REQ_READ_REMOTE_RSSI";
0x69, "RES_READ_REMOTE_RSSI";
0x6A, "REQ_READ_LOCAL_RSSI";
0x6B, "RES_READ_LOCAL_RSSI";
0xA0, "REQ_FIRMWARE_VERSION";
0xA1, "RES_FIRMWARE_VERSION";
0xB0, "MODE_TEST";
0x20, "REQ_SEND_FRAME";
0x21, "RES_SEND_FRAME";
0x22, "REQ_SEND_MESSAGE";
0x26, "REQ_SEND_POLLING";
0x28, "REQ_SEND_BROADCAST";
0x30, "RECEIVED_FRAME";
0x31, "RECEPTION_ERROR";
0x32, "RECEIVED_FRAME_POLLING";
0x34, "RECEIVED_FRAME_BROADCAST";
0x36, "RECEIVED_MULTIFRAME";
0x80, "REQ_SEND_SERVICE";
0x81, "RES_SEND_SERVICE";
0x82, "SERVICE_RESPONSE"]
0x06, ACK;
0x15, NAK;
0x00, ERROR;
0x40, REQ_WRITE_RADIO_PARAM;
0x41, RES_WRITE_RADIO_PARAM;
0x50, REQ_READ_RADIO_PARAM;
0x51, RES_READ_RADIO_PARAM;
0x60, REQ_SELECT_CHANNEL;
0x61, RES_SELECT_CHANNEL;
0x62, REQ_READ_CHANNEL;
0x63, RES_READ_CHANNEL;
0x64, REQ_SELECT_PHYCONFIG;
0x65, RES_SELECT_PHYCONFIG;
0x66, REQ_READ_PHYCONFIG;
0x67, RES_READ_PHYCONFIG;
0x68, REQ_READ_REMOTE_RSSI;
0x69, RES_READ_REMOTE_RSSI;
0x6A, REQ_READ_LOCAL_RSSI;
0x6B, RES_READ_LOCAL_RSSI;
0xA0, REQ_FIRMWARE_VERSION;
0xA1, RES_FIRMWARE_VERSION;
0xB0, MODE_TEST;
0x20, REQ_SEND_FRAME;
0x21, RES_SEND_FRAME;
0x22, REQ_SEND_MESSAGE;
0x26, REQ_SEND_POLLING;
0x28, REQ_SEND_BROADCAST;
0x30, RECEIVED_FRAME;
0x31, RECEPTION_ERROR;
0x32, RECEIVED_FRAME_POLLING;
0x34, RECEIVED_FRAME_BROADCAST;
0x36, RECEIVED_MULTIFRAME;
0x80, REQ_SEND_SERVICE;
0x81, RES_SEND_SERVICE;
0x82, SERVICE_RESPONSE]
let rec cossa = fun x l ->
match l with
[] -> raise Not_found
| (v, k)::xs -> if k = x then v else cossa x xs
let cmd_name_of = fun x -> try List.assoc x cmd_names with Not_found -> failwith (sprintf "Unknown command: %2x" x)
let of_cmd_name = fun x -> try cossa x cmd_names with Not_found -> failwith (sprintf "Unknown command: %s" x)
let cmd_of_code = fun x -> try List.assoc x cmd_names with Not_found -> failwith (sprintf "Unknown command: %2x" x)
let code_of_cmd = fun x -> cossa x cmd_names
let sync = Char.chr 0xff
let stx = Char.chr 0x02
@@ -86,7 +123,7 @@ let total_length = fun buf -> length buf + 3
let payload = fun buf ->
let l = length buf in
let data = String.sub buf 4 (l-4) in
(cmd_name_of (Char.code buf.[3]), data)
(cmd_of_code (Char.code buf.[3]), data)
let (^=) r x = r := !r lxor x
@@ -144,7 +181,7 @@ let send = fun fd (cmd, data) ->
buf.[0] <- sync;
buf.[1] <- stx;
buf.[2] <- Char.chr l;
buf.[3] <- Char.chr (of_cmd_name cmd);
buf.[3] <- Char.chr (code_of_cmd cmd);
for i = 4 to l - 1 do
buf.[i] <- data.[i-4]
done;
+39 -1
View File
@@ -24,10 +24,48 @@
*
*)
type cmd_name = string
type cmd_name =
ACK
| NAK
| ERROR
| REQ_WRITE_RADIO_PARAM
| RES_WRITE_RADIO_PARAM
| REQ_READ_RADIO_PARAM
| RES_READ_RADIO_PARAM
| REQ_SELECT_CHANNEL
| RES_SELECT_CHANNEL
| REQ_READ_CHANNEL
| RES_READ_CHANNEL
| REQ_SELECT_PHYCONFIG
| RES_SELECT_PHYCONFIG
| REQ_READ_PHYCONFIG
| RES_READ_PHYCONFIG
| REQ_READ_REMOTE_RSSI
| RES_READ_REMOTE_RSSI
| REQ_READ_LOCAL_RSSI
| RES_READ_LOCAL_RSSI
| REQ_FIRMWARE_VERSION
| RES_FIRMWARE_VERSION
| MODE_TEST
| REQ_SEND_FRAME
| RES_SEND_FRAME
| REQ_SEND_MESSAGE
| REQ_SEND_POLLING
| REQ_SEND_BROADCAST
| RECEIVED_FRAME
| RECEPTION_ERROR
| RECEIVED_FRAME_POLLING
| RECEIVED_FRAME_BROADCAST
| RECEIVED_MULTIFRAME
| REQ_SEND_SERVICE
| RES_SEND_SERVICE
| SERVICE_RESPONSE
type data = string
type cmd = cmd_name * data
val send : Unix.file_descr -> cmd -> unit
val receive : ?ack:(unit -> unit) -> (cmd -> 'a) -> (Unix.file_descr -> unit)
val code_of_cmd : cmd_name -> int