[wpiutil] Change C++ protobuf to nanopb (#7309)

The Google C++ protobuf implementation has issues with dynamic linkage across DLL boundaries because it uses global variables.  It also has a compile-time dependency because the protoc version must exactly match the libprotobuf version.  Using nanopb with a customized generator fixes both of these issues.

Co-authored-by: Gold856 <117957790+Gold856@users.noreply.github.com>
This commit is contained in:
Thad House
2024-11-07 22:42:50 -08:00
committed by GitHub
parent fd2e0c0427
commit 8b8b634f65
166 changed files with 17522 additions and 1571 deletions

View File

@@ -2,8 +2,8 @@
// 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 <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/ChassisSpeeds.h"
@@ -11,19 +11,19 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::ChassisSpeeds>;
const ChassisSpeeds kExpectedData =
ChassisSpeeds{2.29_mps, 2.2_mps, 0.3504_rad_per_s};
} // namespace
TEST(ChassisSpeedsProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
ChassisSpeeds unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.vx.value(), unpacked_data.vx.value());
EXPECT_EQ(kExpectedData.vy.value(), unpacked_data.vy.value());
EXPECT_EQ(kExpectedData.omega.value(), unpacked_data.omega.value());
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.vx.value(), unpacked_data->vx.value());
EXPECT_EQ(kExpectedData.vy.value(), unpacked_data->vy.value());
EXPECT_EQ(kExpectedData.omega.value(), unpacked_data->omega.value());
}

View File

@@ -4,6 +4,7 @@
#include <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/DifferentialDriveKinematics.h"
@@ -11,17 +12,18 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::DifferentialDriveKinematics>;
const DifferentialDriveKinematics kExpectedData =
DifferentialDriveKinematics{1.74_m};
} // namespace
TEST(DifferentialDriveKinematicsProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
DifferentialDriveKinematics unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.trackWidth.value(), unpacked_data.trackWidth.value());
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.trackWidth.value(),
unpacked_data->trackWidth.value());
}

View File

@@ -2,8 +2,8 @@
// 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 <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/DifferentialDriveWheelSpeeds.h"
@@ -11,18 +11,18 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::DifferentialDriveWheelSpeeds>;
const DifferentialDriveWheelSpeeds kExpectedData =
DifferentialDriveWheelSpeeds{1.74_mps, 35.04_mps};
} // namespace
TEST(DifferentialDriveWheelSpeedsProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
DifferentialDriveWheelSpeeds unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.left.value(), unpacked_data.left.value());
EXPECT_EQ(kExpectedData.right.value(), unpacked_data.right.value());
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.left.value(), unpacked_data->left.value());
EXPECT_EQ(kExpectedData.right.value(), unpacked_data->right.value());
}

View File

@@ -2,8 +2,8 @@
// 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 <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/MecanumDriveKinematics.h"
@@ -11,21 +11,21 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::MecanumDriveKinematics>;
const MecanumDriveKinematics kExpectedData = MecanumDriveKinematics{
Translation2d{19.1_m, 2.2_m}, Translation2d{35.04_m, 1.91_m},
Translation2d{1.74_m, 3.504_m}, Translation2d{3.504_m, 1.91_m}};
} // namespace
TEST(MecanumDriveKinematicsProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
MecanumDriveKinematics unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.GetFrontLeft(), unpacked_data.GetFrontLeft());
EXPECT_EQ(kExpectedData.GetFrontRight(), unpacked_data.GetFrontRight());
EXPECT_EQ(kExpectedData.GetRearLeft(), unpacked_data.GetRearLeft());
EXPECT_EQ(kExpectedData.GetRearRight(), unpacked_data.GetRearRight());
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.GetFrontLeft(), unpacked_data->GetFrontLeft());
EXPECT_EQ(kExpectedData.GetFrontRight(), unpacked_data->GetFrontRight());
EXPECT_EQ(kExpectedData.GetRearLeft(), unpacked_data->GetRearLeft());
EXPECT_EQ(kExpectedData.GetRearRight(), unpacked_data->GetRearRight());
}

View File

@@ -2,8 +2,8 @@
// 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 <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/MecanumDriveWheelPositions.h"
@@ -11,20 +11,21 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::MecanumDriveWheelPositions>;
const MecanumDriveWheelPositions kExpectedData =
MecanumDriveWheelPositions{17.4_m, 2.29_m, 22.9_m, 1.74_m};
} // namespace
TEST(MecanumDriveWheelPositionsProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
MecanumDriveWheelPositions unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.frontLeft.value(), unpacked_data.frontLeft.value());
EXPECT_EQ(kExpectedData.frontRight.value(), unpacked_data.frontRight.value());
EXPECT_EQ(kExpectedData.rearLeft.value(), unpacked_data.rearLeft.value());
EXPECT_EQ(kExpectedData.rearRight.value(), unpacked_data.rearRight.value());
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.frontLeft.value(), unpacked_data->frontLeft.value());
EXPECT_EQ(kExpectedData.frontRight.value(),
unpacked_data->frontRight.value());
EXPECT_EQ(kExpectedData.rearLeft.value(), unpacked_data->rearLeft.value());
EXPECT_EQ(kExpectedData.rearRight.value(), unpacked_data->rearRight.value());
}

View File

@@ -2,8 +2,8 @@
// 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 <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/MecanumDriveWheelSpeeds.h"
@@ -11,20 +11,21 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::MecanumDriveWheelSpeeds>;
const MecanumDriveWheelSpeeds kExpectedData =
MecanumDriveWheelSpeeds{2.29_mps, 17.4_mps, 4.4_mps, 0.229_mps};
} // namespace
TEST(MecanumDriveWheelSpeedsProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
MecanumDriveWheelSpeeds unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.frontLeft.value(), unpacked_data.frontLeft.value());
EXPECT_EQ(kExpectedData.frontRight.value(), unpacked_data.frontRight.value());
EXPECT_EQ(kExpectedData.rearLeft.value(), unpacked_data.rearLeft.value());
EXPECT_EQ(kExpectedData.rearRight.value(), unpacked_data.rearRight.value());
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.frontLeft.value(), unpacked_data->frontLeft.value());
EXPECT_EQ(kExpectedData.frontRight.value(),
unpacked_data->frontRight.value());
EXPECT_EQ(kExpectedData.rearLeft.value(), unpacked_data->rearLeft.value());
EXPECT_EQ(kExpectedData.rearRight.value(), unpacked_data->rearRight.value());
}

View File

@@ -2,8 +2,8 @@
// 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 <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/SwerveModulePosition.h"
@@ -11,18 +11,18 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::SwerveModulePosition>;
const SwerveModulePosition kExpectedData =
SwerveModulePosition{3.504_m, Rotation2d{17.4_rad}};
} // namespace
TEST(SwerveModulePositionProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
SwerveModulePosition unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.distance.value(), unpacked_data.distance.value());
EXPECT_EQ(kExpectedData.angle, unpacked_data.angle);
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.distance.value(), unpacked_data->distance.value());
EXPECT_EQ(kExpectedData.angle, unpacked_data->angle);
}

View File

@@ -2,8 +2,8 @@
// 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 <google/protobuf/arena.h>
#include <gtest/gtest.h>
#include <wpi/SmallVector.h>
#include "frc/kinematics/SwerveModuleState.h"
@@ -11,18 +11,18 @@ using namespace frc;
namespace {
using ProtoType = wpi::Protobuf<frc::SwerveModuleState>;
const SwerveModuleState kExpectedData =
SwerveModuleState{22.9_mps, Rotation2d{3.3_rad}};
} // namespace
TEST(SwerveModuleStateProtoTest, Roundtrip) {
google::protobuf::Arena arena;
google::protobuf::Message* proto = ProtoType::New(&arena);
ProtoType::Pack(proto, kExpectedData);
wpi::ProtobufMessage<decltype(kExpectedData)> message;
wpi::SmallVector<uint8_t, 64> buf;
SwerveModuleState unpacked_data = ProtoType::Unpack(*proto);
EXPECT_EQ(kExpectedData.speed.value(), unpacked_data.speed.value());
EXPECT_EQ(kExpectedData.angle, unpacked_data.angle);
ASSERT_TRUE(message.Pack(buf, kExpectedData));
auto unpacked_data = message.Unpack(buf);
ASSERT_TRUE(unpacked_data.has_value());
EXPECT_EQ(kExpectedData.speed.value(), unpacked_data->speed.value());
EXPECT_EQ(kExpectedData.angle, unpacked_data->angle);
}