Browse Source

Remove example_gamepad as SDL is not so friendly with openFrameworks

master
Krisjanis Rijnieks 5 years ago
parent
commit
37fbc40d86
  1. 7
      example_gamepad/.gitignore
  2. 13
      example_gamepad/Makefile
  3. 17
      example_gamepad/Project.xcconfig
  4. 36
      example_gamepad/README.md
  5. 4
      example_gamepad/addons.make
  6. 3
      example_gamepad/addons.make.norpi
  7. 71
      example_gamepad/bin/data/controllers.xml
  8. 81
      example_gamepad/bin/data/ofxpimapper.xml
  9. BIN
      example_gamepad/bin/data/sources/images/clipartist-net-WSPOD7-clipart.png
  10. BIN
      example_gamepad/bin/data/sources/videos/BEAMMM (loop)-HD.mp4
  11. 1
      example_gamepad/config.make
  12. 1311
      example_gamepad/example_gamepad.xcodeproj/project.pbxproj
  13. 81
      example_gamepad/example_gamepad.xcodeproj/xcshareddata/xcschemes/example_gamepad Debug.xcscheme
  14. 81
      example_gamepad/example_gamepad.xcodeproj/xcshareddata/xcschemes/example_gamepad Release.xcscheme
  15. 22
      example_gamepad/openFrameworks-Info.plist
  16. 282
      example_gamepad/src/InputHandler.cpp
  17. 61
      example_gamepad/src/InputHandler.h
  18. 24
      example_gamepad/src/main.cpp
  19. 98
      example_gamepad/src/ofApp.cpp
  20. 26
      example_gamepad/src/ofApp.h

7
example_gamepad/.gitignore

@ -1,7 +0,0 @@
obj
*.xcworkspace
*.xcuserdatad
*~
bin/*.app
bin/example-gamepad
bin/libs

13
example_gamepad/Makefile

@ -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

17
example_gamepad/Project.xcconfig

@ -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)

36
example_gamepad/README.md

@ -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`

4
example_gamepad/addons.make

@ -1,4 +0,0 @@
ofxGui
ofxPiMapper
ofxXmlSettings
ofxOMXPlayer

3
example_gamepad/addons.make.norpi

@ -1,3 +0,0 @@
ofxGui
ofxPiMapper
ofxXmlSettings

71
example_gamepad/bin/data/controllers.xml

@ -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>

81
example_gamepad/bin/data/ofxpimapper.xml

@ -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>

BIN
example_gamepad/bin/data/sources/images/clipartist-net-WSPOD7-clipart.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

BIN
example_gamepad/bin/data/sources/videos/BEAMMM (loop)-HD.mp4

Binary file not shown.

1
example_gamepad/config.make

@ -1 +0,0 @@
PROJECT_LDFLAGS += -I/usr/include/SDL2 -lSDL2

1311
example_gamepad/example_gamepad.xcodeproj/project.pbxproj

File diff suppressed because it is too large

81
example_gamepad/example_gamepad.xcodeproj/xcshareddata/xcschemes/example_gamepad Debug.xcscheme

@ -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
example_gamepad/example_gamepad.xcodeproj/xcshareddata/xcschemes/example_gamepad Release.xcscheme

@ -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>

22
example_gamepad/openFrameworks-Info.plist

@ -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>

282
example_gamepad/src/InputHandler.cpp

@ -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";
}

61
example_gamepad/src/InputHandler.h

@ -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;
};

24
example_gamepad/src/main.cpp

@ -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());
}

98
example_gamepad/src/ofApp.cpp

@ -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);
}
}

26
example_gamepad/src/ofApp.h

@ -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;
};
Loading…
Cancel
Save