GBA Context: Adjustable solar sensor, map to N3DS c-stick

This commit is contained in:
Jeffrey Pfau 2015-09-01 23:09:48 -07:00
parent 5e759afada
commit ed46d63ebd
9 changed files with 62 additions and 15 deletions

View File

@ -5,6 +5,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gui-runner.h"
#include "gba/interface.h"
#include "gba/serialize.h"
#include "util/gui/file-select.h"
#include "util/gui/font.h"
@ -36,9 +37,26 @@ static void _drawBackground(struct GUIBackground* background) {
}
}
static void _updateLux(struct GBALuminanceSource* lux) {
UNUSED(lux);
}
static uint8_t _readLux(struct GBALuminanceSource* lux) {
struct GBAGUIRunnerLux* runnerLux = (struct GBAGUIRunnerLux*) lux;
int value = 0x16;
if (runnerLux->luxLevel > 0) {
value += GBA_LUX_LEVELS[runnerLux->luxLevel - 1];
}
return 0xFF - value;
}
void GBAGUIInit(struct GBAGUIRunner* runner, const char* port) {
GUIInit(&runner->params);
GBAContextInit(&runner->context, port);
runner->luminanceSource.d.readLuminance = _readLux;
runner->luminanceSource.d.sample = _updateLux;
runner->luminanceSource.luxLevel = 0;
runner->context.gba->luminanceSource = &runner->luminanceSource.d;
runner->background.d.draw = _drawBackground;
runner->background.p = runner;
if (runner->setup) {
@ -139,10 +157,21 @@ void GBAGUIRunloop(struct GBAGUIRunner* runner) {
bool running = true;
while (running) {
while (true) {
int guiKeys = runner->params.pollInput();
uint32_t guiKeys;
GUIPollInput(&runner->params, &guiKeys, 0);
if (guiKeys & (1 << GUI_INPUT_CANCEL)) {
break;
}
if (guiKeys & (1 << GBA_GUI_INPUT_INCREASE_BRIGHTNESS)) {
if (runner->luminanceSource.luxLevel < 10) {
++runner->luminanceSource.luxLevel;
}
}
if (guiKeys & (1 << GBA_GUI_INPUT_DECREASE_BRIGHTNESS)) {
if (runner->luminanceSource.luxLevel > 0) {
--runner->luminanceSource.luxLevel;
}
}
uint16_t keys = runner->pollGameInput(runner);
if (runner->prepareForFrame) {
runner->prepareForFrame(runner);
@ -156,7 +185,7 @@ void GBAGUIRunloop(struct GBAGUIRunner* runner) {
}
GUIInvalidateKeys(&runner->params);
int keys = -1; // Huge hack to avoid an extra variable!
uint32_t keys = 0xFFFFFFFF; // Huge hack to avoid an extra variable!
struct GUIMenuItem item;
enum GUIMenuExitReason reason = GUIShowMenu(&runner->params, &pauseMenu, &item);
if (reason == GUI_MENU_EXIT_ACCEPT) {

View File

@ -9,17 +9,27 @@
#include "gba/context/context.h"
#include "util/gui.h"
enum GBAGUIInput {
GBA_GUI_INPUT_INCREASE_BRIGHTNESS = GUI_INPUT_USER_START,
GBA_GUI_INPUT_DECREASE_BRIGHTNESS
};
struct GBAGUIBackground {
struct GUIBackground d;
struct GBAGUIRunner* p;
};
struct GBAGUIRunnerLux {
struct GBALuminanceSource d;
int luxLevel;
};
struct GBAGUIRunner {
struct GBAContext context;
struct GUIParams params;
struct GBAGUIBackground background;
struct GBAGUIRunnerLux luminanceSource;
void (*setup)(struct GBAGUIRunner*);
void (*teardown)(struct GBAGUIRunner*);

View File

@ -126,9 +126,9 @@ static uint16_t _pollGameInput(struct GBAGUIRunner* runner) {
return activeKeys;
}
static int _pollInput(void) {
static uint32_t _pollInput(void) {
hidScanInput();
int keys = 0;
uint32_t keys = 0;
int activeKeys = hidKeysHeld();
if (activeKeys & KEY_X) {
keys |= 1 << GUI_INPUT_CANCEL;
@ -151,6 +151,12 @@ static int _pollInput(void) {
if (activeKeys & KEY_DOWN) {
keys |= 1 << GUI_INPUT_DOWN;
}
if (activeKeys & KEY_CSTICK_UP) {
keys |= 1 << GBA_GUI_INPUT_INCREASE_BRIGHTNESS;
}
if (activeKeys & KEY_CSTICK_DOWN) {
keys |= 1 << GBA_GUI_INPUT_DECREASE_BRIGHTNESS;
}
return keys;
}

View File

@ -30,7 +30,7 @@ static void _drawEnd(void) {
vita2d_swap_buffers();
}
static int _pollInput(void) {
static uint32_t _pollInput(void) {
SceCtrlData pad;
sceCtrlPeekBufferPositive(0, &pad, 1);
int input = 0;

View File

@ -33,7 +33,7 @@ static int32_t _readGyroZ(struct GBARotationSource* source);
static void _drawStart(void);
static void _drawEnd(void);
static int _pollInput(void);
static uint32_t _pollInput(void);
static void _guiPrepare(void);
static void _guiFinish(void);
@ -224,7 +224,7 @@ static void _drawEnd(void) {
VIDEO_Flush();
}
static int _pollInput(void) {
static uint32_t _pollInput(void) {
PAD_ScanPads();
u16 padkeys = PAD_ButtonsHeld(0);

View File

@ -10,9 +10,9 @@ void GUIInit(struct GUIParams* params) {
strncpy(params->currentPath, params->basePath, PATH_MAX);
}
void GUIPollInput(struct GUIParams* params, int* newInputOut, int* heldInput) {
int input = params->pollInput();
int newInput = 0;
void GUIPollInput(struct GUIParams* params, uint32_t* newInputOut, uint32_t* heldInput) {
uint32_t input = params->pollInput();
uint32_t newInput = 0;
for (int i = 0; i < GUI_INPUT_MAX; ++i) {
if (input & (1 << i)) {
++params->inputHistory[i];

View File

@ -23,7 +23,9 @@ enum GUIInput {
GUI_INPUT_LEFT,
GUI_INPUT_RIGHT,
GUI_INPUT_MAX
GUI_INPUT_USER_START = 0x10,
GUI_INPUT_MAX = 0x20
};
struct GUIBackground {
@ -38,7 +40,7 @@ struct GUIParams {
void (*drawStart)(void);
void (*drawEnd)(void);
int (*pollInput)(void);
uint32_t (*pollInput)(void);
void (*guiPrepare)(void);
void (*guiFinish)(void);
@ -53,7 +55,7 @@ struct GUIParams {
#define GUI_PARAMS_TRAIL {}, "", 0
void GUIInit(struct GUIParams* params);
void GUIPollInput(struct GUIParams* params, int* newInput, int* heldInput);
void GUIPollInput(struct GUIParams* params, uint32_t* newInput, uint32_t* heldInput);
void GUIInvalidateKeys(struct GUIParams* params);
#endif

View File

@ -56,7 +56,7 @@ static bool _refreshDirectory(struct GUIParams* params, const char* currentPath,
while ((de = dir->listNext(dir))) {
++i;
if (!(i % SCANNING_THRESHOLD)) {
int input = 0;
uint32_t input = 0;
GUIPollInput(params, &input, 0);
if (input & (1 << GUI_INPUT_CANCEL)) {
return false;

View File

@ -21,7 +21,7 @@ enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* men
GUIInvalidateKeys(params);
while (true) {
int newInput = 0;
uint32_t newInput = 0;
GUIPollInput(params, &newInput, 0);
if (newInput & (1 << GUI_INPUT_UP) && menu->index > 0) {