diff --git a/Source/Android/.idea/workspace.xml b/Source/Android/.idea/workspace.xml index 2a518c17f3..dee70dcfd4 100644 --- a/Source/Android/.idea/workspace.xml +++ b/Source/Android/.idea/workspace.xml @@ -29,7 +29,7 @@ - + @@ -103,65 +103,42 @@ - + - - - - - - - - - - + - + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -173,6 +150,11 @@ + + @@ -184,22 +166,22 @@ @@ -253,6 +235,7 @@ + @@ -288,18 +271,13 @@ - @@ -341,23 +319,26 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -386,6 +367,19 @@ + + + - - - @@ -640,125 +621,106 @@ - - - - - - - - - - + - - - - + - - - + - - - + - - - + - + - + - - - - - - - - - - - - - - - - - + - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Android/AndroidManifest.xml b/Source/Android/AndroidManifest.xml index 3b4d735b37..802f2f6cf6 100644 --- a/Source/Android/AndroidManifest.xml +++ b/Source/Android/AndroidManifest.xml @@ -35,6 +35,11 @@ android:label="@string/app_name" android:configChanges="orientation|locale|keyboard|keyboardHidden|navigation|fontScale|uiMode" > + + diff --git a/Source/Android/assets/GCPadNew.ini b/Source/Android/assets/GCPadNew.ini index cb828f9960..3c22ed5a2e 100644 --- a/Source/Android/assets/GCPadNew.ini +++ b/Source/Android/assets/GCPadNew.ini @@ -2,28 +2,28 @@ Device = Android/0/Touchscreen Buttons/A = Button 0 Buttons/B = Button 1 -Buttons/X = C -Buttons/Y = S -Buttons/Z = D +Buttons/X = Button 3 +Buttons/Y = Button 4 +Buttons/Z = Button 5 Buttons/Start = Button 2 -Main Stick/Up = Up -Main Stick/Down = Down -Main Stick/Left = Left -Main Stick/Right = Right +Main Stick/Up = Axis 10 +Main Stick/Down = Axis 11 +Main Stick/Left = Axis 12 +Main Stick/Right = Axis 13 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/Up = Axis 14 +C-Stick/Down = Axis 15 +C-Stick/Left = Axis 16 +C-Stick/Right = Axis 17 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 +Triggers/L = Axis 18 +Triggers/R = Axis 19 +D-Pad/Up = Button 6 +D-Pad/Down = Button 7 +D-Pad/Left = Button 8 +D-Pad/Right = Button 9 [GCPad2] [GCPad3] [GCPad4] diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java index bee3e5fcca..d8432b7e22 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java @@ -7,10 +7,13 @@ import android.os.Bundle; import android.os.Environment; import android.util.DisplayMetrics; import android.util.Log; +import android.view.InputDevice; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.WindowManager; import java.io.*; +import java.util.List; public class DolphinEmulator extends Activity { @@ -20,19 +23,6 @@ public class DolphinEmulator extends Activity private float screenWidth; private float screenHeight; - public static native void onTouchEvent(int Action, float X, float Y); - - static - { - try - { - System.loadLibrary("dolphin-emu-nogui"); - } - catch (Exception ex) - { - Log.w("me", ex.toString()); - } - } private void CopyAsset(String asset, String output) { InputStream in = null; OutputStream out = null; @@ -49,6 +39,7 @@ public class DolphinEmulator extends Activity Log.e("tag", "Failed to copy asset file: " + asset, e); } } + private void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; @@ -62,21 +53,21 @@ public class DolphinEmulator extends Activity { super.onStop(); if (Running) - NativeGLSurfaceView.StopEmulation(); + NativeLibrary.StopEmulation(); } @Override public void onPause() { super.onPause(); if (Running) - NativeGLSurfaceView.PauseEmulation(); + NativeLibrary.PauseEmulation(); } @Override public void onResume() { super.onResume(); if (Running) - NativeGLSurfaceView.UnPauseEmulation(); + NativeLibrary.UnPauseEmulation(); } /** Called when the activity is first created. */ @@ -158,14 +149,46 @@ public class DolphinEmulator extends Activity float ScreenX = ((X / screenWidth) * 2.0f) - 1.0f; float ScreenY = ((Y / screenHeight) * -2.0f) + 1.0f; - onTouchEvent(Action, ScreenX, ScreenY); + NativeLibrary.onTouchEvent(Action, ScreenX, ScreenY); return false; } - - public boolean overrideKeys() - { - return false; - } + + // Gets button presses + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + int action = 0; + switch (event.getAction()) { + case KeyEvent.ACTION_DOWN: + action = 0; + break; + case KeyEvent.ACTION_UP: + action = 1; + break; + default: + break; + } + InputDevice input = event.getDevice(); + NativeLibrary.onGamePadEvent(input.getDescriptor(), event.getKeyCode(), action); + return true; + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) { + return super.dispatchGenericMotionEvent(event); + } + + InputDevice input = event.getDevice(); + List motions = input.getMotionRanges(); + for (int a = 0; a < motions.size(); ++a) + { + InputDevice.MotionRange range; + range = motions.get(a); + NativeLibrary.onGamePadMoveEvent(input.getDescriptor(), range.getAxis(), event.getAxisValue(range.getAxis())); + } + + return true; + } } \ No newline at end of file diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java index 87137db48d..3018300b12 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java @@ -1,33 +1,19 @@ package org.dolphinemu.dolphinemu; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.util.Log; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; public class GameListItem implements Comparable{ private String name; private String data; private String path; private Bitmap image; - public static native int[] GetBanner(String filename); - public static native String GetTitle(String filename); - static - { - try - { - System.loadLibrary("dolphin-emu-nogui"); - } - catch (Exception ex) - { - Log.w("me", ex.toString()); - } - } - + public GameListItem(Context ctx, String n,String d,String p) { name = n; @@ -36,7 +22,7 @@ public class GameListItem implements Comparable{ File file = new File(path); if (!file.isDirectory()) { - int[] Banner = GetBanner(path); + int[] Banner = NativeLibrary.GetBanner(path); if (Banner[0] == 0) { try { @@ -50,7 +36,7 @@ public class GameListItem implements Comparable{ } else image = Bitmap.createBitmap(Banner, 96, 32, Bitmap.Config.ARGB_8888); - name = GetTitle(path); + name = NativeLibrary.GetTitle(path); } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java index 314e8e0ae5..ac1329f6a9 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListView.java @@ -24,22 +24,18 @@ public class GameListView extends ListActivity { private SideMenuAdapter mAdapter; private static GameListView me; - public static native String GetConfig(String Key, String Value, String Default); - public static native void SetConfig(String Key, String Value, String Default); enum keyTypes {TYPE_STRING, TYPE_BOOL}; private void Fill() { - - this.setTitle("Game List"); Listfls = new ArrayList(); - String Directories = GetConfig("General", "GCMPathes", "0"); + String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); int intDirectories = Integer.parseInt(Directories); for (int a = 0; a < intDirectories; ++a) { - String BrowseDir = GetConfig("General", "GCMPath" + Integer.toString(a), ""); + String BrowseDir = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPath" + Integer.toString(a), ""); File currentDir = new File(BrowseDir); File[]dirs = currentDir.listFiles(); try @@ -101,11 +97,11 @@ public class GameListView extends ListActivity { { String FileName = data.getStringExtra("Select"); Toast.makeText(this, "Folder Selected: " + FileName, Toast.LENGTH_SHORT).show(); - String Directories = GetConfig("General", "GCMPathes", "0"); + String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); int intDirectories = Integer.parseInt(Directories); Directories = Integer.toString(intDirectories + 1); - SetConfig("General", "GCMPathes", Directories); - SetConfig("General", "GCMPath" + Integer.toString(intDirectories), FileName); + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPathes", Directories); + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPath" + Integer.toString(intDirectories), FileName); Fill(); } @@ -142,16 +138,19 @@ public class GameListView extends ListActivity { { case TYPE_STRING: String strPref = prefs.getString(Keys[a], ""); - SetConfig(Key, Value, strPref); + NativeLibrary.SetConfig("Dolphin.ini", Key, Value, strPref); break; case TYPE_BOOL: boolean boolPref = prefs.getBoolean(Keys[a], true); - SetConfig(Key, Value, boolPref ? "True" : "False"); + NativeLibrary.SetConfig("Dolphin.ini", Key, Value, boolPref ? "True" : "False"); break; } } break; + case 3: // Gamepad settings + /* Do Nothing */ + break; } } @@ -169,6 +168,7 @@ public class GameListView extends ListActivity { Listdir = new ArrayList(); dir.add(new SideMenuItem("Browse Folder", 0)); dir.add(new SideMenuItem("Settings", 1)); + dir.add(new SideMenuItem("Gamepad Config", 2)); ListView mList = new ListView(this); mAdapter = new SideMenuAdapter(this,R.layout.sidemenu,dir); @@ -193,6 +193,11 @@ public class GameListView extends ListActivity { Intent SettingIntent = new Intent(me, PrefsActivity.class); startActivityForResult(SettingIntent, 2); break; + case 2: + Toast.makeText(me, "Loading up settings", Toast.LENGTH_SHORT).show(); + Intent ConfigIntent = new Intent(me, InputConfigActivity.class); + startActivityForResult(ConfigIntent, 3); + break; default: break; } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigActivity.java new file mode 100644 index 0000000000..1df812b830 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigActivity.java @@ -0,0 +1,181 @@ +package org.dolphinemu.dolphinemu; + +import android.app.Activity; +import android.app.ListActivity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ListView; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class InputConfigActivity extends ListActivity { + private InputConfigAdapter adapter; + private int configPosition = 0; + boolean Configuring = false; + boolean firstEvent = true; + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + List Input = new ArrayList(); + int a = 0; + + Input.add(a++, new InputConfigItem("Draw on-screen controls", "Android-ScreenControls", "True")); + Input.add(a++, new InputConfigItem("Button A", "Android-InputA")); + Input.add(a++, new InputConfigItem("Button B", "Android-InputB")); + Input.add(a++, new InputConfigItem("Button Start", "Android-InputStart")); + Input.add(a++, new InputConfigItem("Button X", "Android-InputX")); + Input.add(a++, new InputConfigItem("Button Y", "Android-InputY")); + Input.add(a++, new InputConfigItem("Button Z", "Android-InputZ")); + Input.add(a++, new InputConfigItem("D-Pad Up", "Android-DPadUp")); + Input.add(a++, new InputConfigItem("D-Pad Down", "Android-DPadDown")); + Input.add(a++, new InputConfigItem("D-Pad Left", "Android-DPadLeft")); + Input.add(a++, new InputConfigItem("D-Pad Right", "Android-DPadRight")); + Input.add(a++, new InputConfigItem("Main Stick Up", "Android-MainUp")); + Input.add(a++, new InputConfigItem("Main Stick Down", "Android-MainDown")); + Input.add(a++, new InputConfigItem("Main Stick Left", "Android-MainLeft")); + Input.add(a++, new InputConfigItem("Main Stick Right", "Android-MainRight")); + Input.add(a++, new InputConfigItem("C Stick Up", "Android-CStickUp")); + Input.add(a++, new InputConfigItem("C Stick Down", "Android-CStickDown")); + Input.add(a++, new InputConfigItem("C Stick Left", "Android-CStickLeft")); + Input.add(a++, new InputConfigItem("C Stick Right", "Android-CStickRight")); + Input.add(a++, new InputConfigItem("Trigger L", "Android-InputL")); + Input.add(a++, new InputConfigItem("Trigger R", "Android-InputR")); + + adapter = new InputConfigAdapter(this,R.layout.folderbrowser, Input); + this.setListAdapter(adapter); + } + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + super.onListItemClick(l, v, position, id); + InputConfigItem o = adapter.getItem(position); + switch(position) + { + case 0: // On screen controls + String newBind; + if (o.getBind() == "True") + { + Toast.makeText(this, "Not Drawing on screen controls", Toast.LENGTH_SHORT).show(); + newBind = "False"; + } + else + { + Toast.makeText(this, "Drawing on screen controls", Toast.LENGTH_SHORT).show(); + newBind = "True"; + } + adapter.remove(o); + o.setBind(newBind); + adapter.insert(o, position); + break; + default: // gamepad controls + Toast.makeText(this, "Press button to configure " + o.getName(), Toast.LENGTH_SHORT).show(); + configPosition = position; + Configuring = true; + firstEvent = true; + break; + } + + } + static ArrayList m_values = new ArrayList(); + // Gets move(triggers, joystick) events + void AssignBind(String bind) + { + InputConfigItem o = adapter.getItem(configPosition); + adapter.remove(o); + o.setBind(bind); + adapter.insert(o, configPosition); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) { + return super.dispatchGenericMotionEvent(event); + } + InputDevice input = event.getDevice(); + List motions = input.getMotionRanges(); + if (Configuring) + { + if (firstEvent) + { + m_values.clear(); + for (int a = 0; a < motions.size(); ++a) + { + InputDevice.MotionRange range = motions.get(a); + m_values.add(event.getAxisValue(range.getAxis())); + } + firstEvent = false; + } + else + { + for (int a = 0; a < motions.size(); ++a) + { + InputDevice.MotionRange range; + range = motions.get(a); + if (m_values.get(a) > (event.getAxisValue(range.getAxis()) + 0.5f)) + { + AssignBind("Device '" + input.getDescriptor() + "'-Axis " + range.getAxis() + "-"); + Configuring = false; + } + else if (m_values.get(a) < (event.getAxisValue(range.getAxis()) - 0.5f)) + { + AssignBind("Device '" + input.getDescriptor() + "'-Axis " + range.getAxis() + "+"); + Configuring = false; + } + } + } + } + return true; + } + + // Gets button presses + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + Log.w("Dolphinemu", "Got Event " + event.getAction()); + switch (event.getAction()) { + case KeyEvent.ACTION_DOWN: + case KeyEvent.ACTION_UP: + if (Configuring) + { + InputDevice input = event.getDevice(); + AssignBind("Device '" + input.getDescriptor() + "'-Button " + event.getKeyCode()); + Configuring = false; + return true; + } + default: + break; + } + + return super.dispatchKeyEvent(event); + } + + @Override + public void onBackPressed() { + for (int a = 0; a < adapter.getCount(); ++a) + { + InputConfigItem o = adapter.getItem(a); + String config = o.getConfig(); + String bind = o.getBind(); + String ConfigValues[] = config.split("-"); + String Key = ConfigValues[0]; + String Value = ConfigValues[1]; + NativeLibrary.SetConfig("Dolphin.ini", Key, Value, bind); + } + Intent intent = new Intent(); + setResult(Activity.RESULT_OK, intent); + this.finish(); + super.onBackPressed(); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java new file mode 100644 index 0000000000..4430126d46 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java @@ -0,0 +1,56 @@ +package org.dolphinemu.dolphinemu; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import java.util.List; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class InputConfigAdapter extends ArrayAdapter { + private Context c; + private int id; + private List items; + + public InputConfigAdapter(Context context, int textViewResourceId, + List objects) { + super(context, textViewResourceId, objects); + c = context; + id = textViewResourceId; + items = objects; + } + + public InputConfigItem getItem(int i) + { + return items.get(i); + } + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = convertView; + if (v == null) { + LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + v = vi.inflate(id, null); + } + final InputConfigItem o = items.get(position); + if (o != null) { + TextView t1 = (TextView) v.findViewById(R.id.TextView01); + TextView t2 = (TextView) v.findViewById(R.id.TextView02); + + if(t1!=null) + t1.setText(o.getName()); + if(t2!=null) + t2.setText(o.getBind()); + } + return v; + } + + + +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java new file mode 100644 index 0000000000..7511406dc9 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java @@ -0,0 +1,56 @@ +package org.dolphinemu.dolphinemu; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class InputConfigItem implements Comparable{ + private String m_name; + private String m_Config; + private String m_bind; + + private void Init(String n, String c, String d) + { + m_name = n; + m_Config = c; + String ConfigValues[] = m_Config.split("-"); + String Key = ConfigValues[0]; + String Value = ConfigValues[1]; + m_bind = NativeLibrary.GetConfig("Dolphin.ini", Key, Value, d); + } + + public InputConfigItem(String n, String c, String d) + { + Init(n, c, d); + } + + public InputConfigItem(String n, String c) + { + Init(n, c, "None"); + } + public String getName() + { + return m_name; + } + public String getConfig() + { + return m_Config; + } + public String getBind() + { + return m_bind; + } + public void setBind(String b) + { + m_bind = b; + } + + public int compareTo(InputConfigItem o) + { + if(this.m_name != null) + return this.m_name.toLowerCase().compareTo(o.getName().toLowerCase()); + else + throw new IllegalArgumentException(); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java index 25c7ace0a0..8a8041a08b 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java @@ -1,9 +1,6 @@ package org.dolphinemu.dolphinemu; import android.content.Context; -import android.opengl.GLSurfaceView; -import android.util.Log; -import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -14,23 +11,6 @@ public class NativeGLSurfaceView extends SurfaceView { static private boolean Created = false; static private float width; static private float height; - - public static native void main(String File, Surface surf, int width, int height); - public static native void UnPauseEmulation(); - public static native void PauseEmulation(); - public static native void StopEmulation(); - - static - { - try - { - System.loadLibrary("dolphin-emu-nogui"); - } - catch (Exception ex) - { - Log.w("me", ex.toString()); - } - } public NativeGLSurfaceView(Context context) { super(context); @@ -40,7 +20,7 @@ public class NativeGLSurfaceView extends SurfaceView { { @Override public void run() { - main(FileName, getHolder().getSurface(), (int)width, (int)height); + NativeLibrary.Run(FileName, getHolder().getSurface(), (int)width, (int)height); } }; getHolder().addCallback(new SurfaceHolder.Callback() { diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java new file mode 100644 index 0000000000..52918a040a --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -0,0 +1,36 @@ +package org.dolphinemu.dolphinemu; + +import android.util.Log; +import android.view.Surface; + +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ +public class NativeLibrary { + public static native void onTouchEvent(int Action, float X, float Y); + public static native void onGamePadEvent(String Device, int Button, int Action); + public static native void onGamePadMoveEvent(String Device, int Axis, float Value); + public static native String GetConfig(String configFile, String Key, String Value, String Default); + public static native void SetConfig(String configFile, String Key, String Value, String Default); + public static native int[] GetBanner(String filename); + public static native String GetTitle(String filename); + + public static native void Run(String File, Surface surf, int width, int height); + public static native void UnPauseEmulation(); + public static native void PauseEmulation(); + public static native void StopEmulation(); + + static + { + try + { + System.loadLibrary("dolphin-emu-nogui"); + } + catch (Exception ex) + { + Log.w("me", ex.toString()); + } + } +} diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index e3f8789634..940f05d811 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -92,6 +92,7 @@ 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/DolphinWX/Src/Android/ButtonManager.cpp b/Source/Core/DolphinWX/Src/Android/ButtonManager.cpp new file mode 100644 index 0000000000..15cc371126 --- /dev/null +++ b/Source/Core/DolphinWX/Src/Android/ButtonManager.cpp @@ -0,0 +1,223 @@ +// 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 +#include "GLInterface.h" +#include "Android/TextureLoader.h" +#include "Android/ButtonManager.h" + +extern void DrawButton(GLuint tex, float *coords); + +namespace ButtonManager +{ + std::vector m_buttons; + std::map m_controllers; + // XXX: This needs to not be here so we can load the locations from file + // This will allow customizable button locations in the future + // These are the OpenGL on screen coordinates + float m_coords[][8] = { // X, Y, X, EY, EX, EY, EX, Y + {0.75f, -1.0f, 0.75f, -0.75f, 1.0f, -0.75f, 1.0f, -1.0f}, // A + {0.50f, -1.0f, 0.50f, -0.75f, 0.75f, -0.75f, 0.75f, -1.0f}, // B + {-0.10f, -1.0f, -0.10f, -0.80f, 0.10f, -0.80f, 0.10f, -1.0f}, // Start + }; + const char *configStrings[] = { "InputA", + "InputB", + "InputStart", + "InputX", + "InputY", + "InputZ", + "DPadUp", + "DPadDown", + "DPadLeft", + "DPadRight", + "MainUp", + "MainDown", + "MainLeft", + "MainRight", + "CStickUp", + "CStickDown", + "CStickLeft", + "CStickRight", + "InputL", + "InputR" }; + const int configStringNum = 20; + + void AddBind(std::string dev, sBind *bind) + { + auto it = m_controllers.find(dev); + if (it != m_controllers.end()) + { + it->second->AddBind(bind); + return; + } + m_controllers[dev] = new InputDevice(dev); + m_controllers[dev]->AddBind(bind); + } + + void Init() + { + // Initialize our touchscreen buttons + m_buttons.push_back(new Button("ButtonA.png", BUTTON_A, m_coords[0])); + m_buttons.push_back(new Button("ButtonB.png", BUTTON_B, m_coords[1])); + m_buttons.push_back(new Button("ButtonStart.png", BUTTON_START, m_coords[2])); + + // Init our controller bindings + IniFile ini; + ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string("Dolphin.ini")); + for (int a = 0; a < configStringNum; ++a) + { + BindType type; + int bindnum; + char dev[128]; + bool hasbind = false; + char modifier = 0; + std::string value; + ini.Get("Android", configStrings[a], &value, "None"); + if (value == "None") + continue; + if (std::string::npos != value.find("Axis")) + { + hasbind = true; + type = BIND_AXIS; + sscanf(value.c_str(), "Device '%[^\']'-Axis %d%c", dev, &bindnum, &modifier); + } + else if (std::string::npos != value.find("Button")) + { + hasbind = true; + type = BIND_BUTTON; + sscanf(value.c_str(), "Device '%[^\']'-Button %d", dev, &bindnum); + } + if (hasbind) + AddBind(std::string(dev), new sBind((ButtonType)a, type, bindnum, modifier == '-' ? -1.0f : 1.0f)); + } + + } + bool GetButtonPressed(ButtonType button) + { + bool pressed = false; + for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + if ((*it)->GetButtonType() == button) + pressed = (*it)->Pressed(); + + for (auto it = m_controllers.begin(); it != m_controllers.end(); ++it) + pressed |= it->second->ButtonValue(button); + + return pressed; + } + float GetAxisValue(ButtonType axis) + { + auto it = m_controllers.begin(); + if (it == m_controllers.end()) + return 0.0f; + return it->second->AxisValue(axis); + } + void TouchEvent(int action, float x, float y) + { + // Actions + // 0 is press + // 1 is let go + // 2 is move + for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + { + float *coords = (*it)->GetCoords(); + if ( x >= coords[0] && + x <= coords[4] && + y >= coords[1] && + y <= coords[3]) + { + if (action == 0) + (*it)->SetState(BUTTON_PRESSED); + if (action == 1) + (*it)->SetState(BUTTON_RELEASED); + if (action == 2) + ; // XXX: Be used later for analog stick + } + } + } + + void GamepadEvent(std::string dev, int button, int action) + { + auto it = m_controllers.find(dev); + if (it != m_controllers.end()) + { + it->second->PressEvent(button, action); + return; + } + m_controllers[dev] = new InputDevice(dev); + m_controllers[dev]->PressEvent(button, action); + } + void GamepadAxisEvent(std::string dev, int axis, float value) + { + auto it = m_controllers.find(dev); + if (it != m_controllers.end()) + { + it->second->AxisEvent(axis, value); + return; + } + m_controllers[dev] = new InputDevice(dev); + m_controllers[dev]->AxisEvent(axis, value); + } + void Shutdown() + { + for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + delete *it; + for (auto it = m_controllers.begin(); it != m_controllers.end(); ++it) + delete it->second; + } + + void DrawButtons() + { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it) + DrawButton((*it)->GetTexture(), (*it)->GetCoords()); + + glDisable(GL_BLEND); + } + + // InputDevice + void InputDevice::PressEvent(int button, int action) + { + m_buttons[button] = action == 0 ? true : false; + } + void InputDevice::AxisEvent(int axis, float value) + { + m_axises[axis] = value; + } + bool InputDevice::ButtonValue(ButtonType button) + { + auto it = m_binds.find(button); + if (it == m_binds.end()) + return false; + if (it->second->m_bindtype == BIND_BUTTON) + return m_buttons[it->second->m_bind]; + else + return AxisValue(button); + } + float InputDevice::AxisValue(ButtonType axis) + { + auto it = m_binds.find(axis); + if (it == m_binds.end()) + return 0.0f; + if (it->second->m_bindtype == BIND_BUTTON) + return ButtonValue(axis); + else + return m_axises[it->second->m_bind] * it->second->m_neg; + } + +} diff --git a/Source/Core/InputCommon/Src/Android/ButtonManager.h b/Source/Core/DolphinWX/Src/Android/ButtonManager.h similarity index 53% rename from Source/Core/InputCommon/Src/Android/ButtonManager.h rename to Source/Core/DolphinWX/Src/Android/ButtonManager.h index f21ceedd98..c312b9786a 100644 --- a/Source/Core/InputCommon/Src/Android/ButtonManager.h +++ b/Source/Core/DolphinWX/Src/Android/ButtonManager.h @@ -15,7 +15,10 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ +#pragma once + #include +#include #include "CommonPaths.h" #include "Android/TextureLoader.h" @@ -26,12 +29,34 @@ namespace ButtonManager BUTTON_A = 0, BUTTON_B, BUTTON_START, + BUTTON_X, + BUTTON_Y, + BUTTON_Z, + BUTTON_UP, + BUTTON_DOWN, + BUTTON_LEFT, + BUTTON_RIGHT, + STICK_MAIN_UP, + STICK_MAIN_DOWN, + STICK_MAIN_LEFT, + STICK_MAIN_RIGHT, + STICK_C_UP, + STICK_C_DOWN, + STICK_C_LEFT, + STICK_C_RIGHT, + TRIGGER_L, + TRIGGER_R }; enum ButtonState { BUTTON_RELEASED = 0, BUTTON_PRESSED = 1 }; + enum BindType + { + BIND_BUTTON = 0, + BIND_AXIS + }; class Button { private: @@ -47,17 +72,62 @@ namespace ButtonManager memcpy(m_coords, coords, sizeof(float) * 8); m_state = BUTTON_RELEASED; } + Button(ButtonType button) + { + m_button = button; + m_state = BUTTON_RELEASED; + } void SetState(ButtonState state) { m_state = state; } bool Pressed() { return m_state == BUTTON_PRESSED; } ButtonType GetButtonType() { return m_button; } GLuint GetTexture() { return m_tex; } float *GetCoords() { return m_coords; } - ~Button() { glDeleteTextures(1, &m_tex); } + ~Button() { if(m_tex) glDeleteTextures(1, &m_tex); } }; + + struct sBind + { + const ButtonType m_buttontype; + const BindType m_bindtype; + const int m_bind; + const float m_neg; + sBind(ButtonType buttontype, BindType bindtype, int bind, float neg) + : m_buttontype(buttontype), m_bindtype(bindtype), m_bind(bind), m_neg(neg) + {} + }; + + + class InputDevice + { + private: + std::string m_dev; + std::map m_buttons; + std::map m_axises; + std::map m_binds; + public: + InputDevice(std::string dev) + { + m_dev = dev; + } + ~InputDevice() + { + for (auto it = m_binds.begin(); it != m_binds.end(); ++it) + delete it->second; + } + void AddBind(sBind *bind) { m_binds[bind->m_buttontype] = bind; } + void PressEvent(int button, int action); + void AxisEvent(int axis, float value); + bool ButtonValue(ButtonType button); + float AxisValue(ButtonType axis); + }; + void Init(); void DrawButtons(); bool GetButtonPressed(ButtonType button); + float GetAxisValue(ButtonType axis); void TouchEvent(int action, float x, float y); + void GamepadEvent(std::string dev, int button, int action); + void GamepadAxisEvent(std::string dev, int axis, float value); void Shutdown(); } diff --git a/Source/Core/DolphinWX/Src/MainAndroid.cpp b/Source/Core/DolphinWX/Src/MainAndroid.cpp index f1297e8026..1639e3fcf0 100644 --- a/Source/Core/DolphinWX/Src/MainAndroid.cpp +++ b/Source/Core/DolphinWX/Src/MainAndroid.cpp @@ -200,26 +200,39 @@ std::string GetName(std::string filename) extern "C" { #endif -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_UnPauseEmulation(JNIEnv *env, jobject obj) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_UnPauseEmulation(JNIEnv *env, jobject obj) { PowerPC::Start(); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_PauseEmulation(JNIEnv *env, jobject obj) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulation(JNIEnv *env, jobject obj) { PowerPC::Pause(); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_StopEmulation(JNIEnv *env, jobject obj) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj) { PowerPC::Stop(); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_DolphinEmulator_onTouchEvent(JNIEnv *env, jobject obj, jint Action, jfloat X, jfloat Y) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onTouchEvent(JNIEnv *env, jobject obj, jint Action, jfloat X, jfloat Y) { ButtonManager::TouchEvent(Action, X, Y); } +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Button, jint Action) +{ + const char *Device = env->GetStringUTFChars(jDevice, NULL); + std::string strDevice = std::string(Device); + ButtonManager::GamepadEvent(strDevice, Button, Action); + env->ReleaseStringUTFChars(jDevice, Device); +} +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMoveEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Axis, jfloat Value) +{ + const char *Device = env->GetStringUTFChars(jDevice, NULL); + std::string strDevice = std::string(Device); + ButtonManager::GamepadAxisEvent(strDevice, Axis, Value); + env->ReleaseStringUTFChars(jDevice, Device); +} - -JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetBanner(JNIEnv *env, jobject obj, jstring jFile) +JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetBanner(JNIEnv *env, jobject obj, jstring jFile) { const char *File = env->GetStringUTFChars(jFile, NULL); jintArray Banner = env->NewIntArray(DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT); @@ -231,7 +244,7 @@ JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetBanne env->ReleaseStringUTFChars(jFile, File); return Banner; } -JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetTitle(JNIEnv *env, jobject obj, jstring jFile) +JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetTitle(JNIEnv *env, jobject obj, jstring jFile) { const char *File = env->GetStringUTFChars(jFile, NULL); std::string Name = GetName(File); @@ -241,41 +254,46 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetTitle(J env->ReleaseStringUTFChars(jFile, File); return env->NewStringUTF(Name.c_str()); } -JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_GameListView_GetConfig(JNIEnv *env, jobject obj, jstring jKey, jstring jValue, jstring jDefault) +JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jKey, jstring jValue, jstring jDefault) { IniFile ini; - ini.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX)); + const char *File = env->GetStringUTFChars(jFile, NULL); const char *Key = env->GetStringUTFChars(jKey, NULL); const char *Value = env->GetStringUTFChars(jValue, NULL); const char *Default = env->GetStringUTFChars(jDefault, NULL); + ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(File)); std::string value; ini.Get(Key, Value, &value, Default); - + + env->ReleaseStringUTFChars(jFile, File); env->ReleaseStringUTFChars(jKey, Key); env->ReleaseStringUTFChars(jValue, Value); env->ReleaseStringUTFChars(jDefault, Default); return env->NewStringUTF(value.c_str()); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_GameListView_SetConfig(JNIEnv *env, jobject obj, jstring jKey, jstring jValue, jstring jDefault) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jKey, jstring jValue, jstring jDefault) { IniFile ini; - ini.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX)); + const char *File = env->GetStringUTFChars(jFile, NULL); const char *Key = env->GetStringUTFChars(jKey, NULL); const char *Value = env->GetStringUTFChars(jValue, NULL); const char *Default = env->GetStringUTFChars(jDefault, NULL); - ini.Set(Key, Value, Default); - ini.Save(File::GetUserPath(F_DOLPHINCONFIG_IDX)); + ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(File)); + ini.Set(Key, Value, Default); + ini.Save(File::GetUserPath(D_CONFIG_IDX) + std::string(File)); + + env->ReleaseStringUTFChars(jFile, File); env->ReleaseStringUTFChars(jKey, Key); env->ReleaseStringUTFChars(jValue, Value); env->ReleaseStringUTFChars(jDefault, Default); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_main(JNIEnv *env, jobject obj, jstring jFile, jobject _surf, jint _width, jint _height) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jstring jFile, jobject _surf, jint _width, jint _height) { surf = ANativeWindow_fromSurface(env, _surf); g_width = (int)_width; @@ -283,7 +301,6 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_main(J // Install our callbacks OSD::AddCallback(OSD::OSD_INIT, OSDCallbacks, 0); - OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1); OSD::AddCallback(OSD::OSD_SHUTDOWN, OSDCallbacks, 2); LogManager::Init(); @@ -292,6 +309,15 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_main(J VideoBackend::ActivateBackend(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoBackend); WiimoteReal::LoadSettings(); + // Load our Android specific settings + IniFile ini; + bool onscreencontrols = true; + ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string("Dolphin.ini")); + ini.Get("Android", "ScreenControls", &onscreencontrols, true); + + if (onscreencontrols) + OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1); + const char *File = env->GetStringUTFChars(jFile, NULL); // No use running the loop when booting fails if ( BootManager::BootCore( File ) ) diff --git a/Source/Core/InputCommon/CMakeLists.txt b/Source/Core/InputCommon/CMakeLists.txt index 8fc2a344c7..f6995583ff 100644 --- a/Source/Core/InputCommon/CMakeLists.txt +++ b/Source/Core/InputCommon/CMakeLists.txt @@ -23,8 +23,7 @@ elseif(X11_FOUND) Src/ControllerInterface/Xlib/Xlib.cpp) elseif(ANDROID) set(SRCS ${SRCS} - Src/ControllerInterface/Android/Android.cpp - Src/Android/ButtonManager.cpp) + Src/ControllerInterface/Android/Android.cpp) endif() add_library(inputcommon ${SRCS}) diff --git a/Source/Core/InputCommon/Src/Android/ButtonManager.cpp b/Source/Core/InputCommon/Src/Android/ButtonManager.cpp deleted file mode 100644 index 9ae996732d..0000000000 --- a/Source/Core/InputCommon/Src/Android/ButtonManager.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// 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 -#include "GLInterface.h" -#include "Android/TextureLoader.h" -#include "Android/ButtonManager.h" - -extern void DrawButton(GLuint tex, float *coords); - -namespace ButtonManager -{ - std::vector m_buttons; - - // XXX: This needs to not be here so we can load the locations from file - // This will allow customizable button locations in the future - // These are the OpenGL on screen coordinates - float m_coords[][8] = { // X, Y, X, EY, EX, EY, EX, Y - {0.75f, -1.0f, 0.75f, -0.75f, 1.0f, -0.75f, 1.0f, -1.0f}, // A - {0.50f, -1.0f, 0.50f, -0.75f, 0.75f, -0.75f, 0.75f, -1.0f}, // B - {-0.10f, -1.0f, -0.10f, -0.80f, 0.10f, -0.80f, 0.10f, -1.0f}, // Start - }; - - void Init() - { - // Initialize our buttons - m_buttons.push_back(new Button("ButtonA.png", BUTTON_A, m_coords[0])); - m_buttons.push_back(new Button("ButtonB.png", BUTTON_B, m_coords[1])); - m_buttons.push_back(new Button("ButtonStart.png", BUTTON_START, m_coords[2])); - } - bool GetButtonPressed(ButtonType button) - { - for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) - if ((*it)->GetButtonType() == button) - return (*it)->Pressed(); - return false; - } - void TouchEvent(int action, float x, float y) - { - // Actions - // 0 is press - // 1 is let go - // 2 is move - for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) - { - float *coords = (*it)->GetCoords(); - if ( x >= coords[0] && - x <= coords[4] && - y >= coords[1] && - y <= coords[3]) - { - if (action == 0) - (*it)->SetState(BUTTON_PRESSED); - if (action == 1) - (*it)->SetState(BUTTON_RELEASED); - if (action == 2) - ; // XXX: Be used later for analog stick - } - } - } - void Shutdown() - { - for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it) - delete *it; - } - - void DrawButtons() - { - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it) - DrawButton((*it)->GetTexture(), (*it)->GetCoords()); - - glDisable(GL_BLEND); - } - -} diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp index 2d01d38f23..6469945971 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.cpp @@ -48,6 +48,20 @@ Touchscreen::Touchscreen() AddInput(new Button(ButtonManager::BUTTON_A)); AddInput(new Button(ButtonManager::BUTTON_B)); AddInput(new Button(ButtonManager::BUTTON_START)); + AddInput(new Button(ButtonManager::BUTTON_X)); + AddInput(new Button(ButtonManager::BUTTON_Y)); + AddInput(new Button(ButtonManager::BUTTON_Z)); + AddInput(new Button(ButtonManager::BUTTON_UP)); + AddInput(new Button(ButtonManager::BUTTON_DOWN)); + AddInput(new Button(ButtonManager::BUTTON_LEFT)); + AddInput(new Button(ButtonManager::BUTTON_RIGHT)); + AddAnalogInputs(new Axis(ButtonManager::STICK_MAIN_LEFT), new Axis(ButtonManager::STICK_MAIN_RIGHT)); + AddAnalogInputs(new Axis(ButtonManager::STICK_MAIN_UP), new Axis(ButtonManager::STICK_MAIN_DOWN)); + AddAnalogInputs(new Axis(ButtonManager::STICK_C_UP), new Axis(ButtonManager::STICK_C_DOWN)); + AddAnalogInputs(new Axis(ButtonManager::STICK_C_LEFT), new Axis(ButtonManager::STICK_C_RIGHT)); + AddAnalogInputs(new Axis(ButtonManager::TRIGGER_L), new Axis(ButtonManager::TRIGGER_L)); + AddAnalogInputs(new Axis(ButtonManager::TRIGGER_R), new Axis(ButtonManager::TRIGGER_R)); + } // Buttons and stuff @@ -62,6 +76,17 @@ ControlState Touchscreen::Button::GetState() const { return ButtonManager::GetButtonPressed(m_index); } +std::string Touchscreen::Axis::GetName() const +{ + std::ostringstream ss; + ss << "Axis " << (int)m_index; + return ss.str(); +} + +ControlState Touchscreen::Axis::GetState() const +{ + return ButtonManager::GetAxisValue(m_index); +} } } diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h index 9bdb52a61d..21f35165f1 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/Android/Android.h @@ -36,7 +36,16 @@ private: Button(ButtonManager::ButtonType index) : m_index(index) {} ControlState GetState() const; private: - const ButtonManager::ButtonType m_index; + const ButtonManager::ButtonType m_index; + }; + class Axis : public Input + { + public: + std::string GetName() const; + Axis(ButtonManager::ButtonType index) : m_index(index) {} + ControlState GetState() const; + private: + const ButtonManager::ButtonType m_index; }; public: