Files
revpimodio2/docs/quickstart.rst
T
akira 3294c5e980 docs: Update documentation for improved clarity and consistency
Revised various sections across multiple documentation files to reflect
updated methods (`run_plc` replacing manual setup with `cycleloop`) and
adjust for new default parameters (e.g., `autorefresh`). Enhanced
descriptions for timers, Cycletools usage, and new method explanations.
Removed outdated or redundant examples and updated system requirements.

Signed-off-by: Sven Sager <akira@narux.de>
2026-02-17 12:05:58 +01:00

4.6 KiB

<?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <style type="text/css"> /* :Author: David Goodger (goodger@python.org) :Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } .subscript { vertical-align: sub; font-size: smaller } .superscript { vertical-align: super; font-size: smaller } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { overflow: hidden; } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title, .code .error { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin: 0 0 0.5em 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left, .figure.align-left, object.align-left, table.align-left { clear: left ; float: left ; margin-right: 1em } img.align-right, .figure.align-right, object.align-right, table.align-right { clear: right ; float: right ; margin-left: 1em } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } table.align-center { margin-left: auto; margin-right: auto; } .align-left { text-align: left } .align-center { clear: both ; text-align: center } .align-right { text-align: right } /* reset inner alignment in figures */ div.align-right { text-align: inherit } /* div.align-center * { */ /* text-align: left } */ .align-top { vertical-align: top } .align-middle { vertical-align: middle } .align-bottom { vertical-align: bottom } ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font: inherit } pre.literal-block, pre.doctest-block, pre.math, pre.code { margin-left: 2em ; margin-right: 2em } pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } pre.code .literal.string, code .literal.string { color: #0C5404 } pre.code .name.builtin, code .name.builtin { color: #352B84 } pre.code .deleted, code .deleted { background-color: #DEB0A1} pre.code .inserted, code .inserted { background-color: #A3D289} span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic, pre.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; padding-left: 0 } /* "booktabs" style (no vertical lines) */ table.docutils.booktabs { border: 0px; border-top: 2px solid; border-bottom: 2px solid; border-collapse: collapse; } table.docutils.booktabs * { border: 0px; } table.docutils.booktabs th { border-bottom: thin solid; text-align: left; } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } ul.auto-toc { list-style-type: none } </style> </head>

Quick Start

System Message: WARNING/2 (<stdin>, line 1)

Title overline too short.

==========
Quick Start
==========

This guide will help you write your first RevPiModIO program.

Basic Concepts

RevPiModIO provides two main programming paradigms:

  • Cyclic Programming - Execute a function at regular intervals (PLC-style)
  • Event-Driven Programming - Register callbacks triggered by hardware changes

Both approaches use the same core objects:

  • rpi.io - Access inputs and outputs by name
  • rpi.core - Control LEDs, watchdog, and system status
  • rpi.device - Access specific hardware devices

Hardware Configuration

Before programming, configure your hardware using piCtory:

  1. Access piCtory web interface on your RevPi Core module
  2. Add and configure your I/O modules
  3. Assign symbolic names to inputs and outputs
    • Example: button, led, temperature
    • Good names make your code readable
  4. Save configuration and activate

Your First Program

Simple Input to Output

The simplest program reads an input and controls an output:

import revpimodio2

# Initialize with auto-refresh
rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Read input and control output
if rpi.io.button.value:
    rpi.io.led.value = True
else:
    rpi.io.led.value = False

# Clean up
rpi.exit()

Cyclic Program

For continuous operation, use a cyclic loop:

import revpimodio2

def main_cycle(ct: revpimodio2.Cycletools):
    """Called every cycle (default: 20-50ms)."""

    if ct.first:
        # Initialize on first cycle
        ct.var.counter = 0
        print("Program started")

    # Main logic
    if ct.io.button.value:
        ct.io.led.value = True
    else:
        ct.io.led.value = False

    # Count button presses
    if ct.changed(ct.io.button, edge=revpimodio2.RISING):
        ct.var.counter += 1
        print(f"Button pressed {ct.var.counter} times")

    if ct.last:
        # Cleanup on exit
        print("Program stopped")

# Run cyclic loop
revpimodio2.run_plc(main_cycle)

Event-Driven Program

For event-based operation, use callbacks:

import revpimodio2

rpi = revpimodio2.RevPiModIO(autorefresh=True)

def on_button_press(ioname, iovalue):
    """Called when button changes."""
    print(f"Button is now: {iovalue}")
    rpi.io.led.value = iovalue

# Register event callback
rpi.io.button.reg_event(on_button_press)

# Handle shutdown signals
rpi.handlesignalend()

# Start event loop
rpi.mainloop()

LED Control

Control the RevPi status LEDs:

import revpimodio2

rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Set LED colors using constants
rpi.core.A1 = revpimodio2.GREEN  # Success
rpi.core.A2 = revpimodio2.RED    # Error
rpi.core.A3 = revpimodio2.OFF    # Off

# Or control individual colors
rpi.core.a1green.value = True
rpi.core.a1red.value = False

rpi.exit()

Common Patterns

Initialize and Cleanup

Always initialize variables and clean up resources:

def main_cycle(ct):
    if ct.first:
        # Initialize
        ct.var.state = "IDLE"
        ct.var.error_count = 0

    # Main logic here...

    if ct.last:
        # Cleanup
        ct.io.motor.value = False
        print(f"Errors: {ct.var.error_count}")

Edge Detection

Detect rising or falling edges:

def main_cycle(ct):
    # Detect button press (rising edge)
    if ct.changed(ct.io.button, edge=revpimodio2.RISING):
        print("Button pressed!")

    # Detect button release (falling edge)
    if ct.changed(ct.io.button, edge=revpimodio2.FALLING):
        print("Button released!")

Timers

Use built-in cycle-based timers:

def main_cycle(ct):
    # On-delay: Input must be True for 10 cycles
    ct.set_tonc("startup", 10)
    if ct.get_tonc("startup"):
        ct.io.motor.value = True

    # Pulse: Generate 5-cycle pulse
    if ct.io.trigger.value:
        ct.set_tpc("pulse", 5)
    ct.io.pulse_output.value = ct.get_tpc("pulse")

Next Steps

  • :doc:`basics` - Core concepts and configuration

    System Message: ERROR/3 (<stdin>, line 201); backlink

    Unknown interpreted text role "doc".

  • :doc:`cyclic_programming` - Cyclic programming patterns

    System Message: ERROR/3 (<stdin>, line 202); backlink

    Unknown interpreted text role "doc".

  • :doc:`event_programming` - Event-driven programming patterns

    System Message: ERROR/3 (<stdin>, line 203); backlink

    Unknown interpreted text role "doc".

  • :doc:`advanced` - Advanced topics and best practices

    System Message: ERROR/3 (<stdin>, line 204); backlink

    Unknown interpreted text role "doc".

  • :doc:`api/index` - API reference

    System Message: ERROR/3 (<stdin>, line 205); backlink

    Unknown interpreted text role "doc".

</html>