Update documentation

This commit is contained in:
Konstantin Lampalzer 2022-10-20 19:55:14 +02:00
parent 49c4040072
commit 3173308b54
31 changed files with 13061 additions and 1263 deletions

View file

@ -0,0 +1,134 @@
/*
* _sphinx_javascript_frameworks_compat.js
* ~~~~~~~~~~
*
* Compatability shim for jQuery and underscores.js.
*
* WILL BE REMOVED IN Sphinx 6.0
* xref RemovedInSphinx60Warning
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

294
_static/base-stemmer.js Normal file
View file

@ -0,0 +1,294 @@
/**@constructor*/
BaseStemmer = function() {
this.setCurrent = function(value) {
this.current = value;
this.cursor = 0;
this.limit = this.current.length;
this.limit_backward = 0;
this.bra = this.cursor;
this.ket = this.limit;
};
this.getCurrent = function() {
return this.current;
};
this.copy_from = function(other) {
this.current = other.current;
this.cursor = other.cursor;
this.limit = other.limit;
this.limit_backward = other.limit_backward;
this.bra = other.bra;
this.ket = other.ket;
};
this.in_grouping = function(s, min, max) {
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor++;
return true;
};
this.in_grouping_b = function(s, min, max) {
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor--;
return true;
};
this.out_grouping = function(s, min, max) {
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) {
this.cursor++;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
this.cursor++;
return true;
}
return false;
};
this.out_grouping_b = function(s, min, max) {
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) {
this.cursor--;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
this.cursor--;
return true;
}
return false;
};
this.eq_s = function(s)
{
if (this.limit - this.cursor < s.length) return false;
if (this.current.slice(this.cursor, this.cursor + s.length) != s)
{
return false;
}
this.cursor += s.length;
return true;
};
this.eq_s_b = function(s)
{
if (this.cursor - this.limit_backward < s.length) return false;
if (this.current.slice(this.cursor - s.length, this.cursor) != s)
{
return false;
}
this.cursor -= s.length;
return true;
};
/** @return {number} */ this.find_among = function(v)
{
var i = 0;
var j = v.length;
var c = this.cursor;
var l = this.limit;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >>> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j; // smaller
// w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
var w = v[k];
var i2;
for (i2 = common; i2 < w[0].length; i2++)
{
if (c + common == l)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break; // v->s has been inspected
if (j == i) break; // only one item in v
// - but now we need to go round once more to get
// v->s inspected. This looks messy, but is actually
// the optimal approach.
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c + w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c + w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
// find_among_b is for backwards processing. Same comments apply
this.find_among_b = function(v)
{
var i = 0;
var j = v.length
var c = this.cursor;
var lb = this.limit_backward;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j;
var w = v[k];
var i2;
for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
{
if (c - common == lb)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break;
if (j == i) break;
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c - w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c - w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
/* to replace chars between c_bra and c_ket in this.current by the
* chars in s.
*/
this.replace_s = function(c_bra, c_ket, s)
{
var adjustment = s.length - (c_ket - c_bra);
this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
this.limit += adjustment;
if (this.cursor >= c_ket) this.cursor += adjustment;
else if (this.cursor > c_bra) this.cursor = c_bra;
return adjustment;
};
this.slice_check = function()
{
if (this.bra < 0 ||
this.bra > this.ket ||
this.ket > this.limit ||
this.limit > this.current.length)
{
return false;
}
return true;
};
this.slice_from = function(s)
{
var result = false;
if (this.slice_check())
{
this.replace_s(this.bra, this.ket, s);
result = true;
}
return result;
};
this.slice_del = function()
{
return this.slice_from("");
};
this.insert = function(c_bra, c_ket, s)
{
var adjustment = this.replace_s(c_bra, c_ket, s);
if (c_bra <= this.bra) this.bra += adjustment;
if (c_bra <= this.ket) this.ket += adjustment;
};
this.slice_to = function()
{
var result = '';
if (this.slice_check())
{
result = this.current.slice(this.bra, this.ket);
}
return result;
};
this.assign_to = function()
{
return this.current.slice(0, this.limit);
};
};

View file

@ -4,7 +4,7 @@
* *
* Sphinx stylesheet -- basic theme. * Sphinx stylesheet -- basic theme.
* *
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
@ -130,7 +130,7 @@ ul.search li a {
font-weight: bold; font-weight: bold;
} }
ul.search li div.context { ul.search li p.context {
color: #888; color: #888;
margin: 2px 0 0 30px; margin: 2px 0 0 30px;
text-align: left; text-align: left;
@ -222,7 +222,7 @@ table.modindextable td {
/* -- general body styles --------------------------------------------------- */ /* -- general body styles --------------------------------------------------- */
div.body { div.body {
min-width: 450px; min-width: 360px;
max-width: 800px; max-width: 800px;
} }
@ -236,7 +236,6 @@ div.body p, div.body dd, div.body li, div.body blockquote {
a.headerlink { a.headerlink {
visibility: hidden; visibility: hidden;
} }
a.brackets:before, a.brackets:before,
span.brackets > a:before{ span.brackets > a:before{
content: "["; content: "[";
@ -247,6 +246,7 @@ span.brackets > a:after {
content: "]"; content: "]";
} }
h1:hover > a.headerlink, h1:hover > a.headerlink,
h2:hover > a.headerlink, h2:hover > a.headerlink,
h3:hover > a.headerlink, h3:hover > a.headerlink,
@ -277,25 +277,25 @@ p.rubric {
font-weight: bold; font-weight: bold;
} }
img.align-left, .figure.align-left, object.align-left { img.align-left, figure.align-left, .figure.align-left, object.align-left {
clear: left; clear: left;
float: left; float: left;
margin-right: 1em; margin-right: 1em;
} }
img.align-right, .figure.align-right, object.align-right { img.align-right, figure.align-right, .figure.align-right, object.align-right {
clear: right; clear: right;
float: right; float: right;
margin-left: 1em; margin-left: 1em;
} }
img.align-center, .figure.align-center, object.align-center { img.align-center, figure.align-center, .figure.align-center, object.align-center {
display: block; display: block;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
img.align-default, .figure.align-default { img.align-default, figure.align-default, .figure.align-default {
display: block; display: block;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
@ -319,7 +319,8 @@ img.align-default, .figure.align-default {
/* -- sidebars -------------------------------------------------------------- */ /* -- sidebars -------------------------------------------------------------- */
div.sidebar { div.sidebar,
aside.sidebar {
margin: 0 0 0.5em 1em; margin: 0 0 0.5em 1em;
border: 1px solid #ddb; border: 1px solid #ddb;
padding: 7px; padding: 7px;
@ -333,13 +334,11 @@ div.sidebar {
p.sidebar-title { p.sidebar-title {
font-weight: bold; font-weight: bold;
} }
div.admonition, div.topic, blockquote { div.admonition, div.topic, blockquote {
clear: left; clear: left;
} }
/* -- topics ---------------------------------------------------------------- */ /* -- topics ---------------------------------------------------------------- */
div.topic { div.topic {
border: 1px solid #ccc; border: 1px solid #ccc;
padding: 7px; padding: 7px;
@ -377,12 +376,14 @@ div.body p.centered {
/* -- content of sidebars/topics/admonitions -------------------------------- */ /* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child, div.sidebar > :last-child,
aside.sidebar > :last-child,
div.topic > :last-child, div.topic > :last-child,
div.admonition > :last-child { div.admonition > :last-child {
margin-bottom: 0; margin-bottom: 0;
} }
div.sidebar::after, div.sidebar::after,
aside.sidebar::after,
div.topic::after, div.topic::after,
div.admonition::after, div.admonition::after,
blockquote::after { blockquote::after {
@ -425,10 +426,6 @@ table.docutils td, table.docutils th {
border-bottom: 1px solid #aaa; border-bottom: 1px solid #aaa;
} }
table.footnote td, table.footnote th {
border: 0 !important;
}
th { th {
text-align: left; text-align: left;
padding-right: 5px; padding-right: 5px;
@ -455,20 +452,22 @@ td > :last-child {
/* -- figures --------------------------------------------------------------- */ /* -- figures --------------------------------------------------------------- */
div.figure { div.figure, figure {
margin: 0.5em; margin: 0.5em;
padding: 0.5em; padding: 0.5em;
} }
div.figure p.caption { div.figure p.caption, figcaption {
padding: 0.3em; padding: 0.3em;
} }
div.figure p.caption span.caption-number { div.figure p.caption span.caption-number,
figcaption span.caption-number {
font-style: italic; font-style: italic;
} }
div.figure p.caption span.caption-text { div.figure p.caption span.caption-text,
figcaption span.caption-text {
} }
/* -- field list styles ----------------------------------------------------- */ /* -- field list styles ----------------------------------------------------- */
@ -503,6 +502,63 @@ table.hlist td {
vertical-align: top; vertical-align: top;
} }
/* -- object description styles --------------------------------------------- */
.sig {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
.sig-name, code.descname {
background-color: transparent;
font-weight: bold;
}
.sig-name {
font-size: 1.1em;
}
code.descname {
font-size: 1.2em;
}
.sig-prename, code.descclassname {
background-color: transparent;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.sig-param.n {
font-style: italic;
}
/* C++ specific styling */
.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
font-family: unset;
}
.sig.c .k, .sig.c .kt,
.sig.cpp .k, .sig.cpp .kt {
color: #0033B3;
}
.sig.c .m,
.sig.cpp .m {
color: #1750EB;
}
.sig.c .s, .sig.c .sc,
.sig.cpp .s, .sig.cpp .sc {
color: #067D17;
}
/* -- other body styles ----------------------------------------------------- */ /* -- other body styles ----------------------------------------------------- */
@ -552,7 +608,6 @@ ol.simple p,
ul.simple p { ul.simple p {
margin-bottom: 0; margin-bottom: 0;
} }
dl.footnote > dt, dl.footnote > dt,
dl.citation > dt { dl.citation > dt {
float: left; float: left;
@ -581,11 +636,11 @@ dl.field-list > dt {
padding-left: 0.5em; padding-left: 0.5em;
padding-right: 5px; padding-right: 5px;
} }
dl.field-list > dt:after { dl.field-list > dt:after {
content: ":"; content: ":";
} }
dl.field-list > dd { dl.field-list > dd {
padding-left: 0.5em; padding-left: 0.5em;
margin-top: 0em; margin-top: 0em;
@ -629,14 +684,6 @@ dl.glossary dt {
font-size: 1.1em; font-size: 1.1em;
} }
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified { .versionmodified {
font-style: italic; font-style: italic;
} }
@ -677,8 +724,9 @@ dl.glossary dt {
.classifier:before { .classifier:before {
font-style: normal; font-style: normal;
margin: 0.5em; margin: 0 0.5em;
content: ":"; content: ":";
display: inline-block;
} }
abbr, acronym { abbr, acronym {
@ -702,6 +750,7 @@ span.pre {
-ms-hyphens: none; -ms-hyphens: none;
-webkit-hyphens: none; -webkit-hyphens: none;
hyphens: none; hyphens: none;
white-space: nowrap;
} }
div[class*="highlight-"] { div[class*="highlight-"] {
@ -765,8 +814,12 @@ div.code-block-caption code {
table.highlighttable td.linenos, table.highlighttable td.linenos,
span.linenos, span.linenos,
div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none; user-select: none;
-webkit-user-select: text; /* Safari fallback only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
} }
div.code-block-caption span.caption-number { div.code-block-caption span.caption-number {
@ -781,16 +834,6 @@ div.literal-block-wrapper {
margin: 1em 0; margin: 1em 0;
} }
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code { code.xref, a code {
background-color: transparent; background-color: transparent;
font-weight: bold; font-weight: bold;

View file

@ -2,315 +2,155 @@
* doctools.js * doctools.js
* ~~~~~~~~~~~ * ~~~~~~~~~~~
* *
* Sphinx JavaScript utilities for all documentation. * Base JavaScript utilities for all Sphinx HTML documentation.
* *
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
"use strict";
/** const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
* select a different prefix for underscore "TEXTAREA",
*/ "INPUT",
$u = _.noConflict(); "SELECT",
"BUTTON",
]);
/** const _ready = (callback) => {
* make the code below compatible with browsers without if (document.readyState !== "loading") {
* an installed firebug like debugger callback();
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else { } else {
span = document.createElement("span"); document.addEventListener("DOMContentLoaded", callback);
span.className = className;
} }
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
}; };
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/** /**
* Small JavaScript module for the documentation. * Small JavaScript module for the documentation.
*/ */
var Documentation = { const Documentation = {
init: () => {
init : function() { Documentation.initDomainIndexTable();
this.fixFirefoxAnchorBug(); Documentation.initOnKeyListeners();
this.highlightSearchWords();
this.initIndexTable();
if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
this.initOnKeyListeners();
}
}, },
/** /**
* i18n support * i18n support
*/ */
TRANSLATIONS : {}, TRANSLATIONS: {},
PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE : 'unknown', LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions // gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext) // can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) { gettext: (string) => {
var translated = Documentation.TRANSLATIONS[string]; const translated = Documentation.TRANSLATIONS[string];
if (typeof translated === 'undefined') switch (typeof translated) {
return string; case "undefined":
return (typeof translated === 'string') ? translated : translated[0]; return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
}, },
ngettext : function(singular, plural, n) { ngettext: (singular, plural, n) => {
var translated = Documentation.TRANSLATIONS[singular]; const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined') if (typeof translated !== "undefined")
return (n == 1) ? singular : plural; return translated[Documentation.PLURAL_EXPR(n)];
return translated[Documentation.PLURALEXPR(n)]; return n === 1 ? singular : plural;
}, },
addTranslations : function(catalog) { addTranslations: (catalog) => {
for (var key in catalog.messages) Object.assign(Documentation.TRANSLATIONS, catalog.messages);
this.TRANSLATIONS[key] = catalog.messages[key]; Documentation.PLURAL_EXPR = new Function(
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); "n",
this.LOCALE = catalog.locale; `return (${catalog.plural_expr})`
);
Documentation.LOCALE = catalog.locale;
}, },
/** /**
* add context elements like header anchor links * helper function to focus on search bar
*/ */
addContextElements : function() { focusSearchBar: () => {
$('div[id] > :header:first').each(function() { document.querySelectorAll("input[name=q]")[0]?.focus();
$('<a class="headerlink">\u00B6</a>'). },
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')). /**
appendTo(this); * Initialise the domain index toggle buttons
}); */
$('dt[id]').each(function() { initDomainIndexTable: () => {
$('<a class="headerlink">\u00B6</a>'). const toggler = (el) => {
attr('href', '#' + this.id). const idNumber = el.id.substr(7);
attr('title', _('Permalink to this definition')). const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
appendTo(this); if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
},
initOnKeyListeners: () => {
// only install a listener if it is really needed
if (
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
)
return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.altKey || event.ctrlKey || event.metaKey) return;
if (!event.shiftKey) {
switch (event.key) {
case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const prevLink = document.querySelector('link[rel="prev"]');
if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
}); });
}, },
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) === 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
/**
* make the url absolute
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
$(document).keydown(function(event) {
var activeElementType = document.activeElement.tagName;
// don't navigate when in search box, textarea, dropdown or button
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
&& activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
&& !event.shiftKey) {
switch (event.keyCode) {
case 37: // left
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
}
case 39: // right
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
}
}
}
});
}
}; };
// quick alias for translations // quick alias for translations
_ = Documentation.gettext; const _ = Documentation.gettext;
$(document).ready(function() { _ready(Documentation.init);
Documentation.init();
});

View file

@ -8,5 +8,7 @@ var DOCUMENTATION_OPTIONS = {
LINK_SUFFIX: '.html', LINK_SUFFIX: '.html',
HAS_SOURCE: true, HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt', SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
}; };

577
_static/german-stemmer.js Normal file
View file

@ -0,0 +1,577 @@
// Generated by Snowball 2.1.0 - https://snowballstem.org/
/**@constructor*/
GermanStemmer = function() {
var base = new BaseStemmer();
/** @const */ var a_0 = [
["", -1, 5],
["U", 0, 2],
["Y", 0, 1],
["\u00E4", 0, 3],
["\u00F6", 0, 4],
["\u00FC", 0, 2]
];
/** @const */ var a_1 = [
["e", -1, 2],
["em", -1, 1],
["en", -1, 2],
["ern", -1, 1],
["er", -1, 1],
["s", -1, 3],
["es", 5, 2]
];
/** @const */ var a_2 = [
["en", -1, 1],
["er", -1, 1],
["st", -1, 2],
["est", 2, 1]
];
/** @const */ var a_3 = [
["ig", -1, 1],
["lich", -1, 1]
];
/** @const */ var a_4 = [
["end", -1, 1],
["ig", -1, 2],
["ung", -1, 1],
["lich", -1, 3],
["isch", -1, 2],
["ik", -1, 2],
["heit", -1, 3],
["keit", -1, 4]
];
/** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8];
/** @const */ var /** Array<int> */ g_s_ending = [117, 30, 5];
/** @const */ var /** Array<int> */ g_st_ending = [117, 30, 4];
var /** number */ I_x = 0;
var /** number */ I_p2 = 0;
var /** number */ I_p1 = 0;
/** @return {boolean} */
function r_prelude() {
var /** number */ v_1 = base.cursor;
while(true)
{
var /** number */ v_2 = base.cursor;
lab0: {
lab1: {
var /** number */ v_3 = base.cursor;
lab2: {
base.bra = base.cursor;
if (!(base.eq_s("\u00DF")))
{
break lab2;
}
base.ket = base.cursor;
if (!base.slice_from("ss"))
{
return false;
}
break lab1;
}
base.cursor = v_3;
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
continue;
}
base.cursor = v_2;
break;
}
base.cursor = v_1;
while(true)
{
var /** number */ v_4 = base.cursor;
lab3: {
golab4: while(true)
{
var /** number */ v_5 = base.cursor;
lab5: {
if (!(base.in_grouping(g_v, 97, 252)))
{
break lab5;
}
base.bra = base.cursor;
lab6: {
var /** number */ v_6 = base.cursor;
lab7: {
if (!(base.eq_s("u")))
{
break lab7;
}
base.ket = base.cursor;
if (!(base.in_grouping(g_v, 97, 252)))
{
break lab7;
}
if (!base.slice_from("U"))
{
return false;
}
break lab6;
}
base.cursor = v_6;
if (!(base.eq_s("y")))
{
break lab5;
}
base.ket = base.cursor;
if (!(base.in_grouping(g_v, 97, 252)))
{
break lab5;
}
if (!base.slice_from("Y"))
{
return false;
}
}
base.cursor = v_5;
break golab4;
}
base.cursor = v_5;
if (base.cursor >= base.limit)
{
break lab3;
}
base.cursor++;
}
continue;
}
base.cursor = v_4;
break;
}
return true;
};
/** @return {boolean} */
function r_mark_regions() {
I_p1 = base.limit;
I_p2 = base.limit;
var /** number */ v_1 = base.cursor;
{
var /** number */ c1 = base.cursor + 3;
if (c1 > base.limit)
{
return false;
}
base.cursor = c1;
}
I_x = base.cursor;
base.cursor = v_1;
golab0: while(true)
{
lab1: {
if (!(base.in_grouping(g_v, 97, 252)))
{
break lab1;
}
break golab0;
}
if (base.cursor >= base.limit)
{
return false;
}
base.cursor++;
}
golab2: while(true)
{
lab3: {
if (!(base.out_grouping(g_v, 97, 252)))
{
break lab3;
}
break golab2;
}
if (base.cursor >= base.limit)
{
return false;
}
base.cursor++;
}
I_p1 = base.cursor;
lab4: {
if (!(I_p1 < I_x))
{
break lab4;
}
I_p1 = I_x;
}
golab5: while(true)
{
lab6: {
if (!(base.in_grouping(g_v, 97, 252)))
{
break lab6;
}
break golab5;
}
if (base.cursor >= base.limit)
{
return false;
}
base.cursor++;
}
golab7: while(true)
{
lab8: {
if (!(base.out_grouping(g_v, 97, 252)))
{
break lab8;
}
break golab7;
}
if (base.cursor >= base.limit)
{
return false;
}
base.cursor++;
}
I_p2 = base.cursor;
return true;
};
/** @return {boolean} */
function r_postlude() {
var /** number */ among_var;
while(true)
{
var /** number */ v_1 = base.cursor;
lab0: {
base.bra = base.cursor;
among_var = base.find_among(a_0);
if (among_var == 0)
{
break lab0;
}
base.ket = base.cursor;
switch (among_var) {
case 1:
if (!base.slice_from("y"))
{
return false;
}
break;
case 2:
if (!base.slice_from("u"))
{
return false;
}
break;
case 3:
if (!base.slice_from("a"))
{
return false;
}
break;
case 4:
if (!base.slice_from("o"))
{
return false;
}
break;
case 5:
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
break;
}
continue;
}
base.cursor = v_1;
break;
}
return true;
};
/** @return {boolean} */
function r_R1() {
if (!(I_p1 <= base.cursor))
{
return false;
}
return true;
};
/** @return {boolean} */
function r_R2() {
if (!(I_p2 <= base.cursor))
{
return false;
}
return true;
};
/** @return {boolean} */
function r_standard_suffix() {
var /** number */ among_var;
var /** number */ v_1 = base.limit - base.cursor;
lab0: {
base.ket = base.cursor;
among_var = base.find_among_b(a_1);
if (among_var == 0)
{
break lab0;
}
base.bra = base.cursor;
if (!r_R1())
{
break lab0;
}
switch (among_var) {
case 1:
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!base.slice_del())
{
return false;
}
var /** number */ v_2 = base.limit - base.cursor;
lab1: {
base.ket = base.cursor;
if (!(base.eq_s_b("s")))
{
base.cursor = base.limit - v_2;
break lab1;
}
base.bra = base.cursor;
if (!(base.eq_s_b("nis")))
{
base.cursor = base.limit - v_2;
break lab1;
}
if (!base.slice_del())
{
return false;
}
}
break;
case 3:
if (!(base.in_grouping_b(g_s_ending, 98, 116)))
{
break lab0;
}
if (!base.slice_del())
{
return false;
}
break;
}
}
base.cursor = base.limit - v_1;
var /** number */ v_3 = base.limit - base.cursor;
lab2: {
base.ket = base.cursor;
among_var = base.find_among_b(a_2);
if (among_var == 0)
{
break lab2;
}
base.bra = base.cursor;
if (!r_R1())
{
break lab2;
}
switch (among_var) {
case 1:
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!(base.in_grouping_b(g_st_ending, 98, 116)))
{
break lab2;
}
{
var /** number */ c1 = base.cursor - 3;
if (c1 < base.limit_backward)
{
break lab2;
}
base.cursor = c1;
}
if (!base.slice_del())
{
return false;
}
break;
}
}
base.cursor = base.limit - v_3;
var /** number */ v_4 = base.limit - base.cursor;
lab3: {
base.ket = base.cursor;
among_var = base.find_among_b(a_4);
if (among_var == 0)
{
break lab3;
}
base.bra = base.cursor;
if (!r_R2())
{
break lab3;
}
switch (among_var) {
case 1:
if (!base.slice_del())
{
return false;
}
var /** number */ v_5 = base.limit - base.cursor;
lab4: {
base.ket = base.cursor;
if (!(base.eq_s_b("ig")))
{
base.cursor = base.limit - v_5;
break lab4;
}
base.bra = base.cursor;
{
var /** number */ v_6 = base.limit - base.cursor;
lab5: {
if (!(base.eq_s_b("e")))
{
break lab5;
}
base.cursor = base.limit - v_5;
break lab4;
}
base.cursor = base.limit - v_6;
}
if (!r_R2())
{
base.cursor = base.limit - v_5;
break lab4;
}
if (!base.slice_del())
{
return false;
}
}
break;
case 2:
{
var /** number */ v_7 = base.limit - base.cursor;
lab6: {
if (!(base.eq_s_b("e")))
{
break lab6;
}
break lab3;
}
base.cursor = base.limit - v_7;
}
if (!base.slice_del())
{
return false;
}
break;
case 3:
if (!base.slice_del())
{
return false;
}
var /** number */ v_8 = base.limit - base.cursor;
lab7: {
base.ket = base.cursor;
lab8: {
var /** number */ v_9 = base.limit - base.cursor;
lab9: {
if (!(base.eq_s_b("er")))
{
break lab9;
}
break lab8;
}
base.cursor = base.limit - v_9;
if (!(base.eq_s_b("en")))
{
base.cursor = base.limit - v_8;
break lab7;
}
}
base.bra = base.cursor;
if (!r_R1())
{
base.cursor = base.limit - v_8;
break lab7;
}
if (!base.slice_del())
{
return false;
}
}
break;
case 4:
if (!base.slice_del())
{
return false;
}
var /** number */ v_10 = base.limit - base.cursor;
lab10: {
base.ket = base.cursor;
if (base.find_among_b(a_3) == 0)
{
base.cursor = base.limit - v_10;
break lab10;
}
base.bra = base.cursor;
if (!r_R2())
{
base.cursor = base.limit - v_10;
break lab10;
}
if (!base.slice_del())
{
return false;
}
}
break;
}
}
base.cursor = base.limit - v_4;
return true;
};
this.stem = /** @return {boolean} */ function() {
var /** number */ v_1 = base.cursor;
r_prelude();
base.cursor = v_1;
var /** number */ v_2 = base.cursor;
r_mark_regions();
base.cursor = v_2;
base.limit_backward = base.cursor; base.cursor = base.limit;
r_standard_suffix();
base.cursor = base.limit_backward;
var /** number */ v_4 = base.cursor;
r_postlude();
base.cursor = v_4;
return true;
};
/**@return{string}*/
this['stemWord'] = function(/**string*/word) {
base.setCurrent(word);
this.stem();
return base.getCurrent();
};
};

10881
_static/jquery-3.6.0.js vendored Normal file

File diff suppressed because it is too large Load diff

4
_static/jquery.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,26 +1,26 @@
pre { line-height: 125%; } pre { line-height: 125%; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc } .highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; } .highlight { background: #f8f8f8; }
.highlight .c { color: #408080; font-style: italic } /* Comment */ .highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */ .highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */ .highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ .highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ .highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ .highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ .highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ .highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */ .highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
@ -33,15 +33,15 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .kt { color: #B00040 } /* Keyword.Type */ .highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */ .highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */ .highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #7D9029 } /* Name.Attribute */ .highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */ .highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */ .highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */ .highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ .highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ .highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */ .highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #A0A000 } /* Name.Label */ .highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */ .highlight .nv { color: #19177C } /* Name.Variable */
@ -58,11 +58,11 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ .highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ .highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */ .highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ .highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */ .highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */

View file

@ -4,22 +4,24 @@
* *
* Sphinx JavaScript utilities for the full-text search. * Sphinx JavaScript utilities for the full-text search.
* *
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
"use strict";
if (!Scorer) { /**
/**
* Simple result scoring code. * Simple result scoring code.
*/ */
if (typeof Scorer === "undefined") {
var Scorer = { var Scorer = {
// Implement the following function to further tweak the score for each result // Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score] // The function takes a result array [docname, title, anchor, descr, score, filename]
// and returns the new score. // and returns the new score.
/* /*
score: function(result) { score: result => {
return result[4]; const [docname, title, anchor, descr, score, filename] = result
return score
}, },
*/ */
@ -28,9 +30,11 @@ if (!Scorer) {
// or matches in the last dotted part of the object name // or matches in the last dotted part of the object name
objPartialMatch: 6, objPartialMatch: 6,
// Additive scores depending on the priority of the object // Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults objPrio: {
0: 15, // used to be importantResults
1: 5, // used to be objectResults 1: 5, // used to be objectResults
2: -5}, // used to be unimportantResults 2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping. // Used when the priority is not in the mapping.
objPrioDefault: 0, objPrioDefault: 0,
@ -39,444 +43,495 @@ if (!Scorer) {
partialTitle: 7, partialTitle: 7,
// query found in terms // query found in terms
term: 5, term: 5,
partialTerm: 2 partialTerm: 2,
}; };
} }
if (!splitQuery) { const _removeChildren = (element) => {
function splitQuery(query) { while (element && element.lastChild) element.removeChild(element.lastChild);
return query.split(/\s+/); };
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
const _displayItem = (item, searchTerms) => {
const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT;
const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
const [docName, title, anchor, descr, score, _filename] = item;
let listItem = document.createElement("li");
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = docUrlRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = docUrlRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
} }
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + anchor;
linkEl.dataset.score = score;
linkEl.innerHTML = title;
if (descr)
listItem.appendChild(document.createElement("span")).innerHTML =
" (" + descr + ")";
else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms)
);
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
);
else
Search.status.innerText = _(
`Search finished, found ${resultCount} page(s) matching the search query.`
);
};
const _displayNextItem = (
results,
resultCount,
searchTerms
) => {
// results left, load the summary and display it
// this is intended to be dynamic (don't sub resultsCount)
if (results.length) {
_displayItem(results.pop(), searchTerms);
setTimeout(
() => _displayNextItem(results, resultCount, searchTerms),
5
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) => query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter(term => term) // remove remaining empty strings
} }
/** /**
* Search Module * Search Module
*/ */
var Search = { const Search = {
_index: null,
_queued_query: null,
_pulse_status: -1,
_index : null, htmlToText: (htmlString) => {
_queued_query : null, const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
_pulse_status : -1, htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
const docContent = htmlElement.querySelector('[role="main"]');
htmlToText : function(htmlString) { if (docContent !== undefined) return docContent.textContent;
var virtualDocument = document.implementation.createHTMLDocument('virtual'); console.warn(
var htmlElement = $(htmlString, virtualDocument); "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
htmlElement.find('.headerlink').remove(); );
docContent = htmlElement.find('[role=main]')[0];
if(docContent === undefined) {
console.warn("Content block not found. Sphinx search tries to obtain it " +
"via '[role=main]'. Could you check your theme or template.");
return ""; return "";
}
return docContent.textContent || docContent.innerText;
}, },
init : function() { init: () => {
var params = $.getQueryParameters(); const query = new URLSearchParams(window.location.search).get("q");
if (params.q) { document
var query = params.q[0]; .querySelectorAll('input[name="q"]')
$('input[name="q"]')[0].value = query; .forEach((el) => (el.value = query));
this.performSearch(query); if (query) Search.performSearch(query);
},
loadIndex: (url) =>
(document.body.appendChild(document.createElement("script")).src = url),
setIndex: (index) => {
Search._index = index;
if (Search._queued_query !== null) {
const query = Search._queued_query;
Search._queued_query = null;
Search.query(query);
} }
}, },
loadIndex : function(url) { hasIndex: () => Search._index !== null,
$.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
setIndex : function(index) { deferQuery: (query) => (Search._queued_query = query),
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
hasIndex : function() { stopPulse: () => (Search._pulse_status = -1),
return this._index !== null;
},
deferQuery : function(query) { startPulse: () => {
this._queued_query = query; if (Search._pulse_status >= 0) return;
},
stopPulse : function() { const pulse = () => {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
var i;
Search._pulse_status = (Search._pulse_status + 1) % 4; Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = ''; Search.dots.innerText = ".".repeat(Search._pulse_status);
for (i = 0; i < Search._pulse_status; i++) if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
dotString += '.'; };
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
pulse(); pulse();
}, },
/** /**
* perform a search for something (or wait until index is loaded) * perform a search for something (or wait until index is loaded)
*/ */
performSearch : function(query) { performSearch: (query) => {
// create the required interface elements // create the required interface elements
this.out = $('#search-results'); const searchText = document.createElement("h2");
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out); searchText.textContent = _("Searching");
this.dots = $('<span></span>').appendTo(this.title); const searchSummary = document.createElement("p");
this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out); searchSummary.classList.add("search-summary");
this.output = $('<ul class="search"/>').appendTo(this.out); searchSummary.innerText = "";
const searchList = document.createElement("ul");
searchList.classList.add("search");
$('#search-progress').text(_('Preparing search...')); const out = document.getElementById("search-results");
this.startPulse(); Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick! // index already loaded, the browser was quick!
if (this.hasIndex()) if (Search.hasIndex()) Search.query(query);
this.query(query); else Search.deferQuery(query);
else
this.deferQuery(query);
}, },
/** /**
* execute search (requires search index to be loaded) * execute search (requires search index to be loaded)
*/ */
query : function(query) { query: (query) => {
var i; const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const allTitles = Search._index.alltitles;
const indexEntries = Search._index.indexentries;
// stem the searchterms and add them to the correct list // stem the search terms and add them to the correct list
var stemmer = new Stemmer(); const stemmer = new Stemmer();
var searchterms = []; const searchTerms = new Set();
var excluded = []; const excludedTerms = new Set();
var hlterms = []; const highlightTerms = new Set();
var tmp = splitQuery(query); const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
var objectterms = []; splitQuery(query.trim()).forEach((queryTerm) => {
for (i = 0; i < tmp.length; i++) { const queryTermLower = queryTerm.toLowerCase();
if (tmp[i] !== "") {
objectterms.push(tmp[i].toLowerCase()); // maybe skip this "word"
} // stopwords array is from language_data.js
if (
stopwords.indexOf(queryTermLower) !== -1 ||
queryTerm.match(/^\d+$/)
)
return;
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word // stem the word
var word = stemmer.stemWord(tmp[i].toLowerCase()); let word = stemmer.stemWord(queryTermLower);
// prevent stemmer from cutting word smaller than two chars
if(word.length < 3 && tmp[i].length >= 3) {
word = tmp[i];
}
var toAppend;
// select the correct list // select the correct list
if (word[0] == '-') { if (word[0] === "-") excludedTerms.add(word.substr(1));
toAppend = excluded;
word = word.substr(1);
}
else { else {
toAppend = searchterms; searchTerms.add(word);
hlterms.push(tmp[i].toLowerCase()); highlightTerms.add(queryTermLower);
} }
// only add if not already in the list });
if (!$u.contains(toAppend, word))
toAppend.push(word); if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
} }
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:'); // console.debug("SEARCH: searching for:");
// console.info('required: ', searchterms); // console.info("required: ", [...searchTerms]);
// console.info('excluded: ', excluded); // console.info("excluded: ", [...excludedTerms]);
// prepare search // array of [docname, title, anchor, descr, score, filename]
var terms = this._index.terms; let results = [];
var titleterms = this._index.titleterms; _removeChildren(document.getElementById("search-progress"));
// array of [filename, title, anchor, descr, score] const queryLower = query.toLowerCase();
var results = []; for (const [title, foundTitles] of Object.entries(allTitles)) {
$('#search-progress').empty(); if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
for (const [file, id] of foundTitles) {
let score = Math.round(100 * queryLower.length / title.length)
results.push([
docNames[file],
titles[file] !== title ? `${titles[file]} > ${title}` : title,
id !== null ? "#" + id : "",
null,
score,
filenames[file],
]);
}
}
}
// search for explicit entries in index directives
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
for (const [file, id] of foundEntries) {
let score = Math.round(100 * queryLower.length / entry.length)
results.push([
docNames[file],
titles[file],
id ? "#" + id : "",
null,
score,
filenames[file],
]);
}
}
}
// lookup as object // lookup as object
for (i = 0; i < objectterms.length; i++) { objectTerms.forEach((term) =>
var others = [].concat(objectterms.slice(0, i), results.push(...Search.performObjectSearch(term, objectTerms))
objectterms.slice(i+1, objectterms.length)); );
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
// lookup as search terms in fulltext // lookup as search terms in fulltext
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms)); results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function // let the scorer override scores with a custom scoring function
if (Scorer.score) { if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
// now sort the results by score (in opposite order of appearance, since the // now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then // display function below uses pop() to retrieve items) and then
// alphabetically // alphabetically
results.sort(function(a, b) { results.sort((a, b) => {
var left = a[4]; const leftScore = a[4];
var right = b[4]; const rightScore = b[4];
if (left > right) { if (leftScore === rightScore) {
return 1;
} else if (left < right) {
return -1;
} else {
// same score: sort alphabetically // same score: sort alphabetically
left = a[1].toLowerCase(); const leftTitle = a[1].toLowerCase();
right = b[1].toLowerCase(); const rightTitle = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0); if (leftTitle === rightTitle) return 0;
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
} }
return leftScore > rightScore ? 1 : -1;
}); });
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
results = results.reverse();
// for debugging // for debugging
//Search.lastresults = results.slice(); // a copy //Search.lastresults = results.slice(); // a copy
//console.info('search results:', Search.lastresults); // console.info("search results:", Search.lastresults);
// print the results // print the results
var resultCount = results.length; _displayNextItem(results, results.length, searchTerms);
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li style="display:none"></li>');
var requestUrl = "";
var linkUrl = "";
if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
}
listItem.append($('<a/>').attr('href',
linkUrl +
highlightstring + item[2]).html(item[1]));
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
$.ajax({url: requestUrl,
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '' && data !== undefined) {
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
}
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}});
} else {
// no source available, just display title
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
}, },
/** /**
* search for object names * search for object names
*/ */
performObjectSearch : function(object, otherterms) { performObjectSearch: (object, objectTerms) => {
var filenames = this._index.filenames; const filenames = Search._index.filenames;
var docnames = this._index.docnames; const docNames = Search._index.docnames;
var objects = this._index.objects; const objects = Search._index.objects;
var objnames = this._index.objnames; const objNames = Search._index.objnames;
var titles = this._index.titles; const titles = Search._index.titles;
var i; const results = [];
var results = [];
const objectSearchCallback = (prefix, match) => {
const name = match[4]
const fullname = (prefix ? prefix + "." : "") + name;
const fullnameLower = fullname.toLowerCase();
if (fullnameLower.indexOf(object) < 0) return;
let score = 0;
const parts = fullnameLower.split(".");
for (var prefix in objects) {
for (var name in objects[prefix]) {
var fullname = (prefix ? prefix + '.' : '') + name;
var fullnameLower = fullname.toLowerCase()
if (fullnameLower.indexOf(object) > -1) {
var score = 0;
var parts = fullnameLower.split('.');
// check for different match types: exact matches of full name or // check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part) // "last name" (i.e. last dotted part)
if (fullnameLower == object || parts[parts.length - 1] == object) { if (fullnameLower === object || parts.slice(-1)[0] === object)
score += Scorer.objNameMatch; score += Scorer.objNameMatch;
// matches in last name else if (parts.slice(-1)[0].indexOf(object) > -1)
} else if (parts[parts.length - 1].indexOf(object) > -1) { score += Scorer.objPartialMatch; // matches in last name
score += Scorer.objPartialMatch;
} const objName = objNames[match[1]][2];
var match = objects[prefix][name]; const title = titles[match[0]];
var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be // If more than one term searched for, we require other words to be
// found in the name/title/description // found in the name/title/description
if (otherterms.length > 0) { const otherTerms = new Set(objectTerms);
var haystack = (prefix + ' ' + name + ' ' + otherTerms.delete(object);
objname + ' ' + title).toLowerCase(); if (otherTerms.size > 0) {
var allfound = true; const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
for (i = 0; i < otherterms.length; i++) { if (
if (haystack.indexOf(otherterms[i]) == -1) { [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
allfound = false; )
break; return;
} }
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3]; let anchor = match[3];
if (anchor === '') if (anchor === "") anchor = fullname;
anchor = fullname; else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname; const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer // add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2])) { if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]]; score += Scorer.objPrio[match[2]];
} else { else score += Scorer.objPrioDefault;
score += Scorer.objPrioDefault;
}
results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
}
}
}
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) =>
objectSearchCallback(prefix, array)
)
);
return results; return results;
}, },
/** /**
* search for full-text terms in the index * search for full-text terms in the index
*/ */
performTermsSearch : function(searchterms, excluded, terms, titleterms) { performTermsSearch: (searchTerms, excludedTerms) => {
var docnames = this._index.docnames; // prepare search
var filenames = this._index.filenames; const terms = Search._index.terms;
var titles = this._index.titles; const titleTerms = Search._index.titleterms;
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
var i, j, file; const scoreMap = new Map();
var fileMap = {}; const fileMap = new Map();
var scoreMap = {};
var results = [];
// perform the search on the required terms // perform the search on the required terms
for (i = 0; i < searchterms.length; i++) { searchTerms.forEach((word) => {
var word = searchterms[i]; const files = [];
var files = []; const arr = [
var _o = [ { files: terms[word], score: Scorer.term },
{files: terms[word], score: Scorer.term}, { files: titleTerms[word], score: Scorer.title },
{files: titleterms[word], score: Scorer.title}
]; ];
// add support for partial matches // add support for partial matches
if (word.length > 2) { if (word.length > 2) {
for (var w in terms) { const escapedWord = _escapeRegExp(word);
if (w.match(word) && !terms[word]) { Object.keys(terms).forEach((term) => {
_o.push({files: terms[w], score: Scorer.partialTerm}) if (term.match(escapedWord) && !terms[word])
} arr.push({ files: terms[term], score: Scorer.partialTerm });
} });
for (var w in titleterms) { Object.keys(titleTerms).forEach((term) => {
if (w.match(word) && !titleterms[word]) { if (term.match(escapedWord) && !titleTerms[word])
_o.push({files: titleterms[w], score: Scorer.partialTitle}) arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
} });
}
} }
// no match but word was a required one // no match but word was a required one
if ($u.every(_o, function(o){return o.files === undefined;})) { if (arr.every((record) => record.files === undefined)) return;
break;
}
// found search word in contents // found search word in contents
$u.each(_o, function(o) { arr.forEach((record) => {
var _files = o.files; if (record.files === undefined) return;
if (_files === undefined)
return
if (_files.length === undefined) let recordFiles = record.files;
_files = [_files]; if (recordFiles.length === undefined) recordFiles = [recordFiles];
files = files.concat(_files); files.push(...recordFiles);
// set score for the word in each file to Scorer.term // set score for the word in each file
for (j = 0; j < _files.length; j++) { recordFiles.forEach((file) => {
file = _files[j]; if (!scoreMap.has(file)) scoreMap.set(file, {});
if (!(file in scoreMap)) scoreMap.get(file)[word] = record.score;
scoreMap[file] = {}; });
scoreMap[file][word] = o.score;
}
}); });
// create the mapping // create the mapping
for (j = 0; j < files.length; j++) { files.forEach((file) => {
file = files[j]; if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
if (file in fileMap && fileMap[file].indexOf(word) === -1) fileMap.get(file).push(word);
fileMap[file].push(word); else fileMap.set(file, [word]);
else });
fileMap[file] = [word]; });
}
}
// now check if the files don't contain excluded terms // now check if the files don't contain excluded terms
for (file in fileMap) { const results = [];
var valid = true; for (const [file, wordList] of fileMap) {
// check if all requirements are matched // check if all requirements are matched
var filteredTermCount = // as search terms with length < 3 are discarded: ignore
searchterms.filter(function(term){return term.length > 2}).length // as search terms with length < 3 are discarded
const filteredTermCount = [...searchTerms].filter(
(term) => term.length > 2
).length;
if ( if (
fileMap[file].length != searchterms.length && wordList.length !== searchTerms.size &&
fileMap[file].length != filteredTermCount wordList.length !== filteredTermCount
) continue; )
continue;
// ensure that none of the excluded terms is in the search result // ensure that none of the excluded terms is in the search result
for (i = 0; i < excluded.length; i++) { if (
if (terms[excluded[i]] == file || [...excludedTerms].some(
titleterms[excluded[i]] == file || (term) =>
$u.contains(terms[excluded[i]] || [], file) || terms[term] === file ||
$u.contains(titleterms[excluded[i]] || [], file)) { titleTerms[term] === file ||
valid = false; (terms[term] || []).includes(file) ||
(titleTerms[term] || []).includes(file)
)
)
break; break;
}
}
// if we have still a valid result we can add it to the result list
if (valid) {
// select one (max) score for the file. // select one (max) score for the file.
// for better ranking, we should calculate ranking by using words statistics like basic tf-idf... const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]})); // add result to the result list
results.push([docnames[file], titles[file], '', null, score, filenames[file]]); results.push([
} docNames[file],
titles[file],
"",
null,
score,
filenames[file],
]);
} }
return results; return results;
}, },
@ -484,31 +539,28 @@ var Search = {
/** /**
* helper function to return a node containing the * helper function to return a node containing the
* search summary for a given text. keywords is a list * search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed * of stemmed words.
* words. the first one is used to find the occurrence, the
* latter for highlighting it.
*/ */
makeSearchSummary : function(htmlText, keywords, hlwords) { makeSearchSummary: (htmlText, keywords) => {
var text = Search.htmlToText(htmlText); const text = Search.htmlToText(htmlText);
var textLower = text.toLowerCase(); if (text === "") return null;
var start = 0;
$.each(keywords, function() { const textLower = text.toLowerCase();
var i = textLower.indexOf(this.toLowerCase()); const actualStartPosition = [...keywords]
if (i > -1) .map((k) => textLower.indexOf(k.toLowerCase()))
start = i; .filter((i) => i > -1)
}); .slice(-1)[0];
start = Math.max(start - 120, 0); const startWithContext = Math.max(actualStartPosition - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) + const top = startWithContext === 0 ? "" : "...";
((start + 240 - text.length) ? '...' : ''); const tail = startWithContext + 240 < text.length ? "..." : "";
var rv = $('<div class="context"></div>').text(excerpt);
$.each(hlwords, function() { let summary = document.createElement("p");
rv = rv.highlightText(this, 'highlighted'); summary.classList.add("context");
}); summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
return rv;
} return summary;
},
}; };
$(document).ready(function() { _ready(Search.init);
Search.init();
});

144
_static/sphinx_highlight.js Normal file
View file

@ -0,0 +1,144 @@
/* Highlighting utilities for Sphinx HTML documentation. */
"use strict";
const SPHINX_HIGHLIGHT_ENABLED = true
/**
* highlight a given string on a node by wrapping it in
* span elements with the given class name.
*/
const _highlight = (node, addItems, text, className) => {
if (node.nodeType === Node.TEXT_NODE) {
const val = node.nodeValue;
const parent = node.parentNode;
const pos = val.toLowerCase().indexOf(text);
if (
pos >= 0 &&
!parent.classList.contains(className) &&
!parent.classList.contains("nohighlight")
) {
let span;
const closestNode = parent.closest("body, svg, foreignObject");
const isInSVG = closestNode && closestNode.matches("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
parent.insertBefore(
span,
parent.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling
)
);
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
const rect = document.createElementNS(
"http://www.w3.org/2000/svg",
"rect"
);
const bbox = parent.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
}
}
} else if (node.matches && !node.matches("button, select, textarea")) {
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
}
};
const _highlightText = (thisNode, text, className) => {
let addItems = [];
_highlight(thisNode, addItems, text, className);
addItems.forEach((obj) =>
obj.parent.insertAdjacentElement("beforebegin", obj.target)
);
};
/**
* Small JavaScript module for the documentation.
*/
const SphinxHighlight = {
/**
* highlight the search words provided in localstorage in the text
*/
highlightSearchWords: () => {
if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
// get and clear terms from localstorage
const url = new URL(window.location);
const highlight =
localStorage.getItem("sphinx_highlight_terms")
|| url.searchParams.get("highlight")
|| "";
localStorage.removeItem("sphinx_highlight_terms")
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
// get individual terms from highlight string
const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
if (terms.length === 0) return; // nothing to do
// There should never be more than one element matching "div.body"
const divBody = document.querySelectorAll("div.body");
const body = divBody.length ? divBody[0] : document.querySelector("body");
window.setTimeout(() => {
terms.forEach((term) => _highlightText(body, term, "highlighted"));
}, 10);
const searchBox = document.getElementById("searchbox");
if (searchBox === null) return;
searchBox.appendChild(
document
.createRange()
.createContextualFragment(
'<p class="highlight-link">' +
'<a href="javascript:SphinxHighlight.hideSearchWords()">' +
_("Hide Search Matches") +
"</a></p>"
)
);
},
/**
* helper function to hide the search marks again
*/
hideSearchWords: () => {
document
.querySelectorAll("#searchbox .highlight-link")
.forEach((el) => el.remove());
document
.querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
localStorage.removeItem("sphinx_highlight_terms")
},
initEscapeListener: () => {
// only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
SphinxHighlight.hideSearchWords();
event.preventDefault();
}
});
},
};
_ready(SphinxHighlight.highlightSearchWords);
_ready(SphinxHighlight.initEscapeListener);

View file

@ -13,7 +13,7 @@ Documentation.addTranslations({
"Complete Table of Contents": "Vollst\u00e4ndiges Inhaltsverzeichnis", "Complete Table of Contents": "Vollst\u00e4ndiges Inhaltsverzeichnis",
"Contents": "Inhalt", "Contents": "Inhalt",
"Copyright": "Copyright", "Copyright": "Copyright",
"Created using <a href=\"http://sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Mit <a href=\"http://sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s erstellt.", "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
"Expand sidebar": "Seitenleiste ausklappen", "Expand sidebar": "Seitenleiste ausklappen",
"Full index on one page": "Gesamtes Stichwortverzeichnis auf einer Seite", "Full index on one page": "Gesamtes Stichwortverzeichnis auf einer Seite",
"General Index": "Stichwortverzeichnis", "General Index": "Stichwortverzeichnis",
@ -30,8 +30,6 @@ Documentation.addTranslations({
"Next topic": "N\u00e4chstes Thema", "Next topic": "N\u00e4chstes Thema",
"Other changes": "Andere \u00c4nderungen", "Other changes": "Andere \u00c4nderungen",
"Overview": "\u00dcbersicht", "Overview": "\u00dcbersicht",
"Permalink to this definition": "Link zu dieser Definition",
"Permalink to this headline": "Link zu dieser \u00dcberschrift",
"Please activate JavaScript to enable the search\n functionality.": "Bitte aktivieren Sie JavaScript, wenn Sie die Suchfunktion nutzen wollen.", "Please activate JavaScript to enable the search\n functionality.": "Bitte aktivieren Sie JavaScript, wenn Sie die Suchfunktion nutzen wollen.",
"Preparing search...": "Suche wird vorbereitet...", "Preparing search...": "Suche wird vorbereitet...",
"Previous topic": "Vorheriges Thema", "Previous topic": "Vorheriges Thema",
@ -39,7 +37,7 @@ Documentation.addTranslations({
"Search": "Suche", "Search": "Suche",
"Search Page": "Suche", "Search Page": "Suche",
"Search Results": "Suchergebnisse", "Search Results": "Suchergebnisse",
"Search finished, found %s page(s) matching the search query.": "Die Suche ist fertig, es wurde(n) %s Seite(n) mit Treffern gefunden.", "Search finished, found ${resultCount} page(s) matching the search query.": "",
"Search within %(docstitle)s": "Suche in %(docstitle)s", "Search within %(docstitle)s": "Suche in %(docstitle)s",
"Searching": "Suchen", "Searching": "Suchen",
"Searching for multiple words only shows matches that contain\n all words.": "", "Searching for multiple words only shows matches that contain\n all words.": "",

File diff suppressed because one or more lines are too long

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/translations.js"></script> <script src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
@ -159,17 +164,17 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="faq"> <div class="section" id="faq">
<h1>FAQ<a class="headerlink" href="#faq" title="Link zu dieser Überschrift"></a></h1> <h1>FAQ<a class="headerlink" href="#faq" title="Permalink to this heading"></a></h1>
<div class="section" id="was-ist-das-passwort-fur-die-entwicklungsumgebung"> <div class="section" id="was-ist-das-passwort-fur-die-entwicklungsumgebung">
<h2>Was ist das Passwort für die Entwicklungsumgebung?<a class="headerlink" href="#was-ist-das-passwort-fur-die-entwicklungsumgebung" title="Link zu dieser Überschrift"></a></h2> <h2>Was ist das Passwort für die Entwicklungsumgebung?<a class="headerlink" href="#was-ist-das-passwort-fur-die-entwicklungsumgebung" title="Permalink to this heading"></a></h2>
<p><code class="docutils literal notranslate"><span class="pre">compair</span></code></p> <p><code class="docutils literal notranslate"><span class="pre">compair</span></code></p>
</div> </div>
<div class="section" id="wie-verbinde-ich-mich-zur-entwicklungsumgebung"> <div class="section" id="wie-verbinde-ich-mich-zur-entwicklungsumgebung">
<h2>Wie verbinde ich mich zur Entwicklungsumgebung?<a class="headerlink" href="#wie-verbinde-ich-mich-zur-entwicklungsumgebung" title="Link zu dieser Überschrift"></a></h2> <h2>Wie verbinde ich mich zur Entwicklungsumgebung?<a class="headerlink" href="#wie-verbinde-ich-mich-zur-entwicklungsumgebung" title="Permalink to this heading"></a></h2>
<p>See <a class="reference internal" href="gettingStarted/codeServer.html#gettingstarted-codeserver"><span class="std std-ref">Programmierumgebung</span></a></p> <p>See <a class="reference internal" href="gettingStarted/codeServer.html#gettingstarted-codeserver"><span class="std std-ref">Programmierumgebung</span></a></p>
</div> </div>
<div class="section" id="was-ist-der-benutzername-und-das-passwort-fur-den-raspberry-pi"> <div class="section" id="was-ist-der-benutzername-und-das-passwort-fur-den-raspberry-pi">
<h2>Was ist der Benutzername und das Passwort für den Raspberry Pi?<a class="headerlink" href="#was-ist-der-benutzername-und-das-passwort-fur-den-raspberry-pi" title="Link zu dieser Überschrift"></a></h2> <h2>Was ist der Benutzername und das Passwort für den Raspberry Pi?<a class="headerlink" href="#was-ist-der-benutzername-und-das-passwort-fur-den-raspberry-pi" title="Permalink to this heading"></a></h2>
<p><code class="docutils literal notranslate"><span class="pre">compair</span></code> <code class="docutils literal notranslate"><span class="pre">compair</span></code></p> <p><code class="docutils literal notranslate"><span class="pre">compair</span></code> <code class="docutils literal notranslate"><span class="pre">compair</span></code></p>
</div> </div>
</div> </div>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/translations.js"></script> <script src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -166,10 +171,10 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="programmierumgebung"> <div class="section" id="programmierumgebung">
<span id="gettingstarted-codeserver"></span><h1>Programmierumgebung<a class="headerlink" href="#programmierumgebung" title="Link zu dieser Überschrift"></a></h1> <span id="gettingstarted-codeserver"></span><h1>Programmierumgebung<a class="headerlink" href="#programmierumgebung" title="Permalink to this heading"></a></h1>
<p>Als Umgebung zur Programmierung des Roboters wird <a class="reference external" href="https://github.com/coder/code-server">code-server</a> eingesetzt, welche bereits am Roboter vorinstalliert ist.</p> <p>Als Umgebung zur Programmierung des Roboters wird <a class="reference external" href="https://github.com/coder/code-server">code-server</a> eingesetzt, welche bereits am Roboter vorinstalliert ist.</p>
<div class="section" id="verbindung-zur-entwicklungsumgebung-herstellen"> <div class="section" id="verbindung-zur-entwicklungsumgebung-herstellen">
<h2>Verbindung zur Entwicklungsumgebung herstellen<a class="headerlink" href="#verbindung-zur-entwicklungsumgebung-herstellen" title="Link zu dieser Überschrift"></a></h2> <h2>Verbindung zur Entwicklungsumgebung herstellen<a class="headerlink" href="#verbindung-zur-entwicklungsumgebung-herstellen" title="Permalink to this heading"></a></h2>
<p>Am Roboter wird die IP-Adresse des Raspberry Pi angezeigt. Um nun die Verbindung herzustellen, muss man in einem Web-Browser einfach <code class="docutils literal notranslate"><span class="pre">&lt;roboter_ip&gt;:8080</span></code> eingeben. <p>Am Roboter wird die IP-Adresse des Raspberry Pi angezeigt. Um nun die Verbindung herzustellen, muss man in einem Web-Browser einfach <code class="docutils literal notranslate"><span class="pre">&lt;roboter_ip&gt;:8080</span></code> eingeben.
Das Passwort für Visual Studio Code im Browser ist <code class="docutils literal notranslate"><span class="pre">compair</span></code>!</p> Das Passwort für Visual Studio Code im Browser ist <code class="docutils literal notranslate"><span class="pre">compair</span></code>!</p>
</div> </div>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -163,7 +168,7 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="mein-erstes-programm"> <div class="section" id="mein-erstes-programm">
<h1>Mein erstes Programm<a class="headerlink" href="#mein-erstes-programm" title="Link zu dieser Überschrift"></a></h1> <h1>Mein erstes Programm<a class="headerlink" href="#mein-erstes-programm" title="Permalink to this heading"></a></h1>
<p>Um mit der Programmierung zu beginnen, müssen wir zunächst einen neuen Ordner erstellen, in dem alle unsere Python-Dateien gespeichert werden. <p>Um mit der Programmierung zu beginnen, müssen wir zunächst einen neuen Ordner erstellen, in dem alle unsere Python-Dateien gespeichert werden.
<img alt="codeServerFolder" src="../_images/06_codeServerFolder.png" /></p> <img alt="codeServerFolder" src="../_images/06_codeServerFolder.png" /></p>
<p>Sie können diesen Ordner nennen, wie Sie wollen, für dieses Beispiel heißt er <code class="docutils literal notranslate"><span class="pre">compAIR</span></code>. <p>Sie können diesen Ordner nennen, wie Sie wollen, für dieses Beispiel heißt er <code class="docutils literal notranslate"><span class="pre">compAIR</span></code>.

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -161,7 +166,7 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="erste-schritte"> <div class="section" id="erste-schritte">
<h1>Erste Schritte<a class="headerlink" href="#erste-schritte" title="Link zu dieser Überschrift"></a></h1> <h1>Erste Schritte<a class="headerlink" href="#erste-schritte" title="Permalink to this heading"></a></h1>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="wifi.html">WLAN-Verbindung herstellen</a><ul> <li class="toctree-l1"><a class="reference internal" href="wifi.html">WLAN-Verbindung herstellen</a><ul>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -170,46 +175,35 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="mein-zweites-programm"> <div class="section" id="mein-zweites-programm">
<h1>Mein zweites Programm<a class="headerlink" href="#mein-zweites-programm" title="Link zu dieser Überschrift"></a></h1> <h1>Mein zweites Programm<a class="headerlink" href="#mein-zweites-programm" title="Permalink to this heading"></a></h1>
<div class="section" id="motoren-ansteuern"> <div class="section" id="motoren-ansteuern">
<h2>Motoren ansteuern<a class="headerlink" href="#motoren-ansteuern" title="Link zu dieser Überschrift"></a></h2> <h2>Motoren ansteuern<a class="headerlink" href="#motoren-ansteuern" title="Permalink to this heading"></a></h2>
<p>Um die Motoren des Roboters zu steuern, müssen wir zunächst das entsprechende Python-Modul am Anfang der Datei importieren. Dann können wir Motor.power(port, power) verwenden, um den Motor zu steuern. <p>Um die Motoren des Roboters zu steuern, müssen wir zunächst das entsprechende Python-Modul am Anfang der Datei importieren. Dann können wir Motor.power(port, power) verwenden, um den Motor zu steuern.
Dies ist auch ein guter Punkt, um sich mit der Dokumentation vertraut zu machen: Besuchen wir <a class="reference external" href="https://lib.comp-air.at/lib/Motor.html#compLib.Motor.Motor.power">https://lib.comp-air.at/lib/Motor.html#compLib.Motor.Motor.power</a>. Hier werden die beiden relevanten Parameter beschrieben.</p> Dies ist auch ein guter Punkt, um sich mit der Dokumentation vertraut zu machen: Besuchen wir <a class="reference external" href="https://lib.comp-air.at/lib/Motor.html#compLib.Motor.Motor.power">https://lib.comp-air.at/lib/Motor.html#compLib.Motor.Motor.power</a>. Hier werden die beiden relevanten Parameter beschrieben.</p>
<p>Als Beispiel wollen wir den rechten Motor für fünf Sekunden auf volle Geschwindigkeit setzen:</p> <p>Als Beispiel wollen wir den rechten Motor für fünf Sekunden auf volle Geschwindigkeit setzen:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1"># motor.py</span>
2 <span class="linenos">2</span><span class="kn">import</span> <span class="nn">time</span>
3 <span class="linenos">3</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
4 <span class="linenos">4</span>
5 <span class="linenos">5</span><span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
6</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># motor.py</span> <span class="linenos">6</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
</div> </div>
<div class="section" id="gerade-fahren"> <div class="section" id="gerade-fahren">
<h2>Gerade fahren<a class="headerlink" href="#gerade-fahren" title="Link zu dieser Überschrift"></a></h2> <h2>Gerade fahren<a class="headerlink" href="#gerade-fahren" title="Permalink to this heading"></a></h2>
<p>Um geradeaus zu fahren, müssen wir beide Motoren auf dieselbe Geschwindigkeit einstellen. <p>Um geradeaus zu fahren, müssen wir beide Motoren auf dieselbe Geschwindigkeit einstellen.
Aber Achtung! Der rechte Motor muss umgedreht werden! Das liegt daran, dass einer nach rechts und einer nach links zeigt, sie sind also technisch gesehen gespiegelt. Aber Achtung! Der rechte Motor muss umgedreht werden! Das liegt daran, dass einer nach rechts und einer nach links zeigt, sie sind also technisch gesehen gespiegelt.
Wenn wir nun diesen Code ausführen, wird der Roboter 5 Sekunden lang vorwärts fahren:</p> Wenn wir nun diesen Code ausführen, wird der Roboter 5 Sekunden lang vorwärts fahren:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1"># motor.py</span>
2 <span class="linenos">2</span><span class="kn">import</span> <span class="nn">time</span>
3 <span class="linenos">3</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
4 <span class="linenos">4</span>
5 <span class="linenos">5</span><span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos">6</span><span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># motor.py</span> <span class="linenos">7</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p><strong>Erläuterung</strong></p> <p><strong>Erläuterung</strong></p>
<div class="line-block"> <div class="line-block">
<div class="line">In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">2</span></code> wird das python-Paket <code class="docutils literal notranslate"><span class="pre">time</span></code> importiert. Wir brauchen es später, um auf die Fahrt des Roboters zu warten. Z.B.: <code class="docutils literal notranslate"><span class="pre">time.sleep(5)</span></code></div> <div class="line">In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">2</span></code> wird das python-Paket <code class="docutils literal notranslate"><span class="pre">time</span></code> importiert. Wir brauchen es später, um auf die Fahrt des Roboters zu warten. Z.B.: <code class="docutils literal notranslate"><span class="pre">time.sleep(5)</span></code></div>
@ -220,119 +214,73 @@ Wenn wir nun diesen Code ausführen, wird der Roboter 5 Sekunden lang vorwärts
</div> </div>
<p>Danach wird das Programm beendet und der Roboter bleibt stehen.</p> <p>Danach wird das Programm beendet und der Roboter bleibt stehen.</p>
<div class="section" id="mehr-fahren"> <div class="section" id="mehr-fahren">
<h3>Mehr fahren<a class="headerlink" href="#mehr-fahren" title="Link zu dieser Überschrift"></a></h3> <h3>Mehr fahren<a class="headerlink" href="#mehr-fahren" title="Permalink to this heading"></a></h3>
<p>Jetzt ist es Zeit für einige komplexere Bewegungen. Um unseren Code modular und leicht lesbar zu halten, werden wir jede Aktion in eine eigene Funktion packen.</p> <p>Jetzt ist es Zeit für einige komplexere Bewegungen. Um unseren Code modular und leicht lesbar zu halten, werden wir jede Aktion in eine eigene Funktion packen.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos">2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos">3</span>
4 <span class="linenos">4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
5 <span class="linenos">5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos">6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">4</span></code> definieren wir die Funktion <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code>, die den Roboter mit voller Geschwindigkeit zwei Sekunden vorwärts bewegt.</p> <p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">4</span></code> definieren wir die Funktion <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code>, die den Roboter mit voller Geschwindigkeit zwei Sekunden vorwärts bewegt.</p>
<p>Jetzt werden wir eine Funktion für das Rückwärtsfahren definieren:</p> <p>Jetzt werden wir eine Funktion für das Rückwärtsfahren definieren:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7 <span class="linenos"> 7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
8 <span class="linenos"> 8</span>
9 <span class="linenos"> 9</span><span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
10 <span class="linenos">10</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
11 <span class="linenos">11</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
12</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">12</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">9</span></code> haben wir die Funktion <code class="docutils literal notranslate"><span class="pre">driveBackward()</span></code> definiert, die den Roboter zwei Sekunden lang rückwärts fahren lässt.</p> <p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">9</span></code> haben wir die Funktion <code class="docutils literal notranslate"><span class="pre">driveBackward()</span></code> definiert, die den Roboter zwei Sekunden lang rückwärts fahren lässt.</p>
<p>Jetzt können wir diese beiden Funktionen aufrufen und vorwärts und dann wieder rückwärts fahren:</p> <p>Jetzt können wir diese beiden Funktionen aufrufen und vorwärts und dann wieder rückwärts fahren:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7 <span class="linenos"> 7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
8 <span class="linenos"> 8</span>
9 <span class="linenos"> 9</span><span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
10 <span class="linenos">10</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
11 <span class="linenos">11</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
12 <span class="linenos">12</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
13 <span class="linenos">13</span>
14 <span class="linenos">14</span><span class="n">driveForward</span><span class="p">()</span>
15</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">15</span><span class="n">driveBackward</span><span class="p">()</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">()</span>
<span class="n">driveBackward</span><span class="p">()</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Wenn wir diesen Code ausführen, sollte der Roboter zunächst zwei Sekunden vorwärts und dann wieder zwei Sekunden rückwärts fahren und ungefähr an der gleichen Position wie beim Start anhalten.</p> <p>Wenn wir diesen Code ausführen, sollte der Roboter zunächst zwei Sekunden vorwärts und dann wieder zwei Sekunden rückwärts fahren und ungefähr an der gleichen Position wie beim Start anhalten.</p>
<p>Zwischen den Zeilen <code class="docutils literal notranslate"><span class="pre">14</span></code> und <code class="docutils literal notranslate"><span class="pre">15</span></code> brauchen wir kein <code class="docutils literal notranslate"><span class="pre">time.sleep(2)</span></code>, da der sleep-Befehl bereits in den Funktionen integriert ist.</p> <p>Zwischen den Zeilen <code class="docutils literal notranslate"><span class="pre">14</span></code> und <code class="docutils literal notranslate"><span class="pre">15</span></code> brauchen wir kein <code class="docutils literal notranslate"><span class="pre">time.sleep(2)</span></code>, da der sleep-Befehl bereits in den Funktionen integriert ist.</p>
<p>Jetzt wollen wir, dass der Roboter erst vorwärts fährt, dann zwei Sekunden stillsteht und dann wieder rückwärts in seine Ausgangsposition fährt.</p> <p>Jetzt wollen wir, dass der Roboter erst vorwärts fährt, dann zwei Sekunden stillsteht und dann wieder rückwärts in seine Ausgangsposition fährt.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7 <span class="linenos"> 7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
8 <span class="linenos"> 8</span>
9 <span class="linenos"> 9</span><span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
10 <span class="linenos">10</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
11 <span class="linenos">11</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
12 <span class="linenos">12</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
13 <span class="linenos">13</span>
14 <span class="linenos">14</span><span class="n">driveForward</span><span class="p">()</span>
15 <span class="linenos">15</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
16</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">16</span><span class="n">driveBackward</span><span class="p">()</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">()</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">driveBackward</span><span class="p">()</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Wenn wir den obigen Code ausführen, bleibt der Roboter nicht zwei Sekunden lang stehen, sondern fährt nach der Funktion <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> noch zwei Sekunden lang weiter. Warum passiert das? Um das zu verstehen, müssen wir wie der Roboter denken!</p> <p>Wenn wir den obigen Code ausführen, bleibt der Roboter nicht zwei Sekunden lang stehen, sondern fährt nach der Funktion <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> noch zwei Sekunden lang weiter. Warum passiert das? Um das zu verstehen, müssen wir wie der Roboter denken!</p>
<p><strong>Erläuterung</strong></p> <p><strong>Erläuterung</strong></p>
<div class="line-block"> <div class="line-block">
@ -358,155 +306,94 @@ Wenn wir nun diesen Code ausführen, wird der Roboter 5 Sekunden lang vorwärts
<div class="line">4. Das Programm ist beendet, und alle Motordrehzahlen werden auf 0 gesetzt.</div> <div class="line">4. Das Programm ist beendet, und alle Motordrehzahlen werden auf 0 gesetzt.</div>
</div> </div>
<p>Wir sehen also, dass wir die Motoren nach der Vorwärts- oder Rückwärtsfunktion wieder auf Geschwindigkeit <code class="docutils literal notranslate"><span class="pre">0</span></code> setzen müssen, wenn wir den Roboter anhalten wollen. Für diesen Anwendungsfall können wir eine neue Funktion <code class="docutils literal notranslate"><span class="pre">stopMotors()</span></code> schreiben, die die Geschwindigkeit für Motor <code class="docutils literal notranslate"><span class="pre">0</span></code> und <code class="docutils literal notranslate"><span class="pre">3</span></code> auf <code class="docutils literal notranslate"><span class="pre">0</span></code> setzt:</p> <p>Wir sehen also, dass wir die Motoren nach der Vorwärts- oder Rückwärtsfunktion wieder auf Geschwindigkeit <code class="docutils literal notranslate"><span class="pre">0</span></code> setzen müssen, wenn wir den Roboter anhalten wollen. Für diesen Anwendungsfall können wir eine neue Funktion <code class="docutils literal notranslate"><span class="pre">stopMotors()</span></code> schreiben, die die Geschwindigkeit für Motor <code class="docutils literal notranslate"><span class="pre">0</span></code> und <code class="docutils literal notranslate"><span class="pre">3</span></code> auf <code class="docutils literal notranslate"><span class="pre">0</span></code> setzt:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7 <span class="linenos"> 7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
8 <span class="linenos"> 8</span>
9 <span class="linenos"> 9</span><span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
10 <span class="linenos">10</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
11 <span class="linenos">11</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
12 <span class="linenos">12</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
13 <span class="linenos">13</span>
14 <span class="linenos">14</span><span class="k">def</span> <span class="nf">stopMotors</span><span class="p">():</span>
15 <span class="linenos">15</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
16</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">16</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">stopMotors</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Wenn wir nun vorwärts fahren, dann zwei Sekunden warten und dann wieder rückwärts fahren wollen, können wir die Funktionen wie folgt aufrufen:</p> <p>Wenn wir nun vorwärts fahren, dann zwei Sekunden warten und dann wieder rückwärts fahren wollen, können wir die Funktionen wie folgt aufrufen:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7 <span class="linenos"> 7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
8 <span class="linenos"> 8</span>
9 <span class="linenos"> 9</span><span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
10 <span class="linenos">10</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
11 <span class="linenos">11</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
12 <span class="linenos">12</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
13 <span class="linenos">13</span>
14 <span class="linenos">14</span><span class="k">def</span> <span class="nf">stopMotors</span><span class="p">():</span>
15 <span class="linenos">15</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
16 <span class="linenos">16</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
17 <span class="linenos">17</span>
18 <span class="linenos">18</span><span class="n">driveForward</span><span class="p">()</span>
19 <span class="linenos">19</span><span class="n">stopMotors</span><span class="p">()</span>
20 <span class="linenos">20</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
21</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">21</span><span class="n">driveBackward</span><span class="p">()</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">driveBackward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">stopMotors</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">()</span>
<span class="n">stopMotors</span><span class="p">()</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">driveBackward</span><span class="p">()</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Und endlich bekommen wir die Bewegung, die wir uns wünschen.</p> <p>Und endlich bekommen wir die Bewegung, die wir uns wünschen.</p>
<p><strong>More Optimizations</strong></p> <p><strong>More Optimizations</strong></p>
<p>Während der Code für sehr einfache Bewegungen funktioniert, wollen wir normalerweise nicht, dass unsere Funktionen entscheiden, wie lange wir vorwärts fahren. Vielleicht müssen wir manchmal vier Sekunden vorwärts fahren, und manchmal nur eine Sekunde.</p> <p>Während der Code für sehr einfache Bewegungen funktioniert, wollen wir normalerweise nicht, dass unsere Funktionen entscheiden, wie lange wir vorwärts fahren. Vielleicht müssen wir manchmal vier Sekunden vorwärts fahren, und manchmal nur eine Sekunde.</p>
<p>Nehmen wir an, wir wollen vier Sekunden vorwärts fahren. Wir wissen, dass <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> den Roboter zwei Sekunden vorwärts bewegen wird. Also können wir die Funktion einfach zwei Mal aufrufen!</p> <p>Nehmen wir an, wir wollen vier Sekunden vorwärts fahren. Wir wissen, dass <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> den Roboter zwei Sekunden vorwärts bewegen wird. Also können wir die Funktion einfach zwei Mal aufrufen!</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7 <span class="linenos"> 7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
8 <span class="linenos"> 8</span>
9 <span class="linenos"> 9</span><span class="n">driveForward</span><span class="p">()</span>
10</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">10</span><span class="n">driveForward</span><span class="p">()</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">()</span>
<span class="n">driveForward</span><span class="p">()</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Was aber, wenn wir uns nur eine Sekunde vorwärts bewegen wollen? Oder vielleicht drei Sekunden? Mit der Funktion <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> können wir das im Moment nicht machen.</p> <p>Was aber, wenn wir uns nur eine Sekunde vorwärts bewegen wollen? Oder vielleicht drei Sekunden? Mit der Funktion <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> können wir das im Moment nicht machen.</p>
<p>Stattdessen werden wir die Funktion so umschreiben, dass sie einen Parameter akzeptiert, der die Zeit angibt.</p> <p>Stattdessen werden wir die Funktion so umschreiben, dass sie einen Parameter akzeptiert, der die Zeit angibt.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos">2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos">3</span>
4 <span class="linenos">4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">(</span><span class="n">seconds</span><span class="p">):</span>
5 <span class="linenos">5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
6 <span class="linenos">6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
7 <span class="linenos">7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
8 <span class="linenos">8</span>
9</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">9</span><span class="n">driveForward</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">(</span><span class="n">seconds</span><span class="p">):</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Und mit dieser neuen Funktion können wir drei Sekunden lang vorwärts fahren. <p>Und mit dieser neuen Funktion können wir drei Sekunden lang vorwärts fahren.
Wie funktioniert das nun?</p> Wie funktioniert das nun?</p>
<p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">4</span></code> definieren wir die Funktion <code class="docutils literal notranslate"><span class="pre">driveForward</span></code> und sagen, dass sie einen Parameter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> benötigt. Dieser Parameter ist im Grunde eine Variable, die wir uns zum Zeitpunkt der Definition wie einen Platzhalter vorstellen können. Wenn wir die Funktion definieren, wissen wir noch nicht, welchen Wert <code class="docutils literal notranslate"><span class="pre">seconds</span></code> haben wird.</p> <p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">4</span></code> definieren wir die Funktion <code class="docutils literal notranslate"><span class="pre">driveForward</span></code> und sagen, dass sie einen Parameter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> benötigt. Dieser Parameter ist im Grunde eine Variable, die wir uns zum Zeitpunkt der Definition wie einen Platzhalter vorstellen können. Wenn wir die Funktion definieren, wissen wir noch nicht, welchen Wert <code class="docutils literal notranslate"><span class="pre">seconds</span></code> haben wird.</p>
<p>Später in <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">9</span></code>, wenn wir die Funktion aufrufen, übergeben wir den Wert <code class="docutils literal notranslate"><span class="pre">3</span></code> an die Funktion und unser Platzhalter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> wird den Wert <code class="docutils literal notranslate"><span class="pre">3</span></code> haben. Der Roboter wird also drei Sekunden vorwärts fahren.</p> <p>Später in <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">9</span></code>, wenn wir die Funktion aufrufen, übergeben wir den Wert <code class="docutils literal notranslate"><span class="pre">3</span></code> an die Funktion und unser Platzhalter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> wird den Wert <code class="docutils literal notranslate"><span class="pre">3</span></code> haben. Der Roboter wird also drei Sekunden vorwärts fahren.</p>
<p>Vielleicht wollen wir auch, dass der Roboter mit verschiedenen Geschwindigkeiten fahren kann. Wir können also einen weiteren Parameter mit dem Namen <code class="docutils literal notranslate"><span class="pre">speed</span></code> anlegen. Dann werden wir ein Programm schreiben, das den Roboter drei Sekunden mit voller Geschwindigkeit und dann fünf Sekunden mit halber Geschwindigkeit fahren lässt.</p> <p>Vielleicht wollen wir auch, dass der Roboter mit verschiedenen Geschwindigkeiten fahren kann. Wir können also einen weiteren Parameter mit dem Namen <code class="docutils literal notranslate"><span class="pre">speed</span></code> anlegen. Dann werden wir ein Programm schreiben, das den Roboter drei Sekunden mit voller Geschwindigkeit und dann fünf Sekunden mit halber Geschwindigkeit fahren lässt.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">(</span><span class="n">seconds</span><span class="p">,</span> <span class="n">speed</span><span class="p">):</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">speed</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">speed</span><span class="p">)</span>
7 <span class="linenos"> 7</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
8 <span class="linenos"> 8</span>
9 <span class="linenos"> 9</span><span class="n">driveForward</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
10</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">10</span><span class="n">driveForward</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">(</span><span class="n">seconds</span><span class="p">,</span> <span class="n">speed</span><span class="p">):</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">speed</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">speed</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">seconds</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">9</span></code> wird der Platzhalter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> auf <code class="docutils literal notranslate"><span class="pre">3</span></code> und die <code class="docutils literal notranslate"><span class="pre">Geschwindigkeit</span></code> auf <code class="docutils literal notranslate"><span class="pre">100</span></code> gesetzt. <p>In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">9</span></code> wird der Platzhalter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> auf <code class="docutils literal notranslate"><span class="pre">3</span></code> und die <code class="docutils literal notranslate"><span class="pre">Geschwindigkeit</span></code> auf <code class="docutils literal notranslate"><span class="pre">100</span></code> gesetzt.
In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">10</span></code> wird der Platzhalter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> auf <code class="docutils literal notranslate"><span class="pre">5</span></code> und die <code class="docutils literal notranslate"><span class="pre">Geschwindigkeit</span></code> auf <code class="docutils literal notranslate"><span class="pre">50</span></code> gesetzt.</p> In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">10</span></code> wird der Platzhalter <code class="docutils literal notranslate"><span class="pre">seconds</span></code> auf <code class="docutils literal notranslate"><span class="pre">5</span></code> und die <code class="docutils literal notranslate"><span class="pre">Geschwindigkeit</span></code> auf <code class="docutils literal notranslate"><span class="pre">50</span></code> gesetzt.</p>
<p><strong>Bewährte Praktiken</strong> <p><strong>Bewährte Praktiken</strong>
@ -514,55 +401,32 @@ Nun werden wir uns einige weitere Optimierungen und bewährte Verfahren ansehen.
<p><strong>1. Wir sollten den Schlafbefehl nicht in die Fahrfunktion einbauen.</strong></p> <p><strong>1. Wir sollten den Schlafbefehl nicht in die Fahrfunktion einbauen.</strong></p>
<p>Wir haben das bis jetzt getan, um ein Gefühl dafür zu bekommen, wie Funktionen funktionieren, und der Einfachheit halber. Später, wenn Sie anfangen, komplexere Programme zu schreiben, sollten Sie dies vermeiden.</p> <p>Wir haben das bis jetzt getan, um ein Gefühl dafür zu bekommen, wie Funktionen funktionieren, und der Einfachheit halber. Später, wenn Sie anfangen, komplexere Programme zu schreiben, sollten Sie dies vermeiden.</p>
<p>Das Beispiel von oben, in dem wir vorwärts und rückwärts gefahren sind und zwei Sekunden gewartet haben, sollte also wie folgt aussehen:</p> <p>Das Beispiel von oben, in dem wir vorwärts und rückwärts gefahren sind und zwei Sekunden gewartet haben, sollte also wie folgt aussehen:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span> <span class="nn">time</span>
2 <span class="linenos"> 2</span><span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
3 <span class="linenos"> 3</span>
4 <span class="linenos"> 4</span><span class="k">def</span> <span class="nf">driveForward</span><span class="p">(</span><span class="n">speed</span><span class="p">):</span>
5 <span class="linenos"> 5</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">speed</span><span class="p">)</span>
6 <span class="linenos"> 6</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">speed</span><span class="p">)</span>
7 <span class="linenos"> 7</span>
8 <span class="linenos"> 8</span><span class="k">def</span> <span class="nf">driveBackward</span><span class="p">(</span><span class="n">speed</span><span class="p">):</span>
9 <span class="linenos"> 9</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">speed</span><span class="p">)</span>
10 <span class="linenos">10</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="n">speed</span><span class="p">)</span>
11 <span class="linenos">11</span>
12 <span class="linenos">12</span><span class="k">def</span> <span class="nf">stopMotors</span><span class="p">():</span>
13 <span class="linenos">13</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
14 <span class="linenos">14</span> <span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
15 <span class="linenos">15</span>
16 <span class="linenos">16</span><span class="n">driveForward</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="c1"># Set the motors to forward</span>
17 <span class="linenos">17</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Let the robot drive for 2 seconds</span>
18 <span class="linenos">18</span><span class="n">stopMotors</span><span class="p">()</span> <span class="c1"># Now stop the robot</span>
19 <span class="linenos">19</span>
20 <span class="linenos">20</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Wait another 2 seconds, robot is not moving</span>
21 <span class="linenos">21</span>
22 <span class="linenos">22</span><span class="n">driveBackward</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="c1"># Now set the motors to a backwards speed</span>
23 <span class="linenos">23</span><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Let the robot continue driving for 2 seconds</span>
24</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <span class="linenos">24</span><span class="n">stopMotors</span><span class="p">()</span> <span class="c1"># And finally stop it again</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="k">def</span> <span class="nf">driveForward</span><span class="p">(</span><span class="n">speed</span><span class="p">):</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">speed</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">speed</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">driveBackward</span><span class="p">(</span><span class="n">speed</span><span class="p">):</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">speed</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="n">speed</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">stopMotors</span><span class="p">():</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">Motor</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">driveForward</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="c1"># Set the motors to forward</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Let the robot drive for 2 seconds</span>
<span class="n">stopMotors</span><span class="p">()</span> <span class="c1"># Now stop the robot</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Wait another 2 seconds, robot is not moving</span>
<span class="n">driveBackward</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="c1"># Now set the motors to a backwards speed</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Let the robot continue driving for 2 seconds</span>
<span class="n">stopMotors</span><span class="p">()</span> <span class="c1"># And finally stop it again</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p><strong>Warum ist das so wichtig?</strong></p> <p><strong>Warum ist das so wichtig?</strong></p>
<p>Normalerweise schlafen wir nicht sehr viel und führen in dieser Zeit andere Verarbeitungen durch. Zum Beispiel könnten wir ein Bild von der Kamera verarbeiten oder die IR-Sensoren auslesen. Wenn wir also eine Funktion wie <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> aufrufen, können wir davon ausgehen, dass sie im Hintergrund abläuft und wir andere Aufgaben erledigen, während sich der Roboter bewegt, anstatt nur darauf zu warten, dass er fertig wird.</p> <p>Normalerweise schlafen wir nicht sehr viel und führen in dieser Zeit andere Verarbeitungen durch. Zum Beispiel könnten wir ein Bild von der Kamera verarbeiten oder die IR-Sensoren auslesen. Wenn wir also eine Funktion wie <code class="docutils literal notranslate"><span class="pre">driveForward()</span></code> aufrufen, können wir davon ausgehen, dass sie im Hintergrund abläuft und wir andere Aufgaben erledigen, während sich der Roboter bewegt, anstatt nur darauf zu warten, dass er fertig wird.</p>
<p><strong>2. Fahren Sie nicht zu langsam.</strong></p> <p><strong>2. Fahren Sie nicht zu langsam.</strong></p>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -163,62 +168,45 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="mein-drittes-programm"> <div class="section" id="mein-drittes-programm">
<h1>Mein drittes Programm<a class="headerlink" href="#mein-drittes-programm" title="Link zu dieser Überschrift"></a></h1> <h1>Mein drittes Programm<a class="headerlink" href="#mein-drittes-programm" title="Permalink to this heading"></a></h1>
<p>Der offizielle compAIR-Bot ist mit einer Reihe von Sensoren ausgestattet. Die wichtigsten sind die Infrarotsensoren und -sender, die an der Vorderseite des Roboters angebracht sind. Insgesamt gibt es fünf IR-Sensoren.</p> <p>Der offizielle compAIR-Bot ist mit einer Reihe von Sensoren ausgestattet. Die wichtigsten sind die Infrarotsensoren und -sender, die an der Vorderseite des Roboters angebracht sind. Insgesamt gibt es fünf IR-Sensoren.</p>
<p>Um loszulegen, muss man zunächst das entsprechende Modul wie folgt importieren:</p> <p>Um loszulegen, muss man zunächst das entsprechende Modul wie folgt importieren:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p><img alt="irSensor" src="../_images/07_irSensor.webp" /></p> <p><img alt="irSensor" src="../_images/07_irSensor.webp" /></p>
<p>Wie im obigen Diagramm zu sehen ist, verfügt jeder Sensor auch über einen entsprechenden IR-Sender / Emitter. Dieser Sender kann mit <code class="docutils literal notranslate"><span class="pre">IRSensor.set(port,</span> <span class="pre">enable)</span></code> aktiviert werden.</p> <p>Wie im obigen Diagramm zu sehen ist, verfügt jeder Sensor auch über einen entsprechenden IR-Sender / Emitter. Dieser Sender kann mit <code class="docutils literal notranslate"><span class="pre">IRSensor.set(port,</span> <span class="pre">enable)</span></code> aktiviert werden.</p>
<p>Schalten wir nun alle fünf Sender ein:</p> <p>Schalten wir nun alle fünf Sender ein:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span>
2 <span class="linenos">2</span>
3</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span> <span class="linenos">3</span><span class="n">IRSensor</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
<span class="n">IRSensor</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Diese fünf verschiedenen Sensoren befinden sich an der Vorderseite des Roboters und sind wichtig, um schwarze Linien zu erkennen.</p> <p>Diese fünf verschiedenen Sensoren befinden sich an der Vorderseite des Roboters und sind wichtig, um schwarze Linien zu erkennen.</p>
<p>Es ist sehr einfach, den Wert der Sensoren abzulesen:</p> <p>Es ist sehr einfach, den Wert der Sensoren abzulesen:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span>
2 <span class="linenos">2</span>
3 <span class="linenos">3</span><span class="n">IRSensor</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
4 <span class="linenos">4</span>
5 <span class="linenos">5</span><span class="k">if</span> <span class="n">IRSensor</span><span class="o">.</span><span class="n">read_all</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">500</span><span class="p">:</span>
6 <span class="linenos">6</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;high&quot;</span><span class="p">)</span>
7 <span class="linenos">7</span><span class="k">else</span><span class="p">:</span>
8</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span> <span class="linenos">8</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;low&quot;</span><span class="p">)</span>
<span class="n">IRSensor</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
<span class="k">if</span> <span class="n">IRSensor</span><span class="o">.</span><span class="n">read_all</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">500</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;high&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;low&quot;</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p><strong>Erkennen einer schwarzen Linie</strong> <p><strong>Erkennen einer schwarzen Linie</strong>
Um den IR-Sensor zu testen, kannst du deinen Roboter auf eine schwarze Linie stellen. Der Sensor in der Mitte sollte auf der schwarzen Linie liegen.</p> Um den IR-Sensor zu testen, kannst du deinen Roboter auf eine schwarze Linie stellen. Der Sensor in der Mitte sollte auf der schwarzen Linie liegen.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span>
2 <span class="linenos">2</span>
3 <span class="linenos">3</span><span class="n">IRSensor</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
4 <span class="linenos">4</span><span class="n">COLOR_BREAK</span> <span class="o">=</span> <span class="mi">900</span>
5 <span class="linenos">5</span>
6 <span class="linenos">6</span><span class="k">if</span> <span class="n">IRSensor</span><span class="o">.</span><span class="n">read_all</span><span class="p">()[</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">COLOR_BREAK</span><span class="p">:</span>
7 <span class="linenos">7</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Robot is standing on a black line&quot;</span><span class="p">)</span>
8 <span class="linenos">8</span><span class="k">else</span><span class="p">:</span>
9</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">compLib.IRSensor</span> <span class="kn">import</span> <span class="n">IRSensor</span> <span class="linenos">9</span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Robot is NOT standing on a black line&quot;</span><span class="p">)</span>
<span class="n">IRSensor</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
<span class="n">COLOR_BREAK</span> <span class="o">=</span> <span class="mi">900</span>
<span class="k">if</span> <span class="n">IRSensor</span><span class="o">.</span><span class="n">read_all</span><span class="p">()[</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">COLOR_BREAK</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Robot is standing on a black line&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Robot is NOT standing on a black line&quot;</span><span class="p">)</span>
</pre></div> </pre></div>
</td></tr></table></div> </div>
<p>Wenn das Programm ausgeführt wird, zeigt es an, dass der Roboter auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor des Roboters über einer schwarzen Linie befindet, und es zeigt an, dass der Roboter NICHT auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor nicht über einer Linie befindet.</p> <p>Wenn das Programm ausgeführt wird, zeigt es an, dass der Roboter auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor des Roboters über einer schwarzen Linie befindet, und es zeigt an, dass der Roboter NICHT auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor nicht über einer Linie befindet.</p>
<div class="line-block"> <div class="line-block">
<div class="line">In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">1</span></code> importieren wir das <code class="docutils literal notranslate"><span class="pre">IRSensor</span></code>-Modul, das zur Kommunikation mit dem IR-Sensor-Board verwendet werden kann.</div> <div class="line">In <code class="docutils literal notranslate"><span class="pre">Zeile</span> <span class="pre">1</span></code> importieren wir das <code class="docutils literal notranslate"><span class="pre">IRSensor</span></code>-Modul, das zur Kommunikation mit dem IR-Sensor-Board verwendet werden kann.</div>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -168,9 +173,9 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="wlan-verbindung-herstellen"> <div class="section" id="wlan-verbindung-herstellen">
<span id="gettingstarted-wifi"></span><h1>WLAN-Verbindung herstellen<a class="headerlink" href="#wlan-verbindung-herstellen" title="Link zu dieser Überschrift"></a></h1> <span id="gettingstarted-wifi"></span><h1>WLAN-Verbindung herstellen<a class="headerlink" href="#wlan-verbindung-herstellen" title="Permalink to this heading"></a></h1>
<div class="section" id="schritt-fur-schritt-macos"> <div class="section" id="schritt-fur-schritt-macos">
<h2>Schritt für Schritt - macOS<a class="headerlink" href="#schritt-fur-schritt-macos" title="Link zu dieser Überschrift"></a></h2> <h2>Schritt für Schritt - macOS<a class="headerlink" href="#schritt-fur-schritt-macos" title="Permalink to this heading"></a></h2>
<ol class="arabic"> <ol class="arabic">
<li><p>SD-Karte aus dem Raspberry Pi bzw. Roboter entnehmen.</p></li> <li><p>SD-Karte aus dem Raspberry Pi bzw. Roboter entnehmen.</p></li>
<li><p>Einstecken der SD-Karte in den Computer</p></li> <li><p>Einstecken der SD-Karte in den Computer</p></li>
@ -195,16 +200,16 @@
</ol> </ol>
</div> </div>
<div class="section" id="weitere-informationen"> <div class="section" id="weitere-informationen">
<h2>Weitere Informationen<a class="headerlink" href="#weitere-informationen" title="Link zu dieser Überschrift"></a></h2> <h2>Weitere Informationen<a class="headerlink" href="#weitere-informationen" title="Permalink to this heading"></a></h2>
<p>Die „wpa_supplicant.conf“ Datei wird beim Start des Rpasberry Pi automatisch an den richtigen Ort kopiert, damit sich der Roboter zum Wlan verbindet. <p>Die „wpa_supplicant.conf“ Datei wird beim Start des Rpasberry Pi automatisch an den richtigen Ort kopiert, damit sich der Roboter zum Wlan verbindet.
Eine genauere Anleitung wird vom Hersteller des Raspberry Pi <a class="reference external" href="https://www.raspberrypi.com/documentation/computers/configuration.html#configuring-networking-2">hier</a> bereitgestellt.</p> Eine genauere Anleitung wird vom Hersteller des Raspberry Pi <a class="reference external" href="https://www.raspberrypi.com/documentation/computers/configuration.html#configuring-networking-2">hier</a> bereitgestellt.</p>
</div> </div>
<div class="section" id="fehlerbehandlung"> <div class="section" id="fehlerbehandlung">
<h2>Fehlerbehandlung<a class="headerlink" href="#fehlerbehandlung" title="Link zu dieser Überschrift"></a></h2> <h2>Fehlerbehandlung<a class="headerlink" href="#fehlerbehandlung" title="Permalink to this heading"></a></h2>
<p>Sollte es dazu kommen, dass der Roboter nicht automatisch die Verbindung mit dem Netzwerk herstellt, kann eine Kabelgebundene Verbindung zur Diagnose von Fehlern genutzt werden. <p>Sollte es dazu kommen, dass der Roboter nicht automatisch die Verbindung mit dem Netzwerk herstellt, kann eine Kabelgebundene Verbindung zur Diagnose von Fehlern genutzt werden.
Dabei wird automatisch die IP-Adresse der Verbindung „eth“ am Roboter angezeigt. Nach der erfolgreichen Verbindung zum Roboter mittels SSH kann die „wpa_cli“ zur Fehlerbehandlung verwendet werden:</p> Dabei wird automatisch die IP-Adresse der Verbindung „eth“ am Roboter angezeigt. Nach der erfolgreichen Verbindung zum Roboter mittels SSH kann die „wpa_cli“ zur Fehlerbehandlung verwendet werden:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">wpa_cli</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span> <span class="n">wpa_cli</span>
<span class="n">wpa_cli</span> <span class="n">v2</span><span class="o">.</span><span class="mi">9</span> <span class="n">wpa_cli</span> <span class="n">v2</span><span class="mf">.9</span>
<span class="n">Copyright</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="mi">2004</span><span class="o">-</span><span class="mi">2019</span><span class="p">,</span> <span class="n">Jouni</span> <span class="n">Malinen</span> <span class="o">&lt;</span><span class="n">j</span><span class="nd">@w1</span><span class="o">.</span><span class="n">fi</span><span class="o">&gt;</span> <span class="ow">and</span> <span class="n">contributors</span> <span class="n">Copyright</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="mi">2004</span><span class="o">-</span><span class="mi">2019</span><span class="p">,</span> <span class="n">Jouni</span> <span class="n">Malinen</span> <span class="o">&lt;</span><span class="n">j</span><span class="nd">@w1</span><span class="o">.</span><span class="n">fi</span><span class="o">&gt;</span> <span class="ow">and</span> <span class="n">contributors</span>
<span class="n">This</span> <span class="n">software</span> <span class="n">may</span> <span class="n">be</span> <span class="n">distributed</span> <span class="n">under</span> <span class="n">the</span> <span class="n">terms</span> <span class="n">of</span> <span class="n">the</span> <span class="n">BSD</span> <span class="n">license</span><span class="o">.</span> <span class="n">This</span> <span class="n">software</span> <span class="n">may</span> <span class="n">be</span> <span class="n">distributed</span> <span class="n">under</span> <span class="n">the</span> <span class="n">terms</span> <span class="n">of</span> <span class="n">the</span> <span class="n">BSD</span> <span class="n">license</span><span class="o">.</span>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/translations.js"></script> <script src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>
@ -153,11 +158,11 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="dokumentation-des-roboters"> <div class="section" id="dokumentation-des-roboters">
<h1>Dokumentation des Roboters<a class="headerlink" href="#dokumentation-des-roboters" title="Link zu dieser Überschrift"></a></h1> <h1>Dokumentation des Roboters<a class="headerlink" href="#dokumentation-des-roboters" title="Permalink to this heading"></a></h1>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
</div> </div>
<div class="section" id="inhalt"> <div class="section" id="inhalt">
<h2>Inhalt<a class="headerlink" href="#inhalt" title="Link zu dieser Überschrift"></a></h2> <h2>Inhalt<a class="headerlink" href="#inhalt" title="Permalink to this heading"></a></h2>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="gettingStarted/index.html">Erste Schritte</a></li> <li class="toctree-l1"><a class="reference internal" href="gettingStarted/index.html">Erste Schritte</a></li>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script> <script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/translations.js"></script> <script src="../../_static/translations.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script> <script type="text/javascript" src="../../_static/js/theme.js"></script>
@ -89,7 +94,10 @@
<li class="toctree-l1"><a class="reference internal" href="../../other/usage.html">Beispiele</a></li> <li class="toctree-l1"><a class="reference internal" href="../../other/usage.html">Beispiele</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">compLib</a><ul class="current"> <li class="toctree-l1 current"><a class="reference internal" href="../index.html">compLib</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Encoder</a><ul> <li class="toctree-l2 current"><a class="current reference internal" href="#">Encoder</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#dokumentation-der-klasse">Dokumentation der Klasse</a></li> <li class="toctree-l3"><a class="reference internal" href="#dokumentation-der-klasse">Dokumentation der Klasse</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#compLib.Encoder.Encoder"><code class="docutils literal notranslate"><span class="pre">Encoder</span></code></a></li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="IRSensor.html">Infrarot Sensoren</a></li> <li class="toctree-l2"><a class="reference internal" href="IRSensor.html">Infrarot Sensoren</a></li>
@ -164,16 +172,16 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="encoder"> <div class="section" id="encoder">
<span id="lib-encoder"></span><h1>Encoder<a class="headerlink" href="#encoder" title="Link zu dieser Überschrift"></a></h1> <span id="lib-encoder"></span><h1>Encoder<a class="headerlink" href="#encoder" title="Permalink to this heading"></a></h1>
<div class="section" id="dokumentation-der-klasse"> <div class="section" id="dokumentation-der-klasse">
<h2>Dokumentation der Klasse<a class="headerlink" href="#dokumentation-der-klasse" title="Link zu dieser Überschrift"></a></h2> <h2>Dokumentation der Klasse<a class="headerlink" href="#dokumentation-der-klasse" title="Permalink to this heading"></a></h2>
<dl class="py class"> <dl class="py class">
<dt id="compLib.Encoder.Encoder"> <dt class="sig sig-object py" id="compLib.Encoder.Encoder">
<em class="property">class </em><code class="sig-prename descclassname">compLib.Encoder.</code><code class="sig-name descname">Encoder</code><a class="headerlink" href="#compLib.Encoder.Encoder" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">compLib.Encoder.</span></span><span class="sig-name descname"><span class="pre">Encoder</span></span><a class="headerlink" href="#compLib.Encoder.Encoder" title="Link zu dieser Definition"></a></dt>
<dd><p>Klasse zum Zugriff auf die Encoder der einzelnen Motoren</p> <dd><p>Klasse zum Zugriff auf die Encoder der einzelnen Motoren</p>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Encoder.Encoder.read_all_positions"> <dt class="sig sig-object py" id="compLib.Encoder.Encoder.read_all_positions">
<em class="property">static </em><code class="sig-name descname">read_all_positions</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Encoder.Encoder.read_all_positions" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">read_all_positions</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Encoder.Encoder.read_all_positions" title="Link zu dieser Definition"></a></dt>
<dd><p>Lesen aller absoluten Positionen der einzelnen Encoder</p> <dd><p>Lesen aller absoluten Positionen der einzelnen Encoder</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Rückgabe</dt> <dt class="field-odd">Rückgabe</dt>
@ -183,8 +191,8 @@
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Encoder.Encoder.read_all_velocities"> <dt class="sig sig-object py" id="compLib.Encoder.Encoder.read_all_velocities">
<em class="property">static </em><code class="sig-name descname">read_all_velocities</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Encoder.Encoder.read_all_velocities" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">read_all_velocities</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Encoder.Encoder.read_all_velocities" title="Link zu dieser Definition"></a></dt>
<dd><p>Lesen der Geschwindigkeit aller angeschlossenen Motoren.</p> <dd><p>Lesen der Geschwindigkeit aller angeschlossenen Motoren.</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Rückgabe</dt> <dt class="field-odd">Rückgabe</dt>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script> <script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/translations.js"></script> <script src="../../_static/translations.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script> <script type="text/javascript" src="../../_static/js/theme.js"></script>
@ -90,7 +95,10 @@
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">compLib</a><ul class="current"> <li class="toctree-l1 current"><a class="reference internal" href="../index.html">compLib</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="Encoder.html">Encoder</a></li> <li class="toctree-l2"><a class="reference internal" href="Encoder.html">Encoder</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Infrarot Sensoren</a><ul> <li class="toctree-l2 current"><a class="current reference internal" href="#">Infrarot Sensoren</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#dokumentation-der-klasse">Dokumentation der Klasse</a></li> <li class="toctree-l3"><a class="reference internal" href="#dokumentation-der-klasse">Dokumentation der Klasse</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#compLib.IRSensor.IRSensor"><code class="docutils literal notranslate"><span class="pre">IRSensor</span></code></a></li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="Motor.html">Motoren</a></li> <li class="toctree-l2"><a class="reference internal" href="Motor.html">Motoren</a></li>
@ -164,28 +172,28 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="infrarot-sensoren"> <div class="section" id="infrarot-sensoren">
<span id="lib-irsensor"></span><h1>Infrarot Sensoren<a class="headerlink" href="#infrarot-sensoren" title="Link zu dieser Überschrift"></a></h1> <span id="lib-irsensor"></span><h1>Infrarot Sensoren<a class="headerlink" href="#infrarot-sensoren" title="Permalink to this heading"></a></h1>
<div class="section" id="dokumentation-der-klasse"> <div class="section" id="dokumentation-der-klasse">
<h2>Dokumentation der Klasse<a class="headerlink" href="#dokumentation-der-klasse" title="Link zu dieser Überschrift"></a></h2> <h2>Dokumentation der Klasse<a class="headerlink" href="#dokumentation-der-klasse" title="Permalink to this heading"></a></h2>
<dl class="py class"> <dl class="py class">
<dt id="compLib.IRSensor.IRSensor"> <dt class="sig sig-object py" id="compLib.IRSensor.IRSensor">
<em class="property">class </em><code class="sig-prename descclassname">compLib.IRSensor.</code><code class="sig-name descname">IRSensor</code><a class="headerlink" href="#compLib.IRSensor.IRSensor" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">compLib.IRSensor.</span></span><span class="sig-name descname"><span class="pre">IRSensor</span></span><a class="headerlink" href="#compLib.IRSensor.IRSensor" title="Link zu dieser Definition"></a></dt>
<dd><p>Ermöglicht den Zugriff auf die einzelnen IRSensoren des Roboters</p> <dd><p>Ermöglicht den Zugriff auf die einzelnen IRSensoren des Roboters</p>
<dl class="py method"> <dl class="py method">
<dt id="compLib.IRSensor.IRSensor.disable"> <dt class="sig sig-object py" id="compLib.IRSensor.IRSensor.disable">
<em class="property">static </em><code class="sig-name descname">disable</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.IRSensor.IRSensor.disable" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">disable</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.IRSensor.IRSensor.disable" title="Link zu dieser Definition"></a></dt>
<dd><p>Deaktivieren der Infrarot-Sender</p> <dd><p>Deaktivieren der Infrarot-Sender</p>
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.IRSensor.IRSensor.enable"> <dt class="sig sig-object py" id="compLib.IRSensor.IRSensor.enable">
<em class="property">static </em><code class="sig-name descname">enable</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.IRSensor.IRSensor.enable" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">enable</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.IRSensor.IRSensor.enable" title="Link zu dieser Definition"></a></dt>
<dd><p>Aktivieren Infrarot-Sender. Muss bei jedem Programmstart ausgeführt werden.</p> <dd><p>Aktivieren Infrarot-Sender. Muss bei jedem Programmstart ausgeführt werden.</p>
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.IRSensor.IRSensor.read_all"> <dt class="sig sig-object py" id="compLib.IRSensor.IRSensor.read_all">
<em class="property">static </em><code class="sig-name descname">read_all</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.IRSensor.IRSensor.read_all" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">read_all</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#compLib.IRSensor.IRSensor.read_all" title="Link zu dieser Definition"></a></dt>
<dd><p>Auslesen aller Sensoren gleichzeitig</p> <dd><p>Auslesen aller Sensoren gleichzeitig</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Rückgabe</dt> <dt class="field-odd">Rückgabe</dt>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script> <script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/translations.js"></script> <script src="../../_static/translations.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script> <script type="text/javascript" src="../../_static/js/theme.js"></script>
@ -90,7 +95,10 @@
<li class="toctree-l2"><a class="reference internal" href="Encoder.html">Encoder</a></li> <li class="toctree-l2"><a class="reference internal" href="Encoder.html">Encoder</a></li>
<li class="toctree-l2"><a class="reference internal" href="IRSensor.html">Infrarot Sensoren</a></li> <li class="toctree-l2"><a class="reference internal" href="IRSensor.html">Infrarot Sensoren</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Motoren</a><ul> <li class="toctree-l2 current"><a class="current reference internal" href="#">Motoren</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#dokumentation-der-klasse">Dokumentation der Klasse</a></li> <li class="toctree-l3"><a class="reference internal" href="#dokumentation-der-klasse">Dokumentation der Klasse</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#compLib.Motor.Motor"><code class="docutils literal notranslate"><span class="pre">Motor</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#genauere-informationen">Genauere Informationen</a><ul> <li class="toctree-l3"><a class="reference internal" href="#genauere-informationen">Genauere Informationen</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#power-vs-speed-vs-pulsewidth">Power vs Speed vs PulseWidth</a></li> <li class="toctree-l4"><a class="reference internal" href="#power-vs-speed-vs-pulsewidth">Power vs Speed vs PulseWidth</a></li>
<li class="toctree-l4"><a class="reference internal" href="#normal-vs-multiple">Normal vs Multiple</a></li> <li class="toctree-l4"><a class="reference internal" href="#normal-vs-multiple">Normal vs Multiple</a></li>
@ -172,16 +180,16 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="motoren"> <div class="section" id="motoren">
<span id="lib-motor"></span><h1>Motoren<a class="headerlink" href="#motoren" title="Link zu dieser Überschrift"></a></h1> <span id="lib-motor"></span><h1>Motoren<a class="headerlink" href="#motoren" title="Permalink to this heading"></a></h1>
<div class="section" id="dokumentation-der-klasse"> <div class="section" id="dokumentation-der-klasse">
<h2>Dokumentation der Klasse<a class="headerlink" href="#dokumentation-der-klasse" title="Link zu dieser Überschrift"></a></h2> <h2>Dokumentation der Klasse<a class="headerlink" href="#dokumentation-der-klasse" title="Permalink to this heading"></a></h2>
<dl class="py class"> <dl class="py class">
<dt id="compLib.Motor.Motor"> <dt class="sig sig-object py" id="compLib.Motor.Motor">
<em class="property">class </em><code class="sig-prename descclassname">compLib.Motor.</code><code class="sig-name descname">Motor</code><a class="headerlink" href="#compLib.Motor.Motor" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">compLib.Motor.</span></span><span class="sig-name descname"><span class="pre">Motor</span></span><a class="headerlink" href="#compLib.Motor.Motor" title="Link zu dieser Definition"></a></dt>
<dd><p>Klasse zum Ansteuern der Motoren</p> <dd><p>Klasse zum Ansteuern der Motoren</p>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Motor.Motor.multiple_power"> <dt class="sig sig-object py" id="compLib.Motor.Motor.multiple_power">
<em class="property">static </em><code class="sig-name descname">multiple_power</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">arguments</span><span class="p">:</span> <span class="n">tuple</span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.multiple_power" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">multiple_power</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">arguments</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">tuple</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.multiple_power" title="Link zu dieser Definition"></a></dt>
<dd><p>Mehrere Motoren auf eine prozentuale Leistung der Höchstgeschwindigkeit einstellen</p> <dd><p>Mehrere Motoren auf eine prozentuale Leistung der Höchstgeschwindigkeit einstellen</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameter</dt> <dt class="field-odd">Parameter</dt>
@ -194,8 +202,8 @@
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Motor.Motor.multiple_pulse_width"> <dt class="sig sig-object py" id="compLib.Motor.Motor.multiple_pulse_width">
<em class="property">static </em><code class="sig-name descname">multiple_pulse_width</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">arguments</span><span class="p">:</span> <span class="n">tuple</span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.multiple_pulse_width" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">multiple_pulse_width</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">arguments</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">tuple</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.multiple_pulse_width" title="Link zu dieser Definition"></a></dt>
<dd><p>Setzen den Pulsbreite mehreer Motoren in Prozent der Periode</p> <dd><p>Setzen den Pulsbreite mehreer Motoren in Prozent der Periode</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameter</dt> <dt class="field-odd">Parameter</dt>
@ -208,8 +216,8 @@
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Motor.Motor.multiple_speed"> <dt class="sig sig-object py" id="compLib.Motor.Motor.multiple_speed">
<em class="property">static </em><code class="sig-name descname">multiple_speed</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">arguments</span><span class="p">:</span> <span class="n">tuple</span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.multiple_speed" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">multiple_speed</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">arguments</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">tuple</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.multiple_speed" title="Link zu dieser Definition"></a></dt>
<dd><p>Geschwindigkeit mehrerer Motoren einstellen</p> <dd><p>Geschwindigkeit mehrerer Motoren einstellen</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameter</dt> <dt class="field-odd">Parameter</dt>
@ -222,8 +230,8 @@
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Motor.Motor.power"> <dt class="sig sig-object py" id="compLib.Motor.Motor.power">
<em class="property">static </em><code class="sig-name descname">power</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">port</span><span class="p">:</span> <span class="n">int</span></em>, <em class="sig-param"><span class="n">percent</span><span class="p">:</span> <span class="n">float</span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.power" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">power</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">percent</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.power" title="Link zu dieser Definition"></a></dt>
<dd><p>Motor auf eine prozentuale Leistung der Höchstgeschwindigkeit einstellen</p> <dd><p>Motor auf eine prozentuale Leistung der Höchstgeschwindigkeit einstellen</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameter</dt> <dt class="field-odd">Parameter</dt>
@ -239,8 +247,8 @@
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Motor.Motor.pulse_width"> <dt class="sig sig-object py" id="compLib.Motor.Motor.pulse_width">
<em class="property">static </em><code class="sig-name descname">pulse_width</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">port</span><span class="p">:</span> <span class="n">int</span></em>, <em class="sig-param"><span class="n">percent</span><span class="p">:</span> <span class="n">float</span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.pulse_width" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">pulse_width</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">percent</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.pulse_width" title="Link zu dieser Definition"></a></dt>
<dd><p>Setzen den Pulsbreite eines Motors in Prozent der Periode</p> <dd><p>Setzen den Pulsbreite eines Motors in Prozent der Periode</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameter</dt> <dt class="field-odd">Parameter</dt>
@ -256,8 +264,8 @@
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt id="compLib.Motor.Motor.speed"> <dt class="sig sig-object py" id="compLib.Motor.Motor.speed">
<em class="property">static </em><code class="sig-name descname">speed</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">port</span><span class="p">:</span> <span class="n">int</span></em>, <em class="sig-param"><span class="n">speed</span><span class="p">:</span> <span class="n">float</span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.speed" title="Link zu dieser Definition"></a></dt> <em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">speed</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">speed</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#compLib.Motor.Motor.speed" title="Link zu dieser Definition"></a></dt>
<dd><p>Geschwindigkeit des Motors einstellen</p> <dd><p>Geschwindigkeit des Motors einstellen</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameter</dt> <dt class="field-odd">Parameter</dt>
@ -276,9 +284,9 @@
</div> </div>
<div class="section" id="genauere-informationen"> <div class="section" id="genauere-informationen">
<h2>Genauere Informationen<a class="headerlink" href="#genauere-informationen" title="Link zu dieser Überschrift"></a></h2> <h2>Genauere Informationen<a class="headerlink" href="#genauere-informationen" title="Permalink to this heading"></a></h2>
<div class="section" id="power-vs-speed-vs-pulsewidth"> <div class="section" id="power-vs-speed-vs-pulsewidth">
<h3>Power vs Speed vs PulseWidth<a class="headerlink" href="#power-vs-speed-vs-pulsewidth" title="Link zu dieser Überschrift"></a></h3> <h3>Power vs Speed vs PulseWidth<a class="headerlink" href="#power-vs-speed-vs-pulsewidth" title="Permalink to this heading"></a></h3>
<p>Zur ansteuerung der Motoren kann entweder <code class="docutils literal notranslate"><span class="pre">Motor.power(...)</span></code>, <code class="docutils literal notranslate"><span class="pre">Motor.speed(...)</span></code> oder <code class="docutils literal notranslate"><span class="pre">Motor.pulse_width(...)`</span></code> verwendet werden. <p>Zur ansteuerung der Motoren kann entweder <code class="docutils literal notranslate"><span class="pre">Motor.power(...)</span></code>, <code class="docutils literal notranslate"><span class="pre">Motor.speed(...)</span></code> oder <code class="docutils literal notranslate"><span class="pre">Motor.pulse_width(...)`</span></code> verwendet werden.
Der Unterschied der 3 Funktionen liegt dabei in der Einheit des 2. Parameters.</p> Der Unterschied der 3 Funktionen liegt dabei in der Einheit des 2. Parameters.</p>
<div class="line-block"> <div class="line-block">
@ -288,15 +296,15 @@ Der Unterschied der 3 Funktionen liegt dabei in der Einheit des 2. Parameters.</
</div> </div>
</div> </div>
<div class="section" id="normal-vs-multiple"> <div class="section" id="normal-vs-multiple">
<h3>Normal vs Multiple<a class="headerlink" href="#normal-vs-multiple" title="Link zu dieser Überschrift"></a></h3> <h3>Normal vs Multiple<a class="headerlink" href="#normal-vs-multiple" title="Permalink to this heading"></a></h3>
<p>Der Aufruf der funktionen kann entweder über <code class="docutils literal notranslate"><span class="pre">Motor.power(port,</span> <span class="pre">percent)</span></code> oder <code class="docutils literal notranslate"><span class="pre">Motor.power((port,</span> <span class="pre">percent),</span> <span class="pre">(port,</span> <span class="pre">percent),</span> <span class="pre">..)</span></code> erfolgen. <p>Der Aufruf der funktionen kann entweder über <code class="docutils literal notranslate"><span class="pre">Motor.power(port,</span> <span class="pre">percent)</span></code> oder <code class="docutils literal notranslate"><span class="pre">Motor.power((port,</span> <span class="pre">percent),</span> <span class="pre">(port,</span> <span class="pre">percent),</span> <span class="pre">..)</span></code> erfolgen.
Der zweite Aufruf ermöglicht dem Entwickler dabei beide Motoren in einem Aufruf anzusteuern und bringt einen kleinen Vorteil in der Leistungsfähigkeit der Software.</p> Der zweite Aufruf ermöglicht dem Entwickler dabei beide Motoren in einem Aufruf anzusteuern und bringt einen kleinen Vorteil in der Leistungsfähigkeit der Software.</p>
</div> </div>
</div> </div>
<div class="section" id="beispiele"> <div class="section" id="beispiele">
<h2>Beispiele<a class="headerlink" href="#beispiele" title="Link zu dieser Überschrift"></a></h2> <h2>Beispiele<a class="headerlink" href="#beispiele" title="Permalink to this heading"></a></h2>
<div class="section" id="vorwarts-fahren"> <div class="section" id="vorwarts-fahren">
<h3>Vorwärts fahren<a class="headerlink" href="#vorwarts-fahren" title="Link zu dieser Überschrift"></a></h3> <h3>Vorwärts fahren<a class="headerlink" href="#vorwarts-fahren" title="Permalink to this heading"></a></h3>
<p>Mit folgenden Programm drehen sich beide Motoren mit 50% ihrer maximalen Geschwindigkeit. <p>Mit folgenden Programm drehen sich beide Motoren mit 50% ihrer maximalen Geschwindigkeit.
Dabei ist zu beachten, dass ein Motor in die entgegengesetzte Richtung zum aneren Motor gedreht werden muss, da diese spiegelverkehrt montiert sind.</p> Dabei ist zu beachten, dass ein Motor in die entgegengesetzte Richtung zum aneren Motor gedreht werden muss, da diese spiegelverkehrt montiert sind.</p>
<p>Zusätzlich ist ein <code class="docutils literal notranslate"><span class="pre">time.sleep(5)</span></code> notwendig, welches das Programm für 5 Sekunden pausiert. Diese Pause wird benötigt, da der Roboter automatisch alle Motoren beim Ende des Progammes deaktiviert.</p> <p>Zusätzlich ist ein <code class="docutils literal notranslate"><span class="pre">time.sleep(5)</span></code> notwendig, welches das Programm für 5 Sekunden pausiert. Diese Pause wird benötigt, da der Roboter automatisch alle Motoren beim Ende des Progammes deaktiviert.</p>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -159,19 +164,45 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="complib"> <div class="section" id="complib">
<h1>compLib<a class="headerlink" href="#complib" title="Link zu dieser Überschrift"></a></h1> <h1>compLib<a class="headerlink" href="#complib" title="Permalink to this heading"></a></h1>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="classes/Encoder.html">Encoder</a><ul> <li class="toctree-l1"><a class="reference internal" href="classes/Encoder.html">Encoder</a><ul>
<li class="toctree-l2"><a class="reference internal" href="classes/Encoder.html#dokumentation-der-klasse">Dokumentation der Klasse</a></li> <li class="toctree-l2"><a class="reference internal" href="classes/Encoder.html#dokumentation-der-klasse">Dokumentation der Klasse</a><ul>
<li class="toctree-l3"><a class="reference internal" href="classes/Encoder.html#compLib.Encoder.Encoder"><code class="docutils literal notranslate"><span class="pre">Encoder</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="classes/Encoder.html#compLib.Encoder.Encoder.read_all_positions"><code class="docutils literal notranslate"><span class="pre">Encoder.read_all_positions()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/Encoder.html#compLib.Encoder.Encoder.read_all_velocities"><code class="docutils literal notranslate"><span class="pre">Encoder.read_all_velocities()</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l1"><a class="reference internal" href="classes/IRSensor.html">Infrarot Sensoren</a><ul> <li class="toctree-l1"><a class="reference internal" href="classes/IRSensor.html">Infrarot Sensoren</a><ul>
<li class="toctree-l2"><a class="reference internal" href="classes/IRSensor.html#dokumentation-der-klasse">Dokumentation der Klasse</a></li> <li class="toctree-l2"><a class="reference internal" href="classes/IRSensor.html#dokumentation-der-klasse">Dokumentation der Klasse</a><ul>
<li class="toctree-l3"><a class="reference internal" href="classes/IRSensor.html#compLib.IRSensor.IRSensor"><code class="docutils literal notranslate"><span class="pre">IRSensor</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="classes/IRSensor.html#compLib.IRSensor.IRSensor.disable"><code class="docutils literal notranslate"><span class="pre">IRSensor.disable()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/IRSensor.html#compLib.IRSensor.IRSensor.enable"><code class="docutils literal notranslate"><span class="pre">IRSensor.enable()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/IRSensor.html#compLib.IRSensor.IRSensor.read_all"><code class="docutils literal notranslate"><span class="pre">IRSensor.read_all()</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l1"><a class="reference internal" href="classes/Motor.html">Motoren</a><ul> <li class="toctree-l1"><a class="reference internal" href="classes/Motor.html">Motoren</a><ul>
<li class="toctree-l2"><a class="reference internal" href="classes/Motor.html#dokumentation-der-klasse">Dokumentation der Klasse</a></li> <li class="toctree-l2"><a class="reference internal" href="classes/Motor.html#dokumentation-der-klasse">Dokumentation der Klasse</a><ul>
<li class="toctree-l3"><a class="reference internal" href="classes/Motor.html#compLib.Motor.Motor"><code class="docutils literal notranslate"><span class="pre">Motor</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="classes/Motor.html#compLib.Motor.Motor.multiple_power"><code class="docutils literal notranslate"><span class="pre">Motor.multiple_power()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/Motor.html#compLib.Motor.Motor.multiple_pulse_width"><code class="docutils literal notranslate"><span class="pre">Motor.multiple_pulse_width()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/Motor.html#compLib.Motor.Motor.multiple_speed"><code class="docutils literal notranslate"><span class="pre">Motor.multiple_speed()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/Motor.html#compLib.Motor.Motor.power"><code class="docutils literal notranslate"><span class="pre">Motor.power()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/Motor.html#compLib.Motor.Motor.pulse_width"><code class="docutils literal notranslate"><span class="pre">Motor.pulse_width()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="classes/Motor.html#compLib.Motor.Motor.speed"><code class="docutils literal notranslate"><span class="pre">Motor.speed()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="classes/Motor.html#genauere-informationen">Genauere Informationen</a><ul> <li class="toctree-l2"><a class="reference internal" href="classes/Motor.html#genauere-informationen">Genauere Informationen</a><ul>
<li class="toctree-l3"><a class="reference internal" href="classes/Motor.html#power-vs-speed-vs-pulsewidth">Power vs Speed vs PulseWidth</a></li> <li class="toctree-l3"><a class="reference internal" href="classes/Motor.html#power-vs-speed-vs-pulsewidth">Power vs Speed vs PulseWidth</a></li>
<li class="toctree-l3"><a class="reference internal" href="classes/Motor.html#normal-vs-multiple">Normal vs Multiple</a></li> <li class="toctree-l3"><a class="reference internal" href="classes/Motor.html#normal-vs-multiple">Normal vs Multiple</a></li>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -159,9 +164,9 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="beispiele"> <div class="section" id="beispiele">
<span id="other-usage"></span><h1>Beispiele<a class="headerlink" href="#beispiele" title="Link zu dieser Überschrift"></a></h1> <span id="other-usage"></span><h1>Beispiele<a class="headerlink" href="#beispiele" title="Permalink to this heading"></a></h1>
<div class="section" id="vorwarts-und-ruckwarts-fahren"> <div class="section" id="vorwarts-und-ruckwarts-fahren">
<h2>Vorwärts und rückwärts fahren<a class="headerlink" href="#vorwarts-und-ruckwarts-fahren" title="Link zu dieser Überschrift"></a></h2> <h2>Vorwärts und rückwärts fahren<a class="headerlink" href="#vorwarts-und-ruckwarts-fahren" title="Permalink to this heading"></a></h2>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="o">*</span> <span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="o">*</span>
@ -188,7 +193,7 @@
</div> </div>
</div> </div>
<div class="section" id="eine-linie-verfolgen"> <div class="section" id="eine-linie-verfolgen">
<h2>Eine Linie verfolgen<a class="headerlink" href="#eine-linie-verfolgen" title="Link zu dieser Überschrift"></a></h2> <h2>Eine Linie verfolgen<a class="headerlink" href="#eine-linie-verfolgen" title="Permalink to this heading"></a></h2>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span> <span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="kn">from</span> <span class="nn">compLib.Encoder</span> <span class="kn">import</span> <span class="n">Encoder</span> <span class="kn">from</span> <span class="nn">compLib.Encoder</span> <span class="kn">import</span> <span class="n">Encoder</span>
@ -245,7 +250,7 @@
</div> </div>
</div> </div>
<div class="section" id="funktionalitat-des-roboters-uberprufen"> <div class="section" id="funktionalitat-des-roboters-uberprufen">
<h2>Funktionalität des Roboters überprüfen<a class="headerlink" href="#funktionalitat-des-roboters-uberprufen" title="Link zu dieser Überschrift"></a></h2> <h2>Funktionalität des Roboters überprüfen<a class="headerlink" href="#funktionalitat-des-roboters-uberprufen" title="Permalink to this heading"></a></h2>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span> <span class="kn">from</span> <span class="nn">compLib.Motor</span> <span class="kn">import</span> <span class="n">Motor</span>
<span class="kn">from</span> <span class="nn">compLib.Encoder</span> <span class="kn">import</span> <span class="n">Encoder</span> <span class="kn">from</span> <span class="nn">compLib.Encoder</span> <span class="kn">import</span> <span class="n">Encoder</span>

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
@ -27,9 +29,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/translations.js"></script> <script src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script> <script type="text/javascript" src="_static/js/theme.js"></script>

File diff suppressed because one or more lines are too long

View file

@ -13,6 +13,8 @@
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
@ -26,9 +28,12 @@
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/translations.js"></script> <script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script> <script type="text/javascript" src="../_static/js/theme.js"></script>
@ -158,16 +163,16 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<div class="section" id="installationsanweisungen"> <div class="section" id="installationsanweisungen">
<span id="software-installation"></span><h1>Installationsanweisungen<a class="headerlink" href="#installationsanweisungen" title="Link zu dieser Überschrift"></a></h1> <span id="software-installation"></span><h1>Installationsanweisungen<a class="headerlink" href="#installationsanweisungen" title="Permalink to this heading"></a></h1>
<p>Diese Anleitung dient dazu die Software auf dem Roboter neu aufzusetzen.</p> <p>Diese Anleitung dient dazu die Software auf dem Roboter neu aufzusetzen.</p>
<p><strong>Im normalen Gebraucht sollte dies jedoch nicht notwendig sein.</strong></p> <p><strong>Im normalen Gebraucht sollte dies jedoch nicht notwendig sein.</strong></p>
<div class="section" id="betriebssystem-aufsetzen"> <div class="section" id="betriebssystem-aufsetzen">
<h2>Betriebssystem aufsetzen<a class="headerlink" href="#betriebssystem-aufsetzen" title="Link zu dieser Überschrift"></a></h2> <h2>Betriebssystem aufsetzen<a class="headerlink" href="#betriebssystem-aufsetzen" title="Permalink to this heading"></a></h2>
<p>Als Basis wird für den Roboter Raspberry Pi OS (64-bit) verwendet. Das 32-Bit Betriebssystem wird nicht unterstützt, da die Software-Komponenten nur für aarch64 bzw. arm64/v8 kompiliert werden. <p>Als Basis wird für den Roboter Raspberry Pi OS (64-bit) verwendet. Das 32-Bit Betriebssystem wird nicht unterstützt, da die Software-Komponenten nur für aarch64 bzw. arm64/v8 kompiliert werden.
Genauere Informationen sind <a class="reference external" href="https://www.raspberrypi.com/software/operating-systems/">hier</a> zu finden.</p> Genauere Informationen sind <a class="reference external" href="https://www.raspberrypi.com/software/operating-systems/">hier</a> zu finden.</p>
</div> </div>
<div class="section" id="bearbeiten-der-boot-partition"> <div class="section" id="bearbeiten-der-boot-partition">
<h2>Bearbeiten der boot-Partition<a class="headerlink" href="#bearbeiten-der-boot-partition" title="Link zu dieser Überschrift"></a></h2> <h2>Bearbeiten der boot-Partition<a class="headerlink" href="#bearbeiten-der-boot-partition" title="Permalink to this heading"></a></h2>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p><code class="docutils literal notranslate"><span class="pre">cmdline.txt</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">cmdline.txt</span></code></p></li>
</ol> </ol>