diff --git a/hal/src/main/native/athena/AddressableLED.cpp b/hal/src/main/native/athena/AddressableLED.cpp index f1d94974b2..0d9dcc6d77 100644 --- a/hal/src/main/native/athena/AddressableLED.cpp +++ b/hal/src/main/native/athena/AddressableLED.cpp @@ -13,6 +13,7 @@ #include "ConstantsInternal.h" #include "DigitalInternal.h" +#include "HALInitializer.h" #include "PortsInternal.h" #include "hal/ChipObject.h" #include "hal/handles/HandlesInternal.h" @@ -94,11 +95,23 @@ extern "C" { HAL_AddressableLEDHandle HAL_InitializeAddressableLED( HAL_DigitalHandle outputPort, int32_t* status) { + hal::init::CheckInit(); + auto digitalPort = hal::digitalChannelHandles->Get(outputPort, hal::HAL_HandleEnum::PWM); if (!digitalPort) { - *status = HAL_HANDLE_ERROR; + // If DIO was passed, channel error, else generic error + if (getHandleType(outputPort) == hal::HAL_HandleEnum::DIO) { + *status = HAL_LED_CHANNEL_ERROR; + } else { + *status = HAL_HANDLE_ERROR; + } + return HAL_kInvalidHandle; + } + + if (digitalPort->channel >= kNumPWMHeaders) { + *status = HAL_LED_CHANNEL_ERROR; return HAL_kInvalidHandle; } diff --git a/hal/src/main/native/athena/HAL.cpp b/hal/src/main/native/athena/HAL.cpp index 2dedb041f5..91214e538c 100644 --- a/hal/src/main/native/athena/HAL.cpp +++ b/hal/src/main/native/athena/HAL.cpp @@ -217,6 +217,8 @@ const char* HAL_GetErrorMessage(int32_t code) { return ERR_FRCSystem_NoDSConnection_MESSAGE; case HAL_CAN_BUFFER_OVERRUN: return HAL_CAN_BUFFER_OVERRUN_MESSAGE; + case HAL_LED_CHANNEL_ERROR: + return HAL_LED_CHANNEL_ERROR_MESSAGE; default: return "Unknown error status"; } diff --git a/hal/src/main/native/include/hal/Errors.h b/hal/src/main/native/include/hal/Errors.h index b0b3343fa3..9f74f8ce53 100644 --- a/hal/src/main/native/include/hal/Errors.h +++ b/hal/src/main/native/include/hal/Errors.h @@ -94,6 +94,10 @@ #define HAL_HANDLE_ERROR_MESSAGE \ "HAL: A handle parameter was passed incorrectly" +#define HAL_LED_CHANNEL_ERROR -1099 +#define HAL_LED_CHANNEL_ERROR_MESSAGE \ + "HAL: Addressable LEDs only supported on PWM Headers, not MXP or DIO" + #define HAL_INVALID_DMA_ADDITION -1102 #define HAL_INVALID_DMA_ADDITION_MESSAGE \ "HAL_AddDMA() only works before HAL_StartDMA()" diff --git a/hal/src/main/native/sim/AddressableLED.cpp b/hal/src/main/native/sim/AddressableLED.cpp index 90dee86841..70d3f6f1ad 100644 --- a/hal/src/main/native/sim/AddressableLED.cpp +++ b/hal/src/main/native/sim/AddressableLED.cpp @@ -44,6 +44,24 @@ HAL_AddressableLEDHandle HAL_InitializeAddressableLED( HAL_DigitalHandle outputPort, int32_t* status) { hal::init::CheckInit(); + auto digitalPort = + hal::digitalChannelHandles->Get(outputPort, hal::HAL_HandleEnum::PWM); + + if (!digitalPort) { + // If DIO was passed, channel error, else generic error + if (getHandleType(outputPort) == hal::HAL_HandleEnum::DIO) { + *status = HAL_LED_CHANNEL_ERROR; + } else { + *status = HAL_HANDLE_ERROR; + } + return HAL_kInvalidHandle; + } + + if (digitalPort->channel >= kNumPWMHeaders) { + *status = HAL_LED_CHANNEL_ERROR; + return HAL_kInvalidHandle; + } + HAL_AddressableLEDHandle handle = ledHandles->Allocate(); if (handle == HAL_kInvalidHandle) { *status = NO_AVAILABLE_RESOURCES; @@ -57,11 +75,7 @@ HAL_AddressableLEDHandle HAL_InitializeAddressableLED( } int16_t index = getHandleIndex(handle); - if (auto port = digitalChannelHandles->Get(outputPort, HAL_HandleEnum::PWM)) { - SimAddressableLEDData[index].outputPort = port->channel; - } else { - SimAddressableLEDData[index].outputPort = -1; - } + SimAddressableLEDData[index].outputPort = digitalPort->channel; SimAddressableLEDData[index].length = 1; SimAddressableLEDData[index].running = false; SimAddressableLEDData[index].initialized = true; diff --git a/hal/src/main/native/sim/HAL.cpp b/hal/src/main/native/sim/HAL.cpp index 6bb43f5b88..0dda617300 100644 --- a/hal/src/main/native/sim/HAL.cpp +++ b/hal/src/main/native/sim/HAL.cpp @@ -207,6 +207,8 @@ const char* HAL_GetErrorMessage(int32_t code) { return HAL_SIM_NOT_SUPPORTED_MESSAGE; case HAL_CAN_BUFFER_OVERRUN: return HAL_CAN_BUFFER_OVERRUN_MESSAGE; + case HAL_LED_CHANNEL_ERROR: + return HAL_LED_CHANNEL_ERROR_MESSAGE; default: return "Unknown error status"; }