From 35e9d7b4bdbc9735fe7ab9370e5c705287adc794 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Wed, 23 Aug 2023 03:04:24 -0700 Subject: [PATCH 01/12] student docs first draft a rough draft of the student docs written for mkdocs. --- docs/Makefile | 20 ---- docs/conf.py | 56 --------- docs/docs/about.md | 65 ++++++++++ docs/docs/api.md | 259 ++++++++++++++++++++++++++++++++++++++++ docs/docs/device.md | 9 ++ docs/docs/device_get.md | 105 ++++++++++++++++ docs/docs/device_set.md | 66 ++++++++++ docs/docs/index.md | 18 +++ docs/index.rst | 22 ---- docs/mkdocs.yml | 10 ++ 10 files changed, 532 insertions(+), 98 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/conf.py create mode 100644 docs/docs/about.md create mode 100644 docs/docs/api.md create mode 100644 docs/docs/device.md create mode 100644 docs/docs/device_get.md create mode 100644 docs/docs/device_set.md create mode 100644 docs/docs/index.md delete mode 100644 docs/index.rst create mode 100644 docs/mkdocs.yml diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 62150a28..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = ./ -BUILDDIR = build/ - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 9757649d..00000000 --- a/docs/conf.py +++ /dev/null @@ -1,56 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -sys.path.insert(0, os.path.abspath('../executor/')) - - -# -- Project information ----------------------------------------------------- - -project = 'Runtime' -copyright = '2021, Pioneers in Engineering' -author = 'Pioneers in Engineering' - -# The full version, including alpha/beta/rc tags -release = '1.0.1' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc" -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'alabaster' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] diff --git a/docs/docs/about.md b/docs/docs/about.md new file mode 100644 index 00000000..350546b5 --- /dev/null +++ b/docs/docs/about.md @@ -0,0 +1,65 @@ +# Harenas more + +## Summa ventorumque magno non viva Palilibus videri + +Lorem markdownum uterum, amplecti poenamque aethera aliquid, nec tabellae honor +quod tinguamus eundi praesepibus nulla! Rursusque victa procubuit unda, dare +mansura frugum. Ad studeat cedentique nostra. Fine novis illa tamen en revulsum +adcubuere meritis, vetustas super totiens omnia. Obversus iubet natura nec +vincula cohaesit ante ius mea est **faciles** sine, forsitan ne cuspide. + +- Tantaque adsensere silvas foventque Sisyphon est Aeeta +- Troum Philomela carissime artus Limyren mea dicta +- Thalamoque latis +- Lamentabile videam +- Induco et aequore sus +- Neque in posset quaterque incinctus nosces + +## Sed enim + +Fieri nivea pactus voluptas ut enim qui saxo, medio est, Rhesi inspirantque +sanguine agnae ibi ferret quae. Nostro **oneratos Althaea** inponis +anguiferumque donec arbor tempore *esse* lente puellis. Tempora iterum tacitos; +temptat Veneris linoque ferrumque *corpore*. + +Nec mutati arte iuvenisque ramis, *ea alis* tegat omne sanguine! Quia oculos: +ubi ventos, Antissa Tyrioque visus fuga sequentis gemmae. **Ab** non natae et +iuvenem modis **furiale habet** hunc quaeque fuit vincula tuus luget sis. + +- Manus oscula animi +- Ortas ede commisit luctu +- Famulae sum +- Mihi lingua +- Almo notavi nam bibuntur + +## Ceu veteres + +Reiectura ministerio ac Iunone moenia dixit properata arcet animis, deserere +illic; ore ait inclinat. Adhuc India caespite bibit ulciscor? Eumque cum spolia +ubi, stimulosque exercet deposuitque suo, et proxima fetibus dixit lecto? Domito +totaque si sciet non, habes. Inbutum fine. + + if (graphicVisualGps != -3 * eps) { + dTextBeta = netbios_circuit.cellHdv(artificialReadmeMaximize, type); + wizardSla(trackball_bar, whitelistLcdSecondary + oemFlowchart, 4); + sms = upload + systray_oop_server; + } else { + protocol.address_autoresponder(winsHfs.mamp(login, pinterest_wimax, 1), + fileLanguage + gps); + defaultEmulation += registry; + } + wiredFlowchart(bespokeGraphic / 6, character); + rt_cursor_recursive.gps_integrated_dvd -= thumbnailBacksideHoneypot( + box_ccd.inkjet_online_hacker(3 + cpmDonationwareWiki, gpuDuplex), + bit_exploit, defragmentCloud + 1); + ftp_optical_gnu(5 + box_petabyte); + backupShellDfs.mmsModel /= web * outboxPpmDirectory; + +[Quidem ora praedictaque](http://desere.io/aut-venit.html) iacuere cecidere +valuisse, humum, denique. Forte atris canna, sanguine! Calculus est tua tellus, +terraque trementes igitur Perseia auctor. + +Ungula non delapsam fecit. Sinitis stantem, et nervis petitur contraxit ostendit +ad mihi. Cytoriaco artesque meliora, nepotis studio. Montibus ire fert ille +temptabat herbis. Mitia inania: nec dic gentes operi: **duce** digna adverso +quas, cum erat cervicibus verbis equina. diff --git a/docs/docs/api.md b/docs/docs/api.md new file mode 100644 index 00000000..4ad84722 --- /dev/null +++ b/docs/docs/api.md @@ -0,0 +1,259 @@ +# API Reference + +The Student API is the set of functions available to students to communicate with their robots. The api can be split into two distinct class types. The Robot Class used for getting, setting, and running functions; input classes including the Gamepad Class and the Keyboard Class which are used to take student input to control their robots. + +for more infomation refer to the Student API section of the [Runtime Wiki](https://github.com/pioneers/runtime/wiki) + +# +- [Overview](#Overview) +- [`Robot` Class](#robot-class) + - [`Robot.get_value(device_id, param)`](#robotget_valuedevice_id-param) + - [`Robot.set_value(device_id, param, value)`](#robotset_valuedevice_id-param-value) + - [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) + - [`Robot.is_running(function_name)`](#robotis_runningfunction_name) + - [`Robot.sleep(seconds)`](#robotsleepseconds) +- [`Gamepad` Class](#gamepad-class) + - [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) +- [`Keyboard` Class](#keyboard-class) + - [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) + +# Overview +The main event loop of PiE code consists of the `SETUP`, `AUTO`, and `TELEOP` functions. Durring a PiE compatition, each one of these three function loops will be run and depending and will rely on what a team has programed before hand. + + + +## `AUTO` Phase +The autonomous or `AUTO` phase is used anytime keyboard or controller input is restricted. Within this period you are encouraged to write code that will be able to run without any user input. + +An example of this would be running a robot foward for a set duration within an `AUTO` phase + +```py +motor = "//INSERT MOTOR ID HERE//" + +def autonomous_main(): + #keeps motor A running at max speed for 10 seconds + Robot.set_value(motor, velocity_a, 1) + Robot.sleep(10) #stops the execution of any other functions for a specified number of seconds + Robot.set_value(motor, velocity_a, 0) +``` + + + + +## `TELEOP` Phase + The teleoperated or `TELEOP` phase is used anytime remote input via a controller or keyboard is used. The `teleop_main()` function runs in a loop until the teleoperated period has completed. + + This code is most useful when a student would like to use controller or keyboard input to control their robot on the gamefield. +```py +motor = "//INSERT MOTOR ID HERE//" + +def teleop_main(): + #sets the motor's velocity to max if the button A is pressed + if(Gamepad.get_value(button_a) == True): + Robot.set_value(motor, velocity_a, 1) +``` + +## `SETUP` Phase + The `SETUP` phase prepares for either the `AUTO` or `TELEOP` function to be run. In this phase a student can set or get the value of any lowcar device (any device connected to the robot interactable using the PiE api). + + This function is useful when a student would want to turn off the CURRENTLY BROKEN PiD control on a motor controller +```py +motor = "//INSERT MOTOR ID HERE//" + +def teleop_setup(): #code segment run before the teleop_main() function + Robot.set_value(motor, pid_enabled_a, False) + Robot.set_value(motor, pid_enabled_b, False) + +def autonomous_setup(): #code segment run before the autonomous_main() function + Robot.set_value(motor, pid_enabled_a, False) + Robot.set_value(motor, pid_enabled_b, False) +``` + +# `Robot` Class +The robot class holds all methods for interacting with various arduino devices connected to a student’s robot. These devices include servos, motors, and sensors. + +## `Robot.get_value(device_id, param)` +The get_value function returns the current value of a specified param of the device with the specified device_id. + +* `device_id`: the ID that specifies which PiE device will be read +* `param`: identifies which parameter on the specified PiE device will be read. Possible param values depend on the specified device. Find a list of params for each device on the lowcar devices page + +The function is useful for checking the current state of devices while driving. For example, getting the current state of the limit switch using its device_id and the param “switch0” will return the value True when pressed down and False if not. + +For more examples and devices refer to the devices page in the reference + +```py +#first segment of code ran in the teleop process +limit_switch = "//INSERT SWITCH ID HERE//" + +def teleop_setup(): + print("Tele-operated mode has started!") + pass + +def teleop_main(): + #example code for getting the value of a limit switch + + #first parameter is the limit switch's id + #second parameter tells which switch to get the value from + + #in this case the method will retun True or False depending on if the switch is pressed down or not + + Robot.get_value(limit_switch, switch0) + pass + +``` + + +## `Robot.set_value(device_id, param, value)` +The `set_value` function sets a specified value to a device’s parameter + +* `device_id` string: the ID that specifies which PiE device will have its parameter set +* `param`: determines which parameter should be set. The parameters depend on the specified Lowcar device and can be found at INCLUDE LINK TO LOWCAR DEVICE PAGE +* `value` - the value to set the parameter to + +This function is useful for setting the state of parts of your robot while driving. For example calling the set_value param `“velcoity_a”` with a KoalaBear device (motor controller) with a value of `1` results in the attached motor spinning forwards at full power + + +[//]: <> (MAKE CODE SEGMENTS COLLAPSABLE) +```py +#first segment of code ran in the teleop process +motor = "//INSERT MOTOR ID HERE//" + +def teleop_setup(): + print("Tele-operated mode has started!") + pass + +def teleop_main(): + #example code for turning a motor foward at full speed + + #first parameter is the motor controller's id set as a varible + #second parameter 'velocity_a' tells a motor controller which motor to drive + #third parameter sets the value + + Robot.set_value(motor, velocity_a, 1) + pass + +``` + +## `Robot.run(function_name, args)` +Executes another function with the given args passed into the robot.run function. The `function_name` is run both at the same time and independently of any following code in the stack. + +* `function_name`: the name of a function in the student code which will be run simultaneously with the main loop + +* `args`: this is a list of zero or more inputs, which will be passed to the function_name specified previously as arguments (inputs) + +[//]: <> (I want to seperate the code example and this line of text. Not exactly sure how to do it so adding this comment to come back to it) +An example of this would if a student would want to run a process alongside the teleop_main loop. Using the Robot.sleep class to define the amount of time a motor should rotate for without stopping the teleop_main loop. +​ +```py +def arm_movement():# moves arm up for 1 second and then moves it down for 1 second + # assumes arm is attached to motor A of MC "ARM_MOTOR" + while True: + #control arm + + +def teleop_setup(): #starts before teleop-main + # starts the arm_movement subroutine in parallel to the main thread + Robot.run(arm_movement) + pass + +def teleop_main(): + #location where all student drive code is ran +``` + +[//]: <> (FULL CODE WITHOUT ANY REMOVED CODE SEGMENTS //REMOVE//) +```py +def arm_movement(): + # moves arm up for 1 second and then moves it down for 1 second + # assumes arm is attached to motor A of MC "ARM_MOTOR" + while True: + if Gamepad.get_value("a_button"): + Robot.set_value(ARM_MOTOR, "velocity_a", 0.5) + Robot.sleep(1) + Robot.set_value(ARM_MOTOR, "velocity_a", -0.5) + Robot.sleep(1) +​ +def teleop_setup(): + # starts the arm_movement subroutine in parallel to the main thread + Robot.run(arm_movement) + pass +​ +def teleop_main(): + # normal tank drive student code + left_stick_val = Gamepad.get_value("joystick_left_y") + right_stick_val = Gamepad.get_value("joystick_right_y") + + if abs(left_stick_val) > 0.1: + Robot.set_value(DRIVE_MOTOR, "velocity_a", left_stick_val) + else: + Robot.set_value(DRIVE_MOTOR, "velocity_a", 0) + + if abs(right_stick_val) > 0.1: + Robot.set_value(DRIVE_MOTOR, "velocity_b", right_stick_val) + else: + Robot.set_value(DRIVE_MOTOR, "velocity_b", 0) + +``` + + +## `Robot.is_running(function_name)` +Returns a boolean value (`True` or `False`) for whether or not the specified function is still running. + +`function_name`: the name of a function defined by the student that may or may not have been run using Robot.run + + + + + +## `Robot.sleep(seconds)` +Pauses the execution of the current function for the specified number of `seconds`. + +`seconds`: the number of `seconds` to pause the execution of the current function for. +It should be emphasized that calling `Robot.sleep` in one function does not cause any other function that is being run by `Robot.run()` or the main loop function to pause. Only the instance of the function that is executing the call to `Robot.sleep` will pause execution. It is highly recommended to not use this function in the setup functions or main loop functions--only in functions executed by `Robot.run()`. + + + +# Gamepad Class +The purpose of the gamepad class is to provide students with an easy way to control their robots. The gamepad class consists of one function getting any value sent from the student's controller. + +## `Gamepad.get_value(input)` +returns the state of a button or joystick from a connected gamepad + +`input`: identifies which button or joystick will be returned. This function is useful for checking the state of a button or joystick + +For example, if you wanted to print `"hello world"` when the `"button_a"` is pressed and false when it isn't you would use the function as a condition in an if statement + +```py +#segment of code will print "hello world" into the console when button_a is pressed +if Gamepad.get_value("button_a"): + print("hello world") +``` +This function is essential for controlling your robot with the gamepad. + +The possible button inputs are: +* "button_a" +* "button_b" +* "button_x" +* "button_y" +* "l_bumper" +* "r_bumper" +* "l_trigger" +* "r_trigger" +* "button_back" +* "button_start" +* "l_stick" +* "r_stick" +* "dpad_up" +* "dpad_down" +* "dpad_left" +* "dpad_right" +* "button_xbox" + +The possible joystick inputs are: +* "joystick_left_x" +* "joystick_left_y" +* "joystick_right_x" +* "joystick_right_y" + +Note that the joysticks function differently from the button inputs. Rather then returning a Boolean `[True or False]`, they return a floating point value ranging from `-1.0 `and` 1.0` (inclusive) + diff --git a/docs/docs/device.md b/docs/docs/device.md new file mode 100644 index 00000000..7d1cd8b5 --- /dev/null +++ b/docs/docs/device.md @@ -0,0 +1,9 @@ +# Lowcar Device refrence +Lowcar devices are the physical devices students use to interact with the game field. Each device uses the Student API to interface with them. Here you will find in deph explanations of each device and how to control them. + + + +[//]: <> (link to the student api later) + +# +insert glossary stuff later \ No newline at end of file diff --git a/docs/docs/device_get.md b/docs/docs/device_get.md new file mode 100644 index 00000000..b5e1850c --- /dev/null +++ b/docs/docs/device_get.md @@ -0,0 +1,105 @@ +# `Robot.get_value(device, param)` for Lowcar Devices + +## Limit Switch +![Limit switch](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/LimitSwitch.JPG) + +Returns a value from a specified `device_id` and `param` + +`param` for a Limit Switch +* `"switch0"` +* `"switch1"` +* `"switch2"` + +The parameters for a Limit Switch describe which of the three switches is being read. The boolean value will be `True` if the specified switch is being pressed and `False` if it is not. + +**Sample Usage:** +```py +#returns a boolean for whether or not switch0 is pressed +Robot.get_value(limit_switch_id, "switch0") +``` + + +## Line Follower +![Line Follower](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/LineFollower.JPG) +Returns a value associated with the `device_id` and `param` specified. + +The device being specified is a Line Follower. + +parameters for a Line Follower: +* `"left"` +* `"center"` +* `"right"` + +The `param` for a Line Follower describe how much light is being reflected into each sensor. It returns a value between 0 and 1 where a lower value means less light and the sensor is farther off of the reflective tape. + +**Sample Usage:** +```py +#returns how much light is seen from the center sensor on the line follower +Robot.get_value(line_follower_id, "center") +``` + +## Servo Controller +![Servo Controller](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/ServoControl.JPG) +Returns a value associated with the `device` and `param` specified. + +The device being specified is a Servo. + +`param` for a Servo: +* ``"servo0"`` +* ``"servo1"`` + +The parameters for a Servo describes what angle the servo has turned to. It returns a Float from -1 to 1 where both -1 and 1 represent the two end positions for the servo. + +**Sample Usage:** +```py +#returns the current angle of servo0 +Robot.get_value(servo_id, "servo0") +``` +## KoalaBear +![KoalaBear](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/KoalaBear.JPG) +Returns a value associated with the `device` and `param` specified. + +The device being specified is a YogiBear. + +parameters for a YogiBear: + +Motor A +* `"velocity_a"` +* `"deadband_a"` +* `"invert_a"` +* `"pid_enabled_a"` +* `"pid_kp_a"` +* `"pid_ki_a"` +* `"pid_kd_a"` +* `"enc_a"` + +Motor B +* `"velocity_b"` +* `"deadband_b"` +* `"invert_b"` +* `"pid_enabled_b"` +* `"pid_kp_b"` +* `"pid_ki_b"` +* `"pid_kd_b"` +* `"enc_b"` + + +The parameters for a KoalaBear can be split into 3 categories: + +Motor Control includes: +* `"velocity"` which returns a float from -1 to 1 which describes the direction the motor is turning and it's power. +* `"deadband"` which returns the threshold that velocity must pass before a change is made to `"velocity"` + +Encoder Control includes: +* `"enc"` parameters which return information about the position and velocity of the robot. Position is returned as an integer that represents the number of ticks of the encoder. There are 46 per revolution of the encoder. + +PiD Control includes: +* `"pid_kp"`, `"pid_ki"`, and `"pid_kd"` parameters which return the proportional, integral, and derivative coefficients on the motor controller. +* `"pid_enabled"` parameter returns whether or not pid is enabled for a motor. + + +Sample Usage: +```py +#returns the current speed of Motor A as a value from -1 to 1 +Robot.get_value(motor_id, "velocity_a") +``` \ No newline at end of file diff --git a/docs/docs/device_set.md b/docs/docs/device_set.md new file mode 100644 index 00000000..d85997b2 --- /dev/null +++ b/docs/docs/device_set.md @@ -0,0 +1,66 @@ +# `Robot.set_value(device, param)` for Lowcar Devices + + +## Servo Controller +![Servo Controller](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/ServoControl.JPG) +sets a value associated with the `device` and `param` specified. + +The device being specified is a Servo. + +`param` for a Servo: +* ``"servo0"`` +* ``"servo1"`` + +Changing values for the `servo` spins the servo to an angle based on the value entered. The values -1 and 1 each refer to the maximum position of the servo in one direction. For example, if we described our minimum position to be 0°, and our maximum to be 180°, then 1 would set the servo to 180°, -1 would set the servo to 0°, and -0.5 would set it to be 45°. + + +**Sample Usage:** +```py +#sets the current angle of servo0 to 180° +Robot.set_value(servo_id, "servo0", 1) +``` +## KoalaBear +![KoalaBear](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/KoalaBear.JPG) +sets a value associated with the `device` and `param` specified. + +The device being specified is a YogiBear. + +parameters for a YogiBear: + +Motor A +* `"velocity_a"` +* `"deadband_a"` +* `"invert_a"` +* `"pid_enabled_a"` +* `"pid_kp_a"` +* `"pid_ki_a"` +* `"pid_kd_a"` +* `"enc_a"` + +Motor B +* `"velocity_b"` +* `"deadband_b"` +* `"invert_b"` +* `"pid_enabled_b"` +* `"pid_kp_b"` +* `"pid_ki_b"` +* `"pid_kd_b"` +* `"enc_b"` + + +Motor control is handled through changing the values of `"velocity_a"` and `"deadband_a"`. +* `"velocity"` which sets a float from -1 to 1 which describes the direction the motor is turning and it's power. +* `"deadband"` which sets the threshold that velocity must pass before a change is made to `"velocity"` + +The encoder's value can be set using the `"enc"` parameter. Setting the `"enc"` count allows for someone to change the number of ticks recorded from the encoder. + +PiD Control includes: +* `"pid_kp"`, `"pid_ki"`, and `"pid_kd"` parameters which set the proportional, integral, and derivative coefficients on the motor controller. Each of these values have to be above zero. +* `"pid_enabled"` parameter sets whether or not pid is enabled for a motor. + + +Sample Usage: +```py +#sets the current speed of Motor A to max speed +Robot.set_value(motor_id, "velocity_a", 1) +``` \ No newline at end of file diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 00000000..bda6a9a5 --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,18 @@ +# Welcome to Student API Docs + +The student API is the set of all functions that the students have available to them to communicate with the robot. Outlined in the glossary will be all relevant infomation to begin coding a Pioneers In Engineering (PiE) robot. +## Glossary + +
    +
  1. Welcome
  2. +
  3. Quickstart
  4. +
  5. Student API
  6. +
  7. Lowcar Device refrence
  8. +
