[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[paparazzi-commits] [4544] Add support for modified pprz protocol, calle
From: |
Allen Ibara |
Subject: |
[paparazzi-commits] [4544] Add support for modified pprz protocol, called pprz2. |
Date: |
Fri, 05 Feb 2010 20:45:57 +0000 |
Revision: 4544
http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4544
Author: aibara
Date: 2010-02-05 20:45:57 +0000 (Fri, 05 Feb 2010)
Log Message:
-----------
Add support for modified pprz protocol, called pprz2. Uses 0x98 as start byte,
and 4 byte timestamp in the header. Used for telemetry only (uplink uses
original pprz protocol for now). Enable with -transport pprz2 for link and
UDP_TRANSPORT_TIMESTAMP for udp_transport.h
Modified Paths:
--------------
paparazzi3/trunk/sw/airborne/fms/udp_transport.h
paparazzi3/trunk/sw/ground_segment/tmtc/link.ml
paparazzi3/trunk/sw/lib/ocaml/pprz.ml
paparazzi3/trunk/sw/lib/ocaml/pprz.mli
Modified: paparazzi3/trunk/sw/airborne/fms/udp_transport.h
===================================================================
--- paparazzi3/trunk/sw/airborne/fms/udp_transport.h 2010-02-05 18:20:34 UTC
(rev 4543)
+++ paparazzi3/trunk/sw/airborne/fms/udp_transport.h 2010-02-05 20:45:57 UTC
(rev 4544)
@@ -6,15 +6,15 @@
#include "std.h"
#ifdef UDP_TRANSPORT_TIMESTAMP
-#define STX_TS 0x98
-#define UdpTransportSizeOf(_payload) (_payload + 8)
+#define STX_UDP_TX 0x98
+#define STX_UDP_RX 0x99
+#define PPRZ_PROTOCOL_OVERHEAD 8
#define UdpTransportPutTimestamp(x) UdpTransportPutUint32ByAddr(x)
-#define UdpTransportPutSTX() UdpTransportPut1Byte(STX_TS)
#else
-#define STX 0x99
-#define UdpTransportSizeOf(_payload) (_payload + 4)
+#define STX_UDP_TX 0x99
+#define STX_UDP_RX 0x99
+#define PPRZ_PROTOCOL_OVERHEAD 4
#define UdpTransportPutTimestamp(x) {}
-#define UdpTransportPutSTX() UdpTransportPut1Byte(STX)
#endif
#ifndef MSG_TIMESTAMP
@@ -27,6 +27,10 @@
extern uint8_t udpt_ck_a, udpt_ck_b;
#define UDPT_TX_BUF_WATERMARK 1024
+#define UdpTransportSizeOf(_payload) (_payload + PPRZ_PROTOCOL_OVERHEAD)
+
+#define UdpTransportPutSTX() UdpTransportPut1Byte(STX_UDP_TX)
+
#define UdpTransportPeriodic() { \
if (udpt_tx_buf_idx) { \
int len; \
@@ -137,7 +141,7 @@
switch (udp_dl_status) {
case UNINIT:
- if (c == STX)
+ if (c == STX_UDP_RX)
udp_dl_status++;
break;
case GOT_STX:
Modified: paparazzi3/trunk/sw/ground_segment/tmtc/link.ml
===================================================================
--- paparazzi3/trunk/sw/ground_segment/tmtc/link.ml 2010-02-05 18:20:34 UTC
(rev 4543)
+++ paparazzi3/trunk/sw/ground_segment/tmtc/link.ml 2010-02-05 20:45:57 UTC
(rev 4544)
@@ -34,13 +34,16 @@
module Ground_Pprz = Pprz.Messages (struct let name = "ground" end)
module Dl_Pprz = Pprz.Messages (struct let name = "datalink" end)
module PprzTransport = Serial.Transport (Pprz.Transport)
+module PprzTransportExtended = Serial.Transport (Pprz.TransportExtended)
(* Modem transport layer *)
type transport =
Pprz (* Paparazzi protocol, with A/C id, message id and CRC *)
+ | Pprz2 (* Paparazzi protocol, with timestamp, A/C id, message id and CRC *)
| XBee (* Maxstream protocol, API mode *)
let transport_of_string = function
"pprz" -> Pprz
+ | "pprz2" -> Pprz2
| "xbee" -> XBee
| x -> invalid_arg (sprintf "transport_of_string: %s" x)
@@ -325,6 +328,11 @@
let buf = Pprz.Transport.packet payload in
Printf.fprintf o "%s" buf; flush o;
Debug.call 'l' (fun f -> fprintf f "mm sending: %s\n" (Debug.xprint
buf));
+ | Pprz2 ->
+ let o = Unix.out_channel_of_descr device.fd in
+ let buf = Pprz.TransportExtended.packet payload in
+ Printf.fprintf o "%s" buf; flush o;
+ Debug.call 'l' (fun f -> fprintf f "mm sending: %s\n" (Debug.xprint
buf));
| XBee ->
XB.send device payload
@@ -345,7 +353,7 @@
match device.transport with
Pprz ->
let use = fun s ->
- let raw_data_size = String.length (Serial.string_of_payload s) +
4(*stx,len,ck_a, ck_b*) in
+ let raw_data_size = String.length (Serial.string_of_payload s) + 4
(*stx,len,ck_a, ck_b*) in
let udp_peername =
if !udp then
Some !last_udp_peername
@@ -353,6 +361,16 @@
None in
use_tele_message ?udp_peername ~raw_data_size s in
PprzTransport.parse use
+ | Pprz2 ->
+ let use = fun s ->
+ let raw_data_size = String.length (Serial.string_of_payload s) + 8
(*stx,len, timestamp, ck_a, ck_b*) in
+ let udp_peername =
+ if !udp then
+ Some !last_udp_peername
+ else
+ None in
+ use_tele_message ?udp_peername ~raw_data_size s in
+ PprzTransportExtended.parse use
| XBee ->
let module XbeeTransport = Serial.Transport (Xbee.Protocol) in
XbeeTransport.parse (XB.use_message device)
@@ -424,8 +442,8 @@
"-noac_info", Arg.Clear ac_info, (sprintf "Disables AC traffic info
(uplink).");
"-nouplink", Arg.Clear uplink, (sprintf "Disables the uplink (from the
ground to the aircraft).");
"-s", Arg.Set_string baudrate, (sprintf "<baudrate> Default is %s"
!baudrate);
- "-timestamp", Arg.Unit (fun () -> add_timestamp := Some
(Unix.gettimeofday ())), "Add timestamp to messages sent over ivy";
- "-transport", Arg.Set_string transport, (sprintf "<transport> Available
protocols are modem,pprz and xbee. Default is %s" !transport);
+ "-local_timestamp", Arg.Unit (fun () -> add_timestamp := Some
(Unix.gettimeofday ())), "Add local timestamp to messages sent over ivy";
+ "-transport", Arg.Set_string transport, (sprintf "<transport> Available
protocols are modem,pprz,pprz2 and xbee. Default is %s" !transport);
"-udp", Arg.Set udp, "Listen a UDP connection on <udp_port>";
"-udp_port", Arg.Set_int udp_port, (sprintf "<UDP port> Default is %d"
!udp_port);
"-udp_uplink_port", Arg.Set_int udp_uplink_port, (sprintf "<UDP uplink
port> Default is %d" !udp_uplink_port);
Modified: paparazzi3/trunk/sw/lib/ocaml/pprz.ml
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/pprz.ml 2010-02-05 18:20:34 UTC (rev
4543)
+++ paparazzi3/trunk/sw/lib/ocaml/pprz.ml 2010-02-05 20:45:57 UTC (rev
4544)
@@ -324,20 +324,24 @@
exception Unknown_msg_name of string * string
-module Transport = struct
- let stx = Char.chr 0x99 (** sw/airborne/pprz_transport.h *)
- let offset_length = 1
- let offset_payload = 2
+module type TRANSPORT_TYPE = sig
+ val stx : char
+ val offset_length : int
+ val offset_payload : int
+ val offset_timestamp : int
+ val overhead_length : int
+end
+module PprzTransportBase(SubType:TRANSPORT_TYPE) = struct
let index_start = fun buf ->
- String.index buf stx
+ String.index buf SubType.stx
let length = fun buf start ->
let len = String.length buf - start in
- if len > offset_length then
- let l = Char.code buf.[start+offset_length] in
+ if len > SubType.offset_length then
+ let l = Char.code buf.[start+SubType.offset_length] in
Debug.call 'T' (fun f -> fprintf f "Pprz len=%d\n" l);
- max l 4 (** if l<4 (4=stx+length+ck_a+ck_b), it's not a valid length *)
+ max l SubType.overhead_length (** if l<4 (4=stx+length+ck_a+ck_b), it's
not a valid length *)
else
raise Serial.Not_enough
@@ -359,26 +363,45 @@
let payload = fun msg ->
let l = String.length msg in
- assert(Char.code msg.[offset_length] = l);
- assert(l >= 4);
- Serial.payload_of_string (String.sub msg offset_payload (l-4))
+ assert(Char.code msg.[SubType.offset_length] = l);
+ assert(l >= SubType.overhead_length);
+ Serial.payload_of_string (String.sub msg SubType.offset_payload
(l-SubType.overhead_length))
let packet = fun payload ->
let payload = Serial.string_of_payload payload in
let n = String.length payload in
- let msg_length = n + 4 in (** + stx, len, ck_a and ck_b *)
+ let msg_length = n + SubType.overhead_length in (** + stx, len, ck_a and
ck_b *)
if msg_length >= 256 then
invalid_arg "Pprz.Transport.packet";
let m = String.create msg_length in
- String.blit payload 0 m offset_payload n;
- m.[0] <- stx;
- m.[offset_length] <- Char.chr msg_length;
+ String.blit payload 0 m SubType.offset_payload n;
+ m.[0] <- SubType.stx;
+ m.[SubType.offset_length] <- Char.chr msg_length;
let (ck_a, ck_b) = compute_checksum m in
m.[msg_length-2] <- Char.chr ck_a;
m.[msg_length-1] <- Char.chr ck_b;
m
end
+module PprzTypeStandard = struct
+ let stx = Char.chr 0x99
+ let offset_length = 1
+ let offset_timestamp = -1
+ let offset_payload = 2
+ let overhead_length = 4
+end
+
+module PprzTypeTimestamp = struct
+ let stx = Char.chr 0x98
+ let offset_length = 1
+ let offset_timestamp = 2
+ let offset_payload = 6
+ let overhead_length = 8
+end
+
+module Transport = PprzTransportBase (PprzTypeStandard)
+module TransportExtended = PprzTransportBase (PprzTypeTimestamp)
+
let offset_ac_id = 0
let offset_msg_id = 1
let offset_fields = 2
Modified: paparazzi3/trunk/sw/lib/ocaml/pprz.mli
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/pprz.mli 2010-02-05 18:20:34 UTC (rev
4543)
+++ paparazzi3/trunk/sw/lib/ocaml/pprz.mli 2010-02-05 20:45:57 UTC (rev
4544)
@@ -102,6 +102,18 @@
[packet] raises Invalid_Argument if length >= 256
*)
+module TransportExtended : Serial.PROTOCOL
+(** Pprz frame (sw/airborne/pprz_transport.h):
+ |STX|length|timestamp|... payload=(length-4) bytes ...|Checksum A|Checksum
B|
+ Where checksum is computed over length and payload:
+ ck_A = ck_B = 0;
+ for all byte b in payload
+ ck_A += b; ck_b += ck_A
+
+ STX = 0x98
+ [packet] raises Invalid_Argument if length >= 256
+ *)
+
val offset_fields : int
module type CLASS = sig
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [paparazzi-commits] [4544] Add support for modified pprz protocol, called pprz2.,
Allen Ibara <=