avoid copy by using iovecs
[protos/xbee-avr.git] / rc_proto.h
index 61b104b..a12de34 100644 (file)
@@ -1,27 +1,60 @@
 #ifndef RC_PROTO_H
 #define RC_PROTO_H
 
-#define AXIS_NUMBER 4
+/* generic header */
+struct rc_proto_hdr {
+       uint8_t type;
+} __attribute__((packed));
 
-#define RC_PROTO_TYPE_CHANNEL 0
-#define RC_PROTO_TYPE_RANGE   1
+/* send a hello message, no answer is expected from the peer */
+#define RC_PROTO_HELLO 0
+struct rc_proto_hello {
+       uint8_t type;
+       uint8_t datalen; /* len of data excluding header */
+       uint8_t data[];
+} __attribute__((packed));
 
+/* send an echo request, expect an echo reply from the peer */
+#define RC_PROTO_ECHO_REQ 1
+struct rc_proto_echo_req {
+       uint8_t type;
+       uint8_t datalen; /* len of data excluding header */
+       uint8_t data[];
+} __attribute__((packed));
 
-/* TODO: Authenticate packet!! */
+/* reply to an echo request */
+#define RC_PROTO_ECHO_ANS 2
+struct rc_proto_echo_ans {
+       uint8_t type;
+       uint8_t datalen; /* len of data excluding header */
+       uint8_t data[];
+} __attribute__((packed));
 
-struct rc_proto_hdr {
+/* send a power level probe to the peer */
+#define RC_PROTO_POWER_PROBE 3
+struct rc_proto_power_probe {
        uint8_t type;
-};
-struct rc_proto_channel {
+       uint8_t power_level;
+} __attribute__((packed));
+
+/* send a servo command */
+#define RC_PROTO_SERVO 4
+struct rc_proto_servo {
        uint8_t type;
-       int16_t axis[AXIS_NUMBER];
+       uint8_t mask;
+       uint8_t seq_and_pow; /* bitfield: pow are the 3 lsb, seq the 5 msb */
 };
 
-struct rc_proto_range {
+/* acknowledge a servo command */
+#define RC_PROTO_ACK 5
+struct rc_proto_ack {
        uint8_t type;
-       uint8_t power_level;
-};
+       uint8_t seq;
+} __attribute__((packed));
+
 
+/* send a Hello message to a peer */
+int8_t rc_proto_send_hello(uint64_t addr, void *data, uint8_t data_len);
 
 void rc_proto_rx_range(int power_level);