GBA: Hook up light sensor API

This commit is contained in:
Jeffrey Pfau 2014-12-25 02:53:43 -08:00
parent 9b1769d67d
commit ca51098ca0
5 changed files with 23 additions and 2 deletions

View File

@ -322,6 +322,7 @@ void GBAGPIOInitLightSensor(struct GBACartridgeGPIO* gpio) {
gpio->gpioDevices |= GPIO_LIGHT_SENSOR; gpio->gpioDevices |= GPIO_LIGHT_SENSOR;
gpio->lightCounter = 0; gpio->lightCounter = 0;
gpio->lightEdge = false; gpio->lightEdge = false;
gpio->lightSample = 0xFF;
} }
void _lightReadPins(struct GBACartridgeGPIO* gpio) { void _lightReadPins(struct GBACartridgeGPIO* gpio) {
@ -330,15 +331,22 @@ void _lightReadPins(struct GBACartridgeGPIO* gpio) {
return; return;
} }
if (gpio->p1) { if (gpio->p1) {
struct GBALuminanceSource* lux = gpio->p->luminanceSource;
GBALog(0, GBA_LOG_DEBUG, "[SOLAR] Got reset"); GBALog(0, GBA_LOG_DEBUG, "[SOLAR] Got reset");
gpio->lightCounter = 0; gpio->lightCounter = 0;
if (lux) {
lux->sample(lux);
gpio->lightSample = lux->readLuminance(lux);
} else {
gpio->lightSample = 0xFF;
}
} }
if (gpio->p0 && gpio->lightEdge) { if (gpio->p0 && gpio->lightEdge) {
++gpio->lightCounter; ++gpio->lightCounter;
} }
gpio->lightEdge = !gpio->p0; gpio->lightEdge = !gpio->p0;
bool sendBit = gpio->lightCounter >= 0x80; bool sendBit = gpio->lightCounter >= gpio->lightSample;
_outputPins(gpio, sendBit << 3); _outputPins(gpio, sendBit << 3);
GBALog(0, GBA_LOG_DEBUG, "[SOLAR] Output %u with pins %u", gpio->lightCounter, gpio->pinState); GBALog(0, GBA_LOG_DEBUG, "[SOLAR] Output %u with pins %u", gpio->lightCounter, gpio->pinState);
} }

View File

@ -104,7 +104,8 @@ struct GBACartridgeGPIO {
uint16_t gyroSample; uint16_t gyroSample;
bool gyroEdge; bool gyroEdge;
int lightCounter : 12; unsigned lightCounter : 12;
uint8_t lightSample;
bool lightEdge; bool lightEdge;
}; };

View File

@ -17,4 +17,10 @@ struct GBARotationSource {
int32_t (*readGyroZ)(struct GBARotationSource*); int32_t (*readGyroZ)(struct GBARotationSource*);
}; };
struct GBALuminanceSource {
void (*sample)(struct GBALuminanceSource*);
uint8_t (*readLuminance)(struct GBALuminanceSource*);
};
#endif #endif

View File

@ -732,6 +732,10 @@ void _checkOverrides(struct GBA* gba, uint32_t id) {
GBAGPIOInitRumble(&gba->memory.gpio); GBAGPIOInitRumble(&gba->memory.gpio);
} }
if (_overrides[i].gpio & GPIO_LIGHT_SENSOR) {
GBAGPIOInitLightSensor(&gba->memory.gpio);
}
gba->busyLoop = _overrides[i].busyLoop; gba->busyLoop = _overrides[i].busyLoop;
return; return;
} }

View File

@ -115,7 +115,9 @@ struct GBA {
int* keySource; int* keySource;
uint32_t busyLoop; uint32_t busyLoop;
struct GBARotationSource* rotationSource; struct GBARotationSource* rotationSource;
struct GBALuminanceSource* luminanceSource;
struct GBARumble* rumble; struct GBARumble* rumble;
struct GBARRContext* rr; struct GBARRContext* rr;
void* pristineRom; void* pristineRom;
size_t pristineRomSize; size_t pristineRomSize;