New SPI API supporting DMA
[betaflight.git] / src / main / fc / dispatch.c
blob1e105fb79757d3695afe78f36d188facae2c4094
1 /*
2 * This file is part of Cleanflight and Betaflight.
4 * Cleanflight and Betaflight are free software. You can redistribute
5 * this software and/or modify this software under the terms of the
6 * GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option)
8 * any later version.
10 * Cleanflight and Betaflight are distributed in the hope that they
11 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
12 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this software.
18 * If not, see <http://www.gnu.org/licenses/>.
21 #include <stdbool.h>
22 #include <stdlib.h>
23 #include <stdint.h>
25 #include "platform.h"
27 #include "common/utils.h"
29 #include "drivers/time.h"
31 #include "fc/dispatch.h"
33 static dispatchEntry_t *head = NULL;
34 static bool dispatchEnabled = false;
36 bool dispatchIsEnabled(void)
38 return dispatchEnabled;
41 void dispatchEnable(void)
43 dispatchEnabled = true;
46 void dispatchProcess(uint32_t currentTime)
48 for (dispatchEntry_t **p = &head; *p; ) {
49 if (cmp32(currentTime, (*p)->delayedUntil) < 0)
50 break;
51 // unlink entry first, so handler can replan self
52 dispatchEntry_t *current = *p;
53 *p = (*p)->next;
54 current->inQue = false;
55 (*current->dispatch)(current);
59 void dispatchAdd(dispatchEntry_t *entry, int delayUs)
61 uint32_t delayedUntil = micros() + delayUs;
62 dispatchEntry_t **p = &head;
64 if (entry->inQue) {
65 return; // Allready in Queue, abort
68 while (*p && cmp32((*p)->delayedUntil, delayedUntil) < 0)
69 p = &(*p)->next;
71 entry->next = *p;
72 entry->delayedUntil = delayedUntil;
73 entry->inQue = true;
74 *p = entry;