#include //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 }