+ +## Extra Recources +* [Python Documentation](https://docs.python.org/3/) +* [Software Hub](https://pioneers.berkeley.edu/competition/SoftwareHub) +* [Compatition Infomation](https://pioneers.berkeley.edu/Competition) +* [Runtime Wiki](https://github.com/pioneers/runtime/wiki) +* *game manual someday :)* \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index d01e9fb0..00000000 --- a/docs/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -.. Runtime documentation master file, created by - sphinx-quickstart on Mon Jan 11 23:53:21 2021. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to Runtime's documentation! -=================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - -.. automodule:: studentapi - :members: - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 00000000..09657cca --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,10 @@ +site_name: MkLorum +site_url: https://example.com/ +nav: + - Home: index.md + - About: about.md + - Student API: api.md + - Devices: device.md + - Device Get: device_get.md + - Device Set: device_set.md +theme: readthedocs \ No newline at end of file From 5bd9a514c579c18150e857caae6aacb6f132be21 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Mon, 28 Aug 2023 18:01:37 -0700 Subject: [PATCH 02/12] [DOCS] small edits to the api.md --- docs/docs/api.md | 101 ++++++++++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 41 deletions(-) diff --git a/docs/docs/api.md b/docs/docs/api.md index 4ad84722..14512ca8 100644 --- a/docs/docs/api.md +++ b/docs/docs/api.md @@ -5,27 +5,30 @@ The Student API is the set of functions available to students to communicate wit for more infomation refer to the Student API section of the [Runtime Wiki](https://github.com/pioneers/runtime/wiki) # -- [Overview](#Overview) -- [`Robot` Class](#robot-class) - - [`Robot.get_value(device_id, param)`](#robotget_valuedevice_id-param) - - [`Robot.set_value(device_id, param, value)`](#robotset_valuedevice_id-param-value) - - [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) - - [`Robot.is_running(function_name)`](#robotis_runningfunction_name) - - [`Robot.sleep(seconds)`](#robotsleepseconds) -- [`Gamepad` Class](#gamepad-class) - - [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) -- [`Keyboard` Class](#keyboard-class) - - [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) +[//]: # (find better word for code periods later) +* [Run Mode](#run-mode) + * [`Teleop` Period](#teleop-period) + * [`Auto` Period](#auto-period) +* [`Robot` Class](#robot-class) + * [`Robot.get_value(device_id, param)`](#robotget_valuedevice_id-param) + * [`Robot.set_value(device_id, param, value)`](#robotset_valuedevice_id-param-value) + * [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) + * [`Robot.is_running(function_name)`](#robotis_runningfunction_name) + * [`Robot.sleep(seconds)`](#robotsleepseconds) +* [`Gamepad` Class](#gamepad-class) + * [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) + * [`Keyboard` Class](#keyboard-class) + * [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) -# Overview -The main event loop of PiE code consists of the `SETUP`, `AUTO`, and `TELEOP` functions. Durring a PiE compatition, each one of these three function loops will be run and depending and will rely on what a team has programed before hand. +# Run Mode +The two run modes, `autonomous` and `teleop` are where a majority of student code will be run. These functions are run in the Autonous period and Teleoperated period of a PiE compatition. Autonomous code restricts student's access to the `Keyboard` and `Gamepad` functions, forcing them to write code that will run without any input. The Teleoperated perod allows for control from both, giving students more freedom to control ther robot through any of the challenges presented in that phase. -## `AUTO` Phase -The autonomous or `AUTO` phase is used anytime keyboard or controller input is restricted. Within this period you are encouraged to write code that will be able to run without any user input. +## `AUTO` Period +The autonomous or `AUTO` period is used anytime keyboard or controller input is restricted. Within this period you are encouraged to write code that will be able to run without any user input. -An example of this would be running a robot foward for a set duration within an `AUTO` phase +An example of this would be running a robot foward for a set duration within an `AUTO` period ```py motor = "//INSERT MOTOR ID HERE//" @@ -36,14 +39,14 @@ def autonomous_main(): Robot.sleep(10) #stops the execution of any other functions for a specified number of seconds Robot.set_value(motor, velocity_a, 0) ``` +For more recources please refer to the [Software Hub Autonomous Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) - - -## `TELEOP` Phase - The teleoperated or `TELEOP` phase is used anytime remote input via a controller or keyboard is used. The `teleop_main()` function runs in a loop until the teleoperated period has completed. +## `TELEOP` Period + The teleoperated or `TELEOP` period is used anytime remote input via a controller or keyboard is used. The `teleop_main()` function runs in a loop until the teleoperated period has completed. This code is most useful when a student would like to use controller or keyboard input to control their robot on the gamefield. + ```py motor = "//INSERT MOTOR ID HERE//" @@ -53,6 +56,7 @@ def teleop_main(): Robot.set_value(motor, velocity_a, 1) ``` +For more recources please refer to the [Software Hub Teleop Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) ## `SETUP` Phase The `SETUP` phase prepares for either the `AUTO` or `TELEOP` function to be run. In this phase a student can set or get the value of any lowcar device (any device connected to the robot interactable using the PiE api). @@ -145,33 +149,20 @@ Executes another function with the given args passed into the robot.run function [//]: <> (I want to seperate the code example and this line of text. Not exactly sure how to do it so adding this comment to come back to it) An example of this would if a student would want to run a process alongside the teleop_main loop. Using the Robot.sleep class to define the amount of time a motor should rotate for without stopping the teleop_main loop. ​ -```py -def arm_movement():# moves arm up for 1 second and then moves it down for 1 second - # assumes arm is attached to motor A of MC "ARM_MOTOR" - while True: - #control arm - - -def teleop_setup(): #starts before teleop-main - # starts the arm_movement subroutine in parallel to the main thread - Robot.run(arm_movement) - pass - -def teleop_main(): - #location where all student drive code is ran -``` [//]: <> (FULL CODE WITHOUT ANY REMOVED CODE SEGMENTS //REMOVE//) ```py +ARM_MOTOR = "INSERT MOTOR_ID HERE" +DRIVE_MOTOR = "INSERT MOTOR_ID HERE" + + def arm_movement(): # moves arm up for 1 second and then moves it down for 1 second # assumes arm is attached to motor A of MC "ARM_MOTOR" - while True: - if Gamepad.get_value("a_button"): - Robot.set_value(ARM_MOTOR, "velocity_a", 0.5) - Robot.sleep(1) - Robot.set_value(ARM_MOTOR, "velocity_a", -0.5) - Robot.sleep(1) + Robot.set_value(ARM_MOTOR, "velocity_a", 0.5) + Robot.sleep(1) + Robot.set_value(ARM_MOTOR, "velocity_a", -0.5) + Robot.sleep(1) ​ def teleop_setup(): # starts the arm_movement subroutine in parallel to the main thread @@ -201,8 +192,13 @@ Returns a boolean value (`True` or `False`) for whether or not the specified fun `function_name`: the name of a function defined by the student that may or may not have been run using Robot.run +an example use of this would be if a student would like to know if a function is currently running via `Robot.run()`. + +```py +``` + ## `Robot.sleep(seconds)` @@ -211,7 +207,30 @@ Pauses the execution of the current function for the specified number of `second `seconds`: the number of `seconds` to pause the execution of the current function for. It should be emphasized that calling `Robot.sleep` in one function does not cause any other function that is being run by `Robot.run()` or the main loop function to pause. Only the instance of the function that is executing the call to `Robot.sleep` will pause execution. It is highly recommended to not use this function in the setup functions or main loop functions--only in functions executed by `Robot.run()`. +a great place to use `Robot.sleep()` would be to make a robot go to a specific spot using set motor velocities and ammount of time each function should run. +[//]: <> (could go further and say that `Robot.sleep()` combined with encoder ticks per revolution could allow you to specify a distance your robot could go) + +```py +MOTOR_ID = "INSERT MOTOR_ID HERE" + +def autonomous_setup(): + print("Autonomous mode has started!") + robot.run(autonomous_actions) #runs the autonomous_actions function in parallel to autonomous main + +def autonomous_main(): + pass + +def autonomous_actions(): + print("Action 1") #action one sets the motor velocites to 1 + Robot.set_value(MOTOR_ID, "velocity_b", 1.0) + Robot.set_value(MOTOR_ID, "velocity_a", 1.0) + Robot.sleep(1.0) #holds the function for one second before running the next lines + print("Action 2") #the following code sets the motor velocities to 0 + Robot.set_value(KOALA_BEAR, "velocity_b", 0) + Robot.set_value(KOALA_BEAR, "velocity_a", 0) + +``` # Gamepad Class The purpose of the gamepad class is to provide students with an easy way to control their robots. The gamepad class consists of one function getting any value sent from the student's controller. From 55e7a91f0118933f769ce00efa12dc3caeffb5c3 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Mon, 28 Aug 2023 18:02:24 -0700 Subject: [PATCH 03/12] [DOCS] edits to mkdocs.yml --- docs/mkdocs.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 09657cca..7a639ffb 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -1,10 +1,18 @@ -site_name: MkLorum +site_name: Pioneers in Engineering Documentation site_url: https://example.com/ +site_author: Ian Leung nav: - - Home: index.md - - About: about.md - - Student API: api.md - - Devices: device.md - - Device Get: device_get.md - - Device Set: device_set.md -theme: readthedocs \ No newline at end of file + - Home: 'index.md' + #- Building Your First Robot: + #- Base Kit Manual: 'https://docs.google.com/presentation/d/1kOey75pST0KuZBpdi2XSr_sBCPJOZlzW_mR5YUjE6n4/edit#slide=id.g11867c812eb_0_0' + #- Software: + #- Dawn Tutorial: 'https://pioneers.berkeley.edu/competition/SoftwareHub/QuickstartGuide/' + #- Quickstart Guide: 'https://pioneers.berkeley.edu/competition/SoftwareHub/QuickstartGuide/' + - API Refrence: 'api.md' + - Devices: + - Devices: 'device.md' + - Device Get: 'device_get.md' + - Device Set: 'device_set.md' + +theme: readthedocs +#to start this server cd into docs and use `mkdocs serve` \ No newline at end of file From 415fb940f53dd42008a3830b9fae6b85bd3c3595 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Mon, 28 Aug 2023 18:58:41 -0700 Subject: [PATCH 04/12] [DOCS] updates api.md modifies some lines in the api.md part of the docs --- docs/docs/api.md | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/docs/docs/api.md b/docs/docs/api.md index 14512ca8..002367df 100644 --- a/docs/docs/api.md +++ b/docs/docs/api.md @@ -15,9 +15,8 @@ for more infomation refer to the Student API section of the [Runtime Wiki](https * [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) * [`Robot.is_running(function_name)`](#robotis_runningfunction_name) * [`Robot.sleep(seconds)`](#robotsleepseconds) -* [`Gamepad` Class](#gamepad-class) +* [Input Classes](#input-classes) * [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) - * [`Keyboard` Class](#keyboard-class) * [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) # Run Mode @@ -77,14 +76,12 @@ def autonomous_setup(): #code segment run before the autonomous_main() function The robot class holds all methods for interacting with various arduino devices connected to a student’s robot. These devices include servos, motors, and sensors. ## `Robot.get_value(device_id, param)` -The get_value function returns the current value of a specified param of the device with the specified device_id. +The get_value function returns the current value of a specified `param` of the device with the specified device_id. * `device_id`: the ID that specifies which PiE device will be read -* `param`: identifies which parameter on the specified PiE device will be read. Possible param values depend on the specified device. Find a list of params for each device on the lowcar devices page +* `param`: identifies which parameter on the specified PiE device will be read. Possible param values depend on the specified device. Find a list of params for each device on the device get page -The function is useful for checking the current state of devices while driving. For example, getting the current state of the limit switch using its device_id and the param “switch0” will return the value True when pressed down and False if not. - -For more examples and devices refer to the devices page in the reference +The function is useful for checking the current state of devices. For example, getting the current state of the limit switch using its device_id and the param “switch0” will return the value True when pressed down and False if not. ```py #first segment of code ran in the teleop process @@ -106,12 +103,13 @@ def teleop_main(): pass ``` +For more examples and devices refer to the devices page in the reference ## `Robot.set_value(device_id, param, value)` The `set_value` function sets a specified value to a device’s parameter -* `device_id` string: the ID that specifies which PiE device will have its parameter set +* `device_id`: the ID that specifies which PiE device will have its parameter set * `param`: determines which parameter should be set. The parameters depend on the specified Lowcar device and can be found at INCLUDE LINK TO LOWCAR DEVICE PAGE * `value` - the value to set the parameter to @@ -140,7 +138,7 @@ def teleop_main(): ``` ## `Robot.run(function_name, args)` -Executes another function with the given args passed into the robot.run function. The `function_name` is run both at the same time and independently of any following code in the stack. +The `Robot.run()` runs another function, passing the `args` fed into the function. The `function_name` is run in parallel to any other code run following the `Robot.run()` function. * `function_name`: the name of a function in the student code which will be run simultaneously with the main loop @@ -188,14 +186,24 @@ def teleop_main(): ## `Robot.is_running(function_name)` -Returns a boolean value (`True` or `False`) for whether or not the specified function is still running. +The `Robot.is_running()` function returns a boolean value (`True` or `False`) for whether or not the specified function is still running. -`function_name`: the name of a function defined by the student that may or may not have been run using Robot.run +`function_name`: the name of a function defined by the student. If run through `Robot.run()` it will be the same inputted `function_name` -an example use of this would be if a student would like to know if a function is currently running via `Robot.run()`. +An example usage of this would be to wait for a `Robot.run()` process to finish before allowing user input for another process. ```py +def robot_actions(): + #series of actions from the Robot.set_value(). + +def teleop_setup(): + pass + +def teleop_main(): + if Gamepad.get_value(button_a) && !Robot.is_running(robot_actions): #if the button A is pressed down and robot_actions are not running. Then the robot will be able to run robot_actions again. Will not run if the button A is not pressed or if robot_actions is running + Robot.run(robot_actions) + ``` @@ -232,11 +240,11 @@ def autonomous_actions(): ``` -# Gamepad Class -The purpose of the gamepad class is to provide students with an easy way to control their robots. The gamepad class consists of one function getting any value sent from the student's controller. +# Input Classes +The input classes are both of the input classes that can only be run durring the teleoperated game phase. These two classes allow a student to recieve a booliean value for whether or not a button is pressed down or not. Most students will use these classes to ## `Gamepad.get_value(input)` -returns the state of a button or joystick from a connected gamepad +The `Gamepad` class recieves input for when there is a change to a controller. This class is only usable durring the `def teleop_main():` process. `input`: identifies which button or joystick will be returned. This function is useful for checking the state of a button or joystick @@ -276,3 +284,5 @@ The possible joystick inputs are: Note that the joysticks function differently from the button inputs. Rather then returning a Boolean `[True or False]`, they return a floating point value ranging from `-1.0 `and` 1.0` (inclusive) +## `Keyboard.get_value(input)` +The `Keyboard` class allows for user input to be collected from a keyboard input. Like the `Gamepad` class, it is only usable durring the teleop game phase. \ No newline at end of file From 862a74bd39d99e45eda3e73b62b53359923ee467 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Sun, 10 Sep 2023 00:23:27 -0700 Subject: [PATCH 05/12] [DOCS] modifications in commited files --- docs/docs/about.md | 65 ----------------------------------- docs/docs/api.md | 53 +++++++++++++++++----------- docs/docs/dawn_quickstart.md | 32 +++++++++++++++++ docs/docs/image-1.png | Bin 0 -> 57733 bytes docs/docs/image.png | Bin 0 -> 42601 bytes 5 files changed, 64 insertions(+), 86 deletions(-) delete mode 100644 docs/docs/about.md create mode 100644 docs/docs/dawn_quickstart.md create mode 100644 docs/docs/image-1.png create mode 100644 docs/docs/image.png diff --git a/docs/docs/about.md b/docs/docs/about.md deleted file mode 100644 index 350546b5..00000000 --- a/docs/docs/about.md +++ /dev/null @@ -1,65 +0,0 @@ -# Harenas more - -## Summa ventorumque magno non viva Palilibus videri - -Lorem markdownum uterum, amplecti poenamque aethera aliquid, nec tabellae honor -quod tinguamus eundi praesepibus nulla! Rursusque victa procubuit unda, dare -mansura frugum. Ad studeat cedentique nostra. Fine novis illa tamen en revulsum -adcubuere meritis, vetustas super totiens omnia. Obversus iubet natura nec -vincula cohaesit ante ius mea est **faciles** sine, forsitan ne cuspide. - -- Tantaque adsensere silvas foventque Sisyphon est Aeeta -- Troum Philomela carissime artus Limyren mea dicta -- Thalamoque latis -- Lamentabile videam -- Induco et aequore sus -- Neque in posset quaterque incinctus nosces - -## Sed enim - -Fieri nivea pactus voluptas ut enim qui saxo, medio est, Rhesi inspirantque -sanguine agnae ibi ferret quae. Nostro **oneratos Althaea** inponis -anguiferumque donec arbor tempore *esse* lente puellis. Tempora iterum tacitos; -temptat Veneris linoque ferrumque *corpore*. - -Nec mutati arte iuvenisque ramis, *ea alis* tegat omne sanguine! Quia oculos: -ubi ventos, Antissa Tyrioque visus fuga sequentis gemmae. **Ab** non natae et -iuvenem modis **furiale habet** hunc quaeque fuit vincula tuus luget sis. - -- Manus oscula animi -- Ortas ede commisit luctu -- Famulae sum -- Mihi lingua -- Almo notavi nam bibuntur - -## Ceu veteres - -Reiectura ministerio ac Iunone moenia dixit properata arcet animis, deserere -illic; ore ait inclinat. Adhuc India caespite bibit ulciscor? Eumque cum spolia -ubi, stimulosque exercet deposuitque suo, et proxima fetibus dixit lecto? Domito -totaque si sciet non, habes. Inbutum fine. - - if (graphicVisualGps != -3 * eps) { - dTextBeta = netbios_circuit.cellHdv(artificialReadmeMaximize, type); - wizardSla(trackball_bar, whitelistLcdSecondary + oemFlowchart, 4); - sms = upload + systray_oop_server; - } else { - protocol.address_autoresponder(winsHfs.mamp(login, pinterest_wimax, 1), - fileLanguage + gps); - defaultEmulation += registry; - } - wiredFlowchart(bespokeGraphic / 6, character); - rt_cursor_recursive.gps_integrated_dvd -= thumbnailBacksideHoneypot( - box_ccd.inkjet_online_hacker(3 + cpmDonationwareWiki, gpuDuplex), - bit_exploit, defragmentCloud + 1); - ftp_optical_gnu(5 + box_petabyte); - backupShellDfs.mmsModel /= web * outboxPpmDirectory; - -[Quidem ora praedictaque](http://desere.io/aut-venit.html) iacuere cecidere -valuisse, humum, denique. Forte atris canna, sanguine! Calculus est tua tellus, -terraque trementes igitur Perseia auctor. - -Ungula non delapsam fecit. Sinitis stantem, et nervis petitur contraxit ostendit -ad mihi. Cytoriaco artesque meliora, nepotis studio. Montibus ire fert ille -temptabat herbis. Mitia inania: nec dic gentes operi: **duce** digna adverso -quas, cum erat cervicibus verbis equina. diff --git a/docs/docs/api.md b/docs/docs/api.md index 002367df..4f57cc62 100644 --- a/docs/docs/api.md +++ b/docs/docs/api.md @@ -157,10 +157,11 @@ DRIVE_MOTOR = "INSERT MOTOR_ID HERE" def arm_movement(): # moves arm up for 1 second and then moves it down for 1 second # assumes arm is attached to motor A of MC "ARM_MOTOR" - Robot.set_value(ARM_MOTOR, "velocity_a", 0.5) - Robot.sleep(1) - Robot.set_value(ARM_MOTOR, "velocity_a", -0.5) - Robot.sleep(1) + if(Gamepad.get_value("button_a")): + Robot.set_value(ARM_MOTOR, "velocity_a", 0.5) + Robot.sleep(1) + Robot.set_value(ARM_MOTOR, "velocity_a", -0.5) + Robot.sleep(1) ​ def teleop_setup(): # starts the arm_movement subroutine in parallel to the main thread @@ -168,19 +169,9 @@ def teleop_setup(): pass ​ def teleop_main(): - # normal tank drive student code - left_stick_val = Gamepad.get_value("joystick_left_y") - right_stick_val = Gamepad.get_value("joystick_right_y") - - if abs(left_stick_val) > 0.1: - Robot.set_value(DRIVE_MOTOR, "velocity_a", left_stick_val) - else: - Robot.set_value(DRIVE_MOTOR, "velocity_a", 0) - - if abs(right_stick_val) > 0.1: - Robot.set_value(DRIVE_MOTOR, "velocity_b", right_stick_val) - else: - Robot.set_value(DRIVE_MOTOR, "velocity_b", 0) + # put your teleop code here and it will run along side the arm_movement thread + if(Gamepad.get_value("button_b")): + Robot.set_value(DRIVE_MOTOR, "velocity_a", 1) ``` @@ -244,7 +235,7 @@ def autonomous_actions(): The input classes are both of the input classes that can only be run durring the teleoperated game phase. These two classes allow a student to recieve a booliean value for whether or not a button is pressed down or not. Most students will use these classes to ## `Gamepad.get_value(input)` -The `Gamepad` class recieves input for when there is a change to a controller. This class is only usable durring the `def teleop_main():` process. +The `Gamepad` class recieves input for when there is a change to a controller. This class is only usable durring the teleop phase. `input`: identifies which button or joystick will be returned. This function is useful for checking the state of a button or joystick @@ -252,8 +243,9 @@ For example, if you wanted to print `"hello world"` when the `"button_a"` is pre ```py #segment of code will print "hello world" into the console when button_a is pressed -if Gamepad.get_value("button_a"): - print("hello world") +def teleop_main(): + if Gamepad.get_value("button_a"): + print("hello world") ``` This function is essential for controlling your robot with the gamepad. @@ -285,4 +277,23 @@ The possible joystick inputs are: Note that the joysticks function differently from the button inputs. Rather then returning a Boolean `[True or False]`, they return a floating point value ranging from `-1.0 `and` 1.0` (inclusive) ## `Keyboard.get_value(input)` -The `Keyboard` class allows for user input to be collected from a keyboard input. Like the `Gamepad` class, it is only usable durring the teleop game phase. \ No newline at end of file +The `Keyboard` class allows a student to recieve keyboard input. Like the `Gamepad` class, it is only usable durring the teleop game phase. + +`input`: identifies which key is being read. When pressed the `get_value` will return a `True` boolean and `False` when not. + +possible keyboard inputs are: +* The letters on the keyboard, lowercase and no spaces `"a"`-`"z"` +* The numbers on the keyboard, no spaces `"0"`-`"9"` +* The punctuation keys `","`, `"."`, `"/"`, `";"`, `"'"`, `"["`, `"]"` +* The four arrow keys `"left_arrow"`, `"right_arrow"`, `"up_arrow"`, `"down_arrow"` + +For example, if you wanted to print `"hello world"` when the `"w"` is pressed and false when it isn't you would use the function as a condition in an if statement + +```py +#segment of code will print "hello world" into the console when the w key is pressed +def teleop_main(): + if Keyboard.get_value("w"): + print("hello world") + + +``` \ No newline at end of file diff --git a/docs/docs/dawn_quickstart.md b/docs/docs/dawn_quickstart.md new file mode 100644 index 00000000..7413d05b --- /dev/null +++ b/docs/docs/dawn_quickstart.md @@ -0,0 +1,32 @@ +# Dawn Tutorial +In this tutorial you will install dawn and create your first student code file using the Student API. + +This tutorial is intended for beginners to the Student API and it's functions. + +# Getting Started + +## Installing Dawn + +To install Dawn, go to https://github.com/pioneers/dawn/releases/ and install the latest release for your coresponding operating system. + +## Windows + +After installing dawn-win32-x64.zip unzip the folder. On Windows, you can do this by right clicking on the ZIP file and selecting "Extract all." + + +Extracting the ZIP file will create a new folder. Open this folder and find the file "Dawn.exe" (Windows) click on it to start Dawn. + +![Dawn.exe](image.png) + + +## Linux + +## MacOS + +# Dawn Instructions + +After installing Dawn you will be presented with Dawn, as well as a interactive guide you can access by clicking on the "Tour button" + +![Dawn Starting guide](image-1.png) + +To go through the guide, click on the red button after pressing \ No newline at end of file diff --git a/docs/docs/image-1.png b/docs/docs/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4d29dc438c9a57336d3427d6ee9c127c590687 GIT binary patch literal 57733 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%0Av*pOeINYAkDW~4kJwx< z?)DvL8y76(dh0RLcz*{ibuVMwFLzixu&va8(wautX0uI&jn)t!EK7eZUi@sF$!Ncx zSm@ZdE*7^L9~r57zIVQ!nWJZS)vCy!2dUB0E;}K$Ta4I$NXv1w-Bd)8fv6#Pg?>O! zx*u^vCRa#FEG%MEk+|*GizhX1k^dZSazX&nebz49K(POtJ^C+Vy+Yc0aKyAVHjp#| zF#-i2=@2r;08K$*eB!f5Y0D`FDU*RLJAnmjeuPkNO@~HBB^er|6Pa)7S?~f#a~a0HEH!ZCrux zAt%pqT*1SwPg@orGTU32LUMyN2>KL6k!JC?(Lo&&RZS;OvuSiK^mNk~JJSt|EWc7S zkd3+|i^J_WWXm8Xi0x6M*L1f*cDI90kZfqvnJOfT-rLD!V> z_xcaBflR7l6BKaH4m{yxlzkn4)bOM~fsP7W^aT9&hBhmE$I+qu&L!HclkP(UKWQkSU76zFk?tr@Pl>Kbe|> zTF>1^EozyZQmW0g4Iu1!kos5nkrKQUwr;?5M)AfS91&qrr5j@2=1sHK0mDLsJ%P-6 zK32MNlQ3YpSZ-9ks83U=rv-lXiUBg0+b)m7E&(Svu<+;7WJNWXK}MXVaa$Y@5Gq_Z z`t;|teBta9R*lza$*b3Zp5$9XY72$O#5r5q3I3LQyQI2_#w}z}P|kEXtR(`)hnDx+ zi@#ctsUzV^B*x(C(N-+r+84G{giYcdO}xp-R5x`w-_1{Nfds^Ld%I%^Z(G%(_o5u% z|E27!g(|*bRZqIh3g7SHg27pQEa9?{uD<*JrKnTg*+0%CpGTZcsfV~`QubYO@u%6u zIz!yTn9G2?>hx(mhm1!e9izk#vyhP`ntZnEkbl`tj$yUuz#)EHDXwfs6C~%B`t2mb zm#+i1p~Sp4)m8^s@DSbE=r5;cn7ae)6vS*rx(VZtf#+51(5b~e-jIRs22LKPefFJe z&6FI)-OVK2Hqmuu#Gu4pgGCAwfxKtCYPdR9oPDs8xNi4ALsjIuJVs}HB>a%vzsC9F zFF0(!$LqyxkIDOpI+^-vNesHC#Q($mz=>PEZdGN2{K0+3!6&KT0BEk zTU4C9B|11*K3@PR4oCxVe@Si3_*&iU-_;?a2L2{l7-Yx-ca82j&OiQc`!jU<*`bVP zq{fqV+AQTH`K5`s_8A~!k`)+(`}0WJck_CzcsTUJM8?_n&pQCo=RbVEYSIH{{xaKU zD|28QP8$QV#phGN-+Nw2zw!NXZe@3j#;w3r1deZw(&Ox^`e~~Xy{0Q9W93wE`<-9p z)i$RyuU}v;L~da(6xy}vsiPzcTTAXWyx}Yw>*pPU5mhT64_qRU+wF?1t5O}^AWsBE zeZ-7EKA-DN0V<6Y6N0EkK{-%KeaT@-5F6;rC!(;Ci|pFQD^_wkNO#eveuafL30eVF zjvY@*_<2;O|1e4ux0Vr@v>3D=ovA;o6hgZ>s^kkiQnF%gtSlZ$FzF-mN`V9r#>ab85birWo|la1k90$$`1nH*27;yVUVd1_-WP~ ze_g2)7X41^SrRcX+aPI1ME38a?Xv^*Sg$|)athl_O^(`tWUrcsPS^$&U*v#irZuM& ziQ_hZ3z39i2iaGA*1}GFVM#cq5$gQKb$HKn`|$`H79h~`s}N!#6eBoK^g_!TduK~H zc0YRY>DAYsOiI{-Q1B{@$uoK+T$+SbR1t&OD7lRNRf`xvtPY%S`E>Go!NoKl!^ZTN zo9!xR?+LlMxcA8Lyzmod^mmGh~*R-D7l7f!lKQK5P8{Z_r)Lqg~l(D-}=m-ai)t6 z2!9)SYHWbjMMyZ1r9BdmT(u2%6pkDE$id$)ZBRIYE(J#-I#U8*`cq?qVYz$*w4UK2 zX`#8UOtrJz@>iWO*~rD`18@Dd+RuZ5?xC5Q--MVlxN5^UqA0lWEh7^}AO4<{GD5|# zo5TttxNrlDeT9uny_2<+ez}6HhgzEF0ak_CPhb{JCP&Yn81dt(uHQP8Bou!vR+4U* zsMKoxK*hqEG;);|KM9v*zp!o$>ezfs68k1X%Cj1s=*>j`UAAA9L|rKZ+cY(fyasne zGKE>(PZc}pB8k>peV?z(^0!RzvMkJYCd8c_$&oK=sT;$gZh+QEsuV!trvX(RE(l zFVB^{l0a#}USfNhUT=jC7~kB2kvyf>2qc7N@^vx5!zR`WHoG*z^Z7-a*vO5xmpbRx z?XH3(fd!j(FSN>_5i>rZ9}l;ctxdpQSYoo9j6ZsUoH_OBh(B3jHB+~E1&w%zf+U>` zB7G=p%OAg*gg~HR18e$r+UEw&DGl`}zx>tgygM7ZP43{}w_zrp(HhYpI{ zrKAo@-KIqlCMV37Iwlvq^LfHCVm8F87Y|&EAI%rXhW&hL<2nMZKp6(sHEF-?7MtVU z8N~u6i&5h5c@*U#eWM|A@)-km>@rW1T`*(&3DMoCVU$~~`{X)exEGl7TPKp1ZegO> z<%2#9%d!rj-md&bK|1y3I4v|Oey}x*_N>nxiK-_$JwPd7I=4r5R8{9_*D9BK^EKbl zWMN?HMnBqZ`}1G9K~NF+2Af#N@J8BIXw40S`k*U9R=f!OnWt)cn)F7Y{2eBS)q?3^ zi1!;sW?oYNX?nGmVFn_lD1*5Mg9wZd&1zZn&K0@JVGIXe$=%L4Dm zRpPtnIIEwHTBW0>Oqmoz?~T+p=;cJz=nW}fUnJ#M&nfx-+4rdQ=~}Z4tngvpv&Xfr zSnOa3#C6n7ZV3vjbc19!#Q`nD#;?i9SpF z1xVMexB({%B0|P^E;nq4NiJl$j$K~Tg%36O02 z$ylnFfzXGcM53yiuGv@ls*9D%-zFTpVw(&KLxq6;n}K(|pb%`u;XO|hzzfy%AWh=d zemwdulvalVVI#Fj26rg`imVp>ZgP4OMf>ox#9|_cEM{~%x^~3(M)q5a1^%wHTkXjA z3TN*t%0YkNEOq-OWg-ji0j;tM@~pcBlvz=&YRukx>#yhaaRFRMtNAl<6_M31L~irG<24iH={?k>kEs5S`(Gs& zwLsL{jng-K8Of7h8KALHFv6rc*#v3W@F?^vGJaMCDFfQ!M6Tdp1gAp6xai!<0&ET> ztpE!}xI4mUH)x~zYlFvljn0TtpMD4>9Gl|@Ewe&t)+>(nC<0-7!F`u&R&F1{_tL{F zw{v0CtfhTq2nWg>u2KQsFUhN+RapK-EgHH!br%r zGeYwWsO?DKYw!?gC)L`O|&7uDP1&O+~No{s!i3`$bm#_VSs8ESmLASF_RHVK3=gmqhf1O zwa6wT`@VQnaLv;_yEXY}^`)VqXccHo=tRd&c$~UC5Da!zVJJy#jLq)PkSAS>eI2?+ z>^i&_%7&@$Rp(q7)=r*|*tO0HhodRhArm>r7+#AEM!SjT(fxlZ^rsp%U`u9ChwrMc zxD9mXL@im>dG{+)Lzne~=_n@wDAgTXdEZacra=AiXVY5vWqg|^t4M|q5D^iA+Rl=C zHloDAh9VmGweaUS6`g;m1RYpkmYb25v_V<)ls^KrV$%G1k)e_oXgUaOpnLpCvhd$s z_!U6P90{|qC$6te{}f2D%;VdQ;_Jn`Ty1ih3>RePkWFEYfJqIUQ`!8GEX-=7TI7xz zWr5QUXt|)8{hH(3=aLPa)$yr)mUTJ`V!I0sxpVXy*zCn`(|<3gTshQBnMA^`DnS(; ze<(nfc|pXF^z6=1rGuX&98gJIJO_^CYJQw6{#Wly<^tocOO9jNi#cHyK&avP;~b~= z@ri^P9 zXzNQI-_50)ZJ}Y+MO+&sN|{fXjqlL*Dte&;>?PSm&*n_%dD50w{`>X z10q=4wVz};HyyBSd3V0^Dp^lOU(bFEZRJP$h)46(Ntcd{nZv*=~ z=MscZaCSkrULTM9)7-O32d(0HqF$DBRG#|A&N7S`!^u7KzPQVuYthfRb%yUBg~?E} zGCb@-fw>FxgzN+4ABY9+@ejnSwF&tTwAy;lb-ZQ~T$aPFtL%b|@~WrW?=N!K7!$72 z^&cu|4@`U+4Gej>L*coeG!dc}z7zbQ8Y$#|sGx=$HMUp3++k{h zbmbi5g9iG@KH;q#_N6~?MW3Jc3#!}(Qz#X}^?15h48a3F5OwNy^we3-w zD`8rnVpHz>I$cUfwVtYe%6Fpj%^4SAY|S&fZ5GJA<_Pryi#rK}M`8`uzHIQ(%)25& zZ#_|m+jgH%PBSxiFGPBByEX7<#Aw%ki z*FK|3B{Zn84F`SGmw?CBdxX7vEplJXHt;!wl1%9re&SFYhl}~S-8V9!-8P$yH0i@E zTxX5b^*^E@7X<-xo8lNrKY054Q)-qs;w*=7SWZaGabkPVvBZ2yN!XqBP+Ls1*QSD2 z?J)+Q`2&mzfvgTv$D9zMv{rwY(dMegn*q%={XL%E8;Sg2J4Ur!QjX zeK(3I=U#Jwv>d6f+|Y$!7i=TapSb;ePtmVtv`A#fYqOwsGKqRl`3Y`NEn9iTApbh= z6aY2XlO|FRaSM?7B0&t_B#=;1$0A1s!2?)Sf~nB=+)#)C{>QBdw0J6WW{vuyXOlg> zGjp(x0$=UR)numd{l}Z!MPkR!=Qo&cf|({Q5v%=y2mc95OEj*KzHp zK6EQn?N5ACtmJf0qKHi>*?KO=7kAULA!7ceI;@3np#J%};3_lQ2RJ7+t@qin)_-pI z&ac>+mi-BPYI$t;#O{uog7xW|9|M5KS|JX>;f6m?4Z%mnliK<(TlUOd4tnqc`C{$j^GvD7S(`!C4UHQUyOs8z^O<5w=Y9z(*6{2-nSo83Gc-=Z`Yg%g zaRY_-)}K^*PuvI&+Y(9azymxK1r*D)r*Et7di4Anw4bT#m+7nEik*LFov!Je-3OqFRw21-i4aWF@f^Bb5MRROJdiC^A zHnFBnEQV0yCf`Fmi`&_%Cjt^mJU&4w;hHvF%6CC_h^2gBuo>7*6?bDmEqek9tu+Ue z9C$Aty!*AF-%6OPowzxx>E&Zwt$rS=Ifp!t$ZR{hy`i<*2F+M6xHR5;KR|&hnpfRg zwRExb8c<6@&ObRp@Ra5(Z12r0OkrLvZ+=(pKdjMOE_ts3yR8eT7C&8l)icyd_po=p z#(bW(rKN7KgU`AJ514u0Sv@n7L$W$eFq8cPK4{YBXAHpG6gv39XPF%LX8sb9sL zu1hXysG6IdWEr`66HDTP+~EE;u4j# zjPi4=%ic{*uC`Yg_oe|g#&U|H_tl|OM3a+{+WncN`zAl~S|QAXhs~Kxn@CMN+3aln z_64nxN)+EHxU;`g2_e>8CzV;JXf9k6U1u6P?#A#s?+_I16)>}H4!v&zvvE5ycg-L_ zL>dZ@g5$S(Um8^2W7>v}hd|+~fa5LL9uL&m0WZE>FNNd%mqw72Bk6_DQL1b^HNrJg zn*@wjnZddsY9pbBHo;G)Tk;#7V`ON7ochT23G~8|%KN7cAt>jBk2t%gKL*qD&r+5t zzcNN40%?fmt)F|xN~_=C^OZt0@~;JE-f7EjVw3%3iy2e?L}Lk?Yfs>Jv@rlRH$WHe zavHZBiZDJTDoLK_s=13a;lc+D!@2ScFK(0Pla%$8ubhrZ7va&#=HtM_60jg73xu;d z>=kre;B@DDB$cRen9thzl|c>CKJ*Qu#PCWN5O@M{tfAJ{=y09h<0mu#mM8GrisPLw z;gs0&;uM(Ai|0m=Zd9v;XD3b_Mujea_6A8kH7{>~I^?Eg7 zIgKiAhFgW7yagJayJ^)X03&!&eyt@G!IoCW8|Ft>n`LMFnGdyR zhXszsCQ+Q++4q%dbPxDSQjYBJnm_$|6IR>6F6IB8a&E!A?d?@ix23)Z62{8igQ~*1|F!kiaW&rHm>PqJ5W8;&SQ6#db=zt5P zn|&T^Ltfn7VoI}-w_d7z0)ji}q54{1!D8pR+tv1JM6*=wPqKd>>8c>Io=$P1JrPuZJYCU3%qS3pW;Cti2nc zlkf(NNC!6)ip$PyXXXb7KO<~FyDypt4*6(_jW<(ob9?LB_j$$Q^*(3SqM#KKD(e(x z@lS=LuIN z3U?ew0wo?N=5Krg1YXxB4_b0|;!9Fkmz2C~rqtE!_ym0|gBdL?IGBd8Zx6QiYiCTW zUS2j0(SjeYglN^SLUBqX<2jj%n|G-RD{<+k%?3*s?a0_jHXTBIjmJ;RmjtIlmz}st zHG=maw_9BNPBTYLToZyHp(x`4_MUnO4|oLrpGIXP0T2 z)W%8bsvr&N;t{@Q2v&*Xn+!Ie9^M(Ks--H!iQ;BknPuD1Cc@(}NEqp~!`7#pMIeQS zQ9*OXDi*s8{7irE+c(~vF&;prC#?`8?;zCMsI;zZW@6WisngiTVQUG}E{_ADl667m zamV;uMs<%1yStd-;&*6t^q`<9h{{cDcEiK-fs@l6L(U2iOX%7mYq%Ca>(!V(IuVSS zoGpHKHDaPbg;AZI{SkJzKo+g7mvKu>Q&6}zNpM#t;C>M1lX^(&Dz(vxCUV8pK8m$` zcQY6}rreuC6^3&illLN|js>iY2{E((Ow&`LKeU(}5H4G^4s*xWRrnJ}jC-?HyfVW5 z-6w58plS0p-rKH$6FZ~6%#aB_(1^%_ZIGSOt(5OK-|2#Z^u>0w|3tWzIEvfUYlGEE zQJERa0+=1Ii=PX+!!GOk*QMl?2}k0?M<34c$e6`iT-k2bQ%;&ZFyjLey{T8k(axSd z^Y!5gEiVdRBj4>ap6%=&_H&>=vlUodJMRL3g<$%yvOZN!L9;7Wx)fE2UyVsqN0t~D zfPft`riQeTGbCy$m6RptJLGmu{nc*}tV$8Yr3P=_%e(vHI!gCcvQ;aGzHfHph5R{o zhA|B-0X)N0=P2k+zjK%WE#Be!_m{-(v54QBrB4X}G)#AOmcLE+u1#l1s*zYo_b8Mu2*|Jr+@<*U5)5ySv!!H32_L8Jabv0p3;eNpJM3?hH5 z^=8m`G0}3Qz<6T9GU&}&Jj0AwTju4t5gq7J4Pmgk zId)2iSrY1&SP=Zn^HP~+WeeWQ>ROPEpe|pH0{@|Z;rD(1pCTCy+@l?%kDVK~6S4)I zKB>YRgl_&F2RKpLIFM4%;Lw{m$gO1oQaE^FA3^-a;Ro1p55YbL25z!OZcgYw2@Hav zl~)aSd4C@_5Xl8o|8V}Ro{98h_EWdr-lOmUemVSjz-Jw4+AJltCJ{CnLsh?zdGlGd zU2{%pJg8{*TWuCRXHpIHn&30_%$qAyQD^RZV1s%v^upnx$oBss*Wuru^uI+xRE&sJ zoje==)Nw1f3~OF`;G}mh-n^kl^Y*1i9b*9PrIYPk>%mqfk?_ArKcnJiX7Z`)* zcX)NYDZgExpfRre_f!0@2fo-5u!V=&pr9ki*KO|JM>{oM{vA`n-IXkqWQERAtmQuz zPhFzLgkypvf1gY-6{P>lMbI0;mZh(?(6*bXoTn-{hpRxmNV6|_P6J>%!p7f@ z1ZktyHh1r#P5(K!dHrQc$L9eA?DzkOB{@tLF~XuC8({NbvO{myFgJMOLW6^D9fkt( z|B+GxHY%7p%{I5U{fLQ)DdBJ@YB7dyxiuBIk|~QP*%!ac-?}xVxU;*PsiwEJy?q|u zbOhW%WO5wH<`B|)675#<;&(6lpW5PoZms{P{vyvG=qvspVGCoF2q+~eP2*7i{<*-9 zxWEj(G2fLXSEU5{ia`m84;Z!65cxl~wQapW;VMYR2C?-2#6HWeAOBxdVvw?j`6Th= z^YHt+*~%U-ewE^0cYx*E+-zKy-EO-J0LA&o+s-{=mx|cB!>% zE=pDkT4fvNY-oTd{LS_q^!@#Wl~{$9_<>?Q!4ReZ@EF5&4+EInq|BUZ#X=C)4G+ps z#ykI8-%7`%Xqo=rO`G>|^*dxu-0{eQ50m0MO0zw`1IZ)XmKx98HrSx9Ugl~33`cQ+3{!azvb`kxeo_Lu!X?C;(w%)|0A$y?KuVjvj5s7e7I_{ z{6BMSwt&uN@OS7?{H0L(yezpT@{X_at)ZM_UksINJ^vZUg$BU)fmne;?p)Ky67p8C zB_2=|LY3|Et)TZec4qa!OI3jfZ8bkTtLilkZcIJ+FoWv~A~yNv?6t#Ecdp;_Tvt2( zWv6PkLMK=Q&BFqV+d-(%GV%zo%l}8)n}}H>spMl_Jz#6hc`;NXi32jQ1S(@_XO+IiBNr|9SuDI2>2A zUUOaN`Tc&rpM~CS&iV?*Nx^Jk_Q3VSOM7!|Whl(Veys(c`Sy4o#ijQ_04?CQTKPnA?jGjfFeK|GW)Ed3A6tnXZ#n>=`qb4mJrT;jRyvF0}|M=d3izyg(r*a*L z0{*i@Cb}2o*5X)8U`yn;zn8#{rvNx>+y+38JG5_Vt@&9jeyE8b48#}A2<{P95MA{+hT!D_+Cd<$y1PO*Oy#a z{zsI$oUD<7%nys|o_ClJYMTzM`A-c~kTJm6P`5?_)e*pQ;na(}cow*MTpqr|9|I9k z`k4f=5~BS6B3G0DnyX<9u@em}e+_^v(+Ssirv`YNMFH)&dF31rG?@l6aNN#AFtsv) zOF`ZRpoK8Uzw=92N1LY+00OmTk_!_)!q8Kw(l=+^Hc7fv|?8?@r2V$vC!LtP@%Q4j%IH zU^i|9wxvIc9DPew$6;V&HU@51q_Jw{|4P37_|a!zQ@Gv+$g~(wl*ZZ&Dw$Px|E>vi`QJS)(CPe5Wh=Y)0t9r9u zX-_)9y98OpoAE1Fo4k3TQD+g`RszKfK^gIxHmL-HT`|ik0?hhuCdpw;z{EM?n6yoM ztxeX$$f51*Rg- z10_{l+nbx!9>8BU4zM)iKHqwyL-%qp7~k>7oi2rVybCg&$LHHsD610;}9V zPZaLh)N9~8M$QLwP~%-pC6dYW^zJ7_?FNCTft54TEW0wX@VMg52O5L1aW|mrE~wtc z(`$%MLyJe&*rIH%ZbQ~Uk%fGaKAx$9k&{&MpDM}=CooVxLv_vj-?0kn1bQ)AflQntZ)U{~gt*4z7t7zVs!&%{eXfOAfnOV7w9KhuE& zXb@F!cF5ef4v;d9ho;v}Ki&8v%k$d{*0@F%KJoq5(8HJ0ffn+L6T`6_%bUIngC>Wo zyk_JEx^{@=DvQ4Tg7^1u9#P!Qg~+@}LN)lU4PN2mda}ARjXlmlp|3!4D)S*27>fYSY`DP)?Iqwn>ugt=diiQ2Vh1u4c_gqN#QM*6>p85S+DF*=E44&=) z3fKXl;Jj!mVW!}g&9_wzc-vfGXMbM0di4Rqyi!MKvEN4Rsb9&p^_$YpFf)@}8`PWQ zR*4dg*>9-87tEoDg4CJ68#mH{)!B*T^%AV)i6 z^X1|5{R4G=lp%>7!K;srUQczV>a)CVk>*86fP$#vZO529w{y`Fa5&KJZ3el;!+-zE zy1Mg>Ez_4&b8W5ri;F2qatp?4{`MHF1spWOjDC-W^=7%{A(Pbl*2++Bk@7&=^oWo_ zY3l?jKJ+)H*?DCZ7i?KWjR zEdGs8ibYLs_x2sbyA3{m=^$**parx>DV37yp3W@#1Izo;sZX7P23>OmLkr|dmLZ<& zU?q6x)=N$(JLYzmh^=Z`{6(AFW$_+FH0Zt`G^6h@ZR)SM5*;M&w?#Q%4RkkRv1Z?? zW)vqBdVk+AoP=N*i?g_fB!?~F6-l~s+UDDW$B$c;m~B?)mKhYXFvX3xaLIRjmrNw~ z^Ycl#y2p(nAeXQ^77m?vr}d6^NETawAOze%_m|Z*8+_^P_Fww(I}QPRktKf8L$ooZ zWAf`$h3oR`)CZeMJFY~>7b^fRNa&rG!EM!`8j=PIPZUmUQhWs*mi4zgd?%bBaJ#*g z0f2A?lqVIoS!4^MRiNltITYQVqyoVeSYI#|H;vL3TKa1N^$c7L8oY(Eu*myG?vhHt z`VQ1H^60T%J4BwJkrHC@X2|w{-EgJz+x8UME+0qO;@}hiViQi%qdx)*O(!I4RjqOu zPd3-OwS^FaY12w|R}igHcU4SuT+!~M#m&Z;_C(%#)(Bt6#;oY2*{p#c+xT+Y{p25ywR?8I{^Yf3{!OaDeC068uWiVqn=Nvz#Xw?PuhR& zgg$+?az+=|7*?oZ*Ttpu+Y?K{Rb@g_p|=j zx9ZXQjMQJk$b^CaQwxbFf6WBeFaH=3hS{*&fc%iOz0aCv7Z#F1=E=8j-)4Ho#>TD% zeDCUt@Fa8pcdb=%?2Cl4?DPIVb&o4763o9f`TyBl5_Ah4$^T>F2^O_LR)!1k$=nAx zQmj9g|FiR?kCbS$j)3Hy4Ob=4&i@=nOC5Ip{P$^~Lr{?!%GiAzFcrN){@WBZ^0FF9 z^Yy>Jq0QR8|2?E~mv#k^nE&PE{vQq)mqq5AO~3!j3*4OQi$S^=8(UZ=_MEEygh&0b z_p>>`+a3tAS@RAae!F`;6=i%Y0iv5Lhk94;G>v>=oaI5^4?I>XTMR zEqT9(x?2lJ0kvxDprTet#{!<_{C85=(|pb6VbdL4(E#+b4KyTpZU5v>ly^!C+L`nT zJZvoS&&y1Ff621Uv(?Ov5&^73SL1xg_r?CKYZ$DSgI&+iKuQ!P$+Votby!kU%BI0D zPy%nRKN>XgS(P*Q_%7nHXAjRVj1lRwTedN2K*BO+ZZQ&A{|-18h6AOKG`An{N~QbH zxROBs(1)-T2I_o35wLYrFCf>0=(T9D|C=DR==R^q&Rg0$0n#2MBFpOI(TEDz%W zthv4gWK6f7GQrv_!6$89f`2s!5<*sHqa0RT>)9OPf<9YaSy%(oV|x&Wvuk$CnxKdO zZgooYt62gu91c?g9!Yq=LNu@erW$KA{8V`WDKQQL80oN1AJrYyaJ#?fO1`-!%l-_+ z8p$q#cf8z^60I$aY`bQplHO-H_jxkNgQasahtL-OQ#t+eTblF|vKm_;22$JfHA550 z^MOm(wD9!Q8a45^%m<6q+L~T+xy$OaOEx9__YUImc#Yv~mA~~>6V3VQmT*B;HN3Y# z@|^{By!Yqk{AN_Mu(_4Gz^n8%hlO(ffedS2fHXS2cmaHqtw1Bg#ciNEp!cP7AE?Ov zWE1mhUG}&9-Rnec^50?q7@CYjSpe=@;$qcd#e(a_pv&+A^D#Qm;N(8|l;X2AxGTar zh_E~#cK8pyV2<_kc0b=aZcCUIwpdaSXY}Jxk?uTx9|}SI$;6F6rfYDrz)i2Fk17(!+YxlpfTBx9)(+*B7ySP`1Kiil)hg(c=6)NTRV^-dX zjn>(yiSR=+@_nEg-c{a(aicrU{Ye9pJ7gl~)8hk#&BCn?_C;{c=JaMQ#<1LK8>u`&wM_N2J(IoIb(I@Y z(^L~n9H-h;@_l0+4Fs@>vQFm#kDO#L`he$_WicQgr4GR)*sW*r9Ff!Mx`NLR#7oU6 zSCltb_zuHz?Fv8HFfwD{kFekBaQsqc1y+(MW}g+93Y;1CTP(xt?j$o{8#>O!l9y#} zeR@*bRtnS1x){*Y8jG-#F~2gbPr2Z}IJS{P_L)|ib6guSV)oT0O7g1msbVxdYDEA6 zIZgpwJc{0(0fyC(xW>sWWXTh;Xk?3%Tf+V(M zaR<;Nt~l;UNOs5NZv}DO0xq~kB^kS!qLroL;4F8tCAnJTxI1fxOn8P0&Lvg5kH2|W zdx>4hU#G;e!vzU(eu$jij>v+f+jvn_{q#Wtnw80A!N0inz~@N5c&vmH6wmiiKb3Uh zc7l{3{E#nnxM407BFShq$sX#aMJhq8wY%1{liP+@S{?V=2hHY9R0DY7=$}tOJe#%q zi%B9iX$l*!IQkI9swf-l8Q)@@odoRHD?Jn#&LhPbdl|g7Cgc%TO>BDHW&ya_x9E4N zx=}cZj<;4#un0i)S?T9x&$QhRs92ORJrLD_bp6oh)Ttv`I_ATb65*~=U!_JkdL8?@ zt_l`#D1fJ?8U3Ws(I43&Ks~)))6j5~#q3}-*nh54^L4>j&j<5!emtaS8Z55)B4 zbTw@inz6C5Rak)xm5ZQf^^Vix^pzBd9V{`@Q>x4}%jaJ`qUC%Umoz!v7CRl6>;a3@ z!s{%+pEQJ&EFa`c$)9Cp4F8W+)a-y zcxjy$-b7UA+U~Z?JPraLAHMJroi!=DeM&aTOqBNw&tMl2beEMcPF}bjqt#*YbM5(n z+3?|12W+|}x&JN(1UKW!M^EC_n%is`6_xcWV zi6jpuNszMs^os}OX@miUux35o8LMv-IDL!0xw=D0 znlpnS^#f>uH(_B-g>^eMbL%xI-E;JbnolbayEt9lfr>XquWZEzMGeS zqJ|=ju3w*dK>Pjvj_A(5-QUXnB>!cw(maCRC{NE-ajKx`GjeU-x=)T&c^em6B|b$z zK`B+P)5=4w7>hr%5_RTgKH^Rt(Kc4fLyu<%^FZwmV1-GVS_3x!p_OBL*C)?IbaGwsTj z?>*}Q^}Y_{q~un*u%uP6H{kuHWc8HQ`jpM)eTyYOb091}V4up9hdQ)xaEV&klsv!5 zSa;DG=qdF*B1a5Uc~KUApBzpgw>cGRG-d6l|62IuHQu118?TmnTG{6TbHh9T-4>#Z zoL-QjdEtCK9eBovZ`qcmsCwU*`wK9!^f6nG3HDt3i`k8wSFQZ&34Bi>b8K{%Idlb1 zp?6CXP_t}KIUpd6Q|g5J^nR3gzN$JZ75^tHr!zsUFT1M@37ucF2-MVcDC9C#UhxG8 z%;HA}&9L{yvtPDfuW$Gk=W|6PK2)GA2$85^{V$6|FEi!qRwEkSRu2yEyb)frHNwmkMm{P|~m)&engQQmO(wme#mGgE0c&BqgRhkw;v zfRmnVRk(|ZEk_?N%?8T^EE>toH(!BOD+y{qY7EY2-8Md#{Y&pG3sa0tI#SrD zRe9fn*NTBlst8@1)ir5f;1eilY?LO@-9>YI7XSaq^=wHLlcWnB5zRE{#D?1eu z(>vc=0U+Vj#zqEg^U@e|hW{7H*9Mm!JUixhS$;$aCzq#aVUI(kYcOdVK zks4K}egC|!7^5jpQ!f-s#B^3+xJB5uKL1ui&Y=_0s>J31E|Y;GT|un(^=T_Y<%E&tvpY zv`^Hskn?9#d`C;Pm0=`NlbkM}xHIy~fV8)UHK5ZyI6*-t(!pk~~eqPkGHTo8Fi4OOD^*lW%~m~Z ztsMdBI_FL=0-Bh^l@(CGSC=d?z3x~^byY25Iu^ZE2&<>}Zqr9)tKr1LxaURrsqrco zM}|QonY=Uj7m6}xUr!SZx^x8(sdC7`ThcO$Xlh&M?>a<;WGw(?^hdBsT@|iV0kSXP zrH!S>czyoNRP8t;W8X4f3kV3#1JhV!*O=&L7<{xg*F$_DW<$WUE3IzjGkvmN=hKbe zI!iNWT-n!<1P4~_^zi^19Q=bEz<=6tTLI4zD`w)<;%30F&!|AL{JKO3ndkXBXao7C zv8R>1TGHSQ`{wXe<9c_u)`Tk=+i>5xZd*FF=5Fu2dWT4*mxvQ778tHd6=9fhuAA^u zpL&WADaeddEK?%kW|Uz!b^(j9A<_(rXkcjonk^)*wO;*fXA%cVp} zN78@@s6b(=+-3aT@&%-^P(Qy~6Ohh+!4A1;{+E<>)cQ;fNLbQE2iEAkcljm*rJf!t z^Dphsh3B*8zV4G-^wkxn_D<~BOlN$cvR~QoMc1~+{SkK4&)-2DAJ8q+;`tv+{Wg|c|x9um>~xyG_!sM$`e?~DUk z!5uc~HatG@6(~zRAT5~&+k^djQn?qjgFi|{{~0k`%{~F``5{F$@IDaSUG($A=({W8 ze>X6LS0)F48&Aw6XFcfo3uXPog#EW%KHV88J&{yyHH3f&y(>eGJB*-H^)$3F| z3mky_I#$IYn3R1)uhMPG?Z!=6cHwB4o5heX7*NH|Efldp>8{%45}+YB+gzJJE19HN z+N|W-q@xrx^=jlErnbMprlT-9={&6-xuh8u%*jJYw>c)WWB6yG2^*_ObQYdartfg{ z6FS9XUt~seWr@7u1C8ceU4XAU0E;d!C7Irk_B@4{N?YyVRaUJh54{)t*R2Ekp0RCS zn`@`czk0>?=bKo1B`rtyY!T&|v#%Xf=Z%Z6BbA&&#z@rAJ$mWa(K?lU4u5{ov`{*xDbc`X;6<{?K%_#^b~`>*cd4XqzCiG ztqP91`zZdX&V5b$y+=F6wy02$mjHD=R$FNP z+;fq3d5QbC=Lho70Rell{C7ZOD4*C|OO#b;Au*RIxPi2yrFz}T&>7|FVut=Jp|Ksz zrUi$Z+Vz0Zv5paeAB$H=b)SII_}4@Jlyg<9;V@Q1+z!SN;c>Y(Xt6%W!E2xDGZ?*| zs!KVqD}vGkH@U>D^DE2`c4UTWMJatD1oh=N`mD*Z7c%b*EI zqQ_32kA3lCvD&nwy!)Zb6R$P-e%~Trn*hoQ1-2!S%~KIt$Ec$vOkQ#bF4tRJ2Q_&} z&{}KGj7{w=o2RgkRq1-eoSd7U=lqsNWST=(-)J1)kJrtdNOIhzj>N97sM7%VO?>7m!smcJz<&s`kS8G<=lg4-vGBHr61{u04v zrg5Erc|Z#v+N>SiH!r`C3Gy5(I0*3w+;+3CWwch5toGsAXeC45Dez=ms2TSG%z=br zNS%e}?c)APyk};Tg7ahO4{QFLAnjH>tR2=5xTFp}zp{+S_L*~+W8~UTT>hlTo>;Vj z8?bvk^5wakOwiAL4`Y=~L<5D~xvP5ZYDn2DEC_^4KmA!_)`fz7IK6~J|;M-p4K&36* z+~qqaGzcQuv5A>ZQ8997EZ=NgpMJI9$yu&$6hqSpq9rTj;Bk8l1Qg3`30ci3{C&Kt z&xYscE{U_cRZNh03e27SbQmy{U26W42}PZIxKi!!k++2fHoGIQJbgtoLhURlnm>T8 zkw6Jz*NLI0bEH;&I*;a>#Aw`y-dX^KB!ELNV?S%!K7Ra#D^$Sk@@s*nAd-Syf4rpS z%$x1G*^L{Ya8^tVooBd<@x#m}J`KK!jqa))4-!ZYExKkXnJMv>7cr79#a+NeFh%d( zqEYI6NT1zQKN`#k$U~hO!_`FxGn6fmnD$rp?Yx(mueJ*M;ID|XiU zy6Vo;X!B6U+~xry5@Z`+v~9bFE}fEI`duy8PXq{~Nt$*Rh!cUidh)7Y_86Io#YaFYm*Q7^@KnyjV(;=!Ef#cJ>k8q5R=2FuN^bNlJwfQVM~ij zj5{;YM(Pp125SST=3tn$B)Tch>_(K=Hjj|0Da=|nAgB&SeWpV0^N0OeR%{uHM$%rv)jsnrWw(U-eg&-)~p`y%f20{Q;^76!`C*_3}Sd~X}@hjg;jaW$R z%5@521(b3_m`40B%eQGKuJxn+YVkKA1gqic_1dF>+v|jy?d=aiTSePON5Gd_ruAA( z1B8!2=qO^+kSll6Z7Q6-JY)5a9yvlxAG$d`x1;!c2>v7MxysTbvVQ)yt{KY4E}1N4 zQPNLUG5k_gj#W>s=N3_J_O!Cl6hu3E550*kaq3c|FGlmYjg3g9E|mm7c8)Z153mAK zldrS++y3Rko+I(Ndkg{}f4~oRE>#}#4hrsFE?kUIU&W7|2TUfJ#r!V&@yQ4RqP^{HMR0~M%B+Lk*fH_j4x()1?u&19;0g93O!_I#X~c#^!#))efLK%1yrfz&kTiT zKkHf_U8zLA!U*KZ&PP@uk0g*}b6D|Puss*J4@+@-0ILu$wQUhGWS@&2cA-xoHi=gd4y7jU%=dtn%Iy``U_-dA1EjVrM^q3%kwuqbN z->cYm_r1B^^Z@fH*6puFeeE*b>KEVxMacjnZ9>M}Yy?xlY6xrK3CZp@=_3>n}QQ`-V}pqmQY%rL>K z2RrwB*|JVZTZ@7swM5>-B03MAS?-*#5>R^hes-`Ty;tm2cE`qm;n!(HVwU^}i$CNq zs`I!3=QyMM3SYjNH2(yozFGo3K-4Acitqc9E{R@Fiv*eJLm!gLy9%k#VcG{HDv#OD zp2Q)3Y}OFg==mNPd0W{VuqDFrg#@|o$Fja-AAZJ$KSF)$_p{ETJzpwy@pK3TI6ooc z=|EDs%+JMDOfY0dBs@%1&sl8L;TI%!1iJIt$)iUiDS&W=pI}JXy0KBRO5w8&_D<7qTv0f69^Z z4l2RswinebaN>lhG0N4QDB(jX+I>ul$EQZ|TcA~!2`6fpFW@?ce-kB1 z(TP4-R=-j(R6pdnpgf+6(^-(mDSbq{4!J;E$|auJI(i1v+W-u1dlGuS z`yO6a<573axx&cdRMB5T?u_6>TNRF*VdEq@O^f1!8Vh&}qdT`FfH(k1nig1B#g5v6 zJkQcakReU2!d;G5hp3Tg52c4HB&!`I-7CWt7ZdJeb|hI=RI1*;I*^+oSA5B;_FnZE zet@H`soU*wpSv4Bb28z#XryGgTA`Y%L8Q`2i4fB1##;yYqQF+xYQ!r#G*-3HNref` zl4R{T5k(Ugq?8Wjj(hg@nW@SyZ$M?8{ypvzwDxi$yg*ns$K^hxS)0Avo~ zJO(0ct~9R$fCed8#MP>8P|S27_^9m1_c~z7kAHQktyglrG2`(J@R&oav0+F4IOqUS zA1VzvY`F+W&3%RLmo}?-$F=$m)^00FGCHj678iakZE>+Rfo(U%0aYddcZ+ z6>WZ?YQQifn^snF@=0TPTHgr$AoN$Ui zj~?YaTfQQ=7i6?%8USE74e{pe*|TO_8tMF7)<||yKGZtHy`QH97t)A_z)4BlsG?hF zT0PLh8`OKm`Hcn;K~QuQM@&vSawudJr!d0ie9LQxkt2DrzuI?U(MbA5aPSXxxU$x3 z(B?M0zXc_fhASy<8z{fLXf7{n~D2Gjhbo$AQd~4}Y${y(LkVI~@ql@; zi(-Rk{wp{6e}PulWfGL(**=TC1~+a{uj(5|bk*~V!#8;%O>zvC^dm=hku05cmNDr$ zE#?^-ZRx^#vRs5eF%T&|wAFmVNpjD|>=71<6zOtH>sD*QkawnK1m|?l>u5lyJLAtx zd=6CL(s~g~G~L&~eu(__*LQQq7!=4@R%Rk;_7n`f^XQ&j?p>HI*Eog?$7-hi)Hiep z<<63J^}wR!EroASTBaHhxc*z=#~LYfqCdu|*R8{utuq zp;9x9;1#_k(g;xh23(hM>Rb$phRw0RU}5VfkUh-0|NCiYahe($uFsmZy{_G&I5T;V z9QhkYG2Qr~-&qrL{OHlYrm?ZUYFR?9+ln7KdOnQpTwFbIDeA08t>_;Iru;Bf6+koA z@wAy1YyO!CBB6I16PS7D+lx+%N1U*LO?rG5d>CgeUs)2g-hnQ8*mJZs zMl7SudB9j`4pC&^5%r@m@a#3KQP7J8p7!&r?sG?OwwrtPSkbh&=XG}wJbECDl3ZOF z?Z^NM!bp&O&+_b;%3hgnr;Lgi@XJT~kb0G%x870`YG9=E9Z3ow_-urHZq=_0dqBmz z)V4$HJ7ZeSkAfZmQXcUBosfzRE614~!BVn$P|~PZ3vXeO!&Jc);um377Y;MWo%X3wEbnDNMG<^%>V+o{QMTrfcmvD#%b-!W}Iyp)oto+ zQ7B=hGgcyJjl%dS=hmwO;(1P&S`{_cSue#I`fZnU#|tG>zxhR=z{Gl*>293`c)8S4 z3p66Q_BSD+7Z&b3T>9ob(jepdl?1+?e;=*;8@jg>NSVzy7;_% zh4!7F!Y(P$a26(_lseT1AnTP>kXpflENpFUsk8sBHzL-+%ZbzU%bjoLQ^YIYY(R22 z9i*pp_wG)b=#^74_MW3`0AHS88SA$)W48qwwG^XVZLb~fr_8NC=%m?Jg)%t>+x{{2 zC)`qIMdncURWRl?7_2f=E`y$9QLG_OT^|x>OzT{Vr(of-Bl`efCmC8ubV!u(4IRN{ ze&r&d&c|~J+5O!92ZbwVgkN5Gd{ybmuS{-)Vyraug`-MfkV$q|B(a930}A^`%)-9Q zwD|>(#ObrW`PzyC<3QRX4GB`c-J7E?9V^c9Iz2tz+AMRs(Z^8-)^oQHR& zRTHoLo2iQN$%9F z=5*jl!0U)C=J~TMJ!nM6%AvC=jjKs=$Ge96*`(<0ve}G@uR!YGI}~yofTmhtxh%R^ z1hxfTz1TxBqpB42r>!oOB~YSk4UI`gs&8tv19SJq^0p7>YPgg5zYL?DMF4NQlt=aO z>8s}fc=Wc)@wH^>>TDO5b0)~CJ;{v{?`~Z)*r3QlHb&NzD=N1Y7~N;i;!PZ%P--CA z28y=cMg8w*F~e&NN5ctI-gL-Q z3QcmX84~f?L0HyU$X~sRy8?aM%gL4~;~4YekApfln?%e@e5$y-{D$E(*mznV&*|@g z^0kw2eFT8JEC|t9=JK7kq{u>(TgL$sws>KJ07ajc81Z^ryS#Xv;dujnHzUB5MW}0s zR1VtkDq2B@9xsz=4~=+bus>oZbb0sV3#_F9aX5Yt@63oyKVdQ_?c_sj{?o6IDy)2l zy1)>Ru~cQbbXmhB;x40CSk3ER1!d6og}Y$uk}W?cf!MeEBMH8OIcbaVyT={~78NJ1En~Mg^_F=UVrQ+;aNT zy33vV!YXx~&VxY`G;|>|&b*dpJ+p`IFz*v6O=4%SqaaSoc2;;j{TDMV9Nm%6`vbez zn<(dZq;Mx{WFkq8#dy>ymunZn#i1-67N~-~80!UzY9dK^ia!L08h)r5FU{>P0#8~d zBx&+4vNX-mlkkDOyVftnM}7qz6^Ilc@rs5cnIlRJljLbB(4{Es;4HkjRo#)$ZENBZ zkTw8D2%>;Z4_Xjin*R}(>9S|lG}H5}nCsr_b4>Qms15Q^jTvl_;CoAHzRKm*KrvZA zIeTG`H^u;6e#k@S)6!I{$x)biH3^lkH~of{$UPga)0v{=`f4E35;U1L!dV)Cv)A}1 zZ}GZqSTD4IM{~{g^-^P2vpLG8nCq9y^vFO#w0M=#;F3*H=;bomaGoaHrsQ-8S- z)Ma~&PpKo30t#iKz1-^f&jwC!Pl#Q5dEkU+TvPU#^Ou43Am<}b*i$9^3R5b~D{wLN zUP5kVIf5W(PFtMRagPO)u?D21P1|h}JpNoD zEO1PWdn#aQ^W$Gj+Xd-GxL&r_;G(V}4vE$$kdK7k6x-2_rqlGe!;S3mN zn<%4hVSol|=y}BO4EFV>vv(PqGx{No$0s@zltC{KC|+Xg8XbxZam8I|1T5A<>Sef8k;W}hLXqGXB`*m-jNLJfzN=^F= zrqAxJe#8J7@-Ai)x!E7P(*wTio}DsrQ*qtCpYNyoy6Vf=BS`mj%`)JQ<T_(5diCm6zS_-hHxdvM zc!^(XFSH!or#&|F4e3hnqv~SffcJsE@{W&;AM?cnHe)QZQ0YP{2R2KC(el9#b_NX? zF97id(@F_!T#=`mNczfj+u$93+ThX84terDPlWfkLy89#*zg*Y_a0#{qJ?o@yVq>1$UMmb2hN~U#6qt0EeUu9}j85cOOJ!(wsO}fTS=8yZ;nVSDipS>vjG^#v# z=}QNH;mF+*>i`3vea?bs^wAmR$rhSwzCXd74xX(VA?wuHGTMDd;J|EhaSqR6AAcd< zS3Yvk)Xz|C9IB!MoSSp7rnx`fo*33B@KII8{SfUIR14_Gr7)QcM==%w!~orwW#oi} zaH4yC%MWFDq&P%C*u5UUK5CW{EG?KIvGu5u1zxE9s$!z5{UBf7ZQ7P`)A(I{$Evwi z&FZLtvs)YtCuOh+5*e#Sn6L1Va-&ieFX}*>CxB4Ax=sQ_O3QaX?l1dd|0oy^thtY6la20qDG>)_5?%j9%dlPA8UUY9#}?yS5&4P=SR{|@3Dm>m6gV;As6 z65nDaS~1&+W%NSacjxiGkA2-i6pqBdULG8#zxG=sNU|ozEQaPfq1;`BhZcDG z{{JhG+L!fP-Kfk&6eY(dWAgJ5EIA;Bzke<3`EAX$P=jRq#f^0G6_REM zunQd&%aGe5y&}+8X3Lv1hkL8umM2yjDjkmp_k(i=VrP=4rtan2_(4*`5}7a*Dg{6J zC+&0)iRmNfmik5y`dB+cP};J>JvzYGJ(fjQ?WWXlt7@exxRfXr>PF`z1WtskEj_6h zbj2#3yr5l)Tj^!1DXYa5SW0I!Z`)&UHkRWmq57QMv3fuOLsw*a&O0l3^K?&l{5xzz82fZVONg$>qH} zTAS-6XW>gtW+s+CRP9#69>YuS?VbV;Br=xPP1cAkNu$^uNT3fL<248RVcgX z-vu&&hs8A=r7^Vt&gLUMY zqb~Rdz#;gd$3MXz#wXa5{??&LYyaj z@Cz1qBOdh0%KFQG3FwEPM*L}YCGOiCPFzgM+m(ksM_I*4<%gTMZVmA<)g~tRQvEj2 zS0?#_f2DC>Ob~Uf&P4|<17VCL>MU|NOQDp2AG#>a;d-x=3bMJpD^5HY};u^ zt+Gl=Z%zSv#>#s4gbV{+)p<1YmZ()9nRRX}|GZ^`ab>SahphM=R|PWR0&DcQ#dE#p zEAidk+a+MzdHtq#rADA9OP|kSdS3o0;)4ab?43Q!65#q@T-DDm{5^)#Qyw>ImLl5w z>AWhiDZS5ejs8v!Fks4R^53$UHM?Y)QwE$f^L@x?At2f)J!rE^&aFp_MHE^^4X&@# z)@Tcg&QdJmO6hESG&WvZ1$uKBn9J9$5R!XKh^bc=Q06tG^!tqVQ0(Au-YMqj_9Cr1 zZOJH^YGYu3FQ(u@xdn^<66hKrwaM&44X4O|u9~g;hvc#Zp?Mq8(x^{;Ra^i?5+>k1 zD_xcj2X?16HUYlHwcDd%UZh?TCudiTZ2;u)ms;Ayh2G8ZaIe68D%G$2bdWQhDnFgi z{)t}wux+wjF|;YB98rXy_|Tjl6&!ZBwT@@4qPb|nl~_Sc8~%qd^N5OXMa%}Ku01XH zFFRb3J)0v97alA3Dx$Mwo?y07@oof~ZP3L#JObZ&&c3q5Dcn3FuxX;c@SEY)WkAcX zmwmi!Nwt_)T^{0tU_rT%BF{TxGZq=CN-a&Ri3^Ski+j5?MhnaoBmv@;+{KF*Tj+Dd zuanKJJ+Lz;hWGe7#lIx(tR}}Su=v!;mul`?lNXs2rU7e~Cjd1P`wdW|4cvi za#)EW^%ffFJC9|@0s>uE=rB9yVO>xSJz~c7Uao8l@pSVV0VELr`PXdJKwp-Ck6x~5 z-`r{4Tchnq>Mnf0UAF_Lzqi*(*AO>7RAP{U9NP-Jw!NkAWkUDzLZS!&paw=r#2F*3Q?|fR?(?;Y-4UmO}3dCEax_Ir+UmUV%z^$lP-&< zboBTs5s=zZW-t^h)ED|b89s+7D z(y#}#BVew{i6x`uWBEmEed}pL{`8kl1{=u|*!u-uxOWwP6t!H-oC+?_|6qvWs!=HD*6_lFRe`3MX<&IPMAvII5n()A3H%0fs>uHx6 z_~pX01pGv!_U-Q4Gt#O%WvU!-QsZ83)T+TU=GdQSl}en@!w+f@!R9-~tI0j*o)uZt zX#p;j1R6BGrE7Yy%d)H9KMRI>(SAHtl(ZT$UCslRe8_)NzBNTGdh6Pg5~7*$oaWoM zSn)Q4X{=uMyTr^#FD(~g9+=!()tS6+rkVB+xmwdClkcI7hY&flS*!}X%cux#X&A87 zr7n9X4Y6|N)XwV7q1tJqnnHcygsHChuF$7wt8|%#Jg}t=r*kQ>NGB?fV){W-u0|hE zO$gL1A~~f8Jr1Tk=1rQ!F`r#4u2gcR%ZNw*4HRuH=8`*Saw zm$<&Mc%!SsDXNmzGX>EbQ_MWk_oTDnT^<4Xc9_(kW1W&9E>|Z z%z)(0^$3iFSx;EE>2+MGypo7yk3!mC2OAm4O!MqrK4rFf=oDC2tbp~x*9Ye=L3tm# zxhyPzfC&YAAa5ae%`@h4lNy$NbD@^pF&5remlOG1(;t zUqG!hxIJcLt*uE2c^y3scytnQp@4hU>x)p~BTc4X9)5ekv-chc?{aB!anShqrvy83 zkmhu+$YwwR3)4)cPT(B-`D=?>?Vkg=*QDFe6csaf(8fsSbS$_WeKP<0^EpRo-%?4I z{*Pfd8Sm?kfzp8Q-lQ-Ab5@#e6|B*}af7C9Wnp;B;M55aj03=RL=KOQk1B+}U~=Zm z2&x@8}6l9qj+h>1cM$Y8Hp^$&o7=*5W z)EG^N^Rngc5OJ9www8%^{6P^|aiSbbv#CIOk9?~LBKcK!!g{12WO+8)7|zrCii z{9D3>5Pd`Qai12q!}ibjNBQ|(Xc^l;Y#=c_o_Z29Ju6|YjAU7y*taM2m>;#qnCWGM zA@-Ahh(4gOj^@2!hvye}%PV-!YL6?lXfAT636YOqe8K58(|Vs*Sn+pyRMAEKe^=!= zG<8e6dQbd$4*70iM9~sg;592qo=TQhV^P%XFgv?43_4YhL4DcQ?<_n0TU)pS9vG>|5SDVGWDd+NrYDrtGY=C<&q z$K37@QXGFx@O_`YE^}yq>{(5%VVQ@FPV3*{o`{L9KWfr}W9E+oTQ+lNTnH``Pv$HA7Pe%@ zfPubpdSS%jkgVzAN7F9ml}~fIo6H1S+T-K03`x_6=Vk~X3`K16ma*j3!H@-4SfT=2 z9S|l36Nm9Ll9sMx(;IWZ;asL83*HD14v4$N2DHV#=Ea^L1ldO7g=T+cVHbm+HCe4T z^&*x5VKN%DIfM^waMJ$OJ}0J2QT?bUl9T-CS((It6ASvBpve=FRD4b>aGgqTzGo#S zdpus@2`*{shkl&iGcE`qa>w-8A*1f9hkpPp*%(K({A=gDf<75%(n~Uzju;*=goa5_nhh_8<`4;?kL_mlU^6<-L0MZ z!U5Y!1^%4DgHQCtk*jauhh4ODfG5r}Q>43F$eEtvkRNW12$2CjjXR1vS|8#2=@aNu zKH9Q3K3QGkOp2f(P_O-*AedcK=_=2y@!uOyJ6l|Axyqk%UHZtk4%lKEz)ih37srz7 zg)vO$3T^!{y{FB|7Z)oN2^Ul%`<}KWKGiJ0O}a{+fjH%i5A_UDz`>X6VB;&|oYaNW zz4WcZ+74wls~_>ol0s~j0u8#BFYDI%pD;nD$Nh8atWHpCMWgu9ZlXyGf%vkGjnSfk zG@7?P_o$;h&Ar<-fjyDl*J&=8P$1ZhEwoyq?&ss#Y zFlB{DJl61DzY*4Esy(FMY&734W+{v5Nw6YMmif4AHV#Wz6ozy{xZX5^zP^jOWo?dt zX?~YG8V(ATrKex43$616`2=FOEOX)luUC(Z_V8_s>Y9=}3_g-jD^J(Ff8K_z-?yjdv_cLL zZa!KvnVEiMS5Hs>39Z}P104a|(wMek@gRp$hOS$vrIn*HymTBa7mT$YC`i~s!`Uw6 zG)O*i13Uxdn~WI3w`{gLcJ`S1W;L2j)q3BqS8fu-RKf@v2n9VBzIDePlE4_8t;qHB zMdVrYMPFKHx>$012`T#3d5rbC3cvm2`gtOZ(kKr?9#~Yg57$K1Z}IYht@S8Oj-3jx zcGeZwfrIh40Lekes{9k6NCyQ9Qs%>8kA-)u)&uqarhb{zv%D)^@PGM<_=x@cuc)$m z2y)Z@gXjfNd4ED8-piunnV`w~H#2sXo1Fkykr)PDPEtrO_qe(*QvwvdxL?{+UI68G zry($4nI5^Muu4c(m0Egnpk>qFornF45pYqb0gy-rPKu7gw6$|%ETFD2{u23w-HiLg z2+uKoN_RV9h*z?gjtUO638?~_c$kJpkWF@4bK8>6@5@cVb!HS`&BDqTU5daY4A5vF zfos1D#YPfP;5gz!Uz7kYqI3jLuWUJV*+qI7j}2gyxWsrNbaZ?oid?HY6=SO{ERqB0 zdP@4jQ3`ent@5KHgz_|@RJF}R`hR&ZIPk`t5y)F`l=t%N-@a|9q*GIt1XVSuL2`Z8 zg%+azm%Dt*!QTGE&iFx}v`j9OrB$iIM{md%|5zXQFXD+T^XAQWm{HaghgkV24{HcO ztKSnpANSQdNr4_IjSONXV-dKZmy%R!YipYoR#OVzwg$y7a-zS(kzLsfQwnkQw~FJQ7a2~?%Zi$ZEcNm8+5uSQL6Vq1gkVPSB+O+HlIJj zXEK4cfq_qC027#lI>490;YQO~waQOLwG{ClpbR#^q+5@lylRXaGI49;_&+w-xbXo{ zw5>LAuoz+0M@B-kHMK?)kHBZyg>%sf1_jhLHa4b_xumgyy{<5ZT9N=GJkF@W;R`ck ZWatx6m#c9_xmdZ7-S#eaMYdjF{R%&G(T@NC literal 0 HcmV?d00001 diff --git a/docs/docs/image.png b/docs/docs/image.png new file mode 100644 index 0000000000000000000000000000000000000000..bc33fe8020999228675be434cfc5c5a0c6ab65fd GIT binary patch literal 42601 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 Date: Wed, 13 Sep 2023 01:29:33 -0700 Subject: [PATCH 06/12] [DOCS] Adding page for getting started --- docs/first_program.md | 106 ++++++++++++++++++++++++++++++++++++++++++ docs/mkdocs.yml | 16 +++++-- 2 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 docs/first_program.md diff --git a/docs/first_program.md b/docs/first_program.md new file mode 100644 index 00000000..e33af97c --- /dev/null +++ b/docs/first_program.md @@ -0,0 +1,106 @@ +# Getting Started + +Python is a interperited, object-oriented, high-level programming languge. All robots in PiE are coded in Python 3 using a Application User Interface (API) called the student API. This includes all of the front facing classes you will use as a student including `Robot.get_value()`, `Robot.set_value()`, `keyboard.get_value()`, and `gamepad.get_value()`. This section overviews the basic organization of a student robot as well as ways you can debug and trobbleshoot any code issues. + + +## Teleoperated And Autonomous +The teleoperated and Autonomous phases are the two phases outlined in the student rulebook. In the Autonomous phase, you are only allowed to use the `Robot` class from the Student API. Each action must be planned out before the Autonomous phase using a combination of timers and encoder steps. + +The Student API includes a couple of functions built in. + +# Autonomous Mode +The autonomous mode is the first game phase you will encounter. In this mode, you will be required to navigate a task without the use of any input classes: `gamepad` or `keyboard`. Autonomous actions defined in the `def autonomous_main()` will only run once from top to bottom. In contrast, the Teleoperated phase gives you unrestricted access to all of the Student API classes. This means you're allowed to use input from both the `Keyboard` and `Gamepad` classes. Also keep in mind the function `def teleop_main()` will run in a continous loop. This is where you can use decision making statements like `if`, `elif`, and/or `else` to control any of the PiE devices. + +## Autonomous Setup + +This function is run before the Autonomous main function. This is where you could set the values of different attached devices. For instance, if you wanted your motors to drive in the oppisite direction as your set velocity you could do something like: + +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + + +def autonomous_setup(): # setup function + Robot.set_value(motor_id, "invert_a", True) # inverts the direction of the device with a coresponding motor_id +``` + +## Autonomous Main +Autonomous Main is the game phase that's ran after setting up. In the function `autonomous_main` you are allowed to write a sequence of functions that will be run durring this period. While running, main function will sequentially run through the list of operations until completed. This could be useful if you want a sequence of python functions to be run one after another without any delay's in the sequence. + + +This sample code uses the `autonomous_main():` function to set the value of a motor to full speed +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + +def autonomous_setup(): # setup function runs before autonomous main + pass + +def autonomous_main(): +Robot.set_value(motor_id, "velocity_a", 1) # sets the motor speed to the max speed +``` + +The `autonomous_main` function and `autonomous_setup` aren't very useful alone. However combined with the `Robot.run()` allows for further control over the timings of the code sequence. `Robot.run()` allows someone to run a process on a seperate thread (runs the code at the same time as a main loop). This means a student will be able to use `Robot.sleep(seconds)` to wait before running the next function call. + +do note that although it's not required, you're recommended to assign the function type `async` for any function being run within the `Robot.run()` function. This will define the function as a coroutine and make it easier to seperate from any of your other functions. + +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + +async def autonomous_actions(): # a custom asynchronous function with a sequence of actions + Robot.set_value(motor_id, "velocity_a", 1) + Robot.sleep(10) # stops for 10 seconds + Robot.set_value(motor_id, "velocity_a", 0.5) + Robot.sleep(0.5) # stops for 0.5 seconds + Robot.set_value(motor_id, "velocity_a", 0) + +# sequence of commands sets the speed of motor A to max speed for ten seconds, then sets the speed to 1/2 of that speed and finally stops the motor + + + +def autonomous_setup(): # runs before autonomous_main() + Robot.run(autonomous_actions) # runs the function autonomous actions on a seperate thread + +def autonomous_main(): + # where the autonomous actions are ran +``` + + + +# Teleoperated Mode + + +## `def teleop_main()` + + + +## Template Code +This example code is how your program could be organized. Each + + +```py + +left_motor = "YOUR MOTOR ID HERE" +right_motor = "YOUR MOTOR ID HERE" +def autonomous_setup(): #determines what will be done before `def_autonomous_main():` runs + print("Autonomous mode has started!") + Robot.run(autonomous_actions) + +def autonomous_main(): #where you put a sequence of actions + pass + +async def autonomous_actions(): # a seperate function that runs + print("Autonomous action sequence started") + await Actions.sleep(1.0) + print("1 second has passed in autonomous mode") + +def teleop_setup(): + print("Tele-operated mode has started!") + +def teleop_main(): + if Gamepad.get_value("joystick_right_y") > 0.5: + Robot.set_value(left_motor, "duty_cycle", -0.5) + Robot.set_value(right_motor, "duty_cycle", -0.5) + else: + Robot.set_value(left_motor, "duty_cycle", 0) + Robot.set_value(right_motor, "duty_cycle", 0) + +``` \ No newline at end of file diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 7a639ffb..a53caabf 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -2,12 +2,18 @@ site_name: Pioneers in Engineering Documentation site_url: https://example.com/ site_author: Ian Leung nav: + #introductions - Home: 'index.md' - #- Building Your First Robot: - #- Base Kit Manual: 'https://docs.google.com/presentation/d/1kOey75pST0KuZBpdi2XSr_sBCPJOZlzW_mR5YUjE6n4/edit#slide=id.g11867c812eb_0_0' - #- Software: - #- Dawn Tutorial: 'https://pioneers.berkeley.edu/competition/SoftwareHub/QuickstartGuide/' - #- Quickstart Guide: 'https://pioneers.berkeley.edu/competition/SoftwareHub/QuickstartGuide/' + #starting your first robot + - Building Your First Robot: + - Base Kit Manual: + - Software: + - Dawn Tutorial: + - Quickstart Guide: + #software stuff + - Getting Started: + - Your First Program: + - - API Refrence: 'api.md' - Devices: - Devices: 'device.md' From b7562fea5f53eeaa913483ea818efe45597d1689 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Sun, 24 Sep 2023 09:55:20 -0700 Subject: [PATCH 07/12] [DOCS] General updates to documentation. --- docs/docs/api.md | 199 ++++++++++++++++-------------- docs/docs/building_first_robot.md | 0 docs/docs/dawn_quickstart.md | 17 ++- docs/docs/device.md | 6 +- docs/docs/device_get.md | 84 +++++++------ docs/docs/device_set.md | 64 +++++----- docs/docs/first_program.md | 148 ++++++++++++++++++++++ docs/docs/index.md | 11 +- docs/first_program.md | 106 ---------------- docs/mkdocs.yml | 21 ++-- 10 files changed, 373 insertions(+), 283 deletions(-) create mode 100644 docs/docs/building_first_robot.md create mode 100644 docs/docs/first_program.md delete mode 100644 docs/first_program.md diff --git a/docs/docs/api.md b/docs/docs/api.md index 4f57cc62..9184898b 100644 --- a/docs/docs/api.md +++ b/docs/docs/api.md @@ -5,26 +5,28 @@ The Student API is the set of functions available to students to communicate wit for more infomation refer to the Student API section of the [Runtime Wiki](https://github.com/pioneers/runtime/wiki) # -[//]: # (find better word for code periods later) -* [Run Mode](#run-mode) - * [`Teleop` Period](#teleop-period) - * [`Auto` Period](#auto-period) -* [`Robot` Class](#robot-class) - * [`Robot.get_value(device_id, param)`](#robotget_valuedevice_id-param) - * [`Robot.set_value(device_id, param, value)`](#robotset_valuedevice_id-param-value) - * [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) - * [`Robot.is_running(function_name)`](#robotis_runningfunction_name) - * [`Robot.sleep(seconds)`](#robotsleepseconds) -* [Input Classes](#input-classes) - * [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) - * [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) -# Run Mode -The two run modes, `autonomous` and `teleop` are where a majority of student code will be run. These functions are run in the Autonous period and Teleoperated period of a PiE compatition. Autonomous code restricts student's access to the `Keyboard` and `Gamepad` functions, forcing them to write code that will run without any input. The Teleoperated perod allows for control from both, giving students more freedom to control ther robot through any of the challenges presented in that phase. +[//]: # "find better word for code periods later" + +- [Run Mode](#run-mode) + - [`Teleop` Period](#teleop-period) + - [`Auto` Period](#auto-period) +- [`Robot` Class](#robot-class) + - [`Robot.get_value(device_id, param)`](#robotget_valuedevice_id-param) + - [`Robot.set_value(device_id, param, value)`](#robotset_valuedevice_id-param-value) + - [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) + - [`Robot.is_running(function_name)`](#robotis_runningfunction_name) + - [`Robot.sleep(seconds)`](#robotsleepseconds) +- [Input Classes](#input-classes) + _ [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) + _ [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) +# Run Mode +The two run modes, `autonomous` and `teleop` are where a majority of student code will be run. These functions are run in the Autonous period and Teleoperated period of a PiE compatition. Autonomous code restricts student's access to the `Keyboard` and `Gamepad` functions, forcing them to write code that will run without any input. The Teleoperated perod allows for control from both, giving students more freedom to control ther robot through any of the challenges presented in that phase. ## `AUTO` Period + The autonomous or `AUTO` period is used anytime keyboard or controller input is restricted. Within this period you are encouraged to write code that will be able to run without any user input. An example of this would be running a robot foward for a set duration within an `AUTO` period @@ -33,58 +35,64 @@ An example of this would be running a robot foward for a set duration within an motor = "//INSERT MOTOR ID HERE//" def autonomous_main(): - #keeps motor A running at max speed for 10 seconds + # keeps motor A running at max speed for 10 seconds Robot.set_value(motor, velocity_a, 1) - Robot.sleep(10) #stops the execution of any other functions for a specified number of seconds + Robot.sleep(10) # stops the execution of any other functions for a specified number of seconds Robot.set_value(motor, velocity_a, 0) ``` -For more recources please refer to the [Software Hub Autonomous Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) +For more recources please refer to the [Software Hub Autonomous Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) ## `TELEOP` Period - The teleoperated or `TELEOP` period is used anytime remote input via a controller or keyboard is used. The `teleop_main()` function runs in a loop until the teleoperated period has completed. - This code is most useful when a student would like to use controller or keyboard input to control their robot on the gamefield. +The teleoperated or `TELEOP` period is used anytime remote input via a controller or keyboard is used. The `teleop_main()` function runs in a loop until the teleoperated period has completed. + +This code is most useful when a student would like to use controller or keyboard input to control their robot on the gamefield. ```py motor = "//INSERT MOTOR ID HERE//" def teleop_main(): - #sets the motor's velocity to max if the button A is pressed - if(Gamepad.get_value(button_a) == True): + # sets the motor's velocity to max if the button A is pressed + if(Gamepad.get_value(button_a) == True): Robot.set_value(motor, velocity_a, 1) ``` For more recources please refer to the [Software Hub Teleop Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) + ## `SETUP` Phase - The `SETUP` phase prepares for either the `AUTO` or `TELEOP` function to be run. In this phase a student can set or get the value of any lowcar device (any device connected to the robot interactable using the PiE api). - This function is useful when a student would want to turn off the CURRENTLY BROKEN PiD control on a motor controller +The `SETUP` phase prepares for either the `AUTO` or `TELEOP` function to be run. In this phase a student can set or get the value of any lowcar device (any device connected to the robot interactable using the PiE api). + +This function is useful when a student would want to turn off the CURRENTLY BROKEN PiD control on a motor controller + ```py motor = "//INSERT MOTOR ID HERE//" -def teleop_setup(): #code segment run before the teleop_main() function +def teleop_setup(): # code segment run before the teleop_main() function Robot.set_value(motor, pid_enabled_a, False) Robot.set_value(motor, pid_enabled_b, False) - -def autonomous_setup(): #code segment run before the autonomous_main() function + +def autonomous_setup(): # code segment run before the autonomous_main() function Robot.set_value(motor, pid_enabled_a, False) Robot.set_value(motor, pid_enabled_b, False) ``` # `Robot` Class -The robot class holds all methods for interacting with various arduino devices connected to a student’s robot. These devices include servos, motors, and sensors. + +The robot class holds all methods for interacting with various arduino devices connected to a student’s robot. These devices include servos, motors, and sensors. ## `Robot.get_value(device_id, param)` -The get_value function returns the current value of a specified `param` of the device with the specified device_id. -* `device_id`: the ID that specifies which PiE device will be read -* `param`: identifies which parameter on the specified PiE device will be read. Possible param values depend on the specified device. Find a list of params for each device on the device get page +The get_value function returns the current value of a specified `param` of the device with the specified device_id. + +- `device_id`: the ID that specifies which PiE device will be read +- `param`: identifies which parameter on the specified PiE device will be read. Possible param values depend on the specified device. Find a list of params for each device on the device get page The function is useful for checking the current state of devices. For example, getting the current state of the limit switch using its device_id and the param “switch0” will return the value True when pressed down and False if not. ```py -#first segment of code ran in the teleop process +# first segment of code ran in the teleop process limit_switch = "//INSERT SWITCH ID HERE//" def teleop_setup(): @@ -92,33 +100,34 @@ def teleop_setup(): pass def teleop_main(): - #example code for getting the value of a limit switch + # example code for getting the value of a limit switch - #first parameter is the limit switch's id - #second parameter tells which switch to get the value from + # first parameter is the limit switch's id + # second parameter tells which switch to get the value from - #in this case the method will retun True or False depending on if the switch is pressed down or not + # in this case the method will retun True or False depending on if the switch is pressed down or not Robot.get_value(limit_switch, switch0) pass ``` -For more examples and devices refer to the devices page in the reference +For more examples and devices refer to the devices page in the reference ## `Robot.set_value(device_id, param, value)` + The `set_value` function sets a specified value to a device’s parameter -* `device_id`: the ID that specifies which PiE device will have its parameter set -* `param`: determines which parameter should be set. The parameters depend on the specified Lowcar device and can be found at INCLUDE LINK TO LOWCAR DEVICE PAGE -* `value` - the value to set the parameter to +- `device_id`: the ID that specifies which PiE device will have its parameter set +- `param`: determines which parameter should be set. The parameters depend on the specified Lowcar device and can be found at INCLUDE LINK TO LOWCAR DEVICE PAGE +- `value` - the value to set the parameter to This function is useful for setting the state of parts of your robot while driving. For example calling the set_value param `“velcoity_a”` with a KoalaBear device (motor controller) with a value of `1` results in the attached motor spinning forwards at full power - [//]: <> (MAKE CODE SEGMENTS COLLAPSABLE) + ```py -#first segment of code ran in the teleop process +# first segment of code ran in the teleop process motor = "//INSERT MOTOR ID HERE//" def teleop_setup(): @@ -126,11 +135,11 @@ def teleop_setup(): pass def teleop_main(): - #example code for turning a motor foward at full speed + # example code for turning a motor foward at full speed - #first parameter is the motor controller's id set as a varible - #second parameter 'velocity_a' tells a motor controller which motor to drive - #third parameter sets the value + # first parameter is the motor controller's id set as a varible + # second parameter 'velocity_a' tells a motor controller which motor to drive + # third parameter sets the value Robot.set_value(motor, velocity_a, 1) pass @@ -138,17 +147,19 @@ def teleop_main(): ``` ## `Robot.run(function_name, args)` + The `Robot.run()` runs another function, passing the `args` fed into the function. The `function_name` is run in parallel to any other code run following the `Robot.run()` function. -* `function_name`: the name of a function in the student code which will be run simultaneously with the main loop +- `function_name`: the name of a function in the student code which will be run simultaneously with the main loop -* `args`: this is a list of zero or more inputs, which will be passed to the function_name specified previously as arguments (inputs) +- `args`: this is a list of zero or more inputs, which will be passed to the function_name specified previously as arguments (inputs) [//]: <> (I want to seperate the code example and this line of text. Not exactly sure how to do it so adding this comment to come back to it) -An example of this would if a student would want to run a process alongside the teleop_main loop. Using the Robot.sleep class to define the amount of time a motor should rotate for without stopping the teleop_main loop. +An example of this would if a student would want to run a process alongside the teleop_main loop. Using the Robot.sleep class to define the amount of time a motor should rotate for without stopping the teleop_main loop. ​ [//]: <> (FULL CODE WITHOUT ANY REMOVED CODE SEGMENTS //REMOVE//) + ```py ARM_MOTOR = "INSERT MOTOR_ID HERE" DRIVE_MOTOR = "INSERT MOTOR_ID HERE" @@ -175,9 +186,9 @@ def teleop_main(): ``` - ## `Robot.is_running(function_name)` -The `Robot.is_running()` function returns a boolean value (`True` or `False`) for whether or not the specified function is still running. + +The `Robot.is_running()` function returns a boolean value (`True` or `False`) for whether or not the specified function is still running. `function_name`: the name of a function defined by the student. If run through `Robot.run()` it will be the same inputted `function_name` @@ -186,27 +197,26 @@ An example usage of this would be to wait for a `Robot.run()` process to finish ```py def robot_actions(): - #series of actions from the Robot.set_value(). + #series of actions from the Robot.set_value(). def teleop_setup(): pass def teleop_main(): - if Gamepad.get_value(button_a) && !Robot.is_running(robot_actions): #if the button A is pressed down and robot_actions are not running. Then the robot will be able to run robot_actions again. Will not run if the button A is not pressed or if robot_actions is running + if Gamepad.get_value(button_a) and not Robot.is_running(robot_actions): # if the button A is pressed down and robot_actions are not running. Then the robot will be able to run robot_actions again. Will not run if the button A is not pressed or if robot_actions is running Robot.run(robot_actions) ``` - - ## `Robot.sleep(seconds)` + Pauses the execution of the current function for the specified number of `seconds`. `seconds`: the number of `seconds` to pause the execution of the current function for. It should be emphasized that calling `Robot.sleep` in one function does not cause any other function that is being run by `Robot.run()` or the main loop function to pause. Only the instance of the function that is executing the call to `Robot.sleep` will pause execution. It is highly recommended to not use this function in the setup functions or main loop functions--only in functions executed by `Robot.run()`. -a great place to use `Robot.sleep()` would be to make a robot go to a specific spot using set motor velocities and ammount of time each function should run. +a great place to use `Robot.sleep()` would be to make a robot go to a specific spot using set motor velocities and ammount of time each function should run. [//]: <> (could go further and say that `Robot.sleep()` combined with encoder ticks per revolution could allow you to specify a distance your robot could go) ```py @@ -214,27 +224,29 @@ MOTOR_ID = "INSERT MOTOR_ID HERE" def autonomous_setup(): print("Autonomous mode has started!") - robot.run(autonomous_actions) #runs the autonomous_actions function in parallel to autonomous main + robot.run(autonomous_actions) # runs the autonomous_actions function in parallel to autonomous main def autonomous_main(): pass def autonomous_actions(): - print("Action 1") #action one sets the motor velocites to 1 + print("Action 1") # action one sets the motor velocites to 1 Robot.set_value(MOTOR_ID, "velocity_b", 1.0) Robot.set_value(MOTOR_ID, "velocity_a", 1.0) - Robot.sleep(1.0) #holds the function for one second before running the next lines - print("Action 2") #the following code sets the motor velocities to 0 + Robot.sleep(1.0) # holds the function for one second before running the next lines + print("Action 2") # the following code sets the motor velocities to 0 Robot.set_value(KOALA_BEAR, "velocity_b", 0) Robot.set_value(KOALA_BEAR, "velocity_a", 0) ``` # Input Classes -The input classes are both of the input classes that can only be run durring the teleoperated game phase. These two classes allow a student to recieve a booliean value for whether or not a button is pressed down or not. Most students will use these classes to + +The input classes are both of the input classes that can only be run durring the teleoperated game phase. These two classes allow a student to recieve a booliean value for whether or not a button is pressed down or not. Most students will use these classes to ## `Gamepad.get_value(input)` + The `Gamepad` class recieves input for when there is a change to a controller. This class is only usable durring the teleop phase. `input`: identifies which button or joystick will be returned. This function is useful for checking the state of a button or joystick @@ -242,58 +254,63 @@ The `Gamepad` class recieves input for when there is a change to a controller. T For example, if you wanted to print `"hello world"` when the `"button_a"` is pressed and false when it isn't you would use the function as a condition in an if statement ```py -#segment of code will print "hello world" into the console when button_a is pressed +# segment of code will print "hello world" into the console when button_a is pressed def teleop_main(): if Gamepad.get_value("button_a"): print("hello world") ``` -This function is essential for controlling your robot with the gamepad. + +This function is essential for controlling your robot with the gamepad. The possible button inputs are: -* "button_a" -* "button_b" -* "button_x" -* "button_y" -* "l_bumper" -* "r_bumper" -* "l_trigger" -* "r_trigger" -* "button_back" -* "button_start" -* "l_stick" -* "r_stick" -* "dpad_up" -* "dpad_down" -* "dpad_left" -* "dpad_right" -* "button_xbox" + +- "button_a" +- "button_b" +- "button_x" +- "button_y" +- "l_bumper" +- "r_bumper" +- "l_trigger" +- "r_trigger" +- "button_back" +- "button_start" +- "l_stick" +- "r_stick" +- "dpad_up" +- "dpad_down" +- "dpad_left" +- "dpad_right" +- "button_xbox" The possible joystick inputs are: -* "joystick_left_x" -* "joystick_left_y" -* "joystick_right_x" -* "joystick_right_y" + +- "joystick_left_x" +- "joystick_left_y" +- "joystick_right_x" +- "joystick_right_y" Note that the joysticks function differently from the button inputs. Rather then returning a Boolean `[True or False]`, they return a floating point value ranging from `-1.0 `and` 1.0` (inclusive) ## `Keyboard.get_value(input)` + The `Keyboard` class allows a student to recieve keyboard input. Like the `Gamepad` class, it is only usable durring the teleop game phase. `input`: identifies which key is being read. When pressed the `get_value` will return a `True` boolean and `False` when not. possible keyboard inputs are: -* The letters on the keyboard, lowercase and no spaces `"a"`-`"z"` -* The numbers on the keyboard, no spaces `"0"`-`"9"` -* The punctuation keys `","`, `"."`, `"/"`, `";"`, `"'"`, `"["`, `"]"` -* The four arrow keys `"left_arrow"`, `"right_arrow"`, `"up_arrow"`, `"down_arrow"` + +- The letters on the keyboard, lowercase and no spaces `"a"`-`"z"` +- The numbers on the keyboard, no spaces `"0"`-`"9"` +- The punctuation keys `","`, `"."`, `"/"`, `";"`, `"'"`, `"["`, `"]"` +- The four arrow keys `"left_arrow"`, `"right_arrow"`, `"up_arrow"`, `"down_arrow"` For example, if you wanted to print `"hello world"` when the `"w"` is pressed and false when it isn't you would use the function as a condition in an if statement - + ```py -#segment of code will print "hello world" into the console when the w key is pressed +# segment of code will print "hello world" into the console when the w key is pressed def teleop_main(): if Keyboard.get_value("w"): print("hello world") -``` \ No newline at end of file +``` diff --git a/docs/docs/building_first_robot.md b/docs/docs/building_first_robot.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/docs/dawn_quickstart.md b/docs/docs/dawn_quickstart.md index 7413d05b..332b6265 100644 --- a/docs/docs/dawn_quickstart.md +++ b/docs/docs/dawn_quickstart.md @@ -1,5 +1,6 @@ # Dawn Tutorial -In this tutorial you will install dawn and create your first student code file using the Student API. + +In this tutorial you will install dawn and create your first student code file using the Student API. This tutorial is intended for beginners to the Student API and it's functions. @@ -7,26 +8,32 @@ This tutorial is intended for beginners to the Student API and it's functions. ## Installing Dawn -To install Dawn, go to https://github.com/pioneers/dawn/releases/ and install the latest release for your coresponding operating system. +To install Dawn, go to https://github.com/pioneers/dawn/releases/ and install the latest release for your coresponding operating system. ## Windows After installing dawn-win32-x64.zip unzip the folder. On Windows, you can do this by right clicking on the ZIP file and selecting "Extract all." - Extracting the ZIP file will create a new folder. Open this folder and find the file "Dawn.exe" (Windows) click on it to start Dawn. ![Dawn.exe](image.png) +bla bla bla run the exe + +open up dawn + +follow rest of instructions ## Linux +download file from here + ## MacOS # Dawn Instructions -After installing Dawn you will be presented with Dawn, as well as a interactive guide you can access by clicking on the "Tour button" +After installing Dawn you will be presented with Dawn, as well as a interactive guide you can access by clicking on the "Tour button" ![Dawn Starting guide](image-1.png) -To go through the guide, click on the red button after pressing \ No newline at end of file +To go through the guide, click on the red button after pressing diff --git a/docs/docs/device.md b/docs/docs/device.md index 7d1cd8b5..b422b7ee 100644 --- a/docs/docs/device.md +++ b/docs/docs/device.md @@ -1,9 +1,9 @@ # Lowcar Device refrence -Lowcar devices are the physical devices students use to interact with the game field. Each device uses the Student API to interface with them. Here you will find in deph explanations of each device and how to control them. - +Lowcar devices are the physical devices students use to interact with the game field. Each device uses the Student API to interface with them. Here you will find in deph explanations of each device and how to control them. [//]: <> (link to the student api later) # -insert glossary stuff later \ No newline at end of file + +insert glossary stuff later diff --git a/docs/docs/device_get.md b/docs/docs/device_get.md index b5e1850c..cd1c3bb1 100644 --- a/docs/docs/device_get.md +++ b/docs/docs/device_get.md @@ -1,61 +1,71 @@ # `Robot.get_value(device, param)` for Lowcar Devices ## Limit Switch + ![Limit switch](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/LimitSwitch.JPG) Returns a value from a specified `device_id` and `param` `param` for a Limit Switch -* `"switch0"` -* `"switch1"` -* `"switch2"` + +- `"switch0"` +- `"switch1"` +- `"switch2"` The parameters for a Limit Switch describe which of the three switches is being read. The boolean value will be `True` if the specified switch is being pressed and `False` if it is not. **Sample Usage:** + ```py -#returns a boolean for whether or not switch0 is pressed +# returns a boolean for whether or not switch0 is pressed Robot.get_value(limit_switch_id, "switch0") ``` - ## Line Follower + ![Line Follower](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/LineFollower.JPG) Returns a value associated with the `device_id` and `param` specified. The device being specified is a Line Follower. parameters for a Line Follower: -* `"left"` -* `"center"` -* `"right"` + +- `"left"` +- `"center"` +- `"right"` The `param` for a Line Follower describe how much light is being reflected into each sensor. It returns a value between 0 and 1 where a lower value means less light and the sensor is farther off of the reflective tape. **Sample Usage:** + ```py -#returns how much light is seen from the center sensor on the line follower +# returns how much light is seen from the center sensor on the line follower Robot.get_value(line_follower_id, "center") ``` ## Servo Controller + ![Servo Controller](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/ServoControl.JPG) Returns a value associated with the `device` and `param` specified. The device being specified is a Servo. `param` for a Servo: -* ``"servo0"`` -* ``"servo1"`` + +- `"servo0"` +- `"servo1"` The parameters for a Servo describes what angle the servo has turned to. It returns a Float from -1 to 1 where both -1 and 1 represent the two end positions for the servo. **Sample Usage:** + ```py -#returns the current angle of servo0 +# returns the current angle of servo0 Robot.get_value(servo_id, "servo0") ``` + ## KoalaBear + ![KoalaBear](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/KoalaBear.JPG) Returns a value associated with the `device` and `param` specified. @@ -64,42 +74,46 @@ The device being specified is a YogiBear. parameters for a YogiBear: Motor A -* `"velocity_a"` -* `"deadband_a"` -* `"invert_a"` -* `"pid_enabled_a"` -* `"pid_kp_a"` -* `"pid_ki_a"` -* `"pid_kd_a"` -* `"enc_a"` + +- `"velocity_a"` +- `"deadband_a"` +- `"invert_a"` +- `"pid_enabled_a"` +- `"pid_kp_a"` +- `"pid_ki_a"` +- `"pid_kd_a"` +- `"enc_a"` Motor B -* `"velocity_b"` -* `"deadband_b"` -* `"invert_b"` -* `"pid_enabled_b"` -* `"pid_kp_b"` -* `"pid_ki_b"` -* `"pid_kd_b"` -* `"enc_b"` +- `"velocity_b"` +- `"deadband_b"` +- `"invert_b"` +- `"pid_enabled_b"` +- `"pid_kp_b"` +- `"pid_ki_b"` +- `"pid_kd_b"` +- `"enc_b"` The parameters for a KoalaBear can be split into 3 categories: Motor Control includes: -* `"velocity"` which returns a float from -1 to 1 which describes the direction the motor is turning and it's power. -* `"deadband"` which returns the threshold that velocity must pass before a change is made to `"velocity"` + +- `"velocity"` which returns a float from -1 to 1 which describes the direction the motor is turning and it's power. +- `"deadband"` which returns the threshold that velocity must pass before a change is made to `"velocity"` Encoder Control includes: -* `"enc"` parameters which return information about the position and velocity of the robot. Position is returned as an integer that represents the number of ticks of the encoder. There are 46 per revolution of the encoder. + +- `"enc"` parameters which return information about the position and velocity of the robot. Position is returned as an integer that represents the number of ticks of the encoder. There are 46 per revolution of the encoder. PiD Control includes: -* `"pid_kp"`, `"pid_ki"`, and `"pid_kd"` parameters which return the proportional, integral, and derivative coefficients on the motor controller. -* `"pid_enabled"` parameter returns whether or not pid is enabled for a motor. +- `"pid_kp"`, `"pid_ki"`, and `"pid_kd"` parameters which return the proportional, integral, and derivative coefficients on the motor controller. +- `"pid_enabled"` parameter returns whether or not pid is enabled for a motor. Sample Usage: + ```py -#returns the current speed of Motor A as a value from -1 to 1 +# returns the current speed of Motor A as a value from -1 to 1 Robot.get_value(motor_id, "velocity_a") -``` \ No newline at end of file +``` diff --git a/docs/docs/device_set.md b/docs/docs/device_set.md index d85997b2..4079f167 100644 --- a/docs/docs/device_set.md +++ b/docs/docs/device_set.md @@ -1,25 +1,28 @@ # `Robot.set_value(device, param)` for Lowcar Devices - ## Servo Controller + ![Servo Controller](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/ServoControl.JPG) sets a value associated with the `device` and `param` specified. The device being specified is a Servo. `param` for a Servo: -* ``"servo0"`` -* ``"servo1"`` -Changing values for the `servo` spins the servo to an angle based on the value entered. The values -1 and 1 each refer to the maximum position of the servo in one direction. For example, if we described our minimum position to be 0°, and our maximum to be 180°, then 1 would set the servo to 180°, -1 would set the servo to 0°, and -0.5 would set it to be 45°. +- `"servo0"` +- `"servo1"` +Changing values for the `servo` spins the servo to an angle based on the value entered. The values -1 and 1 each refer to the maximum position of the servo in one direction. For example, if we described our minimum position to be 0°, and our maximum to be 180°, then 1 would set the servo to 180°, -1 would set the servo to 0°, and -0.5 would set it to be 45°. **Sample Usage:** + ```py -#sets the current angle of servo0 to 180° +# sets the current angle of servo0 to 180° Robot.set_value(servo_id, "servo0", 1) ``` + ## KoalaBear + ![KoalaBear](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/KoalaBear.JPG) sets a value associated with the `device` and `param` specified. @@ -28,39 +31,42 @@ The device being specified is a YogiBear. parameters for a YogiBear: Motor A -* `"velocity_a"` -* `"deadband_a"` -* `"invert_a"` -* `"pid_enabled_a"` -* `"pid_kp_a"` -* `"pid_ki_a"` -* `"pid_kd_a"` -* `"enc_a"` + +- `"velocity_a"` +- `"deadband_a"` +- `"invert_a"` +- `"pid_enabled_a"` +- `"pid_kp_a"` +- `"pid_ki_a"` +- `"pid_kd_a"` +- `"enc_a"` Motor B -* `"velocity_b"` -* `"deadband_b"` -* `"invert_b"` -* `"pid_enabled_b"` -* `"pid_kp_b"` -* `"pid_ki_b"` -* `"pid_kd_b"` -* `"enc_b"` +- `"velocity_b"` +- `"deadband_b"` +- `"invert_b"` +- `"pid_enabled_b"` +- `"pid_kp_b"` +- `"pid_ki_b"` +- `"pid_kd_b"` +- `"enc_b"` + +Motor control is handled through changing the values of `"velocity_a"` and `"deadband_a"`. -Motor control is handled through changing the values of `"velocity_a"` and `"deadband_a"`. -* `"velocity"` which sets a float from -1 to 1 which describes the direction the motor is turning and it's power. -* `"deadband"` which sets the threshold that velocity must pass before a change is made to `"velocity"` +- `"velocity"` which sets a float from -1 to 1 which describes the direction the motor is turning and it's power. +- `"deadband"` which sets the threshold that velocity must pass before a change is made to `"velocity"` -The encoder's value can be set using the `"enc"` parameter. Setting the `"enc"` count allows for someone to change the number of ticks recorded from the encoder. +The encoder's value can be set using the `"enc"` parameter. Setting the `"enc"` count allows for someone to change the number of ticks recorded from the encoder. PiD Control includes: -* `"pid_kp"`, `"pid_ki"`, and `"pid_kd"` parameters which set the proportional, integral, and derivative coefficients on the motor controller. Each of these values have to be above zero. -* `"pid_enabled"` parameter sets whether or not pid is enabled for a motor. +- `"pid_kp"`, `"pid_ki"`, and `"pid_kd"` parameters which set the proportional, integral, and derivative coefficients on the motor controller. Each of these values have to be above zero. +- `"pid_enabled"` parameter sets whether or not pid is enabled for a motor. Sample Usage: + ```py -#sets the current speed of Motor A to max speed +# sets the current speed of Motor A to max speed Robot.set_value(motor_id, "velocity_a", 1) -``` \ No newline at end of file +``` diff --git a/docs/docs/first_program.md b/docs/docs/first_program.md new file mode 100644 index 00000000..1d587db8 --- /dev/null +++ b/docs/docs/first_program.md @@ -0,0 +1,148 @@ +# Getting Started + +Python is a interperited, object-oriented, high-level programming languge. All robots in PiE are coded in Python 3 using a Application User Interface (API) known as the the student API. This API includes essental methods such as `Robot.get_value()`, `Robot.set_value()`, `keyboard.get_value()`, and `Gamepad.get_value()`, which you'll frequently use as a student. + +This section is intended for individuals with a basic understanding of Python coding. If you're new to Python, we recommend startiing with [The Python Tutorial](https://docs.python.org/3/tutorial/index.html) first to familiarize yourself with the language. +## Teleoperated And Autonomous + +The student rulebook outlines two distinct phases: the teloperated phase and the Autonomous phase. During the Autonomous phase, you are restricted to utilizing only the `Robot` class and it's methods. In contrast to the Teleoperated mode allowing use for all classes and thus the ability to control the robot in real time. + +# Autonomous Mode + +The autonomous mode is the first game phase you will encounter. In this mode, you will be required to navigate a task without the use of any input classes: `gamepad` or `keyboard`. Autonomous actions defined in the `def autonomous_main()` will only run once from top to bottom. In contrast, the Teleoperated phase gives you unrestricted access to all of the Student API classes. This means you're allowed to use input from both the `Keyboard` and `Gamepad` classes. Also keep in mind the function `def teleop_main()` will run in a continous loop. This is where you can use decision making statements like `if`, `elif`, and/or `else` to control any of the PiE devices. + +## Autonomous Setup + +The autonomous setup phase is what happens before the autonomous main function. Within the function `def autonomous_setup()` any code ran within this function will be done before running the `def autonomous_main()` function. The best use for this would be to set the value of a device before the autonomous main function. + +For instance, if you wanted your motors to drive in the oppisite direction as your set velocity you could do something like: + +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + + +def autonomous_setup(): # setup function + Robot.set_value(motor_id, "invert_a", True) # inverts the direction of the device with a coresponding motor_id +``` + +## Autonomous Main + +Autonomous Main is the function run after `autonomous_setup`. In the function `autonomous_main()` you are allowed to write a sequence of functions that will be run durring this period. While running, main function will sequentially run through the list of operations until completed. This could be useful if you want a sequence of python functions to be run one after another without any delay's in the sequence. + +This sample code uses the `autonomous_main():` function to set the value of a motor to full speed + +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + +def autonomous_setup(): # setup function runs before autonomous main + pass + +def autonomous_main(): +Robot.set_value(motor_id, "velocity_a", 1) # sets the motor speed to the max speed +``` + +The `autonomous_main` function and `autonomous_setup` aren't very useful alone. However combined with the `Robot.run()` allows for further control over the timings of the code sequence. `Robot.run()` allows someone to run a process on a seperate thread (runs the code at the same time as a main loop). This means a student will be able to use `Robot.sleep(seconds)` to wait before running the next function call. + +do note that although it's not required, you're recommended to assign the function type `async` for any function being run within the `Robot.run()` function. This will define the function as a coroutine and make it easier to seperate from any of your other functions. + +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + +async def autonomous_actions(): # a custom asynchronous function with a sequence of actions + Robot.set_value(motor_id, "velocity_a", 1) + Robot.sleep(10) # stops for 10 seconds + Robot.set_value(motor_id, "velocity_a", 0.5) + Robot.sleep(0.5) # stops for 0.5 seconds + Robot.set_value(motor_id, "velocity_a", 0) + # sequence of commands sets the speed of motor A to max speed for ten seconds, then sets the speed to 1/2 of that speed and finally stops the motor + +def autonomous_setup(): # runs before autonomous_main() +# note that you can still call Robot.run() here + +def autonomous_main(): + # where the autonomous actions are ran + Robot.run(autonomous_actions) # runs the function autonomous actions on a seperate thread +``` + +# Teleoperated Mode + +Following the Autonomous mode, the Teleoperated Mode happens after the Autonomous phase ends. Within this phase, you are granted the ability to use input from both the `Keyboard` and `Gamepad` classes, allowing you to directly your robot. To use Teleoperated functions, you can use the `def teleop_main()` and `def teleop_setup()` methods, with the former executed after the latter to ensure proper initialization and seamless functionality. + + + +## Teleop Setup + +Just as with the autonomous setup, the Teleop setup and Autonomous setup serve the same purpose. The `def teleop_setup():` function is best used to preconfigure any necessary values or settings prior to executing the `teleop_main` loop. To call the Teleop setup use the function `def telop_setup():`. This function is used to prepare any values before running the main telop loop. + +A example usage of this would be to turn off the pid on the motor controllers. To do this do: + +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + +def teleop_setup(): # setup function + Robot.set_value(motor_id, "pid_enabled_a", False) # disables pid on motor 1 + Robot.set_value(motor_id, - "pid_enabled_b", False) # disables pid motor 2 +``` + + +## Teleop Main + +Just as with the `autonomous_main()` the `teleop_main()` function serves as the primary place to execute all of your code. The teleop function is the only function that allows for student input from both the Keyboard and Gamepad classes. Using the teleop main loop, you can create if statements to read your input and thus change the values of any attached robot devices. + +To best take advantage of the teleop_main loop, you can create a control structure using `if`, `elif`, and `else` statements. In this example a Robot is responding to when a keyboard w key is pressed. + +```py +motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id + +def teleop_setup(): # setup function + pass + + +def teleop_main(): + if(Keyboard.get_value("w") == True): + Robot.set_value(motor_id, "velocity_a", 1.0) # sets the value of motor 1 to 100% power if w is pressed + else: + Robot.set_value(motor_id, "velocity_a", 0.0) # sets the value of motor 1 to 0% power when w is not pressed +``` + + +# Example Code +Finally this example program combines all of the other elements used in the code. You can expect your code to look similar to this. + +```py +left_motor = "YOUR MOTOR ID HERE" +right_motor = "YOUR MOTOR ID HERE" + + +#--------------- Autonomous Mode ---------------# +def autonomous_setup(): # determines what will be done before `def_autonomous_main():` runs + print("Autonomous mode has started!") + +def autonomous_main(): # where you put a sequence of actions + Robot.run(autonomous_actions) + + +#--------------- Teleoperated Mode ---------------# +def teleop_setup(): + Robot.run(teleop_input) + print("Tele-operated mode has started!") + +def teleop_main(): + if(Keyboard.get_value("w") == True): + Robot.set_value(motor_id, "velocity_a", 1.0) # sets the value of motor 1 to 100% power if w is pressed + else: + Robot.set_value(motor_id, "velocity_a", 0.0) # sets the value of motor 1 to 0% power when w is not pressed + +#--------------- Extra Functions ---------------# +async def autonomous_actions(): # a seperate function that runs + print("Autonomous action sequence started") + await Actions.sleep(1.0) + print("1 second has passed in autonomous mode") + +async def teleop_input(): + if(Keyboard.get_value("d") == True): + Robot.set_value(motor_id, "velocity_b", 1.0) # sets the value of motor 2 to 100% power if w is pressed + else: + Robot.set_value(motor_id, "velocity_b", 0.0) # sets the value of motor 3 to 0% power when w is not pressed + +``` diff --git a/docs/docs/index.md b/docs/docs/index.md index bda6a9a5..f4a7d1fd 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,13 +1,18 @@ # Welcome to Student API Docs The student API is the set of all functions that the students have available to them to communicate with the robot. Outlined in the glossary will be all relevant infomation to begin coding a Pioneers In Engineering (PiE) robot. + +This glossary encapsulates all the information relavent to programming your robot. In these docs you will find a collection of pages encapsulating each part of programming a robot from uploading your first script to creating your first student code. You can also find infomation explaining how to use PiE specific objects including the `Robot`, `Keyboard`, and `Gamepad` classes. It serves as the starting point for anyone venturing into the world of PiE robotics, offering a solid foundation to explore and create within this field. ## Glossary
  1. Welcome
  2. -
  3. Quickstart
  4. -
  5. Student API
  6. -
  7. Lowcar Device refrence
  8. +
  9. Dawn Quickstart
  10. +
  11. First Program
  12. +
  13. Best Coding Practices
  14. +
  15. API Refrence
  16. +
  17. Device Get
  18. +
  19. Device Set
