[Tinyos-contrib-commits]
CVS: tinyos-1.x/contrib/imote2/tos/lib/TimeSync
time-sync-design.doc, NONE, 1.1
Lama Nachman
lnachman at users.sourceforge.net
Mon Oct 23 20:01:15 PDT 2006
Update of /cvsroot/tinyos/tinyos-1.x/contrib/imote2/tos/lib/TimeSync
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv6884
Added Files:
time-sync-design.doc
Log Message:
Added documentation
--- NEW FILE: time-sync-design.doc ---
ÐÏࡱá
nt. It is assumed that the network is synchronized at the time of the alarm.
Synchronized sampling in realtime
The example given in figure 1 uses the time-stamps at the endpoints of a data capture as basis for resampling. The resample happens during post-processing that can start only after data capture is complete. For some applications it may be desirable or required to have the samples to be in correct alignment as they are collected. If the time sync can provide information, such as frequency and phase offset, to the sampling hardware, the data alignment can take place in realtime. This assumes that the clocks of the CPU and the sampling hardware are derived from the same crystal.
Synchronized playback in realtime
This is similar to the synchronized sampling in realtime, except here we use time sync to aide the D/A conversion process such that the outputs can be synchronized. Wireless home theatre speakers can be realized with this usage model.
Design description
The time sync development started off from the Vanderbilts FTSP code, but most of the components have been rewritten to address the following issues:
Flooding protocol enhancements
Automatic delay estimation, rather than hardwiring the delay into the algorithm
Fast convergence mode that is useful for network startup and for synchronizing a new node into the network
Improved linear regression model for tracking frequency and phase offset between nodes
Linear regression model that seamlessly handles the clock wrap-around
Flooding protocol
The objective of the time sync is to synchronize all nodes to the local time of the root node. The local time of the root node is by definition, the global time. Packet exchanges between the nodes of the network are the only way to achieve synchronization. One simple way of packet exchange is to flood the network with sync packets, starting from the root node.
The figure below helps explain the process of the flooding. There are 5 nodes in the network, with node 1 being the root. Nodes 2 and 3 are within radio range of the root, but nodes 4 and 5 are not. At this moment in time, the root node sends a packet with sequence number 5 and global time (GT) of 1000 at transmission time to the network. Nodes 2 and 3 picks up the packet, stores the GT and local time (LT) at reception time into a table. Nodes 2 and 3 then propagate the message through the network by transmitting the same sequence number with its estimate of the GT. Node 1 also can receive the messages from 2 and 3, but because the sequence number is not greater than its last transmitted sequence number it knows the message comes from a child. Nodes 4 and 5 are within radio range of node 2, so they will process the message from node 2, then continue the propagation of this sequence number. Node 5 is also within range from node 3, but it ignores this packet because it has already received a packet with sequence number of 5 in the past.
SHAPE \* MERGEFORMAT
Figure SEQ Figure \* ARABIC 2
Time-stamping
Time-stamping the transmission and reception of a message is used to find the instantaneous clock offset between the nodes. The trick to getting accurate time stamping is to read the clock as close to the physical layer as possible. The following diagram shows the various stages of the message as it is propagated from one node to another. We can eliminate much of the variability due to CPU interrupts and CSMA-CA if the time-stamping happens close to the radio transmit/receive blocks. Luckily, the radio issues an interrupt as the start of frame delimiter (SFD) field is physically transmitted or received. In the SFD interrupt handler, we can write the GT into the outgoing message during transmission, and store the LT during reception.
EMBED Word.Picture.8
Figure SEQ Figure \* ARABIC 3
Automatic delay estimation
The time elapsed between transmit SFD and receive SFD is generally non-zero. This propagation delay is the sum of over-the-air propagation and radio hardware propagation. Since RF propagation time is small compared to the length of a clock tic, we can ignore this effect. The radio hardware propagation for the CC2420 is quite significant, in the order of 3000 tics. The figure below shows that the time stamping occurs when the end of the SFD field is reached in the radio hardware. The difference between the TX and RX is the propagation delay of tp. If uncompensated, the receiving node will sync to a time that is tp behind the true global clock.
EMBED Word.Picture.8
Figure SEQ Figure \* ARABIC 4
For the FTSP code, an empirically determined propagation delay is hardwired into the code. There are two problems with this approach. First, the empirical measurements may have errors. The errors shows up as non-zero mean bias which accumulates additively in a multi-hop network. Secondly, the hardwired approach lacks flexibility. As a new radio is introduced, it requires another careful calibration.
The automatic delay estimation works as a feedback loop from one hop to another. More specifically, each node measures the propagation delay tp for its children nodes, and then sending that estimate to its children. The next figure shows that node 2 sends a packet back to node 1 at global time tg2. With prior synchronization uncompensated for the delay, node 2s clock is tp behind the global clock. As such the transmit time stamp will be tg2-tp, and the receive time stamp will be tg2+tp. The propagation delay can thus be calculated at node 1 as tp=(Stamp2-Stamp1)/2. To smooth out the variance in the time stamping we apply this recursive filter to the delay estimate: Tp(n)=(1-alpha)*Tp(n-1) + alpha*tp(n), where alpha is a coefficient between 0 and 1 (0.2 works well). Here we use index n to label the packets received by node 1, and denote Tp as the smoothed delay estimate at the nth received packet.
EMBED Word.Picture.8
Figure SEQ Figure \* ARABIC 5
To provide explicit feedback from every child node to parent will incur heavy traffic overhead. We can take advantage of the fact that most radio channels are symmetric. The feedback information, namely the uncompensated time stamp (Stamp1), is piggybacked on the flooding message, which can be heard by all neighboring nodes including the parent. To specify this field is intended for the parent, the node ID of the parent is added in the packet. An incoming packet with last parent ID equal to the local node ID will trigger the delay calculation.
The calculated delay estimate is propagated down to the network as a field in the flooding packet. For example, node 1 would send Tp(n) to node 2 in a field. When node 2 needs to calculate the true global time, it needs to compensate it with this value that was propagated from its parent.
Fast convergence
The choice of the time between the transmissions of sync packets, Tsync, is generally a tradeoff between performance and energy consumption. Because this time sync algorithm needs to build a table of time stamps in order to do regression, it needs about 10 sync packets to converge. The convergence is therefore a function of Tsync. Short Tsync will converge fast and has good accuracy, but there is a penalty on increased power consumption and radio traffic.
Like most synchronization protocols, FTSP uses a fixed Tsync. For many applications, the accuracy is not a limiting factor, since Tsync=70 seconds will produce error of a few milliseconds. It makes sense to try to save power in these applications by choosing a long Tsync. However, it might still be desirable to have the fast convergence time of a shorter Tsync, especially if the network were to be awakened to capture a short event. The solution is to have two Tsync settings: fast sync for learning and slow sync for keeping an already synced network in sync.
When the network is started or when a node is detected to be out of sync, the root node sends N sync packets at the fast sync mode. After that, it switches to the slow sync mode. The tricky part of this protocol is to detect if a node that is out of sync and to propagate this information back to the root qui
ckly.
If a node has less than some number of time stamps in the regression table, then it is by definition out of sync. Also if any time stamp in the regression table is inconsistent with the others beyond a threshold, it is out of sync. These two conditions are periodically checked at each node.
The next figure shows a state diagram for the control of the sync rate at the root node, which has the ultimate control of the sync mode of the entire network. The basic idea is to have the root send Nmax number of sync packets whenever there is something out of sync in the network. For example, when the network is started, all nodes are out of sync and Nburst is initialized to zero. Thus the root sends sync packets at the fast mode, each time incrementing the Nburst counter. After it has reached Nmax, it transitions to the slow sync mode.
EMBED Word.Picture.8
Figure SEQ Figure \* ARABIC 6
When a node becomes out of sync, the network might be in the slow sync mode. The proposed protocol has the following mechanism to wake up the network quickly. The feedback of the out-of-sync condition again uses a field in the flood packet, called is_sync. When a node locally determines that it is out of sync, it resets this field to zero. Otherwise it is set to one. If a node gets a packet that has is_sync value of zero, it immediately stops the counter for Tsync, and sends a packet with is_sync with value of zero. This effectively floods the network with the message that indicates some node is out of sync. When this message propagates to the root node, it stops the counter for Tsync, change to the fast sync mode, and reset Nburst to zero. To prevent the race condition of nodes passing back and forth the is_sync with value zero, once a node passed the is_sync of zero, it cannot do so for the next three packets.
Linear regression
Given relatively stable temperature, the short-term frequency stability of a crystal oscillator is almost constant. The frequency difference between two oscillators is therefore also constant, and the phase relationship is linear. We exploit this linearity to reduce the length of Tsync. The frequency tolerance of the crystals used in the motes is 20 ppm. In some limited number of experiments, the difference is actually closer to 2 ppm. Whichever is the case, linear regression is able to reduce Tsync by orders of magnitude given the same requirements on accuracy.
The phase relationship between the local clock and the global clock is given by the following equation:
localClock = skew * globalClock + offset
Given two pairs of transmit-receive time stamps, the skew can be computed. Given clock skew, and one pair of time stamps, the offset can be computed.
Noise sensitivity
The time stamping process can be noisy, with a few clock tics of errors. To reduce the effect of noise, the linear regression table contains more entries than necessary to compute the skew and offset. The computations are actually done with all possible combinations available, and averaged to get less noisy results. To improve the accuracy of the skew estimation, we observe that given the same time stamping variance, the skew estimate is more accurate if the observation points are spread out further in time. A simple heuristic of weighting the longer time spread skew estimates more in the averaging improved the accuracy slightly.
Interfaces
module TimeSyncM
{
provides
{
interface StdControl;
interface GlobalTime;
}
uses
{
interface SendMsg;
interface ReceiveMsg;
interface Timer;
interface Leds;
interface TimeStamping;
interface SysTime;
}
}
GlobalTime
async command result_t GlobalTime.getLocalTime(uint32_t *clockLow, uint32_t *clockHigh)
Gets local time, with clockLow providing the value of the 32-bit OCSR0 register, and clockHigh providing the counter which increments when OCSR0 wraps around.
async command result_t GlobalTime.local2Global(uint32_t *clockLow, uint32_t *clockHigh)
Conversion from local time to global time.
async command result_t GlobalTime.global2Local(uint32_t *clockLow, uint32_t *clockHigh)
Conversion from global time to local time.
async command result_t GlobalTime.getSkew(double *skew)
Gets the current estimated clock skew between the global clock and local clock.
async command result_t GlobalTime.getOffset(uint32_t *offsetLow, uint32_t *offsetHigh)
Gets the current clock offset between the global clock and local clock.
Performance
Synchronization error
Here are some preliminary results from a few tests. There are 7 nodes in the network that is synced to one master. Another mote is used to poll the 8 nodes every 11 seconds by sending a packet. When a mote receives a polling message, it computes the global time and reports back the value to the polling mote. The global times are recorded by a terminal program connected to the polling mote. Each experiment is done for 2 hrs. The parameter varied is the resync intervals.
Resync interval (s)Mean absolute error (microsecond)Max absolute error (microsecond)Mean error (microsecond)2.3771.86.1185.4092.15.15030.9284.92.199702.7116.0.558
The best case result for mean absolute error is in the order of a single clock tic, which shows that the errors are perhaps hardware limited. The results also show that as resync interval increases, the error increases. A Matlab simulation analyzing the error versus resync interval contradicts these tests. In the simulation, a perfectly linear clock skew is assumed, and the time stamps have some noise added to it. The only thing that affects the synchronization in this model is the variance of the time stamping noise, and not the resync interval. The assumption of perfectly linear clock skew is questionable. There might in fact be slight jitter or variation of the clock skew over the estimation interval.
Multihop performance
This experiment uses 10 second resync intervals with nodes that are up to 4 hops away from the root.
HopsMean absolute error (microsecond)Max absolute error (microsecond)11.38.622.81035.71745.117
Time Sync for Intel Mote2
PAGE 14 Copyright, Intel Corp. All rights reserved. Draft
Seq=5
GT=2055
Seq=5
GT=2003
Seq=5
GT=1000
Node 1
Node 5
Node 3
Node 4
Node 2
h¦-[
4[
t
l
4[
t
l
&
&
4[
t
l
&
4[
t
l
&
4[
t
l
t
l
h<½
?
?
?
?
&
&F
?
&
häW
hmX
?
'v
hDhð
?
?
?
?
'v
C
h~$
?
C
h;¸
?
O
O
O
R
t
l
t
l
t
l
t
l
t
l
t
l
V
t
l
t
l
t
l
t
l
hÆ w
W
¾
t
t
t
t
t
t
ð
ð
l
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
Ìô\
TZ,¤þ´
ð
ð
ð
ð
ð
ð
ð
ð
Ìô\
TZ,¤þ´
ð
ð
ð
ð
ð
ð
ð
ð
ð
Ìô\
TZ,¤þ´
ð
ð
ð
ð
ð
ð
P
ð
ð
ð
P
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
l
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ѦÅ@
ð
l
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
l
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
l
ð
ð
ð
ð
ð
ð
Ú
ð
@
ð
ð
ð
ð
ð
ds)«Q¤
ïÿ
øÀkÉð·ud#ÏÇLNgFSö(Zø8ØÞIzÉg¿¾-JÒÂã®SÌâáé§"¹ç@z3Ð{¦kxû´ðsøð¨ñ©å1Ø36D§ôZ°cÕk7Höx¿å}&èóFYÏiÓo|6}ÊG¤ùBÍ'ÉÆa.þÑÄÇDúHã7ëbûåçÙ9EÿQ¶åÉФÓL¿¸û¼d¿_ ô)ôÙd ôéåâ
V¦/Ù"£èIõ£Þt^ïêéF9·¸hh¿fäÜ÷ÑG8~,àÿ®kÔ^ÿ196X®îáx*5~í°´¿jkÍürB>´µúÊÉàQÊwO}ÉïØ¨>ðÝ»>gåþP9rªÏ§r´ÇíÝÈg;öÝJÚGðL.JcÝ$ÇDNÐü«=r×gï·Vác?àß#e6òzêùü£ô¼.b|Kì~cKlñs ½qqÆüûý3ÅøþÃ@NS>ÐÞ8§éóØaÐEýn··çWPÙ@Ú§qoCÒÈüÒ.ëc¬%ò>âx79øx¬Ç¹²¹õÏ®sËZwüH×FÒÅîF[k>ﵾשãÈ8ZÉïRu²c=ÆàuhÀ&{;mnûD¯q²¬òy¥ã1_{ùZ3^§Ã8®ÞE|Á°VÃ53À>,Í;2rÒ=E<ö_PN¬:rããSmLccú1¶cF²2¡räT8Ïä`ÛwÃðçñ¶(«Ö/ö«$ô@ 5'ì
hgÔ+áÑk2ãµYáÑY;£:²NEvdGj³ú"P_ÕH¨0ø·üÕP?`5Ä
ÕÐ
¸/{;ÁÕ«ð«u¬ßʰzשµ71¬§ØN±rÄ&ê#V¹û71¬§úÀ)VQö¸}VÅ(«!àX}mi_D,Pg~qdgþ) Q±Kã_j**Ø5Tp*r¨ 8²© /õX}cõ÷«a~ÀªÁ
Õ°
{¯à¾ìí+V1þÅMôoºväÜ
ø»U3¬û<îëÝQ8èãt1nûû6~¾ßþÖV+ÿCÈùRÒ¸³î$àg÷Éy(aËEÒ}?Wü'wO¤vÌ[>Æ×Ö¿ÚHÍ<®~ø6réxÍÀF6o´ÏsøD[g¸|7\Ûèq9ü¹
ç 1¯Q
×2ìÇ;f71·1z2©Ó°vaO|{jîî´ó¹ûgf'ÏÈ;n-îxqÐØ]g«»¦Ú¶)¯Ùa;í¯
9ìæIÁêç@¿stÌÇ×é|Y"Ô×$óvßóÌYv¾¿å5Öðïqµ,·ñãz&G?D}àÇæ/cüåÔ_Q8OåhÛ÷#¾&íÓuÖÔå4M_â4Z}Ö4½oÎ`v©y0{À¼èðóô%¥æ,ÔW®Iøý.Æe*4à;:¯I~X"\¸ðt
.J¶á}ÙÛ1æÜägZÏñ «Q£ç&Û4÷syRNÒûM)cõÓÜ#a}A9]gP8OåhÛwê±¹ÉZN,N¶\lÒ-?O?hIϰ§¤gjOýyz{ª
èÖÂÕÙC¨¯Ä*®©ïèØú¥ß±ë¬Æ¸°`¬âú[/{;ÁÕõ¯ê}ãÔ±:pâqß÷_äø|á8ÅpÄ#Qxsä/XÙ|ãöÇñ!z>£=nßsA\À±zrUGVPoÃô%½
Vgç¬Ì> ´Í1mh\
tx¡qúm,ÔWbõf=ÃëúËÏôVã\X`¬¶è^÷êGb`oÆ X±zFÇöý¶ïÇ{¬ÎRÇêP;eóò~ÈcÚ"Ýßk&î×Á5t~#æPxsÖ6V¶n§rËD}àx>£=nß«³Õ
ÖôcÅéÖâWÖdZµYÇ;²6X;²"J:²ºJ´@k2»J^É(IÏ@}%VéZ
4K`û~üÕÙ~Àê,Vg«_èØ¾xíûñv«Û÷sH`û~¼ÇªQ«=¸¯gß=ã}Jº¿ïWâ~à¸Ê1E}àÍÿØËÊäaïïùþz>£=nß«ÆcõíùºËcv¿ÔT°`ÅPÁÛ@+
Îlzmé¹±K[Wv棾«;¶ï§W`û~üÕx?`ÕèÂj|±ºC`û~^ؾoÇ X±zQÏî/-aßɽǪI«oÐûGû
~Åï'õ³ûHÀé}!àxÊñþêo~ï׬<xßg:Êï;¥çS9Úãö=¿¯ÕuÉGÖ&[Âײ§¯=òÈÚöÔuí©µ4Oii²´|º¨¯Äª&Ý_ZÂï/ù«süU«sÕoôìþ
û²·cÌ9»9V/¹I³rsÕsßi¿p-
P È_ó³Ù<u´
ÿÛÂrø½sa®8æ.¨Ü|H¤úÀ7~FùsTõãùTö$ûXp¬Ö¥ô6¼hémH¶ä¬J¶ÚæxÑbh¬K14ںͱ5õ䪩9«Î.ê«í#À~Ï{Àïëê?`u¾«`æ<ð{Þ^¾®z3Áü3ÆÀëð-NVÇêOVÐXµð«2Ê17Ac`ÌQ`c\*êÓ¸ÇÀU<®â1p+¨=ɾV£¬ÉÇêu¤öåR±(µ.=ãxÝËûu;ÉrØïÍ:^woV*ÐZEjQ_íg1×áÿx¡°ìÂêBøgã¹/K1°7c¬XÝÂ
~xOXµ¨cõÙðÙd±0f=å¬÷mè¦ôýòfÝSLØC}àZØ÷ÑÚ¨9ê#Çó©ìIöݰút`Õp¬®Ïë©~=·§:77&7÷} -ßz=Ô®Ï#µ|R»+Ë·vå¿_³+?ÆßSúJ¬nq9Ïsf¿c5ÅXµ¸°`¬¶ã^hÈóܽ`Å*îÍÃø+¯1pê(1p7óx7ñx7ó¸ÇÀ[x¼ÇÀ[y¼ÇÀ[xÜ6Jp¬Fõ6l,ìm*ÈY5Tphcc¡¡1²ÈÐØTX¼ÍQX|rUaqΪ>ÐE}%VqoÆÀ_ê.G¼ÈXMuauQ±{ó0>«½`ÅêzÅÀ÷¾ÆÀÕï¹®¦çv±Xµû~§10pq©c^ÔSÔÉbâP9rÔGçS9®»Ü¾«%QÖÅÇê¦å¤ö2R[^¶(µ®¼ìxÝ;eû¦å{\¹ÃþDùñº'ÊSvÔÆZÔWbµY`ë)î'ðæ¬.va5-ÀX]'°x0{3Áü>Ü÷óGíûñ«éêXµwÑ iò#<ø0Ûß{xp¿pÜ¿CåpLõç<ù(åõÏ>FåÈQ9Oå`O²ïùszÀ±PÑ]þk»ËÏ\°âÜÊ·ZWþàÚs+*Î
_ÄkþíÛ)×ßµèíÿûʵ¬}c9i¥ýÖú#ÜfªÖÓænSÃ&kÛõµdÐ=õ3y¬2SæÓ´¬J(O»Íd=}Æ|<>¹3ô
YÂeði|Öê
ø´¼Ì§;ó[b»JÚðØ·çtüíÓ}:6^ûôóÃ/t>ý©ÎÓ7äu1êáÓhÓ¢õ´yÛÆ°)ùt©Ì§ç*|:EËê°ªÔ²ñ´[ÁÇãÓ_BÐ\Ægö¯Owò>àsB̧
-±ákÛðØÐL>½_ÏÆë~â>Ýg~xBïéÓ¿Ó{ú¼.æÓvFèÓJG¸MaOÛ.áÓXU¥§Ýf×\ʧÿÅß}Rb¼vbó>Ð8¸Úiê©nKêû6Oì××U¼:ÑØc¦á
zÏ5eÊ5\YóiâæÓ
Üf¯ÍB½gì¡´9{d{ü×qL¥_³ÝèÓã=pÆuÃÔï±ÎÑW öèTô}ÚÐØohì*ûOì××ÕÛC&{Ô³5ü=½ç2宬Kͧßã6ÅOïé=c¥ÍØ#sÔyzY«cµJ(O»Ç;OcÏÇ{~=0ybìú5Þ«bîrCcwyøÚÞ$<Øã>«·è'{ôl
[ð\ÃQ¦\Ãu©Åos8'+m¾-xÆJ#±Çè>]¤guÔ©Ô²ñ´{¼>ýG0ô(Ð9ûokØýñçh» {_º+§È̹¾þ^S¼¨StÈô5.y·Õ=Sf.áu¹}ü\z{-æ¢ÎÓÄË
À5?ÝóÙ:é÷®ñïZy¾R"ü}\hD´5Û\"Ëuù#rZµaÆíw¯Õrò<n<b¤L_Ú£0ã¯ÚùCB®§Ífc°DeCÕù׬ï>åÚ´Ê{LÓfK6öpcÙØcÚÿö@ߪR5
íëß
B£ëzºÛÒÒügÿÌÜ95³¥s¥ýÅüÚü ä1 ÿúÛ¿ß ß&ïôu~SÃà5zGoÐûÁk
=9£`°}G¡ï#_
Ôé¢9.^`Ü_9vw|aù)cc#Çþ·)eöS@7mòû7S$[ìÆ×ûvÓÍö=&PPsìøê¬ï³SÇÆÃÞ;Ù\o:¾r0¦ÃuJõàë4î:|EËöÇ{¯Ü`Ã×Ew|å©ãßÅßãû:(¾ò\øÊ½Jðu
/}ñci¢
®ë\pÌcËÜç1,¿³hì9hyÓ«_Ôt7ÐN(ïlzgdcgÓ¥ç±MOåßÝt(¿¨h97yÎcÝë/{kijOM_¾x´y,*ü
(f\=óÆ ¥z'ìíG1Àß¿Ð^ø¢ ÇuR\ø²â{ÐOÕéÙüUìÂUÑUÝãgê/<Xÿ²ùú ¡<l~¦^ ͱãÙ-@/AÌdhTê/8ìsêÇD=Ò_¸zS`{ó?Üq5ñuKä¸"êëû-Mr|î
â¸ð¥¹JðVé/,U´Ê¬¢ÊÄ õ@Pn,«l´V^_³×WZkÒ Vé¯
Fc᫦òÜʸªÑðuL`ÏD},\=ø
ÿÎÁ
öÆ
Û{Á&/×¹Ór|Åàëb
ð
ð
j>^WÊZ
³jv©&VÁ&`UgªÌ*ø üåõt³Y¥dÈ*ØêLA«üUª
Xõ§Yµ>Ufk÷VgÞÙð«T%««Äðßyè¯tÝ¿ûCÞ9aña·¯>NÏñàI¾òj8Ω̤'9Ý/:Dr÷þó<g¥]ν»Ò:çW2yפN5ýÁʧ#½F"ÎþOóVYºä]û,Wɸ_ñµN :!Ï墫áb¡.¶§4ÿ41n¾¸í¶p±T[2áðÍÅÒÍæbªA.\=ÁÄËÄp1¹j!.~ìk.þ#(sѵ{«s±üj)¨`Â(×}
m¶#ï5'~rû:Åvß i8å¾,ñáDW ûèOèy¯9pûØíòÒ80 mN$´9 mª[´¹u¾ï,]'¥Ýév'kÔµV¦½è±ü2Ý<¦ñ1büîv1÷»51
6Ó¦ÓÖ¾ý ~uõYÒÍfZ[LK'2
öϦÓôtÌ´¶bÚ;fÚ«ik_êØ½Õ÷<üêéú8íH®ë§+c=äù2>ìöÜoÅJ⣮8í4ËÎ6KWÆDÈ»&ç¦Õú>EÚ8ïK³|×ýÚqZ¯Äe9kÏlVHk¾ òܸÌÕÁ0¬¯Fõ)Ͱ?ªf3¬ 9O«
OëæÓeøta`q䯿«ÏB¾0Ð\>eäS{>ÔåàNC
Jó©=æS¦ÅøROø~J°ûçOCJûÌïTý|BÝ×P|:¢*ùd÷Uº-i]¿Ðò¨JØýsû¾æýå!Vö.×Íåë´¼·¶]µöG¢½éf9í¨'bÖÉY{fuÙ´î{SBßÈ{«¦±Õv6·àiÖýÚoëÌ·^A]¿]{п#¼ëi÷Ë<\[¸0°¶pcsæ^ÒÍæaG<ìLä!ìyÑ»¢ÎûÃÃÎ-ÄÃ7=ÍÃE¿ÌC×îÎÃKö«·ýúx³-¨î_É'äOöÙÛý}á(r¥cò
Áý¾PtÎøsSÎÞ~Âò ҹǯdòÀèwÈâÛ ç@íqÖÍe\Qì³ô³9¾Í×z|=A乬sõ¨'®û¯Y^6uæ;üñ³þu8o3¬Áß iÔï*Y·¢AÖLdì Î!þC¨Y·2fÝbݬ¯Yó6Ã:×îÎ:¼ÿáWØ?ÔÃ:'ýSê¾T²y`ýÂíë³üÞÒ:T2y.]ýY¬¶¿A¸Þ*z=W;ßFÇô@ËBWi§j9§û#ÜÁ৪úïR^´ÊýÆZOgå=W+33aÚ&þbü&^ïgCÃJ>tû¦m<WÂ5yÞãÎËUwÌ
®[rî³\û¾ù ¼È6õðá ô [¿mÙ}Í
gÉígj8³"T° iÞóò¼?§÷ìÿ9﹪ó¾&sß§huç=ÛóÞ)Ï;lhæ}.Ë·ê¼cV\1ÿ[×¼÷¨Ì¼Éç½dÅ$ç¦ç
[¼XúXv¤nô³¹C°Ë'Ñaþ§%¾{§v/_Wù*ëê¤Nu×UeoÕ5¦ÖXG[¬1;.ôo²óVùïÈ»âç<§cü ;ù±¬Ãv½V£1Î
ùí; 3ù¹²Ý±aÕäö9¾ß¥ó ñ
ð
ãcÎq®ûjët÷ßZ'QÆQÆð|¬ûB«_/mGæùãölÃ=Íùâëϸ K±c5úê!ëÿ#¾Ná«p{pÌ÷rçsãè³_M@êv7Ó÷ª¥~¿eçù~ËÎóäy~çI9ßÛ]ÉÈÛ]»Wê'¡z2R)9K=s/tW9É,ÞÛ/b¹ÝȨ-aäH¦.ʾDß
jyׯ|ÓóJ»=ú[YÈÅ|«@Ì[
LzÿJ7û`R[!
î
¢xÏ
ð
Ö#î
eéx±Ù/Q[£<6´Õ«d+`.¶Nâ¥_%ïmJqÓ(æ#úáÔüQÃZOãÇëI¿¶tËy¸É+áºa©>J¾ög¬ìüäJ&,l°âMØÌê>Zäì×
þ|ØþAãS×!5X)ésFnã·ü>Hë$sº.VTnø#ÌáÚ/CY¡ðAóP£6ÁØv0¨üõ0]°ÂNx¶îrÇüzî,ù HH]\tt_Óè>Oºº9íwu¨vS9c»Å9ãY{8Cø3Ê3fãää§mÐÑGZP°^hn0óäKÏ
Âf:I¥à+É
fqC«Å¹áíqºÅÎ
qÇÒ3v:7DfÈû0fã _µxÜ^µÒãÛNÓØEܪºg² r%ÃR²à
kSÍJçóB"+^ø¦Íy¡Þ^¾<±²i.yù
Ö'ª
Ë%yò
£åa3^ZMÓ?Û/S1ÎN/J/С`n@O]bçÏ¢1ò¥Ùóî=½?Ƶpï;FjÜbÛu#uï¡êÊgï±ÎâºÛ4º±íºÊªî\8ãÅ9ã®]xÎ`äçs¼÷²8gܱ=Î@ÿD?mGÁz¡9Ã'gÎð^l6Á¹ÅOH¥àÒ$gø3ÎY3>3Ôu(vÎÀgçùR.§=Æm«·7)n彪ËÛ{0íÞ£Íæøq
>¶©¼ âçÂÿ´9/8sÀÂçxïqÛæ¼ðãñú úâÕ'Q°^h^'/Ì×ó°à÷¤RðÂü$/Ì+"^xÇæ¼¿g ^PסØycäK¹ðî=úxÜó¥Ç-¶aÜÊ{U׺÷'½¯iôûÒùBÕ_$H&
¾Ï/(_¸ï/ñ]Åèæê|î
øÏ_¾¸
åã«
ôÉ/Æß¿psØãoÌÏÁèðce_zêc4áª.\×Íà½×iÞKÈÿBÓ
?ô\×r.lSöÀª.ôÃÀæj
f8K̰4NÏÂܧÁ\Cæ,]´\yn'÷ëÜDcÌ"æ¡ú¹ÍB±ÿF>ÿmeèÝ¥Uݥ«Q°ß3£q6Åàëu×È-Ï|ßà¾÷ÂÑ?Â÷ÍFjªºrÃû
®ë!.l»¦<T]èVâ°0;5ÍYbªq¸
0×`n!LsÌN@ªQâppÇ4¸Ã95Eß@ù]çKAü^ÇÈ>ýÑæTKyâoé#[¿áæÓ²[êo$ÛG¢Ê7,¤+娦{-Æ76»í~ pwJãH,5_-³ÄwDxÝßãóZ¼+wóÓ²d~º@ÊÛL)¦r峺µÂHùH³ÊßCXòÚ{¤þ§±.%Î8Ü%óG¥óm¾ë4ßµ¸}b£-ë# gA&á|²e[@`Lf&É{+϶4T9ç[ñ]ݾãùLÒ©X¦û[¿|Oëp@Ü»Êd>X´ßaA¹Õðì!sxØÉ1wÏu1ø'k)TæãfÄÌ'Ë<úĽb|¹÷ɰ¬Êh åÿã¸Ë6¾Ú»\çÅj3ÇÆ@»U;Ôþ÷Qqp~±=T+0.f&í7êÆÛoÕÀù@ûå:5¾ÞØ8µã÷ºîÚâëϰ ó¡c)øêóÿ#¾ÎÀK`u`¬F¡sÍ!ðÙ¯ÅÄ·nò?ßïÞ¬¾{³fÈGO+óÄ|ìý¶xðý¶=öìDÁz<X,ù(®K%ó>ïîßULÁ½!ü &¹Yɰ-¦¼«Pumwßa>îþêlqÍ%@ySrÓ*º.r³§|\ï F/¶ÅÜLÕ¹Ùã¤G`#ÌÌcYbîVÞ©"ÌI
æ©,1Ìóùºó|kÈ_D}
0ok0¯¦9«=®=å±Þ!Ü@I:î,Çí^6xÝP{Yè½lð{òýv6îÀ9àoÚÏðoùÝwJ#¬³uâ¬wÔÀ
ð
B<fBè¼ O]B
R<x-ëÖPL®¥02ô@ÀÎÊsðò$AVÇm'ñhÂm²¶F
´ÌA¿v
XÞàæJ;:Ç\\Iaö#ÉÌ=××øÛþe
MÚº°SjIÜÞï7 i¼ü-ðÿð¾9~æÿÎx¿^Hã=>°xÿkÖàQÄû³BzÄûî1X?péûÇý
QjZ
èvÚ~ÑôÓ¢±ÿ2H<dØVqu¦Rõºäh¶>¸Î;Á;G$%£Oçìt_ 97z*ÿ
êü³TqÁ=
¯wÝa¡taR:« ôAÒÜaRgÁ`i[ãý:?\:,ÿ*õaÞ.ê%w*%wkHÃ(UÈ+#Ú»ÁÛ³~,ëdOæDIïa?«¬gg8ÄÒuâú4ØvK´&õ¨>¥V40卯uETä_Lî'v;æÏø«xXQrº©¤°_äN+xK-Á>gìÝüe|4?¬C&Ç#Ç"bkÈ{özr³
´5ÞìYöÛä4ûerý89ÏþYnßC&ù¬»»
-5yKYþ³£`³ùFÁæ{»¹oÚ?æ¤)©¨Òt°h¡)ªx©¬x©1W'§>)a:Xü'Señr/ÖuYÚÆºµöBóö¸»¦Ö°ÎF6þÇ~ÄÿÖí]@ç}¾8ntuà|ÜÕªX]Ø;ã=üèoI3Cgï+ùÜWrÏLÀ¿t4þöïýùô÷v|øÔ¿êÐ1ÎW9=Ìs^<©AÑ7QûÏAønâ+è³ é{
îY¡êfC¹ç¬à+kÏNð79Ì9¨µ»\×ÙKZÎÙ¥Ö'Õ>¸n6jyvñÕ§#÷<¡ïiÈ6«{Xv|ÀvÜÙ;ÖlôTâèm´6©ÑV4)¾ºÎ7ÚÅs]GÐ1Ý`~Çl}úæ éó&×&¨Sñ[Ú¨¯,_Mì¤æi}fúÑש|¾uùêÓt at J(dpâÊÌ÷ÝöÇAøùºÿ»ÒR!ÄkèlIÇZ'Ì$Ð
8o éz'ª:´Ê@zßBþ =p¿tÔéÙÎ¥§^U Ü
bÓF'"EPæ]Ü»R>1
stñÆ£A>wXMù¿26åûùç/~m+fÍåI)³üè'fÁ1Ê@I?×KÖIú&j¥î_Zw
×^ Þ?O)Ã/R¯k~ ´Fj»öSÇKÏ©ÆKªÖIŪzé[Jgè åÐk¾¦(
KW|ÆWØeÇä[d/Ë5ò<ù:¹M®Så»ßËÊjٷʽ²RU
¬z¬F½Iöf¯ì®æ´lvø]Ùõp«<G;A¾W»EÞUwC^ WlÓSÄé(è
ª¾ªÙSª·
½Ô7¬SÏiÜÆðÕÆTígÆÚƶb=¤»eè]tª.&â6)âoÚ¾mÍOo,"3ü;ã8M¥qzQ¬6·ªþip©sC·õÓôÿ_Ò½-/×ÈûêtòóÚ:ÙLí;2v±lYxL%¦IUgË"Õ%²gUse'«e=eke
|Ü)¿+[(_ «Ê«ÃÜ
kØ»c¡båøÐéÊÐÊÝÒU®t¿J)5¨¯QkÔG)©fµJ³RQëÃ_¢Ú2ʨ[OÓm¥ºéߣ¦ëQ_èPrÃÇT®¡ªÍ{)P_j8ôµÈpj ¥ù@¾±p5
5Ö2
5Ö2
5Ö2
#v
:V
t
Z
5Ö2
5Ö2
5Ö2
#v
:V
t
Z
5Ö2
5Ö2
5Ö2
#v
:V
t
Z
5Ö2
5Ö2
5Ö2
#v
:V
t
Z
5Ö2
5Ö2
5Ö2
#v
:V
t
R
t
t
t
t
t
&
&F
&F
&F
&F
&F
&F
&F
&F
l
¤x
¤x
&F
Ð^Ð
ÿÿ
ÿ
ÿÿ
G
N
O
G
G
G
O
@
C
O
£ß+
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
ð
G
2
G
G
'78fHòÿÿÿÿÿÿÿÿÿ
YXÿÿÿÿÿÿÿÿÿ
þÆ
^
`þOJ
LÿÆ
^
`Lÿh
þÆ
^
`þOJ
LÿÆ
^
`Lÿh
þÆ
^
`þOJ
þÆ
^
`þOJ
'7
P+Þ'
spdt
´4
´4
Tspdt
|
G
KP
R
4[
'v
?
A£
¶
¾
N
¿
More information about the Tinyos-contrib-commits
mailing list