HAL_RelayHandle HAL_InitializeRelayPort(HAL_PortHandle portHandle, HAL_Bool fwd, int32_t* status) { /*initializeDigital(status); if (*status != 0) return HAL_kInvalidHandle;*/ int16_t channel = getPortHandleChannel(portHandle); if (channel == InvalidHandleIndex) { *status = PARAMETER_OUT_OF_RANGE; return HAL_kInvalidHandle; } if (!fwd) channel += kNumRelayHeaders; // add 4 to reverse channels auto handle = relayHandles.Allocate(channel, status); if (*status != 0) return HAL_kInvalidHandle; // failed to allocate. Pass error back. auto port = relayHandles.Get(handle); if (port == nullptr) { // would only occur on thread issue. *status = HAL_HANDLE_ERROR; return HAL_kInvalidHandle; } if (!fwd) { // Subtract number of headers to put channel in range channel -= kNumRelayHeaders; port->fwd = false; // set to reverse } else { port->fwd = true; // set to forward } port->channel = static_cast<uint8_t>(channel); return handle; }
HAL_SolenoidHandle HAL_InitializeSolenoidPort(HAL_PortHandle portHandle, int32_t* status) { int16_t channel = getPortHandleChannel(portHandle); int16_t module = getPortHandleModule(portHandle); if (channel == InvalidHandleIndex) { *status = HAL_HANDLE_ERROR; return HAL_kInvalidHandle; } // initializePCM will check the module if (!HAL_CheckSolenoidChannel(channel)) { *status = RESOURCE_OUT_OF_RANGE; return HAL_kInvalidHandle; } initializePCM(module, status); if (*status != 0) { return HAL_kInvalidHandle; } auto handle = solenoidHandles.Allocate(module * kNumSolenoidChannels + channel, status); if (handle == HAL_kInvalidHandle) { // out of resources *status = NO_AVAILABLE_RESOURCES; return HAL_kInvalidHandle; } auto solenoidPort = solenoidHandles.Get(handle); if (solenoidPort == nullptr) { // would only occur on thread issues *status = HAL_HANDLE_ERROR; return HAL_kInvalidHandle; } solenoidPort->module = static_cast<uint8_t>(module); solenoidPort->channel = static_cast<uint8_t>(channel); return handle; }
HAL_AnalogOutputHandle HAL_InitializeAnalogOutputPort(HAL_PortHandle portHandle, int32_t* status) { int16_t channel = getPortHandleChannel(portHandle); if (channel == InvalidHandleIndex) { *status = PARAMETER_OUT_OF_RANGE; return HAL_kInvalidHandle; } HAL_AnalogOutputHandle handle = analogOutputHandles.Allocate(channel, status); if (*status != 0) return HAL_kInvalidHandle; // failed to allocate. Pass error back. auto port = analogOutputHandles.Get(handle); if (port == nullptr) { // would only error on thread issue *status = HAL_HANDLE_ERROR; return HAL_kInvalidHandle; } port->channel = static_cast<uint8_t>(channel); // Initialize sim analog input SimAnalogOutData[channel].SetInitialized(true); return handle; }