procon_bypass_man 0.1.21 → 0.2.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +9 -0
  3. data/.github/workflows/gitleacks.yml +11 -0
  4. data/.gitignore +1 -0
  5. data/CHANGELOG.md +24 -0
  6. data/Gemfile.lock +4 -4
  7. data/README.md +4 -1
  8. data/docs/getting_started.md +70 -5
  9. data/docs/setting/left-analogstick-cap.md +1 -1
  10. data/docs/setting/splatoon2_macro_dasei_cancel.md +4 -0
  11. data/docs/setting/splatoon2_macro_sokuwari_bubble.md +4 -0
  12. data/docs/setting/splatoon2_shake_tansan.md +47 -0
  13. data/docs/setup_raspi.md +0 -1
  14. data/lib/procon_bypass_man/background/jobs/post_completed_remote_macro_job.rb +17 -0
  15. data/lib/procon_bypass_man/background.rb +1 -0
  16. data/lib/procon_bypass_man/buttons_setting_configuration/layer.rb +142 -80
  17. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +3 -1
  18. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/button.rb +28 -0
  19. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/button_list.rb +31 -0
  20. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/disable_macro_if_pressed.rb +28 -0
  21. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/flip_if_pressed.rb +31 -0
  22. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/force_neutral.rb +28 -0
  23. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/if_pressed.rb +26 -0
  24. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/if_pressed_allows_nil.rb +28 -0
  25. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer/open_macro_steps.rb +26 -0
  26. data/lib/procon_bypass_man/buttons_setting_configuration/param_normalizer.rb +17 -0
  27. data/lib/procon_bypass_man/buttons_setting_configuration.rb +5 -4
  28. data/lib/procon_bypass_man/{commands → bypass}/bypass_command.rb +36 -24
  29. data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +4 -0
  30. data/lib/procon_bypass_man/bypass.rb +43 -23
  31. data/lib/procon_bypass_man/commands/print_boot_message_command.rb +2 -3
  32. data/lib/procon_bypass_man/commands/send_error_command.rb +2 -2
  33. data/lib/procon_bypass_man/commands.rb +0 -3
  34. data/lib/procon_bypass_man/configuration.rb +29 -3
  35. data/lib/procon_bypass_man/device_connection/command.rb +28 -0
  36. data/lib/procon_bypass_man/device_connection/executor.rb +190 -0
  37. data/lib/procon_bypass_man/device_connection/output_report_generator.rb +42 -0
  38. data/lib/procon_bypass_man/device_connection/output_report_markerable.rb +28 -0
  39. data/lib/procon_bypass_man/device_connection/output_report_sub_command_table.rb +133 -0
  40. data/lib/procon_bypass_man/device_connection/output_report_watcher.rb +41 -0
  41. data/lib/procon_bypass_man/device_connection/pre_bypass.rb +67 -0
  42. data/lib/procon_bypass_man/device_connection/procon_setting_overrider.rb +78 -0
  43. data/lib/procon_bypass_man/device_connection/spoofing_output_report_watcher.rb +39 -0
  44. data/lib/procon_bypass_man/device_connection.rb +16 -0
  45. data/lib/procon_bypass_man/device_model.rb +17 -0
  46. data/lib/procon_bypass_man/io_monitor.rb +20 -1
  47. data/lib/procon_bypass_man/plugin/splatoon2/macro/charge_tansan_bomb.rb +21 -0
  48. data/lib/procon_bypass_man/plugin/splatoon2/version.rb +1 -1
  49. data/lib/procon_bypass_man/plugins.rb +1 -0
  50. data/lib/procon_bypass_man/procon/analog_stick_cap.rb +4 -23
  51. data/lib/procon_bypass_man/procon/analog_stick_manipulator.rb +36 -0
  52. data/lib/procon_bypass_man/procon/layer_changer.rb +4 -1
  53. data/lib/procon_bypass_man/procon/macro.rb +5 -2
  54. data/lib/procon_bypass_man/procon/macro_builder.rb +20 -20
  55. data/lib/procon_bypass_man/procon/macro_plugin_map.rb +23 -0
  56. data/lib/procon_bypass_man/procon/macro_registry.rb +21 -10
  57. data/lib/procon_bypass_man/procon/suppress_rumble.rb +13 -0
  58. data/lib/procon_bypass_man/procon/user_operation.rb +29 -15
  59. data/lib/procon_bypass_man/procon/value_objects/analog_stick_position.rb +18 -0
  60. data/lib/procon_bypass_man/{domains → procon/value_objects}/binary/base.rb +0 -0
  61. data/lib/procon_bypass_man/{domains → procon/value_objects}/binary/has_immutable_binary.rb +0 -0
  62. data/lib/procon_bypass_man/{domains → procon/value_objects}/binary/has_mutable_binary.rb +0 -0
  63. data/lib/procon_bypass_man/{domains → procon/value_objects}/binary/inbound_procon_binary.rb +5 -0
  64. data/lib/procon_bypass_man/{domains → procon/value_objects}/binary/processing_procon_binary.rb +6 -1
  65. data/lib/procon_bypass_man/procon/value_objects/binary.rb +11 -0
  66. data/lib/procon_bypass_man/{domains → procon/value_objects}/bypass_mode.rb +0 -0
  67. data/lib/procon_bypass_man/procon/value_objects/rumble_binary.rb +18 -0
  68. data/lib/procon_bypass_man/procon.rb +27 -5
  69. data/lib/procon_bypass_man/remote_macro/queue_over_process.rb +62 -0
  70. data/lib/procon_bypass_man/remote_macro/remote_macro_object.rb +30 -0
  71. data/lib/procon_bypass_man/remote_macro/remote_macro_receiver.rb +37 -0
  72. data/lib/procon_bypass_man/remote_macro/remote_macro_sender.rb +8 -0
  73. data/lib/procon_bypass_man/remote_macro/task.rb +6 -0
  74. data/lib/procon_bypass_man/remote_macro/task_queue.rb +13 -0
  75. data/lib/procon_bypass_man/remote_macro.rb +14 -0
  76. data/lib/procon_bypass_man/{commands → remote_pbm_action/commands}/run_remote_pbm_action_dispatch_command.rb +0 -0
  77. data/lib/procon_bypass_man/remote_pbm_action/restore_pbm_setting.rb +7 -1
  78. data/lib/procon_bypass_man/remote_pbm_action/value_objects/remote_pbm_action_object.rb +1 -1
  79. data/lib/procon_bypass_man/remote_pbm_action.rb +2 -0
  80. data/lib/procon_bypass_man/runner.rb +13 -13
  81. data/lib/procon_bypass_man/support/cycle_sleep.rb +22 -0
  82. data/lib/procon_bypass_man/support/device_mouse_finder.rb +60 -0
  83. data/lib/procon_bypass_man/{device_procon_finder.rb → support/device_procon_finder.rb} +0 -2
  84. data/lib/procon_bypass_man/support/never_exit_accidentally.rb +3 -3
  85. data/lib/procon_bypass_man/support/remote_macro_http_client.rb +9 -0
  86. data/lib/procon_bypass_man/support/safe_timeout.rb +7 -1
  87. data/lib/procon_bypass_man/{usb_device_controller.rb → support/usb_device_controller.rb} +9 -6
  88. data/lib/procon_bypass_man/support/yaml_loader.rb +12 -0
  89. data/lib/procon_bypass_man/version.rb +1 -1
  90. data/lib/procon_bypass_man/websocket/{pbm_job_client.rb → client.rb} +32 -10
  91. data/lib/procon_bypass_man.rb +69 -46
  92. data/procon_bypass_man.gemspec +1 -1
  93. data/project_template/app.rb +19 -4
  94. data/sig/main.rbs +4 -16
  95. metadata +55 -17
  96. data/lib/procon_bypass_man/commands/connect_device_command.rb +0 -18
  97. data/lib/procon_bypass_man/device_connector.rb +0 -296
  98. data/lib/procon_bypass_man/domains.rb +0 -12
