procon_bypass_man 0.1.7 → 0.1.11

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -2
  3. data/.github/workflows/ruby.yml +34 -0
  4. data/.gitignore +4 -0
  5. data/.rubocop.yml +2 -0
  6. data/.ruby-version +1 -1
  7. data/CHANGELOG.md +17 -0
  8. data/Gemfile +4 -0
  9. data/Gemfile.lock +54 -2
  10. data/README.md +13 -8
  11. data/Rakefile +10 -1
  12. data/Steepfile +39 -0
  13. data/bin/console +4 -0
  14. data/bin/dev_api_server.rb +18 -0
  15. data/docs/setup_raspi.mitamae.rb +17 -2
  16. data/docs/setup_raspi_by_mitamae.md +2 -1
  17. data/lib/procon_bypass_man/background/report_thread.rb +42 -0
  18. data/lib/procon_bypass_man/boot_message.rb +40 -0
  19. data/lib/procon_bypass_man/buttons_setting_configuration.rb +102 -0
  20. data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +27 -0
  21. data/lib/procon_bypass_man/bypass.rb +60 -29
  22. data/lib/procon_bypass_man/callbacks.rb +70 -0
  23. data/lib/procon_bypass_man/configuration/layer.rb +50 -4
  24. data/lib/procon_bypass_man/configuration/loader.rb +8 -8
  25. data/lib/procon_bypass_man/configuration/validator.rb +1 -1
  26. data/lib/procon_bypass_man/configuration.rb +67 -64
  27. data/lib/procon_bypass_man/device_connector.rb +13 -30
  28. data/lib/procon_bypass_man/io_monitor.rb +7 -4
  29. data/lib/procon_bypass_man/on_memory_cache.rb +34 -0
  30. data/lib/procon_bypass_man/outbound/base.rb +53 -0
  31. data/lib/procon_bypass_man/outbound/error_reporter.rb +13 -0
  32. data/lib/procon_bypass_man/outbound/pressed_buttons_reporter.rb +13 -0
  33. data/lib/procon_bypass_man/outbound/reporter.rb +12 -0
  34. data/lib/procon_bypass_man/procon/analog_stick.rb +31 -0
  35. data/lib/procon_bypass_man/procon/analog_stick_cap.rb +65 -0
  36. data/lib/procon_bypass_man/procon/button_collection.rb +15 -6
  37. data/lib/procon_bypass_man/procon/layer_changeable.rb +2 -2
  38. data/lib/procon_bypass_man/procon/macro_registry.rb +2 -2
  39. data/lib/procon_bypass_man/procon/mode_registry.rb +4 -4
  40. data/lib/procon_bypass_man/procon/press_button_aware.rb +13 -0
  41. data/lib/procon_bypass_man/procon/pressed_button_helper.rb +1 -11
  42. data/lib/procon_bypass_man/procon/user_operation.rb +15 -4
  43. data/lib/procon_bypass_man/procon.rb +25 -5
  44. data/lib/procon_bypass_man/readonly_procon.rb +32 -0
  45. data/lib/procon_bypass_man/runner.rb +39 -48
  46. data/lib/procon_bypass_man/uptime.rb +15 -0
  47. data/lib/procon_bypass_man/version.rb +1 -1
  48. data/lib/procon_bypass_man.rb +26 -33
  49. data/project_template/README.md +3 -2
  50. data/project_template/app.rb +8 -6
  51. data/project_template/systemd_units/pbm.service +1 -1
  52. data/project_template/systemd_units/pbm_web.service +11 -0
  53. data/project_template/web.rb +16 -0
  54. data/sig/README.rb +4 -0
  55. data/sig/main.rbs +507 -0
  56. metadata +25 -5
  57. data/examples/practical/app.rb +0 -21
  58. data/examples/practical/setting.yml +0 -24
@@ -1,39 +1,54 @@
1
1
  require "logger"
2
2
  require 'yaml'
3
+ require "json"
4
+ require "net/http"
3
5
  require "fileutils"
4
6
 
5
7
  require_relative "procon_bypass_man/version"
