#include <stdio.h>

#define REGISTER_CALLBACK(e,p) register_callback(e, (callback_void_t)p)
#define GET_CALLBACK(e,T) ((T)callback_func_ptrs[e])

typedef void (*callback_s_char_t)(signed char);
typedef void (*callback_void_t)(void);

typedef enum {
    EVENT1,    
    EVENT2,
    MAX_EVENTS  
} event_t;

callback_void_t callback_func_ptrs[MAX_EVENTS];

void event_func1(signed char direction) {
    printf("success rotated: %d\n", direction);
}
void event_func2(void) {
    printf("success button pressed\n");
}

void register_callback(event_t event, callback_void_t ptr) {
    callback_func_ptrs[event] = ptr;
}

int main(void) {

    //register callback functions   
    REGISTER_CALLBACK(EVENT1, event_func1);
    REGISTER_CALLBACK(EVENT2, event_func2);

    //call callbacks
    if(callback_func_ptrs[EVENT1])
        GET_CALLBACK(EVENT1,callback_s_char_t)(1);

    if(callback_func_ptrs[EVENT2])
        GET_CALLBACK(EVENT2,callback_void_t)();

    return 0;
}
