Merge pull request #11198 from SteveCEvans/sce_rc2
[betaflight.git] / src / main / fc / dispatch.c
blob0ea7b825a2bea3b135cce474cd058b8d13deee01
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 #include "scheduler/scheduler.h"
35 static dispatchEntry_t *head = NULL;
36 static bool dispatchEnabled = false;
38 bool dispatchIsEnabled(void)
40 return dispatchEnabled;
43 void dispatchEnable(void)
45 dispatchEnabled = true;
48 void dispatchProcess(uint32_t currentTimeUs)
50 for (dispatchEntry_t **p = &head; *p; ) {
51 if (cmp32(currentTimeUs, (*p)->delayedUntil) < 0)
52 break;
53 // unlink entry first, so handler can replan self
54 dispatchEntry_t *current = *p;
55 *p = (*p)->next;
56 current->inQue = false;
57 (*current->dispatch)(current);
61 void dispatchAdd(dispatchEntry_t *entry, int delayUs)
63 uint32_t delayedUntil = micros() + delayUs;
64 dispatchEntry_t **p = &head;
66 if (entry->inQue) {
67 return; // Allready in Queue, abort
70 while (*p && cmp32((*p)->delayedUntil, delayedUntil) < 0)
71 p = &(*p)->next;
73 entry->next = *p;
74 entry->delayedUntil = delayedUntil;
75 entry->inQue = true;
76 *p = entry;