8
+ require_relative "procon_bypass_man/callbacks"
6
9
  require_relative "procon_bypass_man/timer"
7
10
  require_relative "procon_bypass_man/bypass"
8
11
  require_relative "procon_bypass_man/device_connector"
9
12
  require_relative "procon_bypass_man/runner"
10
13
  require_relative "procon_bypass_man/processor"
11
14
  require_relative "procon_bypass_man/configuration"
15
+ require_relative "procon_bypass_man/buttons_setting_configuration"
16
+ require_relative "procon_bypass_man/readonly_procon"
12
17
  require_relative "procon_bypass_man/procon"
18
+ require_relative "procon_bypass_man/procon/analog_stick"
19
+ require_relative "procon_bypass_man/procon/analog_stick_cap"
20
+ require_relative "procon_bypass_man/outbound/reporter"
21
+ require_relative "procon_bypass_man/outbound/error_reporter"
22
+ require_relative "procon_bypass_man/outbound/pressed_buttons_reporter"
23
+ require_relative "procon_bypass_man/on_memory_cache"
13
24
 
14
25
  STDOUT.sync = true
15
26
  Thread.abort_on_exception = true
16
27
 
17
28
  module ProconBypassMan
29
+ extend ProconBypassMan::Configuration::ClassAttributes
30
+
18
31
  class ProConRejected < StandardError; end
19
32
  class CouldNotLoadConfigError < StandardError; end
20
33
  class FirstConnectionError < StandardError; end
21
34
  class EternalConnectionError < StandardError; end
22
35
 
23
- def self.configure(setting_path: nil, &block)
36
+ def self.buttons_setting_configure(setting_path: nil, &block)
24
37
  unless setting_path
25
38
  logger.warn "setting_pathが未設定です。設定ファイルのライブリロードが使えません。"
26
39
  end
27
40
 
28
41
  if block_given?
29
- ProconBypassMan::Configuration.instance.instance_eval(&block)
42
+ ProconBypassMan::ButtonsSettingConfiguration.instance.instance_eval(&block)
30
43
  else
31
- ProconBypassMan::Configuration::Loader.load(setting_path: setting_path)
44
+ ProconBypassMan::ButtonsSettingConfiguration::Loader.load(setting_path: setting_path)
32
45
  end
33
46
  end
34
47
 
35
48
  def self.run(setting_path: nil, &block)
36
- configure(setting_path: setting_path, &block)
49
+ ProconBypassMan.logger.info "PBMを起動しています"
50
+ puts "PBMを起動しています"
51
+ buttons_setting_configure(setting_path: setting_path, &block)
37
52
  File.write(pid_path, $$)
38
53
  Runner.new.run
39
54
  rescue CouldNotLoadConfigError
@@ -52,43 +67,21 @@ module ProconBypassMan
52
67
  retry
53
68
  end
54
69
 
55
- def self.logger=(logger)
56
- @@logger = logger
70
+ def self.configure(&block)
71
+ @@configuration = ProconBypassMan::Configuration.new
72
+ @@configuration.instance_eval(&block)
73
+ @@configuration
57
74
  end
58
75
 
59
- def self.logger
60
- if defined?(@@logger)
61
- @@logger
62
- else
63
- Logger.new(nil)
64
- end
65
- end
66
-
67
- def self.pid_path
68
- @@pid_path ||= File.expand_path("#{root}/pbm_pid", __dir__).freeze
76
+ def self.config
77
+ @@configuration ||= ProconBypassMan::Configuration.new
69
78
  end
70
79
 
71
80
  def self.reset!
72
81
  ProconBypassMan::Procon::MacroRegistry.reset!
73
82
  ProconBypassMan::Procon::ModeRegistry.reset!
74
83
  ProconBypassMan::Procon.reset!
75
- ProconBypassMan::Configuration.instance.reset!
84
+ ProconBypassMan::ButtonsSettingConfiguration.instance.reset!
76
85
  ProconBypassMan::IOMonitor.reset!
77
86
  end
78
-
79
- def self.root
80
- if defined?(@@root)
81
- @@root
82
- else
83
- File.expand_path('..', __dir__).freeze
84
- end
85
- end
86
-
87
- def self.root=(path)
88
- @@root = path
89
- end
90
-
91
- def self.digest_path
92
- "#{root}/.setting_yaml_digest"
93
- end
94
87
  end
@@ -3,14 +3,15 @@ https://github.com/splaplapla/pbmenv で使っているファイルです
3
3
 
4
4
  ## systemd
5
5
  * sudo ln -s /usr/share/pbm/current/systemd_units/pbm.service /etc/systemd/system/pbm.service
6
- * commnds
6
+ * sudo ln -s /usr/share/pbm/current/systemd_units/pbm_web.service /etc/systemd/system/pbm_web.service
7
+ * commands
7
8
  * systemctl daemon-reload
8
9
  * systemctl enable pbm.service
9
10
  * systemctl disable pbm.service
10
11
  * systemctl start pbm.service
11
12
  * systemctl status pbm.service
12
13
  * systemctl restart pbm.service
14
+ * systemctl list-unit-files --type=service
13
15
 
14
16
  ### ログ
15
17
  * journalctl -xe -f
16
-
@@ -5,14 +5,16 @@ require 'bundler/inline'
5
5
  gemfile do
6
6
  source 'https://rubygems.org'
7
7
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
8
- gem 'procon_bypass_man', '0.1.7'
8
+ gem 'procon_bypass_man', '0.1.11'
9
9
  gem 'procon_bypass_man-splatoon2', github: 'splaplapla/procon_bypass_man-splatoon2', tag: "0.1.1"
10
10
  end
11
11
 
12
- ProconBypassMan.tap do |pbm|
13
- pbm.root = File.expand_path(__dir__)
14
- pbm.logger = Logger.new("#{ProconBypassMan.root}/app.log", 5, 1024 * 1024 * 10)
15
- pbm.logger.level = :debug
12
+ ProconBypassMan.configure do |config|
13
+ config.root = File.expand_path(__dir__)
14
+ config.logger = Logger.new("#{ProconBypassMan.root}/app.log", 5, 1024 * 1024 * 10)
15
+ config.logger.level = :debug
16
+ # pbm.api_server = 'https://...'
17
+ config.enable_critical_error_logging = true
16
18
  end
17
19
 
18
- ProconBypassMan.run(setting_path: "./setting.yml")
20
+ ProconBypassMan.run(setting_path: "/usr/share/pbm/current/setting.yml")
@@ -5,7 +5,7 @@ After=network.target
5
5
  [Service]
6
6
  Type=simple
7
7
  WorkingDirectory=/usr/share/pbm/current
8
- ExecStart=/bin/bash -c "ruby /usr/share/pbm/current/app.rb"
8
+ ExecStart=/bin/bash -c "/home/pi/.rbenv/versions/3.0.1/bin/ruby /usr/share/pbm/current/app.rb"
9
9
  Restart=always
10
10
  Nice=-19
11
11
 
@@ -0,0 +1,11 @@
1
+ [Unit]
2
+ Description=PBM WEB
3
+
4
+ [Service]
5
+ Type=simple
6
+ WorkingDirectory=/home/pi/src/procon_bypass_man_sample
7
+ ExecStart=/bin/bash -c "/home/pi/.rbenv/versions/3.0.1/bin/ruby /usr/share/pbm/current/web.rb"
8
+ Restart=always
9
+
10
+ [Install]
11
+ WantedBy=multi-user.target
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/inline'
4
+
5
+ gemfile do
6
+ source 'https://rubygems.org'
7
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
8
+ gem 'procon_bypass_man-web', '0.1.3'
9
+ end
10
+
11
+ ProconBypassMan::Web.configure do |config|
12
+ config.root = File.expand_path(__dir__)
13
+ config.logger = Logger.new("#{ProconBypassMan::Web.root}/web.log", 1, 1024 * 1024 * 10)
14
+ end
15
+
16
+ ProconBypassMan::Web::Server.start
data/sig/README.rb ADDED
@@ -0,0 +1,4 @@
1
+ # SIG
2
+ ```
3
+ bundle exec rbs prototype rb lib/**/*.rb > sig/main.rbs
4
+ ```
data/sig/main.rbs ADDED
@@ -0,0 +1,507 @@
1
+ interface _Symolize
2
+ def to_sym: () -> ::Symbol
3
+ end
4
+
5
+ interface _Pluginable
6
+ def name: () -> _Symolize
7
+ def respond_to?: (::Symbol) -> bool
8
+ end
9
+
10
+ module ProconBypassMan
11
+ class ProConRejected < StandardError
12
+ end
13
+
14
+ class CouldNotLoadConfigError < StandardError
15
+ end
16
+
17
+ class FirstConnectionError < StandardError
18
+ end
19
+
20
+ class EternalConnectionError < StandardError
21
+ end
22
+
23
+ def self.configure: (?setting_path: untyped? setting_path) { () -> untyped } -> untyped
24
+
25
+ def self.run: (?setting_path: untyped? setting_path) { () -> untyped } -> untyped
26
+
27
+ def self.logger=: (untyped logger) -> untyped
28
+
29
+ # @return [Logger]
30
+ def self.logger: () -> untyped
31
+
32
+ def self.pid_path: () -> untyped
33
+
34
+ def self.reset!: () -> untyped
35
+
36
+ def self.root: () -> untyped
37
+
38
+ def self.root=: (untyped path) -> untyped
39
+
40
+ def self.digest_path: () -> ::String
41
+ end
42
+
43
+ class ProconBypassMan::Bypass
44
+ attr_accessor gadget: untyped
45
+
46
+ attr_accessor procon: untyped
47
+
48
+ attr_accessor monitor: untyped
49
+
50
+ def initialize: (gadget: untyped gadget, procon: untyped procon, monitor: untyped monitor) -> untyped
51
+
52
+ # ゆっくりでいい
53
+ def send_gadget_to_procon!: () -> (nil | untyped)
54
+
55
+ def send_procon_to_gadget!: () -> (nil | untyped)
56
+ end
57
+
58
+ class AnalogStickPosition
59
+ attr_accessor x: Integer
60
+ attr_accessor y: Integer
61
+
62
+ def initialize: (x: Integer, y: Integer) -> untyped
63
+ end
64
+
65
+ module ProconBypassMan
66
+ class ButtonsSettingConfiguration
67
+ attr_accessor layers: untyped
68
+
69
+ attr_accessor setting_path: untyped
70
+
71
+ attr_accessor mode_plugins: untyped
72
+
73
+ attr_accessor macro_plugins: untyped
74
+
75
+ attr_accessor context: untyped
76
+
77
+ attr_accessor current_context_key: untyped
78
+
79
+ attr_accessor neutral_position: AnalogStickPosition
80
+
81
+ def self.instance: () -> untyped
82
+
83
+ def self.switch_new_context: (untyped key) { (untyped) -> untyped } -> untyped
84
+
85
+ def initialize: () -> untyped
86
+
87
+ MODES: ::Array[untyped]
88
+
89
+ def layer: (untyped direction, ?mode: (_Pluginable) mode) { () -> untyped } -> untyped
90
+
91
+ def install_mode_plugin: (untyped klass) -> untyped
92
+
93
+ def install_macro_plugin: (untyped klass) -> untyped
94
+
95
+ def prefix_keys_for_changing_layer: (untyped buttons) -> untyped
96
+
97
+ def prefix_keys: () -> untyped
98
+
99
+ def reset!: () -> untyped
100
+ end
101
+ end
102
+
103
+ module ProconBypassMan
104
+ class ButtonsSettingConfiguration
105
+ class Layer
106
+ attr_accessor mode: untyped
107
+
108
+ attr_accessor flips: untyped
109
+
110
+ attr_accessor macros: untyped
111
+
112
+ attr_accessor remaps: untyped
113
+
114
+ def initialize: (?mode: ::Symbol mode) -> untyped
115
+
116
+ # @param [Symbol] button
117
+ def flip: (untyped button, ?if_pressed: bool if_pressed, ?force_neutral: untyped? force_neutral, ?flip_interval: untyped? flip_interval) -> untyped
118
+
119
+ PRESET_MACROS: ::Array[untyped]
120
+
121
+ def macro: (untyped name, if_pressed: untyped if_pressed) -> untyped
122
+
123
+ def remap: (untyped button, to: untyped to) -> untyped
124
+
125
+ # @return [Array]
126
+ def flip_buttons: () -> untyped
127
+
128
+ def instance_eval: ()?{ () -> nil } -> untyped
129
+ end
130
+ end
131
+ end
132
+
133
+ module ProconBypassMan
134
+ class ButtonsSettingConfiguration
135
+ module Loader
136
+ def self.load: (setting_path: untyped setting_path) -> untyped
137
+
138
+ def self.reload_setting: () -> untyped
139
+ end
140
+ end
141
+ end
142
+
143
+ module ProconBypassMan
144
+ class ButtonsSettingConfiguration
145
+ class Validator
146
+ def initialize: (untyped config) -> untyped
147
+
148
+ # @return [Boolean]
149
+ def valid?: () -> untyped
150
+
151
+ # @return [Boolean]
152
+ def invalid?: () -> untyped
153
+
154
+ # @return [Hash]
155
+ def errors: () -> untyped
156
+
157
+ private
158
+
159
+ def validate_config_of_button_lonely: () -> untyped
160
+
161
+ def validate_require_prefix_keys: () -> untyped
162
+
163
+ def validate_verify_button_existence: () -> untyped
164
+
165
+ def validate_flip_and_remap_are_hate_each_other: () -> untyped
166
+ end
167
+ end
168
+ end
169
+
170
+ class ProconBypassMan::Configuration
171
+ module ClassAttributes
172
+ def root: () -> untyped
173
+
174
+ def logger: () -> untyped
175
+
176
+ def error_logger: () -> untyped
177
+
178
+ def pid_path: () -> untyped
179
+
180
+ def digest_path: () -> untyped
181
+
182
+ def cache: () -> untyped
183
+
184
+ def config: () -> untyped
185
+ end
186
+
187
+ attr_reader api_server: untyped
188
+
189
+ attr_accessor enable_critical_error_logging: untyped
190
+
191
+ def root=: (untyped path) -> untyped
192
+
193
+ def root: () -> untyped
194
+
195
+ def api_server=: (untyped api_server) -> untyped
196
+
197
+ def logger=: (untyped logger) -> untyped
198
+
199
+ def logger: () -> untyped
200
+
201
+ def error_logger: () -> untyped
202
+
203
+ def digest_path: () -> ::String
204
+
205
+ # @return [String] pbm-webの接続先
206
+ def internal_api_servers: () -> untyped
207
+ end
208
+
209
+
210
+ class ProconBypassMan::DeviceConnector
211
+ class BytesMismatchError < StandardError
212
+ end
213
+
214
+ class Value
215
+ attr_accessor read_from: untyped
216
+
217
+ attr_accessor values: untyped
218
+
219
+ def initialize: (values: untyped values, read_from: untyped read_from) -> untyped
220
+ end
221
+
222
+ PROCON_PATH: ::String
223
+
224
+ PROCON2_PATH: ::String
225
+
226
+ # 画面で再接続ができたが状況は変わらない
227
+ def self.reset_connection!: () -> untyped
228
+
229
+ def self.connect: () -> ::Array[untyped]
230
+
231
+ def initialize: (?throw_error_if_timeout: bool throw_error_if_timeout, ?throw_error_if_mismatch: bool throw_error_if_mismatch, ?enable_at_exit: bool enable_at_exit) -> untyped
232
+
233
+ def add: (untyped values, read_from: untyped read_from) -> untyped
234
+
235
+ def drain_all: () -> untyped
236
+
237
+ # switchに任意の命令を入力して、switchから読み取る
238
+ def write_switch: (untyped data, ?only_write: bool only_write) -> untyped
239
+
240
+ def write_procon: (untyped data, ?only_write: bool only_write) -> untyped
241
+
242
+ def read_procon: (?only_read: bool only_read) -> untyped
243
+
244
+ def read_switch: (?only_read: bool only_read) -> untyped
245
+
246
+ def from_device: (untyped item) -> untyped
247
+
248
+ # fromの対になる
249
+ def to_device: (untyped item) -> untyped
250
+
251
+ def switch: () -> untyped
252
+
253
+ def procon: () -> untyped
254
+
255
+ def is_available_device?: (untyped path) -> (::FalseClass | ::TrueClass | untyped)
256
+
257
+ def to_bin: (untyped string) -> untyped
258
+
259
+ def init_devices: () -> untyped
260
+ end
261
+
262
+ module ProconBypassMan
263
+ class Counter
264
+ attr_accessor label: untyped
265
+
266
+ attr_accessor table: untyped
267
+
268
+ attr_accessor previous_table: untyped
269
+
270
+ def initialize: (label: untyped label) -> untyped
271
+
272
+ # アクティブなバケットは1つだけ
273
+ def record: (untyped event_name) -> untyped
274
+
275
+ def formated_previous_table: () -> ::String
276
+ end
277
+
278
+ module IOMonitor
279
+ def self.new: (label: untyped label) -> untyped
280
+
281
+ # @return [Array<Counter>]
282
+ def self.targets: () -> untyped
283
+
284
+ # ここで集計する
285
+ def self.start!: () -> untyped
286
+
287
+ def self.reset!: () -> untyped
288
+ end
289
+ end
290
+
291
+ class ProconBypassMan::Processor
292
+ # @return [String] binary
293
+ def initialize: (untyped binary) -> untyped
294
+
295
+ # @return [String] 加工後の入力データ
296
+ def process: () -> untyped
297
+ end
298
+
299
+ class ProconBypassMan::Procon
300
+ attr_accessor user_operation: untyped
301
+
302
+ def self.reset!: () -> untyped
303
+
304
+ def initialize: (untyped binary) -> untyped
305
+
306
+ def status: () -> untyped
307
+
308
+ def ongoing_macro: () -> untyped
309
+
310
+ def ongoing_mode: () -> untyped
311
+
312
+ def current_layer_key: () -> untyped
313
+
314
+ def current_layer: () -> untyped
315
+
316
+ def apply!: () -> (nil | untyped)
317
+
318
+ # @return [String<binary>]
319
+ def to_binary: () -> untyped
320
+
321
+ private
322
+
323
+ def method_missing: (untyped name) -> untyped
324
+ end
325
+
326
+ class ProconBypassMan::Procon::ButtonCollection
327
+ class Button
328
+ attr_accessor byte_position: untyped
329
+
330
+ attr_accessor bit_position: untyped
331
+
332
+ def initialize: (untyped key) -> untyped
333
+ end
334
+
335
+ # ) ZR R SR(right) SL(right) A B X Y
336
+ # ) Grip (none) Cap Home ThumbL ThumbR + -
337
+ # ) ZL L SL(left) SR(left) Left Right Up Down
338
+ # ) analog[0]
339
+ # ) analog[1]
340
+ # ) analog[2]
341
+ # ) analog[3]
342
+ # ) analog[4]
343
+ # ) analog[5]
344
+ BYTES_MAP: untyped
345
+
346
+ BUTTONS_MAP: untyped
347
+
348
+ BUTTONS: untyped
349
+
350
+ def self.load: (untyped button_key) -> untyped
351
+ end
352
+
353
+ class ProconBypassMan::Procon
354
+ module Data
355
+ NO_ACTION: untyped
356
+ end
357
+ end
358
+
359
+ class ProconBypassMan::Procon
360
+ class FlipCache
361
+ def self.fetch: (key: untyped key, expires_in: untyped expires_in) { () -> untyped } -> untyped
362
+
363
+ # for testing
364
+ def self.reset!: () -> untyped
365
+ end
366
+ end
367
+
368
+ module ProconBypassMan::Procon::LayerChangeable
369
+ def next_layer_key: () -> untyped
370
+
371
+ def change_layer?: () -> untyped
372
+
373
+ def pressed_next_layer?: () -> untyped
374
+ end
375
+
376
+ class ProconBypassMan::Procon::MacroRegistry
377
+ class Macro
378
+ attr_accessor name: untyped
379
+
380
+ attr_accessor steps: untyped
381
+
382
+ def initialize: (name: untyped name, steps: untyped steps) -> untyped
383
+
384
+ def next_step: () -> untyped
385
+
386
+ def finished?: () -> untyped
387
+
388
+ def ongoing?: () -> untyped
389
+ end
390
+
391
+ PRESETS: ::Hash[untyped, untyped]
392
+
393
+ def self.install_plugin: (untyped klass) -> untyped
394
+
395
+ def self.load: (untyped name) -> untyped
396
+
397
+ def self.reset!: () -> untyped
398
+
399
+ def self.plugins: () -> untyped
400
+ end
401
+
402
+ class ProconBypassMan::Procon::ModeRegistry
403
+ class Mode
404
+ attr_accessor name: untyped
405
+
406
+ attr_accessor binaries: untyped
407
+
408
+ attr_accessor source_binaries: untyped
409
+
410
+ def initialize: (name: untyped name, binaries: untyped binaries) -> untyped
411
+
412
+ def next_binary: () -> untyped
413
+ end
414
+
415
+ PRESETS: ::Hash[untyped, untyped]
416
+
417
+ def self.install_plugin: (untyped klass) -> untyped
418
+
419
+ def self.load: (untyped name) -> untyped
420
+
421
+ def self.reset!: () -> untyped
422
+
423
+ def self.plugins: () -> untyped
424
+ end
425
+
426
+ module ProconBypassMan::Procon::PressedButtonHelper
427
+ module Static
428
+ def pressed_button?: (untyped button) -> untyped
429
+ end
430
+
431
+ module Dynamic
432
+ def compile_if_not_compile_yet!: () -> untyped
433
+ end
434
+ end
435
+
436
+ class ProconBypassMan::Procon
437
+ class UserOperation
438
+ include LayerChangeable
439
+
440
+ include PressedButtonHelper::Static
441
+
442
+ extend PressedButtonHelper::Dynamic
443
+
444
+ attr_reader binary: untyped
445
+
446
+ def initialize: (untyped binary) -> untyped
447
+
448
+ ZERO_BIT: untyped
449
+
450
+ ASCII_ENCODING: ::String
451
+
452
+ # @depilicate
453
+ def binary=: (untyped binary) -> untyped
454
+
455
+ def set_no_action!: () -> untyped
456
+
457
+ def unpress_button: (untyped button) -> untyped
458
+
459
+ def press_button: (untyped button) -> untyped
460
+
461
+ def press_button_only: (untyped button) -> untyped
462
+
463
+ def merge: (target_binary: untyped target_binary) -> untyped
464
+ end
465
+ end
466
+
467
+ class ProconBypassMan::Runner
468
+ class InterruptForRestart < StandardError
469
+ end
470
+
471
+ def initialize: () -> untyped
472
+
473
+ def run: () -> untyped
474
+
475
+ private
476
+
477
+ def main_loop: () -> untyped
478
+
479
+ def first_negotiation: () -> untyped
480
+
481
+ def handle_signal: (untyped sig) -> untyped
482
+
483
+ # @return [void]
484
+ def print_booted_message: () -> untyped
485
+ end
486
+
487
+ module ProconBypassMan
488
+ class Timer
489
+ class Timeout < StandardError
490
+ end
491
+
492
+ # 5秒後がタイムアウト
493
+ def initialize: (?timeout: untyped timeout) -> untyped
494
+
495
+ def throw_if_timeout!: () -> untyped
496
+ end
497
+ end
498
+
499
+ module ProconBypassMan
500
+ class Uptime
501
+ def self.from_boot: () -> untyped
502
+ end
503
+ end
504
+
505
+ module ProconBypassMan
506
+ VERSION: ::String
507
+ end