Improve joystick calibration modes and keypad menus

This commit is contained in:
Aaron Culliney 2015-08-20 22:15:56 -07:00
parent a031a23999
commit d2b526783a
15 changed files with 377 additions and 106 deletions

View File

@ -70,8 +70,13 @@ public class Apple2JoystickCalibration implements Apple2MenuView {
Apple2Preferences.nativeSetTouchMenuEnabled(false);
mSavedTouchDevice = Apple2Preferences.CURRENT_TOUCH_DEVICE.intValue(mActivity);
Apple2Preferences.nativeSetCurrentTouchDevice(variant.ordinal());
if (variant == Apple2Preferences.TouchDeviceVariant.JOYSTICK) {
Apple2Preferences.loadAllJoystickButtons(mActivity);
} else {
Apple2Preferences.loadAllKeypadKeys(mActivity);
}
Apple2Preferences.nativeTouchJoystickBeginCalibrationMode();
Apple2Preferences.nativeTouchDeviceBeginCalibrationMode();
}
public final boolean isCalibrating() {
@ -96,9 +101,9 @@ public class Apple2JoystickCalibration implements Apple2MenuView {
}
}
Apple2Preferences.nativeTouchDeviceEndCalibrationMode();
Apple2Preferences.nativeSetTouchMenuEnabled(mTouchMenuEnabled);
Apple2Preferences.nativeSetCurrentTouchDevice(mSavedTouchDevice);
Apple2Preferences.nativeTouchJoystickEndCalibrationMode();
mActivity.popApple2View(this);
}

View File

@ -240,7 +240,7 @@ public class Apple2JoystickSettingsMenu extends Apple2AbstractMenu {
}
}
protected static class JoystickAdvanced extends Apple2AbstractMenu {
public static class JoystickAdvanced extends Apple2AbstractMenu {
private final static String TAG = "JoystickAdvanced";
@ -268,7 +268,7 @@ public class Apple2JoystickSettingsMenu extends Apple2AbstractMenu {
if (position < 0 || position >= SETTINGS.size) {
throw new ArrayIndexOutOfBoundsException();
}
return position != SETTINGS.JOYSTICK_AXIS_SENSITIVIY.ordinal();
return position == SETTINGS.JOYSTICK_AXIS_ON_LEFT.ordinal();
}
protected enum SETTINGS implements Apple2AbstractMenu.IMenuEnum {

View File

@ -12,8 +12,11 @@
package org.deadc0de.apple2ix;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
@ -26,8 +29,9 @@ public class Apple2KeypadChooser implements Apple2MenuView {
private Apple2Activity mActivity = null;
private View mSettingsView = null;
private ArrayList<Apple2MenuView> mViewStack = null;
private TextView mTextViewAxisChosenKeys = null;
private TextView mTextViewButtonsChosenKeys = null;
private TextView mCurrentChoicePrompt = null;
private String[] foo = null;
private STATE_MACHINE mChooserState = STATE_MACHINE.CHOOSE_NORTHWEST;
@ -51,12 +55,40 @@ public class Apple2KeypadChooser implements Apple2MenuView {
if (scancode == 0) {
return;
}
Log.d(TAG, "ascii:'" + asciiRepresentation(ascii) + "' scancode:" + scancode);
mChooserState.setValues(mActivity, ascii, scancode);
mChooserState = mChooserState.next();
mTextViewAxisChosenKeys.setText(getConfiguredAxisString());
mTextViewButtonsChosenKeys.setText(getConfiguredButtonsString());
String asciiStr = asciiRepresentation(ascii);
Log.d(TAG, "ascii:'" + asciiStr + "' scancode:" + scancode);
mChooserState.setValues(mActivity, ascii, scancode);
Apple2Preferences.nativeSetCurrentTouchDevice(Apple2Preferences.TouchDeviceVariant.JOYSTICK_KEYPAD.ordinal());
mCurrentChoicePrompt.setText(getNextChoiceString() + asciiStr);
switch(mChooserState) {
case CHOOSE_TAP:
mActivity.nativeOnTouch(MotionEvent.ACTION_DOWN, 1, 0, new float[]{400.f}, new float[]{400.f});
mActivity.nativeOnTouch(MotionEvent.ACTION_UP, 1, 0, new float[]{400.f}, new float[]{400.f});
break;
case CHOOSE_SWIPEDOWN:
mActivity.nativeOnTouch(MotionEvent.ACTION_DOWN, 1, 0, new float[]{400.f}, new float[]{400.f});
mActivity.nativeOnTouch(MotionEvent.ACTION_MOVE, 1, 0, new float[]{400.f}, new float[]{600.f});
mActivity.nativeOnTouch(MotionEvent.ACTION_UP, 1, 0, new float[]{400.f}, new float[]{600.f});
break;
case CHOOSE_SWIPEUP:
mActivity.nativeOnTouch(MotionEvent.ACTION_DOWN, 1, 0, new float[]{400.f}, new float[]{400.f});
mActivity.nativeOnTouch(MotionEvent.ACTION_MOVE, 1, 0, new float[]{400.f}, new float[]{200.f});
mActivity.nativeOnTouch(MotionEvent.ACTION_UP, 1, 0, new float[]{400.f}, new float[]{200.f});
break;
default:
break;
}
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mChooserState = mChooserState.next();
mCurrentChoicePrompt.setText(getNextChoiceString());
Apple2Preferences.nativeSetCurrentTouchDevice(Apple2Preferences.TouchDeviceVariant.KEYBOARD.ordinal());
}
}, 1000);
}
public void show() {
@ -73,9 +105,9 @@ public class Apple2KeypadChooser implements Apple2MenuView {
}
}
Apple2Preferences.nativeTouchDeviceEndCalibrationMode();
Apple2Preferences.nativeSetTouchMenuEnabled(mTouchMenuEnabled);
Apple2Preferences.nativeSetCurrentTouchDevice(mSavedTouchDevice);
Apple2Preferences.nativeTouchJoystickEndCalibrationMode(); // FIXME TODO : this should set not-joystick, not-keyboard, but keypad emulation
mActivity.popApple2View(this);
}
@ -99,13 +131,8 @@ public class Apple2KeypadChooser implements Apple2MenuView {
LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mSettingsView = inflater.inflate(R.layout.activity_chooser_keypad, null, false);
// FIXME TODO: need to convert mousetext glyphs to equivalent Java/Android glyphs (or something akin to that)
mTextViewAxisChosenKeys = (TextView) mSettingsView.findViewById(R.id.textViewAxisChosenKeys);
mTextViewAxisChosenKeys.setText(getConfiguredAxisString());
mTextViewButtonsChosenKeys = (TextView) mSettingsView.findViewById(R.id.textViewButtonsChosenKeys);
mTextViewButtonsChosenKeys.setText(getConfiguredButtonsString());
mCurrentChoicePrompt = (TextView) mSettingsView.findViewById(R.id.currentChoicePrompt);
mCurrentChoicePrompt.setText(getNextChoiceString());
// temporarily undo these native touch settings while calibrating...
mTouchMenuEnabled = Apple2Preferences.TOUCH_MENU_ENABLED.booleanValue(mActivity);
@ -113,7 +140,7 @@ public class Apple2KeypadChooser implements Apple2MenuView {
mSavedTouchDevice = Apple2Preferences.CURRENT_TOUCH_DEVICE.intValue(mActivity);
Apple2Preferences.nativeSetCurrentTouchDevice(Apple2Preferences.TouchDeviceVariant.KEYBOARD.ordinal());
Apple2Preferences.nativeTouchJoystickBeginCalibrationMode(); // FIXME TODO : this should set not-joystick, not-keyboard, but keypad emulation
Apple2Preferences.nativeTouchDeviceBeginCalibrationMode();
}
private String asciiRepresentation(char ascii) {
@ -146,123 +173,139 @@ public class Apple2KeypadChooser implements Apple2MenuView {
}
}
private String getConfiguredAxisString() {
StringBuilder configuredAxes = new StringBuilder();
configuredAxes.append(mActivity.getResources().getString(R.string.keypad_chosen_axis_keys));
configuredAxes.append(" ");
configuredAxes.append(mActivity.getResources().getString(R.string.keypad_key_axis_up));
configuredAxes.append(":");
configuredAxes.append(asciiRepresentation(Apple2Preferences.KEYPAD_NORTH_KEY.asciiValue(mActivity)));
configuredAxes.append(", ");
configuredAxes.append(mActivity.getResources().getString(R.string.keypad_key_axis_left));
configuredAxes.append(":");
configuredAxes.append(asciiRepresentation(Apple2Preferences.KEYPAD_WEST_KEY.asciiValue(mActivity)));
configuredAxes.append(", ");
configuredAxes.append(mActivity.getResources().getString(R.string.keypad_key_axis_right));
configuredAxes.append(":");
configuredAxes.append(asciiRepresentation(Apple2Preferences.KEYPAD_EAST_KEY.asciiValue(mActivity)));
configuredAxes.append(", ");
configuredAxes.append(mActivity.getResources().getString(R.string.keypad_key_axis_down));
configuredAxes.append(":");
configuredAxes.append(asciiRepresentation(Apple2Preferences.KEYPAD_SOUTH_KEY.asciiValue(mActivity)));
return configuredAxes.toString();
}
private String getConfiguredButtonsString() {
StringBuilder configuredButtons = new StringBuilder();
configuredButtons.append(mActivity.getResources().getString(R.string.keypad_chosen_buttons_keys));
configuredButtons.append(" ");
configuredButtons.append(mActivity.getResources().getString(R.string.keypad_key_button_tap));
configuredButtons.append(":");
configuredButtons.append(asciiRepresentation(Apple2Preferences.KEYPAD_TAP_KEY.asciiValue(mActivity)));
configuredButtons.append(", ");
configuredButtons.append(mActivity.getResources().getString(R.string.keypad_key_button_swipeup));
configuredButtons.append(":");
configuredButtons.append(asciiRepresentation(Apple2Preferences.KEYPAD_SWIPEUP_KEY.asciiValue(mActivity)));
configuredButtons.append(", ");
configuredButtons.append(mActivity.getResources().getString(R.string.keypad_key_button_swipedown));
configuredButtons.append(":");
configuredButtons.append(asciiRepresentation(Apple2Preferences.KEYPAD_SWIPEDOWN_KEY.asciiValue(mActivity)));
return configuredButtons.toString();
private String getNextChoiceString() {
String choose = mActivity.getResources().getString(R.string.keypad_choose_current);
return choose.replace("XXX", mChooserState.getKeyName(mActivity));
}
private enum STATE_MACHINE {
CHOOSE_NORTHWEST {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_ul);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_NORTHWEST_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_NORTH {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_up);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_NORTH_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_NORTHEAST {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_ur);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_NORTHEAST_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_WEST {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_l);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_WEST_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_CENTER {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_c);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_CENTER_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_EAST {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_r);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_EAST_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_SOUTHWEST {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_dl);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_SOUTHWEST_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_SOUTH {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_dn);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_SOUTH_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_SOUTHEAST {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_axis_dr);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_SOUTHEAST_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_TAP {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_button_tap);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_TAP_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_SWIPEUP {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_button_swipeup);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_SWIPEUP_KEY.saveChosenKey(activity, ascii, scancode);
}
},
CHOOSE_SWIPEDOWN {
@Override
public String getKeyName(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_key_button_swipedown);
}
@Override
public void setValues(Apple2Activity activity, char ascii, int scancode) {
Apple2Preferences.KEYPAD_SWIPEDOWN_KEY.saveChosenKey(activity, ascii, scancode);
@ -273,6 +316,8 @@ public class Apple2KeypadChooser implements Apple2MenuView {
public abstract void setValues(Apple2Activity activity, char ascii, int scancode);
public abstract String getKeyName(Apple2Activity activity);
public STATE_MACHINE next() {
int nextOrd = this.ordinal() + 1;
if (nextOrd >= size) {

View File

@ -12,6 +12,9 @@
package org.deadc0de.apple2ix;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import java.util.ArrayList;
@ -74,11 +77,12 @@ public class Apple2KeypadSettingsMenu extends Apple2AbstractMenu {
_alertDialogHandleSelection(activity, R.string.keypad_choose_title, titles, new IPreferenceLoadSave() {
@Override
public int intValue() {
return -1;
return Apple2Preferences.KEYPAD_KEYS.intValue(activity);
}
@Override
public void saveInt(int value) {
Apple2Preferences.KEYPAD_KEYS.saveInt(activity, value);
if (value == 0) {
Apple2KeypadSettingsMenu keypadSettingsMenu = (Apple2KeypadSettingsMenu) settingsMenu;
keypadSettingsMenu.chooseKeys(activity);
@ -125,6 +129,22 @@ public class Apple2KeypadSettingsMenu extends Apple2AbstractMenu {
activity.popApple2View(apple2MenuView);
}
}
},
KEYPAD_ADVANCED {
@Override
public final String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_advanced);
}
@Override
public final String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_advanced_summary);
}
@Override
public void handleSelection(Apple2Activity activity, Apple2AbstractMenu settingsMenu, boolean isChecked) {
new Apple2KeypadSettingsMenu.KeypadAdvanced(activity).show();
}
};
public static final int size = SETTINGS.values().length;
@ -176,4 +196,108 @@ public class Apple2KeypadSettingsMenu extends Apple2AbstractMenu {
activity.popApple2View(apple2MenuView);
}
}
protected static class KeypadAdvanced extends Apple2AbstractMenu {
private final static String TAG = "KeypadAdvanced";
public KeypadAdvanced(Apple2Activity activity) {
super(activity);
}
@Override
public final String[] allTitles() {
return SETTINGS.titles(mActivity);
}
@Override
public final IMenuEnum[] allValues() {
return SETTINGS.values();
}
@Override
public final boolean areAllItemsEnabled() {
return false;
}
@Override
public final boolean isEnabled(int position) {
if (position < 0 || position >= SETTINGS.size) {
throw new ArrayIndexOutOfBoundsException();
}
return position == SETTINGS.JOYSTICK_ADVANCED.ordinal();
}
protected enum SETTINGS implements Apple2AbstractMenu.IMenuEnum {
KEYREPEAT_THRESHOLD {
@Override
public final String getTitle(Apple2Activity activity) {
return "";
}
@Override
public final String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.keypad_repeat_summary);
}
@Override
public View getView(final Apple2Activity activity, View convertView) {
return _sliderView(activity, this, Apple2Preferences.KEYREPEAT_NUM_CHOICES, new IPreferenceSlider() {
@Override
public void saveInt(int progress) {
Apple2Preferences.KEYREPEAT_THRESHOLD.saveInt(activity, progress);
}
@Override
public int intValue() {
return Apple2Preferences.KEYREPEAT_THRESHOLD.intValue(activity);
}
@Override
public void showValue(int progress, final TextView seekBarValue) {
seekBarValue.setText("" + ((float) progress / Apple2Preferences.KEYREPEAT_NUM_CHOICES));
}
});
}
},
JOYSTICK_ADVANCED {
@Override
public final String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_advanced);
}
@Override
public final String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_advanced_summary);
}
@Override
public void handleSelection(Apple2Activity activity, Apple2AbstractMenu settingsMenu, boolean isChecked) {
new Apple2JoystickSettingsMenu.JoystickAdvanced(activity).show();
}
};
public static final int size = SETTINGS.values().length;
@Override
public void handleSelection(Apple2Activity activity, Apple2AbstractMenu settingsMenu, boolean isChecked) {
/* ... */
}
@Override
public View getView(Apple2Activity activity, View convertView) {
return _basicView(activity, this, convertView);
}
public static String[] titles(Apple2Activity activity) {
String[] titles = new String[size];
int i = 0;
for (SETTINGS setting : values()) {
titles[i++] = setting.getTitle(activity);
}
return titles;
}
}
}
}

View File

@ -334,6 +334,17 @@ public enum Apple2Preferences {
return activity.getPreferences(Context.MODE_PRIVATE).getInt(toString(), JOYSTICK_DIVIDER_NUM_CHOICES >> 1);
}
},
KEYPAD_KEYS {
@Override
public void load(Apple2Activity activity) {
/* ... */
}
@Override
public int intValue(Apple2Activity activity) {
return activity.getPreferences(Context.MODE_PRIVATE).getInt(toString(), -1);
}
},
KEYPAD_NORTHWEST_KEY {
@Override
public void load(Apple2Activity activity) {
@ -405,6 +416,19 @@ public enum Apple2Preferences {
public void load(Apple2Activity activity) {
loadAllKeypadKeys(activity);
}
},
KEYREPEAT_THRESHOLD {
@Override
public void load(Apple2Activity activity) {
int tick = intValue(activity);
nativeSetTouchDeviceKeyRepeatThreshold((float) tick / KEYREPEAT_NUM_CHOICES);
}
@Override
public int intValue(Apple2Activity activity) {
int defaultLatency = KEYREPEAT_NUM_CHOICES / 4;
return activity.getPreferences(Context.MODE_PRIVATE).getInt(toString(), defaultLatency);
}
};
public enum HiresColor {
@ -617,6 +641,8 @@ public enum Apple2Preferences {
public final static int TAPDELAY_NUM_CHOICES = DECENT_AMOUNT_OF_CHOICES;
public final static float TAPDELAY_SCALE = 0.5f;
public final static int KEYREPEAT_NUM_CHOICES = DECENT_AMOUNT_OF_CHOICES;
public final static String TAG = "Apple2Preferences";
public final static int JOYSTICK_BUTTON_THRESHOLD_NUM_CHOICES = DECENT_AMOUNT_OF_CHOICES;
@ -738,7 +764,7 @@ public enum Apple2Preferences {
dialog.show();
}
protected static void loadAllKeypadKeys(Apple2Activity activity) {
public static void loadAllKeypadKeys(Apple2Activity activity) {
int[] rosetteChars = new int[]{
KEYPAD_NORTHWEST_KEY.asciiValue(activity),
KEYPAD_NORTH_KEY.asciiValue(activity),
@ -774,7 +800,7 @@ public enum Apple2Preferences {
nativeTouchJoystickSetKeypadTypes(rosetteChars, rosetteScancodes, buttonsChars, buttonsScancodes);
}
protected static void loadAllJoystickButtons(Apple2Activity activity) {
public static void loadAllJoystickButtons(Apple2Activity activity) {
nativeSetTouchJoystickButtonTypes(
JOYSTICK_TAP_BUTTON.intValue(activity),
JOYSTICK_SWIPEUP_BUTTON.intValue(activity),
@ -819,10 +845,12 @@ public enum Apple2Preferences {
public static native void nativeTouchJoystickSetAxisOnLeft(boolean axisIsOnLeft);
public static native void nativeTouchJoystickBeginCalibrationMode();
public static native void nativeTouchDeviceBeginCalibrationMode();
public static native void nativeTouchJoystickEndCalibrationMode();
public static native void nativeTouchDeviceEndCalibrationMode();
private static native void nativeTouchJoystickSetKeypadTypes(int[] rosetteChars, int[] rosetteScancodes, int[] buttonsChars, int[] buttonsScancodes);
private static native void nativeSetTouchDeviceKeyRepeatThreshold(float threshold);
}

View File

@ -14,17 +14,8 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/keypad_chosen_axis_keys"
android:id="@+id/textViewAxisChosenKeys"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/keypad_chosen_buttons_keys"
android:id="@+id/textViewButtonsChosenKeys"
android:layout_below="@id/textViewAxisChosenKeys"
android:text="@string/keypad_choose_current"
android:id="@+id/currentChoicePrompt"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

View File

@ -33,8 +33,8 @@
<string name="input_first_keyboard">Touch keyboard</string>
<string name="joystick">Joystick</string>
<string name="joystickA">Touch Joystick</string>
<string name="joystick_advanced">Advanced configuration</string>
<string name="joystick_advanced_summary">Various tuning parameters</string>
<string name="joystick_advanced">Advanced tuning</string>
<string name="joystick_advanced_summary">Various joystick/keypad configuration parameters</string>
<string name="joystick_axis_sensitivity_summary">Tune joystick axis sensitivity (decelerate or accelerate)</string>
<string name="joystick_button_axis_enable">Enable button axis</string>
<string name="joystick_button_axis_enable_summary">Enable button axis</string>
@ -44,7 +44,7 @@
<string name="joystick_button_button_none">None</string>
<string name="joystick_button_tap_button">Tap fire</string>
<string name="joystick_button_tap_button_summary">Button to fire on tap down</string>
<string name="joystick_button_tapdelay_summary">Joystick/keypad tap delay in secs</string>
<string name="joystick_button_tapdelay_summary">Joystick/keypad button tap delay in secs</string>
<string name="joystick_button_swipe_up_button">Swipe up fire</string>
<string name="joystick_button_swipe_up_button_summary">Button to fire on swipe up</string>
<string name="joystick_button_swipe_down_button">Swipe down fire</string>
@ -69,6 +69,8 @@
<string name="key_right">&#8594;</string>
<string name="key_space">[Space]</string>
<string name="key_up">&#8593;</string>
<string name="keyboard_visibility">Keyboard visibility</string>
<string name="keyboard_visibility_summary">Keyboard visibility when inactive</string>
<string name="keypad">Keypad Joystick</string>
<string name="keypadA">Touch Keypad Joystick</string>
<string name="keypad_button_tap_button">Tap key:</string>
@ -79,14 +81,19 @@
<string name="keypad_choose">Choose keypad keys…</string>
<string name="keypad_choose_summary">Choose axis and button keys</string>
<string name="keypad_choose_title">Axis &amp; buttons</string>
<string name="keypad_chosen_axis_keys">Chosen axis keys: </string>
<string name="keypad_chosen_buttons_keys">Chosen buttons keys: </string>
<string name="keypad_choose_current">Choose XXX Key: </string>
<string name="keypad_chosen_keys">I,J,K,M [Space]</string>
<string name="keypad_configure">Configure keypad joystick…</string>
<string name="keypad_configure_summary">Axis touch/tilt, buttons, etc</string>
<string name="keypad_key_axis_c">Center</string>
<string name="keypad_key_axis_dn">Down</string>
<string name="keypad_key_axis_dl">Down and Left</string>
<string name="keypad_key_axis_dr">Down and Right</string>
<string name="keypad_key_axis_l">Left</string>
<string name="keypad_key_axis_r">Right</string>
<string name="keypad_key_axis_ul">Up and Left</string>
<string name="keypad_key_axis_up">Up</string>
<string name="keypad_key_axis_down">Down</string>
<string name="keypad_key_axis_left">Left</string>
<string name="keypad_key_axis_right">Right</string>
<string name="keypad_key_axis_ur">Up and Right</string>
<string name="keypad_key_button_tap">Tap</string>
<string name="keypad_key_button_swipeup">Swipe Up</string>
<string name="keypad_key_button_swipedown">Swipe Down</string>
@ -98,6 +105,7 @@
<string name="keypad_preset_ijkm_space">I,J,K,M, tap spacebar</string>
<string name="keypad_preset_left_right_space">&#8592;,&#8594;, tap spacebar</string>
<string name="keypad_preset_wadx_space">W,A,D,X, tap spacebar</string>
<string name="keypad_repeat_summary">Key repeat threshold in secs</string>
<string name="keyboard">Keyboard</string>
<string name="keyboard_configure">Configure keyboard…</string>
<string name="keyboard_configure_summary">Transparency, fading, custom keys</string>

View File

@ -84,17 +84,20 @@ void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetCurrentTouchDevice(JN
keydriver_setTouchKeyboardOwnsScreen(false);
joydriver_setTouchJoystickOwnsScreen(true);
joydriver_setTouchVariant(EMULATED_JOYSTICK);
video_backend->animation_showTouchJoystick();
break;
case ANDROID_TOUCH_JOYSTICK_KEYPAD:
keydriver_setTouchKeyboardOwnsScreen(false);
joydriver_setTouchJoystickOwnsScreen(true);
joydriver_setTouchVariant(EMULATED_KEYPAD);
video_backend->animation_showTouchJoystick();
break;
case ANDROID_TOUCH_KEYBOARD:
keydriver_setTouchKeyboardOwnsScreen(true);
joydriver_setTouchJoystickOwnsScreen(false);
video_backend->animation_showTouchKeyboard();
break;
case ANDROID_TOUCH_NONE:
@ -222,14 +225,27 @@ void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeTouchJoystickSetKeypadTy
(*env)->ReleaseIntArrayElements(env, jButtonsScans, buttonsScans, 0);
}
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeTouchJoystickBeginCalibrationMode(JNIEnv *env, jclass cls) {
LOG("nativeTouchJoystickBeginCalibrationMode() ...");
joydriver_beginCalibration();
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeTouchDeviceBeginCalibrationMode(JNIEnv *env, jclass cls) {
LOG("nativeTouchDeviceBeginCalibrationMode() ...");
if (joydriver_ownsScreen()) {
joydriver_beginCalibration();
} else if (keydriver_ownsScreen()) {
keydriver_beginCalibration();
}
}
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeTouchJoystickEndCalibrationMode(JNIEnv *env, jclass cls) {
LOG("nativeTouchJoystickEndCalibrationMode() ...");
joydriver_endCalibration();
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeTouchDeviceEndCalibrationMode(JNIEnv *env, jclass cls) {
LOG("nativeTouchDeviceEndCalibrationMode() ...");
if (joydriver_ownsScreen()) {
joydriver_endCalibration();
} else if (keydriver_ownsScreen()) {
keydriver_endCalibration();
}
}
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetTouchDeviceKeyRepeatThreshold(JNIEnv *env, jclass cls, jfloat threshold) {
LOG("...");
joydriver_setKeyRepeatThreshold(threshold);
}
jint Java_org_deadc0de_apple2ix_Apple2Preferences_nativeGetCPUSpeed(JNIEnv *env, jclass cls) {

View File

@ -276,5 +276,6 @@ void (*joydriver_setAxisOnLeft)(bool axisIsOnLeft) = NULL;
void (*joydriver_beginCalibration)(void) = NULL;
void (*joydriver_endCalibration)(void) = NULL;
bool (*joydriver_isCalibrating)(void) = NULL;
void (*joydriver_setKeyRepeatThreshold)(float repeatThresholdSecs) = NULL;
#endif

View File

@ -121,6 +121,9 @@ extern void (*joydriver_endCalibration)(void);
// end calibration mode
extern bool (*joydriver_isCalibrating)(void);
// set key repeat threshold (keypad joystick)
extern void (*joydriver_setKeyRepeatThreshold)(float repeatThresholdSecs);
#endif // INTERFACE_TOUCH
#endif // whole file

View File

@ -495,5 +495,7 @@ void (*keydriver_setTouchKeyboardEnabled)(bool enabled) = NULL;
void (*keydriver_setTouchKeyboardOwnsScreen)(bool pwnd) = NULL;
bool (*keydriver_ownsScreen)(void) = NULL;
void (*keydriver_keyboardReadCallback)(void) = NULL;
void (*keydriver_beginCalibration)(void) = NULL;
void (*keydriver_endCalibration)(void) = NULL;
#endif

View File

@ -163,6 +163,12 @@ extern bool (*keydriver_ownsScreen)(void);
// keyboard read callback
extern void (*keydriver_keyboardReadCallback)(void);
// begin calibration mode
extern void (*keydriver_beginCalibration)(void);
// end calibration mode
extern void (*keydriver_endCalibration)(void);
#endif
#endif

View File

@ -303,8 +303,10 @@ static void gltouchjoy_setup(void) {
return;
}
clock_gettime(CLOCK_MONOTONIC, &axes.timingBegin);
clock_gettime(CLOCK_MONOTONIC, &buttons.timingBegin);
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
axes.timingBegin = now;
buttons.timingBegin = now;
joyglobals.isAvailable = true;
}
@ -628,11 +630,13 @@ static int64_t gltouchjoy_onTouchEvent(interface_touch_event_t action, int point
break;
}
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
if (axisConsumed) {
clock_gettime(CLOCK_MONOTONIC, &axes.timingBegin);
axes.timingBegin = now;
}
if (buttonConsumed) {
clock_gettime(CLOCK_MONOTONIC, &buttons.timingBegin);
buttons.timingBegin = now;
}
return TOUCH_FLAGS_HANDLED | TOUCH_FLAGS_JOY;
@ -663,8 +667,21 @@ static void _animation_showTouchJoystick(void) {
if (!joyglobals.isAvailable) {
return;
}
clock_gettime(CLOCK_MONOTONIC, &axes.timingBegin);
clock_gettime(CLOCK_MONOTONIC, &buttons.timingBegin);
int x = touchport.axisX + ((touchport.axisXMax - touchport.axisX)/2);
int y = touchport.axisY + ((touchport.axisYMax - touchport.axisY)/2);
_reset_model_position(axes.model, x, y, AXIS_OBJ_HALF_W, AXIS_OBJ_HALF_H);
axes.modelDirty = true;
x = touchport.buttonX + ((touchport.buttonXMax - touchport.buttonX)/2);
y = touchport.buttonY + ((touchport.buttonYMax - touchport.buttonY)/2);
_reset_model_position(buttons.model, x, y, BUTTON_OBJ_HALF_W, BUTTON_OBJ_HALF_H);
buttons.modelDirty = true;
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
axes.timingBegin = now;
buttons.timingBegin = now;
}
static void _animation_hideTouchJoystick(void) {
@ -751,10 +768,12 @@ static void gltouchjoy_setAxisOnLeft(bool axisIsOnLeft) {
}
static void gltouchjoy_beginCalibration(void) {
video_clear();
joyglobals.isCalibrating = true;
}
static void gltouchjoy_endCalibration(void) {
video_redraw();
joyglobals.isCalibrating = false;
}

View File

@ -58,6 +58,8 @@ static struct {
bool axisTiming;
bool buttonTiming;
float repeatThresholdNanos;
} kpad = { 0 };
static GLTouchJoyVariant kpadJoy = { 0 };
@ -77,7 +79,7 @@ static void touchkpad_keyboardReadCallback(void) {
int scancode = kpad.scancodes[kpad.fireIdx];
if (scancode >= 0) {
struct timespec deltat = timespec_diff(kpad.timingBegins[kpad.fireIdx], now, NULL);
if (deltat.tv_sec || deltat.tv_nsec > KEY_REPEAT_THRESHOLD_NANOS) {
if (deltat.tv_sec || deltat.tv_nsec > kpad.repeatThresholdNanos) {
LOG("REPEAT #%d/%lu/%lu: %d", kpad.fireIdx, deltat.tv_sec, deltat.tv_nsec, scancode);
c_keys_handle_input(scancode, /*pressed:*/true, /*ASCII:*/false);
fired = true;
@ -393,6 +395,10 @@ static void touchkpad_buttonRelease(void) {
c_keys_handle_input(kpad.scancodes[REPEAT_BUTTON], /*pressed:*/false, /*ASCII:*/false);
}
static void touchkpad_setKeyRepeatThreshold(float repeatThresholdSecs) {
kpad.repeatThresholdNanos = repeatThresholdSecs * NANOSECONDS_PER_SECOND;
}
// ----------------------------------------------------------------------------
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
@ -405,6 +411,8 @@ static void _init_gltouchjoy_kpad(void) {
kpad.currButtonDisplayChar = ' ';
kpad.repeatThresholdNanos = KEY_REPEAT_THRESHOLD_NANOS;
kpadJoy.variant = &touchkpad_variant,
kpadJoy.resetState = &touchkpad_resetState,
@ -416,6 +424,8 @@ static void _init_gltouchjoy_kpad(void) {
kpadJoy.axisMove = &touchkpad_axisMove,
kpadJoy.axisUp = &touchkpad_axisUp,
joydriver_setKeyRepeatThreshold = &touchkpad_setKeyRepeatThreshold;
gltouchjoy_registerVariant(EMULATED_KEYPAD, &kpadJoy);
}

View File

@ -48,6 +48,7 @@ HUD_CLASS(GLModelHUDKeyboard,
static bool isAvailable = false; // Were there any OpenGL/memory errors on gltouchkbd initialization?
static bool isEnabled = true; // Does player want touchkbd enabled?
static bool ownsScreen = false; // Does the touchkbd currently own the screen to the exclusion?
static bool isCalibrating = false; // Are we in calibration mode?
static bool allowLowercase = false; // show lowercase keyboard
static float minAlphaWhenOwnsScreen = 1/4.f;
static float minAlpha = 0.f;
@ -316,7 +317,7 @@ static inline int64_t _tap_key_at_point(float x, float y) {
case ICONTEXT_NONACTIONABLE:
scancode = 0;
handled = joydriver_isCalibrating()/* || keydriver_isCalibrating()*/;
handled = isCalibrating;
break;
case ICONTEXT_CTRL:
@ -398,7 +399,7 @@ static inline int64_t _tap_key_at_point(float x, float y) {
} else {
c_keys_handle_input(key, /*pressed:*/true, /*ASCII:*/true);
}
if (key == ' ' && (joydriver_isCalibrating()/* || keydriver_isCalibrating()*/)) {
if (key == ' ' && isCalibrating) {
key = ICONTEXT_SPACE_VISUAL;
}
} else if (isCTRL) {
@ -731,6 +732,16 @@ static bool gltouchkbd_ownsScreen(void) {
return ownsScreen;
}
static void gltouchkbd_beginCalibration(void) {
video_clear();
isCalibrating = true;
}
static void gltouchkbd_endCalibration(void) {
video_redraw();
isCalibrating = false;
}
static void _animation_showTouchKeyboard(void) {
if (!isAvailable) {
return;
@ -759,6 +770,8 @@ static void _init_gltouchkbd(void) {
keydriver_setTouchKeyboardEnabled = &gltouchkbd_setTouchKeyboardEnabled;
keydriver_setTouchKeyboardOwnsScreen = &gltouchkbd_setTouchKeyboardOwnsScreen;
keydriver_ownsScreen = &gltouchkbd_ownsScreen;
keydriver_beginCalibration = &gltouchkbd_beginCalibration;
keydriver_endCalibration = &gltouchkbd_endCalibration;
kbd.selectedCol = -1;
kbd.selectedRow = -1;