001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package edu.wpi.first.hal.can;
006
007import edu.wpi.first.hal.communication.NIRioStatus;
008import edu.wpi.first.hal.util.UncleanStatusException;
009
010/**
011 * Checks the status of a CAN message and throws an exception of the appropriate type if necessary.
012 */
013public final class CANExceptionFactory {
014  // FRC Error codes
015  static final int ERR_CANSessionMux_InvalidBuffer = -44086;
016  static final int ERR_CANSessionMux_MessageNotFound = -44087;
017  static final int ERR_CANSessionMux_NotAllowed = -44088;
018  static final int ERR_CANSessionMux_NotInitialized = -44089;
019
020  /**
021   * Checks the status of a CAN message with the given message ID.
022   *
023   * @param status The CAN status.
024   * @param messageID The CAN message ID.
025   * @throws CANInvalidBufferException if the buffer is invalid.
026   * @throws CANMessageNotAllowedException if the message isn't allowed.
027   * @throws CANNotInitializedException if the CAN bus isn't initialized.
028   * @throws UncleanStatusException if the status code passed in reports an error.
029   */
030  public static void checkStatus(int status, int messageID) {
031    switch (status) {
032      case NIRioStatus.kRioStatusSuccess -> {
033        // Everything is ok... don't throw.
034      }
035      case ERR_CANSessionMux_InvalidBuffer, NIRioStatus.kRIOStatusBufferInvalidSize ->
036          throw new CANInvalidBufferException();
037      case ERR_CANSessionMux_MessageNotFound, NIRioStatus.kRIOStatusOperationTimedOut ->
038          throw new CANMessageNotFoundException();
039      case ERR_CANSessionMux_NotAllowed, NIRioStatus.kRIOStatusFeatureNotSupported ->
040          throw new CANMessageNotAllowedException("MessageID = " + messageID);
041      case ERR_CANSessionMux_NotInitialized, NIRioStatus.kRIOStatusResourceNotInitialized ->
042          throw new CANNotInitializedException();
043      default -> throw new UncleanStatusException("Fatal status code detected:  " + status);
044    }
045  }
046
047  private CANExceptionFactory() {}
048}