Project

General

Profile

895 markw
#pragma once
/* Simple lightweight menu function */

/* menu entry:
* i) display function or fixed text
* ii) location based actions: left/right/fire -> function
* -> result: redraw, exit, nothing
* iii) actions that are not impacted by location: typing
* iv) no content
*/

#include "integer.h"
#include "joystick.h"

typedef void (*menuDisplay) (void * menuData, void * userData); /*Call printf...*/
896 markw
typedef BOOL (*menuAction) (void * menuData, struct joystick_status *, void * userData); /* return true to exit */
895 markw
typedef void (*menuPress) (void * menuData, unsigned char key_ascii);

struct MenuEntry
{
menuDisplay displayFunction;
union
{
char * txt;
void * userData;
int val;
};
menuAction actionFunction;
unsigned char flags;

#define MENU_FLAG_EXIT 1
#define MENU_FLAG_LEFT 2
#define MENU_FLAG_RIGHT 4
#define MENU_FLAG_MOVE (MENU_FLAG_LEFT|MENU_FLAG_RIGHT)
#define MENU_FLAG_FIRE 8
#define MENU_FLAG_FINAL 16
#define MENU_FLAG_MAYEXIT 32
#define MENU_FLAG_SD 64
942 markw
#define MENU_FLAG_KEYPRESS 128
895 markw
};

942 markw
int display_menu(const char * title, struct MenuEntry * entries, menuPress hotkeys, void * menuData);
895 markw
/*
* Example menu
void menuPressTest(unsigned char key)
{
printf("Key pressed:%c\n",key);
wait_us(2000000);
}

BOOL menuFire(struct joystick_status * joy)
{
printf("Fire:%d",joy->fire_);
wait_us(2000000);
return 0;
}

BOOL menuMove(struct joystick_status * joy)
{
printf("Move:%d",joy->x_);
wait_us(2000000);
return 0;
}

struct MenuEntry entries[] =
{
{0,"Subtitle",0,0},
{0,0,0,0}, //blank line
{0,"Fire",&menuFire,MENU_FLAG_FIRE},
{0,"Move",&menuMove,MENU_FLAG_MOVE},
{0,"Test",0,MENU_FLAG_FINAL}
};

display_menu("Settings",&entries[0], &menuPressTest);

*/