mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-26 01:51:41 +00:00
[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:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user