[hal,wpilib] Switch CANBusMap to Enum, use it for CAN API (#8977)

Will make it easier to solve
https://github.com/wpilibsuite/SystemcoreTesting/issues/286
This commit is contained in:
Thad House
2026-06-11 16:14:40 -07:00
committed by GitHub
parent 97381549e6
commit 489b993e60
13 changed files with 165 additions and 94 deletions

View File

@@ -414,6 +414,14 @@ def wpilib_extension(srcs = [], header_to_dat_deps = [], extra_hdrs = [], includ
("wpi::CAN", "wpi__CAN.hpp"),
],
),
struct(
class_name = "CANBusMap",
yml_file = "semiwrap/CANBusMap.yml",
header_root = "$(execpath :robotpy-native-wpilib.copy_headers)",
header_file = "$(execpath :robotpy-native-wpilib.copy_headers)/wpi/hardware/bus/CANBusMap.hpp",
tmpl_class_names = [],
trampolines = [],
),
struct(
class_name = "I2C",
yml_file = "semiwrap/I2C.yml",

View File

@@ -12,13 +12,15 @@
using namespace wpi;
CAN::CAN(int busId, int deviceId)
CAN::CAN(CANBusMap busId, int deviceId)
: CAN{busId, deviceId, TEAM_MANUFACTURER, TEAM_DEVICE_TYPE} {}
CAN::CAN(int busId, int deviceId, int deviceManufacturer, int deviceType) {
CAN::CAN(CANBusMap busId, int deviceId, int deviceManufacturer,
int deviceType) {
int32_t status = 0;
m_handle = HAL_InitializeCAN(
busId, static_cast<HAL_CANManufacturer>(deviceManufacturer), deviceId,
static_cast<int>(busId),
static_cast<HAL_CANManufacturer>(deviceManufacturer), deviceId,
static_cast<HAL_CANDeviceType>(deviceType), &status);
WPILIB_CheckErrorStatus(status, "device id {} mfg {} type {}", deviceId,
deviceManufacturer, deviceType);

View File

@@ -7,6 +7,7 @@
#include <stdint.h>
#include "wpi/hal/CANAPI.h"
#include "wpi/hardware/bus/CANBusMap.hpp"
#include "wpi/util/Handle.hpp"
namespace wpi {
@@ -31,7 +32,7 @@ class CAN {
* @param busId The bus id
* @param deviceId The device id
*/
CAN(int busId, int deviceId);
CAN(CANBusMap busId, int deviceId);
/**
* Create a new CAN communication interface with a specific device ID,
@@ -43,7 +44,7 @@ class CAN {
* @param deviceManufacturer The device manufacturer
* @param deviceType The device type
*/
CAN(int busId, int deviceId, int deviceManufacturer, int deviceType);
CAN(CANBusMap busId, int deviceId, int deviceManufacturer, int deviceType);
CAN(CAN&&) = default;
CAN& operator=(CAN&&) = default;

View File

@@ -0,0 +1,66 @@
// 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.
#pragma once
namespace wpi {
/**
* CAN bus mapping.
*
* S0-S4 are Systemcore CAN buses. D0-D19 are Motioncore CAN buses.
*/
enum class CANBusMap {
/// CAN bus S0.
CAN_S0 = 0,
/// CAN bus S1.
CAN_S1 = 1,
/// CAN bus S2.
CAN_S2 = 2,
/// CAN bus S3.
CAN_S3 = 3,
/// CAN bus S4.
CAN_S4 = 4,
/// CAN bus D0.
CAN_D0 = 5,
/// CAN bus D1.
CAN_D1 = 6,
/// CAN bus D2.
CAN_D2 = 7,
/// CAN bus D3.
CAN_D3 = 8,
/// CAN bus D4.
CAN_D4 = 9,
/// CAN bus D5.
CAN_D5 = 10,
/// CAN bus D6.
CAN_D6 = 11,
/// CAN bus D7.
CAN_D7 = 12,
/// CAN bus D8.
CAN_D8 = 13,
/// CAN bus D9.
CAN_D9 = 14,
/// CAN bus D10.
CAN_D10 = 15,
/// CAN bus D11.
CAN_D11 = 16,
/// CAN bus D12.
CAN_D12 = 17,
/// CAN bus D13.
CAN_D13 = 18,
/// CAN bus D14.
CAN_D14 = 19,
/// CAN bus D15.
CAN_D15 = 20,
/// CAN bus D16.
CAN_D16 = 21,
/// CAN bus D17.
CAN_D17 = 22,
/// CAN bus D18.
CAN_D18 = 23,
/// CAN bus D19.
CAN_D19 = 24,
};
} // namespace wpi

View File

@@ -146,6 +146,7 @@ AnalogAccelerometer = "wpi/hardware/accelerometer/AnalogAccelerometer.hpp"
# wpi/hardware/bus
CAN = "wpi/hardware/bus/CAN.hpp"
CANBusMap = "wpi/hardware/bus/CANBusMap.hpp"
I2C = "wpi/hardware/bus/I2C.hpp"
SerialPort = "wpi/hardware/bus/SerialPort.hpp"

View File

@@ -6,8 +6,8 @@ classes:
methods:
CAN:
overloads:
int, int:
int, int, int, int:
CANBusMap, int:
CANBusMap, int, int, int:
WritePacket:
WritePacketNoError:
WritePacketRepeating:

View File

@@ -0,0 +1,2 @@
enums:
CANBusMap:

View File

@@ -13,6 +13,7 @@ from ._wpilib import (
AnalogPotentiometer,
BooleanEvent,
CAN,
CANBusMap,
CANStatus,
Compressor,
CompressorConfigType,
@@ -129,6 +130,7 @@ __all__ = [
"AnalogPotentiometer",
"BooleanEvent",
"CAN",
"CANBusMap",
"CANStatus",
"Compressor",
"CompressorConfigType",