mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
[examples] Add communication examples (e.g. arduino) (#2500)
Co-authored-by: Andrew Dassonville <dassonville.andrew@gmail.com>
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#include <frc/DigitalOutput.h>
|
||||
#include <frc/DriverStation.h>
|
||||
#include <frc/TimedRobot.h>
|
||||
|
||||
/**
|
||||
* This is a sample program demonstrating how to communicate to a light
|
||||
* controller from the robot code using the roboRIO's DIO ports.
|
||||
*/
|
||||
class Robot : public frc::TimedRobot {
|
||||
public:
|
||||
void RobotPeriodic() override {
|
||||
// pull alliance port high if on red alliance, pull low if on blue alliance
|
||||
m_allianceOutput.Set(frc::DriverStation::GetAlliance() ==
|
||||
frc::DriverStation::kRed);
|
||||
|
||||
// pull enabled port high if enabled, low if disabled
|
||||
m_enabledOutput.Set(frc::DriverStation::IsEnabled());
|
||||
|
||||
// pull auto port high if in autonomous, low if in teleop (or disabled)
|
||||
m_autonomousOutput.Set(frc::DriverStation::IsAutonomous());
|
||||
|
||||
// pull alert port high if match time remaining is between 30 and 25 seconds
|
||||
auto matchTime = frc::DriverStation::GetMatchTime();
|
||||
m_alertOutput.Set(matchTime <= 30 && matchTime >= 25);
|
||||
}
|
||||
|
||||
private:
|
||||
// define ports for communication with light controller
|
||||
static constexpr int kAlliancePort = 0;
|
||||
static constexpr int kEnabledPort = 1;
|
||||
static constexpr int kAutonomousPort = 2;
|
||||
static constexpr int kAlertPort = 3;
|
||||
|
||||
frc::DigitalOutput m_allianceOutput{kAlliancePort};
|
||||
frc::DigitalOutput m_enabledOutput{kEnabledPort};
|
||||
frc::DigitalOutput m_autonomousOutput{kAutonomousPort};
|
||||
frc::DigitalOutput m_alertOutput{kAlertPort};
|
||||
};
|
||||
|
||||
int main() {
|
||||
return frc::StartRobot<Robot>();
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#include <fmt/format.h>
|
||||
|
||||
#include <frc/DriverStation.h>
|
||||
#include <frc/I2C.h>
|
||||
#include <frc/TimedRobot.h>
|
||||
#include <frc/Timer.h>
|
||||
|
||||
/**
|
||||
* This is a sample program demonstrating how to communicate to a light
|
||||
* controller from the robot code using the roboRIO's I2C port.
|
||||
*/
|
||||
class Robot : public frc::TimedRobot {
|
||||
public:
|
||||
void RobotPeriodic() override {
|
||||
// Creates a string to hold current robot state information, including
|
||||
// alliance, enabled state, operation mode, and match time. The message
|
||||
// is sent in format "AEM###" where A is the alliance color, (R)ed or
|
||||
// (B)lue, E is the enabled state, (E)nabled or (D)isabled, M is the
|
||||
// operation mode, (A)utonomous or (T)eleop, and ### is the zero-padded
|
||||
// time remaining in the match.
|
||||
//
|
||||
// For example, "RET043" would indicate that the robot is on the red
|
||||
// alliance, enabled in teleop mode, with 43 seconds left in the match.
|
||||
auto string = fmt::format(
|
||||
"{}{}{}{:03}",
|
||||
frc::DriverStation::GetAlliance() == frc::DriverStation::Alliance::kRed
|
||||
? "R"
|
||||
: "B",
|
||||
frc::DriverStation::IsEnabled() ? "E" : "D",
|
||||
frc::DriverStation::IsAutonomous() ? "A" : "T",
|
||||
static_cast<int>(frc::Timer::GetMatchTime().value()));
|
||||
|
||||
arduino.WriteBulk(reinterpret_cast<uint8_t*>(string.data()), string.size());
|
||||
}
|
||||
|
||||
private:
|
||||
static constexpr int deviceAddress = 4;
|
||||
frc::I2C arduino{frc::I2C::Port::kOnboard, deviceAddress};
|
||||
};
|
||||
|
||||
#ifndef RUNNING_FRC_TESTS
|
||||
int main() {
|
||||
return frc::StartRobot<Robot>();
|
||||
}
|
||||
#endif
|
||||
@@ -260,6 +260,27 @@
|
||||
"gradlebase": "cpp",
|
||||
"commandversion": 2
|
||||
},
|
||||
{
|
||||
"name": "I2C Communication",
|
||||
"description": "An example program that communicates with external devices (such as an Arduino) using the roboRIO's I2C port",
|
||||
"tags": [
|
||||
"I2C"
|
||||
],
|
||||
"foldername": "I2CCommunication",
|
||||
"gradlebase": "cpp",
|
||||
"commandversion": 2
|
||||
},
|
||||
{
|
||||
"name": "Digital Communication Sample",
|
||||
"description": "An example program that communicates with external devices (such as an Arduino) using the roboRIO's DIO",
|
||||
"tags": [
|
||||
"Digital"
|
||||
],
|
||||
"foldername": "DigitalCommunication",
|
||||
"gradlebase": "cpp",
|
||||
"commandversion": 2
|
||||
},
|
||||
|
||||
{
|
||||
"name": "Axis Camera Sample",
|
||||
"description": "An example program that acquires images from an Axis network camera and adds some annotation to the image as you might do for showing operators the result of some image recognition, and sends it to the dashboard for display. This demonstrates the use of the AxisCamera class.",
|
||||
|
||||
Reference in New Issue
Block a user