Compare commits

..

261 commits

Author SHA1 Message Date
Matthias Guzmits
36d4379ddc Merge branch 'master' of https://github.com/F-WuTS/compLIB 2023-07-19 19:18:16 +02:00
Matthias Guzmits
c593059fb1 Add button functionality 2023-07-19 19:17:59 +02:00
Matthias Guzmits
ed04957d94 Add drive arc functionality 2023-07-19 18:36:07 +02:00
itssme
27962d16a7
(MAJOR) Bump to new major version after deleting invalid tag 2023-07-18 09:18:33 +02:00
itssme
9c40daae88
(MAJOR) Bump to new major version 2023-07-18 09:17:25 +02:00
Matthias Guzmits
de112d98e4 Added basic drive functions 2023-07-18 00:44:34 +02:00
Joel Klimont
fa4cc1a0ad fixed syntax error in postinstallscript 2023-02-10 14:29:13 +01:00
Joel Klimont
7e2977a653 fixed syntax error in postinstallscript 2023-02-10 14:02:07 +01:00
Joel Klimont
cf415d38e8 fixed documentation 2023-02-10 13:44:28 +01:00
Joel Klimont
f09d20ade2 removed .idea folder from repo 2023-01-14 15:11:57 +01:00
Joel Klimont
671292a6cf fixed moving built package to the correct output directory 2022-12-18 15:08:20 +01:00
itssme
b95b9bf518
(MINOR) updated readme 2022-12-18 14:00:11 +01:00
Konstantin Lampalzer
dcef53712f fix keyerror setup py 2022-12-18 00:03:26 +01:00
Konstantin Lampalzer
c02cfcd71c Move client foler 2022-12-17 23:59:06 +01:00
Konstantin Lampalzer
4c24717278 Skip posinstall on x86_64 2022-12-17 23:40:58 +01:00
Joel Klimont
19d98f1f04 nginx server is now stopped, as it is not needed anymore 2022-11-24 15:32:15 +01:00
Joel Klimont
13eefdceb1 fixed a bug where the postinstall script would fail, if "raspi-config" is not installed on the system 2022-11-19 01:42:11 +01:00
Joel Klimont
f03df1b3b3 updated opencv documentation (camera module)
added enabling of legacy support for the camera module to the postinstall script
2022-11-18 17:19:40 +01:00
Konstantin Lampalzer
ee4f6a516d Update faq 2022-11-18 15:47:47 +01:00
Konstantin Lampalzer
9e589fd681 Change motor speed to cm/s 2022-11-13 02:52:30 +01:00
Joel Klimont
be9a5c9f19 added env variable to overwrite seeding seed when in competition mode 2022-11-11 17:47:40 +01:00
Joel Klimont
765336231b added updating instructions to documentation 2022-11-11 17:22:01 +01:00
Joel Klimont
f2724e79f7 added example code from guide to test 2022-11-10 23:14:09 +01:00
Joel Klimont
a5274c2232 function to set random seed and to generate a random number are now private static functions in the Seeding gamestate 2022-11-09 17:07:03 +01:00
Joel Klimont
67947116ec added debug logger in seeding 2022-11-09 15:50:15 +01:00
Joel Klimont
369692b619 added german documentation to seeding and double elimination api/ gamestate 2022-11-09 03:25:27 +01:00
Joel Klimont
de9b671f29 added new Camera class for opencv video processing (currently does not work with Pi-Camera)
changed logging a bit
2022-11-05 21:18:24 +01:00
itssme
b87e830ac3
added missing dependencies 2022-11-05 01:57:58 +01:00
Konstantin Lampalzer
ff2c529d3a Update docs 2022-11-01 23:06:33 +01:00
itssme
e4592e7963
removed compsrv as dependency 2022-10-28 19:23:20 +02:00
Konstantin Lampalzer
285996f467 Update docu 2022-10-28 11:50:41 +02:00
Konstantin Lampalzer
bd0f14a83b Add qa program 2022-10-14 00:35:56 +02:00
Konstantin Lampalzer
1ee4a1e1ef Add linefollower 2022-10-14 00:10:07 +02:00
Konstantin Lampalzer
002db9d650 Add linefollower 2022-10-14 00:08:59 +02:00
Konstantin Lampalzer
f6e45ac25d update documentation 2022-10-13 00:55:54 +02:00
Konstantin Lampalzer
af3aaf7998 update documentation 2022-10-13 00:31:43 +02:00
Konstantin Lampalzer
e1a17808f7 update documentation 2022-10-13 00:02:38 +02:00
Joel Klimont
6245d1308a added OpenCV packages to complib dependencies 2022-10-08 22:26:39 +02:00
Joel Klimont
d7a62cfbf5 (MINOR) changed package architecture to aarch64 (arm64) 2022-10-08 17:31:38 +02:00
Joel Klimont
a84183375b installation path is now manually specified 2022-10-07 19:20:20 +02:00
Joel Klimont
60cfb2669c now specifying python version in fpm build 2022-10-07 19:12:38 +02:00
Joel Klimont
b6c351dd0b github action now builds with python 3.9 instead of 3.8 2022-10-07 18:57:59 +02:00
Konstantin Lampalzer
d4a7d8c0c0 Cleanup 2022-10-07 16:35:37 +02:00
Konstantin Lampalzer
c16a7172e7 Merge branch 'feature/new-architecture' 2022-10-07 16:34:28 +02:00
Konstantin Lampalzer
afe5e9c766 documentation, IP writing service 2022-10-07 01:22:27 +02:00
Joel Klimont
c62b22aa0a (MINOR) clearup in postinstall 2022-10-06 20:54:27 +02:00
Joel Klimont
807ea8e561 changed branch for version number to master 2022-10-06 20:45:33 +02:00
Joel Klimont
8151173d2a fixed version number in complib build 2022-10-06 20:44:16 +02:00
Joel Klimont
16c8f18c06 added building pipeline for complib package 2022-10-06 20:42:08 +02:00
Joel Klimont
03daabaa37 added python3-complib_1.0.0-2_all.deb 2022-10-06 00:04:02 +02:00
Joel Klimont
b2281e2a31 added python3-complib_1.0.0-1_all.deb 2022-10-05 23:57:47 +02:00
Joel Klimont
8d19e876ab added compsrv_1.0.0-3_all.deb 2022-10-05 23:53:08 +02:00
Joel Klimont
41e88c9fd5 added compsrv_1.0.0-2_all.deb 2022-10-05 23:50:36 +02:00
Joel Klimont
587a7503a2 added compsrv_1.0.0-1_all.deb 2022-10-05 23:44:51 +02:00
Konstantin Lampalzer
7a9c4e9f3a Add systemd notify 2022-10-05 23:43:37 +02:00
Joel Klimont
077937f5c6 added dependencies to server package build 2022-10-05 23:28:29 +02:00
Joel Klimont
1117f6efa7 added built package 2022-10-05 23:14:50 +02:00
Konstantin Lampalzer
1d91792c56 Update 2022-10-05 23:13:40 +02:00
Joel Klimont
d1e385a2a1 added env variable for setting a version
small changed in build scripts
2022-10-04 23:00:11 +02:00
Joel Klimont
222d274ea7 fixed compsrv package 2022-10-04 20:40:05 +02:00
Joel Klimont
2dc55fe8e2 added test binary for packaging 2022-10-04 20:30:56 +02:00
Joel Klimont
cc79faf13f started working on compsrv package 2022-10-04 20:28:58 +02:00
Joel Klimont
5b2b7e4ea4 removed pigpio as dependency 2022-10-04 19:01:25 +02:00
Joel Klimont
8ad2d3da8e started adding package building 2022-10-04 18:54:48 +02:00
Joel Klimont
e35b992865 get_material_deliveries test now passes 2022-10-01 20:00:27 +02:00
Joel Klimont
f6b27971c4 added more tests for double elimination and seeding
added eq and nq functions for Position class in de
fixed error in de function that would occur if the game has not started yet
2022-10-01 19:11:04 +02:00
DuSack1220
c325a2c7c2 added unittest for seeding api
added get_material_deliveries to seeding api
started working on de api test
2022-10-01 17:37:24 +02:00
DuSack1220
6946ce9957 added unittest for seeding gamestate generation
fixed bug in gamestate.get_logistic_plan
2022-10-01 16:50:49 +02:00
Joel Klimont
f03b9d51b5 added seeding api 2022-09-30 17:49:42 +02:00
Joel Klimont
52c22995d3 added seeding gamestate 2022-08-28 16:22:03 +02:00
Joel Klimont
72c5af8b56 started working on seeding gamestate and double elimination api 2022-08-28 15:59:11 +02:00
Konstantin Lampalzer
d4c49a0a51 Add movement class to python 2022-06-11 23:52:57 +02:00
Konstantin Lampalzer
2c5f283a46 Fix goToAngle with new odom 2022-06-09 22:44:26 +02:00
80ed5e5bf9 Improvements in odometry kinematics 2022-06-09 10:25:11 +02:00
b3eb01ad6e Improvements in odometry kinematics 2022-06-08 23:42:43 +02:00
4a9367629f Improvements in odometry kinematics 2022-06-08 00:32:19 +02:00
Konstantin Lampalzer
7fe160211f Make compileable on unix not running raspi 2022-06-07 23:53:28 +02:00
Konstantin Lampalzer
37447298a4 Add goToDistance and goToAngle 2022-06-07 22:53:49 +02:00
Konstantin Lampalzer
4ee0b8045f Tune turning a bit 2022-05-29 15:20:11 +02:00
Konstantin Lampalzer
9000316350 add wheel tick calib 2022-05-28 22:25:01 +02:00
Konstantin Lampalzer
4be754c1db Finish drive distance, finish turn_angle 2022-05-28 01:09:34 +02:00
Konstantin Lampalzer
92d42be8b8 Continue on go to goal behaviour 2022-05-27 02:44:52 +02:00
Konstantin Lampalzer
6a1ac72912 Change RPM to M/S 2022-05-26 18:55:57 +02:00
Konstantin Lampalzer
a484bc2137 Add complib client and TCP communication 2022-05-22 23:00:57 +02:00
Konstantin Lampalzer
1a033c8b03 Start on unix socket server on c++ side 2022-05-22 02:30:07 +02:00
Konstantin Lampalzer
0bef6035ae Rework library without unix sockets for now 2022-05-21 23:31:23 +02:00
root
e9ae1a320a Start on v2 2022-05-21 13:10:28 +01:00
root
4d5c26d10c save! 2022-05-16 22:47:22 +01:00
root
1fc400c695 Rework PID 2022-04-02 22:49:04 +01:00
root
5d8df998ae Add motor speed control 2022-03-21 22:37:13 +00:00
root
1a488065ac Add get speed function to motor class 2022-03-21 18:51:16 +00:00
root
8537e8504b Add encoder with filter 2022-03-20 21:21:54 +00:00
Konstantin Lampalzer
5ecf92426a Remove compiled files 2022-03-18 18:18:36 +01:00
Konstantin Lampalzer
ddc550ef1a Add gitignore 2022-03-18 18:18:24 +01:00
Konstantin Lampalzer
50da718472 Add gitignore 2022-03-18 18:17:16 +01:00
Konstantin Lampalzer
9b567b8c6c Protobuf prototype 2022-03-18 18:11:16 +01:00
Joel Klimont
e277a83c5f updated docs 2022-02-16 13:16:04 +01:00
Joel Klimont
a6af166fd1 updated version number to 0.4.1-1 2022-02-14 15:19:39 +01:00
itssme
5d6a4acdf7
Merge pull request #3 from F-WuTS/bugfix/change-health-check-times
Update Spi.py
2022-02-14 15:18:00 +01:00
Konstantin Lampalzer
98fc45e97a
Update Spi.py 2022-02-14 15:10:05 +01:00
Joel Klimont
e1e03933d2 updated version number to 0.4.1-0 2022-02-13 19:15:31 +01:00
itssme
6687d1afba
Merge pull request #2 from F-WuTS/feature/locking
Add Locking
2022-02-13 18:51:38 +01:00
Your Name
0e1b767f26 Fix while true in IPService Lock 2022-02-13 17:50:06 +00:00
Your Name
01cb854f50 Add Locking 2022-02-13 17:30:10 +00:00
Joel Klimont
e7f0f95d66 updated version number to 0.4.0-0
added API_FORCE for overriding API_URL
extensive logging is now disabled by default
2022-02-12 13:16:26 +01:00
Your Name
34e68e2a9e Try another fix 2022-02-11 12:35:48 +00:00
Joel Klimont
2c0f05dd77 updated version number to 0.3.9-0 2022-02-04 18:36:01 +01:00
Konstantin Lampalzer
4b96a1a4a7
Update Motor.py 2022-02-04 18:32:32 +01:00
Joel Klimont
a7de603298 updated version number to 0.3.8-0 2022-02-04 17:51:21 +01:00
root
67d047f521 :Merge branch 'master' of https://github.com/F-WuTS/compLIB 2022-02-04 16:36:59 +00:00
root
2d63fcc58f Fix 3 bugs 2022-02-04 16:36:06 +00:00
Konstantin Lampalzer
df4c672701 Update documentation 2022-01-28 19:53:13 +01:00
Joel Klimont
a5b0933eff updated version number to 0.3.7-0 2022-01-28 19:35:44 +01:00
root
ed9a22b1c7 Merge branch 'master' of https://github.com/F-WuTS/compLIB 2022-01-28 18:34:09 +00:00
root
543be6cdab Fix recursive lock 2022-01-28 18:34:01 +00:00
Joel Klimont
0d15ea1654 updated version number to 0.3.6-0 2022-01-28 19:23:09 +01:00
root
6ba6ab3ae1 Merge branch 'master' of https://github.com/F-WuTS/compLIB 2022-01-28 18:21:36 +00:00
root
2748290e30 Add multiple read to ir sensor 2022-01-28 18:21:15 +00:00
Joel Klimont
d22c91cc4c updated version number to 0.3.5-0 2022-01-28 19:10:03 +01:00
root
fc64706b65 Add locking in spi 2022-01-28 18:09:02 +00:00
Joel Klimont
2b3f6f86c5 updated version number to 0.3.4-0 2022-01-28 16:25:14 +01:00
HerrNamenlos123
e7c82dbc47 hopefully fixed spi read/write errors 2022-01-28 15:43:20 +01:00
Joel Klimont
d4d69daabd updated version number to 0.3.3-0 2022-01-21 16:19:44 +01:00
Konstantin Lampalzer
62f0b96d72
Update Spi.py 2022-01-21 15:50:48 +01:00
Joel Klimont
bbcbfa210f updated version number to 0.3.2-0 2022-01-09 18:48:20 +01:00
Konstantin Lampalzer
866fac9848 Add Documentation for odometrty and robot class. Remove fast_fifo 2022-01-09 18:40:44 +01:00
root
c800b30e31 Add Odometry, Add Robot class, Change SPI Speed, Change Motor to old speeds 2022-01-09 16:48:06 +00:00
itssme
c70ac8fd03
updated readme 2021-12-15 16:49:50 +01:00
Joel Klimont
9b3c8e5b7f added api tests for de
fixed getMeteoroids call in api
2021-12-03 15:28:28 +01:00
root
9e89123e92 New curve, encoder filter 2021-11-19 20:26:57 +00:00
Joel Klimont
d3a26a9539 changes in double elim api for status code 503 2021-11-19 17:08:18 +01:00
Joel Klimont
0db6ed23b2 postinstallscript now enables the background service explicitly 2021-11-19 13:38:34 +01:00
Joel Klimont
7f76813df1 changed version number to 0.3.0-0 2021-11-13 20:43:45 +01:00
root
c5dd14fb1f Add bot driving slower 2021-11-12 19:17:14 +00:00
Joel Klimont
b2d025002e changed version number to 0.2.9-0 2021-11-05 15:23:13 +01:00
HerrNamenlos123
210580d3f1
Update Reset.py 2021-11-05 15:06:20 +01:00
Joel Klimont
4c4da544c2 added basic test for seeding api 2021-10-28 23:23:52 +02:00
Joel Klimont
107ba9c667 updated version 2021-10-16 23:51:59 +02:00
Konstantin Lampalzer
592311d3ee Change lines 2021-10-16 23:38:15 +02:00
Your Name
f7a2a8a261 Add firmware Version to display 2021-10-16 18:18:50 +01:00
Konstantin Lampalzer
222aa46123 Fix docu 2021-10-16 16:36:07 +02:00
Joel Klimont
97b08497d8 updated version 2021-10-14 15:22:09 +02:00
Konstantin Lampalzer
42952eb9e1 Add QC docu, Fix display update 2021-10-14 15:17:35 +02:00
Joel Klimont
d81eb73b46 updated version
fixed ip date output
2021-10-14 14:07:06 +02:00
Joel Klimont
910c5edaee speedup of postinstall script 2021-10-14 14:04:38 +02:00
Joel Klimont
9f09ca3382 updated version number 2021-10-14 14:00:03 +02:00
Konstantin Lampalzer
3f0651abbc herge branch 'master' of github.com:F-WuTS/compLIB 2021-10-14 13:59:27 +02:00
Konstantin Lampalzer
ce7094b5cf Fix spidev 2021-10-14 13:59:20 +02:00
Joel Klimont
74db0ca676 updated version number 2021-10-14 13:44:12 +02:00
Joel Klimont
0f95d4207a stability improvements for ip daemon 2021-10-14 13:37:33 +02:00
Konstantin Lampalzer
eafad7ccdb Add local development to SPI 2021-10-14 13:36:03 +02:00
Joel Klimont
881f8ddbf8 added error output to get_ip 2021-10-06 13:20:21 +02:00
Joel Klimont
436ef35d46 renamed /getMeteoroid to /getMeteoroids
small corrections in ip daemon
2021-10-06 00:19:58 +02:00
Joel Klimont
89d681d10f changed version number to 0.2.5-0 2021-10-02 17:39:48 +02:00
root
f5cc142019 Remove unused print in servo 2021-10-02 12:38:13 +01:00
root
7228af5e40 Fix warning in motor 2021-10-02 11:50:10 +01:00
root
b4eae06eb6 Fix VisionDaemon 2021-10-02 11:45:03 +01:00
itssme
8218e8228e
fixed ip displayer not starting after correct imports 2021-10-02 11:49:33 +02:00
Konstantin Lampalzer
3faee0fb88
Update IRSensor.py 2021-10-01 21:11:52 +02:00
Joel Klimont
d1a86d2c0e fixed logging in background daemon 2021-10-01 13:37:56 +02:00
Joel Klimont
3eab71aaf5 fixed bug in get_meteoroids which would recursively call the wrong function 2021-10-01 02:46:52 +02:00
Joel Klimont
d58a41da69 fixed missing api calls and documentation 2021-10-01 02:40:16 +02:00
Joel Klimont
c515c0062b Merge remote-tracking branch 'origin/master' 2021-10-01 01:50:39 +02:00
Joel Klimont
d06e6fa32d added api requests 2021-10-01 01:50:31 +02:00
Konstantin Lampalzer
023ccb416b Fix documentation for diplay 2021-10-01 01:13:07 +02:00
Joel Klimont
bb4483b141 background daemon now disables heartbeat for itself 2021-10-01 01:04:05 +02:00
Joel Klimont
a81fd4204b fixed version number in package init 2021-10-01 00:33:45 +02:00
Joel Klimont
7f00196680 added ip address writing to daemon 2021-10-01 00:24:08 +02:00
itssme
6eef4e7aa4
added influxdb_client pip package 2021-09-30 16:13:18 +02:00
Konstantin Lampalzer
31eb91d51b Add servo 2021-09-23 20:43:41 +02:00
Konstantin Lampalzer
1c0310b9c7 new linefollower example 2021-09-14 18:34:50 +02:00
Konstantin Lampalzer
3ef0fff256 update documentation 2021-09-13 19:14:47 +02:00
Konstantin Lampalzer
54320096fb Documentation 2021-09-12 13:54:38 +02:00
Konstantin Lampalzer
f5488f7b47 Documentation 2021-09-12 13:46:36 +02:00
Konstantin Lampalzer
cf4e88fd35 Documentation 2021-09-12 13:46:30 +02:00
Konstantin Lampalzer
8f2944da71 Documentation 2021-09-12 13:42:55 +02:00
Konstantin Lampalzer
cbe3a379bd Faster reset 2021-09-12 13:01:37 +02:00
Konstantin Lampalzer
aac99a11ba Minor fixes 2021-09-11 21:12:58 +02:00
Konstantin Lampalzer
3fe3139961 Add MetricsLogging 2021-09-06 18:51:52 +02:00
Konstantin Lampalzer
60f252c37a Fixed sign for motor power 2021-09-05 16:45:30 +01:00
Konstantin Lampalzer
e0600d75c4 Added motor curve linearizer 2021-09-05 14:26:43 +01:00
Konstantin Lampalzer
bdb7d687bb Fixed motor registers 2021-09-05 11:37:16 +01:00
Konstantin Lampalzer
a2425c7010 Merge branch 'master' of https://github.com/F-WuTS/compLIB 2021-09-05 11:27:53 +01:00
Konstantin Lampalzer
50709c96e0 Added prints on library startup 2021-09-05 11:27:23 +01:00
Konstantin Lampalzer
7aa415f860 Merge branch 'master' of github.com:F-WuTS/compLIB 2021-09-05 12:20:29 +02:00
Konstantin Lampalzer
74f0f42d2f Fixed encoder overflow 2021-09-05 11:11:53 +01:00
Konstantin Lampalzer
ce748d8321 Add servo registers 2021-09-04 18:44:56 +02:00
Konstantin Lampalzer
3e7df14da8 Fixed Encoder clear at startup 2021-09-04 15:00:33 +01:00
Konstantin Lampalzer
9e61023e67 Fixed reset delay 2021-09-04 14:50:43 +01:00
Konstantin Lampalzer
91884bd433 Add auto reset of stm on start 2021-09-04 15:35:38 +02:00
HerrNamenlos123
4f564ca759 Fixed SPI error 2021-09-04 05:19:52 -07:00
Konstantin Lampalzer
0f103cb34d Add encoder resetting, SPI health check 2021-08-23 22:13:01 +01:00
Konstantin Lampalzer
63b8f868c9 Add IR, encoder, motor, display 2021-08-22 18:37:20 +02:00
Konstantin Lampalzer
530ddd8be7 Add spi 2021-08-22 13:07:37 +02:00
Joel
4bf031a6c7
small fixes in api requests for double elimination 2021-04-23 19:42:45 +02:00
Konstantin Lampalzer
7431f44804 Add sleep 2021-04-23 19:36:44 +02:00
Konstantin Lampalzer
fca29a7bff Hopefully fix timeouts 2021-04-23 19:32:38 +02:00
HerrNamenlos123
c86d4a350f Added ArUco example 2021-04-05 20:55:07 +01:00
Joel Klimont
bd2000f774 small changes in build script 2021-04-02 18:46:14 +02:00
Joel Klimont
d84a45f601 updated vision to dismiss buffered frames 2021-04-02 13:52:01 +02:00
Joel Klimont
c1451d27b5 updated vision to dismiss buffered frames 2021-04-02 13:51:31 +02:00
Joel Klimont
0e43f88fda updated vision to dismiss buffered frames 2021-04-01 00:19:59 +02:00
Konstantin Lampalzer
8bae96c8a9
Fix linefollower example 2021-03-28 21:42:44 +02:00
Konstantin Lampalzer
befc7fded6
Merge branch 'master' of github.com:F-WuTS/compLIB 2021-03-28 18:52:26 +02:00
Konstantin Lampalzer
e94d735e24
Add IRWrapper and change IRSensor logic 2021-03-28 16:39:54 +02:00
Joel
4d5b5a5063
update package
included missing dependency
2021-03-19 15:24:46 +01:00
HerrNamenlos123
3101e56252 Lowered minimal battery voltage and added ir sensor example 2021-03-19 15:16:16 +01:00
HerrNamenlos123
0ddc8e6c74 Added support for new analog IR sensors 2021-03-19 15:09:21 +01:00
Joel
ee9432317a
/getScores is now implemented in api 2021-03-05 15:45:34 +01:00
Joel
a7d1fca14a
api position objects now implements __str__ and __repr__ 2021-03-04 21:48:54 +01:00
Konstantin Lampalzer
08675bdc5c
Fix IR initial state 2021-02-12 17:43:10 +01:00
Joel
d468732040
changed api according to specification 2021-02-10 22:41:23 +01:00
Joel
5e46e8068a
changed api client according to specification
bug fixes in VisionDaemon
2021-02-10 03:22:55 +01:00
Joel
ce6b06544a
when importing complib a version check is now performed and the user is notified if he is using an outdated version 2021-02-06 23:51:24 +01:00
Joel
90e3dd6f00
added streaming commands 2021-02-06 02:43:20 +01:00
Joel
d4b577046e
vision module is not using rtmp stream anymore
jpeg webstream now runs with nearly zerolatency (currently limited to 640x480px)
2021-02-04 16:02:45 +01:00
Joel
6c579bb5fb
small changes and fixes 2021-01-30 01:53:25 +01:00
Konstantin Lampalzer
76a01e4cd9
Fix servo imports 2021-01-29 17:45:22 +01:00
Joel
af3f832758
fixed buzzer thread
fixed logging
fixed postinstall.sh
2021-01-29 14:21:03 +01:00
Joel
efd03d71a1
buzzer is now starting to issue a warning if battery is under 15% 2021-01-28 23:15:21 +01:00
koka
7ec6854ac6 Add servos 2021-01-28 22:12:33 +00:00
Joel
acc91cdd74
added option to disable logging 2021-01-28 14:21:30 +01:00
Joel
e02b42060b
fixed error in logger causing rpi to think logging server is down 2021-01-26 21:18:32 +01:00
Joel
4d699181c3
Merge remote-tracking branch 'origin/master' 2021-01-26 20:36:48 +01:00
Joel
c70edd4166
fixed vision documentation 2021-01-26 20:36:40 +01:00
Konstantin Lampalzer
4558269795
logs errors to kibana 2021-01-24 20:44:37 +01:00
Joel
dfb66d5383
added missing dependency in .deb package 2021-01-23 21:57:28 +01:00
Joel
4e1f22fa84
now overwriting nginx conf if it already exists 2021-01-23 19:05:02 +01:00
Joel
65d253a7b9
added more dependencies 2021-01-23 18:47:33 +01:00
itssme
1bd7f09e48 Update issue templates 2021-01-23 18:43:41 +01:00
Konstantin Lampalzer
4a5f630d40
Logging, more documentation 2021-01-23 13:37:40 +01:00
Konstantin Lampalzer
6eebab871e Merge branch 'master' of https://github.com/F-WuTS/compLIB 2021-01-23 11:56:55 +00:00
Konstantin Lampalzer
a544133e92 Change IR Sensor, fix motor direction 2021-01-23 11:55:56 +00:00
Joel
7e9192072c
vision daemon now streams with a resolution of 1280x720
fixed package install
2021-01-23 02:41:19 +01:00
Joel
77c2354c00
updated to version 0.0.3
added vision daemon which runs in the background
added more documentation to vision module
now including opencv dependencies in complib package
2021-01-21 23:55:26 +01:00
Joel
b06962e955
started working on vision package 2021-01-21 19:37:04 +01:00
Konstantin Lampalzer
ce1c82a192 Add more logging and exception 2021-01-21 16:43:01 +00:00
Joel
cb10bb3a4d
added dependency "python3-pip" to package 2021-01-18 20:07:43 +01:00
Konstantin Lampalzer
00d6c54cdc
Fix usage example 2021-01-18 20:02:29 +01:00
Konstantin Lampalzer
210d377e9b
Fix api documentation 2021-01-17 15:07:11 +01:00
Joel
7de2d921d8
fixed error in doc build script, causing html folder to be copied instead of its contents 2021-01-17 04:50:10 +01:00
Joel
5fbe0bcb8d
added examples to Api.rst
updated version
changes in build
2021-01-17 04:36:25 +01:00
Joel
327f87ca34
chnages in build 2021-01-17 03:04:38 +01:00
Joel
24817dcc32
updated to newest version 2021-01-16 23:56:39 +01:00
Konstantin Lampalzer
3b18b0a66c
Documentation 2021-01-16 23:41:39 +01:00
Joel
2cac75fc9c
Merge remote-tracking branch 'origin/master' 2021-01-16 23:33:19 +01:00
Joel
134cd3a30e
added more api documentation
new build process
2021-01-16 23:33:09 +01:00
HerrNamenlos123
8bc35858fb Added Ultrasonic sensor 2021-01-16 22:40:33 +01:00
joel
73284ceab8 removed .idea from git tracking
added new logging dependency
2021-01-16 21:21:00 +01:00
Konstantin Lampalzer
b2a085eab3
Add logstash logger 2021-01-16 20:44:53 +01:00
joel
1b6fd1cfdf small changes 2021-01-16 18:55:10 +01:00
Tamas Sel
b1478b77b4 Corrected a calculation error in the battery percentage 2021-01-16 15:06:53 +01:00
joel
0e0a61d710 finished api client implementation
added tests for api (compapi should run in the background or be installed)
2021-01-16 03:09:31 +01:00
Konstantin Lampalzer
c25715de40
Fix documentation 2021-01-16 02:13:00 +01:00
Konstantin Lampalzer
d1a50d4bfc
Fix documentation 2021-01-16 02:11:22 +01:00
Konstantin Lampalzer
d3a6fcd42c
Fix documentation 2021-01-16 02:11:15 +01:00
Konstantin Lampalzer
daef7c97e4
Rename folder 2021-01-16 02:10:40 +01:00
Konstantin Lampalzer
651713c081
Remove useless stuff 2021-01-16 02:07:18 +01:00
Konstantin Lampalzer
2835f3ae42
Add how to document your code in readme 2021-01-16 02:01:07 +01:00
Konstantin Lampalzer
ec0b5562cf
Add code examples 2021-01-16 01:55:22 +01:00
Konstantin Lampalzer
aa33dc36d8
Add ghpages script 2021-01-16 01:32:48 +01:00
227 changed files with 4139 additions and 58215 deletions

