From ed1542ae11d86993c71ead239a6e2f6eeb6bb1ad Mon Sep 17 00:00:00 2001 From: salty Date: Sat, 14 Mar 2026 12:30:26 -0400 Subject: [PATCH] feat: rewrite UWB firmware for DW1000 (all 3 boards) Anchor (esp32/uwb_anchor): - DW1000Ranging library (200m range, MODE_LONGDATA_RANGE_ACCURACY) - Unique addresses per anchor (anchor0/anchor1 build envs) - +RANGE output: anchor_id, tag_addr, range_mm, rssi - ESP-NOW receiver: forwards tag packets + priority E-STOP to Jetson - AT+ID? command Tag with Display (esp32/uwb_tag): - DW1000Ranging as tag, auto-discovers anchors - SSD1306 OLED: big distance, per-anchor ranges, RSSI bars, link status - ESP-NOW broadcast: range/heartbeat/estop packets - E-Stop on GPIO 0 (BOOT button), 10Hz TX while held - Display at 5Hz, ranging driven by DW1000Ranging.loop() Shared: - lib/DW1000/ extracted from mf_DW1000.zip (Makerfabs fork) - lib_extra_dirs for PlatformIO to find local library --- esp32/uwb_anchor/platformio.ini | 16 +- esp32/uwb_anchor/src/main.cpp | 485 +- esp32/uwb_tag/platformio.ini | 19 +- esp32/uwb_tag/src/main.cpp | 526 +- lib/DW1000/LICENSE.md | 176 + lib/DW1000/README.md | 174 + .../adapterBoard/AdapterBoardTestBed.png | Bin 0 -> 166674 bytes .../adapterBoard_contour.gm1 | 26 + .../adapterBoard_copperBottom.gbl | 652 ++ .../adapterBoard_copperTop.gtl | 734 +++ .../adapterBoard_drill.txt | 27 + .../adapterBoard_maskBottom.gbs | 35 + .../adapterBoard_maskTop.gts | 229 + .../adapterBoard_pasteMaskTop.gtp | 207 + .../adapterBoard_pnp.txt | 44 + .../adapterBoard_silkBottom.gbo | 2175 +++++++ .../adapterBoard_silkTop.gto | 5680 +++++++++++++++++ .../adapterBoard pdf/AdapterBoardTestBed.fzz | Bin 0 -> 17251 bytes .../DWM1000_AdapterBoard_Breadboard.svg | 360 ++ .../adapterBoard pdf/adapterBoard.fzz | Bin 0 -> 21403 bytes .../adapterBoard_etch_copper_bottom.pdf | Bin 0 -> 4079 bytes ...adapterBoard_etch_copper_bottom_mirror.pdf | Bin 0 -> 4117 bytes .../adapterBoard_etch_copper_top.pdf | Bin 0 -> 6680 bytes .../adapterBoard_etch_copper_top_mirror.pdf | Bin 0 -> 6726 bytes .../adapterBoard_etch_mask_bottom.pdf | Bin 0 -> 2806 bytes .../adapterBoard_etch_mask_bottom_mirror.pdf | Bin 0 -> 2805 bytes .../adapterBoard_etch_mask_top.pdf | Bin 0 -> 4147 bytes .../adapterBoard_etch_mask_top_mirror.pdf | Bin 0 -> 4150 bytes .../adapterBoard_etch_paste_mask_bottom.pdf | Bin 0 -> 1148 bytes ...terBoard_etch_paste_mask_bottom_mirror.pdf | Bin 0 -> 1148 bytes .../adapterBoard_etch_paste_mask_top.pdf | Bin 0 -> 3849 bytes ...dapterBoard_etch_paste_mask_top_mirror.pdf | Bin 0 -> 3883 bytes .../adapterBoard_etch_silk_bottom.pdf | Bin 0 -> 37296 bytes .../adapterBoard_etch_silk_bottom_mirror.pdf | Bin 0 -> 37259 bytes .../adapterBoard_etch_silk_top.pdf | Bin 0 -> 51738 bytes .../adapterBoard_etch_silk_top_mirror.pdf | Bin 0 -> 50242 bytes .../dwm1000 arduino standalone/DWM1000.lbr | 186 + .../etch_top_sided_miror.pdf | Bin 0 -> 6357 bytes .../one_sided_standalone_DWM1000.brd | 859 +++ .../one_sided_standalone_DWM1000.sch | 2609 ++++++++ .../BasicConnectivityTest.ino | 64 + .../examples/BasicReceiver/BasicReceiver.ino | 110 + .../examples/BasicSender/BasicSender.ino | 110 + .../DW1000Ranging_ANCHOR.ino | 52 + .../DW1000Ranging_TAG/DW1000Ranging_TAG.ino | 52 + .../MessagePingPong/MessagePingPong.ino | 144 + .../examples/RangingAnchor/RangingAnchor.ino | 275 + lib/DW1000/examples/RangingTag/RangingTag.ino | 201 + .../TimestampUsageTest/TimestampUsageTest.ino | 101 + lib/DW1000/extras/LICENSE | 176 + lib/DW1000/extras/doc/DW1000 | 2407 +++++++ .../extras/doc/DW1000_Arduino_API_doc.pdf | Bin 0 -> 203134 bytes .../doc/html/DW1000CompileOptions_8h.html | 92 + .../html/DW1000CompileOptions_8h_source.html | 63 + .../extras/doc/html/DW1000Constants_8h.html | 2284 +++++++ .../doc/html/DW1000Constants_8h_source.html | 63 + .../extras/doc/html/DW1000Device_8cpp.html | 65 + .../extras/doc/html/DW1000Device_8h.html | 94 + .../doc/html/DW1000Device_8h_source.html | 98 + .../extras/doc/html/DW1000Mac_8cpp.html | 65 + lib/DW1000/extras/doc/html/DW1000Mac_8h.html | 192 + .../extras/doc/html/DW1000Mac_8h_source.html | 79 + .../extras/doc/html/DW1000Ranging_8cpp.html | 86 + .../extras/doc/html/DW1000Ranging_8h.html | 339 + .../doc/html/DW1000Ranging_8h_source.html | 100 + .../extras/doc/html/DW1000Time_8cpp.html | 69 + lib/DW1000/extras/doc/html/DW1000Time_8h.html | 88 + .../extras/doc/html/DW1000Time_8h_source.html | 91 + lib/DW1000/extras/doc/html/DW1000_8cpp.html | 85 + lib/DW1000/extras/doc/html/DW1000_8h.html | 99 + .../extras/doc/html/DW1000_8h_source.html | 274 + ...-dw1000_2src_2DW1000Time_8cpp-example.html | 55 + lib/DW1000/extras/doc/html/annotated.html | 69 + lib/DW1000/extras/doc/html/arrowdown.png | Bin 0 -> 246 bytes lib/DW1000/extras/doc/html/arrowright.png | Bin 0 -> 229 bytes lib/DW1000/extras/doc/html/bc_s.png | Bin 0 -> 676 bytes lib/DW1000/extras/doc/html/bdwn.png | Bin 0 -> 147 bytes .../doc/html/classDW1000Class-members.html | 269 + .../extras/doc/html/classDW1000Class.html | 5354 ++++++++++++++++ .../doc/html/classDW1000Device-members.html | 96 + .../extras/doc/html/classDW1000Device.html | 689 ++ .../doc/html/classDW1000Mac-members.html | 77 + .../extras/doc/html/classDW1000Mac.html | 408 ++ .../html/classDW1000RangingClass-members.html | 88 + .../doc/html/classDW1000RangingClass.html | 781 +++ .../doc/html/classDW1000Time-members.html | 110 + .../extras/doc/html/classDW1000Time.html | 1100 ++++ lib/DW1000/extras/doc/html/classes.html | 69 + lib/DW1000/extras/doc/html/closed.png | Bin 0 -> 132 bytes lib/DW1000/extras/doc/html/deprecated.html | 59 + lib/DW1000/extras/doc/html/deprecated_8h.html | 105 + .../extras/doc/html/deprecated_8h_source.html | 63 + .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 95 + lib/DW1000/extras/doc/html/doc.png | Bin 0 -> 746 bytes lib/DW1000/extras/doc/html/doxygen.css | 1475 +++++ lib/DW1000/extras/doc/html/doxygen.png | Bin 0 -> 3779 bytes lib/DW1000/extras/doc/html/dynsections.js | 97 + lib/DW1000/extras/doc/html/examples.html | 57 + lib/DW1000/extras/doc/html/files.html | 78 + lib/DW1000/extras/doc/html/folderclosed.png | Bin 0 -> 616 bytes lib/DW1000/extras/doc/html/folderopen.png | Bin 0 -> 597 bytes lib/DW1000/extras/doc/html/ftv2blank.png | Bin 0 -> 86 bytes lib/DW1000/extras/doc/html/ftv2cl.png | Bin 0 -> 453 bytes lib/DW1000/extras/doc/html/ftv2doc.png | Bin 0 -> 746 bytes .../extras/doc/html/ftv2folderclosed.png | Bin 0 -> 616 bytes lib/DW1000/extras/doc/html/ftv2folderopen.png | Bin 0 -> 597 bytes lib/DW1000/extras/doc/html/ftv2lastnode.png | Bin 0 -> 86 bytes lib/DW1000/extras/doc/html/ftv2link.png | Bin 0 -> 746 bytes lib/DW1000/extras/doc/html/ftv2mlastnode.png | Bin 0 -> 246 bytes lib/DW1000/extras/doc/html/ftv2mnode.png | Bin 0 -> 246 bytes lib/DW1000/extras/doc/html/ftv2mo.png | Bin 0 -> 403 bytes lib/DW1000/extras/doc/html/ftv2node.png | Bin 0 -> 86 bytes lib/DW1000/extras/doc/html/ftv2ns.png | Bin 0 -> 388 bytes lib/DW1000/extras/doc/html/ftv2plastnode.png | Bin 0 -> 229 bytes lib/DW1000/extras/doc/html/ftv2pnode.png | Bin 0 -> 229 bytes lib/DW1000/extras/doc/html/ftv2splitbar.png | Bin 0 -> 314 bytes lib/DW1000/extras/doc/html/ftv2vertline.png | Bin 0 -> 86 bytes lib/DW1000/extras/doc/html/functions.html | 193 + .../extras/doc/html/functions_0x7e.html | 103 + lib/DW1000/extras/doc/html/functions_a.html | 130 + lib/DW1000/extras/doc/html/functions_b.html | 121 + lib/DW1000/extras/doc/html/functions_c.html | 139 + lib/DW1000/extras/doc/html/functions_d.html | 124 + lib/DW1000/extras/doc/html/functions_e.html | 103 + lib/DW1000/extras/doc/html/functions_f.html | 100 + .../extras/doc/html/functions_func.html | 124 + .../extras/doc/html/functions_func_0x7e.html | 100 + .../extras/doc/html/functions_func_b.html | 94 + .../extras/doc/html/functions_func_c.html | 118 + .../extras/doc/html/functions_func_d.html | 112 + .../extras/doc/html/functions_func_e.html | 100 + .../extras/doc/html/functions_func_g.html | 202 + .../extras/doc/html/functions_func_h.html | 94 + .../extras/doc/html/functions_func_i.html | 148 + .../extras/doc/html/functions_func_l.html | 94 + .../extras/doc/html/functions_func_m.html | 94 + .../extras/doc/html/functions_func_n.html | 106 + .../extras/doc/html/functions_func_o.html | 124 + .../extras/doc/html/functions_func_p.html | 97 + .../extras/doc/html/functions_func_r.html | 127 + .../extras/doc/html/functions_func_s.html | 233 + .../extras/doc/html/functions_func_t.html | 94 + .../extras/doc/html/functions_func_u.html | 100 + .../extras/doc/html/functions_func_v.html | 94 + .../extras/doc/html/functions_func_w.html | 121 + lib/DW1000/extras/doc/html/functions_g.html | 205 + lib/DW1000/extras/doc/html/functions_h.html | 97 + lib/DW1000/extras/doc/html/functions_i.html | 151 + lib/DW1000/extras/doc/html/functions_l.html | 100 + lib/DW1000/extras/doc/html/functions_m.html | 121 + lib/DW1000/extras/doc/html/functions_n.html | 112 + lib/DW1000/extras/doc/html/functions_o.html | 127 + lib/DW1000/extras/doc/html/functions_p.html | 163 + lib/DW1000/extras/doc/html/functions_r.html | 139 + lib/DW1000/extras/doc/html/functions_s.html | 239 + lib/DW1000/extras/doc/html/functions_t.html | 166 + lib/DW1000/extras/doc/html/functions_u.html | 103 + lib/DW1000/extras/doc/html/functions_v.html | 97 + .../extras/doc/html/functions_vars.html | 484 ++ lib/DW1000/extras/doc/html/functions_w.html | 130 + lib/DW1000/extras/doc/html/functions_x.html | 97 + lib/DW1000/extras/doc/html/globals.html | 730 +++ lib/DW1000/extras/doc/html/globals_defs.html | 722 +++ lib/DW1000/extras/doc/html/globals_vars.html | 72 + lib/DW1000/extras/doc/html/index.hhc | 511 ++ lib/DW1000/extras/doc/html/index.hhk | 1028 +++ lib/DW1000/extras/doc/html/index.hhp | 117 + lib/DW1000/extras/doc/html/index.html | 53 + lib/DW1000/extras/doc/html/jquery.js | 68 + lib/DW1000/extras/doc/html/nav_f.png | Bin 0 -> 153 bytes lib/DW1000/extras/doc/html/nav_g.png | Bin 0 -> 95 bytes lib/DW1000/extras/doc/html/nav_h.png | Bin 0 -> 98 bytes lib/DW1000/extras/doc/html/open.png | Bin 0 -> 123 bytes lib/DW1000/extras/doc/html/pages.html | 59 + .../extras/doc/html/require__cpp11_8h.html | 65 + .../doc/html/require__cpp11_8h_source.html | 63 + lib/DW1000/extras/doc/html/search/all_0.html | 26 + lib/DW1000/extras/doc/html/search/all_0.js | 36 + lib/DW1000/extras/doc/html/search/all_1.html | 26 + lib/DW1000/extras/doc/html/search/all_1.js | 21 + lib/DW1000/extras/doc/html/search/all_10.html | 26 + lib/DW1000/extras/doc/html/search/all_10.js | 44 + lib/DW1000/extras/doc/html/search/all_11.html | 26 + lib/DW1000/extras/doc/html/search/all_11.js | 60 + lib/DW1000/extras/doc/html/search/all_12.html | 26 + lib/DW1000/extras/doc/html/search/all_12.js | 48 + lib/DW1000/extras/doc/html/search/all_13.html | 26 + lib/DW1000/extras/doc/html/search/all_13.js | 7 + lib/DW1000/extras/doc/html/search/all_14.html | 26 + lib/DW1000/extras/doc/html/search/all_14.js | 4 + lib/DW1000/extras/doc/html/search/all_15.html | 26 + lib/DW1000/extras/doc/html/search/all_15.js | 16 + lib/DW1000/extras/doc/html/search/all_16.html | 26 + lib/DW1000/extras/doc/html/search/all_16.js | 4 + lib/DW1000/extras/doc/html/search/all_17.html | 26 + lib/DW1000/extras/doc/html/search/all_17.js | 6 + lib/DW1000/extras/doc/html/search/all_2.html | 26 + lib/DW1000/extras/doc/html/search/all_2.js | 13 + lib/DW1000/extras/doc/html/search/all_3.html | 26 + lib/DW1000/extras/doc/html/search/all_3.js | 22 + lib/DW1000/extras/doc/html/search/all_4.html | 26 + lib/DW1000/extras/doc/html/search/all_4.js | 50 + lib/DW1000/extras/doc/html/search/all_5.html | 26 + lib/DW1000/extras/doc/html/search/all_5.js | 7 + lib/DW1000/extras/doc/html/search/all_6.html | 26 + lib/DW1000/extras/doc/html/search/all_6.js | 23 + lib/DW1000/extras/doc/html/search/all_7.html | 26 + lib/DW1000/extras/doc/html/search/all_7.js | 40 + lib/DW1000/extras/doc/html/search/all_8.html | 26 + lib/DW1000/extras/doc/html/search/all_8.js | 5 + lib/DW1000/extras/doc/html/search/all_9.html | 26 + lib/DW1000/extras/doc/html/search/all_9.js | 24 + lib/DW1000/extras/doc/html/search/all_a.html | 26 + lib/DW1000/extras/doc/html/search/all_a.js | 4 + lib/DW1000/extras/doc/html/search/all_b.html | 26 + lib/DW1000/extras/doc/html/search/all_b.js | 68 + lib/DW1000/extras/doc/html/search/all_c.html | 26 + lib/DW1000/extras/doc/html/search/all_c.js | 13 + lib/DW1000/extras/doc/html/search/all_d.html | 26 + lib/DW1000/extras/doc/html/search/all_d.js | 10 + lib/DW1000/extras/doc/html/search/all_e.html | 26 + lib/DW1000/extras/doc/html/search/all_e.js | 18 + lib/DW1000/extras/doc/html/search/all_f.html | 26 + lib/DW1000/extras/doc/html/search/all_f.js | 34 + .../extras/doc/html/search/classes_0.html | 26 + .../extras/doc/html/search/classes_0.js | 8 + lib/DW1000/extras/doc/html/search/close.png | Bin 0 -> 273 bytes .../extras/doc/html/search/defines_0.html | 26 + .../extras/doc/html/search/defines_0.js | 9 + .../extras/doc/html/search/defines_1.html | 26 + .../extras/doc/html/search/defines_1.js | 4 + .../extras/doc/html/search/defines_10.html | 26 + .../extras/doc/html/search/defines_10.js | 23 + .../extras/doc/html/search/defines_11.html | 26 + .../extras/doc/html/search/defines_11.js | 4 + .../extras/doc/html/search/defines_12.html | 26 + .../extras/doc/html/search/defines_12.js | 4 + .../extras/doc/html/search/defines_2.html | 26 + .../extras/doc/html/search/defines_2.js | 7 + .../extras/doc/html/search/defines_3.html | 26 + .../extras/doc/html/search/defines_3.js | 23 + .../extras/doc/html/search/defines_4.html | 26 + .../extras/doc/html/search/defines_4.js | 4 + .../extras/doc/html/search/defines_5.html | 26 + .../extras/doc/html/search/defines_5.js | 21 + .../extras/doc/html/search/defines_6.html | 26 + .../extras/doc/html/search/defines_6.js | 4 + .../extras/doc/html/search/defines_7.html | 26 + .../extras/doc/html/search/defines_7.js | 5 + .../extras/doc/html/search/defines_8.html | 26 + .../extras/doc/html/search/defines_8.js | 4 + .../extras/doc/html/search/defines_9.html | 26 + .../extras/doc/html/search/defines_9.js | 66 + .../extras/doc/html/search/defines_a.html | 26 + .../extras/doc/html/search/defines_a.js | 4 + .../extras/doc/html/search/defines_b.html | 26 + .../extras/doc/html/search/defines_b.js | 4 + .../extras/doc/html/search/defines_c.html | 26 + .../extras/doc/html/search/defines_c.js | 7 + .../extras/doc/html/search/defines_d.html | 26 + .../extras/doc/html/search/defines_d.js | 11 + .../extras/doc/html/search/defines_e.html | 26 + .../extras/doc/html/search/defines_e.js | 28 + .../extras/doc/html/search/defines_f.html | 26 + .../extras/doc/html/search/defines_f.js | 12 + .../extras/doc/html/search/files_0.html | 26 + lib/DW1000/extras/doc/html/search/files_0.js | 16 + .../extras/doc/html/search/files_1.html | 26 + lib/DW1000/extras/doc/html/search/files_1.js | 4 + .../extras/doc/html/search/functions_0.html | 26 + .../extras/doc/html/search/functions_0.js | 14 + .../extras/doc/html/search/functions_1.html | 26 + .../extras/doc/html/search/functions_1.js | 4 + .../extras/doc/html/search/functions_10.html | 26 + .../extras/doc/html/search/functions_10.js | 6 + .../extras/doc/html/search/functions_11.html | 26 + .../extras/doc/html/search/functions_11.js | 4 + .../extras/doc/html/search/functions_12.html | 26 + .../extras/doc/html/search/functions_12.js | 13 + .../extras/doc/html/search/functions_13.html | 26 + .../extras/doc/html/search/functions_13.js | 6 + .../extras/doc/html/search/functions_2.html | 26 + .../extras/doc/html/search/functions_2.js | 12 + .../extras/doc/html/search/functions_3.html | 26 + .../extras/doc/html/search/functions_3.js | 10 + .../extras/doc/html/search/functions_4.html | 26 + .../extras/doc/html/search/functions_4.js | 6 + .../extras/doc/html/search/functions_5.html | 26 + .../extras/doc/html/search/functions_5.js | 40 + .../extras/doc/html/search/functions_6.html | 26 + .../extras/doc/html/search/functions_6.js | 4 + .../extras/doc/html/search/functions_7.html | 26 + .../extras/doc/html/search/functions_7.js | 22 + .../extras/doc/html/search/functions_8.html | 26 + .../extras/doc/html/search/functions_8.js | 4 + .../extras/doc/html/search/functions_9.html | 26 + .../extras/doc/html/search/functions_9.js | 4 + .../extras/doc/html/search/functions_a.html | 26 + .../extras/doc/html/search/functions_a.js | 8 + .../extras/doc/html/search/functions_b.html | 26 + .../extras/doc/html/search/functions_b.js | 14 + .../extras/doc/html/search/functions_c.html | 26 + .../extras/doc/html/search/functions_c.js | 5 + .../extras/doc/html/search/functions_d.html | 26 + .../extras/doc/html/search/functions_d.js | 15 + .../extras/doc/html/search/functions_e.html | 26 + .../extras/doc/html/search/functions_e.js | 50 + .../extras/doc/html/search/functions_f.html | 26 + .../extras/doc/html/search/functions_f.js | 4 + lib/DW1000/extras/doc/html/search/mag_sel.png | Bin 0 -> 563 bytes .../extras/doc/html/search/nomatches.html | 12 + .../extras/doc/html/search/pages_0.html | 26 + lib/DW1000/extras/doc/html/search/pages_0.js | 4 + .../extras/doc/html/search/pages_1.html | 26 + lib/DW1000/extras/doc/html/search/pages_1.js | 4 + lib/DW1000/extras/doc/html/search/search.css | 271 + lib/DW1000/extras/doc/html/search/search.js | 791 +++ .../extras/doc/html/search/search_l.png | Bin 0 -> 604 bytes .../extras/doc/html/search/search_m.png | Bin 0 -> 158 bytes .../extras/doc/html/search/search_r.png | Bin 0 -> 612 bytes .../extras/doc/html/search/searchdata.js | 33 + .../extras/doc/html/search/variables_0.html | 26 + .../extras/doc/html/search/variables_0.js | 36 + .../extras/doc/html/search/variables_1.html | 26 + .../extras/doc/html/search/variables_1.js | 4 + .../extras/doc/html/search/variables_2.html | 26 + .../extras/doc/html/search/variables_2.js | 11 + .../extras/doc/html/search/variables_3.html | 26 + .../extras/doc/html/search/variables_3.js | 9 + .../extras/doc/html/search/variables_4.html | 26 + .../extras/doc/html/search/variables_4.js | 8 + .../extras/doc/html/search/variables_5.html | 26 + .../extras/doc/html/search/variables_5.js | 5 + .../extras/doc/html/search/variables_6.html | 26 + .../extras/doc/html/search/variables_6.js | 4 + .../extras/doc/html/search/variables_7.html | 26 + .../extras/doc/html/search/variables_7.js | 11 + .../extras/doc/html/search/variables_8.html | 26 + .../extras/doc/html/search/variables_8.js | 4 + .../extras/doc/html/search/variables_9.html | 26 + .../extras/doc/html/search/variables_9.js | 24 + .../extras/doc/html/search/variables_a.html | 26 + .../extras/doc/html/search/variables_a.js | 6 + .../extras/doc/html/search/variables_b.html | 26 + .../extras/doc/html/search/variables_b.js | 4 + .../extras/doc/html/search/variables_c.html | 26 + .../extras/doc/html/search/variables_c.js | 26 + .../extras/doc/html/search/variables_d.html | 26 + .../extras/doc/html/search/variables_d.js | 5 + .../extras/doc/html/search/variables_e.html | 26 + .../extras/doc/html/search/variables_e.js | 4 + lib/DW1000/extras/doc/html/splitbar.png | Bin 0 -> 314 bytes lib/DW1000/extras/doc/html/sync_off.png | Bin 0 -> 853 bytes lib/DW1000/extras/doc/html/sync_on.png | Bin 0 -> 845 bytes lib/DW1000/extras/doc/html/tab_a.png | Bin 0 -> 142 bytes lib/DW1000/extras/doc/html/tab_b.png | Bin 0 -> 169 bytes lib/DW1000/extras/doc/html/tab_h.png | Bin 0 -> 177 bytes lib/DW1000/extras/doc/html/tab_s.png | Bin 0 -> 184 bytes lib/DW1000/extras/doc/html/tabs.css | 60 + lib/DW1000/extras/doc/html/todo.html | 63 + lib/DW1000/keywords.txt | 32 + lib/DW1000/library.json | 16 + lib/DW1000/library.properties | 9 + lib/DW1000/src/DW1000.cpp | 2391 +++++++ lib/DW1000/src/DW1000.h | 583 ++ lib/DW1000/src/DW1000CompileOptions.h | 33 + lib/DW1000/src/DW1000Constants.h | 296 + lib/DW1000/src/DW1000Device.cpp | 143 + lib/DW1000/src/DW1000Device.h | 111 + lib/DW1000/src/DW1000Mac.cpp | 159 + lib/DW1000/src/DW1000Mac.h | 90 + lib/DW1000/src/DW1000Ranging.cpp | 992 +++ lib/DW1000/src/DW1000Ranging.h | 210 + lib/DW1000/src/DW1000Time.cpp | 323 + lib/DW1000/src/DW1000Time.h | 144 + lib/DW1000/src/deprecated.h | 20 + lib/DW1000/src/require_cpp11.h | 12 + 377 files changed, 53271 insertions(+), 783 deletions(-) create mode 100644 lib/DW1000/LICENSE.md create mode 100644 lib/DW1000/README.md create mode 100644 lib/DW1000/adapterBoard/AdapterBoardTestBed.png create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_contour.gm1 create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_copperBottom.gbl create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_copperTop.gtl create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_drill.txt create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_maskBottom.gbs create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_maskTop.gts create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_pasteMaskTop.gtp create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_pnp.txt create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_silkBottom.gbo create mode 100644 lib/DW1000/adapterBoard/adapterBoard gerber files/adapterBoard_silkTop.gto create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/AdapterBoardTestBed.fzz create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/DWM1000_AdapterBoard_Breadboard.svg create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard.fzz create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_bottom.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_bottom_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_top.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_top_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_bottom.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_bottom_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_top.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_top_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_bottom.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_bottom_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_top.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_top_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_bottom.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_bottom_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_top.pdf create mode 100644 lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_top_mirror.pdf create mode 100644 lib/DW1000/adapterBoard/dwm1000 arduino standalone/DWM1000.lbr create mode 100644 lib/DW1000/adapterBoard/dwm1000 arduino standalone/etch_top_sided_miror.pdf create mode 100644 lib/DW1000/adapterBoard/dwm1000 arduino standalone/one_sided_standalone_DWM1000.brd create mode 100644 lib/DW1000/adapterBoard/dwm1000 arduino standalone/one_sided_standalone_DWM1000.sch create mode 100644 lib/DW1000/examples/BasicConnectivityTest/BasicConnectivityTest.ino create mode 100644 lib/DW1000/examples/BasicReceiver/BasicReceiver.ino create mode 100644 lib/DW1000/examples/BasicSender/BasicSender.ino create mode 100644 lib/DW1000/examples/DW1000Ranging_ANCHOR/DW1000Ranging_ANCHOR.ino create mode 100644 lib/DW1000/examples/DW1000Ranging_TAG/DW1000Ranging_TAG.ino create mode 100644 lib/DW1000/examples/MessagePingPong/MessagePingPong.ino create mode 100644 lib/DW1000/examples/RangingAnchor/RangingAnchor.ino create mode 100644 lib/DW1000/examples/RangingTag/RangingTag.ino create mode 100644 lib/DW1000/examples/TimestampUsageTest/TimestampUsageTest.ino create mode 100644 lib/DW1000/extras/LICENSE create mode 100644 lib/DW1000/extras/doc/DW1000 create mode 100644 lib/DW1000/extras/doc/DW1000_Arduino_API_doc.pdf create mode 100644 lib/DW1000/extras/doc/html/DW1000CompileOptions_8h.html create mode 100644 lib/DW1000/extras/doc/html/DW1000CompileOptions_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Constants_8h.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Constants_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Device_8cpp.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Device_8h.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Device_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Mac_8cpp.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Mac_8h.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Mac_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Ranging_8cpp.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Ranging_8h.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Ranging_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Time_8cpp.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Time_8h.html create mode 100644 lib/DW1000/extras/doc/html/DW1000Time_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/DW1000_8cpp.html create mode 100644 lib/DW1000/extras/doc/html/DW1000_8h.html create mode 100644 lib/DW1000/extras/doc/html/DW1000_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/_2home_2az_2Dropbox_2work_2Arduino_2az-z_2arduino-dw1000_2src_2DW1000Time_8cpp-example.html create mode 100644 lib/DW1000/extras/doc/html/annotated.html create mode 100644 lib/DW1000/extras/doc/html/arrowdown.png create mode 100644 lib/DW1000/extras/doc/html/arrowright.png create mode 100644 lib/DW1000/extras/doc/html/bc_s.png create mode 100644 lib/DW1000/extras/doc/html/bdwn.png create mode 100644 lib/DW1000/extras/doc/html/classDW1000Class-members.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000Class.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000Device-members.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000Device.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000Mac-members.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000Mac.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000RangingClass-members.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000RangingClass.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000Time-members.html create mode 100644 lib/DW1000/extras/doc/html/classDW1000Time.html create mode 100644 lib/DW1000/extras/doc/html/classes.html create mode 100644 lib/DW1000/extras/doc/html/closed.png create mode 100644 lib/DW1000/extras/doc/html/deprecated.html create mode 100644 lib/DW1000/extras/doc/html/deprecated_8h.html create mode 100644 lib/DW1000/extras/doc/html/deprecated_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 lib/DW1000/extras/doc/html/doc.png create mode 100644 lib/DW1000/extras/doc/html/doxygen.css create mode 100644 lib/DW1000/extras/doc/html/doxygen.png create mode 100644 lib/DW1000/extras/doc/html/dynsections.js create mode 100644 lib/DW1000/extras/doc/html/examples.html create mode 100644 lib/DW1000/extras/doc/html/files.html create mode 100644 lib/DW1000/extras/doc/html/folderclosed.png create mode 100644 lib/DW1000/extras/doc/html/folderopen.png create mode 100644 lib/DW1000/extras/doc/html/ftv2blank.png create mode 100644 lib/DW1000/extras/doc/html/ftv2cl.png create mode 100644 lib/DW1000/extras/doc/html/ftv2doc.png create mode 100644 lib/DW1000/extras/doc/html/ftv2folderclosed.png create mode 100644 lib/DW1000/extras/doc/html/ftv2folderopen.png create mode 100644 lib/DW1000/extras/doc/html/ftv2lastnode.png create mode 100644 lib/DW1000/extras/doc/html/ftv2link.png create mode 100644 lib/DW1000/extras/doc/html/ftv2mlastnode.png create mode 100644 lib/DW1000/extras/doc/html/ftv2mnode.png create mode 100644 lib/DW1000/extras/doc/html/ftv2mo.png create mode 100644 lib/DW1000/extras/doc/html/ftv2node.png create mode 100644 lib/DW1000/extras/doc/html/ftv2ns.png create mode 100644 lib/DW1000/extras/doc/html/ftv2plastnode.png create mode 100644 lib/DW1000/extras/doc/html/ftv2pnode.png create mode 100644 lib/DW1000/extras/doc/html/ftv2splitbar.png create mode 100644 lib/DW1000/extras/doc/html/ftv2vertline.png create mode 100644 lib/DW1000/extras/doc/html/functions.html create mode 100644 lib/DW1000/extras/doc/html/functions_0x7e.html create mode 100644 lib/DW1000/extras/doc/html/functions_a.html create mode 100644 lib/DW1000/extras/doc/html/functions_b.html create mode 100644 lib/DW1000/extras/doc/html/functions_c.html create mode 100644 lib/DW1000/extras/doc/html/functions_d.html create mode 100644 lib/DW1000/extras/doc/html/functions_e.html create mode 100644 lib/DW1000/extras/doc/html/functions_f.html create mode 100644 lib/DW1000/extras/doc/html/functions_func.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_0x7e.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_b.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_c.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_d.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_e.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_g.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_h.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_i.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_l.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_m.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_n.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_o.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_p.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_r.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_s.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_t.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_u.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_v.html create mode 100644 lib/DW1000/extras/doc/html/functions_func_w.html create mode 100644 lib/DW1000/extras/doc/html/functions_g.html create mode 100644 lib/DW1000/extras/doc/html/functions_h.html create mode 100644 lib/DW1000/extras/doc/html/functions_i.html create mode 100644 lib/DW1000/extras/doc/html/functions_l.html create mode 100644 lib/DW1000/extras/doc/html/functions_m.html create mode 100644 lib/DW1000/extras/doc/html/functions_n.html create mode 100644 lib/DW1000/extras/doc/html/functions_o.html create mode 100644 lib/DW1000/extras/doc/html/functions_p.html create mode 100644 lib/DW1000/extras/doc/html/functions_r.html create mode 100644 lib/DW1000/extras/doc/html/functions_s.html create mode 100644 lib/DW1000/extras/doc/html/functions_t.html create mode 100644 lib/DW1000/extras/doc/html/functions_u.html create mode 100644 lib/DW1000/extras/doc/html/functions_v.html create mode 100644 lib/DW1000/extras/doc/html/functions_vars.html create mode 100644 lib/DW1000/extras/doc/html/functions_w.html create mode 100644 lib/DW1000/extras/doc/html/functions_x.html create mode 100644 lib/DW1000/extras/doc/html/globals.html create mode 100644 lib/DW1000/extras/doc/html/globals_defs.html create mode 100644 lib/DW1000/extras/doc/html/globals_vars.html create mode 100644 lib/DW1000/extras/doc/html/index.hhc create mode 100644 lib/DW1000/extras/doc/html/index.hhk create mode 100644 lib/DW1000/extras/doc/html/index.hhp create mode 100644 lib/DW1000/extras/doc/html/index.html create mode 100644 lib/DW1000/extras/doc/html/jquery.js create mode 100644 lib/DW1000/extras/doc/html/nav_f.png create mode 100644 lib/DW1000/extras/doc/html/nav_g.png create mode 100644 lib/DW1000/extras/doc/html/nav_h.png create mode 100644 lib/DW1000/extras/doc/html/open.png create mode 100644 lib/DW1000/extras/doc/html/pages.html create mode 100644 lib/DW1000/extras/doc/html/require__cpp11_8h.html create mode 100644 lib/DW1000/extras/doc/html/require__cpp11_8h_source.html create mode 100644 lib/DW1000/extras/doc/html/search/all_0.html create mode 100644 lib/DW1000/extras/doc/html/search/all_0.js create mode 100644 lib/DW1000/extras/doc/html/search/all_1.html create mode 100644 lib/DW1000/extras/doc/html/search/all_1.js create mode 100644 lib/DW1000/extras/doc/html/search/all_10.html create mode 100644 lib/DW1000/extras/doc/html/search/all_10.js create mode 100644 lib/DW1000/extras/doc/html/search/all_11.html create mode 100644 lib/DW1000/extras/doc/html/search/all_11.js create mode 100644 lib/DW1000/extras/doc/html/search/all_12.html create mode 100644 lib/DW1000/extras/doc/html/search/all_12.js create mode 100644 lib/DW1000/extras/doc/html/search/all_13.html create mode 100644 lib/DW1000/extras/doc/html/search/all_13.js create mode 100644 lib/DW1000/extras/doc/html/search/all_14.html create mode 100644 lib/DW1000/extras/doc/html/search/all_14.js create mode 100644 lib/DW1000/extras/doc/html/search/all_15.html create mode 100644 lib/DW1000/extras/doc/html/search/all_15.js create mode 100644 lib/DW1000/extras/doc/html/search/all_16.html create mode 100644 lib/DW1000/extras/doc/html/search/all_16.js create mode 100644 lib/DW1000/extras/doc/html/search/all_17.html create mode 100644 lib/DW1000/extras/doc/html/search/all_17.js create mode 100644 lib/DW1000/extras/doc/html/search/all_2.html create mode 100644 lib/DW1000/extras/doc/html/search/all_2.js create mode 100644 lib/DW1000/extras/doc/html/search/all_3.html create mode 100644 lib/DW1000/extras/doc/html/search/all_3.js create mode 100644 lib/DW1000/extras/doc/html/search/all_4.html create mode 100644 lib/DW1000/extras/doc/html/search/all_4.js create mode 100644 lib/DW1000/extras/doc/html/search/all_5.html create mode 100644 lib/DW1000/extras/doc/html/search/all_5.js create mode 100644 lib/DW1000/extras/doc/html/search/all_6.html create mode 100644 lib/DW1000/extras/doc/html/search/all_6.js create mode 100644 lib/DW1000/extras/doc/html/search/all_7.html create mode 100644 lib/DW1000/extras/doc/html/search/all_7.js create mode 100644 lib/DW1000/extras/doc/html/search/all_8.html create mode 100644 lib/DW1000/extras/doc/html/search/all_8.js create mode 100644 lib/DW1000/extras/doc/html/search/all_9.html create mode 100644 lib/DW1000/extras/doc/html/search/all_9.js create mode 100644 lib/DW1000/extras/doc/html/search/all_a.html create mode 100644 lib/DW1000/extras/doc/html/search/all_a.js create mode 100644 lib/DW1000/extras/doc/html/search/all_b.html create mode 100644 lib/DW1000/extras/doc/html/search/all_b.js create mode 100644 lib/DW1000/extras/doc/html/search/all_c.html create mode 100644 lib/DW1000/extras/doc/html/search/all_c.js create mode 100644 lib/DW1000/extras/doc/html/search/all_d.html create mode 100644 lib/DW1000/extras/doc/html/search/all_d.js create mode 100644 lib/DW1000/extras/doc/html/search/all_e.html create mode 100644 lib/DW1000/extras/doc/html/search/all_e.js create mode 100644 lib/DW1000/extras/doc/html/search/all_f.html create mode 100644 lib/DW1000/extras/doc/html/search/all_f.js create mode 100644 lib/DW1000/extras/doc/html/search/classes_0.html create mode 100644 lib/DW1000/extras/doc/html/search/classes_0.js create mode 100644 lib/DW1000/extras/doc/html/search/close.png create mode 100644 lib/DW1000/extras/doc/html/search/defines_0.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_0.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_1.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_1.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_10.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_10.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_11.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_11.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_12.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_12.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_2.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_2.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_3.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_3.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_4.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_4.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_5.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_5.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_6.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_6.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_7.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_7.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_8.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_8.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_9.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_9.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_a.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_a.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_b.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_b.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_c.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_c.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_d.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_d.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_e.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_e.js create mode 100644 lib/DW1000/extras/doc/html/search/defines_f.html create mode 100644 lib/DW1000/extras/doc/html/search/defines_f.js create mode 100644 lib/DW1000/extras/doc/html/search/files_0.html create mode 100644 lib/DW1000/extras/doc/html/search/files_0.js create mode 100644 lib/DW1000/extras/doc/html/search/files_1.html create mode 100644 lib/DW1000/extras/doc/html/search/files_1.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_0.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_0.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_1.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_1.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_10.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_10.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_11.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_11.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_12.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_12.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_13.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_13.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_2.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_2.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_3.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_3.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_4.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_4.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_5.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_5.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_6.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_6.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_7.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_7.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_8.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_8.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_9.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_9.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_a.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_a.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_b.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_b.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_c.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_c.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_d.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_d.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_e.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_e.js create mode 100644 lib/DW1000/extras/doc/html/search/functions_f.html create mode 100644 lib/DW1000/extras/doc/html/search/functions_f.js create mode 100644 lib/DW1000/extras/doc/html/search/mag_sel.png create mode 100644 lib/DW1000/extras/doc/html/search/nomatches.html create mode 100644 lib/DW1000/extras/doc/html/search/pages_0.html create mode 100644 lib/DW1000/extras/doc/html/search/pages_0.js create mode 100644 lib/DW1000/extras/doc/html/search/pages_1.html create mode 100644 lib/DW1000/extras/doc/html/search/pages_1.js create mode 100644 lib/DW1000/extras/doc/html/search/search.css create mode 100644 lib/DW1000/extras/doc/html/search/search.js create mode 100644 lib/DW1000/extras/doc/html/search/search_l.png create mode 100644 lib/DW1000/extras/doc/html/search/search_m.png create mode 100644 lib/DW1000/extras/doc/html/search/search_r.png create mode 100644 lib/DW1000/extras/doc/html/search/searchdata.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_0.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_0.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_1.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_1.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_2.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_2.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_3.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_3.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_4.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_4.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_5.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_5.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_6.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_6.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_7.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_7.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_8.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_8.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_9.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_9.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_a.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_a.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_b.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_b.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_c.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_c.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_d.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_d.js create mode 100644 lib/DW1000/extras/doc/html/search/variables_e.html create mode 100644 lib/DW1000/extras/doc/html/search/variables_e.js create mode 100644 lib/DW1000/extras/doc/html/splitbar.png create mode 100644 lib/DW1000/extras/doc/html/sync_off.png create mode 100644 lib/DW1000/extras/doc/html/sync_on.png create mode 100644 lib/DW1000/extras/doc/html/tab_a.png create mode 100644 lib/DW1000/extras/doc/html/tab_b.png create mode 100644 lib/DW1000/extras/doc/html/tab_h.png create mode 100644 lib/DW1000/extras/doc/html/tab_s.png create mode 100644 lib/DW1000/extras/doc/html/tabs.css create mode 100644 lib/DW1000/extras/doc/html/todo.html create mode 100644 lib/DW1000/keywords.txt create mode 100644 lib/DW1000/library.json create mode 100644 lib/DW1000/library.properties create mode 100644 lib/DW1000/src/DW1000.cpp create mode 100644 lib/DW1000/src/DW1000.h create mode 100644 lib/DW1000/src/DW1000CompileOptions.h create mode 100644 lib/DW1000/src/DW1000Constants.h create mode 100644 lib/DW1000/src/DW1000Device.cpp create mode 100644 lib/DW1000/src/DW1000Device.h create mode 100644 lib/DW1000/src/DW1000Mac.cpp create mode 100644 lib/DW1000/src/DW1000Mac.h create mode 100644 lib/DW1000/src/DW1000Ranging.cpp create mode 100644 lib/DW1000/src/DW1000Ranging.h create mode 100644 lib/DW1000/src/DW1000Time.cpp create mode 100644 lib/DW1000/src/DW1000Time.h create mode 100644 lib/DW1000/src/deprecated.h create mode 100644 lib/DW1000/src/require_cpp11.h diff --git a/esp32/uwb_anchor/platformio.ini b/esp32/uwb_anchor/platformio.ini index 9d88d5f..a4f32c2 100644 --- a/esp32/uwb_anchor/platformio.ini +++ b/esp32/uwb_anchor/platformio.ini @@ -1,14 +1,9 @@ -; SaltyBot UWB Anchor Firmware — Issue #544 -; Target: Makerfabs ESP32 UWB Pro (DW3000 chip) -; -; Library: Makerfabs MaUWB_DW3000 -; https://github.com/Makerfabs/MaUWB_DW3000 +; SaltyBot UWB Anchor Firmware +; Target: Makerfabs ESP32 UWB Pro (DW1000, 200m range) ; ; Flash: -; pio run -e anchor0 --target upload (port-side anchor) -; pio run -e anchor1 --target upload (starboard anchor) -; Monitor: -; pio device monitor -e anchor0 -b 115200 +; pio run -e anchor0 --target upload (port-side) +; pio run -e anchor1 --target upload (starboard) [common] platform = espressif32 @@ -16,8 +11,7 @@ board = esp32dev framework = arduino monitor_speed = 115200 upload_speed = 921600 -lib_deps = - https://github.com/Makerfabs/MaUWB_DW3000.git +lib_extra_dirs = ../../lib build_flags = -DCORE_DEBUG_LEVEL=0 diff --git a/esp32/uwb_anchor/src/main.cpp b/esp32/uwb_anchor/src/main.cpp index eb484d6..40f7ab6 100644 --- a/esp32/uwb_anchor/src/main.cpp +++ b/esp32/uwb_anchor/src/main.cpp @@ -1,61 +1,57 @@ /* - * uwb_anchor — SaltyBot ESP32 UWB Pro anchor firmware (TWR responder) - * Issue #544 + * uwb_anchor — SaltyBot ESP32 UWB Pro anchor (DW1000 TWR responder) * - * Hardware: Makerfabs ESP32 UWB Pro (DW3000 chip) + * Hardware: Makerfabs ESP32 UWB Pro (DW1000, 200m range) + * Sits on robot body, USB-serial to Jetson Orin. + * Two anchors: anchor-0 (port), anchor-1 (starboard). * - * Role - * ──── - * Anchor sits on SaltyBot body, USB-connected to Jetson Orin. - * Two anchors per robot (anchor-0 port side, anchor-1 starboard). - * Person-worn tags initiate ranging; anchors respond. + * Serial output to Jetson (115200): + * +RANGE:,,,\r\n * - * Protocol: Double-Sided TWR (DS-TWR) - * ──────────────────────────────────── - * Tag → Anchor POLL (msg_type 0x01) - * Anchor → Tag RESP (msg_type 0x02, payload: T_poll_rx, T_resp_tx) - * Tag → Anchor FINAL (msg_type 0x03, payload: Ra, Da, Db timestamps) - * Anchor computes range via DS-TWR formula, emits +RANGE on Serial. + * Also receives ESP-NOW packets from tag and forwards: + * +ESPNOW:,,,,,,\r\n + * +ESTOP:\r\n (priority) * - * Serial output (115200 8N1, USB-CDC to Jetson) - * ────────────────────────────────────────────── - * +RANGE:,,\r\n (on each successful range) + * AT commands (host → anchor): + * AT+ID? → +ID: * - * AT commands (host → anchor) - * ─────────────────────────── - * AT+RANGE? → returns last buffered +RANGE line - * AT+RANGE_ADDR= → pair with specific tag (filter others) - * AT+RANGE_ADDR= → clear pairing (accept all tags) - * AT+ID? → returns +ID: - * - * Pin mapping — Makerfabs ESP32 UWB Pro - * ────────────────────────────────────── - * SPI SCK 18 SPI MISO 19 SPI MOSI 23 - * DW CS 21 DW RST 27 DW IRQ 34 - * - * Build - * ────── - * pio run -e anchor0 --target upload (port side) - * pio run -e anchor1 --target upload (starboard) + * Pin map — ESP32 UWB Pro (no display): + * SPI: SCK=18 MISO=19 MOSI=23 CS=4 + * DW1000: RST=27 IRQ=34 */ #include #include -#include #include #include #include -#include "dw3000.h" // Makerfabs MaUWB_DW3000 library +#include "DW1000Ranging.h" -/* ── Configurable ───────────────────────────────────────────────── */ +/* ── Config ─────────────────────────────────────────────────────── */ #ifndef ANCHOR_ID -# define ANCHOR_ID 0 /* 0 = port, 1 = starboard */ +# define ANCHOR_ID 0 #endif #define SERIAL_BAUD 115200 -/* ── ESP-NOW packet format (shared with tag firmware) ──────────── */ +/* Unique DW1000 address per anchor (last 2 bytes differ) */ +#if ANCHOR_ID == 0 +# define ANCHOR_ADDR "86:17:5B:D5:A9:9A:E2:00" +#else +# define ANCHOR_ADDR "86:17:5B:D5:A9:9A:E2:01" +#endif + +/* ── Pins (ESP32 UWB Pro, no display) ──────────────────────────── */ + +#define PIN_SCK 18 +#define PIN_MISO 19 +#define PIN_MOSI 23 +#define PIN_CS 4 +#define PIN_RST 27 +#define PIN_IRQ 34 + +/* ── ESP-NOW packet format (shared with tag) ───────────────────── */ #define ESPNOW_MAGIC_0 0x5B #define ESPNOW_MAGIC_1 0x01 @@ -79,157 +75,19 @@ struct EspNowPacket { }; #pragma pack(pop) -/* Ring buffer for received ESP-NOW packets (ISR → main loop) */ -#define ESPNOW_QUEUE_SIZE 8 -static volatile EspNowPacket g_espnow_queue[ESPNOW_QUEUE_SIZE]; -static volatile int g_espnow_head = 0; -static volatile int g_espnow_tail = 0; +/* ISR ring buffer for ESP-NOW */ +#define ESPNOW_Q_SIZE 8 +static volatile EspNowPacket g_enq[ESPNOW_Q_SIZE]; +static volatile int g_en_head = 0, g_en_tail = 0; static void IRAM_ATTR espnow_rx_cb(const uint8_t *mac, const uint8_t *data, int len) { if (len < (int)sizeof(EspNowPacket)) return; - const EspNowPacket *pkt = (const EspNowPacket *)data; - if (pkt->magic[0] != ESPNOW_MAGIC_0 || pkt->magic[1] != ESPNOW_MAGIC_1) return; - - int next = (g_espnow_head + 1) % ESPNOW_QUEUE_SIZE; - if (next == g_espnow_tail) return; /* queue full, drop */ - g_espnow_queue[g_espnow_head] = *pkt; - g_espnow_head = next; -} - -/* ── Pin map (Makerfabs ESP32 UWB Pro) ─────────────────────────── */ - -#define PIN_SCK 18 -#define PIN_MISO 19 -#define PIN_MOSI 23 -#define PIN_CS 21 -#define PIN_RST 27 -#define PIN_IRQ 34 - -/* ── DW3000 channel / PHY config ───────────────────────────────── */ - -static dwt_config_t dw_cfg = { - 5, /* channel 5 (6.5 GHz, best penetration) */ - DWT_PLEN_128, /* preamble length */ - DWT_PAC8, /* PAC size */ - 9, /* TX preamble code */ - 9, /* RX preamble code */ - 1, /* SFD type (IEEE 802.15.4z) */ - DWT_BR_6M8, /* data rate 6.8 Mbps */ - DWT_PHR_MODE_STD, /* standard PHR */ - DWT_PHR_RATE_DATA, - (129 + 8 - 8), /* SFD timeout */ - DWT_STS_MODE_OFF, /* STS off — standard TWR */ - DWT_STS_LEN_64, - DWT_PDOA_M0, /* no PDoA */ -}; - -/* ── Frame format ──────────────────────────────────────────────── */ - -/* Byte layout for all frames: - * [0] frame_type (FTYPE_*) - * [1] src_id (tag 8-bit addr, or ANCHOR_ID) - * [2] dst_id - * [3..] payload - * (FCS appended automatically by DW3000 — 2 bytes) - */ - -#define FTYPE_POLL 0x01 -#define FTYPE_RESP 0x02 -#define FTYPE_FINAL 0x03 - -#define FRAME_HDR 3 -#define FCS_LEN 2 - -/* RESP payload: T_poll_rx(5 B) + T_resp_tx(5 B) */ -#define RESP_PAYLOAD 10 -#define RESP_FRAME_LEN (FRAME_HDR + RESP_PAYLOAD + FCS_LEN) - -/* FINAL payload: Ra(5 B) + Da(5 B) + Db(5 B) */ -#define FINAL_PAYLOAD 15 -#define FINAL_FRAME_LEN (FRAME_HDR + FINAL_PAYLOAD + FCS_LEN) - -/* ── Timing ────────────────────────────────────────────────────── */ - -/* Turnaround delay: anchor waits 500 µs after poll_rx before tx_resp. - * DW3000 tick = 1/(128×499.2e6) ≈ 15.65 ps → 500 µs = ~31.95M ticks. - * Stored as uint32 shifted right 8 bits for dwt_setdelayedtrxtime. */ -#define RESP_TX_DLY_US 500UL -#define DWT_TICKS_PER_US 63898UL /* 1µs in DW3000 ticks (×8 prescaler) */ -#define RESP_TX_DLY_TICKS (RESP_TX_DLY_US * DWT_TICKS_PER_US) - -/* How long anchor listens for FINAL after sending RESP */ -#define FINAL_RX_TIMEOUT_US 3000 - -/* Speed of light (m/s) */ -#define SPEED_OF_LIGHT 299702547.0 - -/* DW3000 40-bit timestamp mask */ -#define DWT_TS_MASK 0xFFFFFFFFFFULL - -/* Antenna delay (factory default; calibrate per unit for best accuracy) */ -#define ANT_DELAY 16385 - -/* ── Interrupt flags (set in ISR, polled in main) ──────────────── */ - -static volatile bool g_rx_ok = false; -static volatile bool g_tx_done = false; -static volatile bool g_rx_err = false; -static volatile bool g_rx_to = false; - -static uint8_t g_rx_buf[128]; -static uint32_t g_rx_len = 0; - -/* ── State ──────────────────────────────────────────────────────── */ - -/* Last successful range (serves AT+RANGE? queries) */ -static int32_t g_last_range_mm = -1; -static char g_last_range_line[72] = {}; - -/* Optional tag pairing: 0 = accept all tags */ -static uint8_t g_paired_tag_id = 0; - -/* ── DW3000 ISR callbacks ───────────────────────────────────────── */ - -static void cb_tx_done(const dwt_cb_data_t *) { g_tx_done = true; } - -static void cb_rx_ok(const dwt_cb_data_t *d) { - g_rx_len = d->datalength; - if (g_rx_len > sizeof(g_rx_buf)) g_rx_len = sizeof(g_rx_buf); - dwt_readrxdata(g_rx_buf, g_rx_len, 0); - g_rx_ok = true; -} - -static void cb_rx_err(const dwt_cb_data_t *) { g_rx_err = true; } -static void cb_rx_to(const dwt_cb_data_t *) { g_rx_to = true; } - -/* ── Timestamp helpers ──────────────────────────────────────────── */ - -static uint64_t ts_read(const uint8_t *p) { - uint64_t v = 0; - for (int i = 4; i >= 0; i--) v = (v << 8) | p[i]; - return v; -} - -static void ts_write(uint8_t *p, uint64_t v) { - for (int i = 0; i < 5; i++, v >>= 8) p[i] = (uint8_t)(v & 0xFF); -} - -static inline uint64_t ts_diff(uint64_t later, uint64_t earlier) { - return (later - earlier) & DWT_TS_MASK; -} - -static inline double ticks_to_s(uint64_t t) { - return (double)t / (128.0 * 499200000.0); -} - -/* Estimate receive power from CIR diagnostics (dBm) */ -static float rx_power_dbm(void) { - dwt_rxdiag_t d; - dwt_readdiagnostics(&d); - if (d.maxGrowthCIR == 0 || d.rxPreamCount == 0) return 0.0f; - float f = (float)d.maxGrowthCIR; - float n = (float)d.rxPreamCount; - return 10.0f * log10f((f * f) / (n * n)) - 121.74f; + const EspNowPacket *p = (const EspNowPacket *)data; + if (p->magic[0] != ESPNOW_MAGIC_0 || p->magic[1] != ESPNOW_MAGIC_1) return; + int next = (g_en_head + 1) % ESPNOW_Q_SIZE; + if (next == g_en_tail) return; + g_enq[g_en_head] = *p; + g_en_head = next; } /* ── AT command handler ─────────────────────────────────────────── */ @@ -238,24 +96,8 @@ static char g_at_buf[64]; static int g_at_idx = 0; static void at_dispatch(const char *cmd) { - if (strcmp(cmd, "AT+RANGE?") == 0) { - if (g_last_range_mm >= 0) - Serial.println(g_last_range_line); - else - Serial.println("+RANGE:NO_DATA"); - - } else if (strcmp(cmd, "AT+ID?") == 0) { + if (strcmp(cmd, "AT+ID?") == 0) { Serial.printf("+ID:%d\r\n", ANCHOR_ID); - - } else if (strncmp(cmd, "AT+RANGE_ADDR=", 14) == 0) { - const char *v = cmd + 14; - if (*v == '\0') { - g_paired_tag_id = 0; - Serial.println("+OK:UNPAIRED"); - } else { - g_paired_tag_id = (uint8_t)strtoul(v, nullptr, 0); - Serial.printf("+OK:PAIRED=0x%02X\r\n", g_paired_tag_id); - } } else { Serial.println("+ERR:UNKNOWN_CMD"); } @@ -275,227 +117,86 @@ static void serial_poll(void) { } } -/* ── DS-TWR anchor state machine ────────────────────────────────── */ - -/* - * DS-TWR responder (one shot): - * 1. Wait for POLL from tag - * 2. Delayed-TX RESP (carry T_poll_rx + scheduled T_resp_tx) - * 3. Wait for FINAL from tag (tag embeds Ra, Da, Db) - * 4. Compute: Rb = T_final_rx − T_resp_tx - * tof = (Ra·Rb − Da·Db) / (Ra+Rb+Da+Db) - * range_m = tof × c - * 5. Print +RANGE line - */ -static void twr_cycle(void) { - - /* --- 1. Listen for POLL --- */ - dwt_setrxtimeout(0); - dwt_rxenable(DWT_START_RX_IMMEDIATE); - - g_rx_ok = g_rx_err = false; - uint32_t deadline = millis() + 2000; - while (!g_rx_ok && !g_rx_err) { - serial_poll(); - if (millis() > deadline) { - /* restart RX if we've been stuck */ - dwt_rxenable(DWT_START_RX_IMMEDIATE); - deadline = millis() + 2000; - } - yield(); - } - if (!g_rx_ok || g_rx_len < FRAME_HDR) return; - - /* validate POLL */ - if (g_rx_buf[0] != FTYPE_POLL) return; - uint8_t tag_id = g_rx_buf[1]; - if (g_paired_tag_id != 0 && tag_id != g_paired_tag_id) return; - - /* --- 2. Record T_poll_rx --- */ - uint8_t poll_rx_raw[5]; - dwt_readrxtimestamp(poll_rx_raw); - uint64_t T_poll_rx = ts_read(poll_rx_raw); - - /* Compute delayed TX time: poll_rx + turnaround, aligned to 512-tick grid */ - uint64_t resp_tx_sched = (T_poll_rx + RESP_TX_DLY_TICKS) & ~0x1FFULL; - - /* Build RESP frame */ - uint8_t resp[RESP_FRAME_LEN]; - resp[0] = FTYPE_RESP; - resp[1] = ANCHOR_ID; - resp[2] = tag_id; - ts_write(&resp[3], T_poll_rx); /* T_poll_rx (tag uses this) */ - ts_write(&resp[8], resp_tx_sched); /* scheduled T_resp_tx */ - - dwt_writetxdata(RESP_FRAME_LEN - FCS_LEN, resp, 0); - dwt_writetxfctrl(RESP_FRAME_LEN, 0, 1 /*ranging*/); - dwt_setdelayedtrxtime((uint32_t)(resp_tx_sched >> 8)); - - /* Enable RX after TX to receive FINAL */ - dwt_setrxaftertxdelay(300); - dwt_setrxtimeout(FINAL_RX_TIMEOUT_US); - - /* Fire delayed TX */ - g_tx_done = g_rx_ok = g_rx_err = g_rx_to = false; - if (dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED) != DWT_SUCCESS) { - dwt_forcetrxoff(); - return; /* TX window missed — try next cycle */ - } - - /* Wait for TX done (short wait, ISR fires fast) */ - uint32_t t0 = millis(); - while (!g_tx_done && millis() - t0 < 15) { yield(); } - - /* Read actual T_resp_tx */ - uint8_t resp_tx_raw[5]; - dwt_readtxtimestamp(resp_tx_raw); - uint64_t T_resp_tx = ts_read(resp_tx_raw); - - /* --- 3. Wait for FINAL --- */ - t0 = millis(); - while (!g_rx_ok && !g_rx_err && !g_rx_to && millis() - t0 < 60) { - serial_poll(); - yield(); - } - if (!g_rx_ok || g_rx_len < FRAME_HDR + FINAL_PAYLOAD) return; - if (g_rx_buf[0] != FTYPE_FINAL) return; - if (g_rx_buf[1] != tag_id) return; - - /* Extract DS-TWR timestamps from FINAL payload */ - uint64_t Ra = ts_read(&g_rx_buf[3]); /* tag: T_resp_rx − T_poll_tx */ - uint64_t Da = ts_read(&g_rx_buf[8]); /* tag: T_final_tx − T_resp_rx */ - /* g_rx_buf[13..17] = Db from tag (cross-check, unused here) */ - - /* T_final_rx */ - uint8_t final_rx_raw[5]; - dwt_readrxtimestamp(final_rx_raw); - uint64_t T_final_rx = ts_read(final_rx_raw); - - /* --- 4. DS-TWR formula --- */ - uint64_t Rb = ts_diff(T_final_rx, T_resp_tx); /* anchor round-trip */ - uint64_t Db = ts_diff(T_resp_tx, T_poll_rx); /* anchor turnaround */ - - double ra = ticks_to_s(Ra), rb = ticks_to_s(Rb); - double da = ticks_to_s(Da), db = ticks_to_s(Db); - - double denom = ra + rb + da + db; - if (denom < 1e-15) return; - - double tof = (ra * rb - da * db) / denom; - double range_m = tof * SPEED_OF_LIGHT; - - /* Validity window: 0.1 m – 130 m */ - if (range_m < 0.1 || range_m > 130.0) return; - - int32_t range_mm = (int32_t)(range_m * 1000.0 + 0.5); - float rssi = rx_power_dbm(); - - /* --- 5. Emit +RANGE --- */ - snprintf(g_last_range_line, sizeof(g_last_range_line), - "+RANGE:%d,%ld,%.1f", ANCHOR_ID, (long)range_mm, rssi); - g_last_range_mm = range_mm; - Serial.println(g_last_range_line); -} - -/* ── ESP-NOW packet processing (main loop context) ──────────────── */ +/* ── ESP-NOW processing ─────────────────────────────────────────── */ static void espnow_process(void) { - while (g_espnow_tail != g_espnow_head) { - const EspNowPacket &pkt = (const EspNowPacket &)g_espnow_queue[g_espnow_tail]; - g_espnow_tail = (g_espnow_tail + 1) % ESPNOW_QUEUE_SIZE; + while (g_en_tail != g_en_head) { + const EspNowPacket &pkt = (const EspNowPacket &)g_enq[g_en_tail]; + g_en_tail = (g_en_tail + 1) % ESPNOW_Q_SIZE; - /* E-STOP gets priority line */ if (pkt.msg_type == MSG_ESTOP) { - if (pkt.flags & 0x01) { + if (pkt.flags & 0x01) Serial.printf("+ESTOP:%d\r\n", pkt.tag_id); - } else { + else Serial.printf("+ESTOP_CLEAR:%d\r\n", pkt.tag_id); - } continue; } - /* Forward all other packets */ - Serial.printf("+ESPNOW:%d,%02X,%d,%ld,%.1f,%lu,%d,%02X,%d\r\n", - pkt.tag_id, - pkt.msg_type, - pkt.anchor_id, - (long)pkt.range_mm, - pkt.rssi_dbm, - (unsigned long)pkt.timestamp_ms, - pkt.battery_pct, - pkt.flags, - pkt.seq_num); + Serial.printf("+ESPNOW:%d,%02X,%ld,%.1f,%d,%02X,%d\r\n", + pkt.tag_id, pkt.msg_type, (long)pkt.range_mm, + pkt.rssi_dbm, pkt.battery_pct, pkt.flags, pkt.seq_num); } } -/* ── Arduino setup ──────────────────────────────────────────────── */ +/* ── DW1000Ranging callbacks ────────────────────────────────────── */ + +static void newRange(void) { + uint16_t tag_addr = DW1000Ranging.getDistantDevice()->getShortAddress(); + float range_m = DW1000Ranging.getDistantDevice()->getRange(); + float rxPow = DW1000Ranging.getDistantDevice()->getRXPower(); + + if (range_m < 0.0f || range_m > 250.0f) return; + + int32_t range_mm = (int32_t)(range_m * 1000.0f + 0.5f); + + Serial.printf("+RANGE:%d,%04X,%ld,%.1f\r\n", + ANCHOR_ID, tag_addr, (long)range_mm, rxPow); +} + +static void newBlink(DW1000Device *device) { + Serial.printf("+BLINK:%04X\r\n", device->getShortAddress()); +} + +static void inactiveDevice(DW1000Device *device) { + Serial.printf("+GONE:%04X\r\n", device->getShortAddress()); +} + +/* ── Setup ──────────────────────────────────────────────────────── */ void setup(void) { Serial.begin(SERIAL_BAUD); delay(300); + Serial.printf("\r\n[uwb_anchor] id=%d addr=%s starting\r\n", ANCHOR_ID, ANCHOR_ADDR); - Serial.printf("\r\n[uwb_anchor] anchor_id=%d starting\r\n", ANCHOR_ID); - - /* --- ESP-NOW receiver init --- */ + /* ESP-NOW receiver */ WiFi.mode(WIFI_STA); WiFi.disconnect(); esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE); - if (esp_now_init() == ESP_OK) { esp_now_register_recv_cb(espnow_rx_cb); - Serial.println("[uwb_anchor] ESP-NOW receiver ok"); + Serial.println("[uwb_anchor] ESP-NOW rx ok"); } else { - Serial.println("[uwb_anchor] WARN: ESP-NOW init failed — tag relay disabled"); + Serial.println("[uwb_anchor] WARN: ESP-NOW failed"); } - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); + /* DW1000 */ + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI); + DW1000Ranging.initCommunication(PIN_RST, PIN_CS, PIN_IRQ); - /* Hardware reset */ - pinMode(PIN_RST, OUTPUT); - digitalWrite(PIN_RST, LOW); - delay(2); - pinMode(PIN_RST, INPUT_PULLUP); - delay(5); + DW1000Ranging.attachNewRange(newRange); + DW1000Ranging.attachBlinkDevice(newBlink); + DW1000Ranging.attachInactiveDevice(inactiveDevice); - /* DW3000 probe + init (Makerfabs MaUWB_DW3000 library) */ - if (dwt_probe((struct dwt_probe_s *)&dw3000_probe_interf)) { - Serial.println("[uwb_anchor] FATAL: DW3000 probe failed — check SPI wiring"); - for (;;) delay(1000); - } + DW1000Ranging.startAsAnchor(ANCHOR_ADDR, DW1000.MODE_LONGDATA_RANGE_ACCURACY, false); - if (dwt_initialise(DWT_DW_INIT) != DWT_SUCCESS) { - Serial.println("[uwb_anchor] FATAL: dwt_initialise failed"); - for (;;) delay(1000); - } - - if (dwt_configure(&dw_cfg) != DWT_SUCCESS) { - Serial.println("[uwb_anchor] FATAL: dwt_configure failed"); - for (;;) delay(1000); - } - - dwt_setrxantennadelay(ANT_DELAY); - dwt_settxantennadelay(ANT_DELAY); - dwt_settxpower(0x0E080222UL); /* max TX power for 120 m range */ - - dwt_setcallbacks(cb_tx_done, cb_rx_ok, cb_rx_to, cb_rx_err, - nullptr, nullptr, nullptr); - dwt_setinterrupt( - DWT_INT_TXFRS | DWT_INT_RFCG | DWT_INT_RFTO | - DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_ARFE | DWT_INT_CPERR, - 0, DWT_ENABLE_INT_ONLY); - - attachInterrupt(digitalPinToInterrupt(PIN_IRQ), - []() { dwt_isr(); }, RISING); - - Serial.printf("[uwb_anchor] DW3000 ready ch=%d 6.8Mbps id=%d\r\n", - dw_cfg.chan, ANCHOR_ID); + Serial.printf("[uwb_anchor] DW1000 ready id=%d MODE_LONGDATA_RANGE_ACCURACY\r\n", ANCHOR_ID); Serial.println("[uwb_anchor] Listening for tags..."); } -/* ── Arduino loop ───────────────────────────────────────────────── */ +/* ── Loop ───────────────────────────────────────────────────────── */ void loop(void) { serial_poll(); - espnow_process(); /* forward tag ESP-NOW packets to Jetson via serial */ - twr_cycle(); + espnow_process(); + DW1000Ranging.loop(); } diff --git a/esp32/uwb_tag/platformio.ini b/esp32/uwb_tag/platformio.ini index c5ba7ad..e4ca342 100644 --- a/esp32/uwb_tag/platformio.ini +++ b/esp32/uwb_tag/platformio.ini @@ -1,17 +1,8 @@ -; SaltyBot UWB Tag Firmware — Issue #545 -; Target: Makerfabs ESP32 UWB Pro with Display (DW3000 + SSD1306 OLED) -; -; The tag is battery-powered, worn by the person being tracked. -; It initiates DS-TWR ranging with each anchor in round-robin, -; shows status on OLED display, and sends data via ESP-NOW. -; -; Library: Makerfabs MaUWB_DW3000 -; https://github.com/Makerfabs/MaUWB_DW3000 +; SaltyBot UWB Tag Firmware +; Target: Makerfabs ESP32 UWB Pro with Display (DW1000 + SSD1306 OLED) ; ; Flash: ; pio run -e tag --target upload -; Monitor (USB debug): -; pio device monitor -b 115200 [env:tag] platform = espressif32 @@ -19,12 +10,10 @@ board = esp32dev framework = arduino monitor_speed = 115200 upload_speed = 921600 +lib_extra_dirs = ../../lib lib_deps = - https://github.com/Makerfabs/MaUWB_DW3000.git adafruit/Adafruit SSD1306@^2.5.7 adafruit/Adafruit GFX Library@^1.11.5 build_flags = -DCORE_DEBUG_LEVEL=0 - -DTAG_ID=0x01 ; unique per tag (0x01–0xFE) - -DNUM_ANCHORS=2 ; number of anchors to range with - -DRANGE_INTERVAL_MS=50 ; 20 Hz round-robin across anchors + -DTAG_ID=0x01 diff --git a/esp32/uwb_tag/src/main.cpp b/esp32/uwb_tag/src/main.cpp index db0a91e..375222d 100644 --- a/esp32/uwb_tag/src/main.cpp +++ b/esp32/uwb_tag/src/main.cpp @@ -1,77 +1,60 @@ /* - * uwb_tag — SaltyBot ESP32 UWB Pro tag firmware (DS-TWR initiator) - * Issue #545 + display/ESP-NOW/e-stop extensions + * uwb_tag — SaltyBot ESP32 UWB Pro with Display (DW1000 TWR initiator) * - * Hardware: Makerfabs ESP32 UWB Pro with Display (DW3000 + SSD1306 OLED) + * Hardware: Makerfabs ESP32 UWB Pro with Display + * DW1000 (200m range), SSD1306 128x64 OLED, LiPo battery * - * Role - * ──── - * Tag is worn by a person riding an EUC while SaltyBot follows. - * Initiates DS-TWR ranging with 2 anchors on the robot at 20 Hz. - * Shows distance/status on OLED. Sends range data via ESP-NOW - * (no WiFi AP needed — peer-to-peer, ~1ms latency, works outdoors). - * GPIO 0 = emergency stop button (active low). + * Worn by person on EUC while robot follows. + * Ranges with 2 anchors on robot, shows distance on OLED, + * broadcasts data via ESP-NOW, has e-stop on GPIO 0. * - * Serial output (USB, 115200) — debug - * ──────────────────────────────────── - * +RANGE:,,\r\n + * OLED display (5 Hz): + * Line 1: Big distance to nearest anchor + * Line 2: Per-anchor ranges + * Line 3: Link status + RSSI bars + * Line 4: Uptime + packet count * - * ESP-NOW packet (broadcast, 20 bytes) - * ───────────────────────────────────── - * [0-1] magic 0x5B 0x01 - * [2] tag_id - * [3] msg_type 0x10=range, 0x20=estop, 0x30=heartbeat - * [4] anchor_id - * [5-8] range_mm (int32_t LE) - * [9-12] rssi_dbm (float LE) - * [13-16] timestamp (uint32_t millis) - * [17] battery_pct (0-100 or 0xFF) - * [18] flags bit0=estop_active - * [19] seq_num_lo (uint8_t, rolling) + * ESP-NOW broadcast (20-byte packets): + * Range data after each successful TWR cycle + * Heartbeat every 1s even if ranging fails + * E-stop at 10 Hz while button held * - * Pin mapping — Makerfabs ESP32 UWB Pro with Display - * ────────────────────────────────────────────────── - * SPI SCK 18 SPI MISO 19 SPI MOSI 23 - * DW CS 21 DW RST 27 DW IRQ 34 - * I2C SDA 4 I2C SCL 5 OLED addr 0x3C - * LED 2 E-STOP 0 (BOOT, active LOW) + * Pin map — ESP32 UWB Pro with Display: + * SPI: SCK=18 MISO=19 MOSI=23 CS=21 (not 4! display board differs) + * DW1000: RST=27 IRQ=34 + * I2C: SDA=4 SCL=5 OLED @0x3C + * E-Stop: GPIO 0 (BOOT), active LOW + * LED: GPIO 2 */ #include #include #include -#include #include #include #include - -#include "dw3000.h" +#include "DW1000Ranging.h" #include #include -/* ── Configurable ───────────────────────────────────────────────── */ +/* ── Config ─────────────────────────────────────────────────────── */ #ifndef TAG_ID -# define TAG_ID 0x01 +# define TAG_ID 0x01 #endif -#ifndef NUM_ANCHORS -# define NUM_ANCHORS 2 -#endif +#define TAG_ADDR "7D:00:22:EA:82:60:3B:9B" -#ifndef RANGE_INTERVAL_MS -# define RANGE_INTERVAL_MS 50 /* 20 Hz round-robin */ -#endif - -#define SERIAL_BAUD 115200 +#define SERIAL_BAUD 115200 +#define NUM_ANCHORS 2 /* ── Pins ───────────────────────────────────────────────────────── */ #define PIN_SCK 18 #define PIN_MISO 19 #define PIN_MOSI 23 -#define PIN_CS 21 +#define PIN_CS 21 /* Display board uses 21, not 4 */ #define PIN_RST 27 #define PIN_IRQ 34 @@ -79,22 +62,19 @@ #define PIN_SCL 5 #define PIN_LED 2 -#define PIN_ESTOP 0 /* BOOT button, active LOW */ +#define PIN_ESTOP 0 /* ── OLED ───────────────────────────────────────────────────────── */ -#define SCREEN_W 128 -#define SCREEN_H 64 -Adafruit_SSD1306 display(SCREEN_W, SCREEN_H, &Wire, -1); +Adafruit_SSD1306 display(128, 64, &Wire, -1); /* ── ESP-NOW ────────────────────────────────────────────────────── */ -#define ESPNOW_MAGIC_0 0x5B /* "SB" */ -#define ESPNOW_MAGIC_1 0x01 /* v1 */ - -#define MSG_RANGE 0x10 -#define MSG_ESTOP 0x20 -#define MSG_HEARTBEAT 0x30 +#define ESPNOW_MAGIC_0 0x5B +#define ESPNOW_MAGIC_1 0x01 +#define MSG_RANGE 0x10 +#define MSG_ESTOP 0x20 +#define MSG_HEARTBEAT 0x30 static uint8_t broadcast_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; static uint8_t g_seq = 0; @@ -111,113 +91,10 @@ struct EspNowPacket { uint8_t battery_pct; uint8_t flags; uint8_t seq_num; - uint8_t _pad; /* pad to 20 bytes */ + uint8_t _pad; }; #pragma pack(pop) -static_assert(sizeof(EspNowPacket) == 20, "packet must be 20 bytes"); - -/* ── DW3000 PHY config (must match anchor) ──────────────────────── */ - -static dwt_config_t dw_cfg = { - 5, /* channel 5 */ - DWT_PLEN_128, - DWT_PAC8, - 9, 9, /* TX/RX preamble code */ - 1, /* SFD type */ - DWT_BR_6M8, - DWT_PHR_MODE_STD, - DWT_PHR_RATE_DATA, - (129 + 8 - 8), - DWT_STS_MODE_OFF, - DWT_STS_LEN_64, - DWT_PDOA_M0, -}; - -/* ── Frame format ──────────────────────────────────────────────── */ - -#define FTYPE_POLL 0x01 -#define FTYPE_RESP 0x02 -#define FTYPE_FINAL 0x03 - -#define FRAME_HDR 3 -#define FCS_LEN 2 - -#define POLL_FRAME_LEN (FRAME_HDR + FCS_LEN) -#define RESP_PAYLOAD 10 -#define RESP_FRAME_LEN (FRAME_HDR + RESP_PAYLOAD + FCS_LEN) -#define FINAL_PAYLOAD 15 -#define FINAL_FRAME_LEN (FRAME_HDR + FINAL_PAYLOAD + FCS_LEN) - -/* ── Timing ────────────────────────────────────────────────────── */ - -#define FINAL_TX_DLY_US 500UL -#define DWT_TICKS_PER_US 63898UL -#define FINAL_TX_DLY_TICKS (FINAL_TX_DLY_US * DWT_TICKS_PER_US) -#define RESP_RX_TIMEOUT_US 3000 - -#define SPEED_OF_LIGHT 299702547.0 -#define DWT_TS_MASK 0xFFFFFFFFFFULL -#define ANT_DELAY 16385 - -/* ── ISR state ──────────────────────────────────────────────────── */ - -static volatile bool g_rx_ok = false; -static volatile bool g_tx_done = false; -static volatile bool g_rx_err = false; -static volatile bool g_rx_to = false; - -static uint8_t g_rx_buf[128]; -static uint32_t g_rx_len = 0; - -static void cb_tx_done(const dwt_cb_data_t *) { g_tx_done = true; } -static void cb_rx_ok(const dwt_cb_data_t *d) { - g_rx_len = d->datalength; - if (g_rx_len > sizeof(g_rx_buf)) g_rx_len = sizeof(g_rx_buf); - dwt_readrxdata(g_rx_buf, g_rx_len, 0); - g_rx_ok = true; -} -static void cb_rx_err(const dwt_cb_data_t *) { g_rx_err = true; } -static void cb_rx_to(const dwt_cb_data_t *) { g_rx_to = true; } - -/* ── Timestamp helpers ──────────────────────────────────────────── */ - -static uint64_t ts_read(const uint8_t *p) { - uint64_t v = 0; - for (int i = 4; i >= 0; i--) v = (v << 8) | p[i]; - return v; -} - -static void ts_write(uint8_t *p, uint64_t v) { - for (int i = 0; i < 5; i++, v >>= 8) p[i] = (uint8_t)(v & 0xFF); -} - -static inline uint64_t ts_diff(uint64_t later, uint64_t earlier) { - return (later - earlier) & DWT_TS_MASK; -} - -static inline double ticks_to_s(uint64_t t) { - return (double)t / (128.0 * 499200000.0); -} - -static float rx_power_dbm(void) { - dwt_rxdiag_t d; - dwt_readdiagnostics(&d); - if (d.maxGrowthCIR == 0 || d.rxPreamCount == 0) return 0.0f; - float f = (float)d.maxGrowthCIR; - float n = (float)d.rxPreamCount; - return 10.0f * log10f((f * f) / (n * n)) - 121.74f; -} - -/* ── Shared state for display ───────────────────────────────────── */ - -static int32_t g_anchor_range_mm[NUM_ANCHORS]; /* last range per anchor */ -static float g_anchor_rssi[NUM_ANCHORS]; /* last RSSI per anchor */ -static uint32_t g_anchor_last_ok[NUM_ANCHORS]; /* millis() of last good range */ -static bool g_estop_active = false; - -/* ── ESP-NOW send helper ────────────────────────────────────────── */ - static void espnow_send(uint8_t msg_type, uint8_t anchor_id, int32_t range_mm, float rssi) { EspNowPacket pkt = {}; @@ -229,39 +106,76 @@ static void espnow_send(uint8_t msg_type, uint8_t anchor_id, pkt.range_mm = range_mm; pkt.rssi_dbm = rssi; pkt.timestamp_ms = millis(); - pkt.battery_pct = 0xFF; /* TODO: read ADC battery voltage */ - pkt.flags = g_estop_active ? 0x01 : 0x00; + pkt.battery_pct = 0xFF; /* TODO: battery ADC */ + pkt.flags = 0; pkt.seq_num = g_seq++; - esp_now_send(broadcast_mac, (uint8_t *)&pkt, sizeof(pkt)); } -/* ── E-Stop handling ────────────────────────────────────────────── */ +/* ── Anchor tracking ────────────────────────────────────────────── */ +/* + * DW1000Ranging gives us callbacks with a device short address. + * We map the first 2 unique addresses we see to anchor 0 and 1. + */ +static uint16_t g_anchor_addrs[NUM_ANCHORS] = {0, 0}; +static int32_t g_anchor_range_mm[NUM_ANCHORS]; +static float g_anchor_rssi[NUM_ANCHORS]; +static uint32_t g_anchor_last_ok[NUM_ANCHORS]; +static int g_num_known_anchors = 0; + +static int anchor_index(uint16_t addr) { + for (int i = 0; i < g_num_known_anchors; i++) { + if (g_anchor_addrs[i] == addr) return i; + } + if (g_num_known_anchors < NUM_ANCHORS) { + int idx = g_num_known_anchors++; + g_anchor_addrs[idx] = addr; + Serial.printf("[uwb_tag] Mapped anchor %04X → A%d\r\n", addr, idx); + return idx; + } + return -1; /* more anchors than expected */ +} + +/* ── E-Stop ─────────────────────────────────────────────────────── */ + +static bool g_estop_active = false; static uint32_t g_estop_last_tx = 0; static void estop_check(void) { bool pressed = (digitalRead(PIN_ESTOP) == LOW); if (pressed && !g_estop_active) { - /* Just pressed — enter e-stop */ g_estop_active = true; Serial.println("+ESTOP:ACTIVE"); } if (g_estop_active && pressed) { - /* While held: send e-stop at 10 Hz */ if (millis() - g_estop_last_tx >= 100) { - espnow_send(MSG_ESTOP, 0xFF, 0, 0.0f); + EspNowPacket pkt = {}; + pkt.magic[0] = ESPNOW_MAGIC_0; + pkt.magic[1] = ESPNOW_MAGIC_1; + pkt.tag_id = TAG_ID; + pkt.msg_type = MSG_ESTOP; + pkt.flags = 0x01; + pkt.seq_num = g_seq++; + pkt.timestamp_ms = millis(); + esp_now_send(broadcast_mac, (uint8_t *)&pkt, sizeof(pkt)); g_estop_last_tx = millis(); } } if (!pressed && g_estop_active) { - /* Released: send 3x clear packets, resume */ for (int i = 0; i < 3; i++) { - g_estop_active = false; /* clear flag before sending so flags=0 */ - espnow_send(MSG_ESTOP, 0xFF, 0, 0.0f); + EspNowPacket pkt = {}; + pkt.magic[0] = ESPNOW_MAGIC_0; + pkt.magic[1] = ESPNOW_MAGIC_1; + pkt.tag_id = TAG_ID; + pkt.msg_type = MSG_ESTOP; + pkt.flags = 0x00; /* clear */ + pkt.seq_num = g_seq++; + pkt.timestamp_ms = millis(); + esp_now_send(broadcast_mac, (uint8_t *)&pkt, sizeof(pkt)); delay(10); } g_estop_active = false; @@ -269,18 +183,17 @@ static void estop_check(void) { } } -/* ── OLED display update (5 Hz) ─────────────────────────────────── */ +/* ── OLED display (5 Hz) ────────────────────────────────────────── */ -static uint32_t g_display_last = 0; +static uint32_t g_disp_last = 0; static void display_update(void) { - if (millis() - g_display_last < 200) return; - g_display_last = millis(); + if (millis() - g_disp_last < 200) return; + g_disp_last = millis(); display.clearDisplay(); if (g_estop_active) { - /* Big E-STOP warning */ display.setTextSize(3); display.setTextColor(SSD1306_WHITE); display.setCursor(10, 4); @@ -301,7 +214,7 @@ static void display_update(void) { min_range = g_anchor_range_mm[i]; } - /* Line 1: Big distance to nearest anchor */ + /* Line 1: Big distance */ display.setTextSize(3); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); @@ -318,16 +231,15 @@ static void display_update(void) { /* Line 2: Both anchor ranges */ display.setTextSize(1); display.setCursor(0, 30); - for (int i = 0; i < NUM_ANCHORS && i < 2; i++) { + for (int i = 0; i < NUM_ANCHORS; i++) { if (g_anchor_range_mm[i] > 0) { - float m = g_anchor_range_mm[i] / 1000.0f; - display.printf("A%d:%.1fm ", i, m); + display.printf("A%d:%.1fm ", i, g_anchor_range_mm[i] / 1000.0f); } else { display.printf("A%d:--- ", i); } } - /* Line 3: Connection status */ + /* Line 3: Link status + RSSI bars */ display.setCursor(0, 42); bool any_linked = false; for (int i = 0; i < NUM_ANCHORS; i++) { @@ -338,7 +250,6 @@ static void display_update(void) { } if (any_linked) { - /* RSSI bar: map -90..-30 dBm to 0-5 bars */ float best_rssi = -100.0f; for (int i = 0; i < NUM_ANCHORS; i++) { if (g_anchor_rssi[i] > best_rssi) best_rssi = g_anchor_rssi[i]; @@ -346,7 +257,6 @@ static void display_update(void) { int bars = constrain((int)((best_rssi + 90.0f) / 12.0f), 0, 5); display.print(F("LINKED ")); - /* Draw signal bars */ for (int b = 0; b < 5; b++) { int x = 50 + b * 6; int h = 2 + b * 2; @@ -356,101 +266,56 @@ static void display_update(void) { else display.drawRect(x, y, 4, h, SSD1306_WHITE); } - display.printf(" %.0fdB", best_rssi); + display.printf(" %.0f", best_rssi); } else { display.println(F("LOST -- searching --")); } - /* Line 4: Uptime */ + /* Line 4: Uptime + seq */ display.setCursor(0, 54); uint32_t secs = now / 1000; - display.printf("UP %02d:%02d seq:%d", secs / 60, secs % 60, g_seq); + display.printf("UP %02d:%02d pkt:%d", secs / 60, secs % 60, g_seq); display.display(); } -/* ── DS-TWR initiator (one anchor, one cycle) ───────────────────── */ +/* ── DW1000Ranging callbacks ────────────────────────────────────── */ -static int32_t twr_range_once(uint8_t anchor_id) { +static void newRange(void) { + uint16_t addr = DW1000Ranging.getDistantDevice()->getShortAddress(); + float range = DW1000Ranging.getDistantDevice()->getRange(); + float rxPow = DW1000Ranging.getDistantDevice()->getRXPower(); - /* --- 1. TX POLL --- */ - uint8_t poll[POLL_FRAME_LEN]; - poll[0] = FTYPE_POLL; - poll[1] = TAG_ID; - poll[2] = anchor_id; + if (range < 0.0f || range > 250.0f) return; - dwt_writetxdata(POLL_FRAME_LEN - FCS_LEN, poll, 0); - dwt_writetxfctrl(POLL_FRAME_LEN, 0, 1); + int idx = anchor_index(addr); + int32_t range_mm = (int32_t)(range * 1000.0f + 0.5f); - dwt_setrxaftertxdelay(300); - dwt_setrxtimeout(RESP_RX_TIMEOUT_US); - - g_tx_done = g_rx_ok = g_rx_err = g_rx_to = false; - if (dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED) != DWT_SUCCESS) - return -1; - - uint32_t t0 = millis(); - while (!g_tx_done && millis() - t0 < 15) yield(); - - uint8_t poll_tx_raw[5]; - dwt_readtxtimestamp(poll_tx_raw); - uint64_t T_poll_tx = ts_read(poll_tx_raw); - - /* --- 2. Wait for RESP --- */ - t0 = millis(); - while (!g_rx_ok && !g_rx_err && !g_rx_to && millis() - t0 < 60) yield(); - if (!g_rx_ok || g_rx_len < FRAME_HDR + RESP_PAYLOAD) return -1; - if (g_rx_buf[0] != FTYPE_RESP) return -1; - if (g_rx_buf[2] != TAG_ID) return -1; - if (g_rx_buf[1] != anchor_id) return -1; - - uint8_t resp_rx_raw[5]; - dwt_readrxtimestamp(resp_rx_raw); - uint64_t T_resp_rx = ts_read(resp_rx_raw); - - uint64_t T_poll_rx_a = ts_read(&g_rx_buf[3]); - uint64_t T_resp_tx_a = ts_read(&g_rx_buf[8]); - - /* --- 3. Compute DS-TWR values for FINAL --- */ - uint64_t Ra = ts_diff(T_resp_rx, T_poll_tx); - uint64_t Db = ts_diff(T_resp_tx_a, T_poll_rx_a); - - uint64_t final_tx_sched = (T_resp_rx + FINAL_TX_DLY_TICKS) & ~0x1FFULL; - uint64_t Da = ts_diff(final_tx_sched, T_resp_rx); - - /* --- 4. TX FINAL --- */ - uint8_t final_buf[FINAL_FRAME_LEN]; - final_buf[0] = FTYPE_FINAL; - final_buf[1] = TAG_ID; - final_buf[2] = anchor_id; - ts_write(&final_buf[3], Ra); - ts_write(&final_buf[8], Da); - ts_write(&final_buf[13], Db); - - dwt_writetxdata(FINAL_FRAME_LEN - FCS_LEN, final_buf, 0); - dwt_writetxfctrl(FINAL_FRAME_LEN, 0, 1); - dwt_setdelayedtrxtime((uint32_t)(final_tx_sched >> 8)); - - g_tx_done = false; - if (dwt_starttx(DWT_START_TX_DELAYED) != DWT_SUCCESS) { - dwt_forcetrxoff(); - return -1; + if (idx >= 0) { + g_anchor_range_mm[idx] = range_mm; + g_anchor_rssi[idx] = rxPow; + g_anchor_last_ok[idx] = millis(); } - t0 = millis(); - while (!g_tx_done && millis() - t0 < 15) yield(); - /* --- 5. Local range estimate (debug) --- */ - uint8_t final_tx_raw[5]; - dwt_readtxtimestamp(final_tx_raw); - /* uint64_t T_final_tx = ts_read(final_tx_raw); -- unused, tag uses SS estimate */ + /* Serial debug */ + Serial.printf("+RANGE:%d,%04X,%ld,%.1f\r\n", + (idx >= 0 ? idx : 99), addr, (long)range_mm, rxPow); - double ra = ticks_to_s(Ra); - double db = ticks_to_s(Db); - double tof = (ra - db) / 2.0; - double range_m = tof * SPEED_OF_LIGHT; + /* ESP-NOW broadcast */ + espnow_send(MSG_RANGE, (uint8_t)(idx >= 0 ? idx : 0xFF), range_mm, rxPow); - if (range_m < 0.1 || range_m > 130.0) return -1; - return (int32_t)(range_m * 1000.0 + 0.5); + /* LED blink */ + digitalWrite(PIN_LED, HIGH); + delay(1); + digitalWrite(PIN_LED, LOW); +} + +static void newDevice(DW1000Device *device) { + Serial.printf("+NEW:%04X\r\n", device->getShortAddress()); +} + +static void inactiveDevice(DW1000Device *device) { + Serial.printf("+GONE:%04X\r\n", device->getShortAddress()); } /* ── Setup ──────────────────────────────────────────────────────── */ @@ -459,18 +324,16 @@ void setup(void) { Serial.begin(SERIAL_BAUD); delay(300); - /* E-Stop button */ pinMode(PIN_ESTOP, INPUT_PULLUP); pinMode(PIN_LED, OUTPUT); digitalWrite(PIN_LED, LOW); - Serial.printf("\r\n[uwb_tag] tag_id=0x%02X num_anchors=%d starting\r\n", - TAG_ID, NUM_ANCHORS); + Serial.printf("\r\n[uwb_tag] tag_id=0x%02X starting\r\n", TAG_ID); - /* --- OLED init --- */ + /* OLED */ Wire.begin(PIN_SDA, PIN_SCL); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { - Serial.println("[uwb_tag] WARN: SSD1306 not found — running headless"); + Serial.println("[uwb_tag] WARN: SSD1306 not found"); } else { display.clearDisplay(); display.setTextSize(2); @@ -479,137 +342,70 @@ void setup(void) { display.println(F("SaltyBot")); display.setTextSize(1); display.setCursor(0, 20); - display.printf("Tag 0x%02X v2.0", TAG_ID); + display.printf("Tag 0x%02X", TAG_ID); display.setCursor(0, 35); - display.println(F("DW3000 DS-TWR + ESP-NOW")); + display.println(F("DW1000 200m + ESP-NOW")); display.setCursor(0, 50); - display.println(F("Initializing...")); + display.println(F("Searching anchors...")); display.display(); - Serial.println("[uwb_tag] OLED ok"); } - /* --- ESP-NOW init --- */ + /* ESP-NOW */ WiFi.mode(WIFI_STA); WiFi.disconnect(); - /* Set WiFi channel to match anchors (default ch 1) */ esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE); - - if (esp_now_init() != ESP_OK) { - Serial.println("[uwb_tag] FATAL: esp_now_init failed"); - for (;;) delay(1000); + if (esp_now_init() == ESP_OK) { + esp_now_peer_info_t peer = {}; + memcpy(peer.peer_addr, broadcast_mac, 6); + peer.channel = 0; + peer.encrypt = false; + esp_now_add_peer(&peer); + Serial.println("[uwb_tag] ESP-NOW tx ok"); + } else { + Serial.println("[uwb_tag] WARN: ESP-NOW failed"); } - /* Add broadcast peer */ - esp_now_peer_info_t peer = {}; - memcpy(peer.peer_addr, broadcast_mac, 6); - peer.channel = 0; /* use current channel */ - peer.encrypt = false; - esp_now_add_peer(&peer); - Serial.println("[uwb_tag] ESP-NOW ok"); + /* DW1000 */ + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI); + DW1000Ranging.initCommunication(PIN_RST, PIN_CS, PIN_IRQ); - /* --- DW3000 init --- */ - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); + DW1000Ranging.attachNewRange(newRange); + DW1000Ranging.attachNewDevice(newDevice); + DW1000Ranging.attachInactiveDevice(inactiveDevice); - pinMode(PIN_RST, OUTPUT); - digitalWrite(PIN_RST, LOW); - delay(2); - pinMode(PIN_RST, INPUT_PULLUP); - delay(5); + DW1000Ranging.startAsTag(TAG_ADDR, DW1000.MODE_LONGDATA_RANGE_ACCURACY); - if (dwt_probe((struct dwt_probe_s *)&dw3000_probe_interf)) { - Serial.println("[uwb_tag] FATAL: DW3000 probe failed"); - for (;;) delay(1000); - } - - if (dwt_initialise(DWT_DW_INIT) != DWT_SUCCESS) { - Serial.println("[uwb_tag] FATAL: dwt_initialise failed"); - for (;;) delay(1000); - } - - if (dwt_configure(&dw_cfg) != DWT_SUCCESS) { - Serial.println("[uwb_tag] FATAL: dwt_configure failed"); - for (;;) delay(1000); - } - - dwt_setrxantennadelay(ANT_DELAY); - dwt_settxantennadelay(ANT_DELAY); - dwt_settxpower(0x0E080222UL); - - dwt_setcallbacks(cb_tx_done, cb_rx_ok, cb_rx_to, cb_rx_err, - nullptr, nullptr, nullptr); - dwt_setinterrupt( - DWT_INT_TXFRS | DWT_INT_RFCG | DWT_INT_RFTO | - DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_ARFE | DWT_INT_CPERR, - 0, DWT_ENABLE_INT_ONLY); - - attachInterrupt(digitalPinToInterrupt(PIN_IRQ), - []() { dwt_isr(); }, RISING); - - /* Init range state */ + /* Init state */ for (int i = 0; i < NUM_ANCHORS; i++) { g_anchor_range_mm[i] = -1; g_anchor_rssi[i] = -100.0f; g_anchor_last_ok[i] = 0; } - Serial.printf("[uwb_tag] DW3000 ready ch=%d 6.8Mbps tag=0x%02X\r\n", - dw_cfg.chan, TAG_ID); - Serial.println("[uwb_tag] Ranging + ESP-NOW + display active"); + Serial.println("[uwb_tag] DW1000 ready MODE_LONGDATA_RANGE_ACCURACY"); + Serial.println("[uwb_tag] Ranging + display + ESP-NOW active"); } -/* ── Main loop ──────────────────────────────────────────────────── */ +/* ── Loop ───────────────────────────────────────────────────────── */ + +static uint32_t g_last_hb = 0; void loop(void) { - static uint8_t anchor_idx = 0; - static uint32_t last_range_ms = 0; - static uint32_t last_hb_ms = 0; - - /* E-Stop always has priority */ + /* E-stop always first */ estop_check(); - if (g_estop_active) { - display_update(); - return; /* skip ranging while e-stop active */ - } - /* Heartbeat every 1 second */ - uint32_t now = millis(); - if (now - last_hb_ms >= 1000) { + /* Heartbeat every 1s */ + if (millis() - g_last_hb >= 1000) { espnow_send(MSG_HEARTBEAT, 0xFF, 0, 0.0f); - last_hb_ms = now; + g_last_hb = millis(); } - /* Ranging at configured interval */ - if (now - last_range_ms >= RANGE_INTERVAL_MS) { - last_range_ms = now; - - uint8_t anchor_id = anchor_idx % NUM_ANCHORS; - int32_t range_mm = twr_range_once(anchor_id); - - if (range_mm > 0) { - float rssi = rx_power_dbm(); - - /* Update shared state for display */ - g_anchor_range_mm[anchor_id] = range_mm; - g_anchor_rssi[anchor_id] = rssi; - g_anchor_last_ok[anchor_id] = now; - - /* Serial debug */ - Serial.printf("+RANGE:%d,%ld,%.1f\r\n", - anchor_id, (long)range_mm, rssi); - - /* ESP-NOW broadcast */ - espnow_send(MSG_RANGE, anchor_id, range_mm, rssi); - - /* LED blink */ - digitalWrite(PIN_LED, HIGH); - delay(2); - digitalWrite(PIN_LED, LOW); - } - - anchor_idx++; - if (anchor_idx >= NUM_ANCHORS) anchor_idx = 0; + /* DW1000Ranging handles TWR internally — + calls newRange() callback when range is available */ + if (!g_estop_active) { + DW1000Ranging.loop(); } - /* Display at 5 Hz (non-blocking) */ + /* Display at 5 Hz */ display_update(); } diff --git a/lib/DW1000/LICENSE.md b/lib/DW1000/LICENSE.md new file mode 100644 index 0000000..4b795af --- /dev/null +++ b/lib/DW1000/LICENSE.md @@ -0,0 +1,176 @@ +Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/lib/DW1000/README.md b/lib/DW1000/README.md new file mode 100644 index 0000000..e58ab2e --- /dev/null +++ b/lib/DW1000/README.md @@ -0,0 +1,174 @@ +# arduino-dw1000 + +![Maintenance](https://img.shields.io/maintenance/no/2019.svg) +![Required know-how](https://img.shields.io/badge/Required%20know--how-professional-red.svg) +![Additional hardware required](https://img.shields.io/badge/Additional%20hardware-required-orange.svg) +![c++11](https://img.shields.io/badge/C%2B%2B-11-brightgreen.svg) +[![releases](https://img.shields.io/github/release/thotro/arduino-dw1000.svg?colorB=00aa00)](https://github.com/thotro/arduino-dw1000/releases) +![min arduino ide](https://img.shields.io/badge/ArduinoIDE-%3E%3D1.6.10-lightgrey.svg) +[![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/thotro/arduino-dw1000/master/LICENSE.md) + +A library that offers basic functionality to use Decawave's DW1000 chips/modules with Arduino +(see https://www.decawave.com/products/dwm1000-module). + +Project state +------------- + +**Development:** +There is **no active development** by the owner *thotro*. + +This library is currently (2019) **not actively maintained**. + +Anyway you can create pull requests if you found a bug or developed a new feature. They maybe help others. + +**TODOs:** +* Fill wiki: https://github.com/thotro/arduino-dw1000/wiki +* MAC and frame filtering, error handling +* Sleep/power optimizations +* Refactor `DW1000Mac` +* Refactor `DW1000Ranging` +* Refactor `DW1000Device` +* Update examples (complete todos in header notice) + +**What can I do with this lib?:** +Stable transmission of messages between two modules is possible. The code for device tuning is working as well, hence different modes of operation can be chosen. As frame filtering (i.e. via MAC conforming messages) is partially implemented yet, internal features of the chip for node addressing and auto-acknowledgement of messages can not be used. This is part of a future milestone. For now, if acknowledgements are required, they have to be sent manually and node addresses have to be encoded in the message payload and processed by the host controller. + +**General notice:** +* The documentation https://github.com/thotro/arduino-dw1000/tree/master/extras/doc is manually generated and maybe out of date. +* Datasheet and application notices are available at https://www.decawave.com/ (require free registration). + +Installation +------------ + +**Requires c++11 support**, Arduino IDE >= 1.6.6 support c++11. + + 1. Get a ZIP file of the master branch or the latest release and save somewhere on your machine. + 2. Open your Arduino IDE and goto _Sketch_ / _Include Library_ / _Add .ZIP Library..._ + 3. Select the downloaded ZIP file of the DW1000 library + 4. You should now see the library in the list and have access to the examples in the dedicated section of the IDE + +Note that in version 1.6.6 of your Arduino IDE you can get the library via the Arduino library manager. + +Contents +-------- + + * [Project structure](../../wiki/Project-structure) + * [Features and design intentions](../../wiki/Features) + * [Testbed and Adapter board](../../wiki/Testbed-and-Adapter-board) + * [Projects, Media, Links](../../wiki/Projects) + * [Benchmarks](../../wiki/Benchmarks) + * API docs + * [HTML](https://cdn.rawgit.com/thotro/arduino-dw1000/master/extras/doc/html/index.html) + * [PDF](https://cdn.rawgit.com/thotro/arduino-dw1000/master/extras/doc/DW1000_Arduino_API_doc.pdf) + +Usage +----- + +General usage of the DW1000 library is depicted below. Please see the Arduino test example codes (described in the [project structure](../../wiki/Project-structure)) for more up-to-date and operational reference usage. + +At the moment the library contains two types: + * **DW1000:** + State: stable. + The statically accessible entity to work with your modules. Offers a variety of configuration options and manages module states and actions. + + * **DW1000Time:** + State: stable. + Container entities that handle DW1000 specific timing values. These are required to allow accurate timestamps and time based computations; they aid in avoiding potential precision and capacity problems of standard number formats in Arduino and basically are wrapper objects for 64-bit signed integer data types; most importantly they take care of all bit-to-time-and-distance (and vice versa) conversions. + + * **DW1000Ranging:** + State: prototype. + Contain all functions which allow to make the ranging protocole. + + * **DW1000Device:** + State: prototype. + Contain all informations (long address, short ephemeral address, DW1000Time of transition) about a distant device (anchor or tag) on the same network. + + * **DW1000Mac:** + State: prototype. + This class is a child of the DW1000Device class and allow to generate the MAC frame for his DW1000Device parent. + + +```Arduino +#include +... +// init with interrupt line and optionally with reset line +DW1000.begin(irq_pin[, rst_pin]); +// select a specific chip via a chip select line +DW1000.select(cs_pin); +// or use DW1000.reselect(cs_pin) to switch to previously selected chip +... +// open a device configuration sessions +DW1000.newConfiguration(); +// configure specific aspects and/or choose defaults +DW1000.setDefaults(); +DW1000.setDeviceAddress(5); +DW1000.setNetworkId(10); +// modes that define data rate, frequency, etc. (see API docs) +DW1000.enableMode(DW1000.MODE_LONGDATA_RANGE_LOWPOWER); +// ... and other stuff - finally upload to the module. +DW1000.commitConfiguration(); +... +// set some interrupt callback routines +DW1000.attachSentHandler(some_handler_function); +DW1000.attachReceivedHandler(another_handler_function); +... +// open a new transmit session +DW1000.newTransmit(); +// configure specific aspects and/or choose defaults +DW1000.setDefaults(); +DW1000.setData(some_data); +DW1000Time delayTime = DW1000Time(100, DW1000Time::MILLISECONDS); +[DW1000Time futureTimestamp = ]DW1000.setDelay(delayTime); +// ... and other stuff - finally start the transmission +DW1000.startTransmit(); +... +// similar for a receiving session, like so ... +DW1000.newReceive(); +DW1000.setDefaults(); +// so we don't need to restart the receiver manually each time +DW1000.receivePermanently(true); +// ... and other stuff - finally start awaiting messages +DW1000.startReceive(); +... +``` + +Dependency +---------- + +Disclaimer: +This is maybe a incomplete list. Please notice that some dependency libraries may **require** a **reproduction** of copyright and license, **even if they are shipped as binary!!** + +* **Arduino.h** + + * From: Arduino IDE / target specific + * License: (target: Arduino) GNU Lesser General Public License 2.1 + +* **SPI.h** + + * From: Arduino IDE / target specific + * License: (target: Arduino) GNU Lesser General Public License 2.1 + +* **stdint.h** + + * From: Arduino IDE / Compiler and target specific + * License: different + +* **stdio.h** + + * From: Arduino IDE / Compiler and target specific + * License: different + +* **stdlib.h** + + * From: Arduino IDE / Compiler and target specific + * License: different + +* **string.h** + + * From: Arduino IDE / Compiler and target specific + * License: different + + +License +------- +Apache License 2.0 (see [LICENSE.md](https://github.com/thotro/arduino-dw1000/blob/master/LICENSE.md)) diff --git a/lib/DW1000/adapterBoard/AdapterBoardTestBed.png b/lib/DW1000/adapterBoard/AdapterBoardTestBed.png new file mode 100644 index 0000000000000000000000000000000000000000..d7341d993004244116566fee67ade84ed94676b5 GIT binary patch literal 166674 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 z z_S)Jr`|0=SlP(H2(3vvjDJh{1m8Q!JY*ZP2-8CF0K05+% z$*65n|0{9WK=y&J8$PRimnwODq?E z(X(C^UmLTT7h8B_+7oTG@hhg|2inE?k{PA_Z+u2$0nlljX z;P6nxcU(4p153D0aJSfZKeAM)~MS~EBY(^@{$Bs{~kr4kGfQ-#QmS2+s$h8Y|nLMi=?|=+XGV_1`4Eu9M~S);QsGcHaMqwj#Xa z+~=Gv>Oy!chTYWj9YM;OJT_eQ!R8?zChAf5O=xk@L`2kt$yXF*k0ZWGl;pm;uTu0U zBIw)wCRvM@PRQ%k6gNh4BoW)2G8{dD6Y(ruT(S$dbUezMxy;04Us*c$ISoojp*sMTAu8C2mrs``26f_J$D%d8~J|h`qcu4JxuX- zKpjv_wSf3B@@uI*csa^Q^K#-QCM>4^2pB#zFzDfbuqH5gl-|ib-33w)*oQtnezho! zFXpjLm<9gE5hu|Q^9K4I%O9ywRH71sJicmJ=$lVyJML0<@}U03@b}4PYo9C%;)15L z@v&i;bRMtnZ{-z;edz!)G2`Is;o07-U6rDw_CfQ1Z34%+dWV`R0FCDG==U`^yY zva7WPy6o{dF}=V!d+)is5WNlV2&rX#kub&{b4V-Da?PrHJg!kt5oWNwtBsu$D5+_s ze|0yg$p@3jI|BRKH5rN-e-Z8B8=*I{dqeQbN=Ls>Vu$9*Avk*Tw^|--Y*CTUdRb0K z$>e_gOpAlp7PcImy}i!~@y6cD@O%4QcRsG7F{O_WzPV;o zXwE1+?t-(go9N>vVM>4VOY8XS)>iaUI?6o4n4BERET0p8b6&kJh>~?d78tfSk;zRN zx*XG@HD6qJxsoO@uO74R?lC}Y|L)#nzLsD;`F%3pK7sMSy z*a9S{y_H1u{L0E(Pz1DHu5wpH(hEu`SR;1;xS58QR$vU35Xx$n_zE&aVZP**mMV^= zWYtM0;f5``G=aSE>(veHpuo;zod%`Yc#YRiI#r}hcNj_R^QUd>?36c8Jzl)P9mw%y zOLhh=iKf+XjcNM(God?b*`kcXXtoW+At}U2IJ=o?>2)%C#tSon|fjRNeA$Di%_%Cv9b8$m)$qEwU4#$ zxWGON+>j#Q6Ou;MEG3@y73;N@@$vD|Zo6Psk8A*Rm}N<+uBEt`d6j}ZMxN23;?H(> z*VQ;&rN-3}cEe^8r5mjbCXlY0qSb}kTp8hq zEdBbGT1TN6kxUx?U^A`e&omv=!@bM?7&JB9dsHUdZ3r1fj~r~1bzIf zH=ewPBlrDJS8()b2LS|XO9md>-8X+fzPdQBYmQ7=3k`gfrMmnXZ$MA(5oT-t4<3Om z&CSbz2WZz<1A^RG)-VFhY$>=Bm0gYlegrM?HJTC>J~i)69gbU9(oauV7JkFPx>OVT zmAm=@#ZBj#F2rV}H9+;iq##NavDE9aB6llf$LrwEcAciC@VHqJSQ?P7HX^46K!wpFp+=Ju>KivO)cob&LP;iYjKH6q(UR3b1`7#r_AMO zIv3S|#reN%-t(pNuWg@zn9Fsz;e?6yRk?`lDU_V%E2qS&fV3LnC&e``!9Le?O7SnYpAKqE@BWIaKsoYJUjb6roaDLfsGLdG0iO zT^V})OA}4Tz|{4~r_V|l%1L29-llm&WE)gyQG`sBv_40&^#X>8ISme#X(j4I~%GguLF z?|)bI$kjo$I<0!M#egKGd|&otdnVEKuJZixG9(sV{P^cL)EpUHvS6yABk=%Q^O6^_ zw9{aoT;a_gopj#07Q=ME;vJdCw;Vm4Uq{|%xhc9%A>VEE>u4*1J$e6|X6ClM*!KBQ z<5xMg$f&3>iyfi{d(kJet2zL0cR;WigXUEiF6b%=>D(UwtV#G*hfnWc@`_%ctr(>9 zs7}J&fgs@0nPLtFi|iaAYG*hGlLuY`SxDNyhDxE$j*erX!QNx2OT~Rd?B}~I@Wf%A zTiA40YKYF_b#Tv-V)$M`61AV$vQuOJ$I_{3`=ROEThHU}flciDC-VOHf3zjxRLM56 zq-YH%Kgr4@N|h{9XHS98x4kxq=;`=l5jMD*;2eLKuhQ+eyQspCIAuf;#(0B^2sM6u zt&x#YMoKx*H$_B5=&SSIncFW_^C_LnD=J2WM_J9(Ek#KcJV+;04(%S{=*^*x{XM5; z^qxf8UXx!M)Bl3(r&(eg@!D*4B?eb--e*8jO!Wi8Oj zx}&{am@;SWz|W@a+8XKje_R0JK4WV>CIU$c%SH~oM)@lCEpEcDjlJNN-H1)C;o#F( zVb}vDHva_V(k=gPtxQo_<^pdjO3opu17%=C1cX4~Ut$E(XT)>;{$(7br@qKx@L>@venvuS%^owVPt ziPAeKp7CBL&BCjmfcw!C^`yrF37t!2?gvSE|FeM)He>k}||eG<@nwl&68alQt1u!H6RXtYf`14`s#!1v_Xa1%BQbY`A{1XiX2@^3^1!F;7*_= zGN&pwY=7}h8{X9SUL{u}#>^zdEU`2bykiw4eSU{2-G`-IFGK&{YNXnDe$j`W#R876k_B-3X+#S@`Fc?@IBBx>PJh5oB#y}&1 z_^|V)g@<&^9}OnOB%Bt+FSo6wI*U{@_aOIjaWE1Hpn%u@{Ot`*QHPqjw3Sfrp_SDx8D5CD`D*wM*isf+wN1BZ-&ZP~f9t?`aD5HZ!`F9X5 z9a&SuH|9CO@KWzhE53{JvN9k@&%Tqs z>SxYP5+77qPfUMcy;PLxn9#BS6yylzoIWo}Mf*;y8@GQ#9CB)It%D$3Qp917ca&w- zJgS+=neK;_eV9ypV9f;S0=zyR61Lx_==pTld`Cj5NI9{-ZT^84XA%zn7B%y;p$Zu@ zGf7w1EEXBC2@H{QiI*9{DZ8rJ?Y zt2JaqXtPcktMj! zYqu4nN=pMf&4R`(gQ3m%;z(zD zeeLnZ&k4h_dP0oPZC6`u=0KRA{^&#tn)nFrO2Sv5qSzaiAwYd=pCJ&Uy~ci^wgzbb z05@3vdv(yye7dRbUske_`5Q8!7o^xFY<$H(yHMjq24uPiVMR&Y4-42^RpaC9FtrRO ziWpU`b?iYrbKh&Ga}O%(eE(fu2vKpv@#`(2&7S;Ua;V@w3JT~;U??V_!0XUkR6J%K zn6TSphSj7Xb%y|&2p=psG*#RohI;|wsURW*`Vy#H%$Iv&fV2;M-Xa(#`Ww?_iqRgtXQC5b3PELSMiJ;u3-2WLw(DAG` zq5)x+YHlqu#>Ktb9cjo8WKHNa8x@Y&3tB+HH%dVQhP-l!Mt7vSbvlFMO-gJmr1>je z03HF^7d)Yio;oYm19x z7MO6DsD3s~IqyEMD(pZZasNwqES`|U=R9F$5ltbYzn}cfhDyGa%UfA7LONiugoB)% zoI#TZ=WR|S227R-P(odYG2r?TlHGYh;f4Tdwn2*I%L7aC<7tch+Sb!u_R7)0nu=gp z4DhszRNCQAU^bPNm7(frbJ*o9mXvNjhOaIE-8)Q3>;T&&=&%8#gNiX^#N5VjuHQWn zTTY5IJ&FB;`%l8|`wM9*CcG}_`-8zy=k5v6FDIs^mP?Csh-v&g|LH*wf_@6HU9k8V z{r)`$!0!JkEX0o{wDXspyjYqaLHd!eH6gc9^~U7{kM2(c3Ct zc#c;@@t*SY_0XbV7(C^fee0B`_-Q?Kt^AsbSzEj)2zZQjjjGoEa?b z;B^F{GLIODUr*Y0!yMW7^gr=TD4bFn*`T@gvx#SEv-5p1!IuEC``_-_*WE!^ra(yI z8uMb2ZahqQ*LCK(MruA5bHXC}2@4JJl4R7+SIR(;Y43EHzfW3%T06ThdoA!)IHD_^rvF|NkuOKn6|<3d-zq>fjvstpi&+?v&%{FFCKeU=9joH`+(S>C z3H|b5m>&67;HGlpt+NjyEEVk1zxh)ujPb3}Z_hjHe{E^cZ*_e8@cJtXYQi}(ml|i? z^}M(BI3X|OSjxCD3`K^?6lj-1HDG0ZDp8#l zl6m~&P?|NV%S8egP%=iep`(R_gfuM2iplbONQBe(whQ+V#?))8+UR1*ym4+J6#oIAh6f%#12I6)r`D=c>#OIY@`HEP&5n z=jhha=%#zVJ^8=0iTKjUZtUE#pK)Rl>q~?CR5!5=k-!iMZ2w8N4B5evseeFP6V**m zeJ2s>HvZ_IF~&O)C<;6f`j-OPAYmSSdXsIFo%gLSNE%PA1#Tm|ehj;%t3Vh6-D25| zss5bgG^IZfL2J+J)c*4O%Rj%o7tc=o6tRpYpJZHQOVjPu2)@^I(Ij1{t~KDW;jMcN zK%qIwG#7qI{MEokt=9udk8j7;KW>LB=4Ws1iY zWxsRpo)av#CGHTdMv?7LpUyu6s^PoAXrR!TRH>i81c8D?Zr}GP+8ej9Wxh33=#|?u zQ=kTEGN^ieiARo#8(IcRYx2@@G@;Ud1|0C<8GE(!mrNGTS!pXH-KyQm20z(p z(wuR2fs2qQZSBiTt%!Y`AmhkyIz4nm%6#rFH=6M>?yH9nV)(f>_q!2YWBW_Kvsyy~ZKY>$c(p0)vEqmCZ}xIBkbq z^WEQ5Iuh(?4SxICkzaiNmUXPUnn9{`NmW(Y_$Epq<_8(goty4U%u;6&`97CmL-b$D zu1Y!|7On5z>-oCv%H&dE`4#}bhHbV>4 zDSgExLQsNHNawv_YdUq&FLq5&NWc*5545svoQNEY8FBbB&GkWAGW(4Z)(7b;CAWPG z@kfM_!8Ydc^a6J@v(<{(=F&>v#O10_&{NzrU+Rh|^S@7Xu-tj#$1R#czu*%4)WoJ* zwA%Nmz?pTLojJ^6n0B%DmDAt>!$CYlgq+X8IrKGyjYfk4)_Xd|q zCKZk<-C+S(vmBiMD$&17aM`>?no@Oz9jRPgwiYRWXWQ$fZOn7Oj<4x4vC#Y~ysK?(K;`ee!}9PPl# z+=t-a>rm$kyRF?s5#5uLlNTW;EdIc6bR4BZBL!~?RAb`nH~t2;V4G%b_jz~3%1ZWB zOb%AJ*s=vto+~21#9Uf1sF(jA|0K!F%V0;rOsvJs$nu<0P@mj!17i4p3LKzOj`CL; z1v7~fG*hTrgJPpBJJf6J8DF|(BXO>7Q3ns1evO|dIr5t7xWy7=8BLonB-FHBD@Y$z z38o_mYDX&=E15=CJMSAxn2Z)L56Dt5k+haJz-lvT&Y4W1+M67K6SJ=MNu7@}Ca`ET zdPnQNZ?cYws=)6I6((IoTgxtaS%?i2y%-5mM(M*LS&C;J-BqD?1}XkML%7u1Tg$Aj zaTR)4Sx9Qqvn@BGXp=WI(M&CP>!{BNdo!enYvh)!mGW)R#fMt`ZmBS__XHwqE2lqR zjMVf#-+M21@P4DmM^i^Do>!e^rSms|38CzhuRjwfBN*B5Qj?_qSa1JLaK*eMlIUSA znNsP?VnHWGIU2Q8+w#O^X`1=@&L^|8Yj?k>cmZ+riXdp=UfpYC8#v(z39pZ>&D zNOJZ{+;<_b&V$qV>`mFts;s^5f7}1vqo7dy*R1CdtSlEQL`1_(u=JVviRF*-!CkSC z#v8kz>t@d~a8!em+4Yy8mU^V7h7U(CU=9XBaNW+_$HB;cl%5qt-!-k*pE~^nXQTF$ zwts)^WWo;;D}aM9r#!)h_G^!H zNq2V+jg;gN(%oHB2B|dC-AGFeAt*=*(m4VGN~&~AgQRqPd!G0E9S8qSFmunocU;$6 z=c4S-kGIy!ibLwdDWe8WoH^H5Iv6>POhGD+%9zr5;s6=pfJ41TrV3GbFopwF-O94XN%4+oVUw19dtZ{1-s z5Y$GYK#gk*l#zG{U{T_b{C+dxWr}$|k#?j(cg!CL3Z>~DpvPeg4FvVpr>u&X=h;m> zIUzBdL%#z(*_tov1jxXUv!};hN}5x6TmTaR^Zu8JJbuEA{YzFuM%DrzeI|d2Y5BFA z79+f~S4^bGJ#slI)&fN7>{AH4AB!G@cnT$JU(3bkJkb8aUji-vsXtN+D^ONX1Vkj9 zvm_rCOA8+dp$#O9swx)u?R-UwtzVd+C}2D}QEf5tekUFS+Pb~9D^foM5Ue6gLzNsEp+*7|c_C^%2*ig~#hE!FS~<1@%WB_=+$wo1ClPk^$= z+1c6KH4j@`CZIa3ren(8Is`Yf?Xr`pC{I%9d_*aTTj72#1-Q>NC#(e{e0R;EN44=j ze12^gTM-ujx{q8DJV)*Qb6_M~#%3K*tUaYD>{;0#idrlD4pz$uQDEXX^+?HRSn-wS zPh*YjB)V_!M^r2FWj;l3>$m^TsH*q%k<}WBY8q^*8Jwfy2{pwE6Q0ln=WL`mk>E&h znP%pFz|wrKaCh69yOCapGtQ4fI{>^{ay8}s|C%Nn7!ZGD+-Y$uc`5Ln==*uDNpbuI zg`^yNR%{Cdckg$OT z)TM8X;z{8PshGyWTv%b>gRkqLQVJ9+C-{j*2Cp|*rVNF&f>ISY|2z>V4H%NocQ(rU_vWiIdBW1IZy85ngANKFANJ#>9lnU$d=an4qWCb` zlcVp;RzT`$(f2Xl;3;*W$9hJRi)z*C8H?&4G7W=3`fZcBvFBfs?Q55Z<5N>p-^$B? zK;<@nR$!@JJ7Sd26&dGBBIj$`BRjN{kS!DF73*~Fbj1U7nCQOSSOn5_1w2gLsn0)riaLs% z=zt%6>;IqiXv}@R7FfXFfwmOj(3sTPJOJm*aUdh9uI9TrYwC)$su{5KSzx@#O2)@@+cs*(Qh9gz+!YUdf9|2d>Uz7P&BF4A2NBmv8yEC)Uo3gr2012zCib|ZDX zH9`B&>X()ppBYcE)Y;Wh0wQ5frFzVr!>C~U(s+rq-+ylen-;G`p>Z;Feh8N*B915J z3e9|oG@nI1qX6q7C?0?=qrl6Sb#i$XdMRH*P(f4e5<^xAH^jPBul#InucUt)8^lcL zk_WQ~*@oCflZk2M$LuguSQwGmL8A+ZWOLgvYtJ>rV5t?qpG_2fWTe35R?{_2!EH;0 ziBl_O4MZzgc3f0d5{yI1%$Trj{B`L!w7GhI-q4zG;dqP0jlhX$_jdYLPHt@m;K0Wa z&WiOt*CfVoy^nL$tG9HDrCUH;SUfDqiGNjbiLhG!vq&I%&sURAL?R9mJf@{8|NW?e zg5aB63~C35Vbc3Tkc><~Xv)pYLtcA8Qei#1$3_a204$XcvJ4bJeL#Uzk$e5oG*_Ll zJ8sAGrts<1O4QIFvM*s8Xf+Hk2S#59M}1acF*}HTlg%1?z43F|?PYf4Y+8Hi)WZt} z-{3bq1urD=d;~rtwiEs7=vzDS^C(6Y4dq`>?D{L;Tp&8hZydFS14X=kHNh7YSC0CG zj}F5y-b$t$KiH$B?0*w9ks$lmO-Y=3QnC=^p*5pp)(_G+D(U;fgNBYWDwvC?$lQ}J zNGoD^6hArg`+#I>@VTV{2jp#5*4n1*y@ZC80w7 zu{}1dvz0{IlT`Q6c*<~j(`O-q`FhLW2gt&wm(WLb2!Oce?RZ%G4K}haKhh&9ES|t& zbqTp1O?)xfLf@@ukEL{l#VHiUSg9ap53~LW;TygkldH{kz$+Q+mLtHIH;TqhAVOX1 zRwAMuN?;=0Vi_Z%MXAEyM6ly2KQv{qPC$$Hw8y%kE z>0aZq5dmvIOMJ{HaZjsN=&C%)alp8s5J2_hb!!~lBY~^>cai+l38!=$STfgv9A@|jDA^%z)!kt0rP6H3wITnrG8J<5J%ou3O_T!14>^B($-VQ(<9}W;Rq1IEp&c${Od-D!Dx`OX@$7E^ zL3z>vCQ-&9rM}V6QM0HPugnr=Spsoq4|oLG&fM<;`_l@6AG`^Q=%&OX2H3g@PZVX zy?7#)-1Zi6(pvi}o_Dwp@iHIJXWRZ8#CNt#z-I9C8mF#LGIh?~*Dbvqi)q?M%+ zwJ#T=;BZm@t#q3Kd6UHXCJOA?09=G|aF4m@OqRgn<~%sa@n|(oi7LCzbi``KSsjbA5bq1y3*1B09DEX#B%} zV*+CBtlaR0mEb_ygW{bd3yg`u>U#K~yLmKGGC2}8?I7zPMS>PRqd?h;a+S#!d?1TH z$ay(`*(N5>W5K-rQ|U-9nEyScf=f#=ZKzN5N$o&kda8X+dGc~kyOoB>gi8x$Qn&eE z7%dj3Y}Msi)Cb=?_#;Ma6oqh#qbr&&3{`^i^*AC7sKsjnN0EfMn)}57(xsVWUA54Q z?s>DDodPmQNI}78-`yWe@)SqqZVD4Ic}6ef{xyti^lSUjekEwy*MDvw$rW*Z;=l4! zY0}fr-v7p>ma-h-*mr)v$cuZJPv-RivR|HCcXCTnWRKXM8?!;ozRJ_p6GDd^zPY=B za|=o$RtGGrW#mKNukOU__wbk zUPB@*xkayfkKO5FU&g zS?Hhvye^Q?`n?zwX@FG_{4v=u`eUjR1M!AY$4J^uUNS20tiYt{aSh)j# z9S-r-fJ)XXXy;@FzP>tjLE6IyMI69}6={M68hq<~*iYNy!=t8yCoRJdx<(W4{eT!F z=IUvFo5M&!nXlyEwp};5G}eOq2C}7_laYocUJ(J`s#+R+O9QegnJyA@DPYUlLQ|m3 zi*L1Mvj5op+TU_obX9HmQOCE)#z%|~IQAJ%e(yx5GO9jK5)pEonH zn`ezfRfbS8Zkv{*kayU63Kt??ng7m??+WtRrC2P5?t z9@fDG-&m8nXen@)*L&<}v1cc(x?U@@6})kN2(dW`&39h7XUB5qZdQS|tlR$7$cyA0 zw)P>Jhsgv_Ma~`Ak{GPjg%jBmxo^NRvHFx)g z9S8WyC7qLRoE!s|eyLUR&D8S_dW!vB=+CCtAlAUb=50X3!uDa3=(Xhbk?_od@yWq1 zBZ*;6bm0%ytlZOID1C7-=i7OD?HZ7iv&2wod9e39C*u>^xAxJJ&C~|rlacespM?w0 zuU#^>c;zmL(c)V#PYaMB3jOJevr7G*>!!yn7GB|=jHy~{;zZpGZERxXbJB=& zsse(w2wVc}kQ%ac`}zrM!YLhtD5pJkh!7_d4M|O@__d?kF$D_s!|OxbtCQ$STIIuLe`Oee z-C%B?{5x`X(&6mah#6Vzlt!M20X+SQG#>yoRcz8K=>o4r$ythWiEgt+bpmt2`9hY8 z4M;i!LFP={u!xw^N0O3~hn3d1I0yt{@SaZ68w*g#kOCkHfLZdK)1jh3^mHGlc7QBX+8FqecOK%m$oO z`F%mYuC->h&gP{@hl&+C)oyQ3SH!{%!@QvUQxbJLYeY8-YVY(L8!3IVPFJSD105Mt zRD0QFXGw9pG;AH<#W+mtT~2X~CV_(veGX-B3@m)e&ewbt4E?;icX`>{Usup!wqew| z2TE8q|5JlrtXD!pcFQ%p&!-O1evG-m3__ohR364B3T z*PIlf#6y=oiNryCZFxvQ5dPHExzSAix|AI1zda&r_iwa@*O}fVQxj(iwlTKt?ReVk zNb>2WkCa`Rj^L009xZ+}|$jSLJ7YAMTHsDXdIghC|C z`B9Drdi*%Rh(#k($8mG9flU)QqChi^kO?`iggZg-dU0zj^<=sBW{f@vW4yZZU-U|O zYFhEj6{tv`{+7p3s87-5yHQx}@6UVK92DH%I??~5MvnN%GvSX_I89I$4s;x??6suB zj!TTHG;Io8R#=+U#u02p?o%iRBnGWiDctXwNk2x1XR`Vc&sjfffE#26 z{kqQOTJtb{#buJ&V}2lo8n^BlX+kVNDlRvHmJuw;8utMUoufBDw9;?%@uB~o&T!eq z;*Nw=wK-p2f`2@=2pytr_r9A1{vcD)rWrrN8|UrScF`Yw!eh;l=oPR1y9-0KaI0(s zoWOv-y{fhJbi9{>1jmXM$#BBM-=S|Gv9+LdN?w@6A(V)roq8fz=s63`e(sl0@Cxv{ zz4>Dt?Ff8fQdlQ8cvJXKZA_;8un-?96uiNe;%*y6lx*1hl5CUbUwOT#KgV0E;#rHB z`t^=!suSX9g(=EBI-=x746 zDv|1%Ub@I{vWKCJ$FeG}4op?QTf|{6#qf{E`h5m_fHcs{sYi`*aZmF+vrz(1M=$aJFd6yA<{)KpV zNh8uKAl}PntR1ZRx)3od238}zd4c!W zO9N}kvIRFe5?<_}wVFJ@@P-yx0BA`T+y7z~PT}q@7cHZvkw(rQwd9pAHQI1sJL=PMrR4QTnN~d>Z$E8BMESF7*$;Mqdkmkv0AJ%0p@@T$$p^MPf&dy@Y=(RR2la z^7%E~s8ZL`GEwbB z$6OPsfjT0*PXu)#Y0bq#&g%sKdwv`BId4IdES-3P;L_{F#RptHWXIACI1e*p#plM8 zek(|0MfZ-mHda(thU?1Gp;oW8d;FNdTdU>w;XC?;@t8A=r&>D6qoSY`v8~TB=HE(? zs)7c(<|OPIAsWID|Jw2y=QmO&#zAJoS`g$lg0u33^C^x^mH3S$hR(7cw7mPMAcX?7 zN`Wedm^IGj@JidgIk)QQVEdBxvIA{(am>KuM?Km+f<(uhN5R~jCn|}63D6^)MT+6@ z2Y7LWF%5R^5x9_zis-t4>5x$8*9Q-kYMa?LYlR?DxBn=O<%{;eV&i?m4}(*Yl99pT zbq{)K>CwEx5RE3g{q!}0ZsLci!;UNQ!W_1)euAPmpA^PUzAW1H&JCQc4JH$i8$c3l zDYY&%QKY4%r@y?Q0Xl!M{d9fytPVh2LGR^AF%N74NIwE=A7DQo+&hgH^Z`uk_~ayN zTrpC$Qf1bN0|bsz)#Fit?Cv{1x%L)2Xh3lzWza#DFMaUq%m~=wJQu~KHU=sK0m?tO zU5$-opuq=>-w+V;0&FDim+M(4Qf=UN6~HA8g6qU^`~h%^Sul5a{`ZGgR}^9am(55d>3cb)s^`4Vg{JeK0@*DYd2l8T5~87s}*|$r_{(mT}??H4rlAz9%}o zh8ukFRiZ!c=*DKYvcZJl)6NbFa<1|JP(};P7k_Su!7 zrM9Q*0yY%Dfd~n4#NIN{+&Yj+0xPUnGuXzhu9>yqIPDAJ8<#w?+T-kStuZb6+M60! zkBZsk84(!4rc>+&8yIv1&Il{t)GIsjnPB3ejv$j(J2J^=E%p{j_sm?B&KPE-Uihzv zk9>EXZ=?puw#N+|F}hc$Q(w?lGpZMVbOslHPr-UAlGy-UR^XD81Mwr|e5SFTa3g%< z(HumKl3SQO*FYL}#>IsLg^wU=H|&Q%^zeXA1y4@G25K9Ky_ATu2R2;L0ul(gvzxB6 z=n=GD>mk=Bs=?VSJ|YwNNE*|}yd~i!ZW_W~=d9zFlMoc}rFYxgYS}ZueQ!(f?L&Oq zo$pGA%}E~3W=Z?q^DS8=@CK|`j;JFbXfHIkR8V1kJz;p{+n94sjOF7mo)KW{+zV_* zy88Brh^rYae{*rL^!)|PfA)gG!xM!L9}^H8*)`sU#0`Cj ziM;D?EA+x1$1$Z``!gSzWo48UyXJ6lQ9>Yr(EyMt3ooD8+p}nF4BBja^J!}_Nm>y_ zC{eF?3cCI@gqX`*g{0d%04|zF*$Y&BG-g4OOdJCAcl!Dm zi55mWg^O~G-MBd}FJAOLtLf;!ya%o+_v1gRNC4}*Upi5?zNZ9M& z3v)Ao5>9IS+lmWjYFZ*jRt_PWv%Q&cAfQiX*-4_62m^MUd5~*Dn@R^v60wSC*h?B~ zv-MALzr1KWe1{i}5cfS~oSmI@Kj=93jBo;Xxd=6x0fajrNY0+mHxpf-A8fjV&K|*w z7cZLc@2=sK+v4^hy@4uT2>ZuF%|7#!P1Ls6aA2edDout>8K5%)^JN$gPFcWjFb@p# zcO?Lmsb>Kd5`hNv0028mKhg*&t6;|(MvgzRDFBjEfIn`to#T@ckIc=X0`TYH_$<7l zaOxyBe5HiEmrr8uZ zP)~7|LX5ZbM;?EQkO_6LRh(Jm_UXLm9%o!xI(VG>(jv<+D~vJ3raQjECxzwDz7F#i z-EzByK42@1|DHvm<0IwY=Bo>Z#4lFAhIG%*;zrH1dmLS!Hb1vfn7@(zZH`*rn9c&z z2Peoek9x8=6T0Yl2WJ4X(4rpSu1Jd(xBUT;yL>i2=a&nf1;*vL*PRF}+zdY}s#uq0 zGk}-ao_6aoYS@Y=7xOFefGafc73^$mAW85O#;6txtcQsGdPh3r4x#QN9h8uyPYQEK znF)(rkgc7au%$VI$M98m!=c_Wy&2pu4w$anoef#nwhP*SI z*BMG<@oOrhgl7JqE)LDDmCL%_7bBcil>l;a&aEq7urU0+OZ(l`Zo7^i9R6i{u4UmR zpoGh;eF4jUP1l_yzk!#CZAa{8FCc&y{%c2Cw->V`0mgB7uDY!)4|%PD9TKE*{prA; zX`X1>-P&4?89TjPsI^5@G}kkk50eAJFi^xN$AMPrQRfrn-4Qcp0JNF*fL`pk$vzj9 zL7&zJ#%0yP;K+y;Sf$JxG{7J}(nj{o?e6bx-)-f9mB|E}vrhz6_DlD7=hF=?`u&A~ zagNW%#zw)f$p6SSe$`ea)t&HpggHc!qC!sF$7ke^QSuyW+99GaZ4?6%9xnZEt-M#R zkCCH=%qlT-sEQwMz@l84#Ppq*wp!2SjKVsWb%=z9ZDpt30xahOxts#aSHdu7asDa&sqhd8(HEp@E==0|CqoHnrbo}#>U1J32Zko zDy=7PEEKaZrz)X{8`rpBegm)WZv33%FACZw@H)&%ytW$7PY$x|&_{eW=#8D6I7rz$ zH%BCdwAX~@qd#n>X8Y*J(poN9wzQ1+6i0j*640KJw)t@Wqi7r*LoU@cu5+=oeT^I6 z*oy)mi=15bb@k8PjKiU4jdfM=7^>CPTG=o|T0W}5?ra4c^NEeIQJtc1a`g}mQH9RR zN)rD!64B~U`ih2_YKQ;KUytG9z(YuatzYX73gGz%_!FjhNNclAU{y%9e3{btfRK)V zzxLr(mi>Xm-&d_(D|hTwx9{hZR>=@@!t>AU8aoo!Z0&d$55%0lb4|us8W}9SA~i z(UW;5MV}PnoNoUD9ODrt?6C8-6maL~ouC(-e3vtQon1 zfqk7`J+OLY%#s|<6p0Ar&oF>1dW+xVCNN@soq#zMk6#@96uL_xMO&IS_!#M>Bo9l% zHpU&0RGU+QF1 zqG4-6I0>};9*KHyk`*tehMgxi{?P-$@>^1xvGoTW4I;$&i5C39Cb?3G8}ht=SZH1p zD%j`>0(t)^Re0W2eRFUB)7*PwPo70hh`-)x1vc`^>EwLoSH9ux67BB1E&bHE-3|uf zBa`={q&Ph`W4&VU-dIq`tkDbir=<+D`SD~&ve-I%yOusno41%BWiDcbAIqBAjZ+%9 zvK70OzumnqQ@fT?#705mf@7*M#`aKH0g9wQXTmjJc2kr5+@d17s~2 z9Jlx(9*Pyg;Y@310Q4+-(L(^dSLwe-fb^ZC-rwNf7WR`NDPA^5NrS`;}q;c<}%9KkUq}$Rd@aZ3K z2+TFILR45?fqHUM0f;^b;|0S0HkMLqJkx}QMlRZ*$P-GSM_83(lGvkLrvGW47*PNp z)Bf&^-s}^(cLI9F{J`*|XyRG{suK#^@$FYOF1hDlhX*sxav~y&n4v&I|GF3FIr=1!p7}FC?mdxk^O6YBl-J&Z&?4R{$@) z>7G+Htv!&WLwMjb=LzMKFii<}hd%)Gx3HQ!nL`AKjT3K7Ttd6<(iyx#sr2zk(|@woDuau)IY zyWlSVt_h`1gMG~-=Z9l~nAGh8f5WR3EM(o{_Yso$%HMS(1o%mSF#<#lM?jOl3TUeD zS|4H~lP{2HdH@v5I`Tz64Vegs%&BWxDt~hj`dTvji4}}n?xS+!KUkzbIo_+MADo2QXVD_ zd<+tu9FaVCZFMn)0lU=h@H)64hq1i^i~r-x;%O1jb}h`Mt#2ZZ0X4$>#tK2GQT}vc zNj{6IK^CYBuSG;QI;|2D6W#F+)vsvchw77g%FdnY-Sx9bfF*HAx;hHu;`z<5>rmPb zMa+q2&aghY8U|1|7#=iS(n)@K78Yv$f)@kVhBK|hSN*El0S&e3aaXg8^Yd=Vt0)B7 zQ&n-VQ(n!@2|^J{qm0j^4Dy7|6>cGxzXw-9_W;ccYp9S}9x>+x;YPPn|`mt^Pe`D&Wj~>Nm%0Qp@;^tTO`Q{QOVw6z+?I z)NWvZ_UhCIBS_cW{P9PRGX5=)Qy_BgQ`uS2Bn16h`EEP#*aI-T;+r5T!SBXNxrQQu z{opu`5jzK=G35;u`x57-t=?P*{x~btKWI0uEh50skkLkR`wydKZyrop1@LA$h(PNtl`jv!Ti=stEMVBn4g5e#VxFk zS*h7azjMEYmXV8y{s=L{$jn6M{0fBDb#rC?#)+0ZxA<;@o+JRBs64gY0v`K%qt1;h%nVYdxU<> zT?ipPyCRuTHk_&ON!N*NiZ~LzPecsw+QKB(9iJ#8w(`{>A)j?e?q;Nl4RFL`Mf~Jc z&i+j4$z2NL`z$o+bKpM3WKp*fSM}=&fDI%wJ+@(Iwx}-3H9m#TH51$2Ie3Wy2wJ+K z3a{lC(tOJYl;0?$cO44O#NN1-Mi1NZAU{o>2j^nMu=2%l=Uiutx8{#botrYJ8(pt3Zkhz=|w4oZ8J2!ERXg zVBTR(ZRv0QFdwq8QP1~#5zHAIC&kK&MNbgVaQ)El(4K?uQTU|G-uC7)^KISK@7@!Z>d(v_&)Vm^Z zBg0@4rFs|gG(8Hob3c=s6}Olo0d;dKCo8A3GRX06u4*M^52xB6IPWb<;&Ch#LUVJ6 zY)qJD8yG(T$XDQ<0fkY3AX)oZS*<+aB1`)5_1i>BKhSlm^`tYZYR5*CUtU_8i>IgP za>_4ET^9Q1o;F;A*YkH*L32OwrvVva_aD$@!`Rbpfi%1Mc&Kvx_fCZAY@rBe<)^-_ z#BX&^r_n;bF)6ER7+z+t=PaIE;^6pA-_PPRX zby5mWTgQ!#+#A+7vhAKa%U?$zdzl-|n7~^|(CmK<1zt7Tal8wmAhUPG)d4VA2@6=>=-gpW@<>?l- zhJR~H9?I`=ml93fE(9f#_RY!JM=Q%$jy5FT=CbZm6rDCrm_`!Sl+Z0TpBjz7%f z6gYf(Rg@(x^c_FJ41ckDPg`8nB;z}@^F!+e)XGv>DJqXk&hcW`jiDIRzFmEa1m6Lp zvB+a5u%TcEn@-iMS>~7&E>`@lGvupIMMkuM3{>5dNR7e&@w$m$AIjHaT>t_ns$-V^*GTl%K11e}r?Ml%EiYH~}395W)RkD?cup-XCkS z{NzM1GRlwrm~8UlEzsG5dMgMP0i1&G*@CDbsNBboi0%WKtGTF!Nfpne6Mh@rDIVLK z!hlH_68{2hZ$J_OXfdGBpJn-)ir()}YQo|e?Bnoz{$S)g03ihsOw2q3XT3{gRF#gd zZV!phB~0xz(!&dWI6(LVw)mdif3V75b|6>@`6S<4Rr@;1a&aC1)Z$s_3tvfnqtA~< zrBEw>;Q%BfIP;S67$I5t8)cKFUhAC$*dxWLs%gMRj9se71%iG6`xESXs+(7Fq%M}j z+ugT-e8?-0PR>0;6Yyhm5n~f zSl_HtTwG0cC7qqUzPJsBn%1Mq-d~Q^0T+4#elMsp1Av%4SkD1_p}kNuPZV4cZZ~gi zphKBiTwLrLW_;6LLUxe<7g0*gf`79+B}dr3>n0n%(n<2pDo8gIvRf10@*Yizoy<-o z9v)248vcosZB-fe(Z>AsIvwa4kk4Y$nOw-$I6mLgB82`GASe?2)MOXICXdEmT-uMP zkcu-dkO+Su=C8nEqq?HzTUS8!@#_q25Wb)tdGO>!xS3xJg3L};2Oi7$fh%gfLXndc zp;JQ>o=U`8I`TE294W7ROw$+Hcu_Hpj-Gv#R=Hd^MZZlA?#uTNqeS>}iw^%ieuI}`mR#<`fFKav8xogcQ(dzj zZY?Tv#-9>k3B^d{{3I%0qT9WRYg;>q%|8p*K7xV&4D z_kPTWeS^lXwmn?{Rk-Nk9u-~a3z$n85zt!DYf~yLh$@zr!M~uHfh0EZ&sC^3nT7oCHW;ZjbvTxkK_*05eJoIQb$?S%} zyM2FtpV5MlHm4J5S&+)2)Ad~g*q_i1>%nLHp_2 zSX5Aw(|i-$wOnk9CNKBNC|OOT9vWX<%&Z#|2P(8)@gRc+nIHg&E%?Z!a>!9kJ-DHc z$R9jFYN?xdK31k^DrCNWiwpz=j^X}t?HH8qgO{zeO(XdU?&2X71^3vjf-iZpetu#8 zpz_eC@(a0w^`nPkpAw^)7EW)JfjT57!}>|zp}Pw~gNx?QXQupTo3%uF^Sz!fajd$5 zZ4H=eY4l`Mm<7zw|2gpY!cx(`yt#JNsN{@V_#NM5bJ~PBdDs!1tW7j?tvbgx!_aJ{M1nn_*wZyPnPl5}s0BziIy>&ZUrC7j?ZwGTo zo7$CJLQEbE`J=_3)xWd->6l3Tr1K4pHx8AV+4(;w+?kHd_$}MfPaQT4=3ca~IQh87G=LS)vWrh>+6RAgDg?0s$+m7n=^O8IRT%tT^bxR)vlw2|Zd zu|Xsj%lufu$Kw?qC53l=anCEhkh5SczbHqK4r&dH*m92i=^Ve9psezg+n+@-AxSv~ zhpX1>LxcewCc{)}!2L_ft1Lj_Gxj)4Y0Ei6its$_qrt~8rA23u4#z$Hd9WTD*24%6 zHA?@J9Pxtb8tA^k2^B!19=2E{f$d+C{{w@=wtWURMNMw>GbvBpp?}oPmZCS8quMYv z%oA#>55>wx2GKPOH;gKAz1F~@+&LvP)aI5Wk`TZfq*IQi$Yk*&m~PQMGlZ*XS>=;d zgd6Gkk$?8a+U)M6eR!pKjgvFzg?C19BJ#exKiC5l4C$ia>jQ8PB6ZF7Bc% zeI3v166W}6twS}>m$1?p51UA$Yv1e+Gj@}IePp|lVN&;p8qyu~W+tqQ_T^~X0qsA5 z&gb>OMB-Hk4Q+bICcZUlP3E_-haq*H!Lu4QRd7D;;UN5^VSODX)Q`ul@081{rxscr zutB#cJ(uOP^vfT!dh9XoYFs_*odeG>rRzI&6-&2T`?}wjgvQxyhwY6hnB~(P)KEsGmpp6pk|7Iogk%#@OTHM{GAPj?_S#Kgy%j6?icu1^GsmmWTaNP4;(AR1tiu-6A-ucNbq> zOWRqppg9=3vqi*;==361VY*}gk;=65ormh%=AGO&9eon9z0R&+j)Iv<=4_uNFfC_S zr6iIr4)r0g`o|7ZX^CT)SM0bFH9@uDG!s$xBhri&vH+@b*e4r42+uz)3%Cy}4}5)f zC-K`+Tn8S0sMVDBN$&snQcDxdJQk;E-Vj;q3;^(%>NQx8dTj{lNHOfYV}8pj*X?gRjJ# z8o#0T$Ix*NWz}l;xdkl38SKyU0s=md*osgqiPMtPGUq+B0BQlD9Oy1Bd;cr0W>CW% zaX(UF?Oh>`tUy*DMxEWD427s!S-`Xg#TN+$FTk_R6XV@v;8uKKWA%c{ zs_jG)h@Aj!_Kf7Z&g~x41~sQr#05%H=ig_R{baUrPj)Fe&-#LAzNgn{TNUELm-v9*POlH9<}Idh<0*(2866$z-Tu= zyXy2QbWWHw!}hwC=*f*_EybWA3$87AH`O>uji(soRB3&BLlFK*TWK)?SDGy-yA;b^ zu_E8dMr%AHJC~UJTRl{Zz^u;8nFMMOVy?kk)$R5vgZ3p8Oyts%5m+lT{@77sh-g|j ztnf$h=*Ef`>hKuEES{}OGpY(*o}AN9nRx1wA_LUC68mZV7gW4XU@d>n3>C9@ebQ z{V2q-XlU}R0Z^xpdQco)WQlXpqmRtEs6(3m1AzB|4kys%9}QdI{RaW^n{xxWV$e^v z{{5E)Boto&*LVUF1~0q58H>DZ0_&p#lQS2!hHNqFnSS;9##g$d!))T zlu|oTDo$a<_|?J!@2q`RNGj;WH9?F<*=iB*xxzy2oIfExI#Ao%3S<;FwBzf!%-gRL zJUO~}FYW8`h6ksPEmOOy_u#i>k{aS$qm8o(=Hr!ybD(jDacA^6bBC9;;}fe|n6!o4 z1|BTX`L2EY5HC!PMgFLsaLB=yQw4)5>Z_bVQg!WWao=Q?)9q zqL~&5kq{|^Z#lWEdsmAh zt?MVhvJ7M7p!zu&E}&kVk_H}#?5w5jAVTMB{7}VAm5`2Ulc~(aWO89ge5&||GG-8m z-1V{u?hGE#WsMC(5%{jNh0kM?sLC&ql~gRKMIWL{jE;@+G8d+8g1yU0o(3s0qwfvR zq%Xj_g)JDvjU8kh1(etL%dOU9$2Xs^i)RoM>BJD;LTyCQ<6j0G(T@)`t1w-S;{R{c zScnd~?$#H*6hPNd2QcgjpDvJ=aU`l5paJCj?UC?OKoUTT_wKeSiaq490&Qm%r5Xas z9Su$Ewef%0*zZ!^9Iq)jGkC}NsN;|l<23PS$6b?aKY5WVv-^5c2d#$Q6;ab9X74^N zD;dg^zFMF(>3&}9Qb9>nnzM`-aX1l5;_EsuV%QDO1g3+N z2}bvCX~41&CdbOX7|6_rV=XXSYqGn6HO{^NFWXGFz^m)?>&LUt-8gvu8JWkA?@g`p zbCHG0y1@)8D9Iw7UlZl3$HXxkkQRf!4k6(A)&iAM;J-@iJ^;Ozbc7ikyHE)XqwJbX z)^?VmuKmD(=Ig{_#A7RGpx_M`FRdY#uAWbikE3b}Ko^;)2;;`VzD7{0ZIkl7@mrgo zW={=HQCMXP6KyLoAe3&fty?s;&hOw9l2i*~aEclAj;AwvfV| z@hnGdX?Li*?@mx-5_DC5nRHWOtvor{?;Dl9K*R0Nu-DS0a@CLoO6?1T?mMq$kL4Q( zz7GL8trZleDEjk#gG+1^SK2xm9HQeSx)!2|kIEO(pPU~36`L%Tq@^8>{GLEI41AY> za}Mt7{*n@U3wKPv zdT-ngS4@z=BlW3^V#58Vp2Z1~eCt`2Ee>Z^jyz>n`tSW$3kgIt0T|_PcYh+y5wLAI z%)bZBc))f#2W^;)Bd_Fv@GL9;?ay3_N--Bs5pS6VD~HnX?vK$B6lB3x@286TOT&2x zdq2Q^k7_R0hCKYgVLLIRQ7QFQq}hL?2?5gcHp!8o{*AB&4ylCJi6W&k!Bqb5t0py% zw$aN~P=vYF8Ou1oI%7Nuh?W!f&^`v!g;qu0W6J(PskKjn+dA*3AP_r|aPT!9Qa|bC zQ!7{jTn_z?_4~=9C6XFO>Be?S*ULzYVXbHmHxvK-nGiePCc_bU^@B0Ic%crAa6~7o z@dqssip0lA-}-X=qx<3tk=t{kdv`3LxrwCA1!2LT$RbphgF^GPTT_4VJns?lu zCtp$Ja%(K3~;pJ$ovM%v%aMgL9E8^X4$>eq)E-0*H{sQTu>qeDn7qSTs*|vup;o>DvPj z(W-N$=#dVLDVbY*ER>6pp_vK+XTg>REFi8we5sCUB{7|uzPpm~S@82jm}@#dM>K7= zsf+x6mn`lZ@wjp~t3(PJm%je4{2pVzXI~A|2iBgw@#k+TIy?#&>nSx_wqBeG)f^bz z$XD>uK+%ljNVmgLk&Qu5HRGFBickLMeY2e;8{=2($LOzstSrIM2y3hgYG!#M8o46a zpfAz*{A=i(uJ#Gr_J>#odGxkR?VmQr*C&^&ZV5f#Ri>@{C&J|gQ~ zd5>Lh>&(N8qw8xqVl*rid(lqw4Utt$~szF&Z+UL1STq`kS{YwhD? zIJzSX0|Rh$zMZ3s2XiizZ!Si-EUKv-}ki;@2-<|h{7pn|nSgU>=m!x+m2vpydXT~emOEaPUdL&_~%_cY78$rG+ zzbk9+17(AK*HNl&5m$eLcOAu+6MjT4wa+A!yLF=E&5f*gIE_4cJJ{J@#>Zmgz2er< zk!@s}g* zoRok)wflqPXz|Evu&YVRmjr6|N@(5-%2=lIjrHfZgOX?4Cu7H^zK+_s+7T#ntjcRO zpPbxx=LZMf7rfj3PDwl4T=Chn$lx#JOq`K&VdUO8C53h5v6T2`%%-pG=W9wMt&jaI zm3)YF28Pv!13$3)C>?u^0h?wXJGl;jbmDP8L6wrmYIgN}P+%2557&)OIx(5SEV^U! z%Dwj4a&dKE!RLAR^q*eI6t_Ew-_gHqfyly%kHJiarm5pp22?q>ynWr*|A1z6vhk^k zTsWKAOZgD{0^SPIC6sVjfk&a7NL0s{b6ptIOeZ=d>7tR4iJ1fhz5Z{tAT16NBC}cV@ov${?1m?c5g{q1J~V`i!BVsl~JTouC;OY zcWbNXr>B<{(=3hAvVl&bKhKz@ow~o0Si!CE`(5J_cr)dx$|A37n)tz)P1l-&6~Xx5 zS`<2p6{5ud=vS(Iv5F|*3>W)nqKg|eX}}+46o`2!;=~ckd9Kk6VI;%~q4MKoZ|2;Y zkU22T)Er?#2ryzXOGMlEWJpG1^W|t@q(Q4NzocaHg6OR}lfB}Why)(uSVmx$eLBOM zWx?0=XJ6kW6P*7rG$(<@mQ|H~fbEMb5z_hdMvrNB7pa!XV=7zaZ|0PK9j69MYqsw( z_+H7Ypr1npH^BpbC54)~#~W+!jCB7WOs-5}ix2uOEIBhvNVdEWoG);wz|0?*9--FxmiXP>=yC;~_57hfQVCZ8~{%iPG%?q69L zo10;<++Q_sS`-Cm?pC!pyq#<+LwpSHr@XVeHR|%}a3Ger+o!R)y%2%lQ=0a4*J*tC z-G^M?V`h$;aKY{IBLa7h23PhZ0H?KTZMpu+=QhSfsPFb+aLWlEI%u??quu^IH!2f3 zz(+peN*SYGYvG{Kp^fZ!7~bpcJ|(%@^rE%P16x{8+U6%_U(;_LSV(rzH+$R@}**)uV!hxB@itE zFa&tjetepw2!4@`%2Q$PVArS54kB{MR1o6^P20GKCyBe!Y}xP()qSdRl55a{7G%SDG^~ zH(o*F{QaI~WUwA=O>zfv8+Qu?2Qc~x%uKFX!2CuD%p4WSI->wVdd1VpO%s` zJ-XiBJ%vtMJJbz?vx+aqtbBH#W~SKqM$fuz`=|3#b4>Zc9`qf|-|0H^)E>hsV>e2M zHU?~>XZWK7!0bHESVzPk66REiBiPv3n80kKA0h(s!APEMp+^Y^k ztEZ72nA{^Z4$XStr7dgeKLYHh+}wl;UN$8HyI6oPom|U(@06M32N>R>ovWr%D*mlN z2F~a2K2yNrm_t~wxe0VuZ3Hr^EcB8YWB~;a{HsBwU;($1-Xs9Kfs>h<<-dFDf(dAu zrnLblK+?b@s)O6VI6*Mm3Q#=p9IpNQB>X<`NAQLJ;;OODiRycUIHnEy*xRv7BnT)_ z5oM#jUq)-N`EgNEypFr?k4w0kadm+}KA&y9<+gqUHpKn~OZ#AjB>5D1Im7XbnUIo! zY*dISKWcORAM(Gb-2CfHXF&|(?3*Vc1t$HCA2puq(6%yOUyAuW;O9gxX24F@A2!^s z8%haGv|c_X{J!AMf33}s^Ks!1=cg}qq~EwLPrtv{L&$;!U)P&8ZU1RRIYY_k8D~_- z`o6pzxwLYR89t>bbSD*<&tvm=AtLhul?lP%`y9G*4;i6&4!DQ?EcJTtX5`VT&ek$c zYw<1^iKEsYnEBvm9bO)Nx>vc|O%HN=>=njGt~$?ihR#?UYOs&r%u-+VER%LM_xZgf z&V#-aT52>!rP2S+H*~&QlQv{Ah-SOvFmU(uYU5pHZ_AD#>1L8GR>>)=Cq;)2f9k(T z7UT~sZ*(IFKeriz7>9^AG*L7|Qmo`f1>O9Dt!Ko>7n4{($W zdD{x1VNBN1V==CE>+O@?C{FjEm#qGIdI3svj^1C4R5hE<8_${b@`56S-dm0iz)bZK zaqv=N?RZ((FmL(iQ)C3tnvJ@SD7?xBy3^kr^6-Ty{SW=M? zS*vR3Olb?Up4ag=ZgF2}Lt#an3>pvVG2d2{P`S~1efIr+t$6kBKxro>g1vcIKEB{5 zg5axsE$bTNc!pS~)-xmKWk(Vd?)W9T@17UPi((nHTObO9S1sl0X;8~3mZC>{2Oa%$ zQPIrl{nSC>(d2}bSBp$+J1jC50&(e`TN14-59=e{X1r;DmyH}V0zdM9G3<2(IBVzh z)UK+5C-h#{Nbhu;vFzVVJ)`EdztXk>x|(?I6^?OC7{C}nXbcz;&)PJU!Nh6b0S*4u zaqVCup#EADzAqzg)o%fjH3CY##>?>Ls*IlTrnfFI5UEhT zLB&Ua+3S?Y^|rdmA@XNxK?Ym0{|AGP2~80dvhqLv9K=zlqT$UAV?qCHUqAjl*XE|& zh;psVylx_FN`;wTq!RnoY3AyX0^U8@28k4TF%%vDWSsbCNRrU{Og>*e`CAoB26;~4 z_eMS2;>_OC+A0OeYF1WN9_Lm-X7{g58E8K{Vv5K1Wqs_qO02E(Ub}(Y*B1NxuBmUYg&)cGNPcYMEY(`z z!R3vX8-Q+n!-8E;Z=Gvsm!Yp>pXxK{6k|)&T*jR~ThjWIl`GVe(o*3CES&36@MBGm zjN;dUw9N%-P&i{KzpgIv%qP!4J*1}#!`fV%6wb2H(YbnC|C|!1;_hl=bA@al2Rs0{ zv=^8;8(Mf@IkSw#X#Llz+*DnpJ2x86BBu1GJ>HTM85;4GO^sM1|#*ZtYhBZV` z0HkG&t2eidwMhd40x~nlUo!avRWQ=~`@5+SfH=d);4-cGd>*{29pe7~87cu139(EV z?!gYs;rY4Ke}p9dy>xel_ndE}#;eDAW2mrAZMJEJwN7EAq5t%hfj1V;69Lob>nq-u z`pe?5GqK4=Cy}h#Hg~6fTky6r>^p|eB=waX)Af!U1XsKgE;|U*`7)03fXSYo96`F! zHfT-vutzhR>V=UqeghE67!*b{qk+y#@-+WL`VNlR$IX{=;9#}49DjfO+<&?)%|W{1 zE`52pkfI)lcsjoMOt;}=Tka)Ko(wzr&nwr1K`0C%7bvN{a6KZXC5GSSJpF^T>8~bp zq2XjDGU~*|b)vDo0w(%@)WH5A!($_r`%y6?PPB6aUs>xW)0JG3%cElwE=z=$WDr2y z5-!~a<|diq-su}8Bs#gQ_f0^CQ<#js-GJ+7jzkP_|8PM5Wf=#Q5SW`oH%RIi4tI}_ z<;@gD!eSknZ&bcAWN<6x0_G%VN(50uy7f<|tTDiMsIhzea(|of9m{quUZ)UB4W~Rb zAA^}Zkm$k(-nY3Y1+KSGW~)t_j#~DG#t^}9^tLwo%-(cqUr5k@1vX<4R8~E+{})Co z7)@6kaSw|un-BkU2c8wFq?bADN1~#cCcVeETjdA7+_tv1RTOD|I=AbL>u4bH-gV2g z`~r5-df4X~zt%j*wzC}o#_t_4gug2}(f9JPri=*RVuaBsN=QJ+rrEy4o*}K@tDl8^ z%u*TnR>)zhhZ*EQkW^W(3}%VI{Qo~=l8^0#Vp6YpL^E5(l4ka|GIO+wcP9hLF53OF zEO0}Kz`?SBs8-w~DAsLHU`@yvfHN5+@C=WM8tBOYfMZiuAcK@1hCZl;94SLg&mcpL znWWgqQ#Oer#RB|l9V4%0D*L?rpXoyYF_&aicJh;f6u-{Y)D-b3bKFa}>uTW2DlC=+ zQPbD|u?FOi0h6vd$BAiZgYDTfS$VYY#ResU{A9da!7QYZUrvs%UcCYq&9UcNylL1# zM2;%P5GCX(c53P9OEgM(__-n9l#;9K#6VUnoP~aM&y7`v2xZ7vLme%v zGi;lK1e-|`AZtN5q#=gu%jWUOBfN~Zd{;Sth&BE-wShjapvl(MSP=c;f&7PCJ8S_? zsm?c?%R*pPAn9L)yN$rqmD_0_S*=GQa1{Qkn)CBTFg`bS&uJT%K^u8x$BotRswog2 zfTixqGLMO$<3|5!I0*&?Sr2y`G|y}#*=#gL$q)op?xLXK=w$1@aFW?}PuHLKfx%l} zoxYd=y0LJNQwoQ6xAhDIkbZYE=%6an2y_(DEUYUWa;D1L@Bk{bHAl4{w-isMK(&ib zV1h06qeF3Ic-;L#v}G(OM6R^&(c*Y?qoCyH<74y4fiBAv1#}GjZk9ndx`+cP6g_-* zrhfjnPPOLex2>}`wo6v~%l4(3rKBmpQPkCmBgDwml+SY9CCYW5R@9ERA&NP0Z|pe-H&Hd#I(!Q+XZK(c)vuF(nd)Sz(t1XYRrwPgInzt5k z00U8yg4X+=dT+;rfc$=jj7=1kFd^Iywc}>5v}u9*nSy%NDp|%~*j1X4Bg4hfQUn+e zl0A42%#8tim3>dxm>^^=ff%s0`ycLas{w;9^gbdY0gRK5RVjF7{o>8k za_OXl1Lf8zu9V`XCWvilaCspKazO*zD&5~ZBtl7URh?fDVETrt!-mfW%h1+FLMXEW`nVD2x7jqUu z-Z%VO$$fyB2q2~SP(s#truyb+6Sr;#^RJ|WOP^i`hG@hWHqDb9VYFRuXH0ze@$ovJ zekTOXQo*dRToh$cUj&(aV4~bBx2a$En2pW=ZZ%o$^t%F{vJR)~vZLCq0w>yS3gO)g zBnAvyz{RZ-{J&0sYfT=obOsz7AfV9;1fLnZt?%=>e!HNkI*jv2!4;lYKHokQu$hHK z^uZ0ihZ0y#y8KZH#?(cLh#xG(xhnuR`*8Vv0Nerq^fRBDo~CDHM0#DM(pNuY@MK~I zJW+lzz zbrU)ch2$@6f&#~Gbn$<;4?U!p>ZQ~4YgZ5c=bt}`=+ildj_qKTl@~xUKYaK=kED?@ zLP9P?iH!;dkYfgjUSmW6Q_c3dE$7AbpNRAuD zeoao-GeUamMCVOjNo0awbYqJwo9#K;2-){))rUW%=jcUf$P1oe9 z%fJYjwyGyE_@fnTM!}iFZceYLPF$yB3saa}uitv?Q0z@+QWzW^Wx|Ni2$b-;MigIq z#QB4cn1@xh?dPgK-aRXN^i(3)C^srE)V&BZ85%TZBF6c)CKNM2lJ)yF!mCQkD0WOI zI>poSxL<5qyKfbRglI=~p7Se`IykEmVB(KidRBk>qp`WQg(4FI%qW0DbQsVsiKLaF zXS`cyq~sV`kCUhI)A$ysSqcI=dliWD zc5^;|M4q!9s$>?I^t6rKm>ixuxmo>iIS_vzruw-C(v$6h21_NUC~Y*Uofqc_uk=CxsJoCzD=IqRcl8*!wvOpjg|**v>8zEEo*shoMz zxHG*{;U=3gvme#E+yIm&{W`3A1rlT_(*WH874kz?D01-M!=ke#u zR$q%!;7GUPb%yg>AP5<7{|^U8MtZ)zF6yk|h^BrK47}Zq4rZ&}?$2kqlxxrtfsC#r zBq~jg)_s%UV5zln`WKEqK}Lx5SAzhX08&-1RDYx`(l@i2R~J{pC;7-As)@{ekvbyJ zq82QAha@Q(sF_x-K9*(jynv$>6(yNN&)#lP(12%;47b{Y-DF5@J{~=EnhzW+FY))? z4TJ=FVP(?i5ybU6)Cq&hW)xHd^+TFY##5>cAb@~c*sk%#_K-F(C?x#*V6s6_U|YZC z(z;Qzb?UaB%}@6U2O8czy?shv!Nrg@Av z$zbuh9l5DuaEA4qwBc0A$@ChZo6$XuUUG)tma74lh$Ujv`(TWj_u`Ov>;tya-sswI z8KY250>xg-TXaE^3?zg@sWf#cg=n;HHCWvbj zAS(1?>}~g9E7Qx5iBzN(GT~|jzS6%L2A1$3YTwv{)Gu;}ZEy$*utuLZ?Y^!j|GJRb z^pBM|oaO7?kcCjR^_g$xhEQle`WKD4vQ$E3`lk)Xemm}0UL68+f3ake%`$9Le3YLJ zINA-$fk$tz1z~e)dI! zqFSY;mIa2M#Rw}Zieh0%l%xYwI!t>6%Aasv%U9hDY74cAi;8%PA}gQ{G}6g2Q`p;C zk0QIZmC)dQuE8avq%yR`bPE30gET3J6px(z)$x8y_G%y*Nz0w?Jf5PD9TrBeEDkr@ zGEkd+UuF;rLUWgStt^ven26+Z9Y*7li*6%vKIEjR(x)@0zUiP5{O1-nzO8W;J^lgthymN3%Af^ z#JFj)DsUJ9S_%2kaeiui>IaUJ!?z{Osan6Y8ouavd8bC2zM4ShA3MwaK>41S46T8+ z=Lw~<<&7;$#KA?=`>qDdbg)*UVOhp~T>JsHLp4;EWO<%^T|(FHe>pk&~4FqSg~cU)4ml1igdxQ&x%ae zNI;y3d}?YQH;*+ZfB5$Id=l({IpLXg$#Z!>ZhZ*(H>cHN`IUm~g4X3`K_(|V)wL0+ zfOT<}G1i~el!h+~v8j`aqa_0^htVg1(9D#5#sFGOrMn-Cv|QFm zL|VX2u6+wl5-uL+eiClEVi>0GC)KbSR#<@{&v6aIo#$;Fm|}zPXvHtQh32_*=!0Wp zcxALdhKIYa&vqE2K^fHpXtjZysf0fU>(?)es+7hwZ=zprW^Tb_m*SAvFx42w6B{&XgWD>#3E7X^b<<^cm~A0 z7r*3}u&{WGe4`oof0*+T6PQCsP3oT z$!NopmT*AL62i=x_Z0JhJfRaPbDaJ;InVCsYJmc2^01U}@b^7u9g|M>6Bs(-Cg4htuOE=;Lp*;#%5^9DfU>_+h^2Eq;-Y^IrsNpTs0?u z%gqowYI(h6zgppXbol#FSq}aP*bDOBY9$KeD2n{`R42N0$k`u#DFH z-8~SYR>RTe$hrBoxSzX=`b!e1CG8-c;C;-#)d>q?40l|GIX9Ak@hn3BI8zF=;b&Ez z!gp&U$JLLp=XSKNfM?^xL6aqhTVzeieZh6yFsJe%3rFJdq*e3s#r|}z2)Zm0#tTCszYyZ%1&0O@|KckVCfm_i&hvngg>@ zl_#3S&)8CD2hHSx(f~M|mJQiFev-Snmx-UGX1ZC!XFru->zLg+p|hc2QSfG8yT}i^ z7$jDmc`^U|?P62&HJUVU%{Vd9<{4+QNB?V zwcH~TVN#86zzAE3casqPDa0MCmCjlwzKp0I`^;L9J$eB$JEhfXrXxTg$&ywPZ7p zsYuc`$hV3xD#US&tO{|eO(x_+t2nTd6q7#1#4{=U?@M3*fbU9qmc2ti!V3-ehvoSy zeqmTk*UwyQVTk-K-@%UElMBpxbW)RsQi-zB_#Q2gAhzLY1Mfqbh zHr(xzmWgYGf45!4DqV;`wI4|K+_eEo8+1*w8AamS5XU7^vzxVH#p&g1VqRxTCC=fP zE2Sb+Xq~S>8!9b2y1fy zW~5NoPxJkTY7Q)bv(@V?eSL^E6E=Kh^L2#;69pSpI>WXPW^4N_QqCkJsDWd|K_m-Q zTCx5$^k@Yd-+c8tC%clFr97b=ft7(mvvbn9b#8P&#H+PL{obDYt&C+!*o5&HUxU4V3Z0CQ9+XnXyt98lxM7u6 zRJ-$C>#}V5 znZ!^BIh)*smhPJ;Z`k?Wlr8<3vEr510_F{>dee$uCYx!MYr5&CMG_(-oS&bMTk^jI zmn5{OkV&CRr+l?3nTY39GzQ!sK%XyF>1*Li0ywj!wAx{Fs_)U-4S=&!tXiv#x{SBC z*p+5Yv=bFt^afZv@FHxv(86kCWdx%OXW&!#Me(tQSq=@-cPAP7H%&Lf=f0tT|9mEkpDu5TlI%9*E7`Hpb zz@OB+I~IK2|L@cU0m950z4rd`QUkW*ev&Ma>zacI?o71k)s%%X!4*493_PkAl<8kH zNHD_OI4r~clljYCJ$W9_liUvWFx)Kr$q%6Ao&Wq$w4BO_&kXMQ8TgJV zR04da|Mh33ks$C;a*75#tupmXczRbPKsF$HI*kAdCSauu#yWUtH!d~Perz|%WH2cJ z;Q{NnWhfh$oasNdQ)3kPjpBeo4#$Wi)_a9`HC^3>d|%9gHOoxXa92r=aE6ZNgPP8j zY7c3PgN2k>^m6dizgwRiYFk-aj`H9iyM~YLNCPlUuK_G&r!*xV)j%GwCarKS?C7AO zprA1AoFGB1BMu1Cew}B+kQ4Fm-=}|j(-EHt{UigS^l6#J)$2vHWqoy0D5-*V=mDNz z5QtHvi0OwRrjmWXK-X(w?CmOT#%00pKlBXzD1DZ>m31wFG0(|OXkWgUX~?fEkE4C=CaT7k1caInA0nIeIE&wuH1#Sw8Hj2p!|^sXXnt^+2o)|gX*g9H z`F@?9w7We|AmdqubH``hiNHK2g%j}erPJ!HzIP4A`aUzHx?sRUTU(na1o>9%?+@?o zQ#T;*lV5=oRey|;H6k;)HTc$C=303=zp5(s6Fz+L^2G3&F!rN!dRjJiay7ZhlQY7k z=FG|Kt%+frZOPK;ODqG;5?1gT^tfydDLwt zP%WRs&7F90(_ikCYpmVY=4jtqzoul1^s_fLZJx8n?YjV)^&EEOuek};L%%cvNh!I2 z;!a_esC!N%w(H*CA{hRVB0ddlT5&IOpj8&o_p8{~$;pWaFzB#pM1^24Kh)2s61JfG zLqL~{Uh@Asw0RX3xRBVKoEYnhW>heYpl;i@?iV%C`lNp4@FF#+Sc2(!n?4-CY_MGb zLjFkBzksl3$l~H6x^7xp8c+Sm{<-mOp@L(h#b|#NeS_}iB7RIgh`B;kFI81zhBWKyyQv0@fR@B;t1FjKG}1^7xquD%_RlO3yUC3K z7S8~fA=^W-4qf{$t#F%Ikj_Fx$E5Sr3^xbknzqxeVWO?o9@ZFH5!qoh75Z=9$i%A> zfMkbI1d)r&SXKM^MdI6{-t$i+1nG*#ZweHYLamI6QIR`Gu!_2=O&*}CGTGb_fK+4;WM=50VyO*g1j|EVXwao zzg@0JYLRQ5_kZIPP&#y^s{Q|2fQLxXGi$_{`^+6&Yc9bSUVbGg2~(`{hm8aNZrXy6((K+-oBe@@E= zJm~hxBD9BWQu$EZlVhi{hHhc6D~E`IOn|50|E9F34R!(>pEO4J<0iUY+i8Dnm`L`H z?zy47Zq8zQxpW9F9CO z{hXV)qvUeLyu2FtTf{%}gQ9c@bj@0^a)Ik^U z4&XYLD+lR);3>pb={*YTNGF@UjGx*L)UTe$R5joO9ZxUN5&l6V;c_q=nqGW5MT=sL zHiDvOar%h6?0+5mgmrGdlGEG_>EV%j9r z@B@p~EgO#j50r)@$*y%MzMsf- zB}=XKj()uB(i$ume5xUzg_#nxQS4d|8;Zx?alrV!)(wF+k`NgAn39p|3Ben{5nRMS z_b_os?P0|Qw^sysf`&5{gB){!INJj_QbT0Sev))`eC3$xnt8sQifezjKOZEhi|1Ev z_7dk&O77ql-iG6zB&mzZqKUi51cwk^4}fnrE!7yD52I_m~H9VHpPg z^y3kEaZ}Q!rWSRJ!5hR2QU*Jui>65Y&8zPzcSA1zXxof(k)2@OLdV2!v5Qo)5M|Z> zgC{xlLJtlO&=EQZnplK&!s5Xo$!haXb`RNmFTePBLO}loTFoXv7lyzqR`&Y6E*z} zGG)u-aP1a?A{i?3;=O7Zm{{$$Jl8HTHJulPtu;ol76t!3EUWE@~bis zWhDYS>TzjlVIL;H8i7fJLSjiw`IUhIO){tc{NCwl;M&W0UGG z%zXlJSAI-BR0(K?0WIg~Z;u-U`5Ys`q1x$R;ZoS(C=^VeLcrqSi%5mKFipr5s}x08 z3kYfhkvwi}qQSCv9CHYMp%d90pc8v2o+v29ZDNQZKI@HLv$$KHsh1d2UNn+m#j0Q0 z-w5wJ%|1&>6I1jSevIwFF48SvBKg?5 zRdFd$7#=U(xaQ@4L<$4XXf=0$~2?BIvfRLh3bi@-S z1eN&qVv**ZJ`A!VsS^X>K5u4Ux);ifC=tuOL<2`oY$ts~1W+C3ij3{GtYRC}JZH=R(tqIGMMQn{NmYGcGDx*smq2O5 zbN>J?#Dpfhp=6)GjbgUfF>k>a=Lo@>trVo!g~Rc?46wQ?g}`4=8DM_>=Zq7*yO3(f z)!BqTOEADF6DcspO&x_Yr_?=gT#Ip4*?M33dWc)gd6%Cblk^?&rtb!dm-7`is+nMg zYT3u8cm_C!d##`S$>q9z#>M*Z=XS@Ps}YB>q@J}klu;jBGdj^m$*sO~b(vz-udDgk zgFE4p6Ozq;Ir!s|-kMv7lDE&l2?0Us_3~A+2E0)fpJQpPm}~|rmz=SgZ3N)~M?Z(r zZJSeN=T8fSD3cQe{NR&}hfE-=v>hrkDa5TjNgoye2kJT~F?gvjY~cl|6dpP9^OUGT z8DP!a-lP&EcQT`IK(b>vS|vB!spA*UA?J=6<=yeB<#5m##meSxk?nuh?J}OqF-if475z{(Ea7WcD&yXMBSdHOpe3v|1_=`1RO2EN(Z(Lij z8!C>is=*X)+!`EvbDZ)he4x^B=MstrU`>3HWZbu&IwS6SWAe0Rx6+2M6$0gm3W#M< zx<6qtv0@g!3J}L5_sX{^%PY~WdO1^4kUa*9H&@s4O*EOneipefi#qFA>t7o_I|gAK z(w5}=A)YF$3HPiCRbx~4 z@iV5kM$pyy<+JMjb+rGGt32oR+yzOyk7UeoOtNRH*-X^(U?l zs{Z$81HXO<%_o0N+WPxshUYBg>Gg~ce@Y^qL08%2ALEk8iR(oTG;gr(aeBM-lW+(~$v2&cqr@ zRy2vxxG?>Of$l~e;8tL^&7)o1NS(4=%gqT&fqJP-;RoQVX=Ykn23TtdIdx)Qx6`|p z?gqIE3xocQs>WZ-j7Jk+Uz=SG6|P+!XK(nG)t5UC8~1fe+_RTRdY?6v8mX~YZ)<%B zlytsjxYda_bMPlWsTd|u7+cpOVvPu+Q9v&!$B2kmC^Kq?hY9fB<`sa037B4#1g&*Q z%_O;Ly5;U0Vy$3*?9TlJb&C`=?Xd#j5d&C0V3rC@7hzzn{3d^w8u89PE$V)2I`wo| z{_3=M4PI7OVMhUkf&h-Yh{QcB8ad43XP>;+ctYRph=BW|+?E}+$JYG&4_XDCJ!Ny$ue}K6g)-wv1f8oSgorGd;dDv(n&}@KB@_phmnm`W#`4#i|Br48Hq(tD$)=vu4mbPmp-4K9X+1Bcr(Z4o>Oker5RK% zeST&aD=D@yoo_!m|C6ee;;lKmOO{v!hU~p=olkBX6-ziC9ChN$3~uw%kCllhhF|pX z2+tZizPHDA{{Db zJj;tWN;^cEE5fD}*H+8fIPoo|z4q{`U=XY(U{{yW>zjm`}0`1z%=E&3!CGvjE>}uU# zrdkQEanc4=`Q*fM`u_AAE$EnX=iS!~d|=`-5Da2^3LwD$o^B||2rzX%xpu>Ts%9vO zi=>WdNjY8ug=({v6v-t&MJHTcV>7!icLsJ_%ya#)ux0!tb#V) z)N$Y-iv!=OE=}HFU?EQ#E##-xodhz2SDk$GNgTpN>l6hlE~^;%^d|YEwtqowh25y| z#%N~tgljy>Rts5At&3fnPLC=I40S?N#MEfgoEzN|7o$#veO zo8!Hm7FCo&Fo!?ltsZKm9ot5{2^aYMM1TT7n8=51lo`C+g%2!3!&(6sArMj;_f))-A z7gtXYLc5a^F#a<>qV?eP`bTU+$etw3F7ix{hb5T{3}$ zJeaokeYm9g6FV7DIRsiR$sQ}7Us{ltpHdEH3@AR#0(J;4m5?tWaTI{QF_>qEK7HB+ z{M4X-XOsn%rJOdMBr_tRZVC|_t(6i?+zKoOZ93I3O%T%mDnq zN(&{q&GOl}o<{yElib6m9JOrOvRZs$DE!h}isF23^}({rKi^kf7V{(@oB5SgQ8-Qb z0vjRTPm>T0lit)kZ6RG}0^ATJxdNW2=Sok*F|kDvB!_s_#=i-Uvoh2<^;)tqacg|2 zSv|wxrnv2-lO@If!{$|U5BZ2!Ztwg(-Dna)deW)VkjKZ3z@z97QjY4gqksq;T+>~C zp@%CmH`6V1jum&N6Zc@101(qoPCF8$j)hMq!x&F~Ur6H@Oc^GbNm_jsC}kRo?Xgl$ za6GNRU&f|!q`J5-);@_C@utmtwbv{P4JIPoeVivJHv6*n z=-m<*ssL-F{4~Tu{~3Br4gsgO%x*AHnkjqy2wOn|V4?8DNxHmHs&Oue zG2m=AcfumSIEFxi%Bkzng;_RKyw!yjjOAojeCS-w#LoOyy)NS{MvxbnNKlYDgY()$ zGv>fYA^G&?5_kh;Z>URrKkhkBC#k&k@qD*x-=Z*x86TOWN)e_VfF&JRtV*n|LDX({ zQa#*aUODz`;%X{A>iFOfd7g9r_jx3~5hPwiBJISFlvJOdyoB13vBt$eW8(NPfnJge zHE44{Fo-FVjtmOP>kEL}b|O&7p^8fd`^Wh)AroPWbD3)UYkZNaB*o) zhQq{mFxc}dos0uOV$0hW>31#+vymtUsM}rnF&e_FZ$=9u(L;x#enH zzhDn`G3R2qUqoPlc?to9|4&(fur;@-w%uf5#DDcOP-4(2Z+LaylTXl>IxF$f_GpjM zqUzfwqPrUUQ-uHR>cAtVl#|e#naXQq3#Tw16TGVRKn{+w)UsV!lC!3&2C3v4dkT)j#njQpKVq(R(rc zxJ%#sBn4qWzyV;YKJUatiFA>4&BDbGZll|t#(E)b{-$>#0$jJWRYqZ>2L`wS5C2HL z7{UbTnAFP%|BF(E*nl=EV`s-%Q(LQG@lS>xXp63XYNh9oI(H*bV_DmK8jjk-MvqBl zMJY4Rj}io%*gmu4D(|c+TE@V($+@}-nZjp~iTp||-cIqetUH>A z%lamH%jGis7eCHd>M@^+pTS!%VvN_e`et3WjiYVbk;%ZaGMq3y9HZ*dLlP zBzA@mM0c6EgfP?#2n(SxV$>U-i5bS8j`+@O`TfewsOuOMu$*|IOlz6~d&DOC`TKc} ztX{HTjfdx8!^-Ds6rUD5!iQ=z+IZ^e(n8b7$pvmX3wiq>JYwe|N#@FK@f3s?SuAd$ z(5SE{20H#pBjTw4R{*GdXZhdFsqrat`)m!g)LFAVkA$0ap&46e*A7e0Giw#CM{qoo z^slzQJ~inxoj{4ZHM~?YPZz`6ogAO&l=q)006`5V% zF-NLkYzji77h+=6d=@`@O=84Q0j~QujSgL_$$=jJ+h`xJ26*bPk6MrW0j6B=S-@dc z^6o6>QO3yVV-~BvT&PvOj#l}(kh8kvF*X=}L>)k4lietO9#@i2{DVKaDwdf_d=jFK z3WyvU6*I+}>q!~r#xE;BK{~5TL^y6gG1^FN>5{9dvAsp0*O`5RH-JkWx{y3)>8mjZ zHP>Qkka`NbxblH5-cj^BHB(pbgZ%xVSDh@D3xY1VUXZV;+M{FPcbM+~5(PJp`IEct zZ{+7a8vO?dEQ(oAyAYZGPUnrCh_{B~m0lHI4E5Ajbgruhz#5W%&!3!FWUPyfrEh$3 z1Epo$mznPM(7QavnUd4p%u~a3f_tAkk0*M1rVGIzGPM%z{NkFYB+TZX`#o}1nXb+A z<4#7MYnlD%Hb{wUd$SaJ694SK@J?>3-47_zC$lCod1Yl~(+aoq^Ez-s^Zo5*41PYC zgoKYQH`uSxFvv98uS5eJVioXr2oRmXGyvdeq5)}nC6?EQt$_TjQX~y#8j%)2rhD>R z*WL)IdtLzth`cujIv!@Vb5$k-xS-+*LZ8Tb;R-95SOs`)j3vAiee>@R(f=drEugYo zx2|D8zyhQ@q#wGwq&ua%ySq_3Md|KtX^@mI>FzG+lKwBwdC&LXV=#uB*l=ID)?9PV zS&Sos;&uJE^QB&(rt6V!_D(USAbS=M&;t}rFn(AVuk9E^=6aRr&+c6z=9f5G5L{KO zS8{O|`WoyOLYK2OeYp$kFZBzo5Gh7l4z%_pZd|~9SozC@lN>f3!wSz=boQy+{01xg zlTi#qN&$3emN|SanGkYgV34`n+W08@Civ)ck@=<=vO0{j8rS;khjuPuJUiuqc7`b> z^mSS#>?Hah9>&E;aR0xM@%~)^Ug&%sk8mJFbRfy5*08>qUdS7Mb5&P=;5Qx4bibM- z7;qTLy0{G(maqTK8uqZ|(m1~YLkomd4m(?14xN&vAOGoeAp)Hjp`X0}t%sa}25SS* z$I^H;qou{y2mCZ%#|{L(w7q#>Urx%4^A&&~IRG9}2+(pS7Q0>ZUv~rVrhR9_RUASV zafK|4cg&@5@AZu6#?;9nqJrh4P+cV-Px0A_iUJ^m{ex1vV)KB`MDrm{=z34EigRgh z4bqjqNpE$Ao!9eM;WFky z`xUkLzjVMsLlt1&bXM;h+1LLGj=s+5IH_!6Hhjhj4t|58Y4Yt!cSn5$0{HD9^NK}8 z{BHbCj~&@za=VB6zn3FH__Sq@-qSf&3n(vswTU6ie{f+z2=F>?dJWpk36ThSv138` ztW}{{sSjm5KM*22+27y)NmdrIp6JHl&m3!BzR9NqGIt%-H~emgyZY#3dn_GQ@80l6 z)7?`mXfS*#oUGHL>y}A}W991n9~S^V_wG_CzH7Q#LXvSkf~?M_J~(vzm_`Wt%hxa7 zE@KN~xThX?K{&f@P^|gTIoT&MkDeaB>>2-VrN7P(nfF&m_O;JN68YmNZoYGJFnQ)3 zLx%%Y)8lTgv?5#I`pV8Ou$az5Bryx{&My6_AcHbpefM&PhR-WmkWZasYXLF%S887N zF6bx+Kg=7=U){OiK|>9)<&X8tDJPc`8(vc9VwiCue)DwRGLc3dkWv3HI3Z+7{00WN zvgq($O??KFlkQ3Y>S2D24jbLys}|LPRZpUD@$><`$A@O^g!kpD5w*3fb4$!K#}=P_ zS~1W?g^l{Z%*?%i7mtLFu|ON1(?LB21}lqY+usy@jq}6IN!yp$ZT=!$05s4naXNO%v}ZE5k<7-U$=my5O?u7Y7sw%enWPRPT>%4obJ^};R&4-;WP^7!Tx*q3%hjc>K22AQ^do?nUp zf|aTp0Qu`|M%y*GVfW0Yg5pS`%YtwLcv-?CDXtYe0?^jI&ln>a2!rv!KP@X$*NTbo zPZREJI8+ zKu-1{ciP7zBV@$%{R0iiQNdj!4%M+W5F5)v0=f?IvCb-6^?z-288Ih+9AXA4=c=~# z`b+v)!Iz_7go>d@3WRfClSu~B4uHce&hNVvbWTTZbu*zB5?jYk3^2d`p1w@8Ux%zW z--rce-=7;1lmy;_-k5;0_*x%^cd?^+Xhl zeP3htzvYs0#c0K!2=Kde!#rg`jJ+-opo13l4VD|C%ukg{zt>yQ z-|?w$3NZvRfFYBDrya<|Qfxqna+bnW`#=;>7b2>hpBU&aCT^ZScgXx5iy;UQ^Fh@I zKwd)kzb|+}0WlodQ^MD~>~Je&>K7rAl zv4=;%{uEf02^JV6UJ7(@8Z0VeA*H(*nPdQs_q6(_wSAT)uY7lR&3B8Uqj)s%-p9 z@8hQyp=EO^rFs~Pklx2vI(Z05H3zc%^s{@oy(?v0Z@PK42&znYeje}PAI@a^9gXV$ zPE?^Xc9PVdz5YN>awHlL^SnjMG(LD$$u{|{1dK%(U9 zL#+Xx&cCZlKZ1XY>-JxEJwUG=mQioy+xeShvy87o*&RS1gyatk2wiv|PP;@x;d7@g z!TK<$nO}3}uDS@sRBgmipN+fAu56^tIK5OfFSV9^=bbIUfrzA%ClrLIOVyjLD_ zMHusKL!acjvO25;`D}IQ(}A;!HC9;@8PqqGX@k2C81L#6GIvFP-Tdw?=-WBpYr~ol z7S^B#R=$%g*-#4{%NJ(M9u>gO|)Bv6*0=A5Z**>-p~g*0?|2?w;)zW^RB`Gn{kh;r7D) zu)IO2&qSBu#R2#Y@qz0vMQv?-gIqpI9O4vnb6VL+VDba_$^k%~1$1$a_GR}{2qoZ| zabgF5)hrK`%J-Kmd^J?>S5t|z@PT285mD7`vuGhpl?2qDv;I0SwRy7*9vnfOJgZzr zpFT-!QDJ|?-jq+OT{R3bmCqF~s&D%isz@Tl6R4E>&zND3;s(_lE{6Uy+mU#AQ zu(ws+=Q*nAcIZ{&N-mIjT0&P^Z7E7rFnlX(URzTOgIS38yyA|t(meym57KeASGQV;-@O9MrD!`F?Y*v>HJFbbWZ3f6NO_6rwDL> z=?!j;4-8p3ongBv8W*jb+T^Zjr3mvBLmlCdg)bTM%%kDk<0eN=*YwKnsl=!EmG+X} z;f`}6+W0lq>$9{mi+C)c5kyQ@jzqe%44>@{n$kTe(YCm|LN7I`O-5G0hnhg_&Fvp|hOFN6#WK$rxR>~V9Y zYeBYT8FO>h6k+omlfn zq~zNd3ZcBfBRbS~z$|l=@$}?|(w{C-`Rc=Nw-Wh6>jTmGm}Q-!l~1#FMaL~r_<+go zfno%wP~If~q!53uKf3`Qm#c>KVz#5YF?vxUy-S(gPPRX+WDLxe7w}qQ#YF^^)j{4g zUldI}JtFn3_pD-F8UYJkaQk=dHVYw{GA;PDvH@7+)_kA8=@_iURJ_zy<3h(WB56q# zY{^xtuQVS<=ZG79ZVx(e#{q-8w|0YHo!tll^lg0lPL_6UIW9l_FFg^o6AxPVWK>^Z zuQupK>dk+H!eV(KPs0E7&!|kR0jd4*$WBpHb7A9&I{w{D z+qkaR5gX{Wq};ezTGFP~ZQ(Rt9QD0sc?lq2%n@N00VnU3;rUq~QM4wOGa$wSb2l2& zdIqg}1VEV!m;LwCI$~uE5Lv|PprOFV5deNQVHGqYIykrLhmEWfv;8m?nDoCP7gRK2 zsc6|G5Np+~oV0NMy&4bBmMUMj{*UaO=+Q5yz}w|a%Md({_Bv|A`+}JFbIOjyr#FO& z&^0nHkSb$1sm7@>9z{(%vG&W_qTM!gw~dx63=5gP>t#98{eSeZ|M#+ez-!SScf#d-(9+z2vc*j)K8GF)?vEE>5%_@PQvx@yN^HJBO2y z80NRi#BgAymAL#a;7;jn@$`(0IvgCR96&RbUSgmfur^q%lccYxtB8LdCDUY&O@TRa!;%j* zpuy_=^gEIuIG?-i8hV=(1i? zzc(olg8l#3VIgAeHiD59nr5shknnJNA&e$Idi=!yEJ+)qPpY_2oD9ripHe8!=ZiPu z-Rqh^_{OQAoJPXGpU{8EFQVyXC4*s%+ApV`|uYF3@OagSYNbEN` z6o~=M{}jNRvyc%(#|vP^e3=#qU91c-^IqylQX&vy!9M^3S>@}?^}TM8^)k2-86<~rk~^<*W3S^i~$A3{zJ4_Er67eKpRz*m?zI9a!^_RvyIPSP2F^=tn7myg+sRY*qvzDyWO1MN8GHR;@muW7C`!|&!(7m?~b zTf}pI_E~fjlIg|-sZeK+9}dXckVYM~s&> z@w$Yl_Ik#G<>Ll)Y9P-QE$FbRIk?XM8{}l=)o#+yNdhWL0c%d6>XO5tXP|E{sXV zd8`r_Q$f39YSP2N38?4Tk5()dR7I~dR1S_x$&&y)YEjW`VOx<87VoBL@=_G11530O zR*LP`#Y-!;jzW%!DFz~cYR%cVNS0&AD;E02kYN1hnGP)}Dl%1O%O?6P=gg_`AmC@@ ztHPB7K@RN(-+cDU<(sQ)8jLKyAe5VSg!oJr6oGdj^G4w+-jPtRT9D4c^Wz*)}5_5-5MDN40t7|@GUIc8o z!DA_+qRevllOr1n1}0cyP1vDgvrmQiO)}}19I^LYxQaEp;y>AZEDDh9zDRgqCPbpb z7ExE_?wjRgF1w|T>M+@S8HEgU+&9*Bd{z9*mAEr8RhLo9Ev;_q_Op9u-Ng-M@zKLF z@DlZhO-xQ((YV6@KUAidMixQ>#}5znrA;^I#TJVIBnFUpyV;cUpfx7p<8YLDw{xtz zF_Xz2{uiwa0@}JJ7Tht|up^ap@-q58!!rKg7t1F72l=geMUvsl|9wbHa{e=62>l!x zs~rIh)-a#YVV~}r@Th7u{*5Huh^Z7V z54XoVstKMqdZd4(f??p4o{qSO7SXBx&zcY=CvYK9jF&bP6M!5>mQY-7hUI+HP6!)f zR+QZM+FmYPh;rM2@t!{X35Yja^Y|nbP4OVOhf{U1xtf*yptE03tlN8-q%wXhN-Kz! z^i_PK0DEd@f*w!O*o?kH$+Ax_5<3bE+LMK6!Bm`!<+wi5U?Brm^af9Qjq?(f}- zq~2d6Ho14LxQc7lFj~Dn)1n>&e)4R$R5QIwGUll{UU4oJm8b?SeAF%7M)s{^jpL$htyb#XEccgsjp_Y5)sNxtM=c?XUm~3 z!BLUjgD7ch4+Gm2DPiGPP#^d%kwGUOkevjf;C#Ie9zbE?*Z%OF7@uzqfWIFk*dVY6 zdRDIhJ2{|_$S+Ny$gFkPo%hcN-_ut>0Sm}iZMEGWZ{Dvy^Pjmt#Kd3p+{o*GKXLgd zO#6`8epbGHF@IZmb3XG^tfI1XXEycvJg9JmjQ(b;sa1wZ@-|JLNx`-O>Gttf>=krp zV1~Zq;+*elKJ%S19-_+s=C?>pS(GgoYb5YMG#Q6Npsp90ycwb?*vVkQiO1v!G0rFF z_Pi5QG%T1O6%h_K)ImUjYtPH4vRu<26BCyaFpPSE@UJu8q|RH*&0~d$oZfrocmTQR zt7a+GPJLv_n3z5?ATJH|ceOpUw4ymYUplcGXeLEGL-Dq^75e*=(O`*?qDMI7jeI2= zlBtCBqJ`V%wena9L6@cYS|x_huaf%rzEP?gb?cc98HCf9o2Ff{mYZYOaQzSaG8?d@7ona1@7a-`#=sxF!IQGnAmv zRVTS0TyWHwd&5Ch=Tu$WztX!~Oby(eDB7Qk^vr1W!vGuNb9DK-zBJYlrOH`^yl&U} z41L?>B{!J{am6KGVCj}VMf}u-3L3`tpCAeKJc|GA=cuB=zNJWA1T@RZ?xxDdD2Lz- z3BBnbyzyjk#k6Ug3wHuu(FxW z(fd;&18{lveGD0PcLpN*YW94bZKe4Y~cSpM@9TZog#E$xTtX}z67CF{fmq$5s$(MPFXRB#R z<%{I^IoFMU-&flYr!4-as52{~bQFh5`h5TIk}2|DyHyYsVaxfV;2)@;I|lXL8F)rie*vx zNkUL>Lm}MAu&h$NO|7LRao{ysPUE}}m;UN+Lcd;M;x$+0aheLf0 zQo=@Mzg;IO`7jm!-3%Qw!cRn>F`V8qnjQkqB^D-u8!Ni)@h~wd}#H& z-A+9FyOepswP?-G-|#>q$#>Jsmxdrd&2s{iIvx?9Wd5UP$XyuHgWZe%^={xIS&av- zw2eb!EUex&E*+1`;#h_$)D6@1yk^Eh_|K7+sT-3Rk>q$dHA$4q`y>tn)SZiTR?tn8 zSBLR7 zB%F`f`NrBT*8j9!<_2f$2mXH_xzoRW`q%-=x~}6PJNz{_*zHY5T+=A-<2 zg7errxz~xM2#+TNCKp8z`81dm-@=AO-<>E`OioM~gg8}$5hB2f$OIk8-asXAa<3RL!Qz5O9kVga4{9qw&%A;R@tjzH6`TDxm{ zPy|3C#lni{vD?hp2)QK~5k0_Kw|mpUSVIgM7Ua^^+PRXfxa9aqh2|D@ngB)dZ1q(h z!Uz)y6(Nx<7ctYyK~hmx=3g=wK|FI$0|wM}%=E}%P+fh$LoG$%ME3`VsYDlxBa@ht zB2Yx=goY!EXohZiyl{E>2KWQ{{cidUeFU7Sztb@#C6Vhsga!Ub7fqzybLvbv$F z!D_25^-sqeO?=DbEl8WAycRa0+m*&HHL82SjIt!YxK%?bZxK0sYTOCxuv zpRB7PX+K?P;Yp_wVKF_-em}<%=|Zu%u;31gm9fuu;J$2sI&6o39PSKw&Es;|LNxq#uM0u20nXksmtOjB~3D=VDp-@CcpdYZ@%HE>P+;&3y19{k|4`!=fx%j7M_D zr;lGif0=1bzDX0|w|SrtfK!LM2tY8`Uj(rh#=^gWeK}z?rN`*i>^oQ(5ciy)pNmWm&`GdlQ{9xw39pAwch3qWmYCpVpgb0x zO+3Z6)IM*)O@l2FXy~9SQ@mqe8lW1TDQNeC?)V#gD?P8u^x5rK#iZ|VO z&0PAnd>#2+5NJ5kumBLG^j&WCiPrLhDA{{`ZTr2l!UMsrTY6T5}70k;e`<+hJJNi z_Bev}aMrGbs%F>G5yA1061f|TCzC9s16CMfvlw|GDeOzXYMl4EHcQPjxRHV+UQCgM z_sfqY{lC-H7RMs+J2FYUc|d{V_gk5*Nj!`a_Q0_>;hsi1u-@wswWo8OwiaWGRKgZK zH^xZG%1t#86kh)7n~1@7>2rB#%MHH|*D5}sg_ih(b7aMj29KV_Qn35BFDWf#Yp^=9 zYaM%{%)~Mc3kz%4m=iTv?bxU#4MF`-RVx})_b7eqhdEH>aFa) z%(-1#TE6Sj&7eGTF=V|d>tt9*rV@7YvYQBVqJ`77*kLz@HS>d+h$ z8O*R>U@B$n;A4*=3g(k_0@#tP&oHZ&6Z^=FzT+B& zdduQN+e>rfl8Su`p%sZ=7qvtkFuTM14$4D6eeSRG1Oe1Vt5qKfQi%K{aD9L2F_dI+ zN(L92#f1~tq%Y$BAZV1sRSxLvaGBNViy@a*I-Uu>XDtk0`VSy2X$VTn7CWX{GLy*}IFGC3zU`U7t}$%Whr1S> zwJ$yiKo5ti@6NleESCKC@u^l0=gKvR@V9Wrf}UiiI&xgcRvLaG(iiU;*`+{p0w^drwj#+ zW>jQRAaYn1ilI3hiP9?8SmWp$qG=JaSLx|-!XUYtr>^` zi?31vY2Fy$G;!QU#gnMQ>HX)s~_H2;JyENQr4Go21+) zn1U(sjohbIhC8!d<|v%Ab|+{mTYdvl!{?m5pX!lUhqE=d%gqJ?i+4nYkawd3&%D4e zK!%C;heTkV)oeAG)!NM(S=Ju|+5&(v0;pgNJ%QjFeFF4{DzniH#b2sEA=_<@_6Ff$ zFN)G!pdomn2@x}hpbQD@JHNZhOn^3Q@Lg@i$~%IdcGgV+1;dOdmt{Q~e58v$fhVS( zKp}bO%b$IO(oB(IPD2H+*kcn$cQ*mM!f3(G)z$TUSKyh8?!p8J(_5N1(GFSM1W)d7 z0f}EprfewSK)`$6PnyfDtR*UHl5|9q$*@a&PfesqdT?`V&gnwEO-|pl>0IAX*lNvd z%Mpc$NQ5xy`P2iPaum?V4s5Vx$dir|4F>QcI<><)l||}@;E`rSDH56$aC}$}XiA%m zDbTa1CVp89s;N+s*jHJc-V0zx5L3NFJH-1uoGm`Ff!B@CF8;Z$7J|>c2u^+43jLVR zq#{R(uM{< zU^G*yC!qgYoD<))D;V)0KuB~Ob?wX@h=JE?qLiTUJu3~JqQ;TEZ5Rrgvhyl1VjzRz z8>-wo7cXT4x1-Tdz2F{S944+`MZfL6Of|K%rhol~Ngn^!oS!%x2!oHP6*`G$0t?}* zeJ}oz(>(Wl*n&uvIAhrGy*;D3C=S{0__ca@Q#{dZ zv#X=|cPx8Op9ts^?@tQ#(DwnIMmVMA3FW6XiDGz89sx%ZlZ^LCGK-nxj8vI;igeTO zb$iWA8&2ccy#B+hiSh9tPEE|MpF^nC%*@OdT6*8-PcJQ{IqbPq+~~7w0@(p6mcg!R z+yj3618o30(nr26udEzR`rJWqO}wx2 zsWk4&)pkw)%%tSFii(t^6XhQlh7Ao*G&HHtxs*Q|yZ;1FY6COd1{99+6waz?9(Q^^}B*y!m^1MV73{io3NR zA%O1k__yBebsENDq}0Jk5-A%S8x_3o^V6fSZ?A0w3!rzQZzhg>pKr^Ao@?{D|DH(& zf%I!gmrfU0;6(Kj*M&z!eCBUx8*Kyd5O7!#YX|-^E2~>SnfD6Vh%XwQ&*|Xn3l5&3Mfo$9Syf86>e;wJxYbs zGsz^Wt}0yJi;J|?f%+OEA|g&~HJ71n#>rBs-n(LqeB5zq@mwCc++Qa{q)@fmjI9Ns zFl4w*+>Cp{SA183b=eP!Ch3LW_f3gFcu>qek;EE$eyzrtkG)@%9w;`YnD}MAV?`BciGoBQ4)|9wl7uk`q8$nrFSylL=_AnGtCQ+-0e`mtJwm|fh%Ze&I z<~lhg1s4d8GgEKl4pc3Pq^qf@c&vmwn023#REy=DuI~%fiG5J}H3IY|NT{ zH2yMD66)VdFs@L@4jF-Lf<#Olb4cC^yJQT!PRu9K?OcgZGpBh*2xt6Vrf3(UM?y&p zldp@pZV6p`LL|TMl~BuuDG%jl%$?re47|KzDwAJEU$)*-Qxlo|5s~4YQ4!3`6db;! zGlQAABN7E+s~P!OSH_D;d< z9itc)jzjaslOkEU>X2Lez0Tm^-~p7OTI7y2C>PG0Y33S4*5VhKAw= zXn~XUW~I~Z+Q5$JMR6UZBeh20&>2)~JCCnDx)I1|qgyoJYXE$NNUMN9$t)rF$G`0Q zF9<@PwkwN@*0Mtg2OG=gKuFXGzEH#Ln;dEWyh$OK*8hT|NA}(TWvy*Mrk1_`W?i#$ zJ)6SiM4|VvfyIKm3bbnDfs;WY&an0FhZ~OE_gM5>fNU@Ms}fFd4gAAk{iARh029PQ zK%M_jI!|Jg4TkM@Plc=qhKtCQcrtO{tAi-9a7XMIvQSHQx%g-z$}UsiN!_0Gp!6}y zYy|*x<`K&vtH929gwO4OU|T9L#9tMkiNMVy8zX_O>{f&PIFqLXLC@BR^Ar^@D z+QZp$h0;t|KxE|sI5-(x?2G`{AzUyIAk0#)HkM3T59{015ElUf2I$ew*Zy1}v;N{S zg2!RI1(1Af1bA>+_T-30Od!bf5{`0Dyx*4$HyzCw0aL;Qm`) zmdj`uy(U2o%bOkoKT}j*ZUR(wKmq~KK8-4U=o-@zDHb&l_*<2O)1jcw`_{1l%qVCl zu&}b~GOhXPer8x8o0@QTF^?K0#*{2WwFs8Esp+4z0T4XOii^L7gM*{hs15`!79SS- zDG#dJXLQ__d$tqx{(v|PWCd|?arVGS#+1!l8$>b2FDFGuT*fz_Gt)dMe)F0fBEuZ0u79Oqg(P6m~Ff6m%(0_%O={3jp34=61aFkA=?6WD?Ho z{T=Y~#CWYiuf%5BS?x&lQaG4weu?D{V7Cqh>oX?RaRp|CTKS=UM+~c@aAFDpa$Kck zqRF)YBMHwr)g+o^QD?2KM0s>Z!kM_YG>Pcc@5hF2Mb-q}kmVP|c*YtO$ZxhTlh-XJ zW8yBjmnmW`#)wA(EaKzhirz->e|+e(YG2F0S(RAy{XA}1pry3?Yj$c%K|vu)b>Vd+ zz`ry#neV@LeT84yTM6^$UOvg~NL_XJFZmt*b@8<&MsZOjVK|9BiS>@iT;xYc5*$uc z7IKWJ;ou&w5F96JwIi9aC^9;2PGqQ%!VI!nZYGhG$XZ2?>yCyu4x+h#+xW@hMOx&v zxci`D#v~twBr4E$qzp(>FJ-|(d&l>qSAr}i!Q2!AJa*(L&^>dE{XcHyap4UH7j&sNp_72}Jr@>IGavT(AW*_J-WQ!_8DXyK53Izyt2TFyYx zYZ!WG-RO_<@WWgxIdMuki%S6ENTD`0-4P z%;SXiEC@ zXAaGsJ-Jp^`1Wq)A%6<%YYY1{VoY4qEXa}fahT1fEY-C?hv}ArV!w5zfcU=$uCgR% zdXG#f=i7k4R>%DZcX9K>!-QH=$}#hfB{-sAfp@w+ywHGWijr#5gAYTpLfA;wORf2n zH06BlP@x(+3wyhntpOSR&(^jebAeZ?YP#J&`L9UdFgDey&Du^GvF&|6&h7jsB8YWC z+lKy1b0W>-*hfvp;>2OHq^Yzhpzzm_6Rtl&bl=+`A#8+T;#n(M+U%H8P#B34`(c8U zJI-lrY{6QKF4_seh5YH+)3yYIH|7*~V#4VW&*WC0(U3x%*k^sB;%J97lK;B%%5mZo zCN!y{2ibE*>Q;_YzvDqI7XjEa%4#UmK%*(q5NgU=27A22;E4ryt4HTsHd;~F*C&$dua z#bcaBzoNXo4R(vY2hQ2{vr8-Rqw#1AMlH^)*suaX`33WV(O}k zu30yz(^##_EjPRNzUw=}uG_29o%4CP&s-Bb9cbaz7c$ZlX?%Cd@#slWwO+6OT3F*v zg!($V(lv~vbf0~*tfw5VE@|&yA6gc7J%=;rim)?^%A*8v)FT+ju?D~jN_VD~)K$S$bR5lEgyt=5@@Mqf2 z6Jo*k&Heb{mBob^hNxh|cG*nOaIiY97%!oC1HJ)MB33VZ0j^_!i(j}$N@UvbLQTx43_5dnWT+ z^<%z$jumi+Du*Bwb)GDj&Hi-WP#^ZR2}hy(nQ}XS$Jg?CmF1-Iic*ijfiD3ZPPkgX z5nVPvNA3}=aCN+V3=r`$9^7mpx=csX)aFixcIRb;FX*nuusTB7`EJUE(-olLC<=bT zJLm;pd;=rN@(<7sR=8&ttr`#YPI^qo%xpy9U=bE{g~xAJ*>f}eblDTFd>^ef^K1>S zuqn`YYqk>QchL=e*B{XyEGKngq3iiCsd{%7IVX?S0YRgV9M1c8zaeypnda`HP2hR! z5Z~f(C%$s2xA3_+*kW5$_yF5QGo$5%g3#CJ_2>~#M!lc)*Qg%0czjzIGQ7la7ynS)j$&m1Y;3nE=(USDugxrv1Pe=JdGuvUe zQ{N6bvcBy3@EmZy#+ufs9sXv0cV|T&xn?e&foe+4G^LCjs5pL*nP<*e{vJg()`Uy; zP)Mgz#F@J@sD%Sny3^sw&6)V{)X=h6n>!^X<_&0z^JzI&0QlssR~75h$^85is52oRL@HmY#F0P6lV%Rx*OS(2w`7$Fp)c zeKfD-ou<2g?y;rRuK&oDZCV!kIo;ivKo3qVNv6yoQ&KUV(a~PUcM<8c3Fye-z4p?m zlfCGL2+|z;wQ+O9du$}Cxf!33($RTvHUHgBJN;acQg^^I-P8P)^IA~ z-?SgMqfH$eojDosNV;gK{FPRz%Y~nxydQNyo= z>NfeRFSV$@24?NO`26%7d)^;PQ@JhsQqtVFaPH21#BILQ_-%K8?}npL3lkf@v7Hxt zxM+xq`nk=z04|tGC{S{}#+OY|_=4dw%?m2FGzH3(QRe0kOG~MPt08*qmMdPb)e*DQY{qcHifi%+$06CasB|Za)a+E;kTz4fM*u0US$}pf zxcLm!&d5OQ^S&?I;BbFfBg0HJA=3QGenMZS*tF}6Le81HDcjb2BD5ld>qn-~h9&+} z#;v58j;`EgvJo$SMJ3*7vr&}D1}eu?lsr>TrVe8iVCW&Hi;-bR?HXT4yK(L#1%j|f zQbz;D4&O%N&vv@DX8&>TFb+Ru0(w-Kg-G8~?eMKy8+$A2&WJguG&K}9 z<~5<=Byo7`e9zR<=0H>H5|m2eiM8sJW4RZ%7EysWjaVppVWHqK@l*9*=-|EWH>hLg z@AdvT>+)~vft#PL{W!;*ugaLB)J%4`@r1)od#HP2T>AcT?EJPYNeS^%MCR$fe3|xf zd-CPOd*AL5djx6TuiZhB*#o6xl%r*6LXUssA(KzgM$(rVl?UH5I99bLt2qs|Gz{;c zgkkP#+(INlzGUMdEYV=*urZtd;?5RCt5}5UeB3|>f-U}5)l?N7mYQxY`UGD> z7j)d$n|6=SgP%`Uj~U&n{*6xeMZEsTT<7ef5Cq}OTDHCDxcw_gDHord;8)41U-9*L?+6wDkw{63!d96mcS%)baeI=S6C<9+@q*2!bKeKcINzc zz-D$h z-t=fO9kBMl3x#=jI=X@Ww^QBpaOm)IdA=iy^__{a2R-nmUT$`zb&>UE;nY^+>BSNzoJ#; z^}BBjWgYkz54HXceIslg^rm5#uAI{euN$If$b&ZpGA(Mpb^?d211%qYnDZ!gM!iS2fT%6$akWFel<28+-uce^}P z)k%9uf#zrb=1)i645lnl{-kckVJXqd6>{7Y?}ON+_w&v2u$wCFCq?v(Wj9`pXC%MS zPpoooAG=p?GPf26He=d2Z_8?R-H^U?6&R zDX0u0Lru4pnc)$^9-RpSMe^7{m)n4s;Jw}Vn1Z_nx~<(2rSz%2{X;Q^3arvbCYLdi z@*M%s!r^qu<%FC1aidp;0*#31_A3#eqM$E%6}NYSyT(SYNyegR(&sPX z@e;F-(4FKvl0=NT#?rBl1QFzMx-Yb!oOy4g#i|` zGS>E4m`2@$^Oeej?U2{YBA*C`dZC&|!UM>X0>_J_OGhOiyh`=`<=X@~Lhp))Ux$?YyZausLgo;adu&KdH{k| zbs5B{=cJabTib~WS}f^rV|Qchm@kMp=r_JyXj1ZoaHM@gM(^G48fJZsUHZWYh1~Fs zbI)ZOLMj(_)ppDE>KDxpSR+vO5QuMvm@1M`M>u!8q`lMP#IB88IOS7RNHRuXo<`S? zr1#f|3xkjlDDw4nnSKi_>lQE8#uYROXX;S?{N2$9Huoc%s>p(o=QsFr{12%=#3ZF@ zATn%lMJ(`;X;G$dW@6DiI>R;dx!++`I397e&i=y)PG2N@p-dLAJryY+R_0;*T&T5< z+}5VG=ju4HLCK~>b-f?+?;zahFxA0Milia_n7FxOaf;N5l5xora`<30cx}Sg56y9V$wK> zDxWc{H&Q?eZ~v{B(bD6d6(IiGzUd-670A@?#ljqc>KOO<#%9MWI?QsaV4yL^=x{ep z`|AJ`+jx)85dAs3wx8aN1O{X zo57nP9`XhKJ>8A!myu5sTqdX@YY@I1pZl!lUutx-ml>n{(b3d zBBuj2Ec`bb;(2VVe~nDqUi~s%d(%i-vB{?PR$Ls}2lY!2I|t2qnmW8B<0RqaMR;l8 zq`^g19jpKEcy^AVBRQFkj*AbYqLD2d^w~^?_&>thdykEimxFY%=Y%-KWLo}GXOnY# z#};9st8Tf}bnggKB4}5{8n9G0O9h*tqG5}M#e2wMYVw)GQ_cSP9u zdG&6-m4dcp8Z6XTQPPF7$)Oa8K+_vQC;@wQlA$Uqivski&?BOTOa^zZP-^gy!y<=F z82=$A3FD*<@&tLj>}m#_aekBK`mB69rzDPpFdzq0P()J!(Nmy>!XJGiB}0YPzr}Io zDb)706m%cbY=JY06gZNuR@P zr8$s%Csxl3I{vP&m^QbPR2* zXtaD0m9sp^^&zL}$^UG`J$%y>KxvLP{O9>VDJDgS-Q#qKMk& zc$?@_AO2(=SUI*fzTwecSzY~nAr@HGlnIe0zo_V?-}{M)6G-x_y^XilQh(g8NjYp% z=!o#0>{K-tB}@yxd&A)IsP2jEx3SrHXNUl?WOcryj4=XeI94^^!k=~?vP=qKR}$c! zGul{&FXc7=bTKK~lKF5)EnVcx z@QyF6-Ot%*e%*9aFU8dw*@p3E46H<+OPc-4hW=C2DJK6=?H?KDhZ}xGGg7e&C@c}w z?N#we6KwrS=0$Fpiyos=@kn=}iHJwep}4+jaM3uXmgCCgC=$+b?CR-(^HVAVYj@#H zQ}Xd8H{uPXfo12)6EWU=&hBsTl{x zivQ+h8<95MKt(|G^u{0?ckC0NyK_ayh$;&qU$|(11#K`zo$UoadgrxoCZ`>{;}&07 zNU*2_m5xj9e#b*Y)$E{BnV-| zSh4Q)N4`>%L#npW>6AN zS*GEW-ZGC+l+>&u_xbY_wYG#JR?M~E*)u?gV zIiY@NZCcJiNs{xAO!KQ5EG{#$uv9F5;s%a2QVJ~x`r68aJJN|p%!x*$8#v6Vtm(n8 zp-4CK#NlCj_8S9a||XEO5K) zi2nju)A{+ixDuM!%1#0X;II&fbY7OB!}N5%5QAw*b8}G0 z+dsJ`KbKLw_l;lSCUH;^_r`u+H8^L=Z)=LFn8MEWJ6{mG?8W#3_Mm^;Ey(}A{5;2H z?UEi~7imKc41XNR_WnB=tLv}xP7-q_--t-;WASB z3(uoVn2B0BF*ecP%I#x>8G zWOKDOEs?^vr`FgvZ;#3lRe4Thf}-a6MdiAxx+Z_k1vJ zuDTn0x7qBa3`(3^gotU3Vd&m(3t$J;H41kXX z)UT0|k)0p)7;phHaQB%=4R;hEaF#Cjmx;&`;V|K#JA_*vzWevQ&YMnebkamSM2KOo zILKc({9n0k#D%_IGd>y#0HnPa^rXnN2g`@Qy;-!Fz5Q-oYPFQfrhiA9nCXB?`3UBt zq{Iq}o~x{PbX*GK*TKuyHISfxp+sAMiV8e8`+@kI`_^bSExqked&m8wrpx`>%0)3t zi}T2;94N-I5=MZa3jNIQS)0_~v78HPCdfNZK0r)jcaLD!oi}pWQBcYDpr++R!@cyM zg*LMx}&VyAac7)oa6E)WsP&<;)~yYhsCn!eZc# z@G4*igcPm4Qgj>;YG;bRe6h+?Oxhl}0Dx`cxQ5s}Au zwx)V{7qVO(2e>FWzib$zeSn-Xs3#QnB?PBDqYn6rtXL020WXX4;H}m%m7cvzDUoVV zWoARBgsU+Dpa+1;qEAECGK8cpANr~j3#xT&-y-1KSQ{nk2%KpoGs`-+I^pGOg1H6}&JTx>Ydw7UfCf9> zs98t6Zgx`u+Ao&9x8m6$9tQ2~ zqKp|aio_d^wZY3H#fx143;<|I&a6qm4lJBK`hg0Wv6>Ln75Jj1pnw7r0DxVCQ~sMv zaYaV8WiPp_n!PD#U~xHL6##CJyjgKhJHy43B)3m5gmJ@FE93wxS%~xxn^-~z3?bb+ za*mIWxpy)uy)@hER^ONkv`l=c(Fz5~_`s?-D-O*3!mgYT;l`TrQ_89pOS}{tVhkQlc^JsE0 z7GFy#ueb3j{?0~!z0hs;4Er?!8=CX zh>eY2Jd_&XYHIwj%k*y$Rqd-_=P+Sn(=;b-HweuCL!UtX8`K@MNU8lddK| zwmx69vGrtmz}|`y}_s^c>wmKGn<}cxe z12-22Goq&Y&ed~Ch2!srEgmp9Oz`d(t6zS2f-BGRp$@9H2R*C1C(T8cx}9nxilPX8 z{uYi-{XLQC$;v0pOVA=<)k2BEXMHP6JMroO{-Nb^m88UsVsH--6VW|#(kvYg@^x7tt2L{vH& zdV_cHd8XH(k>UbI-kX)eyabh?BHer12Fz9tWOu~CvtrRM&AC2yRd5v z`2GL^;sIelHCXeCC`CWLBCDp?>Daf5ZX*U3NwXGHr3KfrnLlw&6HNss2+l_Rvqshf zbDSPIc!n|ImkEQZHq*GXqrO-nX1U~MWm6>imh>=so;5Fc0yXp$X=O|}e0GD0IKK5S zCUAg|2AoGHBh9D)rwnZ*PP*_J2w@%c2Cb{nf(jQvf$M!Aetov8+_(VTFtgNN213-5 zNlVl)iO&1&7*gToC(<8Bu2tki1V`BwI-_2Ylb)V%rC+z}2Q_`YW2wwK0O_5X)bN2t zM`|Uw&uAG_Cw+X#Wm;H9U0wa+V!+GNL;xpG+=C0`NV6-2;L(*R;?(TU%S_ zta+QguPY9wHhE?$NY!?6Wg8bNC)`%HwmVCfdBu&5TzhRkz+w@&uxGi~fWE3udS#Cm zfNKF@y6>1z1MoxbxaiITK?N5lSJt8kw67p2V|);r2R0g=q%OoYtS9hH~i zE;g7eL?gi?-ox6hH)KTDe`h*M(S>p=>CGpyMrq<4z9ULrG1vqGI`1_|jZaoSsw*=5 zmW=ralQVD5t?}0dyN0F^Gxh54QbdI@MOMv>_*M9?S2mV%El@%5%;K}(ZqP+>kjsMb zjBLLnm9*`o%*G!@@fj(^BRySiW1b{*ecSHkGfu}ucd(Pr!>9{VT&Q@{v0~8Yc!IzW z`QabRQh`xo2~kM=E&95bC9~U*I^w8FwARLkGM&Yjm&4GxPz(7Yd=C%dr@IRk0Qv`N zOr{6%)ru^c0K)mcX&=3SXJPx@>B1Exsr380b1*Q>E9Lo_m6_=oaDmQrT|z0|$| zyijSLzaZc!OxJD1k?=Jb4}@1u@qMiB`EygtNQY~5^VMF*&v3)IZEEOma`I<}k5oyB zwVl6^pKi|-y1q7K-)6m@h`jwf_0M&Vk&avK4^SJ+1**A4^JhkKS&u)p{|chQ!TjSe zfLD#F^1P23k55i!*YlPpV5f@qt~~E&^ZtA`k-%92lCW1z?&37qM9%0Zf2Y^8Mp~S5 z4*I7jj1VHjpyU#<#iJmy(U9BukDV7^@!92SQ|6Sjij-D-?Q45Z==j{cKRKi~Ir#KE z3Glr*9CIsew=4e`Y{>Cc+1AW5w=cqH)0LH9C4hpnFzgo1hvxhO%>gB+^qAd}H&QNN^1w>6@` zanf&;%$wRPm6UXbgMwQ85!cG^sYRdf>~wn18Jd1P+mx9TMpj3h1@*cZ56a;y(uZqLM0BAzp;RFo{-M>qeOF}kp!}l_gUR0mW`El`s3Lw z-#V?VB(0@Aw6*)TsgoHB0Mm=-I~yrxx=1Z%?6L<^GmQR72lBZk4jgo;N{*zMZp~H$ z7P5&{+wU_H7oNfsPwl=JJC<=s?FF}Ck)%Qybturd@^QBmnT+3-GLEqY(x&^Bi(?L4!#7T4F;2f5(N zN_%VA`TT2KaK>zyO)lAWXC25}y1_6Juy_4Vc2MLTPZd4yx}JIquda?K)u+JTWyUX^ zCULID!Q_8aX^5BIK_k~+S=(*H@O%6$1nP2_)9(VAz|S4906Wg zN%T^&2k~>?5BIo)xBa1DCa<_;#i=xjojhS}r~Hc6KD ze!U&vM&9czIe+KI{{V@hgyP^8d6lKzb5PM9>;EkgZ(nMI0GV{ zm%)RcwW=%~y@Hku841Zdnr6USJqwMkpz<>qkxKlMo6Vr(XlZAMx~0(-J}x6CHLcOL z`i(&H<)xTebzi1?LK1>2HKPx#(4MFz07ny2a_6_7V*e z@C2VAlVohYc_dG@8Q9t~&hccq@ndlnEp7#4r&6Ec)UU>jH4neZ{ypDyM(DJB_hrmc z=h&8^Sa8tkBO$I)N-uN8!uZiaTtL-gGgrZKXY{M_?gp5 zv>+iRAu5$fmI|%mqwkA9(5qJzsm0*+IqK2?Q136fRDq-ssVwc$`5tz#&@Knh^O97u zidGoV1<`YdJREqGID4l6KxVH5*Qoyew3#-hGme8lvqWPTj|hiROZ2j~+N1MM+b{V6oI5fy*+v=PJ16`j)aFmUn_69?rVLDt>k^luTJa1}hZi zGXs-k5*(EQAECHp@?>mRvu5ropGg{y*fmj*9kpC&7n@=Uk!%A@G>upwhfqJ$Yi6yg z@6QG-#F=kJ_ReQg%$GFA?EZ9jgXEV+o@ZmjeUU;_Zbn==X))`xM<5Clh;Vx`{b$3D z+x78ShQO>J@RSx-3mKwmslD0K6)e*;+A8bou>hII+{vrUU@cdH>spQl{~ZV6+&x+` z1fr>_8M)gWQ2rp9OvBB`XM0PRwe{=i1;E?qCkcx8Q&!zuZXz4*J1tv+JLNS>W+94eZb*a#MbrkJfg`+DA(!uiI*``H*Hg@LI zQx1Nh9v?@)rcM_4E{JNm?od@xkw2WKM}x|g@ura*;x>~!#cY1vD{j@6{C>+_Wz4%q zBbaR|+#rvDJ4IlUtA*HBf{i6D?%b4DIo)o+ktX)Ya~QaiWU`tp0KwRw_o#90R!%kT z?ShIbrKsm!U-Tarw$)jHs(iGw)CuHE+)2)*PKw@41}36}I1}wjMe=bgM6C#|HQB_t z=K0AH^Ns9SVdZ*80+7MsU@Yn6o#?>eqwG6D32IQIZEO8Jep!Q%kJ<+W(*YlPQNsO~kBMeTetFozE@)20W@v5n8)Zk2r>!sGT40+J{G zfL-wC&hFx3scUjBm@o=NOt=CsmF_Yo8UvRNQ)#$w4OJaIzJ2!i*Ky(Nk_M&>fOz*| z$$d|hnQMA{=Zb!*+f?bdcPKv!Th$lsze zi>uSYA19^q_qKD`P@FFQ+p#K=$krqMyM*+huA;Ef%B=@*L$?$!G;Z&cPR$m-IKe2# z9p4=)M!6T6%Mb7<<@9AXpG4P~d|GZrvQ&;cf?E*-SuWg*UQ&vAKVr|oZnd@ku)i;j z^&`hzrHU{aOFz$GTfUxig=Y4SvI*dPNYNive{3;%t`hOP6EgfV{%xPDv9u2CU?6_B z;N`g>jjK~Gh0L7=kFvIfI%NTS&~ zU8~L|`@OUVcvzQ{n5ev6RyYK4f-sS$kjSzIa&B)$nm&(ZO?us zVbfXSHdV2(z`*oD9UrGtGPrncuzJiy&#{q&y?(yczt37gH@e>V1NHXrv`Z#1b$JRH zNb7l_6#4t9c6;{YzMZ)gQov=@O~%lx=-^rD4C3i)b-aaIL&G`Fi_=p{u#uXXW}w4# z0fcM!xrGISPJciz&6LfZvHY^vz7Zk|_G#`gAY*O19_9RFz~);I z5r3C&36Dva%eFwyN9nkmKFlX@P15&rg%lMJE>clml%?5~S z9K8Z`OTK5hJWIOLg_iZ3xCReax2#v-bRXAaxN8gJdeny7$~Wy$87@X;;-3+2>+8&r zYCAV%3lk_6`&&fCHY~hjA_FWhIgEEu?N={N-1AZ#3oQlfk zgQL;=CR;e(tuut9vH_k2y}}(Z!faV{CmAk9ljKcOQDOgQ8-)YIFO20#k9W_UJ)#XB% z-%l_eamcncenvAf#xcjJ3-cPE(PGim%CL**?Ch-lM3@}I{cJU?W}px;*@RsC$^|cB zRwO5%M2@ttq*E_}t4T4+1J29ybrqQH?$z_LKYlR?89NXv9#}ADjrAv={(9Hy+7CwSoG}gg=J~ z^8VpEYzZU(wAb{~VUYE@sidGBLFZ!|?24Kk40u+;9~S0+{@i9Ze27+Fgy}tN*@$23 z@L(s@X2Bl-GH*7mRvoqrZ2u_wf^1xn1*^Y~wzkaO&wK1Aq3q(Ao`(ey|4w%dSE56i z8L$?PMsgX(?kmpcp@s{7ZlSbOJN~aU?GKSHot5{O`>l6LiXfQ7`!@(KNG#~Z`0vXk z+cV^jN+bZN7r*%N1s)JSkBbJNeHPL-cc&qg5p2fJ`Iu&U-%k{)5<4KRFK^wTxii@7 zQ&z|y2US+_Y2=geeMF)ed``fPa4gL})$4@yPWXfkFFY&3sMo%CC;6Y-m>LHPh`#@3 zs#;o%Ea>xBR95b{Xfb~HwYMqtdJ6U8UFa^4Uh_Dg@j+KYAf9BC-%f`t$D=SGR#xEO zAC4kEze99cq&Kw-P5p2Wrf-eCy@{1eaV94xWq&B^k*-8w(%Q88=b&yCdpcQKM}-W$ zUO+RSUe!qGOWNi6Fs~ER_|g?QvI9g{tgNm32DyW-j$jcJb!!Xn3GTy z*q5O&A6{G_D9r-tB`bq^>{1n_ph2fab|ezb)0f&ALbl7HS-T5F#jX9`rf_DqmG7!P zcrXU!pdA1|-hikX@x2p*N1qViZy}mA2^AT)Aol8V@Uj7dr3Tf?&K*=)(PRmuB9G3^ z-iFNfkrwr+M}!wo9xg9n7+%Jf7}C&^{IT%VnF$LieceW~v9b_n zc!zFc%|NY-P|Ah(ZQ6e)=DzV@z5nlZuTtwvz+bqvfsCe^pUartFCSaB4eva5(!SD> z@{0xsu0(z6b{D%|GF+SsX1DtxrfztD@Drh2vw?*_X=ph0i6w?AztP3(_H5# znY{+8v|cd9X4l>NJ0JoMq<27HzTRm^dcfz6k1vWiX1JvbkW>dHugPz&JVr)Ims#hF z$@253muWvsd^1qU7B^^b`l#GM~REP zbzE6H{G(XGZK0mU);p=+qLC=KSWr+f8c2;`025N6QPR4fX^ToAS5aA6?Fadn=N#L@ z4kaY;AmkBbGChwRHkCsBzQ4(QFK-ig@a*SZL~wv3&=Igr>MOE^q6~(Gx5^g6a`(M; zNf^+^13^(Rj9vJt-Tl{PtK(^pNH9}6?8T`cd@06@#0Xga*te+ZRO4S<(IAx{y)h!4mjtaSmP=TKnsmwhJf}+IJBoze_u;{!d{U;Ya z(JUlM{urAP@fZIdY^n4nUAV`7rN>+6j$!k~n*kEbxB%5(|a}MtvNNV ztGxcg#lxI=Ct6$*xDJG7MPV8P$$sI`eCP$Ji~g38H2k&1D;oFqmK~AB(V~P$#ffbfMn&_bf)MX6cb>G?T|6rnME`Z z9HU7;VbBi?$cjyK4@ZO#(Blg&3z>CN8buFXqQm6H#yQ7og(DVuKj(Cog|=AV!j|dd-Z2D`Svd-nY`&m#il)KNwK+`oEBZ9Y{13g}4HjOvABF zBq3(BMRlVmnp-pQRQ@9@!p0uvPm@2?*X*6pIaAXTMEc`JML4H9;lRX+0dXq=dZ^7O zoSV!Ecxs{RHlNEJj|9rmU-tp8JBiL_Y$VB_w6r4KeRn$U_iIi#GfXbiYfonpXMDO} z)Jb1z6E@pS{bV_^t^Zjbt~z)~O}T+IlEd~<(UIkqHf7(HqH_DEdaFYTq#4o2gnsyV zGo4pTv$QDtR^8L+GNZ!l(up*qzcXreu+Ch8%xXvxC|-CQ*%^GciXvu!8^#7ONt# zH_qdk*H@ErqCu$p>X!)F0{7&0t>NS;O8afa%2xc>qt?};*s?(}r(39V5lKXJG%iZC zbX07Q^(XjNz$hys6uNrsgYb6eA{Itm+5Ax8dYUkkq$O_H;odx#3Efr88yOm>=@y+a zk`IOHWw)T>pKe2Km6R-^!Ii<-JbHKk-jy#sCQa_ysA2sxB79(;(t>fQ$8jr6Xk_G< zP`eB0E#Z)SXzlk6TSrlk$yB)CPFsB4E0j}sEBy@;aU1loD5EGS4_iwl-{$7jFf&R( zi)kSW3F{=7DKDRr5@7VN)z6yQb)7`gx9of-lo*Ho&E>_RUKVHxRK8`rP2# z6#1N7QvsrI;_Z%Vl!gx84uniJGg@NwfC_gmIBfekX!}?^r=K|bJ6}pcG8OkM0-h>O z)WAE_`@z4@9*)5xYnSYXOA*r!ALGo8?RlY@b${IJR4!*bgLcgh z6Bh5P^TNT*>MFF3+T|sNLI3E?wxuW&R68O2F`1CAXNUE_3v5W2W)$g>;h;?f*G~A_ z1RZ@`Ai}z)$ZWs^yr9U@GsdRBZR7qX(n)z%PaQ(`SEwFt7P7{jo}b7s{`CF0q(0Ow zbvHV0fgUXgup_nxriQIO;st>Dsm31FMt$s|GWyIC>`GiiAVY`FypQD_@FXmp64YB&R z+S|oAmROD*jt9pULVlMt-Xo<~0c)*TPg7_+Yg`08d0piN#971@D9Ctn$zp1s%L}=f zoOZ91F&k2VlT>EpJnUoW2(R`tLcqFNC)7Zs+jouI_KnftZ|2<&uqH_SY|ptmi8aUK%oQ z;04M5K6H5gnjDa7dtpP!ecE=gi=Ky8b=-V0+&TP{7orgg(fcX}d%p4Dbsv(^^Kzx) zA9nHjkk_6|j-j=NDSib;JrnjUu2q@K;Muhu-)U4!?dg4JaMlY~>x?McN2D6I<%k0d zn;7!K_o(g?!}dYezWt(wNR=c`fJ4@Q&BbFL)vU)aOXPt-@07}3;BV>sqjHa+tNWS4wCoQ`Jnd0T z|J17RB8`1Scm}LH?F7@*xB8zIRAoEU%7#}O#nqE+sU_`T$Pp8a!%`T>hDK=&qGjsX z&)5|R_aReLJ1JY7gQRw9Y`P_v{fclAM-|a+X@dN|Z-m0VeXgz;8PyiK)MMC|wSOKg zAoxZ;3LAN13Gd7v&wMMZ{AFavOPz=agXpvNMUj&NF@N}=@4k3p`J@8Nl0TNN*@q9M zc>lP2*8T0Nd&j;kYIA-p1!5vixk-WXATVU)rlL=;Tt(FBLyG?gt-Nf^me5Kq+N&s| z5%#D*eV>=^Eg8QY4n%A679?Eu&NnpMJacP3`^5MRlg++<+I1dn$ZkFv*anTchS0Kq z%fL4~w2Vm_h^$R|I==fjjI}S|nztBpejZ}9Lmil$p@@`)QqaD)*l^@MnC1pW(W`*{ z=UOEot`sAe`{4d9+5JI;!$3|Ymon1G%%R91Hsx#~I5vS-3>k6}bsbpchC!@Z4!z04 zT2OF=;)ChAeq=uJH<~PhUmubWT}!_k9f%uXN6U?di~J0EVHBMrDA)an{`@(z(if@9 zy%fvMQRfOj-R{u5b20B%I-V12cp~e-{FZXTPdX5^7d~6bV4U=IYd{rtx`?;hoC?+a zqW!+FT=C6I%X-!b#X4CV1=-CCAp$J@9|S~e+44z^{d=qnRLCRHuh zma<-_hQ)J*{7ETl*(e<~VJ3d3;3-F1X1(lhBhK_8)$266YuwN2t!81pk%wY@X9Ise z_Z(g^?&oO3GiRfIeN47;`cVdXvtcSn>8R!iiMib}VuI48BM7ZrlQM1Oi^5}jwXWdf zDHYa>dC~8*9C0`6?}*YXg^jG$F}t{%Bh{D^{`3Q2-6%PFI~-Z`!`^}AL_m)ZYY|qK z1f|2Ur4ucK#~Twwu(HhElm4;DN<`v!Qou{s_|Ndy5tcW`P8rtk6e9oY5s#=wTF^ml z2Hn`-zrHhwDGR94&4YZ~{6I`2)wktH$v0$wu@vL^+w#-4Mij127q#3b*T=V)1RnZv zbsoz1qYbFJh2rnOD(Ja*?)-)#U%AGgQXVEKB4dyU%KFR|u{s`eQnw7%%7E0V7_5!& zf!&OStXG7pOozXQ)q?XTyU1CmRiooW1`D%hGd4dWJo@`r%xahf4^M{_=HQ>Pidv-B zJSg-9y~<BdKt`y)btzm*d(B#!BJbkTF28>BK`FenI#W!(5fXP z_j5&UwhGby|Cii8{ER^s4fDJ!i(zmo5`w_jw3R}#QfKcaOo|Ji?!(q)pJ{RRSblxK z)tBOVaSE@|pvuII?C-b<=kMJ_@Yi~lNvN&>FDnaDmsAvP>zg)wQaZi!^rW)6+50Vc znVAvpJzmLR8VXjcuU`5Ln>Zz5HsBU_z-Q%Ci|>MwmPC?dLLLty-ew)FSub) zg&*RNMxfIRWt0Akt93?O$hZ)u58{Iu7`eURPvESyu?~M=;tCQ_4NsQcF)_hMNi9y< zhZAbP*a!JDf)gTfOeuzxFc=3)8O{T)g0nt^#}(y$4mX zgglsZ(kXlcxWKI>wr`kQuJ>v<4$ym-fzI&8ccEKl6(Jcr#UdJ&lH~nSh7xU_$b6Rh%O`e@V;r z)Px;QCvam=%63u*6V9kb%~8P4(G%u!?(4wE6(nsdof7BWR0la7%K%^rz};AFFPnNeXrHow=#06fK znEHfLUU6|5e>=N;+(OqN+4x}d%53bu33}=EE1?W~*k~4UGn~XlxW#)4q3J)ui#2Sq z*S$39SoutJQ_8`4KNk!<1noXFzCq3#iMn4h)RCAAhX3D+1{Xg4^=s)Qh(sMSzRm}` zB5WLf599XJJEzXbq$nC`x@3y!Sjt1uki-qN^nq8Uv*;wLSP<$iOUL_zT0(#6*=3%? z&OMy)+OT+1vHMGdfd#s+85Bd6ExI#1Mq1B8K=$pj7rYA@6<$x*EZdo0zhM@mzxvyPzM5c zTK~O)xF$^SKq<`}jUbRE9hmlw@9E;Qso@qdAOp6^q{T-^Fs*LTOQtbj`M%|7)`pMV zrU&^VfCm)50S^G2jh{3gzB#7ks7n9%OVW6=Dy9_YTaj{m*<=9h9Dz8_aOdoeHG`>3 zuR{wvA^6P19U5$I69Cs3!#iAQTCg0BGOCG~D*bK}mu0Lv8wILd!$y4Me)S>r;NkRc zF;k^x;=!!GkMs2TfKsZ@HF(%H_-7ZdpA)tv_AtFzDLb9G2O3egmYWE4Kv3cOj-_Q{ zTHFRf&E+5r+kqk zz~ArsD>HdQ$PWL&Ro)K&#MBf3Py;Vl4Q`PP*7u)de3bJH=Gs^@6sa;4*$#anZ0EQ( z?^10IU?O(FHEcw|dC+4SHv!V4;`=yh=1HU{S*n z6r6_+34cyhi8J6Mw&wEHhddxB!<9 zSEZuSt;z{{V>@4WXxo&1lwo1&f;OOfHVl*W!G}0(@PHO^(aRcCx_t1(b5a6ep5je~ zr33RhzB!-B8BRNVKJDGp(T3QgBWtkepemwQ+`tNBrq`yzMeaLu*B;~%5Qx$qsI^$B z`=Z|xyAiC)pplfHPJ;x{fc$$RsV^TXJCylV^6epLV8V|VWhaiwAuMcvm`Dw8dQrQKehIUmQf&n$;cRuu6GFFgEE@#g`RZl$oy(PG{-z&yLnr_0#uX6GQZE` z8E6t#=xOilu1cXB)fT=Ra652)fJrjfAx*|Gu5;iRcjHlp@Z3R!YSQ1a@6;T1sOszM z;}a;&5@8(^anFZCaYTx*;`EfB{=1Fll2%v|LU$LOg5jofoK-4SG8C8$Stkr$O$;g` z3u?a@cqh`>F>wHvB{Xw0dWI9K7i$}lw|I;o5@>l-ON?(miakJmJY+Sm{$3e;2ksMb z!M>jzhO;>xZ2r@QdjZ!{M%!!R#W6e9j}#VCWpW*l6_0h!7PPX-EX>H249LLi>4kCE?8Qt+{Q%+>~=so`=8 z3+rD6o6-ggy|H4)v#_Ar z42V=>f$AjG%1f1OPY(pjBe9Da80IerFr#zE|4LIx(2E#RTY_sLc$2P}Clc0%2PD+2g_YNEfBw(!U z>_P{&zDd@x3mkxlY;nq-kCopucN%$J59Aw8Ztl-Yvo_!ufZ=c?qm18V`olCE3<6Qk zX50)XVsKzzpLo%%_5F)KH!p86gkh2gtXbvK*``fkTc5R_@gzVxV(jRMi8??5#KT9E zX$5OQs4Jbd)`bJn5wG)jJM^wzxQyqUBx!&hM*ClM9nNLm8IZTFmyr~T-wR?97n*`O zRjcEc1aCiHoU~J)hd8x#Ie!?yKFm)20#VtZ+@IEVVP(3dmv^(4QI|mCF_l zAP3$U<>g2~XghpIiJz2L_;z^5=^d6JFK;-QXe81^fpPs2T#DfO7d+DA)+}}jfD8Nf z4UtW+6)Kqq^nPNGk8K97hV6KzXr-c^hn$&G+gWDVdDfOrVbWN}!86Kfx6)`iZDL{q zHqw?U8c9g zN${&#f!~P1ti8zFx3>4IPft&PumY&4Ge3SnNXFyVJ!l6m+=3x*cD}Bd!^**sw~$fx zkVL~oCZmdf?nT+g%bS$P4osPNUPKi8EztMW{0CVM8xf()s;r)B0qk*~L(3pWu4Zua zNwRXKxyq&Dm~gA+l6HjQqtZN0R85Jc`@OkAu#t0?RFNRU8`Lg*HU&pr>FzfF=vT!n z>?H9a%dm&OJDO-~m~H~*zQ-e@5cO=rY=evWAt z-l^f~4;!WQ2*;Z@!P!Tc9Us)7;SjAUZ+C=J+yE5^j>k&zXe5|WY*o&aEe zW-fEtrhA7Ius(*Am&*;L$``xF+pDparkw!1_Wd4vK>5=2{`G_7ihT>^SDLiFHfhCngLLR#JjvS45S<)l<9RTsYub(#A;KRDi-2wgr=qV<2CPKgfwy3l z)!Q=xv`@>nW1Q*c0yy)R7TxSbSnW-h6nveypF|U?2>n=p5uaP0^EH2`mP>Y+F|xK{ zT=za;b#-&I9@GQ?afgmG-dODf%QL|(p`hxjwlMPM531b^i;b4RNM;jua^vmWw^zNe z7*_ah{PD2U*CqId{PDAAv%CE0qAy1(GxPJs4^Mz3Qtxx;Fe#!DZVYBjimctc_|Id0 ze;cPoV%FE!Pd9*6>FwEy)3orN6~3rdX882M$2u74p=jJxuDmi1^}55G+85H6=e@N| zPTo}cjL4}sivNcNSl7-_E_IXe_w^;67P>|SZix*6jbOkJ@RClzxb~aDcMuTwHO$pM!uJ`)j@pJ#NlN09j`Hb^u=g&Kupy39 zNOgM9c($1?@(2j;i8*Ugz55|<$~BO|JE%l%%2l9q z1=!Ne8#M`Hf)2ctTv??@908%I6By2h2j8?EayA+ON?)bsSUpiz*6BM`VBAOYR?ACkUA;hdrt zyIcQ0!`48ATfoKnc{q*S{i&sB<&g`wQWiGkK@VVeWJDjafH8D&ht^&IkS=!1GnS6r zZz*6Izwg8F54=8@J~=lA7Sa@Q*mtWg3GtO0qE$t*YTH*MZg;&6cB2n8EzUJMz!Crh zM4{#qvJYw1WuJiabZM@)JV80YLH~0}_{XoZTg)fg@yz8D&D)K82V8_dpI-<~@6d}r zAOSUSt!mxWm#2+CXB))qP%IF_m)87M+`ZHO+U&8KB`t(8<{GmWwYn7s&$Y0TIAejZ zC8nJ=d#@YX;N^6CMpm*B;u}O$-q#<<$=lnkY(*Z zja3K_|_34%3$e7aAxVg1MiC=2`?49{pgvit1I}ee?)|+ z?|P?e9op%{HfaiBOHHf5UV5QDjEqZfZ^DUb-E#*`zxZRLsqddBz=HY6t^d1u!C-c+ zaLI}9uiqyS+GiMM{sF$d-fLsp@!E=3hB3oRQ{h6L_x$y*bYl5J0D;g1K^W8-g^zin zN9A9V}=52+`k&)R=s z-k)?N5-=oSH(+_pO-f2SwLFOaET5~*$X2*8$shZ02P`eZBO(-*HRWE9A8hk0r<_~B z75Xr?pt%$lWXTuZ>?8japUyuL$%`p3FHcr>FLp0q*kxzfi1+_(7XE83giqR?{O7;737_PMUv!z8q_z(IPGE0i)!|a@T2PoOtd}6f;TnGX7+Mh zs+yW%A2f&i_U(mCOsaMbn55JIFPTDs3td?;mNFYXT`vbCOd|53NzVfR-P|8s9Igwr zl3?1x2w=&?`Dxz|>iajoG=n}$IWlbuJcdz_gbTN9E1;txsitMZt|H5 z1~_@KHsOJ%MRLg=H-!>Wl{R_734mLcZN<^)$W}bU6-ys4ZXC~WOxp#uv*a8>by-iP zskCBjP$pv+Mjfax87-M?wT~r^<^=MlOB-Xd8HMR;KGaLhj!Z@lfC{qdtIe@vmi)y> zPy+7XJ^K|%10=`)qv2AK7{z1wFW!m7s%6bo>v{Ihfg!6qMs;(`WtV40KmGgUc z#-#%pL(JC-^j^RX>B-1;&OVAwU{qOq(O|oxlc62t_gJ`>{M#!bYw^G_N z20A|{5zAij*j#BoNy%Dham$$9A>+)dTGQz7F{9Ng3CO2Q=QMJp>V%+wH8nM{%U%+z z+cNcx6+pB)1&NjVCsRccVOR(*;J?Mi#UbpdL}_>L(*7d?@d~RH@gLMF4-mWn%ITQJ zF#Fv=fgLAI)(giF4Z9)<5_bl8YC_E?o$CZRtzfs;X8xja!@mphP=a%er;_@>gX z;41{*4&Ea4w~9JSQHYne@Uw|Prt$<3ysz2XA*5(aE6@obA@wD5~OzcA+=vK`Jzo|87 zb<0)vt=r(T$fc*53mOj|tsE3V*|MoM+tLS6O$Q95{$yTR%$5RDGrq3s zvoAeXxP*Kilt!}lzVGr7#s{dy>kGUXKAAHD>fJYWrP0h*eAivVD9oP1xP1W0*=sObo zGBYe~IXtTY$DrC1?H|2*$&TzaSJtozf~kgj`tPfV88{s0>%a8OS2jH2l_gqyBzKpm zTMe!@VmQmvZ^-zCu2%vsfKKHeSoh2SxbM?Myt?&|Z43{^AiFr^h`Wx)Zu zaxbuPO1B*an~UdfK|!QURH`=2$gVGE>-aBaKBWDj*2{9G`85cyK{Z}TFY={}!1b_+ zkRQmsQ~&6b39TGm4dnC3QmNBhCzhZz*S=6CRSc%Fjkh2-q-~%GZyg5oP(w zB8KcM(lwc*Z%PDuA(8-QoH2-#Nu2nbg~&wL%L`hlC1O(lGE?pK2jv^=<+zsBOdaau z+4pIl2&8SB|5@hQ*SDGN(0Bc|fA-1THT8W;ZO@s2)4QhAnlg!wl*ssLs;UH?iF)(@{7bmnyI(E)w&x&94g(7`%WtXcI^uS}y)O+if&d>ygU zpb+$wB&$Z`{n?T(VDA9Z;-R32IXF3W9y(dn^W7+n3+Sq^`p{9ee`iG=(c1JKTBXpnBo>`lzm^el5G2`&|ii% zOHT7^$2@Ow;`q4l^Zlxmz@wamDMl(cD+CuzTe~;ISgb&+2!Z6r4>1aVgtrXjWm2sA zKtjJ*_u~qM!2L-VNCb!hN+z|msG%VhAlciDx?;rq8eXVL)DExKkC2U~mWmJQ+U6U3 z-r@lx8suaFS8OmsOG?l!=1RH3Tw-xNM|Oah<#kcpEfa~b7YVpiFn<6iHsDZ~H_EHN zY8@vVXFT#CL5U@B+Kt0ww}o_jclSXVceYeFbaqyqG+rqi+Z`l&bXITiAFU3xM)XE> zN-KLiUDKCtsJ){y!KGGjXX|X%+F$6@+q?i!1*meKI6y7g(sNB6v&vI?wube%TU_n^ z28Z~Z{Q!DABT4V~Dd)C*H+gi8oIw@D?(S|os7mAj87R~6bFags@XY@U0vz@H=+x! zyb1py3KOJ5+~H))fBW^}SMxcWhJUGn`ZuhE%KCreB5fsPNH1#A@_S}BW_If?4DTn~ zbV{8XNsGG^|6s#+{9;0z*8Lo4(QPqqz2Ao8zny}o;`k6q|a9KVKkw!{v7D zAr1rV%i6pIfl1kCI}#RWW{0L_BFR)xm%Y;5V0vro^sNhiICuNGFa@D+!tSsTH`bA6^D4HIvi~V=PN^sogM{Agbpq+x|cS!LU%8=Rk;0P98fi`iPDyITd`5N`DT@Exq z-Sg7oaZZ`B3%U1Q@0OGCGDL0|VnKI<{yNY*@JI?f_`Aj5VXHGA0i5*G%^D9XzC(Xi zP7MyL26ADG#oEQjxMtW*a0(tfG`yF^T^Opdpg_ed=x2ePmmoe;SZFkW3bKO=iNmJY zVY+QEIvVN1e(*?)8-)&GY*%;IxeF(;VR)p-#ai)V50#*N9lX}{5Whp21}tS<+b?&r zkcubP^u(Su5gBJIdYIzk0`bp^Uqp0WPu`qcdSzrv&+gq*@cka!$Yu(+Cz#7vURxT! zBaT>~o-bnKeSzth*{XpRKXkzf4#C}C$cM3V^19>aiTD`mAU&>8WxpYasjvViH)idP zGgJv-DDemWvUOS7o5?$wF~>l4P~WxIfG!eBSS?cmaA<&j;caPA6~E}S)xRDbt2QKj z`BjDZz{y>@$t4wWNaIg>exGu6aKf%#Yx_W5sIg|b=(Y~n61>@abH8;$wz1J0MyQKF zO^{$NY}K_Za2qgKBQttH!}>*oZWTGsxFa++ho|taOZ6KAGk*+T%8gQ40WPCPpa8)s zi~r1$IXm;G3C)-WjFzEoMpuDoMovaNi%fdT6osxsr}$#0Qog5Hy8?z<)_98#^^6QE z=SttIESPHc*N;81R-bgfoF4bDafI(O`vVv0Q%L?7v3i}-XtT^ho06a4R;8ki{^k>Y zc=d;7cKXtpheZ5P1sB1We3*$P5lRShhPvH#xhxCfX3evAI+QyxstU^1XOBllTZ zC^|Qqn+{j}JEi7?1%RC?_%Jz8$cbM&&br{I$cC$zYIRp==pMF^=)_l{BYg0o4>8@= zhJwH)n!1s6dA_hTn))05E&>Bg`yQoF3)^ zhRG&ZNd;rFz&BVIwIh~^yQnZcvWD=(u`ht>!|_`YxRbyI*Zt4L)IAEvLh<)ph1s~? znpe$N>J++sLLJK&J_}&1R4ZM2`1aS?BBNe4s^s4f>Vz7Lj0T_138mPgCDp5dTd!f~ zFvYy7`D1+P==q(Th^C&)nK=I5qJZds4bzW$qk3~HhRun5O~0KAbT9&`?v_;|>y__% zMQuG@h<^Gq;rco6Y5n+#F7OUjf#I=5MGV7oV?%OOy@?J@!-gT9K0R+#WMk@?Xanfl z_b)}3yK+j2*t*^h8#pP~|GQFS>3W;}LyNPC^?m$c-7lRlHXo^@9oIfvS}<9pQ-T_8)8fKh|EU7^oVIaoku~g|ykBJFH4KVW65MDz_HUgJN($cU z{e!hM5H? zV}?U9smBv@JGhuV5>QA(yk4;H!!(WNJAEu$W`&Swec$rWy7&TPjde2~C549#nG=5J zEj!zjx6K6^9F$T}YePjUd^BbMpkyEZf1Dl)^Z#mQnVHGK(5wChGW(_X_`BiKI`mV3WzM=no?-p**ti55n|;h};^lxD^Rg z`(=1O%9A7g4XFsIbQjURLb6$=TEp3VwQ@_Kq}v9|%LU6QggmK+FsP}PPD)=-#e!7Q zy!;mzpw*(&oq++VBW&r1;}|d^pB1s07VjG^)N605W&#&64)gPG%L7(P`c^~eHLvMA zhND;jCRLow>x|^MFI;lxzA34xk7&OB`xH;VPXh+#t&i5eGI)y>ux4D}0CTD<71Lrh zC4dPl7N4Q=e!E%bUF%6taS0rLxA}M2thlp^dYdm&wSK1y9S`&DH6Tq zYdgV-9=@m=daQ+xivOzu^Z7s&T5ormkeh#ar$Ra;rk=uS0O z;I#z4n|uEB{_lPX-WjrQdPV3nXBHV;r*08FZ>m9m4A2$W(cn^d01OV}lSvP_M9g!d z-vBWQB$*PBJHPlXTLt!Qe(PF?l%Gm(W5d6wWd5j(3;cldrjSA528YIDs)@LAdnGd@ zZp3c8HUk{HY?W3g|Aldf^_*~wJ*=12aY=1){7V%JA>bAOq?rHckDaT)8ztNteM65@ z-J7%E#X~(M)|qFP)0uRsE-F_q9EwEXn8C?`?XX;=Xq>o9^NZ=3vi3^6eNbD3U+v9) z&isAU+3<@Sd}e#s;b~T>7w_NrYTs=9T2U)LyuN^MIKL9!1W==#xWEOmntiB-A|M$+ z4N0p87<34Eg0F``!ISS8fv9d5%Jj^8wv&bo6x!aGw$L?d>{DAX&zG?U-O?~saMqfC zSOgD>mb%}067VKFdJ4v;Py}9k&l)PvbbLodqzxtAHbkDNOa}0{?R@>lDNpBm z&yIm6ey|v9ydhQ^l#n`RpmJ41dRqqoQc~38`}+t7{r9GQcGVFzojYe8J7*&nnE)vV zsQznK#J9pPb)G3i&qSnb6$YSu(y3$jo#_?Qu&mr(eRBW(mTgUBUDxpySenN|0sifq zYj%F?wk~{5O8wrOW51cr$X`0n7*J72vLcLoz2heiUKA634iF({XXBt5`e#i1&Pemw z?^Z8Iwkyr54*vKDQXG$IT(Bp>!fEynkY%IyVox27BEgc;NlJ9yIF8m9CG6Sgm znOBwBwad$L2}n!$TV8#xso;E4IVym}0KoFIO4$^}5Ze(zjoLZOC@eJBb1FEKeiSXl zn)CRBqXq$(FDdB0prZpq0$@U|oFT)=DWE~07N5Qq1fw?2ji&K_$GmI{n%TGRUO=xK z)?O>OLKFqck zpVg3v>z2c}S@w5W;J?It0%}cXgnZteCl?~+_(^4r1hPqde;ytZlLzFGQ9@{QT#YTam~R!y{QHR8XDysE3S1AH4~ZJa zLm!Us(FVHxk8126ByCKeLVuTUV^o*4e$n&%sBDzXbBP~8=0z&v*|86X4EaL2!3uZF z)t|^Hg%Q)o)Wj4Cb0;E`JB%#uMv}RuYwZ)n;zZcES6m$HBg4b#VD+46nB3#U7zl)U zZ*xd#pQFOyk?sNGf}i$3iWcDs%&M6??&pIWM3_GjHVn>`ia^0B!xq@4jlaupVwLE7 z3ya$REawzhXRGU)DSW`>9Fkq{!&D!X%{&losTn~q5XZvy51%e#>U1{Zu=#u^b(FfS zsm-WQPafU$w`$1&Ft}_xuwuQ0bg+O z@H#BHi#oM*bhb2(RS>5C?CdD3sAQVsap0mr&CG)7LjmLL6k;yL4Jf2d%VH29>tJQ2 zfTezKz6-mK#k$03V`f&s7=3tkSEk9{y>o_zK-564L60jcEgj7Gwz0AjHf>DOVHLB}RBSCZ5arGIrjT&@#(A+Vhu=35Zjl zK3-csSs(?#B3F3my~ptW_lBbC^Z(}pyv(J&t=Nu}R4Y3Ok91f+^Rxbz(S=+gFl5hj zGBGy3P=S|JCzS6-%MjQ2`;JbNK|`=r7%^^`${>P=O3{U5_TC*-rUkKl90z0na$nuSUznl zke{uzZyy{)DOR`WtyFx3Y|BEmQUWm(Z!tBf`E z(`k66>EAdxXNe1HPyj8t=w;E%#0sugidHTk!`PVZGDmpcDu`kadiHt>y?^Jcc=*e+_#C1F};qnSi_AV@z6$4R}~Z8w%HIq z-WT$n>YGWqSn+&(r6?+0PAlPlGT&Fm;H8HZ*VD235Js0_$8-8%^KbWV_n5cv?=qk5 zmLSZ8KOgcj1xc>WNmd%v)l7mTZf?H^Fk6hgiRzx7g2P{`koKD|1#124UX@`hK0zmT5Rmi(CqR1XN6*YG22OJB){-9% zwnX!mw0aGvAc@QEBwG$dS)*=LD-}V4Cq#-qu%@{=?DW*uzY7YSbOC2nByZ~Up--Fy z^w(gjRwgDU0pxIKiMqfseFt{5l0whKDfFva@t+&|0%FGJSwo;- z8RAP}XJiUegj7^iK@wRuJS0Fg32#~WePkS?RE3_NUYxui2{CckwTs*s062i=tn43d zAX0&ia7VON4g>%tBqZ2*d69t=VsEbmz=E_yUv2hf5k(V(OMt?5b}lXizYdtZso=`W zx5%Jz#6NuaR>`aPt=L&7(0;SR^-qn-Bf4ViKN5~Ol67NE{D+5!UukK9^Oh187Dd!{ zV>y2p4xNlI#l9RJgKThTCoE_bkkFk}=*uw!3^NU<|306b#0IZ;Vqt-CAQ8OIatL$x zrT;!+gO4r90)v(WTB+l+v$XRsGk*Sb7ewWGoG%j_J&}vjuKgO>TdV2Ijub&LtiN zvQO6Am=rCd6J;7vG6jWZ^f1?-xhC{&7 zSz4z31NT3eo;cME=iG0f9jK>&y7W;J95qyKMgffJ4HD|+8`mJ#IA3`p3^lmkv| zQ=)A#D$d2go`2`ypb6 zT>g3;F7b>7DCB+e75~fZ-l8|5Cm{($TvzlwF6T`$XUMAN!}yPzaRBj>k{K}lH#Q6? z5$E?WVAVMa8f?~KBS?5DDJeiI1Y}9ylf+`Q9xAQ8D%N9CE+mXJZVFM`EbAEfL}&YV znn5h}pgX3l7ssN54CcSCWHFjEv>>I||IPET?W4iS8A=^$Dil zZ1PjlYB|8F)_KJhv8AOYbBvgn`1E=+GW3!@unX!hN|7m8r(;{;5_k_3ctHII_L%h7 zuh+M8ZLGJtM{dz;s2V@%QZ30lgWA9wCfPBE`w$k`y--KpI%`vnCI&8NM@ zlyC1l5Xtm`W@r7w<)ZjE6ss|M=@W4b3kL^Wz+$NlNISIWR27}=TOOVu z@FbGec4q8^r<5#hYHU0?YB~;C;Ro{Jl5bq$0RUX+r(vStf%H9tW@}&v zQ)F(;$C#>IizTR(LqE5l#qJlPdt^q5Arnf-U~qZksF$ygb%OISFY|XO)TZYTd(w=r zzNeV)jQi<3o<%E>575_Gv-2_TAC$d<^`MF0%^+}bP^^4o{jnzh! zd@|qTH+s_eK9oSHgBkF^TrV@!uhXP~fLjS_>~&;M?ElM{%y+9TMp+Ec^a`z$9T#Cp zA}ZblVL3ZWKSl5q>u=(0mr*75ZyX|%h~uc}d{f+o4kUE}CKyh7=3&IC;#mC@fm&j< z2rmDEOXXy~TH;PTZ3VV0RGTKly9%%*XMT0tJL5a!NYvuS!JGVd7dPR#{zHn5rnPHt zlT5$wf$dd|u(w;=LH#&J`LCpekMwd~=3HGiDd_KfNwp#x)NI(~4P8#ql1q~C?ogk( zc{FJRxVY(H&g`R}!p)ps+RmW~(`)pf-!qewms|U{MNP>Z8a$y~3^sH?VL?`wko0vF zi)hrKG!~z0afm9`WOb_xbIw&F#`79i=@{@+z!Xg$C?V1G|3LS(6=`+8s89 zFNrK!Jo0G$9>kBMse++^{Va3j=<52q?cvbcbw@Fu zV6TZrZc_uNS;dzI7t9Gj?N(Nb9%guWc&!UlSgfW@t48ni-~Q((Em6@I`hZJn-Et9^ zZ7n^8v00HhLBHa0CXbAa;M3YFbPtA?f;%g&K?{IQu(45KcE-{OMq*5?+ESkC5=D@^ z*j<1tJvB8hj6$ja1MxQP3{z`L;8h%&ucbcE?7j{%1v=TYqFqWV8{s3X-4U5svErT z1(LFti`KHYG(e^Ws5r%uriqO)uJv3?#dkAcrs{s%fABiLYGUVfKqg>4*T44rz|Kjf zH39sD2zPlU2>tUoe!J`V<`9RaA1}X27PNmsz;?cNeL6+B%#RjlOat-Ml|<@mBJ1+Y zqk&AUu-~p8_RPN{uw56${O*LQ@3D&XTT0Bor;_ufTSN>3eY4fPP&V83#FZ5rNDFq} zoGlaHeihEelmoJRA?2MJH$`^3JzPn5PU6{~US%38U=if)1kX17< zH34o56ij#5JKm2b_aNE2^<)JmLXwzaZY+RxLw=4Hzl$PnP$^W2fL z{j18Verkz|TQ4uIb2v!zSfu@NDMHTbOhe7+DV z{0Nzeg4&&JXM7Bdeu;@m!joQzxxLVT5jCFL4~^>I4t_ClJc`@U!Or{=k&WWb=rJm} z%P5m=TpsN}#9(65n-4s4!N?+n~FaF z8^$MCN*|LArIn9}f%dFU$wd)E6D6!ye{`>cnhMEme(DYxRp@)Y+>M}R@HbU@e~P*M zEmxLdHi}8oxQWnW_2+0YA^k<@&5gL3x8hhQXK_>nx+vu!G#E|`x3@Rj{`g-dqUC#< z9-?E7l6V!0*Jr3_IQp7eZ&v~XC5?A>WvL9Y4FrVwX$RG%Xk1-gT~2!lI0OX3*4NjI zuTOa?W!6Z5C(lm})pmm#AZM0UU5v)`1{3VPZg6R1=ELqgMg4Jk0suz;(e>lFDJS^J zN1rwLB60J@0Gp~m<%;h9lb<+#&izBTId2QoCdA&}-a}@}|0^s}xWvU-wDwGp^U`J+ zh2~9YoA6O<4AJ(U88ZIBUnb|5WPv@TRN1O**vtxSM`QaJjI7fcTe|oL4a-MAF)|l~ z!saZzK%`;6-GnR1MsqwnJd9@US98w=Zlrrtsc7b(H#O5+92}fXi=P5z4i!=>hNa;u z#UT8cFsCoDyghg)4q+bJ__sY2a$%sU?tosPXE#Pc{M_}d>a;8LPB(qwEuhdBK#!$# zm?>}W_iu=u?^|95SH;SUW-tq?wP>%ziU)tPB7R5SIVfxqX(GPCe5Z~dTrM!A!jG3t z?@xcDKR6k!?Yn)|AU^6zxvpN^?Y4*WQanB`+dWb6NK@Pmxk9dM!QZofOON(1u}aHu z7ZG_!y_R0w-Ex4*2Z^7}PDU_Y)Wb;XeAqKGo>7G)&1U;;oc#nY9o2VDd54a3Xan)W6k{ zZx@O24*EnF%5C=h`I7B>gOLBpFflfxHJioFM`%P$I-&=%F zk(bmvFY#SIeypi!VI+jk>TgaJ? zu=Mn7>0fVg*i#v_kdc*Lci^L;rjG6YJT)^D`!5k}UnU&y^_Hmtb&?uFEy+}(*Fv;u zYxqNKqe3czAG}a(-M&i8L7(seqiFpChNY@I_cjI1@_vH~sd6bx4G3yd2;|Dw7xrg-yzC#oXcOjY1iQPG?LXJoqL70A9FR%A z;6I&sP1JBju37#4MA8TjakAkpwmd$e42h3a4T}~=XgGCh5tT+^shvBfG#p#S-Ot)k z+6MKbCMkcl$k=<>24ZqzqDnZ5LR02%E+po-x`oPuDDSA@-3CZsWY7Ffmwxqre6PB@ zEk+Jde{NXbf(WM4TYzpaIBtz)o9gbAEr#1`EuTlWBBu3LMAwY~&~hs?^OL(YKYvcc zV{RCz&B$0!gc{4Tae4NuNg?>q<}$1w8;PWJ?)dsK=BxV{|=Ei}O~*xug35=5N0 zFiy4j0Nr3*4nUZ^VobBKv^n&53;0Wg{NT`V*Z(OfN22}?IDYEtwwC9Me!-ZdU{h>O zSCN*EGD0Jg$N$B$_2FYkW;qa(1zdju_p75GKzj^NdpIz8b{RPV>_Py1P|?lPW@^yh z`mByUDQnne`*o!6o|ShRpih{pR^C>4J-8|3zK@|cN3W3(a|2SVa;kf(=yBsW4tu)5 zD#KzS=SaHZxkxLMF-0c8SQB}+_UmG_M1}LgZ;Cs98B)afl>iXYzJuaw7tL&p@*m@3 z!N7C}L~U#X!l8_*{)L+$aKvDxAkGem+A7Bmp117%TDMHwK`AeZ6Rigv9sxa;zvu-P zMFOZ;aX0W&fdqjtF!bCUv!-ZLb_5bBMp;;nf{Gf0PX`h@*d~cTNqQs60=uHBDfb-b zbm?s4q(fVJ>VULvSEJ)TcI|4TBNON=?|dB}F6Oct8hD|1;PyV9KgmQ`1|RR2d2BOD z!{LE)n`oX2YWwfWhYPKqO_^D4ldp?Fv5exR;g{CaaBHbQGLzL;F2#ss9_)K42k%=? z(Pu8H-|T~^K*3azlPH`yj>sJrCQ|6uRMakiYVTw>E3$C1s4^FUXk@0f%!c4Y-c&|T zjkGB2zkdhp*8TB3+iF}!COdIz(?j}Z6XWFQ|6ZfH{pObLlM`3Nk(zB)*Wfkwn(|rD zGJ6>{VB~w_R?zl|;f(knL_T_q86TCADW}gtvjm@TPLswHqC7A4UG4B^Phn|kG)0Ef zEICKhYodKxVfXnJm5>hmo8p8~fHGh$i?L2*9{rnPUSV1vV$hnAz zCrQ?Li=+i>3Mtj|a=w^;h?kHgZosG$c+bS+6}z-pa%-!XgEW&^StszTx;v;6lk~_A zRnyap5Pp~vj{RYoH4y|Tw`ib-)MiiDCOJEwsjAw^Ad$^5Xh69 z+@Fn|^|9KxMWyzMPgTRq9^NI$Y? zPWNG<_ABw}J)1^0y&fA#LOq?QJ;oT#e9D?wOLaf$05M!@w0`toFt?uk8)7q=Nwop1 zZe;vtFHP*~nf(iwjbJ+J59I4h@_c>vmF6>y&s%}$cjn;|RN(8p^QQ&VsV52s^5|aI zU1Tzr@nC?4vb6@)Sj@@%`K02G{iKtWlyvGxb}wQV76Zu4m|iDv(tMl+zgV26x%B94 zhvoMzO*y z3pKj-EPc*8)FI6HZ$d2;Lt-_Q24j=~CiCbVQd`=2L0tCn>sKytTvkpF)+k~k^eqt$ zWR$xSB`e36i(XTWg@UBWN;e!_Y%RY;)KQ*hVIkSHx$U)Ei%=OGkb#wY>e=bbFT8L^V z;k>t+4^pdBl|s_?`oO?gloVVZBFm(#u1q&kwAPEwxxDIITl=NDn%iKr*U@H44YNd| zIKIPF)X$y@OWl4kJkw#$B|4#8__|$|X&t5ZCF$HUBL+`>D4_6<|Fa>kwVV$M2M>7m zu_V7KPx;)cXThTU%OQ)|SRZ~Uf>V?3DTg7i^oi<&mp7*-!pHCWpQW2)pfo&bY+f73 z92Y^!gU3e?l8^2UE#WX??!<`PM+zmy5^zZ)y=17JSlNj;X(wN|Mla#J@f@W`FL4cQ z`M5ab0X5lC);mU7phO)tY2-WW$9VYtR5|z_9VKR}_`1ruuT5jOG zrc4ZDdd`W>@5Yyc(S^{JX*%pU%q_#3MD{ESs9eoBbTT% zp(r`{^8;m*;3>iF^2ebxUHLq#6>{rh#4)`RYL^q5w|-XKNjHqYMO(g@m~aS?@MCA> z=Dq}_Glbk|p}jps=HZ#J%J`w;v-RN-5t-nrK+FQ>7;J+cgpWVEJKNh~ zs+;v%>wxn@Z>DmtqlUY5dL@fCJw@Hr59uuBnSEK~6}0a<%p8@y_^Ax*4QjlX>l5f*6XP zm9_U`?lYUaBG@4FkVhi{62#iUd=&uBM9j<>O4}aY=9xo5ws|8KH*GHb%KO6GFQY5d zfWxj&t2?HK%fh-RH^~XBO`9nd;oxy*)z8@MbpGdC>`1Vtgzz7E;%7I#AlRWhU3Y&X z%bW-@D1N!~(!==feegwM!$IdW5($HASmU%5Mr`F3L}=l3i|uvwC=3_G*sE1{%BoXm zi^wqx00RK0erIess=r#SWJ(D(f?AQdd!MbU3YLv%lZj~4@tQT+{4q=xzTnp@>nxC$ zUS!iq@inxVOO7zB9idKL%SHhSnqv^Yk zIuCTV=TpwtPjnrX3n(_LRNfR?8B|fJsA=oxr^^hs{*W7lBAeqbZ;UMI`D;OU1GdId zQYC-2%0eP%;S=56i^0^ho~pF9rGZFXXi2HvMudACdWpL9cV%3&lwVx-jZarf zM=5xv5kI&5s}uJi$HIKeZqh5Eym}=pnCI?Hz}o%i08B!b^OZDxZ{E=_uyx6oGoyxN zUU!O%B63ZE3~#dD4p*1?CD#z&N&uE?>1s3U|8T`KxW)^Sih5Qv{|?XUv(w8UDtwQ{KvwgOMFt(n<1a^no>FUrOd7Mz5!tA4=HKk}Bo9GkH(3gt7&C%tM8V&auU4s1?&vJS6G@WgKW( zfA80n=(Al)m8XuA-+2#_u5OWjZg{WF;lbfjZ-tcS$^PBd(T(w5z z-O?AfZr!HVtY7}HB6p5;`pdmd)K_UzWxkzn59*%~p1;ApRF3nN^gWJYY;j>P>6Mo@ z2gn}R5Z7)t?jKY4YUwVAEgpMmQ6MA0pmSS$BC#B52Ui$SJLDB!6_sp$v25IXk*b>8 zS!k^lS!Vf^yCIUQUexo|Sui-U(P`sS+v=v!0Go)oP5k%GTH0w*{;6mGgYZ>CRx8e; zvrth8c=L@fpT!VTUH>GIAdmQZFsO?Kz)cxcr1wqxHC?vR%l`Dw{38An2Mo%p`Qb7< zBPzkGRXEwQxh_lYv!WrG%Gr2e6Hgl>?T^Psx{je1@tq_NAgS>gO#2XtEG&sEjvT!V zr68VV`OEDoQ17qc8l`MeZs(}Fj*|?KF9er3&-f}1h^FDwTvGB!}Lk6@2 zz{M5nC3%-;lz82v|Ng?@VzLPSiDPKgXWOqp&`)P2bsmYnHj?@lh zV=k#*t8)^KD z{b0O)>vU!fXt?_IH@g?#&(DdDy9feTV+E_;ay!XE+#g6y+m5)EGw8YAI_*&^kS?aY zVromrO|td^zEW0{2}!Rzg2z_7CO3@dk4NzNxtDC%0EF{nw1WkdH2Jmkl|QY`XCJnn z{`RBSRf~yJK>L_=xAfuMkyL_*Ii>5+RUA@xYQyH^V>^CRYyNs=ii_nrc5C2+cUxO$+YNBNR8dIa zx3tT=?Ru07pk`K8@fvJHzz?v(WMl2DWcFAe7U%)-U>C~!Gtc}9)9X&)arBh|*swgh+OAeG5ADYy7wfYlf#ijutwMP@<`l(gr>jO#Pk4t*%i92e zG-Ll2r?e9fiJr%?LhCiOb<6paw&8wJ%PP=*5jwzbXI{eRfr7ZJ6|>3rk9u+ z{2YH9eNHE=nAt{rjLjflIa)w_Mt%O3&|;51ik@F!(bqrDD;IXrUL_ESG}NA|@eJK_ z)>zRBiPGfgMQ{t;hqv{1LojLk+$s)I#i=_x!67qh3e)dP0tb>4-tAft&t~S9l78Cs ztQX)7irscK<<#23`@QrWzB=@rIQMB3b6NQd;fpb)RbM@FeS6l&wM+p|GxZuQp&^_3)W7? z`p&=gPpQ$e_M^cn(dl3CnCN(wnX=WA?4Q5;zq1DY*^;HCzWZt)jgw)Ywip^8V?kpc zg8RQ~KA(>SYvg}7wMAVNjT-iUw`>RQ)_Xd7u`c1iGbO|b_fm=nQ)`sd|Mx`y{W<%e z@lss^!$9|oHJS2Kyp@{n0jMq>*PU2dj-Ge_@f=yDPH6R##Z7VQ^-bN4HytB{x;Qy0 zDeIBv;Qy|;Rk+(0rl8AC2r5FGX(8W4U~t91<(d_1#R@*}y}@V=$$W(osH`5R3uc<{ zP(c6aXN+4t-l+hn6O2!-KJoCEcg5;V=eNUX@8XQbpXo#E=X_9hLVfNeK#zJ0cI5w| zR!AeQUv@9tK!6H@A=8?LFzC&L7uay0Yu>`ZfWPUL$r%8W)&7k2ApumA8GmVUE)a8Z z0j7JBVu}J0NG*U{TepE^63hh>h0{{G1&C5KUm3i9^Vr7=)4n$Ufz#SFuG(T{JglRt zf}`>9iLkpPK2Z&d;P(Msq!m;9o`szVFans_lSW=o0Pf~9kJ6JcSPTY6tAx7Dm%t53zNC?)bYolep%*#DohK&Q{_s4dg`E&a>Lcn@Mvx1I9o%>Lloe*ArN+1|0 ziQFfHr+sUs$io~i0SA`fn1P>o&(qv@s7uSan`iGK0Fdv0ua$EWp-09_yZ>LuxDh1J z%uqsl6G``{ny4yNTp3s3jpA?=CoDVc{6+@wT?c=WKq}KW4h_70@N#KcA&f(=Xk(6Y z!LS$?Li*LSde&{&`Wi4>0H|cfTLEAdp)^HbuAlF_pB8y{#Psyu0MF>j$)Wv=PQXAc zXVz%jl;X}5IkS8RJ_lt4s{3GqiY4=7^t8td5!a`BHeZ8yl2v za)L%~;@@h9ES?F;A;m1LteJC5L*8+?p$N0Cv*0m5SLlUQOumXUt|%{WFT$$t*8dQad64KSr_IkA1() zOiDF>P+AJ~;wYIDbHOQnKy0g46a@MqK(Lh-WE-_5k92ae^82Aw2Zb zQ`LpMLUi*Kui=Pn)x~711FU0^Cr^z#H(H-OyEmkERXU<~n+y~={)Fs!vE8xLdAExJ zhHZ}&eWl_o>^G4xe?2(nwpB8!jJG_Ju!`$n_Ss;%FSAilDQqWaZNgT|1}haqFDnMI zR?ZgADj^X*a8C>W$WE8qy+;TeTGN|;yb8SwyDOtw6RE2pPB~J*B_LpO`re498&VGb zS3hb`3UcIlPymMhN6J<9#@ZLyS5i_+|NVL+DB~4q#~>jbgOs_{zL%>n#j)HXbeK9A zRe9bBnVNMxz`+T`ks!x*Z3yw>2>Ok5jDUG3r2hhNy=4r3AwxB}K~R%D2bgGyf+HTc znb^!K286e03ZR_IGsb&T$!qM}oz zio62?$lFrAF?3HdlYeGLyoX{U9FQahW)BX$@!!)wWdyC=w;J?ZtrsOdac@Fo5oFoD zGQVMMxSH%m&?qm;{Xd$%0w~Jw`x_OJlI{>ix*^8ebNDK4rRMofj>aybp5M-bx#1NPJYuQw6@+!t~- zj!32l;jr=aIH+EW5;*N|ufGXwH@;pbHG#;DegD3(*IO#hBI3x%NG2wxpLOq3eZJ`j zaoAwm(Ebl=OVGB7E&x3+AVqQQP{PK40i=Eia8lZ&&ZPEl)?`cwfJs6hFoth$1kE(S zGmxD`KNb_CQBqQZXh&NNyJMVSRw6YFveY;0X%5=J88PQb6Ndv4f?euMMkIK*ADA*W ze1wEJ08o6C33~}{Cjk*h3W(px_MDZK->^j-UW3$y)H_!8_+m}4Ar+<94dLbI501@d zJkyAP=@}U|nkr><_np{YDaG5GnwqBN6_31hno)|n4E>>7m6{|3-<+zZX3+V$$C|Uy z^=mjthgU4yVVy(dK2B{X%AT3xMim;%)VMAMD{e{0Uf4Vcua9_rOuE6B@-te!3}FI$@o5g3=Vf%AZ!-VZNwsQO?KiW4m9GQe=( zXb*6-q5uHt`t>WK=Vv-)%R}8%i{?e4A4$VS$~Ua(Ud#0z@RX>njg7X;%V!XTb#!%A zRaGBZ)5zX|=(C5Tv zF`@d4FQAar-qYE+g7*#TUKEFK9CRk=ExYu>xGnz$8k7B!HerdeF*=|s~F`JRN z9~`iNmL5mPiXHCA3&;yUs-Hj5E}I<>rg6PdHd^kR{U+ePzhpSyO+A>MP|`^z9K_zr zjsy!I*nxlu{v!T^{ta)e`^H!lc>FaC*M@rBXis8J1SZ>T$^0Dw)n@911Q z#_f(b^c(GrV(u6{xQp<5MQsbmS2Ry)7Rw_tEL6A|2${~w%d{H<=H6dNbx%@E%BK!L z4nB&0clxzOkKOXZpQf=@{pCWZ82Nm;9nM^8c>_wX&7G4dbNRof?N`His&?KBE3 zXTyUI*O%_9Q((tA4}j93>`C9fS(;4y-*ZgqZdV^#n8?(&i@JOz?+r~&v9>ns{v!*o&0es1m)+ZzdLv4Oqwt3knjQw8+q}?v4ihacENlby7v>E}CGar=L$E!Vh+>M3 z;66tp`2Z8OBqr>=njaKl7I>(Nrz_B0h;OENZ;YpA?3FL*q?gYXPy zs7>b^McO(I6rndD%?FYXp{3s2)>(c$kmEu+Cq)OxDX<(E8TVl194@=aw>=v1t8q`< z|MO@3CV>9Z($)g-a@ykmyJqnU;1fc2aQ7-2Vz*fJ-@ zV|3@6-S%jaV8h|Ye~oijI7kfdZ~i$p^2!`3^(egzq4$`(EjK?b-tE4i@eTlKB@`Ig z5mbYeL`R3GogI#M!jHJ)4kIokHW(xWve-VqOn&BR0qWa8eJU3bbhr&JcqAe(V7S=0 z(}0D9V;5IrPaMYpvjXsr*yCtYPM4n_zp$V8t7EC^G-(A0oT`QfeVY!b>plpRqD@Lm zlh%4oYWC~t>H1-?7P@*?PY%A=&UJ=c*)f`PvGZ3feK-3ZaavDkRz#sj89`pQb7?nC zv>`1iu$N?ou4~_WK{DG#0VCzWU|`{g_@Q;@zp*qHsrZNfSp*|c;*|FCZuHSqD`D9A z5aGZ7(Aw`y9S3AFrG8cZr#ZDu;dEn9u$mz<_{R3h=eq}Yd{Jh3o3Y${ z;k~G?HDcK?mgNSPtu7ZSW9ycEYu$@W5=zK9rGRev-^p3o!rsIGP9)!Pef?4Xxc$D6p?99BDa}DbT z)(D6?X{PQ-aT|BPf$aq&2gXIj$NIHTc>UWhZ+2&!Ew?A2g|{0wI51!WIC_FSB<{55 z^J6j!3W5@KB+zds+?Y%*d8?xX6$!p|xCSBy4z*A~Xefp%rfqaVaK0P5(n!`-EZoF! z9)dbe2rB%=)?5osWo2cS=O&*Ep++xuaJ$zAOE3ZslvqY(`P3G`tb<$OJ`PVXF*aK0 zALjP?GP-|`^KExAFqS_Y0OB_8{iy8Y(!JJCFv*scWippV%FXr))7I*IMps~hH+vC9 z75bLf)Dl`k)F23nMCDpqVt5{J&3A*S`XhSPz1=C0{$hWWi2~G+Ku{>t=U$OrO+0mh z)^};kbwfyiBR9k=%#$v^yusvMdSiVQVKY&D0Uqt zr>1sr`kX0*MuLLg>A!Z|VM5YRMr1)u^hw5Kz3*^vaTmebF?Jk1;q4xf0_3~QRZ}Gx%uFO*>v<(3AJM7KG9n!Y-F8Z_@i_h*OX;*J_x(qo;jNdTZw=!J0=TO zsIfQV?r=ugZ>6=)2zQyi)J!z2k5+6u$aeW?Fx6?rs^TNOYRsK zlCl!iB{;(wpCTNyq&R5}#qfS^9rAEMlI3BA300XiJ$-&*f%wac=ThX!T?=iuWrBmB zhzf*q%f2@fM>DmFHDzDv+6Y1ReMGgVgBxfAm?<0YAK zI6n>uz>_lurTRuPqJR}>zx+|x>4hsQm4N55joNLO^FzxCPljRE2dwe!P8)v<;!YH^ zw6f+1qNbjj56G&CBaEP40No|-^*Rxs>n3z4d1aTp9JEvCL2kWbP;&fwp)YsJ znUG#cy!kUS^0;lI_L%Uq`%BkHPeA8&pbwS2bZmd08|@w;sk07b%()7QMA2B82C2y8 z2b9b)rj!*GWmDh&@%C_hdDhV()piVzCM74U1?HOV8hK6f_r9}_*9&yKzC6pZY-LnV zk3*%E171^zX_Scje$Ik-ys1l2yb-n7hiA;?ms^#CrgFHwO_a(+qBoZZImb(|n+ga1 zi)*|AXgcFn2{2j;DGVKL;bx3Gq^RGG|J5kJ)jLsXt}zjNdI6&>xmCA>w+d_zNMX^JVa3|558WDji~A%E7LEztRmK70^m4eNTd ze&ivF+1opIv%_+0B@DGQTu=28L2-S3eeqgn#TIWnoCC}kTn13No<3duw*L)!%ApK4 zyhu=M*0H=AC$tcdkB+PZPpRxvmQEgW6gUm76|x|?dOvPqVb)e!k?c>6pd`Py+8kr_ z8G3x12b6Yr#`HosbQ&~;!`6V3v<@D2TE)aHSL>agrlM%O-(&#ucqtD{9tz0OuXh2l z%3NCSbyl%P@yA^|Z$zK4*n)?pP3=|ATG!(jA>}~CTYIqBTRF{(442lj+oAs`2#TF; z64ltghs69@g|-TvwqwzfghS&D$L&}#{WTK}cfeI2)r>AY8 z;|Eao>ULj5d^`$DrJrB8ApWn!0t%ps0PDoJ)j~@8E&Z0e`y~oG0Y@%lN^y~Vkx5G~ zZdO=<{3ct4sRUAW(&U63UTSX3YuqNkYDX($qhc}X)rR)aNz=&+^J6Xw#&;$j}u(Con4d#q;Bn|?JR}D1)6l-CzR(V)f z!O5-HYzbru7a4eL=Nun9?uIV}Hoib9LuEI8!~c?VvEoVYE3j0)8$HqfMw&GHb;?6) zE2}aSo%!-h`U0&cAP3TWSSG4b{swb^&kpo*yd12o5D5I&p2kGPKsDC8n-jCY?}$&* z!YL5=l&)z7%TF}g@V>2u#lyBgn@2G}9!^AS>g%&NM7^Devot~T7x#;g+LqTW>#^Ze zKw?#4N|kSquQbAZM^&>(qXIX^G+J9y@(!2+|2SR1GD$mtD_G<}q`v_e26H+wl-O!7G@%>Vh60PwtJy4lydUQt&jO77TR7>GOjim z>&8alX;Q62uWc4B2smG9>AQXVeRzKYQ3ChUF8#dXUiYbVs<)QeJgi`Rd(6E=d2p-N zgYC-EO2Y8fD}Qd?bM0jM`@p;+T>ulRe-4 zO2`8-Zbf8XT9=qmCLo3jG>X0rEA6|UJI!PHj^{LmIfqfdNU&^NgvpY-rhj3Z<>k#Q z*soP3qf0W*xFh!dG}00JFl6`b{rUSh4vBST($#kK;5D=NcV=l;Gj@oVy7e{GQr>Nl z&O@ltBON zwTk$6Tsf`&#YoSZKSm4Xkd&**n54aA)H^Sts{kbIhW^f)toKYZuQeP8^)7%oVJ;1A zp;4p!S?yU=q2_QS_Tg===5M!qA3@VJXN)XTrnf26<%9g+;Cqi>ocTDJKAmyrM~rJ% zTg3;s6(Fnul_FPKP*n7a_^(Fx7`!Y%USr&~FcPLu*i ztUoq#RA92ZQ@4nNPg3wGrZK~Fx0&C#Fa*$T?6uRtzod)h3+@zTrierXhv|21#}ESQ zppK#U&X)=p7!x^}j{U2;S*;xL|FHnGP41QGMIwK{%X0$36Us;Pw|)`bEYJah*Nchk z>Ar^}dt%*PTU1=!0VU4ova9?2(;q=tHo`~{EFjz#BQd7lP1PtZ{8!j{yJy5P-lVg1 z1BrjIv|k>6K@~^1{4-InJo;IXUF4jFt$StO1s}gizGamdJmQebk&TY zs5qD;BFDGOP{By&;js9EtgIPoQ-T^!Ha4UdZ`>%AVY|WJ-GknfLkCky_EGvbDo;q( zuVq3FSY+eWiVdlLG>mQ$iD2lC?yG+Jo3(6{RN+kvVlDG32z;$?-bR3M>~gB->N1%-;PVYDC6NlLeH$!N%1 zFSm*p{Ih(ED5L9pZ991U%rm@6pzm0Y;qJ2$k7FEW*}tyep$(9ML9rXJK8sw6(2Oc} z609EwX}ez=8iY2rkz|(nKvFtN)FEWy{;)zuA0>gE%yM~@|1 zb80O;9;WNN%bc9V054TlRrO!W+~v29TdbU%-5`DYQ`lF&9M*|W7O9Adv^t3)?kFr| z@mdw0o9{*sj+YMz$g)Q0(-u?O)!jmZl((phN=iBp2E_(_28=(G7#jg=7jFUpp)OnF zpZ8qDzgc38!hZAzX0p;VVnJSd8~q|Z!lSbvFt)+e!Y;D1omxNki7(GGZrs~W zVh=?~`T*g{^k@S1H|YBQgbRD_+>)amDwULQQD-#A!mQ~9&LqJ!*Z+dGYwglH(!H-X z4ZERcN-Y-!?6ce1aw3wSey+DZD@VXqga`w#P{x?z+pza{;iDj7trdQR}EGSjf z7AcKeal8~rYVeb9wD=`(4vADQ|tRLn0Q4L7NmB-HXojzNC=-Gb##@ApP4E;F> zQnthDo#-)gKS3e6`_673Ch$6897%;4k|vYwi?CWQT6G+*WcY@W$Z6R1_b<_hr4RZE z&X|EyW9ZMTN}m|O3EU7lLt8A825py6cie?_4EROt~0XU@qO^aCrv}h)y8f3oXH!cfc|7+ zYKp3$pa7Jg|7#KxLB~=?`LP2}*i;gY7>9O3VE^(0?!$M`L4KL1fQ3Zs#P7y{*hFMz z<|CMwz;YcFbhYsTU}xe0E8YZ#p3ngXZC=oK_zIfxIwhJwe*(;=HsB$G_Jim^52kh5 z@evtz7AQIZ_k-Xz0)OY{lpk@rRFSsC{*YjcGV%|g1CJc)0w^3*da)^kfbe(7{YCLo z^|nNDd_3`GaN>6%qu-QE*%kigr7~}EfBa1)>IWQ=Mp>XXj0Zsv0#wO>2?W5oPZ6!W ze<>C!4)uP@+r^u~mvnVi&hqK^@81>cu5_N1i=hG2KQ_TQ4Qj>b*~7@DHNntA>MeTT zZd_DU+6k+CDtryUPAGvMiUa9!94ZR^22{u?c&$f!z7@a-N%~~~@Ow}(U~$32;EAXx z4%`<}Q8-PV4PPl@4*$wl>ttc3+Ro& z3<5=B`JMq#OpiaTg@)IMP?2(-l8T~QB(pIkMe_d|&~HzoyE0T$`qF!j?zeM+kaZVw zup%!%G(7z10tfB3Z21>j+9C^@r<#EY8gE?wXi@ZlBTa_lrM{rc?=Ws zy3IqUXQ74Kwt=5x(EfJMC_J;g%A>q-eMaV{GF2&9;WdIAJ$9VV_xg3g%|c0(Ql)fp}A)@EDr8!M83ajY4VIW9o6{R zKsU4TbXIJD5OH&`N5)w{=Jc*B)P#p3aBdgc%Z@hF(%EH`HeTXmin6a>jnHffW?5#e zSyfLMRZpmBs@{UT%?mTyV18hF>#s{z|4`?PBY^AwhZ065{d4vgGZh$1`QpHg*uB`e zol6Cm2tj&l51Kel3;(jQ>{TbJay+Mhl^*+Av7rGDtf-b51h*ivFY+Lop{3 z*3sl;<|7;h+^@t;GHeacqKcUD^%_T?voa-2yMr1C`!xx)73s7aT&SaY{qXT|PyU75<{;NBVk>LP?76V7!${Q3~Kn{FaAfy z7FaczgMS#iD(3cMK_Hu`qDt(v@p!A|}8@O08c8~GW^@~k8 z;@WkZJ$N(pKRN&CE%Rb|^*ZkGQenOsp7)3f&JO6B<`)$y2-PwpU?i5bSlDIFL&3w# z%RKuot=I_v#B1^Bk5x68TYWAj>Kf#i*F>pXrBvpw20ZoDROm4wYdNDMpvOg*uMPe< zi9le7KDOpA)T^eQdN>MlLNxsq7^|o1$hN06vfShh6e%yR{drqK!c)TIx*9LMUwuJK zTI-In)9ps*+~5Ab_lT#yL%PXZe81UDjG~R??+f1#UuL*pIhhcgtNeR}n*Y&psuRyh z|4}B)Ma%#Z6*n2H!i389#n*&oR4nv7T9=*pFf(JHH64o;t?$VQH>JWb`>k&*xi~vn z%rX-7JOGu^yPPz zBPFFqs!Y_ruTZa)#SLU)x94L9eNrEff1GJm#uTQ;v+H;)^_!{`ZBu88F!y2~LZKDT z9R6dqknMLoYG%D*v%gT<3G@5MsP9Ru7IrUCfYG0`HBn4_Ur*i_{G)GeIF#bi0>?06j;b0mJydUj2ekr*`~!wjG6LU zv4Zv6-R0Qy?G}%zN^rCjDd(&T;lRsIhCMX_orAAW_i-^N=CCv z!S!>gBR>w25P7x~NI09B8%-q1vyV<|Y4tQIE z09_Ho9vqKTFu$VD=w!PUN>B_p7FYI%^c<$Jo^<4A{Cc}EtUbiE7kh+-Rbup~#(qb5 zG^38ZT5{~?;Tk4;O{aJ|M{e4OpKkH}%k3r@Rdo2ya_6?}P_R~SVT`RzXpV6X4vKxj zhd9QsKM@kru$XSw+oVq=un$&DZkfD$9UT(k7#N0~9Vu{ZIBGyhkQ_VbMB67Q4FNfF zUgjFll=t2si^I?4Hl@qfW(Y<-H^iEnKhPf5@V~N~Gt+H<@?nmlUo_1=BY%i_|KiF5 zlUKZSOcH3|9&gVN9|alzM=Zxr3haB+kFTW)JyVjsj*w;+}Wh7NkWnf zqC}#lD6wuDOvCP3fIr-~jHiK0;M(`rhvm$PAvPf|A&{du=OS!-6PQvO(Ter@%Ts~w zsz=i(FvCmE5NL+z|LMLNHY*iQIL_zQuDikUHU5lAuJ!&Cg3W*?Myd|p>wZ6Tl0G-< z>U<|M{$VoZabSv6i78!w6|g*L>x=2aa%FoXV#n3E5A>dvnx%KYOK0RQ(274Xi;=Uk z+WO0s?tc9DpvaMSA|XH0z_fq3@2>E~f44uOqJJfIK51^A-8sv4=iJ%;G2{L2odrsZ zGI2l2@PD;~^{dwjm6uWfiq#6#U$=(-L8$E2Opmw@CTsL}t=5F!kas(Tg|{&w2*ir? zO03Q~f{dXjiZ$t$8~8r%Jl4ZvFZSMo=&x#Js%{NL1{rpc-*rxmscZX{96qJteIMHN zwfyP?GD21-`Xn)WcNfG$863SKnoszPH0@~2NU1C2*0!2UwKT$&W!*8ngy1+Kui+ihRMK( zA(P@oafs~H&4R!G#$88C4OpE;D8)mW;P0^=vQ&384g4OW`&mfwO|j(WsHpl1FV?bH z?O-r6;g_6Y$>K@94bdvFprp?Xa10}|T}G(DJIVOBP~ZBvwT+G{9-99Pi}r&U!~&U9UiJn7Hy)6+c4HFyjFL}q!n6xsX{A{ zCnfoORcd|Wj(Sc$nLH+mDzCiXxPeVgWxkcIehC(F=wL8GT!@{{nmn-|Qz{dYPHz@_ zQh-{`rj-S~IOvoI5Y#wj(mqko4JX7%_P&L7NuC;(y{k#cN=5BZm=`s;Bt^B?BRU6OoQZlw1?$(hoF{?|hN;1P* zn1pBM!1@sRcSSmDd{tT2^BW(q855Q&D!-eANsOOzU*!EQalGmPh1^eyxj%E&dQ7>Y z?LV}B#6^Y;o!r0Tx*x5GndRwYdr;t!zXelC&O(vu+@b0$ccT_7_$2fEhfQfy#Fs#y zwkIRsNSFwk-uM84fdX*tFm6MIR_CtSuD5>DdObH~OxpT7r3HaOnXmFoReCPJaU&AD z>F058mm{NFKLX08ZfcV0vR_zv#Kte*an`Wf2&0f&SMmmvDFn66s4DplR`o;XvlwM6>-}0Jo6xvvbQAg z?);5zu_jM#)z2OKA^&XH2O-;^LjLJ;aXz~ih`KtisDB^*xy&lSt1Hsz z+CDRhspa&v!P8@C$+@kzLLx0}TeZyM{oA`T{?NA-Z<#pBEu$-CY$J%6XajEMe;yaiKJK_AS?1TC=#fNS!wL@Rd^q*){kFW2NRrhp?#{W^~cTeuNdh$(ky6t!^vNJx`h z*x?LIzmzvql~cCPs$~D8-wv|o+&wuXA>E510qy7|C7C77X#}eBU`sSEe`)ew!-ZZ^ zuMAzg)QU-_2+_7<|FyX?Hnp80%}7N^#_d6i8$Rd)$U0Ghr#+aO)~REfh12hzB*~&` zrriHpUd~=7OtrSL(*@|H1iLwoQ^9aVSX!eCVCP=t*^0B&OU41-`k^&{2)npoU|3Tk zrvf3h|E=w`G<#nDSHWr!K0C}-m$r&GJRb`;H2id+;_0zV<0ixA(q*F`^pEeae|Lg~ zv$b!Y_?BAxX8uFw&(=3{^$|{UJ9)vn4Dz+h$-m61SQQ`YOxsOXG~bU^ZEW{-V+(S7 z#*vC#FIaxAFTd596PaubfwHtUtHhcGXGUfgP0ODko^EkZSN_0Zi-2C6Z@qT^`$h(a zygxy@9Us5^Ntb@6Fg2rvsj+kW)9S~v&g~0M@7f*RX+E}0t`y@eVr2<>v}}C&Jm#9o z-*?pWnXpPc>_qdm@m0ZO*ZXkBaj@leZonet>mpKj3Ho?<9aS73-0 z=l;y3Q)Thqo!q+h;d_$Lq@J+Ex##Bz67e=gs?YO3@354(WM;{H-%9H>#rt<=Z*GZk zDpX~m#1ogfa?-Rkm#G~7!Y${; zXJoRf-6u%Nkk^z9-R|v66RzWa>Tm7j^lxBbVPJt);0tCxIBq`(R}IE@548{=nsnB1 zs-4u&rF@;w^xwgw*xvtEA}O_B8^|z`b-)^bH*5|w<(A{bpwG&Ul%;*Zd7d|nH)yZX zfRNnQ&q9prWYN`gO0j(I@hra*rGZE^_+5W(d$;??^#^3&s;UW+6;OOPO(NdZkjpdA zbZjtUv%Hd-DtGro6I1!#f|x@CtK$?NHY(n~3os}hnw`KfcY4~EiTB;G5iQ|ufj|0L zodcl(LV_tfRYJOml@%TBHt3j-SDWLWquraIXr}z)Oab4)#$U9Y%z=;~$;>9=nn6GD^HVH*cT^JsE9=Qgiin>d(;7oSqs_zvrqs;**O!yu^jbWs{~L7ic&5H? zPnhMb%YjQ7YNXn^gAV7(><1RwYHBz|?0I-Ivx^i?g zfIOUBm2t6U9>4G6lhVsyo36dU|9AGE?rY!15+wn1yBh8P?5zDWT-M=~gW(Pul1)An z#gO;vIs%>gsg(uXXo}o8t)_hZOJRJfVlG?Lum73L#D)r4U_CORCoN4+0W!sVAz)S1 zC8va^-$8vIk5lfANs_Bp(A3KWJ!fiRS4^!2WC)XykhKla3_qjfFB@5$s5#Cu2n_33 zm82w2Y4?p^UT!imhi(+O`mQ@Sm?6$X_bu}CpqxUU8MO0U+}fPW9M_UOBzi1&83@Ed z!ks1FujcuL^Q1?;2!3hO)#a?`+d0d|_FE$QBjwD<{Y~cI`tdup@K0`Rfhbmi2d83u zjou0;c>)DQ8AX#(FjecwQk}@CuCC3lZl;E93y1R8_0a7Um1UCY^@(aMvser)emf#6 zF{$^M#G%aU`4*1{gKy)Rgif12^>+Oe%fQc!&mIaVi<1JDCWS>fhiVd7R_bD5)j1ro zd^f1~Go|&-`Sm4In@3*PyoPK!m5{zhG`Gv|x7`Z`YgWy~L`%OgJXk$nAPckGKd9>5 zmU*E?>cz_H?2@F73uDx+wRPwrcf!Fe-SVomNSC6(WXDX>OH_T^Z4IukE7k2Oel%1- zYP6Fdd6u}P;Kb8oXFqhNNd2BBj10)GH=v-u#qwf+MTYxJz{}FSMmh`=!dG&iY3p;^ zmK}#lm?dIDy0TQ)!nUI98}uMP)p;KzR%wz?WXg;YW zA!1Rd6QyAZDpjRrpu!yfE-x>o@!`p2;h4(deI5*5VKh-N2KF=zhW7W%Qcem1l!JT)}ZWcEmkWb9Tw7um(e|meOD6QFCUjuH9vpoY)Gcdh>NJ$ zSON~tknxa4DU2)%A|Xoc^$qf2?V*EW4)wASIPlcAAu$)U z9hd0|T@7K?hV(y`Ru;(Kv()<7)umKu8|YOVCFJm=-aHh2s+OPcTZevIP|Urrz9Nu; z2_2G9mCosnuaM&x9Av@^LW++3d88od8lsu}(2gf17uHLRMjn}#cksPvih)d*4;K>i zy*rYA5BuI^m)aG)*f-!@^J0SfLDh+Ge~W#%E`$(Qh_OzDfiPqv3)0>aDR6p9@E~TP zMVFTf4g1QfhwjI8FWC!O0TlYyX-YzB_1Atinv7XHvn zWe>B@^mOXhvYcNX51en<#+fx=#E;MNESzRO(Z5E$eWd^Xj&MC9STg;N#L&rA;*ap| zn|;*g1JpCzP6tHoM$QP?ZeZPPH)q53U_+D7(T8sSY^8F@b{&P*=~oC<6W)GSWZ*|6 zewe!Acbh&TZ3}1Mr~J!5MAsA$&2ddW>vE$s;laP!5}B61i_$Y-(ra5yHhJO8)sC1w zW1mjFanZk^`z-tSO3)^Nq5Qo?$DZUH9l?e8-7E7!wKf=-)1BI+pp*`t`~o_e0BUU;3vJ!&m{KVWwgtekxGKn zVfk}>K{A^s3WS6_FGGSNS2u{Y5Yl-#-kJkvLw&P*f3A};iETyJBA6aMm!ns;?g+h4 z%r@Di@|hM{Hx3}nGXm6MJSJvsDIPxcoDkTKUK^@UwB#~r8*tPASNoaxpEi@Lf6_ZMWTc5C4^_udw{xQ)wN>e`Bj4D6T`>f~ar;1~&MO2OAM zfnonEjC=eCLhWqVz7U|6PpCS+R}iWBWk;W{g0ISPjw?E3^0u>Lneu!+FTQ&3zgFa) zS;6Jq{jdHPDGF0#+uQ$QU!7*IPH=&qZfAbX^vg0%?kxOn}3U1C}wbM()x%F>PB-N?j{fBGzPtU*Wl~+Vhw?FT2!7HDFYRUMfsTrStBT9=tI=X^jBkFWG ztN9ckWR@0zKLA(wY>&f$`@y}hHp@6-WF1AJuAAq?hTcaj-~M_Qv`)$K@QKFXSu4%- zy+8yeduP0BR#>b*Jy2U2>YQ?%DdqT2W60Bx@|sfbZ1x7{p(mQcj@Rg;!CSp&#WLiT ziHEgoGqg2QO{%Qad&hIQVwZ!3?>B}Go37?(!Bmdi?A>RS7KQ40Q!t`5qhkh~3oNC_l+wU6%*Y0Y5d#GTRz;imB3(F1=r4V81H;gv zTaaZFH%-qXil=;HijS&lYrzYZZ%La=L&MwS*)hs%VbSBXqsk1ZIgxkI6n6O@3r{0M zdL-fCAN&Bd4p#exc)={uxRKQ=3LPIzeF{zvTG}68=?_EB9~+>n=sc;#$DfLk2n@rV z$kBPkq3*mh6<3U`22e9;jWda>fAcaww|V9)_^h0I+)h`icA=1Ug2j(um|dPB_EugE zs_tDds{u3fhPm6k?{iA{he_ZKOlwC{j&%N^A`j@3o%*r_*Ckn`#) zb=H(UaDk4>{?NNoPJ>-Kc7o7{Bp0kz)mOME6;E{?r#OR-KRo>9;V`XGXx4zJnnv7T3JKUcOrDgng<~uR@PvjPf~EtI9a}AUG;{UY`u*O%R!nAiTMc6p zY&1!Yi+%4E?_M8Vt~(NqEW<)4+t*5IdMxCWFs}x(&`5%1?;zTQIHZg)r-qip{BA$9 zTE~?BtXYpG2(Z9|7S-{C4*NRrC{e2TWH`zT@&Ltd%~vz-e)(CVgb@0Ni8)qv1l z${|h3X6Tn6Bp-al`B+l34K53HUzwTXAMvbffDBPTKsMjq793#jx$y?oL!~MDL+-6d)Zo1e$ zZ?CDa!m6zM%~w&gf7wwZ4*ehBb;VUh@o1boW)F&gzrTf@9fz<$;sIk|Rgh*7pTp_<5hfRsvwdo%o3_9P>vTv`!=IJ3Gy3sTjM-e?;n4D1@IUoyIbXn70 zKE^};+nHfc75x063aO8pGVDp9Pmb~>Sr^62(!r3qf^Sewx5VvPlo40{`AHwMdd`xU zMK$PKDPJ8a(YX%ZLV4!@AmGWD6T$9%^tV=VA$%mz1b7{6e(#6yKP4~QV=?rn;*OP4 z-glJR*oJ>H<`K1|LLUU4QPja|1Pccb>rm+pV9fu8Xfr6hZaL_EFA@QVAH+U zV9i-J7D?h!GO>RTRMW<-=eY)QYa1Jdcy6TDgeb7GZ9^M)KsD32hYQ6?QBjeEnx_0_ z)()+V*JE(NDfGWrtwUNx%C$iwt)LKIJlZ?)+IV@Jw5TXdbJmg9y#)3Q*+Fz>Zf-8y zivh+=KSG;&7Hgc?##N)bAGmOl_h~)?B`&%?Ixyhd_(6kB3%31Fk4Zz6h%_v#orNS(jK}TO8jEREWWUUmQ#5?CHFvG-B9SmE|peYnu<%P6j6=kRU=! z>3kjIM*H+_IXd8E$h7Y{F+8`M8MN*_i#1XFlE+mhgiB+1E!}3YU2l=&aV#RgQPU$TzWJvq)x8A6;Bk zh)dcvcG#xZC>Ggi!DY|wCf=tAvs6lEfC;GjJp)G_$3=-^UgOmKjhz4!oy8yrgbu72 zEVisfCC+YP$1q05jKeEgZO#o2KjWkzoF=#{_GdHH1~*53<;D2CSg)B@{*%E}LB5dT z6LXDPuC1ui2A9YM^Cd=xUO#E=gx8B&l78jIOL|tcpFh!!HH`v2VL&NWl8Y<=R04l^U;Ohqx?#QSUA{@W|D#Xa zHmcJk=4bdAQj5Pab{7;2T0!pzq}70g)$V6|>tNK~O&j;yuU7(8g22}qwqN8T2wl3% zB%+A>-LNI9mZRlvkTHnlJpnrn5K(K*Jg8hb>D+nM^!BruXH3!Zk;mS*6D6r^Rlpd4 z3^*!qHV8@_+68u^XG-0c8DN5L_50Vre;bIRkWLd|@d8^;Qdc)cYSZud_5;Od+VKZc zViyyGaHfJ#q2KVZD$vJ6N8NwBKa2B{-LsMhBx>XK?rjTVs&s*~xa$)FHDNmmA5X@W zl7ltFo#0Lr%es<<%Z+3Kvi-6L;Qr>teT`u^_ahR<1AtitqmWj!N{m4s=h6z|r!W?~ znDe0-NlHL1frE)A(kGy^QyS&DmKN#p?i?;0G#K_{qoYI_h(*`TklJDoZCv0zeGtCZ zovwGf2Y^i^#TGx1+G#cV`CY$}3&gy2qjdc=A3ugT&{}KV zC3MGW96N8MK)@~jfDwp#U5&3^`#?Wocx)^fC{&tD${^24H@{pBJcoY+zl4D#fYgKr z3mbSjI-S^WavH+7I?Tzj&Ip6seOp^wpZRdxk#&F0-%msNESr-f<{*?t_Ta(50b}A} z;=kvYzJ;mEC7q_Sc8)XDJ6%h^=#Yz_ZCJ3AC2mL1@VM%ZioKPTZRa#-^@VBbkE~Z^ z5j)N9B&7T+tloou{(+q(L19ZX;V4724Q=1W($bD#aY;Q`;?%5Lh2rVb;lF*Yxt|3a zZDrNEQl30iYQGAAw)V$cub&;wfz9pRG@gIS>FHg7`DIMrc2-yJe~4&6vJHK1ynBCb z0LQ}2%0mnzJb>(<&CTUlWOhPfTA)9G~J`z*Gt ztf#uDEuFvc5eQ1*e`jK1ay#SZa`lOTK++gTVt=khOz@oLLl?I|KeVguG}-Ms_mfJq zrm1U=mrwJG9Qmq~Ve860?`7mIZ9djbL;^Lx!_c_nAk_U2a!$j6c;e-d+FjO3>)N*gOR>^?npOCJqzkl0%aPZitqXm;BysiiCO1JjrG zr6sz7R6+mcgyrO&wt{#ud}Zx8c^ODXsBnU_jJ}*OE_48|O{@b5pLA!_@vK@b$BfwR zC}x%w$3-VTf#IZ_D-)+cI7Omr2})$?ZWkeR)D+701h1Exopy~qbS9&pK7A_Sb;|X? zW9?C>m@%1*Ds3O>o^MH&*q7wwwmZ1bK0baC1tcQ@D!V$VxW&3AjIgNZ_dZ;nN0(Ps zsUuFAzbMMPe82TPrS!hoc^=LD@J-=)?6Za5Pc6@G4C$~?9G6H~78swzoyIaB5PiRK zcXyQ<)HXLV-wtCi1h~blW6NEXB#UH}p_HTEyFD)nN|o^-p_&g7WGNJT&hsF}%$kGd z@E;nmlBYmuZv!kWg=IdA&i7d#a4sA`>520P{zF9~8yi&T5Oqes?xzzl^|PNH*= zkH4NJaN2318oZ*B1jZ>&klTmPNyPFfEJI6hTb_;paPa)5+s}a>2`sbW_Cs~)@DoPI zDqGl}XbV2^ z;fONUd92S_qEGJuW9+xy!mj7?J9rxBcA-=B$I8`ZjV2|)69*$w1lufo;x3NYt7>n8 zSNSTcJNUOg*yJO0xH;#wN=q0s)5VqLGJb6q%wQ@)vz*s4t$oYJmLOh{;c<%1--QqC zQH%Sj?ZDzw+R2g6Rf}=__h8h2Z*MO-we#2gm1o8G5;^o)&V}LMz6%bkL1V;Y{NK4M zA8G9prz=&8;(JYrj*RV4igIwz218;adwYAcc6&}w>!dc3NxA0EOzbjh6Sy6?>&VaI z|Hw%EwS15M>FAdr;nLKpL4f#bvwvDTz{ncg475JwRA9KNpT7BVD4#|N9c+<2N^G

LIf;`w3>_Qsk)cXV%3gAccZ6!(W)0ELPtBpN&EL15fyv#RZCsU1ul`%(TU5- zju-WMK5Dz3GMzbdEE~o=)aWGFcsW$3t@DnK);bNfN#CZztZjG%`)+^R!52wDXN&5mE zY|Eu_2p8q6l2yDV`B*hJhGcJ{3kca6vTEo6z_{J6=lTJPsl=C8xamzE~eGT9moIa)j3!9gZfS|;*rI~QSNRQ%UA{^ zLfXY7;{61bOdkwP*y-=qnv`p6ZU&QZ4ZbD(@8E#c`a`Y+J)c3rF2PAAvoVW;LZ}!_ zd<(CD{SiFFhG5b7C~LFm&hA~|Yyrz?RGWXm===ODn-73$4=&{jH24K6OXYY+C!SSK zU^iOMh|=%SS@AhofQG+LwceLX5Dlg@jEYv-RQ}6dOx?wMz&j2KuoZI>j6%eguZu~@ zls4W7w=#BbKLjj`Fo^fyE$;taw*y57C8pBWx)opQXA-3;+wPTorCPJ=jtF4nH=@9SVLJM78%IU77 z)!cXNwp|xD>R0j;P`bflvQZ}9Es;`KCuRd<>BJHGrf%C%K514juRWS;K~_O0*g?kc zb?%mox>@(;=ni!8^YgQAxJJIpmIwI!>VzA;d6clQF#db9ZOl7j6p<3wIb^#(E;t@| zAFA5Byj+uH++-skBHd@~Brt^e*zvIo7lX`D#fvR^EhFIHP2&`R2pIdhCrBBWDK{4w z{6v%10cZQcjHKTySyzun7i=@xZCC{zw3VTl*5e?Z9zAjq6wcWj@wpyDu)2-^`E$G0 zUB7?a?$=1ZX6N+isAiqgrjFITZ9!M5YH@DD^A{)_rrt~1j*7#k2A(i7(j+aGInuJ- z6Rn>a`fk;YK748uR#FdTa(1Zdd`q(jr;Lo1YwxzUWAWF~-Rlc`jVb!Bq7xH~d_K}I z{q*RF9m(ro!Fodm^43O1&+}hSrfl5(m~5l^Jz#n_d)NZfQ$4Rym6cWb7z%^%T`c&> zt*zn+9r^Q5H=<1mz|?`HGweEQ`k&FWfOzZ(!H5y9CQB5_XPkgw;V;!JiX1I#Js4z}#7OP=A=6ovrBd{4U0v`?gxA z-1EdvdXZJDC`pW&NYC~Cd)_ML1Z&TN|Hs!`hgI1`s z=`IyPQjkVUO6igg0VxTkyQCYW8_sNef8V*z`Q!8AdVSsO{p{yiYu2n;GxyxLz<9ND zfgFEGIj6+2+(umVO5zP|xz#z!!ntFM)^6%~0NzxWzIX4`lum@x03X-A@|@CA zTu=)vPR`q1i5@Q+otVh02umCdteo*WZz1xoezl5=M}LL9$Tp+I%k|i5x~^lyF~vdi z-f=>L?C-N`nfz}LTFHx~vE_Lw3!&G393oauHp|LKUeN8yDemzo4&Bc{!N7Z|`@z~+ zc>#@j<(o;Ly8`||mow4@F8p+g@}ep;g~1S?_e00+T~gOMtdjEbj&maD3W4VEPDw68 zvxQQ*>hHT5EV#LNi@$nyHT>_5ANR_N{5qM+$PR^Z66p-XW4CuQKd*4DS_WVL){Ny*zE$ON_j zPPv?JwfaubpKfM8p=`g`&oV3@+sa_^6i?-hCVrXTY@5*Z!4*d0XfEQ~nYg|EBLR@KLvCAE-&8h{ znpd}#8`hVW>Nih+Z_b%({;e z^lo#dtqjH0FR)+OtTYe24KR6y?Y7dav}^Muy95e%Id|&z-jN-GchflvEWVxE)D~W$ z5U-HO+eobKGJOph;$|z8wwn!c_Hmx}key*6We4;`RcdZAB&jiQjJ4XbJnXG{_5Fk3 z$v4492+|nX#$mFMx{TVa;!Iz)pmeTtaXe)EryeC>5YSmj<$&8yuU#CaEXg(Ii5RiR z@te%qRsL;fD1ZaJ>U=S!Q{?dAH(^eQ)DJxe;rh;e&#PhSw_jQ_-W|ab> zdnt@&J{L!7f6mtlk0H zS>j)3b7kTABnGnBWL|qwY*wVu!`W`1>zm@<&oyC#Fh5&BStCKC`{~oCzwUJh?mTY0 zrb*Ggi`0vwxwcjTcQNxrkRww4=*XZ;9NQ7s0UGZ;QqW|F+0mnvHr zrR8*rx$sKV{Ay@d5i7eu>(^CilBwE*C(_6&wXpCjK7OV{oe^(ZhVT6OlJwq8ko85S zW$(i;ihHG+xym_mYVx^|XDzf|FEGRrVv{J>2XZc8z)azJ5Y-|b~BzI5=btc;YoG=gsg;x%cCogZMLlLXhFeN@#jossprz{)9UASF`a+T zCamPrw(>X`ob?V$SqjT$&~1uPkyw*F=-R(!U=T*4s8rEr$UbfII~fH5Ll-=B!L}M< z=gFR&9_YCpP>O@0#GRhByT3nZm{Et-ZT*FXD5#k=m82ovOd<9x+i;;Gaxl~B9!|^6 ztZ33)VH=8Cp#9;mW;?Gp;el&3cDw+IjKOfwaECT>J|%^*B?kBg#GH(>41Vo^Fr zjj7c~7%5K#eM^Q__aaI=_+%Tf4^Q}+XxcN)RoLU2$oX#gTTs>r0LyOuTmo}}z>>gsH<)MXYM;~F}od?l!D$VSqp$3Yy*0Zj8h%3eFJ%)<4 zOpJeIb+6&GzKtF>Mlbg9rzSd>tO3OPyO7P$UCM@sI(oC44f*c{u{OrJ+K07h5hjV2 z9yh&HcLj`!U^rri%u%`(##@H?ZYoL8NBtn@^Cwu9O4{7+uipqPHOKY7GJS@ZXuTWzSm5=6;jR5tK@LzV^8Vly`$C+pOQzsgFN6~N`qP!IYnQnK<_eC)>H z)hKluVrclJq8!NfoyIEZEFGHRxdSis7jJaimu3$XWGT|KxX@(`kS)KUh%;TXjg_M5 zxxeAlW~k7gUo?jg3qL%|P)+^pqnF-ZPUN7e{=FX6lH7H!Ef?Z50!MYrNTrf&TRSIZ zRot`YmF%_l@wB|W@F?CQyiLuHxX*y-#24Wr*juUnv1Y!wbNh#hiwP}NN{^{9bR_xA zKggv`%dqqtwW`#I%!yx7QgFLjK=P1{WyPB0h+6coZ(GeJumM4yH~Xql2A2Rg8>7kF zX93FjOvHxQiM;mfh`rhC(aDqKrt;m6BNXXm z?Inh(dmHz3pO(KacoNE=JRZN2_cIwY(tnWAjHp=|4dZ`U05J?WW$KT!YQJRi(_{UK z0nR~;SRs%2n4J4Ytu~9TSZTLDKAP}&SRtphjHCx?YPeyfk=k>0s3i2&A315LiI1_?dd{sDeKyEu?k=AI_PxHpP^(B49eRO0w**W})l+z`yu6xc z%JHezL!;pSEy^tvoK{<19;0kzNGd*)#kU|5^E(!yZNrpOXg8iPF0HI3Mu=JeR?ksnaZ z1ki7ZWLgh&9E+{JENv0Z7sRS-1!$xB`l!G7NAp7*PA8Q$r0|$-@-T;nV_rzv7R-E4 z=fVyx5!=IJma@Au5B<%PChna?tlwxLK0v0KmKd+g>vcL&+h@=Wa=v`oK5X=*k1%?)A^`yb_ko7&1?= z96-F4EgAT{|2R>iguX~NWc>Z!Us?&CIbL$hl#_GGsXUE_RQ2*4tkX8-(yhJzZ0BbZ z{Tn1xxlS>rQYHP@RBD^U8uOD*@cPdq)#oQ<^p~P45Ez^)^cJc@6a!%y1g|;?H_+Yf1N~{9%JM>vJFM@ zfy}O1a~vINB2FHYV!G+-vui={Or;f78H4?Ne)P}@vxW}vJV0cr+0xw5w->@eAdyj5 zseJ=iYy~2r0j2a=-3XD~X0^!6tb2gAZjf`&1Kw?}w{YYe8bO8?ffkyb*uy8nDUKcZnE}|E@J}X^?No z8CmW-Ban*=Mnc^BG_B``!FRkaNy}MILTTwS>cK0BT5X*^f!zB<^Rnhvw^yy4SCK~= z52mr_mfBEqN9RQMIC6BvhIX@wIs+$jTN0T2aaMszl>q;$#zTry;jGU z6uBP-PY0r=5#`_Ar*V?AJTFCVj5v9!PyV@IbvJ;-aUf5LpnmXO;S{ zjE!%29r=lGBV1bSn4zs$0U}(3$xUyjhYP#k4;1>=3_=8?+yVI~z)FlWPbL>K#urd; z)8YkX(0Ao%pQld>@L~tlo9E@pq$zb`pk4vt3eLoz$K?Ac$0{e+sx>f(blQ`V0GIWB zCbp+9EK@`{03ShoXSQa6|MOM3*>NK)D+~Y)6hAT2xj51J#xj$+M|RDJ(j*v(-odB* z;GVU_`%a3+r?iw)vtJ7puq9bbAfg+5e^Tg~EszQCH_dSThjjl&uR>cL!WTPq6#dU*8 zgn`~{s|TvN>PjU&pTZauU>JR(Xyx%%ZH)a}>+4xyeUnKi#K`iReBf0PG5= zsdfwow$8%sjG!vgh+$#B#kUE2a^q`X<-;|AZ9fMd7^uCz<<%t5y3Xn%&a%rLIy#r6 zhyU(bilxrTtpmLaJ3$D9=_OFX2%+cJiT!udg}s33a$O%_WNuo-eWWF;@bc>dFhc%d z{Wb!5Hw~^2yeash~B%>$E*CogY$&k!L&DtuU(U;m*Tfc+Hgj@YVjQ+f4K zCKNYc)7jv^2g8ySV1YJ`XN$t~f2=&F5(S`M-SDbB<}4BSBqFN)?B>$|Qzeq5u-plw z$;Ud6p43exJGyWVwi~iT**|> zK+lW(3MLKg)2P?wEH(fBwr=9S0>BP>IbL2q2209XNBpIllY^lXp0>s4Mxhg_{YQef zr>L^W$s&MMS^4ZQI~ZAptfjY{8sJLT_h0qX`zwBo(^=l-bF`wP@A@|%!-mI(WYx3s zB=F9olb6rf)$dH(@WkhiNR9=Avk)SzptX}#djoa$b{USx_snhUYddSRui|o^H#NEy zZ|Y)Ku-NOU4mq47< zkHwv=ZQ911Mo_A=S~BE-bM5BA;<|C>z+7^BN{|rwXP4eGfUzb|KO$D;L&S6_+441W ziJaWU>om~Dzpp~9@*3TS&f$i%^on&lre)17Z#y0je9$m1=8_QM7Wg~kgSJ&afAyz1 z_MP{>pHn_7N0oW!=H=ZKH!X5fqQts`=JO0&UBY7WaowvM?SO;&iH6aPMC^1Qmzu)y zSFAM#+GcK`ZWFtvn1HnDD0>K2T~&I>-J13uLX2Q2?&sXv220g0R$fvIxXN1kAyg2@ zdDX`2O4UiA%(iof&xqkY#H3B_o0lmsvy~Yl+R`nt)w8u`{kHs^Jhoi;*{e+6c;Tsd&38VgpfzA3OREpE?ofm6>a;Xq>s>{X|i8lI%5-5=eXqP_? zO+MM-L>cEImdP&FUxrqdsJT<*GD`&8dH@9Y_KmKAZ09wfhGNUp*WL(VD$B;svO8;& z(-kWfoK_j^HwD-c>)gw)O4i;p2PaAv(ts|)%lzG>$+Uqv?@Sx@$ut+OM$pV!<-i@5 zlMPSmWHR)1?&b;We54Av?|8rCQ!E3Tps3yY2B0>G^+Gd8KVk&OqzmJeVE#wHI=BET#A;mV_*3Pga8Z%H?tVgIDQeKPGM@kb{w#c_vTN8df>L z0Fh*@02{eVUpN8dRP9Uo0;&0JEmIQ!jrc(00t{nFb) zC%$tX?fUg1AV+2##(U=k*d$x3>~Yf<6d!AJO-&4GX};1<@3}P;GXk+YaLFL^)8cX* zdI|NO^79Pbu()J%_{KvdBVt&Ax?PnKEvCa4U@g15yJ98GE6g)*4zC85W91_)Z)uzS z4<5DbjA8qI&5PjXns>idX_-w~G9`H4CHN1z>YqkRF6WI1~{4xW5dYiFfi5GK_{78_*4EZZo5k$P&3q`gjv|&v z%rqT~VN{h~GK#uFZAZTxj;rO& zXI#B|wMDCcOtUiLNe<9P5tkFgrWDQ3qMf6@*y+8SMwXJ6cJ=yQh9;#@>>HG0p~5ZU5Uhw03kLIVYh@^+yvN%hx4EK z!_hTwOk&^O5vd|d?~9?$S-4hjau*UaFw+!(Q!(M7!TO4^1E?c75*h%l94_Pvb_zBA zAfO4Kegt^O3a52KKR>^}M_u09*!+LnLa==jiE1`(tk4O?ii`6T+bPcjabna)R%oXEF#9g*ffs|>E9`dr zPzHCI5>GVM^Fcwx)G;35vxdn=3jjSs6XDum0q_B&bg-V4mGt2_ta=y#WMKnpK(~@> z0WWFMG-|W>+@L5HQ%;6Mx}HYj+2%*JxJl3F?^it&3adO;ZMX_m*bSJO(ON@u0JK$e ze!L3D-5-k^s#`flmdY#&_o057MPjQ zkysh*ZotaiW9&G>0kIX}E0oL}zkvWn1|)x1pR6E;>I3mBkuv^2k0Ow|3VhBoGqSHH zs(gWh3MpBPop*BtKaS9;y1Xwk^vI!|<-YRFxZ+FMzne>Gn5 z2Bw35s|m-|X~_87Lu-`}gYnki19DUf7LFpOr}dDGfk+eqBtIxuWwlS*ETG55I7yHf z2;@n<4yXC2226A0q1rF)7dhJpTER+35yjY+t+>N#?gO;L-k>Tx(?*-z1XYH20DB#U8+WsBZ~D zA5z%!fhoTG7#&|4jc5Wt?$~>PIZ~-ZHJ-&ZQ>hv>D*mqOT&VAV%fTJLK<=QSt<>sZ zZ?58*Ji{k|WYLJS>H_bCd@_K|{Fw%Z{Ew!;MvZ+p$LOfA18Rhhz}Um76xmlFKM8^1 z7e_`Hf%!y$OmS^kMdFSC$D&zbg931+2vcy@zE*|JkjM(Z^$RY0SKv@6{9WJ?6g6yD z2btPbVJi)s3f%hWpx_-|!-1{p;YHcSE>rV*d#Nu(;wD{5QK%R*Y`{aVrst8f-l&g(lt;8MEO)VaUTH>dR!bq0D!_JJ|a^?#pfak?*ajd!w(=o z<|DogI1H7s4z=Vw&l8*uQoPd6u&});#xyw#7|QY~FW~LYE|c|z{>iTQ=joePZ6{kG zynS;seAEfR$lOyN-!cWKTQw<94E2eqQsbmV74*je+H5o0MOBZGIAn3a{qPbtR?xEN~hq_GWk{wax*!UU&>N6r$SG>I|> z=H}U7)K4ER@Z9O6E_)?|q}x8nZN+_#f^`u`y`wPF1#sOQI`Vca6~KxDJzI~np!1Aw z%j1_3&UJ*dHUo5tu~jb`c(uH6)t9TIPAXTSC0-@?7I4??99L+9->XcGkOy%QSpC_h z>~X>A6(8R3={h-;Egfp9s{=^$WnQzb=H%SK?yf@*o8xRt$Xc0R&oEQEQYPI;o_a=; zYa;94whNQO%WUlI*t?P=4Q>M|Q=~HQxyUQ@Nb@0p*C|BZO^oC_ z5i5tMXYSFOA90?f>U%4^N=bz-la3gcMQMfpw~!y>KFW8{oZFuU$!{u^P^G?P%=q`x zMV#CbZ8yed*J$_>&`f$7G;V^7nQTz9S@wJ7BJzS%g6nx)vH-@8a%d+E`Lc#RA@lWR zcesXcJLjv@M0u}jGWQvG-4EP@T;z~^_}Ug=@x`LB@dJ(L%QhznFT{^g5a7G(LUBlg!k2r1G^0^NY&f?-=d;!ZX@@u@U%f;#F(7-c1tC7j5f4 zaG16EG<5RUY0XKz7E+Ni?qztzeSbv0WvTTX)bx2?mqB7}4*t|Gxl?=7!kNI#`IfqL zOYhiZ`yMUWd7-b256%bG69ypEeISM{?4FP=_fdP$pjctv%^P9MeHF=eS@_&CuRapf&osjHdctJG4n$yAyxaI8Dt;3bpY- z`yJ(UJ=- z&h)UPqv5eczJ8k-FY$-ebCH4}zy$!$v*rhnyzzm*iF(Cky$&zcLjBTb;*|pfc9rvIBmF`-|L9wjWPw zph7DuDjN8E0hTb76|<2U5d479%;IWLyBe-_ckbCz%DiX^H^?plWxmIcAGfbGx;^0b zk|@mqOah&0%NQZ&zIe#s&!1vRf>}|@8BQt*nG9PI1BF|FHba7B%!WjRg&`x#C}+q{ z(Cm~(YdBTaHU~Lho zhm*XH%>wjr($dNM?@yiEKV1dgprwsy7Awp0Ff}y)lTkfct#jEJgtrq~V zB6VLYDkhfS$VH+{fRtFtCVm%!1l!%Ep5hX_laZW*ncd~SYYbEyW94^Wd?3EWu)8oL|O?k`w_gpE1%4$!~ zi;r!Fg%uTaHGkX>HjwfSwsc~29TQsMm!*)0#d9BKq&q_sk=B)Eo2fyFJo9ysIjXM{&tn&824$1!JaOp zNI*RgvdNo30P_Q8DHuuD&CSS7r7khnZ1IcGr018T!Sb@xJ8yTCvT8?XJOehy1BO^Y@DpxYwM(n3jlI3$g{57_-=+_@W|2pRe8Pf-J-xJF z^~UT3YeQ?T!Fp(B=~z!DZg=FY;%436(>n;D{nN?gE1+1FTK=*er=!ZKVS{vq_Z`3- z$G>}O42v!~Rd3C+coQIdFfeP%(luBC^`$8!^1Fp>#2yuPBWQ@hJ5L1qUjCD{Z;;9O zEMmdImaPh%iXF#*5uiB4K_K~p^$=2ykS6WtUA4fH{zIJdu@I0F zg}#YAQAx>;=vqM~fF*sAySXU}J;Jwft&SQ-;#ZzS%PpMZzmc8GDm`)lYs`Fn3H#UO zAcQ(h&$sPOMFN_{4W(xF(~MO>GXn1FaAXnBTdwTOFJl~u=?*gxchg4YfSre1+x^xghB313*%bDKss!>LvUUg*#Nc;0II*l`W_QQdc_B3g!pg zi#}@r>f&ZwQxC(@|F8fT$7DPC52jU)n;2ZbQhZg!z556s{aNYK_~x%-Mku*KE)c@8 z$*%XQ!Whn0XrVo(O>iKC;=PCEDG%S6=I6UdOx+%2NveD)E9Q^_r&9F7J&>n~!1{e{ z%lUj^e;V=VvqVl<$YN=UdR`#|xk`>;Z^4R`>qBoO${#mPGw-`ia&|zm!a4AU-gKUw zH{bJfGm5~V9$Rb5A@V+48Oj#814bf&LsT@8S1S1MOBA#n-$B+h^jPt?OWKRJlygd_ z&)UR1P#HUv9i*Nnm?|+~{o2zqpDp_Gg)D1ZYi3qS;`}Vx`Rt9pcWRlpm&3&c#du>* zzjIb8L1@iB51itGTL+rdTU2Ib`$rG+AhA|Z_|iBhWlBni3-B`{+;7GEr~oeZccpd} zZ9q#4&bEH?>vS~1I7jNKI|ENj`+KkcjJub!n`;bh>Y1XofRkad;BsK(^@GgYcV(hK zKC;RTctMfG&hLg`=%!jNpcIZ&lpl|sK(V!5r3vYf+t^^=n0EWSb?~}=!cantqV9m=aiz>IRk8I5 z!9MzM>|#Op-&-VG?NiBt!|0zX`XhXns-aph^F;)N6geF z@eqHA&8LNqS-`k+WX@RH?Ym6#e!bNkHw%vxB);jTS?nJz32$%?EAAY(FZ@t{SGLv1JTJsIF>Z z`qNO~fR@AFr8+yz_lc}G=XQ>Oxm;}Fq<}+FH2TrtXB+-@NEu??A2BuJtc-73c4#?c z>hJCjW29r%iEf-0J2???IJ^V zpov$qC+RnwszDXE59(vnq5U(ZJL(a^i$y+F+Y`Hvf!js5_bM=-wr%`9IcCVoTY;`evUc|N!i^^8{G7$B(Nn(I za}LDoLnM=O8Y;wulX3?=f}$kn(=gsPHgXG<1(8viue(jFSNI*nBO*X@J1tF~Ikbqe zV2HuT$46l^D<&Z!p)hFbXQ1&<&a$AeGDZmPE3`27(Fh#w$ixPlf;cljX(-3sb^4cS zEVozQuNZan@_f0~zwQ*&wHV>2Ia`cZfd?ry0(&*)7|9xK>;B?T#h}E`52RMevv2Tro&^SeA=*Uk9i{HtjVf0nF$=E6Z-#xSBB?e z7nJoT8+0)@{BHjp)Ch{IXD{{z@k<8W@;UVP_Vp+_J}t)4^78WfC9BwMq)!--+1KVc zKj~qxV62TWE}#whAPNnvGrNyzo7nJkXIIA^!{g(L_T1P99}D0If0=QE$^&wA2y1#) z58p*c#r#+e;68HnpwE~M`&HFY73+>Zd-Ivk5OX!(R)aeGs>`DxoUeTkg_9njyfIZ* zehklPZu!Qx4^MJ?W6wkpwCZC-?yNzyl``2%_##9#Z?JpLuwaO&;>L*|wz9I#hEB-3 zgj&P;whO=h!3d6ew1R|rBH(aUpBWu_e6KHG5jc6rhvpMy7L_Jp$)(Zc1eR}mh|`yb zwdR`Xq#QJ09zti)9Z`YigPa{2iLAn6=4uvNOENT~qJe$$tkOY0_K4%N^LqQqrdKM3 zjO$KE9s*lO9_)VzV#6F$T4%9BTPf{H?2VEfwTBl$Hr()MOog6f1BQ|9yPIZ#x&f*eBkHX(#iX<%9OGh{M?f6|c$->!XIc7$U zq&N1cc$zqHhaz-ItQ9xi_(_XSaLTooZJt1%DEl9h&j$}tIzJ@&)27*+$(==YG29%= zuk^GRUfdF?OL{HDu^dt;#lYb5gDA?RQ~>J}$CQ&@)JFP|-^yTjx@*CK_5_tUB~h_4 zvDUF&W^Zum(8%V&*R#Sg7r_EWD-~8#2_?0x<7nOrt*qhDtnqvx0#J*}K7OdQsGMD9 z!JkiS@NhFZxk8X*bM=qP`1g=UtR5S6Uh7T#wLf*iM17yd zxDzcg#yfmjN!Ir*)uV$-{)>6RkgU#0J_C*KhOHmitiP5?eLKKr^7itaadJ>vDJMX% za`iWhRZ^AT51&AjTsirwrV)7jAbd*y<2jSYFjm_w5qs}#oUETEd2U~rzce$PpG~#m z-^-UUbA5AwX~q|RY}aZ*b`{}}d(7*|R$L_=y~d?lJgH;0A2cHJoGrPo|E|GZ5qo<; zArknHhLS`;r=`)La$S#{W0_O%gKFO#g}tMC*NMA4 z(GlI%=)p-f>8|^!-TZ~`Rn9ce=LKV#-}J}km@&jwzF!K6^A3w(Oe zGzA$Q?pSGcQ4NfTcSX(~8T+?xb`=V7lr=x;`x;s+WgQ*Kn{}31e`_-V>WU^bq z*ZmeKjPQ-GAZCT*3zt%+tRqS4+}|f&364;8=Zn~yzxa8SQt$Hl1xKUVqeFA+V}2}p zZAAT2$TaA#r&3`0 z8%u_b6mCj{x!U3KiCk|BM36u6ST&IkNHwEo zBf{M7UYy?-x0<_B)LnKn*iOXs{rgroe)9+c!in!P@!y2wJ1BcLNmfsY*1swy#CP7k z_J$7oONyRO<`0gl7*k-4P5z?2z*AP^l}P01k1|4Pzw zol2qDT^QwZ;c_&v@*xm!ObNTas*NL4wNIE5C-Kh=`+h%#yA`rr|0>dTH!-u5ik_YD zA$-CZVfCEb4*SFumj-?xb}RTZ;td`0|7d2~VsF0|x`#jnzkT;yXvVOyQ0MZWA{ivF zT0L0F`C{Y9ZejXUJk(E&mk6gqAYQMfoatYB0OWLtPLrl0Zit}3rQ|CdZwry%LLk@? zH-lauzSTsarh?aqje7^`nkX&IByJkNsOTwd32un=MLM0obj^u!-#mtT{-unplVaFmZ?g|?6ryn?ENj)F@ zVmIL3R~VU`zU@iAh5zX`TmwOl`F!o?t?O_@PdZ_wd*ed1!kQa$o{I7y>YMh5CzV}Y zCc2(eg@HQM$5DQFdAfkMKEWCp(yKRg%EyG{b zYFLQw*BG~GxUUrFPvE_9H%*<$doA)@?1kYklBZTV_q`?El`R<}c2LOeJvT#7=9kH| zX(?Lb>?>jVTO?Z!{LOvZKct;ib@UJ7nlzQ!u^_$is0PenCNT`WsR?y3m;A@Lk9UNs z^i5x(sf1H5CSj*v5h@E{`bIN!vq{n_=kA#mN3RqgJJX<<+$dK_PlC*P_jVC!2TmE0l?J)wTXAyh!O~(K z@nc`1{^f++(|Q<(x(iu2(y7!DkJ<6BA;`D#gYtU1_HNLSm?iNaKl@~a?P?ikrGp|S zi2e)dJ^$M>`+h%hKYl+{B>bA=v$Ucihv2y$GSeJuik^Y+rdZuM2r(jj!8ald`P75|NeZx zyo5Ggb5u^nbkXgR;5{5^kAQ2V=a{)W$CgX6Vo9Q=Pr z7Y6at9v9dI@BQ<2y?1tmpCUaVtJD|_>E%Y^9|v9@odorAiNL^L?g)rr=E0Ny;~@h@ zp8uQEe@=ud96n+A``W)n#iqAJ7Di~i@PFPd!AJjwB_J%oat(%8_X}I@`{_!dnJzXr z@sAiwSYR5q*HREX2mjq%{k!^ZO;{+~!{0B0T`QOxZ=mcft)pJKd?!cl8;&O`Vv7Hw z*#GYBb?0+q^Zyx)-@@B}2J;$~+ycxB{}BXM2>qv_utnZzloNVwk9B$L9IsJ+KP6A2 ztDD+1;fANAbW`Iqqq>@abj3(>)BT}~+_GVy|6T6CY5niF|GoI%E&tzM{Abty8~OhR z^Z)wdf8O!mu>WUA|KGXz|GoI%t%>n*Il-z&yxwvEtOcAv71Y(~A$y@#x(*2!H+T2u z*)1_OwYa&31?Yc{&0`tPOi#U*GMCO)r&Ow{Jgk zI+=3ce8Ow<=kws{(xv@*xAX!d%uPc>5<{U0Mrhe!r|YU0mM7A=k{D=E;}bb zyn6Gy256YgLD3-+s&OhJB2YMljL?TshC{%Tv^Dr#7rubj{`D(#GxiVU;!^P?^DD@BoHKNQ#! zpVCX+_Ev(=Gzp1_=F>t2ZejF1v6~ZXVvnmi`?oWo@!2m(H5u$I{E7g+9!N@%l zw84o3Dcu9d><%9*DA6 z6Z8O4-X2iV34n~+!&UZ~3=}-6ey?`|+90~HQ zs;+L_Ajpmk7muK6J3ZRT`2Ky;hVL$!03%dkBY;=~QY%;ollQRVxUAGgx~%2pKXPz! zNq_+O#>xKf?oTA<4R{0m%6$o>;p^c{_(Gbae_((**<(8Zs^jnW)HN9K9x^gUS`^eO z(=#xnMeo46>R>3Sp@59&ty{MY8~rf!jL-xlaA;+I{`sRjY;hZ2++Q0hwwrHfn;=~P zpo!h?lKk@WGS>S>tXu3%ctKK0{A$psP76ZE6cl#HyJjP`?&Z4&2OW_QU(W51S<_xl zIeP;T5YC+)OogtN2H`P<$G@r)Kd4mE@l^Ui`h*bg=jmaqARhQR(AC^t$th^hkc@HA z;d5M3907USC2vS#d7sXbQNB(4$YnKp4{r^P~J7XUZaao2zsZi3}+k0uNy!Y0J za7lJnR&th_zi+`Pf9#flv|}5f4~*zVytxZRwQPCbB|-`;H>3Q2!XMp#Hcf><{ zXL)lo20%fDMo5pX*$r^NIQUKM+v?8=3B+o}h5?{<`#u~uDk|zZqw|Sq!h@&p}Fi>bqxEgO0X#5~FsF>Vc!g!;xa6AfzjRxdXLbGi&P@sI5}Z z$I>w{M1Xy_gV$@?JdjjTi6I7}bBgZGjg9D)74yaeepX z;^IFSB4fC{A)l8wkXr}i%IfNT+1RT`xWR_cFpt5pt^AI- zhgAs}^$cj^8z1VkY%#2zuG%sl=WNV$j{bLKWmBthu~kM*fyfa_=(xPJ)a~iDw=z)d zu-tpIRJv&2pXTldjw3NVBSwQt5515S6)(M9-yUn~Pw@)wyz z!Yxf$e^7++pZx<6?=TD^F8t^|5I;XT*yO%r!&{4d@?d0$4n#jD4(=V`PmOry*rS54 z2q$;l?>j+KE{$2&<(&|{rtm=^ZuX0dJXO?mbS$+TujnZRgiEzXnbjB`-n&45fR;Z6 zS@#FDG6`bwUAqvjA;ZlV{2NZy^FZks1thZ*L(=hF($2}XySoQJ7EDe7%357P&?h7brLD{S^sUSN${PgtHR-+ZX)`3$+8+fqKIH4*P?x_u^V{naTqZ3I$!qm; zL>nbv07b0+(k6IoGjnrntd9__U4}_^0h+RD56a!Lv$Lg`7WdpJ{kj6hR0}p$rQ+DB z?^*soEnIz6l6e-cZ0dB{w%kcuQ(;@jvx%9bsilcbr8%Om%Hnr^Y>KYv(J~ta1y0jg z?s1Ds(H+|vbPNR?#q#~0 zt#y8*AyjtBc+!aWsJNZV^c!7=4QH;FrZpcX5Kuy58b2o~1&sf5O<2Z;P64*Bz*wL$O7(YU-Qv1F?<^LPk zjJj~)=G^d+BS&Odt-@}gHiX%#fUx4Uwt7tho#_r`E=NH!efNy^bWtfuFzKYkFf72^ zBErO~g#HM4!o{znao7D z+IU{pZ33e)!KMo>6OtM@yTucUOeVXq8kC=(KmE_Y{J5Pf68j)?IHF;t*9%p1O78;* z`GENN_@QMxiP9P5f~*kSmfNKGeSN~qvq_ov;0YuKM9?ZK1=oB4vpb$OdU48j-=QcP zxBzT50_bEz#tH=7fv!Mf(nVMz`yYTNV4aen3bz1qdOD}6$<=8XfhAO>Dk)P2>WRY^ z7QePpR+FI|32-RhZk*gBKsogQw2HT|DZ-e5h}|aq``Q~20WiBLui(w2fXhi*(~mp; zFb8Z#Ba&u~BatwImalyj4&zBA`|TX{r&fc(;Ig+0D(^Du%$9S$-)*1mP#pLyjM2kowTom3 z_(kjWh2)9<7FJ1HXun-RBog6}_n-+f(7}ZnLtsXL`FEh)@Z1zLm-5%HB3)TTwTKX5 z|L31HsL-7^l(PMdSpK&t{hgy}`oUffUaCp&#B=+W%4(8G1%e!PDViEDFZO1gD0Yx;{&@1VDdKHR@3q3GT7e+Y| zi{-AuOHN_Ee9*Hw%FhozvgDD-tQekUU5bzpSGyEB4Bx8={IEOS*-|wco+WTlO%1X& zZ0=fE70mAx`ffcWhZPUr#LqP_367{6jZeZhgk5EK+cwfL=ncV<>v_ z0*otfCRCFZ7xqY1>J`C78)NhMUHWFfo0oxY!)Y^@N~r!09C_ib{8g~1eriHRjfq}U zUJE*zsu2++2XKbj-KcW3(1Ytwzed9C5shk+b%u&D8ydrk=A-W%by1CfU^9g$+S<}W zE;?ro9oy2RXzvili~6Mzw(+>QYPaR|zv07qHmvGWOr-TgLuv`Z@;W<)YqBC{ty->$ zzA^k6EI(>XNC;yr8D{Q6VHZ?S^wv1;_=8y^axLV6PG#4ZE z4d;cE?-R(Z8k9cn?fO!h64~3XJte?xZvK$(|8_l+$A&*Vj(JoO-b{`No^LHeVttUOwI_BAl#OyUOI(`O)rv(M)rxw(UK=XWwXomdCJNX?;HXc%uIK%9AP~ z`30hS_B=H;+S)+riLU!Z@#fO2=zMUPF*HpSjkXPAqg}cEj7Q)de6pO3*dfkU=%m~| zPi70Be{y1Lr;1dsr#4vLR^QN~W++5$fub=-^z)QMy%j}MoaBdQ+$hv{$}KVe*v@9&W1OJl8S)O1GT z3;kJw+J>I0yY|Nh<=~Zk@_JyWR63_N-jt-X2KW@JWI`DoggS;sl@ zH`%19rI&t^OxJjJN$0eoN*+|-p0m`;nGoz(hTNAq+maXsmyXif%U-q^8CI#3vq7xW zO+BJ-axB2vde5%^Tfwl?#;O@xNGnCEz8aRfv?`{ABw{nild|=;xesGbRzPbJQ#a_< zJG(lTA)2Ab`evd(XiXo(2Hlncp-UK?qD#%tBycBngX&|$_=b|+vsQi`8vJng<@ZUzK;!Og+#MQscXxMpcXxO9MjCggad(GHzvsl9`A*D4%)K%D z2Rqk_%zUb9XJtODtXOiApkSy#KtNDH$c-(4;z>%SU_2lofHo))`qy0nLp@tZBYQy` zJ$pkXBL_!8BSSi4_j4_agf-UWcitYsqO$kK1=MRoXsITq{lSb#ic^VSW6`&hMUV>z zfSUYe=a$cfx1e{UZ&yThny6)>8J!qlifApQVqge;pt$Q10c$;cv={-u^*W;#D^!Jc zTL%PM)2mHpPA(R%e7rxe0kEGR8#>l0rz`KoxD$Jn&*i)?s@LF4aqwyEf$YMZ`T&z` z*q>V{4lc-3KRNEb7?XC?qIq_uJ2_kqGi5`z-i>mj*T&p&e>bm0yyFC%{j@Qu3GVSx z|9pJ<5xEsIXV}@U8QAl2_1tH{UaLkaN|VUT;ThE?9|&^|FEb5}ynC{$Zp<+B@Y-!I&rt@qDy=bUiM*=`A*OM#wKJ=J}F9&K%M-qvL7bW@u- zv0l5Q438N^>#E3UJ-OP|XwNdvD(}y!bkfkZ?xjTM9j`XQY3vSxx{!nH6kk{J0g)wsB z{=5&5$>xn7I+o>V$jD~ns?zjYE#cFa-yIux>ZkCzS^Is_f5agW70$Z#ggMcF{51aL z@MOoGHC`9nrxxf(0K=Qypv!#=eNTbHnLWuHUm_cH#eUu8iy=FFl+d0jpZ~$P8J&6T z&JuG0;5+aFd{nO647fTDV^!eiRH7Nno}@+9x7(d<@$AdYbowEerBfpv*e)b&~Lz9Xix8qq48F_dhL~$i%Ki!V0dZlNH^y1S{Z4^p{2;R zrxvG2rB^i5G(^|TZr4lxbLrM%V-hj*0wr4b>&b) zj^CUh%QKVm5?6ajFMqVT!$~}_`9r{PFR*>uK$rFbKmK9(aypW)QIJ0@$}3Caz=x)K z&#?+X$*PYVeAGkVMSCHA=@-MkS6<3m+}=rf_QWASNy1j9fxbSt(KnKxWs_z&0xj#G_U0X@7<+{%lT1P0#d;e>H33dH64VrM?HJzuAL zULtrXd^3Z7-|aY7a+trO|34zcUs3QM5d@0BY#jx)2#CGv*XekL^dC8v|*O22!dXLxJWZbxzBtK5}7 zy$ASnE;(rt?&Mbmb7k9Q(ECVVUharxUr47$Ktvk}j!#MTRkx^}`Aqkm{*G1~64%5a z->KJ*m0aboNc@i|^Uqz!zjpzUcqZ#i&_z&qwz-pGzkwlFGmmipij#lE(SOA8zhdb> z;#eQVYGx>|W2W7yAaj9f=S-^v4|05Y>$ueUs(+`ej>ikYK)7F5PJ zBzJw{w=^1K;0z?e!wb({_dI$pyR(D+;LKBLMrx@H8~cU>k;Zl(TkRf?z1taM*0J)B zm}~tHJD-4<4r}io8i(Rrw}S1axb zWpgcNX^VmDh_&7kK}6D9ZLWx=17J$MG?LyxKu&zNgVJA9b7f4l>IAC}o39bYu(1YU zoX~uHMbcvlu86ga&@NL9hv1JLB_T0w4KA?cXIO|*Jpf7pvCLAzXy*2g1JJ2*Bo|l} zPoT83f%?Vf2q->?;c4X+g&b<7WslhO^UB!67-%%HeUXo|oe-6_r)Nmqo>|6_20`uN z)qTX$N06Ojs`g@Xb&TlnAy2{b&f6;NSU~E1BxyE(uCy3?&qz6 zY35stbHR4yoxwxEs(rbC2yzb`l-W9H@q>XO?pod+aUumgg+s|&83}&q#4AVnx}nY7J_cA zlnh^1g{M*~zmf=+`YNJSa02Ae6DmOkGia5bpKgJiy2f1otT+K(o7CWrd;=l@fYp2h z^Dz7lmr)-N?b(Ig__?usog4x{Kd1X8rB24+Bs`q=fT2qW-9~#td32y&qvSAIsCZ0LzUf z!&tZ&kx16jV91skh!w=0;dN1B66*xKdOrcHdJ$HB^dGClI2v<+3F1-Xd@0tk;1Oa# zh9PL+TH_lsa9hM+ruM99JRFNeFh@t>3_T9*QRoPT^y12u>yYW`+3j}sRp34udu=vp zLsvtdo)x;4K=5j}&~1e<>;mRSENIcMeY0L8`BXAQTqfB2gE*wiM_ z%<#IIeiR*!)y+R3-I~GeV^?0;>#&uo zM78k=GhZ>RCE=h>hrSLJD?9nxvaZE^U8PdBn+akfP6Ilug>ZJ#&fDP1l}RoTGA26y zdRb#-e_&X#z`nFu3@l3Dd##&*~g zEpTHc%|t@rO@FJ;vkRHAUODvj+ByC;u6i@q*IJdDgq)vl2BFs*BM|bc9mKG!t|~gBCuh` zc`?>@cs)B~A`$p&dS)!7nLk=gggf;bSy&qTvQ~!Yb2V6YvCM?Yi2<4lLj70{Hlbo@ z*jC(d&?Xb-STnFx2dInW9%i-yTocuW(g(BCy(v`Kon!c5J*##K`1?48(?%Y$G_2To_C;nlRM`sIK1expWk7gfp!>IpQA~~%ovVh+R*sN6rlA7lEldF1;288cOz;UF!hV2K*!w>Ji zAQQPQfH5lY$lys9vm>O*kC+DRh9;n~OQZdOVu zHH~FGP4z1}k?>NSYAPGmO;y6qxrokwUjCs7nd6A^RRI|Nu9&om-rR)^O)jR5>|6R*`f&TWHRZ5BK`zJw!D%%N-_*3j#t#&0^sgKi~ z0efnV>X^-p>iun#xLSj0hy3H-;g#K$NvVw1QZ_t{&9EJ#+6Fy^o+oYs1%_9loYpNT z?R=*9!hEB1kC{WYdAXOw6q;k}z zYH?edT_~=MIyzaI{hEfyq0Zs;iw27sNrRnPK71sv?1ziQ)mwRJ$>(&nlKQM#9Myiq z!(4H@xKFtaW`|DWm@LZzFWECR>(oIZZ{P4r<{-r~dq%Z_)GbVNQ2>+I>cxGRSy4BjuUmjN+)8r&zy-oi+v1G zgTP%L!9j+eIv{2J0?2J7-{vQ|gr-W*p3Y1pU*^w9nEnE5J(iMQ;iK~&cUV6M{UXN}p`|X@)E%GSx&c9IYV3q`^JxR3kF7e6!m9haN`*}dc zp;DP>K$bReV@aBa{V9~pbD#Qt%kMOW>V%n6uFiX+icbK4m-OC>xn-pT=jF|uCzkS3 z6GDn_137M5C!Nq*${BnjKB|ybtk@s+(sggl9Th*qtYg8bLipPpzb|D>pnO%Z7@}JU za}9sW%U1$@-<{yM*C2SyCIc4v>ell1#iJw6J__aFxYkABp{8@cdF6of}bt7=^1K>H5N_lN2e1pDR=`S$w#A4nHa7_OK)=hLP*xT5V1*LA~M! z;ULk;GRkPCj8}^V2nXsiioaAJoJ)KF&4>fPBa z!Flunv_BIHeq#3ai)K~yMTi_o4QY)q*SSYTObvXw^&)MX#gxK=)A0@w$aX#Pzm*er zO-OeoMNa~Ie#zq-b&rJ0XJf-F2v$in8Y*bnC@K-_Gd@2s)@j1mNz{ED0SD;<;n4dv z(xHI|QJ~RRD~eOc(-jd*Vx=owj4~^fn#$J@SLK@Ig|00L2uuG4cKWGv_^T&TyKvL7 ze5iaO;&(VcIk$UFo&un46L2(SkHg{lWVApYa9qT{edxSEym1{m^5!p!OQlAZB8SY* zP3aG!#GcqNPLWgj(~{l2m+WeXH%&5I3kHnNOoY~1oJi&SA_0#s;*oC71c59a7>Gw> z4Jt6iKO>{Mxk$>_*CO(d%%-|-g5l0bSN_2^daT~ALg)Mo3oP54YH1a!uC(NKdg`F5 z0-b(4p4m6nK1>PxUIVEDT|hw`@}}sg1xX{ZIrU$xF+vsEMFLf1vD25LpC+Jz#O61q zS~L>AG^l@hzeK33= zcuxYRZnsth=GcO;4&|UWzxJawp1qRNGK|@sfCskG9k>{ZzGhAv=|(1n^dNI$naZs= z9^yG&IEP9lDWwL3Z#wYy`KRO5uPdYQsk1BTu`^!;m+xGVq_yR>azWa>&5AXoR#M0$ zjJA|}BJru0Pyo8$g0;J~J4e7Ny& zb#?(fOgVzTY%mzvLx!v>bchaXFns7`PXeTlXb3++^i|^rP$?RH)z>P$05uZd(8aMd251d)_W2;D!XY*(gAW^^8j)>RkM%UMt z)WokA1c@?A&2O1F>W(FK8OuY>PR-}1IKB#QvoJ1ecp_OZ$bNn(q5DsV$NfsnCOxe>`tCgeTejXN1G+( z$O*8?t1iVUtfr|bNhW%-0UD&1AKy(q2#+;rKKN1q2?m09mT)|9A`Az?ob`9rIO`Nu z6>WOxW-PM18-NEvN&BQWkEy=l@Ox^f*a%N_DykByA=!>+wZ?Axd$+-;z z5HmiuN;6PR8!uG65u7PTCuD%q)_ z)qfCZP&_8^&S^wkHA%F!OS%;9xLDXGF~U6l1R5&tx?6W6AwAZMfI9a?EZ%YjQa$5c z?NsLs-*Ra^KueOw<3%y>u~RA1-nNv`*8(>yhrx*=w1V-jQ#gpr283lPgf4{Liy~lx zaV}HbhQLv|UpJk)xuKpb#}^S-8-QR1D?EHZC_Uny7sD&lovX=}xq; z3RF?bA`<0FS*lhmJX8#meO!S~M4~~@QwW2jddQT}m$q}N7UwV^~K*{MLwmtzQc`!qcp~jbLt~f z!DYo&RR~23`K}Vt#0OeRKdw@WLO4d8Q zGvu`TO=RZSeo%@MrU=C=`#Z?;ciftvwAJBmZpmc|(TV2DW(&lb;+^wPBM^u=OZ(|l za-Bh|82!i*+Ad1^P5J|NWC_dc`oGf((aM&I{M3rRcE=b2Yv!`Sg{dZGF&sjw+`oR8 zFAUFHjiJ$M)Tlp|j{w7=Md87n#8$>mA{APYf}`H>p}%>n62a`;!dYYHGFiG(+mgMS z6r}<~lQf|lfX;P*NP~46LqjzvF`Rr<@aQ+xxZpPzk+N7;h{2_mka{}Q>m=Me%PL!T zXn09bf4f=LJ__O{|A|e59)rpglG!00NxQV_S+{J5iIJ=}Q8q{sUFgQ>aqW^MpZArp zU&8ikHlliHo{WBdE^5#K274j1mNNIBIpC$29i5ugCH@nxI zX_#^&MSq5}EGoIV749+@_VN{(lI*Kq2@$y9*8Af_^jj7=5F70rDS}A2e^olbS;Ew{ z|4qXcbZ3Dam4sj0gcP0zN|P9l2C50!j~wc6B0-c`Eh404PveR_bZ`)&S za%rSPbs7&K|0yHq9I}hil#ooZ9rJW zkY`od||v`ZXt%P!FksOZ4?r_&N)>h!tY>HRo- zSTJcBFW$1X+4YQh*z-PvR-JOv+UJQxm1uG@r#e8|?X#(G&33J^5%|Zh7Mos3*{}=B zz>8?0@9=t8yX)5H^WkIfdBg3a>a0_?dw5wu(&M8_x)Ixw#i;7SS!b`hLcRLB;*?&m z^L19>SSqKRPqAz5%za}ECe?`x>cjUs!3 zWwPzp6LxyC=N@Ky{#%697hmX+68yQES$4VJ!jFvOzDIe+Hj5-t>^^QVWzlZj97Btj z`+UwN3rp#UtBXMLZgtU$KanF8@3W+D*g@A+WG;L@LP2|FTnX7CaH*jq+%ewc4L?+k zwQk{{aj8VE>?u0%So|%ZyWF!MGRbQI($%L-ol)8LBaiB=C_9{yV5IDv%btD?;xTcR zLk`i6Lwo0HI27X*Cap5ZvLdTFvqI1PV@@|ihtcs2ZK%6k@A-3QlDk0+BZtSHt1?|+ zRiP;|fam+i{i~1VAKoHevN?1C;Y`}Z=3E7W61G@qeic;^c?;q==U9p*3J2o7Toc?x z>MdeC`2g-V-q`?xW93)56ZV+X%gEojg4(tfq$koP?!+79x!g4FqctFw!y0Xy!zH<3 z)f?(AIsUunt-=iQw$S^lTg~P*C^C53uB$L1kP}VM6v-0N^J`DAi4;n+OR$MwM5H)p zo`8q&FY%QkI4H?whGv46>-|cH^=hy{p+mFL;-t2LP;ch$o8MVIR-9l|$iMcJyRj~- zgWeJqcg=W9p0U2m{6>WECpWwvExqWR?*YrLv3=XTRGtu-712q=aY2#EQsb8D+-??`88WT5Aw=WL{- zXJE{s$Iii~$8N;NYQ)a0$6?5(XUO`4kyT%xQP0p&=f_uD*S1Sz&3=s)(d$t)*RwPs zO@dHFi!x20{F-crG+Il%d5r==SP&U!Q&2EDN#?U_Ji;&{_$VKoDldK@NaN5{O9 zvdASK@(=6+1fnoJltUHWi#V+N%JDN{@+nbB8tD)cw6`4bk8?il>IYPPj*opUL?lsGJ1f;Qk^<%yJwnXb@P4-F~S ziEA{nPG$D4gmsc2#cD0j7=>NV<*9kP`@gm6dl>`YP#z%@`9ZUlaehOmTB24AX8cn6 zifbh-x+wiJ=}9>4rVwKD;p_$LSRuGTSJ;5*Ewy8T3|sm1^cg80MQc<^DjhTZ5$nNO z$(x1|8E?)G&a4k_uV`Lr`kvg=3h-fazxLUN=CXynqV zlS38TfU94L0XHw76>ZvOlX50QYeg)O!?txX((E(sd^|G6>#iaoyub@`kE|d@O28SD z0lPL21P{o>8F~!}(GtZ^&phB9?8FxJ-JcudJ#0}jWd@)j#>p=)g>#xJOmS30OFfm@ zV0A@zMeE2)sfkH#3V)5w;U2ID4UNp~$I8UVJEp4e2KgR}Ho)S9A<1f5apKIgVT>49 zC)=5@TRLOykTdv=&9s&QyL4u6%$fTe)_Q3dRm{}Nrf??sFJtU2b%TSThn8R*cDW2- zFxhW)IR5fsZctBwzB;!I0841As`ahhZ+X`uGwBUC!fr{kyQudPNCD&zkPRE=! z)O7q#-wGUKSpi2>(Dq(OSVCl410B{|Cz#QDr4C&-IPcGubEjBdj5){i$IF10tuC95 z68OnKdU=K&Xlr?ApLcz6bTsTSfwyw%@K0{Y2ec5OCdbbR`}c-Ki5m%;BGIydbtxTk z6Y_`nm%z4%JVzG@!Ig_n>iCTnTL-VWRIHT-A@TlrId@&1q|{R{(0=*$q1T`wJizqT z{E1PNM|Fu}FPETzAqpm{Tt-mPjI~-LZtJoV)yw>|%^b~5e(gW_!fw@sPI(T4Jl zB2yK$zhLBpbAWbL?|HNr8{y{1th34(!nhu8it*3<_s4A`h-*_tVi}QX{W;|3&uMKB z3B8z-r!w`Otj`LQ zwYY!-{l|&T2I14?zDrX`qdmhfL#3JUXk|IAcPHCS$t~`9TJT~zU^_cu(|Z(Din>NK1%e23C#rj3 z1Cj+HrGz66v9d8Uf6Ap0vT0pX@wZ2Ir*CI_QsabTV49>VbSl0E7log1kM~>PV{d=_ zkdcc$TIU)X={&T)TfUb5m0bl zV`OgY$ZLVhZ?~&Fh$xPX&2&QOx)J+8SvI}b__Dy?cQva6t(%AfQcNARzIt z+UDSFLZ@$Uq-UuA_gvC{svIK=yP=^WgE13_0Xv7WJ_{QgJBOaJK9i9livc?;2dfUF z&i~Eq%gec@h0PiO{XJXf$GGke1Wok8d+c`%@dh&xX44t#1n+N{;mKiQh5R$k>pDFy zfI|ES%4mXc^luWr($RF6u$LSTI{7l*Kcy&+7%L9k)L~;N$wet?X6+L(_I74+KHX3< zNSJF9^b@6i5#!*a?a#!N{FeDZ8aXmKC2qt77&eC{=Yu}sAb*~|(|eg$9b=3!XZ((5j+l0G*l|ma`F*Nq zh?X3VIY8o=6mxQ`CtTJWZrh)q^o zCrxp4zAtyQ5C*Hd%X6l~%HkEe;>02W1JE3p7_s01K5XOXR}jEZhCTj>kSvW>%ld#s5O<*(IicVlP4dHcK<*O6ofok6iSdiB3V4iO^#u8H7O9~^pnhOg3g zNQdW5UPuWsx2~3)TQD+9B6IRiE82I|KzH!zN^yLQ^`xT*nyjH6r8iH6&#X#lm*>-{ z$k9?lsc}erXb@+e40qpzTz{Q0HN77~4o#SZbK4K`52iR*EL`I|dvx zyTrfqop>_39U4bmH1vk7wtm8~#V#eB@mf5GPbGK{gyH=>V>5)EZr@_$xLTp)%Ah~K zhz5iH4jg!JtN`_}I5ioYWrX(BdnOIfwjsgwoKo}o62$a=jAmzpXlQHI;p9tRX$B!u^cG{k4C1bP^DGn3$%zWdDwmyigSzzm(pM;+{ z*1iVirO0prCzkRwM8cLf@nWuYAtWjhmcV%*bQCAXw!mt7LbMFQ&!yNnVQC;Lbds>^sR|2jKqhhuy>Bts^6#Fky;uBaXN_UaHu*)?B!%NIH z3bw>lY7iHT3b{w=_5QXZ8_6~6GK-8i5R&8hqY7eqrRn=a(ivl9?ra;rcdtI-y-)o` zqKz%-@I}^J`o3an1M*U}tUr;*beTEJAN*VG)(cgx$ z=~weMn+dv#e%qoh5qz;x`dCOXHNw%dhN_SyXxa6}n?X^p38a-H$P{cgQ#If1jB_+% zND^1Js{#W%YCi+esM-Y4Hcb$nmK%BEA77vl+spE}eZ*F7aJ?m5UuYfQ0&3Pr z+odABvLM#U++8$okDP3@8q?T|KNe#1LAHR|0MeiGEO@~##L_vj0IvoIa0 zi+A*Em^PJuF%-q-hU5RFA}afV?Fo&h0DYN&DJLi&i>x7j9*A9)QC4ia$Qy;UgCf{BW>{SzDF$mB9* zS`LMB(oY0WiPn=8AoqCaz1hiNKG=MO+=-U3QKi(-GxGP)2z{D6Y?-ZdjdpWgQ5M2l z@Q}&oa^UU(nyV32Q2c0R5g<3105O~7Kt*&W{h$LjYLI#Z7COd{=j$Y07iI9RW}5ya zO4f9N;KAj3Y^@w~%T&bV7u#bPYRMed56hQ}_CUue3F^>@u~f!G9uNZ<@Ih8BdxwUt?RbL2Z;vXp&gT(b z&GfJaDqE&H>xRv4y9eNg-!&xqk7kwSLCiw)l{PK4!IpM#7fxd?wep;5Apj#|ms4X; zDmsh295hXY0Ev})1zl*T(zXSKjv>jlo11;gG(R^^?GK+D#`Tk~jc>Vs!ph80lhJ<( zcAq>bn1$B0bab`6b~S$Iku7`9Ielt3U$QUN_0ZL#F69)SlZ8z8PIT7l=_)|Drw!p5 zDihjLt3vSeF5Qw<5Bd0*Y4PPv9NCRM8b^HT6!N(|atHv%CW;gyNT!GP>xRlBsNCkd z%R%+Z`?0kBlyzvLG#cQ!G9q;3qH}*i;8n(;szSYzYXk4c`z>$FYpKKMZbK1Y;_Iwr z7%yC24cFacH19wr6nN9=4HiLd>GQ|Y8sbawUziSe9Zda5QJo+9@O6*kP~K~OJuXjL zee|dpl|eccpuGe)@3e2O0LagTew&Q~k=gQqegcU%wWW(SzBjoW2eZ&^eDCTscCfd+ z@))Q0?)QO9b8qtR^5=6KkYaD9rF#SI-di6tE-XDw8WlpkYXm0`_0?M~K6g#NV49N0 zJ}W!fj>-t0-LLXjA>Bs?S_79Iy$C9evrV3*iFbrL_krcSi!5&!5g&`aCxZl;ty{<0 zysz~Clj^7$pT_M$0|9Mo00Hs*o9dVu*jWE>k(_@F{?ePDW;SbL$Y1nkW?VN8TE+6- zYcv^h%#aD1p^uK7Ys~W-W_)v4oS0vJ&GWscbR4JtNiOqLy0*BlG)o17bC0{$hVtYb zfz1esBi`X0sbmN}B{{uZX0Uol8I!DmE0n z-YxR$ExxzelErjy?8v=iQYZt24P`9)y+6D4nC=<|`cb;8LTutnKjC@C>*CTCk0(7w z3R2yn$Y!Qr?Z?M35VQH9kG-F|tx zIr2W;Pp+AxZmZ5w_ChW5>Uj-&#$J`Um?5pd9N#@B&yHjF+g@>ue=fHKQ|n+(H3Yfg zqK-M?8t>U9%Z$Gj6?!CZTR4NKF6ZeP?d98U1L!Er&GSWA5-L2ElJSDxT~TB98dD#D zMZ7L)u^=((gs%Arm&|;$M=z4lT@qR?>4E4ve&Ib}mq+#6?UKF{L>Mx=Uz*>qGCOYZ zUbeW#7Ge%rtu_j+l)S?*Y1XdQ^mYh*e`zAOj1AkpJ(jXsPa@1nhw7iRC5OfCR&Lw9 zWrqYrZ;?-nJJF?FE@W)^>`3{z!Kp=e8w=p;`J!;o*hfqM-e0ZT`5>jFo8j;^KH}kP zx#*Dcj)tLm8Hk{N)U6+F;M4EPmrs>zWDFPEmLGiqMxrePyD{Kt-38e8Grt73_G*~w zp&`RMj0FMbE2&8Ur3zl+dNI;O)e&|iUT@@cGYb}qPUkp%L$BIoMn7#;)u(P`Rk>^J zOSUB*8n+T^3j3)E-Gp38VDN*n-ONzftBIuQJI2PcPiM(GuqCCZI!$zkPMq@Y80tQH~Ux6 z`2 zV_BONRz%jZzd`A1+DeXLZ=ay|qCpJ6)Unkxd@Dt(J(+u<5^Nq<`X*OvjAM9= zJ(|uMTU2{P&a#xe&oVSl?Ba=$=vj=lWf*0YU zUUG9UZIkY+%LHdGHqI@nH0Tj9d8Kozk%q!5*~En*_NY^;krjicwJN?Y4yJlQa;wui z&mWbt(@C(dz%8^LbV7199_ihEfCZf)g+OOQUGAb^YRd}vfK=-=PWys3P-7K1sj69e&&pghyS1miSoPm_(im7|W(&Z%5g4q>bj za&?-+yv{fOyxz68M3R+dsTOsF+r1}=Rv?k_THqc$n~Uh11ww$P=~i$McOBBDSU?M z+A9pbl?VBR*e#TZ@IN++J?z^coSao>W@VyFhn+|jkzxgsW7JDb9WewoV*;YqQKnk7 z#67Y>3*Fw&nv&pn41)tJ@W-}>JEw{YLyG4%_urZ`ySN>;w%Qx#c$q{%cF%>wsYu<| z3cR@RcFn{K{rxM?19@Rq?viQH{A8zi3m50S*Jh+9D^Ctl zikECbga+~k1#=O}d5Q7Tb3}6&=ls_wt{h7Qf~lD(@7n2sL3(*fRHLlG>nUr;p6f=` zgzvhZj)erYcl^-cW}z)~jo z@L>&!ARTsBFpASd7}|T-C+yEi^xv#3_`KhpR-o{Sf2Icakv^C>N$oOl$oA*j(!<*$ z(;RB(DGTx2(ERBzD3`c0t`MqmGm?!8pQUdyf*l8K^QD9<&x3WK-XllxFJe|%vVoz_ zjaGu5;kIfe`84VA^8UWu?9lX@NizaqO4Y`s5kgJ&R)}u1P{fiDAZv;kxX z&>L{zR#Up(4D+Kj|5-D)#Y_HEqIW(fMwO%frDfq={dPSCxQj%m)F>jhRK^)|&?1jhCas z4>Gf=1Z0atF1D=`!-k5`1fwcXG;oxo-U5~Cn%B}KyxCvFcpfr60V*(-kqn99X)5hq z9K%)JY>L(vyV~@4Tqk?@f>mHNI|aPW^CJfZ5Sd<(QA)Z#oIVI!<#85{@l{8KZt)T; zu6x?M68&$YZgwY|RUQv#J^zzE`hf&0n}YxWy}+|KG zYh*q=9SK*X`hz4f++BUhRI!T42yQ!XPo3Y%@bi-@hHLf6w06S#+*KF5vJF_CNtSE1 zuo|1FwaJ~&RjhqpGt42svzMByItb7=Bn~z~CydQa-qQnqQJsKA5o`9u+*en0oXgG8mhlahMC!HHY_O?cy^SX;-PtW9X1C~3%A(bU zq6`kzZ)^v>4`Wg(vBiIM7<-VS##z>Y?xo%ffm65kjMQ;$<0#}(B^usTp3nW`q%gn^ zxvlO$dt$2_PdG|L#i{QPD696rq8uG6sP&_^;>RnKij{Mj@%W?2b|%ezM?Dl6U~pZvqA!?cLF>n(bHoh0 zpeAV1jVUKqS~qe2yem8KggxG$P7i^KY)UKX(G51oz$s}si2({Ta~Z1ZF&sF@{F0Kg zOw$R0p8r`MHZ;qXQ#><{SEuR$M=R`ufEY34@o0Es+Y$Stp7?OeHa4 zz)!0_9B1$XaR`+3nX3Fg>2kLC2d$KyyHCm$HfnO20%M;%yGINQr$@;D8Nv-tz}P@v zeasJbARy6yhp>ZzsgaeQqnW|~Rv`b!>MNWlGqhp~SW$y74^><5h|fi!AR?vF>J?hB z%h;@ntQN+RG8mw(Ku84Hm|jnp_%p+zo*ANdry`l3fu{PrHyr|X)Vy7J&iYac*^AxK zCv(py_~WZ?rPHknR&;!Lr^aA$$Jy5gU%4go)suhoR^lgbO&)F=#0?tN1D7K)E+pZ6tEN1VvT2(0Y7Ztp@Ksd`f+j|MUBpH>{Fza`On?%>IR= z1|AyM7Y~vjdqjf==%rzubcDrJd+9Rb4+qr|CTYwalx~xBeWBQr?43LfnxqCK2Vy%fQHc9B_n!uag;*`^bBEGfJ0ZY3QsAJ*nznmS*&6^M` z)4B7#$Liu}LG;4$;LNp*)Q^5jAG|V4E?!F-qCNYp1iwDza8J_ZG|*3p`c->z01Uk@ z=lK?Qse2gRjGpUiDo}am3y(-lJxCk*n>M(o7CSmaD}~xu&W_u-57jyNigk|by!0Uv z1uL+UyxurgbfTc}5{&l_pJFeL?M!-5-P(b3cF)*7WNY#B7D~2!-l4|cF8A|c+>ZXUQCDlC&^mKV-FP?{tP=Azpx5+0?GHw`UnJ|Yj(tAfB zILfLan1x!ZAsid+{w7+PQ0+UB?>xKcRMK}Pkp7Ka?>ubCMC{CEpN1O39MLv*_d1|M zBC@z(Bg6x1we@()ovR3mUYkEuN*PjWU(F-{qt=Hmix<}4zztpRg}Dv?u=M&Q_D$;^ zFQxu4C!~=D;8}i|22bH`bEO5*?SXT(VLWT`lGqyp@?=Q;BviK+XS5x%y4^9?7xI$_ z&F+L`OPP#d@n|dO%{l*(e9PdEM+?!Gg|Swarz#S~FNN9C1A*t#v5 zyUjC_VcvGQ*U~g6rw1=TFBkg_0+>zs?*>~7HLs?eue>SY5*woBXRpD_HeZ8(03G(W z#d!!YUR+oaC4Nmf{gAtIHl=!fapFsz;@z!&Qa0b(GY|6`owy+_g5KV zkSu%5$%oRFt1;3`w&!B+_zdzVHMJ8#MLhwgeoxj>*9t|Xmp#sdIMeCLnL*t9zm*fc z-rHr18)DjuRFc|dl~zXnJr1E^Z&#d$fxoUPKwdxowDX~M;%T%u*XTSB9G{`kp(V8w zP}f}G{B_OsY6&6oMF0K$bJvQc z848?-Tvb7OqE~`%2_#nHn{R;!zwYY(i3NxYs(<#?w-eD*|O<0&j&iL5BS(aYhzmFrJV|=)Ac^%=b`7aK&C6Q}|kczr6{|L4~p{I`$)K63Nd z^j|*Ozh0s6e{ullzY+es@%bNwWYYg1+o1mq``-^C{{!py{a>*E$B!ic8|uFq>wlnn z*!~6ef5>0|8|c4z#eabOIsXOpAHMK^9h>_9&`|!5)fdZ(UE8Y(I H|6ctsN}z`k literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/DWM1000_AdapterBoard_Breadboard.svg b/lib/DW1000/adapterBoard/adapterBoard pdf/DWM1000_AdapterBoard_Breadboard.svg new file mode 100644 index 0000000..12e12de --- /dev/null +++ b/lib/DW1000/adapterBoard/adapterBoard pdf/DWM1000_AdapterBoard_Breadboard.svg @@ -0,0 +1,360 @@ + + + +image/svg+xmlADXL327_Breadboard.svg1 +UWB42 +DWM1000 +Adapter +18 + \ No newline at end of file diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard.fzz b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard.fzz new file mode 100644 index 0000000000000000000000000000000000000000..cd799cf31759a4bc7f9ed77b3b96e598339eb226 GIT binary patch literal 21403 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_top.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_top.pdf new file mode 100644 index 0000000000000000000000000000000000000000..489c1c1143895abdc06d4a2e474ea9b92bdd3d10 GIT binary patch literal 6680 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

~cY$kw>i5%7BCCGr(?GW# z#a;>}x9!wKX8P76Ij8t2YFG9Gt(gSWGF)~B!h3|~#_^unWz=V_f&Ph23Y?<#dM>if zDDFXd)>TE2YrTNRS!_BB4_@2%%TRm!TMRUNcvzK}Lt9}Bh;~eN~9b(a#u4hY!G(llHSJs{5 zc7AdEVDZNMN6phrlduj*_P$96bUqE_DXnKJ)QKbtgwt>SekuU?d#SRNQa?8h1IoFo zQJaN|8A!>fYI%;&b}Z*AvqMH=Ve+;+x%vMMwY$GXO>-}h7J{BnGsq?;>5J_1n|zv! z%sL(x#KBaV(>M50!3%Wfl94rM`L-3By!yzy*lkN3>fAUbTGq9dftttms=_{ZZY3H` z3i|A}x^-&;?;$y`JjUxOFuG?3V`KjI$?mSE#hkpZoGNzsF!b-t91K2>_P$5bX=QVH z$zIjU8g;vDvH7fsSE9}~E%XB$-|7AL{|av{^cSv`sJX4Xsj+9pPdPijyiyXuasTvS z^4VNZ_3Nh`SQsHJ)!au|)1JAAuRuz4@X z$$fW3&q%l#bDTeYNS#J=U@1)7cYxj8_qK#|K-II5RS^*1!^5z+gvwjB=F3rsv*Rl( z)f93=WDW+5Irkf~=y+})bXqOC!Lp~$`29s%+pN)1*awKXQF@V!$#v#3>(_aLxL&$~ zc=KMv-QTdn#DHg2&uCFxv}n6-Hj(QD^Hl77vLQ~(5a*@%;p^>h+K)64qD2A0Ok8v( zAgKLKP_0-oarhN!cpUh0-?tOlk%}KaCo6qe!c0DBq%oe?nAfZv42#pRp|*RBX)xN*Q+HuQN^a3cn*;hD z&Wo10Tf@-Vx~b)v=jWrY)ezz*7NV_RR9hue2^siO=vb>wjLtt&{`a~!a22)V>z)r< zNBOJ7-JD%|Z}@gj6P430Y;P*(T}{@Rn%=;c)-o7H@g(Pz^a1EBUv-Bw!>n|6{Y4Je zQU*JE^zCrcRN>H)h(F^=zJkBlsedpAd+YC3J-p`%_UY}%t8ghTdZqQbG+CZc$D)#` z(9dryFiZPNZ+Tk2OQkaM+g7C8i2KV7$Y{9l2lSXt4{5Modf3$jrRPUMKhegh%auOW zn0S->*|xB#S#$dzYq{*8UMkr=*D|3ZZ~59kPxKhY_IJx^&{^u_dT~X+b0Ms>vrVF!wKwedIr!dvU_T<)=fZ!wJ;}Ai8j-j?J{!@?tDMtvT-^V zH@kspTX8X;r%v8TYF?P}E}bEKdE5Nl`Ao0vd|@L7v&|Ccrep_9{lAZSzt8`fBVp#0 zSXNd+{>ONoIr9H8Ili=WC$MuB0D|f}+T+0>OAvGZZVIvnX4@EdU^p!a48U<1I|Pyd z2FCW9+Fbe3`dG+uAHU2$HC*qI}APHc=4wCr!0n5qCO3Q*Bz`xdji97QH zM*m!slmce+|6P-lf&sJh|E@_$%Kg4qO73?#X$j!I<^S!KRrpO#?tkr-k^CJ)R{mdm z2{>Cv7bI@yDhJ`{jb!qL>Y^PmVCE$ca8+Q6!4SaA8m#m`6 literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_top_mirror.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_copper_top_mirror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fbb02c42e4588aef9f556dde03e10683836eb61d GIT binary patch literal 6726 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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_bottom.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_bottom.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d8ceb3c0a67a3f7f270df09daf60058cacba5ac7 GIT binary patch literal 2806 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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_bottom_mirror.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_bottom_mirror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e0ba056a6405898580351a0389c81699f6e4a8c9 GIT binary patch literal 2805 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 UIRe;F88U_FjdgQdxi$#de_Yn&#Ewr{C9F5dL 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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_top_mirror.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_mask_top_mirror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f4223af82029f333a5f07f152b534347d27e1c6f GIT binary patch literal 4150 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 F{Xc%s-2(ss literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_bottom.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_bottom.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c80057d32a8d3e8c4346e54e5fcf120efbe60040 GIT binary patch literal 1148 zcmZWpy>HV%6t_B5a04&^^IL-GK+fmXNrS4Y`DoG#+J-nnNNFXm&LwqmebxCw({3Qq zkr4@r0VL+`u(2^AKK=#%1ZLo!6DLt($@0DD_wjr0_p>vNYV97&E)xbe$b%!Yx=Ls( z(4m04fB!8JT2X>)sYX^q$xh!FiD^Buv;~%HWi1D9mIenhs&b9_)%%XkTsvpynd>mO zxJ1_0h=@9-jWgZu>_h;qaLq&6BecPLB8D6WG^Y}l=Mpvsy6$Q0M5tE+t@`G$4R+Rc z2=zIztc~zX!)IyBgDwx_B!5t!gm*rRG z%k|53xcc$d!YAv`i<=U~HL5m}ndxl6=fccO ix1z2D^Cv+)Hl@^HKJ!FfvF1uAn^|!g$z(QmYvezcb~9rD literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_bottom_mirror.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_bottom_mirror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c80057d32a8d3e8c4346e54e5fcf120efbe60040 GIT binary patch literal 1148 zcmZWpy>HV%6t_B5a04&^^IL-GK+fmXNrS4Y`DoG#+J-nnNNFXm&LwqmebxCw({3Qq zkr4@r0VL+`u(2^AKK=#%1ZLo!6DLt($@0DD_wjr0_p>vNYV97&E)xbe$b%!Yx=Ls( z(4m04fB!8JT2X>)sYX^q$xh!FiD^Buv;~%HWi1D9mIenhs&b9_)%%XkTsvpynd>mO zxJ1_0h=@9-jWgZu>_h;qaLq&6BecPLB8D6WG^Y}l=Mpvsy6$Q0M5tE+t@`G$4R+Rc z2=zIztc~zX!)IyBgDwx_B!5t!gm*rRG z%k|53xcc$d!YAv`i<=U~HL5m}ndxl6=fccO ix1z2D^Cv+)Hl@^HKJ!FfvF1uAn^|!g$z(QmYvezcb~9rD literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_top.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_top.pdf new file mode 100644 index 0000000000000000000000000000000000000000..20f322063d8e4e8ff7fb5dcc37c0d3a648ccea36 GIT binary patch literal 3849 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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_top_mirror.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_paste_mask_top_mirror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4df772a4fea1d76a81cc7167035e1cea8992cfea GIT binary patch literal 3883 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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_bottom.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_bottom.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aa69c3c455909dc8b1fd67e639b8cc6867dfe4ac GIT binary patch literal 37296 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

    tnnG$@UT$h*>Ir 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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_top_mirror.pdf b/lib/DW1000/adapterBoard/adapterBoard pdf/adapterBoard_etch_silk_top_mirror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..37f18b2efa8070c64a53e77bee14642d49afc072 GIT binary patch literal 50242 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +The DWM1000 module is based on Decawave's DW1000 Ultra +Wideband (UWB) transceiver IC. It integrates antenna, all RF +circuitry, power management and clock circuitry in one module. +It can be used in 2-way ranging or TDOA location systems to +locate assets to a precision of 10 cm and supports data rates of +up to 6.8 Mbps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/DW1000/adapterBoard/dwm1000 arduino standalone/etch_top_sided_miror.pdf b/lib/DW1000/adapterBoard/dwm1000 arduino standalone/etch_top_sided_miror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..57a0ecae1ffd79dc0bb0436f73d660d05c90551b GIT binary patch literal 6357 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +We've spent an enormous amount of time creating and checking these footprints and parts. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + +<b>SOT-223</b> + + + + + + + + +>NAME +>VALUE + + + + + + + + + + +<h3>EIA3528-KIT</h3> +<b>Warning:</b> This is the KIT version of this package. This package has longer pads to make hand soldering easier.<br> + + + + + + + + + + + +>NAME +>VALUE + + + + + + +>NAME +>VALUE + + + +>NAME +>VALUE + + +<B>Thin Plasic Quad Flat Package</B> Grid 0.8 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Micro USB Package + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DW1000 + + + + + + + + + + + + + + + + + +<b>EAGLE Design Rules</b> +<p> +Die Standard-Design-Rules sind so gewählt, dass sie für +die meisten Anwendungen passen. Sollte ihre Platine +besondere Anforderungen haben, treffen Sie die erforderlichen +Einstellungen hier und speichern die Design Rules unter +einem neuen Namen ab. +<b>EAGLE Design Rules</b> +<p> +The default Design Rules have been set to cover +a wide range of applications. Your particular design +may have different requirements, so please make the +necessary adjustments and save your customized +design rules under a new name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/DW1000/adapterBoard/dwm1000 arduino standalone/one_sided_standalone_DWM1000.sch b/lib/DW1000/adapterBoard/dwm1000 arduino standalone/one_sided_standalone_DWM1000.sch new file mode 100644 index 0000000..d45d0e9 --- /dev/null +++ b/lib/DW1000/adapterBoard/dwm1000 arduino standalone/one_sided_standalone_DWM1000.sch @@ -0,0 +1,2609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +We've spent an enormous amount of time creating and checking these footprints and parts. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + +<b>SOT-223</b> + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +>Value +>Name + + + + + + +>Name +>Value + + + + + + + + + + + + +>Name +>Value + + +<b>Panasonic Aluminium Electrolytic Capacitor VS-Serie Package G</b> + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + +<b>Panasonic Aluminium Electrolytic Capacitor VS-Serie Package E</b> + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + +<b>Panasonic Aluminium Electrolytic Capacitor VS-Serie Package E</b> + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + +>Value +>Name + + + + + + +>Value +>Name + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + +Type J2 package for SMD supercap PRT-10317 (p# EEC-EN0F204J2) + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<h3>EIA3528-KIT</h3> +<b>Warning:</b> This is the KIT version of this package. This package has longer pads to make hand soldering easier.<br> + + + + + + + + + + + +>NAME +>VALUE + + +<h3>EIA3216-KIT</h3> +<b>Warning:</b> This is the KIT version of this package. This package has longer pads to make hand soldering easier.<br> + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + +>Name +>Value + + +<b>RESISTOR</b><p> +chip + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +>NAME +>VALUE + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + + +1/6W Thru-hole Resistor - *UNPROVEN* + + + + + + +>NAME +>VALUE + + + + + + +>NAME +>VALUE + + + + +1/4W Resistor, 0.4" wide<p> + +Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> + + + + + + +>Name +>Value + + +1/2W Resistor, 0.5" wide<p> + +Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> + + + + + + +>Name +>Value + + +1W Resistor, 0.6" wide<p> + +Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> + + + + + + +>Name +>Value + + +2W Resistor, 0.8" wide<p> + +Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> + + + + + + +>Name +>Value + + +<h3>AXIAL-0.3-KIT</h3> + +Commonly used for 1/4W through-hole resistors. 0.3" pitch between holes.<br> +<br> + +<b>Warning:</b> This is the KIT version of the AXIAL-0.3 package. This package has a smaller diameter top stop mask, which doesn't cover the diameter of the pad. This means only the bottom side of the pads' copper will be exposed. You'll only be able to solder to the bottom side. + + + + + + + + + + +>Name +>Value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +>NAME +>VALUE + + + + + + + + + + + + + +>Value +>Name + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +>NAME +>VALUE + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>32M1-A</b> Micro Lead Frame package (MLF) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<B>Thin Plasic Quad Flat Package</B> Grid 0.8 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>USB Series A Hole Mounted</b> + + + + + + + + + + + + + + + + + + + + + +>NAME +PCB Edge + + + + +<b>USB Series A Surface Mounted</b> + + + + + + + + + + + + + + + + +>NAME + + +<b>USB Series Mini-B Hole Mounted</b> + + + + + + + + + + + + + + + + + + + + +>NAME + + + + + + +USB Series B Surface Mounted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME + + + + +<b>USB Series Mini-B Surface Mounted</b> + + + + + + + + + + + + + + + + +>VALUE +>NAME + + + + +<b>USB Series B Hole Mounted</b> + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + +<b>USB Series Mini-B Surface Mounted</b> + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +>Name +>Value + + +<b>USB Series B Hole Mounted</b> + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + +>NAME + + + + + + + + + + + + + + + + + + +>NAME + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +Micro USB Package + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +>NAME +>VALUE +ADJ +IN +OUT + + + + + + + + + + +>NAME +>VALUE + + + + + + + +>VALUE + + + + + +>VALUE + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + +>VALUE +>NAME + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +USB + + + + + + + + +<b>Voltage Regulator LM1117</b> +Standard adjustable voltage regulator but in SMD form. Spark Fun Electronics SKU : COM-00595 + + + + + + + + + + + + + + + + + + +<b>Capacitor Polarized</b> +These are standard SMD and PTH capacitors. Normally 10uF, 47uF, and 100uF in electrolytic and tantalum varieties. Always verify the external diameter of the through hole cap, it varies with capacity, voltage, and manufacturer. The EIA devices should be standard. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + +<b>Resistor</b> +Basic schematic elements and footprints for 0603, 1206, and PTH resistors. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Header 1</b> +Standard 1-pin 0.1" header. Use with straight break away headers (SKU : PRT-00116), right angle break away headers (PRT-00553), swiss pins (PRT-00743), machine pins (PRT-00117), and female headers (PRT-00115). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>USB Connectors</b> +<p>USB-B-PTH is fully proven SKU : PRT-00139 +<p>USB-miniB is fully proven SKU : PRT-00587 +<p>USB-A-PCB is untested. +<p>USB-A-H is throughly reviewed, but untested. Spark Fun Electronics SKU : PRT-00437 +<p>USB-B-SMT is throughly reviewed, but untested. Needs silkscreen touching up. +<p>USB-A-S has not been used/tested +<p>USB-MB-H has not been used/tested + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DW1000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/DW1000/examples/BasicConnectivityTest/BasicConnectivityTest.ino b/lib/DW1000/examples/BasicConnectivityTest/BasicConnectivityTest.ino new file mode 100644 index 0000000..7a5e877 --- /dev/null +++ b/lib/DW1000/examples/BasicConnectivityTest/BasicConnectivityTest.ino @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file BasicConnectivityTest.ino + * Use this to test connectivity with your DW1000 from Arduino. + * It performs an arbitrary setup of the chip and prints some information. + * + * @todo + * - move strings to flash (less RAM consumption) + * - make real check of connection (e.g. change some values on DW1000 and verify) + */ + +#include +#include + +// connection pins +const uint8_t PIN_RST = 9; // reset pin +const uint8_t PIN_IRQ = 2; // irq pin +const uint8_t PIN_SS = SS; // spi select pin + +void setup() { + // DEBUG monitoring + Serial.begin(9600); + // initialize the driver + DW1000.begin(PIN_IRQ, PIN_RST); + DW1000.select(PIN_SS); + Serial.println(F("DW1000 initialized ...")); + // general configuration + DW1000.newConfiguration(); + DW1000.setDeviceAddress(5); + DW1000.setNetworkId(10); + DW1000.commitConfiguration(); + Serial.println(F("Committed configuration ...")); + // wait a bit + delay(1000); +} + +void loop() { + // DEBUG chip info and registers pretty printed + char msg[128]; + DW1000.getPrintableDeviceIdentifier(msg); + Serial.print("Device ID: "); Serial.println(msg); + DW1000.getPrintableExtendedUniqueIdentifier(msg); + Serial.print("Unique ID: "); Serial.println(msg); + DW1000.getPrintableNetworkIdAndShortAddress(msg); + Serial.print("Network ID & Device Address: "); Serial.println(msg); + DW1000.getPrintableDeviceMode(msg); + Serial.print("Device mode: "); Serial.println(msg); + // wait a bit + delay(10000); +} diff --git a/lib/DW1000/examples/BasicReceiver/BasicReceiver.ino b/lib/DW1000/examples/BasicReceiver/BasicReceiver.ino new file mode 100644 index 0000000..70ce821 --- /dev/null +++ b/lib/DW1000/examples/BasicReceiver/BasicReceiver.ino @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file BasicReceiver.ino + * Use this to test simple sender/receiver functionality with two + * DW1000. Complements the "BasicSender" example sketch. + * + * @todo + * - move strings to flash (less RAM consumption) + * + */ + +#include +#include + +// connection pins +const uint8_t PIN_RST = 9; // reset pin +const uint8_t PIN_IRQ = 2; // irq pin +const uint8_t PIN_SS = SS; // spi select pin + +// DEBUG packet sent status and count +volatile boolean received = false; +volatile boolean error = false; +volatile int16_t numReceived = 0; // todo check int type +String message; + +void setup() { + // DEBUG monitoring + Serial.begin(9600); + Serial.println(F("### DW1000-arduino-receiver-test ###")); + // initialize the driver + DW1000.begin(PIN_IRQ, PIN_RST); + DW1000.select(PIN_SS); + Serial.println(F("DW1000 initialized ...")); + // general configuration + DW1000.newConfiguration(); + DW1000.setDefaults(); + DW1000.setDeviceAddress(6); + DW1000.setNetworkId(10); + DW1000.enableMode(DW1000.MODE_LONGDATA_RANGE_LOWPOWER); + DW1000.commitConfiguration(); + Serial.println(F("Committed configuration ...")); + // DEBUG chip info and registers pretty printed + char msg[128]; + DW1000.getPrintableDeviceIdentifier(msg); + Serial.print("Device ID: "); Serial.println(msg); + DW1000.getPrintableExtendedUniqueIdentifier(msg); + Serial.print("Unique ID: "); Serial.println(msg); + DW1000.getPrintableNetworkIdAndShortAddress(msg); + Serial.print("Network ID & Device Address: "); Serial.println(msg); + DW1000.getPrintableDeviceMode(msg); + Serial.print("Device mode: "); Serial.println(msg); + // attach callback for (successfully) received messages + DW1000.attachReceivedHandler(handleReceived); + DW1000.attachReceiveFailedHandler(handleError); + DW1000.attachErrorHandler(handleError); + // start reception + receiver(); +} + +void handleReceived() { + // status change on reception success + received = true; +} + +void handleError() { + error = true; +} + +void receiver() { + DW1000.newReceive(); + DW1000.setDefaults(); + // so we don't need to restart the receiver manually + DW1000.receivePermanently(true); + DW1000.startReceive(); +} + +void loop() { + // enter on confirmation of ISR status change (successfully received) + if (received) { + numReceived++; + // get data as string + DW1000.getData(message); + Serial.print("Received message ... #"); Serial.println(numReceived); + Serial.print("Data is ... "); Serial.println(message); + Serial.print("FP power is [dBm] ... "); Serial.println(DW1000.getFirstPathPower()); + Serial.print("RX power is [dBm] ... "); Serial.println(DW1000.getReceivePower()); + Serial.print("Signal quality is ... "); Serial.println(DW1000.getReceiveQuality()); + received = false; + } + if (error) { + Serial.println("Error receiving a message"); + error = false; + DW1000.getData(message); + Serial.print("Error data is ... "); Serial.println(message); + } +} diff --git a/lib/DW1000/examples/BasicSender/BasicSender.ino b/lib/DW1000/examples/BasicSender/BasicSender.ino new file mode 100644 index 0000000..2e0d23e --- /dev/null +++ b/lib/DW1000/examples/BasicSender/BasicSender.ino @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file BasicSender.ino + * Use this to test simple sender/receiver functionality with two + * DW1000. Complements the "BasicReceiver" example sketch. + * + * @todo + * - move strings to flash (less RAM consumption) + * + */ +#include +#include + +// connection pins +const uint8_t PIN_RST = 9; // reset pin +const uint8_t PIN_IRQ = 2; // irq pin +const uint8_t PIN_SS = SS; // spi select pin + +// DEBUG packet sent status and count +boolean sent = false; +volatile boolean sentAck = false; +volatile unsigned long delaySent = 0; +int16_t sentNum = 0; // todo check int type +DW1000Time sentTime; + +void setup() { + // DEBUG monitoring + Serial.begin(9600); + Serial.println(F("### DW1000-arduino-sender-test ###")); + // initialize the driver + DW1000.begin(PIN_IRQ, PIN_RST); + DW1000.select(PIN_SS); + Serial.println(F("DW1000 initialized ...")); + // general configuration + DW1000.newConfiguration(); + DW1000.setDefaults(); + DW1000.setDeviceAddress(5); + DW1000.setNetworkId(10); + DW1000.enableMode(DW1000.MODE_LONGDATA_RANGE_LOWPOWER); + DW1000.commitConfiguration(); + Serial.println(F("Committed configuration ...")); + // DEBUG chip info and registers pretty printed + char msg[128]; + DW1000.getPrintableDeviceIdentifier(msg); + Serial.print("Device ID: "); Serial.println(msg); + DW1000.getPrintableExtendedUniqueIdentifier(msg); + Serial.print("Unique ID: "); Serial.println(msg); + DW1000.getPrintableNetworkIdAndShortAddress(msg); + Serial.print("Network ID & Device Address: "); Serial.println(msg); + DW1000.getPrintableDeviceMode(msg); + Serial.print("Device mode: "); Serial.println(msg); + // attach callback for (successfully) sent messages + DW1000.attachSentHandler(handleSent); + // start a transmission + transmitter(); +} + +void handleSent() { + // status change on sent success + sentAck = true; +} + +void transmitter() { + // transmit some data + Serial.print("Transmitting packet ... #"); Serial.println(sentNum); + DW1000.newTransmit(); + DW1000.setDefaults(); + String msg = "Hello DW1000, it's #"; msg += sentNum; + DW1000.setData(msg); + // delay sending the message for the given amount + DW1000Time deltaTime = DW1000Time(10, DW1000Time::MILLISECONDS); + DW1000.setDelay(deltaTime); + DW1000.startTransmit(); + delaySent = millis(); +} + +void loop() { + if (!sentAck) { + return; + } + // continue on success confirmation + // (we are here after the given amount of send delay time has passed) + sentAck = false; + // update and print some information about the sent message + Serial.print("ARDUINO delay sent [ms] ... "); Serial.println(millis() - delaySent); + DW1000Time newSentTime; + DW1000.getTransmitTimestamp(newSentTime); + Serial.print("Processed packet ... #"); Serial.println(sentNum); + Serial.print("Sent timestamp ... "); Serial.println(newSentTime.getAsMicroSeconds()); + // note: delta is just for simple demo as not correct on system time counter wrap-around + Serial.print("DW1000 delta send time [ms] ... "); Serial.println((newSentTime.getAsMicroSeconds() - sentTime.getAsMicroSeconds()) * 1.0e-3); + sentTime = newSentTime; + sentNum++; + // again, transmit some data + transmitter(); +} diff --git a/lib/DW1000/examples/DW1000Ranging_ANCHOR/DW1000Ranging_ANCHOR.ino b/lib/DW1000/examples/DW1000Ranging_ANCHOR/DW1000Ranging_ANCHOR.ino new file mode 100644 index 0000000..caec3a3 --- /dev/null +++ b/lib/DW1000/examples/DW1000Ranging_ANCHOR/DW1000Ranging_ANCHOR.ino @@ -0,0 +1,52 @@ +/** + * + * @todo + * - move strings to flash (less RAM consumption) + * - fix deprecated convertation form string to char* startAsAnchor + * - give example description + */ +#include +#include "DW1000Ranging.h" + +// connection pins +const uint8_t PIN_RST = 9; // reset pin +const uint8_t PIN_IRQ = 2; // irq pin +const uint8_t PIN_SS = SS; // spi select pin + +void setup() { + Serial.begin(115200); + delay(1000); + //init the configuration + DW1000Ranging.initCommunication(PIN_RST, PIN_SS, PIN_IRQ); //Reset, CS, IRQ pin + //define the sketch as anchor. It will be great to dynamically change the type of module + DW1000Ranging.attachNewRange(newRange); + DW1000Ranging.attachBlinkDevice(newBlink); + DW1000Ranging.attachInactiveDevice(inactiveDevice); + //Enable the filter to smooth the distance + //DW1000Ranging.useRangeFilter(true); + + //we start the module as an anchor + DW1000Ranging.startAsAnchor("82:17:5B:D5:A9:9A:E2:9C", DW1000.MODE_LONGDATA_RANGE_ACCURACY); +} + +void loop() { + DW1000Ranging.loop(); +} + +void newRange() { + Serial.print("from: "); Serial.print(DW1000Ranging.getDistantDevice()->getShortAddress(), HEX); + Serial.print("\t Range: "); Serial.print(DW1000Ranging.getDistantDevice()->getRange()); Serial.print(" m"); + Serial.print("\t RX power: "); Serial.print(DW1000Ranging.getDistantDevice()->getRXPower()); Serial.println(" dBm"); +} + +void newBlink(DW1000Device* device) { + Serial.print("blink; 1 device added ! -> "); + Serial.print(" short:"); + Serial.println(device->getShortAddress(), HEX); +} + +void inactiveDevice(DW1000Device* device) { + Serial.print("delete inactive device: "); + Serial.println(device->getShortAddress(), HEX); +} + diff --git a/lib/DW1000/examples/DW1000Ranging_TAG/DW1000Ranging_TAG.ino b/lib/DW1000/examples/DW1000Ranging_TAG/DW1000Ranging_TAG.ino new file mode 100644 index 0000000..5d11a30 --- /dev/null +++ b/lib/DW1000/examples/DW1000Ranging_TAG/DW1000Ranging_TAG.ino @@ -0,0 +1,52 @@ +/** + * + * @todo + * - move strings to flash (less RAM consumption) + * - fix deprecated convertation form string to char* startAsTag + * - give example description + */ +#include +#include "DW1000Ranging.h" + +// connection pins +const uint8_t PIN_RST = 9; // reset pin +const uint8_t PIN_IRQ = 2; // irq pin +const uint8_t PIN_SS = SS; // spi select pin + +void setup() { + Serial.begin(115200); + delay(1000); + //init the configuration + DW1000Ranging.initCommunication(PIN_RST, PIN_SS, PIN_IRQ); //Reset, CS, IRQ pin + //define the sketch as anchor. It will be great to dynamically change the type of module + DW1000Ranging.attachNewRange(newRange); + DW1000Ranging.attachNewDevice(newDevice); + DW1000Ranging.attachInactiveDevice(inactiveDevice); + //Enable the filter to smooth the distance + //DW1000Ranging.useRangeFilter(true); + + //we start the module as a tag + DW1000Ranging.startAsTag("7D:00:22:EA:82:60:3B:9C", DW1000.MODE_LONGDATA_RANGE_ACCURACY); +} + +void loop() { + DW1000Ranging.loop(); +} + +void newRange() { + Serial.print("from: "); Serial.print(DW1000Ranging.getDistantDevice()->getShortAddress(), HEX); + Serial.print("\t Range: "); Serial.print(DW1000Ranging.getDistantDevice()->getRange()); Serial.print(" m"); + Serial.print("\t RX power: "); Serial.print(DW1000Ranging.getDistantDevice()->getRXPower()); Serial.println(" dBm"); +} + +void newDevice(DW1000Device* device) { + Serial.print("ranging init; 1 device added ! -> "); + Serial.print(" short:"); + Serial.println(device->getShortAddress(), HEX); +} + +void inactiveDevice(DW1000Device* device) { + Serial.print("delete inactive device: "); + Serial.println(device->getShortAddress(), HEX); +} + diff --git a/lib/DW1000/examples/MessagePingPong/MessagePingPong.ino b/lib/DW1000/examples/MessagePingPong/MessagePingPong.ino new file mode 100644 index 0000000..572d27f --- /dev/null +++ b/lib/DW1000/examples/MessagePingPong/MessagePingPong.ino @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file MessagePingPong.ino + * Use this to test two-way communication functionality with two + * DW1000. Both Arduinos use this sketch, but one node configured + * as initiator/sender of the (first) ping message and the other + * being configured as receiver/answerer of the (first) ping message. + * + * Configure each node by setting their "trxToggle" attribute to either + * "SENDER" or "RECEIVER". + * + * @todo + * - add in SENDER mode timeout if no pong received then resend ping + */ + +#include "require_cpp11.h" +#include +#include + +// connection pins +constexpr uint8_t PIN_RST = 9; // reset pin +constexpr uint8_t PIN_IRQ = 2; // irq pin +constexpr uint8_t PIN_SS = SS; // spi select pin + +// toggle state +enum class TransmissionState : uint8_t { + SENDER, + RECEIVER +}; +// toggle and message RX/TX +// NOTE: the other Arduino needs to be configured with RECEIVER +// (or SENDER respectively) +TransmissionState trxToggle = TransmissionState::RECEIVER; +volatile boolean trxAck = false; +volatile boolean rxError = false; +String msg; + +void setup() { + // DEBUG monitoring + Serial.begin(9600); + Serial.println(F("### DW1000-arduino-ping-pong-test ###")); + // initialize the driver + DW1000.begin(PIN_IRQ, PIN_RST); + DW1000.select(PIN_SS); + Serial.println(F("DW1000 initialized ...")); + // general configuration + DW1000.newConfiguration(); + DW1000.setDefaults(); + DW1000.setDeviceAddress(1); + DW1000.setNetworkId(10); + DW1000.commitConfiguration(); + Serial.println(F("Committed configuration ...")); + // DEBUG chip info and registers pretty printed + char msgInfo[128]; + DW1000.getPrintableDeviceIdentifier(msgInfo); + Serial.print(F("Device ID: ")); Serial.println(msgInfo); + DW1000.getPrintableExtendedUniqueIdentifier(msgInfo); + Serial.print(F("Unique ID: ")); Serial.println(msgInfo); + DW1000.getPrintableNetworkIdAndShortAddress(msgInfo); + Serial.print(F("Network ID & Device Address: ")); Serial.println(msgInfo); + DW1000.getPrintableDeviceMode(msgInfo); + Serial.print(F("Device mode: ")); Serial.println(msgInfo); + // attach callback for (successfully) sent and received messages + DW1000.attachSentHandler(handleSent); + DW1000.attachReceivedHandler(handleReceived); + DW1000.attachReceiveFailedHandler(handleReceiveFailed); + // sender starts by sending a PING message, receiver starts listening + if (trxToggle == TransmissionState::SENDER) { + msg = "Ping ..."; + receiver(); + transmit(); + } else { + msg = "... and Pong"; + receiver(); + } +} + +void handleSent() { + // status change on sent success + trxAck = true; +} + +void handleReceived() { + // status change on received success + trxAck = true; +} + +void handleReceiveFailed() { + // error flag + rxError = true; +} + +void transmit() { + DW1000.newTransmit(); + DW1000.setDefaults(); + DW1000.setData(msg); + DW1000.startTransmit(); +} + +void receiver() { + DW1000.newReceive(); + DW1000.setDefaults(); + // so we don't need to restart the receiver manually + DW1000.receivePermanently(true); + DW1000.startReceive(); +} + +void loop() { + if (rxError) { + Serial.println(F("Failed to properly receive message.")); + rxError = false; + return; + } + if (!trxAck) { + return; + } + // continue on any success confirmation + trxAck = false; + // a sender will be a receiver and vice versa + trxToggle = (trxToggle == TransmissionState::SENDER) ? TransmissionState::RECEIVER : TransmissionState::SENDER; + if (trxToggle == TransmissionState::SENDER) { + // formerly a receiver + String rxMsg; + DW1000.getData(rxMsg); + Serial.print(F("Received: ")); Serial.println(rxMsg); + transmit(); + } else { + Serial.print(F("Transmitted: ")); Serial.println(msg); + } +} diff --git a/lib/DW1000/examples/RangingAnchor/RangingAnchor.ino b/lib/DW1000/examples/RangingAnchor/RangingAnchor.ino new file mode 100644 index 0000000..432a5d4 --- /dev/null +++ b/lib/DW1000/examples/RangingAnchor/RangingAnchor.ino @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file RangingAnchor.ino + * Use this to test two-way ranging functionality with two + * DW1000. This is the anchor component's code which computes range after + * exchanging some messages. Addressing and frame filtering is currently done + * in a custom way, as no MAC features are implemented yet. + * + * Complements the "RangingTag" example sketch. + * + * @todo + * - weighted average of ranging results based on signal quality + * - use enum instead of define + * - move strings to flash (less RAM consumption) + */ + +#include +#include + +// connection pins +const uint8_t PIN_RST = 9; // reset pin +const uint8_t PIN_IRQ = 2; // irq pin +const uint8_t PIN_SS = SS; // spi select pin + +// messages used in the ranging protocol +// TODO replace by enum +#define POLL 0 +#define POLL_ACK 1 +#define RANGE 2 +#define RANGE_REPORT 3 +#define RANGE_FAILED 255 +// message flow state +volatile byte expectedMsgId = POLL; +// message sent/received state +volatile boolean sentAck = false; +volatile boolean receivedAck = false; +// protocol error state +boolean protocolFailed = false; +// timestamps to remember +DW1000Time timePollSent; +DW1000Time timePollReceived; +DW1000Time timePollAckSent; +DW1000Time timePollAckReceived; +DW1000Time timeRangeSent; +DW1000Time timeRangeReceived; +// last computed range/time +DW1000Time timeComputedRange; +// data buffer +#define LEN_DATA 16 +byte data[LEN_DATA]; +// watchdog and reset period +uint32_t lastActivity; +uint32_t resetPeriod = 250; +// reply times (same on both sides for symm. ranging) +uint16_t replyDelayTimeUS = 3000; +// ranging counter (per second) +uint16_t successRangingCount = 0; +uint32_t rangingCountPeriod = 0; +float samplingRate = 0; + +void setup() { + // DEBUG monitoring + Serial.begin(115200); + delay(1000); + Serial.println(F("### DW1000-arduino-ranging-anchor ###")); + // initialize the driver + DW1000.begin(PIN_IRQ, PIN_RST); + DW1000.select(PIN_SS); + Serial.println(F("DW1000 initialized ...")); + // general configuration + DW1000.newConfiguration(); + DW1000.setDefaults(); + DW1000.setDeviceAddress(1); + DW1000.setNetworkId(10); + DW1000.enableMode(DW1000.MODE_LONGDATA_RANGE_LOWPOWER); + DW1000.commitConfiguration(); + Serial.println(F("Committed configuration ...")); + // DEBUG chip info and registers pretty printed + char msg[128]; + DW1000.getPrintableDeviceIdentifier(msg); + Serial.print("Device ID: "); Serial.println(msg); + DW1000.getPrintableExtendedUniqueIdentifier(msg); + Serial.print("Unique ID: "); Serial.println(msg); + DW1000.getPrintableNetworkIdAndShortAddress(msg); + Serial.print("Network ID & Device Address: "); Serial.println(msg); + DW1000.getPrintableDeviceMode(msg); + Serial.print("Device mode: "); Serial.println(msg); + // attach callback for (successfully) sent and received messages + DW1000.attachSentHandler(handleSent); + DW1000.attachReceivedHandler(handleReceived); + // anchor starts in receiving mode, awaiting a ranging poll message + receiver(); + noteActivity(); + // for first time ranging frequency computation + rangingCountPeriod = millis(); +} + +void noteActivity() { + // update activity timestamp, so that we do not reach "resetPeriod" + lastActivity = millis(); +} + +void resetInactive() { + // anchor listens for POLL + expectedMsgId = POLL; + receiver(); + noteActivity(); +} + +void handleSent() { + // status change on sent success + sentAck = true; +} + +void handleReceived() { + // status change on received success + receivedAck = true; +} + +void transmitPollAck() { + DW1000.newTransmit(); + DW1000.setDefaults(); + data[0] = POLL_ACK; + // delay the same amount as ranging tag + DW1000Time deltaTime = DW1000Time(replyDelayTimeUS, DW1000Time::MICROSECONDS); + DW1000.setDelay(deltaTime); + DW1000.setData(data, LEN_DATA); + DW1000.startTransmit(); +} + +void transmitRangeReport(float curRange) { + DW1000.newTransmit(); + DW1000.setDefaults(); + data[0] = RANGE_REPORT; + // write final ranging result + memcpy(data + 1, &curRange, 4); + DW1000.setData(data, LEN_DATA); + DW1000.startTransmit(); +} + +void transmitRangeFailed() { + DW1000.newTransmit(); + DW1000.setDefaults(); + data[0] = RANGE_FAILED; + DW1000.setData(data, LEN_DATA); + DW1000.startTransmit(); +} + +void receiver() { + DW1000.newReceive(); + DW1000.setDefaults(); + // so we don't need to restart the receiver manually + DW1000.receivePermanently(true); + DW1000.startReceive(); +} + +/* + * RANGING ALGORITHMS + * ------------------ + * Either of the below functions can be used for range computation (see line "CHOSEN + * RANGING ALGORITHM" in the code). + * - Asymmetric is more computation intense but least error prone + * - Symmetric is less computation intense but more error prone to clock drifts + * + * The anchors and tags of this reference example use the same reply delay times, hence + * are capable of symmetric ranging (and of asymmetric ranging anyway). + */ + +void computeRangeAsymmetric() { + // asymmetric two-way ranging (more computation intense, less error prone) + DW1000Time round1 = (timePollAckReceived - timePollSent).wrap(); + DW1000Time reply1 = (timePollAckSent - timePollReceived).wrap(); + DW1000Time round2 = (timeRangeReceived - timePollAckSent).wrap(); + DW1000Time reply2 = (timeRangeSent - timePollAckReceived).wrap(); + DW1000Time tof = (round1 * round2 - reply1 * reply2) / (round1 + round2 + reply1 + reply2); + // set tof timestamp + timeComputedRange.setTimestamp(tof); +} + +void computeRangeSymmetric() { + // symmetric two-way ranging (less computation intense, more error prone on clock drift) + DW1000Time tof = ((timePollAckReceived - timePollSent) - (timePollAckSent - timePollReceived) + + (timeRangeReceived - timePollAckSent) - (timeRangeSent - timePollAckReceived)) * 0.25f; + // set tof timestamp + timeComputedRange.setTimestamp(tof); +} + +/* + * END RANGING ALGORITHMS + * ---------------------- + */ + +void loop() { + int32_t curMillis = millis(); + if (!sentAck && !receivedAck) { + // check if inactive + if (curMillis - lastActivity > resetPeriod) { + resetInactive(); + } + return; + } + // continue on any success confirmation + if (sentAck) { + sentAck = false; + byte msgId = data[0]; + if (msgId == POLL_ACK) { + DW1000.getTransmitTimestamp(timePollAckSent); + noteActivity(); + } + } + if (receivedAck) { + receivedAck = false; + // get message and parse + DW1000.getData(data, LEN_DATA); + byte msgId = data[0]; + if (msgId != expectedMsgId) { + // unexpected message, start over again (except if already POLL) + protocolFailed = true; + } + if (msgId == POLL) { + // on POLL we (re-)start, so no protocol failure + protocolFailed = false; + DW1000.getReceiveTimestamp(timePollReceived); + expectedMsgId = RANGE; + transmitPollAck(); + noteActivity(); + } + else if (msgId == RANGE) { + DW1000.getReceiveTimestamp(timeRangeReceived); + expectedMsgId = POLL; + if (!protocolFailed) { + timePollSent.setTimestamp(data + 1); + timePollAckReceived.setTimestamp(data + 6); + timeRangeSent.setTimestamp(data + 11); + // (re-)compute range as two-way ranging is done + computeRangeAsymmetric(); // CHOSEN RANGING ALGORITHM + transmitRangeReport(timeComputedRange.getAsMicroSeconds()); + float distance = timeComputedRange.getAsMeters(); + Serial.print("Range: "); Serial.print(distance); Serial.print(" m"); + Serial.print("\t RX power: "); Serial.print(DW1000.getReceivePower()); Serial.print(" dBm"); + Serial.print("\t Sampling: "); Serial.print(samplingRate); Serial.println(" Hz"); + //Serial.print("FP power is [dBm]: "); Serial.print(DW1000.getFirstPathPower()); + //Serial.print("RX power is [dBm]: "); Serial.println(DW1000.getReceivePower()); + //Serial.print("Receive quality: "); Serial.println(DW1000.getReceiveQuality()); + // update sampling rate (each second) + successRangingCount++; + if (curMillis - rangingCountPeriod > 1000) { + samplingRate = (1000.0f * successRangingCount) / (curMillis - rangingCountPeriod); + rangingCountPeriod = curMillis; + successRangingCount = 0; + } + } + else { + transmitRangeFailed(); + } + + noteActivity(); + } + } +} + diff --git a/lib/DW1000/examples/RangingTag/RangingTag.ino b/lib/DW1000/examples/RangingTag/RangingTag.ino new file mode 100644 index 0000000..bae29d9 --- /dev/null +++ b/lib/DW1000/examples/RangingTag/RangingTag.ino @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file RangingTag.ino + * Use this to test two-way ranging functionality with two DW1000. This is + * the tag component's code which polls for range computation. Addressing and + * frame filtering is currently done in a custom way, as no MAC features are + * implemented yet. + * + * Complements the "RangingAnchor" example sketch. + * + * @todo + * - use enum instead of define + * - move strings to flash (less RAM consumption) + */ + +#include +#include + +// connection pins +const uint8_t PIN_RST = 9; // reset pin +const uint8_t PIN_IRQ = 2; // irq pin +const uint8_t PIN_SS = SS; // spi select pin + +// messages used in the ranging protocol +// TODO replace by enum +#define POLL 0 +#define POLL_ACK 1 +#define RANGE 2 +#define RANGE_REPORT 3 +#define RANGE_FAILED 255 +// message flow state +volatile byte expectedMsgId = POLL_ACK; +// message sent/received state +volatile boolean sentAck = false; +volatile boolean receivedAck = false; +// timestamps to remember +DW1000Time timePollSent; +DW1000Time timePollAckReceived; +DW1000Time timeRangeSent; +// data buffer +#define LEN_DATA 16 +byte data[LEN_DATA]; +// watchdog and reset period +uint32_t lastActivity; +uint32_t resetPeriod = 250; +// reply times (same on both sides for symm. ranging) +uint16_t replyDelayTimeUS = 3000; + +void setup() { + // DEBUG monitoring + Serial.begin(115200); + Serial.println(F("### DW1000-arduino-ranging-tag ###")); + // initialize the driver + DW1000.begin(PIN_IRQ, PIN_RST); + DW1000.select(PIN_SS); + Serial.println("DW1000 initialized ..."); + // general configuration + DW1000.newConfiguration(); + DW1000.setDefaults(); + DW1000.setDeviceAddress(2); + DW1000.setNetworkId(10); + DW1000.enableMode(DW1000.MODE_LONGDATA_RANGE_LOWPOWER); + DW1000.commitConfiguration(); + Serial.println(F("Committed configuration ...")); + // DEBUG chip info and registers pretty printed + char msg[128]; + DW1000.getPrintableDeviceIdentifier(msg); + Serial.print("Device ID: "); Serial.println(msg); + DW1000.getPrintableExtendedUniqueIdentifier(msg); + Serial.print("Unique ID: "); Serial.println(msg); + DW1000.getPrintableNetworkIdAndShortAddress(msg); + Serial.print("Network ID & Device Address: "); Serial.println(msg); + DW1000.getPrintableDeviceMode(msg); + Serial.print("Device mode: "); Serial.println(msg); + // attach callback for (successfully) sent and received messages + DW1000.attachSentHandler(handleSent); + DW1000.attachReceivedHandler(handleReceived); + // anchor starts by transmitting a POLL message + receiver(); + transmitPoll(); + noteActivity(); +} + +void noteActivity() { + // update activity timestamp, so that we do not reach "resetPeriod" + lastActivity = millis(); +} + +void resetInactive() { + // tag sends POLL and listens for POLL_ACK + expectedMsgId = POLL_ACK; + transmitPoll(); + noteActivity(); +} + +void handleSent() { + // status change on sent success + sentAck = true; +} + +void handleReceived() { + // status change on received success + receivedAck = true; +} + +void transmitPoll() { + DW1000.newTransmit(); + DW1000.setDefaults(); + data[0] = POLL; + DW1000.setData(data, LEN_DATA); + DW1000.startTransmit(); +} + +void transmitRange() { + DW1000.newTransmit(); + DW1000.setDefaults(); + data[0] = RANGE; + // delay sending the message and remember expected future sent timestamp + DW1000Time deltaTime = DW1000Time(replyDelayTimeUS, DW1000Time::MICROSECONDS); + timeRangeSent = DW1000.setDelay(deltaTime); + timePollSent.getTimestamp(data + 1); + timePollAckReceived.getTimestamp(data + 6); + timeRangeSent.getTimestamp(data + 11); + DW1000.setData(data, LEN_DATA); + DW1000.startTransmit(); + //Serial.print("Expect RANGE to be sent @ "); Serial.println(timeRangeSent.getAsFloat()); +} + +void receiver() { + DW1000.newReceive(); + DW1000.setDefaults(); + // so we don't need to restart the receiver manually + DW1000.receivePermanently(true); + DW1000.startReceive(); +} + +void loop() { + if (!sentAck && !receivedAck) { + // check if inactive + if (millis() - lastActivity > resetPeriod) { + resetInactive(); + } + return; + } + // continue on any success confirmation + if (sentAck) { + sentAck = false; + byte msgId = data[0]; + if (msgId == POLL) { + DW1000.getTransmitTimestamp(timePollSent); + //Serial.print("Sent POLL @ "); Serial.println(timePollSent.getAsFloat()); + } else if (msgId == RANGE) { + DW1000.getTransmitTimestamp(timeRangeSent); + noteActivity(); + } + } + if (receivedAck) { + receivedAck = false; + // get message and parse + DW1000.getData(data, LEN_DATA); + byte msgId = data[0]; + if (msgId != expectedMsgId) { + // unexpected message, start over again + //Serial.print("Received wrong message # "); Serial.println(msgId); + expectedMsgId = POLL_ACK; + transmitPoll(); + return; + } + if (msgId == POLL_ACK) { + DW1000.getReceiveTimestamp(timePollAckReceived); + expectedMsgId = RANGE_REPORT; + transmitRange(); + noteActivity(); + } else if (msgId == RANGE_REPORT) { + expectedMsgId = POLL_ACK; + float curRange; + memcpy(&curRange, data + 1, 4); + transmitPoll(); + noteActivity(); + } else if (msgId == RANGE_FAILED) { + expectedMsgId = POLL_ACK; + transmitPoll(); + noteActivity(); + } + } +} + diff --git a/lib/DW1000/examples/TimestampUsageTest/TimestampUsageTest.ino b/lib/DW1000/examples/TimestampUsageTest/TimestampUsageTest.ino new file mode 100644 index 0000000..788ae0b --- /dev/null +++ b/lib/DW1000/examples/TimestampUsageTest/TimestampUsageTest.ino @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2015 by Thomas Trojer + * Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de); extended example + * Decawave DW1000 library for arduino. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file TimestampUsageTest.ino + * This is a simple unit test for the DW1000Time class. This test + * has no actual use to the operation of the DW1000. + */ + +#include +#include "DW1000Time.h" + +void setup() { + Serial.begin(9600); + Serial.println(F("### DW1000Time-arduino-test ###")); +} + +void loop() { + // variables for the test + DW1000Time time1, time2, time3, time4; + byte stamp[DW1000Time::LENGTH_TIMESTAMP]; + + // unit test + Serial.println(F("simple test for + - ")); + Serial.print(F("Time1 is (0)[us] ... ")); Serial.println(time1.getAsMicroSeconds(), 4); + time1 += DW1000Time(10, DW1000Time::MICROSECONDS); + Serial.print(F("Time1 is (10)[us] ... ")); Serial.println(time1.getAsMicroSeconds(), 4); + time1 -= DW1000Time(500, DW1000Time::NANOSECONDS); + Serial.print(F("Time1 is (9.5)[us] ... ")); Serial.println(time1.getAsMicroSeconds(), 4); + Serial.println(); + + Serial.println(F("test compare")); + time2 = time1; + time2 += DW1000Time(10.0f); + Serial.print(F("Time2 == Time1 (NO)... ")); Serial.println(time1 == time2 ? "YES" : "NO"); + time1 += DW1000Time(10000, DW1000Time::NANOSECONDS); + Serial.print(F("Time2 == Time1 (YES)... ")); Serial.println(time1 == time2 ? "YES" : "NO"); + Serial.println(); + + Serial.println(F("test different output")); + memset(stamp, 0, DW1000Time::LENGTH_TIMESTAMP); + stamp[1] = 0x02; // = 512 + time2 = DW1000Time(stamp); + Serial.print(F("Time2 is (512) ... ")); Serial.println(time2); + Serial.print(F("Time2 is (0.0080)[us] ... ")); Serial.println(time2.getAsMicroSeconds(), 4); + Serial.print(F("Time2 range is (2.4022)[m] ... ")); Serial.println(time2.getAsMeters(), 4); + time3 = DW1000Time(10, DW1000Time::SECONDS); + time3.getTimestamp(stamp); + time3.setTimestamp(stamp); + Serial.print(F("Time3 is (10)[s] ... ")); Serial.println(time3.getAsMicroSeconds() * 1.0e-6, 4); + Serial.println(); + + Serial.println(F("test negativ value")); + memset(stamp, 0, DW1000Time::LENGTH_TIMESTAMP); + time2.setTimestamp(-512); + Serial.print(F("Time2 is (-512) ... ")); Serial.println(time2); + Serial.print(F("Time2 is (-0.0080)[us] ... ")); Serial.println(time2.getAsMicroSeconds(), 4); + Serial.print(F("Time2 range is (-2.4022)[m] ... ")); Serial.println(time2.getAsMeters(), 4); + Serial.println(); + + Serial.println(F("test calculation")); + time1.setTimestamp(1536); + time2.setTimestamp(512); + time3.setTimestamp(4); + time4 = (time1 + time2) / time3; + Serial.print(F("Time4 is (512) ... ")); Serial.println(time4); + time4 = (time1 - time2) / time3; + Serial.print(F("Time4 is (256) ... ")); Serial.println(time4); + time4 = (time1 * time3 * time2 - time2 * time3 * time2) / (time2 * time2); + Serial.print(F("Time4 is (8) ... ")); Serial.println(time4); + Serial.println(); + + Serial.println(F("test valid/maxima")); + time1.setTimestamp(DW1000Time::TIME_MAX); + time2.setTimestamp(DW1000Time::TIME_MAX); + time3.setTimestamp(2); + time4 = (time1 + time2); + Serial.print(F("Time4 is valid? (NO) ... ")); Serial.println(time4.isValidTimestamp() ? "YES" : "NO"); + Serial.print(F("Time4 is TIME_MAX (NO) ... ")); Serial.println(time4 == DW1000Time::TIME_MAX ? "YES" : "NO"); + time4 /= time3; + Serial.print(F("Time4 is valid? (YES) ... ")); Serial.println(time4.isValidTimestamp() ? "YES" : "NO"); + Serial.print(F("Time4 is TIME_MAX (YES) ... ")); Serial.println(time4 == DW1000Time::TIME_MAX ? "YES" : "NO"); + + Serial.println(); + + // keep calm + delay(10000); +} diff --git a/lib/DW1000/extras/LICENSE b/lib/DW1000/extras/LICENSE new file mode 100644 index 0000000..d0381d6 --- /dev/null +++ b/lib/DW1000/extras/LICENSE @@ -0,0 +1,176 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/lib/DW1000/extras/doc/DW1000 b/lib/DW1000/extras/doc/DW1000 new file mode 100644 index 0000000..eab8848 --- /dev/null +++ b/lib/DW1000/extras/doc/DW1000 @@ -0,0 +1,2407 @@ +# Doxyfile 1.8.11 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Arduino driver library for Decawave DW1000" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = "Dec 20 2016" + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ../../src + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, +# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. + +FILE_PATTERNS = *.h \ + *.cpp + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/DW1000CompileOptions_8h.html b/lib/DW1000/extras/doc/html/DW1000CompileOptions_8h.html new file mode 100644 index 0000000..f4709c2 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000CompileOptions_8h.html @@ -0,0 +1,92 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000CompileOptions.h File Reference + + + + + + +

    +
    + +
    +
    DW1000CompileOptions.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Macros

    #define DW1000TIME_H_PRINTABLE   true
     
    +

    Detailed Description

    +

    Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de) Decawave DW1000 library for arduino.

    +

    Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0
    +

    Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

    +

    Here are some options to optimize code and save some ram and rom

    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define DW1000TIME_H_PRINTABLE   true
    +
    +

    Printable DW1000Time object costs about: rom: 490 byte ; ram: 58 byte This option is needed because compiler can not optimize unused codes from inheritanced methods Some examples or debug code use this Set false if you do not need it and have to save some space

    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000CompileOptions_8h_source.html b/lib/DW1000/extras/doc/html/DW1000CompileOptions_8h_source.html new file mode 100644 index 0000000..aafaf45 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000CompileOptions_8h_source.html @@ -0,0 +1,63 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000CompileOptions.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000CompileOptions.h
    +
    +
    +Go to the documentation of this file.
    1 
    22 #ifndef DW1000COMPILEOPTIONS_H
    23 #define DW1000COMPILEOPTIONS_H
    24 
    31 #define DW1000TIME_H_PRINTABLE true
    32 
    33 #endif // DW1000COMPILEOPTIONS_H
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Constants_8h.html b/lib/DW1000/extras/doc/html/DW1000Constants_8h.html new file mode 100644 index 0000000..7f3bfec --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Constants_8h.html @@ -0,0 +1,2284 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Constants.h File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000Constants.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    #define LEN_STAMP   5
     
    #define IDLE_MODE   0x00
     
    #define RX_MODE   0x01
     
    #define TX_MODE   0x02
     
    #define JUNK   0x00
     
    #define NO_SUB   0xFF
     
    #define DEV_ID   0x00
     
    #define LEN_DEV_ID   4
     
    #define EUI   0x01
     
    #define LEN_EUI   8
     
    #define PANADR   0x03
     
    #define LEN_PANADR   4
     
    #define SYS_CFG   0x04
     
    #define LEN_SYS_CFG   4
     
    #define FFEN_BIT   0
     
    #define FFBC_BIT   1
     
    #define FFAB_BIT   2
     
    #define FFAD_BIT   3
     
    #define FFAA_BIT   4
     
    #define FFAM_BIT   5
     
    #define FFAR_BIT   6
     
    #define DIS_DRXB_BIT   12
     
    #define DIS_STXP_BIT   18
     
    #define HIRQ_POL_BIT   9
     
    #define RXAUTR_BIT   29
     
    #define PHR_MODE_SUB   16
     
    #define LEN_PHR_MODE_SUB   2
     
    #define RXM110K_BIT   22
     
    #define SYS_CTRL   0x0D
     
    #define LEN_SYS_CTRL   4
     
    #define SFCST_BIT   0
     
    #define TXSTRT_BIT   1
     
    #define TXDLYS_BIT   2
     
    #define TRXOFF_BIT   6
     
    #define WAIT4RESP_BIT   7
     
    #define RXENAB_BIT   8
     
    #define RXDLYS_BIT   9
     
    #define SYS_STATUS   0x0F
     
    #define LEN_SYS_STATUS   5
     
    #define CPLOCK_BIT   1
     
    #define AAT_BIT   3
     
    #define TXFRB_BIT   4
     
    #define TXPRS_BIT   5
     
    #define TXPHS_BIT   6
     
    #define TXFRS_BIT   7
     
    #define LDEDONE_BIT   10
     
    #define RXPHE_BIT   12
     
    #define RXDFR_BIT   13
     
    #define RXFCG_BIT   14
     
    #define RXFCE_BIT   15
     
    #define RXRFSL_BIT   16
     
    #define RXRFTO_BIT   17
     
    #define LDEERR_BIT   18
     
    #define RFPLL_LL_BIT   24
     
    #define CLKPLL_LL_BIT   25
     
    #define SYS_MASK   0x0E
     
    #define LEN_SYS_MASK   4
     
    #define SYS_TIME   0x06
     
    #define LEN_SYS_TIME   LEN_STAMP
     
    #define RX_TIME   0x15
     
    #define LEN_RX_TIME   14
     
    #define RX_STAMP_SUB   0x00
     
    #define FP_AMPL1_SUB   0x07
     
    #define LEN_RX_STAMP   LEN_STAMP
     
    #define LEN_FP_AMPL1   2
     
    #define RX_FQUAL   0x12
     
    #define LEN_RX_FQUAL   8
     
    #define STD_NOISE_SUB   0x00
     
    #define FP_AMPL2_SUB   0x02
     
    #define FP_AMPL3_SUB   0x04
     
    #define CIR_PWR_SUB   0x06
     
    #define LEN_STD_NOISE   2
     
    #define LEN_FP_AMPL2   2
     
    #define LEN_FP_AMPL3   2
     
    #define LEN_CIR_PWR   2
     
    #define TX_TIME   0x17
     
    #define LEN_TX_TIME   10
     
    #define TX_STAMP_SUB   0
     
    #define LEN_TX_STAMP   LEN_STAMP
     
    #define DX_TIME   0x0A
     
    #define LEN_DX_TIME   LEN_STAMP
     
    #define TX_BUFFER   0x09
     
    #define LEN_TX_BUFFER   1024
     
    #define LEN_UWB_FRAMES   127
     
    #define LEN_EXT_UWB_FRAMES   1023
     
    #define RX_FINFO   0x10
     
    #define LEN_RX_FINFO   4
     
    #define RX_BUFFER   0x11
     
    #define LEN_RX_BUFFER   1024
     
    #define TX_FCTRL   0x08
     
    #define LEN_TX_FCTRL   5
     
    #define CHAN_CTRL   0x1F
     
    #define LEN_CHAN_CTRL   4
     
    #define DWSFD_BIT   17
     
    #define TNSSFD_BIT   20
     
    #define RNSSFD_BIT   21
     
    #define USR_SFD   0x21
     
    #define LEN_USR_SFD   41
     
    #define SFD_LENGTH_SUB   0x00
     
    #define LEN_SFD_LENGTH   1
     
    #define OTP_IF   0x2D
     
    #define OTP_ADDR_SUB   0x04
     
    #define OTP_CTRL_SUB   0x06
     
    #define OTP_RDAT_SUB   0x0A
     
    #define LEN_OTP_ADDR   2
     
    #define LEN_OTP_CTRL   2
     
    #define LEN_OTP_RDAT   4
     
    #define AGC_TUNE   0x23
     
    #define AGC_TUNE1_SUB   0x04
     
    #define AGC_TUNE2_SUB   0x0C
     
    #define AGC_TUNE3_SUB   0x12
     
    #define LEN_AGC_TUNE1   2
     
    #define LEN_AGC_TUNE2   4
     
    #define LEN_AGC_TUNE3   2
     
    #define DRX_TUNE   0x27
     
    #define DRX_TUNE0b_SUB   0x02
     
    #define DRX_TUNE1a_SUB   0x04
     
    #define DRX_TUNE1b_SUB   0x06
     
    #define DRX_TUNE2_SUB   0x08
     
    #define DRX_TUNE4H_SUB   0x26
     
    #define LEN_DRX_TUNE0b   2
     
    #define LEN_DRX_TUNE1a   2
     
    #define LEN_DRX_TUNE1b   2
     
    #define LEN_DRX_TUNE2   4
     
    #define LEN_DRX_TUNE4H   2
     
    #define LDE_IF   0x2E
     
    #define LDE_CFG1_SUB   0x0806
     
    #define LDE_RXANTD_SUB   0x1804
     
    #define LDE_CFG2_SUB   0x1806
     
    #define LDE_REPC_SUB   0x2804
     
    #define LEN_LDE_CFG1   1
     
    #define LEN_LDE_CFG2   2
     
    #define LEN_LDE_REPC   2
     
    #define LEN_LDE_RXANTD   2
     
    #define TX_POWER   0x1E
     
    #define LEN_TX_POWER   4
     
    #define RF_CONF   0x28
     
    #define RF_RXCTRLH_SUB   0x0B
     
    #define RF_TXCTRL_SUB   0x0C
     
    #define LEN_RF_RXCTRLH   1
     
    #define LEN_RF_TXCTRL   4
     
    #define TX_CAL   0x2A
     
    #define TC_PGDELAY_SUB   0x0B
     
    #define LEN_TC_PGDELAY   1
     
    #define TC_SARC   0x00
     
    #define TC_SARL   0x03
     
    #define FS_CTRL   0x2B
     
    #define FS_PLLCFG_SUB   0x07
     
    #define FS_PLLTUNE_SUB   0x0B
     
    #define FS_XTALT_SUB   0x0E
     
    #define LEN_FS_PLLCFG   4
     
    #define LEN_FS_PLLTUNE   1
     
    #define LEN_FS_XTALT   1
     
    #define PMSC   0x36
     
    #define PMSC_CTRL0_SUB   0x00
     
    #define LEN_PMSC_CTRL0   4
     
    #define TX_ANTD   0x18
     
    #define LEN_TX_ANTD   2
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define AAT_BIT   3
    +
    + +
    +
    + +
    +
    + + + + +
    #define AGC_TUNE   0x23
    +
    + +
    +
    + +
    +
    + + + + +
    #define AGC_TUNE1_SUB   0x04
    +
    + +
    +
    + +
    +
    + + + + +
    #define AGC_TUNE2_SUB   0x0C
    +
    + +
    +
    + +
    +
    + + + + +
    #define AGC_TUNE3_SUB   0x12
    +
    + +
    +
    + +
    +
    + + + + +
    #define CHAN_CTRL   0x1F
    +
    + +
    +
    + +
    +
    + + + + +
    #define CIR_PWR_SUB   0x06
    +
    + +
    +
    + +
    +
    + + + + +
    #define CLKPLL_LL_BIT   25
    +
    + +
    +
    + +
    +
    + + + + +
    #define CPLOCK_BIT   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define DEV_ID   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define DIS_DRXB_BIT   12
    +
    + +
    +
    + +
    +
    + + + + +
    #define DIS_STXP_BIT   18
    +
    + +
    +
    + +
    +
    + + + + +
    #define DRX_TUNE   0x27
    +
    + +
    +
    + +
    +
    + + + + +
    #define DRX_TUNE0b_SUB   0x02
    +
    + +
    +
    + +
    +
    + + + + +
    #define DRX_TUNE1a_SUB   0x04
    +
    + +
    +
    + +
    +
    + + + + +
    #define DRX_TUNE1b_SUB   0x06
    +
    + +
    +
    + +
    +
    + + + + +
    #define DRX_TUNE2_SUB   0x08
    +
    + +
    +
    + +
    +
    + + + + +
    #define DRX_TUNE4H_SUB   0x26
    +
    + +
    +
    + +
    +
    + + + + +
    #define DWSFD_BIT   17
    +
    + +
    +
    + +
    +
    + + + + +
    #define DX_TIME   0x0A
    +
    + +
    +
    + +
    +
    + + + + +
    #define EUI   0x01
    +
    + +
    +
    + +
    +
    + + + + +
    #define FFAA_BIT   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define FFAB_BIT   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define FFAD_BIT   3
    +
    + +
    +
    + +
    +
    + + + + +
    #define FFAM_BIT   5
    +
    + +
    +
    + +
    +
    + + + + +
    #define FFAR_BIT   6
    +
    + +
    +
    + +
    +
    + + + + +
    #define FFBC_BIT   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define FFEN_BIT   0
    +
    + +
    +
    + +
    +
    + + + + +
    #define FP_AMPL1_SUB   0x07
    +
    + +
    +
    + +
    +
    + + + + +
    #define FP_AMPL2_SUB   0x02
    +
    + +
    +
    + +
    +
    + + + + +
    #define FP_AMPL3_SUB   0x04
    +
    + +
    +
    + +
    +
    + + + + +
    #define FS_CTRL   0x2B
    +
    + +
    +
    + +
    +
    + + + + +
    #define FS_PLLCFG_SUB   0x07
    +
    + +
    +
    + +
    +
    + + + + +
    #define FS_PLLTUNE_SUB   0x0B
    +
    + +
    +
    + +
    +
    + + + + +
    #define FS_XTALT_SUB   0x0E
    +
    + +
    +
    + +
    +
    + + + + +
    #define HIRQ_POL_BIT   9
    +
    + +
    +
    + +
    +
    + + + + +
    #define IDLE_MODE   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define JUNK   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define LDE_CFG1_SUB   0x0806
    +
    + +
    +
    + +
    +
    + + + + +
    #define LDE_CFG2_SUB   0x1806
    +
    + +
    +
    + +
    +
    + + + + +
    #define LDE_IF   0x2E
    +
    + +
    +
    + +
    +
    + + + + +
    #define LDE_REPC_SUB   0x2804
    +
    + +
    +
    + +
    +
    + + + + +
    #define LDE_RXANTD_SUB   0x1804
    +
    + +
    +
    + +
    +
    + + + + +
    #define LDEDONE_BIT   10
    +
    + +
    +
    + +
    +
    + + + + +
    #define LDEERR_BIT   18
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_AGC_TUNE1   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_AGC_TUNE2   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_AGC_TUNE3   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_CHAN_CTRL   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_CIR_PWR   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DEV_ID   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DRX_TUNE0b   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DRX_TUNE1a   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DRX_TUNE1b   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DRX_TUNE2   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DRX_TUNE4H   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DX_TIME   LEN_STAMP
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_EUI   8
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_EXT_UWB_FRAMES   1023
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_FP_AMPL1   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_FP_AMPL2   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_FP_AMPL3   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_FS_PLLCFG   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_FS_PLLTUNE   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_FS_XTALT   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_LDE_CFG1   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_LDE_CFG2   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_LDE_REPC   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_LDE_RXANTD   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_OTP_ADDR   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_OTP_CTRL   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_OTP_RDAT   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_PANADR   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_PHR_MODE_SUB   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_PMSC_CTRL0   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_RF_RXCTRLH   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_RF_TXCTRL   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_RX_BUFFER   1024
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_RX_FINFO   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_RX_FQUAL   8
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_RX_STAMP   LEN_STAMP
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_RX_TIME   14
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_SFD_LENGTH   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_STAMP   5
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_STD_NOISE   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_SYS_CFG   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_SYS_CTRL   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_SYS_MASK   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_SYS_STATUS   5
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_SYS_TIME   LEN_STAMP
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_TC_PGDELAY   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_TX_ANTD   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_TX_BUFFER   1024
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_TX_FCTRL   5
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_TX_POWER   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_TX_STAMP   LEN_STAMP
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_TX_TIME   10
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_USR_SFD   41
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_UWB_FRAMES   127
    +
    + +
    +
    + +
    +
    + + + + +
    #define NO_SUB   0xFF
    +
    + +
    +
    + +
    +
    + + + + +
    #define OTP_ADDR_SUB   0x04
    +
    + +
    +
    + +
    +
    + + + + +
    #define OTP_CTRL_SUB   0x06
    +
    + +
    +
    + +
    +
    + + + + +
    #define OTP_IF   0x2D
    +
    + +
    +
    + +
    +
    + + + + +
    #define OTP_RDAT_SUB   0x0A
    +
    + +
    +
    + +
    +
    + + + + +
    #define PANADR   0x03
    +
    + +
    +
    + +
    +
    + + + + +
    #define PHR_MODE_SUB   16
    +
    + +
    +
    + +
    +
    + + + + +
    #define PMSC   0x36
    +
    + +
    +
    + +
    +
    + + + + +
    #define PMSC_CTRL0_SUB   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define RF_CONF   0x28
    +
    + +
    +
    + +
    +
    + + + + +
    #define RF_RXCTRLH_SUB   0x0B
    +
    + +
    +
    + +
    +
    + + + + +
    #define RF_TXCTRL_SUB   0x0C
    +
    + +
    +
    + +
    +
    + + + + +
    #define RFPLL_LL_BIT   24
    +
    + +
    +
    + +
    +
    + + + + +
    #define RNSSFD_BIT   21
    +
    + +
    +
    + +
    +
    + + + + +
    #define RX_BUFFER   0x11
    +
    + +
    +
    + +
    +
    + + + + +
    #define RX_FINFO   0x10
    +
    + +
    +
    + +
    +
    + + + + +
    #define RX_FQUAL   0x12
    +
    + +
    +
    + +
    +
    + + + + +
    #define RX_MODE   0x01
    +
    + +
    +
    + +
    +
    + + + + +
    #define RX_STAMP_SUB   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define RX_TIME   0x15
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXAUTR_BIT   29
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXDFR_BIT   13
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXDLYS_BIT   9
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXENAB_BIT   8
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXFCE_BIT   15
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXFCG_BIT   14
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXM110K_BIT   22
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXPHE_BIT   12
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXRFSL_BIT   16
    +
    + +
    +
    + +
    +
    + + + + +
    #define RXRFTO_BIT   17
    +
    + +
    +
    + +
    +
    + + + + +
    #define SFCST_BIT   0
    +
    + +
    +
    + +
    +
    + + + + +
    #define SFD_LENGTH_SUB   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define STD_NOISE_SUB   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define SYS_CFG   0x04
    +
    + +
    +
    + +
    +
    + + + + +
    #define SYS_CTRL   0x0D
    +
    + +
    +
    + +
    +
    + + + + +
    #define SYS_MASK   0x0E
    +
    + +
    +
    + +
    +
    + + + + +
    #define SYS_STATUS   0x0F
    +
    + +
    +
    + +
    +
    + + + + +
    #define SYS_TIME   0x06
    +
    + +
    +
    + +
    +
    + + + + +
    #define TC_PGDELAY_SUB   0x0B
    +
    + +
    +
    + +
    +
    + + + + +
    #define TC_SARC   0x00
    +
    + +
    +
    + +
    +
    + + + + +
    #define TC_SARL   0x03
    +
    + +
    +
    + +
    +
    + + + + +
    #define TNSSFD_BIT   20
    +
    + +
    +
    + +
    +
    + + + + +
    #define TRXOFF_BIT   6
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_ANTD   0x18
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_BUFFER   0x09
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_CAL   0x2A
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_FCTRL   0x08
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_MODE   0x02
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_POWER   0x1E
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_STAMP_SUB   0
    +
    + +
    +
    + +
    +
    + + + + +
    #define TX_TIME   0x17
    +
    + +
    +
    + +
    +
    + + + + +
    #define TXDLYS_BIT   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define TXFRB_BIT   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define TXFRS_BIT   7
    +
    + +
    +
    + +
    +
    + + + + +
    #define TXPHS_BIT   6
    +
    + +
    +
    + +
    +
    + + + + +
    #define TXPRS_BIT   5
    +
    + +
    +
    + +
    +
    + + + + +
    #define TXSTRT_BIT   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define USR_SFD   0x21
    +
    + +
    +
    + +
    +
    + + + + +
    #define WAIT4RESP_BIT   7
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Constants_8h_source.html b/lib/DW1000/extras/doc/html/DW1000Constants_8h_source.html new file mode 100644 index 0000000..5c77054 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Constants_8h_source.html @@ -0,0 +1,63 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Constants.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Constants.h
    +
    +
    +Go to the documentation of this file.
    1 /*
    2  * Copyright (c) 2015 by Thomas Trojer <thomas@trojer.net>
    3  * Decawave DW1000 library for arduino.
    4  *
    5  * Licensed under the Apache License, Version 2.0 (the "License");
    6  * you may not use this file except in compliance with the License.
    7  * You may obtain a copy of the License at
    8  *
    9  * http://www.apache.org/licenses/LICENSE-2.0
    10  *
    11  * Unless required by applicable law or agreed to in writing, software
    12  * distributed under the License is distributed on an "AS IS" BASIS,
    13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  * See the License for the specific language governing permissions and
    15  * limitations under the License.
    16  *
    17  * @file DW1000Constants.h
    18  * Arduino driver library (header file) for the Decawave DW1000 UWB transceiver IC.
    19  */
    20 
    21 #ifndef _DW1000CONSTANTS_H_INCLUDED
    22 #define _DW1000CONSTANTS_H_INCLUDED
    23 
    24 // time stamp byte length
    25 #define LEN_STAMP 5
    26 
    27 // enum to determine RX or TX mode of device
    28 #define IDLE_MODE 0x00
    29 #define RX_MODE 0x01
    30 #define TX_MODE 0x02
    31 
    32 // used for SPI ready w/o actual writes
    33 #define JUNK 0x00
    34 
    35 // no sub-address for register write
    36 #define NO_SUB 0xFF
    37 
    38 // device id register
    39 #define DEV_ID 0x00
    40 #define LEN_DEV_ID 4
    41 
    42 // extended unique identifier register
    43 #define EUI 0x01
    44 #define LEN_EUI 8
    45 
    46 // PAN identifier, short address register
    47 #define PANADR 0x03
    48 #define LEN_PANADR 4
    49 
    50 // device configuration register
    51 #define SYS_CFG 0x04
    52 #define LEN_SYS_CFG 4
    53 #define FFEN_BIT 0
    54 #define FFBC_BIT 1
    55 #define FFAB_BIT 2
    56 #define FFAD_BIT 3
    57 #define FFAA_BIT 4
    58 #define FFAM_BIT 5
    59 #define FFAR_BIT 6
    60 #define DIS_DRXB_BIT 12
    61 #define DIS_STXP_BIT 18
    62 #define HIRQ_POL_BIT 9
    63 #define RXAUTR_BIT 29
    64 #define PHR_MODE_SUB 16
    65 #define LEN_PHR_MODE_SUB 2
    66 #define RXM110K_BIT 22
    67 
    68 // device control register
    69 #define SYS_CTRL 0x0D
    70 #define LEN_SYS_CTRL 4
    71 #define SFCST_BIT 0
    72 #define TXSTRT_BIT 1
    73 #define TXDLYS_BIT 2
    74 #define TRXOFF_BIT 6
    75 #define WAIT4RESP_BIT 7
    76 #define RXENAB_BIT 8
    77 #define RXDLYS_BIT 9
    78 
    79 // system event status register
    80 #define SYS_STATUS 0x0F
    81 #define LEN_SYS_STATUS 5
    82 #define CPLOCK_BIT 1
    83 #define AAT_BIT 3
    84 #define TXFRB_BIT 4
    85 #define TXPRS_BIT 5
    86 #define TXPHS_BIT 6
    87 #define TXFRS_BIT 7
    88 #define LDEDONE_BIT 10
    89 #define RXPHE_BIT 12
    90 #define RXDFR_BIT 13
    91 #define RXFCG_BIT 14
    92 #define RXFCE_BIT 15
    93 #define RXRFSL_BIT 16
    94 #define RXRFTO_BIT 17
    95 #define LDEERR_BIT 18
    96 #define RFPLL_LL_BIT 24
    97 #define CLKPLL_LL_BIT 25
    98 
    99 // system event mask register
    100 // NOTE: uses the bit definitions of SYS_STATUS (below 32)
    101 #define SYS_MASK 0x0E
    102 #define LEN_SYS_MASK 4
    103 
    104 // system time counter
    105 #define SYS_TIME 0x06
    106 #define LEN_SYS_TIME LEN_STAMP
    107 
    108 // RX timestamp register
    109 #define RX_TIME 0x15
    110 #define LEN_RX_TIME 14
    111 #define RX_STAMP_SUB 0x00
    112 #define FP_AMPL1_SUB 0x07
    113 #define LEN_RX_STAMP LEN_STAMP
    114 #define LEN_FP_AMPL1 2
    115 
    116 // RX frame quality
    117 #define RX_FQUAL 0x12
    118 #define LEN_RX_FQUAL 8
    119 #define STD_NOISE_SUB 0x00
    120 #define FP_AMPL2_SUB 0x02
    121 #define FP_AMPL3_SUB 0x04
    122 #define CIR_PWR_SUB 0x06
    123 #define LEN_STD_NOISE 2
    124 #define LEN_FP_AMPL2 2
    125 #define LEN_FP_AMPL3 2
    126 #define LEN_CIR_PWR 2
    127 
    128 // TX timestamp register
    129 #define TX_TIME 0x17
    130 #define LEN_TX_TIME 10
    131 #define TX_STAMP_SUB 0
    132 #define LEN_TX_STAMP LEN_STAMP
    133 
    134 // timing register (for delayed RX/TX)
    135 #define DX_TIME 0x0A
    136 #define LEN_DX_TIME LEN_STAMP
    137 
    138 // transmit data buffer
    139 #define TX_BUFFER 0x09
    140 #define LEN_TX_BUFFER 1024
    141 #define LEN_UWB_FRAMES 127
    142 #define LEN_EXT_UWB_FRAMES 1023
    143 
    144 // RX frame info
    145 #define RX_FINFO 0x10
    146 #define LEN_RX_FINFO 4
    147 
    148 // receive data buffer
    149 #define RX_BUFFER 0x11
    150 #define LEN_RX_BUFFER 1024
    151 
    152 // transmit control
    153 #define TX_FCTRL 0x08
    154 #define LEN_TX_FCTRL 5
    155 
    156 // channel control
    157 #define CHAN_CTRL 0x1F
    158 #define LEN_CHAN_CTRL 4
    159 #define DWSFD_BIT 17
    160 #define TNSSFD_BIT 20
    161 #define RNSSFD_BIT 21
    162 
    163 // user-defined SFD
    164 #define USR_SFD 0x21
    165 #define LEN_USR_SFD 41
    166 #define SFD_LENGTH_SUB 0x00
    167 #define LEN_SFD_LENGTH 1
    168 
    169 // OTP control (for LDE micro code loading only)
    170 #define OTP_IF 0x2D
    171 #define OTP_ADDR_SUB 0x04
    172 #define OTP_CTRL_SUB 0x06
    173 #define OTP_RDAT_SUB 0x0A
    174 #define LEN_OTP_ADDR 2
    175 #define LEN_OTP_CTRL 2
    176 #define LEN_OTP_RDAT 4
    177 
    178 // AGC_TUNE1/2 (for re-tuning only)
    179 #define AGC_TUNE 0x23
    180 #define AGC_TUNE1_SUB 0x04
    181 #define AGC_TUNE2_SUB 0x0C
    182 #define AGC_TUNE3_SUB 0x12
    183 #define LEN_AGC_TUNE1 2
    184 #define LEN_AGC_TUNE2 4
    185 #define LEN_AGC_TUNE3 2
    186 
    187 // DRX_TUNE2 (for re-tuning only)
    188 #define DRX_TUNE 0x27
    189 #define DRX_TUNE0b_SUB 0x02
    190 #define DRX_TUNE1a_SUB 0x04
    191 #define DRX_TUNE1b_SUB 0x06
    192 #define DRX_TUNE2_SUB 0x08
    193 #define DRX_TUNE4H_SUB 0x26
    194 #define LEN_DRX_TUNE0b 2
    195 #define LEN_DRX_TUNE1a 2
    196 #define LEN_DRX_TUNE1b 2
    197 #define LEN_DRX_TUNE2 4
    198 #define LEN_DRX_TUNE4H 2
    199 
    200 // LDE_CFG1 (for re-tuning only)
    201 #define LDE_IF 0x2E
    202 #define LDE_CFG1_SUB 0x0806
    203 #define LDE_RXANTD_SUB 0x1804
    204 #define LDE_CFG2_SUB 0x1806
    205 #define LDE_REPC_SUB 0x2804
    206 #define LEN_LDE_CFG1 1
    207 #define LEN_LDE_CFG2 2
    208 #define LEN_LDE_REPC 2
    209 #define LEN_LDE_RXANTD 2
    210 
    211 // TX_POWER (for re-tuning only)
    212 #define TX_POWER 0x1E
    213 #define LEN_TX_POWER 4
    214 
    215 // RF_CONF (for re-tuning only)
    216 #define RF_CONF 0x28
    217 #define RF_RXCTRLH_SUB 0x0B
    218 #define RF_TXCTRL_SUB 0x0C
    219 #define LEN_RF_RXCTRLH 1
    220 #define LEN_RF_TXCTRL 4
    221 
    222 // TX_CAL (for re-tuning only)
    223 #define TX_CAL 0x2A
    224 #define TC_PGDELAY_SUB 0x0B
    225 #define LEN_TC_PGDELAY 1
    226 #define TC_SARC 0x00
    227 #define TC_SARL 0x03
    228 
    229 // FS_CTRL (for re-tuning only)
    230 #define FS_CTRL 0x2B
    231 #define FS_PLLCFG_SUB 0x07
    232 #define FS_PLLTUNE_SUB 0x0B
    233 #define FS_XTALT_SUB 0x0E
    234 #define LEN_FS_PLLCFG 4
    235 #define LEN_FS_PLLTUNE 1
    236 #define LEN_FS_XTALT 1
    237 
    238 // PMSC
    239 #define PMSC 0x36
    240 #define PMSC_CTRL0_SUB 0x00
    241 #define LEN_PMSC_CTRL0 4
    242 
    243 // TX_ANTD Antenna delays
    244 #define TX_ANTD 0x18
    245 #define LEN_TX_ANTD 2
    246 
    247 #endif
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Device_8cpp.html b/lib/DW1000/extras/doc/html/DW1000Device_8cpp.html new file mode 100644 index 0000000..c4f589e --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Device_8cpp.html @@ -0,0 +1,65 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Device.cpp File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Device.cpp File Reference
    +
    +
    +
    #include "DW1000Device.h"
    +#include "DW1000.h"
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Device_8h.html b/lib/DW1000/extras/doc/html/DW1000Device_8h.html new file mode 100644 index 0000000..026d9d6 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Device_8h.html @@ -0,0 +1,94 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Device.h File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000Device.h File Reference
    +
    +
    +
    #include "DW1000Time.h"
    +#include "DW1000Mac.h"
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  DW1000Device
     
    + + + +

    +Macros

    #define INACTIVITY_TIME   1000
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define INACTIVITY_TIME   1000
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Device_8h_source.html b/lib/DW1000/extras/doc/html/DW1000Device_8h_source.html new file mode 100644 index 0000000..7a75fdc --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Device_8h_source.html @@ -0,0 +1,98 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Device.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Device.h
    +
    +
    +Go to the documentation of this file.
    1 /*
    2  * Copyright (c) 2015 by Thomas Trojer <thomas@trojer.net> and Leopold Sayous <leosayous@gmail.com>
    3  * Decawave DW1000 library for arduino.
    4  *
    5  * Licensed under the Apache License, Version 2.0 (the "License");
    6  * you may not use this file except in compliance with the License.
    7  * You may obtain a copy of the License at
    8  *
    9  * http://www.apache.org/licenses/LICENSE-2.0
    10  *
    11  * Unless required by applicable law or agreed to in writing, software
    12  * distributed under the License is distributed on an "AS IS" BASIS,
    13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  * See the License for the specific language governing permissions and
    15  * limitations under the License.
    16  *
    17  * @file DW1000Device.h
    18  * Arduino global library (header file) working with the DW1000 library
    19  * for the Decawave DW1000 UWB transceiver IC.
    20  *
    21  * @todo complete this class
    22  */
    23 
    24 
    25 #define INACTIVITY_TIME 1000
    26 
    27 #ifndef _DW1000Device_H_INCLUDED
    28 #define _DW1000Device_H_INCLUDED
    29 
    30 #include "DW1000Time.h"
    31 #include "DW1000Mac.h"
    32 
    33 class DW1000Mac;
    34 
    35 class DW1000Device;
    36 
    37 class DW1000Device {
    38 public:
    39  //Constructor and destructor
    40  DW1000Device();
    41  DW1000Device(byte address[], byte shortAddress[]);
    42  DW1000Device(byte address[], boolean shortOne = false);
    43  ~DW1000Device();
    44 
    45  //setters:
    46  void setReplyTime(uint16_t replyDelayTimeUs);
    47  void setAddress(char address[]);
    48  void setAddress(byte* address);
    49  void setShortAddress(byte address[]);
    50 
    51  void setRange(float range);
    52  void setRXPower(float power);
    53  void setFPPower(float power);
    54  void setQuality(float quality);
    55 
    56  void setReplyDelayTime(int16_t time) { _replyDelayTimeUS = time; }
    57 
    58  void setIndex(int8_t index) { _index = index; }
    59 
    60  //getters
    61  uint16_t getReplyTime() { return _replyDelayTimeUS; }
    62 
    63  byte* getByteAddress();
    64 
    65  int8_t getIndex() { return _index; }
    66 
    67  //String getAddress();
    68  byte* getByteShortAddress();
    69  uint16_t getShortAddress();
    70  //String getShortAddress();
    71 
    72  float getRange();
    73  float getRXPower();
    74  float getFPPower();
    75  float getQuality();
    76 
    77  boolean isAddressEqual(DW1000Device* device);
    78  boolean isShortAddressEqual(DW1000Device* device);
    79 
    80  //functions which contains the date: (easier to put as public)
    81  // timestamps to remember
    88 
    89  void noteActivity();
    90  boolean isInactive();
    91 
    92 
    93 private:
    94  //device ID
    95  byte _ownAddress[8];
    96  byte _shortAddress[2];
    97  int32_t _activity;
    98  uint16_t _replyDelayTimeUS;
    99  int8_t _index; // not used
    100 
    101  int16_t _range;
    102  int16_t _RXPower;
    103  int16_t _FPPower;
    104  int16_t _quality;
    105 
    106  void randomShortAddress();
    107 
    108 };
    109 
    110 
    111 #endif
    boolean isInactive()
    Definition: DW1000Device.cpp:136
    +
    float getRange()
    Definition: DW1000Device.cpp:117
    +
    DW1000Time timePollAckSent
    Definition: DW1000Device.h:84
    +
    void setFPPower(float power)
    Definition: DW1000Device.cpp:73
    +
    boolean isAddressEqual(DW1000Device *device)
    Definition: DW1000Device.cpp:108
    +
    Definition: DW1000Device.h:37
    +
    Definition: DW1000Mac.h:45
    +
    uint16_t getReplyTime()
    Definition: DW1000Device.h:61
    +
    ~DW1000Device()
    Definition: DW1000Device.cpp:52
    +
    void noteActivity()
    Definition: DW1000Device.cpp:131
    +
    float getRXPower()
    Definition: DW1000Device.cpp:119
    +
    DW1000Time timeRangeSent
    Definition: DW1000Device.h:86
    +
    void setQuality(float quality)
    Definition: DW1000Device.cpp:75
    +
    void setAddress(char address[])
    Definition: DW1000Device.cpp:58
    +
    DW1000Time timeRangeReceived
    Definition: DW1000Device.h:87
    +
    byte * getByteAddress()
    Definition: DW1000Device.cpp:78
    +
    void setReplyDelayTime(int16_t time)
    Definition: DW1000Device.h:56
    +
    DW1000Device()
    Definition: DW1000Device.cpp:29
    +
    float getFPPower()
    Definition: DW1000Device.cpp:121
    +
    Definition: DW1000Time.h:43
    + +
    void setRXPower(float power)
    Definition: DW1000Device.cpp:71
    +
    float getQuality()
    Definition: DW1000Device.cpp:123
    +
    DW1000Time timePollReceived
    Definition: DW1000Device.h:83
    +
    boolean isShortAddressEqual(DW1000Device *device)
    Definition: DW1000Device.cpp:112
    +
    void setReplyTime(uint16_t replyDelayTimeUs)
    Definition: DW1000Device.cpp:56
    +
    byte * getByteShortAddress()
    Definition: DW1000Device.cpp:90
    +
    DW1000Time timePollAckReceived
    Definition: DW1000Device.h:85
    +
    int8_t getIndex()
    Definition: DW1000Device.h:65
    +
    void setIndex(int8_t index)
    Definition: DW1000Device.h:58
    +
    DW1000Time timePollSent
    Definition: DW1000Device.h:82
    +
    uint16_t getShortAddress()
    Definition: DW1000Device.cpp:103
    + +
    void setRange(float range)
    Definition: DW1000Device.cpp:69
    +
    void setShortAddress(byte address[])
    Definition: DW1000Device.cpp:64
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Mac_8cpp.html b/lib/DW1000/extras/doc/html/DW1000Mac_8cpp.html new file mode 100644 index 0000000..96c8e00 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Mac_8cpp.html @@ -0,0 +1,65 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Mac.cpp File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Mac.cpp File Reference
    +
    +
    +
    #include "DW1000Mac.h"
    +#include "DW1000Ranging.h"
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Mac_8h.html b/lib/DW1000/extras/doc/html/DW1000Mac_8h.html new file mode 100644 index 0000000..b454292 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Mac_8h.html @@ -0,0 +1,192 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Mac.h File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000Mac.h File Reference
    +
    +
    +
    #include <Arduino.h>
    +#include "DW1000Device.h"
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  DW1000Mac
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define FC_1   0x41
     
    #define FC_1_BLINK   0xC5
     
    #define FC_2   0x8C
     
    #define FC_2_SHORT   0x88
     
    #define PAN_ID_1   0xCA
     
    #define PAN_ID_2   0xDE
     
    #define SHORT_MAC_LEN   9
     
    #define LONG_MAC_LEN   15
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define FC_1   0x41
    +
    + +
    +
    + +
    +
    + + + + +
    #define FC_1_BLINK   0xC5
    +
    + +
    +
    + +
    +
    + + + + +
    #define FC_2   0x8C
    +
    + +
    +
    + +
    +
    + + + + +
    #define FC_2_SHORT   0x88
    +
    + +
    +
    + +
    +
    + + + + +
    #define LONG_MAC_LEN   15
    +
    + +
    +
    + +
    +
    + + + + +
    #define PAN_ID_1   0xCA
    +
    + +
    +
    + +
    +
    + + + + +
    #define PAN_ID_2   0xDE
    +
    + +
    +
    + +
    +
    + + + + +
    #define SHORT_MAC_LEN   9
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Mac_8h_source.html b/lib/DW1000/extras/doc/html/DW1000Mac_8h_source.html new file mode 100644 index 0000000..311afe7 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Mac_8h_source.html @@ -0,0 +1,79 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Mac.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Mac.h
    +
    +
    +Go to the documentation of this file.
    1 /*
    2  * Copyright (c) 2015 by Leopold Sayous <leosayous@gmail.com> and Thomas Trojer <thomas@trojer.net>
    3  * Decawave DW1000 library for arduino.
    4  *
    5  * Licensed under the Apache License, Version 2.0 (the "License");
    6  * you may not use this file except in compliance with the License.
    7  * You may obtain a copy of the License at
    8  *
    9  * http://www.apache.org/licenses/LICENSE-2.0
    10  *
    11  * Unless required by applicable law or agreed to in writing, software
    12  * distributed under the License is distributed on an "AS IS" BASIS,
    13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  * See the License for the specific language governing permissions and
    15  * limitations under the License.
    16  *
    17  * @file DW1000Mac.h
    18  * Arduino global library (header file) working with the DW1000 library
    19  * for the Decawave DW1000 UWB transceiver IC. This class has the purpose
    20  * to generate the mac layer
    21  *
    22  * @todo everything, this class is only a prototype
    23  */
    24 
    25 #define FC_1 0x41
    26 #define FC_1_BLINK 0xC5
    27 #define FC_2 0x8C
    28 #define FC_2_SHORT 0x88
    29 
    30 #define PAN_ID_1 0xCA
    31 #define PAN_ID_2 0xDE
    32 
    33 #define SHORT_MAC_LEN 9
    34 #define LONG_MAC_LEN 15
    35 
    36 
    37 #ifndef _DW1000MAC_H_INCLUDED
    38 #define _DW1000MAC_H_INCLUDED
    39 
    40 #include <Arduino.h>
    41 #include "DW1000Device.h"
    42 
    43 class DW1000Device;
    44 
    45 class DW1000Mac {
    46 public:
    47  //Constructor and destructor
    48  DW1000Mac(DW1000Device* parent);
    49  DW1000Mac();
    50  ~DW1000Mac();
    51 
    52 
    53  //setters
    54  void setDestinationAddress(byte* destinationAddress);
    55  void setDestinationAddressShort(byte* shortDestinationAddress);
    56  void setSourceAddress(byte* sourceAddress);
    57  void setSourceAddressShort(byte* shortSourceAddress);
    58 
    59 
    60  //for poll message we use just 2 bytes address
    61  //total=12 bytes
    62  void generateBlinkFrame(byte frame[], byte sourceAddress[], byte sourceShortAddress[]);
    63 
    64  //the short fram usually for Resp, Final, or Report
    65  //2 bytes for Desination Address and 2 bytes for Source Address
    66  //total=9 bytes
    67  void generateShortMACFrame(byte frame[], byte sourceShortAddress[], byte destinationShortAddress[]);
    68 
    69  //the long frame for Ranging init
    70  //8 bytes for Destination Address and 2 bytes for Source Address
    71  //total of
    72  void generateLongMACFrame(byte frame[], byte sourceShortAddress[], byte destinationAddress[]);
    73 
    74  //in order to decode the frame and save source Address!
    75  void decodeBlinkFrame(byte frame[], byte address[], byte shortAddress[]);
    76  void decodeShortMACFrame(byte frame[], byte address[]);
    77  void decodeLongMACFrame(byte frame[], byte address[]);
    78 
    79  void incrementSeqNumber();
    80 
    81 
    82 private:
    83  uint8_t _seqNumber = 0;
    84  void reverseArray(byte to[], byte from[], int16_t size);
    85 
    86 };
    87 
    88 
    89 #endif
    90 
    void incrementSeqNumber()
    Definition: DW1000Mac.cpp:146
    +
    void generateLongMACFrame(byte frame[], byte sourceShortAddress[], byte destinationAddress[])
    Definition: DW1000Mac.cpp:91
    +
    void setSourceAddress(byte *sourceAddress)
    +
    Definition: DW1000Device.h:37
    +
    void generateShortMACFrame(byte frame[], byte sourceShortAddress[], byte destinationShortAddress[])
    Definition: DW1000Mac.cpp:62
    + +
    Definition: DW1000Mac.h:45
    +
    ~DW1000Mac()
    Definition: DW1000Mac.cpp:35
    +
    void setDestinationAddress(byte *destinationAddress)
    +
    void decodeBlinkFrame(byte frame[], byte address[], byte shortAddress[])
    Definition: DW1000Mac.cpp:116
    +
    void decodeShortMACFrame(byte frame[], byte address[])
    Definition: DW1000Mac.cpp:127
    +
    void setSourceAddressShort(byte *shortSourceAddress)
    +
    void setDestinationAddressShort(byte *shortDestinationAddress)
    +
    void generateBlinkFrame(byte frame[], byte sourceAddress[], byte sourceShortAddress[])
    Definition: DW1000Mac.cpp:40
    +
    DW1000Mac()
    Definition: DW1000Mac.cpp:30
    +
    void decodeLongMACFrame(byte frame[], byte address[])
    Definition: DW1000Mac.cpp:136
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Ranging_8cpp.html b/lib/DW1000/extras/doc/html/DW1000Ranging_8cpp.html new file mode 100644 index 0000000..a78ea5b --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Ranging_8cpp.html @@ -0,0 +1,86 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Ranging.cpp File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000Ranging.cpp File Reference
    +
    +
    +
    #include "DW1000Ranging.h"
    +#include "DW1000Device.h"
    +
    + + + +

    +Variables

    DW1000RangingClass DW1000Ranging
     
    +

    Variable Documentation

    + +
    +
    + + + + +
    DW1000RangingClass DW1000Ranging
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Ranging_8h.html b/lib/DW1000/extras/doc/html/DW1000Ranging_8h.html new file mode 100644 index 0000000..6d55547 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Ranging_8h.html @@ -0,0 +1,339 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Ranging.h File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000Ranging.h File Reference
    +
    +
    +
    #include "DW1000.h"
    +#include "DW1000Time.h"
    +#include "DW1000Device.h"
    +#include "DW1000Mac.h"
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  DW1000RangingClass
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    #define POLL   0
     
    #define POLL_ACK   1
     
    #define RANGE   2
     
    #define RANGE_REPORT   3
     
    #define RANGE_FAILED   255
     
    #define BLINK   4
     
    #define RANGING_INIT   5
     
    #define LEN_DATA   90
     
    #define MAX_DEVICES   4
     
    #define DEFAULT_RST_PIN   9
     
    #define DEFAULT_SPI_SS_PIN   10
     
    #define DEFAULT_RESET_PERIOD   200
     
    #define DEFAULT_REPLY_DELAY_TIME   7000
     
    #define TAG   0
     
    #define ANCHOR   1
     
    #define DEFAULT_TIMER_DELAY   80
     
    #define DEBUG   false
     
    + + + +

    +Variables

    DW1000RangingClass DW1000Ranging
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define ANCHOR   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define BLINK   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define DEBUG   false
    +
    + +
    +
    + +
    +
    + + + + +
    #define DEFAULT_REPLY_DELAY_TIME   7000
    +
    + +
    +
    + +
    +
    + + + + +
    #define DEFAULT_RESET_PERIOD   200
    +
    + +
    +
    + +
    +
    + + + + +
    #define DEFAULT_RST_PIN   9
    +
    + +
    +
    + +
    +
    + + + + +
    #define DEFAULT_SPI_SS_PIN   10
    +
    + +
    +
    + +
    +
    + + + + +
    #define DEFAULT_TIMER_DELAY   80
    +
    + +
    +
    + +
    +
    + + + + +
    #define LEN_DATA   90
    +
    + +
    +
    + +
    +
    + + + + +
    #define MAX_DEVICES   4
    +
    + +
    +
    + +
    +
    + + + + +
    #define POLL   0
    +
    + +
    +
    + +
    +
    + + + + +
    #define POLL_ACK   1
    +
    + +
    +
    + +
    +
    + + + + +
    #define RANGE   2
    +
    + +
    +
    + +
    +
    + + + + +
    #define RANGE_FAILED   255
    +
    + +
    +
    + +
    +
    + + + + +
    #define RANGE_REPORT   3
    +
    + +
    +
    + +
    +
    + + + + +
    #define RANGING_INIT   5
    +
    + +
    +
    + +
    +
    + + + + +
    #define TAG   0
    +
    + +
    +
    +

    Variable Documentation

    + +
    +
    + + + + +
    DW1000RangingClass DW1000Ranging
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Ranging_8h_source.html b/lib/DW1000/extras/doc/html/DW1000Ranging_8h_source.html new file mode 100644 index 0000000..6b41778 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Ranging_8h_source.html @@ -0,0 +1,100 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Ranging.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Ranging.h
    +
    +
    +Go to the documentation of this file.
    1 /*
    2  * Copyright (c) 2015 by Thomas Trojer <thomas@trojer.net> and Leopold Sayous <leosayous@gmail.com>
    3  * Decawave DW1000 library for arduino.
    4  *
    5  * Licensed under the Apache License, Version 2.0 (the "License");
    6  * you may not use this file except in compliance with the License.
    7  * You may obtain a copy of the License at
    8  *
    9  * http://www.apache.org/licenses/LICENSE-2.0
    10  *
    11  * Unless required by applicable law or agreed to in writing, software
    12  * distributed under the License is distributed on an "AS IS" BASIS,
    13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  * See the License for the specific language governing permissions and
    15  * limitations under the License.
    16  *
    17  * @file DW1000Ranging.h
    18  * Arduino global library (header file) working with the DW1000 library
    19  * for the Decawave DW1000 UWB transceiver IC.
    20  *
    21  * @TODO
    22  * - remove or debugmode for Serial.print
    23  * - move strings to flash to reduce ram usage
    24  * - do not safe duplicate of pin settings
    25  * - maybe other object structure
    26  * - use enums instead of preprocessor constants
    27  */
    28 
    29 #include "DW1000.h"
    30 #include "DW1000Time.h"
    31 #include "DW1000Device.h"
    32 #include "DW1000Mac.h"
    33 
    34 // messages used in the ranging protocol
    35 #define POLL 0
    36 #define POLL_ACK 1
    37 #define RANGE 2
    38 #define RANGE_REPORT 3
    39 #define RANGE_FAILED 255
    40 #define BLINK 4
    41 #define RANGING_INIT 5
    42 
    43 #define LEN_DATA 90
    44 
    45 //Max devices we put in the networkDevices array ! Each DW1000Device is 74 Bytes in SRAM memory for now.
    46 #define MAX_DEVICES 4
    47 
    48 //Default Pin for module:
    49 #define DEFAULT_RST_PIN 9
    50 #define DEFAULT_SPI_SS_PIN 10
    51 
    52 //Default value
    53 //in ms
    54 #define DEFAULT_RESET_PERIOD 200
    55 //in us
    56 #define DEFAULT_REPLY_DELAY_TIME 7000
    57 
    58 //sketch type (anchor or tag)
    59 #define TAG 0
    60 #define ANCHOR 1
    61 
    62 //default timer delay
    63 #define DEFAULT_TIMER_DELAY 80
    64 
    65 //debug mode
    66 #ifndef DEBUG
    67 #define DEBUG false
    68 #endif
    69 
    70 
    72 public:
    73  //variables
    74  // data buffer
    75  static byte data[LEN_DATA];
    76 
    77  //initialisation
    78  static void initCommunication(uint8_t myRST = DEFAULT_RST_PIN, uint8_t mySS = DEFAULT_SPI_SS_PIN, uint8_t myIRQ = 2);
    79  static void configureNetwork(uint16_t deviceAddress, uint16_t networkId, const byte mode[]);
    80  static void generalStart();
    81  static void startAsAnchor(char address[], const byte mode[]);
    82  static void startAsTag(char address[], const byte mode[]);
    83  static boolean addNetworkDevices(DW1000Device* device, boolean shortAddress);
    84  static boolean addNetworkDevices(DW1000Device* device);
    85  static void removeNetworkDevices(int16_t index);
    86 
    87  //setters
    88  static void setReplyTime(uint16_t replyDelayTimeUs);
    89  static void setResetPeriod(uint32_t resetPeriod);
    90 
    91  //getters
    92  static byte* getCurrentAddress() { return _currentAddress; };
    93 
    94  static byte* getCurrentShortAddress() { return _currentShortAddress; };
    95 
    96  static uint8_t getNetworkDevicesNumber() { return _networkDevicesNumber; };
    97 
    98  //ranging functions
    99  static int16_t detectMessageType(byte datas[]); // TODO check return type
    100  static void loop();
    101  static void useRangeFilter(boolean enabled);
    102  // Used for the smoothing algorithm (Exponential Moving Average). newValue must be >= 2. Default 15.
    103  static void setRangeFilterValue(uint16_t newValue);
    104 
    105  //Handlers:
    106  static void attachNewRange(void (* handleNewRange)(void)) { _handleNewRange = handleNewRange; };
    107 
    108  static void attachBlinkDevice(void (* handleBlinkDevice)(DW1000Device*)) { _handleBlinkDevice = handleBlinkDevice; };
    109 
    110  static void attachNewDevice(void (* handleNewDevice)(DW1000Device*)) { _handleNewDevice = handleNewDevice; };
    111 
    112  static void attachInactiveDevice(void (* handleInactiveDevice)(DW1000Device*)) { _handleInactiveDevice = handleInactiveDevice; };
    113 
    114 
    115 
    116  static DW1000Device* getDistantDevice();
    117  static DW1000Device* searchDistantDevice(byte shortAddress[]);
    118 
    119  //FOR DEBUGGING
    120  static void visualizeDatas(byte datas[]);
    121 
    122 
    123 private:
    124  //other devices in the network
    125  static DW1000Device _networkDevices[MAX_DEVICES];
    126  static uint8_t _networkDevicesNumber;
    127  static int16_t _lastDistantDevice;
    128  static byte _currentAddress[8];
    129  static byte _currentShortAddress[2];
    130  static byte _lastSentToShortAddress[2];
    131  static DW1000Mac _globalMac;
    132  static int32_t timer;
    133  static int16_t counterForBlink;
    134 
    135  //Handlers:
    136  static void (* _handleNewRange)(void);
    137  static void (* _handleBlinkDevice)(DW1000Device*);
    138  static void (* _handleNewDevice)(DW1000Device*);
    139  static void (* _handleInactiveDevice)(DW1000Device*);
    140 
    141  //sketch type (tag or anchor)
    142  static int16_t _type; //0 for tag and 1 for anchor
    143  // TODO check type, maybe enum?
    144  // message flow state
    145  static volatile byte _expectedMsgId;
    146  // message sent/received state
    147  static volatile boolean _sentAck;
    148  static volatile boolean _receivedAck;
    149  // protocol error state
    150  static boolean _protocolFailed;
    151  // reset line to the chip
    152  static uint8_t _RST;
    153  static uint8_t _SS;
    154  // watchdog and reset period
    155  static uint32_t _lastActivity;
    156  static uint32_t _resetPeriod;
    157  // reply times (same on both sides for symm. ranging)
    158  static uint16_t _replyDelayTimeUS;
    159  //timer Tick delay
    160  static uint16_t _timerDelay;
    161  // ranging counter (per second)
    162  static uint16_t _successRangingCount;
    163  static uint32_t _rangingCountPeriod;
    164  //ranging filter
    165  static volatile boolean _useRangeFilter;
    166  static uint16_t _rangeFilterValue;
    167  //_bias correction
    168  static char _bias_RSL[17]; // TODO remove or use
    169  //17*2=34 bytes in SRAM
    170  static int16_t _bias_PRF_16[17]; // TODO remove or use
    171  //17 bytes in SRAM
    172  static char _bias_PRF_64[17]; // TODO remove or use
    173 
    174 
    175  //methods
    176  static void handleSent();
    177  static void handleReceived();
    178  static void noteActivity();
    179  static void resetInactive();
    180 
    181  //global functions:
    182  static void checkForReset();
    183  static void checkForInactiveDevices();
    184  static void copyShortAddress(byte address1[], byte address2[]);
    185 
    186  //for ranging protocole (ANCHOR)
    187  static void transmitInit();
    188  static void transmit(byte datas[]);
    189  static void transmit(byte datas[], DW1000Time time);
    190  static void transmitBlink();
    191  static void transmitRangingInit(DW1000Device* myDistantDevice);
    192  static void transmitPollAck(DW1000Device* myDistantDevice);
    193  static void transmitRangeReport(DW1000Device* myDistantDevice);
    194  static void transmitRangeFailed(DW1000Device* myDistantDevice);
    195  static void receiver();
    196 
    197  //for ranging protocole (TAG)
    198  static void transmitPoll(DW1000Device* myDistantDevice);
    199  static void transmitRange(DW1000Device* myDistantDevice);
    200 
    201  //methods for range computation
    202  static void computeRangeAsymmetric(DW1000Device* myDistantDevice, DW1000Time* myTOF);
    203 
    204  static void timerTick();
    205 
    206  //Utils
    207  static float filterValue(float value, float previousValue, uint16_t numberOfElements);
    208 };
    209 
    Definition: DW1000Device.h:37
    +
    static DW1000Device * getDistantDevice()
    Definition: DW1000Ranging.cpp:308
    +
    static boolean addNetworkDevices(DW1000Device *device, boolean shortAddress)
    Definition: DW1000Ranging.cpp:211
    +
    static void startAsAnchor(char address[], const byte mode[])
    Definition: DW1000Ranging.cpp:162
    + +
    Definition: DW1000Mac.h:45
    +
    #define MAX_DEVICES
    Definition: DW1000Ranging.h:46
    +
    DW1000RangingClass DW1000Ranging
    Definition: DW1000Ranging.cpp:33
    +
    static byte * getCurrentAddress()
    Definition: DW1000Ranging.h:92
    +
    static void attachNewRange(void(*handleNewRange)(void))
    Definition: DW1000Ranging.h:106
    +
    static void removeNetworkDevices(int16_t index)
    Definition: DW1000Ranging.cpp:267
    +
    static void generalStart()
    Definition: DW1000Ranging.cpp:119
    +
    static void setReplyTime(uint16_t replyDelayTimeUs)
    Definition: DW1000Ranging.cpp:291
    +
    static void setResetPeriod(uint32_t resetPeriod)
    Definition: DW1000Ranging.cpp:293
    +
    static byte data[LEN_DATA]
    Definition: DW1000Ranging.h:75
    +
    static uint8_t getNetworkDevicesNumber()
    Definition: DW1000Ranging.h:96
    +
    static void visualizeDatas(byte datas[])
    Definition: DW1000Ranging.cpp:948
    +
    Definition: DW1000Ranging.h:71
    +
    static void attachBlinkDevice(void(*handleBlinkDevice)(DW1000Device *))
    Definition: DW1000Ranging.h:108
    +
    static DW1000Device * searchDistantDevice(byte shortAddress[])
    Definition: DW1000Ranging.cpp:296
    + +
    #define LEN_DATA
    Definition: DW1000Ranging.h:43
    +
    Definition: DW1000Time.h:43
    +
    static void configureNetwork(uint16_t deviceAddress, uint16_t networkId, const byte mode[])
    Definition: DW1000Ranging.cpp:108
    + +
    static void useRangeFilter(boolean enabled)
    Definition: DW1000Ranging.cpp:662
    +
    static void initCommunication(uint8_t myRST=DEFAULT_RST_PIN, uint8_t mySS=DEFAULT_SPI_SS_PIN, uint8_t myIRQ=2)
    Definition: DW1000Ranging.cpp:92
    +
    #define DEFAULT_SPI_SS_PIN
    Definition: DW1000Ranging.h:50
    +
    static int16_t detectMessageType(byte datas[])
    Definition: DW1000Ranging.cpp:345
    +
    static void attachInactiveDevice(void(*handleInactiveDevice)(DW1000Device *))
    Definition: DW1000Ranging.h:112
    +
    static byte * getCurrentShortAddress()
    Definition: DW1000Ranging.h:94
    +
    static void setRangeFilterValue(uint16_t newValue)
    Definition: DW1000Ranging.cpp:666
    +
    static void attachNewDevice(void(*handleNewDevice)(DW1000Device *))
    Definition: DW1000Ranging.h:110
    +
    static void startAsTag(char address[], const byte mode[])
    Definition: DW1000Ranging.cpp:188
    +
    #define DEFAULT_RST_PIN
    Definition: DW1000Ranging.h:49
    + +
    static void loop()
    Definition: DW1000Ranging.cpp:359
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Time_8cpp.html b/lib/DW1000/extras/doc/html/DW1000Time_8cpp.html new file mode 100644 index 0000000..216b7e7 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Time_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Time.cpp File Reference
    +
    +
    +
    #include "DW1000Time.h"
    +

    Detailed Description

    +

    Copyright (c) 2015 by Thomas Trojer thoma.nosp@m.s@tr.nosp@m.ojer..nosp@m.net Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de); refactored class Decawave DW1000 library for arduino.

    +

    Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0
    +

    Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

    +

    Arduino driver library timestamp wrapper (source file) for the Decawave DW1000 UWB transceiver IC.

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Time_8h.html b/lib/DW1000/extras/doc/html/DW1000Time_8h.html new file mode 100644 index 0000000..08a3d88 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Time_8h.html @@ -0,0 +1,88 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.h File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000Time.h File Reference
    +
    +
    +
    #include <Arduino.h>
    +#include <stdint.h>
    +#include <inttypes.h>
    +#include "DW1000CompileOptions.h"
    +#include "deprecated.h"
    +#include "require_cpp11.h"
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  DW1000Time
     
    +

    Detailed Description

    +

    Copyright (c) 2015 by Thomas Trojer thoma.nosp@m.s@tr.nosp@m.ojer..nosp@m.net Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de); refactored class Decawave DW1000 library for arduino.

    +

    Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0
    +

    Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

    +

    Arduino driver library timestamp wrapper (header file) for the Decawave DW1000 UWB transceiver IC.

    +
      +
    • avoid/remove floating operations, expensive on most microprocessors
    • +
    +
    Note
    comments in cpp file, makes .h smaller and gives a better overview about available methods and variables.
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000Time_8h_source.html b/lib/DW1000/extras/doc/html/DW1000Time_8h_source.html new file mode 100644 index 0000000..5b3c9cd --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000Time_8h_source.html @@ -0,0 +1,91 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000Time.h
    +
    +
    +Go to the documentation of this file.
    1 
    30 #ifndef DW1000TIME_H
    31 #define DW1000TIME_H
    32 
    33 #include <Arduino.h>
    34 #include <stdint.h>
    35 #include <inttypes.h>
    36 #include "DW1000CompileOptions.h"
    37 #include "deprecated.h"
    38 #include "require_cpp11.h"
    39 
    40 #if DW1000TIME_H_PRINTABLE
    41 class DW1000Time : public Printable {
    42 #else
    43 class DW1000Time {
    44 #endif // DW1000Time_H_PRINTABLE
    45 public:
    46  // Time resolution in micro-seconds of time based registers/values.
    47  // Each bit in a timestamp counts for a period of approx. 15.65ps
    48  static constexpr float TIME_RES = 0.000015650040064103f;
    49  static constexpr float TIME_RES_INV = 63897.6f;
    50 
    51  // Speed of radio waves [m/s] * timestamp resolution [~15.65ps] of DW1000
    52  static constexpr float DISTANCE_OF_RADIO = 0.0046917639786159f;
    53  static constexpr float DISTANCE_OF_RADIO_INV = 213.139451293f;
    54 
    55  // timestamp byte length - 40 bit -> 5 byte
    56  static constexpr uint8_t LENGTH_TIMESTAMP = 5;
    57 
    58  // timer/counter overflow (40 bits) -> 4overflow approx. every 17.2 seconds
    59  static constexpr int64_t TIME_OVERFLOW = 0x10000000000; //1099511627776LL
    60  static constexpr int64_t TIME_MAX = 0xffffffffff;
    61 
    62  // time factors (relative to [us]) for setting delayed transceive
    63  // TODO use non float
    64  static constexpr float SECONDS = 1e6;
    65  static constexpr float MILLISECONDS = 1e3;
    66  static constexpr float MICROSECONDS = 1;
    67  static constexpr float NANOSECONDS = 1e-3;
    68 
    69  // constructor
    70  DW1000Time();
    71  DW1000Time(int64_t time);
    72  DW1000Time(byte data[]);
    73  DW1000Time(const DW1000Time& copy);
    74  DW1000Time(float timeUs);
    75  DW1000Time(int32_t value, float factorUs);
    76  ~DW1000Time();
    77 
    78  // setter
    79  // dw1000 timestamp, increase of +1 approx approx. 15.65ps real time
    80  void setTimestamp(int64_t value);
    81  void setTimestamp(byte data[]);
    82  void setTimestamp(const DW1000Time& copy);
    83 
    84  // real time in us
    85  void setTime(float timeUs);
    86  void setTime(int32_t value, float factorUs);
    87 
    88  // getter
    89  int64_t getTimestamp() const;
    90  void getTimestamp(byte data[]) const;
    91 
    92  DEPRECATED_MSG("use getAsMicroSeconds()")
    93  float getAsFloat() const;
    94  // getter, convert the timestamp to usual units
    95  float getAsMicroSeconds() const;
    96  //void getAsBytes(byte data[]) const; // TODO check why it is here, is it old version of getTimestamp(byte) ?
    97  float getAsMeters() const;
    98 
    99  DW1000Time& wrap();
    100 
    101  // self test
    102  bool isValidTimestamp();
    103 
    104  // assign
    105  DW1000Time& operator=(const DW1000Time& assign);
    106  // add
    107  DW1000Time& operator+=(const DW1000Time& add);
    108  DW1000Time operator+(const DW1000Time& add) const;
    109  // subtract
    110  DW1000Time& operator-=(const DW1000Time& sub);
    111  DW1000Time operator-(const DW1000Time& sub) const;
    112  // multiply
    113  // multiply with float cause lost in accuracy, because float calculates only with 23bit matise
    114  DW1000Time& operator*=(float factor);
    115  DW1000Time operator*(float factor) const;
    116  // no accuracy lost
    117  DW1000Time& operator*=(const DW1000Time& factor);
    118  DW1000Time operator*(const DW1000Time& factor) const;
    119  // divide
    120  // divide with float cause lost in accuracy, because float calculates only with 23bit matise
    121  DW1000Time& operator/=(float factor);
    122  DW1000Time operator/(float factor) const;
    123  // no accuracy lost
    124  DW1000Time& operator/=(const DW1000Time& factor);
    125  DW1000Time operator/(const DW1000Time& factor) const;
    126  // compare
    127  boolean operator==(const DW1000Time& cmp) const;
    128  boolean operator!=(const DW1000Time& cmp) const;
    129 
    130 #ifdef DW1000TIME_H_PRINTABLE
    131  // print to serial for debug
    132  DEPRECATED_MSG("use Serial.print(object)")
    133  void print();
    134  // for usage with e.g. Serial.print()
    135  size_t printTo(Print& p) const;
    136 #endif // DW1000Time_H_PRINTABLE
    137 
    138 private:
    139  // timestamp size from dw1000 is 40bit, maximum number 1099511627775
    140  // signed because you can calculate with DW1000Time; negative values are possible errors
    141  int64_t _timestamp = 0;
    142 };
    143 
    144 #endif // DW1000Time_H
    void setTime(float timeUs)
    Definition: DW1000Time.cpp:112
    + +
    static constexpr float MICROSECONDS
    Definition: DW1000Time.h:66
    + +
    float getAsMeters() const
    Definition: DW1000Time.cpp:172
    +
    static constexpr int64_t TIME_OVERFLOW
    Definition: DW1000Time.h:59
    + +
    void print()
    Definition: DW1000Time.cpp:287
    +
    float getAsFloat() const
    Definition: DW1000Time.cpp:154
    +
    static constexpr float NANOSECONDS
    Definition: DW1000Time.h:67
    +
    DW1000Time & wrap()
    Definition: DW1000Time.cpp:187
    +
    float getAsMicroSeconds() const
    Definition: DW1000Time.cpp:163
    +
    static constexpr float DISTANCE_OF_RADIO
    Definition: DW1000Time.h:52
    +
    size_t printTo(Print &p) const
    Definition: DW1000Time.cpp:297
    +
    bool isValidTimestamp()
    Definition: DW1000Time.cpp:198
    +
    DW1000Time()
    Definition: DW1000Time.cpp:28
    +
    static constexpr float DISTANCE_OF_RADIO_INV
    Definition: DW1000Time.h:53
    +
    ~DW1000Time()
    Definition: DW1000Time.cpp:78
    +
    static constexpr float TIME_RES
    Definition: DW1000Time.h:48
    +
    Definition: DW1000Time.h:43
    +
    static constexpr float MILLISECONDS
    Definition: DW1000Time.h:65
    +
    static constexpr uint8_t LENGTH_TIMESTAMP
    Definition: DW1000Time.h:56
    +
    static constexpr float SECONDS
    Definition: DW1000Time.h:64
    +
    static constexpr float TIME_RES_INV
    Definition: DW1000Time.h:49
    +
    #define DEPRECATED_MSG(msg)
    Definition: deprecated.h:17
    +
    int64_t getTimestamp() const
    Definition: DW1000Time.cpp:134
    +
    static constexpr int64_t TIME_MAX
    Definition: DW1000Time.h:60
    +
    void setTimestamp(int64_t value)
    Definition: DW1000Time.cpp:84
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000_8cpp.html b/lib/DW1000/extras/doc/html/DW1000_8cpp.html new file mode 100644 index 0000000..c8ffac4 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000_8cpp.html @@ -0,0 +1,85 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000.cpp File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000.cpp File Reference
    +
    +
    +
    #include "DW1000.h"
    +
    + + + +

    +Variables

    DW1000Class DW1000
     
    +

    Variable Documentation

    + +
    +
    + + + + +
    DW1000Class DW1000
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000_8h.html b/lib/DW1000/extras/doc/html/DW1000_8h.html new file mode 100644 index 0000000..2941187 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000_8h.html @@ -0,0 +1,99 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000.h File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    DW1000.h File Reference
    +
    +
    +
    #include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include <Arduino.h>
    +#include <SPI.h>
    +#include "DW1000Constants.h"
    +#include "DW1000Time.h"
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  DW1000Class
     
    + + + +

    +Variables

    DW1000Class DW1000
     
    +

    Variable Documentation

    + +
    +
    + + + + +
    DW1000Class DW1000
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/DW1000_8h_source.html b/lib/DW1000/extras/doc/html/DW1000_8h_source.html new file mode 100644 index 0000000..d2d7e93 --- /dev/null +++ b/lib/DW1000/extras/doc/html/DW1000_8h_source.html @@ -0,0 +1,274 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    DW1000.h
    +
    +
    +Go to the documentation of this file.
    1 /*
    2  * Copyright (c) 2015 by Thomas Trojer <thomas@trojer.net>
    3  * Decawave DW1000 library for arduino.
    4  *
    5  * Licensed under the Apache License, Version 2.0 (the "License");
    6  * you may not use this file except in compliance with the License.
    7  * You may obtain a copy of the License at
    8  *
    9  * http://www.apache.org/licenses/LICENSE-2.0
    10  *
    11  * Unless required by applicable law or agreed to in writing, software
    12  * distributed under the License is distributed on an "AS IS" BASIS,
    13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  * See the License for the specific language governing permissions and
    15  * limitations under the License.
    16  *
    17  * @file DW1000.h
    18  * Arduino driver library (header file) for the Decawave DW1000 UWB transceiver IC.
    19  *
    20  * @todo
    21  * - impl: later:
    22  * - TXBOFFS in TX_FCTRL for offset buffer transmit
    23  * - TR in TX_FCTRL for flagging for ranging messages
    24  * - CANSFCS in SYS_CTRL to cancel frame check suppression
    25  * - HSRBP in SYS_CTRL to determine in double buffered mode from which buffer to read
    26  */
    27 
    28 #ifndef _DW1000_H_INCLUDED
    29 #define _DW1000_H_INCLUDED
    30 
    31 #include <stdio.h>
    32 #include <stdlib.h>
    33 #include <string.h>
    34 #include <Arduino.h>
    35 #include <SPI.h>
    36 #include "DW1000Constants.h"
    37 #include "DW1000Time.h"
    38 
    39 class DW1000Class {
    40 public:
    41  /* ##### Init ################################################################ */
    49  static void begin(uint8_t irq, uint8_t rst = 0xff);
    50 
    59  static void select(uint8_t ss);
    60 
    70  static void reselect(uint8_t ss);
    71 
    76  static void end();
    77 
    83  static void reset();
    84 
    88  static void softReset();
    89 
    90  /* ##### Print device id, address, etc. ###################################### */
    98  static void getPrintableDeviceIdentifier(char msgBuffer[]);
    99 
    106  static void getPrintableExtendedUniqueIdentifier(char msgBuffer[]);
    107 
    115  static void getPrintableNetworkIdAndShortAddress(char msgBuffer[]);
    116 
    124  static void getPrintableDeviceMode(char msgBuffer[]);
    125 
    126  /* ##### Device address management, filters ################################## */
    135  static void setNetworkId(uint16_t val);
    136 
    143  static void setDeviceAddress(uint16_t val);
    144  // TODO MAC and filters
    145 
    146  static void setEUI(char eui[]);
    147  static void setEUI(byte eui[]);
    148 
    149  /* ##### General device configuration ######################################## */
    159  static void setReceiverAutoReenable(boolean val);
    160 
    169  static void setInterruptPolarity(boolean val);
    170 
    182  static void suppressFrameCheck(boolean val);
    183 
    195  static void setDataRate(byte rate);
    196 
    211  static void setPulseFrequency(byte freq);
    212  static byte getPulseFrequency();
    213  static void setPreambleLength(byte prealen);
    214  static void setChannel(byte channel);
    215  static void setPreambleCode(byte preacode);
    216  static void useSmartPower(boolean smartPower);
    217 
    218  /* transmit and receive configuration. */
    219  static DW1000Time setDelay(const DW1000Time& delay);
    220  static void receivePermanently(boolean val);
    221  static void setData(byte data[], uint16_t n);
    222  static void setData(const String& data);
    223  static void getData(byte data[], uint16_t n);
    224  static void getData(String& data);
    225  static uint16_t getDataLength();
    226  static void getTransmitTimestamp(DW1000Time& time);
    227  static void getReceiveTimestamp(DW1000Time& time);
    228  static void getSystemTimestamp(DW1000Time& time);
    229  static void getTransmitTimestamp(byte data[]);
    230  static void getReceiveTimestamp(byte data[]);
    231  static void getSystemTimestamp(byte data[]);
    232 
    233  /* receive quality information. */
    234  static float getReceivePower();
    235  static float getFirstPathPower();
    236  static float getReceiveQuality();
    237 
    238  /* interrupt management. */
    239  static void interruptOnSent(boolean val);
    240  static void interruptOnReceived(boolean val);
    241  static void interruptOnReceiveFailed(boolean val);
    242  static void interruptOnReceiveTimeout(boolean val);
    243  static void interruptOnReceiveTimestampAvailable(boolean val);
    244  static void interruptOnAutomaticAcknowledgeTrigger(boolean val);
    245 
    246  /* callback handler management. */
    247  static void attachErrorHandler(void (* handleError)(void)) {
    248  _handleError = handleError;
    249  }
    250 
    251  static void attachSentHandler(void (* handleSent)(void)) {
    252  _handleSent = handleSent;
    253  }
    254 
    255  static void attachReceivedHandler(void (* handleReceived)(void)) {
    256  _handleReceived = handleReceived;
    257  }
    258 
    259  static void attachReceiveFailedHandler(void (* handleReceiveFailed)(void)) {
    260  _handleReceiveFailed = handleReceiveFailed;
    261  }
    262 
    263  static void attachReceiveTimeoutHandler(void (* handleReceiveTimeout)(void)) {
    264  _handleReceiveTimeout = handleReceiveTimeout;
    265  }
    266 
    267  static void attachReceiveTimestampAvailableHandler(void (* handleReceiveTimestampAvailable)(void)) {
    268  _handleReceiveTimestampAvailable = handleReceiveTimestampAvailable;
    269  }
    270 
    271  /* device state management. */
    272  // idle state
    273  static void idle();
    274 
    275  // general configuration state
    276  static void newConfiguration();
    277  static void commitConfiguration();
    278 
    279  // reception state
    280  static void newReceive();
    281  static void startReceive();
    282 
    283  // transmission state
    284  static void newTransmit();
    285  static void startTransmit();
    286 
    287  /* ##### Operation mode selection ############################################ */
    309  static void enableMode(const byte mode[]);
    310 
    311  // use RX/TX specific and general default settings
    312  static void setDefaults();
    313 
    314  /* debug pretty print registers. */
    315  static void getPrettyBytes(byte cmd, uint16_t offset, char msgBuffer[], uint16_t n);
    316  static void getPrettyBytes(byte data[], char msgBuffer[], uint16_t n);
    317 
    318  //convert from char to 4 bits (hexadecimal)
    319  static uint8_t nibbleFromChar(char c);
    320  static void convertToByte(char string[], byte* eui_byte);
    321 
    322  // host-initiated reading of temperature and battery voltage
    323  static void getTempAndVbat(float& temp, float& vbat);
    324 
    325  // transmission/reception bit rate
    326  static constexpr byte TRX_RATE_110KBPS = 0x00;
    327  static constexpr byte TRX_RATE_850KBPS = 0x01;
    328  static constexpr byte TRX_RATE_6800KBPS = 0x02;
    329 
    330  // transmission pulse frequency
    331  // 0x00 is 4MHZ, but receiver in DW1000 does not support it (!??)
    332  static constexpr byte TX_PULSE_FREQ_16MHZ = 0x01;
    333  static constexpr byte TX_PULSE_FREQ_64MHZ = 0x02;
    334 
    335  // preamble length (PE + TXPSR bits)
    336  static constexpr byte TX_PREAMBLE_LEN_64 = 0x01;
    337  static constexpr byte TX_PREAMBLE_LEN_128 = 0x05;
    338  static constexpr byte TX_PREAMBLE_LEN_256 = 0x09;
    339  static constexpr byte TX_PREAMBLE_LEN_512 = 0x0D;
    340  static constexpr byte TX_PREAMBLE_LEN_1024 = 0x02;
    341  static constexpr byte TX_PREAMBLE_LEN_1536 = 0x06;
    342  static constexpr byte TX_PREAMBLE_LEN_2048 = 0x0A;
    343  static constexpr byte TX_PREAMBLE_LEN_4096 = 0x03;
    344 
    345  // PAC size. */
    346  static constexpr byte PAC_SIZE_8 = 8;
    347  static constexpr byte PAC_SIZE_16 = 16;
    348  static constexpr byte PAC_SIZE_32 = 32;
    349  static constexpr byte PAC_SIZE_64 = 64;
    350 
    351  /* channel of operation. */
    352  static constexpr byte CHANNEL_1 = 1;
    353  static constexpr byte CHANNEL_2 = 2;
    354  static constexpr byte CHANNEL_3 = 3;
    355  static constexpr byte CHANNEL_4 = 4;
    356  static constexpr byte CHANNEL_5 = 5;
    357  static constexpr byte CHANNEL_7 = 7;
    358 
    359  /* preamble codes. */
    360  static constexpr byte PREAMBLE_CODE_16MHZ_1 = 1;
    361  static constexpr byte PREAMBLE_CODE_16MHZ_2 = 2;
    362  static constexpr byte PREAMBLE_CODE_16MHZ_3 = 3;
    363  static constexpr byte PREAMBLE_CODE_16MHZ_4 = 4;
    364  static constexpr byte PREAMBLE_CODE_16MHZ_5 = 5;
    365  static constexpr byte PREAMBLE_CODE_16MHZ_6 = 6;
    366  static constexpr byte PREAMBLE_CODE_16MHZ_7 = 7;
    367  static constexpr byte PREAMBLE_CODE_16MHZ_8 = 8;
    368  static constexpr byte PREAMBLE_CODE_64MHZ_9 = 9;
    369  static constexpr byte PREAMBLE_CODE_64MHZ_10 = 10;
    370  static constexpr byte PREAMBLE_CODE_64MHZ_11 = 11;
    371  static constexpr byte PREAMBLE_CODE_64MHZ_12 = 12;
    372  static constexpr byte PREAMBLE_CODE_64MHZ_17 = 17;
    373  static constexpr byte PREAMBLE_CODE_64MHZ_18 = 18;
    374  static constexpr byte PREAMBLE_CODE_64MHZ_19 = 19;
    375  static constexpr byte PREAMBLE_CODE_64MHZ_20 = 20;
    376 
    377  /* frame length settings. */
    378  static constexpr byte FRAME_LENGTH_NORMAL = 0x00;
    379  static constexpr byte FRAME_LENGTH_EXTENDED = 0x03;
    380 
    381  /* pre-defined modes of operation (3 bytes for data rate, pulse frequency and
    382  preamble length). */
    383  static constexpr byte MODE_LONGDATA_RANGE_LOWPOWER[] = {TRX_RATE_110KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_2048};
    384  static constexpr byte MODE_SHORTDATA_FAST_LOWPOWER[] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_128};
    385  static constexpr byte MODE_LONGDATA_FAST_LOWPOWER[] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_1024};
    386  static constexpr byte MODE_SHORTDATA_FAST_ACCURACY[] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_128};
    387  static constexpr byte MODE_LONGDATA_FAST_ACCURACY[] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_1024};
    388  static constexpr byte MODE_LONGDATA_RANGE_ACCURACY[] = {TRX_RATE_110KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_2048};
    389 
    390 //private:
    391  /* chip select, reset and interrupt pins. */
    392  static uint8_t _ss;
    393  static uint8_t _rst;
    394  static uint8_t _irq;
    395 
    396  /* callbacks. */
    397  static void (* _handleError)(void);
    398  static void (* _handleSent)(void);
    399  static void (* _handleReceived)(void);
    400  static void (* _handleReceiveFailed)(void);
    401  static void (* _handleReceiveTimeout)(void);
    402  static void (* _handleReceiveTimestampAvailable)(void);
    403 
    404  /* register caches. */
    405  static byte _syscfg[LEN_SYS_CFG];
    406  static byte _sysctrl[LEN_SYS_CTRL];
    408  static byte _txfctrl[LEN_TX_FCTRL];
    409  static byte _sysmask[LEN_SYS_MASK];
    410  static byte _chanctrl[LEN_CHAN_CTRL];
    411 
    412  /* device status monitoring */
    413  static byte _vmeas3v3;
    414  static byte _tmeas23C;
    415 
    416  /* PAN and short address. */
    418 
    419  /* internal helper that guide tuning the chip. */
    420  static boolean _smartPower;
    421  static byte _extendedFrameLength;
    422  static byte _preambleCode;
    423  static byte _channel;
    424  static byte _preambleLength;
    425  static byte _pulseFrequency;
    426  static byte _dataRate;
    427  static byte _pacSize;
    429 
    430  /* internal helper to remember how to properly act. */
    431  static boolean _permanentReceive;
    432  static boolean _frameCheck;
    433 
    434  // whether RX or TX is active
    435  static uint8_t _deviceMode;
    436 
    437  /* Arduino interrupt handler */
    438  static void handleInterrupt();
    439 
    440  /* Allow MAC frame filtering . */
    441  // TODO auto-acknowledge
    442  static void setFrameFilter(boolean val);
    443  static void setFrameFilterBehaveCoordinator(boolean val);
    444  static void setFrameFilterAllowBeacon(boolean val);
    445  //data type is used in the FC_1 0x41
    446  static void setFrameFilterAllowData(boolean val);
    447  static void setFrameFilterAllowAcknowledgement(boolean val);
    448  static void setFrameFilterAllowMAC(boolean val);
    449  //Reserved is used for the Blink message
    450  static void setFrameFilterAllowReserved(boolean val);
    451 
    452  // note: not sure if going to be implemented for now
    453  static void setDoubleBuffering(boolean val);
    454  // TODO is implemented, but needs testing
    455  static void useExtendedFrameLength(boolean val);
    456  // TODO is implemented, but needs testing
    457  static void waitForResponse(boolean val);
    458 
    459  /* tuning according to mode. */
    460  static void tune();
    461 
    462  /* device status flags */
    463  static boolean isReceiveTimestampAvailable();
    464  static boolean isTransmitDone();
    465  static boolean isReceiveDone();
    466  static boolean isReceiveFailed();
    467  static boolean isReceiveTimeout();
    468  static boolean isClockProblem();
    469 
    470  /* interrupt state handling */
    471  static void clearInterrupts();
    472  static void clearAllStatus();
    473  static void clearReceiveStatus();
    475  static void clearTransmitStatus();
    476 
    477  /* internal helper to read/write system registers. */
    478  static void readSystemEventStatusRegister();
    479  static void readSystemConfigurationRegister();
    480  static void writeSystemConfigurationRegister();
    481  static void readNetworkIdAndDeviceAddress();
    482  static void writeNetworkIdAndDeviceAddress();
    483  static void readSystemEventMaskRegister();
    484  static void writeSystemEventMaskRegister();
    485  static void readChannelControlRegister();
    486  static void writeChannelControlRegister();
    487  static void readTransmitFrameControlRegister();
    488  static void writeTransmitFrameControlRegister();
    489 
    490  /* clock management. */
    491  static void enableClock(byte clock);
    492 
    493  /* LDE micro-code management. */
    494  static void manageLDE();
    495 
    496  /* timestamp correction. */
    497  static void correctTimestamp(DW1000Time& timestamp);
    498 
    499  /* reading and writing bytes from and to DW1000 module. */
    500  static void readBytes(byte cmd, uint16_t offset, byte data[], uint16_t n);
    501  static void readBytesOTP(uint16_t address, byte data[]);
    502  static void writeByte(byte cmd, uint16_t offset, byte data);
    503  static void writeBytes(byte cmd, uint16_t offset, byte data[], uint16_t n);
    504 
    505  /* writing numeric values to bytes. */
    506  static void writeValueToBytes(byte data[], int32_t val, uint16_t n);
    507 
    508  /* internal helper for bit operations on multi-bytes. */
    509  static boolean getBit(byte data[], uint16_t n, uint16_t bit);
    510  static void setBit(byte data[], uint16_t n, uint16_t bit, boolean val);
    511 
    512  /* Register is 6 bit, 7 = write, 6 = sub-adressing, 5-0 = register value
    513  * Total header with sub-adressing can be 15 bit. */
    514  static const byte WRITE = 0x80; // regular write
    515  static const byte WRITE_SUB = 0xC0; // write with sub address
    516  static const byte READ = 0x00; // regular read
    517  static const byte READ_SUB = 0x40; // read with sub address
    518  static const byte RW_SUB_EXT = 0x80; // R/W with sub address extension
    519 
    520  /* clocks available. */
    521  static const byte AUTO_CLOCK = 0x00;
    522  static const byte XTI_CLOCK = 0x01;
    523  static const byte PLL_CLOCK = 0x02;
    524 
    525  /* SPI configs. */
    526  static const SPISettings _fastSPI;
    527  static const SPISettings _slowSPI;
    528  static const SPISettings* _currentSPI;
    529 
    530  /* range bias tables (500/900 MHz band, 16/64 MHz PRF), -61 to -95 dBm. */
    531  static const byte BIAS_500_16_ZERO = 10;
    532  static const byte BIAS_500_64_ZERO = 8;
    533  static const byte BIAS_900_16_ZERO = 7;
    534  static const byte BIAS_900_64_ZERO = 7;
    535 
    536  // range bias tables (500 MHz in [mm] and 900 MHz in [2mm] - to fit into bytes)
    537  static constexpr byte BIAS_500_16[] = {198, 187, 179, 163, 143, 127, 109, 84, 59, 31, 0, 36, 65, 84, 97, 106, 110, 112};
    538  static constexpr byte BIAS_500_64[] = {110, 105, 100, 93, 82, 69, 51, 27, 0, 21, 35, 42, 49, 62, 71, 76, 81, 86};
    539  static constexpr byte BIAS_900_16[] = {137, 122, 105, 88, 69, 47, 25, 0, 21, 48, 79, 105, 127, 147, 160, 169, 178, 197};
    540  static constexpr byte BIAS_900_64[] = {147, 133, 117, 99, 75, 50, 29, 0, 24, 45, 63, 76, 87, 98, 116, 122, 132, 142};
    541 
    542 };
    543 
    544 extern DW1000Class DW1000;
    545 
    546 #endif
    static void(* _handleReceived)(void)
    Definition: DW1000.h:399
    +
    static constexpr byte MODE_LONGDATA_RANGE_ACCURACY[]
    Definition: DW1000.h:388
    +
    static void setDataRate(byte rate)
    Definition: DW1000.cpp:1041
    +
    static void getPrintableNetworkIdAndShortAddress(char msgBuffer[])
    Definition: DW1000.cpp:691
    +
    static constexpr byte TX_PREAMBLE_LEN_2048
    Definition: DW1000.h:342
    +
    static void suppressFrameCheck(boolean val)
    Definition: DW1000.cpp:1008
    +
    static byte _tmeas23C
    Definition: DW1000.h:414
    +
    static constexpr byte TRX_RATE_6800KBPS
    Definition: DW1000.h:328
    +
    static void interruptOnReceiveFailed(boolean val)
    Definition: DW1000.cpp:913
    +
    static void getSystemTimestamp(DW1000Time &time)
    Definition: DW1000.cpp:1301
    +
    static const SPISettings * _currentSPI
    Definition: DW1000.h:528
    +
    static constexpr byte TX_PREAMBLE_LEN_128
    Definition: DW1000.h:337
    +
    static const byte AUTO_CLOCK
    Definition: DW1000.h:521
    +
    static void newReceive()
    Definition: DW1000.cpp:943
    +
    static void writeSystemEventMaskRegister()
    Definition: DW1000.cpp:774
    +
    static void convertToByte(char string[], byte *eui_byte)
    Definition: DW1000.cpp:821
    +
    static void select(uint8_t ss)
    Definition: DW1000.cpp:111
    +
    static const byte PLL_CLOCK
    Definition: DW1000.h:523
    +
    static constexpr byte BIAS_500_64[]
    Definition: DW1000.h:538
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_12
    Definition: DW1000.h:371
    +
    static boolean isClockProblem()
    Definition: DW1000.cpp:1350
    +
    static void setFrameFilter(boolean val)
    Definition: DW1000.cpp:863
    +
    static void attachErrorHandler(void(*handleError)(void))
    Definition: DW1000.h:247
    +
    static void getPrettyBytes(byte cmd, uint16_t offset, char msgBuffer[], uint16_t n)
    Definition: DW1000.cpp:1663
    +
    #define LEN_SYS_CTRL
    Definition: DW1000Constants.h:70
    +
    static void setData(byte data[], uint16_t n)
    Definition: DW1000.cpp:1165
    +
    static byte _pulseFrequency
    Definition: DW1000.h:425
    +
    static void startReceive()
    Definition: DW1000.cpp:950
    +
    static void getReceiveTimestamp(DW1000Time &time)
    Definition: DW1000.cpp:1239
    +
    static void setPulseFrequency(byte freq)
    Definition: DW1000.cpp:1073
    +
    static void getPrintableDeviceIdentifier(char msgBuffer[])
    Definition: DW1000.cpp:677
    +
    static byte _sysmask[LEN_SYS_MASK]
    Definition: DW1000.h:409
    +
    static uint8_t nibbleFromChar(char c)
    Definition: DW1000.cpp:808
    +
    static void enableClock(byte clock)
    Definition: DW1000.cpp:202
    +
    static void(* _handleReceiveTimeout)(void)
    Definition: DW1000.h:401
    +
    static constexpr byte CHANNEL_7
    Definition: DW1000.h:357
    +
    static uint16_t getDataLength()
    Definition: DW1000.cpp:1191
    +
    static void manageLDE()
    Definition: DW1000.cpp:175
    +
    static void newConfiguration()
    Definition: DW1000.cpp:977
    +
    static constexpr byte CHANNEL_4
    Definition: DW1000.h:355
    +
    static void setDeviceAddress(uint16_t val)
    Definition: DW1000.cpp:803
    +
    static constexpr byte TX_PREAMBLE_LEN_1024
    Definition: DW1000.h:340
    +
    static void begin(uint8_t irq, uint8_t rst=0xff)
    Definition: DW1000.cpp:157
    +
    static void getPrintableDeviceMode(char msgBuffer[])
    Definition: DW1000.cpp:698
    +
    static void interruptOnSent(boolean val)
    Definition: DW1000.cpp:904
    +
    static const byte WRITE_SUB
    Definition: DW1000.h:515
    +
    static byte _vmeas3v3
    Definition: DW1000.h:413
    +
    static void setFrameFilterAllowMAC(boolean val)
    Definition: DW1000.cpp:883
    +
    static uint8_t _rst
    Definition: DW1000.h:393
    +
    static const byte BIAS_500_16_ZERO
    Definition: DW1000.h:531
    +
    static void writeNetworkIdAndDeviceAddress()
    Definition: DW1000.cpp:766
    +
    static void receivePermanently(boolean val)
    Definition: DW1000.cpp:1108
    +
    static DW1000Time setDelay(const DW1000Time &delay)
    Definition: DW1000.cpp:1017
    +
    static void handleInterrupt()
    Definition: DW1000.cpp:632
    +
    static void(* _handleReceiveTimestampAvailable)(void)
    Definition: DW1000.h:402
    +
    static void clearInterrupts()
    Definition: DW1000.cpp:932
    +
    static void waitForResponse(boolean val)
    Definition: DW1000.cpp:1004
    +
    static boolean getBit(byte data[], uint16_t n, uint16_t bit)
    Definition: DW1000.cpp:1504
    +
    static void softReset()
    Definition: DW1000.cpp:239
    +
    static void(* _handleError)(void)
    Definition: DW1000.h:397
    +
    static constexpr byte PAC_SIZE_8
    Definition: DW1000.h:346
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_5
    Definition: DW1000.h:364
    +
    static constexpr byte TX_PULSE_FREQ_16MHZ
    Definition: DW1000.h:332
    +
    static constexpr byte TX_PREAMBLE_LEN_4096
    Definition: DW1000.h:343
    +
    static void interruptOnReceiveTimestampAvailable(boolean val)
    Definition: DW1000.cpp:924
    +
    static void reset()
    Definition: DW1000.cpp:224
    +
    static void writeSystemConfigurationRegister()
    Definition: DW1000.cpp:754
    +
    static void clearReceiveStatus()
    Definition: DW1000.cpp:1370
    +
    static void readNetworkIdAndDeviceAddress()
    Definition: DW1000.cpp:762
    +
    static constexpr byte BIAS_900_16[]
    Definition: DW1000.h:539
    + +
    static void attachReceivedHandler(void(*handleReceived)(void))
    Definition: DW1000.h:255
    +
    static void writeTransmitFrameControlRegister()
    Definition: DW1000.cpp:790
    +
    static byte _txfctrl[LEN_TX_FCTRL]
    Definition: DW1000.h:408
    +
    static const SPISettings _fastSPI
    Definition: DW1000.h:526
    +
    static constexpr byte TRX_RATE_850KBPS
    Definition: DW1000.h:327
    +
    static void attachReceiveFailedHandler(void(*handleReceiveFailed)(void))
    Definition: DW1000.h:259
    +
    #define LEN_TX_FCTRL
    Definition: DW1000Constants.h:154
    +
    static boolean _frameCheck
    Definition: DW1000.h:432
    +
    static constexpr byte CHANNEL_3
    Definition: DW1000.h:354
    +
    static byte _preambleLength
    Definition: DW1000.h:424
    +
    static void attachReceiveTimestampAvailableHandler(void(*handleReceiveTimestampAvailable)(void))
    Definition: DW1000.h:267
    +
    static byte _pacSize
    Definition: DW1000.h:427
    +
    #define LEN_SYS_CFG
    Definition: DW1000Constants.h:52
    +
    static void readSystemEventStatusRegister()
    Definition: DW1000.cpp:758
    +
    static constexpr byte TX_PULSE_FREQ_64MHZ
    Definition: DW1000.h:333
    +
    static void interruptOnReceived(boolean val)
    Definition: DW1000.cpp:908
    +
    static constexpr byte TRX_RATE_110KBPS
    Definition: DW1000.h:326
    +
    static const byte WRITE
    Definition: DW1000.h:514
    +
    static const byte BIAS_900_64_ZERO
    Definition: DW1000.h:534
    +
    static uint8_t _irq
    Definition: DW1000.h:394
    +
    static void attachSentHandler(void(*handleSent)(void))
    Definition: DW1000.h:251
    +
    static constexpr byte MODE_LONGDATA_FAST_ACCURACY[]
    Definition: DW1000.h:387
    +
    static void readTransmitFrameControlRegister()
    Definition: DW1000.cpp:786
    +
    static byte _extendedFrameLength
    Definition: DW1000.h:421
    +
    static constexpr byte TX_PREAMBLE_LEN_1536
    Definition: DW1000.h:341
    +
    static void reselect(uint8_t ss)
    Definition: DW1000.cpp:151
    +
    static constexpr byte MODE_SHORTDATA_FAST_ACCURACY[]
    Definition: DW1000.h:386
    +
    static void readSystemEventMaskRegister()
    Definition: DW1000.cpp:770
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_9
    Definition: DW1000.h:368
    +
    static float getFirstPathPower()
    Definition: DW1000.cpp:1402
    +
    static constexpr byte PAC_SIZE_16
    Definition: DW1000.h:347
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_18
    Definition: DW1000.h:373
    +
    DW1000Class DW1000
    Definition: DW1000.cpp:23
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_20
    Definition: DW1000.h:375
    +
    static constexpr byte BIAS_500_16[]
    Definition: DW1000.h:537
    +
    static byte _preambleCode
    Definition: DW1000.h:422
    +
    static const byte READ_SUB
    Definition: DW1000.h:517
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_19
    Definition: DW1000.h:374
    +
    static const byte RW_SUB_EXT
    Definition: DW1000.h:518
    +
    static constexpr byte CHANNEL_1
    Definition: DW1000.h:352
    +
    static void commitConfiguration()
    Definition: DW1000.cpp:986
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_10
    Definition: DW1000.h:369
    +
    #define LEN_CHAN_CTRL
    Definition: DW1000Constants.h:158
    +
    static constexpr byte FRAME_LENGTH_EXTENDED
    Definition: DW1000.h:379
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_4
    Definition: DW1000.h:363
    +
    static byte _sysstatus[LEN_SYS_STATUS]
    Definition: DW1000.h:407
    +
    static void getPrintableExtendedUniqueIdentifier(char msgBuffer[])
    Definition: DW1000.cpp:684
    +
    static constexpr byte FRAME_LENGTH_NORMAL
    Definition: DW1000.h:378
    +
    static void setChannel(byte channel)
    Definition: DW1000.cpp:1117
    +
    Definition: DW1000Time.h:43
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_3
    Definition: DW1000.h:362
    +
    static boolean isReceiveTimestampAvailable()
    Definition: DW1000.cpp:1323
    +
    static void newTransmit()
    Definition: DW1000.cpp:956
    +
    static boolean isTransmitDone()
    Definition: DW1000.cpp:1319
    +
    static float getReceivePower()
    Definition: DW1000.cpp:1434
    +
    static constexpr byte MODE_LONGDATA_FAST_LOWPOWER[]
    Definition: DW1000.h:385
    +
    static void writeBytes(byte cmd, uint16_t offset, byte data[], uint16_t n)
    Definition: DW1000.cpp:1606
    +
    static uint8_t _ss
    Definition: DW1000.h:392
    +
    static void attachReceiveTimeoutHandler(void(*handleReceiveTimeout)(void))
    Definition: DW1000.h:263
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_8
    Definition: DW1000.h:367
    +
    static void interruptOnAutomaticAcknowledgeTrigger(boolean val)
    Definition: DW1000.cpp:928
    +
    static float getReceiveQuality()
    Definition: DW1000.cpp:1391
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_11
    Definition: DW1000.h:370
    +
    static constexpr byte CHANNEL_2
    Definition: DW1000.h:353
    +
    static void interruptOnReceiveTimeout(boolean val)
    Definition: DW1000.cpp:920
    +
    static byte _sysctrl[LEN_SYS_CTRL]
    Definition: DW1000.h:406
    +
    static const byte BIAS_500_64_ZERO
    Definition: DW1000.h:532
    +
    static void(* _handleReceiveFailed)(void)
    Definition: DW1000.h:400
    +
    static void correctTimestamp(DW1000Time &timestamp)
    Definition: DW1000.cpp:1248
    +
    static uint8_t _deviceMode
    Definition: DW1000.h:435
    +
    static void getTempAndVbat(float &temp, float &vbat)
    Definition: DW1000.cpp:830
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_2
    Definition: DW1000.h:361
    +
    static void setBit(byte data[], uint16_t n, uint16_t bit, boolean val)
    Definition: DW1000.cpp:1477
    +
    static void setFrameFilterAllowReserved(boolean val)
    Definition: DW1000.cpp:887
    +
    static void writeByte(byte cmd, uint16_t offset, byte data)
    Definition: DW1000.cpp:1588
    +
    static void setFrameFilterBehaveCoordinator(boolean val)
    Definition: DW1000.cpp:867
    +
    static void setEUI(char eui[])
    Definition: DW1000.cpp:845
    +
    static void clearAllStatus()
    Definition: DW1000.cpp:1360
    +
    static void clearReceiveTimestampAvailableStatus()
    Definition: DW1000.cpp:1365
    +
    static void readBytes(byte cmd, uint16_t offset, byte data[], uint16_t n)
    Definition: DW1000.cpp:1535
    +
    static const SPISettings _slowSPI
    Definition: DW1000.h:527
    +
    static boolean _permanentReceive
    Definition: DW1000.h:431
    +
    static byte _channel
    Definition: DW1000.h:423
    +
    static constexpr byte MODE_LONGDATA_RANGE_LOWPOWER[]
    Definition: DW1000.h:383
    +
    static constexpr byte TX_PREAMBLE_LEN_512
    Definition: DW1000.h:339
    +
    static void idle()
    Definition: DW1000.cpp:936
    +
    static void writeValueToBytes(byte data[], int32_t val, uint16_t n)
    Definition: DW1000.cpp:1518
    +
    static void(* _handleSent)(void)
    Definition: DW1000.h:398
    +
    static byte _dataRate
    Definition: DW1000.h:426
    +
    static void getTransmitTimestamp(DW1000Time &time)
    Definition: DW1000.cpp:1233
    +
    static boolean _smartPower
    Definition: DW1000.h:420
    +
    static void setInterruptPolarity(boolean val)
    Definition: DW1000.cpp:896
    +
    static void readChannelControlRegister()
    Definition: DW1000.cpp:778
    +
    static void setDefaults()
    Definition: DW1000.cpp:1132
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_1
    Definition: DW1000.h:360
    +
    static constexpr byte PAC_SIZE_64
    Definition: DW1000.h:349
    +
    static constexpr byte PREAMBLE_CODE_64MHZ_17
    Definition: DW1000.h:372
    +
    static void setNetworkId(uint16_t val)
    Definition: DW1000.cpp:798
    +
    static boolean isReceiveDone()
    Definition: DW1000.cpp:1327
    +
    static constexpr byte CHANNEL_5
    Definition: DW1000.h:356
    +
    static void setFrameFilterAllowData(boolean val)
    Definition: DW1000.cpp:875
    +
    static void getData(byte data[], uint16_t n)
    Definition: DW1000.cpp:1208
    +
    #define LEN_SYS_STATUS
    Definition: DW1000Constants.h:81
    +
    static boolean isReceiveTimeout()
    Definition: DW1000.cpp:1346
    +
    static void setPreambleLength(byte prealen)
    Definition: DW1000.cpp:1086
    +
    static void setReceiverAutoReenable(boolean val)
    Definition: DW1000.cpp:900
    +
    static byte _syscfg[LEN_SYS_CFG]
    Definition: DW1000.h:405
    +
    static constexpr byte TX_PREAMBLE_LEN_256
    Definition: DW1000.h:338
    +
    static void useSmartPower(boolean smartPower)
    Definition: DW1000.cpp:1012
    +
    static const byte READ
    Definition: DW1000.h:516
    +
    static void end()
    Definition: DW1000.cpp:107
    +
    static boolean isReceiveFailed()
    Definition: DW1000.cpp:1334
    +
    static const byte XTI_CLOCK
    Definition: DW1000.h:522
    +
    static void enableMode(const byte mode[])
    Definition: DW1000.cpp:254
    +
    static DW1000Time _antennaDelay
    Definition: DW1000.h:428
    +
    static void setDoubleBuffering(boolean val)
    Definition: DW1000.cpp:892
    +
    static void clearTransmitStatus()
    Definition: DW1000.cpp:1382
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_6
    Definition: DW1000.h:365
    +
    static constexpr byte TX_PREAMBLE_LEN_64
    Definition: DW1000.h:336
    +
    static byte _chanctrl[LEN_CHAN_CTRL]
    Definition: DW1000.h:410
    +
    #define LEN_SYS_MASK
    Definition: DW1000Constants.h:102
    +
    static void tune()
    Definition: DW1000.cpp:268
    +
    static void startTransmit()
    Definition: DW1000.cpp:963
    +
    #define LEN_PANADR
    Definition: DW1000Constants.h:48
    +
    static void readBytesOTP(uint16_t address, byte data[])
    Definition: DW1000.cpp:1569
    +
    static byte getPulseFrequency()
    Definition: DW1000.cpp:1082
    +
    static void readSystemConfigurationRegister()
    Definition: DW1000.cpp:750
    +
    static void writeChannelControlRegister()
    Definition: DW1000.cpp:782
    + +
    Definition: DW1000.h:39
    +
    static void setFrameFilterAllowAcknowledgement(boolean val)
    Definition: DW1000.cpp:879
    +
    static void setFrameFilterAllowBeacon(boolean val)
    Definition: DW1000.cpp:871
    +
    static constexpr byte PREAMBLE_CODE_16MHZ_7
    Definition: DW1000.h:366
    +
    static constexpr byte MODE_SHORTDATA_FAST_LOWPOWER[]
    Definition: DW1000.h:384
    +
    static byte _networkAndAddress[LEN_PANADR]
    Definition: DW1000.h:417
    +
    static const byte BIAS_900_16_ZERO
    Definition: DW1000.h:533
    +
    static void setPreambleCode(byte preacode)
    Definition: DW1000.cpp:1123
    +
    static constexpr byte BIAS_900_64[]
    Definition: DW1000.h:540
    +
    static void useExtendedFrameLength(boolean val)
    Definition: DW1000.cpp:1102
    +
    static constexpr byte PAC_SIZE_32
    Definition: DW1000.h:348
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/_2home_2az_2Dropbox_2work_2Arduino_2az-z_2arduino-dw1000_2src_2DW1000Time_8cpp-example.html b/lib/DW1000/extras/doc/html/_2home_2az_2Dropbox_2work_2Arduino_2az-z_2arduino-dw1000_2src_2DW1000Time_8cpp-example.html new file mode 100644 index 0000000..c93c968 --- /dev/null +++ b/lib/DW1000/extras/doc/html/_2home_2az_2Dropbox_2work_2Arduino_2az-z_2arduino-dw1000_2src_2DW1000Time_8cpp-example.html @@ -0,0 +1,55 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + +
    +
    +
    +
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp
    +
    +
    +

    Converts negative values due overflow of one node to correct value

    +

    Maximum timesamp is 1000. Node N1 sends 999 as timesamp. N2 recieves and sends delayed and increased timestamp back. Delay is 10, so timestamp would be 1009, but due overflow 009 is sent back. Now calculate TOF: 009 - 999 = -990 -> not correct time, so wrap() Wrap calculation: -990 + 1000 = 10 -> correct time

    Returns
    +
    #include "DW1000Time.h"
    _timestamp = 0;
    }
    DW1000Time::DW1000Time(int64_t time) {
    setTimestamp(time);
    }
    DW1000Time::DW1000Time(byte data[]) {
    setTimestamp(data);
    }
    setTimestamp(copy);
    }
    DW1000Time::DW1000Time(float timeUs) {
    setTime(timeUs);
    }
    DW1000Time::DW1000Time(int32_t value, float factorUs) {
    setTime(value, factorUs);
    }
    void DW1000Time::setTimestamp(int64_t value) {
    _timestamp = value;
    }
    void DW1000Time::setTimestamp(byte data[]) {
    _timestamp = 0;
    for(uint8_t i = 0; i < LENGTH_TIMESTAMP; i++) {
    _timestamp |= ((int64_t)data[i] << (i*8));
    }
    }
    _timestamp = copy.getTimestamp();
    }
    void DW1000Time::setTime(float timeUs) {
    _timestamp = (int64_t)(timeUs*TIME_RES_INV);
    // _timestamp %= TIME_OVERFLOW; // clean overflow
    }
    void DW1000Time::setTime(int32_t value, float factorUs) {
    //float tsValue = value*factorUs;
    //tsValue = fmod(tsValue, TIME_OVERFLOW);
    //setTime(tsValue);
    setTime(value*factorUs);
    }
    int64_t DW1000Time::getTimestamp() const {
    return _timestamp;
    }
    void DW1000Time::getTimestamp(byte data[]) const {
    memset(data, 0, LENGTH_TIMESTAMP);
    for(uint8_t i = 0; i < LENGTH_TIMESTAMP; i++) {
    data[i] = (byte)((_timestamp >> (i*8)) & 0xFF);
    }
    }
    float DW1000Time::getAsFloat() const {
    //return fmod((float)_timestamp, TIME_OVERFLOW)*TIME_RES;
    }
    return (_timestamp%TIME_OVERFLOW)*TIME_RES;
    }
    float DW1000Time::getAsMeters() const {
    //return fmod((float)_timestamp, TIME_OVERFLOW)*DISTANCE_OF_RADIO;
    return (_timestamp%TIME_OVERFLOW)*DISTANCE_OF_RADIO;
    }
    if(_timestamp < 0) {
    _timestamp += TIME_OVERFLOW;
    }
    return *this;
    }
    return (0 <= _timestamp && _timestamp <= TIME_MAX);
    }
    // assign
    if(this == &assign) {
    return *this;
    }
    _timestamp = assign.getTimestamp();
    return *this;
    }
    // add
    _timestamp += add.getTimestamp();
    return *this;
    }
    return DW1000Time(*this) += add;
    }
    // subtract
    _timestamp -= sub.getTimestamp();
    return *this;
    }
    return DW1000Time(*this) -= sub;
    }
    // multiply
    //float tsValue = (float)_timestamp*factor;
    //_timestamp = (int64_t)tsValue;
    _timestamp *= factor;
    return *this;
    }
    DW1000Time DW1000Time::operator*(float factor) const {
    return DW1000Time(*this) *= factor;
    }
    _timestamp *= factor.getTimestamp();
    return *this;
    }
    return DW1000Time(*this) *= factor;
    }
    // divide
    //_timestamp *= (1.0f/factor);
    _timestamp /= factor;
    return *this;
    }
    DW1000Time DW1000Time::operator/(float factor) const {
    return DW1000Time(*this) /= factor;
    }
    _timestamp /= factor.getTimestamp();
    return *this;
    }
    return DW1000Time(*this) /= factor;
    }
    // compare
    boolean DW1000Time::operator==(const DW1000Time& cmp) const {
    return _timestamp == cmp.getTimestamp();
    }
    boolean DW1000Time::operator!=(const DW1000Time& cmp) const {
    //return !(*this == cmp); // seems not as intended
    return _timestamp != cmp.getTimestamp();
    }
    #ifdef DW1000TIME_H_PRINTABLE
    Serial.print(*this);
    Serial.println();
    }
    size_t DW1000Time::printTo(Print& p) const {
    int64_t number = _timestamp;
    unsigned char buf[21];
    uint8_t i = 0;
    uint8_t printed = 0;
    // printf for arduino avr do not support int64, so we have to calculate
    if(number == 0) {
    p.print((char)'0');
    return 1;
    }
    if(number < 0) {
    p.print((char)'-');
    number = -number; // make positive
    printed++;
    }
    while(number > 0) {
    int64_t q = number/10;
    buf[i++] = number-q*10;
    number = q;
    }
    printed += i;
    for(; i > 0; i--)
    p.print((char)(buf[i-1] < 10 ? '0'+buf[i-1] : 'A'+buf[i-1]-10));
    return printed;
    }
    #endif // DW1000Time_H_PRINTABLE
    + + + + diff --git a/lib/DW1000/extras/doc/html/annotated.html b/lib/DW1000/extras/doc/html/annotated.html new file mode 100644 index 0000000..1cc471a --- /dev/null +++ b/lib/DW1000/extras/doc/html/annotated.html @@ -0,0 +1,69 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    Class List
    +
    +
    +
    Here are the classes, structs, unions and interfaces with brief descriptions:
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/arrowdown.png b/lib/DW1000/extras/doc/html/arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/arrowright.png b/lib/DW1000/extras/doc/html/arrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/bc_s.png b/lib/DW1000/extras/doc/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/bdwn.png b/lib/DW1000/extras/doc/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + +Arduino driver library for Decawave DW1000: Member List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    DW1000Class Member List
    +
    +
    + +

    This is the complete list of members for DW1000Class, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    _antennaDelayDW1000Classstatic
    _chanctrlDW1000Classstatic
    _channelDW1000Classstatic
    _currentSPIDW1000Classstatic
    _dataRateDW1000Classstatic
    _deviceModeDW1000Classstatic
    _extendedFrameLengthDW1000Classstatic
    _fastSPIDW1000Classstatic
    _frameCheckDW1000Classstatic
    _handleErrorDW1000Classstatic
    _handleReceivedDW1000Classstatic
    _handleReceiveFailedDW1000Classstatic
    _handleReceiveTimeoutDW1000Classstatic
    _handleReceiveTimestampAvailableDW1000Classstatic
    _handleSentDW1000Classstatic
    _irqDW1000Classstatic
    _networkAndAddressDW1000Classstatic
    _pacSizeDW1000Classstatic
    _permanentReceiveDW1000Classstatic
    _preambleCodeDW1000Classstatic
    _preambleLengthDW1000Classstatic
    _pulseFrequencyDW1000Classstatic
    _rstDW1000Classstatic
    _slowSPIDW1000Classstatic
    _smartPowerDW1000Classstatic
    _ssDW1000Classstatic
    _syscfgDW1000Classstatic
    _sysctrlDW1000Classstatic
    _sysmaskDW1000Classstatic
    _sysstatusDW1000Classstatic
    _tmeas23CDW1000Classstatic
    _txfctrlDW1000Classstatic
    _vmeas3v3DW1000Classstatic
    attachErrorHandler(void(*handleError)(void))DW1000Classinlinestatic
    attachReceivedHandler(void(*handleReceived)(void))DW1000Classinlinestatic
    attachReceiveFailedHandler(void(*handleReceiveFailed)(void))DW1000Classinlinestatic
    attachReceiveTimeoutHandler(void(*handleReceiveTimeout)(void))DW1000Classinlinestatic
    attachReceiveTimestampAvailableHandler(void(*handleReceiveTimestampAvailable)(void))DW1000Classinlinestatic
    attachSentHandler(void(*handleSent)(void))DW1000Classinlinestatic
    AUTO_CLOCKDW1000Classstatic
    begin(uint8_t irq, uint8_t rst=0xff)DW1000Classstatic
    BIAS_500_16DW1000Classstatic
    BIAS_500_16_ZERODW1000Classstatic
    BIAS_500_64DW1000Classstatic
    BIAS_500_64_ZERODW1000Classstatic
    BIAS_900_16DW1000Classstatic
    BIAS_900_16_ZERODW1000Classstatic
    BIAS_900_64DW1000Classstatic
    BIAS_900_64_ZERODW1000Classstatic
    CHANNEL_1DW1000Classstatic
    CHANNEL_2DW1000Classstatic
    CHANNEL_3DW1000Classstatic
    CHANNEL_4DW1000Classstatic
    CHANNEL_5DW1000Classstatic
    CHANNEL_7DW1000Classstatic
    clearAllStatus()DW1000Classstatic
    clearInterrupts()DW1000Classstatic
    clearReceiveStatus()DW1000Classstatic
    clearReceiveTimestampAvailableStatus()DW1000Classstatic
    clearTransmitStatus()DW1000Classstatic
    commitConfiguration()DW1000Classstatic
    convertToByte(char string[], byte *eui_byte)DW1000Classstatic
    correctTimestamp(DW1000Time &timestamp)DW1000Classstatic
    enableClock(byte clock)DW1000Classstatic
    enableMode(const byte mode[])DW1000Classstatic
    end()DW1000Classstatic
    FRAME_LENGTH_EXTENDEDDW1000Classstatic
    FRAME_LENGTH_NORMALDW1000Classstatic
    getBit(byte data[], uint16_t n, uint16_t bit)DW1000Classstatic
    getData(byte data[], uint16_t n)DW1000Classstatic
    getData(String &data)DW1000Classstatic
    getDataLength()DW1000Classstatic
    getFirstPathPower()DW1000Classstatic
    getPrettyBytes(byte cmd, uint16_t offset, char msgBuffer[], uint16_t n)DW1000Classstatic
    getPrettyBytes(byte data[], char msgBuffer[], uint16_t n)DW1000Classstatic
    getPrintableDeviceIdentifier(char msgBuffer[])DW1000Classstatic
    getPrintableDeviceMode(char msgBuffer[])DW1000Classstatic
    getPrintableExtendedUniqueIdentifier(char msgBuffer[])DW1000Classstatic
    getPrintableNetworkIdAndShortAddress(char msgBuffer[])DW1000Classstatic
    getPulseFrequency()DW1000Classstatic
    getReceivePower()DW1000Classstatic
    getReceiveQuality()DW1000Classstatic
    getReceiveTimestamp(DW1000Time &time)DW1000Classstatic
    getReceiveTimestamp(byte data[])DW1000Classstatic
    getSystemTimestamp(DW1000Time &time)DW1000Classstatic
    getSystemTimestamp(byte data[])DW1000Classstatic
    getTempAndVbat(float &temp, float &vbat)DW1000Classstatic
    getTransmitTimestamp(DW1000Time &time)DW1000Classstatic
    getTransmitTimestamp(byte data[])DW1000Classstatic
    handleInterrupt()DW1000Classstatic
    idle()DW1000Classstatic
    interruptOnAutomaticAcknowledgeTrigger(boolean val)DW1000Classstatic
    interruptOnReceived(boolean val)DW1000Classstatic
    interruptOnReceiveFailed(boolean val)DW1000Classstatic
    interruptOnReceiveTimeout(boolean val)DW1000Classstatic
    interruptOnReceiveTimestampAvailable(boolean val)DW1000Classstatic
    interruptOnSent(boolean val)DW1000Classstatic
    isClockProblem()DW1000Classstatic
    isReceiveDone()DW1000Classstatic
    isReceiveFailed()DW1000Classstatic
    isReceiveTimeout()DW1000Classstatic
    isReceiveTimestampAvailable()DW1000Classstatic
    isTransmitDone()DW1000Classstatic
    manageLDE()DW1000Classstatic
    MODE_LONGDATA_FAST_ACCURACYDW1000Classstatic
    MODE_LONGDATA_FAST_LOWPOWERDW1000Classstatic
    MODE_LONGDATA_RANGE_ACCURACYDW1000Classstatic
    MODE_LONGDATA_RANGE_LOWPOWERDW1000Classstatic
    MODE_SHORTDATA_FAST_ACCURACYDW1000Classstatic
    MODE_SHORTDATA_FAST_LOWPOWERDW1000Classstatic
    newConfiguration()DW1000Classstatic
    newReceive()DW1000Classstatic
    newTransmit()DW1000Classstatic
    nibbleFromChar(char c)DW1000Classstatic
    PAC_SIZE_16DW1000Classstatic
    PAC_SIZE_32DW1000Classstatic
    PAC_SIZE_64DW1000Classstatic
    PAC_SIZE_8DW1000Classstatic
    PLL_CLOCKDW1000Classstatic
    PREAMBLE_CODE_16MHZ_1DW1000Classstatic
    PREAMBLE_CODE_16MHZ_2DW1000Classstatic
    PREAMBLE_CODE_16MHZ_3DW1000Classstatic
    PREAMBLE_CODE_16MHZ_4DW1000Classstatic
    PREAMBLE_CODE_16MHZ_5DW1000Classstatic
    PREAMBLE_CODE_16MHZ_6DW1000Classstatic
    PREAMBLE_CODE_16MHZ_7DW1000Classstatic
    PREAMBLE_CODE_16MHZ_8DW1000Classstatic
    PREAMBLE_CODE_64MHZ_10DW1000Classstatic
    PREAMBLE_CODE_64MHZ_11DW1000Classstatic
    PREAMBLE_CODE_64MHZ_12DW1000Classstatic
    PREAMBLE_CODE_64MHZ_17DW1000Classstatic
    PREAMBLE_CODE_64MHZ_18DW1000Classstatic
    PREAMBLE_CODE_64MHZ_19DW1000Classstatic
    PREAMBLE_CODE_64MHZ_20DW1000Classstatic
    PREAMBLE_CODE_64MHZ_9DW1000Classstatic
    READDW1000Classstatic
    READ_SUBDW1000Classstatic
    readBytes(byte cmd, uint16_t offset, byte data[], uint16_t n)DW1000Classstatic
    readBytesOTP(uint16_t address, byte data[])DW1000Classstatic
    readChannelControlRegister()DW1000Classstatic
    readNetworkIdAndDeviceAddress()DW1000Classstatic
    readSystemConfigurationRegister()DW1000Classstatic
    readSystemEventMaskRegister()DW1000Classstatic
    readSystemEventStatusRegister()DW1000Classstatic
    readTransmitFrameControlRegister()DW1000Classstatic
    receivePermanently(boolean val)DW1000Classstatic
    reselect(uint8_t ss)DW1000Classstatic
    reset()DW1000Classstatic
    RW_SUB_EXTDW1000Classstatic
    select(uint8_t ss)DW1000Classstatic
    setBit(byte data[], uint16_t n, uint16_t bit, boolean val)DW1000Classstatic
    setChannel(byte channel)DW1000Classstatic
    setData(byte data[], uint16_t n)DW1000Classstatic
    setData(const String &data)DW1000Classstatic
    setDataRate(byte rate)DW1000Classstatic
    setDefaults()DW1000Classstatic
    setDelay(const DW1000Time &delay)DW1000Classstatic
    setDeviceAddress(uint16_t val)DW1000Classstatic
    setDoubleBuffering(boolean val)DW1000Classstatic
    setEUI(char eui[])DW1000Classstatic
    setEUI(byte eui[])DW1000Classstatic
    setFrameFilter(boolean val)DW1000Classstatic
    setFrameFilterAllowAcknowledgement(boolean val)DW1000Classstatic
    setFrameFilterAllowBeacon(boolean val)DW1000Classstatic
    setFrameFilterAllowData(boolean val)DW1000Classstatic
    setFrameFilterAllowMAC(boolean val)DW1000Classstatic
    setFrameFilterAllowReserved(boolean val)DW1000Classstatic
    setFrameFilterBehaveCoordinator(boolean val)DW1000Classstatic
    setInterruptPolarity(boolean val)DW1000Classstatic
    setNetworkId(uint16_t val)DW1000Classstatic
    setPreambleCode(byte preacode)DW1000Classstatic
    setPreambleLength(byte prealen)DW1000Classstatic
    setPulseFrequency(byte freq)DW1000Classstatic
    setReceiverAutoReenable(boolean val)DW1000Classstatic
    softReset()DW1000Classstatic
    startReceive()DW1000Classstatic
    startTransmit()DW1000Classstatic
    suppressFrameCheck(boolean val)DW1000Classstatic
    TRX_RATE_110KBPSDW1000Classstatic
    TRX_RATE_6800KBPSDW1000Classstatic
    TRX_RATE_850KBPSDW1000Classstatic
    tune()DW1000Classstatic
    TX_PREAMBLE_LEN_1024DW1000Classstatic
    TX_PREAMBLE_LEN_128DW1000Classstatic
    TX_PREAMBLE_LEN_1536DW1000Classstatic
    TX_PREAMBLE_LEN_2048DW1000Classstatic
    TX_PREAMBLE_LEN_256DW1000Classstatic
    TX_PREAMBLE_LEN_4096DW1000Classstatic
    TX_PREAMBLE_LEN_512DW1000Classstatic
    TX_PREAMBLE_LEN_64DW1000Classstatic
    TX_PULSE_FREQ_16MHZDW1000Classstatic
    TX_PULSE_FREQ_64MHZDW1000Classstatic
    useExtendedFrameLength(boolean val)DW1000Classstatic
    useSmartPower(boolean smartPower)DW1000Classstatic
    waitForResponse(boolean val)DW1000Classstatic
    WRITEDW1000Classstatic
    WRITE_SUBDW1000Classstatic
    writeByte(byte cmd, uint16_t offset, byte data)DW1000Classstatic
    writeBytes(byte cmd, uint16_t offset, byte data[], uint16_t n)DW1000Classstatic
    writeChannelControlRegister()DW1000Classstatic
    writeNetworkIdAndDeviceAddress()DW1000Classstatic
    writeSystemConfigurationRegister()DW1000Classstatic
    writeSystemEventMaskRegister()DW1000Classstatic
    writeTransmitFrameControlRegister()DW1000Classstatic
    writeValueToBytes(byte data[], int32_t val, uint16_t n)DW1000Classstatic
    XTI_CLOCKDW1000Classstatic
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000Class.html b/lib/DW1000/extras/doc/html/classDW1000Class.html new file mode 100644 index 0000000..a1c5b44 --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000Class.html @@ -0,0 +1,5354 @@ + + + + + + +Arduino driver library for Decawave DW1000: DW1000Class Class Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    + +
    + +

    #include <DW1000.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Static Public Member Functions

    static void begin (uint8_t irq, uint8_t rst=0xff)
     
    static void select (uint8_t ss)
     
    static void reselect (uint8_t ss)
     
    static void end ()
     
    static void reset ()
     
    static void softReset ()
     
    static void getPrintableDeviceIdentifier (char msgBuffer[])
     
    static void getPrintableExtendedUniqueIdentifier (char msgBuffer[])
     
    static void getPrintableNetworkIdAndShortAddress (char msgBuffer[])
     
    static void getPrintableDeviceMode (char msgBuffer[])
     
    static void setNetworkId (uint16_t val)
     
    static void setDeviceAddress (uint16_t val)
     
    static void setEUI (char eui[])
     
    static void setEUI (byte eui[])
     
    static void setReceiverAutoReenable (boolean val)
     
    static void setInterruptPolarity (boolean val)
     
    static void suppressFrameCheck (boolean val)
     
    static void setDataRate (byte rate)
     
    static void setPulseFrequency (byte freq)
     
    static byte getPulseFrequency ()
     
    static void setPreambleLength (byte prealen)
     
    static void setChannel (byte channel)
     
    static void setPreambleCode (byte preacode)
     
    static void useSmartPower (boolean smartPower)
     
    static DW1000Time setDelay (const DW1000Time &delay)
     
    static void receivePermanently (boolean val)
     
    static void setData (byte data[], uint16_t n)
     
    static void setData (const String &data)
     
    static void getData (byte data[], uint16_t n)
     
    static void getData (String &data)
     
    static uint16_t getDataLength ()
     
    static void getTransmitTimestamp (DW1000Time &time)
     
    static void getReceiveTimestamp (DW1000Time &time)
     
    static void getSystemTimestamp (DW1000Time &time)
     
    static void getTransmitTimestamp (byte data[])
     
    static void getReceiveTimestamp (byte data[])
     
    static void getSystemTimestamp (byte data[])
     
    static float getReceivePower ()
     
    static float getFirstPathPower ()
     
    static float getReceiveQuality ()
     
    static void interruptOnSent (boolean val)
     
    static void interruptOnReceived (boolean val)
     
    static void interruptOnReceiveFailed (boolean val)
     
    static void interruptOnReceiveTimeout (boolean val)
     
    static void interruptOnReceiveTimestampAvailable (boolean val)
     
    static void interruptOnAutomaticAcknowledgeTrigger (boolean val)
     
    static void attachErrorHandler (void(*handleError)(void))
     
    static void attachSentHandler (void(*handleSent)(void))
     
    static void attachReceivedHandler (void(*handleReceived)(void))
     
    static void attachReceiveFailedHandler (void(*handleReceiveFailed)(void))
     
    static void attachReceiveTimeoutHandler (void(*handleReceiveTimeout)(void))
     
    static void attachReceiveTimestampAvailableHandler (void(*handleReceiveTimestampAvailable)(void))
     
    static void idle ()
     
    static void newConfiguration ()
     
    static void commitConfiguration ()
     
    static void newReceive ()
     
    static void startReceive ()
     
    static void newTransmit ()
     
    static void startTransmit ()
     
    static void enableMode (const byte mode[])
     
    static void setDefaults ()
     
    static void getPrettyBytes (byte cmd, uint16_t offset, char msgBuffer[], uint16_t n)
     
    static void getPrettyBytes (byte data[], char msgBuffer[], uint16_t n)
     
    static uint8_t nibbleFromChar (char c)
     
    static void convertToByte (char string[], byte *eui_byte)
     
    static void getTempAndVbat (float &temp, float &vbat)
     
    static void handleInterrupt ()
     
    static void setFrameFilter (boolean val)
     
    static void setFrameFilterBehaveCoordinator (boolean val)
     
    static void setFrameFilterAllowBeacon (boolean val)
     
    static void setFrameFilterAllowData (boolean val)
     
    static void setFrameFilterAllowAcknowledgement (boolean val)
     
    static void setFrameFilterAllowMAC (boolean val)
     
    static void setFrameFilterAllowReserved (boolean val)
     
    static void setDoubleBuffering (boolean val)
     
    static void useExtendedFrameLength (boolean val)
     
    static void waitForResponse (boolean val)
     
    static void tune ()
     
    static boolean isReceiveTimestampAvailable ()
     
    static boolean isTransmitDone ()
     
    static boolean isReceiveDone ()
     
    static boolean isReceiveFailed ()
     
    static boolean isReceiveTimeout ()
     
    static boolean isClockProblem ()
     
    static void clearInterrupts ()
     
    static void clearAllStatus ()
     
    static void clearReceiveStatus ()
     
    static void clearReceiveTimestampAvailableStatus ()
     
    static void clearTransmitStatus ()
     
    static void readSystemEventStatusRegister ()
     
    static void readSystemConfigurationRegister ()
     
    static void writeSystemConfigurationRegister ()
     
    static void readNetworkIdAndDeviceAddress ()
     
    static void writeNetworkIdAndDeviceAddress ()
     
    static void readSystemEventMaskRegister ()
     
    static void writeSystemEventMaskRegister ()
     
    static void readChannelControlRegister ()
     
    static void writeChannelControlRegister ()
     
    static void readTransmitFrameControlRegister ()
     
    static void writeTransmitFrameControlRegister ()
     
    static void enableClock (byte clock)
     
    static void manageLDE ()
     
    static void correctTimestamp (DW1000Time &timestamp)
     
    static void readBytes (byte cmd, uint16_t offset, byte data[], uint16_t n)
     
    static void readBytesOTP (uint16_t address, byte data[])
     
    static void writeByte (byte cmd, uint16_t offset, byte data)
     
    static void writeBytes (byte cmd, uint16_t offset, byte data[], uint16_t n)
     
    static void writeValueToBytes (byte data[], int32_t val, uint16_t n)
     
    static boolean getBit (byte data[], uint16_t n, uint16_t bit)
     
    static void setBit (byte data[], uint16_t n, uint16_t bit, boolean val)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    static constexpr byte TRX_RATE_110KBPS = 0x00
     
    static constexpr byte TRX_RATE_850KBPS = 0x01
     
    static constexpr byte TRX_RATE_6800KBPS = 0x02
     
    static constexpr byte TX_PULSE_FREQ_16MHZ = 0x01
     
    static constexpr byte TX_PULSE_FREQ_64MHZ = 0x02
     
    static constexpr byte TX_PREAMBLE_LEN_64 = 0x01
     
    static constexpr byte TX_PREAMBLE_LEN_128 = 0x05
     
    static constexpr byte TX_PREAMBLE_LEN_256 = 0x09
     
    static constexpr byte TX_PREAMBLE_LEN_512 = 0x0D
     
    static constexpr byte TX_PREAMBLE_LEN_1024 = 0x02
     
    static constexpr byte TX_PREAMBLE_LEN_1536 = 0x06
     
    static constexpr byte TX_PREAMBLE_LEN_2048 = 0x0A
     
    static constexpr byte TX_PREAMBLE_LEN_4096 = 0x03
     
    static constexpr byte PAC_SIZE_8 = 8
     
    static constexpr byte PAC_SIZE_16 = 16
     
    static constexpr byte PAC_SIZE_32 = 32
     
    static constexpr byte PAC_SIZE_64 = 64
     
    static constexpr byte CHANNEL_1 = 1
     
    static constexpr byte CHANNEL_2 = 2
     
    static constexpr byte CHANNEL_3 = 3
     
    static constexpr byte CHANNEL_4 = 4
     
    static constexpr byte CHANNEL_5 = 5
     
    static constexpr byte CHANNEL_7 = 7
     
    static constexpr byte PREAMBLE_CODE_16MHZ_1 = 1
     
    static constexpr byte PREAMBLE_CODE_16MHZ_2 = 2
     
    static constexpr byte PREAMBLE_CODE_16MHZ_3 = 3
     
    static constexpr byte PREAMBLE_CODE_16MHZ_4 = 4
     
    static constexpr byte PREAMBLE_CODE_16MHZ_5 = 5
     
    static constexpr byte PREAMBLE_CODE_16MHZ_6 = 6
     
    static constexpr byte PREAMBLE_CODE_16MHZ_7 = 7
     
    static constexpr byte PREAMBLE_CODE_16MHZ_8 = 8
     
    static constexpr byte PREAMBLE_CODE_64MHZ_9 = 9
     
    static constexpr byte PREAMBLE_CODE_64MHZ_10 = 10
     
    static constexpr byte PREAMBLE_CODE_64MHZ_11 = 11
     
    static constexpr byte PREAMBLE_CODE_64MHZ_12 = 12
     
    static constexpr byte PREAMBLE_CODE_64MHZ_17 = 17
     
    static constexpr byte PREAMBLE_CODE_64MHZ_18 = 18
     
    static constexpr byte PREAMBLE_CODE_64MHZ_19 = 19
     
    static constexpr byte PREAMBLE_CODE_64MHZ_20 = 20
     
    static constexpr byte FRAME_LENGTH_NORMAL = 0x00
     
    static constexpr byte FRAME_LENGTH_EXTENDED = 0x03
     
    static constexpr byte MODE_LONGDATA_RANGE_LOWPOWER [] = {TRX_RATE_110KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_2048}
     
    static constexpr byte MODE_SHORTDATA_FAST_LOWPOWER [] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_128}
     
    static constexpr byte MODE_LONGDATA_FAST_LOWPOWER [] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_1024}
     
    static constexpr byte MODE_SHORTDATA_FAST_ACCURACY [] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_128}
     
    static constexpr byte MODE_LONGDATA_FAST_ACCURACY [] = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_1024}
     
    static constexpr byte MODE_LONGDATA_RANGE_ACCURACY [] = {TRX_RATE_110KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_2048}
     
    static uint8_t _ss
     
    static uint8_t _rst
     
    static uint8_t _irq
     
    static void(* _handleError )(void)
     
    static void(* _handleSent )(void)
     
    static void(* _handleReceived )(void)
     
    static void(* _handleReceiveFailed )(void)
     
    static void(* _handleReceiveTimeout )(void)
     
    static void(* _handleReceiveTimestampAvailable )(void)
     
    static byte _syscfg [LEN_SYS_CFG]
     
    static byte _sysctrl [LEN_SYS_CTRL]
     
    static byte _sysstatus [LEN_SYS_STATUS]
     
    static byte _txfctrl [LEN_TX_FCTRL]
     
    static byte _sysmask [LEN_SYS_MASK]
     
    static byte _chanctrl [LEN_CHAN_CTRL]
     
    static byte _vmeas3v3 = 0
     
    static byte _tmeas23C = 0
     
    static byte _networkAndAddress [LEN_PANADR]
     
    static boolean _smartPower = false
     
    static byte _extendedFrameLength = FRAME_LENGTH_NORMAL
     
    static byte _preambleCode = PREAMBLE_CODE_16MHZ_4
     
    static byte _channel = CHANNEL_5
     
    static byte _preambleLength = TX_PREAMBLE_LEN_128
     
    static byte _pulseFrequency = TX_PULSE_FREQ_16MHZ
     
    static byte _dataRate = TRX_RATE_6800KBPS
     
    static byte _pacSize = PAC_SIZE_8
     
    static DW1000Time _antennaDelay
     
    static boolean _permanentReceive = false
     
    static boolean _frameCheck = true
     
    static uint8_t _deviceMode = IDLE_MODE
     
    static const byte WRITE = 0x80
     
    static const byte WRITE_SUB = 0xC0
     
    static const byte READ = 0x00
     
    static const byte READ_SUB = 0x40
     
    static const byte RW_SUB_EXT = 0x80
     
    static const byte AUTO_CLOCK = 0x00
     
    static const byte XTI_CLOCK = 0x01
     
    static const byte PLL_CLOCK = 0x02
     
    static const SPISettings _fastSPI = SPISettings(16000000L, MSBFIRST, SPI_MODE0)
     
    static const SPISettings _slowSPI = SPISettings(2000000L, MSBFIRST, SPI_MODE0)
     
    static const SPISettings * _currentSPI = &_fastSPI
     
    static const byte BIAS_500_16_ZERO = 10
     
    static const byte BIAS_500_64_ZERO = 8
     
    static const byte BIAS_900_16_ZERO = 7
     
    static const byte BIAS_900_64_ZERO = 7
     
    static constexpr byte BIAS_500_16 [] = {198, 187, 179, 163, 143, 127, 109, 84, 59, 31, 0, 36, 65, 84, 97, 106, 110, 112}
     
    static constexpr byte BIAS_500_64 [] = {110, 105, 100, 93, 82, 69, 51, 27, 0, 21, 35, 42, 49, 62, 71, 76, 81, 86}
     
    static constexpr byte BIAS_900_16 [] = {137, 122, 105, 88, 69, 47, 25, 0, 21, 48, 79, 105, 127, 147, 160, 169, 178, 197}
     
    static constexpr byte BIAS_900_64 [] = {147, 133, 117, 99, 75, 50, 29, 0, 24, 45, 63, 76, 87, 98, 116, 122, 132, 142}
     
    +

    Member Function Documentation

    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000Class::attachErrorHandler (void(*)(void) handleError)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000Class::attachReceivedHandler (void(*)(void) handleReceived)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000Class::attachReceiveFailedHandler (void(*)(void) handleReceiveFailed)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000Class::attachReceiveTimeoutHandler (void(*)(void) handleReceiveTimeout)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000Class::attachReceiveTimestampAvailableHandler (void(*)(void) handleReceiveTimestampAvailable)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000Class::attachSentHandler (void(*)(void) handleSent)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Class::begin (uint8_t irq,
    uint8_t rst = 0xff 
    )
    +
    +static
    +
    +

    Initiates and starts a sessions with one or more DW1000. If rst is not set or value 0xff, a soft resets (i.e. command triggered) are used and it is assumed that no reset line is wired.

    +
    Parameters
    + + + +
    [in]irqThe interrupt line/pin that connects the Arduino.
    [in]rstThe reset line/pin for hard resets of ICs that connect to the Arduino. Value 0xff means soft reset.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::clearAllStatus ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::clearInterrupts ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::clearReceiveStatus ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::clearReceiveTimestampAvailableStatus ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::clearTransmitStatus ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::commitConfiguration ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Class::convertToByte (char string[],
    byte * eui_byte 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::correctTimestamp (DW1000Timetimestamp)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::enableClock (byte clock)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::enableMode (const byte mode[])
    +
    +static
    +
    +

    Specifies the mode of operation for the DW1000. Modes of operation are pre-defined combinations of data rate, pulse repetition frequency, preamble and channel settings that properly go together. If you simply want the chips to work, choosing a mode is preferred over manual configuration.

    +

    The following modes are pre-configured and one of them needs to be chosen:

      +
    • MODE_LONGDATA_RANGE_LOWPOWER (basically this is 110 kb/s data rate, 16 MHz PRF and long preambles)
    • +
    • MODE_SHORTDATA_FAST_LOWPOWER (basically this is 6.8 Mb/s data rate, 16 MHz PRF and short preambles)
    • +
    • MODE_LONGDATA_FAST_LOWPOWER (basically this is 6.8 Mb/s data rate, 16 MHz PRF and long preambles)
    • +
    • MODE_SHORTDATA_FAST_ACCURACY (basically this is 6.8 Mb/s data rate, 64 MHz PRF and short preambles)
    • +
    • MODE_LONGDATA_FAST_ACCURACY (basically this is 6.8 Mb/s data rate, 64 MHz PRF and long preambles)
    • +
    • MODE_LONGDATA_RANGE_ACCURACY (basically this is 110 kb/s data rate, 64 MHz PRF and long preambles)
    • +
    +

    Note that LOWPOWER and ACCURACY refers to the better power efficiency and improved transmission performance of 16 MHZ and 64 MHZ PRF respectively (see setPulseFrequency()).

    +

    The default setting that is selected by setDefaults() is MODE_LONGDATA_RANGE_LOWPOWER.

    +
    Parameters
    + + +
    [in]modeThe mode of operation, encoded by the above defined constants.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::end ()
    +
    +static
    +
    +

    Tells the driver library that no communication to a DW1000 will be required anymore. This basically just frees SPI and the previously used pins.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    boolean DW1000Class::getBit (byte data[],
    uint16_t n,
    uint16_t bit 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Class::getData (byte data[],
    uint16_t n 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getData (String & data)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    uint16_t DW1000Class::getDataLength ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    float DW1000Class::getFirstPathPower ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Class::getPrettyBytes (byte cmd,
    uint16_t offset,
    char msgBuffer[],
    uint16_t n 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Class::getPrettyBytes (byte data[],
    char msgBuffer[],
    uint16_t n 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getPrintableDeviceIdentifier (char msgBuffer[])
    +
    +static
    +
    +

    Generates a String representation of the device identifier of the chip. That usually are the letters "DECA" plus the version and revision numbers of the chip.

    +
    Parameters
    + + +
    [out]msgBufferThe String buffer to be filled with printable device information. Provide 128 bytes, this should be sufficient.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getPrintableDeviceMode (char msgBuffer[])
    +
    +static
    +
    +

    Generates a String representation of the main operational settings of the chip. This includes data rate, pulse repetition frequency, preamble and channel settings.

    +
    Parameters
    + + +
    [out]msgBufferThe String buffer to be filled with printable device information. Provide 128 bytes, this should be sufficient.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getPrintableExtendedUniqueIdentifier (char msgBuffer[])
    +
    +static
    +
    +

    Generates a String representation of the extended unique identifier (EUI) of the chip.

    +
    Parameters
    + + +
    [out]msgBufferThe String buffer to be filled with printable device information. Provide 128 bytes, this should be sufficient.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getPrintableNetworkIdAndShortAddress (char msgBuffer[])
    +
    +static
    +
    +

    Generates a String representation of the short address and network identifier currently defined for the respective chip.

    +
    Parameters
    + + +
    [out]msgBufferThe String buffer to be filled with printable device information. Provide 128 bytes, this should be sufficient.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    byte DW1000Class::getPulseFrequency ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    float DW1000Class::getReceivePower ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    float DW1000Class::getReceiveQuality ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getReceiveTimestamp (DW1000Timetime)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getReceiveTimestamp (byte data[])
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getSystemTimestamp (DW1000Timetime)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getSystemTimestamp (byte data[])
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Class::getTempAndVbat (float & temp,
    float & vbat 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getTransmitTimestamp (DW1000Timetime)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::getTransmitTimestamp (byte data[])
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::handleInterrupt ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::idle ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::interruptOnAutomaticAcknowledgeTrigger (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::interruptOnReceived (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::interruptOnReceiveFailed (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::interruptOnReceiveTimeout (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::interruptOnReceiveTimestampAvailable (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::interruptOnSent (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    boolean DW1000Class::isClockProblem ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    boolean DW1000Class::isReceiveDone ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    boolean DW1000Class::isReceiveFailed ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    boolean DW1000Class::isReceiveTimeout ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    boolean DW1000Class::isReceiveTimestampAvailable ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    boolean DW1000Class::isTransmitDone ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::manageLDE ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::newConfiguration ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::newReceive ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::newTransmit ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    uint8_t DW1000Class::nibbleFromChar (char c)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Class::readBytes (byte cmd,
    uint16_t offset,
    byte data[],
    uint16_t n 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Class::readBytesOTP (uint16_t address,
    byte data[] 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::readChannelControlRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::readNetworkIdAndDeviceAddress ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::readSystemConfigurationRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::readSystemEventMaskRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::readSystemEventStatusRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::readTransmitFrameControlRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::receivePermanently (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::reselect (uint8_t ss)
    +
    +static
    +
    +

    (Re-)selects a specific DW1000 chip for communication. In case of a single DW1000 chip in use this call is not needed; only a call to select() has to be performed once at start up. Other than a call to select() this function does not perform an initial setup of the (again-)selected chips and assumes it to have a valid configuration loaded.

    +
    Parameters
    + + +
    [in]ssThe chip select line/pin that connects the to-be-selected chip with the Arduino.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::reset ()
    +
    +static
    +
    +

    Resets all connected or the currently selected DW1000 chip. A hard reset of all chips is preferred, although a soft reset of the currently selected one is executed if no reset pin has been specified (when using begin(int), instead of begin(int, int)).

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::select (uint8_t ss)
    +
    +static
    +
    +

    Selects a specific DW1000 chip for communication. In case of a single DW1000 chip in use this call only needs to be done once at start up, but is still mandatory. Other than a call to reselect() this function performs an initial setup of the now-selected chip.

    +
    Parameters
    + + +
    [in]ssThe chip select line/pin that connects the to-be-selected chip with the Arduino.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Class::setBit (byte data[],
    uint16_t n,
    uint16_t bit,
    boolean val 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setChannel (byte channel)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Class::setData (byte data[],
    uint16_t n 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setData (const String & data)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setDataRate (byte rate)
    +
    +static
    +
    +

    Specifies the data transmission rate of the DW1000 chip. One of the values

      +
    • TRX_RATE_110KBPS (i.e. 110 kb/s)
    • +
    • TRX_RATE_850KBPS (i.e. 850 kb/s)
    • +
    • TRX_RATE_6800KBPS (i.e. 6.8 Mb/s) has to be provided.
    • +
    +

    See setDefaults() and enableMode() for additional information on data rate settings.

    +
    Parameters
    + + +
    [in]rateThe data transmission rate, encoded by the above defined constants.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::setDefaults ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    DW1000Time DW1000Class::setDelay (const DW1000Timedelay)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setDeviceAddress (uint16_t val)
    +
    +static
    +
    +

    (Re-)set the device address (i.e. short address) for the currently selected chip. This setting is important for certain MAC address filtering rules.

    +
    Parameters
    + + +
    [in]valAn arbitrary numeric device address.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setDoubleBuffering (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setEUI (char eui[])
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setEUI (byte eui[])
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setFrameFilter (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setFrameFilterAllowAcknowledgement (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setFrameFilterAllowBeacon (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setFrameFilterAllowData (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setFrameFilterAllowMAC (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setFrameFilterAllowReserved (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setFrameFilterBehaveCoordinator (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setInterruptPolarity (boolean val)
    +
    +static
    +
    +

    Specifies the interrupt polarity of the DW1000 chip.

    +

    As part of setDefaults() if the device is in idle mode, interrupt polarity is set to active high.

    +
    Parameters
    + + +
    [in]valtrue for active high interrupts, false for active low interrupts.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setNetworkId (uint16_t val)
    +
    +static
    +
    +

    (Re-)set the network identifier which the selected chip should be associated with. This setting is important for certain MAC address filtering rules.

    +
    Parameters
    + + +
    [in]valAn arbitrary numeric network identifier.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setPreambleCode (byte preacode)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setPreambleLength (byte prealen)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setPulseFrequency (byte freq)
    +
    +static
    +
    +

    Specifies the pulse repetition frequency (PRF) of data transmissions with the DW1000. Either

      +
    • TX_PULSE_FREQ_16MHZ (i.e. 16 MHz)
    • +
    • TX_PULSE_FREQ_64MHZ (i.e. 64 MHz) has to be chosen.
    • +
    +

    Note that the 16 MHz setting is more power efficient, while the 64 MHz setting requires more power, but also delivers slightly better transmission performance (i.e. on communication range and timestamp accuracy) (see DWM1000 User Manual, section 9.3).

    +

    See setDefaults() and enableMode() for additional information on PRF settings.

    +
    Parameters
    + + +
    [in]freqThe PRF, encoded by the above defined constants.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::setReceiverAutoReenable (boolean val)
    +
    +static
    +
    +

    Specifies whether the DW1000 chip should, again, turn on its receiver in case that the last reception failed.

    +

    This setting is enabled as part of setDefaults() if the device is in idle mode.

    +
    Parameters
    + + +
    [in]valtrue to enable, false to disable receiver auto-reenable.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::softReset ()
    +
    +static
    +
    +

    Resets the currently selected DW1000 chip programmatically (via corresponding commands).

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::startReceive ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::startTransmit ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::suppressFrameCheck (boolean val)
    +
    +static
    +
    +

    Specifies whether to suppress any frame check measures while sending or receiving messages. If suppressed, no 2-byte checksum is appended to the message before sending and this checksum is also not expected at receiver side. Note that when suppressing frame checks, the error event handler (attached via attachReceiveErrorHandler()) will not be triggered if received data is corrupted.

    +

    Frame checks are enabled as part of setDefaults() if the device is in idle mode.

    +
    Parameters
    + + +
    [in]valtrue to suppress frame check on sender and receiver side, false otherwise.
    +
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::tune ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::useExtendedFrameLength (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::useSmartPower (boolean smartPower)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Class::waitForResponse (boolean val)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Class::writeByte (byte cmd,
    uint16_t offset,
    byte data 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Class::writeBytes (byte cmd,
    uint16_t offset,
    byte data[],
    uint16_t n 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::writeChannelControlRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::writeNetworkIdAndDeviceAddress ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::writeSystemConfigurationRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::writeSystemEventMaskRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000Class::writeTransmitFrameControlRegister ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Class::writeValueToBytes (byte data[],
    int32_t val,
    uint16_t n 
    )
    +
    +static
    +
    + +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + + +
    + + + + +
    DW1000Time DW1000Class::_antennaDelay
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_chanctrl
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_channel = CHANNEL_5
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const SPISettings * DW1000Class::_currentSPI = &_fastSPI
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_dataRate = TRX_RATE_6800KBPS
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    uint8_t DW1000Class::_deviceMode = IDLE_MODE
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_extendedFrameLength = FRAME_LENGTH_NORMAL
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const SPISettings DW1000Class::_fastSPI = SPISettings(16000000L, MSBFIRST, SPI_MODE0)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    boolean DW1000Class::_frameCheck = true
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    void(* DW1000Class::_handleError)(void)=0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    void(* DW1000Class::_handleReceived)(void)=0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    void(* DW1000Class::_handleReceiveFailed)(void)=0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    void(* DW1000Class::_handleReceiveTimeout)(void)=0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    void(* DW1000Class::_handleReceiveTimestampAvailable)(void)=0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    void(* DW1000Class::_handleSent)(void)=0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    uint8_t DW1000Class::_irq
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_networkAndAddress
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_pacSize = PAC_SIZE_8
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    boolean DW1000Class::_permanentReceive = false
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_preambleCode = PREAMBLE_CODE_16MHZ_4
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_preambleLength = TX_PREAMBLE_LEN_128
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_pulseFrequency = TX_PULSE_FREQ_16MHZ
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    uint8_t DW1000Class::_rst
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const SPISettings DW1000Class::_slowSPI = SPISettings(2000000L, MSBFIRST, SPI_MODE0)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    boolean DW1000Class::_smartPower = false
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    uint8_t DW1000Class::_ss
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_syscfg
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_sysctrl
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_sysmask
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_sysstatus
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_tmeas23C = 0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_txfctrl
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    byte DW1000Class::_vmeas3v3 = 0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::AUTO_CLOCK = 0x00
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::BIAS_500_16 = {198, 187, 179, 163, 143, 127, 109, 84, 59, 31, 0, 36, 65, 84, 97, 106, 110, 112}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::BIAS_500_16_ZERO = 10
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::BIAS_500_64 = {110, 105, 100, 93, 82, 69, 51, 27, 0, 21, 35, 42, 49, 62, 71, 76, 81, 86}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::BIAS_500_64_ZERO = 8
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::BIAS_900_16 = {137, 122, 105, 88, 69, 47, 25, 0, 21, 48, 79, 105, 127, 147, 160, 169, 178, 197}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::BIAS_900_16_ZERO = 7
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::BIAS_900_64 = {147, 133, 117, 99, 75, 50, 29, 0, 24, 45, 63, 76, 87, 98, 116, 122, 132, 142}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::BIAS_900_64_ZERO = 7
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::CHANNEL_1 = 1
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::CHANNEL_2 = 2
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::CHANNEL_3 = 3
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::CHANNEL_4 = 4
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::CHANNEL_5 = 5
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::CHANNEL_7 = 7
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::FRAME_LENGTH_EXTENDED = 0x03
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::FRAME_LENGTH_NORMAL = 0x00
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::MODE_LONGDATA_FAST_ACCURACY = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_1024}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::MODE_LONGDATA_FAST_LOWPOWER = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_1024}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::MODE_LONGDATA_RANGE_ACCURACY = {TRX_RATE_110KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_2048}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::MODE_LONGDATA_RANGE_LOWPOWER = {TRX_RATE_110KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_2048}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::MODE_SHORTDATA_FAST_ACCURACY = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_64MHZ, TX_PREAMBLE_LEN_128}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::MODE_SHORTDATA_FAST_LOWPOWER = {TRX_RATE_6800KBPS, TX_PULSE_FREQ_16MHZ, TX_PREAMBLE_LEN_128}
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PAC_SIZE_16 = 16
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PAC_SIZE_32 = 32
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PAC_SIZE_64 = 64
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PAC_SIZE_8 = 8
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::PLL_CLOCK = 0x02
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_1 = 1
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_2 = 2
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_3 = 3
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_4 = 4
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_5 = 5
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_6 = 6
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_7 = 7
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_16MHZ_8 = 8
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_10 = 10
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_11 = 11
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_12 = 12
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_17 = 17
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_18 = 18
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_19 = 19
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_20 = 20
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::PREAMBLE_CODE_64MHZ_9 = 9
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::READ = 0x00
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::READ_SUB = 0x40
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::RW_SUB_EXT = 0x80
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TRX_RATE_110KBPS = 0x00
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TRX_RATE_6800KBPS = 0x02
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TRX_RATE_850KBPS = 0x01
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_1024 = 0x02
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_128 = 0x05
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_1536 = 0x06
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_2048 = 0x0A
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_256 = 0x09
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_4096 = 0x03
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_512 = 0x0D
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PREAMBLE_LEN_64 = 0x01
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PULSE_FREQ_16MHZ = 0x01
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr byte DW1000Class::TX_PULSE_FREQ_64MHZ = 0x02
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::WRITE = 0x80
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::WRITE_SUB = 0xC0
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    const byte DW1000Class::XTI_CLOCK = 0x01
    +
    +static
    +
    + +
    +
    +
    The documentation for this class was generated from the following files:
      +
    • /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000.h
    • +
    • /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000.cpp
    • +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000Device-members.html b/lib/DW1000/extras/doc/html/classDW1000Device-members.html new file mode 100644 index 0000000..7f324fa --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000Device-members.html @@ -0,0 +1,96 @@ + + + + + + +Arduino driver library for Decawave DW1000: Member List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    DW1000Device Member List
    +
    + + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000Device.html b/lib/DW1000/extras/doc/html/classDW1000Device.html new file mode 100644 index 0000000..286c82a --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000Device.html @@ -0,0 +1,689 @@ + + + + + + +Arduino driver library for Decawave DW1000: DW1000Device Class Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    + +
    +
    DW1000Device Class Reference
    +
    +
    + +

    #include <DW1000Device.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

     DW1000Device ()
     
     DW1000Device (byte address[], byte shortAddress[])
     
     DW1000Device (byte address[], boolean shortOne=false)
     
     ~DW1000Device ()
     
    void setReplyTime (uint16_t replyDelayTimeUs)
     
    void setAddress (char address[])
     
    void setAddress (byte *address)
     
    void setShortAddress (byte address[])
     
    void setRange (float range)
     
    void setRXPower (float power)
     
    void setFPPower (float power)
     
    void setQuality (float quality)
     
    void setReplyDelayTime (int16_t time)
     
    void setIndex (int8_t index)
     
    uint16_t getReplyTime ()
     
    byte * getByteAddress ()
     
    int8_t getIndex ()
     
    byte * getByteShortAddress ()
     
    uint16_t getShortAddress ()
     
    float getRange ()
     
    float getRXPower ()
     
    float getFPPower ()
     
    float getQuality ()
     
    boolean isAddressEqual (DW1000Device *device)
     
    boolean isShortAddressEqual (DW1000Device *device)
     
    void noteActivity ()
     
    boolean isInactive ()
     
    + + + + + + + + + + + + + +

    +Public Attributes

    DW1000Time timePollSent
     
    DW1000Time timePollReceived
     
    DW1000Time timePollAckSent
     
    DW1000Time timePollAckReceived
     
    DW1000Time timeRangeSent
     
    DW1000Time timeRangeReceived
     
    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + +
    DW1000Device::DW1000Device ()
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    DW1000Device::DW1000Device (byte address[],
    byte shortAddress[] 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    DW1000Device::DW1000Device (byte address[],
    boolean shortOne = false 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + +
    DW1000Device::~DW1000Device ()
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    byte * DW1000Device::getByteAddress ()
    +
    + +
    +
    + +
    +
    + + + + + + + +
    byte * DW1000Device::getByteShortAddress ()
    +
    + +
    +
    + +
    +
    + + + + + + + +
    float DW1000Device::getFPPower ()
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    int8_t DW1000Device::getIndex ()
    +
    +inline
    +
    + +
    +
    + +
    +
    + + + + + + + +
    float DW1000Device::getQuality ()
    +
    + +
    +
    + +
    +
    + + + + + + + +
    float DW1000Device::getRange ()
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    uint16_t DW1000Device::getReplyTime ()
    +
    +inline
    +
    + +
    +
    + +
    +
    + + + + + + + +
    float DW1000Device::getRXPower ()
    +
    + +
    +
    + +
    +
    + + + + + + + +
    uint16_t DW1000Device::getShortAddress ()
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    boolean DW1000Device::isAddressEqual (DW1000Devicedevice)
    +
    + +
    +
    + +
    +
    + + + + + + + +
    boolean DW1000Device::isInactive ()
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    boolean DW1000Device::isShortAddressEqual (DW1000Devicedevice)
    +
    + +
    +
    + +
    +
    + + + + + + + +
    void DW1000Device::noteActivity ()
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setAddress (char address[])
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setAddress (byte * address)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setFPPower (float power)
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Device::setIndex (int8_t index)
    +
    +inline
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setQuality (float quality)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setRange (float range)
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000Device::setReplyDelayTime (int16_t time)
    +
    +inline
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setReplyTime (uint16_t replyDelayTimeUs)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setRXPower (float power)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Device::setShortAddress (byte address[])
    +
    + +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + +
    DW1000Time DW1000Device::timePollAckReceived
    +
    + +
    +
    + +
    +
    + + + + +
    DW1000Time DW1000Device::timePollAckSent
    +
    + +
    +
    + +
    +
    + + + + +
    DW1000Time DW1000Device::timePollReceived
    +
    + +
    +
    + +
    +
    + + + + +
    DW1000Time DW1000Device::timePollSent
    +
    + +
    +
    + +
    +
    + + + + +
    DW1000Time DW1000Device::timeRangeReceived
    +
    + +
    +
    + +
    +
    + + + + +
    DW1000Time DW1000Device::timeRangeSent
    +
    + +
    +
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000Mac-members.html b/lib/DW1000/extras/doc/html/classDW1000Mac-members.html new file mode 100644 index 0000000..2f9b1dd --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000Mac-members.html @@ -0,0 +1,77 @@ + + + + + + +Arduino driver library for Decawave DW1000: Member List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    DW1000Mac Member List
    +
    +
    + +

    This is the complete list of members for DW1000Mac, including all inherited members.

    + + + + + + + + + + + + + + + +
    decodeBlinkFrame(byte frame[], byte address[], byte shortAddress[])DW1000Mac
    decodeLongMACFrame(byte frame[], byte address[])DW1000Mac
    decodeShortMACFrame(byte frame[], byte address[])DW1000Mac
    DW1000Mac(DW1000Device *parent)DW1000Mac
    DW1000Mac()DW1000Mac
    generateBlinkFrame(byte frame[], byte sourceAddress[], byte sourceShortAddress[])DW1000Mac
    generateLongMACFrame(byte frame[], byte sourceShortAddress[], byte destinationAddress[])DW1000Mac
    generateShortMACFrame(byte frame[], byte sourceShortAddress[], byte destinationShortAddress[])DW1000Mac
    incrementSeqNumber()DW1000Mac
    setDestinationAddress(byte *destinationAddress)DW1000Mac
    setDestinationAddressShort(byte *shortDestinationAddress)DW1000Mac
    setSourceAddress(byte *sourceAddress)DW1000Mac
    setSourceAddressShort(byte *shortSourceAddress)DW1000Mac
    ~DW1000Mac()DW1000Mac
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000Mac.html b/lib/DW1000/extras/doc/html/classDW1000Mac.html new file mode 100644 index 0000000..4a9c181 --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000Mac.html @@ -0,0 +1,408 @@ + + + + + + +Arduino driver library for Decawave DW1000: DW1000Mac Class Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    + +
    +
    DW1000Mac Class Reference
    +
    +
    + +

    #include <DW1000Mac.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

     DW1000Mac (DW1000Device *parent)
     
     DW1000Mac ()
     
     ~DW1000Mac ()
     
    void setDestinationAddress (byte *destinationAddress)
     
    void setDestinationAddressShort (byte *shortDestinationAddress)
     
    void setSourceAddress (byte *sourceAddress)
     
    void setSourceAddressShort (byte *shortSourceAddress)
     
    void generateBlinkFrame (byte frame[], byte sourceAddress[], byte sourceShortAddress[])
     
    void generateShortMACFrame (byte frame[], byte sourceShortAddress[], byte destinationShortAddress[])
     
    void generateLongMACFrame (byte frame[], byte sourceShortAddress[], byte destinationAddress[])
     
    void decodeBlinkFrame (byte frame[], byte address[], byte shortAddress[])
     
    void decodeShortMACFrame (byte frame[], byte address[])
     
    void decodeLongMACFrame (byte frame[], byte address[])
     
    void incrementSeqNumber ()
     
    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    DW1000Mac::DW1000Mac (DW1000Deviceparent)
    +
    + +
    +
    + +
    +
    + + + + + + + +
    DW1000Mac::DW1000Mac ()
    +
    + +
    +
    + +
    +
    + + + + + + + +
    DW1000Mac::~DW1000Mac ()
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Mac::decodeBlinkFrame (byte frame[],
    byte address[],
    byte shortAddress[] 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Mac::decodeLongMACFrame (byte frame[],
    byte address[] 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Mac::decodeShortMACFrame (byte frame[],
    byte address[] 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Mac::generateBlinkFrame (byte frame[],
    byte sourceAddress[],
    byte sourceShortAddress[] 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Mac::generateLongMACFrame (byte frame[],
    byte sourceShortAddress[],
    byte destinationAddress[] 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000Mac::generateShortMACFrame (byte frame[],
    byte sourceShortAddress[],
    byte destinationShortAddress[] 
    )
    +
    + +
    +
    + +
    +
    + + + + + + + +
    void DW1000Mac::incrementSeqNumber ()
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Mac::setDestinationAddress (byte * destinationAddress)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Mac::setDestinationAddressShort (byte * shortDestinationAddress)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Mac::setSourceAddress (byte * sourceAddress)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Mac::setSourceAddressShort (byte * shortSourceAddress)
    +
    + +
    +
    +
    The documentation for this class was generated from the following files:
      +
    • /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Mac.h
    • +
    • /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Mac.cpp
    • +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000RangingClass-members.html b/lib/DW1000/extras/doc/html/classDW1000RangingClass-members.html new file mode 100644 index 0000000..06f8775 --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000RangingClass-members.html @@ -0,0 +1,88 @@ + + + + + + +Arduino driver library for Decawave DW1000: Member List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    DW1000RangingClass Member List
    +
    +
    + +

    This is the complete list of members for DW1000RangingClass, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    addNetworkDevices(DW1000Device *device, boolean shortAddress)DW1000RangingClassstatic
    addNetworkDevices(DW1000Device *device)DW1000RangingClassstatic
    attachBlinkDevice(void(*handleBlinkDevice)(DW1000Device *))DW1000RangingClassinlinestatic
    attachInactiveDevice(void(*handleInactiveDevice)(DW1000Device *))DW1000RangingClassinlinestatic
    attachNewDevice(void(*handleNewDevice)(DW1000Device *))DW1000RangingClassinlinestatic
    attachNewRange(void(*handleNewRange)(void))DW1000RangingClassinlinestatic
    configureNetwork(uint16_t deviceAddress, uint16_t networkId, const byte mode[])DW1000RangingClassstatic
    dataDW1000RangingClassstatic
    detectMessageType(byte datas[])DW1000RangingClassstatic
    generalStart()DW1000RangingClassstatic
    getCurrentAddress()DW1000RangingClassinlinestatic
    getCurrentShortAddress()DW1000RangingClassinlinestatic
    getDistantDevice()DW1000RangingClassstatic
    getNetworkDevicesNumber()DW1000RangingClassinlinestatic
    initCommunication(uint8_t myRST=DEFAULT_RST_PIN, uint8_t mySS=DEFAULT_SPI_SS_PIN, uint8_t myIRQ=2)DW1000RangingClassstatic
    loop()DW1000RangingClassstatic
    removeNetworkDevices(int16_t index)DW1000RangingClassstatic
    searchDistantDevice(byte shortAddress[])DW1000RangingClassstatic
    setRangeFilterValue(uint16_t newValue)DW1000RangingClassstatic
    setReplyTime(uint16_t replyDelayTimeUs)DW1000RangingClassstatic
    setResetPeriod(uint32_t resetPeriod)DW1000RangingClassstatic
    startAsAnchor(char address[], const byte mode[])DW1000RangingClassstatic
    startAsTag(char address[], const byte mode[])DW1000RangingClassstatic
    useRangeFilter(boolean enabled)DW1000RangingClassstatic
    visualizeDatas(byte datas[])DW1000RangingClassstatic
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000RangingClass.html b/lib/DW1000/extras/doc/html/classDW1000RangingClass.html new file mode 100644 index 0000000..13bdc0f --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000RangingClass.html @@ -0,0 +1,781 @@ + + + + + + +Arduino driver library for Decawave DW1000: DW1000RangingClass Class Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    + +
    +
    DW1000RangingClass Class Reference
    +
    +
    + +

    #include <DW1000Ranging.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Static Public Member Functions

    static void initCommunication (uint8_t myRST=DEFAULT_RST_PIN, uint8_t mySS=DEFAULT_SPI_SS_PIN, uint8_t myIRQ=2)
     
    static void configureNetwork (uint16_t deviceAddress, uint16_t networkId, const byte mode[])
     
    static void generalStart ()
     
    static void startAsAnchor (char address[], const byte mode[])
     
    static void startAsTag (char address[], const byte mode[])
     
    static boolean addNetworkDevices (DW1000Device *device, boolean shortAddress)
     
    static boolean addNetworkDevices (DW1000Device *device)
     
    static void removeNetworkDevices (int16_t index)
     
    static void setReplyTime (uint16_t replyDelayTimeUs)
     
    static void setResetPeriod (uint32_t resetPeriod)
     
    static byte * getCurrentAddress ()
     
    static byte * getCurrentShortAddress ()
     
    static uint8_t getNetworkDevicesNumber ()
     
    static int16_t detectMessageType (byte datas[])
     
    static void loop ()
     
    static void useRangeFilter (boolean enabled)
     
    static void setRangeFilterValue (uint16_t newValue)
     
    static void attachNewRange (void(*handleNewRange)(void))
     
    static void attachBlinkDevice (void(*handleBlinkDevice)(DW1000Device *))
     
    static void attachNewDevice (void(*handleNewDevice)(DW1000Device *))
     
    static void attachInactiveDevice (void(*handleInactiveDevice)(DW1000Device *))
     
    static DW1000DevicegetDistantDevice ()
     
    static DW1000DevicesearchDistantDevice (byte shortAddress[])
     
    static void visualizeDatas (byte datas[])
     
    + + + +

    +Static Public Attributes

    static byte data [LEN_DATA]
     
    +

    Member Function Documentation

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    boolean DW1000RangingClass::addNetworkDevices (DW1000Devicedevice,
    boolean shortAddress 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    boolean DW1000RangingClass::addNetworkDevices (DW1000Devicedevice)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000RangingClass::attachBlinkDevice (void(*)(DW1000Device *) handleBlinkDevice)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000RangingClass::attachInactiveDevice (void(*)(DW1000Device *) handleInactiveDevice)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000RangingClass::attachNewDevice (void(*)(DW1000Device *) handleNewDevice)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    static void DW1000RangingClass::attachNewRange (void(*)(void) handleNewRange)
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000RangingClass::configureNetwork (uint16_t deviceAddress,
    uint16_t networkId,
    const byte mode[] 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    int16_t DW1000RangingClass::detectMessageType (byte datas[])
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000RangingClass::generalStart ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    static byte* DW1000RangingClass::getCurrentAddress ()
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    static byte* DW1000RangingClass::getCurrentShortAddress ()
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    DW1000Device * DW1000RangingClass::getDistantDevice ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    static uint8_t DW1000RangingClass::getNetworkDevicesNumber ()
    +
    +inlinestatic
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void DW1000RangingClass::initCommunication (uint8_t myRST = DEFAULT_RST_PIN,
    uint8_t mySS = DEFAULT_SPI_SS_PIN,
    uint8_t myIRQ = 2 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void DW1000RangingClass::loop ()
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000RangingClass::removeNetworkDevices (int16_t index)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    DW1000Device * DW1000RangingClass::searchDistantDevice (byte shortAddress[])
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000RangingClass::setRangeFilterValue (uint16_t newValue)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000RangingClass::setReplyTime (uint16_t replyDelayTimeUs)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000RangingClass::setResetPeriod (uint32_t resetPeriod)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000RangingClass::startAsAnchor (char address[],
    const byte mode[] 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void DW1000RangingClass::startAsTag (char address[],
    const byte mode[] 
    )
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000RangingClass::useRangeFilter (boolean enabled)
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void DW1000RangingClass::visualizeDatas (byte datas[])
    +
    +static
    +
    + +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + + +
    + + + + +
    byte DW1000RangingClass::data
    +
    +static
    +
    + +
    +
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000Time-members.html b/lib/DW1000/extras/doc/html/classDW1000Time-members.html new file mode 100644 index 0000000..9f45cbc --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000Time-members.html @@ -0,0 +1,110 @@ + + + + + + +Arduino driver library for Decawave DW1000: Member List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    DW1000Time Member List
    +
    +
    + +

    This is the complete list of members for DW1000Time, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DISTANCE_OF_RADIODW1000Timestatic
    DISTANCE_OF_RADIO_INVDW1000Timestatic
    DW1000Time()DW1000Time
    DW1000Time(int64_t time)DW1000Time
    DW1000Time(byte data[])DW1000Time
    DW1000Time(const DW1000Time &copy)DW1000Time
    DW1000Time(float timeUs)DW1000Time
    DW1000Time(int32_t value, float factorUs)DW1000Time
    getAsFloat() const DW1000Time
    getAsMeters() const DW1000Time
    getAsMicroSeconds() const DW1000Time
    getTimestamp() const DW1000Time
    getTimestamp(byte data[]) const DW1000Time
    isValidTimestamp()DW1000Time
    LENGTH_TIMESTAMPDW1000Timestatic
    MICROSECONDSDW1000Timestatic
    MILLISECONDSDW1000Timestatic
    NANOSECONDSDW1000Timestatic
    operator!=(const DW1000Time &cmp) const DW1000Time
    operator*(float factor) const DW1000Time
    operator*(const DW1000Time &factor) const DW1000Time
    operator*=(float factor)DW1000Time
    operator*=(const DW1000Time &factor)DW1000Time
    operator+(const DW1000Time &add) const DW1000Time
    operator+=(const DW1000Time &add)DW1000Time
    operator-(const DW1000Time &sub) const DW1000Time
    operator-=(const DW1000Time &sub)DW1000Time
    operator/(float factor) const DW1000Time
    operator/(const DW1000Time &factor) const DW1000Time
    operator/=(float factor)DW1000Time
    operator/=(const DW1000Time &factor)DW1000Time
    operator=(const DW1000Time &assign)DW1000Time
    operator==(const DW1000Time &cmp) const DW1000Time
    print()DW1000Time
    printTo(Print &p) const DW1000Time
    SECONDSDW1000Timestatic
    setTime(float timeUs)DW1000Time
    setTime(int32_t value, float factorUs)DW1000Time
    setTimestamp(int64_t value)DW1000Time
    setTimestamp(byte data[])DW1000Time
    setTimestamp(const DW1000Time &copy)DW1000Time
    TIME_MAXDW1000Timestatic
    TIME_OVERFLOWDW1000Timestatic
    TIME_RESDW1000Timestatic
    TIME_RES_INVDW1000Timestatic
    wrap()DW1000Time
    ~DW1000Time()DW1000Time
    + + + + diff --git a/lib/DW1000/extras/doc/html/classDW1000Time.html b/lib/DW1000/extras/doc/html/classDW1000Time.html new file mode 100644 index 0000000..9adae76 --- /dev/null +++ b/lib/DW1000/extras/doc/html/classDW1000Time.html @@ -0,0 +1,1100 @@ + + + + + + +Arduino driver library for Decawave DW1000: DW1000Time Class Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    + +
    +
    DW1000Time Class Reference
    +
    +
    + +

    #include <DW1000Time.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

     DW1000Time ()
     
     DW1000Time (int64_t time)
     
     DW1000Time (byte data[])
     
     DW1000Time (const DW1000Time &copy)
     
     DW1000Time (float timeUs)
     
     DW1000Time (int32_t value, float factorUs)
     
     ~DW1000Time ()
     
    void setTimestamp (int64_t value)
     
    void setTimestamp (byte data[])
     
    void setTimestamp (const DW1000Time &copy)
     
    void setTime (float timeUs)
     
    void setTime (int32_t value, float factorUs)
     
    int64_t getTimestamp () const
     
    void getTimestamp (byte data[]) const
     
    float getAsFloat () const
     
    float getAsMicroSeconds () const
     
    float getAsMeters () const
     
    DW1000Timewrap ()
     
    bool isValidTimestamp ()
     
    DW1000Timeoperator= (const DW1000Time &assign)
     
    DW1000Timeoperator+= (const DW1000Time &add)
     
    DW1000Time operator+ (const DW1000Time &add) const
     
    DW1000Timeoperator-= (const DW1000Time &sub)
     
    DW1000Time operator- (const DW1000Time &sub) const
     
    DW1000Timeoperator*= (float factor)
     
    DW1000Time operator* (float factor) const
     
    DW1000Timeoperator*= (const DW1000Time &factor)
     
    DW1000Time operator* (const DW1000Time &factor) const
     
    DW1000Timeoperator/= (float factor)
     
    DW1000Time operator/ (float factor) const
     
    DW1000Timeoperator/= (const DW1000Time &factor)
     
    DW1000Time operator/ (const DW1000Time &factor) const
     
    boolean operator== (const DW1000Time &cmp) const
     
    boolean operator!= (const DW1000Time &cmp) const
     
    void print ()
     
    size_t printTo (Print &p) const
     
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    static constexpr float TIME_RES = 0.000015650040064103f
     
    static constexpr float TIME_RES_INV = 63897.6f
     
    static constexpr float DISTANCE_OF_RADIO = 0.0046917639786159f
     
    static constexpr float DISTANCE_OF_RADIO_INV = 213.139451293f
     
    static constexpr uint8_t LENGTH_TIMESTAMP = 5
     
    static constexpr int64_t TIME_OVERFLOW = 0x10000000000
     
    static constexpr int64_t TIME_MAX = 0xffffffffff
     
    static constexpr float SECONDS = 1e6
     
    static constexpr float MILLISECONDS = 1e3
     
    static constexpr float MICROSECONDS = 1
     
    static constexpr float NANOSECONDS = 1e-3
     
    +

    Detailed Description

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + +
    DW1000Time::DW1000Time ()
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time::DW1000Time (int64_t time)
    +
    +

    Initiates DW1000Time with timestamp

    Parameters
    + + +
    timetimestamp with intervall 1 is approx. 15ps
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time::DW1000Time (byte data[])
    +
    +

    Initiates DW1000Time with timestamp

    Parameters
    + + +
    datatimestamp as byte array
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time::DW1000Time (const DW1000Timecopy)
    +
    +

    Initiates DW100Time with another instance

    Parameters
    + + +
    copyother instance
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time::DW1000Time (float timeUs)
    +
    +

    Initiates DW100Time with micro seconds

    Parameters
    + + +
    timeUstime in micro seconds
    +
    +
    +
    Todo:
    maybe replace by better function without float
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    DW1000Time::DW1000Time (int32_t value,
    float factorUs 
    )
    +
    +

    Initiates DW100Time with time and factor

    Parameters
    + + + +
    valuetime
    factorUsmultiply factor for time
    +
    +
    +
    Todo:
    maybe replace by better function without float
    + +
    +
    + +
    +
    + + + + + + + +
    DW1000Time::~DW1000Time ()
    +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    float DW1000Time::getAsFloat () const
    +
    +

    Return real time in micro seconds

    Returns
    time in micro seconds
    +
    Deprecated:
    use getAsMicroSeconds()
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + +
    float DW1000Time::getAsMeters () const
    +
    +

    Return time as distance in meter, d=c*t this is useful for e.g. time of flight

    Returns
    distance in meters
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + +
    float DW1000Time::getAsMicroSeconds () const
    +
    +

    Return real time in micro seconds

    Returns
    time in micro seconds
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + +
    int64_t DW1000Time::getTimestamp () const
    +
    +

    Get timestamp as integer

    Returns
    timestamp as integer
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Time::getTimestamp (byte data[]) const
    +
    +

    Get timestamp as byte array

    Parameters
    + + +
    datavar where data should be written
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    bool DW1000Time::isValidTimestamp ()
    +
    +

    Check if timestamp is valid for usage with DW1000 device

    Returns
    true if valid, false if negative or overflow (maybe after calculation)
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + + +
    boolean DW1000Time::operator!= (const DW1000Timecmp) const
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time DW1000Time::operator* (float factor) const
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time DW1000Time::operator* (const DW1000Timefactor) const
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time & DW1000Time::operator*= (float factor)
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time & DW1000Time::operator*= (const DW1000Timefactor)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time DW1000Time::operator+ (const DW1000Timeadd) const
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time & DW1000Time::operator+= (const DW1000Timeadd)
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time DW1000Time::operator- (const DW1000Timesub) const
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time & DW1000Time::operator-= (const DW1000Timesub)
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time DW1000Time::operator/ (float factor) const
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time DW1000Time::operator/ (const DW1000Timefactor) const
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time & DW1000Time::operator/= (float factor)
    +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time & DW1000Time::operator/= (const DW1000Timefactor)
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    DW1000Time & DW1000Time::operator= (const DW1000Timeassign)
    +
    +
    + +
    +
    + + + + + + + + +
    boolean DW1000Time::operator== (const DW1000Timecmp) const
    +
    +
    + +
    +
    + + + + + + + +
    void DW1000Time::print ()
    +
    +

    For debuging, print timestamp pretty as integer with arduinos serial

    Deprecated:
    use Serial.print(object)
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + + +
    size_t DW1000Time::printTo (Print & p) const
    +
    +

    Print timestamp of instance as integer with e.g. Serial.print()

    Parameters
    + + +
    pprinter instance
    +
    +
    +
    Returns
    size of printed chars
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Time::setTime (float timeUs)
    +
    +

    Initiates DW100Time with micro seconds

    Parameters
    + + +
    timeUstime in micro seconds
    +
    +
    +
    Todo:
    maybe replace by better function without float
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void DW1000Time::setTime (int32_t value,
    float factorUs 
    )
    +
    +

    Set DW100Time with time and factor

    Parameters
    + + + +
    valuetime
    factorUsmultiply factor for time
    +
    +
    +
    Todo:
    maybe replace by better function without float
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Time::setTimestamp (int64_t value)
    +
    +

    Set timestamp

    Parameters
    + + +
    value- timestamp with intervall 1 is approx. 15ps
    +
    +
    +
    Examples:
    /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp.
    +
    +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Time::setTimestamp (byte data[])
    +
    +

    Set timestamp

    Parameters
    + + +
    datatimestamp as byte array
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void DW1000Time::setTimestamp (const DW1000Timecopy)
    +
    +

    Set timestamp from other instance

    Parameters
    + + +
    copyinstance where the timestamp should be copied
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    DW1000Time & DW1000Time::wrap ()
    +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::DISTANCE_OF_RADIO = 0.0046917639786159f
    +
    +static
    +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::DISTANCE_OF_RADIO_INV = 213.139451293f
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr uint8_t DW1000Time::LENGTH_TIMESTAMP = 5
    +
    +static
    +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::MICROSECONDS = 1
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::MILLISECONDS = 1e3
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::NANOSECONDS = 1e-3
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::SECONDS = 1e6
    +
    +static
    +
    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr int64_t DW1000Time::TIME_MAX = 0xffffffffff
    +
    +static
    +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr int64_t DW1000Time::TIME_OVERFLOW = 0x10000000000
    +
    +static
    +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::TIME_RES = 0.000015650040064103f
    +
    +static
    +
    +
    + +
    +
    + + + + + +
    + + + + +
    constexpr float DW1000Time::TIME_RES_INV = 63897.6f
    +
    +static
    +
    +
    +
    The documentation for this class was generated from the following files:
      +
    • /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.h
    • +
    • /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/DW1000Time.cpp
    • +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/classes.html b/lib/DW1000/extras/doc/html/classes.html new file mode 100644 index 0000000..253cd24 --- /dev/null +++ b/lib/DW1000/extras/doc/html/classes.html @@ -0,0 +1,69 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Index + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    Class Index
    +
    +
    + + + + + + +
      D  
    +
    DW1000Device   DW1000RangingClass   
    DW1000Mac   DW1000Time   
    DW1000Class   
    + +
    + + + + diff --git a/lib/DW1000/extras/doc/html/closed.png b/lib/DW1000/extras/doc/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/deprecated.html b/lib/DW1000/extras/doc/html/deprecated.html new file mode 100644 index 0000000..7b9f723 --- /dev/null +++ b/lib/DW1000/extras/doc/html/deprecated.html @@ -0,0 +1,59 @@ + + + + + + +Arduino driver library for Decawave DW1000: Deprecated List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + +
    +
    +
    +
    Deprecated List
    +
    +
    +
    +
    Member DW1000Time::getAsFloat () const
    +
    use getAsMicroSeconds()
    +
    Member DW1000Time::print ()
    +
    use Serial.print(object)
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/deprecated_8h.html b/lib/DW1000/extras/doc/html/deprecated_8h.html new file mode 100644 index 0000000..18b64d5 --- /dev/null +++ b/lib/DW1000/extras/doc/html/deprecated_8h.html @@ -0,0 +1,105 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/deprecated.h File Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    + +
    +
    deprecated.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + +

    +Macros

    #define DEPRECATED   __attribute__((deprecated))
     
    #define DEPRECATED_MSG(msg)   __attribute__((deprecated(msg)))
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define DEPRECATED   __attribute__((deprecated))
    +
    +

    Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de) Simple deprecated workaround for Arduino IDE IDE 1.6.8 use gcc 4.8 which do not support c++14 [[deprecated]] Later versions should support c++14, then use c++14 syntax

    + +
    +
    + +
    +
    + + + + + + + + +
    #define DEPRECATED_MSG( msg)   __attribute__((deprecated(msg)))
    +
    + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/deprecated_8h_source.html b/lib/DW1000/extras/doc/html/deprecated_8h_source.html new file mode 100644 index 0000000..f1eed70 --- /dev/null +++ b/lib/DW1000/extras/doc/html/deprecated_8h_source.html @@ -0,0 +1,63 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src/deprecated.h Source File + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    deprecated.h
    +
    +
    +Go to the documentation of this file.
    1 
    7 #ifndef DEPRECATED_H
    8 #define DEPRECATED_H
    9 
    10 #ifdef __has_cpp_attribute
    11 #if __has_cpp_attribute(deprecated)
    12 #define DEPRECATED [[deprecated]]
    13 #define DEPRECATED_MSG(msg) [[deprecated(msg)]]
    14 #endif // __has_cpp_attribute(deprecated)
    15 #else
    16 #define DEPRECATED __attribute__((deprecated))
    17 #define DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
    18 #endif // __has_cpp_attribute
    19 
    20 #endif // DEPRECATED_H
    + + + + diff --git a/lib/DW1000/extras/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/lib/DW1000/extras/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000..203e7a5 --- /dev/null +++ b/lib/DW1000/extras/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,95 @@ + + + + + + +Arduino driver library for Decawave DW1000: /home/az/Dropbox/work/Arduino/az-z/arduino-dw1000/src Directory Reference + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    +
    src Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  deprecated.h [code]
     
    file  DW1000.cpp
     
    file  DW1000.h [code]
     
    file  DW1000CompileOptions.h [code]
     
    file  DW1000Constants.h [code]
     
    file  DW1000Device.cpp
     
    file  DW1000Device.h [code]
     
    file  DW1000Mac.cpp
     
    file  DW1000Mac.h [code]
     
    file  DW1000Ranging.cpp
     
    file  DW1000Ranging.h [code]
     
    file  DW1000Time.cpp
     
    file  DW1000Time.h [code]
     
    file  require_cpp11.h [code]
     
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/doc.png b/lib/DW1000/extras/doc/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/doxygen.css b/lib/DW1000/extras/doc/html/doxygen.css new file mode 100644 index 0000000..1425ec5 --- /dev/null +++ b/lib/DW1000/extras/doc/html/doxygen.css @@ -0,0 +1,1475 @@ +/* The standard CSS for doxygen 1.8.11 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px 6px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/lib/DW1000/extras/doc/html/doxygen.png b/lib/DW1000/extras/doc/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/dynsections.js b/lib/DW1000/extras/doc/html/dynsections.js new file mode 100644 index 0000000..85e1836 --- /dev/null +++ b/lib/DW1000/extras/doc/html/dynsections.js @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + +Arduino driver library for Decawave DW1000: Examples + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + +
    +
    +
    +
    Examples
    +
    + + + + + diff --git a/lib/DW1000/extras/doc/html/files.html b/lib/DW1000/extras/doc/html/files.html new file mode 100644 index 0000000..25b8819 --- /dev/null +++ b/lib/DW1000/extras/doc/html/files.html @@ -0,0 +1,78 @@ + + + + + + +Arduino driver library for Decawave DW1000: File List + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + +
    +
    +
    +
    File List
    +
    +
    +
    Here is a list of all files with brief descriptions:
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/folderclosed.png b/lib/DW1000/extras/doc/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2blank.png b/lib/DW1000/extras/doc/html/ftv2blank.png new file mode 100644 index 0000000000000000000000000000000000000000..63c605bb4c3d941c921a4b6cfa74951e946bcb48 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2cl.png b/lib/DW1000/extras/doc/html/ftv2cl.png new file mode 100644 index 0000000000000000000000000000000000000000..132f6577bf7f085344904602815a260d29f55d9b GIT binary patch literal 453 zcmV;$0XqJPP)VBF;ev;toEj8_OB0EQg5eYilIj#JZG_m^33l3^k4mtzx!TVD?g)Y$ zrvwRDSqT!wLIM$dWCIa$vtxE|mzbTzu-y&$FvF6WA2a{Wr1g}`WdPT-0JzEZ0IxAv z-Z+ejZc&H;I5-pb_SUB}04j0^V)3t{`z<7asDl2Tw3w3sP%)0^8$bhEg)IOTBcRXv zFfq~3&gvJ$F-U7mpBW8z1GY~HK&7h4^YI~Orv~wLnC0PP_dAkv;nzX{9Q|8Gv=2ca z@v)c9T;D#h`TZ2X&&$ff2wedmot995de~-s3I)yauahg;7qn*?1n?F$e+PwP37}~; z1NKUk7reVK^7A;$QRW7qAx40HHUZ<|k3U%nz(Ec`#i+q9K!dgcROAlCS?`L= v>#=f?wF5ZND!1uAfQsk;KN^4&*8~0npJiJ%2dj9(00000NkvXXu0mjfWVFf_ literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2doc.png b/lib/DW1000/extras/doc/html/ftv2doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2folderclosed.png b/lib/DW1000/extras/doc/html/ftv2folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2lastnode.png b/lib/DW1000/extras/doc/html/ftv2lastnode.png new file mode 100644 index 0000000000000000000000000000000000000000..63c605bb4c3d941c921a4b6cfa74951e946bcb48 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2link.png b/lib/DW1000/extras/doc/html/ftv2link.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2mlastnode.png b/lib/DW1000/extras/doc/html/ftv2mlastnode.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2mnode.png b/lib/DW1000/extras/doc/html/ftv2mnode.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2mo.png b/lib/DW1000/extras/doc/html/ftv2mo.png new file mode 100644 index 0000000000000000000000000000000000000000..4bfb80f76e65815989a9350ad79d8ce45380e2b1 GIT binary patch literal 403 zcmV;E0c`$>P)${!fXv7NWJ%@%u4(KapRY>T6_x;E zxE7kt!}Tiw8@d9Sd`rTGum>z#Q14vIm`wm1#-byD1muMi02@YNO5LRF0o!Y{`a!Ya z{^&p0Su|s705&2QxmqdexG+-zNKL3f@8gTQSJrKByfo+oNJ^-{|Mn||Q5SDwjQVsS zr1}7o5-QMs>gYIMD>GRw@$lT`z4r-_m{5U#cR{urD_)TOeY)(UD|qZ^&y`IVijqk~ xs(9-kWFr7E^!lgi8GsFK5kOY_{Xbgf0^etEU%fLevs?fG002ovPDHLkV1nB&vX1}& literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2node.png b/lib/DW1000/extras/doc/html/ftv2node.png new file mode 100644 index 0000000000000000000000000000000000000000..63c605bb4c3d941c921a4b6cfa74951e946bcb48 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2ns.png b/lib/DW1000/extras/doc/html/ftv2ns.png new file mode 100644 index 0000000000000000000000000000000000000000..72e3d71c2892d6f00e259facebc88b45f6db2e35 GIT binary patch literal 388 zcmV-~0ek+5P)f+++#cT|!CkD&4pnIkeMEUEM*>`*9>+Juji$!h-mW%M^8s9957{3nvbrz^&=u<~TAUrFROkmt%^F~Ez+-c53Lv%iH3d38!Rv?K zrb&MYAhp;Gf<}wS;9ZZq2@;!uYG;=Z>~GKE^{HD4keu}lnyqhc>kWX^tQn|warJ~h zT+rtMkdz6aHoN%z(o|&wpu@@OpJnF_z{PA)6(FHw02iHslz^(N{4*+K9)QJHR87wT iTyp>aXaF{u2lxRou|^4tux6eB0000^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2pnode.png b/lib/DW1000/extras/doc/html/ftv2pnode.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2splitbar.png b/lib/DW1000/extras/doc/html/ftv2splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/ftv2vertline.png b/lib/DW1000/extras/doc/html/ftv2vertline.png new file mode 100644 index 0000000000000000000000000000000000000000..63c605bb4c3d941c921a4b6cfa74951e946bcb48 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/lib/DW1000/extras/doc/html/functions.html b/lib/DW1000/extras/doc/html/functions.html new file mode 100644 index 0000000..9972518 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions.html @@ -0,0 +1,193 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - _ -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_0x7e.html b/lib/DW1000/extras/doc/html/functions_0x7e.html new file mode 100644 index 0000000..e416692 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_0x7e.html @@ -0,0 +1,103 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - ~ -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_a.html b/lib/DW1000/extras/doc/html/functions_a.html new file mode 100644 index 0000000..cdc3e0b --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_a.html @@ -0,0 +1,130 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - a -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_b.html b/lib/DW1000/extras/doc/html/functions_b.html new file mode 100644 index 0000000..1f52f6f --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_b.html @@ -0,0 +1,121 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - b -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_c.html b/lib/DW1000/extras/doc/html/functions_c.html new file mode 100644 index 0000000..6ecdc18 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_c.html @@ -0,0 +1,139 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - c -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_d.html b/lib/DW1000/extras/doc/html/functions_d.html new file mode 100644 index 0000000..1024791 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_d.html @@ -0,0 +1,124 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - d -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_e.html b/lib/DW1000/extras/doc/html/functions_e.html new file mode 100644 index 0000000..5140a1c --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_e.html @@ -0,0 +1,103 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - e -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_f.html b/lib/DW1000/extras/doc/html/functions_f.html new file mode 100644 index 0000000..be00c65 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_f.html @@ -0,0 +1,100 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - f -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func.html b/lib/DW1000/extras/doc/html/functions_func.html new file mode 100644 index 0000000..7ddce8b --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func.html @@ -0,0 +1,124 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - a -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_0x7e.html b/lib/DW1000/extras/doc/html/functions_func_0x7e.html new file mode 100644 index 0000000..5308ae8 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_0x7e.html @@ -0,0 +1,100 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - ~ -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_b.html b/lib/DW1000/extras/doc/html/functions_func_b.html new file mode 100644 index 0000000..0fe54bb --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_b.html @@ -0,0 +1,94 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - b -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_c.html b/lib/DW1000/extras/doc/html/functions_func_c.html new file mode 100644 index 0000000..f64d0e5 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_c.html @@ -0,0 +1,118 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - c -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_d.html b/lib/DW1000/extras/doc/html/functions_func_d.html new file mode 100644 index 0000000..8f71a28 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_d.html @@ -0,0 +1,112 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - d -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_e.html b/lib/DW1000/extras/doc/html/functions_func_e.html new file mode 100644 index 0000000..07fb6e2 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_e.html @@ -0,0 +1,100 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - e -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_g.html b/lib/DW1000/extras/doc/html/functions_func_g.html new file mode 100644 index 0000000..9f19208 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_g.html @@ -0,0 +1,202 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - g -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_h.html b/lib/DW1000/extras/doc/html/functions_func_h.html new file mode 100644 index 0000000..f705851 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_h.html @@ -0,0 +1,94 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - h -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_i.html b/lib/DW1000/extras/doc/html/functions_func_i.html new file mode 100644 index 0000000..4b46fd9 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_i.html @@ -0,0 +1,148 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - i -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_l.html b/lib/DW1000/extras/doc/html/functions_func_l.html new file mode 100644 index 0000000..2f297b0 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_l.html @@ -0,0 +1,94 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - l -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_m.html b/lib/DW1000/extras/doc/html/functions_func_m.html new file mode 100644 index 0000000..66fd0fa --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_m.html @@ -0,0 +1,94 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - m -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_n.html b/lib/DW1000/extras/doc/html/functions_func_n.html new file mode 100644 index 0000000..87f1f98 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_n.html @@ -0,0 +1,106 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - n -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_o.html b/lib/DW1000/extras/doc/html/functions_func_o.html new file mode 100644 index 0000000..2ce0a15 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_o.html @@ -0,0 +1,124 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - o -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_p.html b/lib/DW1000/extras/doc/html/functions_func_p.html new file mode 100644 index 0000000..3537c52 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_p.html @@ -0,0 +1,97 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - p -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_r.html b/lib/DW1000/extras/doc/html/functions_func_r.html new file mode 100644 index 0000000..a773fc3 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_r.html @@ -0,0 +1,127 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - r -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_s.html b/lib/DW1000/extras/doc/html/functions_func_s.html new file mode 100644 index 0000000..07a86a0 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_s.html @@ -0,0 +1,233 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - s -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_t.html b/lib/DW1000/extras/doc/html/functions_func_t.html new file mode 100644 index 0000000..06a4208 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_t.html @@ -0,0 +1,94 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - t -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_u.html b/lib/DW1000/extras/doc/html/functions_func_u.html new file mode 100644 index 0000000..e19b22d --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_u.html @@ -0,0 +1,100 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - u -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_v.html b/lib/DW1000/extras/doc/html/functions_func_v.html new file mode 100644 index 0000000..9b29b6c --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_v.html @@ -0,0 +1,94 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - v -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_func_w.html b/lib/DW1000/extras/doc/html/functions_func_w.html new file mode 100644 index 0000000..1c8ad71 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_func_w.html @@ -0,0 +1,121 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Functions + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - w -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_g.html b/lib/DW1000/extras/doc/html/functions_g.html new file mode 100644 index 0000000..372bb20 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_g.html @@ -0,0 +1,205 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - g -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_h.html b/lib/DW1000/extras/doc/html/functions_h.html new file mode 100644 index 0000000..548e030 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_h.html @@ -0,0 +1,97 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - h -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_i.html b/lib/DW1000/extras/doc/html/functions_i.html new file mode 100644 index 0000000..1a1f48a --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_i.html @@ -0,0 +1,151 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - i -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_l.html b/lib/DW1000/extras/doc/html/functions_l.html new file mode 100644 index 0000000..3c844c0 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_l.html @@ -0,0 +1,100 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - l -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_m.html b/lib/DW1000/extras/doc/html/functions_m.html new file mode 100644 index 0000000..c2509f7 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_m.html @@ -0,0 +1,121 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - m -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_n.html b/lib/DW1000/extras/doc/html/functions_n.html new file mode 100644 index 0000000..45c9957 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_n.html @@ -0,0 +1,112 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - n -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_o.html b/lib/DW1000/extras/doc/html/functions_o.html new file mode 100644 index 0000000..cbf847b --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_o.html @@ -0,0 +1,127 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - o -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_p.html b/lib/DW1000/extras/doc/html/functions_p.html new file mode 100644 index 0000000..ce09c24 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_p.html @@ -0,0 +1,163 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - p -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_r.html b/lib/DW1000/extras/doc/html/functions_r.html new file mode 100644 index 0000000..7fd477e --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_r.html @@ -0,0 +1,139 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - r -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_s.html b/lib/DW1000/extras/doc/html/functions_s.html new file mode 100644 index 0000000..a94c6e2 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_s.html @@ -0,0 +1,239 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - s -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_t.html b/lib/DW1000/extras/doc/html/functions_t.html new file mode 100644 index 0000000..e7dabe0 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_t.html @@ -0,0 +1,166 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - t -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_u.html b/lib/DW1000/extras/doc/html/functions_u.html new file mode 100644 index 0000000..1f91421 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_u.html @@ -0,0 +1,103 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - u -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_v.html b/lib/DW1000/extras/doc/html/functions_v.html new file mode 100644 index 0000000..7bac988 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_v.html @@ -0,0 +1,97 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - v -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_vars.html b/lib/DW1000/extras/doc/html/functions_vars.html new file mode 100644 index 0000000..566179a --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_vars.html @@ -0,0 +1,484 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members - Variables + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - _ -

    + + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - f -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - w -

    + + +

    - x -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_w.html b/lib/DW1000/extras/doc/html/functions_w.html new file mode 100644 index 0000000..acc54d2 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_w.html @@ -0,0 +1,130 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - w -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/functions_x.html b/lib/DW1000/extras/doc/html/functions_x.html new file mode 100644 index 0000000..666d8e8 --- /dev/null +++ b/lib/DW1000/extras/doc/html/functions_x.html @@ -0,0 +1,97 @@ + + + + + + +Arduino driver library for Decawave DW1000: Class Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - x -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/globals.html b/lib/DW1000/extras/doc/html/globals.html new file mode 100644 index 0000000..73786ae --- /dev/null +++ b/lib/DW1000/extras/doc/html/globals.html @@ -0,0 +1,730 @@ + + + + + + +Arduino driver library for Decawave DW1000: File Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - w -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/globals_defs.html b/lib/DW1000/extras/doc/html/globals_defs.html new file mode 100644 index 0000000..662c44a --- /dev/null +++ b/lib/DW1000/extras/doc/html/globals_defs.html @@ -0,0 +1,722 @@ + + + + + + +Arduino driver library for Decawave DW1000: File Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + + +
    +
    +  + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - w -

    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/globals_vars.html b/lib/DW1000/extras/doc/html/globals_vars.html new file mode 100644 index 0000000..c365b73 --- /dev/null +++ b/lib/DW1000/extras/doc/html/globals_vars.html @@ -0,0 +1,72 @@ + + + + + + +Arduino driver library for Decawave DW1000: File Members + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + + + +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/index.hhc b/lib/DW1000/extras/doc/html/index.hhc new file mode 100644 index 0000000..eb484fa --- /dev/null +++ b/lib/DW1000/extras/doc/html/index.hhc @@ -0,0 +1,511 @@ + + + + + +
      +
    • +
    • +
    • +
        +
      • +
          +
        • +
            +
          +
        • +
            +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          +
        • +
            +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          +
        • +
            +
          +
        • +
            +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          +
        +
      • +
      • +
          +
        • +
            +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          +
        • +
            +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          • +
          +
        • +
        +
      +
    • +
        +
      • +
          +
        • +
            +
          • +
              +
            • +
            • +
            +
          • +
              +
            • +
            +
          • +
              +
            • +
                +
              +
            • +
            +
          • +
              +
            • +
            +
          • +
              +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            +
          • +
          • +
              +
            • +
                +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              +
            • +
            +
          • +
          • +
              +
            • +
                +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            +
          • +
              +
            • +
            +
          • +
              +
            • +
                +
              +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            +
          • +
          • +
              +
            • +
                +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              • +
              +
            +
          • +
          +
        +
      • +
          +
        • +
        • +
        • +
        +
      +
    • +
        +
      • +
      +
    + + diff --git a/lib/DW1000/extras/doc/html/index.hhk b/lib/DW1000/extras/doc/html/index.hhk new file mode 100644 index 0000000..2a43d09 --- /dev/null +++ b/lib/DW1000/extras/doc/html/index.hhk @@ -0,0 +1,1028 @@ + + + + + +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
        +
      • +
      • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
        +
      • +
      • +
      +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
    • +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
        +
      • +
      • +
      +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
        +
      • +
      • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    + + diff --git a/lib/DW1000/extras/doc/html/index.hhp b/lib/DW1000/extras/doc/html/index.hhp new file mode 100644 index 0000000..5782fd1 --- /dev/null +++ b/lib/DW1000/extras/doc/html/index.hhp @@ -0,0 +1,117 @@ +[OPTIONS] +Compatibility=1.1 +Full-text search=Yes +Contents file=index.hhc +Default Window=main +Default topic=index.html +Index file=index.hhk +Language=0x409 English (United States) +Title=Arduino driver library for Decawave DW1000 + +[WINDOWS] +main="Arduino driver library for Decawave DW1000","index.hhc","index.hhk","index.html","index.html",,,,,0x23520,,0x10387e,,,,,,,,0 + +[FILES] +_2home_2az_2Dropbox_2work_2Arduino_2az-z_2arduino-dw1000_2src_2DW1000Time_8cpp-example.html +deprecated_8h_source.html +DW1000_8h_source.html +DW1000CompileOptions_8h_source.html +DW1000Constants_8h_source.html +DW1000Device_8h_source.html +DW1000Mac_8h_source.html +DW1000Ranging_8h_source.html +DW1000Time_8h_source.html +require__cpp11_8h_source.html +deprecated_8h.html +DW1000_8cpp.html +DW1000_8h.html +DW1000CompileOptions_8h.html +DW1000Constants_8h.html +DW1000Device_8cpp.html +DW1000Device_8h.html +DW1000Mac_8cpp.html +DW1000Mac_8h.html +DW1000Ranging_8cpp.html +DW1000Ranging_8h.html +DW1000Time_8cpp.html +DW1000Time_8h.html +require__cpp11_8h.html +todo.html +deprecated.html +classDW1000Class.html +classDW1000Class-members.html +classDW1000Device.html +classDW1000Device-members.html +classDW1000Mac.html +classDW1000Mac-members.html +classDW1000RangingClass.html +classDW1000RangingClass-members.html +classDW1000Time.html +classDW1000Time-members.html +dir_68267d1309a1af8e8297ef4c3efbcdba.html +index.html +pages.html +annotated.html +classes.html +functions.html +functions_a.html +functions_b.html +functions_c.html +functions_d.html +functions_e.html +functions_f.html +functions_g.html +functions_h.html +functions_i.html +functions_l.html +functions_m.html +functions_n.html +functions_o.html +functions_p.html +functions_r.html +functions_s.html +functions_t.html +functions_u.html +functions_v.html +functions_w.html +functions_x.html +functions_0x7e.html +functions_func.html +functions_func_b.html +functions_func_c.html +functions_func_d.html +functions_func_e.html +functions_func_g.html +functions_func_h.html +functions_func_i.html +functions_func_l.html +functions_func_m.html +functions_func_n.html +functions_func_o.html +functions_func_p.html +functions_func_r.html +functions_func_s.html +functions_func_t.html +functions_func_u.html +functions_func_v.html +functions_func_w.html +functions_func_0x7e.html +functions_vars.html +files.html +globals.html +globals_vars.html +globals_defs.html +examples.html +tab_a.png +tab_b.png +tab_h.png +tab_s.png +nav_h.png +nav_f.png +bc_s.png +doxygen.png +closed.png +open.png +bdwn.png +sync_on.png +sync_off.png diff --git a/lib/DW1000/extras/doc/html/index.html b/lib/DW1000/extras/doc/html/index.html new file mode 100644 index 0000000..b32141d --- /dev/null +++ b/lib/DW1000/extras/doc/html/index.html @@ -0,0 +1,53 @@ + + + + + + +Arduino driver library for Decawave DW1000: Main Page + + + + + + +
    +
    + + + + + + +
    +
    Arduino driver library for Decawave DW1000 +  Dec 20 2016 +
    +
    +
    + + + +
    +
    +
    +
    Arduino driver library for Decawave DW1000 Documentation
    +
    +
    +
    + + + + diff --git a/lib/DW1000/extras/doc/html/jquery.js b/lib/DW1000/extras/doc/html/jquery.js new file mode 100644 index 0000000..1f4d0b4 --- /dev/null +++ b/lib/DW1000/extras/doc/html/jquery.js @@ -0,0 +1,68 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
    a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
    ";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
    t
    ";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
    ";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

    ";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
    ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
    ","
    "]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
    ").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
    ');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('