From 44bbb54a62a58be4ad39caf6ba55ff98244223d5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 14 Apr 2013 23:02:53 -0500 Subject: [PATCH] Add a Androind ControllerInterface class for allowing input in a non-hacky way. Add a default GCPad.ini file so it actually works. --- Source/Android/assets/GCPadNew.ini | 29 ++++++++ .../dolphinemu/DolphinEmulator.java | 26 +++---- Source/Core/Core/Src/HW/GCPad.cpp | 18 ----- Source/Core/DolphinWX/CMakeLists.txt | 1 - Source/Core/InputCommon/CMakeLists.txt | 4 ++ .../Src/Android/ButtonManager.cpp | 0 .../Src/Android/ButtonManager.h | 0 .../ControllerInterface/Android/Android.cpp | 67 +++++++++++++++++++ .../Src/ControllerInterface/Android/Android.h | 57 ++++++++++++++++ .../ControllerInterface.cpp | 9 +++ .../ControllerInterface/ControllerInterface.h | 5 +- 11 files changed, 183 insertions(+), 33 deletions(-) create mode 100644 Source/Android/assets/GCPadNew.ini rename Source/Core/{DolphinWX => InputCommon}/Src/Android/ButtonManager.cpp (100%) rename Source/Core/{DolphinWX => InputCommon}/Src/Android/ButtonManager.h (100%) create mode 100644 Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp create mode 100644 Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h diff --git a/Source/Android/assets/GCPadNew.ini b/Source/Android/assets/GCPadNew.ini new file mode 100644 index 0000000000..cb828f9960 --- /dev/null +++ b/Source/Android/assets/GCPadNew.ini @@ -0,0 +1,29 @@ +[GCPad1] +Device = Android/0/Touchscreen +Buttons/A = Button 0 +Buttons/B = Button 1 +Buttons/X = C +Buttons/Y = S +Buttons/Z = D +Buttons/Start = Button 2 +Main Stick/Up = Up +Main Stick/Down = Down +Main Stick/Left = Left +Main Stick/Right = Right +Main Stick/Modifier = Shift_L +Main Stick/Modifier/Range = 50.000000 +C-Stick/Up = I +C-Stick/Down = K +C-Stick/Left = J +C-Stick/Right = L +C-Stick/Modifier = Control_L +C-Stick/Modifier/Range = 50.000000 +Triggers/L = Q +Triggers/R = W +D-Pad/Up = T +D-Pad/Down = G +D-Pad/Left = F +D-Pad/Right = H +[GCPad2] +[GCPad3] +[GCPad4] diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java index 5c79ab94fd..d94033a95e 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java @@ -59,6 +59,7 @@ public class DolphinEmulator extends Activity out.write(buffer, 0, read); } } + @Override public void onStop() { @@ -85,22 +86,15 @@ public class DolphinEmulator extends Activity @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (savedInstanceState == null) { Intent ListIntent = new Intent(this, NativeListView.class); startActivityForResult(ListIntent, 1); // Make the assets directory - try - { - File directory = new File(Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu"); - directory.mkdirs(); - } - catch (Exception ex) - { - Log.w("me", ex.toString()); - } + File directory = new File( + Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu"+File.separator+"Config"); + directory.mkdirs(); // Copy assets if needed java.io.File file = new java.io.File( @@ -108,11 +102,17 @@ public class DolphinEmulator extends Activity if(!file.exists()) { CopyAsset("ButtonA.png", - Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu" + File.separator + "ButtonA.png"); + Environment.getExternalStorageDirectory()+File.separator+ + "dolphin-emu" + File.separator + "ButtonA.png"); CopyAsset("ButtonB.png", - Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu" + File.separator + "ButtonB.png"); + Environment.getExternalStorageDirectory()+File.separator+ + "dolphin-emu" + File.separator + "ButtonB.png"); CopyAsset("ButtonStart.png", - Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu" + File.separator + "ButtonStart.png"); + Environment.getExternalStorageDirectory()+File.separator+ + "dolphin-emu" + File.separator + "ButtonStart.png"); + CopyAsset("GCPadNew.ini", + Environment.getExternalStorageDirectory()+File.separator+ + "dolphin-emu" + File.separator +"Config"+ File.separator +"GCPadNew.ini"); } } } diff --git a/Source/Core/Core/Src/HW/GCPad.cpp b/Source/Core/Core/Src/HW/GCPad.cpp index a66521094c..d764fcdf8a 100644 --- a/Source/Core/Core/Src/HW/GCPad.cpp +++ b/Source/Core/Core/Src/HW/GCPad.cpp @@ -87,24 +87,6 @@ void GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) // get input ((GCPad*)g_plugin.controllers[_numPAD])->GetInput(_pPADStatus); - -#ifdef ANDROID - // XXX: This /really/ needs to be moved to a controller interface - if (Host_GetKeyState(0)) - { - _pPADStatus->button |= PAD_BUTTON_A; - _pPADStatus->analogA = 255; - } - if (Host_GetKeyState(1)) - { - _pPADStatus->button |= PAD_BUTTON_B; - _pPADStatus->analogB = 255; - } - if (Host_GetKeyState(2)) - { - _pPADStatus->button |= PAD_BUTTON_START; - } -#endif } // __________________________________________________________________________________________________ diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index e7e3b1f54c..9508f75a36 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -92,7 +92,6 @@ if(wxWidgets_FOUND) else() if(ANDROID) set(SRCS Src/Android/TextureLoader.cpp - Src/Android/ButtonManager.cpp Src/MainAndroid.cpp) else() set(SRCS Src/MainNoGUI.cpp) diff --git a/Source/Core/InputCommon/CMakeLists.txt b/Source/Core/InputCommon/CMakeLists.txt index 3a8ea1e7a2..8fc2a344c7 100644 --- a/Source/Core/InputCommon/CMakeLists.txt +++ b/Source/Core/InputCommon/CMakeLists.txt @@ -21,6 +21,10 @@ elseif(X11_FOUND) set(SRCS ${SRCS} Src/ControllerInterface/SDL/SDL.cpp Src/ControllerInterface/Xlib/Xlib.cpp) +elseif(ANDROID) + set(SRCS ${SRCS} + Src/ControllerInterface/Android/Android.cpp + Src/Android/ButtonManager.cpp) endif() add_library(inputcommon ${SRCS}) diff --git a/Source/Core/DolphinWX/Src/Android/ButtonManager.cpp b/Source/Core/InputCommon/Src/Android/ButtonManager.cpp similarity index 100% rename from Source/Core/DolphinWX/Src/Android/ButtonManager.cpp rename to Source/Core/InputCommon/Src/Android/ButtonManager.cpp diff --git a/Source/Core/DolphinWX/Src/Android/ButtonManager.h b/Source/Core/InputCommon/Src/Android/ButtonManager.h similarity index 100% rename from Source/Core/DolphinWX/Src/Android/ButtonManager.h rename to Source/Core/InputCommon/Src/Android/ButtonManager.h diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp new file mode 100644 index 0000000000..2d01d38f23 --- /dev/null +++ b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Android.h" + +namespace ciface +{ + +namespace Android +{ + +void Init( std::vector& devices ) +{ + devices.push_back(new Touchscreen()); +} + +// Touchscreens and stuff +std::string Touchscreen::GetName() const +{ + return "Touchscreen"; +} + +std::string Touchscreen::GetSource() const +{ + return "Android"; +} + +int Touchscreen::GetId() const +{ + return 0; +} +Touchscreen::Touchscreen() +{ + AddInput(new Button(ButtonManager::BUTTON_A)); + AddInput(new Button(ButtonManager::BUTTON_B)); + AddInput(new Button(ButtonManager::BUTTON_START)); +} +// Buttons and stuff + +std::string Touchscreen::Button::GetName() const +{ + std::ostringstream ss; + ss << "Button " << (int)m_index; + return ss.str(); +} + +ControlState Touchscreen::Button::GetState() const +{ + return ButtonManager::GetButtonPressed(m_index); +} + +} +} diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h new file mode 100644 index 0000000000..9bdb52a61d --- /dev/null +++ b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h @@ -0,0 +1,57 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _CIFACE_ANDROID_H_ +#define _CIFACE_ANDROID_H_ + +#include "../ControllerInterface.h" +#include "Android/ButtonManager.h" + +namespace ciface +{ +namespace Android +{ + +void Init( std::vector& devices ); +class Touchscreen : public ControllerInterface::Device +{ +private: + class Button : public Input + { + public: + std::string GetName() const; + Button(ButtonManager::ButtonType index) : m_index(index) {} + ControlState GetState() const; + private: + const ButtonManager::ButtonType m_index; + }; + +public: + bool UpdateInput() { return true; } + bool UpdateOutput() { return true; } + + Touchscreen(); + ~Touchscreen() {} + + std::string GetName() const; + int GetId() const; + std::string GetSource() const; +}; + +} +} + +#endif diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp index 8e96231674..dccd622519 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp @@ -15,6 +15,9 @@ #ifdef CIFACE_USE_SDL #include "SDL/SDL.h" #endif +#ifdef CIFACE_USE_ANDROID + #include "Android/Android.h" +#endif #include "Thread.h" @@ -50,6 +53,9 @@ void ControllerInterface::Initialize() #ifdef CIFACE_USE_SDL ciface::SDL::Init(m_devices); #endif +#ifdef CIFACE_USE_ANDROID + ciface::Android::Init(m_devices); +#endif m_is_init = true; } @@ -100,6 +106,9 @@ void ControllerInterface::Shutdown() // TODO: there seems to be some sort of memory leak with SDL, quit isn't freeing everything up SDL_Quit(); #endif +#ifdef CIFACE_USE_ANDROID + // nothing needed +#endif m_is_init = false; } diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h index b846bb56e8..59bc49ac51 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h @@ -29,7 +29,10 @@ #if defined(__APPLE__) #define CIFACE_USE_OSX #endif - +#ifdef ANDROID + #define CIFACE_USE_ANDROID +#endif + // idk in case i wanted to change it to double or somethin, idk what's best typedef float ControlState;