aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/joystick.cpp69
-rw-r--r--src/opcodes.cpp87
2 files changed, 156 insertions, 0 deletions
diff --git a/src/joystick.cpp b/src/joystick.cpp
new file mode 100644
index 0000000..1b40650
--- /dev/null
+++ b/src/joystick.cpp
@@ -0,0 +1,69 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Copyright Drew Noakes 2013-2016
+
+#include "joystick.hpp"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <iostream>
+#include <string>
+#include <sstream>
+#include "unistd.h"
+
+
+
+void Joystick::init(int joystickNumber) {
+ std::stringstream sstm;
+ sstm << "/dev/input/js" << joystickNumber;
+ openPath(sstm.str(), false);
+}
+
+void Joystick::openPath(std::string devicePath, bool blocking)
+{
+ // Open the device using either blocking or non-blocking
+ _fd = open(devicePath.c_str(), blocking ? O_RDONLY : O_RDONLY | O_NONBLOCK);
+}
+
+bool Joystick::sample(JoystickEvent* event)
+{
+ int bytes = read(_fd, event, sizeof(*event));
+
+ if (bytes == -1)
+ return false;
+
+ // NOTE if this condition is not met, we're probably out of sync and this
+ // Joystick instance is likely unusable
+ return bytes == sizeof(*event);
+}
+
+bool Joystick::isFound()
+{
+ return _fd >= 0;
+}
+
+Joystick::~Joystick()
+{
+ close(_fd);
+}
+
+std::ostream& operator<<(std::ostream& os, const JoystickEvent& e)
+{
+ os << "type=" << static_cast<int>(e.type)
+ << " number=" << static_cast<int>(e.number)
+ << " value=" << static_cast<int>(e.value);
+ return os;
+}
+
+
diff --git a/src/opcodes.cpp b/src/opcodes.cpp
new file mode 100644
index 0000000..d3e3c9b
--- /dev/null
+++ b/src/opcodes.cpp
@@ -0,0 +1,87 @@
+/*
+ opcodes.cpp
+ Copyright (C) 2021 Richard Knight
+
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include <plugin.h>
+#include "linux/joystick.h"
+#include "joystick.hpp"
+
+struct jstick : csnd::Plugin<2, 1> {
+ static constexpr char const *otypes = "k[]k[]";
+ static constexpr char const *itypes = "i";
+ Joystick js;
+ MYFLT* saxis;
+ MYFLT* sbuttons;
+
+ int init() {
+ csound->plugin_deinit(this);
+ csnd::Vector<MYFLT> &axis = outargs.vector_data<MYFLT>(0);
+ csnd::Vector<MYFLT> &buttons = outargs.vector_data<MYFLT>(1);
+
+ saxis = (MYFLT*) csound->calloc(4*sizeof(MYFLT));
+ sbuttons = (MYFLT*) csound->calloc(12*sizeof(MYFLT));
+
+ axis.init(csound, 4);
+ buttons.init(csound, 12);
+ js.init((int)inargs[0]);
+ if (!js.isFound()) {
+ return csound->init_error("cannot open joypad");
+ }
+ return OK;
+ }
+
+
+ int deinit() {
+ delete js;
+ return OK;
+ }
+
+ int kperf() {
+ csnd::Vector<MYFLT> &axis = outargs.vector_data<MYFLT>(0);
+ csnd::Vector<MYFLT> &buttons = outargs.vector_data<MYFLT>(1);
+ axis.init(csound, 4);
+ buttons.init(csound, 12);
+ JoystickEvent event;
+ bool isAxis;
+ int type;
+ MYFLT val;
+ while (js.sample(&event)) {
+ isAxis = event.isAxis();
+ type = event.number;
+ val = event.value;
+ }
+ if (isAxis) {
+ saxis[type] = FL(((32767.0)+val)/65534);
+ } else {
+ sbuttons[type] = val;
+ }
+ memcpy(axis.data_array(), saxis, sizeof(MYFLT)*4);
+ memcpy(buttons.data_array(), sbuttons, sizeof(MYFLT)*12);
+
+ return OK;
+ }
+};
+
+
+#include <modload.h>
+
+void csnd::on_load(csnd::Csound *csound) {
+ csnd::plugin<jstick>(csound, "jstick", csnd::thread::ik);
+}