kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
239 wiersze
4.3 KiB
C++
239 wiersze
4.3 KiB
C++
#include <Arduino.h>
|
|
|
|
//extern "C" {
|
|
#include "emuapi.h"
|
|
#include "iopins.h"
|
|
//}
|
|
|
|
|
|
void emu_init(void)
|
|
{
|
|
emu_InitJoysticks();
|
|
}
|
|
|
|
|
|
void emu_printf(char * text)
|
|
{
|
|
Serial.println(text);
|
|
}
|
|
|
|
void emu_printf(int val)
|
|
{
|
|
Serial.println(val);
|
|
}
|
|
|
|
void emu_printi(int val)
|
|
{
|
|
Serial.println(val);
|
|
}
|
|
|
|
void * emu_Malloc(int size)
|
|
{
|
|
void * retval = malloc(size);
|
|
if (!retval) {
|
|
emu_printf("failled to allocate ");
|
|
emu_printf(size);
|
|
}
|
|
else {
|
|
emu_printf("could allocate ");
|
|
emu_printf(size);
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
void emu_Free(void * pt)
|
|
{
|
|
free(pt);
|
|
}
|
|
|
|
|
|
|
|
static int keypadval=0;
|
|
static boolean joySwapped = false;
|
|
static uint16_t bLastState;
|
|
static int xRef;
|
|
static int yRef;
|
|
|
|
|
|
int emu_ReadAnalogJoyX(int min, int max)
|
|
{
|
|
int val = analogRead(PIN_JOY2_A1X);
|
|
#if INVX
|
|
val = 4095 - val;
|
|
#endif
|
|
val = val-xRef;
|
|
val = ((val*140)/100);
|
|
if ( (val > -512) && (val < 512) ) val = 0;
|
|
val = val+2048;
|
|
return (val*(max-min))/4096;
|
|
}
|
|
|
|
int emu_ReadAnalogJoyY(int min, int max)
|
|
{
|
|
int val = analogRead(PIN_JOY2_A2Y);
|
|
#if INVY
|
|
val = 4095 - val;
|
|
#endif
|
|
val = val-yRef;
|
|
val = ((val*120)/100);
|
|
if ( (val > -512) && (val < 512) ) val = 0;
|
|
//val = (val*(max-min))/4096;
|
|
val = val+2048;
|
|
//return val+(max-min)/2;
|
|
return (val*(max-min))/4096;
|
|
}
|
|
|
|
|
|
static uint16_t readAnalogJoystick(void)
|
|
{
|
|
uint16_t joysval = 0;
|
|
|
|
int xReading = emu_ReadAnalogJoyX(0,256);
|
|
if (xReading > 128) joysval |= MASK_JOY2_LEFT;
|
|
else if (xReading < 128) joysval |= MASK_JOY2_RIGHT;
|
|
|
|
int yReading = emu_ReadAnalogJoyY(0,256);
|
|
if (yReading < 128) joysval |= MASK_JOY2_UP;
|
|
else if (yReading > 128) joysval |= MASK_JOY2_DOWN;
|
|
|
|
#ifdef PIN_JOY2_BTN
|
|
joysval |= (digitalRead(PIN_JOY2_BTN) == HIGH ? 0 : MASK_JOY2_BTN);
|
|
#endif
|
|
return (joysval);
|
|
}
|
|
|
|
|
|
int emu_SwapJoysticks(int statusOnly) {
|
|
if (!statusOnly) {
|
|
if (joySwapped) {
|
|
joySwapped = false;
|
|
}
|
|
else {
|
|
joySwapped = true;
|
|
}
|
|
}
|
|
return(joySwapped?1:0);
|
|
}
|
|
|
|
int emu_GetPad(void)
|
|
{
|
|
return(keypadval/*|((joySwapped?1:0)<<7)*/);
|
|
}
|
|
|
|
int emu_ReadKeys(void)
|
|
{
|
|
uint16_t retval;
|
|
uint16_t j1 = readAnalogJoystick();
|
|
uint16_t j2 = 0;
|
|
|
|
// Second joystick
|
|
#ifdef PIN_JOY1_1
|
|
if ( digitalRead(PIN_JOY1_1) == LOW ) j2 |= MASK_JOY2_UP;
|
|
#endif
|
|
#ifdef PIN_JOY1_2
|
|
if ( digitalRead(PIN_JOY1_2) == LOW ) j2 |= MASK_JOY2_DOWN;
|
|
#endif
|
|
#ifdef PIN_JOY1_3
|
|
if ( digitalRead(PIN_JOY1_3) == LOW ) j2 |= MASK_JOY2_RIGHT;
|
|
#endif
|
|
#ifdef PIN_JOY1_4
|
|
if ( digitalRead(PIN_JOY1_4) == LOW ) j2 |= MASK_JOY2_LEFT;
|
|
#endif
|
|
#ifdef PIN_JOY1_BTN
|
|
if ( digitalRead(PIN_JOY1_BTN) == LOW ) j2 |= MASK_JOY2_BTN;
|
|
#endif
|
|
if (joySwapped) {
|
|
retval = ((j1 << 8) | j2);
|
|
}
|
|
else {
|
|
retval = ((j2 << 8) | j1);
|
|
}
|
|
|
|
#ifdef PIN_KEY_USER1
|
|
if ( digitalRead(PIN_KEY_USER1) == LOW ) retval |= MASK_KEY_USER1;
|
|
#endif
|
|
#ifdef PIN_KEY_USER2
|
|
if ( digitalRead(PIN_KEY_USER2) == LOW ) retval |= MASK_KEY_USER2;
|
|
#endif
|
|
#ifdef PIN_KEY_USER3
|
|
if ( digitalRead(PIN_KEY_USER3) == LOW ) retval |= MASK_KEY_USER3;
|
|
#endif
|
|
#ifdef PIN_KEY_USER4
|
|
if ( digitalRead(PIN_KEY_USER4) == LOW ) retval |= MASK_KEY_USER4;
|
|
#endif
|
|
|
|
//Serial.println(retval,HEX);
|
|
|
|
return (retval);
|
|
}
|
|
|
|
unsigned short emu_DebounceLocalKeys(void)
|
|
{
|
|
uint16_t bCurState = emu_ReadKeys();
|
|
uint16_t bClick = bCurState & ~bLastState;
|
|
bLastState = bCurState;
|
|
|
|
return (bClick);
|
|
}
|
|
|
|
|
|
void emu_InitJoysticks(void) {
|
|
|
|
// Second Joystick
|
|
#ifdef PIN_JOY1_1
|
|
pinMode(PIN_JOY1_1, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_JOY1_2
|
|
pinMode(PIN_JOY1_2, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_JOY1_3
|
|
pinMode(PIN_JOY1_3, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_JOY1_4
|
|
pinMode(PIN_JOY1_4, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_JOY1_BTN
|
|
pinMode(PIN_JOY1_BTN, INPUT_PULLUP);
|
|
#endif
|
|
|
|
#ifdef PIN_KEY_USER1
|
|
pinMode(PIN_KEY_USER1, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_KEY_USER2
|
|
pinMode(PIN_KEY_USER2, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_KEY_USER3
|
|
pinMode(PIN_KEY_USER3, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_KEY_USER4
|
|
pinMode(PIN_KEY_USER4, INPUT_PULLUP);
|
|
#endif
|
|
#ifdef PIN_JOY2_BTN
|
|
pinMode(PIN_JOY2_BTN, INPUT_PULLUP);
|
|
#endif
|
|
analogReadResolution(12);
|
|
xRef=0; yRef=0;
|
|
for (int i=0; i<10; i++) {
|
|
xRef += analogRead(PIN_JOY2_A1X);
|
|
yRef += analogRead(PIN_JOY2_A2Y);
|
|
delay(20);
|
|
}
|
|
|
|
#if INVX
|
|
xRef = 4095 -xRef/10;
|
|
#else
|
|
xRef /= 10;
|
|
#endif
|
|
#if INVY
|
|
yRef = 4095 -yRef/10;
|
|
#else
|
|
yRef /= 10;
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
|
|
|