diff --git a/Source/Android/PluginInput/Controller_1.1.h b/Source/Android/PluginInput/Controller_1.1.h new file mode 100644 index 000000000..bd8279332 --- /dev/null +++ b/Source/Android/PluginInput/Controller_1.1.h @@ -0,0 +1,219 @@ +/********************************************************************************** +Common Controller plugin spec, version #1.1 +**********************************************************************************/ +#pragma once + +#include + +enum { PLUGIN_TYPE_CONTROLLER = 4 }; + +/*** Conteroller plugin's ****/ +enum +{ + PLUGIN_NONE = 1, + PLUGIN_MEMPAK = 2, + PLUGIN_RUMBLE_PAK = 3, + PLUGIN_TANSFER_PAK = 4, + PLUGIN_RAW = 5, +}; + +#if defined(_WIN32) +#define EXPORT extern "C" __declspec(dllexport) +#define CALL __cdecl +#else +#define EXPORT extern "C" __attribute__((visibility("default"))) +#define CALL +#endif + +/***** Structures *****/ +typedef struct +{ + uint16_t Version; /* Should be set to 0x0101 */ + uint16_t Type; /* Set to PLUGIN_TYPE_CONTROLLER */ + char Name[100]; /* Name of the DLL */ + int32_t Reserved1; + int32_t Reserved2; +} PLUGIN_INFO; + +typedef struct +{ + int32_t Present; + int32_t RawData; + int32_t Plugin; +} CONTROL; + +#pragma warning(push) +#pragma warning(disable : 4201) // warning C4201: nonstandard extension used : nameless struct/union + +typedef union +{ + uint32_t Value; + struct + { + unsigned R_DPAD : 1; + unsigned L_DPAD : 1; + unsigned D_DPAD : 1; + unsigned U_DPAD : 1; + unsigned START_BUTTON : 1; + unsigned Z_TRIG : 1; + unsigned B_BUTTON : 1; + unsigned A_BUTTON : 1; + + unsigned R_CBUTTON : 1; + unsigned L_CBUTTON : 1; + unsigned D_CBUTTON : 1; + unsigned U_CBUTTON : 1; + unsigned R_TRIG : 1; + unsigned L_TRIG : 1; + unsigned Reserved1 : 1; + unsigned Reserved2 : 1; + + signed Y_AXIS : 8; + + signed X_AXIS : 8; + }; +} BUTTONS; +#pragma warning(pop) + +typedef struct +{ + void * hMainWindow; + void * hinst; + + int32_t MemoryBswaped; // memory in client- or server-native endian + uint8_t * HEADER; // the ROM header (first 40h bytes of the ROM) + CONTROL * Controls; // pointer to array of 4 controllers, i.e.: CONTROL Controls[4]; +} CONTROL_INFO; + +/****************************************************************** +Function: CloseDLL +Purpose: This function is called when the emulator is closing +down allowing the dll to de-initialise. +input: none +output: none +*******************************************************************/ +EXPORT void CALL CloseDLL(void); + +/****************************************************************** +Function: ControllerCommand +Purpose: To process the raw data that has just been sent to a +specific controller. +input: - Controller Number (0 to 3) and -1 signalling end of +processing the pif ram. +- Pointer of data to be processed. +output: none + +note: This function is only needed if the DLL is allowing raw +data, or the plugin is set to raw + +the data that is being processed looks like this: +initilize controller: 01 03 00 FF FF FF +read controller: 01 04 01 FF FF FF FF +*******************************************************************/ +EXPORT void CALL ControllerCommand(int Control, uint8_t * Command); + +/****************************************************************** +Function: DllAbout +Purpose: This function is optional function that is provided +to give further information about the DLL. +input: a handle to the window that calls this function +output: none +*******************************************************************/ +EXPORT void CALL DllAbout(void * hParent); + +/****************************************************************** +Function: DllConfig +Purpose: This function is optional function that is provided +to allow the user to configure the dll +input: a handle to the window that calls this function +output: none +*******************************************************************/ +EXPORT void CALL DllConfig(void * hParent); + +/****************************************************************** +Function: DllTest +Purpose: This function is optional function that is provided +to allow the user to test the dll +input: a handle to the window that calls this function +output: none +*******************************************************************/ +EXPORT void CALL DllTest(void * hParent); + +/****************************************************************** +Function: GetDllInfo +Purpose: This function allows the emulator to gather information +about the dll by filling in the PluginInfo structure. +input: a pointer to a PLUGIN_INFO stucture that needs to be +filled by the function. (see def above) +output: none +*******************************************************************/ +EXPORT void CALL GetDllInfo(PLUGIN_INFO * PluginInfo); + +/****************************************************************** +Function: GetKeys +Purpose: To get the current state of the controllers buttons. +input: - Controller Number (0 to 3) +- A pointer to a BUTTONS structure to be filled with +the controller state. +output: none +*******************************************************************/ +EXPORT void CALL GetKeys(int32_t Control, BUTTONS * Keys); + +/****************************************************************** +Function: InitiateControllers +Purpose: This function initialises how each of the controllers +should be handled. +input: - The handle to the main window. +- A controller structure that needs to be filled for +the emulator to know how to handle each controller. +output: none +*******************************************************************/ +EXPORT void CALL InitiateControllers(CONTROL_INFO ControlInfo); + +/****************************************************************** +Function: ReadController +Purpose: To process the raw data in the pif ram that is about to +be read. +input: - Controller Number (0 to 3) and -1 signalling end of +processing the pif ram. +- Pointer of data to be processed. +output: none +note: This function is only needed if the DLL is allowing raw +data. +*******************************************************************/ +EXPORT void CALL ReadController(int Control, uint8_t * Command); + +/****************************************************************** +Function: RomClosed +Purpose: This function is called when a rom is closed. +input: none +output: none +*******************************************************************/ +EXPORT void CALL RomClosed(void); + +/****************************************************************** +Function: RomOpen +Purpose: This function is called when a rom is open. (from the +emulation thread) +input: none +output: none +*******************************************************************/ +EXPORT void CALL RomOpen(void); + +/****************************************************************** +Function: WM_KeyDown +Purpose: To pass the WM_KeyDown message from the emulator to the +plugin. +input: wParam and lParam of the WM_KEYDOWN message. +output: none +*******************************************************************/ +EXPORT void CALL WM_KeyDown(uint32_t wParam, uint32_t lParam); + +/****************************************************************** +Function: WM_KeyUp +Purpose: To pass the WM_KEYUP message from the emulator to the +plugin. +input: wParam and lParam of the WM_KEYDOWN message. +output: none +*******************************************************************/ +EXPORT void CALL WM_KeyUp(uint32_t wParam, uint32_t lParam); \ No newline at end of file diff --git a/Source/Android/PluginInput/Main.cpp b/Source/Android/PluginInput/Main.cpp new file mode 100644 index 000000000..8eca96d34 --- /dev/null +++ b/Source/Android/PluginInput/Main.cpp @@ -0,0 +1,235 @@ +/**************************************************************************** + * * + * Project64 - A Nintendo 64 emulator. * + * http://www.pj64-emu.com/ * + * Copyright (C) 2016 Project64. All rights reserved. * + * * + * License: * + * GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * + * version 2 of the License, or (at your option) any later version. * + * * + ****************************************************************************/ +#include "Controller_1.1.h" +#include "Version.h" +#include +#include + +#ifdef ANDROID +#include +#include + +#define printf(...) __android_log_print(ANDROID_LOG_VERBOSE, "PluginInput", __VA_ARGS__) + +#endif + +static CONTROL_INFO g_control_info; +BUTTONS g_buttons; + +void ShowAboutWindow (void * hParent); + +/****************************************************************** +Function: CloseDLL +Purpose: This function is called when the emulator is closing +down allowing the dll to de-initialise. +input: none +output: none +*******************************************************************/ +EXPORT void CALL CloseDLL (void) +{ +} + +/****************************************************************** +Function: ControllerCommand +Purpose: To process the raw data that has just been sent to a +specific controller. +input: - Controller Number (0 to 3) and -1 signalling end of +processing the pif ram. +- Pointer of data to be processed. +output: none + +note: This function is only needed if the DLL is allowing raw +data, or the plugin is set to raw + +the data that is being processed looks like this: +initilize controller: 01 03 00 FF FF FF +read controller: 01 04 01 FF FF FF FF +*******************************************************************/ +EXPORT void CALL ControllerCommand ( int /*Control*/, uint8_t * /*Command*/) +{ +} + +/****************************************************************** +Function: DllAbout +Purpose: This function is optional function that is provided +to give further information about the DLL. +input: a handle to the window that calls this function +output: none +*******************************************************************/ +EXPORT void CALL DllAbout ( void * hParent ) +{ +#ifdef _WIN32 + ShowAboutWindow(hParent); +#endif +} + +/****************************************************************** +Function: DllConfig +Purpose: This function is optional function that is provided +to allow the user to configure the dll +input: a handle to the window that calls this function +output: none +*******************************************************************/ +EXPORT void CALL DllConfig ( void * /*hParent*/ ) +{ +} + +/****************************************************************** +Function: DllTest +Purpose: This function is optional function that is provided +to allow the user to test the dll +input: a handle to the window that calls this function +output: none +*******************************************************************/ +EXPORT void CALL DllTest ( void * /*hParent*/ ) +{ +} + +/****************************************************************** +Function: GetDllInfo +Purpose: This function allows the emulator to gather information +about the dll by filling in the PluginInfo structure. +input: a pointer to a PLUGIN_INFO stucture that needs to be +filled by the function. (see def above) +output: none +*******************************************************************/ +EXPORT void CALL GetDllInfo ( PLUGIN_INFO * PluginInfo ) +{ + PluginInfo->Version = 0x0101; + PluginInfo->Type = PLUGIN_TYPE_CONTROLLER; +#ifdef _DEBUG + sprintf(PluginInfo->Name, "Android Input Debug Plugin %s", VER_FILE_VERSION_STR); +#else + sprintf(PluginInfo->Name, "Android Input Plugin %s", VER_FILE_VERSION_STR); +#endif +} + +/****************************************************************** +Function: GetKeys +Purpose: To get the current state of the controllers buttons. +input: - Controller Number (0 to 3) +- A pointer to a BUTTONS structure to be filled with +the controller state. +output: none +*******************************************************************/ +EXPORT void CALL GetKeys(int Control, BUTTONS * Keys ) +{ + if (Control == 0) + { + *Keys = g_buttons; + } +} + +/****************************************************************** +Function: InitiateControllers +Purpose: This function initialises how each of the controllers +should be handled. +input: - The handle to the main window. +- A controller structure that needs to be filled for +the emulator to know how to handle each controller. +output: none +*******************************************************************/ +EXPORT void CALL InitiateControllers (CONTROL_INFO ControlInfo) +{ + g_control_info = ControlInfo; + g_control_info.Controls[0].Present = true; + g_control_info.Controls[0].Plugin = PLUGIN_MEMPAK; +} + +/****************************************************************** +Function: ReadController +Purpose: To process the raw data in the pif ram that is about to +be read. +input: - Controller Number (0 to 3) and -1 signalling end of +processing the pif ram. +- Pointer of data to be processed. +output: none +note: This function is only needed if the DLL is allowing raw +data. +*******************************************************************/ +EXPORT void CALL ReadController ( int /*Control*/, uint8_t * /*Command*/ ) +{ +} + +/****************************************************************** +Function: RomClosed +Purpose: This function is called when a rom is closed. +input: none +output: none +*******************************************************************/ +EXPORT void CALL RomClosed (void) +{ +} + +/****************************************************************** +Function: RomOpen +Purpose: This function is called when a rom is open. (from the +emulation thread) +input: none +output: none +*******************************************************************/ +EXPORT void CALL RomOpen (void) +{ + memset(&g_buttons, 0, sizeof(g_buttons)); +} + +/****************************************************************** +Function: WM_KeyDown +Purpose: To pass the WM_KeyDown message from the emulator to the +plugin. +input: wParam and lParam of the WM_KEYDOWN message. +output: none +*******************************************************************/ +EXPORT void CALL WM_KeyDown( uint32_t /*wParam*/, uint32_t /*lParam*/ ) +{ +} + +/****************************************************************** +Function: WM_KeyUp +Purpose: To pass the WM_KEYUP message from the emulator to the +plugin. +input: wParam and lParam of the WM_KEYDOWN message. +output: none +*******************************************************************/ +EXPORT void CALL WM_KeyUp( uint32_t /*wParam*/, uint32_t /*lParam*/ ) +{ +} + +#ifdef ANDROID +EXPORT void CALL Java_emu_project64_jni_NativeInput_setState(JNIEnv* env, jclass jcls, jint controllerNum, jbooleanArray Buttons, jint pXAxis, jint pYAxis) +{ + printf("setState controllerNum = %d",controllerNum); + jboolean* elements = env->GetBooleanArrayElements(Buttons, NULL); + if (controllerNum == 0) + { + g_buttons.R_DPAD = elements[0]; + g_buttons.L_DPAD = elements[1]; + g_buttons.D_DPAD = elements[2]; + g_buttons.U_DPAD = elements[3]; + g_buttons.START_BUTTON = elements[4]; + g_buttons.Z_TRIG = elements[5]; + g_buttons.B_BUTTON = elements[6]; + g_buttons.A_BUTTON = elements[7]; + g_buttons.R_CBUTTON = elements[8]; + g_buttons.L_CBUTTON = elements[9]; + g_buttons.D_CBUTTON = elements[10]; + g_buttons.U_CBUTTON = elements[11]; + g_buttons.R_TRIG = elements[12]; + g_buttons.L_TRIG = elements[13]; + g_buttons.Reserved1 = elements[14]; + g_buttons.Reserved2 = elements[15]; + g_buttons.Y_AXIS = pXAxis; + g_buttons.X_AXIS = pYAxis; + } + env->ReleaseBooleanArrayElements(Buttons, elements, 0); +} +#endif \ No newline at end of file diff --git a/Source/Android/PluginInput/PluginInput.vcxproj b/Source/Android/PluginInput/PluginInput.vcxproj new file mode 100644 index 000000000..907bf77d0 --- /dev/null +++ b/Source/Android/PluginInput/PluginInput.vcxproj @@ -0,0 +1,46 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {1133A1CC-A9E5-4026-B20D-6A2987130D4E} + Win32Proj + AndroidInput + + + DynamicLibrary + + + + + + + + + AndroidInput + AndroidInput_d + $(SolutionDir)Plugin\Input\ + $(SolutionDir)Plugin64\Input\ + + + + NotUsing + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Android/PluginInput/PluginInput.vcxproj.filters b/Source/Android/PluginInput/PluginInput.vcxproj.filters new file mode 100644 index 000000000..2e4cd97e8 --- /dev/null +++ b/Source/Android/PluginInput/PluginInput.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/Source/Android/PluginInput/Version.h b/Source/Android/PluginInput/Version.h new file mode 100644 index 000000000..368692156 --- /dev/null +++ b/Source/Android/PluginInput/Version.h @@ -0,0 +1,41 @@ +/**************************************************************************** +* * +* Project64 - A Nintendo 64 emulator. * +* http://www.pj64-emu.com/ * +* Copyright (C) 2016 Project64. All rights reserved. * +* * +* License: * +* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * +* * +****************************************************************************/ +#define STRINGIZE2(s) #s +#define STRINGIZE(s) STRINGIZE2(s) + +#define VERSION_MAJOR 1 +#define VERSION_MINOR 0 +#define VERSION_REVISION 0 +#define VERSION_BUILD 9999 + +#define VER_FILE_DESCRIPTION_STR "RSP HLE Plugin" +#define VER_FILE_VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD +#define VER_FILE_VERSION_STR STRINGIZE(VERSION_MAJOR) \ + "." STRINGIZE(VERSION_MINOR) \ + "." STRINGIZE(VERSION_REVISION) \ + "." STRINGIZE(VERSION_BUILD) \ + +#define VER_PRODUCTNAME_STR "RSP-HLE" +#define VER_PRODUCT_VERSION VER_FILE_VERSION +#define VER_PRODUCT_VERSION_STR VER_FILE_VERSION_STR +#define VER_ORIGINAL_FILENAME_STR VER_PRODUCTNAME_STR ".dll" +#define VER_INTERNAL_NAME_STR VER_PRODUCTNAME_STR +#define VER_COPYRIGHT_STR "Copyright (C) 2016" + +#ifdef _DEBUG +#define VER_VER_DEBUG VS_FF_DEBUG +#else +#define VER_VER_DEBUG 0 +#endif + +#define VER_FILEOS VOS_NT_WINDOWS32 +#define VER_FILEFLAGS VER_VER_DEBUG +#define VER_FILETYPE VFT_DLL diff --git a/Source/Android/PluginInput/about.cpp b/Source/Android/PluginInput/about.cpp new file mode 100644 index 000000000..19d5031c6 --- /dev/null +++ b/Source/Android/PluginInput/about.cpp @@ -0,0 +1,10 @@ +#ifdef _WIN32 +#include +#endif + +void ShowAboutWindow (void * hParent) +{ +#ifdef _WIN32 + MessageBox((HWND)hParent,"Android Input Plugin","Dll About",MB_OK); +#endif +} \ No newline at end of file