diff options
-rw-r--r-- | board/board.h | 22 | ||||
-rw-r--r-- | board/simple_board.h | 28 | ||||
-rw-r--r-- | clak.c | 19 | ||||
-rw-r--r-- | platform/darwin.c | 10 | ||||
-rw-r--r-- | platform/platform.h | 2 |
5 files changed, 43 insertions, 38 deletions
diff --git a/board/board.h b/board/board.h index 36d39fb..0c95b9c 100644 --- a/board/board.h +++ b/board/board.h @@ -1,16 +1,22 @@ #ifndef CLAK_BOARD_H_ #define CLAK_BOARD_H_ -struct board { - void (*on_down)(void); - void (*on_up)(void); +struct board_state; + +typedef void (*board_init_fn_t)(struct board_state *board_state); +typedef void (*key_event_fn_t)(struct board_state *board_state); + +typedef void (*sound_play_fn_t)(unsigned char *buffer, unsigned int buffer_len); + +struct board_state { + /* Populated by plugin */ + key_event_fn_t on_down; + key_event_fn_t on_up; char *name; -}; -struct board_data { - void (*sound_play)(unsigned char *buffer, unsigned int buffer_len); + /* Runtime from main */ + board_init_fn_t board_init; + sound_play_fn_t sound_play; }; -typedef struct board *(*fn_board_init)(struct board_data data); - #endif /* CLAK_BOARD_H_ */ diff --git a/board/simple_board.h b/board/simple_board.h index f0997c7..1a264de 100644 --- a/board/simple_board.h +++ b/board/simple_board.h @@ -1,36 +1,32 @@ #include "board.h" -static struct board_data board_data; - #define WAV_LEN(W) PREPROC_CONCAT(W,_len) #define PREPROC_CONCAT(A, B) A ## B -void board_on_down(void) +void board_on_down(struct board_state *state) { + (void) state; #ifdef BOARD_DOWN_WAV - board_data.sound_play(BOARD_DOWN_WAV, WAV_LEN(BOARD_DOWN_WAV)); + state->sound_play(BOARD_DOWN_WAV, WAV_LEN(BOARD_DOWN_WAV)); #endif } -void board_on_up(void) +void board_on_up(struct board_state *state) { + (void) state; #ifdef BOARD_UP_WAV - board_data.sound_play(BOARD_UP_WAV, WAV_LEN(BOARD_UP_WAV)); + state->sound_play(BOARD_UP_WAV, WAV_LEN(BOARD_UP_WAV)); #endif } -static struct board board = { - .on_down = &board_on_down, - .on_up = &board_on_up, +void board_init(struct board_state *state) +{ #ifdef BOARD_NAME - .name = BOARD_NAME, + state->name = BOARD_NAME; #else - .name = "Generic Board", + state->name = "Generic Board"; #endif -}; -struct board *board_init(struct board_data data) -{ - board_data = data; - return &board; + state->on_down = &board_on_down; + state->on_up = &board_on_up; } @@ -9,7 +9,7 @@ #define VOLUME 0.15 -struct board *board = NULL; +struct board_state state = {0}; void do_exit(int code) { @@ -21,14 +21,14 @@ void on_clean_exit(void) { do_exit(0); } void keyboard_on_down(void) { - assert(board != NULL); - board->on_down(); + assert(state.on_down != NULL); + state.on_down(&state); } void keyboard_on_up(void) { - assert(board != NULL); - board->on_up(); + assert(state.on_up != NULL); + state.on_up(&state); } int main(int argc, char **argv) @@ -40,12 +40,17 @@ int main(int argc, char **argv) // TODO: List valid boards. return 1; } + + /* Initialise board state */ + state.sound_play = &sound_play; /* Inject platform-specific impl */ + fprintf(stderr, "Loading board...\n"); - if ((board = load_board(argv[1])) == NULL) { + if (!load_board(&state, argv[1])) { printf("Failed to load board, exiting.\n"); return 1; } - fprintf(stderr, "Loaded board: %s\n", board->name); + state.board_init(&state); + fprintf(stderr, "Loaded board: %s\n", state.name); fprintf(stderr, "Initialisating sound system...\n"); if (!sound_init(VOLUME)) { diff --git a/platform/darwin.c b/platform/darwin.c index 3189a5d..2ffdbe3 100644 --- a/platform/darwin.c +++ b/platform/darwin.c @@ -45,7 +45,7 @@ void enter_idle(void) } /* TODO: probably also merge into a *nix module */ -struct board *load_board(char *board_name) +bool load_board(struct board_state *state, char *board_name) { char so_name[100]; int r = snprintf(so_name, 100, "./board/%s.dylib", board_name); @@ -60,16 +60,14 @@ struct board *load_board(char *board_name) return false; } - fn_board_init board_init = dlsym(board_module, "board_init"); + board_init_fn_t board_init = dlsym(board_module, "board_init"); if (board_init == NULL) { printf("ERROR: No board initialisation function could be loaded.\n"); return false; } + state->board_init = board_init; - struct board_data data = { - .sound_play = &sound_play - }; - return board_init(data); + return true; } /* https://developer.apple.com/documentation/iokit/iohidvaluecallback */ diff --git a/platform/platform.h b/platform/platform.h index ca07789..34f1200 100644 --- a/platform/platform.h +++ b/platform/platform.h @@ -5,7 +5,7 @@ #include "../board/board.h" -struct board *load_board(char *board_name); +bool load_board(struct board_state *state, char *board_name); bool sound_init(float volume); void sound_play(unsigned char *buffer, unsigned int buffer_len); |