void HAL_FreeAnalogOutputPort(HAL_AnalogOutputHandle analogOutputHandle) { // no status, so no need to check for a proper free. auto port = analogOutputHandles.Get(analogOutputHandle); if (port == nullptr) return; analogOutputHandles.Free(analogOutputHandle); SimAnalogOutData[port->channel].SetInitialized(false); }
void HAL_SetSolenoid(HAL_SolenoidHandle solenoidPortHandle, HAL_Bool value, int32_t* status) { auto port = solenoidHandles.Get(solenoidPortHandle); if (port == nullptr) { *status = HAL_HANDLE_ERROR; return; } *status = PCM_modules[port->module]->SetSolenoid(port->channel, value); }
double HAL_GetAnalogOutput(HAL_AnalogOutputHandle analogOutputHandle, int32_t* status) { auto port = analogOutputHandles.Get(analogOutputHandle); if (port == nullptr) { *status = HAL_HANDLE_ERROR; return 0.0; } return SimAnalogOutData[port->channel].GetVoltage(); }
void HAL_SetAnalogOutput(HAL_AnalogOutputHandle analogOutputHandle, double voltage, int32_t* status) { auto port = analogOutputHandles.Get(analogOutputHandle); if (port == nullptr) { *status = HAL_HANDLE_ERROR; return; } SimAnalogOutData[port->channel].SetVoltage(voltage); }
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; }