ffi-vjoy 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/ffi-vjoy.rb +154 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cfa984abe4cbbe629ba0ab18e63689db99f96471cd6b76e29030dfb8b41cc585
|
4
|
+
data.tar.gz: fd02fc8fe3c4d8c6df04556491ba2a5e080725816cf5c0899cc90998fd1af452
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6c778964eb6800984ee949abc4a6168f9f58b5bd78d3fd9f455dfcef3759617e5ccfaa83b543c2f4c605d4d04ab27e1014c5377c6f5c49c09ba54a3afb39baef
|
7
|
+
data.tar.gz: 593d084c9cb269e07ef200e01f7489700694e8847492958fed3af87aa12a15bdf02073718998bad047d48b99333f985d5a4692f720b6055f4fb102fdcb7ae4d3
|
data/lib/ffi-vjoy.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
require "ffi"
|
2
|
+
|
3
|
+
module FFI::VJoy
|
4
|
+
|
5
|
+
extend FFI::Library
|
6
|
+
ffi_lib "vJoyInterface"
|
7
|
+
|
8
|
+
attach_function :vJoyEnabled, [], :bool
|
9
|
+
attach_function :GetVJDStatus, [:uint], :int
|
10
|
+
attach_function :AcquireVJD, [:uint], :bool
|
11
|
+
attach_function :RelinquishVJD, [:uint], :bool
|
12
|
+
attach_function :ResetVJD, [:uint], :bool
|
13
|
+
attach_function :ResetAll, [], :void
|
14
|
+
attach_function :SetAxis, [:long, :uint, :uint], :bool
|
15
|
+
attach_function :SetBtn, [:bool, :uint, :uchar], :bool
|
16
|
+
attach_function :SetDiscPov, [:int, :uint, :uchar], :bool
|
17
|
+
attach_function :SetContPov, [:ulong, :uint, :uchar], :bool
|
18
|
+
|
19
|
+
VJD_STAT_OWN = 0x00
|
20
|
+
VJD_STAT_FREE = 0x01
|
21
|
+
VJD_STAT_BUSY = 0x02
|
22
|
+
VJD_STAT_MISS = 0x03
|
23
|
+
VJD_STAT_UNKN = 0x04
|
24
|
+
|
25
|
+
HID_USAGE_X = 0x30
|
26
|
+
HID_USAGE_Y = 0x31
|
27
|
+
HID_USAGE_Z = 0x32
|
28
|
+
HID_USAGE_RX = 0x33
|
29
|
+
HID_USAGE_RY = 0x34
|
30
|
+
HID_USAGE_RZ = 0x35
|
31
|
+
HID_USAGE_SL0 = 0x36
|
32
|
+
HID_USAGE_SL1 = 0x37
|
33
|
+
HID_USAGE_WHL = 0x38
|
34
|
+
HID_USAGE_POV = 0x39
|
35
|
+
|
36
|
+
AXIS_MAP = {:x => HID_USAGE_X,
|
37
|
+
:y => HID_USAGE_Y,
|
38
|
+
:z => HID_USAGE_Z,
|
39
|
+
:rx => HID_USAGE_RX,
|
40
|
+
:ry => HID_USAGE_RY,
|
41
|
+
:rz => HID_USAGE_RZ,
|
42
|
+
:s0 => HID_USAGE_SL0,
|
43
|
+
:s1 => HID_USAGE_SL1,
|
44
|
+
:whl => HID_USAGE_WHL,
|
45
|
+
:pov => HID_USAGE_POV}
|
46
|
+
|
47
|
+
DISC_POV_MAP = {:neutral => -1,
|
48
|
+
:up => 0,
|
49
|
+
:right => 1,
|
50
|
+
:down => 2,
|
51
|
+
:left => 3}
|
52
|
+
|
53
|
+
CONT_POV_MAP = {:neutral => -1,
|
54
|
+
:up => 0,
|
55
|
+
:upright => 0.125,
|
56
|
+
:right => 0.25,
|
57
|
+
:downright => 0.375,
|
58
|
+
:down => 0.5,
|
59
|
+
:downleft => 0.625,
|
60
|
+
:left => 0.75,
|
61
|
+
:upleft => 0.875}
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
class VJoy
|
66
|
+
|
67
|
+
include FFI::VJoy
|
68
|
+
extend FFI::VJoy
|
69
|
+
|
70
|
+
attr_reader :id
|
71
|
+
|
72
|
+
def initialize(id)
|
73
|
+
raise("Could not acquire vJoy ##{id}.") unless AcquireVJD(id)
|
74
|
+
|
75
|
+
@id = id
|
76
|
+
@button_state = []
|
77
|
+
@axis_state = {}
|
78
|
+
@disc_pov_state = []
|
79
|
+
@cont_pov_state = []
|
80
|
+
end
|
81
|
+
|
82
|
+
def button(button, value)
|
83
|
+
return true if @button_state[button] == value
|
84
|
+
@button_state[button] = value
|
85
|
+
|
86
|
+
SetBtn(value, @id, button)
|
87
|
+
end
|
88
|
+
|
89
|
+
def axis(axis, value)
|
90
|
+
axis = AXIS_MAP[axis] || axis
|
91
|
+
raise("Invalid axis type \"#{axis}\".") unless axis.is_a?(Numeric)
|
92
|
+
|
93
|
+
value = 1.0 if value > 1.0
|
94
|
+
value = -1.0 if value < -1.0
|
95
|
+
value = (value * 0x4000 + 0x4000).to_i
|
96
|
+
|
97
|
+
return true if @axis_state[axis] == value
|
98
|
+
@axis_state[axis] = value
|
99
|
+
|
100
|
+
SetAxis(value, @id, axis)
|
101
|
+
end
|
102
|
+
|
103
|
+
def disc_pov(pov, value)
|
104
|
+
value = DISC_POV_MAP[value] || value
|
105
|
+
raise("Invalid POV value \"#{value}\".") unless value.is_a?(Numeric)
|
106
|
+
|
107
|
+
return true if @disc_pov_state[pov] == value
|
108
|
+
@disc_pov_state[pov] = value
|
109
|
+
|
110
|
+
SetDiscPov(value, @id, pov)
|
111
|
+
end
|
112
|
+
|
113
|
+
def cont_pov(pov, value)
|
114
|
+
value = CONT_POV_MAP[value] || value
|
115
|
+
raise("Invalid POV value \"#{value}\".") unless value.is_a?(Numeric)
|
116
|
+
|
117
|
+
value = -1 if value < 0
|
118
|
+
value = (value * 36000.0 % 36000.0).to_i if value >= 0
|
119
|
+
|
120
|
+
return true if @cont_pov_state[pov] == value
|
121
|
+
@cont_pov_state[pov] = value
|
122
|
+
|
123
|
+
SetContPov(value, @id, pov)
|
124
|
+
end
|
125
|
+
|
126
|
+
def reset
|
127
|
+
ResetVJD(@id)
|
128
|
+
AXIS_MAP.each { | symbol, id | axis(id, 0) }
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.reset
|
132
|
+
ResetAll()
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.acquire(id)
|
136
|
+
AcquireVJD(id)
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.status(id)
|
140
|
+
case GetVJDStatus(id)
|
141
|
+
when VJD_STAT_OWN
|
142
|
+
return :own
|
143
|
+
when VJD_STAT_FREE
|
144
|
+
return :free
|
145
|
+
when VJD_STAT_BUSY
|
146
|
+
return :busy
|
147
|
+
when VJD_STAT_MISS
|
148
|
+
return :missing
|
149
|
+
else
|
150
|
+
return :unknown
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ffi-vjoy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Allison Bailey
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-07 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: allison@isans.net
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/ffi-vjoy.rb
|
20
|
+
homepage: https://github.com/Miyuki333/ffi-vjoy
|
21
|
+
licenses:
|
22
|
+
- MIT
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirements: []
|
39
|
+
rubyforge_project:
|
40
|
+
rubygems_version: 2.7.6
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: An FFI wrapper for the vJoy virtual controller software.
|
44
|
+
test_files: []
|