parse rx hello frames
[protos/xbee-avr.git] / notes.txt
1 dump xbee stats
2 ===============
3
4 read rf-errors
5 read good-packets
6 read tx-errors
7 read tx-ack-errors # does not work
8 read rx-signal-strength
9 read duty-cycle
10 read rssi-for-channel # does not work
11
12 configure xbee module
13 =====================
14
15 write bcast-multi-xmit 0
16 write unicast-retries 0
17 write power-level 0
18
19 radio protocol
20 ==============
21
22 - tout en network order
23 - avoir le paquet le plus petit possible
24 - grouper les informations en un paquet si possible. certaines infos
25   non critiques pourraient attendre en file qu'un paquet de même
26   puissance sorte
27
28 Octet 1: type
29
30 - si type est < 0x3f, alors il s'agit du bitmask des servos qui seront
31   présents dans le corps. Les servos sont présents par blocs de 10bits.
32   la puissance d'émission est également embarquée sur 3 bits.
33   Cette commande doit être bien compacte car c'est celle qui va être
34   envoyée le plus souvent.
35
36   Exemple, on veut envoyer le servo 0 (=0x123) et 4 (=0x234). Puissance = 2.
37
38   type = 0x5
39   seq_num sur 5 bits
40   puis pow sur 3 bits
41   puis val[0] sur 10 bits
42   puis val[2] sur 10 bits
43   padding à 0 pour arondir sur un octet
44
45   -> 0x11 0x9 0x1c 0x68
46
47 - sinon, type correspond à la commande qui est mappée sur une structure
48
49 rc_command
50 ----------
51
52 - on récupère l'état du PPM provenant de la télécommande en tache de
53   fond (période 20ms pour chaque servo, et les servos arrivent les
54   uns après les autres)
55
56 - toutes les 1 à 5ms
57
58   - on compare les valeurs ppm aux dernières valeurs envoyées: si
59     elles sont différentes:
60
61     - on les stoque en mémoire dans "valeurs à envoyer"
62     - on incrémente un numéro de séquence de cette structure sauf si
63       le dernier numéro d'acquitement reçu est trop ancien
64
65   - si le numéro de séquence est différent du numéro de seq reçu,
66     et que le dernier paquet a été émis il y a plus de 30ms, on émet
67     les nouvelles valeurs et le numéro de séquence local
68
69 - lorsqu'on reçoit un paquet d'acquitement, on stoque le numéro de
70   séquence
71
72 - lorsqu'on reçoit un paquet de stats, on le traite (affichage, beep,
73   log, osd)
74
75 - lorsqu'on reçoit un paquet de "ping", on note le RSSI et la puissance
76   à laquelle il a été émis.
77
78 - la puissance d'émission est choisi avec l'algorithme suivant:
79
80   - si on n'a pas reçu d'acquitement ou de ping depuis 500ms, alors
81     on émet alternativement à 0 et 4.
82
83   - sinon, on émet à la puissance la plus faible qui a un RSSI supérieur
84     à un seuil, ce que l'on peut déterminer grâce au ping.
85
86 wing
87 ----
88
89 - lorsqu'on reçoit un paquet de commande
90
91   - on met à jour les valeurs des servos
92   - si le dernier paquet d'acquitement a été émis il y a plus de 200ms
93     on émet un paquet d'acquitement. La puissance d'émission du paquet
94     d'acquitement est la même que la puissance du paquet reçu.
95
96 - toutes les 500ms, on émet un paquet de "ping" à une puissance
97   différente (0 à 4). La puissance est contenue dans le message.
98
99 - toutes les 100ms, on émet un paquet de stats à la puissance du dernier
100   paquet reçu.
101
102 interrupt, software interrupts and background tasks
103 ===================================================
104
105 problem description
106 -------------------
107
108 Today, Both command line code, xbee char reception and callout events
109 are handled in the main loop, with the lowest priority. Therefore, the
110 command line cannot block, else the timers + xbee rx won't be executed.
111
112 solution
113 --------
114
115 xbee rx and timers should be executed in a low prio scheduler
116 event. With this modification, the command line can block. However we
117 must prevent a xbee transmission to be interrupted by a task doing
118 another xbee transmission. For that, we will use scheduler_set_prio().
119
120 The problem with that is that we can loose precision for low prio
121 events if the scheduler interrupt occurs when the scheduler priority
122 is low. It could be fixed in scheduler, but maybe we don't need it.
123
124 Priorities
125 ----------
126
127 From highest to lowest priority.
128
129 - Interrupts:
130
131   - timer
132   - uart
133   - spi
134   - i2c
135
136 - Events, called from timer interrupt after a call to sei():
137
138   - LED_PRIO: led blink
139   - TIME_PRIO: monitor time
140   - BEEP_PRIO: process beep requests and modifies the beep_mask
141   - SPI_PRIO: send and receive SPI data to the atmega168p
142   - CS_PRIO: do the control system of the wing, reading infos from a
143     structure updated by i2c, and writing commands using
144     spi_set_servo()
145   - XBEE_PRIO: read pending chars on xbee serial line and process xbee commands,
146     send xbee commands.
147   - I2C_PRIO: send requests and read answers on i2c slaves
148   - CALLOUT_PRIO: calls low priority events using the callout
149     code. This method allows to execute timers with a fixed period
150     without drift. Even if the event cannot be executed during some
151     time, periodical events will keep the proper period.
152
153 - Main loop:
154
155   - command line
156
157 Rules
158 -----
159
160 Calling a xbee function needs to set prio to XBEE_PRIO only.
161 Calling i2c_send_command must be done from a lower prio than I2C_PRIO.
162
163 libxbee / xbee module
164 =====================
165
166 Library
167 -------
168
169 xbee_dev = structure describing an xbee device
170 xbee_channel = structure describing a channel, used to associates a req
171   with its answer
172
173 xbee.[ch]: main interface to libxbee, creation of dev, registeration of channels
174 xbee_atcmd.[ch]: get an AT command from its name or small id string
175 xbee_buf.[ch]: not used
176 xbee_neighbor.[ch]: helper to add/delete neighbors, use malloc()/free()
177 xbee_rxtx.[ch]: parse rx frames, provides xbee_proto_xmit()
178 xbee_stats.[ch]: helper to maintain stats