## Extra Recources diff --git a/docs/first_program.md b/docs/first_program.md deleted file mode 100644 index e33af97c..00000000 --- a/docs/first_program.md +++ /dev/null @@ -1,106 +0,0 @@ -# Getting Started - -Python is a interperited, object-oriented, high-level programming languge. All robots in PiE are coded in Python 3 using a Application User Interface (API) called the student API. This includes all of the front facing classes you will use as a student including `Robot.get_value()`, `Robot.set_value()`, `keyboard.get_value()`, and `gamepad.get_value()`. This section overviews the basic organization of a student robot as well as ways you can debug and trobbleshoot any code issues. - - -## Teleoperated And Autonomous -The teleoperated and Autonomous phases are the two phases outlined in the student rulebook. In the Autonomous phase, you are only allowed to use the `Robot` class from the Student API. Each action must be planned out before the Autonomous phase using a combination of timers and encoder steps. - -The Student API includes a couple of functions built in. - -# Autonomous Mode -The autonomous mode is the first game phase you will encounter. In this mode, you will be required to navigate a task without the use of any input classes: `gamepad` or `keyboard`. Autonomous actions defined in the `def autonomous_main()` will only run once from top to bottom. In contrast, the Teleoperated phase gives you unrestricted access to all of the Student API classes. This means you're allowed to use input from both the `Keyboard` and `Gamepad` classes. Also keep in mind the function `def teleop_main()` will run in a continous loop. This is where you can use decision making statements like `if`, `elif`, and/or `else` to control any of the PiE devices. - -## Autonomous Setup - -This function is run before the Autonomous main function. This is where you could set the values of different attached devices. For instance, if you wanted your motors to drive in the oppisite direction as your set velocity you could do something like: - -```py -motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id - - -def autonomous_setup(): # setup function - Robot.set_value(motor_id, "invert_a", True) # inverts the direction of the device with a coresponding motor_id -``` - -## Autonomous Main -Autonomous Main is the game phase that's ran after setting up. In the function `autonomous_main` you are allowed to write a sequence of functions that will be run durring this period. While running, main function will sequentially run through the list of operations until completed. This could be useful if you want a sequence of python functions to be run one after another without any delay's in the sequence. - - -This sample code uses the `autonomous_main():` function to set the value of a motor to full speed -```py -motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id - -def autonomous_setup(): # setup function runs before autonomous main - pass - -def autonomous_main(): -Robot.set_value(motor_id, "velocity_a", 1) # sets the motor speed to the max speed -``` - -The `autonomous_main` function and `autonomous_setup` aren't very useful alone. However combined with the `Robot.run()` allows for further control over the timings of the code sequence. `Robot.run()` allows someone to run a process on a seperate thread (runs the code at the same time as a main loop). This means a student will be able to use `Robot.sleep(seconds)` to wait before running the next function call. - -do note that although it's not required, you're recommended to assign the function type `async` for any function being run within the `Robot.run()` function. This will define the function as a coroutine and make it easier to seperate from any of your other functions. - -```py -motor_id = "YOUR MOTOR ID HERE" # varible that holds the motor_id - -async def autonomous_actions(): # a custom asynchronous function with a sequence of actions - Robot.set_value(motor_id, "velocity_a", 1) - Robot.sleep(10) # stops for 10 seconds - Robot.set_value(motor_id, "velocity_a", 0.5) - Robot.sleep(0.5) # stops for 0.5 seconds - Robot.set_value(motor_id, "velocity_a", 0) - -# sequence of commands sets the speed of motor A to max speed for ten seconds, then sets the speed to 1/2 of that speed and finally stops the motor - - - -def autonomous_setup(): # runs before autonomous_main() - Robot.run(autonomous_actions) # runs the function autonomous actions on a seperate thread - -def autonomous_main(): - # where the autonomous actions are ran -``` - - - -# Teleoperated Mode - - -## `def teleop_main()` - - - -## Template Code -This example code is how your program could be organized. Each - - -```py - -left_motor = "YOUR MOTOR ID HERE" -right_motor = "YOUR MOTOR ID HERE" -def autonomous_setup(): #determines what will be done before `def_autonomous_main():` runs - print("Autonomous mode has started!") - Robot.run(autonomous_actions) - -def autonomous_main(): #where you put a sequence of actions - pass - -async def autonomous_actions(): # a seperate function that runs - print("Autonomous action sequence started") - await Actions.sleep(1.0) - print("1 second has passed in autonomous mode") - -def teleop_setup(): - print("Tele-operated mode has started!") - -def teleop_main(): - if Gamepad.get_value("joystick_right_y") > 0.5: - Robot.set_value(left_motor, "duty_cycle", -0.5) - Robot.set_value(right_motor, "duty_cycle", -0.5) - else: - Robot.set_value(left_motor, "duty_cycle", 0) - Robot.set_value(right_motor, "duty_cycle", 0) - -``` \ No newline at end of file diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index a53caabf..dcbd9793 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -2,23 +2,22 @@ site_name: Pioneers in Engineering Documentation site_url: https://example.com/ site_author: Ian Leung nav: - #introductions + # introduction - Home: 'index.md' - #starting your first robot - - Building Your First Robot: + # starting your first robot + - Building Your First Robot: 'building_first_robot.md' + - Connecting To Your Robot: 'dawn_quickstart.md' + # kit extension - Base Kit Manual: - - Software: - - Dawn Tutorial: - - Quickstart Guide: - #software stuff + - Dawn Tutorial: 'dawn_quickstart.md' + # software stuff - Getting Started: - - Your First Program: - - + - Your First Program: 'first_program.md' - API Refrence: 'api.md' - Devices: - - Devices: 'device.md' + - Devices: - Device Get: 'device_get.md' - Device Set: 'device_set.md' theme: readthedocs -#to start this server cd into docs and use `mkdocs serve` \ No newline at end of file +# to start this server cd into docs and use `mkdocs serve` \ No newline at end of file From 3b868414a93a892fca1a6ef77d6d6050cc771335 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Tue, 26 Sep 2023 13:30:43 -0700 Subject: [PATCH 08/12] [DOCS] adds dawn quickstart --- docs/docs/building_first_robot.md | 0 docs/docs/dawn_quickstart.md | 32 +++++++++++++++++++++---------- docs/mkdocs.yml | 2 -- 3 files changed, 22 insertions(+), 12 deletions(-) delete mode 100644 docs/docs/building_first_robot.md diff --git a/docs/docs/building_first_robot.md b/docs/docs/building_first_robot.md deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/docs/dawn_quickstart.md b/docs/docs/dawn_quickstart.md index 332b6265..ea74c619 100644 --- a/docs/docs/dawn_quickstart.md +++ b/docs/docs/dawn_quickstart.md @@ -1,14 +1,16 @@ # Dawn Tutorial -In this tutorial you will install dawn and create your first student code file using the Student API. - -This tutorial is intended for beginners to the Student API and it's functions. +Dawn is the software you will use to interface with your robot. It is a code editor with features that allow you to upload and download code from your robot as well as testing your code through the code runner. Dawn will also display infomation about any connected PiE device for example a motor controller or a limit switch. In this tutorial you will install dawn and create your first student code file using the Student API. # Getting Started +To install dawn you will need a couple of prerequisites +- a mac, linux, or windows computer +- install of dawn + ## Installing Dawn -To install Dawn, go to https://github.com/pioneers/dawn/releases/ and install the latest release for your coresponding operating system. +To install Dawn, go to https://github.com/pioneers/dawn/releases/ and install the latest release for your coresponding operating system. Extract the file using your operating system's unzipping method and then follow the next os specific steps ## Windows @@ -18,15 +20,21 @@ Extracting the ZIP file will create a new folder. Open this folder and find the ![Dawn.exe](image.png) -bla bla bla run the exe +## Linux -open up dawn +After installing the dawn-linux-x64.zip unzip to your desiered install directory. Then with the shell open use the commands -follow rest of instructions +```console +user@pc:~$ cd [dawn parent directory]\home\sberkun\Documents\pie\dawn\dawn-packaged\dawn-linux-x64 +``` -## Linux -download file from here +After changing the parent directory to match your own install. This command will put you into the working directory of dawn. From there you can start the program by running the script using the following command +```console +user@pc:~$ ./dawn +``` + +Assuming you have a linux gui, the program will run displaying dawn ## MacOS @@ -36,4 +44,8 @@ After installing Dawn you will be presented with Dawn, as well as a interactive ![Dawn Starting guide](image-1.png) -To go through the guide, click on the red button after pressing +The tour will go through all of the special features of dawn including the run modes. + +## Getting Connected + +To connect to your robot you will first asdkmlkm \ No newline at end of file diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index dcbd9793..dff0fac1 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -5,7 +5,6 @@ nav: # introduction - Home: 'index.md' # starting your first robot - - Building Your First Robot: 'building_first_robot.md' - Connecting To Your Robot: 'dawn_quickstart.md' # kit extension - Base Kit Manual: @@ -15,7 +14,6 @@ nav: - Your First Program: 'first_program.md' - API Refrence: 'api.md' - Devices: - - Devices: - Device Get: 'device_get.md' - Device Set: 'device_set.md' From b4b5cecf161ac64a2335fee59729c11d71216f72 Mon Sep 17 00:00:00 2001 From: somedude <55222116+finnisherthefin@users.noreply.github.com> Date: Fri, 29 Sep 2023 22:23:09 -0700 Subject: [PATCH 09/12] [DOCS] formatting and spelling changes --- docs/docs/api.md | 181 ++++++++++++++++------------------- docs/docs/dawn.png | Bin 0 -> 42601 bytes docs/docs/dawn_quickstart.md | 23 +++-- docs/docs/first_program.md | 30 +++--- docs/docs/image-2.png | Bin 0 -> 431 bytes docs/docs/image-3.png | Bin 0 -> 34572 bytes docs/docs/image.png | Bin 42601 -> 28689 bytes docs/docs/index.md | 8 +- 8 files changed, 116 insertions(+), 126 deletions(-) create mode 100644 docs/docs/dawn.png create mode 100644 docs/docs/image-2.png create mode 100644 docs/docs/image-3.png diff --git a/docs/docs/api.md b/docs/docs/api.md index 9184898b..c654de2f 100644 --- a/docs/docs/api.md +++ b/docs/docs/api.md @@ -2,34 +2,32 @@ The Student API is the set of functions available to students to communicate with their robots. The api can be split into two distinct class types. The Robot Class used for getting, setting, and running functions; input classes including the Gamepad Class and the Keyboard Class which are used to take student input to control their robots. -for more infomation refer to the Student API section of the [Runtime Wiki](https://github.com/pioneers/runtime/wiki) +for more information refer to the Student API section of the [Runtime Wiki](https://github.com/pioneers/runtime/wiki) # - -[//]: # "find better word for code periods later" - -- [Run Mode](#run-mode) - - [`Teleop` Period](#teleop-period) - - [`Auto` Period](#auto-period) -- [`Robot` Class](#robot-class) - - [`Robot.get_value(device_id, param)`](#robotget_valuedevice_id-param) - - [`Robot.set_value(device_id, param, value)`](#robotset_valuedevice_id-param-value) - - [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) - - [`Robot.is_running(function_name)`](#robotis_runningfunction_name) - - [`Robot.sleep(seconds)`](#robotsleepseconds) -- [Input Classes](#input-classes) - _ [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) - _ [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) +[//]: # (find better word for code periods later) +* [Run Mode](#run-mode) + * [`Teleop` Period](#teleop-period) + * [`Auto` Period](#auto-period) +* [`Robot` Class](#robot-class) + * [`Robot.get_value(device_id, param)`](#robotget_valuedevice_id-param) + * [`Robot.set_value(device_id, param, value)`](#robotset_valuedevice_id-param-value) + * [`Robot.run(function_name, args...)`](#robotrunfunction_name-args) + * [`Robot.is_running(function_name)`](#robotis_runningfunction_name) + * [`Robot.sleep(seconds)`](#robotsleepseconds) +* [Input Classes](#input-classes) + * [`Gamepad.get_value(name_of_input)`](#gamepadget_valuename_of_input) + * [`Keyboard.get_value(name_of_key)`](#keyboardget_valuename_of_key) # Run Mode +The two run modes, `autonomous` and `teleop` are where a majority of student code will be run. These functions are run in the Autonomous period and Teleoperated period of a PiE competition. Autonomous code restricts student's access to the `Keyboard` and `Gamepad` functions, forcing them to write code that will run without any input. The Teleoperated period allows for control from both, giving students more freedom to control their robot through any of the challenges presented in that phase. -The two run modes, `autonomous` and `teleop` are where a majority of student code will be run. These functions are run in the Autonous period and Teleoperated period of a PiE compatition. Autonomous code restricts student's access to the `Keyboard` and `Gamepad` functions, forcing them to write code that will run without any input. The Teleoperated perod allows for control from both, giving students more freedom to control ther robot through any of the challenges presented in that phase. -## `AUTO` Period +## `AUTO` Period The autonomous or `AUTO` period is used anytime keyboard or controller input is restricted. Within this period you are encouraged to write code that will be able to run without any user input. -An example of this would be running a robot foward for a set duration within an `AUTO` period +An example of this would be running a robot forward for a set duration within an `AUTO` period ```py motor = "//INSERT MOTOR ID HERE//" @@ -40,54 +38,48 @@ def autonomous_main(): Robot.sleep(10) # stops the execution of any other functions for a specified number of seconds Robot.set_value(motor, velocity_a, 0) ``` +For more recourses please refer to the [Software Hub Autonomous Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) -For more recources please refer to the [Software Hub Autonomous Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) ## `TELEOP` Period + The teleoperated or `TELEOP` period is used anytime remote input via a controller or keyboard is used. The `teleop_main()` function runs in a loop until the teleoperated period has completed. -The teleoperated or `TELEOP` period is used anytime remote input via a controller or keyboard is used. The `teleop_main()` function runs in a loop until the teleoperated period has completed. - -This code is most useful when a student would like to use controller or keyboard input to control their robot on the gamefield. + This code is most useful when a student would like to use controller or keyboard input to control their robot on the game field. ```py motor = "//INSERT MOTOR ID HERE//" def teleop_main(): # sets the motor's velocity to max if the button A is pressed - if(Gamepad.get_value(button_a) == True): + if(Gamepad.get_value(button_a) == True): Robot.set_value(motor, velocity_a, 1) ``` For more recources please refer to the [Software Hub Teleop Guide](https://pioneers.berkeley.edu/competition/SoftwareHub/Teleop/) - ## `SETUP` Phase + The `SETUP` phase prepares for either the `AUTO` or `TELEOP` function to be run. In this phase a student can set or get the value of any lowcar device (any device connected to the robot that can be controlled with the PiE api). -The `SETUP` phase prepares for either the `AUTO` or `TELEOP` function to be run. In this phase a student can set or get the value of any lowcar device (any device connected to the robot interactable using the PiE api). - -This function is useful when a student would want to turn off the CURRENTLY BROKEN PiD control on a motor controller - + This function is useful when a student would want to turn off the CURRENTLY BROKEN PiD control on a motor controller ```py motor = "//INSERT MOTOR ID HERE//" def teleop_setup(): # code segment run before the teleop_main() function Robot.set_value(motor, pid_enabled_a, False) Robot.set_value(motor, pid_enabled_b, False) - + def autonomous_setup(): # code segment run before the autonomous_main() function Robot.set_value(motor, pid_enabled_a, False) Robot.set_value(motor, pid_enabled_b, False) ``` # `Robot` Class - -The robot class holds all methods for interacting with various arduino devices connected to a student’s robot. These devices include servos, motors, and sensors. +The robot class holds all methods for interacting with various arduino devices connected to a student’s robot. These devices include servos, motors, and sensors. ## `Robot.get_value(device_id, param)` +The get_value function returns the current value of a specified `param` of the device with the specified device_id. -The get_value function returns the current value of a specified `param` of the device with the specified device_id. - -- `device_id`: the ID that specifies which PiE device will be read -- `param`: identifies which parameter on the specified PiE device will be read. Possible param values depend on the specified device. Find a list of params for each device on the device get page +* `device_id`: the ID that specifies which PiE device will be read +* `param`: identifies which parameter on the specified PiE device will be read. Possible param values depend on the specified device. Find a list of params for each device on the device get page The function is useful for checking the current state of devices. For example, getting the current state of the limit switch using its device_id and the param “switch0” will return the value True when pressed down and False if not. @@ -105,27 +97,26 @@ def teleop_main(): # first parameter is the limit switch's id # second parameter tells which switch to get the value from - # in this case the method will retun True or False depending on if the switch is pressed down or not + # in this case the method will return True or False depending on if the switch is pressed down or not Robot.get_value(limit_switch, switch0) pass ``` - For more examples and devices refer to the devices page in the reference -## `Robot.set_value(device_id, param, value)` +## `Robot.set_value(device_id, param, value)` The `set_value` function sets a specified value to a device’s parameter -- `device_id`: the ID that specifies which PiE device will have its parameter set -- `param`: determines which parameter should be set. The parameters depend on the specified Lowcar device and can be found at INCLUDE LINK TO LOWCAR DEVICE PAGE -- `value` - the value to set the parameter to +* `device_id`: the ID that specifies which PiE device will have its parameter set +* `param`: determines which parameter should be set. The parameters depend on the specified Lowcar device and can be found at INCLUDE LINK TO LOWCAR DEVICE PAGE +* `value` - the value to set the parameter to -This function is useful for setting the state of parts of your robot while driving. For example calling the set_value param `“velcoity_a”` with a KoalaBear device (motor controller) with a value of `1` results in the attached motor spinning forwards at full power +This function is useful for setting the state of parts of your robot while driving. For example calling the set_value param `“velocity_a”` with a KoalaBear device (motor controller) with a value of `1` results in the attached motor spinning forwards at full power -[//]: <> (MAKE CODE SEGMENTS COLLAPSABLE) +[//]: <> (MAKE CODE SEGMENTS COLLAPSIBLE) ```py # first segment of code ran in the teleop process motor = "//INSERT MOTOR ID HERE//" @@ -135,9 +126,8 @@ def teleop_setup(): pass def teleop_main(): - # example code for turning a motor foward at full speed - - # first parameter is the motor controller's id set as a varible + # example code for turning a motor forward at full speed + # first parameter is the motor controller's id set as a variable # second parameter 'velocity_a' tells a motor controller which motor to drive # third parameter sets the value @@ -147,19 +137,17 @@ def teleop_main(): ``` ## `Robot.run(function_name, args)` - The `Robot.run()` runs another function, passing the `args` fed into the function. The `function_name` is run in parallel to any other code run following the `Robot.run()` function. -- `function_name`: the name of a function in the student code which will be run simultaneously with the main loop +* `function_name`: the name of a function in the student code which will be run simultaneously with the main loop -- `args`: this is a list of zero or more inputs, which will be passed to the function_name specified previously as arguments (inputs) +* `args`: this is a list of zero or more inputs, which will be passed to the function_name specified previously as arguments (inputs) -[//]: <> (I want to seperate the code example and this line of text. Not exactly sure how to do it so adding this comment to come back to it) -An example of this would if a student would want to run a process alongside the teleop_main loop. Using the Robot.sleep class to define the amount of time a motor should rotate for without stopping the teleop_main loop. +[//]: <> (I want to separate the code example and this line of text. Not exactly sure how to do it so adding this comment to come back to it) +An example of this would if a student would want to run a process alongside the teleop_main loop. Using the Robot.sleep class to define the amount of time a motor should rotate for without stopping the teleop_main loop. ​ [//]: <> (FULL CODE WITHOUT ANY REMOVED CODE SEGMENTS //REMOVE//) - ```py ARM_MOTOR = "INSERT MOTOR_ID HERE" DRIVE_MOTOR = "INSERT MOTOR_ID HERE" @@ -186,9 +174,9 @@ def teleop_main(): ``` -## `Robot.is_running(function_name)` -The `Robot.is_running()` function returns a boolean value (`True` or `False`) for whether or not the specified function is still running. +## `Robot.is_running(function_name)` +The `Robot.is_running()` function returns a boolean value (`True` or `False`) for whether or not the specified function is still running. `function_name`: the name of a function defined by the student. If run through `Robot.run()` it will be the same inputted `function_name` @@ -197,26 +185,28 @@ An example usage of this would be to wait for a `Robot.run()` process to finish ```py def robot_actions(): - #series of actions from the Robot.set_value(). + # series of actions from the Robot.set_value(). def teleop_setup(): pass +# if the button A is pressed down and robot_actions are not running. Then the robot will be able to run robot_actions again. Will not run if the button A is not pressed or if robot_actions is running def teleop_main(): - if Gamepad.get_value(button_a) and not Robot.is_running(robot_actions): # if the button A is pressed down and robot_actions are not running. Then the robot will be able to run robot_actions again. Will not run if the button A is not pressed or if robot_actions is running + if Gamepad.get_value(button_a) and not Robot.is_running(robot_actions): Robot.run(robot_actions) ``` -## `Robot.sleep(seconds)` + +## `Robot.sleep(seconds)` Pauses the execution of the current function for the specified number of `seconds`. `seconds`: the number of `seconds` to pause the execution of the current function for. It should be emphasized that calling `Robot.sleep` in one function does not cause any other function that is being run by `Robot.run()` or the main loop function to pause. Only the instance of the function that is executing the call to `Robot.sleep` will pause execution. It is highly recommended to not use this function in the setup functions or main loop functions--only in functions executed by `Robot.run()`. -a great place to use `Robot.sleep()` would be to make a robot go to a specific spot using set motor velocities and ammount of time each function should run. +a great place to use `Robot.sleep()` would be to make a robot go to a specific spot using set motor velocities and ammount of time each function should run. [//]: <> (could go further and say that `Robot.sleep()` combined with encoder ticks per revolution could allow you to specify a distance your robot could go) ```py @@ -231,7 +221,7 @@ def autonomous_main(): pass def autonomous_actions(): - print("Action 1") # action one sets the motor velocites to 1 + print("Action 1") # action one sets the motor velocities to 1 Robot.set_value(MOTOR_ID, "velocity_b", 1.0) Robot.set_value(MOTOR_ID, "velocity_a", 1.0) Robot.sleep(1.0) # holds the function for one second before running the next lines @@ -242,12 +232,10 @@ def autonomous_actions(): ``` # Input Classes - -The input classes are both of the input classes that can only be run durring the teleoperated game phase. These two classes allow a student to recieve a booliean value for whether or not a button is pressed down or not. Most students will use these classes to +The input classes are both of the input classes that can only be run during the teleoperated game phase. These two classes allow a student to receive a boolean value for whether or not a button is pressed down or not. Most students will use these classes to ## `Gamepad.get_value(input)` - -The `Gamepad` class recieves input for when there is a change to a controller. This class is only usable durring the teleop phase. +The `Gamepad` class receives input for when there is a change to a controller. This class is only usable during the teleop phase. `input`: identifies which button or joystick will be returned. This function is useful for checking the state of a button or joystick @@ -259,58 +247,51 @@ def teleop_main(): if Gamepad.get_value("button_a"): print("hello world") ``` - -This function is essential for controlling your robot with the gamepad. +This function is essential for controlling your robot with the game pad. The possible button inputs are: - -- "button_a" -- "button_b" -- "button_x" -- "button_y" -- "l_bumper" -- "r_bumper" -- "l_trigger" -- "r_trigger" -- "button_back" -- "button_start" -- "l_stick" -- "r_stick" -- "dpad_up" -- "dpad_down" -- "dpad_left" -- "dpad_right" -- "button_xbox" +* "button_a" +* "button_b" +* "button_x" +* "button_y" +* "l_bumper" +* "r_bumper" +* "l_trigger" +* "r_trigger" +* "button_back" +* "button_start" +* "l_stick" +* "r_stick" +* "dpad_up" +* "dpad_down" +* "dpad_left" +* "dpad_right" +* "button_xbox" The possible joystick inputs are: - -- "joystick_left_x" -- "joystick_left_y" -- "joystick_right_x" -- "joystick_right_y" +* "joystick_left_x" +* "joystick_left_y" +* "joystick_right_x" +* "joystick_right_y" Note that the joysticks function differently from the button inputs. Rather then returning a Boolean `[True or False]`, they return a floating point value ranging from `-1.0 `and` 1.0` (inclusive) ## `Keyboard.get_value(input)` - -The `Keyboard` class allows a student to recieve keyboard input. Like the `Gamepad` class, it is only usable durring the teleop game phase. +The `Keyboard` class allows a student to receive keyboard input. Like the `Gamepad` class, it is only usable during the teleop game phase. `input`: identifies which key is being read. When pressed the `get_value` will return a `True` boolean and `False` when not. possible keyboard inputs are: - -- The letters on the keyboard, lowercase and no spaces `"a"`-`"z"` -- The numbers on the keyboard, no spaces `"0"`-`"9"` -- The punctuation keys `","`, `"."`, `"/"`, `";"`, `"'"`, `"["`, `"]"` -- The four arrow keys `"left_arrow"`, `"right_arrow"`, `"up_arrow"`, `"down_arrow"` +* The letters on the keyboard, lowercase and no spaces `"a"`-`"z"` +* The numbers on the keyboard, no spaces `"0"`-`"9"` +* The punctuation keys `","`, `"."`, `"/"`, `";"`, `"'"`, `"["`, `"]"` +* The four arrow keys `"left_arrow"`, `"right_arrow"`, `"up_arrow"`, `"down_arrow"` For example, if you wanted to print `"hello world"` when the `"w"` is pressed and false when it isn't you would use the function as a condition in an if statement - + ```py # segment of code will print "hello world" into the console when the w key is pressed def teleop_main(): if Keyboard.get_value("w"): print("hello world") - - -``` +``` \ No newline at end of file diff --git a/docs/docs/dawn.png b/docs/docs/dawn.png new file mode 100644 index 0000000000000000000000000000000000000000..bc33fe8020999228675be434cfc5c5a0c6ab65fd GIT binary patch literal 42601 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 Z1^`-Pbj~t=DY^gv002ovPDHLkV1h-KrZoTn literal 0 HcmV?d00001 diff --git a/docs/docs/image-3.png b/docs/docs/image-3.png new file mode 100644 index 0000000000000000000000000000000000000000..dda5ee902f19422a3a0d556fa0e398ad32ac2ab7 GIT binary patch literal 34572 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 literal 0 HcmV?d00001 diff --git a/docs/docs/image.png b/docs/docs/image.png index bc33fe8020999228675be434cfc5c5a0c6ab65fd..2f8fe0e9fb60430cc2d23a77c0c9b5ef80404d8b 100644 GIT binary patch literal 28689 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

