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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ffi-vjoy.rb +154 -0
  3. metadata +44 -0
@@ -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
@@ -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: []