@@ -1,296 +0,0 @@
1
- class ProconBypassMan::DeviceConnector
2
- class BytesMismatchError < StandardError; end
3
- class NotFoundProconError < StandardError; end
4
-
5
- class Value
6
- attr_accessor :read_from, :values
7
- def initialize(values: , read_from: )
8
- @values = values
9
- @read_from = read_from
10
- end
11
- end
12
-
13
- PROCON_PATH = "/dev/hidraw0"
14
- PROCON2_PATH = "/dev/hidraw1"
15
-
16
- def self.connect
17
- s = new(throw_error_if_timeout: true, enable_at_exit: false)
18
- s.add([
19
- ["0000"],
20
- ["0000"],
21
- ["8005"],
22
- ["0010"],
23
- ], read_from: :switch)
24
- # 1. Sends current connection status, and if the Joy-Con are connected,
25
- s.add([["8001"]], read_from: :switch)
26
- s.add([/^8101/], read_from: :procon) # <<< 81010003176d96e7a5480000000, macaddressとコントローラー番号を返す
27
- # 2. Sends handshaking packets over UART to the Joy-Con or Pro Controller Broadcom chip. This command can only be called once per session.
28
- s.add([["8002"]], read_from: :switch)
29
- s.add([/^8102/], read_from: :procon)
30
- # 3
31
- s.add([/^0100/], read_from: :switch)
32
- s.add([/^21/], read_from: :procon)
33
- # 4. Forces the Joy-Con or Pro Controller to only talk over USB HID without any timeouts. This is required for the Pro Controller to not time out and revert to Bluetooth.
34
- s.add([["8004"]], read_from: :switch)
35
- s.drain_all
36
- return [s.switch, s.procon]
37
- end
38
-
39
- def initialize(throw_error_if_timeout: false, throw_error_if_mismatch: false , enable_at_exit: true)
40
- @stack = []
41
- @initialized_devices = false
42
- @throw_error_if_timeout = throw_error_if_timeout
43
- @throw_error_if_mismatch = throw_error_if_mismatch
44
- @enable_at_exit = enable_at_exit
45
- end
46
-
47
- def add(values, read_from: )
48
- @stack << Value.new(values: values, read_from: read_from)
49
- end
50
-
51
- def drain_all
52
- debug_log_buffer = []
53
- unless @initialized_devices
54
- init_devices
55
- end
56
-
57
- while(item = @stack.shift)
58
- item.values.each do |value|
59
- data = nil
60
- timer = ProconBypassMan::SafeTimeout.new
61
- begin
62
- timer.throw_if_timeout!
63
- data = from_device(item).read_nonblock(64)
64
- debug_log_buffer << "read_from(#{item.read_from}): #{data.unpack("H*")}"
65
- rescue IO::EAGAINWaitReadable
66
- # debug_log_buffer << "read_from(#{item.read_from}): IO::EAGAINWaitReadable"
67
- retry
68
- end
69
-
70
- result =
71
- case value
72
- when String, Array
73
- value == data.unpack("H*")
74
- when Regexp
75
- value =~ data.unpack("H*").first
76
- else
77
- raise "#{value}は知りません"
78
- end
79
- if result
80
- ProconBypassMan.logger.info "OK(expected: #{value}, got: #{data.unpack("H*")})"
81
- debug_log_buffer << "OK(expected: #{value}, got: #{data.unpack("H*")})"
82
- else
83
- ProconBypassMan.logger.info "NG(expected: #{value}, got: #{data.unpack("H*")})"
84
- debug_log_buffer << "NG(expected: #{value}, got: #{data.unpack("H*")})"
85
- raise BytesMismatchError if @throw_error_if_mismatch
86
- end
87
- to_device(item).write_nonblock(data)
88
- end
89
- end
90
- rescue ProconBypassMan::SafeTimeout::Timeout
91
- ProconBypassMan.logger.error "timeoutになりました"
92
- copressed_buffer_text = ProconBypassMan::CompressArray.new(debug_log_buffer).compress.join("\n")
93
- ProconBypassMan::SendErrorCommand.execute(error: copressed_buffer_text)
94
- raise if @throw_error_if_timeout
95
- end
96
-
97
- # switchに任意の命令を入力して、switchから読み取る
98
- def write_switch(data, only_write: false)
99
- if data.encoding.name == "UTF-8"
100
- data = [data].pack("H*")
101
- end
102
- unless @initialized_devices
103
- init_devices
104
- end
105
-
106
- timer = ProconBypassMan::SafeTimeout.new
107
- data = nil
108
- begin
109
- timer.throw_if_timeout!
110
- switch.write_nonblock(data)
111
- rescue IO::EAGAINWaitReadable
112
- retry
113
- rescue ProconBypassMan::SafeTimeout::Timeout
114
- ProconBypassMan.logger.error "writeでtimeoutになりました"
115
- raise
116
- end
117
- return(data.unpack("H*")) if only_write
118
-
119
- timer = ProconBypassMan::SafeTimeout.new
120
- begin
121
- timer.throw_if_timeout!
122
- data = switch.read_nonblock(64)
123
- ProconBypassMan.logger.debug { " >>> #{data.unpack("H*")})" }
124
- rescue IO::EAGAINWaitReadable
125
- retry
126
- rescue ProconBypassMan::SafeTimeout::Timeout
127
- ProconBypassMan.logger.error "readでtimeoutになりました"
128
- raise
129
- end
130
- rescue ProconBypassMan::SafeTimeout::Timeout
131
- raise if @throw_error_if_timeout
132
- end
133
-
134
- def write_procon(data, only_write: false)
135
- if data.encoding.name == "UTF-8"
136
- data = [data].pack("H*")
137
- end
138
- unless @initialized_devices
139
- init_devices
140
- end
141
-
142
- timer = ProconBypassMan::SafeTimeout.new
143
- begin
144
- timer.throw_if_timeout!
145
- procon.write_nonblock(data)
146
- rescue IO::EAGAINWaitReadable
147
- retry
148
- rescue ProconBypassMan::SafeTimeout::Timeout
149
- ProconBypassMan.logger.error "writeでtimeoutになりました"
150
- raise
151
- end
152
- return(data.unpack("H*")) if only_write
153
-
154
- timer = ProconBypassMan::SafeTimeout.new
155
- begin
156
- timer.throw_if_timeout!
157
- data = procon.read_nonblock(64)
158
- ProconBypassMan.logger.error " <<< #{data.unpack("H*")})"
159
- rescue IO::EAGAINWaitReadable
160
- retry
161
- rescue ProconBypassMan::SafeTimeout::Timeout
162
- ProconBypassMan.logger.error "readでtimeoutになりました"
163
- raise
164
- end
165
- rescue ProconBypassMan::SafeTimeout::Timeout
166
- raise if @throw_error_if_timeout
167
- end
168
-
169
- def read_procon(only_read: false)
170
- unless @initialized_devices
171
- init_devices
172
- end
173
-
174
- data = nil
175
- timer = ProconBypassMan::SafeTimeout.new
176
- begin
177
- timer.throw_if_timeout!
178
- data = procon.read_nonblock(64)
179
- ProconBypassMan.logger.debug { " <<< #{data.unpack("H*")})" }
180
- rescue IO::EAGAINWaitReadable
181
- retry
182
- rescue ProconBypassMan::SafeTimeout::Timeout
183
- ProconBypassMan.logger.error "readでtimeoutになりました"
184
- raise
185
- end
186
- return(data.unpack("H*")) if only_read
187
-
188
- timer = ProconBypassMan::SafeTimeout.new
189
- begin
190
- timer.throw_if_timeout!
191
- switch.write_nonblock(data)
192
- rescue IO::EAGAINWaitReadable
193
- retry
194
- rescue ProconBypassMan::SafeTimeout::Timeout
195
- ProconBypassMan.logger.error "writeでtimeoutになりました"
196
- raise
197
- end
198
- rescue ProconBypassMan::SafeTimeout::Timeout
199
- raise if @throw_error_if_timeout
200
- end
201
-
202
- def read_switch(only_read: false)
203
- unless @initialized_devices
204
- init_devices
205
- end
206
-
207
- data = nil
208
- timer = ProconBypassMan::SafeTimeout.new
209
- begin
210
- timer.throw_if_timeout!
211
- data = switch.read_nonblock(64)
212
- ProconBypassMan.logger.debug { " >>> #{data.unpack("H*")})" }
213
- rescue IO::EAGAINWaitReadable
214
- retry
215
- rescue ProconBypassMan::SafeTimeout::Timeout
216
- ProconBypassMan.logger.error "readでtimeoutになりました"
217
- raise
218
- end
219
- return(data.unpack("H*")) if only_read
220
-
221
- timer = ProconBypassMan::SafeTimeout.new
222
- begin
223
- timer.throw_if_timeout!
224
- procon.write_nonblock(data)
225
- rescue IO::EAGAINWaitReadable
226
- retry
227
- rescue ProconBypassMan::SafeTimeout::Timeout
228
- ProconBypassMan.logger.error "writeでtimeoutになりました"
229
- raise
230
- end
231
- rescue ProconBypassMan::SafeTimeout::Timeout
232
- raise if @throw_error_if_timeout
233
- end
234
-
235
- def from_device(item)
236
- case item.read_from
237
- when :switch
238
- switch
239
- when :procon
240
- procon
241
- else
242
- raise
243
- end
244
- end
245
-
246
- # fromの対になる
247
- def to_device(item)
248
- case item.read_from
249
- when :switch
250
- procon
251
- when :procon
252
- switch
253
- else
254
- raise
255
- end
256
- end
257
-
258
- def switch
259
- @gadget
260
- end
261
-
262
- def procon
263
- @procon
264
- end
265
-
266
- def init_devices
267
- if @initialized_devices
268
- return
269
- end
270
- ProconBypassMan::UsbDeviceController.init
271
-
272
- if path = ProconBypassMan::DeviceProconFinder.find
273
- @procon = File.open(path, "w+b")
274
- ProconBypassMan.logger.info "proconのデバイスファイルは#{path}を使います"
275
- else
276
- raise(ProconBypassMan::DeviceConnector::NotFoundProconError)
277
- end
278
- @gadget = File.open('/dev/hidg0', "w+b")
279
-
280
- ProconBypassMan::UsbDeviceController.reset
281
-
282
- @initialized_devices = true
283
-
284
- if @enable_at_exit
285
- at_exit do
286
- @procon&.close
287
- @gadget&.close
288
- end
289
- end
290
- rescue Errno::ENXIO => e
291
- # /dev/hidg0 をopenできないときがある
292
- ProconBypassMan::SendErrorCommand.execute(error: "Errno::ENXIO (No such device or address @ rb_sysopen - /dev/hidg0)が起きました。resetします.\n #{e.full_message}")
293
- ProconBypassMan::UsbDeviceController.reset
294
- retry
295
- end
296
- end
@@ -1,12 +0,0 @@
1
- module ProconBypassMan
2
- module Domains
3
- module Binary; end
4
- end
5
- end
6
-
7
- require_relative "domains/bypass_mode"
8
- require_relative "domains/binary/base"
9
- require_relative "domains/binary/has_mutable_binary"
10
- require_relative "domains/binary/has_immutable_binary"
11
- require_relative "domains/binary/inbound_procon_binary"
12
- require_relative "domains/binary/processing_procon_binary"