mirror of
https://github.com/kr15h/ofxPiMapper.git
synced 2026-06-16 12:31:49 +02:00
Remove example_gamepad as SDL is not so friendly with openFrameworks
This commit is contained in:
@@ -1,7 +0,0 @@
|
||||
obj
|
||||
*.xcworkspace
|
||||
*.xcuserdatad
|
||||
*~
|
||||
bin/*.app
|
||||
bin/example-gamepad
|
||||
bin/libs
|
||||
@@ -1,13 +0,0 @@
|
||||
# Attempt to load a config.make file.
|
||||
# If none is found, project defaults in config.project.make will be used.
|
||||
ifneq ($(wildcard config.make),)
|
||||
include config.make
|
||||
endif
|
||||
|
||||
# make sure the the OF_ROOT location is defined
|
||||
ifndef OF_ROOT
|
||||
OF_ROOT=$(realpath ../../..)
|
||||
endif
|
||||
|
||||
# call the project makefile!
|
||||
include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk
|
||||
@@ -1,17 +0,0 @@
|
||||
//THE PATH TO THE ROOT OF OUR OF PATH RELATIVE TO THIS PROJECT.
|
||||
//THIS NEEDS TO BE DEFINED BEFORE CoreOF.xcconfig IS INCLUDED
|
||||
OF_PATH = ../../..
|
||||
|
||||
//THIS HAS ALL THE HEADER AND LIBS FOR OF CORE
|
||||
#include "../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig"
|
||||
|
||||
//ICONS - NEW IN 0072
|
||||
ICON_NAME_DEBUG = icon-debug.icns
|
||||
ICON_NAME_RELEASE = icon.icns
|
||||
ICON_FILE_PATH = $(OF_PATH)/libs/openFrameworksCompiled/project/osx/
|
||||
|
||||
//IF YOU WANT AN APP TO HAVE A CUSTOM ICON - PUT THEM IN YOUR DATA FOLDER AND CHANGE ICON_FILE_PATH to:
|
||||
//ICON_FILE_PATH = bin/data/
|
||||
|
||||
OTHER_LDFLAGS = $(OF_CORE_LIBS) $(OF_CORE_FRAMEWORKS)
|
||||
HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS)
|
||||
@@ -1,36 +0,0 @@
|
||||
# Gamepad Example
|
||||
|
||||
This example demonstrates how to use SDL2 with ofxPiMapper in order to use gamepad for mapping. Below is what you have to do.
|
||||
|
||||
## Install SDL2
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get -y install libsdl2-dev
|
||||
```
|
||||
|
||||
In order to compile the example, one has to add extra compiler flags (see `config.make`).
|
||||
|
||||
```
|
||||
PROJECT_LDFLAGS += -I/usr/include/SDL2 -lSDL2
|
||||
```
|
||||
|
||||
What it does is the following: `-I/usr/include/SDL2` includes SDL2, `-lSDL2` links our program against it.
|
||||
|
||||
**Note:** This is tested on Raspberry Pi so far.
|
||||
|
||||
## Define Game Controller
|
||||
|
||||
On each system a speciffic controller will have a different GUID. When `example_gamepad` is launched, it reads connected USB game controllers.
|
||||
|
||||
```
|
||||
Joystick INIT success
|
||||
Joystick num axes: 2
|
||||
Joystick ID: 0
|
||||
Joystick Name: usb gamepad
|
||||
Joystick GUID: 030000001008000001e5000010010000
|
||||
```
|
||||
|
||||
Use this to add another config block in `controllers.xml`
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
ofxGui
|
||||
ofxPiMapper
|
||||
ofxXmlSettings
|
||||
ofxOMXPlayer
|
||||
@@ -1,3 +0,0 @@
|
||||
ofxGui
|
||||
ofxPiMapper
|
||||
ofxXmlSettings
|
||||
@@ -1,71 +0,0 @@
|
||||
<controllers>
|
||||
|
||||
<controller>
|
||||
<name>Wireless Controller</name>
|
||||
<guid_osx>4c05000000000000c405000000000000</guid_osx>
|
||||
<guid_linux>030000004c050000c405000011010000</guid_linux>
|
||||
<guid_windows></guid_windows>
|
||||
<left>h0:8</left>
|
||||
<right>h0:2</right>
|
||||
<up>h0:1</up>
|
||||
<down>h0:4</down>
|
||||
<a>b1</a>
|
||||
<b>b2</b>
|
||||
<x>b0</x>
|
||||
<y>b3</y>
|
||||
<select>b12</select>
|
||||
<start>b13</start>
|
||||
</controller>
|
||||
|
||||
<controller>
|
||||
<name>USB gamepad</name>
|
||||
<guid_osx>1f0800000000000001e4000000000000</guid_osx>
|
||||
<guid_linux>030000001f08000001e4000010010000</guid_linux>
|
||||
<guid_windows></guid_windows>
|
||||
<left>a0</left>
|
||||
<right>a0</right>
|
||||
<up>a1</up>
|
||||
<down>a1</down>
|
||||
<a>b2</a>
|
||||
<b>b1</b>
|
||||
<x>b3</x>
|
||||
<y>b0</y>
|
||||
<select>b8</select>
|
||||
<start>b9</start>
|
||||
</controller>
|
||||
|
||||
<controller>
|
||||
<name>Generic USB Joystick</name>
|
||||
<guid_osx>79000000000000000600000000000000</guid_osx>
|
||||
<guid_linux>03000000790000000600000010010000</guid_linux>
|
||||
<guid_windows></guid_windows>
|
||||
<left>a0</left>
|
||||
<right>a0</right>
|
||||
<up>a1</up>
|
||||
<down>a1</down>
|
||||
<a>b2</a>
|
||||
<b>b1</b>
|
||||
<x>b3</x>
|
||||
<y>b0</y>
|
||||
<select>b8</select>
|
||||
<start>b9</start>
|
||||
</controller>
|
||||
|
||||
<controller>
|
||||
<name>Exlene USB Game Controller</name>
|
||||
<guid_osx></guid_osx>
|
||||
<guid_linux>030000001008000001e5000010010000</guid_linux>
|
||||
<guid_windows></guid_windows>
|
||||
<left>a0</left>
|
||||
<right>a0</right>
|
||||
<up>a1</up>
|
||||
<down>a1</down>
|
||||
<a>b2</a>
|
||||
<b>b1</b>
|
||||
<x>b3</x>
|
||||
<y>b0</y>
|
||||
<select>b8</select>
|
||||
<start>b9</start>
|
||||
</controller>
|
||||
|
||||
</controllers>
|
||||
@@ -1,81 +0,0 @@
|
||||
<surfaces>
|
||||
<surface type="0">
|
||||
<vertices>
|
||||
<vertex>
|
||||
<x>400.000000000</x>
|
||||
<y>21.000000000</y>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<x>744.000000000</x>
|
||||
<y>353.000000000</y>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<x>51.000000000</x>
|
||||
<y>425.000000000</y>
|
||||
</vertex>
|
||||
</vertices>
|
||||
<texCoords>
|
||||
<texCoord>
|
||||
<x>0.500000000</x>
|
||||
<y>0.000000000</y>
|
||||
</texCoord>
|
||||
<texCoord>
|
||||
<x>1.000000000</x>
|
||||
<y>1.000000000</y>
|
||||
</texCoord>
|
||||
<texCoord>
|
||||
<x>0.000000000</x>
|
||||
<y>1.000000000</y>
|
||||
</texCoord>
|
||||
</texCoords>
|
||||
<source>
|
||||
<source-type>video</source-type>
|
||||
<source-name>BEAMMM (loop)-HD.mp4</source-name>
|
||||
</source>
|
||||
</surface>
|
||||
<surface type="1">
|
||||
<vertices>
|
||||
<vertex>
|
||||
<x>243.000000000</x>
|
||||
<y>149.000000000</y>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<x>687.040527344</x>
|
||||
<y>189.606384277</y>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<x>692.000000000</x>
|
||||
<y>397.000000000</y>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<x>212.000000000</x>
|
||||
<y>425.000000000</y>
|
||||
</vertex>
|
||||
</vertices>
|
||||
<texCoords>
|
||||
<texCoord>
|
||||
<x>0.000000000</x>
|
||||
<y>0.000000000</y>
|
||||
</texCoord>
|
||||
<texCoord>
|
||||
<x>1.000000000</x>
|
||||
<y>0.000000000</y>
|
||||
</texCoord>
|
||||
<texCoord>
|
||||
<x>1.000000000</x>
|
||||
<y>1.000000000</y>
|
||||
</texCoord>
|
||||
<texCoord>
|
||||
<x>0.000000000</x>
|
||||
<y>1.000000000</y>
|
||||
</texCoord>
|
||||
</texCoords>
|
||||
<source>
|
||||
<source-type>image</source-type>
|
||||
<source-name>clipartist-net-WSPOD7-clipart.png</source-name>
|
||||
</source>
|
||||
<properties>
|
||||
<perspectiveWarping>1</perspectiveWarping>
|
||||
</properties>
|
||||
</surface>
|
||||
</surfaces>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 181 KiB |
Binary file not shown.
@@ -1 +0,0 @@
|
||||
PROJECT_LDFLAGS += -I/usr/include/SDL2 -lSDL2
|
||||
File diff suppressed because it is too large
Load Diff
-81
@@ -1,81 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0720"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2"
|
||||
BuildableName = "example_gamepad.app"
|
||||
BlueprintName = "example_gamepad"
|
||||
ReferencedContainer = "container:example_gamepad.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2"
|
||||
BuildableName = "example_gamepad.app"
|
||||
BlueprintName = "example_gamepad"
|
||||
ReferencedContainer = "container:example_gamepad.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Debug"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2"
|
||||
BuildableName = "example_gamepad.app"
|
||||
BlueprintName = "example_gamepad"
|
||||
ReferencedContainer = "container:example_gamepad.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Debug"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
-81
@@ -1,81 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0720"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2"
|
||||
BuildableName = "example_gamepad.app"
|
||||
BlueprintName = "example_gamepad"
|
||||
ReferencedContainer = "container:example_gamepad.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Release"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Release"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2"
|
||||
BuildableName = "example_gamepad.app"
|
||||
BlueprintName = "example_gamepad"
|
||||
ReferencedContainer = "container:example_gamepad.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2"
|
||||
BuildableName = "example_gamepad.app"
|
||||
BlueprintName = "example_gamepad"
|
||||
ReferencedContainer = "container:example_gamepad.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Release">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${ICON}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>cc.openFrameworks.ofapp</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,282 +0,0 @@
|
||||
#include "InputHandler.h"
|
||||
|
||||
InputHandler * InputHandler::_instance = 0;
|
||||
|
||||
InputHandler * InputHandler::instance(){
|
||||
if(_instance == 0){
|
||||
_instance = new InputHandler();
|
||||
}
|
||||
return _instance;
|
||||
}
|
||||
|
||||
void InputHandler::initialise(){
|
||||
|
||||
if(SDL_Init(SDL_INIT_JOYSTICK) >= 0){
|
||||
std::cout << "Joystick INIT success" << std::endl;
|
||||
}
|
||||
|
||||
if(SDL_NumJoysticks() > 0){
|
||||
for(int i = 0; i < SDL_NumJoysticks(); ++i){
|
||||
SDL_Joystick * joystick = SDL_JoystickOpen(i);
|
||||
if(SDL_JoystickGetAttached(joystick) == SDL_TRUE){
|
||||
std::cout << "Joystick num axes: " << SDL_JoystickNumAxes(joystick) << std::endl;
|
||||
std::cout << "Joystick ID: " << SDL_JoystickInstanceID(joystick) << std::endl;
|
||||
std::cout << "Joystick Name: " << SDL_JoystickName(joystick) << std::endl;
|
||||
|
||||
SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(i);
|
||||
char guid_str[1024];
|
||||
SDL_JoystickGetGUIDString(guid, guid_str, sizeof(guid_str));
|
||||
std::cout << "Joystick GUID: " << guid_str << std::endl;
|
||||
|
||||
_joysticks.push_back(joystick);
|
||||
}else{
|
||||
std::cout << SDL_GetError() << std::endl;
|
||||
}
|
||||
}
|
||||
SDL_JoystickEventState(SDL_ENABLE);
|
||||
_initialised = true;
|
||||
std::cout << "Initialised " << _joysticks.size() << " joysticks" << std::endl;
|
||||
}else{
|
||||
_initialised = false;
|
||||
std::cout << "No joysticks initialised" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// Load the controllers.xml file if exists.
|
||||
if(ofFile::doesFileExist("controllers.xml")){
|
||||
ofxXmlSettings xml;
|
||||
if(!xml.load("controllers.xml")){
|
||||
std::cout << "Failed to load controllers.xml" << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "Loaded controllers.xml" << std::endl;
|
||||
|
||||
// Find the right map for each initialized controller
|
||||
for(auto i = 0; i < _joysticks.size(); ++i){
|
||||
|
||||
// Get controller GUID first
|
||||
SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(i);
|
||||
char guid_str[1024];
|
||||
SDL_JoystickGetGUIDString(guid, guid_str, sizeof(guid_str));
|
||||
std::string guidString(guid_str);
|
||||
|
||||
// Search for GUID in XML
|
||||
if(xml.tagExists("controllers")){
|
||||
xml.pushTag("controllers");
|
||||
|
||||
for(int ci = 0; ci < xml.getNumTags("controller"); ci++){
|
||||
if(xml.tagExists("controller", ci)){
|
||||
xml.pushTag("controller", ci);
|
||||
|
||||
if(xml.getValue("guid_osx", "") == guidString ||
|
||||
xml.getValue("guid_linux", "") == guidString ||
|
||||
xml.getValue("guid_windows", "") == guidString){
|
||||
|
||||
std::cout << "Found map for GUID: " << guidString << std::endl;
|
||||
|
||||
// We found our controller for the initialized joystick, let's map it
|
||||
std::map<ControllerCommand, ControllerItem> map;
|
||||
map[COMMAND_LEFT] = getControllerItem(xml.getValue("left", ""));
|
||||
map[COMMAND_RIGHT] = getControllerItem(xml.getValue("right", ""));
|
||||
map[COMMAND_UP] = getControllerItem(xml.getValue("up", ""));
|
||||
map[COMMAND_DOWN] = getControllerItem(xml.getValue("down", ""));
|
||||
map[COMMAND_A] = getControllerItem(xml.getValue("a", ""));
|
||||
map[COMMAND_B] = getControllerItem(xml.getValue("b", ""));
|
||||
map[COMMAND_X] = getControllerItem(xml.getValue("x", ""));
|
||||
map[COMMAND_Y] = getControllerItem(xml.getValue("y", ""));
|
||||
map[COMMAND_SELECT] = getControllerItem(xml.getValue("select", ""));
|
||||
map[COMMAND_START] = getControllerItem(xml.getValue("start", ""));
|
||||
|
||||
// Add map to our database for a controller only if it is found
|
||||
_controllerMap[i] = map;
|
||||
|
||||
// Return the xml oblect to the state before the for loop
|
||||
xml.popTag(); // controller[ci]
|
||||
|
||||
// Break the for loop as we found what we wanted
|
||||
break;
|
||||
}
|
||||
|
||||
// Return the xml oblect to the state before the for loop
|
||||
xml.popTag(); // controller[ci]
|
||||
}
|
||||
}
|
||||
xml.popTag(); // controllers
|
||||
} // if(xml.tagExists("controllers"))
|
||||
} // ofFile::doesFileExist("controllers.xml")
|
||||
}else{
|
||||
std::cout << "controllers.xml does not exist" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void InputHandler::update(){
|
||||
SDL_Event event;
|
||||
while(SDL_PollEvent(&event)){
|
||||
|
||||
ControllerCommand command = ControllerCommand::COMMAND_NONE;
|
||||
|
||||
if(event.type == SDL_JOYHATMOTION){
|
||||
std::cout << "SDL_JOYHATMOTION" << std::endl;
|
||||
|
||||
ControllerItem item;
|
||||
item.type = CONTROLLER_HAT;
|
||||
item.index = (int)event.jhat.hat;
|
||||
item.value = (int)event.jhat.value;
|
||||
|
||||
command = getControllerCommand((int)event.jhat.which, item);
|
||||
std::cout << "hat value: " << item.value << std::endl;
|
||||
std::cout << "command: " << controllerCommandToString(command) << std::endl;
|
||||
std::cout << "----------" << std::endl;
|
||||
}
|
||||
|
||||
if(event.type == SDL_JOYAXISMOTION){
|
||||
if((event.jaxis.value < -3200) || (event.jaxis.value > 3200)){
|
||||
std::cout << "SDL_JOYAXISMOTION" << std::endl;
|
||||
|
||||
ControllerItem item;
|
||||
item.type = CONTROLLER_AXIS;
|
||||
item.index = (int)event.jaxis.axis;
|
||||
item.value = (int)event.jaxis.value;
|
||||
|
||||
command = getControllerCommand((int)event.jaxis.which, item);
|
||||
std::cout << "command: " << controllerCommandToString(command) << std::endl;
|
||||
std::cout << "----------" << std::endl;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(event.type == SDL_JOYBUTTONDOWN){
|
||||
std::cout << "SDL_JOYBUTTONDOWN" << std::endl;
|
||||
|
||||
ControllerItem item;
|
||||
item.type = CONTROLLER_BUTTON;
|
||||
item.index = (int)event.jbutton.button;
|
||||
item.value = 1; // Button has only one value
|
||||
|
||||
command = getControllerCommand((int)event.jbutton.which, item);
|
||||
std::cout << "command: " << controllerCommandToString(command) << std::endl;
|
||||
std::cout << "----------" << std::endl;
|
||||
}
|
||||
|
||||
if(command != ControllerCommand::COMMAND_NONE){
|
||||
ofSendMessage(ofMessage(ofToString(command)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InputHandler::clean(){
|
||||
if(_initialised){
|
||||
for(int i = 0; i < _joysticks.size(); ++i){
|
||||
SDL_JoystickClose(_joysticks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool InputHandler::initialised(){
|
||||
return _initialised;
|
||||
}
|
||||
|
||||
ControllerItem InputHandler::getControllerItem(std::string code){
|
||||
ControllerItem item;
|
||||
|
||||
// Determine type
|
||||
if(code.substr(0, 1) == "b"){
|
||||
item.type = CONTROLLER_BUTTON;
|
||||
}else if(code.substr(0, 1) == "h"){
|
||||
item.type = CONTROLLER_HAT;
|
||||
}else if(code.substr(0, 1) == "a"){
|
||||
item.type = CONTROLLER_AXIS;
|
||||
}
|
||||
|
||||
// If it is a hat, we need a value, otherwise set it to -1
|
||||
if(item.type == CONTROLLER_HAT){
|
||||
item.index = ofToInt(code.substr(1, 1));
|
||||
item.value = ofToInt(code.substr(3));
|
||||
}else{
|
||||
item.index = ofToInt(code.substr(1));
|
||||
item.value = -1;
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
ControllerCommand InputHandler::getControllerCommand(int controllerIndex, ControllerItem & item){
|
||||
std::cout << "controllerIndex: " << controllerIndex << std::endl;
|
||||
|
||||
std::map<int, std::map<ControllerCommand, ControllerItem>>::iterator it;
|
||||
it = _controllerMap.find(controllerIndex);
|
||||
if(it == _controllerMap.end()){
|
||||
return ControllerCommand::COMMAND_NONE;
|
||||
}
|
||||
|
||||
std::map<ControllerCommand, ControllerItem>::iterator mit;
|
||||
for(mit = it->second.begin(); mit != it->second.end(); mit++){
|
||||
if(mit->second.type == item.type && mit->second.index == item.index){
|
||||
|
||||
// In case of axes, we need to check the sign
|
||||
if(mit->second.type == CONTROLLER_AXIS){
|
||||
if(mit->first == ControllerCommand::COMMAND_LEFT && item.value > 0){
|
||||
continue; // value must be negative for left
|
||||
}
|
||||
|
||||
if(mit->first == ControllerCommand::COMMAND_RIGHT && item.value < 0){
|
||||
continue; // value must be positive for right
|
||||
}
|
||||
|
||||
if(mit->first == ControllerCommand::COMMAND_UP && item.value > 0){
|
||||
continue; // value must be negative for up
|
||||
}
|
||||
|
||||
if(mit->first == ControllerCommand::COMMAND_DOWN && item.value < 0){
|
||||
continue; // value must be positive for down
|
||||
}
|
||||
|
||||
return mit->first;
|
||||
}
|
||||
|
||||
// In case of hat, we need to compare hat values
|
||||
if(mit->second.type == CONTROLLER_HAT){
|
||||
if(mit->second.value == item.value){
|
||||
return mit->first;
|
||||
}else{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// In case of buttons type and index is enough
|
||||
return mit->first;
|
||||
}
|
||||
}
|
||||
|
||||
return ControllerCommand::COMMAND_NONE;
|
||||
}
|
||||
|
||||
std::string InputHandler::controllerCommandToString(ControllerCommand com){
|
||||
if(com == COMMAND_NONE){
|
||||
return "COMMAND_NONE";
|
||||
}else if(com == COMMAND_LEFT){
|
||||
return "COMMAND_LEFT";
|
||||
}else if(com == COMMAND_RIGHT){
|
||||
return "COMMAND_RIGHT";
|
||||
}else if(com == COMMAND_UP){
|
||||
return "COMMAND_UP";
|
||||
}else if(com == COMMAND_DOWN){
|
||||
return "COMMAND_DOWN";
|
||||
}else if(com == COMMAND_A){
|
||||
return "COMMAND_A";
|
||||
}else if(com == COMMAND_B){
|
||||
return "COMMAND_B";
|
||||
}else if(com == COMMAND_X){
|
||||
return "COMMAND_X";
|
||||
}else if(com == COMMAND_Y){
|
||||
return "COMMAND_Y";
|
||||
}else if(com == COMMAND_SELECT){
|
||||
return "COMMAND_SELECT";
|
||||
}else if(com == COMMAND_START){
|
||||
return "COMMAND_START";
|
||||
}
|
||||
|
||||
return "COMMAND_NONE";
|
||||
}
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
// These are the std::strings reported by SDL2's SDL_JoystickGetGUIDString:
|
||||
// https://wiki.libsdl.org/SDL_JoystickGetGUIDString
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
#include "ofMain.h"
|
||||
#include "ofxXmlSettings.h"
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
enum ControllerItemType{
|
||||
CONTROLLER_BUTTON,
|
||||
CONTROLLER_AXIS,
|
||||
CONTROLLER_HAT
|
||||
};
|
||||
|
||||
enum ControllerCommand{
|
||||
COMMAND_NONE,
|
||||
COMMAND_LEFT,
|
||||
COMMAND_RIGHT,
|
||||
COMMAND_UP,
|
||||
COMMAND_DOWN,
|
||||
COMMAND_A,
|
||||
COMMAND_B,
|
||||
COMMAND_X,
|
||||
COMMAND_Y,
|
||||
COMMAND_SELECT,
|
||||
COMMAND_START
|
||||
};
|
||||
|
||||
struct ControllerItem{
|
||||
ControllerItemType type;
|
||||
int index;
|
||||
int value;
|
||||
};
|
||||
|
||||
class InputHandler{
|
||||
public:
|
||||
static InputHandler * instance();
|
||||
|
||||
void initialise();
|
||||
void update();
|
||||
void clean();
|
||||
|
||||
bool initialised();
|
||||
|
||||
ControllerItem getControllerItem(std::string code);
|
||||
ControllerCommand getControllerCommand(int controllerIndex, ControllerItem & item);
|
||||
std::string controllerCommandToString(ControllerCommand com);
|
||||
|
||||
private:
|
||||
InputHandler(){}
|
||||
~InputHandler(){}
|
||||
static InputHandler * _instance;
|
||||
bool _initialised;
|
||||
std::vector<SDL_Joystick *> _joysticks;
|
||||
std::map<int, std::map<ControllerCommand, ControllerItem>> _controllerMap;
|
||||
};
|
||||
@@ -1,24 +0,0 @@
|
||||
#include "ofMain.h"
|
||||
#include "ofApp.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
int main(int argc, char * argv[]){
|
||||
bool fullscreen = false;
|
||||
|
||||
std::vector<std::string> arguments = std::vector<std::string>(argv, argv + argc);
|
||||
for(int i = 0; i < arguments.size(); ++i){
|
||||
if(arguments.at(i) == "-f"){
|
||||
fullscreen = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(fullscreen){
|
||||
ofSetupOpenGL(800, 450, OF_FULLSCREEN);
|
||||
}else{
|
||||
ofSetupOpenGL(800, 450, OF_WINDOW);
|
||||
}
|
||||
|
||||
ofRunApp(new ofApp());
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
#include "ofApp.h"
|
||||
|
||||
void ofApp::setup(){
|
||||
ofBackground(0);
|
||||
|
||||
#ifdef TARGET_RASPBERRY_PI
|
||||
ofSetFullscreen(true);
|
||||
#endif
|
||||
|
||||
mapper.setup();
|
||||
InputHandler::instance()->initialise();
|
||||
}
|
||||
|
||||
void ofApp::update(){
|
||||
mapper.update();
|
||||
InputHandler::instance()->update();
|
||||
}
|
||||
|
||||
void ofApp::draw(){
|
||||
mapper.draw();
|
||||
}
|
||||
|
||||
void ofApp::keyPressed(int key){
|
||||
mapper.keyPressed(key);
|
||||
}
|
||||
|
||||
void ofApp::keyReleased(int key){
|
||||
mapper.keyReleased(key);
|
||||
}
|
||||
|
||||
void ofApp::mousePressed(int x, int y, int button){
|
||||
mapper.mousePressed(x, y, button);
|
||||
}
|
||||
|
||||
void ofApp::mouseDragged(int x, int y, int button){
|
||||
mapper.mouseDragged(x, y, button);
|
||||
}
|
||||
|
||||
void ofApp::mouseReleased(int x, int y, int button){
|
||||
mapper.mouseReleased(x, y, button);
|
||||
}
|
||||
|
||||
void ofApp::messageReceived(ofMessage & message){
|
||||
ControllerCommand com = (ControllerCommand)ofToInt(message.message);
|
||||
handleController(com);
|
||||
}
|
||||
|
||||
/* These values we take into consideration
|
||||
|
||||
↖ ↑ ↗ y
|
||||
← → -- x b
|
||||
↙ ↓ ↘ a
|
||||
|
||||
*/
|
||||
void ofApp::handleController(ControllerCommand com){
|
||||
if(com == ControllerCommand::COMMAND_LEFT){
|
||||
mapper.moveSelection(ofx::piMapper::Vec3(-5.0f, 0.0f, 0.0f));
|
||||
}else if(com == ControllerCommand::COMMAND_RIGHT){
|
||||
mapper.moveSelection(ofx::piMapper::Vec3(5.0f, 0.0f, 0.0f));
|
||||
}else if(com == ControllerCommand::COMMAND_UP){
|
||||
mapper.moveSelection(ofx::piMapper::Vec3(0.0f, -5.0f, 0.0f));
|
||||
}else if(com == ControllerCommand::COMMAND_DOWN){
|
||||
mapper.moveSelection(ofx::piMapper::Vec3(0.0f, 5.0f, 0.0f));
|
||||
}else if(com == ControllerCommand::COMMAND_A){
|
||||
if(mapper.getMode() == ofx::piMapper::Mode::MAPPING_MODE){
|
||||
mapper.selectNextVertex();
|
||||
}else if(mapper.getMode() == ofx::piMapper::Mode::TEXTURE_MODE){
|
||||
mapper.selectNextTexCoord();
|
||||
}else{
|
||||
mapper.setMode(ofx::piMapper::Mode::MAPPING_MODE);
|
||||
}
|
||||
}else if(com == ControllerCommand::COMMAND_B){
|
||||
if(mapper.getMode() == ofx::piMapper::Mode::MAPPING_MODE){
|
||||
mapper.selectNextSurface();
|
||||
}else{
|
||||
mapper.setMode(ofx::piMapper::Mode::MAPPING_MODE);
|
||||
}
|
||||
}else if(com == ControllerCommand::COMMAND_X){
|
||||
if(mapper.getMode() == ofx::piMapper::Mode::MAPPING_MODE){
|
||||
mapper.setNextSource();
|
||||
}else{
|
||||
mapper.setMode(ofx::piMapper::Mode::MAPPING_MODE);
|
||||
}
|
||||
}else if(com == ControllerCommand::COMMAND_Y){
|
||||
if(mapper.getMode() == ofx::piMapper::Mode::MAPPING_MODE){
|
||||
mapper.setMode(ofx::piMapper::Mode::TEXTURE_MODE);
|
||||
}else if(mapper.getMode() == ofx::piMapper::Mode::TEXTURE_MODE){
|
||||
mapper.setMode(ofx::piMapper::Mode::MAPPING_MODE);
|
||||
}else{
|
||||
mapper.setMode(ofx::piMapper::Mode::MAPPING_MODE);
|
||||
}
|
||||
}else if(com == ControllerCommand::COMMAND_SELECT){
|
||||
mapper.togglePause();
|
||||
}else if(com == ControllerCommand::COMMAND_START){
|
||||
mapper.saveProject();
|
||||
mapper.setMode(ofx::piMapper::Mode::PRESENTATION_MODE);
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "ofMain.h"
|
||||
#include "ofxPiMapper.h"
|
||||
#include "InputHandler.h"
|
||||
#include "Vec3.h"
|
||||
|
||||
class ofApp : public ofBaseApp {
|
||||
public:
|
||||
void setup();
|
||||
void update();
|
||||
void draw();
|
||||
|
||||
void keyPressed(int key);
|
||||
void keyReleased(int key);
|
||||
|
||||
void mousePressed(int x, int y, int button);
|
||||
void mouseDragged(int x, int y, int button);
|
||||
void mouseReleased(int x, int y, int button);
|
||||
|
||||
void messageReceived(ofMessage & message);
|
||||
|
||||
void handleController(ControllerCommand com);
|
||||
|
||||
ofxPiMapper mapper;
|
||||
};
|
||||
Reference in New Issue
Block a user