oQF-Q$A#wnbv&#VF#Edy|Kjpv;MQL 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 literal 42601 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 @@ -20,4 +21,5 @@ This glossary encapsulates all the information relavent to programming your robo * [Software Hub](https://pioneers.berkeley.edu/competition/SoftwareHub) * [Compatition Infomation](https://pioneers.berkeley.edu/Competition) * [Runtime Wiki](https://github.com/pioneers/runtime/wiki) -* *game manual someday :)* \ No newline at end of file +* *game manual someday :)* + From 98b59422f8bce802f2915551fa0a723f302eafd3 Mon Sep 17 00:00:00 2001 From: somedude <55222116+finnisherthefin@users.noreply.github.com> Date: Sun, 1 Oct 2023 23:20:09 -0700 Subject: [PATCH 10/12] [DOCS] yml updates --- docs/mkdocs.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index dff0fac1..9e7e31cf 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -7,15 +7,12 @@ nav: # starting your first robot - Connecting To Your Robot: 'dawn_quickstart.md' # kit extension - - Base Kit Manual: - Dawn Tutorial: 'dawn_quickstart.md' # software stuff - - Getting Started: - - Your First Program: 'first_program.md' - - API Refrence: 'api.md' - - Devices: - - Device Get: 'device_get.md' - - Device Set: 'device_set.md' + - Your First Program: 'first_program.md' + - API Reference: 'api.md' + - Device Get: 'device_get.md' + - Device Set: 'device_set.md' theme: readthedocs # to start this server cd into docs and use `mkdocs serve` \ No newline at end of file From e0f60322330d9d34479528cc356d8aa83bf2f118 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Thu, 5 Oct 2023 20:38:45 -0700 Subject: [PATCH 11/12] [DOCS] changes to device descriptions --- docs/docs/device.md | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/docs/docs/device.md b/docs/docs/device.md index b422b7ee..8d2ac1cb 100644 --- a/docs/docs/device.md +++ b/docs/docs/device.md @@ -1,9 +1,24 @@ -# Lowcar Device refrence +# Lowcar Device reference -Lowcar devices are the physical devices students use to interact with the game field. Each device uses the Student API to interface with them. Here you will find in deph explanations of each device and how to control them. +Lowcar is the name given to all of the code in the repo that runs on an Arduino microcontroller, which controls the various devices. Most of your teleoperated code will designed to interface with these lowcar devices. These devices include BatteryBuzzer, KoalaBear (motor controller), LimitSwitch, LineFollower, and ServoControl. In this tutorial, you will find in-depth explanations of each device and how to control them. -[//]: <> (link to the student api later) +For more detailed information and descriptions on the Lowcar devices please refer to the [runtime wiki](https://github.com/pioneers/runtime/wiki/Lowcar) -# +# More Background on the infomration + +in each device page, the device information will be separated into three parts, a photo of the device, the device's parameters, a general description of it's intended usage and other possible applications. + +## Limit Switch +![Limit Switch](https://raw.githubusercontent.com/pioneers/runtime-docs/master/device-pics/LimitSwitch.JPG) + +### Parameters +| Name | Data type | Readable| Writeable | +|---------|-----------|---------|-----------| +| switch0 | BOOL | TRUE | FALSE | +| switch1 | BOOL | TRUE | FALSE | +| switch2 | BOOL | True | FALSE | + + + +A limit switch is a device wired with three switches. These switches, `switch0`, `switch1`, AND `switch2` each have a metal actuator attached to them. The original purpose of a limit switch is to limit an object from going past a certain endpoint. However, it's use isn't limited to limiting the range of an object, for example using it to detect the presence of an object in a certain place or not. -insert glossary stuff later From 3891a371482f845d7c4d111b05d91eabbb3bb160 Mon Sep 17 00:00:00 2001 From: finnisherthefin <55222116+finnisherthefin@users.noreply.github.com> Date: Sat, 2 Mar 2024 02:06:25 -0800 Subject: [PATCH 12/12] [DOCS] adds readthedocs.yaml --- docs/.readthedocs.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 docs/.readthedocs.yaml diff --git a/docs/.readthedocs.yaml b/docs/.readthedocs.yaml new file mode 100644 index 00000000..b67bdf03 --- /dev/null +++ b/docs/.readthedocs.yaml @@ -0,0 +1,19 @@ +# Read the Docs configuration file for MkDocs projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.12" + +mkdocs: + configuration: mkdocs.yml + +# Optionally declare the Python requirements required to build your docs +python: + install: + - requirements: docs/requirements.txt \ No newline at end of file