From 766f3d6d1ef0b071bf275258c6a48b93e33db687 Mon Sep 17 00:00:00 2001 From: Fenoglio Date: Sat, 1 Dec 2018 23:51:18 +0100 Subject: [PATCH] Added lib and Doxyfile --- Arduino/libraries/CodeRacer/CodeRacer.cpp | 1581 +++++++++++----- Arduino/libraries/CodeRacer/CodeRacer.h | 298 +-- .../esp32_coderacer_beispiel.ino | 115 +- Arduino/libraries/CodeRacer/keywords.txt | 15 - Arduino/libraries/ESP32Servo/README.md | 87 + .../ESP32Servo/examples/Knob/Knob.ino | 69 + .../Multiple-Servo-Example-Arduino.ino | 106 ++ .../Multiple-Servo-Example-ESP32.ino | 109 ++ .../ESP32Servo/examples/Sweep/Sweep.ino | 66 + Arduino/libraries/ESP32Servo/keywords.txt | 26 + .../libraries/ESP32Servo/library.properties | 11 + .../libraries/ESP32Servo/src/ESP32Servo.cpp | 275 +++ Arduino/libraries/ESP32Servo/src/ESP32Servo.h | 149 ++ Doku/Doxygen/Doxyfile | 18 +- Doku/Doxygen/html/bc_s.png | Bin 676 -> 0 bytes Doku/Doxygen/html/bdwn.png | Bin 147 -> 0 bytes Doku/Doxygen/html/closed.png | Bin 132 -> 0 bytes .../html/coderace_get_in_contact_pic.png | Bin 253786 -> 0 bytes Doku/Doxygen/html/coderace_logo.JPG | Bin 20511 -> 0 bytes .../d0a/group__lowerleveldrivesgetters.html | 157 -- .../d0/d0a/group__lowerleveldrivesgetters.js | 5 - .../d0/d0a/group__lowerleveldrivesgetters.map | 3 - .../d0/d0a/group__lowerleveldrivesgetters.md5 | 1 - .../d0/d0a/group__lowerleveldrivesgetters.png | Bin 1403 -> 0 bytes .../d1/d8a/group__lowerleveldrivesmeths.html | 496 ----- .../d1/d8a/group__lowerleveldrivesmeths.js | 13 - .../d1/d8a/group__lowerleveldrivesmeths.map | 3 - .../d1/d8a/group__lowerleveldrivesmeths.md5 | 1 - .../d1/d8a/group__lowerleveldrivesmeths.png | Bin 1419 -> 0 bytes .../html/d2/d40/group__higherlevelmeths.html | 597 ------ .../html/d2/d40/group__higherlevelmeths.js | 18 - .../html/d2/d40/group__higherlevelmeths.map | 3 - .../html/d2/d40/group__higherlevelmeths.md5 | 1 - .../html/d2/d40/group__higherlevelmeths.png | Bin 1458 -> 0 bytes ...be6a850099812153dcf5768d7fc8b8c_cgraph.map | 2 - ...be6a850099812153dcf5768d7fc8b8c_cgraph.md5 | 1 - ...be6a850099812153dcf5768d7fc8b8c_cgraph.png | Bin 2066 -> 0 bytes .../html/d3/d17/group__lowerlevelservo.html | 110 -- .../html/d3/d17/group__lowerlevelservo.js | 5 - .../html/d3/d17/group__lowerlevelservo.map | 4 - .../html/d3/d17/group__lowerlevelservo.md5 | 1 - .../html/d3/d17/group__lowerlevelservo.png | Bin 2839 -> 0 bytes .../html/d4/da7/_code_racer_8cpp_source.html | 101 -- .../d4/df4/group__lowerlevelservogetters.html | 182 -- .../d4/df4/group__lowerlevelservogetters.js | 6 - .../d4/df4/group__lowerlevelservogetters.map | 3 - .../d4/df4/group__lowerlevelservogetters.md5 | 1 - .../d4/df4/group__lowerlevelservogetters.png | Bin 1424 -> 0 bytes .../html/d6/d98/group__lowerleveldrives.html | 110 -- .../html/d6/d98/group__lowerleveldrives.js | 5 - .../html/d6/d98/group__lowerleveldrives.map | 4 - .../html/d6/d98/group__lowerleveldrives.md5 | 1 - .../html/d6/d98/group__lowerleveldrives.png | Bin 2862 -> 0 bytes .../html/d6/d9a/_code_racer_8h_source.html | 100 -- .../html/d6/dfc/group__lowerlevelusmeths.html | 335 ---- .../html/d6/dfc/group__lowerlevelusmeths.js | 11 - .../html/d6/dfc/group__lowerlevelusmeths.map | 3 - .../html/d6/dfc/group__lowerlevelusmeths.md5 | 1 - .../html/d6/dfc/group__lowerlevelusmeths.png | Bin 1467 -> 0 bytes .../html/d7/d0f/group__lowerlevelled.html | 108 -- .../html/d7/d0f/group__lowerlevelled.js | 4 - .../html/d7/d0f/group__lowerlevelled.map | 3 - .../html/d7/d0f/group__lowerlevelled.md5 | 1 - .../html/d7/d0f/group__lowerlevelled.png | Bin 1149 -> 0 bytes .../d7/d45/group__higherlevelgetters.html | 282 --- .../html/d7/d45/group__higherlevelgetters.js | 10 - .../html/d7/d45/group__higherlevelgetters.map | 3 - .../html/d7/d45/group__higherlevelgetters.md5 | 1 - .../html/d7/d45/group__higherlevelgetters.png | Bin 1589 -> 0 bytes .../html/d8/d7a/group__lowerlevelfun.html | 157 -- .../html/d8/d7a/group__lowerlevelfun.js | 5 - .../html/d9/d80/group__higherlevel.html | 110 -- .../Doxygen/html/d9/d80/group__higherlevel.js | 5 - .../html/d9/d80/group__higherlevel.map | 4 - .../html/d9/d80/group__higherlevel.md5 | 1 - .../html/d9/d80/group__higherlevel.png | Bin 2983 -> 0 bytes .../html/da/daf/group__lowerlevelus.html | 110 -- .../html/da/daf/group__lowerlevelus.js | 5 - .../html/da/daf/group__lowerlevelus.map | 4 - .../html/da/daf/group__lowerlevelus.md5 | 1 - .../html/da/daf/group__lowerlevelus.png | Bin 3003 -> 0 bytes .../db/dd5/group__lowerlevelservomeths.html | 335 ---- .../db/dd5/group__lowerlevelservomeths.js | 10 - .../db/dd5/group__lowerlevelservomeths.map | 3 - .../db/dd5/group__lowerlevelservomeths.md5 | 1 - .../db/dd5/group__lowerlevelservomeths.png | Bin 1468 -> 0 bytes .../db/ddd/group__lowerlevelusgetters.html | 221 --- .../html/db/ddd/group__lowerlevelusgetters.js | 7 - .../db/ddd/group__lowerlevelusgetters.map | 3 - .../db/ddd/group__lowerlevelusgetters.md5 | 1 - .../db/ddd/group__lowerlevelusgetters.png | Bin 1603 -> 0 bytes .../dd/dff/group__lowerlevelledmeths.html | 246 --- .../html/dd/dff/group__lowerlevelledmeths.js | 7 - .../html/dd/dff/group__lowerlevelledmeths.map | 3 - .../html/dd/dff/group__lowerlevelledmeths.md5 | 1 - .../html/dd/dff/group__lowerlevelledmeths.png | Bin 1161 -> 0 bytes .../dir_11f10faf8e1af149a19b120728e5c8cd.html | 100 -- .../dir_481cc946b8a81b8d9363a4aad6201160.html | 104 -- .../dir_a991eec27578c865874ede3d8ec657c2.html | 100 -- Doku/Doxygen/html/doc.png | Bin 746 -> 0 bytes Doku/Doxygen/html/doxygen.css | 1596 ----------------- Doku/Doxygen/html/doxygen.png | Bin 3779 -> 0 bytes Doku/Doxygen/html/dynsections.js | 104 -- Doku/Doxygen/html/folderclosed.png | Bin 616 -> 0 bytes Doku/Doxygen/html/folderopen.png | Bin 597 -> 0 bytes Doku/Doxygen/html/graph_legend.html | 128 -- Doku/Doxygen/html/graph_legend.md5 | 1 - Doku/Doxygen/html/graph_legend.png | Bin 14975 -> 0 bytes Doku/Doxygen/html/index.html | 99 - Doku/Doxygen/html/jquery.js | 87 - Doku/Doxygen/html/menu.js | 26 - Doku/Doxygen/html/menudata.js | 3 - Doku/Doxygen/html/modules.html | 118 -- Doku/Doxygen/html/modules.js | 9 - Doku/Doxygen/html/nav_f.png | Bin 153 -> 0 bytes Doku/Doxygen/html/nav_g.png | Bin 95 -> 0 bytes Doku/Doxygen/html/nav_h.png | Bin 98 -> 0 bytes Doku/Doxygen/html/navtree.css | 146 -- Doku/Doxygen/html/navtree.js | 517 ------ Doku/Doxygen/html/navtreedata.js | 14 - Doku/Doxygen/html/navtreeindex0.js | 83 - Doku/Doxygen/html/open.png | Bin 123 -> 0 bytes Doku/Doxygen/html/resize.js | 114 -- Doku/Doxygen/html/search/all_0.html | 26 - Doku/Doxygen/html/search/all_0.js | 8 - Doku/Doxygen/html/search/all_1.html | 26 - Doku/Doxygen/html/search/all_1.js | 6 - Doku/Doxygen/html/search/all_2.html | 26 - Doku/Doxygen/html/search/all_2.js | 4 - Doku/Doxygen/html/search/all_3.html | 26 - Doku/Doxygen/html/search/all_3.js | 5 - Doku/Doxygen/html/search/all_4.html | 26 - Doku/Doxygen/html/search/all_4.js | 4 - Doku/Doxygen/html/search/all_5.html | 26 - Doku/Doxygen/html/search/all_5.js | 9 - Doku/Doxygen/html/search/all_6.html | 26 - Doku/Doxygen/html/search/all_6.js | 8 - Doku/Doxygen/html/search/all_7.html | 26 - Doku/Doxygen/html/search/all_7.js | 34 - Doku/Doxygen/html/search/all_8.html | 26 - Doku/Doxygen/html/search/all_8.js | 7 - Doku/Doxygen/html/search/all_9.html | 26 - Doku/Doxygen/html/search/all_9.js | 11 - Doku/Doxygen/html/search/close.png | Bin 273 -> 0 bytes Doku/Doxygen/html/search/functions_0.html | 26 - Doku/Doxygen/html/search/functions_0.js | 8 - Doku/Doxygen/html/search/functions_1.html | 26 - Doku/Doxygen/html/search/functions_1.js | 5 - Doku/Doxygen/html/search/functions_2.html | 26 - Doku/Doxygen/html/search/functions_2.js | 4 - Doku/Doxygen/html/search/functions_3.html | 26 - Doku/Doxygen/html/search/functions_3.js | 4 - Doku/Doxygen/html/search/functions_4.html | 26 - Doku/Doxygen/html/search/functions_4.js | 33 - Doku/Doxygen/html/search/functions_5.html | 26 - Doku/Doxygen/html/search/functions_5.js | 7 - Doku/Doxygen/html/search/functions_6.html | 26 - Doku/Doxygen/html/search/functions_6.js | 11 - Doku/Doxygen/html/search/groups_0.html | 26 - Doku/Doxygen/html/search/groups_0.js | 6 - Doku/Doxygen/html/search/groups_1.html | 26 - Doku/Doxygen/html/search/groups_1.js | 4 - Doku/Doxygen/html/search/groups_2.html | 26 - Doku/Doxygen/html/search/groups_2.js | 8 - Doku/Doxygen/html/search/groups_3.html | 26 - Doku/Doxygen/html/search/groups_3.js | 8 - Doku/Doxygen/html/search/groups_4.html | 26 - Doku/Doxygen/html/search/groups_4.js | 4 - Doku/Doxygen/html/search/mag_sel.png | Bin 563 -> 0 bytes Doku/Doxygen/html/search/nomatches.html | 12 - Doku/Doxygen/html/search/search.css | 271 --- Doku/Doxygen/html/search/search.js | 791 -------- Doku/Doxygen/html/search/search_l.png | Bin 604 -> 0 bytes Doku/Doxygen/html/search/search_m.png | Bin 158 -> 0 bytes Doku/Doxygen/html/search/search_r.png | Bin 612 -> 0 bytes Doku/Doxygen/html/search/searchdata.js | 21 - Doku/Doxygen/html/splitbar.png | Bin 314 -> 0 bytes Doku/Doxygen/html/sync_off.png | Bin 853 -> 0 bytes Doku/Doxygen/html/sync_on.png | Bin 845 -> 0 bytes Doku/Doxygen/html/tab_a.png | Bin 142 -> 0 bytes Doku/Doxygen/html/tab_b.png | Bin 169 -> 0 bytes Doku/Doxygen/html/tab_h.png | Bin 177 -> 0 bytes Doku/Doxygen/html/tab_s.png | Bin 184 -> 0 bytes Doku/Doxygen/html/tabs.css | 1 - Doku/Doxygen/latex/Makefile | 21 - Doku/Doxygen/latex/coderace_logo.JPG | Bin 20511 -> 0 bytes .../d0/d0a/group__lowerleveldrivesgetters.tex | 61 - .../d1/d8a/group__lowerleveldrivesmeths.tex | 341 ---- .../latex/d2/d40/group__higherlevelmeths.tex | 494 ----- ...be6a850099812153dcf5768d7fc8b8c_cgraph.md5 | 1 - ...be6a850099812153dcf5768d7fc8b8c_cgraph.pdf | Bin 13751 -> 0 bytes .../latex/d3/d17/group__lowerlevelservo.tex | 12 - .../d4/df4/group__lowerlevelservogetters.tex | 86 - .../latex/d6/d98/group__lowerleveldrives.tex | 12 - .../latex/d6/dfc/group__lowerlevelusmeths.tex | 292 --- .../latex/d7/d0f/group__lowerlevelled.tex | 10 - .../d7/d45/group__higherlevelgetters.tex | 186 -- .../latex/d8/d7a/group__lowerlevelfun.tex | 99 - .../latex/d9/d80/group__higherlevel.tex | 12 - .../latex/da/daf/group__lowerlevelus.tex | 12 - .../db/dd5/group__lowerlevelservomeths.tex | 233 --- .../db/ddd/group__lowerlevelusgetters.tex | 121 -- .../dd/dff/group__lowerlevelledmeths.tex | 134 -- .../dir_11f10faf8e1af149a19b120728e5c8cd.tex | 2 - .../dir_481cc946b8a81b8d9363a4aad6201160.tex | 5 - .../dir_a991eec27578c865874ede3d8ec657c2.tex | 2 - Doku/Doxygen/latex/doxygen.sty | 503 ------ Doku/Doxygen/latex/make.bat | 30 - Doku/Doxygen/latex/modules.tex | 28 - Doku/Doxygen/latex/refman.tex | 169 -- 210 files changed, 2280 insertions(+), 12662 deletions(-) delete mode 100644 Arduino/libraries/CodeRacer/keywords.txt create mode 100644 Arduino/libraries/ESP32Servo/README.md create mode 100644 Arduino/libraries/ESP32Servo/examples/Knob/Knob.ino create mode 100644 Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino create mode 100644 Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-ESP32/Multiple-Servo-Example-ESP32.ino create mode 100644 Arduino/libraries/ESP32Servo/examples/Sweep/Sweep.ino create mode 100644 Arduino/libraries/ESP32Servo/keywords.txt create mode 100644 Arduino/libraries/ESP32Servo/library.properties create mode 100644 Arduino/libraries/ESP32Servo/src/ESP32Servo.cpp create mode 100644 Arduino/libraries/ESP32Servo/src/ESP32Servo.h delete mode 100644 Doku/Doxygen/html/bc_s.png delete mode 100644 Doku/Doxygen/html/bdwn.png delete mode 100644 Doku/Doxygen/html/closed.png delete mode 100644 Doku/Doxygen/html/coderace_get_in_contact_pic.png delete mode 100644 Doku/Doxygen/html/coderace_logo.JPG delete mode 100644 Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.html delete mode 100644 Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.js delete mode 100644 Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.map delete mode 100644 Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.md5 delete mode 100644 Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.png delete mode 100644 Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.html delete mode 100644 Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.js delete mode 100644 Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.map delete mode 100644 Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.md5 delete mode 100644 Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.png delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths.html delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths.js delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths.map delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths.md5 delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths.png delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.map delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 delete mode 100644 Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.png delete mode 100644 Doku/Doxygen/html/d3/d17/group__lowerlevelservo.html delete mode 100644 Doku/Doxygen/html/d3/d17/group__lowerlevelservo.js delete mode 100644 Doku/Doxygen/html/d3/d17/group__lowerlevelservo.map delete mode 100644 Doku/Doxygen/html/d3/d17/group__lowerlevelservo.md5 delete mode 100644 Doku/Doxygen/html/d3/d17/group__lowerlevelservo.png delete mode 100644 Doku/Doxygen/html/d4/da7/_code_racer_8cpp_source.html delete mode 100644 Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.html delete mode 100644 Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.js delete mode 100644 Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.map delete mode 100644 Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.md5 delete mode 100644 Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.png delete mode 100644 Doku/Doxygen/html/d6/d98/group__lowerleveldrives.html delete mode 100644 Doku/Doxygen/html/d6/d98/group__lowerleveldrives.js delete mode 100644 Doku/Doxygen/html/d6/d98/group__lowerleveldrives.map delete mode 100644 Doku/Doxygen/html/d6/d98/group__lowerleveldrives.md5 delete mode 100644 Doku/Doxygen/html/d6/d98/group__lowerleveldrives.png delete mode 100644 Doku/Doxygen/html/d6/d9a/_code_racer_8h_source.html delete mode 100644 Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.html delete mode 100644 Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.js delete mode 100644 Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.map delete mode 100644 Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.md5 delete mode 100644 Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.png delete mode 100644 Doku/Doxygen/html/d7/d0f/group__lowerlevelled.html delete mode 100644 Doku/Doxygen/html/d7/d0f/group__lowerlevelled.js delete mode 100644 Doku/Doxygen/html/d7/d0f/group__lowerlevelled.map delete mode 100644 Doku/Doxygen/html/d7/d0f/group__lowerlevelled.md5 delete mode 100644 Doku/Doxygen/html/d7/d0f/group__lowerlevelled.png delete mode 100644 Doku/Doxygen/html/d7/d45/group__higherlevelgetters.html delete mode 100644 Doku/Doxygen/html/d7/d45/group__higherlevelgetters.js delete mode 100644 Doku/Doxygen/html/d7/d45/group__higherlevelgetters.map delete mode 100644 Doku/Doxygen/html/d7/d45/group__higherlevelgetters.md5 delete mode 100644 Doku/Doxygen/html/d7/d45/group__higherlevelgetters.png delete mode 100644 Doku/Doxygen/html/d8/d7a/group__lowerlevelfun.html delete mode 100644 Doku/Doxygen/html/d8/d7a/group__lowerlevelfun.js delete mode 100644 Doku/Doxygen/html/d9/d80/group__higherlevel.html delete mode 100644 Doku/Doxygen/html/d9/d80/group__higherlevel.js delete mode 100644 Doku/Doxygen/html/d9/d80/group__higherlevel.map delete mode 100644 Doku/Doxygen/html/d9/d80/group__higherlevel.md5 delete mode 100644 Doku/Doxygen/html/d9/d80/group__higherlevel.png delete mode 100644 Doku/Doxygen/html/da/daf/group__lowerlevelus.html delete mode 100644 Doku/Doxygen/html/da/daf/group__lowerlevelus.js delete mode 100644 Doku/Doxygen/html/da/daf/group__lowerlevelus.map delete mode 100644 Doku/Doxygen/html/da/daf/group__lowerlevelus.md5 delete mode 100644 Doku/Doxygen/html/da/daf/group__lowerlevelus.png delete mode 100644 Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.html delete mode 100644 Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.js delete mode 100644 Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.map delete mode 100644 Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.md5 delete mode 100644 Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.png delete mode 100644 Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.html delete mode 100644 Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.js delete mode 100644 Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.map delete mode 100644 Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.md5 delete mode 100644 Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.png delete mode 100644 Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.html delete mode 100644 Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.js delete mode 100644 Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.map delete mode 100644 Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.md5 delete mode 100644 Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.png delete mode 100644 Doku/Doxygen/html/dir_11f10faf8e1af149a19b120728e5c8cd.html delete mode 100644 Doku/Doxygen/html/dir_481cc946b8a81b8d9363a4aad6201160.html delete mode 100644 Doku/Doxygen/html/dir_a991eec27578c865874ede3d8ec657c2.html delete mode 100644 Doku/Doxygen/html/doc.png delete mode 100644 Doku/Doxygen/html/doxygen.css delete mode 100644 Doku/Doxygen/html/doxygen.png delete mode 100644 Doku/Doxygen/html/dynsections.js delete mode 100644 Doku/Doxygen/html/folderclosed.png delete mode 100644 Doku/Doxygen/html/folderopen.png delete mode 100644 Doku/Doxygen/html/graph_legend.html delete mode 100644 Doku/Doxygen/html/graph_legend.md5 delete mode 100644 Doku/Doxygen/html/graph_legend.png delete mode 100644 Doku/Doxygen/html/index.html delete mode 100644 Doku/Doxygen/html/jquery.js delete mode 100644 Doku/Doxygen/html/menu.js delete mode 100644 Doku/Doxygen/html/menudata.js delete mode 100644 Doku/Doxygen/html/modules.html delete mode 100644 Doku/Doxygen/html/modules.js delete mode 100644 Doku/Doxygen/html/nav_f.png delete mode 100644 Doku/Doxygen/html/nav_g.png delete mode 100644 Doku/Doxygen/html/nav_h.png delete mode 100644 Doku/Doxygen/html/navtree.css delete mode 100644 Doku/Doxygen/html/navtree.js delete mode 100644 Doku/Doxygen/html/navtreedata.js delete mode 100644 Doku/Doxygen/html/navtreeindex0.js delete mode 100644 Doku/Doxygen/html/open.png delete mode 100644 Doku/Doxygen/html/resize.js delete mode 100644 Doku/Doxygen/html/search/all_0.html delete mode 100644 Doku/Doxygen/html/search/all_0.js delete mode 100644 Doku/Doxygen/html/search/all_1.html delete mode 100644 Doku/Doxygen/html/search/all_1.js delete mode 100644 Doku/Doxygen/html/search/all_2.html delete mode 100644 Doku/Doxygen/html/search/all_2.js delete mode 100644 Doku/Doxygen/html/search/all_3.html delete mode 100644 Doku/Doxygen/html/search/all_3.js delete mode 100644 Doku/Doxygen/html/search/all_4.html delete mode 100644 Doku/Doxygen/html/search/all_4.js delete mode 100644 Doku/Doxygen/html/search/all_5.html delete mode 100644 Doku/Doxygen/html/search/all_5.js delete mode 100644 Doku/Doxygen/html/search/all_6.html delete mode 100644 Doku/Doxygen/html/search/all_6.js delete mode 100644 Doku/Doxygen/html/search/all_7.html delete mode 100644 Doku/Doxygen/html/search/all_7.js delete mode 100644 Doku/Doxygen/html/search/all_8.html delete mode 100644 Doku/Doxygen/html/search/all_8.js delete mode 100644 Doku/Doxygen/html/search/all_9.html delete mode 100644 Doku/Doxygen/html/search/all_9.js delete mode 100644 Doku/Doxygen/html/search/close.png delete mode 100644 Doku/Doxygen/html/search/functions_0.html delete mode 100644 Doku/Doxygen/html/search/functions_0.js delete mode 100644 Doku/Doxygen/html/search/functions_1.html delete mode 100644 Doku/Doxygen/html/search/functions_1.js delete mode 100644 Doku/Doxygen/html/search/functions_2.html delete mode 100644 Doku/Doxygen/html/search/functions_2.js delete mode 100644 Doku/Doxygen/html/search/functions_3.html delete mode 100644 Doku/Doxygen/html/search/functions_3.js delete mode 100644 Doku/Doxygen/html/search/functions_4.html delete mode 100644 Doku/Doxygen/html/search/functions_4.js delete mode 100644 Doku/Doxygen/html/search/functions_5.html delete mode 100644 Doku/Doxygen/html/search/functions_5.js delete mode 100644 Doku/Doxygen/html/search/functions_6.html delete mode 100644 Doku/Doxygen/html/search/functions_6.js delete mode 100644 Doku/Doxygen/html/search/groups_0.html delete mode 100644 Doku/Doxygen/html/search/groups_0.js delete mode 100644 Doku/Doxygen/html/search/groups_1.html delete mode 100644 Doku/Doxygen/html/search/groups_1.js delete mode 100644 Doku/Doxygen/html/search/groups_2.html delete mode 100644 Doku/Doxygen/html/search/groups_2.js delete mode 100644 Doku/Doxygen/html/search/groups_3.html delete mode 100644 Doku/Doxygen/html/search/groups_3.js delete mode 100644 Doku/Doxygen/html/search/groups_4.html delete mode 100644 Doku/Doxygen/html/search/groups_4.js delete mode 100644 Doku/Doxygen/html/search/mag_sel.png delete mode 100644 Doku/Doxygen/html/search/nomatches.html delete mode 100644 Doku/Doxygen/html/search/search.css delete mode 100644 Doku/Doxygen/html/search/search.js delete mode 100644 Doku/Doxygen/html/search/search_l.png delete mode 100644 Doku/Doxygen/html/search/search_m.png delete mode 100644 Doku/Doxygen/html/search/search_r.png delete mode 100644 Doku/Doxygen/html/search/searchdata.js delete mode 100644 Doku/Doxygen/html/splitbar.png delete mode 100644 Doku/Doxygen/html/sync_off.png delete mode 100644 Doku/Doxygen/html/sync_on.png delete mode 100644 Doku/Doxygen/html/tab_a.png delete mode 100644 Doku/Doxygen/html/tab_b.png delete mode 100644 Doku/Doxygen/html/tab_h.png delete mode 100644 Doku/Doxygen/html/tab_s.png delete mode 100644 Doku/Doxygen/html/tabs.css delete mode 100644 Doku/Doxygen/latex/Makefile delete mode 100644 Doku/Doxygen/latex/coderace_logo.JPG delete mode 100644 Doku/Doxygen/latex/d0/d0a/group__lowerleveldrivesgetters.tex delete mode 100644 Doku/Doxygen/latex/d1/d8a/group__lowerleveldrivesmeths.tex delete mode 100644 Doku/Doxygen/latex/d2/d40/group__higherlevelmeths.tex delete mode 100644 Doku/Doxygen/latex/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 delete mode 100644 Doku/Doxygen/latex/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.pdf delete mode 100644 Doku/Doxygen/latex/d3/d17/group__lowerlevelservo.tex delete mode 100644 Doku/Doxygen/latex/d4/df4/group__lowerlevelservogetters.tex delete mode 100644 Doku/Doxygen/latex/d6/d98/group__lowerleveldrives.tex delete mode 100644 Doku/Doxygen/latex/d6/dfc/group__lowerlevelusmeths.tex delete mode 100644 Doku/Doxygen/latex/d7/d0f/group__lowerlevelled.tex delete mode 100644 Doku/Doxygen/latex/d7/d45/group__higherlevelgetters.tex delete mode 100644 Doku/Doxygen/latex/d8/d7a/group__lowerlevelfun.tex delete mode 100644 Doku/Doxygen/latex/d9/d80/group__higherlevel.tex delete mode 100644 Doku/Doxygen/latex/da/daf/group__lowerlevelus.tex delete mode 100644 Doku/Doxygen/latex/db/dd5/group__lowerlevelservomeths.tex delete mode 100644 Doku/Doxygen/latex/db/ddd/group__lowerlevelusgetters.tex delete mode 100644 Doku/Doxygen/latex/dd/dff/group__lowerlevelledmeths.tex delete mode 100644 Doku/Doxygen/latex/dir_11f10faf8e1af149a19b120728e5c8cd.tex delete mode 100644 Doku/Doxygen/latex/dir_481cc946b8a81b8d9363a4aad6201160.tex delete mode 100644 Doku/Doxygen/latex/dir_a991eec27578c865874ede3d8ec657c2.tex delete mode 100644 Doku/Doxygen/latex/doxygen.sty delete mode 100644 Doku/Doxygen/latex/make.bat delete mode 100644 Doku/Doxygen/latex/modules.tex delete mode 100644 Doku/Doxygen/latex/refman.tex diff --git a/Arduino/libraries/CodeRacer/CodeRacer.cpp b/Arduino/libraries/CodeRacer/CodeRacer.cpp index 009169b..c4dc5fe 100644 --- a/Arduino/libraries/CodeRacer/CodeRacer.cpp +++ b/Arduino/libraries/CodeRacer/CodeRacer.cpp @@ -1,496 +1,797 @@ // the compiler switch for an ESP8266 is looking like this: #elif defined(ARDUINO_ARCH_ESP8266) - #include "CodeRacer.h" -//Konstruktor ohne Pins ... alle Vorgaben kommen aus dem CodeRacer.h Header file +/** @brief CodeRace constructor without pins. All pins settings taken from the coderacer header file +* @return nothing +*/ CodeRacer::CodeRacer() { - _taster_pin = H_TASTERPIN; - _servopin = H_SERVOPIN; - _us_trigger_pin = H_US_TRIG; - _us_echo_pin = H_US_ECHO; - _motor_links_frwd_pin = H_MOTORLI_FWRD; - _motor_links_back_pin = H_MOTORLI_BACK; - _motor_links_enable_pin = H_MOTORLI_SPEED; - _motor_rechts_frwd_pin = H_MOTORRE_FWRD; - _motor_rechts_back_pin = H_MOTORRE_BACK; - _motor_rechts_enable_pin = H_MOTORRE_SPEED; - _led_frwd_pin = H_LED_VORWAERTS; - _led_stop_pin = H_LED_STOP; - _led_links_pin = H_LED_LINKS; - _led_rechts_pin = H_LED_RECHTS; - - _servo_dummy = new Servo(); - _servo = new Servo(); - - _servo_mitte = H_SERVO_MITTE; - _servo_links = H_SERVO_LINKS; - _servo_rechts = H_SERVO_RECHTS; - _schwenk_links = H_SERVO_SCHWENK_LINKS; - _schwenk_rechts = H_SERVO_SCHWENK_RECHTS; - - _schwenk_position = _servo_mitte; - _schwenk_richtung = SERVO_SCHWENK_LI; - _schwenk_millis = millis(); - - _motor_links_tempo = H_MOTORLI_TEMPO; - _motor_rechts_tempo = H_MOTORRE_TEMPO; - _drehung_links_ms = H_RACER_LINKS_MS; - _drehung_rechts_ms = H_RACER_RECHTS_MS; - - coderracer_activ = false; - _coderracer_activ = true; - _drive_forward = false; - _schwenk = false; - - _last_ledswitch_ms = millis(); - _last_led_on = 0; - _led_count = 1; - - _min_abstand_cm = 0; - - _servo_look_around_ms = millis(); - + _button_pin = H_BUTTON_PIN; + _servo_pin = H_SERVO_PIN; + _us_trigger_pin = H_US_TRIG_PIN; + _us_echo_pin = H_US_ECHO_PIN; + _drive_left_frwd_pin = H_DRIVE_LEFT_FWRD_PIN; + _drive_left_back_pin = H_DRIVE_LEFT_BACK_PIN; + _drive_left_enable_pin = H_DRIVE_LEFT_ENABLE_PIN; + _drive_right_frwd_pin = H_DRIVE_RIGHT_FWRD_PIN; + _drive_right_back_pin = H_DRIVE_RIGHT_BACK_PIN; + _drive_right_enable_pin = H_DRIVE_RIGHT_ENABLE_PIN; + _led_frwd_pin = H_LED_FRWD_PIN; + _led_stop_pin = H_LED_STOP_PIN; + _led_left_pin = H_LED_LEFT_PIN; + _led_right_pin = H_LED_RIGHT_PIN; } -// Konstruktor mit pin Übergaben ... - -CodeRacer::CodeRacer(int tasterpin , int servopin, - int us_trigger_pin, int us_echo_pin, - int motor_links_frwd_pin, int motor_links_back_pin, int motor_links_enable_pin, - int motor_rechts_frwd_pin, int motor_rechts_back_pin, int motor_rechts_enable_pin, - int led_frwd, int led_stop, int led_links, int led_rechts +/** @brief CodeRace constructor with pins.This will overwrite the default settings taken from the header file. +* @param button_pin Pin the external button is connected at +* @param servo_pin Pin the servo drive is connected at +* @param us_trigger_pin Pin the trigger signal of the ultrasonic sensor is connected at +* @param us_echo_pin Pin the echo signal of the ultrasonic sensor is connected at +* @param drive_left_frwd_pin Pin the forward pin of the left side drive device driver is connected at +* @param drive_left_back_pin Pin the backward pin of the left side drive device driver is connected at +* @param drive_left_enable_pin Pin the enable pin of the left side drive device driver is connected at +* @param drive_right_frwd_pin Pin the forward pin of the right side drive device driver is connected at +* @param drive_right_back_pin Pin the backward pin of the right side drive device driver is connected at +* @param drive_right_enable_pin Pin the enable pin of the right side drive device driver is connected at +* @param led_frwd_pin Pin the led that signals forward direction is connected at +* @param led_stop_pin Pin the led that signals that the drives are stopped is connected at +* @param led_left_pin Pin the led that signals left side direction is connected at +* @param led_right_pin Pin the led that signals right side direction is connected at +* @return nothing +*/ +CodeRacer::CodeRacer(uint8_t button_pin , uint8_t servo_pin, + uint8_t us_trigger_pin, uint8_t us_echo_pin, + uint8_t drive_left_frwd_pin, uint8_t drive_left_back_pin, uint8_t drive_left_enable_pin, + uint8_t drive_right_frwd_pin, uint8_t drive_right_back_pin, uint8_t drive_right_enable_pin, + uint8_t led_frwd_pin, uint8_t led_stop_pin, uint8_t led_left_pin, uint8_t led_right_pin ) { - _taster_pin = tasterpin; - _servopin = servopin; + _button_pin = button_pin; + _servo_pin = servo_pin; _us_trigger_pin = us_trigger_pin; _us_echo_pin = us_echo_pin; - _motor_links_frwd_pin = motor_links_frwd_pin; - _motor_links_back_pin = motor_links_back_pin; - _motor_links_enable_pin = motor_links_enable_pin; - _motor_rechts_frwd_pin = motor_rechts_frwd_pin; - _motor_rechts_back_pin = motor_rechts_back_pin; - _motor_rechts_enable_pin = motor_rechts_enable_pin; - _led_frwd_pin = led_frwd; - _led_stop_pin = led_stop; - _led_links_pin = led_links; - _led_rechts_pin = led_rechts; + _drive_left_frwd_pin = drive_left_frwd_pin; + _drive_left_back_pin = drive_left_back_pin; + _drive_left_enable_pin = drive_left_enable_pin; + _drive_right_frwd_pin = drive_right_frwd_pin; + _drive_right_back_pin = drive_right_back_pin; + _drive_right_enable_pin = drive_right_enable_pin; + _led_frwd_pin = led_frwd_pin; + _led_stop_pin = led_stop_pin; + _led_left_pin = led_left_pin; + _led_right_pin = led_right_pin; +} - _servo_dummy = new Servo(); +/** @brief Initialisation of all attributes and settings of the coderacer. Defaults are taken from the header file. +* @return nothing +*/ +void CodeRacer::begin() { + + // init of variables and objects + + _servo_dummy = new Servo(); // the dummy is needed so far to avoid conflicts with analog write _servo = new Servo(); + servo_center_pos = H_SERVO_CENTER_POS; + servo_left_pos = H_SERVO_LEFT_POS; + servo_right_pos = H_SERVO_RIGHT_POS; + servo_sweep_left_pos = H_SERVO_SWEEP_LEFT_POS; + servo_sweep_right_pos = H_SERVO_SWEEP_RIGHT_POS; + _servo_position = servo_center_pos; + _servo_sweep_step = SERVO_SWEEP_TO_LEFT_STEP; + _servo_position_set_at_ms = millis(); + _servo_position_eta_in_ms = 0; - _servo_mitte = H_SERVO_MITTE; - _servo_links = H_SERVO_LINKS; - _servo_rechts = H_SERVO_RECHTS; - _schwenk_links = H_SERVO_SCHWENK_LINKS; - _schwenk_rechts = H_SERVO_SCHWENK_RECHTS; + _drive_left_speed = H_DRIVE_LEFT_SPEED; + _drive_right_speed = H_DRIVE_RIGHT_SPEED; - _schwenk_position = _servo_mitte; - _schwenk_richtung = SERVO_SCHWENK_LI; - _schwenk_millis = millis(); - - _motor_links_tempo = H_MOTORLI_TEMPO; - _motor_rechts_tempo = H_MOTORRE_TEMPO; - _drehung_links_ms = H_RACER_LINKS_MS; - _drehung_rechts_ms = H_RACER_RECHTS_MS; + _turn_left_for_ms = H_RACER_TURN_LEFT_FOR_MS; + _turn_right_for_ms = H_RACER_TURN_RIGHT_FOR_MS; coderracer_activ = false; _coderracer_activ = true; - _drive_forward = false; - _schwenk = false; + _drive = false; + _drive_set_at_ms = millis(); + _servo_sweep = false; - _last_ledswitch_ms = millis(); + _last_led_switched_at_ms = millis(); _last_led_on = 0; - _led_count = 1; + _led_count = 3; - _servo_look_around_ms = millis(); + _servo_look_around_at_ms = millis() + random(FUN_MIN_PAUSE_MS, FUN_MAX_PAUSE_MS); - _min_abstand_cm = 0; + _usonic_stop_distance_cm = H_US_STOP_DISTANCE_CM; + usonic_set_stop_distance_cm(_usonic_stop_distance_cm); + _coderacer_stopped_at_min_distance = false; -} - - - -void CodeRacer::begin() { - - // Ultraschallsensor - pinMode(_us_trigger_pin, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet - pinMode(_us_echo_pin, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen + // Ultrasonic sensor + pinMode(_us_trigger_pin, OUTPUT); + pinMode(_us_echo_pin, INPUT); - // Servo - _servo->attach(_servopin); // dem Servo Objekt "sagen" an welchen Pin am Schaltkreis der Server angeschlossen ist + // Servo drive + _servo->attach(_servo_pin); - // Linker Motor - pinMode(_motor_links_frwd_pin, OUTPUT); // Linker Motor FORWARD ist ein Ausgang. - pinMode(_motor_links_back_pin, OUTPUT); // Linker Motor BACKWARD ist ein Ausgang. - ledcSetup(MOTORPWM_LINKS, 5000, 8); // channel 1, 50 Hz, 8-bit width - ledcAttachPin(_motor_links_enable_pin, MOTORPWM_LINKS); // Linker Motor SPEED mit Kanal 1 verbunden - analog_write(_motor_links_enable_pin, 0); // Linken Motor sicherheitshalber ausschalten :-) + // Left drive + pinMode(_drive_left_frwd_pin, OUTPUT); + pinMode(_drive_left_back_pin, OUTPUT); + set_drive_left_state(DRIVESTOP); + ledcSetup(DRIVE_PWM_LEFT_CHANNEL, 5000, 8); // channel , 50 Hz, 8-bit width + ledcAttachPin(_drive_left_enable_pin, DRIVE_PWM_LEFT_CHANNEL); // connect left drive enable with PWM channel - // Rechter Motor - pinMode(_motor_rechts_frwd_pin, OUTPUT); // Rechter Motor FORWARD ist ein Ausgang. - pinMode(_motor_rechts_back_pin, OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang. - ledcSetup(MOTORPWM_RECHTS, 5000, 8); // channel 2, 50 Hz, 8-bit width - ledcAttachPin(_motor_rechts_enable_pin, MOTORPWM_RECHTS); // Rechter Motor SPEED mit Kanal 2 verbunden - analog_write(_motor_rechts_enable_pin, 0); // Rechten Motor sicherheitshalber ausschalten :-) + // Right drive + pinMode(_drive_right_frwd_pin, OUTPUT); + pinMode(_drive_right_back_pin, OUTPUT); + set_drive_right_state(DRIVESTOP); + ledcSetup(DRIVE_PWM_RIGHT_CHANNEL, 5000, 8); // channel , 50 Hz, 8-bit width + ledcAttachPin(_drive_right_enable_pin, DRIVE_PWM_RIGHT_CHANNEL); // connect right drive enable pin with PWM channel - // LEDs - pinMode(_led_frwd_pin, OUTPUT); // LED Vorwärts ist ein Ausgang - pinMode(_led_stop_pin, OUTPUT); // LED Stop ist ein Ausgang - pinMode(_led_links_pin, OUTPUT); // LED Links ist ein Ausgang - pinMode(_led_rechts_pin, OUTPUT); // LED Rechts ist ein Ausgang - // alle LEDS aus - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); + // LEDs + pinMode(_led_frwd_pin, OUTPUT); + pinMode(_led_stop_pin, OUTPUT); + pinMode(_led_left_pin, OUTPUT); + pinMode(_led_right_pin, OUTPUT); + // all LEDS off + set_leds_all_off(); - // Taster - taster_last_pressed_ms = 0; - pinMode(_taster_pin, INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(_taster_pin), set_taster_state, FALLING); + // Button & -interrupt + button_last_pressed_at_ms = 0; + pinMode(_button_pin, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(_button_pin), _set_button_state, FALLING); // Random randomSeed(analogRead(0)); - Serial.println("CodeRacer initialisiert ... "); + //fun stuff + coderacer_fun_enabled = false; + } -void CodeRacer::servo_einstellungen(int winkel_mitte, int winkel_links, int winkel_rechts, int schwenk_links, int schwenk_rechts) +//************************************** +//*** Coderacer hihger level methods *** +//************************************** +/** @defgroup higherlevel Higher level methods, setters and getters +* @{ +*/ +/** @defgroup higherlevelmeths Methods +* @{ +*/ + +/** @brief Stops the racer and sets status LEDs. +* @return nothing +*/ +void CodeRacer::stop_driving() { + _servo_sweep = false; + _drive = false; + set_drives_stop_left_right(); + set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDOFF, LEDOFF); +} + +/** @brief Sets the speed and the directions of both drives so that it will move forward. +* +* The speed is taken from the header file or set by one of the methods defined in the lower level drive methods section +* @return nothing +*/ +void CodeRacer::drive_forward() { - _servo_mitte = winkel_mitte; - _servo_links = winkel_links; - _servo_rechts = winkel_rechts; - _schwenk_links = schwenk_links; - _schwenk_rechts = schwenk_rechts; - - _schwenk_position = _servo_mitte; - _schwenk_richtung = SERVO_SCHWENK_LI; - _schwenk_millis = millis(); - - Serial.println("CodeRacer Servo eingestellt ... "); - + drive_forward(_drive_left_speed, _drive_right_speed); } -void CodeRacer::motor_einstellungen(int motor_links_tempo, int motor_rechts_tempo, int drehung_links_ms, int drehung_rechts_ms) +/** @brief Sets the speed as specified for both drives and the directions of both drives so that it will move forward. +* +* The specified speed values for both drives will be stored internaly so next time if you use e.g. drive_forward() exactly the here specified values will be taken. +* @param left_speed speed for the left side drive. 0<=speed<=255 +* @param right_speed speed for the right side drive. 0<=speed<=255 +* @return nothing +*/ +void CodeRacer::drive_forward(uint8_t left_speed, uint8_t right_speed) { - _motor_links_tempo = motor_links_tempo; - _motor_rechts_tempo = motor_rechts_tempo; - _drehung_links_ms = drehung_links_ms; - _drehung_rechts_ms = drehung_rechts_ms; + set_drives_states_left_right(DRIVEFRWD, DRIVEFRWD); + set_drives_speed_left_right(left_speed, right_speed); + set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDON, LEDOFF); + _drive = true; + _drive_set_at_ms = millis(); } -void CodeRacer::analog_write(int pin, int speed) { - if (pin == _motor_links_enable_pin) { ledcWrite(MOTORPWM_LINKS, speed); } - if (pin == _motor_rechts_enable_pin) { ledcWrite(MOTORPWM_RECHTS, speed); } -} - -void CodeRacer::anhalten() { - Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben - _schwenk = false; - _drive_forward = false; - _drive_normal_forward = false; - //Rechten Motor abschalten - digitalWrite(_motor_rechts_frwd_pin, LOW); - digitalWrite(_motor_rechts_back_pin, LOW); - // Linken Motor abschalten - digitalWrite(_motor_links_frwd_pin, LOW); - digitalWrite(_motor_links_back_pin, LOW); - // Motoren beide ausschalten - analog_write(_motor_rechts_enable_pin, 0); - analog_write(_motor_links_enable_pin, 0); - // LEDs setzen - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_stop_pin, HIGH); - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); - delay(1000); -} - - -void CodeRacer::normal_tempo() +/** @brief Sets the speed and the directions of both drives so that it will move backward. +* +* The speed is taken from the header file or set by one of the methods defined in the lower level drive methods section +* @return nothing +*/ +void CodeRacer::drive_backward() { - //Serial.println("RACER_NORMAL_TEMPO"); // Meldung am Monitor ausgeben - analog_write(_motor_rechts_enable_pin, _motor_rechts_tempo); - analog_write(_motor_links_enable_pin, _motor_links_tempo); - _drive_forward = true; - _drive_normal_forward = true; + drive_backward(_drive_left_speed, _drive_right_speed); } -void CodeRacer::vorwaerts() +/** @brief Sets the speed as specified for both drives and the directions of both drives so that it will move backward. +* +* The specified speed values for both drives will be stored internaly so next time if you use e.g. drive_backward() exactly the here specified values will be taken. +* @param left_speed speed for the left side drive. 0<=speed<=255 +* @param right_speed speed for the right side drive. 0<=speed<=255 +* @return nothing +*/ +void CodeRacer::drive_backward(uint8_t left_speed, uint8_t right_speed) { + set_drives_states_left_right(DRIVEBACK, DRIVEBACK); + set_drives_speed_left_right(left_speed, right_speed); + set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDON, LEDOFF); + _drive = true; + _drive_set_at_ms = millis(); +} - Serial.println("RACER_VORWAERTS"); // Meldung am Monitor ausgeben +/** @brief Will turn the racer to the left for the internally stroe time in ms and with the internally stored speed. +* +* The speed for both the left side and right side drive can be set by the methods described in the lower level drive section. The turn to left time can be set by thoose methods as well. +* The method is delayed until the racer has turned. +* @return nothing +*/ +void CodeRacer::turn_left() +{ + turn_left(_turn_left_for_ms, _drive_left_speed, _drive_right_speed); +} - if (false == _drive_forward) { - // Rechten Motor auf vorwärts stellen - digitalWrite(_motor_rechts_frwd_pin, HIGH); - digitalWrite(_motor_rechts_back_pin, LOW); - // Linken Motor auf vorwärts stellen - digitalWrite(_motor_links_frwd_pin, HIGH); - digitalWrite(_motor_links_back_pin, LOW); - // Motoren beide anschalten - analog_write(_motor_rechts_enable_pin, MOTORRE_MAX_TEMPO); - analog_write(_motor_links_enable_pin, MOTORLI_MAX_TEMPO); - // LEDs setzen - digitalWrite(_led_frwd_pin, HIGH); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); +/** @brief Will turn the racer to the left for the specified time in ms and with the internally stored speed. +* +* The specified duration of time is stored internally and will be used next time by e.g. turn_left() +* @param turn_for_ms duration of time in ms to turn the racer +* @return nothing +*/ +void CodeRacer::turn_left(unsigned long turn_for_ms) +{ + turn_left(turn_for_ms, _drive_left_speed, _drive_right_speed); +} - _drive_forward = true; - _drive_normal_forward = false; - _drive_forward_ms = millis(); +/** @brief Will turn the racer to the left for the specified time in ms and with the specified speed. +* +* The specified duration of time and the specified speeds are stored internally and will be used next time by e.g. turn_left() +* @param turn_for_ms duration of time in ms to turn the racer +* @param left_speed speed for the left side drive +* @param right_speed speed for the right side drive +* @return nothing +*/ +void CodeRacer::turn_left(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed) +{ + _drive = false; + set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF); // LEDs setzen + set_drives_states_left_right(DRIVEBACK, DRIVEFRWD); + set_drives_speed_left_right(left_speed, right_speed); + // wait set delay for the timed turn + _turn_left_for_ms = turn_for_ms; + delay(_turn_left_for_ms); + // stop drives again + set_drives_stop_left_right(); +} - } else { - if (false == _drive_normal_forward) { - if ((millis() - _drive_forward_ms) > MOTOR_MAX_SPEED_START_MS) { - normal_tempo(); - } - } +/** @brief Will turn the racer to the right for the internally stroe time in ms and with the internally stored speed. +* +* The speed for both the left side and right side drive can be set by the methods described in the lower level drive section. The turn to right time can be set by thoose methods as well. +* The method is delayed until the racer has turned. +* @return nothing +*/ +void CodeRacer::turn_right() +{ + turn_right(_turn_right_for_ms, _drive_left_speed, _drive_right_speed); +} + +/** @brief Will turn the racer to the right for the specified time in ms and with the internally stored speed. +* +* The specified duration of time is stored internally and will be used next time by e.g. turn_right() +* @param turn_for_ms duration of time in ms to turn the racer +* @return nothing +*/ +void CodeRacer::turn_right(unsigned long turn_for_ms) +{ + turn_right(turn_for_ms, _drive_left_speed, _drive_right_speed); +} + +/** @brief Will turn the racer to the right for the specified time in ms and with the specified speed. +* +* The specified duration of time and the specified speeds are stored internally and will be used next time by e.g. turn_right() +* @param turn_for_ms duration of time in ms to turn the racer +* @param left_speed speed for the left side drive +* @param right_speed speed for the right side drive +* @return nothing +*/ +void CodeRacer::turn_right(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed) +{ + _drive = false; + set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDOFF, LEDON); // LEDs setzen + set_drives_states_left_right(DRIVEFRWD, DRIVEBACK); + set_drives_speed_left_right(left_speed, right_speed); + // wait set delay for the timed turn + _turn_right_for_ms = turn_for_ms; + delay(_turn_right_for_ms); + // stop drives again + set_drives_stop_left_right(); +} + +/** @brief Enables to stopp the racer if during a distance measurement the measured distance is smaller then the internally stored minimal distance. +* +* This allow all of the none-single shot ultra sonic measurement methods to stopp the racer in the case the measured distance is smaller than minimal distance. This is just the enablement - you have to call one of the none-single-shot ultra sonic measurement methods continously while driving and maybe sweeping the servo. +* If the racer was stopped can be checked with stopped_at_min_distance() - it will return true in that case. +* The minimal distance can be set by the ultrasonic sensor setter methods. +* There is an example coming with the coderacer libary that you can load and get an idea how that works. +* @return nothing +*/ +void CodeRacer::start_stop_at_min_distance() { + start_stop_at_min_distance(_usonic_stop_distance_cm); +} + +/** @brief Enables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. +* +* This is almos the same as described for start_stop_at_min_distance(). You can specify the distance in cm here - this value will be stored internally and used by start_stop_at_min_distance() next time. +* @param min_distance_cm the minimal disctance in cm +* @return nothing +*/ +void CodeRacer::start_stop_at_min_distance(unsigned long min_distance_cm) { + if (false == _coderacer_stop_at_distance_enabled) { + _coderacer_stopped_at_min_distance = false; + usonic_set_stop_distance_cm(min_distance_cm); + _coderacer_stop_at_distance_enabled = true; } } -void CodeRacer::rueckwaerts() -{ +/** @brief Disables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. +* @return nothing +*/ +void CodeRacer::stop_stop_at_min_distance() { + _coderacer_stop_at_distance_enabled = false; +} - Serial.println("RACER_RUECKWAERTS"); // Meldung am Monitor ausgeben - - if (false == _drive_forward) { - // Rechten Motor auf rückwärts stellen - digitalWrite(_motor_rechts_frwd_pin, LOW); - digitalWrite(_motor_rechts_back_pin, HIGH); - // Linken Motor auf rückwärts stellen - digitalWrite(_motor_links_frwd_pin, LOW); - digitalWrite(_motor_links_back_pin, HIGH); - // Motoren beide anschalten - analog_write(_motor_rechts_enable_pin, MOTORRE_MAX_TEMPO); - analog_write(_motor_links_enable_pin, MOTORLI_MAX_TEMPO); - // LEDs setzen - digitalWrite(_led_frwd_pin, HIGH); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); - - _drive_forward = true; - _drive_normal_forward = false; - _drive_forward_ms = millis(); - - } - else { - if (false == _drive_normal_forward) { - if ((millis() - _drive_forward_ms) > MOTOR_MAX_SPEED_START_MS) { - normal_tempo(); - } +/** @brief This will return if the codracer is in active mode or not. +* +* There is a button used to toogle between active and inactive each time it is pressed This may help you to start driving and scanning the distance by pressing the button - and as well to stop the racer by pressing the button. +* This method will set the LEDs depending on the mode and sets the servo back to center and stopps the racer when leaving the active mode. You can leave or enter the active mode as well by setting using set_active() and set_inactive(). +* The button itself triggers and internall interrupt event and sets the active state - but you have to continously call that method to switch between inactive and active mode depending on the active state. +* If in inactive mode and fun is enabeld by just setting the coderacer_fun_enabled = true ... some fun will happen :-) +* +* @return True if the coderacer is in active mode. False if in inactive mode. +*/ +bool CodeRacer::start_stop() { + if (_coderracer_activ != coderracer_activ) { + _coderracer_activ = coderracer_activ; + if (true == _coderracer_activ) { + set_leds_all_off(); + delay(500); } + else { + stop_driving(); + set_leds_all_on(); + delay(200); + servo_set_to_center(); + _servo_look_around_at_ms = millis() + random(20000, 120000); + } + } + + if ((false == _coderracer_activ) && (true == coderacer_fun_enabled)) { + kitt(); + look_around(); + } + + return(_coderracer_activ); +} + +/** @} */ // end of group higherlevelmeths + /** @defgroup higherlevelgetters Getters and setters + * @{ + */ + +/** @brief Returns true if the racer was stopped at minimum distance. This set to false each time start_stop_at_min_distance() is called. +* @return True if stopped. +*/ +bool CodeRacer::stopped_at_min_distance() { + return(_coderacer_stopped_at_min_distance); +} + +/** @brief Return true if the racer is driving - forward or backward +* @return True if driving forward or backward +*/ +bool CodeRacer::is_driving() { + return(_drive); +} + +/** @brief Returns the duration of time that is internally stored and used for turning the racer left +* @return Time to turn left in ms +*/ +unsigned long CodeRacer::turn_left_for_ms() { + return(_turn_left_for_ms); +} + +/** @brief Returns the duration of time that is internally stored and used for turning the racer left +* @return Time to turn left in ms +*/ +unsigned long CodeRacer::turn_right_for_ms() { + return(_turn_right_for_ms); +} + +/** @brief Sets the coderracer_active state to inactive. If start_stop() is used - the inactive mode will be entered. +* @return nothing +*/ +void CodeRacer::set_inactive() { + coderracer_activ = false; +} + +/** @brief Sets the coderracer_active state to active. If start_stop() is used - the active mode will be entered. +* @return nothing +*/ +void CodeRacer::set_active() { + coderracer_activ = true; +} + +/** @brief Checks if coderracer_activ is set. +* +* coderracer_activ is toggled each time the button is pressed. After power on coderracer_activ is set to False. +* @return True id coderracer_activ is set - False if not. +*/ +bool CodeRacer::is_active() { + return(coderracer_activ); +} + +/** @} */ // end of group higherlevelgetters +/** @} */ // end of group higherlevel + +//************************************** +//*** Just for fun *** +//************************************** +/** @defgroup lowerlevelfun Lower level fun stuff methods +* @{ +*/ +/** @brief Fun stuff - will move the servo around after a random amount of time +* @return nothing +*/ +void CodeRacer::look_around() +{ + if (_servo_look_around_at_ms < millis()) { + _servo_look_around_at_ms = millis() + random(FUN_MIN_PAUSE_MS, FUN_MAX_PAUSE_MS); + servo_set_to_left(); + delay(500); + servo_set_to_right(); + delay(800); + servo_set_to_center(); + delay(300); + servo_set_to_left(); + delay(100); + servo_set_to_center(); } } -void CodeRacer::links() +/** @brief Fun stuff - you know Knightrider... +* @return nothing +*/ +void CodeRacer::kitt() { - Serial.println("RACER_LINKS"); // Meldung am Monitor ausgeben - _drive_forward = false; - // LEDs setzen - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_links_pin, HIGH); - digitalWrite(_led_rechts_pin, LOW); - // Rechten Motor auf vorwärts stellen - digitalWrite(_motor_rechts_frwd_pin, HIGH); - digitalWrite(_motor_rechts_back_pin, LOW); - // Linken Motor auf rückwärts stellen - digitalWrite(_motor_links_frwd_pin, LOW); - digitalWrite(_motor_links_back_pin, HIGH); - // Motoren beide anschalten - analog_write(_motor_rechts_enable_pin, MOTORRE_MAX_TEMPO); - analog_write(_motor_links_enable_pin, MOTORLI_MAX_TEMPO); - // Warten bis der RAcer sich gedreht hat - delay(_drehung_links_ms); - // Motoren wieder auschalten - analog_write(_motor_rechts_enable_pin, 0); - analog_write(_motor_links_enable_pin, 0); -} - -void CodeRacer::rechts() -{ - Serial.println("RACER_RECHTS"); // Meldung am Monitor ausgeben - _drive_forward = false; - // LEDs setzen - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_rechts_pin, HIGH); - // Rechten Motor auf rückwärts stellen - digitalWrite(_motor_rechts_frwd_pin, LOW); - digitalWrite(_motor_rechts_back_pin, HIGH); - // Linken Motor auf vorwärts stellen - digitalWrite(_motor_links_frwd_pin, HIGH); - digitalWrite(_motor_links_back_pin, LOW); - // Motoren beide anschalten - analog_write(_motor_rechts_enable_pin, MOTORRE_MAX_TEMPO); - analog_write(_motor_links_enable_pin, MOTORLI_MAX_TEMPO); - // Warten bis der RAcer sich gedreht hat - delay(_drehung_rechts_ms); - // Motoren wieder auschalten - analog_write(_motor_rechts_enable_pin, 0); - analog_write(_motor_links_enable_pin, 0); -} - -void CodeRacer::servo_rechts() -{ - Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben - _schwenk = false; - _servo->write(_servo_rechts); // Servo auf den Winkel rechts drehen - _schwenk_position = _servo_rechts; // Servo schaut nach rechts - delay(1000); // Kurz warten, dass der Servo die Stellung erreicht -} - -void CodeRacer::servo_links() -{ - Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben - _schwenk = false; - _servo->write(_servo_links); // Servo auf den Winkel links drehen - _schwenk_position = _servo_links; // Servo schaut nach links - delay(1000); // Kurz warten, dass der Servo die Stellung erreicht -} - -void CodeRacer::servo_mitte() -{ - Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben - _schwenk = false; - _servo->write(_servo_mitte); // Servo auf den Winkel links drehen - _schwenk_position = _servo_mitte; // Servo schaut direkt nach vorn - _schwenk_millis = millis(); - delay(1000); // Kurz warten, dass der Servo die Stellung erreicht -} - -void CodeRacer::servo_schwenk() -{ - _schwenk = true; - if (millis() - _schwenk_millis > SERVO_SCHWENK_MS) { - _schwenk_position = _schwenk_position + _schwenk_richtung; - if (_schwenk_position >= _schwenk_links) { - _schwenk_position = _schwenk_links; - _schwenk_richtung = SERVO_SCHWENK_RE; - } - if (_schwenk_position <= _schwenk_rechts) { - _schwenk_position = _schwenk_rechts; - _schwenk_richtung = SERVO_SCHWENK_LI; - } - _servo->write(_schwenk_position); // Servo auf den Winkel links drehen - _schwenk_millis = millis(); - } -} - -void CodeRacer::knight_rider() -{ - if (millis() - _last_ledswitch_ms > LED_SWITCH_MS) { - _last_ledswitch_ms = millis(); + if (millis() - _last_led_switched_at_ms > LED_SWITCH_MS) { + _last_led_switched_at_ms = millis(); if (_last_led_on >= 5) { _led_count = -1; } - if(_last_led_on <= 0) { + else if (_last_led_on <= 0) { _led_count = 1; } _last_led_on = _last_led_on + _led_count; switch (_last_led_on) { case 0: - digitalWrite(_led_links_pin, HIGH); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); + set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF); break; case 1: - digitalWrite(_led_links_pin, HIGH); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); + set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF); break; case 2: - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_stop_pin, HIGH); - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); + set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDOFF, LEDOFF); break; case 3: - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_frwd_pin, HIGH); - digitalWrite(_led_rechts_pin, LOW); + set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDON, LEDOFF); break; case 4: - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_rechts_pin, HIGH); - break; case 5: - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_stop_pin, LOW); - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_rechts_pin, HIGH); + set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDOFF, LEDON); break; } } } -long CodeRacer::abstand_messen() +/** @} */ // end of group lowerlevelfun + +//************************************** +//*** Servo drive lower level control *** +//************************************** +/** @defgroup lowerlevelservo Lower level servo drive methods and getters +* @{ +*/ +/** @defgroup lowerlevelservomeths Methods +* @{ +*/ +/** @brief Overwrites the default settings taken from header file by the parameters given to this method +* @param pos_center The postion at which the servo moves to straight forward. Default is 90. Allowed 10 <= pos_center <= 170. +* @param pos_left The postion at which the servo moves to the left. Default is 170. Allowed 10 <= pos_center <= 170. +* @param pos_right The postion at which the servo moves to the right. Default is 10. Allowed 10 <= pos_center <= 170. +* @param sweep_left_pos If the servo is sweeping from left to the right - this defines the most left postion. Default is 140. Allowed 10 <= pos_center <= 170. +* @param sweep_right_pos If the servo is sweeping from left to the right - this defines the most right postion. Default is 40. Allowed 10 <= pos_center <= 170. +* @return nothing +*/ +void CodeRacer::servo_settings(uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos) { - long abstand_cm = 0; - long min_abstand_cm = 1000; - int servo_drehrichtung = 0; - - //Serial.print("ABSTAND_MESSEN. Aktuelle Servo position:"); - //Serial.println(_schwenk_position); - // wenn der Racer nicht fährt, dann wird mehrfach gemessen und der Servo um die aktuelle Positin gedreht ... wenn er faährt oder schwenk aktiv ist , wird einfach nur gemessen - if (((true == _drive_forward) || (true == _drive_normal_forward) || (H_SERVO_MITTE == _schwenk_position) || _schwenk == true)) { - // messen beim fahren ... - //Serial.println("ABSTAND_MESSEN im fahren, direkt nach vorn oder Schwenk() ist aktiv ..."); - min_abstand_cm = abstand_messen_intern(); - } else { - // messen im Stand und ohne schwenk ... - //Serial.println("ABSTAND_MESSEN im Stand nach links oder rechts..."); - // sind wir links oder rechts ? - if (H_SERVO_LINKS == _schwenk_position) { - //Serial.println("ABSTAND_MESSEN. Linke Seite."); - //links ... - servo_drehrichtung = SERVO_SCHWENK_RE; - } - if (H_SERVO_RECHTS == _schwenk_position) { - //rechts ... - //Serial.println("ABSTAND_MESSEN rechte Seite."); - servo_drehrichtung = SERVO_SCHWENK_LI; - } - // drehen und messen ... kleinsten Wert merken - do { - _schwenk_position = _schwenk_position + servo_drehrichtung; - _servo->write(_schwenk_position); - //Serial.print("ABSTAND_MESSEN. Servo position:"); - //Serial.println(_schwenk_position); - delay(50); - abstand_cm = abstand_messen_intern(); - if (abstand_cm < min_abstand_cm) { - min_abstand_cm = abstand_cm; - } - } while ((_schwenk_position > H_SERVO_MITTE_LINKS) || (_schwenk_position < H_SERVO_MITTE_RECHTS)); - } - - Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist (mindestens):"); - Serial.println(min_abstand_cm); - _min_abstand_cm = min_abstand_cm; - - return(min_abstand_cm); + servo_center_pos = pos_center; + servo_left_pos = pos_left; + servo_right_pos = pos_right; + servo_sweep_left_pos = sweep_left_pos; + servo_sweep_right_pos = sweep_right_pos; } -long CodeRacer::abstand_messen_intern() +/** @brief Turns sweeping of the servo from left to right and back on. +* +* The sweeping range is defind by #servo_sweep_left_pos and #servo_sweep_right_pos attributes. Both can be set by either servo_settings() or as public members. +* Every time servo_sweep() is called the servo is driven by 5 steps until either #servo_sweep_left_pos or #servo_sweep_right_pos is reached. Then it will turn the +* direction and step to the other side every time this method is called. +* @return nothing +*/ +void CodeRacer::servo_sweep() { - long abstand_cm; - long long echo_dauer_us[3] = { 0,0,0 }; - int messnr = 0; + uint8_t position; + _servo_sweep = true; + if (millis() - _servo_position_set_at_ms > SERVO_SWEEP_MS) { + position = _servo_position + _servo_sweep_step; + //sprintf(_debugmsg,"[%s] current position=%ld newpostion=%ld", __func__, _servo_position, position); + if ((position >= servo_sweep_left_pos) || (position >= SERVO_MAX_POSITION)) { + position = servo_sweep_left_pos; + _servo_sweep_step = SERVO_SWEEP_TO_RIGHT_STEP; + } + if ((position <= servo_sweep_right_pos) || (position <= SERVO_MIN_POSITION)) { + position = servo_sweep_right_pos; + _servo_sweep_step = SERVO_SWEEP_TO_LEFT_STEP; + } + _servo_set_position(position); + } +} - do{ - // Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt +/** @brief Drives the servo to the postion that is defined by #servo_right_pos +* @return nothing +*/ +void CodeRacer::servo_set_to_right() +{ + servo_set_position_wait(servo_right_pos); +} + +/** @brief Drives the servo to the postion that is defined by #servo_left_pos +* @return nothing +*/ +void CodeRacer::servo_set_to_left() +{ + servo_set_position_wait(servo_left_pos); +} + +/** @brief Drives the servo to the postion that is defined by #servo_center_pos +* @return nothing +*/ +void CodeRacer::servo_set_to_center() +{ + servo_set_position_wait(servo_center_pos); +} + +/** @brief Drive the servo to the postion given to this method +* +* The method will wait until the servo has reached its new position. +* @param position Position the servo will be drived to. Allowed are values 10<=postion<=170. 10 is at the right hand side, 170 at the left hand side. +* @return The new servo position +*/ +uint8_t CodeRacer::servo_set_position_wait(uint8_t position) +{ + _servo_sweep = false; + unsigned long wait_time_ms = _servo_set_position(position); + delay(wait_time_ms); + return(_servo_position); +} + +/** @brief Drive the servo to the postion given to this method +* +* The method will not wait until the servo has reached its new position. +* @param position Position the servo will be drived to. Allowed are values 10<=postion<=170. 10 is at the right hand side, 170 at the left hand side. +* @return The time in ms the servo will need to reach the new position +*/ +unsigned long CodeRacer::servo_set_position(uint8_t position) +{ + _servo_sweep = false; + unsigned long wait_time_ms = _servo_set_position(position); + return(wait_time_ms); +} + +unsigned long CodeRacer::_servo_set_position(uint8_t position) +{ + uint8_t _position = position; + uint8_t absdiff; + + if (position < SERVO_MIN_POSITION) { + _position = SERVO_MIN_POSITION; + } + else if (position > SERVO_MAX_POSITION) { + _position = SERVO_MAX_POSITION; + } + _servo->write(_position); + // wait minimal delay to avoid code collaps + delay(SERVO_SET_1TICK_POSITION_DELAY_MS); + absdiff = abs(_servo_position - _position); + if (absdiff > 1) { + _servo_position_eta_in_ms = absdiff * SERVO_SET_1TICK_POSITION_DELAY_MS; + } + else { + _servo_position_eta_in_ms = 0; + } + + _servo_position_set_at_ms = millis(); + _servo_position = _position; + + return(_servo_position_eta_in_ms); +} + +/** @} */ // end of group lowerlevelservomeths +/** @defgroup lowerlevelservogetters Getters +* @{ +*/ + +/** @brief Get the actual position of the servo +* @return Actual position of the servo +*/ +uint8_t CodeRacer::servo_position() { + return(_servo_position); +} + +/** @brief Get the system time in ms the servo was set to the actual position +* @return System time in ms the servo was set +*/ +unsigned long CodeRacer::servo_position_set_at_ms() { + return(_servo_position_set_at_ms); +} + +/** @brief Get the system time in ms the servo will reach its position +* This is an estimated time. +* If this is a time in the future, the servo may still moving. +* If this is a time in the past , the servo should have reached its postion already. +* @return System time in ms the servo will reach its position +*/ +unsigned long CodeRacer::servo_position_eta_in_ms() { + return(_servo_position_eta_in_ms); +} + +/** @} */ // end of group lowerlevelservogetters +/** @} */ // end of group lowerlevelservo + + +//************************************** +//*** Ultrasonic lower level control *** +//************************************** +/** @defgroup lowerlevelus Lower level ultra sonic methods and getters +* @{ +*/ +/** @defgroup lowerlevelusmeths Methods +* @{ +*/ + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in cm. +* +* This is the medium one out of 3 measurements. The maximum measured distance is about 100cm and defined by the US_MAX_ECHO_TIME_US setting in the header file. +* @return The measured distance in cm. +*/ +unsigned long CodeRacer::usonic_measure_cm() +{ + return(usonic_measure_cm(US_MAX_ECHO_TIME_US)); +} + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in microseconds. +* +* This is the medium one out of 3 measurements. The maximum measured distance is about 6000 microseconds and defined by the US_MAX_ECHO_TIME_US setting in the header file. +* @return The measured distance in microseconds. +*/ +unsigned long CodeRacer::usonic_measure_us() + { + return(usonic_measure_us(US_MAX_ECHO_TIME_US)); + } + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in cm. +* +* This is the medium one out of 3 measurements. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. +* The maximum range the sensor is specified for is about 300cm. +* @param max_echo_run_time_us Defines the maximum echo run time and by that the maximum of distance that can be measured. +* @return The measured distance in cm. +*/ +unsigned long CodeRacer::usonic_measure_cm(unsigned long max_echo_run_time_us) +{ + unsigned long echo_runtime_us = usonic_measure_us(max_echo_run_time_us); + unsigned long distance_cm = echo_runtime_us * 0.0172; + //Serial.print("MEASURE_DISTANCE. Distance in cm is: "); + //Serial.println(distance_cm); + _usonic_distance_cm = distance_cm; + return(distance_cm); +} + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in microseconds. +* +* This is the medium one out of 3 measurements. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. +* The maximum range the sensor is specified for is about 300cm. +* @param max_echo_run_time_us Defines the maximum echo run time in microseconds and by that the maximum of distance that can be measured. +* @return The measured distance in microseconds. +*/ +unsigned long CodeRacer::usonic_measure_us(unsigned long max_echo_run_time_us) +{ + unsigned long echo_runtime_us[3] = { 0,0,0 }; + uint8_t measnr = 0; + + do { + echo_runtime_us[measnr] = usonic_measure_single_shot_us(max_echo_run_time_us); + if (echo_runtime_us[measnr] > 200) { + measnr++; + } + } while (measnr < 3); + + // we will take the medium out of 3 values ... + if (echo_runtime_us[0] > echo_runtime_us[1]) { std::swap(echo_runtime_us[0], echo_runtime_us[1]); } + if (echo_runtime_us[1] > echo_runtime_us[2]) { std::swap(echo_runtime_us[1], echo_runtime_us[2]); } + if (echo_runtime_us[0] > echo_runtime_us[1]) { std::swap(echo_runtime_us[0], echo_runtime_us[1]); } + + //Serial.print("MEASURE_DISTANCE_US. Echo runtime in us is: "); + //Serial.println(echo_runtime_us[1]); + + // if the stop at minimal distance is enabeled - check for minimal distance is reached + if (true == _coderacer_stop_at_distance_enabled) { + if (echo_runtime_us[1] <= _usonic_stop_distance_us) { + _coderacer_stopped_at_min_distance = true; + stop_driving(); + _coderacer_stop_at_distance_enabled = false; + } + } + _usonic_distance_us = echo_runtime_us[1]; + return(echo_runtime_us[1]); +} + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in cm. +* +* This is a one shot measurement. The maximum measured distance is about 6000 microseconds and defined by the US_MAX_ECHO_TIME_US setting in the header file. +* @return The measured distance in cm. +*/ +unsigned long CodeRacer::usonic_measure_single_shot_cm() +{ + return(usonic_measure_single_shot_cm(US_MAX_ECHO_TIME_US)); +} + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in microseconds. +* +* This is a one shot measurement. The maximum measured distance is about 6000 microseconds and defined by the US_MAX_ECHO_TIME_US setting in the header file. +* @return The measured distance in microseconds. +*/ +unsigned long CodeRacer::usonic_measure_single_shot_us() +{ + return(usonic_measure_single_shot_us(US_MAX_ECHO_TIME_US)); +} + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in cm. +* +* This is a one shot measurement. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. +* The maximum range the sensor is specified for is about 300cm. +* @param max_echo_run_time_us Defines the maximum echo run time in microseconds and by that the maximum of distance that can be measured. +* @return The measured distance in cm. +*/ +unsigned long CodeRacer::usonic_measure_single_shot_cm(unsigned long max_echo_run_time_us) +{ + // convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec + // the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one + // distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172 + // distance_cm = (echo_duration/2) / 29.1; + unsigned long echo_runtime_us = usonic_measure_single_shot_us(max_echo_run_time_us); + unsigned long distance_cm = echo_runtime_us * 0.0172; + //Serial.print("MEASURE_DISTANCE. Distance in cm is: "); + //Serial.println(distance_cm); + _usonic_distance_cm = distance_cm; + return(distance_cm); +} + +/** @brief Measures the distance to the next object in front of the ultra sonic sensor in microseconds. +* +* This is a one shot measurement. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. +* The maximum range the sensor is specified for is about 300cm. +* @param max_echo_run_time_us Defines the maximum echo run time in microseconds and by that the maximum of distance that can be measured. +* @return The measured distance in microseconds. +*/ +unsigned long CodeRacer::usonic_measure_single_shot_us(unsigned long max_echo_run_time_us) + { + unsigned long echo_runtime_us; + // start measurement - send a short pulse "HIGH" to the TRIG pin of the ultrasonic sensor pinMode(_us_echo_pin, OUTPUT); pinMode(_us_echo_pin, INPUT); digitalWrite(_us_trigger_pin, LOW); @@ -498,92 +799,404 @@ long CodeRacer::abstand_messen_intern() digitalWrite(_us_trigger_pin, HIGH); delayMicroseconds(10); digitalWrite(_us_trigger_pin, LOW); - - // Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird - echo_dauer_us[messnr] = pulseIn(_us_echo_pin, HIGH, US_MAX_ECHO_TIME_US); - if (echo_dauer_us[messnr] == 0) { - echo_dauer_us[messnr] = US_MAX_ECHO_TIME_US; - messnr++; - } else { - if (echo_dauer_us[messnr] > 200) { - messnr++; - } + // measure runtime in microseconds until the ECHO pin aof the sensor goes HIGH + echo_runtime_us = pulseInLong(_us_echo_pin, HIGH, max_echo_run_time_us); + if (echo_runtime_us == 0) { + echo_runtime_us = max_echo_run_time_us; // US_MAX_ECHO_TIME_US; } - } while (messnr < 3); + //Serial.print("MEASURE_DISTANCE_US. Echo runtime in us is: "); + //Serial.println(echo_runtime_us); + _usonic_distance_us = echo_runtime_us; + return(echo_runtime_us); + } - // the largest and the smallest values will be ignored ... - if (echo_dauer_us[0] > echo_dauer_us[1]) - { - std::swap(echo_dauer_us[0], echo_dauer_us[1]); +/** @} */ // end of group lowerlevelusmethods +/** @defgroup lowerlevelusgetters Setters and getters +* @{ +*/ + +/** @brief Sets the stop distance in cm. +* +* If start_stop_at_min_distance() is used and distance measured with one of the measurement methods - the racer will be stopped immediately. All except the singe shot methods of the ultra sonic measurements methods supports that. +* Internally the stop distance will be set as both - in cm and in microseconds. +* @param stop_distance_cm Distance in cm the racer will be stopped if that features was enabled by start_stop_at_min_distance() before. +* @return nothing +*/ +void CodeRacer::usonic_set_stop_distance_cm(unsigned long stop_distance_cm) +{ + _usonic_stop_distance_us = stop_distance_cm * 58.14; +} + +/** @brief Sets the stop distance in cm. +* +* If start_stop_at_min_distance() is used and distance measured with one of the measurement methods - the racer will be stopped immediately. All except the singe shot methods of the ultra sonic measurements methods supports that. +* Internally the stop distance will be set as both - in cm and in microseconds. +* @param stop_distance_us Distance in cm the racer will be stopped if that features was enabled by start_stop_at_min_distance() before. +* @return nothing +*/ +void CodeRacer::usonic_set_stop_distance_us(unsigned long stop_distance_us) +{ + _usonic_stop_distance_us = stop_distance_us; +} + +/** @brief Returns the last measured distance in microseconds +* @return Distance in microseconds +*/ +unsigned long CodeRacer::usonic_distance_us() { + return(_usonic_distance_us); +} + +/** @brief Returns the last measured distance in cm +* @return Distance in cm +*/ +unsigned long CodeRacer::usonic_distance_cm() { + return(_usonic_distance_cm); +} + +/** @} */ // end of group lowerlevelusgetters +/** @} */ // end of group lowerlevelus + + +//************************************** +//*** Drives lower level control *** +//************************************** + +/** @defgroup lowerleveldrives Lower level drives methods and getters +* @{ +*/ +/** @defgroup lowerleveldrivesmeths Methods +* @{ +*/ + +/** @brief Overwrites some drive settings. This will replace the defaults set by the values in the header file. +* @param drive_left_speed Speed of the left side drive +* @param drive_right_speed Speed of the right side drive +* @param turn_left_for_ms Time in ms the racer will turn to the left around its center if turn_left() is called +* @param turn_right_for_ms Time in ms the racer will turn to the right around its center if turn_right() is called +* @return nothing +*/ +void CodeRacer::drives_settings(uint8_t drive_left_speed, uint8_t drive_right_speed, unsigned long turn_left_for_ms, unsigned long turn_right_for_ms) +{ + _drive_left_speed = drive_left_speed; + _drive_right_speed = drive_right_speed; + _turn_left_for_ms = turn_left_for_ms; + _turn_right_for_ms = turn_right_for_ms; +} + +/** @brief Stopps both drives +* @return nothing +*/ +void CodeRacer::set_drives_stop_left_right() { + set_drive_left_state(DRIVESTOP); + set_drive_right_state(DRIVESTOP); +} + +/** @brief Sets both of the drives to a specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK) +* @param stateleft drivestate to set for the left side drive +* @param stateright drivestate to set for the right side drive +* @return nothing +*/ +void CodeRacer::set_drives_states_left_right(drivestate stateleft, drivestate stateright) { + set_drive_left_state(stateleft); + set_drive_right_state(stateright); +} + +/** @brief Sets the left side drive to the specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK) +* @param state drivestate to set for the left side drive +* @return nothing +*/ +void CodeRacer::set_drive_left_state(drivestate state) { + set_drive_state(state, _drive_left_frwd_pin, _drive_left_back_pin); +} + +/** @brief Sets the right side drive to the specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK) +* @param state drivestate to set for the right side drive +* @return nothing +*/ +void CodeRacer::set_drive_right_state(drivestate state) { + set_drive_state(state, _drive_right_frwd_pin, _drive_right_back_pin); +} + +/** @brief Sets the specified drivestate for the drive connected to the sepecified pins (DRIVESTOP, DRIVEFRWD, DRIVEBACK) +* @param state drivestate to set for the connected drive +* @param frwdpin Pin the forward signal of the drive device driver is connected at +* @param backpin Pin the backward signal of the drive device driver is connected at +* @return nothing +*/ +void CodeRacer::set_drive_state(drivestate state, uint8_t frwdpin, uint8_t backpin) { + switch (state) { + case DRIVESTOP: + digitalWrite(frwdpin, LOW); + digitalWrite(backpin, LOW); + break; + case DRIVEFRWD: + digitalWrite(frwdpin, HIGH); + digitalWrite(backpin, LOW); + break; + case DRIVEBACK: + digitalWrite(frwdpin, LOW); + digitalWrite(backpin, HIGH); + break; } - if (echo_dauer_us[1] > echo_dauer_us[2]) - { - std::swap(echo_dauer_us[1],echo_dauer_us[2]); +} + +/** @brief Sets the speed for both of the drives. +* +* The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before +* @param speedleft speed of the left side drive. 0<=speed<=255 +* @param speedright speed of the right side drive. 0<=speed<=255 +* @return nothing +*/ +void CodeRacer::set_drives_speed_left_right(uint8_t speedleft, uint8_t speedright) { + set_drive_left_speed(speedleft); + set_drive_right_speed(speedright); +} + +/** @brief Sets the speed for the left side drive. +* +* The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before +* @param speed speed of the left side drive. 0<=speed<=255 +* @return nothing +*/ +void CodeRacer::set_drive_left_speed(uint8_t speed) { + set_drive_speed(speed, _drive_left_enable_pin); +} + +/** @brief Sets the speed for the right side drive. +* +* The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before +* @param speed speed of the right side drive. 0<=speed<=255 +* @return nothing +*/ +void CodeRacer::set_drive_right_speed(uint8_t speed) { + set_drive_speed(speed, _drive_right_enable_pin); +} + +/** @brief Sets the speed for the drive of the enable pin connected to the specified pin. +* +* The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before +* @param speed speed of the drive. 0<=speed<=255 +* @param enablepin Pin the drives device driver enable pin is connected at +* @return nothing +*/ +void CodeRacer::set_drive_speed(uint8_t speed, uint8_t enablepin) { + _analog_write(enablepin, (int)speed); +} + +/** @} */ // end of group lowerleveldrivesmethods +/** @defgroup lowerleveldrivesgetters Getters +* @{ +*/ + +/** @brief Get the setting for the speed of the right side drive +* @return Speed of the right side drive +*/ +uint8_t CodeRacer::drive_right_speed() { + return _drive_right_speed; +} + +/** @brief Get the setting for the speed of the left side drive +* @return Speed of the left side drive +*/ +uint8_t CodeRacer::drive_left_speed() { + return(_drive_left_speed); +} + +void CodeRacer::_analog_write(uint8_t pin, uint8_t speed) { + if (pin == _drive_left_enable_pin) { + _drive_left_speed = speed; + ledcWrite(DRIVE_PWM_LEFT_CHANNEL, speed); } - if (echo_dauer_us[0] > echo_dauer_us[1]) - { - std::swap(echo_dauer_us[0], echo_dauer_us[1]); + if (pin == _drive_right_enable_pin) { + _drive_right_speed = speed; + ledcWrite(DRIVE_PWM_RIGHT_CHANNEL, speed); } - // convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec - // the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one - // distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172 - // distance_cm = (echo_duration/2) / 29.1; - abstand_cm = echo_dauer_us[1] * 0.0172; +} + +/** @} */ // end of group lowerleveldrivesgetters +/** @} */ // end of group lowerleveldrives + + +//************************************** +//*** LED lower level control *** +//************************************** +/** @defgroup lowerlevelled Lower level LED methods +* @{ +*/ +/** @defgroup lowerlevelledmeths Methods +* @{ +*/ + +/** @brief Sets all of the 4 LEDs to a ledstate (LEDON, LEDOFF) +* @param leftled set state of status left LED (most left yellow led) +* @param stopled set state of status stop LED (red led) +* @param frwdled set state of status forward LED (green or blue led) +* @param rightled set state of status right LED (most right yellow led) +* @return nothing +*/ +void CodeRacer::set_leds_left_stop_frwd_right(ledstate leftled, ledstate stopled, ledstate frwdled, ledstate rightled) { + digitalWrite(_led_left_pin, leftled); + digitalWrite(_led_frwd_pin, frwdled); + digitalWrite(_led_right_pin, rightled); + digitalWrite(_led_stop_pin, stopled); +} + +/** @brief Sets all of the 4 LEDs to the same ledstate (LEDON, LEDOFF) +* @param alleds set state to all status LEDs +* @return nothing +*/ +void CodeRacer::set_leds_all(ledstate alleds) { + digitalWrite(_led_left_pin, alleds); + digitalWrite(_led_frwd_pin, alleds); + digitalWrite(_led_right_pin, alleds); + digitalWrite(_led_stop_pin, alleds); +} + +/** @brief Sets all of the 4 LEDs to the ledstate LEDOFF +* @return nothing +*/ +void CodeRacer::set_leds_all_off() { + set_leds_all(LEDOFF); +} + +/** @brief Sets all of the 4 LEDs to the ledstate LEDON +* @return nothing +*/ +void CodeRacer::set_leds_all_on() { + set_leds_all(LEDON); +} + +/** @} */ // end of group lowerlevelledmets +/** @} */ // end of group lowerlevelled + + +//************************************** +//*** ISRs *** +//************************************** +//IRAM_ATTR is used to load the code into DRAM and not to Flash to make it faster - required for ISRs +void IRAM_ATTR CodeRacer::_set_button_state() { + if ((millis() - button_last_pressed_at_ms) > BUTTON_BOUNCING_TIME_MS) { + button_last_pressed_at_ms = millis(); // simplest debouncing - just wait ;-) + coderracer_activ = !coderracer_activ; + } +} + + +//********************************************************************************************************************** +//** Methods below this are obsolete and only in here for compatiblity to other projects - do not use them anymore !!! +//********************************************************************************************************************** +void CodeRacer::motor_einstellungen(uint8_t drive_left_speed, uint8_t drive_right_speed, unsigned long turn_left_for_ms, unsigned long turn_right_for_ms) +{ + drives_settings(drive_left_speed, drive_right_speed, turn_left_for_ms, turn_right_for_ms); +} + +void CodeRacer::servo_einstellungen(uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos) +{ + servo_settings(pos_center, pos_left, pos_right, sweep_left_pos, sweep_right_pos); +} + +void CodeRacer::servo_rechts() +{ + Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben + servo_set_to_right(); // Servo auf den Winkel rechts drehen +} + +void CodeRacer::servo_links() +{ + Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben + servo_set_to_left(); // Servo auf den Winkel links drehen +} + +void CodeRacer::servo_mitte() +{ + Serial.println("SERVO_MITTE"); + servo_set_to_center(); +} + +void CodeRacer::servo_schwenk() +{ + servo_sweep(); +} + +void CodeRacer::links() +{ + Serial.println("CODERACER_LINKS"); + turn_left(); +} + +void CodeRacer::rechts() +{ + Serial.println("CODERACER_RECHTS"); + turn_right(); +} + +void CodeRacer::anhalten() +{ + Serial.println("CODERACER_ANHALTEN"); + stop_driving(); +} + +void CodeRacer::vorwaerts() +{ + Serial.println("CODERACER_VORWAERTS"); + drive_forward(); +} + +void CodeRacer::rueckwaerts() +{ + Serial.println("CODERACER_RUECKWAERTS"); + drive_backward(); +} + +unsigned long CodeRacer::abstand_messen() +{ + return(0); - //Messwert am Monitor anzeigen - //Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist (mindestens):"); - //Serial.println(abstand_cm); + unsigned long distance_cm = 0; + unsigned long min_distance_cm = 1000; + int8_t servo_turn_direction = 0; - return(abstand_cm); -} -bool CodeRacer::start_stop() { - if (_coderracer_activ != coderracer_activ) { - _coderracer_activ = coderracer_activ; - if (true == _coderracer_activ) { - digitalWrite(_led_links_pin, LOW); - digitalWrite(_led_frwd_pin, LOW); - digitalWrite(_led_rechts_pin, LOW); - digitalWrite(_led_stop_pin, LOW); - servo_rechts(); - servo_links(); - servo_mitte(); - delay(500); + // while driving or sweeping there will be only one value be measured - else there will be mutiple measurements and the servor will be turning + if (((true == _drive) || (servo_center_pos == _servo_position) || _servo_sweep == true)) { + // while driving ... + //Serial.println("ABSTAND_MESSEN im fahren, direkt nach vorn oder Schwenk() ist aktiv ..."); + min_distance_cm = usonic_measure_cm(); + } else { + // no sweep, not driving ... + //Serial.println("ABSTAND_MESSEN im Stand nach links oder rechts..."); + // are we already ath left or right with the servo ? + if (servo_left_pos == _servo_position) { + //Serial.println("ABSTAND_MESSEN. Linke Seite."); + //left ... + servo_turn_direction = SERVO_SWEEP_TO_RIGHT_STEP; } - else { - anhalten(); - servo_mitte(); - _servo_look_around_ms = millis() + random(5000, 120000); + if (servo_right_pos == _servo_position) { + //right ... + //Serial.println("ABSTAND_MESSEN rechte Seite."); + servo_turn_direction = SERVO_SWEEP_TO_LEFT_STEP; } + // trun the servo and do measuring ... remember the smallest value + do { + _servo_set_position(_servo_position + servo_turn_direction); + //Serial.print("ABSTAND_MESSEN. Servo position:"); + //Serial.println(_servo_position); + distance_cm = usonic_measure_cm(); + if (distance_cm < min_distance_cm) { + min_distance_cm = distance_cm; + } + } while ((_servo_position > H_SERVO_CENTER_LEFT) || (_servo_position < H_SERVO_CENTER_RIGHT)); } - if (false == _coderracer_activ) { - knight_rider(); - if (_servo_look_around_ms < millis()) { - _servo_look_around_ms = millis() + random(5000, 120000); - servo_links(); - delay(500); - servo_rechts(); - delay(800); - servo_mitte(); - delay(300); - servo_links(); - delay(100); - servo_mitte(); - } - } - - return(_coderracer_activ); + Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist (mindestens):"); + Serial.println(min_distance_cm); + //_min_distance_cm = min_distance_cm; + + return(min_distance_cm); + } -void IRAM_ATTR CodeRacer::set_taster_state() { - if ((millis() - taster_last_pressed_ms) > 200) { - taster_last_pressed_ms = millis(); - if (false == coderracer_activ) { - coderracer_activ = true; - } - else { - coderracer_activ = false; - } - } -} +//********************************************************************************************************************** +//** Helper methods +//********************************************************************************************************************** + diff --git a/Arduino/libraries/CodeRacer/CodeRacer.h b/Arduino/libraries/CodeRacer/CodeRacer.h index 633be30..a690f08 100644 --- a/Arduino/libraries/CodeRacer/CodeRacer.h +++ b/Arduino/libraries/CodeRacer/CodeRacer.h @@ -1,141 +1,241 @@ #include "Arduino.h" -#include //// std::swap -#include -#include "esp32-hal-ledc.h" +#include // std::swap +#include // Servo drive support for ESP32 +#include "esp32-hal-ledc.h" // Part of ESP32 board files - Analog output #ifndef __CodeRacer_H__ #define __CodeRacer_H__ -//----- Taster ------------ -#define H_TASTERPIN 17 +//----- Fun stuff --------- +#define FUN_MIN_PAUSE_MS 120000 // minimum and maximum pause between to rounds fun +#define FUN_MAX_PAUSE_MS 300000 +#define LED_SWITCH_MS 50 // speed of knight rider lights +//----- Button ------------ +#define H_BUTTON_PIN 17 +#define BUTTON_BOUNCING_TIME_MS 200 // bouncing delay //----- Servo ----- -#define H_SERVOPIN 16 // Pin an dem der Servomotor angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_SERVO_LINKS 145 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein -#define H_SERVO_MITTE_LINKS 100 // Bis hier geht die Entfernungsmessung im Stand links -#define H_SERVO_RECHTS 35 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein -#define H_SERVO_MITTE_RECHTS 80 // Bis hier geht die Entfernungsmessung im Stand rechts -#define H_SERVO_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein -#define H_SERVO_SCHWENK_LINKS 140 -#define H_SERVO_SCHWENK_RECHTS 40 +#define H_SERVO_PIN 16 +#define H_SERVO_LEFT_POS 145 // left position of the servo +#define H_SERVO_CENTER_LEFT 100 // left-center position of the servo +#define H_SERVO_RIGHT_POS 35 // right position of the servo +#define H_SERVO_CENTER_RIGHT 80 // right-center position of the servo +#define H_SERVO_CENTER_POS 90 // center position of the servo +#define H_SERVO_SWEEP_LEFT_POS 140 // most left sweep position of the servo +#define H_SERVO_SWEEP_RIGHT_POS 40 // most right sweep position of the servo +#define SERVO_SWEEP_TO_LEFT_STEP 5 // sweep step to the left +#define SERVO_SWEEP_TO_RIGHT_STEP -5 // sweep step to the right +#define SERVO_SWEEP_MS 10 // duration of time betwee to sweep steps +#define SERVO_MAX_POSITION 170 // maximum servo position +#define SERVO_MIN_POSITION 10 // minimum servo position +#define SERVO_SET_1TICK_POSITION_DELAY_MS 3 // minimum duration of time between two servo steps -#define SERVO_SCHWENK_LI 5 -#define SERVO_SCHWENK_RE -5 -#define SERVO_SCHWENK_MS 10 +//----- Ultrasonic sensor ----- +#define H_US_TRIG_PIN 12 +#define H_US_ECHO_PIN 14 +#define H_US_STOP_DISTANCE_CM 25 // if the measured distance is smaller the racer maybe stopped +#define US_MAX_ECHO_TIME_US 6000 // timeout for ultrasonic sensor measurements - this is about 100cm -//----- Ultraschallsensor ----- -#define H_US_TRIG 12 // Pin an dem der TRIG Pin des Ultraschallsensor angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_US_ECHO 14 // Pin an dem der ECHO Pin des Ultraschallsensor angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_US_STOP_ABSTAND_CM 5 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an -#define US_MAX_ECHO_TIME_US 6000 // Wenn die Zeit für das Echo länger dauert als diese Zeit, ist der Racer weit genug weg und wir müssen nicht weiter warten. +//----- Drives ----- +#define H_DRIVE_RIGHT_SPEED 255 // default speed of right side drive. 0 ...255 +#define H_DRIVE_LEFT_SPEED 255 // default speed of left side drive. 0 ...255 +#define H_DRIVE_RIGHT_ENABLE_PIN 2 +#define H_DRIVE_RIGHT_FWRD_PIN 4 +#define H_DRIVE_RIGHT_BACK_PIN 15 +#define H_DRIVE_LEFT_ENABLE_PIN 21 +#define H_DRIVE_LEFT_FWRD_PIN 22 +#define H_DRIVE_LEFT_BACK_PIN 23 +#define H_RACER_TURN_LEFT_FOR_MS 400 // duration of time the racer will turn to left +#define H_RACER_TURN_RIGHT_FOR_MS 400 // duration of time the racer will turn to right -//----- Motoren ----- -#define H_MOTORRE_TEMPO 215 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255 -#define H_MOTORLI_TEMPO 212 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255 -#define H_MOTORRE_SPEED 2 // Pin an dem der SPEED/ENABLE Pin des rechten Motors angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_MOTORRE_FWRD 4 // Pin an dem der FORWÄRTS Pin des rechten Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_MOTORRE_BACK 15 // Pin an dem der RÜCKWÄRTS Pin des rechten Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_MOTORLI_SPEED 21 // Pin an dem der SPEED/ENABLE Pin des linken Motors angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_MOTORLI_FWRD 22 // Pin an dem der FORWÄRTS Pin des linken Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_MOTORLI_BACK 23 // Pin an dem der RÜCKWÄRTS Pin des linken Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_RACER_LINKS_MS 200 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach links zu drehen -#define H_RACER_RECHTS_MS 200 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach rechts zu drehen +#define DRIVE_PWM_LEFT_CHANNEL 5 // PWM-channel for left side drive +#define DRIVE_PWM_RIGHT_CHANNEL 6 // PWM-channel for right side drive -#define MOTORPWM_LINKS 5 // PWM-Kanal für linken Motor -#define MOTORPWM_RECHTS 6 // PWM-Kanal für rechten Motor -#define MOTORRE_MAX_TEMPO 244 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255 -#define MOTORLI_MAX_TEMPO 240 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255 +//----- LEDs ----- +#define H_LED_FRWD_PIN 26 +#define H_LED_STOP_PIN 25 +#define H_LED_LEFT_PIN 33 +#define H_LED_RIGHT_PIN 27 -#define MOTOR_MAX_SPEED_START_MS 10 +static volatile bool coderracer_activ = false;; +static volatile unsigned long button_last_pressed_at_ms = millis(); -//----- Werte für die LEDs ----- -#define H_LED_VORWAERTS 26 // Pin an dem die VORWÄRTS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_LED_STOP 25 // Pin an dem die STOP LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_LED_LINKS 33 // Pin an dem die LINKS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. -#define H_LED_RECHTS 27 // Pin an dem die RECHTS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. +enum ledstate { + LEDOFF, + LEDON +}; -#define LED_SWITCH_MS 50 - -static volatile bool coderracer_activ; -static volatile unsigned long taster_last_pressed_ms; +enum drivestate { + DRIVESTOP, + DRIVEFRWD, + DRIVEBACK +}; //--- this is as preparation of the class creation class CodeRacer { private: - int _taster_pin; - int _servopin; - int _us_trigger_pin; - int _us_echo_pin; - int _motor_links_frwd_pin; - int _motor_links_back_pin; - int _motor_links_enable_pin; - int _motor_rechts_frwd_pin; - int _motor_rechts_back_pin; - int _motor_rechts_enable_pin; - int _led_frwd_pin; - int _led_stop_pin; - int _led_links_pin; - int _led_rechts_pin; - int _servo_mitte; - int _servo_links; - int _servo_rechts; - int _schwenk_links; - int _schwenk_rechts; + //pins + uint8_t _button_pin; + uint8_t _servo_pin; + uint8_t _us_trigger_pin; + uint8_t _us_echo_pin; + uint8_t _drive_left_frwd_pin; + uint8_t _drive_left_back_pin; + uint8_t _drive_left_enable_pin; + uint8_t _drive_right_frwd_pin; + uint8_t _drive_right_back_pin; + uint8_t _drive_right_enable_pin; + uint8_t _led_frwd_pin; + uint8_t _led_stop_pin; + uint8_t _led_left_pin; + uint8_t _led_right_pin; - int _schwenk_position; - int _schwenk_richtung; - long _schwenk_millis; + //servo variables + int8_t _servo_sweep_step; + uint8_t _servo_position; + unsigned long _servo_position_set_at_ms; + unsigned long _servo_position_eta_in_ms; - int _motor_links_tempo; - int _motor_rechts_tempo; - int _drehung_links_ms; - int _drehung_rechts_ms; + //drives variables + uint8_t _drive_left_speed; + uint8_t _drive_right_speed; + unsigned long _turn_left_for_ms; + unsigned long _turn_right_for_ms; - bool _drive_forward; - long _drive_forward_ms; - bool _drive_normal_forward; - bool _schwenk; + // ultrasonic variables + bool _coderacer_stopped_at_min_distance; + bool _coderacer_stop_at_distance_enabled; + unsigned long _usonic_stop_distance_cm; + unsigned long _usonic_stop_distance_us; + unsigned long _usonic_distance_us; + unsigned long _usonic_distance_cm; - long _min_abstand_cm; + //fun stuff variables + unsigned long _last_led_switched_at_ms; + uint8_t _led_count; + uint8_t _last_led_on; + unsigned long _servo_look_around_at_ms; - static void set_taster_state(); + unsigned long _min_distance_cm; + bool _drive; + unsigned long _drive_set_at_ms; + bool _servo_sweep; + bool _coderracer_activ; + //objects Servo* _servo; Servo* _servo_dummy; - void analog_write(int pin, int speed); - int _coderracer_activ; - - long abstand_messen_intern(); - - long _last_ledswitch_ms; - int _led_count; - int _last_led_on; - - long _servo_look_around_ms; + static void _set_button_state(); + void _analog_write(uint8_t pin, uint8_t speed); + unsigned long _servo_set_position(uint8_t position); public: + //properties + bool coderacer_fun_enabled; + uint8_t servo_center_pos; /**< The position the servo is looking straight forward. Default is 90 . Allowed are values 10<=pos<=170 */ + uint8_t servo_left_pos; /**< The position the servo is looking to the left. Default is 170 . Allowed are values 10<=pos<=170 */ + uint8_t servo_right_pos; /**< The position the servo is looking to the right. Default is 0 . Allowed are values 10<=pos<=170 */ + uint8_t servo_sweep_left_pos; /**< When the servo is sweeping this is the left most position */ + uint8_t servo_sweep_right_pos; /**< When the servo is sweeping this is the right most position */ + //methods CodeRacer(); - CodeRacer(int tasterpin, int servopin, - int us_trigger_pin, int us_echo_pin, - int motor_links_frwd_pin, int motor_links_back_pin, int motor_links_enable_pin, - int motor_rechts_frwd_pin, int motor_rechts_back_pin, int motor_rechts_enable_pin, - int led_frwd, int led_stop, int led_links, int led_rechts - ); + CodeRacer(uint8_t button_pin, uint8_t servo_pin, + uint8_t us_trigger_pin, uint8_t us_echo_pin, + uint8_t drive_left_frwd_pin, uint8_t drive_left_back_pin, uint8_t drive_left_enable_pin, + uint8_t drive_right_frwd_pin, uint8_t drive_right_back_pin, uint8_t drive_right_enable_pin, + uint8_t led_frwd_pin, uint8_t led_stop_pin, uint8_t led_left_pin, uint8_t led_right_pin); + void set_inactive(); + void set_active(); void begin(); - void servo_einstellungen(int winkel_mitte, int winkel_links, int winkel_rechts, int schwenk_links, int schwenk_rechts); - void motor_einstellungen(int motor_links_tempo, int motor_rechts_tempo, int drehung_links_ms, int drehung_rechts_ms); + // getters + bool is_active(); + bool is_driving(); + bool stopped_at_min_distance(); + unsigned long usonic_distance_cm(); + unsigned long usonic_distance_us(); + uint8_t servo_position(); + unsigned long servo_position_set_at_ms(); + unsigned long servo_position_eta_in_ms(); + uint8_t drive_left_speed(); + uint8_t drive_right_speed(); + unsigned long turn_left_for_ms(); + unsigned long turn_right_for_ms(); + // higher level {code}racer services + void stop_driving(); + void drive_forward(); + void drive_forward(uint8_t left_speed, uint8_t right_speed); + void drive_backward(); + void drive_backward(uint8_t left_speed, uint8_t right_speed); + void turn_left(); + void turn_left(unsigned long turn_for_ms); + void turn_left(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed); + void turn_right(); + void turn_right(unsigned long turn_for_ms); + void turn_right(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed); + + void start_stop_at_min_distance(); + void start_stop_at_min_distance(unsigned long min_distance_cm); + void stop_stop_at_min_distance(); + + + // LEDs + void set_leds_left_stop_frwd_right(ledstate leftled, ledstate stopled, ledstate frwdled, ledstate rightled); + void set_leds_all(ledstate alleds); + void set_leds_all_off(); + void set_leds_all_on(); + + // Drives + void drives_settings(uint8_t drive_left_speed, uint8_t drive_right_speed, unsigned long turn_left_ms, unsigned long turn_right_ms); + void set_drives_states_left_right(drivestate stateleft, drivestate stateright); + void set_drive_left_state(drivestate state); + void set_drive_right_state(drivestate state); + void set_drive_state(drivestate state, uint8_t frwdpin, uint8_t backpin); + void set_drives_speed_left_right(uint8_t speedleft, uint8_t speedright); + void set_drive_left_speed(uint8_t speed); + void set_drive_right_speed(uint8_t speed); + void set_drive_speed(uint8_t speed, uint8_t enablepin); + void set_drives_stop_left_right(); + + // Ultrasonic sensor + unsigned long usonic_measure_cm(); + unsigned long usonic_measure_us(); + unsigned long usonic_measure_cm(unsigned long max_echo_run_time_us); + unsigned long usonic_measure_us(unsigned long max_echo_run_time_us); + unsigned long usonic_measure_single_shot_cm(); + unsigned long usonic_measure_single_shot_us(); + unsigned long usonic_measure_single_shot_cm(unsigned long max_echo_run_time_us); + unsigned long usonic_measure_single_shot_us(unsigned long max_echo_run_time_us); + void usonic_set_stop_distance_cm(unsigned long stop_distance_cm); + void usonic_set_stop_distance_us(unsigned long stop_distance_us); + + // Servo drive + void servo_settings(uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos); + uint8_t servo_set_position_wait(uint8_t position); + unsigned long servo_set_position(uint8_t position); + void servo_set_to_right(); + void servo_set_to_left(); + void servo_set_to_center(); + void servo_sweep(); + + // just for fun + void kitt(); + void look_around(); + + // previous OBSOLETE german language definitions of the methods - still needed to support MakerLab Murnau {code}racer project + // - but use the english ones for new implementations + void servo_einstellungen(uint8_t winkel_mitte, uint8_t winkel_links, uint8_t winkel_rechts, uint8_t schwenk_links, uint8_t schwenk_rechts); + void motor_einstellungen(uint8_t motor_links_tempo, uint8_t motor_rechts_tempo, unsigned long drehung_links_ms, unsigned long drehung_rechts_ms); void anhalten(); - void normal_tempo(); void vorwaerts(); void rueckwaerts(); void links(); @@ -143,11 +243,9 @@ class CodeRacer { void servo_rechts(); void servo_links(); void servo_mitte(); - long abstand_messen(); + unsigned long abstand_messen(); void servo_schwenk(); - void knight_rider(); bool start_stop(); - }; diff --git a/Arduino/libraries/CodeRacer/examples/esp32_coderacer_beispiel/esp32_coderacer_beispiel.ino b/Arduino/libraries/CodeRacer/examples/esp32_coderacer_beispiel/esp32_coderacer_beispiel.ino index 2d22744..c16a436 100644 --- a/Arduino/libraries/CodeRacer/examples/esp32_coderacer_beispiel/esp32_coderacer_beispiel.ino +++ b/Arduino/libraries/CodeRacer/examples/esp32_coderacer_beispiel/esp32_coderacer_beispiel.ino @@ -1,56 +1,97 @@ #include -//----- Werte für den Ultraschallsensor ----- -#define US_STOP_ABSTAND_CM 15 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an +//----- settings for the ultrasonic sensor ----- +#define US_STOP_ABSTAND_CM 20 // if distance goes below that - stop the racer -//----- Variablen, die wir brauchen um uns Werte zu merken ---- -long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm; +//----- {CODES}RACER API -> online: https://doc.itsblue.de/Fenoglio/coderacer/Doku/Doxygen/html/ +//-- Some main higher level methods listed below +// void CodeRacer::stop_driving () Stops the racer and sets status LEDs +// void CodeRacer::drive_forward () Sets the speed and the directions of both drives so that it will move forward. +// void CodeRacer::drive_backward () Sets the speed and the directions of both drives so that it will move backward. +// void CodeRacer::turn_left () Will turn the racer to the left for the internally stored time in ms and with the internally stored speed. +// void CodeRacer::turn_right () Will turn the racer to the right for the internally stored time in ms and with the internally stored speed. +// void CodeRacer::start_stop_at_min_distance () Enables to stopp the racer if during a distance measurement the measured distance is smaller then the internally stored minimal distance. +// void CodeRacer::stop_stop_at_min_distance () Disables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. +// bool CodeRacer::start_stop () This will return if the codracer is in active mode or not. +// void CodeRacer::servo_set_to_right () Drives the servo to the postion that is defined by #servo_right_pos. +// void CodeRacer::servo_set_to_left () Drives the servo to the postion that is defined by #servo_left_pos. +// void CodeRacer::servo_set_to_center () Drives the servo to the postion that is defined by #servo_center_pos. +// uint8_t CodeRacer::servo_position () Get the actual position of the servo. +// unsigned long CodeRacer::usonic_measure_cm () Measures the distance to the next object in front of the ultra sonic sensor in cm. +// +// ... there are much more ... read the online API for more details. +//----- variables we need +unsigned long distance_cm = 0; + +//---- construct the coderacer object CodeRacer coderacer; -// Das kann der coderacer: -// coderacer.start_stop() Abfragen ob der Racer fahren soll oder nicht ... wenn er fahren soll kommt der Wert 'true' zurück, wenn er stopppen soll der Wert 'false' -// coderacer.servo_schwenk() Abstandssensor hin und her verstellen -// coderacer.abstand_messen(); Abstand messen - es kommt ein Wert in cm zurück -// coderacer.servo_mitte(); nach vorn "schauen" -// coderacer.servo_rechts(); nach rechts "schauen" -// coderacer.servo_links(); nach links "schauen" -// coderacer.links(); nach links drehen -// coderacer.rechts(); nach rechts drehen -// coderacer.vorwaerts(); Vorwaerts fahren -// coderacer.anhalten(); Racer anhalten -//---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ---- +//---- set up code - executed ones void setup() { - // Monitor - Serial.begin(115200); // Serial Monitor aktivieren. Mit dem Monitor kann man sich Werte und Meldungen anzeigen lassen. - - // CodeRacer initialisieren + // start serial monitor + Serial.begin(115200); + // initialize the coderacer coderacer.begin(); - - // nach links und rechts schauen ... :-) - coderacer.servo_links(); - delay(10); - coderacer.servo_rechts(); - delay(10); - coderacer.servo_mitte(); - + // enable fun stuff + coderacer.coderacer_fun_enabled = true; + // look to the left, to the right and to center... :-) + coderacer.servo_set_to_left(); + delay(100); + coderacer.servo_set_to_right(); + delay(100); + coderacer.servo_set_to_center(); + delay(100); } -//---- Hier startet unsere endlose Schleife - die immer wieder von vorn angefangen wird, wenn wir am Ende angekommen sind. Da ist unser "Fahr"Code drin, der den CodeRacer steuert +//---- 'endless' loop void loop() { - // Abstand messen -> dort wo der coderacer gerade "hinschaut". Der gemessene Abstand ist in abstand_vorn_cm gespeichert - abstand_vorn_cm = coderacer.abstand_messen(); - - // Abfragen ob der Racer fahren soll oder nicht ... + // check if the racer was started (button was toggled to coderacer active state if(true == coderacer.start_stop()){ + + Serial.print("Speed of right side drive: "); + Serial.println(coderacer.drive_right_speed()); + Serial.print("Speed of left side drive: "); + Serial.println(coderacer.drive_left_speed()); + + // measure the distance - at the position of the servo + distance_cm = coderacer.usonic_measure_cm(); - // Abstandssensor verstellen ... - coderacer.servo_schwenk(); + coderacer.start_stop_at_min_distance(US_STOP_ABSTAND_CM); + while(!coderacer.stopped_at_min_distance()){ - // hier kommt Euer Code zu steuern des coderacers hinein ... + Serial.print("Distanc in cm: "); + Serial.println(distance_cm); + + if(distance_cm > 50){ + coderacer.drive_forward(); + coderacer.servo_sweep(); + } + else if(distance_cm > 40){ + coderacer.turn_right(); + } + else if(distance_cm > 30){ + coderacer.turn_left(); + } + else { - + coderacer.drive_backward(); + } + + // measure the distance - at the position of the servo + distance_cm = coderacer.usonic_measure_cm(); + + } + + Serial.println("***** STOPPED ***** "); + Serial.print("Measured stop distanc of cm: "); + Serial.println(distance_cm); + Serial.print("Measured at servo position of: "); + Serial.println(coderacer.servo_position()); + + coderacer.set_inactive(); + } } diff --git a/Arduino/libraries/CodeRacer/keywords.txt b/Arduino/libraries/CodeRacer/keywords.txt deleted file mode 100644 index f498ec9..0000000 --- a/Arduino/libraries/CodeRacer/keywords.txt +++ /dev/null @@ -1,15 +0,0 @@ -CodeRacer KEYWORD1 -begin KEYWORD2 -servo_einstellungen KEYWORD2 -motor_einstellungen KEYWORD2 -anhalten KEYWORD2 -normal_tempo KEYWORD2 -vorwaerts KEYWORD2 -links KEYWORD2 -rechts KEYWORD2 -servo_rechts KEYWORD2 -servo_links KEYWORD2 -servo_mitte KEYWORD2 -abstand_messen KEYWORD2 -servo_schwenk KEYWORD2 -start_stop KEYWORD2 \ No newline at end of file diff --git a/Arduino/libraries/ESP32Servo/README.md b/Arduino/libraries/ESP32Servo/README.md new file mode 100644 index 0000000..b3de6a4 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/README.md @@ -0,0 +1,87 @@ +# Servo Library for ESP32 + +This library attempts to faithfully replicate the semantics of the +Arduino Servo library (see http://www.arduino.cc/en/Reference/Servo) +for the ESP32, with two (optional) additions. The two new functions +expose the ability of the ESP32 PWM timers to vary timer width. + +## License + +Copyright (c) 2017 John K. Bennett. All right reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +## Library Description: +``` +   Servo - Class for manipulating servo motors connected to ESP32 pins. + + int attach(pin ) - Attaches the given GPIO pin to the next free channel + (channels that have previously been detached are used first), + returns channel number or 0 if failure. All pin numbers are allowed, + but only pins 2,4,12-19,21-23,25-27,32-33 are recommended. + + int attach(pin, min, max ) - Attaches to a pin setting min and max + values in microseconds; enforced minimum min is 500, enforced max + is 2500. Other semantics are the same as attach(). + + void write () - Sets the servo angle in degrees; a value below 500 is + treated as a value in degrees (0 to 180). These limit are enforced, + i.e., values are constrained as follows: + Value Becomes + ----- ------- + < 0 0 + 0 - 180 value (treated as degrees) + 181 - 499 180 + 500 - (min-1) min + min-max (from attach or default) value (treated as microseconds) + (max+1) - 2500 max + + void writeMicroseconds() - Sets the servo pulse width in microseconds. + min and max are enforced (see above). + + int read() - Gets the last written servo pulse width as an angle between 0 and 180. + + int readMicroseconds() - Gets the last written servo pulse width in microseconds. + + bool attached() - Returns true if this servo instance is attached to a pin. + + void detach() - Stops an the attached servo, frees the attached pin, and frees + its channel for reuse. +``` + +### **New ESP32-specific functions** + +``` +   setTimerWidth(value) - Sets the PWM timer width (must be 16-20) (ESP32 ONLY); + as a side effect, the pulse width is recomputed. + +   int readTimerWidth() - Gets the PWM timer width (ESP32 ONLY) +``` + +### Useful Defaults: + +default min pulse width for attach(): 544us + +default max pulse width for attach(): 2400us + +default timer width 16 (if timer width is not set) + +default pulse width 1500us (servos are initialized with this value) + +MINIMUM pulse with: 500us + +MAXIMUM pulse with: 2500us + +MAXIMUM number of servos: 16 (this is the number of PWM channels in the ESP32) diff --git a/Arduino/libraries/ESP32Servo/examples/Knob/Knob.ino b/Arduino/libraries/ESP32Servo/examples/Knob/Knob.ino new file mode 100644 index 0000000..3c62f56 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/examples/Knob/Knob.ino @@ -0,0 +1,69 @@ +/* + Controlling a servo position using a potentiometer (variable resistor) + by Michal Rinott + + modified on 8 Nov 2013 + by Scott Fitzgerald + + modified for the ESP32 on March 2017 + by John Bennett + + see http://www.arduino.cc/en/Tutorial/Knob for a description of the original code + + * Different servos require different pulse widths to vary servo angle, but the range is + * an approximately 500-2500 microsecond pulse every 20ms (50Hz). In general, hobbyist servos + * sweep 180 degrees, so the lowest number in the published range for a particular servo + * represents an angle of 0 degrees, the middle of the range represents 90 degrees, and the top + * of the range represents 180 degrees. So for example, if the range is 1000us to 2000us, + * 1000us would equal an angle of 0, 1500us would equal 90 degrees, and 2000us would equal 1800 + * degrees. + * + * Circuit: (using an ESP32 Thing from Sparkfun) + * Servo motors have three wires: power, ground, and signal. The power wire is typically red, + * the ground wire is typically black or brown, and the signal wire is typically yellow, + * orange or white. Since the ESP32 can supply limited current at only 3.3V, and servos draw + * considerable power, we will connect servo power to the VBat pin of the ESP32 (located + * near the USB connector). THIS IS ONLY APPROPRIATE FOR SMALL SERVOS. + * + * We could also connect servo power to a separate external + * power source (as long as we connect all of the grounds (ESP32, servo, and external power). + * In this example, we just connect ESP32 ground to servo ground. The servo signal pins + * connect to any available GPIO pins on the ESP32 (in this example, we use pin 18. + * + * In this example, we assume a Tower Pro SG90 small servo connected to VBat. + * The published min and max for this servo are 500 and 2400, respectively. + * These values actually drive the servos a little past 0 and 180, so + * if you are particular, adjust the min and max values to match your needs. + */ + +// Include the ESP32 Arduino Servo Library instead of the original Arduino Servo Library +#include + +Servo myservo; // create servo object to control a servo + +// Possible PWM GPIO pins on the ESP32: 0(used by on-board button),2,4,5(used by on-board LED),12-19,21-23,25-27,32-33 +int servoPin = 18; // GPIO pin used to connect the servo control (digital out) +// Possible ADC pins on the ESP32: 0,2,4,12-15,32-39; 34-39 are recommended for analog input +int potPin = 34; // GPIO pin used to connect the potentiometer (analog in) +int ADC_Max = 4096; // This is the default ADC max value on the ESP32 (12 bit ADC width); + // this width can be set (in low-level oode) from 9-12 bits, for a + // a range of max values of 512-4096 + +int val; // variable to read the value from the analog pin + +void setup() +{ + myservo.attach(servoPin, 500, 2400); // attaches the servo on pin 18 to the servo object + // using SG90 servo min/max of 500us and 2400us + // for MG995 large servo, use 1000us and 2000us, + // which are the defaults, so this line could be + // "myservo.attach(servoPin);" +} + +void loop() { + val = analogRead(potPin); // read the value of the potentiometer (value between 0 and 1023) + val = map(val, 0, ADC_Max, 0, 180); // scale it to use it with the servo (value between 0 and 180) + myservo.write(val); // set the servo position according to the scaled value + delay(200); // wait for the servo to get there +} + diff --git a/Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino b/Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino new file mode 100644 index 0000000..c60e174 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino @@ -0,0 +1,106 @@ +/* + * ESP32 Servo Example Using Arduino ESP32 Servo Library + * John K. Bennett + * March, 2017 + * + * This sketch uses the Arduino ESP32 Servo Library to sweep 4 servos in sequence. + * + * Different servos require different pulse widths to vary servo angle, but the range is + * an approximately 500-2500 microsecond pulse every 20ms (50Hz). In general, hobbyist servos + * sweep 180 degrees, so the lowest number in the published range for a particular servo + * represents an angle of 0 degrees, the middle of the range represents 90 degrees, and the top + * of the range represents 180 degrees. So for example, if the range is 1000us to 2000us, + * 1000us would equal an angle of 0, 1500us would equal 90 degrees, and 2000us would equal 1800 + * degrees. + * + * Circuit: + * Servo motors have three wires: power, ground, and signal. The power wire is typically red, + * the ground wire is typically black or brown, and the signal wire is typically yellow, + * orange or white. Since the ESP32 can supply limited current at only 3.3V, and servos draw + * considerable power, we will connect servo power to the VBat pin of the ESP32 (located + * near the USB connector). THIS IS ONLY APPROPRIATE FOR SMALL SERVOS. + * + * We could also connect servo power to a separate external + * power source (as long as we connect all of the grounds (ESP32, servo, and external power). + * In this example, we just connect ESP32 ground to servo ground. The servo signal pins + * connect to any available GPIO pins on the ESP32 (in this example, we use pins + * 22, 19, 23, & 18). + * + * In this example, we assume four Tower Pro SG90 small servos. + * The published min and max for this servo are 500 and 2400, respectively. + * These values actually drive the servos a little past 0 and 180, so + * if you are particular, adjust the min and max values to match your needs. + * Experimentally, 550 and 2350 are pretty close to 0 and 180. + */ + +#include + +// create four servo objects +Servo servo1; +Servo servo2; +Servo servo3; +Servo servo4; + +// Published values for SG90 servos; adjust if needed +int minUs = 500; +int maxUs = 2400; + +// These are all GPIO pins on the ESP32 +// Recommended pins include 2,4,12-19,21-23,25-27,32-33 +int servo1Pin = 18; +int servo2Pin = 19; +int servo3Pin = 22; +int servo4Pin = 23; + +int pos = 0; // position in degrees + +void setup() +{ + servo1.attach(servo1Pin, minUs, maxUs); + servo2.attach(servo2Pin, minUs, maxUs); + servo3.attach(servo3Pin, minUs, maxUs); + servo4.attach(servo4Pin, minUs, maxUs); +} + +void loop() { + for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees + // in steps of 1 degree + servo1.write(pos); + delay(20); // waits 20ms for the servo to reach the position + } + for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees + servo1.write(pos); + delay(20); + } + + for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees + // in steps of 1 degree + servo2.write(pos); + delay(20); // waits 20ms for the servo to reach the position + } + for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees + servo2.write(pos); + delay(20); + } + + for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees + // in steps of 1 degree + servo3.write(pos); + delay(20); // waits 20ms for the servo to reach the position + } + for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees + servo3.write(pos); + delay(20); + } + + for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees + // in steps of 1 degree + servo4.write(pos); + delay(20); // waits 20ms for the servo to reach the position + } + for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees + servo4.write(pos); + delay(20); + } +} + diff --git a/Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-ESP32/Multiple-Servo-Example-ESP32.ino b/Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-ESP32/Multiple-Servo-Example-ESP32.ino new file mode 100644 index 0000000..e92e9f6 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/examples/Multiple-Servo-Example-ESP32/Multiple-Servo-Example-ESP32.ino @@ -0,0 +1,109 @@ +/* + * ESP32 Servo Example + * John K. Bennett + * March, 2017 + * + * This sketch uses low-level ESP32 PWM functionality to sweep 4 servos in sequence. + * It does NOT use the ESP32_Servo library for Arduino. + * + * The ESP32 supports 16 hardware LED PWM channels that are intended + * to be used for LED brightness control. The low level ESP32 code allows us to set the + * PWM frequency and bit-depth, and then control them by setting bits in the relevant control + * register. The core files esp32-hal-ledc.* provides helper functions to make this set up + * straightforward. + * + * Different servos require different pulse widths to vary servo angle, but the range is + * an approximately 500-2500 microsecond pulse every 20ms (50Hz). In general, hobbyist servos + * sweep 180 degrees, so the lowest number in the published range for a particular servo + * represents an angle of 0 degrees, the middle of the range represents 90 degrees, and the top + * of the range represents 180 degrees. So for example, if the range is 1000us to 2000us, + * 1000us would equal an angle of 0, 1500us would equal 90 degrees, and 2000us would equal 1800 + * degrees. + * + * The ESP32 PWM timers allow us to set the timer width (max 20 bits). Thus + * the timer "tick" length is (pulse_period/2**timer_width), and the equation for pulse_high_width + * (the portion of cycle (20ms in our case) that the signal is high) becomes: + * + * pulse_high_width = count * tick_length + * = count * (pulse_period/2**timer_width) + * + * and count = (pulse_high_width / (pulse_period/2**timer_width)) + * + * For example, if we want a 1500us pulse_high_width, we set pulse_period to 20ms (20000us) + * (this value is set in the ledcSetup call), and count (used in the ledcWrite call) to + * 1500/(20000/65655), or 4924. This is the value we write to the timer in the ledcWrite call. + * + * As a concrete example, suppose we want to repeatedly sweep four Tower Pro SG90 servos + * from 0 to 180 degrees. The published pulse width range for the SG90 is 500-2400us. Thus, + * we should vary the count used in ledcWrite from 1638 to 7864. + * + * Circuit: + * Servo motors have three wires: power, ground, and signal. The power wire is typically red, + * the ground wire is typically black or brown, and the signal wire is typically yellow, + * orange or white. Since the ESP32 can supply limited current at only 3.3V, and servos draw + * considerable power, we will connect servo power to the VBat pin of the ESP32 (located + * near the USB connector). THIS IS ONLY APPROPRIATE FOR SMALL SERVOS. + * + * We could also connect servo power to a separate external + * power source (as long as we connect all of the grounds (ESP32, servo, and external power). + * In this example, we just connect ESP32 ground to servo ground. The servo signal pins + * connect to any available GPIO pins on the ESP32 (in this example, we use pins + * 22, 19, 23, & 18). + * + * In this example, we assume four Tower Pro SG90 small servos. + * The published min and max for this servo are 500 and 2400, respectively. + * These values actually drive the servos a little past 0 and 180, so + * if you are particular, adjust the min and max values to match your needs. + * Experimentally, 550us and 2350us are pretty close to 0 and 180. + * + * This code was inspired by a post on Hackaday by Elliot Williams. + */ + + // Values for TowerPro SG90 small servos; adjust if needed + #define COUNT_LOW 1638 + #define COUNT_HIGH 7864 + + #define TIMER_WIDTH 16 + +#include "esp32-hal-ledc.h" + +void setup() { + ledcSetup(1, 50, TIMER_WIDTH); // channel 1, 50 Hz, 16-bit width + ledcAttachPin(22, 1); // GPIO 22 assigned to channel 1 + + ledcSetup(2, 50, TIMER_WIDTH); // channel 2, 50 Hz, 16-bit width + ledcAttachPin(19, 2); // GPIO 19 assigned to channel 2 + + ledcSetup(3, 50, TIMER_WIDTH); // channel 3, 50 Hz, 16-bit width + ledcAttachPin(23, 3); // GPIO 23 assigned to channel 3 + + ledcSetup(4, 50, TIMER_WIDTH); // channel 4, 50 Hz, 16-bit width + ledcAttachPin(18, 4); // GPIO 18 assigned to channel 4 +} + +void loop() { + for (int i=COUNT_LOW ; i < COUNT_HIGH ; i=i+100) + { + ledcWrite(1, i); // sweep servo 1 + delay(200); + } + + for (int i=COUNT_LOW ; i < COUNT_HIGH ; i=i+100) + { + ledcWrite(2, i); // sweep servo 2 + delay(200); + } + + for (int i=COUNT_LOW ; i < COUNT_HIGH ; i=i+100) + { + ledcWrite(3, i); // sweep the servo + delay(200); + } + + for (int i=COUNT_LOW ; i < COUNT_HIGH ; i=i+100) + { + ledcWrite(4, i); // sweep the servo + delay(200); + } +} + diff --git a/Arduino/libraries/ESP32Servo/examples/Sweep/Sweep.ino b/Arduino/libraries/ESP32Servo/examples/Sweep/Sweep.ino new file mode 100644 index 0000000..4e90018 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/examples/Sweep/Sweep.ino @@ -0,0 +1,66 @@ +/* Sweep + by BARRAGAN + This example code is in the public domain. + + modified 8 Nov 2013 + by Scott Fitzgerald + + modified for the ESP32 on March 2017 + by John Bennett + + see http://www.arduino.cc/en/Tutorial/Sweep for a description of the original code + + * Different servos require different pulse widths to vary servo angle, but the range is + * an approximately 500-2500 microsecond pulse every 20ms (50Hz). In general, hobbyist servos + * sweep 180 degrees, so the lowest number in the published range for a particular servo + * represents an angle of 0 degrees, the middle of the range represents 90 degrees, and the top + * of the range represents 180 degrees. So for example, if the range is 1000us to 2000us, + * 1000us would equal an angle of 0, 1500us would equal 90 degrees, and 2000us would equal 1800 + * degrees. + * + * Circuit: (using an ESP32 Thing from Sparkfun) + * Servo motors have three wires: power, ground, and signal. The power wire is typically red, + * the ground wire is typically black or brown, and the signal wire is typically yellow, + * orange or white. Since the ESP32 can supply limited current at only 3.3V, and servos draw + * considerable power, we will connect servo power to the VBat pin of the ESP32 (located + * near the USB connector). THIS IS ONLY APPROPRIATE FOR SMALL SERVOS. + * + * We could also connect servo power to a separate external + * power source (as long as we connect all of the grounds (ESP32, servo, and external power). + * In this example, we just connect ESP32 ground to servo ground. The servo signal pins + * connect to any available GPIO pins on the ESP32 (in this example, we use pin 18. + * + * In this example, we assume a Tower Pro MG995 large servo connected to an external power source. + * The published min and max for this servo is 1000 and 2000, respectively, so the defaults are fine. + * These values actually drive the servos a little past 0 and 180, so + * if you are particular, adjust the min and max values to match your needs. + */ + +#include + +Servo myservo; // create servo object to control a servo + // 16 servo objects can be created on the ESP32 + +int pos = 0; // variable to store the servo position +// Recommended PWM GPIO pins on the ESP32 include 2,4,12-19,21-23,25-27,32-33 +int servoPin = 18; + +void setup() { + myservo.attach(servoPin); // attaches the servo on pin 18 to the servo object + // using default min/max of 1000us and 2000us + // different servos may require different min/max settings + // for an accurate 0 to 180 sweep +} + +void loop() { + for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees + // in steps of 1 degree + myservo.write(pos); // tell servo to go to position in variable 'pos' + delay(15); // waits 15ms for the servo to reach the position + } + for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees + myservo.write(pos); // tell servo to go to position in variable 'pos' + delay(15); // waits 15ms for the servo to reach the position + } +} + diff --git a/Arduino/libraries/ESP32Servo/keywords.txt b/Arduino/libraries/ESP32Servo/keywords.txt new file mode 100644 index 0000000..da07789 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/keywords.txt @@ -0,0 +1,26 @@ +####################################### +# Syntax Coloring Map ESP32_Servo +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Servo KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +attach KEYWORD2 +detach KEYWORD2 +write KEYWORD2 +read KEYWORD2 +attached KEYWORD2 +writeMicroseconds KEYWORD2 +readMicroseconds KEYWORD2 +setTimerWidth KEYWORD2 +readTimerWidth KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### \ No newline at end of file diff --git a/Arduino/libraries/ESP32Servo/library.properties b/Arduino/libraries/ESP32Servo/library.properties new file mode 100644 index 0000000..110298b --- /dev/null +++ b/Arduino/libraries/ESP32Servo/library.properties @@ -0,0 +1,11 @@ +name=ESP32Servo +version=0.0.4 +author=John K. Bennett,Kevin Harrington +maintainer=Kevin Harrington +sentence=Allows ESP32 boards to control servo motors using Arduino semantics. +paragraph=This library can control a many types of servos.
It makes use of the ESP32 PWM timers: the library can control up to 16 servos on individual channels
No attempt has been made to support multiple servos per channel.
+category=Device Control +url=http://www.arduino.cc/en/Reference/Servo +architectures=* +includes=ESP32Servo.h + diff --git a/Arduino/libraries/ESP32Servo/src/ESP32Servo.cpp b/Arduino/libraries/ESP32Servo/src/ESP32Servo.cpp new file mode 100644 index 0000000..2d037f9 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/src/ESP32Servo.cpp @@ -0,0 +1,275 @@ +/* +Copyright (c) 2017 John K. Bennett. All right reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +* Notes on the implementation: +* The ESP32 supports 16 hardware LED PWM channels that are intended +* to be used for LED brightness control. The low level ESP32 code +* (esp32-hal-ledc.*) allows us to set the PWM frequency and bit-depth, +* and then manipulate them by setting bits in the relevant control +* registers. +* +* Different servos require different pulse widths to vary servo angle, but the range is +* an approximately 500-2500 microsecond pulse every 20ms (50Hz). In general, hobbyist servos +* sweep 180 degrees, so the lowest number in the published range for a particular servo +* represents an angle of 0 degrees, the middle of the range represents 90 degrees, and the top +* of the range represents 180 degrees. So for example, if the range is 1000us to 2000us, +* 1000us would equal an angle of 0, 1500us would equal 90 degrees, and 2000us would equal 180 +* degrees. We vary pulse width (recall that the pulse period is already set to 20ms) as follows: +* +* The ESP32 PWM timers allow us to set the timer width (max 20 bits). Thus +* the timer "tick" length is (pulse_period/2**timer_width), and the equation for pulse_high_width +* (the portion of the 20ms cycle that the signal is high) becomes: +* +* pulse_high_width = count * tick_length +* = count * (pulse_period/2**timer_width) +* +* and count = (pulse_high_width / (pulse_period/2**timer_width)) +* +* So, for example, if I want a 1500us pulse_high_width, I set pulse_period to 20ms (20000us) +* (this value is set in the ledcSetup call), and count (used in the ledcWrite call) to +* 1500/(20000/65536), or 4924. This is the value we write to the timer in the ledcWrite call. +* If we increase the timer_width, the timer_count values need to be adjusted. +* +* The servo signal pins connect to any available GPIO pins on the ESP32, but not all pins are +* GPIO pins. +* +* The ESP32 is a 32 bit processor that includes FP support; this code reflects that fact. +*/ + +#include +#include "esp32-hal-ledc.h" +#include "Arduino.h" + +// + +// initialize the class variable ServoCount +int Servo::ServoCount = 0; + +// The ChannelUsed array elements are 0 if never used, 1 if in use, and -1 if used and disposed +// (i.e., available for reuse) +int Servo::ChannelUsed[MAX_SERVOS+1] = {0}; // we ignore the zeroth element + +Servo::Servo() +{ + this->servoChannel = 0; + // see if there is a servo channel available for reuse + bool foundChannelForReuse = false; + for (int i = 1; i < MAX_SERVOS+1; i++) + { + if (ChannelUsed[i] == -1) + { + // reclaim this channel + ChannelUsed[i] = 1; + this->servoChannel = i; + foundChannelForReuse = true; + break; + } + } + if (!foundChannelForReuse) + { + // no channels available for reuse; get a new one if we can + if (ServoCount < MAX_SERVOS) + { + this->servoChannel = ++ServoCount; // assign a servo channel number to this instance + ChannelUsed[this->servoChannel] = 1; + } + else + { + this->servoChannel = 0; // too many servos in use + } + } + // if we got a channel either way, finish initializing it + if (this->servoChannel > 0) + { + // initialize this channel with plausible values, except pin # (we set pin # when attached) + this->ticks = DEFAULT_PULSE_WIDTH_TICKS; + this->timer_width = DEFAULT_TIMER_WIDTH; + this->pinNumber = -1; // make it clear that we haven't attached a pin to this channel + this->min = DEFAULT_uS_LOW; + this->max = DEFAULT_uS_HIGH; + this->timer_width_ticks = pow(2,this->timer_width); + } +} + +int Servo::attach(int pin) +{ + return (this->attach(pin, DEFAULT_uS_LOW, DEFAULT_uS_HIGH)); +} + +int Servo::attach(int pin, int min, int max) +{ + if ((this->servoChannel <= MAX_SERVOS) && (this->servoChannel > 0)) + { +#ifdef ENFORCE_PINS + // Recommend only the following pins 2,4,12-19,21-23,25-27,32-33 + if ((pin == 2) || (pin ==4) || ((pin >= 12) && (pin <= 19)) || ((pin >= 21) && (pin <= 23)) || + ((pin >= 25) && (pin <= 27)) || (pin == 32) || (pin == 33)) + { +#endif + // OK to proceed; first check for new/reuse + if (this->pinNumber < 0) // we are attaching to a new or previously detached pin; we need to initialize/reinitialize + { + // claim/reclaim this channel + ChannelUsed[this->servoChannel] = 1; + this->ticks = DEFAULT_PULSE_WIDTH_TICKS; + this->timer_width = DEFAULT_TIMER_WIDTH; + this->timer_width_ticks = pow(2,this->timer_width); + } + this->pinNumber = pin; +#ifdef ENFORCE_PINS + } + else + { + Serial.println("This pin can not be a servo: "+String(pin)+"\r\nOnly use: 2,4,12-19,21-23,25-27,32-33"); + return 0; + } +#endif + + // min/max checks + if (min < MIN_PULSE_WIDTH) // ensure pulse width is valid + min = MIN_PULSE_WIDTH; + if (max > MAX_PULSE_WIDTH) + max = MAX_PULSE_WIDTH; + this->min = min; //store this value in uS + this->max = max; //store this value in uS + // Set up this channel + // if you want anything other than default timer width, you must call setTimerWidth() before attach + ledcSetup(this->servoChannel, REFRESH_CPS, this->timer_width); // channel #, 50 Hz, timer width + ledcAttachPin(this->pinNumber, this->servoChannel); // GPIO pin assigned to channel + return 1; + } + else return 0; +} + +void Servo::detach() +{ + if (this->attached()) + { + ledcDetachPin(this->pinNumber); + //keep track of detached servos channels so we can reuse them if needed + ChannelUsed[this->servoChannel] = -1; + this->pinNumber = -1; + } +} + +void Servo::write(int value) +{ + // treat values less than MIN_PULSE_WIDTH (500) as angles in degrees (valid values in microseconds are handled as microseconds) + if (value < MIN_PULSE_WIDTH) + { + if (value < 0) + value = 0; + else if (value > 180) + value = 180; + + value = map(value, 0, 180, this->min, this->max); + } + this->writeMicroseconds(value); +} + +void Servo::writeMicroseconds(int value) +{ + // calculate and store the values for the given channel + if ((this->servoChannel <= MAX_SERVOS) && (this->attached())) // ensure channel is valid + { + if (value < this->min) // ensure pulse width is valid + value = this->min; + else if (value > this->max) + value = this->max; + + value = usToTicks(value); // convert to ticks + this->ticks = value; + // do the actual write + ledcWrite(this->servoChannel, this->ticks); + } +} + +int Servo::read() // return the value as degrees +{ + return (map(readMicroseconds()+1, this->min, this->max, 0, 180)); +} + +int Servo::readMicroseconds() +{ + int pulsewidthUsec; + if ((this->servoChannel <= MAX_SERVOS) && (this->attached())) + { + pulsewidthUsec = ticksToUs(this->ticks); + } + else + { + pulsewidthUsec = 0; + } + + return (pulsewidthUsec); +} + +bool Servo::attached() +{ + return (ChannelUsed[this->servoChannel]); +} + +void Servo::setTimerWidth(int value) +{ + // only allow values between 16 and 20 + if (value < 16) + value = 16; + else if (value > 20) + value = 20; + + // Fix the current ticks value after timer width change + // The user can reset the tick value with a write() or writeUs() + int widthDifference = this->timer_width - value; + // if positive multiply by diff; if neg, divide + if (widthDifference > 0) + { + this->ticks = widthDifference * this->ticks; + } + else + { + this->ticks = this->ticks/-widthDifference; + } + + this->timer_width = value; + this->timer_width_ticks = pow(2,this->timer_width); + + // If this is an attached servo, clean up + if ((this->servoChannel <= MAX_SERVOS) && (this->attached())) + { + // detach, setup and attach again to reflect new timer width + ledcDetachPin(this->pinNumber); + ledcSetup(this->servoChannel, REFRESH_CPS, this->timer_width); + ledcAttachPin(this->pinNumber, this->servoChannel); + } +} + +int Servo::readTimerWidth() +{ + return (this->timer_width); +} + +int Servo::usToTicks(int usec) +{ + return (int)((float)usec / ((float)REFRESH_USEC / (float)this->timer_width_ticks)); +} + +int Servo::ticksToUs(int ticks) +{ + return (int)((float)ticks * ((float)REFRESH_USEC / (float)this->timer_width_ticks)); +} + + diff --git a/Arduino/libraries/ESP32Servo/src/ESP32Servo.h b/Arduino/libraries/ESP32Servo/src/ESP32Servo.h new file mode 100644 index 0000000..bdb0d41 --- /dev/null +++ b/Arduino/libraries/ESP32Servo/src/ESP32Servo.h @@ -0,0 +1,149 @@ +/* + Copyright (c) 2017 John K. Bennett. All right reserved. + + ESP32_Servo.h - Servo library for ESP32 - Version 1 + + Original Servo.h written by Michael Margolis in 2009 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + A servo is activated by creating an instance of the Servo class, and passing + the desired GPIO pin to the attach() method. + The servos are pulsed in the background using the value most recently + written using the write() method. + + The class methods are: + + Servo - Class for manipulating servo motors connected to ESP32 pins. + int attach(pin ) - Attaches the given GPIO pin to the next free channel + (channels that have previously been detached are used first), + returns channel number or 0 if failure. All pin numbers are allowed, + but only pins 2,4,12-19,21-23,25-27,32-33 are recommended. + int attach(pin, min, max ) - Attaches to a pin setting min and max + values in microseconds; enforced minimum min is 500, enforced max + is 2500. Other semantics same as attach(). + void write () - Sets the servo angle in degrees; a value below 500 is + treated as a value in degrees (0 to 180). These limit are enforced, + i.e., values are treated as follows: + Value Becomes + ----- ------- + < 0 0 + 0 - 180 value (treated as degrees) + 181 - 499 180 + 500 - (min-1) min + min-max (from attach or default) value (treated as microseconds) + (max+1) - 2500 max + + void writeMicroseconds() - Sets the servo pulse width in microseconds. + min and max are enforced (see above). + int read() - Gets the last written servo pulse width as an angle between 0 and 180. + int readMicroseconds() - Gets the last written servo pulse width in microseconds. + bool attached() - Returns true if this servo instance is attached. + void detach() - Stops an the attached servo, frees its attached pin, and frees + its channel for reuse). + + *** ESP32-specific functions ** + setTimerWidth(value) - Sets the PWM timer width (must be 16-20) (ESP32 ONLY); + as a side effect, the pulse width is recomputed. + int readTimerWidth() - Gets the PWM timer width (ESP32 ONLY) + */ + +#ifndef ESP32_Servo_h +#define ESP32_Servo_h +//Enforce only using PWM pins on the ESP32 +#define ENFORCE_PINS +// Default Arduino Servo.h +#define DEFAULT_uS_LOW 544 +#define DEFAULT_uS_HIGH 2400 + +// Values for TowerPro MG995 large servos (and many other hobbyist servos) +//#define DEFAULT_uS_LOW 1000 // 1000us +//#define DEFAULT_uS_HIGH 2000 // 2000us + +// Values for TowerPro SG90 small servos +//#define DEFAULT_uS_LOW 400 +//#define DEFAULT_uS_HIGH 2400 + +#define DEFAULT_TIMER_WIDTH 16 +#define DEFAULT_TIMER_WIDTH_TICKS 65536 + +#define ESP32_Servo_VERSION 1 // software version of this library + +#define MIN_PULSE_WIDTH 500 // the shortest pulse sent to a servo +#define MAX_PULSE_WIDTH 2500 // the longest pulse sent to a servo +#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached +#define DEFAULT_PULSE_WIDTH_TICKS 4825 +#define REFRESH_CPS 50 +#define REFRESH_USEC 20000 + +#define MAX_SERVOS 16 // no. of PWM channels in ESP32 + +/* +* This group/channel/timmer mapping is for information only; +* the details are handled by lower-level code +* +* LEDC Chan to Group/Channel/Timer Mapping +** ledc: 0 => Group: 0, Channel: 0, Timer: 0 +** ledc: 1 => Group: 0, Channel: 1, Timer: 0 +** ledc: 2 => Group: 0, Channel: 2, Timer: 1 +** ledc: 3 => Group: 0, Channel: 3, Timer: 1 +** ledc: 4 => Group: 0, Channel: 4, Timer: 2 +** ledc: 5 => Group: 0, Channel: 5, Timer: 2 +** ledc: 6 => Group: 0, Channel: 6, Timer: 3 +** ledc: 7 => Group: 0, Channel: 7, Timer: 3 +** ledc: 8 => Group: 1, Channel: 0, Timer: 0 +** ledc: 9 => Group: 1, Channel: 1, Timer: 0 +** ledc: 10 => Group: 1, Channel: 2, Timer: 1 +** ledc: 11 => Group: 1, Channel: 3, Timer: 1 +** ledc: 12 => Group: 1, Channel: 4, Timer: 2 +** ledc: 13 => Group: 1, Channel: 5, Timer: 2 +** ledc: 14 => Group: 1, Channel: 6, Timer: 3 +** ledc: 15 => Group: 1, Channel: 7, Timer: 3 +*/ + +class Servo +{ +public: + Servo(); + // Arduino Servo Library calls + int attach(int pin); // attach the given pin to the next free channel, returns channel number or 0 if failure + int attach(int pin, int min, int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < MIN_PULSE_WIDTH its treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // Write pulse width in microseconds + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo + bool attached(); // return true if this servo is attached, otherwise false + + // ESP32 only functions + void setTimerWidth(int value); // set the PWM timer width (ESP32 ONLY) + int readTimerWidth(); // get the PWM timer width (ESP32 ONLY) + + private: + int usToTicks(int usec); + int ticksToUs(int ticks); + static int ServoCount; // the total number of attached servos + static int ChannelUsed[]; // used to track whether a channel is in service + int servoChannel = 0; // channel number for this servo + int min = DEFAULT_uS_LOW; // minimum pulse width for this servo + int max = DEFAULT_uS_HIGH; // maximum pulse width for this servo + int pinNumber = 0; // GPIO pin assigned to this channel + int timer_width = DEFAULT_TIMER_WIDTH; // ESP32 allows variable width PWM timers + int ticks = DEFAULT_PULSE_WIDTH_TICKS; // current pulse width on this channel + int timer_width_ticks = DEFAULT_TIMER_WIDTH_TICKS; // no. of ticks at rollover; varies with width +}; +#endif diff --git a/Doku/Doxygen/Doxyfile b/Doku/Doxygen/Doxyfile index d4d1b35..b12e371 100644 --- a/Doku/Doxygen/Doxyfile +++ b/Doku/Doxygen/Doxyfile @@ -51,7 +51,7 @@ PROJECT_BRIEF = "... better know the details." # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = ../Doku/Bilder/coderace_logo.JPG +PROJECT_LOGO = C:/Users/jnoack/Documents/GITs/coderacer/Doku/Bilder/coderace_logo.JPG # 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 @@ -435,7 +435,7 @@ LOOKUP_CACHE_SIZE = 0 # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = 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. @@ -461,7 +461,7 @@ EXTRACT_STATIC = NO # for Java sources. # The default value is: YES. -EXTRACT_LOCAL_CLASSES = NO +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 @@ -544,7 +544,7 @@ HIDE_COMPOUND_REFERENCE= NO # the files that are included by a file in the documentation of that file. # The default value is: YES. -SHOW_INCLUDE_FILES = NO +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 @@ -666,21 +666,21 @@ MAX_INITIALIZER_LINES = 30 # list will mention the files that were used to generate the documentation. # The default value is: YES. -SHOW_USED_FILES = NO +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 = NO +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 = NO +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 @@ -790,7 +790,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = C:\Users\jnoack\Documents\Arduino\libraries\CodeRacer +INPUT = ../../Arduino/libraries/CodeRacer # 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 @@ -2343,7 +2343,7 @@ CALL_GRAPH = YES # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -CALLER_GRAPH = NO +CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical # hierarchy of all classes instead of a textual one. diff --git a/Doku/Doxygen/html/bc_s.png b/Doku/Doxygen/html/bc_s.png deleted file mode 100644 index 224b29aa9847d5a4b3902efd602b7ddf7d33e6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/Doku/Doxygen/html/bdwn.png b/Doku/Doxygen/html/bdwn.png deleted file mode 100644 index 940a0b950443a0bb1b216ac03c45b8a16c955452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT diff --git a/Doku/Doxygen/html/coderace_get_in_contact_pic.png b/Doku/Doxygen/html/coderace_get_in_contact_pic.png deleted file mode 100644 index 2ed634a893d9b81b7b28433fa9cdaaa5f2c5ed74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253786 zcmZ5{18`CSRC=yCtT7 z8Aio-gF_bPF#y6R=ZhY|(VpQE;Yp%FNt<-q*8eG~c6!m$)b$PA26bF?FF)589aqyd zHP$qC{v-gV^Oy2Bv26!1zqWpy_kP$rs%joq5w(02f2)Op)ct=Z{;x@(EdG0$|2t)&8|l5r_o|L1!5%^?x8L5= zWsQQ;mlKOU7)M)}zA)WW*C-!>0dBZKVoXM^r{PSgGtf8NZwj+NQ(mvvwqiDDAM9#Ko3#~=f_@sjnE z+tz25;3g!BOfPTVl{9)s;dEsˏ$>hJew8X?f0X5hl^gVTv!9PddTife;?ueje7 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

A>}_;@@XwE0 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%0AKS_M6qh;FHd5>6NqQr|P3XMDfP! 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 V^xtGkO`+{kVF8c$qft>t{u|e-W}W~5 diff --git a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.html b/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.html deleted file mode 100644 index 84ff2b1..0000000 --- a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - -Arduino {code}racer API: Getters - - - - - - - - - - - - - - -

-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
- - - - - - - - -

-Functions

uint8_t CodeRacer::drive_right_speed ()
 Get the setting for the speed of the right side drive. More...
 
uint8_t CodeRacer::drive_left_speed ()
 Get the setting for the speed of the left side drive. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ drive_right_speed()

- -
-
- - - - - - - -
uint8_t CodeRacer::drive_right_speed ()
-
- -

Get the setting for the speed of the right side drive.

-
Returns
Speed of the right side drive
- -

Definition at line 994 of file CodeRacer.cpp.

-
994  {
995  return _drive_right_speed;
996 }
-
-
- -

◆ drive_left_speed()

- -
-
- - - - - - - -
uint8_t CodeRacer::drive_left_speed ()
-
- -

Get the setting for the speed of the left side drive.

-
Returns
Speed of the left side drive
- -

Definition at line 1001 of file CodeRacer.cpp.

-
1001  {
1002  return(_drive_left_speed);
1003 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.js b/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.js deleted file mode 100644 index 7b830a1..0000000 --- a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.js +++ /dev/null @@ -1,5 +0,0 @@ -var group__lowerleveldrivesgetters = -[ - [ "drive_right_speed", "d0/d0a/group__lowerleveldrivesgetters.html#ga09359a792e3299b1c20f6b99939ea7b3", null ], - [ "drive_left_speed", "d0/d0a/group__lowerleveldrivesgetters.html#ga804a45724f3788fd2fdb9631c66d1377", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.map b/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.map deleted file mode 100644 index cfb1656..0000000 --- a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.md5 b/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.md5 deleted file mode 100644 index 88a8697..0000000 --- a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.md5 +++ /dev/null @@ -1 +0,0 @@ -27209861500fd81db6dccdd2984f5d4a \ No newline at end of file diff --git a/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.png b/Doku/Doxygen/html/d0/d0a/group__lowerleveldrivesgetters.png deleted file mode 100644 index 9a59f9c56e8787ee5851bd9ed8f35ed47f3d3390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1403 zcmV->1%&#EP)o61t@DmD1OfZ(ATN&8_u~fVR6=T&0K;0{*?0o|e zNQhF2ovB^;*g#?}TaoApBVWxOu7XmNI6jUOyYT->)xAk$`w-z%+ewNS1VKOm0E*^p z2LJ%G1xW({SdcUTfCWhd09fY59pmwsTCEm+eSO)82Y!iCsYIPlhsx!$?NGq5A0v%^ zzfaw6*G4Sxi*&nP>i7G$!+;$87-@uhyQjSZ?)DpUK6Bn{AmgyF8O ztu5OjIHA#K(Ba|X)IKB)fCTM!n|5|~Y=>cu@B8%j_V#0cA!{0*=Y7AT`^00Cw&Ti2 zk5RoRfE!0ryQ=NP?U((_jX^g)fGlz!X^8W7?mRxNylQ>iawghI>gc-bA!6NG&MSZ} zYgbQ#Aej23joVhO$8;Q~#MPCwFKY})7*Ld%Sko{y{MMOf*p?JSG|`0H07aOIq+zN< zaO-iQBg$gH^u#^2T5W23Fc?^hBtKSf?g~FG!(VoBJ5C;>jw0Jl!i~X&QIKiZ*Vi-} zjckXZtyZhiU@(|^iAf}_ylmSQ#*#*KB|o~NA9jZDrSoZ@rMzxEy6uYPvXI4K>b%(Y z`1nY^@6+1a8f|ZH)85{m?U1yD2}8t99J9d4^hBits=lYXc&O7ZCk~VCs>Z{KK_w1X zJwHEFuh*mF<72wNzo&(T1^W2-AR?mWs!nI|TbXc7tE3-^V|N8FZ`70Zcr#>J4u zOsr|Z?0b26p^J+PIypI^tE(%To16RocDOKM5dF?+S5#aQh)!j~_rz^k*|_brW3xcg zfZV*lztj2oIh~%K(&gnPO(qixf`BHI2~8#w+u`NP#)7D<4U9BkCNvriA|jffpQq2y zPo*-W(TH|;ck>LZ5J^*txNQ#Avf^3_k_NyG%hG{4WidS=bN3?HzS>~B{h}Nl9nsR# zQtb33Nu^S8;`?d2Yb$YU5Jc&nHA`ofl{J|pL{2A-ztXu(aPe7`#l=Oc*XvZT*Ao{) zZO3R*+~rlVz}F!NScR;bx*QnT5VUUHrFB%;zela7f?FuG+`W6_bz z9ih>Oui_r_jypc-k#*VeD)pq5Nh_y%Y|_uH(!T82xOURc6{l>{@p(RWzq-0g`}_NJ zcXvm_;gAjv4yanK5)sks>#Onhz^vSEBM*ni(K{ET+i}N5-;3T_E~_`K9$A^RaWNTt&Baf6laH;qS>MX>cC_H}xpF?qZ(qus!Mj+}Jqr=$!7-*z{4D?g002ov JPDHLkV1l5OvRwcG diff --git a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.html b/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.html deleted file mode 100644 index b7b1e7b..0000000 --- a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.html +++ /dev/null @@ -1,496 +0,0 @@ - - - - - - - -Arduino {code}racer API: Methods - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Functions

void CodeRacer::drives_settings (uint8_t drive_left_speed, uint8_t drive_right_speed, unsigned long turn_left_ms, unsigned long turn_right_ms)
 Overwrites some drive settings. This will replace the defaults set by the values in the header file. More...
 
void CodeRacer::set_drives_stop_left_right ()
 Stopps both drives. More...
 
void CodeRacer::set_drives_states_left_right (drivestate stateleft, drivestate stateright)
 Sets both of the drives to a specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK) More...
 
void CodeRacer::set_drive_left_state (drivestate state)
 Sets the left side drive to the specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK) More...
 
void CodeRacer::set_drive_right_state (drivestate state)
 Sets the right side drive to the specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK) More...
 
void CodeRacer::set_drive_state (drivestate state, uint8_t frwdpin, uint8_t backpin)
 Sets the specified drivestate for the drive connected to the sepecified pins (DRIVESTOP, DRIVEFRWD, DRIVEBACK) More...
 
void CodeRacer::set_drives_speed_left_right (uint8_t speedleft, uint8_t speedright)
 Sets the speed for both of the drives. More...
 
void CodeRacer::set_drive_left_speed (uint8_t speed)
 Sets the speed for the left side drive. More...
 
void CodeRacer::set_drive_right_speed (uint8_t speed)
 Sets the speed for the right side drive. More...
 
void CodeRacer::set_drive_speed (uint8_t speed, uint8_t enablepin)
 Sets the speed for the drive of the enable pin connected to the specified pin. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ drives_settings()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CodeRacer::drives_settings (uint8_t drive_left_speed,
uint8_t drive_right_speed,
unsigned long turn_left_for_ms,
unsigned long turn_right_for_ms 
)
-
- -

Overwrites some drive settings. This will replace the defaults set by the values in the header file.

-
Parameters
- - - - - -
drive_left_speedSpeed of the left side drive
drive_right_speedSpeed of the right side drive
turn_left_for_msTime in ms the racer will turn to the left around its center if turn_left() is called
turn_right_for_msTime in ms the racer will turn to the right around its center if turn_right() is called
-
-
-
Returns
nothing
- -

Definition at line 878 of file CodeRacer.cpp.

-
879 {
880  _drive_left_speed = drive_left_speed;
881  _drive_right_speed = drive_right_speed;
882  _turn_left_for_ms = turn_left_for_ms;
883  _turn_right_for_ms = turn_right_for_ms;
884 }
-
-
- -

◆ set_drives_stop_left_right()

- -
-
- - - - - - - -
void CodeRacer::set_drives_stop_left_right ()
-
- -

Stopps both drives.

-
Returns
nothing
- -

Definition at line 889 of file CodeRacer.cpp.

-
889  {
890  set_drive_left_state(DRIVESTOP);
891  set_drive_right_state(DRIVESTOP);
892 }
-
-
- -

◆ set_drives_states_left_right()

- -
-
- - - - - - - - - - - - - - - - - - -
void CodeRacer::set_drives_states_left_right (drivestate stateleft,
drivestate stateright 
)
-
- -

Sets both of the drives to a specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK)

-
Parameters
- - - -
stateleftdrivestate to set for the left side drive
staterightdrivestate to set for the right side drive
-
-
-
Returns
nothing
- -

Definition at line 899 of file CodeRacer.cpp.

-
899  {
900  set_drive_left_state(stateleft);
901  set_drive_right_state(stateright);
902 }
-
-
- -

◆ set_drive_left_state()

- -
-
- - - - - - - - -
void CodeRacer::set_drive_left_state (drivestate state)
-
- -

Sets the left side drive to the specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK)

-
Parameters
- - -
statedrivestate to set for the left side drive
-
-
-
Returns
nothing
- -

Definition at line 908 of file CodeRacer.cpp.

-
908  {
909  set_drive_state(state, _drive_left_frwd_pin, _drive_left_back_pin);
910 }
-
-
- -

◆ set_drive_right_state()

- -
-
- - - - - - - - -
void CodeRacer::set_drive_right_state (drivestate state)
-
- -

Sets the right side drive to the specified drivestate (DRIVESTOP, DRIVEFRWD, DRIVEBACK)

-
Parameters
- - -
statedrivestate to set for the right side drive
-
-
-
Returns
nothing
- -

Definition at line 916 of file CodeRacer.cpp.

-
916  {
917  set_drive_state(state, _drive_right_frwd_pin, _drive_right_back_pin);
918 }
-
-
- -

◆ set_drive_state()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
void CodeRacer::set_drive_state (drivestate state,
uint8_t frwdpin,
uint8_t backpin 
)
-
- -

Sets the specified drivestate for the drive connected to the sepecified pins (DRIVESTOP, DRIVEFRWD, DRIVEBACK)

-
Parameters
- - - - -
statedrivestate to set for the connected drive
frwdpinPin the forward signal of the drive device driver is connected at
backpinPin the backward signal of the drive device driver is connected at
-
-
-
Returns
nothing
- -

Definition at line 926 of file CodeRacer.cpp.

-
926  {
927  switch (state) {
928  case DRIVESTOP:
929  digitalWrite(frwdpin, LOW);
930  digitalWrite(backpin, LOW);
931  break;
932  case DRIVEFRWD:
933  digitalWrite(frwdpin, HIGH);
934  digitalWrite(backpin, LOW);
935  break;
936  case DRIVEBACK:
937  digitalWrite(frwdpin, LOW);
938  digitalWrite(backpin, HIGH);
939  break;
940  }
941 }
-
-
- -

◆ set_drives_speed_left_right()

- -
-
- - - - - - - - - - - - - - - - - - -
void CodeRacer::set_drives_speed_left_right (uint8_t speedleft,
uint8_t speedright 
)
-
- -

Sets the speed for both of the drives.

-

The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before

Parameters
- - - -
speedleftspeed of the left side drive. 0<=speed<=255
speedrightspeed of the right side drive. 0<=speed<=255
-
-
-
Returns
nothing
- -

Definition at line 950 of file CodeRacer.cpp.

-
950  {
951  set_drive_left_speed(speedleft);
952  set_drive_right_speed(speedright);
953 }
-
-
- -

◆ set_drive_left_speed()

- -
-
- - - - - - - - -
void CodeRacer::set_drive_left_speed (uint8_t speed)
-
- -

Sets the speed for the left side drive.

-

The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before

Parameters
- - -
speedspeed of the left side drive. 0<=speed<=255
-
-
-
Returns
nothing
- -

Definition at line 961 of file CodeRacer.cpp.

-
961  {
962  set_drive_speed(speed, _drive_left_enable_pin);
963 }
-
-
- -

◆ set_drive_right_speed()

- -
-
- - - - - - - - -
void CodeRacer::set_drive_right_speed (uint8_t speed)
-
- -

Sets the speed for the right side drive.

-

The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before

Parameters
- - -
speedspeed of the right side drive. 0<=speed<=255
-
-
-
Returns
nothing
- -

Definition at line 971 of file CodeRacer.cpp.

-
971  {
972  set_drive_speed(speed, _drive_right_enable_pin);
973 }
-
-
- -

◆ set_drive_speed()

- -
-
- - - - - - - - - - - - - - - - - - -
void CodeRacer::set_drive_speed (uint8_t speed,
uint8_t enablepin 
)
-
- -

Sets the speed for the drive of the enable pin connected to the specified pin.

-

The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set_drive_state methods before

Parameters
- - - -
speedspeed of the drive. 0<=speed<=255
enablepinPin the drives device driver enable pin is connected at
-
-
-
Returns
nothing
- -

Definition at line 982 of file CodeRacer.cpp.

-
982  {
983  _analog_write(enablepin, (int)speed);
984 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.js b/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.js deleted file mode 100644 index 5e1597f..0000000 --- a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.js +++ /dev/null @@ -1,13 +0,0 @@ -var group__lowerleveldrivesmeths = -[ - [ "drives_settings", "d1/d8a/group__lowerleveldrivesmeths.html#ga5812df751da5b480240ccd633c515b83", null ], - [ "set_drives_stop_left_right", "d1/d8a/group__lowerleveldrivesmeths.html#ga61ed9e0415a62a290cc5c59a0f740304", null ], - [ "set_drives_states_left_right", "d1/d8a/group__lowerleveldrivesmeths.html#ga802d2646d9cc0d766e1ac799c7917fa8", null ], - [ "set_drive_left_state", "d1/d8a/group__lowerleveldrivesmeths.html#ga1eeb3cb47503c3011562f9c42828fab9", null ], - [ "set_drive_right_state", "d1/d8a/group__lowerleveldrivesmeths.html#ga1b34ec9cee1f21cd15db310167a2faa5", null ], - [ "set_drive_state", "d1/d8a/group__lowerleveldrivesmeths.html#ga3b69cf4a718c842fbe758d3f4267214e", null ], - [ "set_drives_speed_left_right", "d1/d8a/group__lowerleveldrivesmeths.html#ga3d3ffb41783d34589e33cf61fed46c70", null ], - [ "set_drive_left_speed", "d1/d8a/group__lowerleveldrivesmeths.html#ga1ee3da20ec98a821ab97ced070974861", null ], - [ "set_drive_right_speed", "d1/d8a/group__lowerleveldrivesmeths.html#gaf8805d0d620a2fb78c576f36a2c81073", null ], - [ "set_drive_speed", "d1/d8a/group__lowerleveldrivesmeths.html#ga5d67c84606d5b39996a99fcd6e7eb314", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.map b/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.map deleted file mode 100644 index 14dbabc..0000000 --- a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.md5 b/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.md5 deleted file mode 100644 index 1c53b05..0000000 --- a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.md5 +++ /dev/null @@ -1 +0,0 @@ -f031a65379fe10c49a2f5864707d7064 \ No newline at end of file diff --git a/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.png b/Doku/Doxygen/html/d1/d8a/group__lowerleveldrivesmeths.png deleted file mode 100644 index 44ef0c1661d08c7b3fe3a95372f16a9032871070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1419 zcmV;61$6p}P) zkph2o2S7yYg9(L*lwm?4B4wCRh)9`|f5l`nL9^M!&(DvJcxX-7wvBeXjY_4WI~2;% z$_QmJ7@*tj>WGEbNVnU?U@*`f2IXvJgtE}<_415^){JFYxo|vMiYRNKjUB$+7rTFpOo}HfpsRN~Pr#q9mbE zGE64sIygAc9fI+0Z*Nhr*O%5Yp%8^QJ3GVS;i2v@jN~{DK0ZEH*5@*ZVp-PTAMZMU znXu)c{k>&G?|G1oBdlG~c7oPN{VN+o()ft7lKBY5KTjY#ZxFY?XnnH#sc0uG2_&6= z@zQ5}aWL3M?#OB(}|37Mb}b115Y^hr)#bPJ2Yn}in2 zM7kB?J`~q=mwxi9M^(FNM8)7;Z$k3>%^b%`wO#doS=AFqYeHFcghfa3F9*qDw327L zVPs=i#{}~H{EWxPN8Mp07S?HHI&)qfKP$>kd4m4HgT6gwzv)#C?Pcpp+OEpcLR1Xv za?11m{*GR+hs(=LjK^aD#r-U#D4~dSPSI_m6PZccm5D=TyQ1;P#2^xfsixB@`u#pS zoemxz9svCNEah@pXK1MmheJ4ygW+)acim#yKl1P{FUl|0`Rnj*3tJzx&A&cwzcdOl zDNDuo`T2?a`+HnnU7_FaV>X+?vaFRi1Nv{}UPoa`CnzEL%ZL3QS5BmT6$&vaOU2~6 zE{4M)PEJm+v$KPGy^fok8+?6zVLqR)2z>?eU0gK3fs0LM=7OJ$%ywEr@2xWHWv~`WrxAw{$!eOnkP-vMe}` z1IKZ2ad9CuDf=75opOkF_^5h9w+G<=%ga<;nO!zs47nF~bo!Tr%6YeWZ^w_SH?E$j zed6|u`b=?kiMAhi+(g>xrx=Y!czJoj)6-LCZBh0zJLQqN zOEpcsN%oKGAZhMQ6@B1Pw1ejP(4Pr+mG$s zacLi+#0{@Sza3>B^_OWstZY_uAyI9}9xLy1($5)JmdGoUgd+QxzN*LllTIuqJrxN1 zT{bqEc#<9~nSJA8APS>>ghI${{dnM}}ZHh<-tv`8J>w$X04QK?jPheA18Nhm}_NpTK^h?HSMAtGg%P>4twCKMu4 Z=0Ce|-0WHgC-wjU002ovPDHLkV1knrsyhGx diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.html b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.html deleted file mode 100644 index 0313cb5..0000000 --- a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.html +++ /dev/null @@ -1,597 +0,0 @@ - - - - - - - -Arduino {code}racer API: Methods - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Functions

void CodeRacer::stop_driving ()
 Stops the racer and sets status LEDs. More...
 
void CodeRacer::drive_forward ()
 Sets the speed and the directions of both drives so that it will move forward. More...
 
void CodeRacer::drive_forward (uint8_t left_speed, uint8_t right_speed)
 Sets the speed as specified for both drives and the directions of both drives so that it will move forward. More...
 
void CodeRacer::drive_backward ()
 Sets the speed and the directions of both drives so that it will move backward. More...
 
void CodeRacer::drive_backward (uint8_t left_speed, uint8_t right_speed)
 Sets the speed as specified for both drives and the directions of both drives so that it will move backward. More...
 
void CodeRacer::turn_left ()
 Will turn the racer to the left for the internally stroe time in ms and with the internally stored speed. More...
 
void CodeRacer::turn_left (unsigned long turn_for_ms)
 Will turn the racer to the left for the specified time in ms and with the internally stored speed. More...
 
void CodeRacer::turn_left (unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)
 Will turn the racer to the left for the specified time in ms and with the specified speed. More...
 
void CodeRacer::turn_right ()
 Will turn the racer to the right for the internally stroe time in ms and with the internally stored speed. More...
 
void CodeRacer::turn_right (unsigned long turn_for_ms)
 Will turn the racer to the right for the specified time in ms and with the internally stored speed. More...
 
void CodeRacer::turn_right (unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)
 Will turn the racer to the right for the specified time in ms and with the specified speed. More...
 
void CodeRacer::start_stop_at_min_distance ()
 Enables to stopp the racer if during a distance measurement the measured distance is smaller then the internally stored minimal distance. More...
 
void CodeRacer::start_stop_at_min_distance (unsigned long min_distance_cm)
 Enables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. More...
 
void CodeRacer::stop_stop_at_min_distance ()
 Disables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. More...
 
bool CodeRacer::start_stop ()
 This will return if the codracer is in active mode or not. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ stop_driving()

- -
-
- - - - - - - -
void CodeRacer::stop_driving ()
-
- -

Stops the racer and sets status LEDs.

-
Returns
nothing
- -

Definition at line 161 of file CodeRacer.cpp.

-
161  {
162  _servo_sweep = false;
163  _drive = false;
164  set_drives_stop_left_right();
165  set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDOFF, LEDOFF);
166 }
-
-
- -

◆ drive_forward() [1/2]

- -
-
- - - - - - - -
void CodeRacer::drive_forward ()
-
- -

Sets the speed and the directions of both drives so that it will move forward.

-

The speed is taken from the header file or set by one of the methods defined in the lower level drive methods section

Returns
nothing
- -

Definition at line 173 of file CodeRacer.cpp.

-
174 {
175  drive_forward(_drive_left_speed, _drive_right_speed);
176 }
- + Here is the call graph for this function:
-
-
- - -
-
- -

◆ drive_forward() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
void CodeRacer::drive_forward (uint8_t left_speed,
uint8_t right_speed 
)
-
- -

Sets the speed as specified for both drives and the directions of both drives so that it will move forward.

-

The specified speed values for both drives will be stored internaly so next time if you use e.g. drive_forward() exactly the here specified values will be taken.

Parameters
- - - -
left_speedspeed for the left side drive. 0<=speed<=255
right_speedspeed for the right side drive. 0<=speed<=255
-
-
-
Returns
nothing
- -

Definition at line 185 of file CodeRacer.cpp.

-
186 {
187  set_drives_states_left_right(DRIVEFRWD, DRIVEFRWD);
188  set_drives_speed_left_right(left_speed, right_speed);
189  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDON, LEDOFF);
190  _drive = true;
191  _drive_set_at_ms = millis();
192 }
-
-
- -

◆ drive_backward() [1/2]

- -
-
- - - - - - - -
void CodeRacer::drive_backward ()
-
- -

Sets the speed and the directions of both drives so that it will move backward.

-

The speed is taken from the header file or set by one of the methods defined in the lower level drive methods section

Returns
nothing
- -

Definition at line 199 of file CodeRacer.cpp.

-
200 {
201  drive_backward(_drive_left_speed, _drive_right_speed);
202 }
-
-
- -

◆ drive_backward() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
void CodeRacer::drive_backward (uint8_t left_speed,
uint8_t right_speed 
)
-
- -

Sets the speed as specified for both drives and the directions of both drives so that it will move backward.

-

The specified speed values for both drives will be stored internaly so next time if you use e.g. drive_backward() exactly the here specified values will be taken.

Parameters
- - - -
left_speedspeed for the left side drive. 0<=speed<=255
right_speedspeed for the right side drive. 0<=speed<=255
-
-
-
Returns
nothing
- -

Definition at line 211 of file CodeRacer.cpp.

-
212 {
213  set_drives_states_left_right(DRIVEBACK, DRIVEBACK);
214  set_drives_speed_left_right(left_speed, right_speed);
215  set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDON, LEDOFF);
216  _drive = true;
217  _drive_set_at_ms = millis();
218 }
-
-
- -

◆ turn_left() [1/3]

- -
-
- - - - - - - -
void CodeRacer::turn_left ()
-
- -

Will turn the racer to the left for the internally stroe time in ms and with the internally stored speed.

-

The speed for both the left side and right side drive can be set by the methods described in the lower level drive section. The turn to left time can be set by thoose methods as well. The method is delayed until the racer has turned.

Returns
nothing
- -

Definition at line 226 of file CodeRacer.cpp.

-
227 {
228  turn_left(_turn_left_for_ms, _drive_left_speed, _drive_right_speed);
229 }
-
-
- -

◆ turn_left() [2/3]

- -
-
- - - - - - - - -
void CodeRacer::turn_left (unsigned long turn_for_ms)
-
- -

Will turn the racer to the left for the specified time in ms and with the internally stored speed.

-

The specified duration of time is stored internally and will be used next time by e.g. turn_left()

Parameters
- - -
turn_for_msduration of time in ms to turn the racer
-
-
-
Returns
nothing
- -

Definition at line 237 of file CodeRacer.cpp.

-
238 {
239  turn_left(turn_for_ms, _drive_left_speed, _drive_right_speed);
240 }
-
-
- -

◆ turn_left() [3/3]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
void CodeRacer::turn_left (unsigned long turn_for_ms,
uint8_t left_speed,
uint8_t right_speed 
)
-
- -

Will turn the racer to the left for the specified time in ms and with the specified speed.

-

The specified duration of time and the specified speeds are stored internally and will be used next time by e.g. turn_left()

Parameters
- - - - -
turn_for_msduration of time in ms to turn the racer
left_speedspeed for the left side drive
right_speedspeed for the right side drive
-
-
-
Returns
nothing
- -

Definition at line 250 of file CodeRacer.cpp.

-
251 {
252  _drive = false;
253  set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF); // LEDs setzen
254  set_drives_states_left_right(DRIVEBACK, DRIVEFRWD);
255  set_drives_speed_left_right(left_speed, right_speed);
256  // wait set delay for the timed turn
257  _turn_left_for_ms = turn_for_ms;
258  delay(_turn_left_for_ms);
259  // stop drives again
260  set_drives_stop_left_right();
261 }
-
-
- -

◆ turn_right() [1/3]

- -
-
- - - - - - - -
void CodeRacer::turn_right ()
-
- -

Will turn the racer to the right for the internally stroe time in ms and with the internally stored speed.

-

The speed for both the left side and right side drive can be set by the methods described in the lower level drive section. The turn to right time can be set by thoose methods as well. The method is delayed until the racer has turned.

Returns
nothing
- -

Definition at line 269 of file CodeRacer.cpp.

-
270 {
271  turn_right(_turn_right_for_ms, _drive_left_speed, _drive_right_speed);
272 }
-
-
- -

◆ turn_right() [2/3]

- -
-
- - - - - - - - -
void CodeRacer::turn_right (unsigned long turn_for_ms)
-
- -

Will turn the racer to the right for the specified time in ms and with the internally stored speed.

-

The specified duration of time is stored internally and will be used next time by e.g. turn_right()

Parameters
- - -
turn_for_msduration of time in ms to turn the racer
-
-
-
Returns
nothing
- -

Definition at line 280 of file CodeRacer.cpp.

-
281 {
282  turn_right(turn_for_ms, _drive_left_speed, _drive_right_speed);
283 }
-
-
- -

◆ turn_right() [3/3]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
void CodeRacer::turn_right (unsigned long turn_for_ms,
uint8_t left_speed,
uint8_t right_speed 
)
-
- -

Will turn the racer to the right for the specified time in ms and with the specified speed.

-

The specified duration of time and the specified speeds are stored internally and will be used next time by e.g. turn_right()

Parameters
- - - - -
turn_for_msduration of time in ms to turn the racer
left_speedspeed for the left side drive
right_speedspeed for the right side drive
-
-
-
Returns
nothing
- -

Definition at line 293 of file CodeRacer.cpp.

-
294 {
295  _drive = false;
296  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDOFF, LEDON); // LEDs setzen
297  set_drives_states_left_right(DRIVEFRWD, DRIVEBACK);
298  set_drives_speed_left_right(left_speed, right_speed);
299  // wait set delay for the timed turn
300  _turn_right_for_ms = turn_for_ms;
301  delay(_turn_right_for_ms);
302  // stop drives again
303  set_drives_stop_left_right();
304 }
-
-
- -

◆ start_stop_at_min_distance() [1/2]

- -
-
- - - - - - - -
void CodeRacer::start_stop_at_min_distance ()
-
- -

Enables to stopp the racer if during a distance measurement the measured distance is smaller then the internally stored minimal distance.

-

This allow all of the none-single shot ultra sonic measurement methods to stopp the racer in the case the measured distance is smaller than minimal distance. This is just the enablement - you have to call one of the none-single-shot ultra sonic measurement methods continously while driving and maybe sweeping the servo. If the racer was stopped can be checked with stopped_at_min_distance() - it will return true in that case. The minimal distance can be set by the ultrasonic sensor setter methods. There is an example coming with the coderacer libary that you can load and get an idea how that works.

Returns
nothing
- -

Definition at line 314 of file CodeRacer.cpp.

-
314  {
315  start_stop_at_min_distance(_usonic_stop_distance_cm);
316 }
-
-
- -

◆ start_stop_at_min_distance() [2/2]

- -
-
- - - - - - - - -
void CodeRacer::start_stop_at_min_distance (unsigned long min_distance_cm)
-
- -

Enables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance.

-

This is almos the same as described for start_stop_at_min_distance(). You can specify the distance in cm here - this value will be stored internally and used by start_stop_at_min_distance() next time.

Parameters
- - -
min_distance_cmthe minimal disctance in cm
-
-
-
Returns
nothing
- -

Definition at line 324 of file CodeRacer.cpp.

-
324  {
325  if (false == _coderacer_stop_at_distance_enabled) {
326  _coderacer_stopped_at_min_distance = false;
327  usonic_set_stop_distance_cm(min_distance_cm);
328  _coderacer_stop_at_distance_enabled = true;
329  }
330 }
-
-
- -

◆ stop_stop_at_min_distance()

- -
-
- - - - - - - -
void CodeRacer::stop_stop_at_min_distance ()
-
- -

Disables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance.

-
Returns
nothing
- -

Definition at line 335 of file CodeRacer.cpp.

-
335  {
336  _coderacer_stop_at_distance_enabled = false;
337 }
-
-
- -

◆ start_stop()

- -
-
- - - - - - - -
bool CodeRacer::start_stop ()
-
- -

This will return if the codracer is in active mode or not.

-

There is a button used to toogle between active and inactive each time it is pressed This may help you to start driving and scanning the distance by pressing the button - and as well to stop the racer by pressing the button. This method will set the LEDs depending on the mode and sets the servo back to center and stopps the racer when leaving the active mode. You can leave or enter the active mode as well by setting using set_active() and set_inactive(). The button itself triggers and internall interrupt event and sets the active state - but you have to continously call that method to switch between inactive and active mode depending on the active state. If in inactive mode and fun is enabeld by just setting the coderacer_fun_enabled = true ... some fun will happen :-)

-
Returns
True if the coderacer is in active mode. False if in inactive mode.
- -

Definition at line 348 of file CodeRacer.cpp.

-
348  {
349  if (_coderracer_activ != coderracer_activ) {
350  _coderracer_activ = coderracer_activ;
351  if (true == _coderracer_activ) {
352  set_leds_all_off();
353  delay(500);
354  }
355  else {
356  stop_driving();
357  set_leds_all_on();
358  delay(200);
359  servo_set_to_center();
360  _servo_look_around_at_ms = millis() + random(20000, 120000);
361  }
362  }
363 
364  if ((false == _coderracer_activ) && (true == coderacer_fun_enabled)) {
365  kitt();
366  look_around();
367  }
368 
369  return(_coderracer_activ);
370 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.js b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.js deleted file mode 100644 index 4107571..0000000 --- a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.js +++ /dev/null @@ -1,18 +0,0 @@ -var group__higherlevelmeths = -[ - [ "stop_driving", "d2/d40/group__higherlevelmeths.html#ga71df7ac5e41ae776a6c786d3dc36f35a", null ], - [ "drive_forward", "d2/d40/group__higherlevelmeths.html#ga8be6a850099812153dcf5768d7fc8b8c", null ], - [ "drive_forward", "d2/d40/group__higherlevelmeths.html#gaae6fc379ec43cbe2cb2f63fbd12dbe0d", null ], - [ "drive_backward", "d2/d40/group__higherlevelmeths.html#ga98aa8a5a46f769d59e6c1067c8418cfb", null ], - [ "drive_backward", "d2/d40/group__higherlevelmeths.html#ga6cd8356ac76360b014db6170276b6b30", null ], - [ "turn_left", "d2/d40/group__higherlevelmeths.html#ga86b7caf6ff46e9d1ad90ed507864b175", null ], - [ "turn_left", "d2/d40/group__higherlevelmeths.html#ga30e1ec3fbbc206f93ea66dbf91b5fd95", null ], - [ "turn_left", "d2/d40/group__higherlevelmeths.html#gae6daa587199e5bf95b1aac675de53b0e", null ], - [ "turn_right", "d2/d40/group__higherlevelmeths.html#ga8969fb2d6e2b5ac44a99197931e6b8da", null ], - [ "turn_right", "d2/d40/group__higherlevelmeths.html#gae1f175aad98d773b0206f483ae0bb4ea", null ], - [ "turn_right", "d2/d40/group__higherlevelmeths.html#gad10b3457489cc7e25ffb4d64c539528a", null ], - [ "start_stop_at_min_distance", "d2/d40/group__higherlevelmeths.html#ga128683caea019a89bce06f722ba92556", null ], - [ "start_stop_at_min_distance", "d2/d40/group__higherlevelmeths.html#ga64bc1b2a8ed5bc3ec5e706fa70a1385d", null ], - [ "stop_stop_at_min_distance", "d2/d40/group__higherlevelmeths.html#gac664109241d08b8dc52db5721f394b22", null ], - [ "start_stop", "d2/d40/group__higherlevelmeths.html#ga34e2fe2123e76fd844482dfef6c5a9c8", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.map b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.map deleted file mode 100644 index 51f5bdc..0000000 --- a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.md5 b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.md5 deleted file mode 100644 index 6cd42f5..0000000 --- a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.md5 +++ /dev/null @@ -1 +0,0 @@ -14fcbf5ea95fbca4940db3735dae3e20 \ No newline at end of file diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.png b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths.png deleted file mode 100644 index 1fcdd7c702f26813c43fc291ec2e8ca96abe09ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1458 zcmV;j1x@;iP)FDSP zola*YJ+M8MSS&X3dYER;Gv|*>A6K7MT~_@u*JD+uUAssT`3g zWiu7o!DifRamu&amvMS6(!NMJx9yDUKLDxsHW&=Xw&&&?*`0SU?~%wz*-T|P0E~Y` z%Za49txLANab}=mP?_scHBeQ&S3m2g=@q#>6;)Gn*?NLl66joZ7z66?HIW;U`<{xM z*^r8QRJE(S4bk?wui{QBmGYFYx}0D2*wG$TynJ~5n6+5#VffLmXrF=*mLSsUbnyE6 zil3h!-Cc3bYT(KY=pY8aU$g|3;lP#Mw=kCTvgaXNkE(XPv>`g^?dmb-`O&@`{eB;{ zS`B-9dstdp!uIwyUS3{&YmfY;WKYFvkeNTwvSqxKldab&&rQ3s??u%)k$rC>d4Bl# z_`v=BJ#KGr(QdafH#he?L;3#x4zw>S)oL}QQYqAGwcoViYx4}m_yb~;X^ zeXq1He;8n*!OQt6r~Td3o8_Hgs;tnwMjd4=ObI z_=Cfls)4MceN{6m29*Fz>k=;>k0YH<KS*% zNwj^pA`w(*a;&VZpja%TSS;FJQjRL~z?6Nhx*jiiZUuhzN94AAyIcRQ9t9xtNCcT% z{6*@OeZ+v>u_EtF_c>8zeSIBgXJ=@&TBug5$Y!%xTwDYIEG#Sp)(=uE(4bC z#p7{QDiu^J72RD4tz0fQlE$E-8J8a6RV)^A(B%Bh7#K`Xn zCTH3od`(1?g+YaglwwdJBBdBqh)5~RjoRJa-5~ox6R2D+Ykzth1ur%*U3zG>TFB?~ z==FNK`a}~Xo6Yhu22*Avs1Ol(!95isQi?%^h?HVbAtI$1RES8a|LN*35&T<-`Tzg` M07*qoM6N<$f}+36SpWb4 diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.map b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.map deleted file mode 100644 index 0d345a1..0000000 --- a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.map +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 deleted file mode 100644 index 257acdd..0000000 --- a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -88ea8cb2a7473284c7f30fcb34c5462f \ No newline at end of file diff --git a/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.png b/Doku/Doxygen/html/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.png deleted file mode 100644 index fd01ac4c73ea204ee041f6ed36012c412645b5f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2066 zcmV+t2<`WYP)z(n-P9UcqXpx3n^I`7F`-GtD%tK5wB<#S zmvLYR*nzn-`(Xnm!@R=Wxx>BZNhZv_XYM(_bLMx?`QLNT9SlC7&xb&;@~JVZtw11% z6~fE{%^=Jy&ly2f1;h zkFKshu3zut_U#d@)^whJdI$UV+1a^svoQ8g2r~n8cMsCg@FguRU8JR%si@dSWu=|n zyC0tKVH1IYfd^c^e1n#j>vVPXla-ahfdjjE@x@ZIvNF_`r#AXF^AA6aa^l2AT3i1~ zVWEweUw(?cdv{M@qpP@FZmO%xsHu61^z>x4rKyEJ%`D4a8XCUj z?YBQCKR=t-U$3OBY-?P?hgjowduVLD$~*6TPG)8br%%5?Y3a|^mZb*zGxPNH42KT= zg^rGY^U5o~=Fp*XBx&WxonvDzUVH5VSFU`=8*l9ArI(&mTT;BKN&N9NhD=Y-@ci=) z^!GdX^wT43-@ZX@NioA}&ESI%e#@CN9n{rbVrt4wZEc0xvf_%a%zXU#-xwWr(cJt8 z^75=|%Ta`b2X~X5ZQ=0YzmlJy%`?yZLTyQLLpNr=bm?1~o4Yh^WB`xHOJ${<{(c9q zzS_iNkL8n-vs!Igabe{LixJ@U`grTDzjNfs9=2`ERa=f?G&gsVmv@ZX+Os_I#KWvx zm&xhV|4>_2+|Y%Yzxbk?;o%7m9^9?A6h-On9R}dy#c!#o_!AzFOjFZ0^Xo&jjxNmH z-u^ws#T&`YOjTQoqBxyXBqf>V*NOD?Iq-O7%FF-A`|r0iF`;c!>%z?4-FGQ0%u!p0 z;y9gC$g+2STb8}}d@wXL&dHN46c?YMw)PX8&M6gDDu*u2EX!V!l1ysLP@J(b7hZ4R z+Xk}i#qIWR{(L82f87&jW${55vl$jk3KJ9mRa=JQjE?>%WV*p%;J|^M?A==&Cq?l^ z7d`X#?HjmtYd~!oisNuh22GPBBm4K;IeGHAI4X)Sx-j#eJw@EQHOT$@<7!J$lwh+K zl4N4nt}VR#Zk48&jB2-L3wZR=d^T;e(%5)aZ7GW4a=91nlOz*GMK&56f2aBD23?rh zXf#k;Tfvz#9gK{Gjw@FxPUjT+O^ugL9}Jd7EYZy<-dFJV^e3(o~5d) zin6k@xQSDPxmvHl$NmE1^%|L-HItmIZ6mk0w*v&ah!6hQR9#)2a*70kB~n^iN_~BO zz%<>(%mVEq%q-9h!ps8AAj~Y#3^85LTwY#2|GurQZCUw5a{R*b7P6eO<3XtUMOycz zmJ5m1KC!HC%*^aBO35!}A%V(>SJ_ISq>)!@n?y=X!i+!-)z;P)wC5BElt9s#+27#h z<>m7)e}e4~cU&YyQf@S9bKCxZ{nG>G6=;97c}CkFf%1%`ZsF<`ZGQfrjWuz51~60@ z;{QI<<6>EEG->|ZfkvfZ8iE-*(mE}rJ?2KqXzLcu$r5Q>g=>rDkZ`jZ(Z+QPdxW{y z!aSnMPpQv_J1*G1g}qulafUq0Zn)da31vCy7WR>PiGn zikdlAJxZi`_z$OnG(^+riF);)Xu6iu#<3(OVMd_%N~xi7ISm!=*ih+ed_jRuPJfiv z<*y-}CN+ELnDxy5h7LDX=O5RGx&ac+&6r?~A1tp(HH9-&sL>#n)0EM+hf;Y2%P(AA zm7KB-x}G`FhBAQwptZG?`uh5S>zNa7HbWp-Dl1|(LlB-wXMD7bFtbL`i(x|{!VH0C z5M~x=24QA_W)Nl;XojE{fOEf3AP^)Hp?taMrb%aKCnY5%N^24bmW - - - - - - -Arduino {code}racer API: Lower level servo drive methods and getters - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
- -
-
Lower level servo drive methods and getters
-
-
- - - - - - -

-Modules

 Methods
 
 Getters
 
-

Detailed Description

-
-
- - - - diff --git a/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.js b/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.js deleted file mode 100644 index 09ed28b..0000000 --- a/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.js +++ /dev/null @@ -1,5 +0,0 @@ -var group__lowerlevelservo = -[ - [ "Methods", "db/dd5/group__lowerlevelservomeths.html", "db/dd5/group__lowerlevelservomeths" ], - [ "Getters", "d4/df4/group__lowerlevelservogetters.html", "d4/df4/group__lowerlevelservogetters" ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.map b/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.map deleted file mode 100644 index 1282428..0000000 --- a/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.md5 b/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.md5 deleted file mode 100644 index c2b7c49..0000000 --- a/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.md5 +++ /dev/null @@ -1 +0,0 @@ -580a059516c5c4bee6990866828766d5 \ No newline at end of file diff --git a/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.png b/Doku/Doxygen/html/d3/d17/group__lowerlevelservo.png deleted file mode 100644 index 517e7348c8ad5691d2078c842b1a64e0a30fbce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2839 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 - - - - - - -Arduino {code}racer API: C:/Users/jnoack/Documents/Arduino/libraries/CodeRacer/CodeRacer.cpp Source File - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
-
CodeRacer.cpp
-
-
-
1 // the compiler switch for an ESP8266 is looking like this: #elif defined(ARDUINO_ARCH_ESP8266)
2 #include "CodeRacer.h"
3 
7 CodeRacer::CodeRacer()
8 {
9  _button_pin = H_BUTTON_PIN;
10  _servo_pin = H_SERVO_PIN;
11  _us_trigger_pin = H_US_TRIG_PIN;
12  _us_echo_pin = H_US_ECHO_PIN;
13  _drive_left_frwd_pin = H_DRIVE_LEFT_FWRD_PIN;
14  _drive_left_back_pin = H_DRIVE_LEFT_BACK_PIN;
15  _drive_left_enable_pin = H_DRIVE_LEFT_ENABLE_PIN;
16  _drive_right_frwd_pin = H_DRIVE_RIGHT_FWRD_PIN;
17  _drive_right_back_pin = H_DRIVE_RIGHT_BACK_PIN;
18  _drive_right_enable_pin = H_DRIVE_RIGHT_ENABLE_PIN;
19  _led_frwd_pin = H_LED_FRWD_PIN;
20  _led_stop_pin = H_LED_STOP_PIN;
21  _led_left_pin = H_LED_LEFT_PIN;
22  _led_right_pin = H_LED_RIGHT_PIN;
23 }
24 
42 CodeRacer::CodeRacer(uint8_t button_pin , uint8_t servo_pin,
43  uint8_t us_trigger_pin, uint8_t us_echo_pin,
44  uint8_t drive_left_frwd_pin, uint8_t drive_left_back_pin, uint8_t drive_left_enable_pin,
45  uint8_t drive_right_frwd_pin, uint8_t drive_right_back_pin, uint8_t drive_right_enable_pin,
46  uint8_t led_frwd_pin, uint8_t led_stop_pin, uint8_t led_left_pin, uint8_t led_right_pin
47 )
48 {
49  _button_pin = button_pin;
50  _servo_pin = servo_pin;
51  _us_trigger_pin = us_trigger_pin;
52  _us_echo_pin = us_echo_pin;
53  _drive_left_frwd_pin = drive_left_frwd_pin;
54  _drive_left_back_pin = drive_left_back_pin;
55  _drive_left_enable_pin = drive_left_enable_pin;
56  _drive_right_frwd_pin = drive_right_frwd_pin;
57  _drive_right_back_pin = drive_right_back_pin;
58  _drive_right_enable_pin = drive_right_enable_pin;
59  _led_frwd_pin = led_frwd_pin;
60  _led_stop_pin = led_stop_pin;
61  _led_left_pin = led_left_pin;
62  _led_right_pin = led_right_pin;
63 }
64 
68 void CodeRacer::begin() {
69 
70  // init of variables and objects
71 
72  _servo_dummy = new Servo(); // the dummy is needed so far to avoid conflicts with analog write
73  _servo = new Servo();
74  servo_center_pos = H_SERVO_CENTER_POS;
75  servo_left_pos = H_SERVO_LEFT_POS;
76  servo_right_pos = H_SERVO_RIGHT_POS;
77  servo_sweep_left_pos = H_SERVO_SWEEP_LEFT_POS;
78  servo_sweep_right_pos = H_SERVO_SWEEP_RIGHT_POS;
79  _servo_position = servo_center_pos;
80  _servo_sweep_step = SERVO_SWEEP_TO_LEFT_STEP;
81  _servo_position_set_at_ms = millis();
82  _servo_position_eta_in_ms = 0;
83 
84  _drive_left_speed = H_DRIVE_LEFT_SPEED;
85  _drive_right_speed = H_DRIVE_RIGHT_SPEED;
86 
87  _turn_left_for_ms = H_RACER_TURN_LEFT_FOR_MS;
88  _turn_right_for_ms = H_RACER_TURN_RIGHT_FOR_MS;
89 
90  coderracer_activ = false;
91  _coderracer_activ = true;
92  _drive = false;
93  _drive_set_at_ms = millis();
94  _servo_sweep = false;
95 
96  _last_led_switched_at_ms = millis();
97  _last_led_on = 0;
98  _led_count = 3;
99 
100  _servo_look_around_at_ms = millis() + random(FUN_MIN_PAUSE_MS, FUN_MAX_PAUSE_MS);
101 
102  _usonic_stop_distance_cm = H_US_STOP_DISTANCE_CM;
103  usonic_set_stop_distance_cm(_usonic_stop_distance_cm);
104  _coderacer_stopped_at_min_distance = false;
105 
106  // Ultrasonic sensor
107  pinMode(_us_trigger_pin, OUTPUT);
108  pinMode(_us_echo_pin, INPUT);
109 
110  // Servo drive
111  _servo->attach(_servo_pin);
112 
113  // Left drive
114  pinMode(_drive_left_frwd_pin, OUTPUT);
115  pinMode(_drive_left_back_pin, OUTPUT);
116  set_drive_left_state(DRIVESTOP);
117  ledcSetup(DRIVE_PWM_LEFT_CHANNEL, 5000, 8); // channel , 50 Hz, 8-bit width
118  ledcAttachPin(_drive_left_enable_pin, DRIVE_PWM_LEFT_CHANNEL); // connect left drive enable with PWM channel
119 
120  // Right drive
121  pinMode(_drive_right_frwd_pin, OUTPUT);
122  pinMode(_drive_right_back_pin, OUTPUT);
123  set_drive_right_state(DRIVESTOP);
124  ledcSetup(DRIVE_PWM_RIGHT_CHANNEL, 5000, 8); // channel , 50 Hz, 8-bit width
125  ledcAttachPin(_drive_right_enable_pin, DRIVE_PWM_RIGHT_CHANNEL); // connect right drive enable pin with PWM channel
126 
127  // LEDs
128  pinMode(_led_frwd_pin, OUTPUT);
129  pinMode(_led_stop_pin, OUTPUT);
130  pinMode(_led_left_pin, OUTPUT);
131  pinMode(_led_right_pin, OUTPUT);
132  // all LEDS off
133  set_leds_all_off();
134 
135  // Button & -interrupt
136  button_last_pressed_at_ms = 0;
137  pinMode(_button_pin, INPUT_PULLUP);
138  attachInterrupt(digitalPinToInterrupt(_button_pin), _set_button_state, FALLING);
139 
140  // Random
141  randomSeed(analogRead(0));
142 
143  //fun stuff
144  coderacer_fun_enabled = false;
145 
146 }
147 
148 //**************************************
149 //*** Coderacer hihger level methods ***
150 //**************************************
161 void CodeRacer::stop_driving() {
162  _servo_sweep = false;
163  _drive = false;
164  set_drives_stop_left_right();
165  set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDOFF, LEDOFF);
166 }
167 
173 void CodeRacer::drive_forward()
174 {
175  drive_forward(_drive_left_speed, _drive_right_speed);
176 }
177 
185 void CodeRacer::drive_forward(uint8_t left_speed, uint8_t right_speed)
186 {
187  set_drives_states_left_right(DRIVEFRWD, DRIVEFRWD);
188  set_drives_speed_left_right(left_speed, right_speed);
189  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDON, LEDOFF);
190  _drive = true;
191  _drive_set_at_ms = millis();
192 }
193 
199 void CodeRacer::drive_backward()
200 {
201  drive_backward(_drive_left_speed, _drive_right_speed);
202 }
203 
211 void CodeRacer::drive_backward(uint8_t left_speed, uint8_t right_speed)
212 {
213  set_drives_states_left_right(DRIVEBACK, DRIVEBACK);
214  set_drives_speed_left_right(left_speed, right_speed);
215  set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDON, LEDOFF);
216  _drive = true;
217  _drive_set_at_ms = millis();
218 }
219 
226 void CodeRacer::turn_left()
227 {
228  turn_left(_turn_left_for_ms, _drive_left_speed, _drive_right_speed);
229 }
230 
237 void CodeRacer::turn_left(unsigned long turn_for_ms)
238 {
239  turn_left(turn_for_ms, _drive_left_speed, _drive_right_speed);
240 }
241 
250 void CodeRacer::turn_left(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)
251 {
252  _drive = false;
253  set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF); // LEDs setzen
254  set_drives_states_left_right(DRIVEBACK, DRIVEFRWD);
255  set_drives_speed_left_right(left_speed, right_speed);
256  // wait set delay for the timed turn
257  _turn_left_for_ms = turn_for_ms;
258  delay(_turn_left_for_ms);
259  // stop drives again
260  set_drives_stop_left_right();
261 }
262 
269 void CodeRacer::turn_right()
270 {
271  turn_right(_turn_right_for_ms, _drive_left_speed, _drive_right_speed);
272 }
273 
280 void CodeRacer::turn_right(unsigned long turn_for_ms)
281 {
282  turn_right(turn_for_ms, _drive_left_speed, _drive_right_speed);
283 }
284 
293 void CodeRacer::turn_right(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)
294 {
295  _drive = false;
296  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDOFF, LEDON); // LEDs setzen
297  set_drives_states_left_right(DRIVEFRWD, DRIVEBACK);
298  set_drives_speed_left_right(left_speed, right_speed);
299  // wait set delay for the timed turn
300  _turn_right_for_ms = turn_for_ms;
301  delay(_turn_right_for_ms);
302  // stop drives again
303  set_drives_stop_left_right();
304 }
305 
314 void CodeRacer::start_stop_at_min_distance() {
315  start_stop_at_min_distance(_usonic_stop_distance_cm);
316 }
317 
324 void CodeRacer::start_stop_at_min_distance(unsigned long min_distance_cm) {
325  if (false == _coderacer_stop_at_distance_enabled) {
326  _coderacer_stopped_at_min_distance = false;
327  usonic_set_stop_distance_cm(min_distance_cm);
328  _coderacer_stop_at_distance_enabled = true;
329  }
330 }
331 
335 void CodeRacer::stop_stop_at_min_distance() {
336  _coderacer_stop_at_distance_enabled = false;
337 }
338 
348 bool CodeRacer::start_stop() {
349  if (_coderracer_activ != coderracer_activ) {
350  _coderracer_activ = coderracer_activ;
351  if (true == _coderracer_activ) {
352  set_leds_all_off();
353  delay(500);
354  }
355  else {
356  stop_driving();
357  set_leds_all_on();
358  delay(200);
359  servo_set_to_center();
360  _servo_look_around_at_ms = millis() + random(20000, 120000);
361  }
362  }
363 
364  if ((false == _coderracer_activ) && (true == coderacer_fun_enabled)) {
365  kitt();
366  look_around();
367  }
368 
369  return(_coderracer_activ);
370 }
371  // end of group higherlevelmeths
380 bool CodeRacer::stopped_at_min_distance() {
381  return(_coderacer_stopped_at_min_distance);
382 }
383 
387 bool CodeRacer::is_driving() {
388  return(_drive);
389 }
390 
394 unsigned long CodeRacer::turn_left_for_ms() {
395  return(_turn_left_for_ms);
396 }
397 
401 unsigned long CodeRacer::turn_right_for_ms() {
402  return(_turn_right_for_ms);
403 }
404 
408 void CodeRacer::set_inactive() {
409  coderracer_activ = false;
410 }
411 
415 void CodeRacer::set_active() {
416  coderracer_activ = true;
417 }
418 
424 bool CodeRacer::is_active() {
425  return(coderracer_activ);
426 }
427  // end of group higherlevelgetters // end of group higherlevel
430 
431 //**************************************
432 //*** Just for fun ***
433 //**************************************
440 void CodeRacer::look_around()
441 {
442  if (_servo_look_around_at_ms < millis()) {
443  _servo_look_around_at_ms = millis() + random(FUN_MIN_PAUSE_MS, FUN_MAX_PAUSE_MS);
444  servo_set_to_left();
445  delay(500);
446  servo_set_to_right();
447  delay(800);
448  servo_set_to_center();
449  delay(300);
450  servo_set_to_left();
451  delay(100);
452  servo_set_to_center();
453  }
454 }
455 
459 void CodeRacer::kitt()
460 {
461  if (millis() - _last_led_switched_at_ms > LED_SWITCH_MS) {
462  _last_led_switched_at_ms = millis();
463  if (_last_led_on >= 5) {
464  _led_count = -1;
465  }
466  else if (_last_led_on <= 0) {
467  _led_count = 1;
468  }
469  _last_led_on = _last_led_on + _led_count;
470  switch (_last_led_on) {
471  case 0:
472  set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF);
473  break;
474  case 1:
475  set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF);
476  break;
477  case 2:
478  set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDOFF, LEDOFF);
479  break;
480  case 3:
481  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDON, LEDOFF);
482  break;
483  case 4:
484  case 5:
485  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDOFF, LEDON);
486  break;
487  }
488  }
489 }
490  // end of group lowerlevelfun
492 
493 //**************************************
494 //*** Servo drive lower level control ***
495 //**************************************
510 void CodeRacer::servo_settings(uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos)
511 {
512  servo_center_pos = pos_center;
513  servo_left_pos = pos_left;
514  servo_right_pos = pos_right;
515  servo_sweep_left_pos = sweep_left_pos;
516  servo_sweep_right_pos = sweep_right_pos;
517 }
518 
526 void CodeRacer::servo_sweep()
527 {
528  uint8_t position;
529  _servo_sweep = true;
530  if (millis() - _servo_position_set_at_ms > SERVO_SWEEP_MS) {
531  position = _servo_position + _servo_sweep_step;
532  //sprintf(_debugmsg,"[%s] current position=%ld newpostion=%ld", __func__, _servo_position, position);
533  if ((position >= servo_sweep_left_pos) || (position >= SERVO_MAX_POSITION)) {
534  position = servo_sweep_left_pos;
535  _servo_sweep_step = SERVO_SWEEP_TO_RIGHT_STEP;
536  }
537  if ((position <= servo_sweep_right_pos) || (position <= SERVO_MIN_POSITION)) {
538  position = servo_sweep_right_pos;
539  _servo_sweep_step = SERVO_SWEEP_TO_LEFT_STEP;
540  }
541  _servo_set_position(position);
542  }
543 }
544 
548 void CodeRacer::servo_set_to_right()
549 {
550  servo_set_position_wait(servo_right_pos);
551 }
552 
556 void CodeRacer::servo_set_to_left()
557 {
558  servo_set_position_wait(servo_left_pos);
559 }
560 
564 void CodeRacer::servo_set_to_center()
565 {
566  servo_set_position_wait(servo_center_pos);
567 }
568 
575 uint8_t CodeRacer::servo_set_position_wait(uint8_t position)
576 {
577  _servo_sweep = false;
578  unsigned long wait_time_ms = _servo_set_position(position);
579  delay(wait_time_ms);
580  return(_servo_position);
581 }
582 
589 unsigned long CodeRacer::servo_set_position(uint8_t position)
590 {
591  _servo_sweep = false;
592  unsigned long wait_time_ms = _servo_set_position(position);
593  return(wait_time_ms);
594 }
595 
596 unsigned long CodeRacer::_servo_set_position(uint8_t position)
597 {
598  uint8_t _position = position;
599  uint8_t absdiff;
600 
601  if (position < SERVO_MIN_POSITION) {
602  _position = SERVO_MIN_POSITION;
603  }
604  else if (position > SERVO_MAX_POSITION) {
605  _position = SERVO_MAX_POSITION;
606  }
607  _servo->write(_position);
608  // wait minimal delay to avoid code collaps
609  delay(SERVO_SET_1TICK_POSITION_DELAY_MS);
610  absdiff = abs(_servo_position - _position);
611  if (absdiff > 1) {
612  _servo_position_eta_in_ms = absdiff * SERVO_SET_1TICK_POSITION_DELAY_MS;
613  }
614  else {
615  _servo_position_eta_in_ms = 0;
616  }
617 
618  _servo_position_set_at_ms = millis();
619  _servo_position = _position;
620 
621  return(_servo_position_eta_in_ms);
622 }
623  // end of group lowerlevelservomeths
632 uint8_t CodeRacer::servo_position() {
633  return(_servo_position);
634 }
635 
639 unsigned long CodeRacer::servo_position_set_at_ms() {
640  return(_servo_position_set_at_ms);
641 }
642 
649 unsigned long CodeRacer::servo_position_eta_in_ms() {
650  return(_servo_position_eta_in_ms);
651 }
652  // end of group lowerlevelservogetters // end of group lowerlevelservo
655 
656 
657 //**************************************
658 //*** Ultrasonic lower level control ***
659 //**************************************
672 unsigned long CodeRacer::usonic_measure_cm()
673 {
674  return(usonic_measure_cm(US_MAX_ECHO_TIME_US));
675 }
676 
682 unsigned long CodeRacer::usonic_measure_us()
683  {
684  return(usonic_measure_us(US_MAX_ECHO_TIME_US));
685  }
686 
694 unsigned long CodeRacer::usonic_measure_cm(unsigned long max_echo_run_time_us)
695 {
696  unsigned long echo_runtime_us = usonic_measure_us(max_echo_run_time_us);
697  unsigned long distance_cm = echo_runtime_us * 0.0172;
698  //Serial.print("MEASURE_DISTANCE. Distance in cm is: ");
699  //Serial.println(distance_cm);
700  _usonic_distance_cm = distance_cm;
701  return(distance_cm);
702 }
703 
711 unsigned long CodeRacer::usonic_measure_us(unsigned long max_echo_run_time_us)
712 {
713  unsigned long echo_runtime_us[3] = { 0,0,0 };
714  uint8_t measnr = 0;
715 
716  do {
717  echo_runtime_us[measnr] = usonic_measure_single_shot_us(max_echo_run_time_us);
718  if (echo_runtime_us[measnr] > 200) {
719  measnr++;
720  }
721  } while (measnr < 3);
722 
723  // we will take the medium out of 3 values ...
724  if (echo_runtime_us[0] > echo_runtime_us[1]) { std::swap(echo_runtime_us[0], echo_runtime_us[1]); }
725  if (echo_runtime_us[1] > echo_runtime_us[2]) { std::swap(echo_runtime_us[1], echo_runtime_us[2]); }
726  if (echo_runtime_us[0] > echo_runtime_us[1]) { std::swap(echo_runtime_us[0], echo_runtime_us[1]); }
727 
728  //Serial.print("MEASURE_DISTANCE_US. Echo runtime in us is: ");
729  //Serial.println(echo_runtime_us[1]);
730 
731  // if the stop at minimal distance is enabeled - check for minimal distance is reached
732  if (true == _coderacer_stop_at_distance_enabled) {
733  if (echo_runtime_us[1] <= _usonic_stop_distance_us) {
734  _coderacer_stopped_at_min_distance = true;
735  stop_driving();
736  _coderacer_stop_at_distance_enabled = false;
737  }
738  }
739  _usonic_distance_us = echo_runtime_us[1];
740  return(echo_runtime_us[1]);
741 }
742 
748 unsigned long CodeRacer::usonic_measure_single_shot_cm()
749 {
750  return(usonic_measure_single_shot_cm(US_MAX_ECHO_TIME_US));
751 }
752 
758 unsigned long CodeRacer::usonic_measure_single_shot_us()
759 {
760  return(usonic_measure_single_shot_us(US_MAX_ECHO_TIME_US));
761 }
762 
770 unsigned long CodeRacer::usonic_measure_single_shot_cm(unsigned long max_echo_run_time_us)
771 {
772  // convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
773  // the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
774  // distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
775  // distance_cm = (echo_duration/2) / 29.1;
776  unsigned long echo_runtime_us = usonic_measure_single_shot_us(max_echo_run_time_us);
777  unsigned long distance_cm = echo_runtime_us * 0.0172;
778  //Serial.print("MEASURE_DISTANCE. Distance in cm is: ");
779  //Serial.println(distance_cm);
780  _usonic_distance_cm = distance_cm;
781  return(distance_cm);
782 }
783 
791 unsigned long CodeRacer::usonic_measure_single_shot_us(unsigned long max_echo_run_time_us)
792  {
793  unsigned long echo_runtime_us;
794  // start measurement - send a short pulse "HIGH" to the TRIG pin of the ultrasonic sensor
795  pinMode(_us_echo_pin, OUTPUT);
796  pinMode(_us_echo_pin, INPUT);
797  digitalWrite(_us_trigger_pin, LOW);
798  delayMicroseconds(2);
799  digitalWrite(_us_trigger_pin, HIGH);
800  delayMicroseconds(10);
801  digitalWrite(_us_trigger_pin, LOW);
802  // measure runtime in microseconds until the ECHO pin aof the sensor goes HIGH
803  echo_runtime_us = pulseInLong(_us_echo_pin, HIGH, max_echo_run_time_us);
804  if (echo_runtime_us == 0) {
805  echo_runtime_us = max_echo_run_time_us; // US_MAX_ECHO_TIME_US;
806  }
807  //Serial.print("MEASURE_DISTANCE_US. Echo runtime in us is: ");
808  //Serial.println(echo_runtime_us);
809  _usonic_distance_us = echo_runtime_us;
810  return(echo_runtime_us);
811  }
812  // end of group lowerlevelusmethods
825 void CodeRacer::usonic_set_stop_distance_cm(unsigned long stop_distance_cm)
826 {
827  _usonic_stop_distance_us = stop_distance_cm * 58.14;
828 }
829 
837 void CodeRacer::usonic_set_stop_distance_us(unsigned long stop_distance_us)
838 {
839  _usonic_stop_distance_us = stop_distance_us;
840 }
841 
845 unsigned long CodeRacer::usonic_distance_us() {
846  return(_usonic_distance_us);
847 }
848 
852 unsigned long CodeRacer::usonic_distance_cm() {
853  return(_usonic_distance_cm);
854 }
855  // end of group lowerlevelusgetters // end of group lowerlevelus
858 
859 
860 //**************************************
861 //*** Drives lower level control ***
862 //**************************************
863 
878 void CodeRacer::drives_settings(uint8_t drive_left_speed, uint8_t drive_right_speed, unsigned long turn_left_for_ms, unsigned long turn_right_for_ms)
879 {
880  _drive_left_speed = drive_left_speed;
881  _drive_right_speed = drive_right_speed;
882  _turn_left_for_ms = turn_left_for_ms;
883  _turn_right_for_ms = turn_right_for_ms;
884 }
885 
889 void CodeRacer::set_drives_stop_left_right() {
890  set_drive_left_state(DRIVESTOP);
891  set_drive_right_state(DRIVESTOP);
892 }
893 
899 void CodeRacer::set_drives_states_left_right(drivestate stateleft, drivestate stateright) {
900  set_drive_left_state(stateleft);
901  set_drive_right_state(stateright);
902 }
903 
908 void CodeRacer::set_drive_left_state(drivestate state) {
909  set_drive_state(state, _drive_left_frwd_pin, _drive_left_back_pin);
910 }
911 
916 void CodeRacer::set_drive_right_state(drivestate state) {
917  set_drive_state(state, _drive_right_frwd_pin, _drive_right_back_pin);
918 }
919 
926 void CodeRacer::set_drive_state(drivestate state, uint8_t frwdpin, uint8_t backpin) {
927  switch (state) {
928  case DRIVESTOP:
929  digitalWrite(frwdpin, LOW);
930  digitalWrite(backpin, LOW);
931  break;
932  case DRIVEFRWD:
933  digitalWrite(frwdpin, HIGH);
934  digitalWrite(backpin, LOW);
935  break;
936  case DRIVEBACK:
937  digitalWrite(frwdpin, LOW);
938  digitalWrite(backpin, HIGH);
939  break;
940  }
941 }
942 
950 void CodeRacer::set_drives_speed_left_right(uint8_t speedleft, uint8_t speedright) {
951  set_drive_left_speed(speedleft);
952  set_drive_right_speed(speedright);
953 }
954 
961 void CodeRacer::set_drive_left_speed(uint8_t speed) {
962  set_drive_speed(speed, _drive_left_enable_pin);
963 }
964 
971 void CodeRacer::set_drive_right_speed(uint8_t speed) {
972  set_drive_speed(speed, _drive_right_enable_pin);
973 }
974 
982 void CodeRacer::set_drive_speed(uint8_t speed, uint8_t enablepin) {
983  _analog_write(enablepin, (int)speed);
984 }
985  // end of group lowerleveldrivesmethods
994 uint8_t CodeRacer::drive_right_speed() {
995  return _drive_right_speed;
996 }
997 
1001 uint8_t CodeRacer::drive_left_speed() {
1002  return(_drive_left_speed);
1003 }
1004 
1005 void CodeRacer::_analog_write(uint8_t pin, uint8_t speed) {
1006  if (pin == _drive_left_enable_pin) {
1007  _drive_left_speed = speed;
1008  ledcWrite(DRIVE_PWM_LEFT_CHANNEL, speed);
1009  }
1010  if (pin == _drive_right_enable_pin) {
1011  _drive_right_speed = speed;
1012  ledcWrite(DRIVE_PWM_RIGHT_CHANNEL, speed);
1013  }
1014 }
1015  // end of group lowerleveldrivesgetters // end of group lowerleveldrives
1018 
1019 
1020 //**************************************
1021 //*** LED lower level control ***
1022 //**************************************
1037 void CodeRacer::set_leds_left_stop_frwd_right(ledstate leftled, ledstate stopled, ledstate frwdled, ledstate rightled) {
1038  digitalWrite(_led_left_pin, leftled);
1039  digitalWrite(_led_frwd_pin, frwdled);
1040  digitalWrite(_led_right_pin, rightled);
1041  digitalWrite(_led_stop_pin, stopled);
1042 }
1043 
1048 void CodeRacer::set_leds_all(ledstate alleds) {
1049  digitalWrite(_led_left_pin, alleds);
1050  digitalWrite(_led_frwd_pin, alleds);
1051  digitalWrite(_led_right_pin, alleds);
1052  digitalWrite(_led_stop_pin, alleds);
1053 }
1054 
1058 void CodeRacer::set_leds_all_off() {
1059  set_leds_all(LEDOFF);
1060 }
1061 
1065 void CodeRacer::set_leds_all_on() {
1066  set_leds_all(LEDON);
1067 }
1068  // end of group lowerlevelledmets // end of group lowerlevelled
1071 
1072 
1073 //**************************************
1074 //*** ISRs ***
1075 //**************************************
1076 //IRAM_ATTR is used to load the code into DRAM and not to Flash to make it faster - required for ISRs
1077 void IRAM_ATTR CodeRacer::_set_button_state() {
1078  if ((millis() - button_last_pressed_at_ms) > BUTTON_BOUNCING_TIME_MS) {
1079  button_last_pressed_at_ms = millis(); // simplest debouncing - just wait ;-)
1080  coderracer_activ = !coderracer_activ;
1081  }
1082 }
1083 
1084 
1085 //**********************************************************************************************************************
1086 //** Methods below this are obsolete and only in here for compatiblity to other projects - do not use them anymore !!!
1087 //**********************************************************************************************************************
1088 void CodeRacer::motor_einstellungen(uint8_t drive_left_speed, uint8_t drive_right_speed, unsigned long turn_left_for_ms, unsigned long turn_right_for_ms)
1089 {
1090  drives_settings(drive_left_speed, drive_right_speed, turn_left_for_ms, turn_right_for_ms);
1091 }
1092 
1093 void CodeRacer::servo_einstellungen(uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos)
1094 {
1095  servo_settings(pos_center, pos_left, pos_right, sweep_left_pos, sweep_right_pos);
1096 }
1097 
1098 void CodeRacer::servo_rechts()
1099 {
1100  Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben
1101  servo_set_to_right(); // Servo auf den Winkel rechts drehen
1102 }
1103 
1104 void CodeRacer::servo_links()
1105 {
1106  Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben
1107  servo_set_to_left(); // Servo auf den Winkel links drehen
1108 }
1109 
1110 void CodeRacer::servo_mitte()
1111 {
1112  Serial.println("SERVO_MITTE");
1113  servo_set_to_center();
1114 }
1115 
1116 void CodeRacer::servo_schwenk()
1117 {
1118  servo_sweep();
1119 }
1120 
1121 void CodeRacer::links()
1122 {
1123  Serial.println("CODERACER_LINKS");
1124  turn_left();
1125 }
1126 
1127 void CodeRacer::rechts()
1128 {
1129  Serial.println("CODERACER_RECHTS");
1130  turn_right();
1131 }
1132 
1133 void CodeRacer::anhalten()
1134 {
1135  Serial.println("CODERACER_ANHALTEN");
1136  stop_driving();
1137 }
1138 
1139 void CodeRacer::vorwaerts()
1140 {
1141  Serial.println("CODERACER_VORWAERTS");
1142  drive_forward();
1143 }
1144 
1145 void CodeRacer::rueckwaerts()
1146 {
1147  Serial.println("CODERACER_RUECKWAERTS");
1148  drive_backward();
1149 }
1150 
1151 unsigned long CodeRacer::abstand_messen()
1152 {
1153  return(0);
1154 
1155  unsigned long distance_cm = 0;
1156  unsigned long min_distance_cm = 1000;
1157  int8_t servo_turn_direction = 0;
1158 
1159 
1160  // while driving or sweeping there will be only one value be measured - else there will be mutiple measurements and the servor will be turning
1161  if (((true == _drive) || (servo_center_pos == _servo_position) || _servo_sweep == true)) {
1162  // while driving ...
1163  //Serial.println("ABSTAND_MESSEN im fahren, direkt nach vorn oder Schwenk() ist aktiv ...");
1164  min_distance_cm = usonic_measure_cm();
1165  } else {
1166  // no sweep, not driving ...
1167  //Serial.println("ABSTAND_MESSEN im Stand nach links oder rechts...");
1168  // are we already ath left or right with the servo ?
1169  if (servo_left_pos == _servo_position) {
1170  //Serial.println("ABSTAND_MESSEN. Linke Seite.");
1171  //left ...
1172  servo_turn_direction = SERVO_SWEEP_TO_RIGHT_STEP;
1173  }
1174  if (servo_right_pos == _servo_position) {
1175  //right ...
1176  //Serial.println("ABSTAND_MESSEN rechte Seite.");
1177  servo_turn_direction = SERVO_SWEEP_TO_LEFT_STEP;
1178  }
1179  // trun the servo and do measuring ... remember the smallest value
1180  do {
1181  _servo_set_position(_servo_position + servo_turn_direction);
1182  //Serial.print("ABSTAND_MESSEN. Servo position:");
1183  //Serial.println(_servo_position);
1184  distance_cm = usonic_measure_cm();
1185  if (distance_cm < min_distance_cm) {
1186  min_distance_cm = distance_cm;
1187  }
1188  } while ((_servo_position > H_SERVO_CENTER_LEFT) || (_servo_position < H_SERVO_CENTER_RIGHT));
1189  }
1190 
1191  Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist (mindestens):");
1192  Serial.println(min_distance_cm);
1193  //_min_distance_cm = min_distance_cm;
1194 
1195  return(min_distance_cm);
1196 
1197 }
1198 
1199 //**********************************************************************************************************************
1200 //** Helper methods
1201 //**********************************************************************************************************************
1202 
void drive_forward()
Sets the speed and the directions of both drives so that it will move forward.
Definition: CodeRacer.cpp:173
-
-
- - - - diff --git a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.html b/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.html deleted file mode 100644 index 5637769..0000000 --- a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - -Arduino {code}racer API: Getters - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - -

-Functions

uint8_t CodeRacer::servo_position ()
 Get the actual position of the servo. More...
 
unsigned long CodeRacer::servo_position_set_at_ms ()
 Get the system time in ms the servo was set to the actual position. More...
 
unsigned long CodeRacer::servo_position_eta_in_ms ()
 Get the system time in ms the servo will reach its position This is an estimated time. If this is a time in the future, the servo may still moving. If this is a time in the past , the servo should have reached its postion already. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ servo_position()

- -
-
- - - - - - - -
uint8_t CodeRacer::servo_position ()
-
- -

Get the actual position of the servo.

-
Returns
Actual position of the servo
- -

Definition at line 632 of file CodeRacer.cpp.

-
632  {
633  return(_servo_position);
634 }
-
-
- -

◆ servo_position_set_at_ms()

- -
-
- - - - - - - -
unsigned long CodeRacer::servo_position_set_at_ms ()
-
- -

Get the system time in ms the servo was set to the actual position.

-
Returns
System time in ms the servo was set
- -

Definition at line 639 of file CodeRacer.cpp.

-
639  {
640  return(_servo_position_set_at_ms);
641 }
-
-
- -

◆ servo_position_eta_in_ms()

- -
-
- - - - - - - -
unsigned long CodeRacer::servo_position_eta_in_ms ()
-
- -

Get the system time in ms the servo will reach its position This is an estimated time. If this is a time in the future, the servo may still moving. If this is a time in the past , the servo should have reached its postion already.

-
Returns
System time in ms the servo will reach its position
- -

Definition at line 649 of file CodeRacer.cpp.

-
649  {
650  return(_servo_position_eta_in_ms);
651 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.js b/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.js deleted file mode 100644 index dbcaa68..0000000 --- a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.js +++ /dev/null @@ -1,6 +0,0 @@ -var group__lowerlevelservogetters = -[ - [ "servo_position", "d4/df4/group__lowerlevelservogetters.html#ga451b3ecd272e9a11de4b221f8d771432", null ], - [ "servo_position_set_at_ms", "d4/df4/group__lowerlevelservogetters.html#gaeed05a3d4e06adccebdfce207b734b2f", null ], - [ "servo_position_eta_in_ms", "d4/df4/group__lowerlevelservogetters.html#ga84ba256b9ccdf0e9f4280279da68a509", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.map b/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.map deleted file mode 100644 index 354ca7c..0000000 --- a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.md5 b/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.md5 deleted file mode 100644 index 34e1188..0000000 --- a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.md5 +++ /dev/null @@ -1 +0,0 @@ -68f8f6d7188bd071914c1b796efb68b6 \ No newline at end of file diff --git a/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.png b/Doku/Doxygen/html/d4/df4/group__lowerlevelservogetters.png deleted file mode 100644 index c79e2c768345212c257d2dc56d38b5e39f1b13e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 zcmV;B1#kL^P)pU0-@F%CI0~=$Dgt!erMW|xx4Zy-uaRuEOyO$Lt zm?%_8ES(roE2IiWZURBY1QVdr_6)D`Dm95eA}5i+G@*N~IEYIvuK1Dy~C;l>O+5 z30nNdy3l zAc+8gk;I8r6+sY?kB{Kkip$sI<>AGg$K%P`!@~nTJw3S&!@2eKby{6rU09b&5`la} z0ukHX+;km+7n;o`ot>R6tV0q3kaT!>NIN?_uETJq-EPy@*Vm8rnaqgxJLNdQXHMZ>x^KMdfApr&`WNJ+jA= z)KFDoV(S&{OZS)noL!xXHWs$=sJux{-^{x8s_b8N+q7efE1$H^=DC1k%Eg>WT3u+J zVTmfXC&4zvybcHQ8aLRNizJfPC!*?pbnE4H{qy?ip4YfttJmub%fsQ&Q6%;_z1b}M z)MmT!qPdDRu)T$}>Q#x4x2;S}He~rb5P5ldq0wlRNnJM7>vb9qhYMe9QW2HsE&C$1 zBodvykIv$UZ_4mXr#E0yUUxsb_43MPc`n#(O{DcZkn#5RMyIEzw7tDeD=RCswY6of zE}Oyx!ct8nd63F*My5f^z9u^fs8g>>9BJ08yHAyvOzJZE9i-vo*Wj_^Cr?(VMDxU!Hm1c_T#AzPN6i$M|rC=indtx^`l znTWKm5V*c8({=q>J3l|CwY9ax;Y<=A{@$YK_;gri|YBUUD;tXrt9Ps>J>IVJn0(S>>Z<#@*=+LvtoqVpzGKYOm?&Yf)Rs^=sv%gf7jaBx6(cX#ys{7jFJkJjr1 zGuDSQDtC>V>{q9}=-CzBx@BThX_Q$t;IJ;8*KDX(t5mI4Gp!TUc{L}JRYQp*dW4_l zGFH?2b(5Db6SUwLuab!CH>vDZjkqfySu;6Ty3gPEbfpLU;qCvO$+}_c)|W+`GV>=k z_U*d21^M7jPejypmi-ju?T0tFpwe|`Co^r#ZSd+)Jy+3X-QyH(3%{4uB%=Drd0LOI z>rM{pcJq^dR*g+19^G@LQdSfL0Fg&M5m ze}9jEqe=h$8%-9Hh{upP{IRjI;W`9wd3$vR0P+Dz1OSX6i2#5RBoP2Gk~pziguiPE z0QLoQ<`TeoJf>EwMbqijRZLJorBaDHoeoth71yCa%6=pf000%369E7tNFo4W1W5z{ ej39{sfRTS+ee;aF1&xmY0000 - - - - - - -Arduino {code}racer API: Lower level drives methods and getters - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
- -
-
Lower level drives methods and getters
-
-
- - - - - - -

-Modules

 Methods
 
 Getters
 
-

Detailed Description

-
-
- - - - diff --git a/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.js b/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.js deleted file mode 100644 index 4b19b35..0000000 --- a/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.js +++ /dev/null @@ -1,5 +0,0 @@ -var group__lowerleveldrives = -[ - [ "Methods", "d1/d8a/group__lowerleveldrivesmeths.html", "d1/d8a/group__lowerleveldrivesmeths" ], - [ "Getters", "d0/d0a/group__lowerleveldrivesgetters.html", "d0/d0a/group__lowerleveldrivesgetters" ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.map b/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.map deleted file mode 100644 index 50ccb6e..0000000 --- a/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.md5 b/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.md5 deleted file mode 100644 index 5dd3d62..0000000 --- a/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.md5 +++ /dev/null @@ -1 +0,0 @@ -929320c5d691931416a1f3fbdc41f4b0 \ No newline at end of file diff --git a/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.png b/Doku/Doxygen/html/d6/d98/group__lowerleveldrives.png deleted file mode 100644 index 31b7357ce1b4b62fc689c64ef478155223c0dc65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2862 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 - - - - - - -Arduino {code}racer API: C:/Users/jnoack/Documents/Arduino/libraries/CodeRacer/CodeRacer.h Source File - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
-
CodeRacer.h
-
-
-
1 #include "Arduino.h"
2 #include <algorithm> // std::swap
3 #include <ESP32Servo.h> // Servo drive support for ESP32
4 #include "esp32-hal-ledc.h" // Part of ESP32 board files - Analog output
5 
6 #ifndef __CodeRacer_H__
7 #define __CodeRacer_H__
8 
9 //----- Fun stuff ---------
10 #define FUN_MIN_PAUSE_MS 120000 // minimum and maximum pause between to rounds fun
11 #define FUN_MAX_PAUSE_MS 300000
12 #define LED_SWITCH_MS 50 // speed of knight rider lights
13 //----- Button ------------
14 #define H_BUTTON_PIN 17
15 #define BUTTON_BOUNCING_TIME_MS 200 // bouncing delay
16 //----- Servo -----
17 #define H_SERVO_PIN 16
18 #define H_SERVO_LEFT_POS 145 // left position of the servo
19 #define H_SERVO_CENTER_LEFT 100 // left-center position of the servo
20 #define H_SERVO_RIGHT_POS 35 // right position of the servo
21 #define H_SERVO_CENTER_RIGHT 80 // right-center position of the servo
22 #define H_SERVO_CENTER_POS 90 // center position of the servo
23 #define H_SERVO_SWEEP_LEFT_POS 140 // most left sweep position of the servo
24 #define H_SERVO_SWEEP_RIGHT_POS 40 // most right sweep position of the servo
25 #define SERVO_SWEEP_TO_LEFT_STEP 5 // sweep step to the left
26 #define SERVO_SWEEP_TO_RIGHT_STEP -5 // sweep step to the right
27 #define SERVO_SWEEP_MS 10 // duration of time betwee to sweep steps
28 #define SERVO_MAX_POSITION 170 // maximum servo position
29 #define SERVO_MIN_POSITION 10 // minimum servo position
30 #define SERVO_SET_1TICK_POSITION_DELAY_MS 3 // minimum duration of time between two servo steps
31 
32 //----- Ultrasonic sensor -----
33 #define H_US_TRIG_PIN 12
34 #define H_US_ECHO_PIN 14
35 #define H_US_STOP_DISTANCE_CM 25 // if the measured distance is smaller the racer maybe stopped
36 #define US_MAX_ECHO_TIME_US 6000 // timeout for ultrasonic sensor measurements - this is about 100cm
37 
38 //----- Drives -----
39 #define H_DRIVE_RIGHT_SPEED 255 // default speed of right side drive. 0 ...255
40 #define H_DRIVE_LEFT_SPEED 255 // default speed of left side drive. 0 ...255
41 #define H_DRIVE_RIGHT_ENABLE_PIN 2
42 #define H_DRIVE_RIGHT_FWRD_PIN 4
43 #define H_DRIVE_RIGHT_BACK_PIN 15
44 #define H_DRIVE_LEFT_ENABLE_PIN 21
45 #define H_DRIVE_LEFT_FWRD_PIN 22
46 #define H_DRIVE_LEFT_BACK_PIN 23
47 #define H_RACER_TURN_LEFT_FOR_MS 400 // duration of time the racer will turn to left
48 #define H_RACER_TURN_RIGHT_FOR_MS 400 // duration of time the racer will turn to right
49 
50 #define DRIVE_PWM_LEFT_CHANNEL 5 // PWM-channel for left side drive
51 #define DRIVE_PWM_RIGHT_CHANNEL 6 // PWM-channel for right side drive
52 
53 //----- LEDs -----
54 #define H_LED_FRWD_PIN 26
55 #define H_LED_STOP_PIN 25
56 #define H_LED_LEFT_PIN 33
57 #define H_LED_RIGHT_PIN 27
58 
59 static volatile bool coderracer_activ = false;;
60 static volatile unsigned long button_last_pressed_at_ms = millis();
61 
62 enum ledstate {
63  LEDOFF,
64  LEDON
65 };
66 
67 enum drivestate {
68  DRIVESTOP,
69  DRIVEFRWD,
70  DRIVEBACK
71 };
72 
73 //--- this is as preparation of the class creation
74 class CodeRacer {
75 
76  private:
77 
78  //pins
79  uint8_t _button_pin;
80  uint8_t _servo_pin;
81  uint8_t _us_trigger_pin;
82  uint8_t _us_echo_pin;
83  uint8_t _drive_left_frwd_pin;
84  uint8_t _drive_left_back_pin;
85  uint8_t _drive_left_enable_pin;
86  uint8_t _drive_right_frwd_pin;
87  uint8_t _drive_right_back_pin;
88  uint8_t _drive_right_enable_pin;
89  uint8_t _led_frwd_pin;
90  uint8_t _led_stop_pin;
91  uint8_t _led_left_pin;
92  uint8_t _led_right_pin;
93 
94  //servo variables
95  int8_t _servo_sweep_step;
96  uint8_t _servo_position;
97  unsigned long _servo_position_set_at_ms;
98  unsigned long _servo_position_eta_in_ms;
99 
100  //drives variables
101  uint8_t _drive_left_speed;
102  uint8_t _drive_right_speed;
103  unsigned long _turn_left_for_ms;
104  unsigned long _turn_right_for_ms;
105 
106  // ultrasonic variables
107  bool _coderacer_stopped_at_min_distance;
108  bool _coderacer_stop_at_distance_enabled;
109  unsigned long _usonic_stop_distance_cm;
110  unsigned long _usonic_stop_distance_us;
111  unsigned long _usonic_distance_us;
112  unsigned long _usonic_distance_cm;
113 
114  //fun stuff variables
115  unsigned long _last_led_switched_at_ms;
116  uint8_t _led_count;
117  uint8_t _last_led_on;
118  unsigned long _servo_look_around_at_ms;
119 
120 
121  unsigned long _min_distance_cm;
122  bool _drive;
123  unsigned long _drive_set_at_ms;
124  bool _servo_sweep;
125  bool _coderracer_activ;
126 
127  //objects
128  Servo* _servo;
129  Servo* _servo_dummy;
130 
131  static void _set_button_state();
132  void _analog_write(uint8_t pin, uint8_t speed);
133  unsigned long _servo_set_position(uint8_t position);
134 
135  public:
136  //properties
137  bool coderacer_fun_enabled;
138 
139  uint8_t servo_center_pos;
140  uint8_t servo_left_pos;
141  uint8_t servo_right_pos;
142  uint8_t servo_sweep_left_pos;
143  uint8_t servo_sweep_right_pos;
145  //methods
146  CodeRacer();
147 
148  CodeRacer(uint8_t button_pin, uint8_t servo_pin,
149  uint8_t us_trigger_pin, uint8_t us_echo_pin,
150  uint8_t drive_left_frwd_pin, uint8_t drive_left_back_pin, uint8_t drive_left_enable_pin,
151  uint8_t drive_right_frwd_pin, uint8_t drive_right_back_pin, uint8_t drive_right_enable_pin,
152  uint8_t led_frwd_pin, uint8_t led_stop_pin, uint8_t led_left_pin, uint8_t led_right_pin);
153 
154  void set_inactive();
155  void set_active();
156 
157  void begin();
158 
159  // getters
160  bool is_active();
161  bool is_driving();
162  bool stopped_at_min_distance();
163  unsigned long usonic_distance_cm();
164  unsigned long usonic_distance_us();
165  uint8_t servo_position();
166  unsigned long servo_position_set_at_ms();
167  unsigned long servo_position_eta_in_ms();
168  uint8_t drive_left_speed();
169  uint8_t drive_right_speed();
170  unsigned long turn_left_for_ms();
171  unsigned long turn_right_for_ms();
172 
173  // higher level {code}racer services
174  void stop_driving();
175  void drive_forward();
176  void drive_forward(uint8_t left_speed, uint8_t right_speed);
177  void drive_backward();
178  void drive_backward(uint8_t left_speed, uint8_t right_speed);
179  void turn_left();
180  void turn_left(unsigned long turn_for_ms);
181  void turn_left(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed);
182  void turn_right();
183  void turn_right(unsigned long turn_for_ms);
184  void turn_right(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed);
185 
186  void start_stop_at_min_distance();
187  void start_stop_at_min_distance(unsigned long min_distance_cm);
188  void stop_stop_at_min_distance();
189 
190 
191  // LEDs
192  void set_leds_left_stop_frwd_right(ledstate leftled, ledstate stopled, ledstate frwdled, ledstate rightled);
193  void set_leds_all(ledstate alleds);
194  void set_leds_all_off();
195  void set_leds_all_on();
196 
197  // Drives
198  void drives_settings(uint8_t drive_left_speed, uint8_t drive_right_speed, unsigned long turn_left_ms, unsigned long turn_right_ms);
199  void set_drives_states_left_right(drivestate stateleft, drivestate stateright);
200  void set_drive_left_state(drivestate state);
201  void set_drive_right_state(drivestate state);
202  void set_drive_state(drivestate state, uint8_t frwdpin, uint8_t backpin);
203  void set_drives_speed_left_right(uint8_t speedleft, uint8_t speedright);
204  void set_drive_left_speed(uint8_t speed);
205  void set_drive_right_speed(uint8_t speed);
206  void set_drive_speed(uint8_t speed, uint8_t enablepin);
207  void set_drives_stop_left_right();
208 
209  // Ultrasonic sensor
210  unsigned long usonic_measure_cm();
211  unsigned long usonic_measure_us();
212  unsigned long usonic_measure_cm(unsigned long max_echo_run_time_us);
213  unsigned long usonic_measure_us(unsigned long max_echo_run_time_us);
214  unsigned long usonic_measure_single_shot_cm();
215  unsigned long usonic_measure_single_shot_us();
216  unsigned long usonic_measure_single_shot_cm(unsigned long max_echo_run_time_us);
217  unsigned long usonic_measure_single_shot_us(unsigned long max_echo_run_time_us);
218  void usonic_set_stop_distance_cm(unsigned long stop_distance_cm);
219  void usonic_set_stop_distance_us(unsigned long stop_distance_us);
220 
221  // Servo drive
222  void servo_settings(uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos);
223  uint8_t servo_set_position_wait(uint8_t position);
224  unsigned long servo_set_position(uint8_t position);
225  void servo_set_to_right();
226  void servo_set_to_left();
227  void servo_set_to_center();
228  void servo_sweep();
229 
230  // just for fun
231  void kitt();
232  void look_around();
233 
234  // previous OBSOLETE german language definitions of the methods - still needed to support MakerLab Murnau {code}racer project
235  // - but use the english ones for new implementations
236  void servo_einstellungen(uint8_t winkel_mitte, uint8_t winkel_links, uint8_t winkel_rechts, uint8_t schwenk_links, uint8_t schwenk_rechts);
237  void motor_einstellungen(uint8_t motor_links_tempo, uint8_t motor_rechts_tempo, unsigned long drehung_links_ms, unsigned long drehung_rechts_ms);
238  void anhalten();
239  void vorwaerts();
240  void rueckwaerts();
241  void links();
242  void rechts();
243  void servo_rechts();
244  void servo_links();
245  void servo_mitte();
246  unsigned long abstand_messen();
247  void servo_schwenk();
248  bool start_stop();
249 };
250 
251 
252 
253 #endif
-
- - - - diff --git a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.html b/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.html deleted file mode 100644 index 283d8a5..0000000 --- a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - -Arduino {code}racer API: Methods - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

-Functions

unsigned long CodeRacer::usonic_measure_cm ()
 Measures the distance to the next object in front of the ultra sonic sensor in cm. More...
 
unsigned long CodeRacer::usonic_measure_us ()
 Measures the distance to the next object in front of the ultra sonic sensor in microseconds. More...
 
unsigned long CodeRacer::usonic_measure_cm (unsigned long max_echo_run_time_us)
 Measures the distance to the next object in front of the ultra sonic sensor in cm. More...
 
unsigned long CodeRacer::usonic_measure_us (unsigned long max_echo_run_time_us)
 Measures the distance to the next object in front of the ultra sonic sensor in microseconds. More...
 
unsigned long CodeRacer::usonic_measure_single_shot_cm ()
 Measures the distance to the next object in front of the ultra sonic sensor in cm. More...
 
unsigned long CodeRacer::usonic_measure_single_shot_us ()
 Measures the distance to the next object in front of the ultra sonic sensor in microseconds. More...
 
unsigned long CodeRacer::usonic_measure_single_shot_cm (unsigned long max_echo_run_time_us)
 Measures the distance to the next object in front of the ultra sonic sensor in cm. More...
 
unsigned long CodeRacer::usonic_measure_single_shot_us (unsigned long max_echo_run_time_us)
 Measures the distance to the next object in front of the ultra sonic sensor in microseconds. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ usonic_measure_cm() [1/2]

- -
-
- - - - - - - -
unsigned long CodeRacer::usonic_measure_cm ()
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in cm.

-

This is the medium one out of 3 measurements. The maximum measured distance is about 100cm and defined by the US_MAX_ECHO_TIME_US setting in the header file.

Returns
The measured distance in cm.
- -

Definition at line 672 of file CodeRacer.cpp.

-
673 {
674  return(usonic_measure_cm(US_MAX_ECHO_TIME_US));
675 }
-
-
- -

◆ usonic_measure_us() [1/2]

- -
-
- - - - - - - -
unsigned long CodeRacer::usonic_measure_us ()
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in microseconds.

-

This is the medium one out of 3 measurements. The maximum measured distance is about 6000 microseconds and defined by the US_MAX_ECHO_TIME_US setting in the header file.

Returns
The measured distance in microseconds.
- -

Definition at line 682 of file CodeRacer.cpp.

-
683  {
684  return(usonic_measure_us(US_MAX_ECHO_TIME_US));
685  }
-
-
- -

◆ usonic_measure_cm() [2/2]

- -
-
- - - - - - - - -
unsigned long CodeRacer::usonic_measure_cm (unsigned long max_echo_run_time_us)
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in cm.

-

This is the medium one out of 3 measurements. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm.

Parameters
- - -
max_echo_run_time_usDefines the maximum echo run time and by that the maximum of distance that can be measured.
-
-
-
Returns
The measured distance in cm.
- -

Definition at line 694 of file CodeRacer.cpp.

-
695 {
696  unsigned long echo_runtime_us = usonic_measure_us(max_echo_run_time_us);
697  unsigned long distance_cm = echo_runtime_us * 0.0172;
698  //Serial.print("MEASURE_DISTANCE. Distance in cm is: ");
699  //Serial.println(distance_cm);
700  _usonic_distance_cm = distance_cm;
701  return(distance_cm);
702 }
-
-
- -

◆ usonic_measure_us() [2/2]

- -
-
- - - - - - - - -
unsigned long CodeRacer::usonic_measure_us (unsigned long max_echo_run_time_us)
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in microseconds.

-

This is the medium one out of 3 measurements. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm.

Parameters
- - -
max_echo_run_time_usDefines the maximum echo run time in microseconds and by that the maximum of distance that can be measured.
-
-
-
Returns
The measured distance in microseconds.
- -

Definition at line 711 of file CodeRacer.cpp.

-
712 {
713  unsigned long echo_runtime_us[3] = { 0,0,0 };
714  uint8_t measnr = 0;
715 
716  do {
717  echo_runtime_us[measnr] = usonic_measure_single_shot_us(max_echo_run_time_us);
718  if (echo_runtime_us[measnr] > 200) {
719  measnr++;
720  }
721  } while (measnr < 3);
722 
723  // we will take the medium out of 3 values ...
724  if (echo_runtime_us[0] > echo_runtime_us[1]) { std::swap(echo_runtime_us[0], echo_runtime_us[1]); }
725  if (echo_runtime_us[1] > echo_runtime_us[2]) { std::swap(echo_runtime_us[1], echo_runtime_us[2]); }
726  if (echo_runtime_us[0] > echo_runtime_us[1]) { std::swap(echo_runtime_us[0], echo_runtime_us[1]); }
727 
728  //Serial.print("MEASURE_DISTANCE_US. Echo runtime in us is: ");
729  //Serial.println(echo_runtime_us[1]);
730 
731  // if the stop at minimal distance is enabeled - check for minimal distance is reached
732  if (true == _coderacer_stop_at_distance_enabled) {
733  if (echo_runtime_us[1] <= _usonic_stop_distance_us) {
734  _coderacer_stopped_at_min_distance = true;
735  stop_driving();
736  _coderacer_stop_at_distance_enabled = false;
737  }
738  }
739  _usonic_distance_us = echo_runtime_us[1];
740  return(echo_runtime_us[1]);
741 }
-
-
- -

◆ usonic_measure_single_shot_cm() [1/2]

- -
-
- - - - - - - -
unsigned long CodeRacer::usonic_measure_single_shot_cm ()
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in cm.

-

This is a one shot measurement. The maximum measured distance is about 6000 microseconds and defined by the US_MAX_ECHO_TIME_US setting in the header file.

Returns
The measured distance in cm.
- -

Definition at line 748 of file CodeRacer.cpp.

-
749 {
750  return(usonic_measure_single_shot_cm(US_MAX_ECHO_TIME_US));
751 }
-
-
- -

◆ usonic_measure_single_shot_us() [1/2]

- -
-
- - - - - - - -
unsigned long CodeRacer::usonic_measure_single_shot_us ()
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in microseconds.

-

This is a one shot measurement. The maximum measured distance is about 6000 microseconds and defined by the US_MAX_ECHO_TIME_US setting in the header file.

Returns
The measured distance in microseconds.
- -

Definition at line 758 of file CodeRacer.cpp.

-
759 {
760  return(usonic_measure_single_shot_us(US_MAX_ECHO_TIME_US));
761 }
-
-
- -

◆ usonic_measure_single_shot_cm() [2/2]

- -
-
- - - - - - - - -
unsigned long CodeRacer::usonic_measure_single_shot_cm (unsigned long max_echo_run_time_us)
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in cm.

-

This is a one shot measurement. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm.

Parameters
- - -
max_echo_run_time_usDefines the maximum echo run time in microseconds and by that the maximum of distance that can be measured.
-
-
-
Returns
The measured distance in cm.
- -

Definition at line 770 of file CodeRacer.cpp.

-
771 {
772  // convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
773  // the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
774  // distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
775  // distance_cm = (echo_duration/2) / 29.1;
776  unsigned long echo_runtime_us = usonic_measure_single_shot_us(max_echo_run_time_us);
777  unsigned long distance_cm = echo_runtime_us * 0.0172;
778  //Serial.print("MEASURE_DISTANCE. Distance in cm is: ");
779  //Serial.println(distance_cm);
780  _usonic_distance_cm = distance_cm;
781  return(distance_cm);
782 }
-
-
- -

◆ usonic_measure_single_shot_us() [2/2]

- -
-
- - - - - - - - -
unsigned long CodeRacer::usonic_measure_single_shot_us (unsigned long max_echo_run_time_us)
-
- -

Measures the distance to the next object in front of the ultra sonic sensor in microseconds.

-

This is a one shot measurement. Be careful with high values for max_echo_run_time_us - this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm.

Parameters
- - -
max_echo_run_time_usDefines the maximum echo run time in microseconds and by that the maximum of distance that can be measured.
-
-
-
Returns
The measured distance in microseconds.
- -

Definition at line 791 of file CodeRacer.cpp.

-
792  {
793  unsigned long echo_runtime_us;
794  // start measurement - send a short pulse "HIGH" to the TRIG pin of the ultrasonic sensor
795  pinMode(_us_echo_pin, OUTPUT);
796  pinMode(_us_echo_pin, INPUT);
797  digitalWrite(_us_trigger_pin, LOW);
798  delayMicroseconds(2);
799  digitalWrite(_us_trigger_pin, HIGH);
800  delayMicroseconds(10);
801  digitalWrite(_us_trigger_pin, LOW);
802  // measure runtime in microseconds until the ECHO pin aof the sensor goes HIGH
803  echo_runtime_us = pulseInLong(_us_echo_pin, HIGH, max_echo_run_time_us);
804  if (echo_runtime_us == 0) {
805  echo_runtime_us = max_echo_run_time_us; // US_MAX_ECHO_TIME_US;
806  }
807  //Serial.print("MEASURE_DISTANCE_US. Echo runtime in us is: ");
808  //Serial.println(echo_runtime_us);
809  _usonic_distance_us = echo_runtime_us;
810  return(echo_runtime_us);
811  }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.js b/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.js deleted file mode 100644 index ca0eb94..0000000 --- a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.js +++ /dev/null @@ -1,11 +0,0 @@ -var group__lowerlevelusmeths = -[ - [ "usonic_measure_cm", "d6/dfc/group__lowerlevelusmeths.html#ga5f034198a28b069478c454c63dbfa225", null ], - [ "usonic_measure_us", "d6/dfc/group__lowerlevelusmeths.html#gaa01602a576fd57609bc7e08f8ef32e58", null ], - [ "usonic_measure_cm", "d6/dfc/group__lowerlevelusmeths.html#gafdd5c75d7a8e7b7c993e512ee93dde9a", null ], - [ "usonic_measure_us", "d6/dfc/group__lowerlevelusmeths.html#ga1f3401ef472cb11997e7dc98ef3e2424", null ], - [ "usonic_measure_single_shot_cm", "d6/dfc/group__lowerlevelusmeths.html#ga0c00edbbf4a3169613c9ea84d6e7dc13", null ], - [ "usonic_measure_single_shot_us", "d6/dfc/group__lowerlevelusmeths.html#gad4309b6da17085575fb0c55559e240b8", null ], - [ "usonic_measure_single_shot_cm", "d6/dfc/group__lowerlevelusmeths.html#gab413551ea8a67e1b60eda1671029b645", null ], - [ "usonic_measure_single_shot_us", "d6/dfc/group__lowerlevelusmeths.html#ga1b5b43372082f5daeee47410a09a590c", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.map b/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.map deleted file mode 100644 index e6f1a45..0000000 --- a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.md5 b/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.md5 deleted file mode 100644 index 9d6c8c9..0000000 --- a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.md5 +++ /dev/null @@ -1 +0,0 @@ -8c86a47e7c3ee5eacbea426bb722fea2 \ No newline at end of file diff --git a/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.png b/Doku/Doxygen/html/d6/dfc/group__lowerlevelusmeths.png deleted file mode 100644 index 42cf950b3878da81b34874faf4e39fb2058b89fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1467 zcmV;s1w{IZP)83!6 z=6W!_UXNO>mWj5&0&BHe)a&(3Hv>{O*MpgAx7%s90~Va)IHsEb24D;Z0JK4Z0RU}~ zU;scHBp3kDhB?S9!*Lw4@s%cB?TTBkt;Z=$mfD(z!C*jdZ*QiXVJ+8nX@7s8a=F=* zq9nn9JljuTo7-l>&d!eMCRp$C@{-Es^2|CU7yv;>M@O`~yKA}`Rw|WB^!@!kw?36I z7{_sbzx?ZhWmwB$`}@m?K4T%<4p!W#7`$axyIJc*f0CRo1K1!F&%t<}H}jQNJ*wiyG3`yoX{+hP z2!97XlWbSLpRRhM7)>z2u?W`KgrAPyOqy}yh>D$d+tP}6dwWYyPfw}D(t&jn%beV4 zB?4WPT_S~j=)!)Z%Ju|Qb^m4Si5pj@2f<5f{(7S7+6d;oerI!pHsKnCC71SGMSL)c{Cc0e#cmZ2N7Vl4 z!9XU}YBeGv%H?u1y%e7J_jjsPDjHj52a|)j!AmwI7=Q(%@}y20U*#oICKHURCvHtY zxobLp+D=YRXl-qcE-o(U>gtL{qY*id!~F{ug+jrK`Jt2CnrDrru&6x2O~=bbg8AQ0 z#3XEfZ)kaWnabrdmCI%3AnziM!$gU?L=jB@yn4d!T#3d{A`=M)7SHPHDpjjhs#dGa z+ti-tWj5giPg2=s)%7IVmW0;3NUZ4qWTqA1P01iTJppf@sQpCC@}@wDiq9)6GJQg@ ztjxZw@@Y)dkk9Ao;NXA;g8@B1KhyE?F>P&a5fRbH$A`AKpr7{J)c$vBrXSR>CwznN z-uRzl_5aJNH>w`qK2iJezNe_VMB_&tH<9?kV-(iBOf(G|1MU>RSCxQ2Uzs(OW2*7v?V!KGW*(kM+&mR+E)d#G6g{z?bJD4L)2IkKoZvU zV4}L?qQ5<5rY?|)&nl~HEQJ?C_E`Cs<9?q}WdXuyO)yadyrKiZs_IFyjaOD?nuEA8 zM7POK0};0@fCy`PFfa?_9rkH78q{bsOgFyTh9h07DW+}zyYPseh&u1kA+ zdvoiNU@V5DVvp_ZZPQK2Bx~;?0YLU4!2p0ZNH74P4H66hXu}-j{U7E*1pvJqFL0}3 zI2=;FUgu6@2q4RKU1~O)R4f)vHw98OmtX(@RKXYw0BC~*0|43}!2p0ZNH74P%^!6h V4(EiH1JM8g002ovPDHLkV1h>J$H)Kx diff --git a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.html b/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.html deleted file mode 100644 index f043281..0000000 --- a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - -Arduino {code}racer API: Lower level LED methods - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
- -
-
Lower level LED methods
-
-
- - - - -

-Modules

 Methods
 
-

Detailed Description

-
-
- - - - diff --git a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.js b/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.js deleted file mode 100644 index 35c31bf..0000000 --- a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.js +++ /dev/null @@ -1,4 +0,0 @@ -var group__lowerlevelled = -[ - [ "Methods", "dd/dff/group__lowerlevelledmeths.html", "dd/dff/group__lowerlevelledmeths" ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.map b/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.map deleted file mode 100644 index 3f89425..0000000 --- a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.md5 b/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.md5 deleted file mode 100644 index 7380e68..0000000 --- a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.md5 +++ /dev/null @@ -1 +0,0 @@ -ae42a26c171e691377cc1cea12a6b159 \ No newline at end of file diff --git a/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.png b/Doku/Doxygen/html/d7/d0f/group__lowerlevelled.png deleted file mode 100644 index 8cf2dc792676b4ca3727a725ba533ae9e16d405f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcmV-@1cLjCP)vZgyvHvzeWo{|`hr&gIJ{^D#5KB*tJc z7=VZ<+cy8Gj(~_L3??fg(gKqe5ov+Riiot3b3gF%@`A0cE%bUl74Z-ST3A>>wOUmj zMl2j(!Terd!+kZ-G)-)5Y@kpmj4C#w(5|nq0RXyQ#J0!R`ue)+P%^2}XaMkheK&_@ zR<_;U-4sJ2if3hI1(ixgbr^}&>vh#3WRjiCy>QQph_t|DMMPR)vLYfaFj*0i7JN6@ zqbL@Ouq;bPQ&OcBm#E#K|M{`&c$HCgZe^XntiC^VVHk$+>SxgZW!Foqogh+@6@?dO z(7MZvYOs%MQh9oM!ok4-=I7^8E|*n@6N_I$FbpGc8@gb!(tu@IW1C3Q^7{IUdcBTX zt%k?P$Dcu}YqFvd?O7Fz#h)MNW9~A3$6ocFWkk!XBysrln>Eh!;1$1DdB5`@Dj%ku zpgKYIl6ZT2!{Ol}R##UsJ3EW*?d@NQYH@KMi6y|5L7>Gdr|8pja$^Nm!xewP2C|d?P z2Z!J9uBTZ?w?`~ICKeEoR?Dns&u3(xbPEJnn_4S2`i3xPO-MC?D!I^MmC4r=E zc+L1^w(q3Ho|UZSLezG$zWj?z<@0hUueix-ZEfw>ahOEaYPF;;OR zKkXn)QWc511RVA43TgHyEm`^9%$RiAFKgKlwVfpWif-%-v%&5zBQu!_FmlPHx+D3wb1`1ru-=_!tmj?ip20sI@-|Jx>e&@wD+G7+^S+NVl$8R+|Y zR;rf@L|&TBCMuPRa1gXwEi@Vp)M_={-QE3czE4d};r;!6gwYPO$Cv7*T2=|p55L`p z#?Q>m49ev)Zf|e#{QQh+wTfIWhoz+@)uB-WOjb13=H}+Gv$KOvr^D5P=9sLANDE9> zM5F~KD - - - - - - -Arduino {code}racer API: Getters and setters - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - -

-Functions

bool CodeRacer::stopped_at_min_distance ()
 Returns true if the racer was stopped at minimum distance. This set to false each time start_stop_at_min_distance() is called. More...
 
bool CodeRacer::is_driving ()
 Return true if the racer is driving - forward or backward. More...
 
unsigned long CodeRacer::turn_left_for_ms ()
 Returns the duration of time that is internally stored and used for turning the racer left. More...
 
unsigned long CodeRacer::turn_right_for_ms ()
 Returns the duration of time that is internally stored and used for turning the racer left. More...
 
void CodeRacer::set_inactive ()
 Sets the coderracer_active state to inactive. If start_stop() is used - the inactive mode will be entered. More...
 
void CodeRacer::set_active ()
 Sets the coderracer_active state to active. If start_stop() is used - the active mode will be entered. More...
 
bool CodeRacer::is_active ()
 Checks if coderracer_activ is set. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ stopped_at_min_distance()

- -
-
- - - - - - - -
bool CodeRacer::stopped_at_min_distance ()
-
- -

Returns true if the racer was stopped at minimum distance. This set to false each time start_stop_at_min_distance() is called.

-
Returns
True if stopped.
- -

Definition at line 380 of file CodeRacer.cpp.

-
380  {
381  return(_coderacer_stopped_at_min_distance);
382 }
-
-
- -

◆ is_driving()

- -
-
- - - - - - - -
bool CodeRacer::is_driving ()
-
- -

Return true if the racer is driving - forward or backward.

-
Returns
True if driving forward or backward
- -

Definition at line 387 of file CodeRacer.cpp.

-
387  {
388  return(_drive);
389 }
-
-
- -

◆ turn_left_for_ms()

- -
-
- - - - - - - -
unsigned long CodeRacer::turn_left_for_ms ()
-
- -

Returns the duration of time that is internally stored and used for turning the racer left.

-
Returns
Time to turn left in ms
- -

Definition at line 394 of file CodeRacer.cpp.

-
394  {
395  return(_turn_left_for_ms);
396 }
-
-
- -

◆ turn_right_for_ms()

- -
-
- - - - - - - -
unsigned long CodeRacer::turn_right_for_ms ()
-
- -

Returns the duration of time that is internally stored and used for turning the racer left.

-
Returns
Time to turn left in ms
- -

Definition at line 401 of file CodeRacer.cpp.

-
401  {
402  return(_turn_right_for_ms);
403 }
-
-
- -

◆ set_inactive()

- -
-
- - - - - - - -
void CodeRacer::set_inactive ()
-
- -

Sets the coderracer_active state to inactive. If start_stop() is used - the inactive mode will be entered.

-
Returns
nothing
- -

Definition at line 408 of file CodeRacer.cpp.

-
408  {
409  coderracer_activ = false;
410 }
-
-
- -

◆ set_active()

- -
-
- - - - - - - -
void CodeRacer::set_active ()
-
- -

Sets the coderracer_active state to active. If start_stop() is used - the active mode will be entered.

-
Returns
nothing
- -

Definition at line 415 of file CodeRacer.cpp.

-
415  {
416  coderracer_activ = true;
417 }
-
-
- -

◆ is_active()

- -
-
- - - - - - - -
bool CodeRacer::is_active ()
-
- -

Checks if coderracer_activ is set.

-

coderracer_activ is toggled each time the button is pressed. After power on coderracer_activ is set to False.

Returns
True id coderracer_activ is set - False if not.
- -

Definition at line 424 of file CodeRacer.cpp.

-
424  {
425  return(coderracer_activ);
426 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.js b/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.js deleted file mode 100644 index f9662fd..0000000 --- a/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.js +++ /dev/null @@ -1,10 +0,0 @@ -var group__higherlevelgetters = -[ - [ "stopped_at_min_distance", "d7/d45/group__higherlevelgetters.html#gae8b8c0ab24ccb572281785aeca8541e1", null ], - [ "is_driving", "d7/d45/group__higherlevelgetters.html#ga33dcd96e9b12dec794c56be85ec1ee05", null ], - [ "turn_left_for_ms", "d7/d45/group__higherlevelgetters.html#gaf04fd16ca0e2ace656f9549c43d16459", null ], - [ "turn_right_for_ms", "d7/d45/group__higherlevelgetters.html#gac0698f02f6a21d9d1f5b9cf2820306cf", null ], - [ "set_inactive", "d7/d45/group__higherlevelgetters.html#ga62f1c0eea56e27d0853cb58f30eb140d", null ], - [ "set_active", "d7/d45/group__higherlevelgetters.html#ga415c69930f291d5e06b7211b31843310", null ], - [ "is_active", "d7/d45/group__higherlevelgetters.html#gaa0ab4d6a754a23ea13664a553bcc8ff2", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.map b/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.map deleted file mode 100644 index 09cc176..0000000 --- a/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.md5 b/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.md5 deleted file mode 100644 index f9b8790..0000000 --- a/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.md5 +++ /dev/null @@ -1 +0,0 @@ -0c88cc43f51cb6a9047b0307b81a6f18 \ No newline at end of file diff --git a/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.png b/Doku/Doxygen/html/d7/d45/group__higherlevelgetters.png deleted file mode 100644 index 507ee33f81816107fef980fbcdc3242f5ddd7b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1589 zcmV-52Fm$~P)!sSaDIo;_gzRn}Z-O zy6JzQptMMfI674)rGq%RxCy1u?jneUe1|XjlBW4_mt5{H>H7upkfgc$tUcgJuzq(-AbmSw4k2XbbAf1j$= zs_HNRq?qWTK0Q6r-QAsvSRiLQoeusj!Bm;(p*q^_w#+ynhibK&>JR{=!W=39fFMYy z004p@p#lI1f`keHAV}atDISJlkl&I3?)^cZVJ$1I7PrY7Gbr_(b zLZLvLo10WDj;Bx|36%wI-1w0A)Hpdgq3i2w)nS099v&WOYinz4pR|MukTt)*zqGo# zO2@~?szU+In5IcTKR*-urOlxlhB2}2?DHP;9{1btS6)zALGgIY2`V$J-l#g<=X%TH ziAh8og`E?19sooW)!CU~zx#*vJeGZN%i=xX-6Ir{P`qV`N>U=OHO=w?rcvhRP(=+#dCQS83|2YR zcK>JMYy$wF%q3J+Jvp3q*s9 zTaKuDlhnbQ@WRUR9!sPCIBeUd*Vk7%JUpa@g#}t)U#F|9tJLaCQ&8`WH>pB42^sPS zB^d9`%zI9f^LWdRIu@s1-fI!nCcM|iax4uWA0O0ewdm&Nh6aNH&CJZu-`^h*k?(i> zvd)`m-3it?=InD4vv)h}T<>|_GW}xkVktN5T3CkqVe#nLCOnkPp<;e+dVPI;{hvfX zKR?HksPkv3R8kqD6n@FTJw4zY^KOTo>$e^CS(cch$_+|Xymjcy3JX0I89$qE6ZXU{>@*|1npJiEe ze}7M{R%`5~29_k+>2&D*{XOjvLk$K4nw_0ZR7TK{)Nh*y>$%U8gZTDH@`;|ebXknsd|*vIKTC@*=+hA5Bu8G`T4mvJya~;2VSOWQnT5ly}iA${nEeK&$6^!*z$Ej%h~ZP z><99ZR{q%jAW9mgTxsw}~iAOG|Wic1HbvpI%;G=-}Xh=I7^$h-hwZPFfrQqDUR` zvo0;?-uAu<>i23W&o)obE^fJD%jAXC!MdcL$~H-ZVHi}YRH#y^(Bb1zK5IQC2@d5>gXt)ED|?ER@3gQi1A4 zLv(Bt0PrWhhZ;7tOmZXhF0v97gPY$_ST^0-1OS3beJI6~kkaaz#VuDxGG&=>O`~kp zy>NiM&}PWbG93`qi{crw#{FzsbD?2%=-4Iz5KQTipY<5a@^n1Q>%|=khfPoLETP8} zkB)5u0RA%Zrc|C`zEWSMQi;0VE_J(I)uDif{JtxVgsK>Z+xj{^J*Bm^HPvB&h6;rO zZES2z>_h+f&@O4+S%EW z83*K0r_-5OFA^ZnCKi|;4u{leG{~|nRWU)1?C - - - - - - -Arduino {code}racer API: Lower level fun stuff methods - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
- -
-
Lower level fun stuff methods
-
-
- - - - - - - - -

-Functions

void CodeRacer::look_around ()
 Fun stuff - will move the servo around after a random amount of time. More...
 
void CodeRacer::kitt ()
 Fun stuff - you know Knightrider... More...
 
-

Detailed Description

-

Function Documentation

- -

◆ look_around()

- -
-
- - - - - - - -
void CodeRacer::look_around ()
-
- -

Fun stuff - will move the servo around after a random amount of time.

-
Returns
nothing
- -

Definition at line 440 of file CodeRacer.cpp.

-
441 {
442  if (_servo_look_around_at_ms < millis()) {
443  _servo_look_around_at_ms = millis() + random(FUN_MIN_PAUSE_MS, FUN_MAX_PAUSE_MS);
444  servo_set_to_left();
445  delay(500);
446  servo_set_to_right();
447  delay(800);
448  servo_set_to_center();
449  delay(300);
450  servo_set_to_left();
451  delay(100);
452  servo_set_to_center();
453  }
454 }
-
-
- -

◆ kitt()

- -
-
- - - - - - - -
void CodeRacer::kitt ()
-
- -

Fun stuff - you know Knightrider...

-
Returns
nothing
- -

Definition at line 459 of file CodeRacer.cpp.

-
460 {
461  if (millis() - _last_led_switched_at_ms > LED_SWITCH_MS) {
462  _last_led_switched_at_ms = millis();
463  if (_last_led_on >= 5) {
464  _led_count = -1;
465  }
466  else if (_last_led_on <= 0) {
467  _led_count = 1;
468  }
469  _last_led_on = _last_led_on + _led_count;
470  switch (_last_led_on) {
471  case 0:
472  set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF);
473  break;
474  case 1:
475  set_leds_left_stop_frwd_right(LEDON, LEDOFF, LEDOFF, LEDOFF);
476  break;
477  case 2:
478  set_leds_left_stop_frwd_right(LEDOFF, LEDON, LEDOFF, LEDOFF);
479  break;
480  case 3:
481  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDON, LEDOFF);
482  break;
483  case 4:
484  case 5:
485  set_leds_left_stop_frwd_right(LEDOFF, LEDOFF, LEDOFF, LEDON);
486  break;
487  }
488  }
489 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/d8/d7a/group__lowerlevelfun.js b/Doku/Doxygen/html/d8/d7a/group__lowerlevelfun.js deleted file mode 100644 index fafb192..0000000 --- a/Doku/Doxygen/html/d8/d7a/group__lowerlevelfun.js +++ /dev/null @@ -1,5 +0,0 @@ -var group__lowerlevelfun = -[ - [ "look_around", "d8/d7a/group__lowerlevelfun.html#ga04309a38252639a8eaa43809c04c11c8", null ], - [ "kitt", "d8/d7a/group__lowerlevelfun.html#ga3b6f819fb82d910888fbc87abff1470c", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d9/d80/group__higherlevel.html b/Doku/Doxygen/html/d9/d80/group__higherlevel.html deleted file mode 100644 index c88a1e3..0000000 --- a/Doku/Doxygen/html/d9/d80/group__higherlevel.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -Arduino {code}racer API: Higher level methods, setters and getters - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
- -
-
Higher level methods, setters and getters
-
-
- - - - - - -

-Modules

 Methods
 
 Getters and setters
 
-

Detailed Description

-
-
- - - - diff --git a/Doku/Doxygen/html/d9/d80/group__higherlevel.js b/Doku/Doxygen/html/d9/d80/group__higherlevel.js deleted file mode 100644 index 29780e9..0000000 --- a/Doku/Doxygen/html/d9/d80/group__higherlevel.js +++ /dev/null @@ -1,5 +0,0 @@ -var group__higherlevel = -[ - [ "Methods", "d2/d40/group__higherlevelmeths.html", "d2/d40/group__higherlevelmeths" ], - [ "Getters and setters", "d7/d45/group__higherlevelgetters.html", "d7/d45/group__higherlevelgetters" ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/d9/d80/group__higherlevel.map b/Doku/Doxygen/html/d9/d80/group__higherlevel.map deleted file mode 100644 index 1ea350c..0000000 --- a/Doku/Doxygen/html/d9/d80/group__higherlevel.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Doku/Doxygen/html/d9/d80/group__higherlevel.md5 b/Doku/Doxygen/html/d9/d80/group__higherlevel.md5 deleted file mode 100644 index 7aaedc8..0000000 --- a/Doku/Doxygen/html/d9/d80/group__higherlevel.md5 +++ /dev/null @@ -1 +0,0 @@ -12cfd362df9c03991f2685cfc91fc9f2 \ No newline at end of file diff --git a/Doku/Doxygen/html/d9/d80/group__higherlevel.png b/Doku/Doxygen/html/d9/d80/group__higherlevel.png deleted file mode 100644 index ffed6ba1a2ff8915edb9ee89b5f1520c5305644d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2983 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 - - - - - - -Arduino {code}racer API: Lower level ultra sonic methods and getters - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
- -
-
Lower level ultra sonic methods and getters
-
-
- - - - - - -

-Modules

 Methods
 
 Setters and getters
 
-

Detailed Description

-
-
- - - - diff --git a/Doku/Doxygen/html/da/daf/group__lowerlevelus.js b/Doku/Doxygen/html/da/daf/group__lowerlevelus.js deleted file mode 100644 index 715835f..0000000 --- a/Doku/Doxygen/html/da/daf/group__lowerlevelus.js +++ /dev/null @@ -1,5 +0,0 @@ -var group__lowerlevelus = -[ - [ "Methods", "d6/dfc/group__lowerlevelusmeths.html", "d6/dfc/group__lowerlevelusmeths" ], - [ "Setters and getters", "db/ddd/group__lowerlevelusgetters.html", "db/ddd/group__lowerlevelusgetters" ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/da/daf/group__lowerlevelus.map b/Doku/Doxygen/html/da/daf/group__lowerlevelus.map deleted file mode 100644 index b07fb2c..0000000 --- a/Doku/Doxygen/html/da/daf/group__lowerlevelus.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Doku/Doxygen/html/da/daf/group__lowerlevelus.md5 b/Doku/Doxygen/html/da/daf/group__lowerlevelus.md5 deleted file mode 100644 index 7b87cab..0000000 --- a/Doku/Doxygen/html/da/daf/group__lowerlevelus.md5 +++ /dev/null @@ -1 +0,0 @@ -35f9114c2fb61134b1d44a4ab7152af0 \ No newline at end of file diff --git a/Doku/Doxygen/html/da/daf/group__lowerlevelus.png b/Doku/Doxygen/html/da/daf/group__lowerlevelus.png deleted file mode 100644 index b1bace126e464076b44b92701d7fd6d5f0fd7910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3003 zcmZ9O2{@E%8^?z%kyGS^2pJ@krG~N$5o2G&*v*tZ%UDO*Lzb~-ElV_nF-Rp_wloQo z$gz&WgqUn`jIkZd_x7FdyT0Xpuj^f|=e?ijdhY-I{_h{w+*I#3PC-r(2=tqQKHLHX zVnP7VwkO$utImQe9JsML8|lG8$G^_!?UmUe&?$cd_${jkMQhVWp1futwheg$hf||- zqT-KYN8QiW;`vjM@S4jH%+(MdEx6TpL99C5Ea%M11wCtHk?>m(XL%hn@UEsgUbb{s zb4|D07E*hL;B1_|6@8hb@QZtWVSmRT>+IzQAt4?iIFyHbHrCI}%Zn2Zmv}^7V&mq? zX<&^{GSP~KviqLE=#tsfbjlPsTMnT5?V=O0qF9P&1 zFOM(LK?^-Zp`j(rKPTyPOZPf;NITViz`KzlHjvRI77Guw{~ul z{>6VT)^=ORHFFEbmg7z;^o_VlO;xeE4n)g5K7EdnVf}THf?D4*{+{do!Tj%FS8>MU z2^!rkDyMGgaEzja+KX^&5KwtJ7LY1}avJLmRf#m||5gOaWF66ttliULw3P*tG+Rs# z9sN+Xw0M%>Jxkm?L3Cy4%E~8iXTER(obUEv`J@Uvo}arLt?*{rGvAq%N64Yyh*L*^ zg?=y|C%Xls#M>90)4k6rA$b*m#PD5JEs|NtXqgbfk!L%nr$S8n=Qc`uC2N*(=fWLf z%%i;r)#rK|H>V~nCEsXv?7V=4YsV)%4^y)2=R&2(dM`#cbmxtF6;fVe?SN#b zI$t6Nest(kN)b1xE@i%o7KuZ?roeK6TA1MA-}TZj+=Ax6eW6v5&m03%g~50@e${hjutZ~sOvdU<#6D0>XNfzb`3UH*5NTfNlrzAr^KY4q5`#_|J*{B%$ zjO`W5_R6??Fa|TbO0G}pc2>Dd*xFumc-zq67E50luLHKTVrygbgku1+GUg_dNW9Au zcMIqHl0eWxp+xuh_aBKoX{*KI#Aw$OAmmGYDY&w-6KiX0yL4Ix`e}uUvGJXVhzr#= zb)V9OVNmTYf92HWWiKIn^)+f|bmOSbjJwgVeS3&hhHEYt7t93J9_G5GZtwRuilf@& zm%qZ~7Xn5xRfFBehhc7Mj-3&d)C*L6d-x7t1GOcH_R6_CxpZ6dP2mF0OTyKVOf`O9 zK&~4JS?Sx!(7fWBHiG&g8kZl9w8z*6$R0##Kp+tAjGj|@X}V=xh)u4ZnS;7jv8r%m z_ajfE!+E(za`Myxe z@9Nd74`X7O)Iv8|>QJ4!;7m<55f6M;Ue89UWHdTKjlJ zwe{V>Vs+3%K>jE4C})3vZa|p(&GGP0D*NPU##Cu$p{ezj{aQ_vK>TuJt8d7N4FVAl z6xJ%G=}cN$THd&xMDnX*!kFk}9QzqVk%DBw$pUrL*9^kWa2fyi<<`xxo)Pcrq!n8E z5-YfJufodPf4Vu~L~U*D0Z|NBP*^xLJWOO*RjmdrY5dzwuUTP}Se)@^c{slJnPZlT zpi&hl4IV5FYworyP}yPK76RYigahND@#Q#zBOXq6vCsgFL9Y6s7BSNsz`17WsZr)e ze^#Hl&meh?TK=%lCo7>s6~-SW`5^br+R>GnlFR*a*&f07V6~b&uSbf98qe?js3JEC z?oIef8!?6XnlOQ-Y;PXe9P_9)C?}H-8I4cg)a66Fb7T?HG+7HZk)HSOL8i}CbLr{` zIC_zQAQWA2E;x*69VX6NEZ?VO#fBLjGYzA-C#I);4W{9xEfA|`BKCREgQh~>6x$Sm zqe=_uw&-IKApOK|-!2y4j7;X2M}7lJ7x=F>{yNO}gR@rHRR6IbcpcmnxHcVKC*$Fv z2dj15H}gXc(Z(hxlQl0s{Pan8b*5eDiJX&GbaeEh5hJV5)%rQ}@GvM#g2R_RGuLt0 zQdV(9ancA{&sChiPtUzxKZ1Jg)-dV5Xn$|Ijnq_!4A)7Qu&BzxtyeNX^jDUtL4vCR zF)}vxpY1Fzx;wT6vbwmqRCJUIf*O6uv64o4t{nxF*gE_rDCxR7g0#rs9<^|CN}KP= znE%!l_hWha1G(OVC#5@>*wEO>*L8h*xfCRy1>P@ zrYdX1*x7Men`|&uB90OW1gNDx`n@@(DiG-#Jy4{g9J(oST3Gebzo@d2gYkO|6m7{8q3`;n2~FG)$ge(fUfg z(c1j{yj{$d&roE0SUjc4&&Ac1Wr=bMXMWlHr}g=FICK4pP|Hwfe3o~AiH2yVK1)x! zuy%Mj>|JZCNxYXBkngTL=0WLDzLW)H>E1V~M@LZ+`&-fq9yXSiW#=1b{RL9^WVPJf z%3p0~DP6Pb!)W2S2TC+D=(ItKwFd@sJx?B$zVP`8&Bv(RVs~@F$n@LIu&t9eb;xd@ zeKHxF*^G>jdz(t@XFUSi0%ahvh-fYedB48n(iO{U`|1wU4WEg}^@lwfqIN;eZ)E0) ziD#O_cjOWh6Eh9VLB=~dbXK&JlW@e%k}n>**1bXmAn&j1h2g~vYVDn2Li=)D zR#v7Q`2A#7-wR9MQt0m|S-z6VeM0IGadB}wOHNV`P{#Rz?pl|p=SL^?{0gn@+*Fhj zy!MHPXwIb~0GsabGFJHIkZno4Ql?j}=>9JFcOkdVmFA;?GPG^>zkB;HQxlVg{-MQF z3MGS2_HK7n{FmRz&!s_1&�v6opC4+}0g=>jAhx-Q^u90BNM0H%$;ojiI_O?yy}1 z4+3CHp*Wj}W+<`(fTuRNba8&8BuP!2I^}sYWXJyV!eY+ZU*Fi`W}AjI$6)DWFrL)0 zbsa85DYWeLrTRe~(aIcO - - - - - - -Arduino {code}racer API: Methods - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - -

-Functions

void CodeRacer::servo_settings (uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos)
 Overwrites the default settings taken from header file by the parameters given to this method. More...
 
void CodeRacer::servo_sweep ()
 Turns sweeping of the servo from left to right and back on. More...
 
void CodeRacer::servo_set_to_right ()
 Drives the servo to the postion that is defined by #servo_right_pos. More...
 
void CodeRacer::servo_set_to_left ()
 Drives the servo to the postion that is defined by #servo_left_pos. More...
 
void CodeRacer::servo_set_to_center ()
 Drives the servo to the postion that is defined by #servo_center_pos. More...
 
uint8_t CodeRacer::servo_set_position_wait (uint8_t position)
 Drive the servo to the postion given to this method. More...
 
unsigned long CodeRacer::servo_set_position (uint8_t position)
 Drive the servo to the postion given to this method. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ servo_settings()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CodeRacer::servo_settings (uint8_t pos_center,
uint8_t pos_left,
uint8_t pos_right,
uint8_t sweep_left_pos,
uint8_t sweep_right_pos 
)
-
- -

Overwrites the default settings taken from header file by the parameters given to this method.

-
Parameters
- - - - - - -
pos_centerThe postion at which the servo moves to straight forward. Default is 90. Allowed 10 <= pos_center <= 170.
pos_leftThe postion at which the servo moves to the left. Default is 170. Allowed 10 <= pos_center <= 170.
pos_rightThe postion at which the servo moves to the right. Default is 10. Allowed 10 <= pos_center <= 170.
sweep_left_posIf the servo is sweeping from left to the right - this defines the most left postion. Default is 140. Allowed 10 <= pos_center <= 170.
sweep_right_posIf the servo is sweeping from left to the right - this defines the most right postion. Default is 40. Allowed 10 <= pos_center <= 170.
-
-
-
Returns
nothing
- -

Definition at line 510 of file CodeRacer.cpp.

-
511 {
512  servo_center_pos = pos_center;
513  servo_left_pos = pos_left;
514  servo_right_pos = pos_right;
515  servo_sweep_left_pos = sweep_left_pos;
516  servo_sweep_right_pos = sweep_right_pos;
517 }
-
-
- -

◆ servo_sweep()

- -
-
- - - - - - - -
void CodeRacer::servo_sweep ()
-
- -

Turns sweeping of the servo from left to right and back on.

-

The sweeping range is defind by #servo_sweep_left_pos and #servo_sweep_right_pos attributes. Both can be set by either servo_settings() or as public members. Every time servo_sweep() is called the servo is driven by 5 steps until either #servo_sweep_left_pos or #servo_sweep_right_pos is reached. Then it will turn the direction and step to the other side every time this method is called.

Returns
nothing
- -

Definition at line 526 of file CodeRacer.cpp.

-
527 {
528  uint8_t position;
529  _servo_sweep = true;
530  if (millis() - _servo_position_set_at_ms > SERVO_SWEEP_MS) {
531  position = _servo_position + _servo_sweep_step;
532  //sprintf(_debugmsg,"[%s] current position=%ld newpostion=%ld", __func__, _servo_position, position);
533  if ((position >= servo_sweep_left_pos) || (position >= SERVO_MAX_POSITION)) {
534  position = servo_sweep_left_pos;
535  _servo_sweep_step = SERVO_SWEEP_TO_RIGHT_STEP;
536  }
537  if ((position <= servo_sweep_right_pos) || (position <= SERVO_MIN_POSITION)) {
538  position = servo_sweep_right_pos;
539  _servo_sweep_step = SERVO_SWEEP_TO_LEFT_STEP;
540  }
541  _servo_set_position(position);
542  }
543 }
-
-
- -

◆ servo_set_to_right()

- -
-
- - - - - - - -
void CodeRacer::servo_set_to_right ()
-
- -

Drives the servo to the postion that is defined by #servo_right_pos.

-
Returns
nothing
- -

Definition at line 548 of file CodeRacer.cpp.

-
549 {
550  servo_set_position_wait(servo_right_pos);
551 }
-
-
- -

◆ servo_set_to_left()

- -
-
- - - - - - - -
void CodeRacer::servo_set_to_left ()
-
- -

Drives the servo to the postion that is defined by #servo_left_pos.

-
Returns
nothing
- -

Definition at line 556 of file CodeRacer.cpp.

-
557 {
558  servo_set_position_wait(servo_left_pos);
559 }
-
-
- -

◆ servo_set_to_center()

- -
-
- - - - - - - -
void CodeRacer::servo_set_to_center ()
-
- -

Drives the servo to the postion that is defined by #servo_center_pos.

-
Returns
nothing
- -

Definition at line 564 of file CodeRacer.cpp.

-
565 {
566  servo_set_position_wait(servo_center_pos);
567 }
-
-
- -

◆ servo_set_position_wait()

- -
-
- - - - - - - - -
uint8_t CodeRacer::servo_set_position_wait (uint8_t position)
-
- -

Drive the servo to the postion given to this method.

-

The method will wait until the servo has reached its new position.

Parameters
- - -
positionPosition the servo will be drived to. Allowed are values 10<=postion<=170. 10 is at the right hand side, 170 at the left hand side.
-
-
-
Returns
The new servo position
- -

Definition at line 575 of file CodeRacer.cpp.

-
576 {
577  _servo_sweep = false;
578  unsigned long wait_time_ms = _servo_set_position(position);
579  delay(wait_time_ms);
580  return(_servo_position);
581 }
-
-
- -

◆ servo_set_position()

- -
-
- - - - - - - - -
unsigned long CodeRacer::servo_set_position (uint8_t position)
-
- -

Drive the servo to the postion given to this method.

-

The method will not wait until the servo has reached its new position.

Parameters
- - -
positionPosition the servo will be drived to. Allowed are values 10<=postion<=170. 10 is at the right hand side, 170 at the left hand side.
-
-
-
Returns
The time in ms the servo will need to reach the new position
- -

Definition at line 589 of file CodeRacer.cpp.

-
590 {
591  _servo_sweep = false;
592  unsigned long wait_time_ms = _servo_set_position(position);
593  return(wait_time_ms);
594 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.js b/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.js deleted file mode 100644 index 31816e6..0000000 --- a/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.js +++ /dev/null @@ -1,10 +0,0 @@ -var group__lowerlevelservomeths = -[ - [ "servo_settings", "db/dd5/group__lowerlevelservomeths.html#ga687beb327e20f4d0541d1ac9e29c01c3", null ], - [ "servo_sweep", "db/dd5/group__lowerlevelservomeths.html#ga1e9afe1f27dfc9796b4c9b3dba245365", null ], - [ "servo_set_to_right", "db/dd5/group__lowerlevelservomeths.html#gaac73bf99cf2d19f7b1987156aa842b74", null ], - [ "servo_set_to_left", "db/dd5/group__lowerlevelservomeths.html#gaef7d1903b65a0a8ab4fafdc53080b07d", null ], - [ "servo_set_to_center", "db/dd5/group__lowerlevelservomeths.html#gad1f28aa91079e88fc3093e3074edfb32", null ], - [ "servo_set_position_wait", "db/dd5/group__lowerlevelservomeths.html#ga0149226288bff2290d52ed1cbd674edd", null ], - [ "servo_set_position", "db/dd5/group__lowerlevelservomeths.html#gab8831340049de6dbddeda997745725e6", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.map b/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.map deleted file mode 100644 index 7a7777f..0000000 --- a/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.md5 b/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.md5 deleted file mode 100644 index 85f67fb..0000000 --- a/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.md5 +++ /dev/null @@ -1 +0,0 @@ -597c50e7dc706800e2ae683735d343f0 \ No newline at end of file diff --git a/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.png b/Doku/Doxygen/html/db/dd5/group__lowerlevelservomeths.png deleted file mode 100644 index acf96f0be3ed6079729cf2e3f33bdbb2c3654650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 zcmV;t1w;CYP)5@TV3R6XQYxgK^fEpc`>DhKY@Y*^R}?5og|l zMq>zz_yT~qh`s=I)Tjd*Hxn0uI$=s_?@xQzyW;ngn4gqhpNGOdwpV&T$MZao001;t zGMxYbEG`rn0MG^n1^~1{fdK$*a=`_|;gIU}I*rF;6Zyb`a$T32%_bF#MboK3isp`B zdc7XCS}hZ~zyfQvTGZ?HOs4@Un>&J;YPZ{I<^c=NaU9brfB_hT0RU}KU;scH6c_-| z1_cHHw22(#mEkxJ*?3EnuDoo0y)3Mpv-o<_HW&=(?d{EU8rE`Mm-hGfDVLiqDM|_q zWE+YL-_FjC=@hJYd3j0Ya(QMM3JidtqoX6*-Q6{vhLuXC5`BMv&n-`7490PszaRgy z;5t!{!`l1T5&e#ZY#vc@FFswJUr0)`Z~S7 zzG{mHdMPO|BAr$AIne>hIB{k2P#HJwHf3^35-Z7jpu*?pC$-ycIy*a~ySqDbUH5Oo zvqGVuEv|0;exFLE67~E2zh%?M!6Os@z}*Di@n4D!O_`TF{z zPNzfX=jYVzcFA!ZnoK6-c^-{Mqrdf*mNGF+m`GF+3M){-^`n00ttS#+g~fmOz#2b4 zKh)`Ts8Xp=KA)#rtw!B$m&W5UjYcDyOeUsNRL+02qN?L2-3G5cj$j~@YPA{>5#@5Z znWGez_xE?IR4N*?vV+ON+~6r23Jk!4QQ4`J##ecYl*t04>hi7WZ>yS)pSF{e6Ixqa zql=3Ry1Kfe(P%`D<1qgRi$bAb#r)7ouE<4=r9@HL!A-}@M1lEl9We=;?;BcPUZ!%n zOyzPpa*%fs$6$0X@;KgUH8y1JRuVmUrt)Ip;4f%YY z4h{}zFc{GD^D`YEAJf*>77-DBe0*q&3;JolOg%kBpMD!O_&97m|8xG^2w2mSkVWy`RaZD^idR*4`?RcBhRSFO57!#%pwJ+w@TyWS=!h zFucQY(Z8ND(z1=#yxe2`dv0R znSA2zE19;u8~}K%If8*%81Jx8qtT#7qhUG?YptxT%q>HKu@p{E>~eE+ga0~~!F65Q z+uNI4jsjyb6cu}HZ*QAUA(O1ViUa`JhXMlt+MvJyfHo*F0H96eAn$*e2NeMHa=gH$ zis5ib^?IE-jUj+6*LA7cY*MjUG@S~hXs*Bj0H}g77y!@)1qJ}LL4g4PZBSqUK$~A3 WgdpU}Q+;Cq0000 - - - - - - -Arduino {code}racer API: Setters and getters - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - - - - -

-Functions

void CodeRacer::usonic_set_stop_distance_cm (unsigned long stop_distance_cm)
 Sets the stop distance in cm. More...
 
void CodeRacer::usonic_set_stop_distance_us (unsigned long stop_distance_us)
 Sets the stop distance in cm. More...
 
unsigned long CodeRacer::usonic_distance_us ()
 Returns the last measured distance in microseconds. More...
 
unsigned long CodeRacer::usonic_distance_cm ()
 Returns the last measured distance in cm. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ usonic_set_stop_distance_cm()

- -
-
- - - - - - - - -
void CodeRacer::usonic_set_stop_distance_cm (unsigned long stop_distance_cm)
-
- -

Sets the stop distance in cm.

-

If start_stop_at_min_distance() is used and distance measured with one of the measurement methods - the racer will be stopped immediately. All except the singe shot methods of the ultra sonic measurements methods supports that. Internally the stop distance will be set as both - in cm and in microseconds.

Parameters
- - -
stop_distance_cmDistance in cm the racer will be stopped if that features was enabled by start_stop_at_min_distance() before.
-
-
-
Returns
nothing
- -

Definition at line 825 of file CodeRacer.cpp.

-
826 {
827  _usonic_stop_distance_us = stop_distance_cm * 58.14;
828 }
-
-
- -

◆ usonic_set_stop_distance_us()

- -
-
- - - - - - - - -
void CodeRacer::usonic_set_stop_distance_us (unsigned long stop_distance_us)
-
- -

Sets the stop distance in cm.

-

If start_stop_at_min_distance() is used and distance measured with one of the measurement methods - the racer will be stopped immediately. All except the singe shot methods of the ultra sonic measurements methods supports that. Internally the stop distance will be set as both - in cm and in microseconds.

Parameters
- - -
stop_distance_usDistance in cm the racer will be stopped if that features was enabled by start_stop_at_min_distance() before.
-
-
-
Returns
nothing
- -

Definition at line 837 of file CodeRacer.cpp.

-
838 {
839  _usonic_stop_distance_us = stop_distance_us;
840 }
-
-
- -

◆ usonic_distance_us()

- -
-
- - - - - - - -
unsigned long CodeRacer::usonic_distance_us ()
-
- -

Returns the last measured distance in microseconds.

-
Returns
Distance in microseconds
- -

Definition at line 845 of file CodeRacer.cpp.

-
845  {
846  return(_usonic_distance_us);
847 }
-
-
- -

◆ usonic_distance_cm()

- -
-
- - - - - - - -
unsigned long CodeRacer::usonic_distance_cm ()
-
- -

Returns the last measured distance in cm.

-
Returns
Distance in cm
- -

Definition at line 852 of file CodeRacer.cpp.

-
852  {
853  return(_usonic_distance_cm);
854 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.js b/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.js deleted file mode 100644 index 33d391f..0000000 --- a/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.js +++ /dev/null @@ -1,7 +0,0 @@ -var group__lowerlevelusgetters = -[ - [ "usonic_set_stop_distance_cm", "db/ddd/group__lowerlevelusgetters.html#gaa7c5a6563a5736ed38d12f616de480df", null ], - [ "usonic_set_stop_distance_us", "db/ddd/group__lowerlevelusgetters.html#ga2f06c193ae86c5b1cba450caf5adf146", null ], - [ "usonic_distance_us", "db/ddd/group__lowerlevelusgetters.html#ga917b90f21e731ef5f690d5198e7f4d3e", null ], - [ "usonic_distance_cm", "db/ddd/group__lowerlevelusgetters.html#gad59842c14196598e55644b2a22621454", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.map b/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.map deleted file mode 100644 index 067e2ec..0000000 --- a/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.md5 b/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.md5 deleted file mode 100644 index 2541f41..0000000 --- a/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.md5 +++ /dev/null @@ -1 +0,0 @@ -2ea30e8364ac6dafffce41eb4e6f6037 \ No newline at end of file diff --git a/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.png b/Doku/Doxygen/html/db/ddd/group__lowerlevelusgetters.png deleted file mode 100644 index 9248f2277af635620da7e0613bfb18feae98caa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1603 zcmV-J2E6%+P)s%NI@F(`ILPrtWMR&(;)vdS)?o!&RtDC!H7N>5G zPE9OMA{3-Uoz&6YP3X`;3NE4+?K`~GH>SzSIm!7-{r^DjO>#b-=91^;oHR#gHk-`| z005*|F&zK^z%oHn1ptr;NfiJ}aihWQe!f_n3aR~ucaiwk7*7Fo4PqFIo@bEyR(a3ZdV3}I2 zMw^?PzxGK$>#u z@v*R9%bcp?I6ptZec>{3+fns{Wq7{>DH=yyze#{B%S>tAz&1RA91^0>c&nhc&{^I&jc`g8!jj^Zy^Ta~*|3wO&Ju@6-8B6mp#sFq#hj|FA*X0NriZ$`{RjVJm~R7s8M#QRGKbwJ`b{Hh z$jyS`xqa&O`og~3+gk&X=vS}T|IB9%Gy3KK@Z4hDTw{=myH=h3rjgXQ?$~toHQgK`WNjp?dM>{!)iaP>2yl{exI7nCT(nNP_x;jo12@T<5AxQ%&YK_xL&XS z`~>&0{$$mSD<4-j3QxOH?eMlAF3a<|OrH}GxtLRh<@5dhO?P*9njzD zMVd~hL`1p&%@g6Fe$@P8c-}EMWe_|T-e%Q}+DSh`K>t@?I z5tYlND(icgroYc=x_{j~&!g?_?bzXeoU^kt+S=OE6lF9WUn9$MVT&Y6kv3HmnSV{w zw(N7lBNs{auO*)>Y=2L`TCGyGTBXy|Q|5!Jyo;MF3|`1dLr~Vk6p`U;+On$VMp=E> zcuqt)v(Odi`#!Z=Evqg>Rf)oM!coz`tx45!9P&Jmn$70IvFUV5gTa72&!elWD|&x_ zrKR;V>r;4Tj)X3}GSFY<)xm+gC^M37D`bJgU(sCk8)UlTL6J6?#RVS$) zZ&}uIdP)7W%JMA57cMJOH?F*nCI5=WA{`tYknj8S^72By@6-PN{?GBXwKZjZgMOwT zgsG-=>A&C`LQ%(}?yy9c$>UwxE-InOSZa?qHl9~cMPuc8?KjI(fI9AaOQjMu8VzbR z8Z?#QPWv&!O=HgMLoQVtILWP zcc}o$lqOY?rRJixWw(>%7^`g3l6f-v;629EA8*~H7yw|AHFv7;8|E+VYzUf74EYAFo8?Q(yAPovSubQoZnsIUAXsagz))E+xKJElW`oUr!kKL9`;A*liY zNQ9&c03Z>PDgb~)u@9;a4-a+50RXTR78a=U;e4P7V5e#-I6bjVobf{9Pm<|O% zsfDBp008M>P89$^A|zD+0Ev)P0RSXIQUw5z=wDgs&7ovhX!igB002ovPDHLkV1k1D BB3A$a diff --git a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.html b/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.html deleted file mode 100644 index fb33954..0000000 --- a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - -Arduino {code}racer API: Methods - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- - -
- - - - - - - - - - - - - - -

-Functions

void CodeRacer::set_leds_left_stop_frwd_right (ledstate leftled, ledstate stopled, ledstate frwdled, ledstate rightled)
 Sets all of the 4 LEDs to a ledstate (LEDON, LEDOFF) More...
 
void CodeRacer::set_leds_all (ledstate alleds)
 Sets all of the 4 LEDs to the same ledstate (LEDON, LEDOFF) More...
 
void CodeRacer::set_leds_all_off ()
 Sets all of the 4 LEDs to the ledstate LEDOFF. More...
 
void CodeRacer::set_leds_all_on ()
 Sets all of the 4 LEDs to the ledstate LEDON. More...
 
-

Detailed Description

-

Function Documentation

- -

◆ set_leds_left_stop_frwd_right()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CodeRacer::set_leds_left_stop_frwd_right (ledstate leftled,
ledstate stopled,
ledstate frwdled,
ledstate rightled 
)
-
- -

Sets all of the 4 LEDs to a ledstate (LEDON, LEDOFF)

-
Parameters
- - - - - -
leftledset state of status left LED (most left yellow led)
stopledset state of status stop LED (red led)
frwdledset state of status forward LED (green or blue led)
rightledset state of status right LED (most right yellow led)
-
-
-
Returns
nothing
- -

Definition at line 1037 of file CodeRacer.cpp.

-
1037  {
1038  digitalWrite(_led_left_pin, leftled);
1039  digitalWrite(_led_frwd_pin, frwdled);
1040  digitalWrite(_led_right_pin, rightled);
1041  digitalWrite(_led_stop_pin, stopled);
1042 }
-
-
- -

◆ set_leds_all()

- -
-
- - - - - - - - -
void CodeRacer::set_leds_all (ledstate alleds)
-
- -

Sets all of the 4 LEDs to the same ledstate (LEDON, LEDOFF)

-
Parameters
- - -
alledsset state to all status LEDs
-
-
-
Returns
nothing
- -

Definition at line 1048 of file CodeRacer.cpp.

-
1048  {
1049  digitalWrite(_led_left_pin, alleds);
1050  digitalWrite(_led_frwd_pin, alleds);
1051  digitalWrite(_led_right_pin, alleds);
1052  digitalWrite(_led_stop_pin, alleds);
1053 }
-
-
- -

◆ set_leds_all_off()

- -
-
- - - - - - - -
void CodeRacer::set_leds_all_off ()
-
- -

Sets all of the 4 LEDs to the ledstate LEDOFF.

-
Returns
nothing
- -

Definition at line 1058 of file CodeRacer.cpp.

-
1058  {
1059  set_leds_all(LEDOFF);
1060 }
-
-
- -

◆ set_leds_all_on()

- -
-
- - - - - - - -
void CodeRacer::set_leds_all_on ()
-
- -

Sets all of the 4 LEDs to the ledstate LEDON.

-
Returns
nothing
- -

Definition at line 1065 of file CodeRacer.cpp.

-
1065  {
1066  set_leds_all(LEDON);
1067 }
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.js b/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.js deleted file mode 100644 index b215041..0000000 --- a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.js +++ /dev/null @@ -1,7 +0,0 @@ -var group__lowerlevelledmeths = -[ - [ "set_leds_left_stop_frwd_right", "dd/dff/group__lowerlevelledmeths.html#gab2514ca3994de3d64337dd6536fa6ef3", null ], - [ "set_leds_all", "dd/dff/group__lowerlevelledmeths.html#gab4319e66963b1b71a34370d73962fa78", null ], - [ "set_leds_all_off", "dd/dff/group__lowerlevelledmeths.html#gaa3f2ad08103127f2cb49344c33b666ea", null ], - [ "set_leds_all_on", "dd/dff/group__lowerlevelledmeths.html#ga0c8b3d6ce992e1dcfd13fd86c9f89846", null ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.map b/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.map deleted file mode 100644 index e62e212..0000000 --- a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.md5 b/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.md5 deleted file mode 100644 index 68186e4..0000000 --- a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.md5 +++ /dev/null @@ -1 +0,0 @@ -92c6efd7535f583cf9e0049790e5e563 \ No newline at end of file diff --git a/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.png b/Doku/Doxygen/html/dd/dff/group__lowerlevelledmeths.png deleted file mode 100644 index 656cf7400bbc02e1579a4a88d6dfba6acd2de150..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1161 zcmV;41a|w0P)}F-|(V={GQOae&Q{g~`F0#KpnE$%XI% zT#PFi1{l=DKXD*1m>7+I2IHm)i&0|;Exc0+mR_&42iN0$eu>FT+xyd&K370GM@L7xyO2m*TU#g=i@xhPXGKItU|1265g1lPWCVs45g9>ASXq{( zq8jBU)vus>W$Q#gLEGq}s_mq{KTMI$W@D{aU2anK$Z%veW&M8N_a|tZXujP^;BYE|>B0@-jGfg+f7d z&nT*?gw^nGZ1+v$z4(G&`;{NwChUbgZa+lrCe84105H;jZ{J17VYn{8?Zea~DoYAZoh--^%J*lzmW9{WYK_9FDnJ`zmh(wT6{PMYUSR<>e)8+lFOX z!rQ=fI<5WNM8bq>5YgO|h{~|g-JY_r@*7_JJtq`pbfe<7VcdG+v@1FmqIKT-z1ye^ z6WM-+4U?dHf}Raibv^-LVPOHeTn@Qh4&UG3xVX4LrBXqo(HPYIzfH2sZo|TcNl-n0 zpFoCfKMvvdS?Ru2Ao3ID{n>7}QLoogE|>B6_=x%WdDym%#l=N@eSJ-_x1-$t>%LV> zsz#%MVzKD^eO7#eoo3GR@-hmA0v;Y7@b>nGQmKSgDus=W4c%R%7#LPG(^gkkad2>e zZnw+PjNuqoL}Ubp6%iSMVMRnnU|1265g1lPWCY - - - - - - -Arduino {code}racer API: C:/Users/jnoack/Documents/Arduino/libraries/CodeRacer Directory Reference - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
-
CodeRacer Directory Reference
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/dir_481cc946b8a81b8d9363a4aad6201160.html b/Doku/Doxygen/html/dir_481cc946b8a81b8d9363a4aad6201160.html deleted file mode 100644 index 61a2784..0000000 --- a/Doku/Doxygen/html/dir_481cc946b8a81b8d9363a4aad6201160.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - -Arduino {code}racer API: C:/Users/jnoack/Documents/Arduino/libraries Directory Reference - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
-
libraries Directory Reference
-
-
- - -

-Directories

-
-
- - - - diff --git a/Doku/Doxygen/html/dir_a991eec27578c865874ede3d8ec657c2.html b/Doku/Doxygen/html/dir_a991eec27578c865874ede3d8ec657c2.html deleted file mode 100644 index b1fe5c0..0000000 --- a/Doku/Doxygen/html/dir_a991eec27578c865874ede3d8ec657c2.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -Arduino {code}racer API: C:/Users/jnoack/Documents/Arduino Directory Reference - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
-
Arduino Directory Reference
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/doc.png b/Doku/Doxygen/html/doc.png deleted file mode 100644 index 17edabff95f7b8da13c9516a04efe05493c29501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/Doku/Doxygen/html/doxygen.css b/Doku/Doxygen/html/doxygen.css deleted file mode 100644 index 4f1ab91..0000000 --- a/Doku/Doxygen/html/doxygen.css +++ /dev/null @@ -1,1596 +0,0 @@ -/* The standard CSS for doxygen 1.8.13 */ - -body, table, div, p, dl { - font: 400 14px/22px Roboto,sans-serif; -} - -p.reference, p.definition { - 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: 0px; - 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; -} - -.lineno { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -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 */ - -.memtitle { - padding: 8px; - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - margin-bottom: -1px; - background-image: url('nav_f.png'); - background-repeat: repeat-x; - background-color: #E2E8F2; - line-height: 1.25; - font-weight: 300; - float:left; -} - -.permalink -{ - font-size: 65%; - display: inline-block; - vertical-align: middle; -} - -.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: 400; - 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-color: #DFE5F1; - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 4px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 4px; - -} - -.overload { - font-family: "courier new",courier,monospace; - font-size: 65%; -} - -.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; - font-weight: 400; - -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; -} - -.plantumlgraph -{ - 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; - } -} - -/* @group Markdown */ - -/* -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.markdownTableHead tr { -} - -table.markdownTableBodyLeft td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft { - text-align: left -} - -th.markdownTableHeadRight { - text-align: right -} - -th.markdownTableHeadCenter { - text-align: center -} -*/ - -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.markdownTable tr { -} - -th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft, td.markdownTableBodyLeft { - text-align: left -} - -th.markdownTableHeadRight, td.markdownTableBodyRight { - text-align: right -} - -th.markdownTableHeadCenter, td.markdownTableBodyCenter { - text-align: center -} - - -/* @end */ diff --git a/Doku/Doxygen/html/doxygen.png b/Doku/Doxygen/html/doxygen.png deleted file mode 100644 index 3ff17d807fd8aa003bed8bb2a69e8f0909592fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3779 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 diff --git a/Doku/Doxygen/html/dynsections.js b/Doku/Doxygen/html/dynsections.js deleted file mode 100644 index 1e6bf07..0000000 --- a/Doku/Doxygen/html/dynsections.js +++ /dev/null @@ -1,104 +0,0 @@ -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 (la9#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 diff --git a/Doku/Doxygen/html/graph_legend.html b/Doku/Doxygen/html/graph_legend.html deleted file mode 100644 index c42ce5b..0000000 --- a/Doku/Doxygen/html/graph_legend.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -Arduino {code}racer API: Graph Legend - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
-
Graph Legend
-
-
-

This page explains how to interpret the graphs that are generated by doxygen.

-

Consider the following example:

/*! Invisible class because of truncation */
class Invisible { };
/*! Truncated class, inheritance relation is hidden */
class Truncated : public Invisible { };
/* Class not documented with doxygen comments */
class Undocumented { };
/*! Class that is inherited using public inheritance */
class PublicBase : public Truncated { };
/*! A template class */
template<class T> class Templ { };
/*! Class that is inherited using protected inheritance */
class ProtectedBase { };
/*! Class that is inherited using private inheritance */
class PrivateBase { };
/*! Class that is used by the Inherited class */
class Used { };
/*! Super class that inherits a number of other classes */
class Inherited : public PublicBase,
protected ProtectedBase,
private PrivateBase,
public Undocumented,
public Templ<int>
{
private:
Used *m_usedClass;
};

This will result in the following graph:

-
- -
-

The boxes in the above graph have the following meaning:

-
    -
  • -A filled gray box represents the struct or class for which the graph is generated.
  • -
  • -A box with a black border denotes a documented struct or class.
  • -
  • -A box with a gray border denotes an undocumented struct or class.
  • -
  • -A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • -
-

The arrows have the following meaning:

-
    -
  • -A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • -
  • -A dark green arrow is used for protected inheritance.
  • -
  • -A dark red arrow is used for private inheritance.
  • -
  • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • -
  • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • -
-
-
- - - - diff --git a/Doku/Doxygen/html/graph_legend.md5 b/Doku/Doxygen/html/graph_legend.md5 deleted file mode 100644 index a06ed05..0000000 --- a/Doku/Doxygen/html/graph_legend.md5 +++ /dev/null @@ -1 +0,0 @@ -387ff8eb65306fa251338d3c9bd7bfff \ No newline at end of file diff --git a/Doku/Doxygen/html/graph_legend.png b/Doku/Doxygen/html/graph_legend.png deleted file mode 100644 index e303709fb4d0c5c52d75be3eec6277bb45e4a3da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14975 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 - - - - - - -Arduino {code}racer API: Main Page - - - - - - - - - - - - - - -
-
- - - - - - - -
-
Arduino {code}racer API -
-
... better know the details.
-
-
- - - - - - - -
-
- -
-
-
- -
- -
-
- - -
- -
- -
-
-
Arduino {code}racer API Documentation
-
-
-
-
- - - - diff --git a/Doku/Doxygen/html/jquery.js b/Doku/Doxygen/html/jquery.js deleted file mode 100644 index f5343ed..0000000 --- a/Doku/Doxygen/html/jquery.js +++ /dev/null @@ -1,87 +0,0 @@ -/*! - * 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=$(' - - -
-
-
Modules
-
-
-
Here is a list of all modules:
-
[detail level 12]
- - - - - - - - - - - - - - - -
 Higher level methods, setters and getters
 Methods
 Getters and setters
 Lower level fun stuff methods
 Lower level servo drive methods and getters
 Methods
 Getters
 Lower level ultra sonic methods and getters
 Methods
 Setters and getters
 Lower level drives methods and getters
 Methods
 Getters
 Lower level LED methods
 Methods
- - - - - - - diff --git a/Doku/Doxygen/html/modules.js b/Doku/Doxygen/html/modules.js deleted file mode 100644 index 457b22f..0000000 --- a/Doku/Doxygen/html/modules.js +++ /dev/null @@ -1,9 +0,0 @@ -var modules = -[ - [ "Higher level methods, setters and getters", "d9/d80/group__higherlevel.html", "d9/d80/group__higherlevel" ], - [ "Lower level fun stuff methods", "d8/d7a/group__lowerlevelfun.html", "d8/d7a/group__lowerlevelfun" ], - [ "Lower level servo drive methods and getters", "d3/d17/group__lowerlevelservo.html", "d3/d17/group__lowerlevelservo" ], - [ "Lower level ultra sonic methods and getters", "da/daf/group__lowerlevelus.html", "da/daf/group__lowerlevelus" ], - [ "Lower level drives methods and getters", "d6/d98/group__lowerleveldrives.html", "d6/d98/group__lowerleveldrives" ], - [ "Lower level LED methods", "d7/d0f/group__lowerlevelled.html", "d7/d0f/group__lowerlevelled" ] -]; \ No newline at end of file diff --git a/Doku/Doxygen/html/nav_f.png b/Doku/Doxygen/html/nav_f.png deleted file mode 100644 index 72a58a529ed3a9ed6aa0c51a79cf207e026deee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U diff --git a/Doku/Doxygen/html/nav_g.png b/Doku/Doxygen/html/nav_g.png deleted file mode 100644 index 2093a237a94f6c83e19ec6e5fd42f7ddabdafa81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL=0 ? varName.substring(i+1) : varName; - return eval(n.replace(/\-/g,'_')); -} - -function stripPath(uri) -{ - return uri.substring(uri.lastIndexOf('/')+1); -} - -function stripPath2(uri) -{ - var i = uri.lastIndexOf('/'); - var s = uri.substring(i+1); - var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); - return m ? uri.substring(i-6) : s; -} - -function hashValue() -{ - return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); -} - -function hashUrl() -{ - return '#'+hashValue(); -} - -function pathName() -{ - return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); -} - -function localStorageSupported() -{ - try { - return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; - } - catch(e) { - return false; - } -} - - -function storeLink(link) -{ - if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { - window.localStorage.setItem('navpath',link); - } -} - -function deleteLink() -{ - if (localStorageSupported()) { - window.localStorage.setItem('navpath',''); - } -} - -function cachedLink() -{ - if (localStorageSupported()) { - return window.localStorage.getItem('navpath'); - } else { - return ''; - } -} - -function getScript(scriptName,func,show) -{ - var head = document.getElementsByTagName("head")[0]; - var script = document.createElement('script'); - script.id = scriptName; - script.type = 'text/javascript'; - script.onload = func; - script.src = scriptName+'.js'; - if ($.browser.msie && $.browser.version<=8) { - // script.onload does not work with older versions of IE - script.onreadystatechange = function() { - if (script.readyState=='complete' || script.readyState=='loaded') { - func(); if (show) showRoot(); - } - } - } - head.appendChild(script); -} - -function createIndent(o,domNode,node,level) -{ - var level=-1; - var n = node; - while (n.parentNode) { level++; n=n.parentNode; } - if (node.childrenData) { - var imgNode = document.createElement("span"); - imgNode.className = 'arrow'; - imgNode.style.paddingLeft=(16*level).toString()+'px'; - imgNode.innerHTML=arrowRight; - node.plus_img = imgNode; - node.expandToggle = document.createElement("a"); - node.expandToggle.href = "javascript:void(0)"; - node.expandToggle.onclick = function() { - if (node.expanded) { - $(node.getChildrenUL()).slideUp("fast"); - node.plus_img.innerHTML=arrowRight; - node.expanded = false; - } else { - expandNode(o, node, false, false); - } - } - node.expandToggle.appendChild(imgNode); - domNode.appendChild(node.expandToggle); - } else { - var span = document.createElement("span"); - span.className = 'arrow'; - span.style.width = 16*(level+1)+'px'; - span.innerHTML = ' '; - domNode.appendChild(span); - } -} - -var animationInProgress = false; - -function gotoAnchor(anchor,aname,updateLocation) -{ - var pos, docContent = $('#doc-content'); - var ancParent = $(anchor.parent()); - if (ancParent.hasClass('memItemLeft') || - ancParent.hasClass('fieldname') || - ancParent.hasClass('fieldtype') || - ancParent.is(':header')) - { - pos = ancParent.position().top; - } else if (anchor.position()) { - pos = anchor.position().top; - } - if (pos) { - var dist = Math.abs(Math.min( - pos-docContent.offset().top, - docContent[0].scrollHeight- - docContent.height()-docContent.scrollTop())); - animationInProgress=true; - docContent.animate({ - scrollTop: pos + docContent.scrollTop() - docContent.offset().top - },Math.max(50,Math.min(500,dist)),function(){ - if (updateLocation) window.location.href=aname; - animationInProgress=false; - }); - } -} - -function newNode(o, po, text, link, childrenData, lastNode) -{ - var node = new Object(); - node.children = Array(); - node.childrenData = childrenData; - node.depth = po.depth + 1; - node.relpath = po.relpath; - node.isLast = lastNode; - - node.li = document.createElement("li"); - po.getChildrenUL().appendChild(node.li); - node.parentNode = po; - - node.itemDiv = document.createElement("div"); - node.itemDiv.className = "item"; - - node.labelSpan = document.createElement("span"); - node.labelSpan.className = "label"; - - createIndent(o,node.itemDiv,node,0); - node.itemDiv.appendChild(node.labelSpan); - node.li.appendChild(node.itemDiv); - - var a = document.createElement("a"); - node.labelSpan.appendChild(a); - node.label = document.createTextNode(text); - node.expanded = false; - a.appendChild(node.label); - if (link) { - var url; - if (link.substring(0,1)=='^') { - url = link.substring(1); - link = url; - } else { - url = node.relpath+link; - } - a.className = stripPath(link.replace('#',':')); - if (link.indexOf('#')!=-1) { - var aname = '#'+link.split('#')[1]; - var srcPage = stripPath(pathName()); - var targetPage = stripPath(link.split('#')[0]); - a.href = srcPage!=targetPage ? url : "javascript:void(0)"; - a.onclick = function(){ - storeLink(link); - if (!$(a).parent().parent().hasClass('selected')) - { - $('.item').removeClass('selected'); - $('.item').removeAttr('id'); - $(a).parent().parent().addClass('selected'); - $(a).parent().parent().attr('id','selected'); - } - var anchor = $(aname); - gotoAnchor(anchor,aname,true); - }; - } else { - a.href = url; - a.onclick = function() { storeLink(link); } - } - } else { - if (childrenData != null) - { - a.className = "nolink"; - a.href = "javascript:void(0)"; - a.onclick = node.expandToggle.onclick; - } - } - - node.childrenUL = null; - node.getChildrenUL = function() { - if (!node.childrenUL) { - node.childrenUL = document.createElement("ul"); - node.childrenUL.className = "children_ul"; - node.childrenUL.style.display = "none"; - node.li.appendChild(node.childrenUL); - } - return node.childrenUL; - }; - - return node; -} - -function showRoot() -{ - var headerHeight = $("#top").height(); - var footerHeight = $("#nav-path").height(); - var windowHeight = $(window).height() - headerHeight - footerHeight; - (function (){ // retry until we can scroll to the selected item - try { - var navtree=$('#nav-tree'); - navtree.scrollTo('#selected',0,{offset:-windowHeight/2}); - } catch (err) { - setTimeout(arguments.callee, 0); - } - })(); -} - -function expandNode(o, node, imm, showRoot) -{ - if (node.childrenData && !node.expanded) { - if (typeof(node.childrenData)==='string') { - var varName = node.childrenData; - getScript(node.relpath+varName,function(){ - node.childrenData = getData(varName); - expandNode(o, node, imm, showRoot); - }, showRoot); - } else { - if (!node.childrenVisited) { - getNode(o, node); - } if (imm || ($.browser.msie && $.browser.version>8)) { - // somehow slideDown jumps to the start of tree for IE9 :-( - $(node.getChildrenUL()).show(); - } else { - $(node.getChildrenUL()).slideDown("fast"); - } - node.plus_img.innerHTML = arrowDown; - node.expanded = true; - } - } -} - -function glowEffect(n,duration) -{ - n.addClass('glow').delay(duration).queue(function(next){ - $(this).removeClass('glow');next(); - }); -} - -function highlightAnchor() -{ - var aname = hashUrl(); - var anchor = $(aname); - if (anchor.parent().attr('class')=='memItemLeft'){ - var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); - glowEffect(rows.children(),300); // member without details - } else if (anchor.parent().attr('class')=='fieldname'){ - glowEffect(anchor.parent().parent(),1000); // enum value - } else if (anchor.parent().attr('class')=='fieldtype'){ - glowEffect(anchor.parent().parent(),1000); // struct field - } else if (anchor.parent().is(":header")) { - glowEffect(anchor.parent(),1000); // section header - } else { - glowEffect(anchor.next(),1000); // normal member - } - gotoAnchor(anchor,aname,false); -} - -function selectAndHighlight(hash,n) -{ - var a; - if (hash) { - var link=stripPath(pathName())+':'+hash.substring(1); - a=$('.item a[class$="'+link+'"]'); - } - if (a && a.length) { - a.parent().parent().addClass('selected'); - a.parent().parent().attr('id','selected'); - highlightAnchor(); - } else if (n) { - $(n.itemDiv).addClass('selected'); - $(n.itemDiv).attr('id','selected'); - } - if ($('#nav-tree-contents .item:first').hasClass('selected')) { - $('#nav-sync').css('top','30px'); - } else { - $('#nav-sync').css('top','5px'); - } - showRoot(); -} - -function showNode(o, node, index, hash) -{ - if (node && node.childrenData) { - if (typeof(node.childrenData)==='string') { - var varName = node.childrenData; - getScript(node.relpath+varName,function(){ - node.childrenData = getData(varName); - showNode(o,node,index,hash); - },true); - } else { - if (!node.childrenVisited) { - getNode(o, node); - } - $(node.getChildrenUL()).css({'display':'block'}); - node.plus_img.innerHTML = arrowDown; - node.expanded = true; - var n = node.children[o.breadcrumbs[index]]; - if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); - else hash=''; - } - if (hash.match(/^#l\d+$/)) { - var anchor=$('a[name='+hash.substring(1)+']'); - glowEffect(anchor.parent(),1000); // line number - hash=''; // strip line number anchors - } - var url=root+hash; - var i=-1; - while (NAVTREEINDEX[i+1]<=url) i++; - if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index - if (navTreeSubIndices[i]) { - gotoNode(o,i,root,hash,relpath) - } else { - getScript(relpath+'navtreeindex'+i,function(){ - navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); - if (navTreeSubIndices[i]) { - gotoNode(o,i,root,hash,relpath); - } - },true); - } -} - -function showSyncOff(n,relpath) -{ - n.html(''); -} - -function showSyncOn(n,relpath) -{ - n.html(''); -} - -function toggleSyncButton(relpath) -{ - var navSync = $('#nav-sync'); - if (navSync.hasClass('sync')) { - navSync.removeClass('sync'); - showSyncOff(navSync,relpath); - storeLink(stripPath2(pathName())+hashUrl()); - } else { - navSync.addClass('sync'); - showSyncOn(navSync,relpath); - deleteLink(); - } -} - -function initNavTree(toroot,relpath) -{ - var o = new Object(); - o.toroot = toroot; - o.node = new Object(); - o.node.li = document.getElementById("nav-tree-contents"); - o.node.childrenData = NAVTREE; - o.node.children = new Array(); - o.node.childrenUL = document.createElement("ul"); - o.node.getChildrenUL = function() { return o.node.childrenUL; }; - o.node.li.appendChild(o.node.childrenUL); - o.node.depth = 0; - o.node.relpath = relpath; - o.node.expanded = false; - o.node.isLast = true; - o.node.plus_img = document.createElement("span"); - o.node.plus_img.className = 'arrow'; - o.node.plus_img.innerHTML = arrowRight; - - if (localStorageSupported()) { - var navSync = $('#nav-sync'); - if (cachedLink()) { - showSyncOff(navSync,relpath); - navSync.removeClass('sync'); - } else { - showSyncOn(navSync,relpath); - } - navSync.click(function(){ toggleSyncButton(relpath); }); - } - - $(window).load(function(){ - navTo(o,toroot,hashUrl(),relpath); - showRoot(); - }); - - $(window).bind('hashchange', function(){ - if (window.location.hash && window.location.hash.length>1){ - var a; - if ($(location).attr('hash')){ - var clslink=stripPath(pathName())+':'+hashValue(); - a=$('.item a[class$="'+clslink.replace(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM=desktop_vp) { - if (!collapsed) { - collapseExpand(); - } - } else if (width>desktop_vp && collapsedWidth0) { - restoreWidth(0); - collapsed=true; - } - else { - var width = readCookie('width'); - if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } - collapsed=false; - } - } - - header = $("#top"); - sidenav = $("#side-nav"); - content = $("#doc-content"); - navtree = $("#nav-tree"); - footer = $("#nav-path"); - $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); - $(sidenav).resizable({ minWidth: 0 }); - $(window).resize(function() { resizeHeight(); }); - var device = navigator.userAgent.toLowerCase(); - var touch_device = device.match(/(iphone|ipod|ipad|android)/); - if (touch_device) { /* wider split bar for touch only devices */ - $(sidenav).css({ paddingRight:'20px' }); - $('.ui-resizable-e').css({ width:'20px' }); - $('#nav-sync').css({ right:'34px' }); - barWidth=20; - } - var width = readCookie('width'); - if (width) { restoreWidth(width); } else { resizeWidth(); } - resizeHeight(); - var url = location.href; - var i=url.indexOf("#"); - if (i>=0) window.location.hash=url.substr(i); - var _preventDefault = function(evt) { evt.preventDefault(); }; - $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); - $(".ui-resizable-handle").dblclick(collapseExpand); - $(window).load(resizeHeight); -} - - diff --git a/Doku/Doxygen/html/search/all_0.html b/Doku/Doxygen/html/search/all_0.html deleted file mode 100644 index f25360b..0000000 --- a/Doku/Doxygen/html/search/all_0.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_0.js b/Doku/Doxygen/html/search/all_0.js deleted file mode 100644 index 8c13bd9..0000000 --- a/Doku/Doxygen/html/search/all_0.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['drive_5fbackward',['drive_backward',['../d2/d40/group__higherlevelmeths.html#ga98aa8a5a46f769d59e6c1067c8418cfb',1,'CodeRacer::drive_backward()'],['../d2/d40/group__higherlevelmeths.html#ga6cd8356ac76360b014db6170276b6b30',1,'CodeRacer::drive_backward(uint8_t left_speed, uint8_t right_speed)']]], - ['drive_5fforward',['drive_forward',['../d2/d40/group__higherlevelmeths.html#ga8be6a850099812153dcf5768d7fc8b8c',1,'CodeRacer::drive_forward()'],['../d2/d40/group__higherlevelmeths.html#gaae6fc379ec43cbe2cb2f63fbd12dbe0d',1,'CodeRacer::drive_forward(uint8_t left_speed, uint8_t right_speed)']]], - ['drive_5fleft_5fspeed',['drive_left_speed',['../d0/d0a/group__lowerleveldrivesgetters.html#ga804a45724f3788fd2fdb9631c66d1377',1,'CodeRacer']]], - ['drive_5fright_5fspeed',['drive_right_speed',['../d0/d0a/group__lowerleveldrivesgetters.html#ga09359a792e3299b1c20f6b99939ea7b3',1,'CodeRacer']]], - ['drives_5fsettings',['drives_settings',['../d1/d8a/group__lowerleveldrivesmeths.html#ga5812df751da5b480240ccd633c515b83',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/all_1.html b/Doku/Doxygen/html/search/all_1.html deleted file mode 100644 index b13f0f7..0000000 --- a/Doku/Doxygen/html/search/all_1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_1.js b/Doku/Doxygen/html/search/all_1.js deleted file mode 100644 index cc2645a..0000000 --- a/Doku/Doxygen/html/search/all_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['getters_20and_20setters',['Getters and setters',['../d7/d45/group__higherlevelgetters.html',1,'']]], - ['getters',['Getters',['../d0/d0a/group__lowerleveldrivesgetters.html',1,'']]], - ['getters',['Getters',['../d4/df4/group__lowerlevelservogetters.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/all_2.html b/Doku/Doxygen/html/search/all_2.html deleted file mode 100644 index 9543c57..0000000 --- a/Doku/Doxygen/html/search/all_2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_2.js b/Doku/Doxygen/html/search/all_2.js deleted file mode 100644 index 51cafb8..0000000 --- a/Doku/Doxygen/html/search/all_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['higher_20level_20methods_2c_20setters_20and_20getters',['Higher level methods, setters and getters',['../d9/d80/group__higherlevel.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/all_3.html b/Doku/Doxygen/html/search/all_3.html deleted file mode 100644 index 03405c0..0000000 --- a/Doku/Doxygen/html/search/all_3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_3.js b/Doku/Doxygen/html/search/all_3.js deleted file mode 100644 index e1d5c34..0000000 --- a/Doku/Doxygen/html/search/all_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['is_5factive',['is_active',['../d7/d45/group__higherlevelgetters.html#gaa0ab4d6a754a23ea13664a553bcc8ff2',1,'CodeRacer']]], - ['is_5fdriving',['is_driving',['../d7/d45/group__higherlevelgetters.html#ga33dcd96e9b12dec794c56be85ec1ee05',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/all_4.html b/Doku/Doxygen/html/search/all_4.html deleted file mode 100644 index 8e1f4b9..0000000 --- a/Doku/Doxygen/html/search/all_4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_4.js b/Doku/Doxygen/html/search/all_4.js deleted file mode 100644 index 2115eb7..0000000 --- a/Doku/Doxygen/html/search/all_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['kitt',['kitt',['../d8/d7a/group__lowerlevelfun.html#ga3b6f819fb82d910888fbc87abff1470c',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/all_5.html b/Doku/Doxygen/html/search/all_5.html deleted file mode 100644 index 89a879e..0000000 --- a/Doku/Doxygen/html/search/all_5.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_5.js b/Doku/Doxygen/html/search/all_5.js deleted file mode 100644 index b9240a2..0000000 --- a/Doku/Doxygen/html/search/all_5.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['look_5faround',['look_around',['../d8/d7a/group__lowerlevelfun.html#ga04309a38252639a8eaa43809c04c11c8',1,'CodeRacer']]], - ['lower_20level_20drives_20methods_20and_20getters',['Lower level drives methods and getters',['../d6/d98/group__lowerleveldrives.html',1,'']]], - ['lower_20level_20fun_20stuff_20methods',['Lower level fun stuff methods',['../d8/d7a/group__lowerlevelfun.html',1,'']]], - ['lower_20level_20led_20methods',['Lower level LED methods',['../d7/d0f/group__lowerlevelled.html',1,'']]], - ['lower_20level_20servo_20drive_20methods_20and_20getters',['Lower level servo drive methods and getters',['../d3/d17/group__lowerlevelservo.html',1,'']]], - ['lower_20level_20ultra_20sonic_20methods_20and_20getters',['Lower level ultra sonic methods and getters',['../da/daf/group__lowerlevelus.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/all_6.html b/Doku/Doxygen/html/search/all_6.html deleted file mode 100644 index 6afac06..0000000 --- a/Doku/Doxygen/html/search/all_6.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_6.js b/Doku/Doxygen/html/search/all_6.js deleted file mode 100644 index de441f6..0000000 --- a/Doku/Doxygen/html/search/all_6.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['methods',['Methods',['../d2/d40/group__higherlevelmeths.html',1,'']]], - ['methods',['Methods',['../d1/d8a/group__lowerleveldrivesmeths.html',1,'']]], - ['methods',['Methods',['../dd/dff/group__lowerlevelledmeths.html',1,'']]], - ['methods',['Methods',['../db/dd5/group__lowerlevelservomeths.html',1,'']]], - ['methods',['Methods',['../d6/dfc/group__lowerlevelusmeths.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/all_7.html b/Doku/Doxygen/html/search/all_7.html deleted file mode 100644 index de19107..0000000 --- a/Doku/Doxygen/html/search/all_7.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_7.js b/Doku/Doxygen/html/search/all_7.js deleted file mode 100644 index a4c8366..0000000 --- a/Doku/Doxygen/html/search/all_7.js +++ /dev/null @@ -1,34 +0,0 @@ -var searchData= -[ - ['setters_20and_20getters',['Setters and getters',['../db/ddd/group__lowerlevelusgetters.html',1,'']]], - ['servo_5fposition',['servo_position',['../d4/df4/group__lowerlevelservogetters.html#ga451b3ecd272e9a11de4b221f8d771432',1,'CodeRacer']]], - ['servo_5fposition_5feta_5fin_5fms',['servo_position_eta_in_ms',['../d4/df4/group__lowerlevelservogetters.html#ga84ba256b9ccdf0e9f4280279da68a509',1,'CodeRacer']]], - ['servo_5fposition_5fset_5fat_5fms',['servo_position_set_at_ms',['../d4/df4/group__lowerlevelservogetters.html#gaeed05a3d4e06adccebdfce207b734b2f',1,'CodeRacer']]], - ['servo_5fset_5fposition',['servo_set_position',['../db/dd5/group__lowerlevelservomeths.html#gab8831340049de6dbddeda997745725e6',1,'CodeRacer']]], - ['servo_5fset_5fposition_5fwait',['servo_set_position_wait',['../db/dd5/group__lowerlevelservomeths.html#ga0149226288bff2290d52ed1cbd674edd',1,'CodeRacer']]], - ['servo_5fset_5fto_5fcenter',['servo_set_to_center',['../db/dd5/group__lowerlevelservomeths.html#gad1f28aa91079e88fc3093e3074edfb32',1,'CodeRacer']]], - ['servo_5fset_5fto_5fleft',['servo_set_to_left',['../db/dd5/group__lowerlevelservomeths.html#gaef7d1903b65a0a8ab4fafdc53080b07d',1,'CodeRacer']]], - ['servo_5fset_5fto_5fright',['servo_set_to_right',['../db/dd5/group__lowerlevelservomeths.html#gaac73bf99cf2d19f7b1987156aa842b74',1,'CodeRacer']]], - ['servo_5fsettings',['servo_settings',['../db/dd5/group__lowerlevelservomeths.html#ga687beb327e20f4d0541d1ac9e29c01c3',1,'CodeRacer']]], - ['servo_5fsweep',['servo_sweep',['../db/dd5/group__lowerlevelservomeths.html#ga1e9afe1f27dfc9796b4c9b3dba245365',1,'CodeRacer']]], - ['set_5factive',['set_active',['../d7/d45/group__higherlevelgetters.html#ga415c69930f291d5e06b7211b31843310',1,'CodeRacer']]], - ['set_5fdrive_5fleft_5fspeed',['set_drive_left_speed',['../d1/d8a/group__lowerleveldrivesmeths.html#ga1ee3da20ec98a821ab97ced070974861',1,'CodeRacer']]], - ['set_5fdrive_5fleft_5fstate',['set_drive_left_state',['../d1/d8a/group__lowerleveldrivesmeths.html#ga1eeb3cb47503c3011562f9c42828fab9',1,'CodeRacer']]], - ['set_5fdrive_5fright_5fspeed',['set_drive_right_speed',['../d1/d8a/group__lowerleveldrivesmeths.html#gaf8805d0d620a2fb78c576f36a2c81073',1,'CodeRacer']]], - ['set_5fdrive_5fright_5fstate',['set_drive_right_state',['../d1/d8a/group__lowerleveldrivesmeths.html#ga1b34ec9cee1f21cd15db310167a2faa5',1,'CodeRacer']]], - ['set_5fdrive_5fspeed',['set_drive_speed',['../d1/d8a/group__lowerleveldrivesmeths.html#ga5d67c84606d5b39996a99fcd6e7eb314',1,'CodeRacer']]], - ['set_5fdrive_5fstate',['set_drive_state',['../d1/d8a/group__lowerleveldrivesmeths.html#ga3b69cf4a718c842fbe758d3f4267214e',1,'CodeRacer']]], - ['set_5fdrives_5fspeed_5fleft_5fright',['set_drives_speed_left_right',['../d1/d8a/group__lowerleveldrivesmeths.html#ga3d3ffb41783d34589e33cf61fed46c70',1,'CodeRacer']]], - ['set_5fdrives_5fstates_5fleft_5fright',['set_drives_states_left_right',['../d1/d8a/group__lowerleveldrivesmeths.html#ga802d2646d9cc0d766e1ac799c7917fa8',1,'CodeRacer']]], - ['set_5fdrives_5fstop_5fleft_5fright',['set_drives_stop_left_right',['../d1/d8a/group__lowerleveldrivesmeths.html#ga61ed9e0415a62a290cc5c59a0f740304',1,'CodeRacer']]], - ['set_5finactive',['set_inactive',['../d7/d45/group__higherlevelgetters.html#ga62f1c0eea56e27d0853cb58f30eb140d',1,'CodeRacer']]], - ['set_5fleds_5fall',['set_leds_all',['../dd/dff/group__lowerlevelledmeths.html#gab4319e66963b1b71a34370d73962fa78',1,'CodeRacer']]], - ['set_5fleds_5fall_5foff',['set_leds_all_off',['../dd/dff/group__lowerlevelledmeths.html#gaa3f2ad08103127f2cb49344c33b666ea',1,'CodeRacer']]], - ['set_5fleds_5fall_5fon',['set_leds_all_on',['../dd/dff/group__lowerlevelledmeths.html#ga0c8b3d6ce992e1dcfd13fd86c9f89846',1,'CodeRacer']]], - ['set_5fleds_5fleft_5fstop_5ffrwd_5fright',['set_leds_left_stop_frwd_right',['../dd/dff/group__lowerlevelledmeths.html#gab2514ca3994de3d64337dd6536fa6ef3',1,'CodeRacer']]], - ['start_5fstop',['start_stop',['../d2/d40/group__higherlevelmeths.html#ga34e2fe2123e76fd844482dfef6c5a9c8',1,'CodeRacer']]], - ['start_5fstop_5fat_5fmin_5fdistance',['start_stop_at_min_distance',['../d2/d40/group__higherlevelmeths.html#ga128683caea019a89bce06f722ba92556',1,'CodeRacer::start_stop_at_min_distance()'],['../d2/d40/group__higherlevelmeths.html#ga64bc1b2a8ed5bc3ec5e706fa70a1385d',1,'CodeRacer::start_stop_at_min_distance(unsigned long min_distance_cm)']]], - ['stop_5fdriving',['stop_driving',['../d2/d40/group__higherlevelmeths.html#ga71df7ac5e41ae776a6c786d3dc36f35a',1,'CodeRacer']]], - ['stop_5fstop_5fat_5fmin_5fdistance',['stop_stop_at_min_distance',['../d2/d40/group__higherlevelmeths.html#gac664109241d08b8dc52db5721f394b22',1,'CodeRacer']]], - ['stopped_5fat_5fmin_5fdistance',['stopped_at_min_distance',['../d7/d45/group__higherlevelgetters.html#gae8b8c0ab24ccb572281785aeca8541e1',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/all_8.html b/Doku/Doxygen/html/search/all_8.html deleted file mode 100644 index 11e27cd..0000000 --- a/Doku/Doxygen/html/search/all_8.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_8.js b/Doku/Doxygen/html/search/all_8.js deleted file mode 100644 index cc58d20..0000000 --- a/Doku/Doxygen/html/search/all_8.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['turn_5fleft',['turn_left',['../d2/d40/group__higherlevelmeths.html#ga86b7caf6ff46e9d1ad90ed507864b175',1,'CodeRacer::turn_left()'],['../d2/d40/group__higherlevelmeths.html#ga30e1ec3fbbc206f93ea66dbf91b5fd95',1,'CodeRacer::turn_left(unsigned long turn_for_ms)'],['../d2/d40/group__higherlevelmeths.html#gae6daa587199e5bf95b1aac675de53b0e',1,'CodeRacer::turn_left(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)']]], - ['turn_5fleft_5ffor_5fms',['turn_left_for_ms',['../d7/d45/group__higherlevelgetters.html#gaf04fd16ca0e2ace656f9549c43d16459',1,'CodeRacer']]], - ['turn_5fright',['turn_right',['../d2/d40/group__higherlevelmeths.html#ga8969fb2d6e2b5ac44a99197931e6b8da',1,'CodeRacer::turn_right()'],['../d2/d40/group__higherlevelmeths.html#gae1f175aad98d773b0206f483ae0bb4ea',1,'CodeRacer::turn_right(unsigned long turn_for_ms)'],['../d2/d40/group__higherlevelmeths.html#gad10b3457489cc7e25ffb4d64c539528a',1,'CodeRacer::turn_right(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)']]], - ['turn_5fright_5ffor_5fms',['turn_right_for_ms',['../d7/d45/group__higherlevelgetters.html#gac0698f02f6a21d9d1f5b9cf2820306cf',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/all_9.html b/Doku/Doxygen/html/search/all_9.html deleted file mode 100644 index f8abbbe..0000000 --- a/Doku/Doxygen/html/search/all_9.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/all_9.js b/Doku/Doxygen/html/search/all_9.js deleted file mode 100644 index bc703b3..0000000 --- a/Doku/Doxygen/html/search/all_9.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['usonic_5fdistance_5fcm',['usonic_distance_cm',['../db/ddd/group__lowerlevelusgetters.html#gad59842c14196598e55644b2a22621454',1,'CodeRacer']]], - ['usonic_5fdistance_5fus',['usonic_distance_us',['../db/ddd/group__lowerlevelusgetters.html#ga917b90f21e731ef5f690d5198e7f4d3e',1,'CodeRacer']]], - ['usonic_5fmeasure_5fcm',['usonic_measure_cm',['../d6/dfc/group__lowerlevelusmeths.html#ga5f034198a28b069478c454c63dbfa225',1,'CodeRacer::usonic_measure_cm()'],['../d6/dfc/group__lowerlevelusmeths.html#gafdd5c75d7a8e7b7c993e512ee93dde9a',1,'CodeRacer::usonic_measure_cm(unsigned long max_echo_run_time_us)']]], - ['usonic_5fmeasure_5fsingle_5fshot_5fcm',['usonic_measure_single_shot_cm',['../d6/dfc/group__lowerlevelusmeths.html#ga0c00edbbf4a3169613c9ea84d6e7dc13',1,'CodeRacer::usonic_measure_single_shot_cm()'],['../d6/dfc/group__lowerlevelusmeths.html#gab413551ea8a67e1b60eda1671029b645',1,'CodeRacer::usonic_measure_single_shot_cm(unsigned long max_echo_run_time_us)']]], - ['usonic_5fmeasure_5fsingle_5fshot_5fus',['usonic_measure_single_shot_us',['../d6/dfc/group__lowerlevelusmeths.html#gad4309b6da17085575fb0c55559e240b8',1,'CodeRacer::usonic_measure_single_shot_us()'],['../d6/dfc/group__lowerlevelusmeths.html#ga1b5b43372082f5daeee47410a09a590c',1,'CodeRacer::usonic_measure_single_shot_us(unsigned long max_echo_run_time_us)']]], - ['usonic_5fmeasure_5fus',['usonic_measure_us',['../d6/dfc/group__lowerlevelusmeths.html#gaa01602a576fd57609bc7e08f8ef32e58',1,'CodeRacer::usonic_measure_us()'],['../d6/dfc/group__lowerlevelusmeths.html#ga1f3401ef472cb11997e7dc98ef3e2424',1,'CodeRacer::usonic_measure_us(unsigned long max_echo_run_time_us)']]], - ['usonic_5fset_5fstop_5fdistance_5fcm',['usonic_set_stop_distance_cm',['../db/ddd/group__lowerlevelusgetters.html#gaa7c5a6563a5736ed38d12f616de480df',1,'CodeRacer']]], - ['usonic_5fset_5fstop_5fdistance_5fus',['usonic_set_stop_distance_us',['../db/ddd/group__lowerlevelusgetters.html#ga2f06c193ae86c5b1cba450caf5adf146',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/close.png b/Doku/Doxygen/html/search/close.png deleted file mode 100644 index 9342d3dfeea7b7c4ee610987e717804b5a42ceb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN diff --git a/Doku/Doxygen/html/search/functions_0.html b/Doku/Doxygen/html/search/functions_0.html deleted file mode 100644 index 4e6d87d..0000000 --- a/Doku/Doxygen/html/search/functions_0.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/functions_0.js b/Doku/Doxygen/html/search/functions_0.js deleted file mode 100644 index 8c13bd9..0000000 --- a/Doku/Doxygen/html/search/functions_0.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['drive_5fbackward',['drive_backward',['../d2/d40/group__higherlevelmeths.html#ga98aa8a5a46f769d59e6c1067c8418cfb',1,'CodeRacer::drive_backward()'],['../d2/d40/group__higherlevelmeths.html#ga6cd8356ac76360b014db6170276b6b30',1,'CodeRacer::drive_backward(uint8_t left_speed, uint8_t right_speed)']]], - ['drive_5fforward',['drive_forward',['../d2/d40/group__higherlevelmeths.html#ga8be6a850099812153dcf5768d7fc8b8c',1,'CodeRacer::drive_forward()'],['../d2/d40/group__higherlevelmeths.html#gaae6fc379ec43cbe2cb2f63fbd12dbe0d',1,'CodeRacer::drive_forward(uint8_t left_speed, uint8_t right_speed)']]], - ['drive_5fleft_5fspeed',['drive_left_speed',['../d0/d0a/group__lowerleveldrivesgetters.html#ga804a45724f3788fd2fdb9631c66d1377',1,'CodeRacer']]], - ['drive_5fright_5fspeed',['drive_right_speed',['../d0/d0a/group__lowerleveldrivesgetters.html#ga09359a792e3299b1c20f6b99939ea7b3',1,'CodeRacer']]], - ['drives_5fsettings',['drives_settings',['../d1/d8a/group__lowerleveldrivesmeths.html#ga5812df751da5b480240ccd633c515b83',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/functions_1.html b/Doku/Doxygen/html/search/functions_1.html deleted file mode 100644 index b343e2d..0000000 --- a/Doku/Doxygen/html/search/functions_1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/functions_1.js b/Doku/Doxygen/html/search/functions_1.js deleted file mode 100644 index e1d5c34..0000000 --- a/Doku/Doxygen/html/search/functions_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['is_5factive',['is_active',['../d7/d45/group__higherlevelgetters.html#gaa0ab4d6a754a23ea13664a553bcc8ff2',1,'CodeRacer']]], - ['is_5fdriving',['is_driving',['../d7/d45/group__higherlevelgetters.html#ga33dcd96e9b12dec794c56be85ec1ee05',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/functions_2.html b/Doku/Doxygen/html/search/functions_2.html deleted file mode 100644 index ecce2f3..0000000 --- a/Doku/Doxygen/html/search/functions_2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/functions_2.js b/Doku/Doxygen/html/search/functions_2.js deleted file mode 100644 index 2115eb7..0000000 --- a/Doku/Doxygen/html/search/functions_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['kitt',['kitt',['../d8/d7a/group__lowerlevelfun.html#ga3b6f819fb82d910888fbc87abff1470c',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/functions_3.html b/Doku/Doxygen/html/search/functions_3.html deleted file mode 100644 index 15f06ab..0000000 --- a/Doku/Doxygen/html/search/functions_3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/functions_3.js b/Doku/Doxygen/html/search/functions_3.js deleted file mode 100644 index 01a89fd..0000000 --- a/Doku/Doxygen/html/search/functions_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['look_5faround',['look_around',['../d8/d7a/group__lowerlevelfun.html#ga04309a38252639a8eaa43809c04c11c8',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/functions_4.html b/Doku/Doxygen/html/search/functions_4.html deleted file mode 100644 index 8985ff2..0000000 --- a/Doku/Doxygen/html/search/functions_4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/functions_4.js b/Doku/Doxygen/html/search/functions_4.js deleted file mode 100644 index afc4066..0000000 --- a/Doku/Doxygen/html/search/functions_4.js +++ /dev/null @@ -1,33 +0,0 @@ -var searchData= -[ - ['servo_5fposition',['servo_position',['../d4/df4/group__lowerlevelservogetters.html#ga451b3ecd272e9a11de4b221f8d771432',1,'CodeRacer']]], - ['servo_5fposition_5feta_5fin_5fms',['servo_position_eta_in_ms',['../d4/df4/group__lowerlevelservogetters.html#ga84ba256b9ccdf0e9f4280279da68a509',1,'CodeRacer']]], - ['servo_5fposition_5fset_5fat_5fms',['servo_position_set_at_ms',['../d4/df4/group__lowerlevelservogetters.html#gaeed05a3d4e06adccebdfce207b734b2f',1,'CodeRacer']]], - ['servo_5fset_5fposition',['servo_set_position',['../db/dd5/group__lowerlevelservomeths.html#gab8831340049de6dbddeda997745725e6',1,'CodeRacer']]], - ['servo_5fset_5fposition_5fwait',['servo_set_position_wait',['../db/dd5/group__lowerlevelservomeths.html#ga0149226288bff2290d52ed1cbd674edd',1,'CodeRacer']]], - ['servo_5fset_5fto_5fcenter',['servo_set_to_center',['../db/dd5/group__lowerlevelservomeths.html#gad1f28aa91079e88fc3093e3074edfb32',1,'CodeRacer']]], - ['servo_5fset_5fto_5fleft',['servo_set_to_left',['../db/dd5/group__lowerlevelservomeths.html#gaef7d1903b65a0a8ab4fafdc53080b07d',1,'CodeRacer']]], - ['servo_5fset_5fto_5fright',['servo_set_to_right',['../db/dd5/group__lowerlevelservomeths.html#gaac73bf99cf2d19f7b1987156aa842b74',1,'CodeRacer']]], - ['servo_5fsettings',['servo_settings',['../db/dd5/group__lowerlevelservomeths.html#ga687beb327e20f4d0541d1ac9e29c01c3',1,'CodeRacer']]], - ['servo_5fsweep',['servo_sweep',['../db/dd5/group__lowerlevelservomeths.html#ga1e9afe1f27dfc9796b4c9b3dba245365',1,'CodeRacer']]], - ['set_5factive',['set_active',['../d7/d45/group__higherlevelgetters.html#ga415c69930f291d5e06b7211b31843310',1,'CodeRacer']]], - ['set_5fdrive_5fleft_5fspeed',['set_drive_left_speed',['../d1/d8a/group__lowerleveldrivesmeths.html#ga1ee3da20ec98a821ab97ced070974861',1,'CodeRacer']]], - ['set_5fdrive_5fleft_5fstate',['set_drive_left_state',['../d1/d8a/group__lowerleveldrivesmeths.html#ga1eeb3cb47503c3011562f9c42828fab9',1,'CodeRacer']]], - ['set_5fdrive_5fright_5fspeed',['set_drive_right_speed',['../d1/d8a/group__lowerleveldrivesmeths.html#gaf8805d0d620a2fb78c576f36a2c81073',1,'CodeRacer']]], - ['set_5fdrive_5fright_5fstate',['set_drive_right_state',['../d1/d8a/group__lowerleveldrivesmeths.html#ga1b34ec9cee1f21cd15db310167a2faa5',1,'CodeRacer']]], - ['set_5fdrive_5fspeed',['set_drive_speed',['../d1/d8a/group__lowerleveldrivesmeths.html#ga5d67c84606d5b39996a99fcd6e7eb314',1,'CodeRacer']]], - ['set_5fdrive_5fstate',['set_drive_state',['../d1/d8a/group__lowerleveldrivesmeths.html#ga3b69cf4a718c842fbe758d3f4267214e',1,'CodeRacer']]], - ['set_5fdrives_5fspeed_5fleft_5fright',['set_drives_speed_left_right',['../d1/d8a/group__lowerleveldrivesmeths.html#ga3d3ffb41783d34589e33cf61fed46c70',1,'CodeRacer']]], - ['set_5fdrives_5fstates_5fleft_5fright',['set_drives_states_left_right',['../d1/d8a/group__lowerleveldrivesmeths.html#ga802d2646d9cc0d766e1ac799c7917fa8',1,'CodeRacer']]], - ['set_5fdrives_5fstop_5fleft_5fright',['set_drives_stop_left_right',['../d1/d8a/group__lowerleveldrivesmeths.html#ga61ed9e0415a62a290cc5c59a0f740304',1,'CodeRacer']]], - ['set_5finactive',['set_inactive',['../d7/d45/group__higherlevelgetters.html#ga62f1c0eea56e27d0853cb58f30eb140d',1,'CodeRacer']]], - ['set_5fleds_5fall',['set_leds_all',['../dd/dff/group__lowerlevelledmeths.html#gab4319e66963b1b71a34370d73962fa78',1,'CodeRacer']]], - ['set_5fleds_5fall_5foff',['set_leds_all_off',['../dd/dff/group__lowerlevelledmeths.html#gaa3f2ad08103127f2cb49344c33b666ea',1,'CodeRacer']]], - ['set_5fleds_5fall_5fon',['set_leds_all_on',['../dd/dff/group__lowerlevelledmeths.html#ga0c8b3d6ce992e1dcfd13fd86c9f89846',1,'CodeRacer']]], - ['set_5fleds_5fleft_5fstop_5ffrwd_5fright',['set_leds_left_stop_frwd_right',['../dd/dff/group__lowerlevelledmeths.html#gab2514ca3994de3d64337dd6536fa6ef3',1,'CodeRacer']]], - ['start_5fstop',['start_stop',['../d2/d40/group__higherlevelmeths.html#ga34e2fe2123e76fd844482dfef6c5a9c8',1,'CodeRacer']]], - ['start_5fstop_5fat_5fmin_5fdistance',['start_stop_at_min_distance',['../d2/d40/group__higherlevelmeths.html#ga128683caea019a89bce06f722ba92556',1,'CodeRacer::start_stop_at_min_distance()'],['../d2/d40/group__higherlevelmeths.html#ga64bc1b2a8ed5bc3ec5e706fa70a1385d',1,'CodeRacer::start_stop_at_min_distance(unsigned long min_distance_cm)']]], - ['stop_5fdriving',['stop_driving',['../d2/d40/group__higherlevelmeths.html#ga71df7ac5e41ae776a6c786d3dc36f35a',1,'CodeRacer']]], - ['stop_5fstop_5fat_5fmin_5fdistance',['stop_stop_at_min_distance',['../d2/d40/group__higherlevelmeths.html#gac664109241d08b8dc52db5721f394b22',1,'CodeRacer']]], - ['stopped_5fat_5fmin_5fdistance',['stopped_at_min_distance',['../d7/d45/group__higherlevelgetters.html#gae8b8c0ab24ccb572281785aeca8541e1',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/functions_5.html b/Doku/Doxygen/html/search/functions_5.html deleted file mode 100644 index 0314918..0000000 --- a/Doku/Doxygen/html/search/functions_5.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/functions_5.js b/Doku/Doxygen/html/search/functions_5.js deleted file mode 100644 index cc58d20..0000000 --- a/Doku/Doxygen/html/search/functions_5.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['turn_5fleft',['turn_left',['../d2/d40/group__higherlevelmeths.html#ga86b7caf6ff46e9d1ad90ed507864b175',1,'CodeRacer::turn_left()'],['../d2/d40/group__higherlevelmeths.html#ga30e1ec3fbbc206f93ea66dbf91b5fd95',1,'CodeRacer::turn_left(unsigned long turn_for_ms)'],['../d2/d40/group__higherlevelmeths.html#gae6daa587199e5bf95b1aac675de53b0e',1,'CodeRacer::turn_left(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)']]], - ['turn_5fleft_5ffor_5fms',['turn_left_for_ms',['../d7/d45/group__higherlevelgetters.html#gaf04fd16ca0e2ace656f9549c43d16459',1,'CodeRacer']]], - ['turn_5fright',['turn_right',['../d2/d40/group__higherlevelmeths.html#ga8969fb2d6e2b5ac44a99197931e6b8da',1,'CodeRacer::turn_right()'],['../d2/d40/group__higherlevelmeths.html#gae1f175aad98d773b0206f483ae0bb4ea',1,'CodeRacer::turn_right(unsigned long turn_for_ms)'],['../d2/d40/group__higherlevelmeths.html#gad10b3457489cc7e25ffb4d64c539528a',1,'CodeRacer::turn_right(unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed)']]], - ['turn_5fright_5ffor_5fms',['turn_right_for_ms',['../d7/d45/group__higherlevelgetters.html#gac0698f02f6a21d9d1f5b9cf2820306cf',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/functions_6.html b/Doku/Doxygen/html/search/functions_6.html deleted file mode 100644 index c506123..0000000 --- a/Doku/Doxygen/html/search/functions_6.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/functions_6.js b/Doku/Doxygen/html/search/functions_6.js deleted file mode 100644 index bc703b3..0000000 --- a/Doku/Doxygen/html/search/functions_6.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['usonic_5fdistance_5fcm',['usonic_distance_cm',['../db/ddd/group__lowerlevelusgetters.html#gad59842c14196598e55644b2a22621454',1,'CodeRacer']]], - ['usonic_5fdistance_5fus',['usonic_distance_us',['../db/ddd/group__lowerlevelusgetters.html#ga917b90f21e731ef5f690d5198e7f4d3e',1,'CodeRacer']]], - ['usonic_5fmeasure_5fcm',['usonic_measure_cm',['../d6/dfc/group__lowerlevelusmeths.html#ga5f034198a28b069478c454c63dbfa225',1,'CodeRacer::usonic_measure_cm()'],['../d6/dfc/group__lowerlevelusmeths.html#gafdd5c75d7a8e7b7c993e512ee93dde9a',1,'CodeRacer::usonic_measure_cm(unsigned long max_echo_run_time_us)']]], - ['usonic_5fmeasure_5fsingle_5fshot_5fcm',['usonic_measure_single_shot_cm',['../d6/dfc/group__lowerlevelusmeths.html#ga0c00edbbf4a3169613c9ea84d6e7dc13',1,'CodeRacer::usonic_measure_single_shot_cm()'],['../d6/dfc/group__lowerlevelusmeths.html#gab413551ea8a67e1b60eda1671029b645',1,'CodeRacer::usonic_measure_single_shot_cm(unsigned long max_echo_run_time_us)']]], - ['usonic_5fmeasure_5fsingle_5fshot_5fus',['usonic_measure_single_shot_us',['../d6/dfc/group__lowerlevelusmeths.html#gad4309b6da17085575fb0c55559e240b8',1,'CodeRacer::usonic_measure_single_shot_us()'],['../d6/dfc/group__lowerlevelusmeths.html#ga1b5b43372082f5daeee47410a09a590c',1,'CodeRacer::usonic_measure_single_shot_us(unsigned long max_echo_run_time_us)']]], - ['usonic_5fmeasure_5fus',['usonic_measure_us',['../d6/dfc/group__lowerlevelusmeths.html#gaa01602a576fd57609bc7e08f8ef32e58',1,'CodeRacer::usonic_measure_us()'],['../d6/dfc/group__lowerlevelusmeths.html#ga1f3401ef472cb11997e7dc98ef3e2424',1,'CodeRacer::usonic_measure_us(unsigned long max_echo_run_time_us)']]], - ['usonic_5fset_5fstop_5fdistance_5fcm',['usonic_set_stop_distance_cm',['../db/ddd/group__lowerlevelusgetters.html#gaa7c5a6563a5736ed38d12f616de480df',1,'CodeRacer']]], - ['usonic_5fset_5fstop_5fdistance_5fus',['usonic_set_stop_distance_us',['../db/ddd/group__lowerlevelusgetters.html#ga2f06c193ae86c5b1cba450caf5adf146',1,'CodeRacer']]] -]; diff --git a/Doku/Doxygen/html/search/groups_0.html b/Doku/Doxygen/html/search/groups_0.html deleted file mode 100644 index 1ede28d..0000000 --- a/Doku/Doxygen/html/search/groups_0.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/groups_0.js b/Doku/Doxygen/html/search/groups_0.js deleted file mode 100644 index cc2645a..0000000 --- a/Doku/Doxygen/html/search/groups_0.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['getters_20and_20setters',['Getters and setters',['../d7/d45/group__higherlevelgetters.html',1,'']]], - ['getters',['Getters',['../d0/d0a/group__lowerleveldrivesgetters.html',1,'']]], - ['getters',['Getters',['../d4/df4/group__lowerlevelservogetters.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/groups_1.html b/Doku/Doxygen/html/search/groups_1.html deleted file mode 100644 index 3c05216..0000000 --- a/Doku/Doxygen/html/search/groups_1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/groups_1.js b/Doku/Doxygen/html/search/groups_1.js deleted file mode 100644 index 51cafb8..0000000 --- a/Doku/Doxygen/html/search/groups_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['higher_20level_20methods_2c_20setters_20and_20getters',['Higher level methods, setters and getters',['../d9/d80/group__higherlevel.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/groups_2.html b/Doku/Doxygen/html/search/groups_2.html deleted file mode 100644 index 7191495..0000000 --- a/Doku/Doxygen/html/search/groups_2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/groups_2.js b/Doku/Doxygen/html/search/groups_2.js deleted file mode 100644 index 19a5eac..0000000 --- a/Doku/Doxygen/html/search/groups_2.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['lower_20level_20drives_20methods_20and_20getters',['Lower level drives methods and getters',['../d6/d98/group__lowerleveldrives.html',1,'']]], - ['lower_20level_20fun_20stuff_20methods',['Lower level fun stuff methods',['../d8/d7a/group__lowerlevelfun.html',1,'']]], - ['lower_20level_20led_20methods',['Lower level LED methods',['../d7/d0f/group__lowerlevelled.html',1,'']]], - ['lower_20level_20servo_20drive_20methods_20and_20getters',['Lower level servo drive methods and getters',['../d3/d17/group__lowerlevelservo.html',1,'']]], - ['lower_20level_20ultra_20sonic_20methods_20and_20getters',['Lower level ultra sonic methods and getters',['../da/daf/group__lowerlevelus.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/groups_3.html b/Doku/Doxygen/html/search/groups_3.html deleted file mode 100644 index 3af27ea..0000000 --- a/Doku/Doxygen/html/search/groups_3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/groups_3.js b/Doku/Doxygen/html/search/groups_3.js deleted file mode 100644 index de441f6..0000000 --- a/Doku/Doxygen/html/search/groups_3.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['methods',['Methods',['../d2/d40/group__higherlevelmeths.html',1,'']]], - ['methods',['Methods',['../d1/d8a/group__lowerleveldrivesmeths.html',1,'']]], - ['methods',['Methods',['../dd/dff/group__lowerlevelledmeths.html',1,'']]], - ['methods',['Methods',['../db/dd5/group__lowerlevelservomeths.html',1,'']]], - ['methods',['Methods',['../d6/dfc/group__lowerlevelusmeths.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/groups_4.html b/Doku/Doxygen/html/search/groups_4.html deleted file mode 100644 index e7abc74..0000000 --- a/Doku/Doxygen/html/search/groups_4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
-
Loading...
-
- -
Searching...
-
No Matches
- -
- - diff --git a/Doku/Doxygen/html/search/groups_4.js b/Doku/Doxygen/html/search/groups_4.js deleted file mode 100644 index d9b5375..0000000 --- a/Doku/Doxygen/html/search/groups_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['setters_20and_20getters',['Setters and getters',['../db/ddd/group__lowerlevelusgetters.html',1,'']]] -]; diff --git a/Doku/Doxygen/html/search/mag_sel.png b/Doku/Doxygen/html/search/mag_sel.png deleted file mode 100644 index 81f6040a2092402b4d98f9ffa8855d12a0d4ca17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmV-30?hr1P)zxx&tqG15pu7)IiiXFflOc2k;dXd>%13GZAy? zRz!q0=|E6a6vV)&ZBS~G9oe0kbqyw1*gvY`{Pop2oKq#FlzgXt@Xh-7fxh>}`Fxg> z$%N%{$!4=5nM{(;=c!aG1Ofr^Do{u%Ih{^&Fc@H2)+a-?TBXrw5DW&z%Nb6mQ!L9O zl}b@6mB?f=tX3;#vl)}ggh(Vpyh(IK z(Mb0D{l{U$FsRjP;!{($+bsaaVi8T#1c0V#qEIOCYa9@UVLV`f__E81L;?WEaRA;Y zUH;rZ;vb;mk7JX|$=i3O~&If0O@oZfLg8gfIjW=dcBsz;gI=!{-r4# z4%6v$&~;q^j7Fo67yJ(NJWuX+I~I!tj^nW3?}^9bq|<3^+vapS5sgM^x7!cs(+mMT z&y%j};&~po+YO)3hoUH4E*E;e9>?R6SS&`X)p`njycAVcg{rEb41T{~Hk(bl-7eSb zmFxA2uIqo#@R?lKm50ND`~6Nfn|-b1|L6O98vt3Tx@gKz#isxO002ovPDHLkV1kyW B_l^Jn diff --git a/Doku/Doxygen/html/search/nomatches.html b/Doku/Doxygen/html/search/nomatches.html deleted file mode 100644 index b1ded27..0000000 --- a/Doku/Doxygen/html/search/nomatches.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - -
-
No Matches
-
- - diff --git a/Doku/Doxygen/html/search/search.css b/Doku/Doxygen/html/search/search.css deleted file mode 100644 index 3cf9df9..0000000 --- a/Doku/Doxygen/html/search/search.css +++ /dev/null @@ -1,271 +0,0 @@ -/*---------------- Search Box */ - -#FSearchBox { - float: left; -} - -#MSearchBox { - white-space : nowrap; - float: none; - margin-top: 8px; - right: 0px; - width: 170px; - height: 24px; - z-index: 102; -} - -#MSearchBox .left -{ - display:block; - position:absolute; - left:10px; - width:20px; - height:19px; - background:url('search_l.png') no-repeat; - background-position:right; -} - -#MSearchSelect { - display:block; - position:absolute; - width:20px; - height:19px; -} - -.left #MSearchSelect { - left:4px; -} - -.right #MSearchSelect { - right:5px; -} - -#MSearchField { - display:block; - position:absolute; - height:19px; - background:url('search_m.png') repeat-x; - border:none; - width:115px; - margin-left:20px; - padding-left:4px; - color: #909090; - outline: none; - font: 9pt Arial, Verdana, sans-serif; - -webkit-border-radius: 0px; -} - -#FSearchBox #MSearchField { - margin-left:15px; -} - -#MSearchBox .right { - display:block; - position:absolute; - right:10px; - top:8px; - width:20px; - height:19px; - background:url('search_r.png') no-repeat; - background-position:left; -} - -#MSearchClose { - display: none; - position: absolute; - top: 4px; - background : none; - border: none; - margin: 0px 4px 0px 0px; - padding: 0px 0px; - outline: none; -} - -.left #MSearchClose { - left: 6px; -} - -.right #MSearchClose { - right: 2px; -} - -.MSearchBoxActive #MSearchField { - color: #000000; -} - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #90A5CE; - background-color: #F9FAFC; - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -.SelectItem { - font: 8pt Arial, Verdana, sans-serif; - padding-left: 2px; - padding-right: 12px; - border: 0px; -} - -span.SelectionMark { - margin-right: 4px; - font-family: monospace; - outline-style: none; - text-decoration: none; -} - -a.SelectItem { - display: block; - outline-style: none; - color: #000000; - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} - -a.SelectItem:focus, -a.SelectItem:active { - color: #000000; - outline-style: none; - text-decoration: none; -} - -a.SelectItem:hover { - color: #FFFFFF; - background-color: #3D578C; - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - width: 60ex; - height: 15em; -} - -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000; - background-color: #EEF1F7; - z-index:10000; -} - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; - padding-bottom: 15px; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} - -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} - -body.SRPage { - margin: 5px 2px; -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} - -.SRPage .SRChildren { - display: none; -} - -.SRSymbol { - font-weight: bold; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -span.SRScope { - padding-left: 4px; -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; -} - -.SRResult { - display: none; -} - -DIV.searchresults { - margin-left: 10px; - margin-right: 10px; -} - -/*---------------- External search page results */ - -.searchresult { - background-color: #F0F3F8; -} - -.pages b { - color: white; - padding: 5px 5px 3px 5px; - background-image: url("../tab_a.png"); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; -} - -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none; -} - -.hl { - font-weight: bold; -} - -#searchresults { - margin-bottom: 20px; -} - -.searchpages { - margin-top: 10px; -} - diff --git a/Doku/Doxygen/html/search/search.js b/Doku/Doxygen/html/search/search.js deleted file mode 100644 index dedce3b..0000000 --- a/Doku/Doxygen/html/search/search.js +++ /dev/null @@ -1,791 +0,0 @@ -function convertToId(search) -{ - var result = ''; - for (i=0;i do a search - { - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() - { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() - { - this.keyTimeout = 0; - - // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - var code = searchValue.toLowerCase().charCodeAt(0); - var idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair - { - idxChar = searchValue.substr(0, 2); - } - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) - { - var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else // nothing available for this search term - { - resultsPage = this.resultsPath + '/nomatches.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - } - - window.frames.MSearchResults.location = resultsPageWithSearch; - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (domPopupSearchResultsWindow.style.display!='block') - { - var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } - } - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) - { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { - this.DOMSearchBox().className = 'MSearchBoxActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == this.searchLabel) // clear "Search" term upon entry - { - searchField.value = ''; - this.searchActive = true; - } - } - else if (!isActive) // directly remove the panel - { - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.DOMSearchField().value = this.searchLabel; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') - { - return element; - } - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { - element = element.firstChild; - } - else if (element.nextSibling) - { - element = element.nextSibling; - } - else - { - do - { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; - } - else - { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; - } - } - } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - parent.document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } -} - -function setKeyActions(elem,action) -{ - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); -} - -function setClassAttr(elem,attr) -{ - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); -} - -function createResults() -{ - var results = document.getElementById("SRResults"); - for (var e=0; ek7RCwB~R6VQOP#AvB$vH7i{6H{96zot$7cZT<7246EF5Np6N}+$IbiG6W zg#87A+NFaX+=_^xM1#gCtshC=E{%9^uQX_%?YwXvo{#q&MnpJ8uh(O?ZRc&~_1%^SsPxG@rfElJg-?U zm!Cz-IOn(qJP3kDp-^~qt+FGbl=5jNli^Wj_xIBG{Rc0en{!oFvyoNC7{V~T8}b>| z=jL2WIReZzX(YN(_9fV;BBD$VXQIxNasAL8ATvEu822WQ%mvv4FO#qs` BFGc_W diff --git a/Doku/Doxygen/html/search/search_r.png b/Doku/Doxygen/html/search/search_r.png deleted file mode 100644 index 97ee8b439687084201b79c6f776a41f495c6392a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 612 zcmV-q0-ODbP)PbXFRCwB?)W514K@j&X?z2*SxFI6-@HT2E2K=9X9%Pb zEK*!TBw&g(DMC;|A)uGlRkOS9vd-?zNs%bR4d$w+ox_iFnE8fvIvv7^5<(>Te12Li z7C)9srCzmK{ZcNM{YIl9j{DePFgOWiS%xG@5CnnnJa4nvY<^glbz7^|-ZY!dUkAwd z{gaTC@_>b5h~;ug#R0wRL0>o5!hxm*s0VW?8dr}O#zXTRTnrQm_Z7z1Mrnx>&p zD4qifUjzLvbVVWi?l?rUzwt^sdb~d!f_LEhsRVIXZtQ=qSxuxqm zEX#tf>$?M_Y1-LSDT)HqG?`%-%ZpY!#{N!rcNIiL;G7F0`l?)mNGTD9;f9F5Up3Kg zw}a<-JylhG&;=!>B+fZaCX+?C+kHYrP%c?X2!Zu_olK|GcS4A70HEy;vn)I0>0kLH z`jc(WIaaHc7!HS@f*^R^Znx8W=_jIl2oWJoQ*h1^$FX!>*PqR1J8k|fw}w_y}TpE>7m8DqDO<3z`OzXt$ccSejbEZCg@0000-{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 diff --git a/Doku/Doxygen/html/sync_off.png b/Doku/Doxygen/html/sync_off.png deleted file mode 100644 index 3b443fc62892114406e3d399421b2a881b897acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* diff --git a/Doku/Doxygen/html/sync_on.png b/Doku/Doxygen/html/sync_on.png deleted file mode 100644 index e08320fb64e6fa33b573005ed6d8fe294e19db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 diff --git a/Doku/Doxygen/html/tab_a.png b/Doku/Doxygen/html/tab_a.png deleted file mode 100644 index 3b725c41c5a527a3a3e40097077d0e206a681247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 diff --git a/Doku/Doxygen/html/tab_b.png b/Doku/Doxygen/html/tab_b.png deleted file mode 100644 index e2b4a8638cb3496a016eaed9e16ffc12846dea18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ diff --git a/Doku/Doxygen/html/tabs.css b/Doku/Doxygen/html/tabs.css deleted file mode 100644 index a28614b..0000000 --- a/Doku/Doxygen/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#doc-content{overflow:auto;display:block;padding:0;margin:0;-webkit-overflow-scrolling:touch}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/Doku/Doxygen/latex/Makefile b/Doku/Doxygen/latex/Makefile deleted file mode 100644 index 8cc3866..0000000 --- a/Doku/Doxygen/latex/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -all: refman.pdf - -pdf: refman.pdf - -refman.pdf: clean refman.tex - pdflatex refman - makeindex refman.idx - pdflatex refman - latex_count=8 ; \ - while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ - do \ - echo "Rerunning latex...." ;\ - pdflatex refman ;\ - latex_count=`expr $$latex_count - 1` ;\ - done - makeindex refman.idx - pdflatex refman - - -clean: - rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf diff --git a/Doku/Doxygen/latex/coderace_logo.JPG b/Doku/Doxygen/latex/coderace_logo.JPG deleted file mode 100644 index 0b58ee11a77acf338c986899a94565f7ee29e428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20511 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%0AKS_M6qh;FHd5>6NqQr|P3XMDfP! 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 V^xtGkO`+{kVF8c$qft>t{u|e-W}W~5 diff --git a/Doku/Doxygen/latex/d0/d0a/group__lowerleveldrivesgetters.tex b/Doku/Doxygen/latex/d0/d0a/group__lowerleveldrivesgetters.tex deleted file mode 100644 index 9c22894..0000000 --- a/Doku/Doxygen/latex/d0/d0a/group__lowerleveldrivesgetters.tex +++ /dev/null @@ -1,61 +0,0 @@ -\hypertarget{group__lowerleveldrivesgetters}{}\section{Getters} -\label{group__lowerleveldrivesgetters}\index{Getters@{Getters}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -uint8\+\_\+t \hyperlink{group__lowerleveldrivesgetters_ga09359a792e3299b1c20f6b99939ea7b3}{Code\+Racer\+::drive\+\_\+right\+\_\+speed} () -\begin{DoxyCompactList}\small\item\em Get the setting for the speed of the right side drive. \end{DoxyCompactList}\item -uint8\+\_\+t \hyperlink{group__lowerleveldrivesgetters_ga804a45724f3788fd2fdb9631c66d1377}{Code\+Racer\+::drive\+\_\+left\+\_\+speed} () -\begin{DoxyCompactList}\small\item\em Get the setting for the speed of the left side drive. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerleveldrivesgetters_ga09359a792e3299b1c20f6b99939ea7b3}\label{group__lowerleveldrivesgetters_ga09359a792e3299b1c20f6b99939ea7b3}} -\index{Getters@{Getters}!drive\+\_\+right\+\_\+speed@{drive\+\_\+right\+\_\+speed}} -\index{drive\+\_\+right\+\_\+speed@{drive\+\_\+right\+\_\+speed}!Getters@{Getters}} -\subsubsection{\texorpdfstring{drive\+\_\+right\+\_\+speed()}{drive\_right\_speed()}} -{\footnotesize\ttfamily uint8\+\_\+t Code\+Racer\+::drive\+\_\+right\+\_\+speed (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Get the setting for the speed of the right side drive. - -\begin{DoxyReturn}{Returns} -Speed of the right side drive -\end{DoxyReturn} - - -Definition at line 994 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -994 \{ -995 \textcolor{keywordflow}{return} \_drive\_right\_speed; -996 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesgetters_ga804a45724f3788fd2fdb9631c66d1377}\label{group__lowerleveldrivesgetters_ga804a45724f3788fd2fdb9631c66d1377}} -\index{Getters@{Getters}!drive\+\_\+left\+\_\+speed@{drive\+\_\+left\+\_\+speed}} -\index{drive\+\_\+left\+\_\+speed@{drive\+\_\+left\+\_\+speed}!Getters@{Getters}} -\subsubsection{\texorpdfstring{drive\+\_\+left\+\_\+speed()}{drive\_left\_speed()}} -{\footnotesize\ttfamily uint8\+\_\+t Code\+Racer\+::drive\+\_\+left\+\_\+speed (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Get the setting for the speed of the left side drive. - -\begin{DoxyReturn}{Returns} -Speed of the left side drive -\end{DoxyReturn} - - -Definition at line 1001 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -1001 \{ -1002 \textcolor{keywordflow}{return}(\_drive\_left\_speed); -1003 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/d1/d8a/group__lowerleveldrivesmeths.tex b/Doku/Doxygen/latex/d1/d8a/group__lowerleveldrivesmeths.tex deleted file mode 100644 index a2da2bb..0000000 --- a/Doku/Doxygen/latex/d1/d8a/group__lowerleveldrivesmeths.tex +++ /dev/null @@ -1,341 +0,0 @@ -\hypertarget{group__lowerleveldrivesmeths}{}\section{Methods} -\label{group__lowerleveldrivesmeths}\index{Methods@{Methods}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -void \hyperlink{group__lowerleveldrivesmeths_ga5812df751da5b480240ccd633c515b83}{Code\+Racer\+::drives\+\_\+settings} (uint8\+\_\+t drive\+\_\+left\+\_\+speed, uint8\+\_\+t drive\+\_\+right\+\_\+speed, unsigned long turn\+\_\+left\+\_\+ms, unsigned long turn\+\_\+right\+\_\+ms) -\begin{DoxyCompactList}\small\item\em Overwrites some drive settings. This will replace the defaults set by the values in the header file. \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga61ed9e0415a62a290cc5c59a0f740304}{Code\+Racer\+::set\+\_\+drives\+\_\+stop\+\_\+left\+\_\+right} () -\begin{DoxyCompactList}\small\item\em Stopps both drives. \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga802d2646d9cc0d766e1ac799c7917fa8}{Code\+Racer\+::set\+\_\+drives\+\_\+states\+\_\+left\+\_\+right} (drivestate stateleft, drivestate stateright) -\begin{DoxyCompactList}\small\item\em Sets both of the drives to a specified drivestate (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga1eeb3cb47503c3011562f9c42828fab9}{Code\+Racer\+::set\+\_\+drive\+\_\+left\+\_\+state} (drivestate state) -\begin{DoxyCompactList}\small\item\em Sets the left side drive to the specified drivestate (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga1b34ec9cee1f21cd15db310167a2faa5}{Code\+Racer\+::set\+\_\+drive\+\_\+right\+\_\+state} (drivestate state) -\begin{DoxyCompactList}\small\item\em Sets the right side drive to the specified drivestate (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga3b69cf4a718c842fbe758d3f4267214e}{Code\+Racer\+::set\+\_\+drive\+\_\+state} (drivestate state, uint8\+\_\+t frwdpin, uint8\+\_\+t backpin) -\begin{DoxyCompactList}\small\item\em Sets the specified drivestate for the drive connected to the sepecified pins (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga3d3ffb41783d34589e33cf61fed46c70}{Code\+Racer\+::set\+\_\+drives\+\_\+speed\+\_\+left\+\_\+right} (uint8\+\_\+t speedleft, uint8\+\_\+t speedright) -\begin{DoxyCompactList}\small\item\em Sets the speed for both of the drives. \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga1ee3da20ec98a821ab97ced070974861}{Code\+Racer\+::set\+\_\+drive\+\_\+left\+\_\+speed} (uint8\+\_\+t speed) -\begin{DoxyCompactList}\small\item\em Sets the speed for the left side drive. \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_gaf8805d0d620a2fb78c576f36a2c81073}{Code\+Racer\+::set\+\_\+drive\+\_\+right\+\_\+speed} (uint8\+\_\+t speed) -\begin{DoxyCompactList}\small\item\em Sets the speed for the right side drive. \end{DoxyCompactList}\item -void \hyperlink{group__lowerleveldrivesmeths_ga5d67c84606d5b39996a99fcd6e7eb314}{Code\+Racer\+::set\+\_\+drive\+\_\+speed} (uint8\+\_\+t speed, uint8\+\_\+t enablepin) -\begin{DoxyCompactList}\small\item\em Sets the speed for the drive of the enable pin connected to the specified pin. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga5812df751da5b480240ccd633c515b83}\label{group__lowerleveldrivesmeths_ga5812df751da5b480240ccd633c515b83}} -\index{Methods@{Methods}!drives\+\_\+settings@{drives\+\_\+settings}} -\index{drives\+\_\+settings@{drives\+\_\+settings}!Methods@{Methods}} -\subsubsection{\texorpdfstring{drives\+\_\+settings()}{drives\_settings()}} -{\footnotesize\ttfamily void Code\+Racer\+::drives\+\_\+settings (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{drive\+\_\+left\+\_\+speed, }\item[{uint8\+\_\+t}]{drive\+\_\+right\+\_\+speed, }\item[{unsigned long}]{turn\+\_\+left\+\_\+for\+\_\+ms, }\item[{unsigned long}]{turn\+\_\+right\+\_\+for\+\_\+ms }\end{DoxyParamCaption})} - - - -Overwrites some drive settings. This will replace the defaults set by the values in the header file. - - -\begin{DoxyParams}{Parameters} -{\em drive\+\_\+left\+\_\+speed} & Speed of the left side drive \\ -\hline -{\em drive\+\_\+right\+\_\+speed} & Speed of the right side drive \\ -\hline -{\em turn\+\_\+left\+\_\+for\+\_\+ms} & Time in ms the racer will turn to the left around its center if turn\+\_\+left() is called \\ -\hline -{\em turn\+\_\+right\+\_\+for\+\_\+ms} & Time in ms the racer will turn to the right around its center if turn\+\_\+right() is called \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 878 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -879 \{ -880 \_drive\_left\_speed = drive\_left\_speed; -881 \_drive\_right\_speed = drive\_right\_speed; -882 \_turn\_left\_for\_ms = turn\_left\_for\_ms; -883 \_turn\_right\_for\_ms = turn\_right\_for\_ms; -884 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga61ed9e0415a62a290cc5c59a0f740304}\label{group__lowerleveldrivesmeths_ga61ed9e0415a62a290cc5c59a0f740304}} -\index{Methods@{Methods}!set\+\_\+drives\+\_\+stop\+\_\+left\+\_\+right@{set\+\_\+drives\+\_\+stop\+\_\+left\+\_\+right}} -\index{set\+\_\+drives\+\_\+stop\+\_\+left\+\_\+right@{set\+\_\+drives\+\_\+stop\+\_\+left\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drives\+\_\+stop\+\_\+left\+\_\+right()}{set\_drives\_stop\_left\_right()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drives\+\_\+stop\+\_\+left\+\_\+right (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Stopps both drives. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 889 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -889 \{ -890 set\_drive\_left\_state(DRIVESTOP); -891 set\_drive\_right\_state(DRIVESTOP); -892 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga802d2646d9cc0d766e1ac799c7917fa8}\label{group__lowerleveldrivesmeths_ga802d2646d9cc0d766e1ac799c7917fa8}} -\index{Methods@{Methods}!set\+\_\+drives\+\_\+states\+\_\+left\+\_\+right@{set\+\_\+drives\+\_\+states\+\_\+left\+\_\+right}} -\index{set\+\_\+drives\+\_\+states\+\_\+left\+\_\+right@{set\+\_\+drives\+\_\+states\+\_\+left\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drives\+\_\+states\+\_\+left\+\_\+right()}{set\_drives\_states\_left\_right()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drives\+\_\+states\+\_\+left\+\_\+right (\begin{DoxyParamCaption}\item[{drivestate}]{stateleft, }\item[{drivestate}]{stateright }\end{DoxyParamCaption})} - - - -Sets both of the drives to a specified drivestate (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) - - -\begin{DoxyParams}{Parameters} -{\em stateleft} & drivestate to set for the left side drive \\ -\hline -{\em stateright} & drivestate to set for the right side drive \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 899 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -899 \{ -900 set\_drive\_left\_state(stateleft); -901 set\_drive\_right\_state(stateright); -902 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga1eeb3cb47503c3011562f9c42828fab9}\label{group__lowerleveldrivesmeths_ga1eeb3cb47503c3011562f9c42828fab9}} -\index{Methods@{Methods}!set\+\_\+drive\+\_\+left\+\_\+state@{set\+\_\+drive\+\_\+left\+\_\+state}} -\index{set\+\_\+drive\+\_\+left\+\_\+state@{set\+\_\+drive\+\_\+left\+\_\+state}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drive\+\_\+left\+\_\+state()}{set\_drive\_left\_state()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drive\+\_\+left\+\_\+state (\begin{DoxyParamCaption}\item[{drivestate}]{state }\end{DoxyParamCaption})} - - - -Sets the left side drive to the specified drivestate (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) - - -\begin{DoxyParams}{Parameters} -{\em state} & drivestate to set for the left side drive \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 908 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -908 \{ -909 set\_drive\_state(state, \_drive\_left\_frwd\_pin, \_drive\_left\_back\_pin); -910 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga1b34ec9cee1f21cd15db310167a2faa5}\label{group__lowerleveldrivesmeths_ga1b34ec9cee1f21cd15db310167a2faa5}} -\index{Methods@{Methods}!set\+\_\+drive\+\_\+right\+\_\+state@{set\+\_\+drive\+\_\+right\+\_\+state}} -\index{set\+\_\+drive\+\_\+right\+\_\+state@{set\+\_\+drive\+\_\+right\+\_\+state}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drive\+\_\+right\+\_\+state()}{set\_drive\_right\_state()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drive\+\_\+right\+\_\+state (\begin{DoxyParamCaption}\item[{drivestate}]{state }\end{DoxyParamCaption})} - - - -Sets the right side drive to the specified drivestate (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) - - -\begin{DoxyParams}{Parameters} -{\em state} & drivestate to set for the right side drive \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 916 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -916 \{ -917 set\_drive\_state(state, \_drive\_right\_frwd\_pin, \_drive\_right\_back\_pin); -918 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga3b69cf4a718c842fbe758d3f4267214e}\label{group__lowerleveldrivesmeths_ga3b69cf4a718c842fbe758d3f4267214e}} -\index{Methods@{Methods}!set\+\_\+drive\+\_\+state@{set\+\_\+drive\+\_\+state}} -\index{set\+\_\+drive\+\_\+state@{set\+\_\+drive\+\_\+state}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drive\+\_\+state()}{set\_drive\_state()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drive\+\_\+state (\begin{DoxyParamCaption}\item[{drivestate}]{state, }\item[{uint8\+\_\+t}]{frwdpin, }\item[{uint8\+\_\+t}]{backpin }\end{DoxyParamCaption})} - - - -Sets the specified drivestate for the drive connected to the sepecified pins (D\+R\+I\+V\+E\+S\+T\+OP, D\+R\+I\+V\+E\+F\+R\+WD, D\+R\+I\+V\+E\+B\+A\+CK) - - -\begin{DoxyParams}{Parameters} -{\em state} & drivestate to set for the connected drive \\ -\hline -{\em frwdpin} & Pin the forward signal of the drive device driver is connected at \\ -\hline -{\em backpin} & Pin the backward signal of the drive device driver is connected at \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 926 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -926 \{ -927 \textcolor{keywordflow}{switch} (state) \{ -928 \textcolor{keywordflow}{case} DRIVESTOP: -929 digitalWrite(frwdpin, LOW); -930 digitalWrite(backpin, LOW); -931 \textcolor{keywordflow}{break}; -932 \textcolor{keywordflow}{case} DRIVEFRWD: -933 digitalWrite(frwdpin, HIGH); -934 digitalWrite(backpin, LOW); -935 \textcolor{keywordflow}{break}; -936 \textcolor{keywordflow}{case} DRIVEBACK: -937 digitalWrite(frwdpin, LOW); -938 digitalWrite(backpin, HIGH); -939 \textcolor{keywordflow}{break}; -940 \} -941 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga3d3ffb41783d34589e33cf61fed46c70}\label{group__lowerleveldrivesmeths_ga3d3ffb41783d34589e33cf61fed46c70}} -\index{Methods@{Methods}!set\+\_\+drives\+\_\+speed\+\_\+left\+\_\+right@{set\+\_\+drives\+\_\+speed\+\_\+left\+\_\+right}} -\index{set\+\_\+drives\+\_\+speed\+\_\+left\+\_\+right@{set\+\_\+drives\+\_\+speed\+\_\+left\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drives\+\_\+speed\+\_\+left\+\_\+right()}{set\_drives\_speed\_left\_right()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drives\+\_\+speed\+\_\+left\+\_\+right (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{speedleft, }\item[{uint8\+\_\+t}]{speedright }\end{DoxyParamCaption})} - - - -Sets the speed for both of the drives. - -The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set\+\_\+drive\+\_\+state methods before -\begin{DoxyParams}{Parameters} -{\em speedleft} & speed of the left side drive. 0$<$=speed$<$=255 \\ -\hline -{\em speedright} & speed of the right side drive. 0$<$=speed$<$=255 \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 950 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -950 \{ -951 set\_drive\_left\_speed(speedleft); -952 set\_drive\_right\_speed(speedright); -953 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga1ee3da20ec98a821ab97ced070974861}\label{group__lowerleveldrivesmeths_ga1ee3da20ec98a821ab97ced070974861}} -\index{Methods@{Methods}!set\+\_\+drive\+\_\+left\+\_\+speed@{set\+\_\+drive\+\_\+left\+\_\+speed}} -\index{set\+\_\+drive\+\_\+left\+\_\+speed@{set\+\_\+drive\+\_\+left\+\_\+speed}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drive\+\_\+left\+\_\+speed()}{set\_drive\_left\_speed()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drive\+\_\+left\+\_\+speed (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{speed }\end{DoxyParamCaption})} - - - -Sets the speed for the left side drive. - -The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set\+\_\+drive\+\_\+state methods before -\begin{DoxyParams}{Parameters} -{\em speed} & speed of the left side drive. 0$<$=speed$<$=255 \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 961 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -961 \{ -962 set\_drive\_speed(speed, \_drive\_left\_enable\_pin); -963 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_gaf8805d0d620a2fb78c576f36a2c81073}\label{group__lowerleveldrivesmeths_gaf8805d0d620a2fb78c576f36a2c81073}} -\index{Methods@{Methods}!set\+\_\+drive\+\_\+right\+\_\+speed@{set\+\_\+drive\+\_\+right\+\_\+speed}} -\index{set\+\_\+drive\+\_\+right\+\_\+speed@{set\+\_\+drive\+\_\+right\+\_\+speed}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drive\+\_\+right\+\_\+speed()}{set\_drive\_right\_speed()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drive\+\_\+right\+\_\+speed (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{speed }\end{DoxyParamCaption})} - - - -Sets the speed for the right side drive. - -The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set\+\_\+drive\+\_\+state methods before -\begin{DoxyParams}{Parameters} -{\em speed} & speed of the right side drive. 0$<$=speed$<$=255 \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 971 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -971 \{ -972 set\_drive\_speed(speed, \_drive\_right\_enable\_pin); -973 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerleveldrivesmeths_ga5d67c84606d5b39996a99fcd6e7eb314}\label{group__lowerleveldrivesmeths_ga5d67c84606d5b39996a99fcd6e7eb314}} -\index{Methods@{Methods}!set\+\_\+drive\+\_\+speed@{set\+\_\+drive\+\_\+speed}} -\index{set\+\_\+drive\+\_\+speed@{set\+\_\+drive\+\_\+speed}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+drive\+\_\+speed()}{set\_drive\_speed()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+drive\+\_\+speed (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{speed, }\item[{uint8\+\_\+t}]{enablepin }\end{DoxyParamCaption})} - - - -Sets the speed for the drive of the enable pin connected to the specified pin. - -The drive will run with that speed afterwards. The direction of the drive has to be specfied with one of the set\+\_\+drive\+\_\+state methods before -\begin{DoxyParams}{Parameters} -{\em speed} & speed of the drive. 0$<$=speed$<$=255 \\ -\hline -{\em enablepin} & Pin the drives device driver enable pin is connected at \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 982 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -982 \{ -983 \_analog\_write(enablepin, (\textcolor{keywordtype}{int})speed); -984 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths.tex b/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths.tex deleted file mode 100644 index ce2c1ce..0000000 --- a/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths.tex +++ /dev/null @@ -1,494 +0,0 @@ -\hypertarget{group__higherlevelmeths}{}\section{Methods} -\label{group__higherlevelmeths}\index{Methods@{Methods}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -void \hyperlink{group__higherlevelmeths_ga71df7ac5e41ae776a6c786d3dc36f35a}{Code\+Racer\+::stop\+\_\+driving} () -\begin{DoxyCompactList}\small\item\em Stops the racer and sets status L\+E\+Ds. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c}{Code\+Racer\+::drive\+\_\+forward} () -\begin{DoxyCompactList}\small\item\em Sets the speed and the directions of both drives so that it will move forward. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_gaae6fc379ec43cbe2cb2f63fbd12dbe0d}{Code\+Racer\+::drive\+\_\+forward} (uint8\+\_\+t left\+\_\+speed, uint8\+\_\+t right\+\_\+speed) -\begin{DoxyCompactList}\small\item\em Sets the speed as specified for both drives and the directions of both drives so that it will move forward. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga98aa8a5a46f769d59e6c1067c8418cfb}{Code\+Racer\+::drive\+\_\+backward} () -\begin{DoxyCompactList}\small\item\em Sets the speed and the directions of both drives so that it will move backward. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga6cd8356ac76360b014db6170276b6b30}{Code\+Racer\+::drive\+\_\+backward} (uint8\+\_\+t left\+\_\+speed, uint8\+\_\+t right\+\_\+speed) -\begin{DoxyCompactList}\small\item\em Sets the speed as specified for both drives and the directions of both drives so that it will move backward. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga86b7caf6ff46e9d1ad90ed507864b175}{Code\+Racer\+::turn\+\_\+left} () -\begin{DoxyCompactList}\small\item\em Will turn the racer to the left for the internally stroe time in ms and with the internally stored speed. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga30e1ec3fbbc206f93ea66dbf91b5fd95}{Code\+Racer\+::turn\+\_\+left} (unsigned long turn\+\_\+for\+\_\+ms) -\begin{DoxyCompactList}\small\item\em Will turn the racer to the left for the specified time in ms and with the internally stored speed. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_gae6daa587199e5bf95b1aac675de53b0e}{Code\+Racer\+::turn\+\_\+left} (unsigned long turn\+\_\+for\+\_\+ms, uint8\+\_\+t left\+\_\+speed, uint8\+\_\+t right\+\_\+speed) -\begin{DoxyCompactList}\small\item\em Will turn the racer to the left for the specified time in ms and with the specified speed. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga8969fb2d6e2b5ac44a99197931e6b8da}{Code\+Racer\+::turn\+\_\+right} () -\begin{DoxyCompactList}\small\item\em Will turn the racer to the right for the internally stroe time in ms and with the internally stored speed. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_gae1f175aad98d773b0206f483ae0bb4ea}{Code\+Racer\+::turn\+\_\+right} (unsigned long turn\+\_\+for\+\_\+ms) -\begin{DoxyCompactList}\small\item\em Will turn the racer to the right for the specified time in ms and with the internally stored speed. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_gad10b3457489cc7e25ffb4d64c539528a}{Code\+Racer\+::turn\+\_\+right} (unsigned long turn\+\_\+for\+\_\+ms, uint8\+\_\+t left\+\_\+speed, uint8\+\_\+t right\+\_\+speed) -\begin{DoxyCompactList}\small\item\em Will turn the racer to the right for the specified time in ms and with the specified speed. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga128683caea019a89bce06f722ba92556}{Code\+Racer\+::start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance} () -\begin{DoxyCompactList}\small\item\em Enables to stopp the racer if during a distance measurement the measured distance is smaller then the internally stored minimal distance. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_ga64bc1b2a8ed5bc3ec5e706fa70a1385d}{Code\+Racer\+::start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance} (unsigned long min\+\_\+distance\+\_\+cm) -\begin{DoxyCompactList}\small\item\em Enables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelmeths_gac664109241d08b8dc52db5721f394b22}{Code\+Racer\+::stop\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance} () -\begin{DoxyCompactList}\small\item\em Disables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. \end{DoxyCompactList}\item -bool \hyperlink{group__higherlevelmeths_ga34e2fe2123e76fd844482dfef6c5a9c8}{Code\+Racer\+::start\+\_\+stop} () -\begin{DoxyCompactList}\small\item\em This will return if the codracer is in active mode or not. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__higherlevelmeths_ga71df7ac5e41ae776a6c786d3dc36f35a}\label{group__higherlevelmeths_ga71df7ac5e41ae776a6c786d3dc36f35a}} -\index{Methods@{Methods}!stop\+\_\+driving@{stop\+\_\+driving}} -\index{stop\+\_\+driving@{stop\+\_\+driving}!Methods@{Methods}} -\subsubsection{\texorpdfstring{stop\+\_\+driving()}{stop\_driving()}} -{\footnotesize\ttfamily void Code\+Racer\+::stop\+\_\+driving (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Stops the racer and sets status L\+E\+Ds. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 161 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -161 \{ -162 \_servo\_sweep = \textcolor{keyword}{false}; -163 \_drive = \textcolor{keyword}{false}; -164 set\_drives\_stop\_left\_right(); -165 set\_leds\_left\_stop\_frwd\_right(LEDOFF, LEDON, LEDOFF, LEDOFF); -166 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c}\label{group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c}} -\index{Methods@{Methods}!drive\+\_\+forward@{drive\+\_\+forward}} -\index{drive\+\_\+forward@{drive\+\_\+forward}!Methods@{Methods}} -\subsubsection{\texorpdfstring{drive\+\_\+forward()}{drive\_forward()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily void Code\+Racer\+::drive\+\_\+forward (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Sets the speed and the directions of both drives so that it will move forward. - -The speed is taken from the header file or set by one of the methods defined in the lower level drive methods section \begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 173 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -174 \{ -175 drive\_forward(\_drive\_left\_speed, \_drive\_right\_speed); -176 \} -\end{DoxyCode} -Here is the call graph for this function\+: -\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=206pt]{d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph} -\end{center} -\end{figure} -\mbox{\Hypertarget{group__higherlevelmeths_gaae6fc379ec43cbe2cb2f63fbd12dbe0d}\label{group__higherlevelmeths_gaae6fc379ec43cbe2cb2f63fbd12dbe0d}} -\index{Methods@{Methods}!drive\+\_\+forward@{drive\+\_\+forward}} -\index{drive\+\_\+forward@{drive\+\_\+forward}!Methods@{Methods}} -\subsubsection{\texorpdfstring{drive\+\_\+forward()}{drive\_forward()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily void Code\+Racer\+::drive\+\_\+forward (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{left\+\_\+speed, }\item[{uint8\+\_\+t}]{right\+\_\+speed }\end{DoxyParamCaption})} - - - -Sets the speed as specified for both drives and the directions of both drives so that it will move forward. - -The specified speed values for both drives will be stored internaly so next time if you use e.\+g. drive\+\_\+forward() exactly the here specified values will be taken. -\begin{DoxyParams}{Parameters} -{\em left\+\_\+speed} & speed for the left side drive. 0$<$=speed$<$=255 \\ -\hline -{\em right\+\_\+speed} & speed for the right side drive. 0$<$=speed$<$=255 \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 185 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -186 \{ -187 set\_drives\_states\_left\_right(DRIVEFRWD, DRIVEFRWD); -188 set\_drives\_speed\_left\_right(left\_speed, right\_speed); -189 set\_leds\_left\_stop\_frwd\_right(LEDOFF, LEDOFF, LEDON, LEDOFF); -190 \_drive = \textcolor{keyword}{true}; -191 \_drive\_set\_at\_ms = millis(); -192 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga98aa8a5a46f769d59e6c1067c8418cfb}\label{group__higherlevelmeths_ga98aa8a5a46f769d59e6c1067c8418cfb}} -\index{Methods@{Methods}!drive\+\_\+backward@{drive\+\_\+backward}} -\index{drive\+\_\+backward@{drive\+\_\+backward}!Methods@{Methods}} -\subsubsection{\texorpdfstring{drive\+\_\+backward()}{drive\_backward()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily void Code\+Racer\+::drive\+\_\+backward (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Sets the speed and the directions of both drives so that it will move backward. - -The speed is taken from the header file or set by one of the methods defined in the lower level drive methods section \begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 199 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -200 \{ -201 drive\_backward(\_drive\_left\_speed, \_drive\_right\_speed); -202 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga6cd8356ac76360b014db6170276b6b30}\label{group__higherlevelmeths_ga6cd8356ac76360b014db6170276b6b30}} -\index{Methods@{Methods}!drive\+\_\+backward@{drive\+\_\+backward}} -\index{drive\+\_\+backward@{drive\+\_\+backward}!Methods@{Methods}} -\subsubsection{\texorpdfstring{drive\+\_\+backward()}{drive\_backward()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily void Code\+Racer\+::drive\+\_\+backward (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{left\+\_\+speed, }\item[{uint8\+\_\+t}]{right\+\_\+speed }\end{DoxyParamCaption})} - - - -Sets the speed as specified for both drives and the directions of both drives so that it will move backward. - -The specified speed values for both drives will be stored internaly so next time if you use e.\+g. drive\+\_\+backward() exactly the here specified values will be taken. -\begin{DoxyParams}{Parameters} -{\em left\+\_\+speed} & speed for the left side drive. 0$<$=speed$<$=255 \\ -\hline -{\em right\+\_\+speed} & speed for the right side drive. 0$<$=speed$<$=255 \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 211 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -212 \{ -213 set\_drives\_states\_left\_right(DRIVEBACK, DRIVEBACK); -214 set\_drives\_speed\_left\_right(left\_speed, right\_speed); -215 set\_leds\_left\_stop\_frwd\_right(LEDOFF, LEDON, LEDON, LEDOFF); -216 \_drive = \textcolor{keyword}{true}; -217 \_drive\_set\_at\_ms = millis(); -218 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga86b7caf6ff46e9d1ad90ed507864b175}\label{group__higherlevelmeths_ga86b7caf6ff46e9d1ad90ed507864b175}} -\index{Methods@{Methods}!turn\+\_\+left@{turn\+\_\+left}} -\index{turn\+\_\+left@{turn\+\_\+left}!Methods@{Methods}} -\subsubsection{\texorpdfstring{turn\+\_\+left()}{turn\_left()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}} -{\footnotesize\ttfamily void Code\+Racer\+::turn\+\_\+left (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Will turn the racer to the left for the internally stroe time in ms and with the internally stored speed. - -The speed for both the left side and right side drive can be set by the methods described in the lower level drive section. The turn to left time can be set by thoose methods as well. The method is delayed until the racer has turned. \begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 226 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -227 \{ -228 turn\_left(\_turn\_left\_for\_ms, \_drive\_left\_speed, \_drive\_right\_speed); -229 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga30e1ec3fbbc206f93ea66dbf91b5fd95}\label{group__higherlevelmeths_ga30e1ec3fbbc206f93ea66dbf91b5fd95}} -\index{Methods@{Methods}!turn\+\_\+left@{turn\+\_\+left}} -\index{turn\+\_\+left@{turn\+\_\+left}!Methods@{Methods}} -\subsubsection{\texorpdfstring{turn\+\_\+left()}{turn\_left()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}} -{\footnotesize\ttfamily void Code\+Racer\+::turn\+\_\+left (\begin{DoxyParamCaption}\item[{unsigned long}]{turn\+\_\+for\+\_\+ms }\end{DoxyParamCaption})} - - - -Will turn the racer to the left for the specified time in ms and with the internally stored speed. - -The specified duration of time is stored internally and will be used next time by e.\+g. turn\+\_\+left() -\begin{DoxyParams}{Parameters} -{\em turn\+\_\+for\+\_\+ms} & duration of time in ms to turn the racer \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 237 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -238 \{ -239 turn\_left(turn\_for\_ms, \_drive\_left\_speed, \_drive\_right\_speed); -240 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_gae6daa587199e5bf95b1aac675de53b0e}\label{group__higherlevelmeths_gae6daa587199e5bf95b1aac675de53b0e}} -\index{Methods@{Methods}!turn\+\_\+left@{turn\+\_\+left}} -\index{turn\+\_\+left@{turn\+\_\+left}!Methods@{Methods}} -\subsubsection{\texorpdfstring{turn\+\_\+left()}{turn\_left()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}} -{\footnotesize\ttfamily void Code\+Racer\+::turn\+\_\+left (\begin{DoxyParamCaption}\item[{unsigned long}]{turn\+\_\+for\+\_\+ms, }\item[{uint8\+\_\+t}]{left\+\_\+speed, }\item[{uint8\+\_\+t}]{right\+\_\+speed }\end{DoxyParamCaption})} - - - -Will turn the racer to the left for the specified time in ms and with the specified speed. - -The specified duration of time and the specified speeds are stored internally and will be used next time by e.\+g. turn\+\_\+left() -\begin{DoxyParams}{Parameters} -{\em turn\+\_\+for\+\_\+ms} & duration of time in ms to turn the racer \\ -\hline -{\em left\+\_\+speed} & speed for the left side drive \\ -\hline -{\em right\+\_\+speed} & speed for the right side drive \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 250 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -251 \{ -252 \_drive = \textcolor{keyword}{false}; -253 set\_leds\_left\_stop\_frwd\_right(LEDON, LEDOFF, LEDOFF, LEDOFF); \textcolor{comment}{// LEDs setzen} -254 set\_drives\_states\_left\_right(DRIVEBACK, DRIVEFRWD); -255 set\_drives\_speed\_left\_right(left\_speed, right\_speed); -256 \textcolor{comment}{// wait set delay for the timed turn} -257 \_turn\_left\_for\_ms = turn\_for\_ms; -258 delay(\_turn\_left\_for\_ms); -259 \textcolor{comment}{// stop drives again} -260 set\_drives\_stop\_left\_right(); -261 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga8969fb2d6e2b5ac44a99197931e6b8da}\label{group__higherlevelmeths_ga8969fb2d6e2b5ac44a99197931e6b8da}} -\index{Methods@{Methods}!turn\+\_\+right@{turn\+\_\+right}} -\index{turn\+\_\+right@{turn\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{turn\+\_\+right()}{turn\_right()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}} -{\footnotesize\ttfamily void Code\+Racer\+::turn\+\_\+right (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Will turn the racer to the right for the internally stroe time in ms and with the internally stored speed. - -The speed for both the left side and right side drive can be set by the methods described in the lower level drive section. The turn to right time can be set by thoose methods as well. The method is delayed until the racer has turned. \begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 269 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -270 \{ -271 turn\_right(\_turn\_right\_for\_ms, \_drive\_left\_speed, \_drive\_right\_speed); -272 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_gae1f175aad98d773b0206f483ae0bb4ea}\label{group__higherlevelmeths_gae1f175aad98d773b0206f483ae0bb4ea}} -\index{Methods@{Methods}!turn\+\_\+right@{turn\+\_\+right}} -\index{turn\+\_\+right@{turn\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{turn\+\_\+right()}{turn\_right()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}} -{\footnotesize\ttfamily void Code\+Racer\+::turn\+\_\+right (\begin{DoxyParamCaption}\item[{unsigned long}]{turn\+\_\+for\+\_\+ms }\end{DoxyParamCaption})} - - - -Will turn the racer to the right for the specified time in ms and with the internally stored speed. - -The specified duration of time is stored internally and will be used next time by e.\+g. turn\+\_\+right() -\begin{DoxyParams}{Parameters} -{\em turn\+\_\+for\+\_\+ms} & duration of time in ms to turn the racer \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 280 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -281 \{ -282 turn\_right(turn\_for\_ms, \_drive\_left\_speed, \_drive\_right\_speed); -283 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_gad10b3457489cc7e25ffb4d64c539528a}\label{group__higherlevelmeths_gad10b3457489cc7e25ffb4d64c539528a}} -\index{Methods@{Methods}!turn\+\_\+right@{turn\+\_\+right}} -\index{turn\+\_\+right@{turn\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{turn\+\_\+right()}{turn\_right()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}} -{\footnotesize\ttfamily void Code\+Racer\+::turn\+\_\+right (\begin{DoxyParamCaption}\item[{unsigned long}]{turn\+\_\+for\+\_\+ms, }\item[{uint8\+\_\+t}]{left\+\_\+speed, }\item[{uint8\+\_\+t}]{right\+\_\+speed }\end{DoxyParamCaption})} - - - -Will turn the racer to the right for the specified time in ms and with the specified speed. - -The specified duration of time and the specified speeds are stored internally and will be used next time by e.\+g. turn\+\_\+right() -\begin{DoxyParams}{Parameters} -{\em turn\+\_\+for\+\_\+ms} & duration of time in ms to turn the racer \\ -\hline -{\em left\+\_\+speed} & speed for the left side drive \\ -\hline -{\em right\+\_\+speed} & speed for the right side drive \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 293 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -294 \{ -295 \_drive = \textcolor{keyword}{false}; -296 set\_leds\_left\_stop\_frwd\_right(LEDOFF, LEDOFF, LEDOFF, LEDON); \textcolor{comment}{// LEDs setzen} -297 set\_drives\_states\_left\_right(DRIVEFRWD, DRIVEBACK); -298 set\_drives\_speed\_left\_right(left\_speed, right\_speed); -299 \textcolor{comment}{// wait set delay for the timed turn} -300 \_turn\_right\_for\_ms = turn\_for\_ms; -301 delay(\_turn\_right\_for\_ms); -302 \textcolor{comment}{// stop drives again} -303 set\_drives\_stop\_left\_right(); -304 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga128683caea019a89bce06f722ba92556}\label{group__higherlevelmeths_ga128683caea019a89bce06f722ba92556}} -\index{Methods@{Methods}!start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance@{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance}} -\index{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance@{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance}!Methods@{Methods}} -\subsubsection{\texorpdfstring{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance()}{start\_stop\_at\_min\_distance()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily void Code\+Racer\+::start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Enables to stopp the racer if during a distance measurement the measured distance is smaller then the internally stored minimal distance. - -This allow all of the none-\/single shot ultra sonic measurement methods to stopp the racer in the case the measured distance is smaller than minimal distance. This is just the enablement -\/ you have to call one of the none-\/single-\/shot ultra sonic measurement methods continously while driving and maybe sweeping the servo. If the racer was stopped can be checked with stopped\+\_\+at\+\_\+min\+\_\+distance() -\/ it will return true in that case. The minimal distance can be set by the ultrasonic sensor setter methods. There is an example coming with the coderacer libary that you can load and get an idea how that works. \begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 314 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -314 \{ -315 start\_stop\_at\_min\_distance(\_usonic\_stop\_distance\_cm); -316 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga64bc1b2a8ed5bc3ec5e706fa70a1385d}\label{group__higherlevelmeths_ga64bc1b2a8ed5bc3ec5e706fa70a1385d}} -\index{Methods@{Methods}!start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance@{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance}} -\index{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance@{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance}!Methods@{Methods}} -\subsubsection{\texorpdfstring{start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance()}{start\_stop\_at\_min\_distance()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily void Code\+Racer\+::start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance (\begin{DoxyParamCaption}\item[{unsigned long}]{min\+\_\+distance\+\_\+cm }\end{DoxyParamCaption})} - - - -Enables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. - -This is almos the same as described for start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance(). You can specify the distance in cm here -\/ this value will be stored internally and used by start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance() next time. -\begin{DoxyParams}{Parameters} -{\em min\+\_\+distance\+\_\+cm} & the minimal disctance in cm \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 324 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -324 \{ -325 \textcolor{keywordflow}{if} (\textcolor{keyword}{false} == \_coderacer\_stop\_at\_distance\_enabled) \{ -326 \_coderacer\_stopped\_at\_min\_distance = \textcolor{keyword}{false}; -327 usonic\_set\_stop\_distance\_cm(min\_distance\_cm); -328 \_coderacer\_stop\_at\_distance\_enabled = \textcolor{keyword}{true}; -329 \} -330 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_gac664109241d08b8dc52db5721f394b22}\label{group__higherlevelmeths_gac664109241d08b8dc52db5721f394b22}} -\index{Methods@{Methods}!stop\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance@{stop\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance}} -\index{stop\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance@{stop\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance}!Methods@{Methods}} -\subsubsection{\texorpdfstring{stop\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance()}{stop\_stop\_at\_min\_distance()}} -{\footnotesize\ttfamily void Code\+Racer\+::stop\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Disables to stopp the racer if during a distance measurement the measured distance is smaller then the specified minimal distance. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 335 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -335 \{ -336 \_coderacer\_stop\_at\_distance\_enabled = \textcolor{keyword}{false}; -337 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelmeths_ga34e2fe2123e76fd844482dfef6c5a9c8}\label{group__higherlevelmeths_ga34e2fe2123e76fd844482dfef6c5a9c8}} -\index{Methods@{Methods}!start\+\_\+stop@{start\+\_\+stop}} -\index{start\+\_\+stop@{start\+\_\+stop}!Methods@{Methods}} -\subsubsection{\texorpdfstring{start\+\_\+stop()}{start\_stop()}} -{\footnotesize\ttfamily bool Code\+Racer\+::start\+\_\+stop (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -This will return if the codracer is in active mode or not. - -There is a button used to toogle between active and inactive each time it is pressed This may help you to start driving and scanning the distance by pressing the button -\/ and as well to stop the racer by pressing the button. This method will set the L\+E\+Ds depending on the mode and sets the servo back to center and stopps the racer when leaving the active mode. You can leave or enter the active mode as well by setting using set\+\_\+active() and set\+\_\+inactive(). The button itself triggers and internall interrupt event and sets the active state -\/ but you have to continously call that method to switch between inactive and active mode depending on the active state. If in inactive mode and fun is enabeld by just setting the coderacer\+\_\+fun\+\_\+enabled = true ... some fun will happen \+:-\/) - -\begin{DoxyReturn}{Returns} -True if the coderacer is in active mode. False if in inactive mode. -\end{DoxyReturn} - - -Definition at line 348 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -348 \{ -349 \textcolor{keywordflow}{if} (\_coderracer\_activ != coderracer\_activ) \{ -350 \_coderracer\_activ = coderracer\_activ; -351 \textcolor{keywordflow}{if} (\textcolor{keyword}{true} == \_coderracer\_activ) \{ -352 set\_leds\_all\_off(); -353 delay(500); -354 \} -355 \textcolor{keywordflow}{else} \{ -356 stop\_driving(); -357 set\_leds\_all\_on(); -358 delay(200); -359 servo\_set\_to\_center(); -360 \_servo\_look\_around\_at\_ms = millis() + random(20000, 120000); -361 \} -362 \} -363 -364 \textcolor{keywordflow}{if} ((\textcolor{keyword}{false} == \_coderracer\_activ) && (\textcolor{keyword}{true} == coderacer\_fun\_enabled)) \{ -365 kitt(); -366 look\_around(); -367 \} -368 -369 \textcolor{keywordflow}{return}(\_coderracer\_activ); -370 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 b/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 deleted file mode 100644 index 8f0ac29..0000000 --- a/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.md5 +++ /dev/null @@ -1 +0,0 @@ -4b1e3a7d2ca636524434d6a1e7321989 \ No newline at end of file diff --git a/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.pdf b/Doku/Doxygen/latex/d2/d40/group__higherlevelmeths_ga8be6a850099812153dcf5768d7fc8b8c_cgraph.pdf deleted file mode 100644 index 39351de10bc352dc4c34dfad5c13a5a81dd65d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13751 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 diff --git a/Doku/Doxygen/latex/d3/d17/group__lowerlevelservo.tex b/Doku/Doxygen/latex/d3/d17/group__lowerlevelservo.tex deleted file mode 100644 index 22bb177..0000000 --- a/Doku/Doxygen/latex/d3/d17/group__lowerlevelservo.tex +++ /dev/null @@ -1,12 +0,0 @@ -\hypertarget{group__lowerlevelservo}{}\section{Lower level servo drive methods and getters} -\label{group__lowerlevelservo}\index{Lower level servo drive methods and getters@{Lower level servo drive methods and getters}} -\subsection*{Modules} -\begin{DoxyCompactItemize} -\item -\hyperlink{group__lowerlevelservomeths}{Methods} -\item -\hyperlink{group__lowerlevelservogetters}{Getters} -\end{DoxyCompactItemize} - - -\subsection{Detailed Description} diff --git a/Doku/Doxygen/latex/d4/df4/group__lowerlevelservogetters.tex b/Doku/Doxygen/latex/d4/df4/group__lowerlevelservogetters.tex deleted file mode 100644 index 0128d12..0000000 --- a/Doku/Doxygen/latex/d4/df4/group__lowerlevelservogetters.tex +++ /dev/null @@ -1,86 +0,0 @@ -\hypertarget{group__lowerlevelservogetters}{}\section{Getters} -\label{group__lowerlevelservogetters}\index{Getters@{Getters}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -uint8\+\_\+t \hyperlink{group__lowerlevelservogetters_ga451b3ecd272e9a11de4b221f8d771432}{Code\+Racer\+::servo\+\_\+position} () -\begin{DoxyCompactList}\small\item\em Get the actual position of the servo. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelservogetters_gaeed05a3d4e06adccebdfce207b734b2f}{Code\+Racer\+::servo\+\_\+position\+\_\+set\+\_\+at\+\_\+ms} () -\begin{DoxyCompactList}\small\item\em Get the system time in ms the servo was set to the actual position. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelservogetters_ga84ba256b9ccdf0e9f4280279da68a509}{Code\+Racer\+::servo\+\_\+position\+\_\+eta\+\_\+in\+\_\+ms} () -\begin{DoxyCompactList}\small\item\em Get the system time in ms the servo will reach its position This is an estimated time. If this is a time in the future, the servo may still moving. If this is a time in the past , the servo should have reached its postion already. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerlevelservogetters_ga451b3ecd272e9a11de4b221f8d771432}\label{group__lowerlevelservogetters_ga451b3ecd272e9a11de4b221f8d771432}} -\index{Getters@{Getters}!servo\+\_\+position@{servo\+\_\+position}} -\index{servo\+\_\+position@{servo\+\_\+position}!Getters@{Getters}} -\subsubsection{\texorpdfstring{servo\+\_\+position()}{servo\_position()}} -{\footnotesize\ttfamily uint8\+\_\+t Code\+Racer\+::servo\+\_\+position (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Get the actual position of the servo. - -\begin{DoxyReturn}{Returns} -Actual position of the servo -\end{DoxyReturn} - - -Definition at line 632 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -632 \{ -633 \textcolor{keywordflow}{return}(\_servo\_position); -634 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservogetters_gaeed05a3d4e06adccebdfce207b734b2f}\label{group__lowerlevelservogetters_gaeed05a3d4e06adccebdfce207b734b2f}} -\index{Getters@{Getters}!servo\+\_\+position\+\_\+set\+\_\+at\+\_\+ms@{servo\+\_\+position\+\_\+set\+\_\+at\+\_\+ms}} -\index{servo\+\_\+position\+\_\+set\+\_\+at\+\_\+ms@{servo\+\_\+position\+\_\+set\+\_\+at\+\_\+ms}!Getters@{Getters}} -\subsubsection{\texorpdfstring{servo\+\_\+position\+\_\+set\+\_\+at\+\_\+ms()}{servo\_position\_set\_at\_ms()}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::servo\+\_\+position\+\_\+set\+\_\+at\+\_\+ms (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Get the system time in ms the servo was set to the actual position. - -\begin{DoxyReturn}{Returns} -System time in ms the servo was set -\end{DoxyReturn} - - -Definition at line 639 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -639 \{ -640 \textcolor{keywordflow}{return}(\_servo\_position\_set\_at\_ms); -641 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservogetters_ga84ba256b9ccdf0e9f4280279da68a509}\label{group__lowerlevelservogetters_ga84ba256b9ccdf0e9f4280279da68a509}} -\index{Getters@{Getters}!servo\+\_\+position\+\_\+eta\+\_\+in\+\_\+ms@{servo\+\_\+position\+\_\+eta\+\_\+in\+\_\+ms}} -\index{servo\+\_\+position\+\_\+eta\+\_\+in\+\_\+ms@{servo\+\_\+position\+\_\+eta\+\_\+in\+\_\+ms}!Getters@{Getters}} -\subsubsection{\texorpdfstring{servo\+\_\+position\+\_\+eta\+\_\+in\+\_\+ms()}{servo\_position\_eta\_in\_ms()}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::servo\+\_\+position\+\_\+eta\+\_\+in\+\_\+ms (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Get the system time in ms the servo will reach its position This is an estimated time. If this is a time in the future, the servo may still moving. If this is a time in the past , the servo should have reached its postion already. - -\begin{DoxyReturn}{Returns} -System time in ms the servo will reach its position -\end{DoxyReturn} - - -Definition at line 649 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -649 \{ -650 \textcolor{keywordflow}{return}(\_servo\_position\_eta\_in\_ms); -651 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/d6/d98/group__lowerleveldrives.tex b/Doku/Doxygen/latex/d6/d98/group__lowerleveldrives.tex deleted file mode 100644 index 946be3d..0000000 --- a/Doku/Doxygen/latex/d6/d98/group__lowerleveldrives.tex +++ /dev/null @@ -1,12 +0,0 @@ -\hypertarget{group__lowerleveldrives}{}\section{Lower level drives methods and getters} -\label{group__lowerleveldrives}\index{Lower level drives methods and getters@{Lower level drives methods and getters}} -\subsection*{Modules} -\begin{DoxyCompactItemize} -\item -\hyperlink{group__lowerleveldrivesmeths}{Methods} -\item -\hyperlink{group__lowerleveldrivesgetters}{Getters} -\end{DoxyCompactItemize} - - -\subsection{Detailed Description} diff --git a/Doku/Doxygen/latex/d6/dfc/group__lowerlevelusmeths.tex b/Doku/Doxygen/latex/d6/dfc/group__lowerlevelusmeths.tex deleted file mode 100644 index 5953eb0..0000000 --- a/Doku/Doxygen/latex/d6/dfc/group__lowerlevelusmeths.tex +++ /dev/null @@ -1,292 +0,0 @@ -\hypertarget{group__lowerlevelusmeths}{}\section{Methods} -\label{group__lowerlevelusmeths}\index{Methods@{Methods}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -unsigned long \hyperlink{group__lowerlevelusmeths_ga5f034198a28b069478c454c63dbfa225}{Code\+Racer\+::usonic\+\_\+measure\+\_\+cm} () -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in cm. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusmeths_gaa01602a576fd57609bc7e08f8ef32e58}{Code\+Racer\+::usonic\+\_\+measure\+\_\+us} () -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in microseconds. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusmeths_gafdd5c75d7a8e7b7c993e512ee93dde9a}{Code\+Racer\+::usonic\+\_\+measure\+\_\+cm} (unsigned long max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us) -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in cm. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusmeths_ga1f3401ef472cb11997e7dc98ef3e2424}{Code\+Racer\+::usonic\+\_\+measure\+\_\+us} (unsigned long max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us) -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in microseconds. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusmeths_ga0c00edbbf4a3169613c9ea84d6e7dc13}{Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm} () -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in cm. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusmeths_gad4309b6da17085575fb0c55559e240b8}{Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us} () -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in microseconds. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusmeths_gab413551ea8a67e1b60eda1671029b645}{Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm} (unsigned long max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us) -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in cm. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusmeths_ga1b5b43372082f5daeee47410a09a590c}{Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us} (unsigned long max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us) -\begin{DoxyCompactList}\small\item\em Measures the distance to the next object in front of the ultra sonic sensor in microseconds. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerlevelusmeths_ga5f034198a28b069478c454c63dbfa225}\label{group__lowerlevelusmeths_ga5f034198a28b069478c454c63dbfa225}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+cm@{usonic\+\_\+measure\+\_\+cm}} -\index{usonic\+\_\+measure\+\_\+cm@{usonic\+\_\+measure\+\_\+cm}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+cm()}{usonic\_measure\_cm()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+cm (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in cm. - -This is the medium one out of 3 measurements. The maximum measured distance is about 100cm and defined by the U\+S\+\_\+\+M\+A\+X\+\_\+\+E\+C\+H\+O\+\_\+\+T\+I\+M\+E\+\_\+\+US setting in the header file. \begin{DoxyReturn}{Returns} -The measured distance in cm. -\end{DoxyReturn} - - -Definition at line 672 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -673 \{ -674 \textcolor{keywordflow}{return}(usonic\_measure\_cm(US\_MAX\_ECHO\_TIME\_US)); -675 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusmeths_gaa01602a576fd57609bc7e08f8ef32e58}\label{group__lowerlevelusmeths_gaa01602a576fd57609bc7e08f8ef32e58}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+us@{usonic\+\_\+measure\+\_\+us}} -\index{usonic\+\_\+measure\+\_\+us@{usonic\+\_\+measure\+\_\+us}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+us()}{usonic\_measure\_us()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+us (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in microseconds. - -This is the medium one out of 3 measurements. The maximum measured distance is about 6000 microseconds and defined by the U\+S\+\_\+\+M\+A\+X\+\_\+\+E\+C\+H\+O\+\_\+\+T\+I\+M\+E\+\_\+\+US setting in the header file. \begin{DoxyReturn}{Returns} -The measured distance in microseconds. -\end{DoxyReturn} - - -Definition at line 682 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -683 \{ -684 \textcolor{keywordflow}{return}(usonic\_measure\_us(US\_MAX\_ECHO\_TIME\_US)); -685 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusmeths_gafdd5c75d7a8e7b7c993e512ee93dde9a}\label{group__lowerlevelusmeths_gafdd5c75d7a8e7b7c993e512ee93dde9a}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+cm@{usonic\+\_\+measure\+\_\+cm}} -\index{usonic\+\_\+measure\+\_\+cm@{usonic\+\_\+measure\+\_\+cm}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+cm()}{usonic\_measure\_cm()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+cm (\begin{DoxyParamCaption}\item[{unsigned long}]{max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in cm. - -This is the medium one out of 3 measurements. Be careful with high values for max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us -\/ this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm. -\begin{DoxyParams}{Parameters} -{\em max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us} & Defines the maximum echo run time and by that the maximum of distance that can be measured. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -The measured distance in cm. -\end{DoxyReturn} - - -Definition at line 694 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -695 \{ -696 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} echo\_runtime\_us = usonic\_measure\_us(max\_echo\_run\_time\_us); -697 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} distance\_cm = echo\_runtime\_us * 0.0172; -698 \textcolor{comment}{//Serial.print("MEASURE\_DISTANCE. Distance in cm is: ");} -699 \textcolor{comment}{//Serial.println(distance\_cm);} -700 \_usonic\_distance\_cm = distance\_cm; -701 \textcolor{keywordflow}{return}(distance\_cm); -702 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusmeths_ga1f3401ef472cb11997e7dc98ef3e2424}\label{group__lowerlevelusmeths_ga1f3401ef472cb11997e7dc98ef3e2424}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+us@{usonic\+\_\+measure\+\_\+us}} -\index{usonic\+\_\+measure\+\_\+us@{usonic\+\_\+measure\+\_\+us}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+us()}{usonic\_measure\_us()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+us (\begin{DoxyParamCaption}\item[{unsigned long}]{max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in microseconds. - -This is the medium one out of 3 measurements. Be careful with high values for max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us -\/ this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm. -\begin{DoxyParams}{Parameters} -{\em max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us} & Defines the maximum echo run time in microseconds and by that the maximum of distance that can be measured. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -The measured distance in microseconds. -\end{DoxyReturn} - - -Definition at line 711 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -712 \{ -713 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} echo\_runtime\_us[3] = \{ 0,0,0 \}; -714 uint8\_t measnr = 0; -715 -716 \textcolor{keywordflow}{do} \{ -717 echo\_runtime\_us[measnr] = usonic\_measure\_single\_shot\_us(max\_echo\_run\_time\_us); -718 \textcolor{keywordflow}{if} (echo\_runtime\_us[measnr] > 200) \{ -719 measnr++; -720 \} -721 \} \textcolor{keywordflow}{while} (measnr < 3); -722 -723 \textcolor{comment}{// we will take the medium out of 3 values ... } -724 \textcolor{keywordflow}{if} (echo\_runtime\_us[0] > echo\_runtime\_us[1]) \{ std::swap(echo\_runtime\_us[0], echo\_runtime\_us[1]); \} -725 \textcolor{keywordflow}{if} (echo\_runtime\_us[1] > echo\_runtime\_us[2]) \{ std::swap(echo\_runtime\_us[1], echo\_runtime\_us[2]); \} -726 \textcolor{keywordflow}{if} (echo\_runtime\_us[0] > echo\_runtime\_us[1]) \{ std::swap(echo\_runtime\_us[0], echo\_runtime\_us[1]); \} -727 -728 \textcolor{comment}{//Serial.print("MEASURE\_DISTANCE\_US. Echo runtime in us is: ");} -729 \textcolor{comment}{//Serial.println(echo\_runtime\_us[1]);} -730 -731 \textcolor{comment}{// if the stop at minimal distance is enabeled - check for minimal distance is reached} -732 \textcolor{keywordflow}{if} (\textcolor{keyword}{true} == \_coderacer\_stop\_at\_distance\_enabled) \{ -733 \textcolor{keywordflow}{if} (echo\_runtime\_us[1] <= \_usonic\_stop\_distance\_us) \{ -734 \_coderacer\_stopped\_at\_min\_distance = \textcolor{keyword}{true}; -735 stop\_driving(); -736 \_coderacer\_stop\_at\_distance\_enabled = \textcolor{keyword}{false}; -737 \} -738 \} -739 \_usonic\_distance\_us = echo\_runtime\_us[1]; -740 \textcolor{keywordflow}{return}(echo\_runtime\_us[1]); -741 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusmeths_ga0c00edbbf4a3169613c9ea84d6e7dc13}\label{group__lowerlevelusmeths_ga0c00edbbf4a3169613c9ea84d6e7dc13}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm}} -\index{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm()}{usonic\_measure\_single\_shot\_cm()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in cm. - -This is a one shot measurement. The maximum measured distance is about 6000 microseconds and defined by the U\+S\+\_\+\+M\+A\+X\+\_\+\+E\+C\+H\+O\+\_\+\+T\+I\+M\+E\+\_\+\+US setting in the header file. \begin{DoxyReturn}{Returns} -The measured distance in cm. -\end{DoxyReturn} - - -Definition at line 748 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -749 \{ -750 \textcolor{keywordflow}{return}(usonic\_measure\_single\_shot\_cm(US\_MAX\_ECHO\_TIME\_US)); -751 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusmeths_gad4309b6da17085575fb0c55559e240b8}\label{group__lowerlevelusmeths_gad4309b6da17085575fb0c55559e240b8}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us}} -\index{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us()}{usonic\_measure\_single\_shot\_us()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in microseconds. - -This is a one shot measurement. The maximum measured distance is about 6000 microseconds and defined by the U\+S\+\_\+\+M\+A\+X\+\_\+\+E\+C\+H\+O\+\_\+\+T\+I\+M\+E\+\_\+\+US setting in the header file. \begin{DoxyReturn}{Returns} -The measured distance in microseconds. -\end{DoxyReturn} - - -Definition at line 758 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -759 \{ -760 \textcolor{keywordflow}{return}(usonic\_measure\_single\_shot\_us(US\_MAX\_ECHO\_TIME\_US)); -761 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusmeths_gab413551ea8a67e1b60eda1671029b645}\label{group__lowerlevelusmeths_gab413551ea8a67e1b60eda1671029b645}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm}} -\index{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm()}{usonic\_measure\_single\_shot\_cm()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+cm (\begin{DoxyParamCaption}\item[{unsigned long}]{max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in cm. - -This is a one shot measurement. Be careful with high values for max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us -\/ this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm. -\begin{DoxyParams}{Parameters} -{\em max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us} & Defines the maximum echo run time in microseconds and by that the maximum of distance that can be measured. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -The measured distance in cm. -\end{DoxyReturn} - - -Definition at line 770 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -771 \{ -772 \textcolor{comment}{// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or - 0,0344cm/microsec} -773 \textcolor{comment}{// the echo has to go the distance twice - forth and back - so the duration has to be the half of the - measured one} -774 \textcolor{comment}{// distance\_cm = echo\_duration/2 * 0,0344 or distance\_cm = echo\_duration/2 / 29,1 or distance\_cm = - echo\_duration * 0,0172} -775 \textcolor{comment}{// distance\_cm = (echo\_duration/2) / 29.1;} -776 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} echo\_runtime\_us = usonic\_measure\_single\_shot\_us(max\_echo\_run\_time\_us); -777 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} distance\_cm = echo\_runtime\_us * 0.0172; -778 \textcolor{comment}{//Serial.print("MEASURE\_DISTANCE. Distance in cm is: ");} -779 \textcolor{comment}{//Serial.println(distance\_cm);} -780 \_usonic\_distance\_cm = distance\_cm; -781 \textcolor{keywordflow}{return}(distance\_cm); -782 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusmeths_ga1b5b43372082f5daeee47410a09a590c}\label{group__lowerlevelusmeths_ga1b5b43372082f5daeee47410a09a590c}} -\index{Methods@{Methods}!usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us}} -\index{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us@{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us}!Methods@{Methods}} -\subsubsection{\texorpdfstring{usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us()}{usonic\_measure\_single\_shot\_us()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+measure\+\_\+single\+\_\+shot\+\_\+us (\begin{DoxyParamCaption}\item[{unsigned long}]{max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us }\end{DoxyParamCaption})} - - - -Measures the distance to the next object in front of the ultra sonic sensor in microseconds. - -This is a one shot measurement. Be careful with high values for max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us -\/ this may increase run time due to the fact that if there is nothing in range of the sensor it will wait until this specified run time of the echo is over. The maximum range the sensor is specified for is about 300cm. -\begin{DoxyParams}{Parameters} -{\em max\+\_\+echo\+\_\+run\+\_\+time\+\_\+us} & Defines the maximum echo run time in microseconds and by that the maximum of distance that can be measured. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -The measured distance in microseconds. -\end{DoxyReturn} - - -Definition at line 791 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -792 \{ -793 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} echo\_runtime\_us; -794 \textcolor{comment}{// start measurement - send a short pulse "HIGH" to the TRIG pin of the ultrasonic sensor} -795 pinMode(\_us\_echo\_pin, OUTPUT); -796 pinMode(\_us\_echo\_pin, INPUT); -797 digitalWrite(\_us\_trigger\_pin, LOW); -798 delayMicroseconds(2); -799 digitalWrite(\_us\_trigger\_pin, HIGH); -800 delayMicroseconds(10); -801 digitalWrite(\_us\_trigger\_pin, LOW); -802 \textcolor{comment}{// measure runtime in microseconds until the ECHO pin aof the sensor goes HIGH} -803 echo\_runtime\_us = pulseInLong(\_us\_echo\_pin, HIGH, max\_echo\_run\_time\_us); -804 \textcolor{keywordflow}{if} (echo\_runtime\_us == 0) \{ -805 echo\_runtime\_us = max\_echo\_run\_time\_us; \textcolor{comment}{// US\_MAX\_ECHO\_TIME\_US;} -806 \} -807 \textcolor{comment}{//Serial.print("MEASURE\_DISTANCE\_US. Echo runtime in us is: ");} -808 \textcolor{comment}{//Serial.println(echo\_runtime\_us);} -809 \_usonic\_distance\_us = echo\_runtime\_us; -810 \textcolor{keywordflow}{return}(echo\_runtime\_us); -811 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/d7/d0f/group__lowerlevelled.tex b/Doku/Doxygen/latex/d7/d0f/group__lowerlevelled.tex deleted file mode 100644 index 8f7aa14..0000000 --- a/Doku/Doxygen/latex/d7/d0f/group__lowerlevelled.tex +++ /dev/null @@ -1,10 +0,0 @@ -\hypertarget{group__lowerlevelled}{}\section{Lower level L\+ED methods} -\label{group__lowerlevelled}\index{Lower level L\+E\+D methods@{Lower level L\+E\+D methods}} -\subsection*{Modules} -\begin{DoxyCompactItemize} -\item -\hyperlink{group__lowerlevelledmeths}{Methods} -\end{DoxyCompactItemize} - - -\subsection{Detailed Description} diff --git a/Doku/Doxygen/latex/d7/d45/group__higherlevelgetters.tex b/Doku/Doxygen/latex/d7/d45/group__higherlevelgetters.tex deleted file mode 100644 index 0c89822..0000000 --- a/Doku/Doxygen/latex/d7/d45/group__higherlevelgetters.tex +++ /dev/null @@ -1,186 +0,0 @@ -\hypertarget{group__higherlevelgetters}{}\section{Getters and setters} -\label{group__higherlevelgetters}\index{Getters and setters@{Getters and setters}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -bool \hyperlink{group__higherlevelgetters_gae8b8c0ab24ccb572281785aeca8541e1}{Code\+Racer\+::stopped\+\_\+at\+\_\+min\+\_\+distance} () -\begin{DoxyCompactList}\small\item\em Returns true if the racer was stopped at minimum distance. This set to false each time start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance() is called. \end{DoxyCompactList}\item -bool \hyperlink{group__higherlevelgetters_ga33dcd96e9b12dec794c56be85ec1ee05}{Code\+Racer\+::is\+\_\+driving} () -\begin{DoxyCompactList}\small\item\em Return true if the racer is driving -\/ forward or backward. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__higherlevelgetters_gaf04fd16ca0e2ace656f9549c43d16459}{Code\+Racer\+::turn\+\_\+left\+\_\+for\+\_\+ms} () -\begin{DoxyCompactList}\small\item\em Returns the duration of time that is internally stored and used for turning the racer left. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__higherlevelgetters_gac0698f02f6a21d9d1f5b9cf2820306cf}{Code\+Racer\+::turn\+\_\+right\+\_\+for\+\_\+ms} () -\begin{DoxyCompactList}\small\item\em Returns the duration of time that is internally stored and used for turning the racer left. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelgetters_ga62f1c0eea56e27d0853cb58f30eb140d}{Code\+Racer\+::set\+\_\+inactive} () -\begin{DoxyCompactList}\small\item\em Sets the coderracer\+\_\+active state to inactive. If start\+\_\+stop() is used -\/ the inactive mode will be entered. \end{DoxyCompactList}\item -void \hyperlink{group__higherlevelgetters_ga415c69930f291d5e06b7211b31843310}{Code\+Racer\+::set\+\_\+active} () -\begin{DoxyCompactList}\small\item\em Sets the coderracer\+\_\+active state to active. If start\+\_\+stop() is used -\/ the active mode will be entered. \end{DoxyCompactList}\item -bool \hyperlink{group__higherlevelgetters_gaa0ab4d6a754a23ea13664a553bcc8ff2}{Code\+Racer\+::is\+\_\+active} () -\begin{DoxyCompactList}\small\item\em Checks if coderracer\+\_\+activ is set. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__higherlevelgetters_gae8b8c0ab24ccb572281785aeca8541e1}\label{group__higherlevelgetters_gae8b8c0ab24ccb572281785aeca8541e1}} -\index{Getters and setters@{Getters and setters}!stopped\+\_\+at\+\_\+min\+\_\+distance@{stopped\+\_\+at\+\_\+min\+\_\+distance}} -\index{stopped\+\_\+at\+\_\+min\+\_\+distance@{stopped\+\_\+at\+\_\+min\+\_\+distance}!Getters and setters@{Getters and setters}} -\subsubsection{\texorpdfstring{stopped\+\_\+at\+\_\+min\+\_\+distance()}{stopped\_at\_min\_distance()}} -{\footnotesize\ttfamily bool Code\+Racer\+::stopped\+\_\+at\+\_\+min\+\_\+distance (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Returns true if the racer was stopped at minimum distance. This set to false each time start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance() is called. - -\begin{DoxyReturn}{Returns} -True if stopped. -\end{DoxyReturn} - - -Definition at line 380 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -380 \{ -381 \textcolor{keywordflow}{return}(\_coderacer\_stopped\_at\_min\_distance); -382 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelgetters_ga33dcd96e9b12dec794c56be85ec1ee05}\label{group__higherlevelgetters_ga33dcd96e9b12dec794c56be85ec1ee05}} -\index{Getters and setters@{Getters and setters}!is\+\_\+driving@{is\+\_\+driving}} -\index{is\+\_\+driving@{is\+\_\+driving}!Getters and setters@{Getters and setters}} -\subsubsection{\texorpdfstring{is\+\_\+driving()}{is\_driving()}} -{\footnotesize\ttfamily bool Code\+Racer\+::is\+\_\+driving (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Return true if the racer is driving -\/ forward or backward. - -\begin{DoxyReturn}{Returns} -True if driving forward or backward -\end{DoxyReturn} - - -Definition at line 387 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -387 \{ -388 \textcolor{keywordflow}{return}(\_drive); -389 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelgetters_gaf04fd16ca0e2ace656f9549c43d16459}\label{group__higherlevelgetters_gaf04fd16ca0e2ace656f9549c43d16459}} -\index{Getters and setters@{Getters and setters}!turn\+\_\+left\+\_\+for\+\_\+ms@{turn\+\_\+left\+\_\+for\+\_\+ms}} -\index{turn\+\_\+left\+\_\+for\+\_\+ms@{turn\+\_\+left\+\_\+for\+\_\+ms}!Getters and setters@{Getters and setters}} -\subsubsection{\texorpdfstring{turn\+\_\+left\+\_\+for\+\_\+ms()}{turn\_left\_for\_ms()}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::turn\+\_\+left\+\_\+for\+\_\+ms (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Returns the duration of time that is internally stored and used for turning the racer left. - -\begin{DoxyReturn}{Returns} -Time to turn left in ms -\end{DoxyReturn} - - -Definition at line 394 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -394 \{ -395 \textcolor{keywordflow}{return}(\_turn\_left\_for\_ms); -396 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelgetters_gac0698f02f6a21d9d1f5b9cf2820306cf}\label{group__higherlevelgetters_gac0698f02f6a21d9d1f5b9cf2820306cf}} -\index{Getters and setters@{Getters and setters}!turn\+\_\+right\+\_\+for\+\_\+ms@{turn\+\_\+right\+\_\+for\+\_\+ms}} -\index{turn\+\_\+right\+\_\+for\+\_\+ms@{turn\+\_\+right\+\_\+for\+\_\+ms}!Getters and setters@{Getters and setters}} -\subsubsection{\texorpdfstring{turn\+\_\+right\+\_\+for\+\_\+ms()}{turn\_right\_for\_ms()}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::turn\+\_\+right\+\_\+for\+\_\+ms (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Returns the duration of time that is internally stored and used for turning the racer left. - -\begin{DoxyReturn}{Returns} -Time to turn left in ms -\end{DoxyReturn} - - -Definition at line 401 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -401 \{ -402 \textcolor{keywordflow}{return}(\_turn\_right\_for\_ms); -403 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelgetters_ga62f1c0eea56e27d0853cb58f30eb140d}\label{group__higherlevelgetters_ga62f1c0eea56e27d0853cb58f30eb140d}} -\index{Getters and setters@{Getters and setters}!set\+\_\+inactive@{set\+\_\+inactive}} -\index{set\+\_\+inactive@{set\+\_\+inactive}!Getters and setters@{Getters and setters}} -\subsubsection{\texorpdfstring{set\+\_\+inactive()}{set\_inactive()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+inactive (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Sets the coderracer\+\_\+active state to inactive. If start\+\_\+stop() is used -\/ the inactive mode will be entered. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 408 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -408 \{ -409 coderracer\_activ = \textcolor{keyword}{false}; -410 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelgetters_ga415c69930f291d5e06b7211b31843310}\label{group__higherlevelgetters_ga415c69930f291d5e06b7211b31843310}} -\index{Getters and setters@{Getters and setters}!set\+\_\+active@{set\+\_\+active}} -\index{set\+\_\+active@{set\+\_\+active}!Getters and setters@{Getters and setters}} -\subsubsection{\texorpdfstring{set\+\_\+active()}{set\_active()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+active (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Sets the coderracer\+\_\+active state to active. If start\+\_\+stop() is used -\/ the active mode will be entered. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 415 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -415 \{ -416 coderracer\_activ = \textcolor{keyword}{true}; -417 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__higherlevelgetters_gaa0ab4d6a754a23ea13664a553bcc8ff2}\label{group__higherlevelgetters_gaa0ab4d6a754a23ea13664a553bcc8ff2}} -\index{Getters and setters@{Getters and setters}!is\+\_\+active@{is\+\_\+active}} -\index{is\+\_\+active@{is\+\_\+active}!Getters and setters@{Getters and setters}} -\subsubsection{\texorpdfstring{is\+\_\+active()}{is\_active()}} -{\footnotesize\ttfamily bool Code\+Racer\+::is\+\_\+active (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Checks if coderracer\+\_\+activ is set. - -coderracer\+\_\+activ is toggled each time the button is pressed. After power on coderracer\+\_\+activ is set to False. \begin{DoxyReturn}{Returns} -True id coderracer\+\_\+activ is set -\/ False if not. -\end{DoxyReturn} - - -Definition at line 424 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -424 \{ -425 \textcolor{keywordflow}{return}(coderracer\_activ); -426 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/d8/d7a/group__lowerlevelfun.tex b/Doku/Doxygen/latex/d8/d7a/group__lowerlevelfun.tex deleted file mode 100644 index 357630e..0000000 --- a/Doku/Doxygen/latex/d8/d7a/group__lowerlevelfun.tex +++ /dev/null @@ -1,99 +0,0 @@ -\hypertarget{group__lowerlevelfun}{}\section{Lower level fun stuff methods} -\label{group__lowerlevelfun}\index{Lower level fun stuff methods@{Lower level fun stuff methods}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -void \hyperlink{group__lowerlevelfun_ga04309a38252639a8eaa43809c04c11c8}{Code\+Racer\+::look\+\_\+around} () -\begin{DoxyCompactList}\small\item\em Fun stuff -\/ will move the servo around after a random amount of time. \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelfun_ga3b6f819fb82d910888fbc87abff1470c}{Code\+Racer\+::kitt} () -\begin{DoxyCompactList}\small\item\em Fun stuff -\/ you know Knightrider... \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerlevelfun_ga04309a38252639a8eaa43809c04c11c8}\label{group__lowerlevelfun_ga04309a38252639a8eaa43809c04c11c8}} -\index{Lower level fun stuff methods@{Lower level fun stuff methods}!look\+\_\+around@{look\+\_\+around}} -\index{look\+\_\+around@{look\+\_\+around}!Lower level fun stuff methods@{Lower level fun stuff methods}} -\subsubsection{\texorpdfstring{look\+\_\+around()}{look\_around()}} -{\footnotesize\ttfamily void Code\+Racer\+::look\+\_\+around (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Fun stuff -\/ will move the servo around after a random amount of time. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 440 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -441 \{ -442 \textcolor{keywordflow}{if} (\_servo\_look\_around\_at\_ms < millis()) \{ -443 \_servo\_look\_around\_at\_ms = millis() + random(FUN\_MIN\_PAUSE\_MS, FUN\_MAX\_PAUSE\_MS); -444 servo\_set\_to\_left(); -445 delay(500); -446 servo\_set\_to\_right(); -447 delay(800); -448 servo\_set\_to\_center(); -449 delay(300); -450 servo\_set\_to\_left(); -451 delay(100); -452 servo\_set\_to\_center(); -453 \} -454 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelfun_ga3b6f819fb82d910888fbc87abff1470c}\label{group__lowerlevelfun_ga3b6f819fb82d910888fbc87abff1470c}} -\index{Lower level fun stuff methods@{Lower level fun stuff methods}!kitt@{kitt}} -\index{kitt@{kitt}!Lower level fun stuff methods@{Lower level fun stuff methods}} -\subsubsection{\texorpdfstring{kitt()}{kitt()}} -{\footnotesize\ttfamily void Code\+Racer\+::kitt (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Fun stuff -\/ you know Knightrider... - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 459 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -460 \{ -461 \textcolor{keywordflow}{if} (millis() - \_last\_led\_switched\_at\_ms > LED\_SWITCH\_MS) \{ -462 \_last\_led\_switched\_at\_ms = millis(); -463 \textcolor{keywordflow}{if} (\_last\_led\_on >= 5) \{ -464 \_led\_count = -1; -465 \} -466 \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} (\_last\_led\_on <= 0) \{ -467 \_led\_count = 1; -468 \} -469 \_last\_led\_on = \_last\_led\_on + \_led\_count; -470 \textcolor{keywordflow}{switch} (\_last\_led\_on) \{ -471 \textcolor{keywordflow}{case} 0: -472 set\_leds\_left\_stop\_frwd\_right(LEDON, LEDOFF, LEDOFF, LEDOFF); -473 \textcolor{keywordflow}{break}; -474 \textcolor{keywordflow}{case} 1: -475 set\_leds\_left\_stop\_frwd\_right(LEDON, LEDOFF, LEDOFF, LEDOFF); -476 \textcolor{keywordflow}{break}; -477 \textcolor{keywordflow}{case} 2: -478 set\_leds\_left\_stop\_frwd\_right(LEDOFF, LEDON, LEDOFF, LEDOFF); -479 \textcolor{keywordflow}{break}; -480 \textcolor{keywordflow}{case} 3: -481 set\_leds\_left\_stop\_frwd\_right(LEDOFF, LEDOFF, LEDON, LEDOFF); -482 \textcolor{keywordflow}{break}; -483 \textcolor{keywordflow}{case} 4: -484 \textcolor{keywordflow}{case} 5: -485 set\_leds\_left\_stop\_frwd\_right(LEDOFF, LEDOFF, LEDOFF, LEDON); -486 \textcolor{keywordflow}{break}; -487 \} -488 \} -489 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/d9/d80/group__higherlevel.tex b/Doku/Doxygen/latex/d9/d80/group__higherlevel.tex deleted file mode 100644 index aaba17f..0000000 --- a/Doku/Doxygen/latex/d9/d80/group__higherlevel.tex +++ /dev/null @@ -1,12 +0,0 @@ -\hypertarget{group__higherlevel}{}\section{Higher level methods, setters and getters} -\label{group__higherlevel}\index{Higher level methods, setters and getters@{Higher level methods, setters and getters}} -\subsection*{Modules} -\begin{DoxyCompactItemize} -\item -\hyperlink{group__higherlevelmeths}{Methods} -\item -\hyperlink{group__higherlevelgetters}{Getters and setters} -\end{DoxyCompactItemize} - - -\subsection{Detailed Description} diff --git a/Doku/Doxygen/latex/da/daf/group__lowerlevelus.tex b/Doku/Doxygen/latex/da/daf/group__lowerlevelus.tex deleted file mode 100644 index e5752a6..0000000 --- a/Doku/Doxygen/latex/da/daf/group__lowerlevelus.tex +++ /dev/null @@ -1,12 +0,0 @@ -\hypertarget{group__lowerlevelus}{}\section{Lower level ultra sonic methods and getters} -\label{group__lowerlevelus}\index{Lower level ultra sonic methods and getters@{Lower level ultra sonic methods and getters}} -\subsection*{Modules} -\begin{DoxyCompactItemize} -\item -\hyperlink{group__lowerlevelusmeths}{Methods} -\item -\hyperlink{group__lowerlevelusgetters}{Setters and getters} -\end{DoxyCompactItemize} - - -\subsection{Detailed Description} diff --git a/Doku/Doxygen/latex/db/dd5/group__lowerlevelservomeths.tex b/Doku/Doxygen/latex/db/dd5/group__lowerlevelservomeths.tex deleted file mode 100644 index fa51feb..0000000 --- a/Doku/Doxygen/latex/db/dd5/group__lowerlevelservomeths.tex +++ /dev/null @@ -1,233 +0,0 @@ -\hypertarget{group__lowerlevelservomeths}{}\section{Methods} -\label{group__lowerlevelservomeths}\index{Methods@{Methods}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -void \hyperlink{group__lowerlevelservomeths_ga687beb327e20f4d0541d1ac9e29c01c3}{Code\+Racer\+::servo\+\_\+settings} (uint8\+\_\+t pos\+\_\+center, uint8\+\_\+t pos\+\_\+left, uint8\+\_\+t pos\+\_\+right, uint8\+\_\+t sweep\+\_\+left\+\_\+pos, uint8\+\_\+t sweep\+\_\+right\+\_\+pos) -\begin{DoxyCompactList}\small\item\em Overwrites the default settings taken from header file by the parameters given to this method. \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelservomeths_ga1e9afe1f27dfc9796b4c9b3dba245365}{Code\+Racer\+::servo\+\_\+sweep} () -\begin{DoxyCompactList}\small\item\em Turns sweeping of the servo from left to right and back on. \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelservomeths_gaac73bf99cf2d19f7b1987156aa842b74}{Code\+Racer\+::servo\+\_\+set\+\_\+to\+\_\+right} () -\begin{DoxyCompactList}\small\item\em Drives the servo to the postion that is defined by \#servo\+\_\+right\+\_\+pos. \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelservomeths_gaef7d1903b65a0a8ab4fafdc53080b07d}{Code\+Racer\+::servo\+\_\+set\+\_\+to\+\_\+left} () -\begin{DoxyCompactList}\small\item\em Drives the servo to the postion that is defined by \#servo\+\_\+left\+\_\+pos. \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelservomeths_gad1f28aa91079e88fc3093e3074edfb32}{Code\+Racer\+::servo\+\_\+set\+\_\+to\+\_\+center} () -\begin{DoxyCompactList}\small\item\em Drives the servo to the postion that is defined by \#servo\+\_\+center\+\_\+pos. \end{DoxyCompactList}\item -uint8\+\_\+t \hyperlink{group__lowerlevelservomeths_ga0149226288bff2290d52ed1cbd674edd}{Code\+Racer\+::servo\+\_\+set\+\_\+position\+\_\+wait} (uint8\+\_\+t position) -\begin{DoxyCompactList}\small\item\em Drive the servo to the postion given to this method. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelservomeths_gab8831340049de6dbddeda997745725e6}{Code\+Racer\+::servo\+\_\+set\+\_\+position} (uint8\+\_\+t position) -\begin{DoxyCompactList}\small\item\em Drive the servo to the postion given to this method. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerlevelservomeths_ga687beb327e20f4d0541d1ac9e29c01c3}\label{group__lowerlevelservomeths_ga687beb327e20f4d0541d1ac9e29c01c3}} -\index{Methods@{Methods}!servo\+\_\+settings@{servo\+\_\+settings}} -\index{servo\+\_\+settings@{servo\+\_\+settings}!Methods@{Methods}} -\subsubsection{\texorpdfstring{servo\+\_\+settings()}{servo\_settings()}} -{\footnotesize\ttfamily void Code\+Racer\+::servo\+\_\+settings (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{pos\+\_\+center, }\item[{uint8\+\_\+t}]{pos\+\_\+left, }\item[{uint8\+\_\+t}]{pos\+\_\+right, }\item[{uint8\+\_\+t}]{sweep\+\_\+left\+\_\+pos, }\item[{uint8\+\_\+t}]{sweep\+\_\+right\+\_\+pos }\end{DoxyParamCaption})} - - - -Overwrites the default settings taken from header file by the parameters given to this method. - - -\begin{DoxyParams}{Parameters} -{\em pos\+\_\+center} & The postion at which the servo moves to straight forward. Default is 90. Allowed 10 $<$= pos\+\_\+center $<$= 170. \\ -\hline -{\em pos\+\_\+left} & The postion at which the servo moves to the left. Default is 170. Allowed 10 $<$= pos\+\_\+center $<$= 170. \\ -\hline -{\em pos\+\_\+right} & The postion at which the servo moves to the right. Default is 10. Allowed 10 $<$= pos\+\_\+center $<$= 170. \\ -\hline -{\em sweep\+\_\+left\+\_\+pos} & If the servo is sweeping from left to the right -\/ this defines the most left postion. Default is 140. Allowed 10 $<$= pos\+\_\+center $<$= 170. \\ -\hline -{\em sweep\+\_\+right\+\_\+pos} & If the servo is sweeping from left to the right -\/ this defines the most right postion. Default is 40. Allowed 10 $<$= pos\+\_\+center $<$= 170. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 510 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -511 \{ -512 servo\_center\_pos = pos\_center; -513 servo\_left\_pos = pos\_left; -514 servo\_right\_pos = pos\_right; -515 servo\_sweep\_left\_pos = sweep\_left\_pos; -516 servo\_sweep\_right\_pos = sweep\_right\_pos; -517 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservomeths_ga1e9afe1f27dfc9796b4c9b3dba245365}\label{group__lowerlevelservomeths_ga1e9afe1f27dfc9796b4c9b3dba245365}} -\index{Methods@{Methods}!servo\+\_\+sweep@{servo\+\_\+sweep}} -\index{servo\+\_\+sweep@{servo\+\_\+sweep}!Methods@{Methods}} -\subsubsection{\texorpdfstring{servo\+\_\+sweep()}{servo\_sweep()}} -{\footnotesize\ttfamily void Code\+Racer\+::servo\+\_\+sweep (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Turns sweeping of the servo from left to right and back on. - -The sweeping range is defind by \#servo\+\_\+sweep\+\_\+left\+\_\+pos and \#servo\+\_\+sweep\+\_\+right\+\_\+pos attributes. Both can be set by either servo\+\_\+settings() or as public members. Every time servo\+\_\+sweep() is called the servo is driven by 5 steps until either \#servo\+\_\+sweep\+\_\+left\+\_\+pos or \#servo\+\_\+sweep\+\_\+right\+\_\+pos is reached. Then it will turn the direction and step to the other side every time this method is called. \begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 526 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -527 \{ -528 uint8\_t position; -529 \_servo\_sweep = \textcolor{keyword}{true}; -530 \textcolor{keywordflow}{if} (millis() - \_servo\_position\_set\_at\_ms > SERVO\_SWEEP\_MS) \{ -531 position = \_servo\_position + \_servo\_sweep\_step; -532 \textcolor{comment}{//sprintf(\_debugmsg,"[%s] current position=%ld newpostion=%ld", \_\_func\_\_, \_servo\_position, - position);} -533 \textcolor{keywordflow}{if} ((position >= servo\_sweep\_left\_pos) || (position >= SERVO\_MAX\_POSITION)) \{ -534 position = servo\_sweep\_left\_pos; -535 \_servo\_sweep\_step = SERVO\_SWEEP\_TO\_RIGHT\_STEP; -536 \} -537 \textcolor{keywordflow}{if} ((position <= servo\_sweep\_right\_pos) || (position <= SERVO\_MIN\_POSITION)) \{ -538 position = servo\_sweep\_right\_pos; -539 \_servo\_sweep\_step = SERVO\_SWEEP\_TO\_LEFT\_STEP; -540 \} -541 \_servo\_set\_position(position); -542 \} -543 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservomeths_gaac73bf99cf2d19f7b1987156aa842b74}\label{group__lowerlevelservomeths_gaac73bf99cf2d19f7b1987156aa842b74}} -\index{Methods@{Methods}!servo\+\_\+set\+\_\+to\+\_\+right@{servo\+\_\+set\+\_\+to\+\_\+right}} -\index{servo\+\_\+set\+\_\+to\+\_\+right@{servo\+\_\+set\+\_\+to\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{servo\+\_\+set\+\_\+to\+\_\+right()}{servo\_set\_to\_right()}} -{\footnotesize\ttfamily void Code\+Racer\+::servo\+\_\+set\+\_\+to\+\_\+right (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Drives the servo to the postion that is defined by \#servo\+\_\+right\+\_\+pos. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 548 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -549 \{ -550 servo\_set\_position\_wait(servo\_right\_pos); -551 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservomeths_gaef7d1903b65a0a8ab4fafdc53080b07d}\label{group__lowerlevelservomeths_gaef7d1903b65a0a8ab4fafdc53080b07d}} -\index{Methods@{Methods}!servo\+\_\+set\+\_\+to\+\_\+left@{servo\+\_\+set\+\_\+to\+\_\+left}} -\index{servo\+\_\+set\+\_\+to\+\_\+left@{servo\+\_\+set\+\_\+to\+\_\+left}!Methods@{Methods}} -\subsubsection{\texorpdfstring{servo\+\_\+set\+\_\+to\+\_\+left()}{servo\_set\_to\_left()}} -{\footnotesize\ttfamily void Code\+Racer\+::servo\+\_\+set\+\_\+to\+\_\+left (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Drives the servo to the postion that is defined by \#servo\+\_\+left\+\_\+pos. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 556 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -557 \{ -558 servo\_set\_position\_wait(servo\_left\_pos); -559 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservomeths_gad1f28aa91079e88fc3093e3074edfb32}\label{group__lowerlevelservomeths_gad1f28aa91079e88fc3093e3074edfb32}} -\index{Methods@{Methods}!servo\+\_\+set\+\_\+to\+\_\+center@{servo\+\_\+set\+\_\+to\+\_\+center}} -\index{servo\+\_\+set\+\_\+to\+\_\+center@{servo\+\_\+set\+\_\+to\+\_\+center}!Methods@{Methods}} -\subsubsection{\texorpdfstring{servo\+\_\+set\+\_\+to\+\_\+center()}{servo\_set\_to\_center()}} -{\footnotesize\ttfamily void Code\+Racer\+::servo\+\_\+set\+\_\+to\+\_\+center (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Drives the servo to the postion that is defined by \#servo\+\_\+center\+\_\+pos. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 564 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -565 \{ -566 servo\_set\_position\_wait(servo\_center\_pos); -567 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservomeths_ga0149226288bff2290d52ed1cbd674edd}\label{group__lowerlevelservomeths_ga0149226288bff2290d52ed1cbd674edd}} -\index{Methods@{Methods}!servo\+\_\+set\+\_\+position\+\_\+wait@{servo\+\_\+set\+\_\+position\+\_\+wait}} -\index{servo\+\_\+set\+\_\+position\+\_\+wait@{servo\+\_\+set\+\_\+position\+\_\+wait}!Methods@{Methods}} -\subsubsection{\texorpdfstring{servo\+\_\+set\+\_\+position\+\_\+wait()}{servo\_set\_position\_wait()}} -{\footnotesize\ttfamily uint8\+\_\+t Code\+Racer\+::servo\+\_\+set\+\_\+position\+\_\+wait (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{position }\end{DoxyParamCaption})} - - - -Drive the servo to the postion given to this method. - -The method will wait until the servo has reached its new position. -\begin{DoxyParams}{Parameters} -{\em position} & Position the servo will be drived to. Allowed are values 10$<$=postion$<$=170. 10 is at the right hand side, 170 at the left hand side. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -The new servo position -\end{DoxyReturn} - - -Definition at line 575 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -576 \{ -577 \_servo\_sweep = \textcolor{keyword}{false}; -578 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} wait\_time\_ms = \_servo\_set\_position(position); -579 delay(wait\_time\_ms); -580 \textcolor{keywordflow}{return}(\_servo\_position); -581 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelservomeths_gab8831340049de6dbddeda997745725e6}\label{group__lowerlevelservomeths_gab8831340049de6dbddeda997745725e6}} -\index{Methods@{Methods}!servo\+\_\+set\+\_\+position@{servo\+\_\+set\+\_\+position}} -\index{servo\+\_\+set\+\_\+position@{servo\+\_\+set\+\_\+position}!Methods@{Methods}} -\subsubsection{\texorpdfstring{servo\+\_\+set\+\_\+position()}{servo\_set\_position()}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::servo\+\_\+set\+\_\+position (\begin{DoxyParamCaption}\item[{uint8\+\_\+t}]{position }\end{DoxyParamCaption})} - - - -Drive the servo to the postion given to this method. - -The method will not wait until the servo has reached its new position. -\begin{DoxyParams}{Parameters} -{\em position} & Position the servo will be drived to. Allowed are values 10$<$=postion$<$=170. 10 is at the right hand side, 170 at the left hand side. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -The time in ms the servo will need to reach the new position -\end{DoxyReturn} - - -Definition at line 589 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -590 \{ -591 \_servo\_sweep = \textcolor{keyword}{false}; -592 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{long} wait\_time\_ms = \_servo\_set\_position(position); -593 \textcolor{keywordflow}{return}(wait\_time\_ms); -594 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/db/ddd/group__lowerlevelusgetters.tex b/Doku/Doxygen/latex/db/ddd/group__lowerlevelusgetters.tex deleted file mode 100644 index 40cfb32..0000000 --- a/Doku/Doxygen/latex/db/ddd/group__lowerlevelusgetters.tex +++ /dev/null @@ -1,121 +0,0 @@ -\hypertarget{group__lowerlevelusgetters}{}\section{Setters and getters} -\label{group__lowerlevelusgetters}\index{Setters and getters@{Setters and getters}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -void \hyperlink{group__lowerlevelusgetters_gaa7c5a6563a5736ed38d12f616de480df}{Code\+Racer\+::usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+cm} (unsigned long stop\+\_\+distance\+\_\+cm) -\begin{DoxyCompactList}\small\item\em Sets the stop distance in cm. \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelusgetters_ga2f06c193ae86c5b1cba450caf5adf146}{Code\+Racer\+::usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+us} (unsigned long stop\+\_\+distance\+\_\+us) -\begin{DoxyCompactList}\small\item\em Sets the stop distance in cm. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusgetters_ga917b90f21e731ef5f690d5198e7f4d3e}{Code\+Racer\+::usonic\+\_\+distance\+\_\+us} () -\begin{DoxyCompactList}\small\item\em Returns the last measured distance in microseconds. \end{DoxyCompactList}\item -unsigned long \hyperlink{group__lowerlevelusgetters_gad59842c14196598e55644b2a22621454}{Code\+Racer\+::usonic\+\_\+distance\+\_\+cm} () -\begin{DoxyCompactList}\small\item\em Returns the last measured distance in cm. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerlevelusgetters_gaa7c5a6563a5736ed38d12f616de480df}\label{group__lowerlevelusgetters_gaa7c5a6563a5736ed38d12f616de480df}} -\index{Setters and getters@{Setters and getters}!usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+cm@{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+cm}} -\index{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+cm@{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+cm}!Setters and getters@{Setters and getters}} -\subsubsection{\texorpdfstring{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+cm()}{usonic\_set\_stop\_distance\_cm()}} -{\footnotesize\ttfamily void Code\+Racer\+::usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+cm (\begin{DoxyParamCaption}\item[{unsigned long}]{stop\+\_\+distance\+\_\+cm }\end{DoxyParamCaption})} - - - -Sets the stop distance in cm. - -If start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance() is used and distance measured with one of the measurement methods -\/ the racer will be stopped immediately. All except the singe shot methods of the ultra sonic measurements methods supports that. Internally the stop distance will be set as both -\/ in cm and in microseconds. -\begin{DoxyParams}{Parameters} -{\em stop\+\_\+distance\+\_\+cm} & Distance in cm the racer will be stopped if that features was enabled by start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance() before. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 825 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -826 \{ -827 \_usonic\_stop\_distance\_us = stop\_distance\_cm * 58.14; -828 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusgetters_ga2f06c193ae86c5b1cba450caf5adf146}\label{group__lowerlevelusgetters_ga2f06c193ae86c5b1cba450caf5adf146}} -\index{Setters and getters@{Setters and getters}!usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+us@{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+us}} -\index{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+us@{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+us}!Setters and getters@{Setters and getters}} -\subsubsection{\texorpdfstring{usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+us()}{usonic\_set\_stop\_distance\_us()}} -{\footnotesize\ttfamily void Code\+Racer\+::usonic\+\_\+set\+\_\+stop\+\_\+distance\+\_\+us (\begin{DoxyParamCaption}\item[{unsigned long}]{stop\+\_\+distance\+\_\+us }\end{DoxyParamCaption})} - - - -Sets the stop distance in cm. - -If start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance() is used and distance measured with one of the measurement methods -\/ the racer will be stopped immediately. All except the singe shot methods of the ultra sonic measurements methods supports that. Internally the stop distance will be set as both -\/ in cm and in microseconds. -\begin{DoxyParams}{Parameters} -{\em stop\+\_\+distance\+\_\+us} & Distance in cm the racer will be stopped if that features was enabled by start\+\_\+stop\+\_\+at\+\_\+min\+\_\+distance() before. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 837 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -838 \{ -839 \_usonic\_stop\_distance\_us = stop\_distance\_us; -840 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusgetters_ga917b90f21e731ef5f690d5198e7f4d3e}\label{group__lowerlevelusgetters_ga917b90f21e731ef5f690d5198e7f4d3e}} -\index{Setters and getters@{Setters and getters}!usonic\+\_\+distance\+\_\+us@{usonic\+\_\+distance\+\_\+us}} -\index{usonic\+\_\+distance\+\_\+us@{usonic\+\_\+distance\+\_\+us}!Setters and getters@{Setters and getters}} -\subsubsection{\texorpdfstring{usonic\+\_\+distance\+\_\+us()}{usonic\_distance\_us()}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+distance\+\_\+us (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Returns the last measured distance in microseconds. - -\begin{DoxyReturn}{Returns} -Distance in microseconds -\end{DoxyReturn} - - -Definition at line 845 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -845 \{ -846 \textcolor{keywordflow}{return}(\_usonic\_distance\_us); -847 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelusgetters_gad59842c14196598e55644b2a22621454}\label{group__lowerlevelusgetters_gad59842c14196598e55644b2a22621454}} -\index{Setters and getters@{Setters and getters}!usonic\+\_\+distance\+\_\+cm@{usonic\+\_\+distance\+\_\+cm}} -\index{usonic\+\_\+distance\+\_\+cm@{usonic\+\_\+distance\+\_\+cm}!Setters and getters@{Setters and getters}} -\subsubsection{\texorpdfstring{usonic\+\_\+distance\+\_\+cm()}{usonic\_distance\_cm()}} -{\footnotesize\ttfamily unsigned long Code\+Racer\+::usonic\+\_\+distance\+\_\+cm (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Returns the last measured distance in cm. - -\begin{DoxyReturn}{Returns} -Distance in cm -\end{DoxyReturn} - - -Definition at line 852 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -852 \{ -853 \textcolor{keywordflow}{return}(\_usonic\_distance\_cm); -854 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/dd/dff/group__lowerlevelledmeths.tex b/Doku/Doxygen/latex/dd/dff/group__lowerlevelledmeths.tex deleted file mode 100644 index 8705b88..0000000 --- a/Doku/Doxygen/latex/dd/dff/group__lowerlevelledmeths.tex +++ /dev/null @@ -1,134 +0,0 @@ -\hypertarget{group__lowerlevelledmeths}{}\section{Methods} -\label{group__lowerlevelledmeths}\index{Methods@{Methods}} -\subsection*{Functions} -\begin{DoxyCompactItemize} -\item -void \hyperlink{group__lowerlevelledmeths_gab2514ca3994de3d64337dd6536fa6ef3}{Code\+Racer\+::set\+\_\+leds\+\_\+left\+\_\+stop\+\_\+frwd\+\_\+right} (ledstate leftled, ledstate stopled, ledstate frwdled, ledstate rightled) -\begin{DoxyCompactList}\small\item\em Sets all of the 4 L\+E\+Ds to a ledstate (L\+E\+D\+ON, L\+E\+D\+O\+FF) \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelledmeths_gab4319e66963b1b71a34370d73962fa78}{Code\+Racer\+::set\+\_\+leds\+\_\+all} (ledstate alleds) -\begin{DoxyCompactList}\small\item\em Sets all of the 4 L\+E\+Ds to the same ledstate (L\+E\+D\+ON, L\+E\+D\+O\+FF) \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelledmeths_gaa3f2ad08103127f2cb49344c33b666ea}{Code\+Racer\+::set\+\_\+leds\+\_\+all\+\_\+off} () -\begin{DoxyCompactList}\small\item\em Sets all of the 4 L\+E\+Ds to the ledstate L\+E\+D\+O\+FF. \end{DoxyCompactList}\item -void \hyperlink{group__lowerlevelledmeths_ga0c8b3d6ce992e1dcfd13fd86c9f89846}{Code\+Racer\+::set\+\_\+leds\+\_\+all\+\_\+on} () -\begin{DoxyCompactList}\small\item\em Sets all of the 4 L\+E\+Ds to the ledstate L\+E\+D\+ON. \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} - - -\subsection{Function Documentation} -\mbox{\Hypertarget{group__lowerlevelledmeths_gab2514ca3994de3d64337dd6536fa6ef3}\label{group__lowerlevelledmeths_gab2514ca3994de3d64337dd6536fa6ef3}} -\index{Methods@{Methods}!set\+\_\+leds\+\_\+left\+\_\+stop\+\_\+frwd\+\_\+right@{set\+\_\+leds\+\_\+left\+\_\+stop\+\_\+frwd\+\_\+right}} -\index{set\+\_\+leds\+\_\+left\+\_\+stop\+\_\+frwd\+\_\+right@{set\+\_\+leds\+\_\+left\+\_\+stop\+\_\+frwd\+\_\+right}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+leds\+\_\+left\+\_\+stop\+\_\+frwd\+\_\+right()}{set\_leds\_left\_stop\_frwd\_right()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+leds\+\_\+left\+\_\+stop\+\_\+frwd\+\_\+right (\begin{DoxyParamCaption}\item[{ledstate}]{leftled, }\item[{ledstate}]{stopled, }\item[{ledstate}]{frwdled, }\item[{ledstate}]{rightled }\end{DoxyParamCaption})} - - - -Sets all of the 4 L\+E\+Ds to a ledstate (L\+E\+D\+ON, L\+E\+D\+O\+FF) - - -\begin{DoxyParams}{Parameters} -{\em leftled} & set state of status left L\+ED (most left yellow led) \\ -\hline -{\em stopled} & set state of status stop L\+ED (red led) \\ -\hline -{\em frwdled} & set state of status forward L\+ED (green or blue led) \\ -\hline -{\em rightled} & set state of status right L\+ED (most right yellow led) \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 1037 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -1037 - \{ -1038 digitalWrite(\_led\_left\_pin, leftled); -1039 digitalWrite(\_led\_frwd\_pin, frwdled); -1040 digitalWrite(\_led\_right\_pin, rightled); -1041 digitalWrite(\_led\_stop\_pin, stopled); -1042 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelledmeths_gab4319e66963b1b71a34370d73962fa78}\label{group__lowerlevelledmeths_gab4319e66963b1b71a34370d73962fa78}} -\index{Methods@{Methods}!set\+\_\+leds\+\_\+all@{set\+\_\+leds\+\_\+all}} -\index{set\+\_\+leds\+\_\+all@{set\+\_\+leds\+\_\+all}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+leds\+\_\+all()}{set\_leds\_all()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+leds\+\_\+all (\begin{DoxyParamCaption}\item[{ledstate}]{alleds }\end{DoxyParamCaption})} - - - -Sets all of the 4 L\+E\+Ds to the same ledstate (L\+E\+D\+ON, L\+E\+D\+O\+FF) - - -\begin{DoxyParams}{Parameters} -{\em alleds} & set state to all status L\+E\+Ds \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 1048 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -1048 \{ -1049 digitalWrite(\_led\_left\_pin, alleds); -1050 digitalWrite(\_led\_frwd\_pin, alleds); -1051 digitalWrite(\_led\_right\_pin, alleds); -1052 digitalWrite(\_led\_stop\_pin, alleds); -1053 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelledmeths_gaa3f2ad08103127f2cb49344c33b666ea}\label{group__lowerlevelledmeths_gaa3f2ad08103127f2cb49344c33b666ea}} -\index{Methods@{Methods}!set\+\_\+leds\+\_\+all\+\_\+off@{set\+\_\+leds\+\_\+all\+\_\+off}} -\index{set\+\_\+leds\+\_\+all\+\_\+off@{set\+\_\+leds\+\_\+all\+\_\+off}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+leds\+\_\+all\+\_\+off()}{set\_leds\_all\_off()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+leds\+\_\+all\+\_\+off (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Sets all of the 4 L\+E\+Ds to the ledstate L\+E\+D\+O\+FF. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 1058 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -1058 \{ -1059 set\_leds\_all(LEDOFF); -1060 \} -\end{DoxyCode} -\mbox{\Hypertarget{group__lowerlevelledmeths_ga0c8b3d6ce992e1dcfd13fd86c9f89846}\label{group__lowerlevelledmeths_ga0c8b3d6ce992e1dcfd13fd86c9f89846}} -\index{Methods@{Methods}!set\+\_\+leds\+\_\+all\+\_\+on@{set\+\_\+leds\+\_\+all\+\_\+on}} -\index{set\+\_\+leds\+\_\+all\+\_\+on@{set\+\_\+leds\+\_\+all\+\_\+on}!Methods@{Methods}} -\subsubsection{\texorpdfstring{set\+\_\+leds\+\_\+all\+\_\+on()}{set\_leds\_all\_on()}} -{\footnotesize\ttfamily void Code\+Racer\+::set\+\_\+leds\+\_\+all\+\_\+on (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Sets all of the 4 L\+E\+Ds to the ledstate L\+E\+D\+ON. - -\begin{DoxyReturn}{Returns} -nothing -\end{DoxyReturn} - - -Definition at line 1065 of file Code\+Racer.\+cpp. - - -\begin{DoxyCode} -1065 \{ -1066 set\_leds\_all(LEDON); -1067 \} -\end{DoxyCode} diff --git a/Doku/Doxygen/latex/dir_11f10faf8e1af149a19b120728e5c8cd.tex b/Doku/Doxygen/latex/dir_11f10faf8e1af149a19b120728e5c8cd.tex deleted file mode 100644 index a78c840..0000000 --- a/Doku/Doxygen/latex/dir_11f10faf8e1af149a19b120728e5c8cd.tex +++ /dev/null @@ -1,2 +0,0 @@ -\hypertarget{dir_11f10faf8e1af149a19b120728e5c8cd}{}\section{C\+:/\+Users/jnoack/\+Documents/\+Arduino/libraries/\+Code\+Racer Directory Reference} -\label{dir_11f10faf8e1af149a19b120728e5c8cd}\index{C\+:/\+Users/jnoack/\+Documents/\+Arduino/libraries/\+Code\+Racer Directory Reference@{C\+:/\+Users/jnoack/\+Documents/\+Arduino/libraries/\+Code\+Racer Directory Reference}} diff --git a/Doku/Doxygen/latex/dir_481cc946b8a81b8d9363a4aad6201160.tex b/Doku/Doxygen/latex/dir_481cc946b8a81b8d9363a4aad6201160.tex deleted file mode 100644 index 20f5b75..0000000 --- a/Doku/Doxygen/latex/dir_481cc946b8a81b8d9363a4aad6201160.tex +++ /dev/null @@ -1,5 +0,0 @@ -\hypertarget{dir_481cc946b8a81b8d9363a4aad6201160}{}\section{C\+:/\+Users/jnoack/\+Documents/\+Arduino/libraries Directory Reference} -\label{dir_481cc946b8a81b8d9363a4aad6201160}\index{C\+:/\+Users/jnoack/\+Documents/\+Arduino/libraries Directory Reference@{C\+:/\+Users/jnoack/\+Documents/\+Arduino/libraries Directory Reference}} -\subsection*{Directories} -\begin{DoxyCompactItemize} -\end{DoxyCompactItemize} diff --git a/Doku/Doxygen/latex/dir_a991eec27578c865874ede3d8ec657c2.tex b/Doku/Doxygen/latex/dir_a991eec27578c865874ede3d8ec657c2.tex deleted file mode 100644 index c0aec85..0000000 --- a/Doku/Doxygen/latex/dir_a991eec27578c865874ede3d8ec657c2.tex +++ /dev/null @@ -1,2 +0,0 @@ -\hypertarget{dir_a991eec27578c865874ede3d8ec657c2}{}\section{C\+:/\+Users/jnoack/\+Documents/\+Arduino Directory Reference} -\label{dir_a991eec27578c865874ede3d8ec657c2}\index{C\+:/\+Users/jnoack/\+Documents/\+Arduino Directory Reference@{C\+:/\+Users/jnoack/\+Documents/\+Arduino Directory Reference}} diff --git a/Doku/Doxygen/latex/doxygen.sty b/Doku/Doxygen/latex/doxygen.sty deleted file mode 100644 index e457acc..0000000 --- a/Doku/Doxygen/latex/doxygen.sty +++ /dev/null @@ -1,503 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{doxygen} - -% Packages used by this style file -\RequirePackage{alltt} -\RequirePackage{array} -\RequirePackage{calc} -\RequirePackage{float} -\RequirePackage{ifthen} -\RequirePackage{verbatim} -\RequirePackage[table]{xcolor} -\RequirePackage{longtable} -\RequirePackage{tabu} -\RequirePackage{tabularx} -\RequirePackage{multirow} - -%---------- Internal commands used in this style file ---------------- - -\newcommand{\ensurespace}[1]{% - \begingroup% - \setlength{\dimen@}{#1}% - \vskip\z@\@plus\dimen@% - \penalty -100\vskip\z@\@plus -\dimen@% - \vskip\dimen@% - \penalty 9999% - \vskip -\dimen@% - \vskip\z@skip% hide the previous |\vskip| from |\addvspace| - \endgroup% -} - -\newcommand{\DoxyLabelFont}{} -\newcommand{\entrylabel}[1]{% - {% - \parbox[b]{\labelwidth-4pt}{% - \makebox[0pt][l]{\DoxyLabelFont#1}% - \vspace{1.5\baselineskip}% - }% - }% -} - -\newenvironment{DoxyDesc}[1]{% - \ensurespace{4\baselineskip}% - \begin{list}{}{% - \settowidth{\labelwidth}{20pt}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{0pt}% - \setlength{\leftmargin}{\labelwidth+\labelsep}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -\newsavebox{\xrefbox} -\newlength{\xreflength} -\newcommand{\xreflabel}[1]{% - \sbox{\xrefbox}{#1}% - \setlength{\xreflength}{\wd\xrefbox}% - \ifthenelse{\xreflength>\labelwidth}{% - \begin{minipage}{\textwidth}% - \setlength{\parindent}{0pt}% - \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% - \end{minipage}% - }{% - \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% - }% -} - -%---------- Commands used by doxygen LaTeX output generator ---------- - -% Used by
 ... 
-\newenvironment{DoxyPre}{% - \small% - \begin{alltt}% -}{% - \end{alltt}% - \normalsize% -} - -% Used by @code ... @endcode -\newenvironment{DoxyCode}{% - \par% - \scriptsize% - \begin{alltt}% -}{% - \end{alltt}% - \normalsize% -} - -% Used by @example, @include, @includelineno and @dontinclude -\newenvironment{DoxyCodeInclude}{% - \DoxyCode% -}{% - \endDoxyCode% -} - -% Used by @verbatim ... @endverbatim -\newenvironment{DoxyVerb}{% - \footnotesize% - \verbatim% -}{% - \endverbatim% - \normalsize% -} - -% Used by @verbinclude -\newenvironment{DoxyVerbInclude}{% - \DoxyVerb% -}{% - \endDoxyVerb% -} - -% Used by numbered lists (using '-#' or
    ...
) -\newenvironment{DoxyEnumerate}{% - \enumerate% -}{% - \endenumerate% -} - -% Used by bullet lists (using '-', @li, @arg, or
    ...
) -\newenvironment{DoxyItemize}{% - \itemize% -}{% - \enditemize% -} - -% Used by description lists (using
...
) -\newenvironment{DoxyDescription}{% - \description% -}{% - \enddescription% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if caption is specified) -\newenvironment{DoxyImage}{% - \begin{figure}[H]% - \begin{center}% -}{% - \end{center}% - \end{figure}% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if no caption is specified) -\newenvironment{DoxyImageNoCaption}{% - \begin{center}% -}{% - \end{center}% -} - -% Used by @attention -\newenvironment{DoxyAttention}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @author and @authors -\newenvironment{DoxyAuthor}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @date -\newenvironment{DoxyDate}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @invariant -\newenvironment{DoxyInvariant}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @note -\newenvironment{DoxyNote}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @post -\newenvironment{DoxyPostcond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @pre -\newenvironment{DoxyPrecond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @copyright -\newenvironment{DoxyCopyright}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @remark -\newenvironment{DoxyRemark}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @return and @returns -\newenvironment{DoxyReturn}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @since -\newenvironment{DoxySince}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @see -\newenvironment{DoxySeeAlso}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @version -\newenvironment{DoxyVersion}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @warning -\newenvironment{DoxyWarning}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @internal -\newenvironment{DoxyInternal}[1]{% - \paragraph*{#1}% -}{% -} - -% Used by @par and @paragraph -\newenvironment{DoxyParagraph}[1]{% - \begin{list}{}{% - \settowidth{\labelwidth}{40pt}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{-4pt}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -% Used by parameter lists -\newenvironment{DoxyParams}[2][]{% - \tabulinesep=1mm% - \par% - \ifthenelse{\equal{#1}{}}% - {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description - {\ifthenelse{\equal{#1}{1}}% - {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc - {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc - } - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu}% - \vspace{6pt}% -} - -% Used for fields of simple structs -\newenvironment{DoxyFields}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% - \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu}% - \vspace{6pt}% -} - -% Used for fields simple class style enums -\newenvironment{DoxyEnumFields}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu}% - \vspace{6pt}% -} - -% Used for parameters within a detailed function description -\newenvironment{DoxyParamCaption}{% - \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% -}{% -} - -% Used by return value lists -\newenvironment{DoxyRetVals}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu}% - \vspace{6pt}% -} - -% Used by exception lists -\newenvironment{DoxyExceptions}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu}% - \vspace{6pt}% -} - -% Used by template parameter lists -\newenvironment{DoxyTemplParams}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu}% - \vspace{6pt}% -} - -% Used for member lists -\newenvironment{DoxyCompactItemize}{% - \begin{itemize}% - \setlength{\itemsep}{-3pt}% - \setlength{\parsep}{0pt}% - \setlength{\topsep}{0pt}% - \setlength{\partopsep}{0pt}% -}{% - \end{itemize}% -} - -% Used for member descriptions -\newenvironment{DoxyCompactList}{% - \begin{list}{}{% - \setlength{\leftmargin}{0.5cm}% - \setlength{\itemsep}{0pt}% - \setlength{\parsep}{0pt}% - \setlength{\topsep}{0pt}% - \renewcommand{\makelabel}{\hfill}% - }% -}{% - \end{list}% -} - -% Used for reference lists (@bug, @deprecated, @todo, etc.) -\newenvironment{DoxyRefList}{% - \begin{list}{}{% - \setlength{\labelwidth}{10pt}% - \setlength{\leftmargin}{\labelwidth}% - \addtolength{\leftmargin}{\labelsep}% - \renewcommand{\makelabel}{\xreflabel}% - }% -}{% - \end{list}% -} - -% Used by @bug, @deprecated, @todo, etc. -\newenvironment{DoxyRefDesc}[1]{% - \begin{list}{}{% - \renewcommand\makelabel[1]{\textbf{##1}}% - \settowidth\labelwidth{\makelabel{#1}}% - \setlength\leftmargin{\labelwidth+\labelsep}% - }% -}{% - \end{list}% -} - -% Used by parameter lists and simple sections -\newenvironment{Desc} -{\begin{list}{}{% - \settowidth{\labelwidth}{20pt}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{0pt}% - \setlength{\leftmargin}{\labelwidth+\labelsep}% - \renewcommand{\makelabel}{\entrylabel}% - } -}{% - \end{list}% -} - -% Used by tables -\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% -\newenvironment{TabularC}[1]% -{\tabulinesep=1mm -\begin{longtabu} spread 0pt [c]{*#1{|X[-1]}|}}% -{\end{longtabu}\par}% - -\newenvironment{TabularNC}[1]% -{\begin{tabu} spread 0pt [l]{*#1{|X[-1]}|}}% -{\end{tabu}\par}% - -% Used for member group headers -\newenvironment{Indent}{% - \begin{list}{}{% - \setlength{\leftmargin}{0.5cm}% - }% - \item[]\ignorespaces% -}{% - \unskip% - \end{list}% -} - -% Used when hyperlinks are turned off -\newcommand{\doxyref}[3]{% - \textbf{#1} (\textnormal{#2}\,\pageref{#3})% -} - -% Used to link to a table when hyperlinks are turned on -\newcommand{\doxytablelink}[2]{% - \ref{#1}% -} - -% Used to link to a table when hyperlinks are turned off -\newcommand{\doxytableref}[3]{% - \ref{#3}% -} - -% Used by @addindex -\newcommand{\lcurly}{\{} -\newcommand{\rcurly}{\}} - -% Colors used for syntax highlighting -\definecolor{comment}{rgb}{0.5,0.0,0.0} -\definecolor{keyword}{rgb}{0.0,0.5,0.0} -\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} -\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} -\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} -\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} -\definecolor{charliteral}{rgb}{0.0,0.5,0.5} -\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} -\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} -\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} -\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} - -% Color used for table heading -\newcommand{\tableheadbgcolor}{lightgray}% - -% Version of hypertarget with correct landing location -\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} - -% Define caption that is also suitable in a table -\makeatletter -\def\doxyfigcaption{% -\refstepcounter{figure}% -\@dblarg{\@caption{figure}}} -\makeatother diff --git a/Doku/Doxygen/latex/make.bat b/Doku/Doxygen/latex/make.bat deleted file mode 100644 index afcb4f7..0000000 --- a/Doku/Doxygen/latex/make.bat +++ /dev/null @@ -1,30 +0,0 @@ -set Dir_Old=%cd% -cd /D %~dp0 - -del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf - -pdflatex refman -echo ---- -makeindex refman.idx -echo ---- -pdflatex refman - -setlocal enabledelayedexpansion -set count=8 -:repeat -set content=X -for /F "tokens=*" %%T in ( 'findstr /C:"Rerun LaTeX" refman.log' ) do set content="%%~T" -if !content! == X for /F "tokens=*" %%T in ( 'findstr /C:"Rerun to get cross-references right" refman.log' ) do set content="%%~T" -if !content! == X goto :skip -set /a count-=1 -if !count! EQU 0 goto :skip - -echo ---- -pdflatex refman -goto :repeat -:skip -endlocal -makeindex refman.idx -pdflatex refman -cd /D %Dir_Old% -set Dir_Old= diff --git a/Doku/Doxygen/latex/modules.tex b/Doku/Doxygen/latex/modules.tex deleted file mode 100644 index b6bf919..0000000 --- a/Doku/Doxygen/latex/modules.tex +++ /dev/null @@ -1,28 +0,0 @@ -\section{Modules} -Here is a list of all modules\+:\begin{DoxyCompactList} -\item \contentsline{section}{Higher level methods, setters and getters}{\pageref{group__higherlevel}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Methods}{\pageref{group__higherlevelmeths}}{} -\item \contentsline{section}{Getters and setters}{\pageref{group__higherlevelgetters}}{} -\end{DoxyCompactList} -\item \contentsline{section}{Lower level fun stuff methods}{\pageref{group__lowerlevelfun}}{} -\item \contentsline{section}{Lower level servo drive methods and getters}{\pageref{group__lowerlevelservo}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Methods}{\pageref{group__lowerlevelservomeths}}{} -\item \contentsline{section}{Getters}{\pageref{group__lowerlevelservogetters}}{} -\end{DoxyCompactList} -\item \contentsline{section}{Lower level ultra sonic methods and getters}{\pageref{group__lowerlevelus}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Methods}{\pageref{group__lowerlevelusmeths}}{} -\item \contentsline{section}{Setters and getters}{\pageref{group__lowerlevelusgetters}}{} -\end{DoxyCompactList} -\item \contentsline{section}{Lower level drives methods and getters}{\pageref{group__lowerleveldrives}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Methods}{\pageref{group__lowerleveldrivesmeths}}{} -\item \contentsline{section}{Getters}{\pageref{group__lowerleveldrivesgetters}}{} -\end{DoxyCompactList} -\item \contentsline{section}{Lower level L\+ED methods}{\pageref{group__lowerlevelled}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Methods}{\pageref{group__lowerlevelledmeths}}{} -\end{DoxyCompactList} -\end{DoxyCompactList} diff --git a/Doku/Doxygen/latex/refman.tex b/Doku/Doxygen/latex/refman.tex deleted file mode 100644 index 4030e12..0000000 --- a/Doku/Doxygen/latex/refman.tex +++ /dev/null @@ -1,169 +0,0 @@ -\documentclass[twoside]{book} - -% Packages required by doxygen -\usepackage{fixltx2e} -\usepackage{calc} -\usepackage{doxygen} -\usepackage[export]{adjustbox} % also loads graphicx -\usepackage{graphicx} -\usepackage[utf8]{inputenc} -\usepackage{makeidx} -\usepackage{multicol} -\usepackage{multirow} -\PassOptionsToPackage{warn}{textcomp} -\usepackage{textcomp} -\usepackage[nointegrals]{wasysym} -\usepackage[table]{xcolor} - -% Font selection -\usepackage[T1]{fontenc} -\usepackage[scaled=.90]{helvet} -\usepackage{courier} -\usepackage{amssymb} -\usepackage{sectsty} -\renewcommand{\familydefault}{\sfdefault} -\allsectionsfont{% - \fontseries{bc}\selectfont% - \color{darkgray}% -} -\renewcommand{\DoxyLabelFont}{% - \fontseries{bc}\selectfont% - \color{darkgray}% -} -\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} - -% Page & text layout -\usepackage{geometry} -\geometry{% - a4paper,% - top=2.5cm,% - bottom=2.5cm,% - left=2.5cm,% - right=2.5cm% -} -\tolerance=750 -\hfuzz=15pt -\hbadness=750 -\setlength{\emergencystretch}{15pt} -\setlength{\parindent}{0cm} -\setlength{\parskip}{3ex plus 2ex minus 2ex} -\makeatletter -\renewcommand{\paragraph}{% - \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% - \normalfont\normalsize\bfseries\SS@parafont% - }% -} -\renewcommand{\subparagraph}{% - \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% - \normalfont\normalsize\bfseries\SS@subparafont% - }% -} -\makeatother - -% Headers & footers -\usepackage{fancyhdr} -\pagestyle{fancyplain} -\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}} -\fancyhead[CE]{\fancyplain{}{}} -\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}} -\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}} -\fancyhead[CO]{\fancyplain{}{}} -\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}} -\fancyfoot[LE]{\fancyplain{}{}} -\fancyfoot[CE]{\fancyplain{}{}} -\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }} -\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }} -\fancyfoot[CO]{\fancyplain{}{}} -\fancyfoot[RO]{\fancyplain{}{}} -\renewcommand{\footrulewidth}{0.4pt} -\renewcommand{\chaptermark}[1]{% - \markboth{#1}{}% -} -\renewcommand{\sectionmark}[1]{% - \markright{\thesection\ #1}% -} - -% Indices & bibliography -\usepackage{natbib} -\usepackage[titles]{tocloft} -\setcounter{tocdepth}{3} -\setcounter{secnumdepth}{5} -\makeindex - -% Hyperlinks (required, but should be loaded last) -\usepackage{ifpdf} -\ifpdf - \usepackage[pdftex,pagebackref=true]{hyperref} -\else - \usepackage[ps2pdf,pagebackref=true]{hyperref} -\fi -\hypersetup{% - colorlinks=true,% - linkcolor=blue,% - citecolor=blue,% - unicode% -} - -% Custom commands -\newcommand{\clearemptydoublepage}{% - \newpage{\pagestyle{empty}\cleardoublepage}% -} - -\usepackage{caption} -\captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} - -%===== C O N T E N T S ===== - -\begin{document} - -% Titlepage & ToC -\hypersetup{pageanchor=false, - bookmarksnumbered=true, - pdfencoding=unicode - } -\pagenumbering{alph} -\begin{titlepage} -\vspace*{7cm} -\begin{center}% -{\Large Arduino \{code\}racer A\+PI }\\ -\vspace*{1cm} -{\large Generated by Doxygen 1.8.13}\\ -\end{center} -\end{titlepage} -\clearemptydoublepage -\pagenumbering{roman} -\tableofcontents -\clearemptydoublepage -\pagenumbering{arabic} -\hypersetup{pageanchor=true} - -%--- Begin generated contents --- -\chapter{Module Index} -\input{modules} -\chapter{Module Documentation} -\input{d9/d80/group__higherlevel} -\include{d2/d40/group__higherlevelmeths} -\include{d7/d45/group__higherlevelgetters} -\include{d8/d7a/group__lowerlevelfun} -\include{d3/d17/group__lowerlevelservo} -\include{db/dd5/group__lowerlevelservomeths} -\include{d4/df4/group__lowerlevelservogetters} -\include{da/daf/group__lowerlevelus} -\include{d6/dfc/group__lowerlevelusmeths} -\include{db/ddd/group__lowerlevelusgetters} -\include{d6/d98/group__lowerleveldrives} -\include{d1/d8a/group__lowerleveldrivesmeths} -\include{d0/d0a/group__lowerleveldrivesgetters} -\include{d7/d0f/group__lowerlevelled} -\include{dd/dff/group__lowerlevelledmeths} -%--- End generated contents --- - -% Index -\backmatter -\newpage -\phantomsection -\clearemptydoublepage -\addcontentsline{toc}{chapter}{Index} -\printindex - -\end{document}