View file

@ -1,4 +0,0 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 5fb11da93cdb0f49bc97733fbb9cadaf
tags: 645f666f9bcd5a90fca523b33c5a78b7

32
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,32 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: HerrNamenlos123, itssme, Kola50011
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behaviour:
1. import compLib '...'
2. run this code '....'
3. See error
**Expected behaviour**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Device**
- Raspberry Pie: [e.g. 3b+]
- OS: [e.g. debian buster]
- Version [e.g. 0.0.3]
**Additional context**
Add any other context about the problem here.

View file

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: HerrNamenlos123, itssme, Kola50011
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

60
.github/workflows/complib-package.yml vendored Normal file
View file

@ -0,0 +1,60 @@
name: Build comlib.deb package
on:
push:
branches:
- master
jobs:
build-complib-deb:
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Bump version number
uses: paulhatch/semantic-version@v4.0.2
id: next_semantic_version
with:
branch: "master"
tag_prefix: ""
major_pattern: "(MAJOR)"
minor_pattern: "(MINOR)"
format: "${major}.${minor}.${patch}-${increment}"
bump_each_commit: true
- name: Print Version Numbers
run: |
echo ${{join(steps.next_semantic_version.outputs.*, ' - ')}}
echo "Next version: ${{steps.next_semantic_version.outputs.version}}"
echo "Next version tag: ${{steps.next_semantic_version.outputs.version_tag}}"
- name: Tag Commit
uses: actions/github-script@v5
with:
script: |
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: 'refs/tags/${{steps.next_semantic_version.outputs.version}}',
sha: context.sha
})
- name: Install fpm
run: sudo apt install ruby -y && sudo gem install fpm
- name: Build complib deb Package
env:
VERSION: ${{steps.next_semantic_version.outputs.version}}
run: bash ./build.sh # creates packages in "output" directory
- name: Pushes to another repository
uses: cpina/github-action-push-to-another-repository@main
env:
API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
with:
source-directory: 'output'
target-directory: 'debs/complib/'
destination-github-username: 'F-WuTS'
destination-repository-name: 'compREP'
user-email: joel.klimont@comp-air.at
target-branch: master

