/
ps3.rb
201 lines (162 loc) · 5.54 KB
/
ps3.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
framework File.expand_path("PS3Controller.framework")
framework 'Cocoa'
framework 'WebKit'
class ControllerDelegate
attr_reader :controller
attr_accessor :js
def initialize
@controller = PS3SixAxis.sixAixisControllerWithDelegate(self)
end
def js_call(code)
js.evaluateWebScript(code) unless js.nil?
end
def connect
puts "Connecting to the PS3 controller"
controller.connect(true)
end
def onDeviceConnectionError(error_code)
"puts error: #{error_code}"
end
def onDeviceConnected
puts "connected!"
end
def onDeviceDisconnected
puts "Disconnected!"
end
# shape buttons
def onTriangleButton(pressed)
js_call "debug('Triangle #{pressed ? 'pressed' : 'released'}')"
js_call "triangle()" if pressed
end
def onCircleButton(pressed)
js_call "debug('Circle #{pressed ? 'pressed' : 'released'}')"
js_call "circle()" if pressed
end
def onCrossButton(pressed)
js_call "debug('Cross #{pressed ? 'pressed' : 'released'}')"
js_call "cross()" if pressed
end
def onSquareButton(pressed)
js_call "debug('Square #{pressed ? 'pressed' : 'released'}')"
js_call "square()" if pressed
end
def onL1Button(pressed)
js_call "debug('L1 #{pressed ? 'pressed' : 'released'}')"
js_call "l1()" if pressed
end
def onL2Button(pressed)
js_call "debug('L2 #{pressed ? 'pressed' : 'released'}')"
js_call "l2()" if pressed
end
def onR1Button(pressed)
js_call "debug('R1 #{pressed ? 'pressed' : 'released'}')"
js_call "r1()" if pressed
end
def onR2Button(pressed)
js_call "debug('R2 #{pressed ? 'pressed' : 'released'}')"
js_call "r2()" if pressed
end
# D-PAD
def onNorthButton(pressed)
js_call "debug('↑ #{pressed ? 'pressed' : 'released'}')"
js_call "up()" if pressed
end
def onWestButton(pressed)
js_call "debug('← #{pressed ? 'pressed' : 'released'}')"
js_call "left()" if pressed
end
def onSouthButton(pressed)
js_call "debug('↓ #{pressed ? 'pressed' : 'released'}')"
js_call "down()" if pressed
end
def onEastButton(pressed)
js_call "debug('→ #{pressed ? 'pressed' : 'released'}')"
js_call "right()" if pressed
end
# Central buttons
def onStartButton(pressed)
@controller.disconnect if pressed
exit
end
def onPSButton(pressed)
js_call "ps()" if pressed
end
# Axis
# # Purpose Note
# # accX / sin(roll) On my sixaxis, +11 is rest, +126 is 90deg left, -100 is 90deg right
# # accY / sin(pitch) On my sixaxis, -19 is rest, -117 is 90deg nose down, +114 is 90deg, controls facing you
# # accZ / gravity On my sixaxis, sat on the table is -93, upside down is 131
# #
# def onAxisX(x, Y:y, Z:z)
# js_call "orientation('Orientation: Axis x:#{x} y:#{y} z:#{z}')"
# end
def onLeftStick(axis, pressed:pressed)
js_call "leftJoystick(#{axis.x}, #{axis.y})"
js_call "leftJoystickPressed(#{pressed})"
end
def onRightStick(axis, pressed:pressed)
js_call "rightJoystick(#{axis.x}, #{axis.y})"
js_call "rightJoystickPressed(#{pressed})"
end
end
# class Animal
# attr_accessor :name, :age
# def initialize(name=nil, age=nil)
# @name = name || 'rex'
# @age = age || 1
# end
#
# def isSelectorExcludedFromWebScript(sel); false end
# end
class Browser
attr_accessor :view, :js_engine, :controller
def initialize(controller)
@animal = Animal.new
@controller = controller
@view = WebView.alloc.initWithFrame([0, 0, 520, 520])
@window = NSWindow.alloc.initWithContentRect([200, 200, 520, 520],
styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask,
backing:NSBackingStoreBuffered,
defer:false)
@window.contentView = view
# Use the screen stylesheet, rather than the print one.
view.mediaStyle = 'screen'
view.customUserAgent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10'
# Make sure we don't save any of the prefs that we change.
view.preferences.autosaves = false
# Set some useful options.
view.preferences.shouldPrintBackgrounds = true
view.preferences.javaScriptCanOpenWindowsAutomatically = false
view.preferences.allowsAnimatedImages = false
# Make sure we don't get a scroll bar.
view.mainFrame.frameView.allowsScrolling = false
view.frameLoadDelegate = self
end
def fetch
page_url = NSURL.alloc.initFileURLWithPath(File.expand_path("index.html"))
view.mainFrame.loadRequest NSURLRequest.requestWithURL(page_url)
puts "fetching"
end
def webView(view, didFinishLoadForFrame:frame)
puts "page loaded"
puts "Controller ready to draw!"
@window.display
@window.orderFrontRegardless
@js_engine = view.windowScriptObject # windowScriptObject
@controller.js = @js_engine
@js_engine.setValue(@animal, forKey: "animal")
# callWebScriptMethod:withArguments:
# setValue:turtleView forKey:@"turtle"];
end
def webView(view, didFailLoadWithError:error, forFrame:frame)
puts "Failed: #{error.localizedDescription}"
end
def webView(view, didFailProvisionalLoadWithError:error, forFrame:frame)
puts "Failed: #{error.localizedDescription}"
end
end
controller = ControllerDelegate.new
controller.connect
browser = Browser.new(controller)
browser.fetch
NSRunLoop.currentRunLoop.runUntilDate(NSDate.distantFuture)