void startInputDriver(const char *msg, /*nullable*/digital_input_s *hw, bool isActiveHigh) { if (hw == NULL) { // we can get NULL driver if user somehow has invalid pin in his configuration warning(CUSTOM_ERR_INVALID_INPUT_ICU_PIN, "s_not input pin"); return; } hw->isActiveHigh = isActiveHigh; if (hw->isActiveHigh) { wave_icucfg.mode = ICU_INPUT_ACTIVE_HIGH; } else { wave_icucfg.mode = ICU_INPUT_ACTIVE_LOW; } ICUDriver *driver = hw->driver; if (driver != NULL) { if (hw->started) { icuDisableNotificationsI(driver); icuStopCapture(driver); icuStop(driver); } wave_icucfg.channel = getInputCaptureChannel(hw->brainPin); efiIcuStart(msg, driver, &wave_icucfg); efiAssertVoid(CUSTOM_ERR_6672, driver != NULL, "di: driver is NULL"); efiAssertVoid(CUSTOM_ERR_6673, driver->state == ICU_READY, "di: driver not ready"); icuStartCapture(driver); // this would change state from READY to WAITING icuEnableNotifications(driver); } hw->started = true; }
/** * @brief Disables notifications. * @pre The ICU unit must have been activated using @p icuStart(). * @note If the notification is already disabled then the call has no effect. * * @param[in] icup pointer to the @p ICUDriver object * * @api */ void icuDisableNotifications(ICUDriver *icup) { osalDbgCheck(icup != NULL); osalSysLock(); osalDbgAssert((icup->state == ICU_WAITING) || (icup->state == ICU_ACTIVE), "invalid state"); icuDisableNotificationsI(icup); osalSysUnlock(); }
/** * turns pin off and returns digital_input_s back into registeredIcus pool */ void removeWaveAnalyzerDriver(const char *msg, brain_pin_e brainPin) { if (brainPin == GPIO_UNASSIGNED) { return; } brain_pin_markUnused(brainPin); ICUDriver *driver = getInputCaptureDriver(msg, brainPin); if (driver == NULL) { return; } int regSize = registeredIcus.size; for (int i = 0; i < regSize; i++) { if (registeredIcus.elements[i].driver == driver) { // removing from driver from the list of used drivers memcpy(®isteredIcus.elements[i], ®isteredIcus.elements[regSize - 1], sizeof(digital_input_s)); registeredIcus.size--; icuDisableNotificationsI(driver); icuStopCapture(driver); icuStop(driver); return; } } }