312
.gitignore vendored Normal file
View file

@ -0,0 +1,312 @@
# Created by https://www.toptal.com/developers/gitignore/api/macos,python,pycharm
# Edit at https://www.toptal.com/developers/gitignore?templates=macos,python,pycharm
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### macOS Patch ###
# iCloud generated files
*.icloud
### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### PyCharm Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/
# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml
# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/
# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$
# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml
# Azure Toolkit for IntelliJ plugin
# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
.idea/**/azureSettings.xml
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# End of https://www.toptal.com/developers/gitignore/api/macos,python,pycharm

1
CNAME
View file

@ -1 +0,0 @@
lib.comp-air.at

1
MANIFEST.in Normal file
View file

@ -0,0 +1 @@
include readme.md

50
README.md Normal file
View file

@ -0,0 +1,50 @@
# compLIB
Rewrite for ROS is the live packaged version since 18.07.2023.
# Dependencies
TODO: document
## Building documentation
```
pip install sphinx-rtd-theme
```
* [Sphinx](https://www.sphinx-doc.org/en/master/usage/installation.html)
# Writing docs
[Inline documentation example](https://pythonhosted.org/an_example_pypi_project/sphinx.html#full-code-example)
[reStructured Text](https://pythonhosted.org/an_example_pypi_project/sphinx.html#restructured-text-rest-resources)
# ENV Variables
+ `DEBUG`, default="0", If set to != "0" (default), debug prints will be enabled
+ `API_URL`, default="http://localhost:5000/"
+ `API_FORCE`, default="", if set to !="" (default), it will replace the API_URL env variable
+ `FORCE_SEED`, default="-1", if set to !="-1" (default), the seeding seed supplied by the user will be ignored and this seed will be used instead
# Stream Video
```
sudo raspivid -t 0 -b 10000000 -w 1920 -h 1080 -fps 30 -n -o - | gst-launch-1.0 fdsrc ! video/x-h264,width=1280,height=720,framerate=30/1,noise-reduction=1,profile=high,stream-format=byte-stream ! h264parse ! queue ! flvmux streamable=true ! rtmpsink location=\"rtmp://10.1.1.68/live/stream\"```
```
## Stream video from generic USB camera
with gst, very cpu heavy
```
gst-launch-1.0 v4l2src ! image/jpeg,width=640,height=480,framerate=30/1 ! jpegdec ! x264enc ! flvmux streamable=true ! rtmpsink location="rtmp://10.20.86.88/live/stream"
```
with ffmpeg, cpu friendly
```
ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -i /dev/video0 -b:v 2M -f flv rtmp://10.20.86.88/live/stream
```
# Bullseye now only supports libcamera
https://www.raspberrypi.com/news/bullseye-camera-system/
(This can still be mitigated by enabling "old camera support" in the raspi-config settings. (This is done automatically in the postinstallscript)

View file

@ -1,107 +0,0 @@
.. _lib_api:
Api
****
Seeding
========
.. autoclass:: compLib.Api.Seeding
:members:
Double Elimination
===================
.. autoclass:: compLib.Api.DoubleElim
:members:
Position
========
.. autoclass:: compLib.Api.Position
:members:
Examples
========
Calling Seeding API
---------------------
.. code-block:: python
from compLib.Api import Seeding
zones, code = Seeding.get_delivery()
if code == 403:
print(f"I am not in the correct zone to make that request!")
else:
print(f"First we need to go to zone {zone[0]}")
# put code here to follow line and drive to the zone
print(f"Now we need to go to zone {zone[1]}")
# put code here to follow line and drive to the next zone
print(f"Now we need to go to zone {zone[2]}")
# put code here to follow line and drive to the last zone
print(f"We delivered all packages, hopefully we scored some points!")
.. code-block:: python
from compLib.Api import Seeding
package, code = Seeding.get_cargo("yellow")
if code == 403:
print(f"I am not in the correct zone to make that request!")
elif code == 404:
print(f"I am in the correct zone, but there is no yellow package here.")
elif code == 413:
print(f"I am in the correct zone, but I already have two packages loaded.")
else code == 200:
print(f"The {package['color']} has been picked up!")
Calling Double Elimination API
----------------------------------
.. code-block:: python
from compLib.Api import DoubleElim
position, status = DoubleElim.get_position()
print(f"Position of my robot is: x={position.x}, y={position.y} and rotation is: {position.degrees}, the server responded with status code: {status}")
goal, status = DoubleElim.get_goal()
print(f"Goal is at: x={goal.x}, y={goal.y}, the server responded with status code: {status}")
.. code-block:: python
from compLib.Api import DoubleElim
import time
# function which waits for the game to be started (you should include this in your double elimination program)
def wait_for_start():
_, status = DoubleElim.get_position()
while status == 503:
time.sleep(0.1)
_, status = DoubleElim.get_position()
wait_for_start()
print(f"Game has started, lets score some points!!")
position, status = DoubleElim.get_position()
print(f"Position of my robot is: x={position.x}, y={position.y} and rotation is: {position.degrees}, the server responded with status code: {status}")
opponent_position, status = DoubleElim.get_opponent()
print(f"Position of the opponents robot is: x={opponent_position.x}, y={opponent_position.y} and rotation is: {opponent_position.degrees}, the server responded with status code: {status}")
goal, status = DoubleElim.get_goal()
print(f"Goal is at: x={goal.x}, y={goal.y}, the server responded with status code: {status}")
items, status = DoubleElim.get_items()
print(f"There are currently {len(items)} on the gameboard: {items}, the server responded with status code: {status}")
score, status = DoubleElim.get_score()
print(f"The current score of the game is {score}, the server responded with status code: {status}")
meteoroids, status = DoubleElim.get_meteoroids()
print(f"The current meteoroids in the game are {meteoroids}, the server responded with status code: {status}")
In this second example we wait until the game is started by the judges and then make all possible requests once. You should use the wait_for_start function in your double elimination program. If your robot starts too soon your run will not count!

View file

@ -1,83 +0,0 @@
.. _lib_vision:
Aruco
*******
Examples
=========
Recognizing ArUco tags
-------------------------
.. code-block:: python
import time
import cv2
from cv2 import aruco
from compLib import Vision
ARUCO_DICT = cv2.aruco.Dictionary_get(aruco.DICT_6X6_250)
ARUCO_PARAMETERS = aruco.DetectorParameters_create()
def getTagCenterFromFrame(id, frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, ARUCO_DICT, parameters = ARUCO_PARAMETERS)
frame = aruco.drawDetectedMarkers(frame.copy(), corners, ids)
if ids is None:
return frame, None, None
for tag_id, corner in zip(ids, corners):
if (tag_id[0] == id):
x, y = 0, 0
for i in range(4):
x += corner[0][i][0] * 0.25
y += corner[0][i][1] * 0.25
return frame, x, y
return frame, None, None
# Get the center from the aruco tag with the specified id
# in pixel coordinates (0-640, 0-480)
def getTagPosition(id):
frame = Vision.Streaming.get_frame()
frame, x, y = getTagCenterFromFrame(id, frame)
Vision.Streaming.publish_frame(frame)
return x, y
# Get the normalized center coordinates from the aruco tag
# with the specified id
# left is -1, right +1
# bottom is -1, top +1
def getNormalizedTagPosition(id):
frame = Vision.Streaming.get_frame()
frame, x, y = getTagCenterFromFrame(id, frame)
Vision.Streaming.publish_frame(frame)
if x is None or y is None:
return None, None
height, width = frame.shape[:2]
x = x / width * 2.0 - 1.0
y = -(y / height * 2.0 - 1.0)
return x, y
if __name__ == '__main__':
desiredID = 11
while True:
x, y = getNormalizedTagPosition(desiredID)
if x is not None:
print("X Coordinate: ", x)
else:
print("Tag not found")
This example shows how to recognize ArUco tags based on their id and position.
You can specify an ID of the tag you want to use and if it's found, the coordinates of the center are returned.
With the normalized function this is very easy: The x-coordinate is -1 on the left, 1 on the right and 0 in the center of the screen, same for y.
This way it is quite simple to act on the position of the tag.

View file

@ -1,23 +0,0 @@
.. _lib_battery:
Battery
********
Class Documentation
====================
.. autoclass:: compLib.Battery.Battery
:members:
Examples
=========
Printing percentage
--------------------
.. code-block:: python
from compLib.Battery import Battery
print(Battery.percent())

View file

@ -1,25 +0,0 @@
.. _lib_buzzer:
Buzzer
*******
Class Documentation
====================
.. autoclass:: compLib.Buzzer.Buzzer
:members:
Examples
=========
Turning buzzer on and off
--------------------------
.. code-block:: python
import time
from compLib.Buzzer import Buzzer
Buzzer.set(True)
time.sleep(1)
Buzzer.set(False)

View file

@ -1,23 +0,0 @@
.. _lib_display:
Display
*******
Class Documentation
====================
.. autoclass:: compLib.Display.Display
:members:
Examples
=========
Write a line to the display
---------------------------
.. code-block:: python
import time
from compLib.Display import Display
Display.write(1, "Hello World!")

View file

@ -1,10 +0,0 @@
.. _lib_encoder:
Encoder
*******
Class Documentation
====================
.. autoclass:: compLib.Encoder.Encoder
:members:

View file

@ -1,20 +0,0 @@
.. _lib_irsensor:
Infrared Sensor
****************
.. autoclass:: compLib.IRSensor.IRSensor
:members:
Examples
=========
Testing analog sensors
-------------------------
.. code-block:: python
from compLib import IRSensor
while True:
print ("left: {} middle: {} right: {}".format(IRSensor.read(1), IRSensor.read(3), IRSensor.read(5)))

View file

@ -1,22 +0,0 @@
.. _lib_irwrapper:
Infrared Wrapper
****************
.. autoclass:: compLib.IRWrapper.IRWrapper
:members:
Examples
=========
Calibrating analog sensors
--------------------------
.. code-block:: python
from compLib import IRWrapper
ir = IRWrapper.IRWrapper()
ir.calibrate()
print("left {} middle {} right {}".format(ir.bottom_left_calibrated(), ir.bottom_middle_calibrated(), ir.bottom_right_calibrated()))

View file

@ -1,79 +0,0 @@
.. _lib_Linefollower:
Linefollower Examples
*********************
Simple Linefollower
-------------------------
.. code-block:: python
from compLib.Motor import Motor
from compLib.Display import Display
from compLib.IRSensor import IRSensor
from compLib.Encoder import Encoder
import time
IRSensor.set(1, True)
IRSensor.set(2, True)
IRSensor.set(3, True)
IRSensor.set(4, True)
IRSensor.set(5, True)
DRIVE_SPEED = 75
COLOR_BREAK = 900
KP = 10.0
KD = 0.0
def drive(leftSpeed, rightSpeed):
rightSpeed *= -0.906
Motor.power(1, min(max(-100, rightSpeed), 100))
Motor.power(4, min(max(-100, leftSpeed), 100))
def follow(sleepTime = 0.1):
lastError = 0
sensorsBlack = 0
while sensorsBlack < 3:
sensorsBlack = 0
for i in range(1, 6):
if IRSensor.read(i) > COLOR_BREAK:
sensorsBlack += 1
error = lastError
if IRSensor.read(3) > COLOR_BREAK:
error = 0
elif IRSensor.read(1) > COLOR_BREAK:
error = -1.5
elif IRSensor.read(5) > COLOR_BREAK:
error = 1.5
elif IRSensor.read(2) > COLOR_BREAK:
error = -1
elif IRSensor.read(4) > COLOR_BREAK:
error = 1
elif error == 1.5:
error = 3
elif error == -1.5:
error = -3
lastError = error
adjustment = KP * error + KD * (error - lastError)
leftSpeed = DRIVE_SPEED + adjustment
rightSpeed = DRIVE_SPEED - adjustment
print(f"{leftSpeed} {rightSpeed} {adjustment} {error}")
drive(leftSpeed, rightSpeed)
drive(0, 0)
time.sleep(sleepTime)
def main():
follow()
follow()
follow()
follow()
follow(0.2)
main()

View file

@ -1,22 +0,0 @@
.. _lib_logging:
Logging
*******
Class Documentation
====================
.. autoclass:: compLib.LogstashLogging.Logging
:members:
Examples
=========
Turn up the logging
--------------------
.. code-block:: python
from compLib.LogstashLogging import Logging
Logging.set_debug()

View file

@ -1,23 +0,0 @@
.. _lib_motor:
Motor
******
Class Documentation
====================
.. autoclass:: compLib.Motor.Motor
:members:
Examples
=========
Driving straight (maybe)
-------------------------
.. code-block:: python
from compLib.Motor import Motor
Motor.power(1, -50)
Motor.power(4, 50)

View file

@ -1,50 +0,0 @@
.. _lib_odom:
Odometry
********
Class Documentation
====================
.. autoclass:: compLib.Odom.Odometry
:members:
.. autoclass:: compLib.Odom.Odom
:members:
Examples
=========
Getting actual distance driven
------------------------------
.. code-block:: python
import time
import math
from compLib.Motor import Motor
from compLib.Encoder import Encoder
from compLib.Odom import Odom, Odometry
# distance in meters
# speed in % of max speed
def drive_example(distance, speed):
Odom.update()
odom = Odom.get_odom()
while abs(odom.get_x()) < distance:
Odom.update()
odom = Odom.get_odom()
Motor.power(4, speed)
Motor.power(1, -speed)
print(f" Forward: {odom.get_x()} m")
print(f" Right: {odom.get_y()} m")
print(f" Turned: {math.degrees(odom.get_orientation())} degrees")
Motor.active_break(1)
Motor.active_break(4)
time.sleep(0.1)
Encoder.clear_all()
Odom.clear()

View file

@ -1,71 +0,0 @@
.. _lib_qc:
Quality Control
###############
Infrared Test
-------------------------
.. code-block:: python
from compLib.IRSensor import IRSensor
import time
IRSensor.set(1, True)
IRSensor.set(2, True)
IRSensor.set(3, True)
IRSensor.set(4, True)
IRSensor.set(5, True)
while True:
t = time.time()
for i in range(1, 6):
print(f"{i}: {IRSensor.read(i)}")
print("")
time.sleep(0.2)
Motor Test
-------------------------
.. code-block:: python
from compLib.Motor import Motor
from compLib.Encoder import Encoder
import time
Motor.power(1, -50)
Motor.power(4, 50)
while True:
print(f"L:{Encoder.read(4)} R:{Encoder.read(1)}")
time.sleep(0.1)
Servo Test
-------------------------
.. code-block:: python
from compLib.Servo import Servo
import time
for i in range(1, 8 + 1):
Servo.set_position(i, 45)
print(f"{i}")
time.sleep(1)
Servo.setup_position()
time.sleep(10)
Vision Test
-------------------------
.. code-block:: python
import cv2
from compLib import Vision
from compLib.Servo import Servo
while True:
frame = Vision.Streaming.get_frame()
Vision.Streaming.publish_frame(frame)
Servo.set_position(3, -45)

View file

@ -1,11 +0,0 @@
.. _lib_robot:
Robot
******
Class Documentation
====================
.. autoclass:: compLib.Robot.Robot
:members:
:private-members:

View file

@ -1,7 +0,0 @@
.. _lib_servo:
Servo
******
.. autoclass:: compLib.Servo.Servo
:members:

View file

@ -1,104 +0,0 @@
.. _lib_vision:
Vision
*******
This module provides an interface for grabbing an rtmp stream and using the images to do some processing in opencv.
How do I use this module?
1. Get frames from the raspberry pi camera
2. -- here comes your own processing --
3. Publish the processed frames on an http server
4. You can view the http stream of your processed images in a web browser
Opencv Stream
==============
Because of the rtmp stream needing to buffer some frames and waiting for P-Frames, importing this module might take up
to 5 Seconds.
.. autoclass:: compLib.Vision.__Streaming
:members:
Examples
=========
Using the Vision Module
-------------------------
.. code-block:: python
import cv2
from compLib import Vision
while True:
# get newest opencv frame from camera
frame = Vision.Streaming.get_frame()
# do some processing with the frame.....
# publish frame to streaming server
Vision.Streaming.publish_frame(frame)
Connect the raspberry pi to your internet and view the stream at: "http://your_raspi_ip:9898/". This should display
your raspberry pi camera. Note: the stream will lag a little bit BUT the processing of the image will be done in
realtime.
The output on the website should show whatever your raspberry pi cam records:
.. image:: images/opencv_http_stream.png
:width: 680
:alt: Processed frames from opencv
Chessboard Detection
------------------------------------------
In this example we process the captured stream of images and want to detect chessboards. Run this example and
point your raspberry pi camera to a chessboard and it should be detected.
For testing you can point it at this image:
.. image:: images/chessboard.jpg
:width: 680
:alt: Chessboard for opencv processing
.. code-block:: python
import cv2
from compLib import Vision
while True:
# get newest opencv frame from camera
frame = Vision.Streaming.get_frame()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# convert image to grayscale image
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# find the chessboard corners
ret, corners = cv2.findChessboardCorners(gray, (6, 9), None)
# draw detected chessboard position onto the image
cv2.drawChessboardCorners(frame, (6, 9), corners, ret)
# publish frame to streaming server
Vision.Streaming.publish_frame(frame)
Connect the raspberry pi to your internet and view the stream at: "http://your_raspi_ip:9898/".
The output image should look like this:
.. image:: images/chessboard_detected.jpg
:width: 680
:alt: Processed frames from opencv
Here is a screenshot of the stream website while viewing the chessboard in this documentation.
.. image:: images/opencv_processed.png
:width: 680
:alt: Processed frames from opencv

View file

@ -1,134 +0,0 @@
/*
* _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;
}

File diff suppressed because it is too large Load diff

View file

@ -1,294 +0,0 @@
/**@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

@ -1,856 +0,0 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
div.section::after {
display: block;
content: '';
clear: left;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 450px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
a.brackets:before,
span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
clear: right;
overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
}
div.sidebar::after,
div.topic::after,
div.admonition::after,
blockquote::after {
display: block;
content: '';
clear: both;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
margin-top: 10px;
margin-bottom: 10px;
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > :first-child,
td > :first-child {
margin-top: 0px;
}
th > :last-child,
td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption {
padding: 0.3em;
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist {
margin: 1em 0;
}
table.hlist td {
vertical-align: top;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
margin-top: 0;
}
ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
margin-top: 0;
}
ol.simple p,
ul.simple p {
margin-bottom: 0;
}
dl.footnote > dt,
dl.citation > dt {
float: left;
margin-right: 0.5em;
}
dl.footnote > dd,
dl.citation > dd {
margin-bottom: 0em;
}
dl.footnote > dd:after,
dl.citation > dd:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > :first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dl > dd:last-child,
dl > dd:last-child > :last-child {
margin-bottom: 0;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0.5em;
content: ":";
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
pre, div[class*="highlight-"] {
clear: both;
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
}
div[class*="highlight-"] {
margin: 1em 0;
}
td.linenos pre {
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
display: block;
}
table.highlighttable tbody {
display: block;
}
table.highlighttable tr {
display: flex;
}
table.highlighttable td {
margin: 0;
padding: 0;
}
table.highlighttable td.linenos {
padding-right: 0.5em;
}
table.highlighttable td.code {
flex: 1;
overflow: hidden;
}
.highlight .hll {
display: block;
}
div.highlight pre,
table.highlighttable pre {
margin: 0;
}
div.code-block-caption + div {
margin-top: 0;
}
div.code-block-caption {
margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
table.highlighttable td.linenos,
span.linenos,
div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
margin: 1em 0;
}
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: absolute;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 188 KiB

View file

@ -1 +0,0 @@
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View file

@ -1,316 +0,0 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
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 {
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;
}
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
this.initOnKeyListeners();
}
},
/**
* i18n support
*/
TRANSLATIONS : {},
PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated === 'undefined')
return string;
return (typeof translated === 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* 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
_ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});

View file

@ -1,12 +0,0 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '0.2.3',
LANGUAGE: 'de',
COLLAPSE_INDEX: false,
BUILDER: 'html',
FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,577 +0,0 @@
// 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();
};
};

10872
_static/jquery-3.5.1.js vendored

File diff suppressed because it is too large Load diff

10881
_static/jquery-3.6.0.js vendored

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more