123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- * pulse.c
- *
- * Copyright (c) 2024 Thomas Buck (thomas@xythobuz.de)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * See <http://www.gnu.org/licenses/>.
- */
-
- #include <stdio.h>
- #include <inttypes.h>
- #include "pico/stdlib.h"
-
- #include "led.h"
- #include "sequence.h"
- #include "pulse.h"
-
- static uint32_t out_time[NUM_CHANNELS] = {0};
- static uint32_t led_time[LED_COUNT] = {0};
-
- static void pulse_trigger(uint32_t i, uint32_t t_ms, bool out) {
- uint32_t off_t = t_ms + to_ms_since_boot(get_absolute_time());
-
- if (out) {
- ch_set(i, true);
- if (out_time[i % NUM_CHANNELS] == 0) {
- out_time[i % NUM_CHANNELS] = off_t;
- } else {
- printf("%s: skip retrigger out %"PRIu32"\n", __func__, i);
- }
- } else {
- led_set(i, true);
- if (led_time[i % LED_COUNT] == 0) {
- led_time[i % LED_COUNT] = off_t;
- } else {
- printf("%s: skip retrigger led %"PRIu32"\n", __func__, i);
- }
- }
- }
-
- void pulse_trigger_out(uint32_t i, uint32_t t_ms) {
- pulse_trigger(i, t_ms, true);
- }
-
- void pulse_trigger_led(uint32_t i, uint32_t t_ms) {
- pulse_trigger(i, t_ms, false);
- }
-
- void pulse_run(void) {
- uint32_t now = to_ms_since_boot(get_absolute_time());
-
- for (uint i = 0; i < NUM_CHANNELS; i++) {
- if (out_time[i] != 0) {
- if (out_time[i] <= now) {
- ch_set(i, false);
- out_time[i] = 0;
- }
- }
- }
-
- for (uint i = 0; i < LED_COUNT; i++) {
- if (led_time[i] != 0) {
- if (led_time[i] <= now) {
- led_set(i, false);
- led_time[i] = 0;
- }
- }
- }
- }
|