7 read tx-ack-errors # does not work
8 read rx-signal-strength
10 read rssi-for-channel # does not work
15 write bcast-multi-xmit 0
16 write unicast-retries 0
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
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.
36 Exemple, on veut envoyer le servo 0 (=0x123) et 4 (=0x234). Puissance = 2.
41 puis val[0] sur 10 bits
42 puis val[2] sur 10 bits
43 padding à 0 pour arondir sur un octet
47 - sinon, type correspond à la commande qui est mappée sur une structure
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
58 - on compare les valeurs ppm aux dernières valeurs envoyées: si
59 elles sont différentes:
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
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
69 - lorsqu'on reçoit un paquet d'acquitement, on stoque le numéro de
72 - lorsqu'on reçoit un paquet de stats, on le traite (affichage, beep,
75 - lorsqu'on reçoit un paquet de "ping", on note le RSSI et la puissance
76 à laquelle il a été émis.
78 - la puissance d'émission est choisi avec l'algorithme suivant:
80 - si on n'a pas reçu d'acquitement ou de ping depuis 500ms, alors
81 on émet alternativement à 0 et 4.
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.
89 - lorsqu'on reçoit un paquet de commande
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.
96 - toutes les 500ms, on émet un paquet de "ping" à une puissance
97 différente (0 à 4). La puissance est contenue dans le message.
99 - toutes les 100ms, on émet un paquet de stats à la puissance du dernier
102 interrupt, software interrupts and background tasks
103 ===================================================
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.
112 A typical example where the command line blocks is the completion with
118 xbee rx and timers should be executed in a low prio scheduler
119 event. With this modification, the command line can block. However we
120 must prevent a xbee transmission to be interrupted by a task doing
121 another xbee transmission. For that, we will use scheduler_set_prio().
123 The problem with that is that we can loose precision for low prio
124 events if the scheduler interrupt occurs when the scheduler priority
125 is low. It could be fixed in scheduler, but maybe we don't need it.
130 From highest to lowest priority.
139 - Events, called from timer interrupt after a call to sei():
141 - LED_PRIO: led blink
142 - BEEP_PRIO: process beep requests and modifies the beep_mask
143 - SPI_PRIO: send and receive SPI data to the atmega168p
144 - CS_PRIO: do the control system of the wing, reading infos from a
145 structure updated by i2c, and writing commands using
147 - XBEE_PRIO: read pending chars on xbee serial line and process xbee commands,
149 - I2C_PRIO: send requests and read answers on i2c slaves
150 - CALLOUT_PRIO: calls low priority events using the callout
151 code. This method allows to execute timers with a fixed period
152 without drift. Even if the event cannot be executed during some
153 time, periodical events will keep the proper period.
162 Calling a xbee function needs to set prio to XBEE_PRIO only.
163 Calling i2c_send_command must be done from a lower prio than I2C_PRIO.
165 libxbee / xbee module
166 =====================
171 xbee_dev = structure describing an xbee device
172 xbee_channel = structure describing a channel, used to associates a req
175 xbee.[ch]: main interface to libxbee, creation of dev, registeration of channels
176 xbee_atcmd.[ch]: get an AT command from its name or small id string
177 xbee_buf.[ch]: not used
178 xbee_neighbor.[ch]: helper to add/delete neighbors, use malloc()/free()
179 xbee_rxtx.[ch]: parse rx frames, provides xbee_proto_xmit()
180 xbee_stats.[ch]: helper to maintain stats
185 move this in library ?
187 xbeeapp_send(addr, data, len, timeout, cb, arg)
190 Timeout for xbee commands
191 =========================
193 - send_atcmd or send_msg (xbee_prio)
195 - allocate a channel and a context
196 - fill the context with info
198 - load a timeout (xbee_prio)
200 - on timeout (xbee_prio)
203 - call the cb with retcode == TIMEOUT
206 - this could be a critical error
207 - if it's a comm error, it's ok
208 - but if the channel is registered again and 1st callback finally occurs...
212 - if there is a context, it's related to a query:
215 - do basic checks on the frame
217 - the frame must be checked in the cb, we can provide helpers
223 - move callout in an aversive module
224 - move xbeeapp in xbee module