1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//! For use with the [`entry`] macro.

use libc_print::std_name::*;

use crate::rtos::Context;

/// A trait representing a competition-ready VEX Robot.
pub trait Robot {
    /// Runs at startup, constructing your robot. This should be non-blocking,
    /// since the FreeRTOS scheduler doesn't start until it returns.
    fn new() -> Self;

    /// Runs immediately after [`Robot::new`]. The FreeRTOS scheduler is running
    /// by this point.
    ///
    /// The purpose of this method is to provide a hook to run things on startup
    /// which require a reference to all or part of the robot structure; since
    /// it takes `&'static self` as its parameter, the lifetime of the robot
    /// object is guaranteed to be static (i.e., forever), and so the
    /// implementation may pass references around (e.g., to new tasks) at will
    /// without issue.
    fn initialize(&'static self, _ctx: Context) {}

    /// Runs during the autonomous period.
    fn autonomous(&'static self, _ctx: Context) {
        println!("autonomous");
    }

    /// Runs during the opcontrol period.
    fn opcontrol(&'static self, _ctx: Context) {
        println!("opcontrol");
    }

    /// Runs when the robot is disabled.
    fn disabled(&'static self, _ctx: Context) {
        println!("disabled");
    }
}