[hal, wpilib] Add OpMode support (#7744)

User code:
- OpModeRobot used as the robot base class
- LinearOpMode and PeriodicOpMode are provided opmode base classes
- In Java, annotations can be used to automatically register opmode classes

Additional user code functionality:
- OpMode (string) is available in addition to the overall
auto/teleop/test robot mode
- OpMode does not indicate enable (enable/disable is still separate)
- The HAL API uses integer UIDs; these are exposed at the user API level
as well for faster checks
- User code creates opmodes on startup (these have name, category,
description, etc).

DS:
- DS will present opmode selection lists for auto and teleop for
match/practice. During a match, the DS will automatically activate the
selected opmode in the corresponding match period.
- For testing, an overall mode is selected (e.g. teleop/auto/test) and a
single opmode is selected

Future work:
- Command framework support/integration
- Python annotation support
- Unit tests (needs race-free DS sim updates)
- Porting of examples

Co-authored-by: Joseph Eng <91924258+KangarooKoala@users.noreply.github.com>
This commit is contained in:
Peter Johnson
2025-12-12 21:25:57 -07:00
committed by GitHub
parent 2a41b80e00
commit dacded37e5
163 changed files with 7454 additions and 2175 deletions

View File

@@ -54,10 +54,10 @@ typedef struct _mrc_proto_ProtobufControlData {
static std::string_view msg_name(void) noexcept;
static pb_filedesc_t file_descriptor(void) noexcept;
uint32_t ControlWord;
int32_t MatchTime;
pb_callback_t Joysticks;
uint64_t CurrentOpMode;
uint32_t ControlWord;
} mrc_proto_ProtobufControlData;
typedef struct _mrc_proto_ProtobufJoystickDescriptor {
@@ -127,6 +127,10 @@ typedef struct _mrc_proto_ProtobufOpMode {
uint64_t Hash;
pb_callback_t Name;
pb_callback_t Group;
pb_callback_t Description;
int32_t TextColor;
int32_t BackgroundColor;
} mrc_proto_ProtobufOpMode;
typedef struct _mrc_proto_ProtobufAvailableOpModes {
@@ -163,28 +167,28 @@ typedef struct _mrc_proto_ProtobufConsoleLineTimestamp {
#define mrc_proto_ProtobufFingerData_init_default {0, 0, 0}
#define mrc_proto_ProtobufTouchpadData_init_default {{{NULL}, NULL}}
#define mrc_proto_ProtobufJoystickData_init_default {0, 0, 0, {{NULL}, NULL}, 0, 0, {{NULL}, NULL}}
#define mrc_proto_ProtobufControlData_init_default {0, 0, {{NULL}, NULL}, 0}
#define mrc_proto_ProtobufControlData_init_default {0, {{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufJoystickDescriptor_init_default {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufJoystickDescriptors_init_default {{{NULL}, NULL}}
#define mrc_proto_ProtobufJoystickOutput_init_default {0, 0, 0}
#define mrc_proto_ProtobufJoystickOutputs_init_default {{{NULL}, NULL}}
#define mrc_proto_ProtobufMatchInfo_init_default {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufErrorInfo_init_default {0, 0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}}
#define mrc_proto_ProtobufOpMode_init_default {0, {{NULL}, NULL}}
#define mrc_proto_ProtobufOpMode_init_default {0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufAvailableOpModes_init_default {{{NULL}, NULL}}
#define mrc_proto_ProtobufErrorInfoTimestamp_init_default {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufConsoleLineTimestamp_init_default {{{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufFingerData_init_zero {0, 0, 0}
#define mrc_proto_ProtobufTouchpadData_init_zero {{{NULL}, NULL}}
#define mrc_proto_ProtobufJoystickData_init_zero {0, 0, 0, {{NULL}, NULL}, 0, 0, {{NULL}, NULL}}
#define mrc_proto_ProtobufControlData_init_zero {0, 0, {{NULL}, NULL}, 0}
#define mrc_proto_ProtobufControlData_init_zero {0, {{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufJoystickDescriptor_init_zero {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufJoystickDescriptors_init_zero {{{NULL}, NULL}}
#define mrc_proto_ProtobufJoystickOutput_init_zero {0, 0, 0}
#define mrc_proto_ProtobufJoystickOutputs_init_zero {{{NULL}, NULL}}
#define mrc_proto_ProtobufMatchInfo_init_zero {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufErrorInfo_init_zero {0, 0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}}
#define mrc_proto_ProtobufOpMode_init_zero {0, {{NULL}, NULL}}
#define mrc_proto_ProtobufOpMode_init_zero {0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufAvailableOpModes_init_zero {{{NULL}, NULL}}
#define mrc_proto_ProtobufErrorInfoTimestamp_init_zero {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufConsoleLineTimestamp_init_zero {{{NULL}, NULL}, 0, 0}
@@ -201,10 +205,10 @@ typedef struct _mrc_proto_ProtobufConsoleLineTimestamp {
#define mrc_proto_ProtobufJoystickData_POVCount_tag 5
#define mrc_proto_ProtobufJoystickData_POVs_tag 6
#define mrc_proto_ProtobufJoystickData_Touchpads_tag 7
#define mrc_proto_ProtobufControlData_ControlWord_tag 1
#define mrc_proto_ProtobufControlData_MatchTime_tag 2
#define mrc_proto_ProtobufControlData_Joysticks_tag 3
#define mrc_proto_ProtobufControlData_CurrentOpMode_tag 4
#define mrc_proto_ProtobufControlData_ControlWord_tag 5
#define mrc_proto_ProtobufJoystickDescriptor_JoystickName_tag 1
#define mrc_proto_ProtobufJoystickDescriptor_IsGamepad_tag 2
#define mrc_proto_ProtobufJoystickDescriptor_GamepadType_tag 3
@@ -225,6 +229,10 @@ typedef struct _mrc_proto_ProtobufConsoleLineTimestamp {
#define mrc_proto_ProtobufErrorInfo_CallStack_tag 5
#define mrc_proto_ProtobufOpMode_Hash_tag 1
#define mrc_proto_ProtobufOpMode_Name_tag 2
#define mrc_proto_ProtobufOpMode_Group_tag 3
#define mrc_proto_ProtobufOpMode_Description_tag 4
#define mrc_proto_ProtobufOpMode_TextColor_tag 5
#define mrc_proto_ProtobufOpMode_BackgroundColor_tag 6
#define mrc_proto_ProtobufAvailableOpModes_Modes_tag 1
#define mrc_proto_ProtobufErrorInfoTimestamp_ErrorInfo_tag 1
#define mrc_proto_ProtobufErrorInfoTimestamp_Timestamp_tag 2
@@ -261,10 +269,10 @@ X(a, CALLBACK, REPEATED, MESSAGE, Touchpads, 7)
#define mrc_proto_ProtobufJoystickData_Touchpads_MSGTYPE mrc_proto_ProtobufTouchpadData
#define mrc_proto_ProtobufControlData_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, ControlWord, 1) \
X(a, STATIC, SINGULAR, INT32, MatchTime, 2) \
X(a, CALLBACK, REPEATED, MESSAGE, Joysticks, 3) \
X(a, STATIC, SINGULAR, FIXED64, CurrentOpMode, 4)
X(a, STATIC, SINGULAR, FIXED64, CurrentOpMode, 4) \
X(a, STATIC, SINGULAR, UINT32, ControlWord, 5)
#define mrc_proto_ProtobufControlData_CALLBACK pb_default_field_callback
#define mrc_proto_ProtobufControlData_DEFAULT NULL
#define mrc_proto_ProtobufControlData_Joysticks_MSGTYPE mrc_proto_ProtobufJoystickData
@@ -315,7 +323,11 @@ X(a, CALLBACK, SINGULAR, STRING, CallStack, 5)
#define mrc_proto_ProtobufOpMode_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, FIXED64, Hash, 1) \
X(a, CALLBACK, SINGULAR, STRING, Name, 2)
X(a, CALLBACK, SINGULAR, STRING, Name, 2) \
X(a, CALLBACK, SINGULAR, STRING, Group, 3) \
X(a, CALLBACK, SINGULAR, STRING, Description, 4) \
X(a, STATIC, SINGULAR, INT32, TextColor, 5) \
X(a, STATIC, SINGULAR, INT32, BackgroundColor, 6)
#define mrc_proto_ProtobufOpMode_CALLBACK pb_default_field_callback
#define mrc_proto_ProtobufOpMode_DEFAULT NULL