MCUME/MCUME_teensy/teensync/emuapi.cpp

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
}