summaryrefslogtreecommitdiff
path: root/src/code/sys_slowly.c
blob: 415d5f297e6aa857b0ffb8e0de71a46e796c8b1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "global.h"

#define SLOWLY_STATUS_DONE (1 << 0)
#define SLOWLY_STATUS_STARTED (1 << 1)

void Slowly_Main(SlowlyTask* slowly) {
    slowly->status |= SLOWLY_STATUS_STARTED;

    switch (slowly->callbackArgCount) {
        case SLOWLY_CALLBACK_NO_ARGS:
            slowly->callback0();
            break;
        case SLOWLY_CALLBACK_ONE_ARG:
            slowly->callback1(slowly->callbackArg0);
            break;
        case SLOWLY_CALLBACK_TWO_ARGS:
            slowly->callback2(slowly->callbackArg0, slowly->callbackArg1);
            break;
    }

    slowly->status |= SLOWLY_STATUS_DONE;
}

void Slowly_ThreadEntry(SlowlyTask* slowly) {
    Slowly_Main(slowly);
}

void Slowly_Start(SlowlyTask* slowly, void* stack, void (*callback)(), void* callbackArg0, void* callbackArg1) {
    bzero(slowly, sizeof(SlowlyTask));

    slowly->callbackArgCount = SLOWLY_CALLBACK_TWO_ARGS;
    slowly->status = 0;
    slowly->callback0 = callback;
    slowly->callbackArg0 = callbackArg0;
    slowly->callbackArg1 = callbackArg1;

    osCreateThread(&slowly->thread, Z_THREAD_ID_SLOWLY, Slowly_ThreadEntry, slowly, stack, Z_PRIORITY_SLOWLY);
    osStartThread(&slowly->thread);
}

void Slowly_Stop(SlowlyTask* slowly) {
    osDestroyThread(&slowly->thread);
}