Files
allwpilib/wpilibc/src/main/native/include/wpi/hardware/bus/CAN.hpp
Peter Johnson 3f0d7bc2c4 [wpiutil,hal] Move C++ Handle wrapper to wpiutil (#8935)
Also move WPI_Handle typedef to its own header (util/Handle.h).
2026-06-01 14:57:25 -06:00

161 lines
5.1 KiB
C++

// 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
#include <stdint.h>
#include "wpi/hal/CANAPI.h"
#include "wpi/util/Handle.hpp"
namespace wpi {
/**
* High level class for interfacing with CAN devices conforming to
* the standard CAN spec.
*
* No packets that can be sent gets blocked by the RoboRIO, so all methods
* work identically in all robot modes.
*
* All methods are thread save, however the buffer objects passed in
* by the user need to not be modified for the duration of their calls.
*/
class CAN {
public:
/**
* Create a new CAN communication interface with the specific device ID.
* This uses the team manufacturer and device types.
* The device ID is 6 bits (0-63)
*
* @param busId The bus id
* @param deviceId The device id
*/
CAN(int busId, int deviceId);
/**
* Create a new CAN communication interface with a specific device ID,
* manufacturer and device type. The device ID is 6 bits, the
* manufacturer is 8 bits, and the device type is 5 bits.
*
* @param busId The bus id
* @param deviceId The device ID
* @param deviceManufacturer The device manufacturer
* @param deviceType The device type
*/
CAN(int busId, int deviceId, int deviceManufacturer, int deviceType);
CAN(CAN&&) = default;
CAN& operator=(CAN&&) = default;
/**
* Write a packet to the CAN device with a specific ID. This ID is 10 bits.
*
* @param apiId The API ID to write.
* @param message the CAN message.
*/
void WritePacket(int apiId, const HAL_CANMessage& message);
/**
* Write a repeating packet to the CAN device with a specific ID. This ID is
* 10 bits. The RoboRIO will automatically repeat the packet at the specified
* interval
*
* @param apiId The API ID to write.
* @param message the CAN message.
* @param repeatMs The period to repeat the packet at.
*/
void WritePacketRepeating(int apiId, const HAL_CANMessage& message,
int repeatMs);
/**
* Write an RTR frame to the CAN device with a specific ID. This ID is 10
* bits. The length by spec must match what is returned by the responding
* device
*
* @param apiId The API ID to write.
* @param message the CAN message.
*/
void WriteRTRFrame(int apiId, const HAL_CANMessage& message);
/**
* Write a packet to the CAN device with a specific ID. This ID is 10 bits.
*
* @param apiId The API ID to write.
* @param message the CAN message.
*/
int WritePacketNoError(int apiId, const HAL_CANMessage& message);
/**
* Write a repeating packet to the CAN device with a specific ID. This ID is
* 10 bits. The RoboRIO will automatically repeat the packet at the specified
* interval
*
* @param apiId The API ID to write.
* @param message the CAN message.
* @param repeatMs The period to repeat the packet at.
*/
int WritePacketRepeatingNoError(int apiId, const HAL_CANMessage& message,
int repeatMs);
/**
* Write an RTR frame to the CAN device with a specific ID. This ID is 10
* bits. The length by spec must match what is returned by the responding
* device
*
* @param apiId The API ID to write.
* @param message the CAN message.
*/
int WriteRTRFrameNoError(int apiId, const HAL_CANMessage& message);
/**
* Stop a repeating packet with a specific ID. This ID is 10 bits.
*
* @param apiId The API ID to stop repeating
*/
void StopPacketRepeating(int apiId);
/**
* Read a new CAN packet. This will only return properly once per packet
* received. Multiple calls without receiving another packet will return
* false.
*
* @param apiId The API ID to read.
* @param data Storage for the received data.
* @return True if the data is valid, otherwise false.
*/
bool ReadPacketNew(int apiId, HAL_CANReceiveMessage* data);
/**
* Read a CAN packet. The will continuously return the last packet received,
* without accounting for packet age.
*
* @param apiId The API ID to read.
* @param data Storage for the received data.
* @return True if the data is valid, otherwise false.
*/
bool ReadPacketLatest(int apiId, HAL_CANReceiveMessage* data);
/**
* Read a CAN packet. The will return the last packet received until the
* packet is older then the requested timeout. Then it will return false.
*
* @param apiId The API ID to read.
* @param timeoutMs The timeout time for the packet
* @param data Storage for the received data.
* @return True if the data is valid, otherwise false.
*/
bool ReadPacketTimeout(int apiId, int timeoutMs, HAL_CANReceiveMessage* data);
/// Team manufacturer.
static constexpr HAL_CANManufacturer TEAM_MANUFACTURER = HAL_CAN_MAN_TEAM_USE;
/// Team device type.
static constexpr HAL_CANDeviceType TEAM_DEVICE_TYPE =
HAL_CAN_DEV_MISCELLANEOUS;
private:
wpi::util::Handle<HAL_CANHandle, HAL_CleanCAN> m_handle;
};
} // namespace wpi