summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2022-10-23 07:13:48 -0400
committerDavid Thompson <dthompson2@worcester.edu>2022-10-23 07:13:48 -0400
commit34ec6b54f26445ff4a5d0740d477a06f55521f53 (patch)
tree340a320f41017142ec7b9f47aa93ff8fbb393acd
parentcbea03938464578e58cc465ba4f89cd33a054224 (diff)
Add beginnings of sensor API bindings.
Not adding anything to manual at this time because the bindings aren't really usable yet.
-rw-r--r--Makefile.am3
-rw-r--r--sdl2/bindings.scm62
-rw-r--r--sdl2/input/sensor.scm127
3 files changed, 191 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am
index 6d435ea..2e6e48b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -56,7 +56,8 @@ SOURCES = \
sdl2/input/joystick.scm \
sdl2/input/game-controller.scm \
sdl2/input/mouse.scm \
- sdl2/input/text.scm
+ sdl2/input/text.scm \
+ sdl2/input/sensor.scm
if HAVE_SDL2_IMAGE
diff --git a/sdl2/bindings.scm b/sdl2/bindings.scm
index 480cf71..02988ad 100644
--- a/sdl2/bindings.scm
+++ b/sdl2/bindings.scm
@@ -1065,6 +1065,68 @@ RETURN-TYPE and accept arguments of ARG-TYPES."
;;;
+;;; Sensors
+;;;
+
+(define-public SDL_SENSOR_INVALID -1)
+(define-public SDL_SENSOR_UNKNOWN 0)
+(define-public SDL_SENSOR_ACCEL 1)
+(define-public SDL_SENSOR_GYRO 2)
+(define-public SDL_SENSOR_ACCEL_L 3)
+(define-public SDL_SENSOR_GYRO_L 4)
+(define-public SDL_SENSOR_ACCEL_R 5)
+(define-public SDL_SENSOR_GYRO_R 6)
+
+(define-public SDL_STANDARD_GRAVITY 9.80665)
+
+(define-foreign sdl-num-sensors
+ int "SDL_NumSensors" '())
+
+(define-foreign sdl-sensor-get-device-name
+ '* "SDL_SensorGetDeviceName" (list int))
+
+(define-foreign sdl-sensor-get-device-type
+ int "SDL_SensorGetDeviceType" (list int))
+
+(define-foreign sdl-sensor-get-device-non-portable-type
+ int "SDL_SensorGetDeviceNonPortableType" (list int))
+
+(define-foreign sdl-sensor-get-device-instance-id
+ int "SDL_SensorGetDeviceInstanceID" (list int))
+
+(define-foreign sdl-sensor-open
+ '* "SDL_SensorOpen" (list int))
+
+(define-foreign sdl-sensor-from-instance-id
+ '* "SDL_SensorFromInstanceID" (list int))
+
+(define-foreign sdl-sensor-get-name
+ '* "SDL_SensorGetName" '(*))
+
+(define-foreign sdl-sensor-get-type
+ int "SDL_SensorGetType" '(*))
+
+(define-foreign sdl-sensor-get-non-portable-type
+ int "SDL_SensorGetNonPortableType" '(*))
+
+(define-foreign sdl-sensor-get-instance-id
+ int "SDL_SensorGetInstanceID" '(*))
+
+(define-foreign sdl-sensor-get-data
+ int "SDL_SensorGetData" (list '* '* int))
+
+;; Only available in very recent versions of SDL2.
+;; (define-foreign sdl-sensor-get-data-with-timestamp
+;; int "SDL_SensorGetDataWithTimestamp" (list '* uint64 '* int))
+
+(define-foreign sdl-sensor-close
+ void "SDL_SensorClose" '(*))
+
+(define-foreign sdl-sensor-update
+ void "SDL_SensorUpdate" '())
+
+
+;;;
;;; Timer
;;;
diff --git a/sdl2/input/sensor.scm b/sdl2/input/sensor.scm
new file mode 100644
index 0000000..3b1a1be
--- /dev/null
+++ b/sdl2/input/sensor.scm
@@ -0,0 +1,127 @@
+;;; guile-sdl2 --- FFI bindings for SDL2
+;;; Copyright © 2022 David Thompson <davet@gnu.org>
+;;;
+;;; This file is part of guile-sdl2.
+;;;
+;;; Guile-sdl2 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.
+;;;
+;;; Guile-sdl2 is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with guile-sdl2. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Accelerometer/gyroscope input.
+;;
+;;; Code:
+
+(define-module (sdl2 input sensor)
+ #:use-module (sdl2)
+ #:use-module ((sdl2 bindings) #:prefix ffi:)
+ #:use-module (system foreign)
+ #:export (instance-id->sensor
+ num-sensors
+ open-sensor
+ sensor-close
+ sensor-device-instance-id
+ sensor-device-name
+ sensor-device-non-portable-type
+ sensor-device-type
+ sensor-instance-id
+ sensor-name
+ sensor-non-portable-type
+ sensor-type
+ update-sensors))
+
+(define-wrapped-pointer-type <sensor>
+ sensor?
+ wrap-sensor unwrap-sensor
+ (lambda (sensor port)
+ (format port "#<sensor ~a>"
+ (sensor-name sensor))))
+
+(define (num-sensors)
+ (ffi:sdl-num-sensors))
+
+(define (sensor-device-name device-index)
+ "Return the name of the sensor at DEVICE-INDEX, or #f if there is no
+sensor with that index."
+ (let ((ptr (ffi:sdl-sensor-get-device-name device-index)))
+ (if (null-pointer? ptr)
+ #f
+ (pointer->string ptr))))
+
+(define (type-enum->symbol type)
+ (cond
+ ((= type ffi:SDL_SENSOR_INVALID) #f)
+ ((= type ffi:SDL_SENSOR_UNKNOWN) 'unknown)
+ ((= type ffi:SDL_SENSOR_ACCEL) 'accelerometer)
+ ((= type ffi:SDL_SENSOR_GYRO) 'gyroscope)
+ ((= type ffi:SDL_SENSOR_ACCEL_L) 'accelerometer-left)
+ ((= type ffi:SDL_SENSOR_GYRO_L) 'gyroscope-left)
+ ((= type ffi:SDL_SENSOR_ACCEL_R) 'accelerometer-right)
+ ((= type ffi:SDL_SENSOR_GYRO_R) 'gyroscope-right)))
+
+(define (sensor-device-type device-index)
+ "Return the type of the sensor at DEVICE-INDEX, or #f if there is no
+sensor with that index."
+ (type-enum->symbol (ffi:sdl-sensor-get-device-type device-index)))
+
+(define (sensor-device-non-portable-type device-index)
+ "Return the non-portable device type of the sensor at DEVICE-INDEX, or
+#f if there is no sensor with that index."
+ (let ((type (ffi:sdl-sensor-get-device-non-portable-type device-index)))
+ (if (= type -1) #f type)))
+
+(define (sensor-device-instance-id device-index)
+ "Return the instance ID of the sensor at DEVICE-INDEX, or #f if there
+is no sensor with that index."
+ (let ((id (ffi:sdl-sensor-get-device-instance-id device-index)))
+ (if (= id -1) #f id)))
+
+(define (open-sensor device-index)
+ "Return a sensor object for the sensor at DEVICE-INDEX."
+ (let ((ptr (ffi:sdl-sensor-open device-index)))
+ (if (null-pointer? ptr)
+ (sdl-error "open-sensor" "failed to open sensor")
+ (wrap-sensor ptr))))
+
+(define (instance-id->sensor instance-id)
+ "Return the sensor object associated with INSTANCE-ID."
+ (let ((ptr (ffi:sdl-sensor-from-instance-id instance-id)))
+ (if (null-pointer? ptr)
+ (sdl-error "instance-id->sensor" "failed to get sensor")
+ (wrap-sensor ptr))))
+
+(define (sensor-name sensor)
+ "Return the name of SENSOR."
+ (pointer->string (ffi:sdl-sensor-get-name (unwrap-sensor sensor))))
+
+(define (sensor-type sensor)
+ "Return the type of SENSOR."
+ (type-enum->symbol (ffi:sdl-sensor-get-type (unwrap-sensor sensor))))
+
+(define (sensor-non-portable-type sensor)
+ "Return the type of SENSOR."
+ (let ((type (ffi:sdl-sensor-get-non-portable-type (unwrap-sensor sensor))))
+ (if (= type -1) #f type)))
+
+(define (sensor-instance-id sensor)
+ "Return the instance ID of SENSOR."
+ (ffi:sdl-sensor-get-instance-id (unwrap-sensor sensor)))
+
+(define (sensor-close sensor)
+ "Close SENSOR."
+ (ffi:sdl-sensor-close (unwrap-sensor sensor)))
+
+(define (update-sensors)
+ "Update the current state of the open sensors."
+ (ffi:sdl-sensor-update))