procon_bypass_man 0.1.20 → 0.1.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +24 -8
  3. data/.github/workflows/ruby.yml +1 -1
  4. data/.rspec +1 -0
  5. data/CHANGELOG.md +24 -1
  6. data/Gemfile.lock +3 -3
  7. data/docs/getting_started.md +38 -5
  8. data/docs/setting/splatoon2_macro_dasei_cancel.md +73 -0
  9. data/lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb +10 -0
  10. data/lib/procon_bypass_man/background.rb +1 -0
  11. data/lib/procon_bypass_man/buttons_setting_configuration/layer.rb +28 -5
  12. data/lib/procon_bypass_man/buttons_setting_configuration.rb +1 -1
  13. data/lib/procon_bypass_man/commands/bypass_command.rb +21 -2
  14. data/lib/procon_bypass_man/commands/connect_device_command.rb +11 -21
  15. data/lib/procon_bypass_man/commands/print_boot_message_command.rb +6 -0
  16. data/lib/procon_bypass_man/configuration.rb +15 -0
  17. data/lib/procon_bypass_man/device_connector.rb +6 -9
  18. data/lib/procon_bypass_man/device_procon_finder.rb +0 -20
  19. data/lib/procon_bypass_man/domains/binary/processing_procon_binary.rb +1 -1
  20. data/lib/procon_bypass_man/domains/bypass_mode.rb +29 -0
  21. data/lib/procon_bypass_man/domains.rb +1 -0
  22. data/lib/procon_bypass_man/plugin/splatoon2/macro/dasei_cancel.rb +21 -0
  23. data/lib/procon_bypass_man/plugin/splatoon2/macro/fast_return.rb +4 -0
  24. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_left_key.rb +4 -0
  25. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_right_key.rb +4 -0
  26. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_up_key.rb +4 -0
  27. data/lib/procon_bypass_man/plugin/splatoon2/macro/sokuwari_for_splash_bomb.rb +4 -0
  28. data/lib/procon_bypass_man/plugin/splatoon2/mode/guruguru.rb +4 -0
  29. data/lib/procon_bypass_man/plugins.rb +1 -0
  30. data/lib/procon_bypass_man/procon/button_collection.rb +0 -8
  31. data/lib/procon_bypass_man/procon/macro.rb +48 -23
  32. data/lib/procon_bypass_man/procon/macro_builder.rb +31 -21
  33. data/lib/procon_bypass_man/procon/macro_registry.rb +7 -2
  34. data/lib/procon_bypass_man/procon/user_operation.rb +1 -1
  35. data/lib/procon_bypass_man/procon/value_objects/analog_stick.rb +9 -5
  36. data/lib/procon_bypass_man/procon.rb +32 -12
  37. data/lib/procon_bypass_man/remote_pbm_action/change_pbm_version_action.rb +4 -1
  38. data/lib/procon_bypass_man/scheduler.rb +1 -1
  39. data/lib/procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler.rb +59 -0
  40. data/lib/procon_bypass_man/{never_exit_accidentally.rb → support/never_exit_accidentally.rb} +0 -0
  41. data/lib/procon_bypass_man/usb_device_controller.rb +53 -0
  42. data/lib/procon_bypass_man/version.rb +1 -1
  43. data/lib/procon_bypass_man/websocket/forever.rb +47 -0
  44. data/lib/procon_bypass_man/websocket/pbm_job_client.rb +14 -7
  45. data/lib/procon_bypass_man/websocket/watchdog.rb +19 -0
  46. data/lib/procon_bypass_man.rb +8 -7
  47. data/procon_bypass_man.gemspec +1 -1
  48. data/project_template/app.rb +11 -1
  49. data/project_template/systemd_units/pbm.service +1 -1
  50. data/sig/main.rbs +20 -0
  51. metadata +13 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ce5a36623cb9c5ec02d78df78f1c50d8b6f23f54cedf4297bfe76d122def428
4
- data.tar.gz: 6d459721f4dcbf4bde02c62e1ffb0aba296a39718e95d7cb5bbbbc6d27c845a3
3
+ metadata.gz: 44670b11efa75a8b57df0580f3c796d65419ec87914d8458ab0fc426527fb58b
4
+ data.tar.gz: 883add3b8224f5490ba62ab2caabbb42b251a86197080bb7f8d3f219c89d465c
5
5
  SHA512:
6
- metadata.gz: 3a15285db88ece865db72a73d94f8f5dceff3958bc1fccd6422e5b63441e9c9f6238d080883220b934b14bd5d7a25ce0509cce00ca2995e7385dce90c8297584
7
- data.tar.gz: f4cbd2665d0733016eb2311b95578360a6f111f847f32bf79a798b215d0e0a59d914fe743b4fd9c3fdeedb8e2d4fefdd3fc442de4c9c285fad7cf56f6a708b5a
6
+ metadata.gz: f9cf91dc93c58559217332670431f901a7eae8923476b26e63aca0908f52e3bdea1122df4fe00f533e80e556f91caa173c52dc27661c9ced4049fd7cbbc8f712
7
+ data.tar.gz: 17cf3cdaa06556ca4debb6ab7697a6946b6de69d197b8f9f217c1bd0786aa525c2fd8fb673ad81df089c08689bc8b238d1d8fbdea1b9c41a55684b32bca970db
data/.circleci/config.yml CHANGED
@@ -34,6 +34,19 @@ commands: &commands
34
34
  - vendor/bundle
35
35
 
36
36
  jobs:
37
+ syntax_check:
38
+ parameters:
39
+ ruby-version:
40
+ type: string
41
+ executor:
42
+ name: ruby
43
+ tag: << parameters.ruby-version >>
44
+ steps:
45
+ - checkout
46
+ - run: ruby -cw project_template/app.rb
47
+ - run: ruby -cw project_template/web.rb
48
+ - run: ruby -ryaml -e 'puts YAML.load_file("./project_template/setting.yml")["setting"]' > /tmp/content_of_setting.rb && ruby -cw /tmp/content_of_setting.rb
49
+
37
50
  bundle_install:
38
51
  parameters:
39
52
  ruby-version:
@@ -79,42 +92,45 @@ jobs:
79
92
  - run: bundle exec rspec
80
93
 
81
94
  build_jobs: &build_jobs
95
+ - syntax_check:
96
+ matrix:
97
+ parameters:
98
+ ruby-version:
99
+ - "3.0.1"
100
+ - "3.0.2"
101
+ - "3.1.1"
82
102
  - bundle_install:
83
103
  matrix:
84
104
  parameters:
85
105
  ruby-version:
86
- - "2.7"
87
106
  - "3.0.1"
88
107
  - "3.0.2"
89
- - "3.1.0"
108
+ - "3.1.1"
90
109
  - lint:
91
110
  matrix:
92
111
  parameters:
93
112
  ruby-version:
94
- - "2.7"
95
113
  - "3.0.1"
96
114
  - "3.0.2"
97
- - "3.1.0"
115
+ - "3.1.1"
98
116
  requires:
99
117
  - bundle_install
100
118
  - type_check:
101
119
  matrix:
102
120
  parameters:
103
121
  ruby-version:
104
- - "2.7"
105
122
  # - "3.0.1" # たまにSEGVするので
106
123
  - "3.0.2"
107
- - "3.1.0"
124
+ - "3.1.1"
108
125
  requires:
109
126
  - bundle_install
110
127
  - rspec:
111
128
  matrix:
112
129
  parameters:
113
130
  ruby-version:
114
- - "2.7"
115
131
  - "3.0.1"
116
132
  - "3.0.2"
117
- - "3.1.0"
133
+ - "3.1.1"
118
134
  requires:
119
135
  - bundle_install
120
136
  workflows:
@@ -16,7 +16,7 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
  strategy:
18
18
  matrix:
19
- ruby-version: ['2.7', '3.0.1']
19
+ ruby-version: ['3.0.1', '3.1.1']
20
20
 
21
21
  steps:
22
22
  - uses: actions/checkout@v2
data/.rspec CHANGED
@@ -1 +1,2 @@
1
1
  --require spec_helper
2
+ -f d
data/CHANGELOG.md CHANGED
@@ -1,9 +1,32 @@
1
+ ## [0.1.21] - 2022-03-03
2
+ - install_macro_pluginしていないマクロをlayer内で使うとクラッシュしていた問題を修正しました
3
+ - 数十時間起動しっぱなしだとpbm-cloudとのwebsocketの接続が切断される問題を修正しました
4
+ - 誤発動を防ぐために、マクロを無効にする設定ができるようになりました
5
+ - すべてのマクロを無効にする
6
+ - disable_macro :all
7
+ - disable_macro :all, if_pressed: [:a]
8
+ - 特定のマクロを無効にする
9
+ - disable_macro TheMacro
10
+ - disable_macro TheMacro, if_pressed: [:a]
11
+ - スティックを傾けたタイミングでマクロを発動するオプションを実装しました
12
+ - これによってスプラトゥーン2の惰性キャンセルができるようになります
13
+ - ただし、精度がイマイチなので今後改善していきます
14
+ - 詳しくは `スプラトゥーン2: 惰性キャンセル マクロの設定方法` を参照してください
15
+
16
+ ## [0.1.20.2] - 2022-02-18
17
+ - 起動時にreniceするようにしました
18
+ - 起動時にusb gadgetモードを有効にするようにしました
19
+ - pbm-cloudからprocon_bypass_manをアップグレードできるようになりました
20
+
21
+ ## [0.1.20.1] - 2022-02-13
22
+ - Switchからプロコンへ送信するバイパスのインターバルを設定できるようにしました(切断・フリーズ対策)
23
+
1
24
  ## [0.1.20] - 2022-02-13
2
25
  - pbm-cloudから再起動・設定ファイルの適用指示があったときにackイベントを返すようになりました
3
26
  - 起動オプションにnever_exit_accidentallyを追加しました。これを有効にすると想定外のエラーが起きたときにプロセスが停止しなくなります。デフォルトで無効です。
4
27
  - pbm-cloudから設定ファイルの適用に失敗したときにファイルへの書き込みをしないようになりました
5
28
  - まだadd_procon_gadget.shを実行していないときに、接続処理をする前に処理を停止するようにしました
6
- - ラズパイの複数のUSBデバイスが刺さっていてもプロコンのデバイスを選択できるようにしました
29
+ - ラズパイに複数のUSBデバイスが刺さっていてもプロコンのデバイスを選択できるようにしました
7
30
  - Switchからプロコンへ送信するバイパスを動かし続けるようにしました(切断対策)
8
31
 
9
32
  ## [0.1.19.1] - 2022-02-09
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.1.20)
4
+ procon_bypass_man (0.1.21)
5
5
  action_cable_client
6
- pbmenv
6
+ pbmenv (>= 0.1.9)
7
7
  sorted_set
8
8
 
9
9
  GEM
@@ -36,7 +36,7 @@ GEM
36
36
  parallel (1.21.0)
37
37
  parser (3.0.3.2)
38
38
  ast (~> 2.4.1)
39
- pbmenv (0.1.8)
39
+ pbmenv (0.1.9)
40
40
  pry (0.14.1)
41
41
  coderay (~> 1.1)
42
42
  method_source (~> 1.0)
@@ -12,13 +12,12 @@
12
12
  * レイヤー
13
13
  * モード
14
14
  * マクロ
15
- * 左スティックの感度調整
15
+ * [左スティックの感度調整](#左スティックの感度調整)
16
16
  * 設定ファイルの書き方
17
- * layer
18
17
  * プラグインの書き方
19
- * 設定ファイルの書き方がわからない、エラーが起きるとき
20
- * procon_bypass_manのアップグレード方法
21
- * procon_bypass_man_cloudについて
18
+ * [設定ファイルの書き方がわからない、エラーが起きるとき](#設定ファイルの書き方がわからない、エラーが起きるとき)
19
+ * [procon_bypass_manのアップグレード方法](#procon_bypass_manのアップグレード方法)
20
+ * [procon_bypass_man_cloudについて](#procon_bypass_man_cloudについて)
22
21
 
23
22
  ## はじめに
24
23
  ### procon_bypass_manで解決したいこと
@@ -86,3 +85,37 @@ sudo systemctl enable pbm.service
86
85
  pbmenvを使っていない場合は、 https://github.com/splaplapla/procon_bypass_man/blob/master/project_template/systemd_units/pbm.service をダウンロードして、 `systemctl link` をしてください。
87
86
 
88
87
  ゲームをやめたくなったらSwitchはそのままスリープに入って問題ないです。このときにRaspberry Piも一緒に電源が切れてしまいますが故障することはありません。
88
+
89
+ ## レイヤー
90
+ * 後で書きます
91
+
92
+ ## モード
93
+ * 後で書きます
94
+
95
+ ## マクロ
96
+ * 後で書きます
97
+
98
+ ## 左スティックの感度調整
99
+ [左スティックの感度調整](/docs/setting/left-analogstick-cap.md)
100
+
101
+ ## 設定ファイルの書き方
102
+ * 後で書きます
103
+
104
+ ## プラグインの書き方
105
+ * 後で書きます
106
+
107
+ ## 設定ファイルの書き方がわからない、エラーが起きるとき
108
+
109
+ 設定ファイル(setting.yaml)は、内部がRubyスクリプトになっているので構文エラーが起きることがあります。
110
+ discordで質問してみてください。
111
+
112
+ ## procon_bypass_manのアップグレード方法
113
+ [procon_bypass_manのアップグレード方法](/docs/upgrade_pbm.md)
114
+
115
+ ## procon_bypass_man_cloudについて
116
+ https://pbm-cloud.herokuapp.com/
117
+ procon_bypass_man_cloudの運用をWEBで完結できるようになる無料のWEBサービスです。
118
+
119
+ procon_bypass_man_cloudとの接続が完了後、Raspberry Piを起動時にprocon_bypass_man_cloudが自動で立ち上がるように設定すれば、Raspberry Piへのログインが不要で設定ファイルの変更やprocon_bypass_man_cloudのアップグレードができます。
120
+ セットアップ方法などでわからないことがあればdiscordで質問してみてください。
121
+ セットアップ方法は https://pbm-cloud.herokuapp.com/faq に書いています。
@@ -0,0 +1,73 @@
1
+ # スプラトゥーン2: 惰性キャンセル マクロの設定方法
2
+
3
+ * 本マクロは実験段階で、オプション名などの仕様が変更される可能性が高いです
4
+ * procon_bypass_man: 0.1.21以上が必要です
5
+
6
+ ## 1. install_macro_pluginでマクロを有効化します
7
+ * `setting.yml` に`install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel` と書きます
8
+ * これを記述することで、layer内でmacroを呼び出せるようになります
9
+
10
+ ```ruby
11
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel
12
+ ```
13
+
14
+ ## 2. どのlayerで発動するかを宣言します
15
+ * `setting.yml` のlayer内に`macro ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel, if_pressed: [:zl]` と書きます
16
+ * `if_pressed` がどのボタンを押したときにこのマクロが発動するかの設定です
17
+ * 惰性キャンセルなのでイカ状態になるためにzlを押します
18
+ * `if_tilted_left_stick` がスティックを倒した時に発動するオプションで、trueを渡すと有効になります
19
+ * また、傾けた時の閾値を変更することができて、trueの代わりに `{ threshold: 500 }` と書くことができます
20
+ * デフォルトが500で、ここの数値を上げると、スティックを倒した判定がより厳しくなります。最大1400くらいです。
21
+ * 連打中に、マクロの発動を無効にしたい場合は `disable_macro` で無効にできます
22
+
23
+ ```ruby
24
+ layer :up do
25
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel, if_tilted_left_stick: true, if_pressed: [:zl]
26
+ end
27
+ ```
28
+ ```ruby
29
+ layer :up do
30
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel, if_tilted_left_stick: { threshold: 500 }, if_pressed: [:zl]
31
+ end
32
+ ```
33
+ ```ruby
34
+ layer :up do
35
+ disable_macro :all, if_pressed: :a
36
+ disable_macro :all, if_pressed: :zr
37
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel, if_tilted_left_stick: true, if_pressed: [:zl]
38
+ end
39
+ ```
40
+
41
+ ## 3. 設定を反映させる
42
+ * 上記の記述を加えたsetting.ymlを起動中のprocon_bypass_manプロセスで読み込むには、プロセスにその旨を伝える必要があります
43
+ * ラズベリーパイを再起動して、プロセスを立ち上げ直す、でも目的は達成できますが、もっと簡単にsetting.ymlを再読み込みする必要があります
44
+ * 書き換えたsetting.ymlを、起動中のprocon_bypass_manプロセスへ即時反映するには、procon_bypass_manプロセスを動かしたまま、別のshellから 以下をを実行してください
45
+ * setting.ymlのシンタックスが正しければ、switchとの接続が継続したままsetting.ymlの内容を読み込んでいるはずです
46
+
47
+ ## 設定例1
48
+ ```yaml
49
+ version: 1.0
50
+ setting: |-
51
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
52
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel
53
+
54
+ layer :up do
55
+ disable_macro :all, if_pressed: :a
56
+ disable_macro :all, if_pressed: :zr
57
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::DaseiCancel, if_tilted_left_stick: true, if_pressed: [:zl]
58
+ end
59
+ ```
60
+
61
+ ## 設定例2
62
+ * `open_macro` キーワードを使っても同じことが実行可能です。
63
+ * この場合は、 `install_macro_plugin` が不要です。
64
+
65
+ ```yaml
66
+ version: 1.0
67
+ setting: |-
68
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
69
+
70
+ layer :up do
71
+ open_macro :dacan, steps: [:pressing_r_for_0_03sec, :pressing_r_and_pressing_zl_for_0_2sec], if_tilted_left_stick: true, if_pressed: [:zl]
72
+ end
73
+ ```
@@ -0,0 +1,10 @@
1
+ class ProconBypassMan::ReportCompletedUpgradePbmJob < ProconBypassMan::ReportEventBaseJob
2
+ extend ProconBypassMan::HasExternalApiSetting
3
+
4
+ def self.perform
5
+ ProconBypassMan::ReportHttpClient.new(
6
+ path: path,
7
+ server_pool: server_pool,
8
+ ).post(body: nil, event_type: :completed_upgrade_pbm)
9
+ end
10
+ end
@@ -12,4 +12,5 @@ require "procon_bypass_man/background/jobs/report_error_reload_config_job"
12
12
  require "procon_bypass_man/background/jobs/report_load_config_job"
13
13
  require "procon_bypass_man/background/jobs/report_error_job"
14
14
  require "procon_bypass_man/background/jobs/report_pressed_buttons_job"
15
+ require "procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job"
15
16
  require "procon_bypass_man/background/jobs/sync_device_stats_job"
@@ -1,12 +1,13 @@
1
1
  module ProconBypassMan
2
2
  class ButtonsSettingConfiguration
3
3
  class Layer
4
- attr_accessor :mode, :flips, :macros, :remaps, :left_analog_stick_caps, :disables
4
+ attr_accessor :mode, :flips, :macros, :disable_macros, :remaps, :left_analog_stick_caps, :disables
5
5
 
6
6
  def initialize(mode: :manual)
7
7
  self.mode = mode
8
8
  self.flips = {}
9
9
  self.macros = {}
10
+ self.disable_macros = []
10
11
  self.remaps = {}
11
12
  self.left_analog_stick_caps = []
12
13
  self.disables = []
@@ -54,18 +55,40 @@ module ProconBypassMan
54
55
  end
55
56
 
56
57
  # @param [String, Class] プラグインのclass
57
- def macro(name, if_pressed: )
58
+ def macro(name, if_pressed: , if_tilted_left_stick: nil)
58
59
  macro_name = name.to_s.to_sym
59
- self.macros[macro_name] = { if_pressed: if_pressed }
60
+ if ProconBypassMan::ButtonsSettingConfiguration.instance.macro_plugins[macro_name]
61
+ self.macros[macro_name] = { if_pressed: if_pressed, if_tilted_left_stick: if_tilted_left_stick }.compact
62
+ else
63
+ warn "#{macro_name}マクロがinstallされていません"
64
+ end
60
65
  end
61
66
 
62
67
  # 設定ファイルに直接マクロを打ち込める
63
68
  # @param [String, Class] macroの識別子
64
69
  # @paramh[Array<Symbol>] macroの本体. ボタンの配列
65
- def open_macro(name, steps: , if_pressed: )
70
+ def open_macro(name, steps: , if_pressed: , if_tilted_left_stick: nil)
66
71
  macro_name = name || "OpenMacro-#{steps.join}".to_sym
67
72
  ProconBypassMan::Procon::MacroRegistry.install_plugin(macro_name, steps: steps)
68
- self.macros[macro_name] = { if_pressed: if_pressed }
73
+ self.macros[macro_name] = { if_pressed: if_pressed, if_tilted_left_stick: if_tilted_left_stick }.compact
74
+ end
75
+
76
+ def disable_macro(name, if_pressed: nil)
77
+ hash = { name: name.to_s.to_sym, if_pressed: [] }
78
+ case if_pressed
79
+ when TrueClass, FalseClass
80
+ return # booleanはよくわからないのでreturn
81
+ when Symbol, String
82
+ hash[:if_pressed] = [if_pressed]
83
+ when Array
84
+ hash[:if_pressed] = if_pressed
85
+ when NilClass # 常に対象のmacroをdisableにする
86
+ hash[:if_pressed] = [true]
87
+ else
88
+ raise "not support value"
89
+ end
90
+
91
+ disable_macros << hash
69
92
  end
70
93
 
71
94
  def remap(button, to: )
@@ -65,7 +65,7 @@ module ProconBypassMan
65
65
  end
66
66
 
67
67
  unless ([ManualMode.name] + ProconBypassMan::Procon::ModeRegistry.plugins.keys).include?(mode_name)
68
- raise("#{mode_name} mode is unknown")
68
+ warn "#{mode_name}モードがinstallされていません"
69
69
  end
70
70
 
71
71
  layer = Layer.new(mode: mode_name)
@@ -27,12 +27,31 @@ class ProconBypassMan::BypassCommand
27
27
  monitor1 = ProconBypassMan::IOMonitor.new(label: "switch -> procon")
28
28
  monitor2 = ProconBypassMan::IOMonitor.new(label: "procon -> switch")
29
29
  ProconBypassMan.logger.info "Thread1を起動します"
30
+
31
+ @send_interval = 0.005
32
+
30
33
  t1 = Thread.new do
31
- bypass = ProconBypassMan::Bypass.new(gadget: @gadget, procon: @procon, monitor: monitor1)
34
+ timer = ProconBypassMan::SafeTimeout.new(timeout: Time.now + 10)
35
+ @did_first_step = false
32
36
  loop do
37
+ bypass = ProconBypassMan::Bypass.new(gadget: @gadget, procon: @procon, monitor: monitor1)
33
38
  break if $will_terminate_token
39
+ !@did_first_step && timer.throw_if_timeout!
34
40
  bypass.send_gadget_to_procon!
35
- sleep(0.02)
41
+ sleep(@send_interval)
42
+ rescue ProconBypassMan::SafeTimeout::Timeout
43
+ case ProconBypassMan.config.bypass_mode.mode
44
+ when ProconBypassMan::BypassMode::TYPE_AGGRESSIVE
45
+ ProconBypassMan.logger.info "10秒経過したのでThread1を終了します"
46
+ monitor1.shutdown
47
+ break
48
+ when ProconBypassMan::BypassMode::TYPE_NORMAL
49
+ ProconBypassMan.logger.info "10秒経過したのでsend_intervalを長くします"
50
+ @send_interval = ProconBypassMan.config.bypass_mode.gadget_to_procon_interval
51
+ else
52
+ raise "unknown type"
53
+ end
54
+ @did_first_step = true
36
55
  rescue Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN => e
37
56
  ProconBypassMan::SendErrorCommand.execute(error: "Switchとの切断されました.終了処理を開始します. #{e.full_message}")
38
57
  Process.kill "TERM", Process.ppid
@@ -3,26 +3,16 @@ class ProconBypassMan::ConnectDeviceCommand
3
3
 
4
4
  # @return [void]
5
5
  def self.execute!
6
- unless has_required_files?
7
- raise ProconBypassMan::NotFoundRequiredFilesError, "there is not /sys/kernel/config/usb_gadget/procon"
8
- end
9
-
10
- begin
11
- gadget, procon = ProconBypassMan::DeviceConnector.connect
12
- rescue ProconBypassMan::DeviceConnector::NotFoundProconError => e
13
- ProconBypassMan.logger.error e
14
- gadget&.close
15
- procon&.close
16
- raise ProconBypassMan::ConnectDeviceCommand::NotFoundProconError
17
- rescue ProconBypassMan::SafeTimeout::Timeout
18
- ProconBypassMan.logger.error "デバイスとの通信でタイムアウトが起きて接続ができませんでした。"
19
- gadget&.close
20
- procon&.close
21
- raise ProconBypassMan::EternalConnectionError
22
- end
23
- end
24
-
25
- def self.has_required_files?
26
- Dir.exist?("/sys/kernel/config/usb_gadget/procon")
6
+ gadget, procon = ProconBypassMan::DeviceConnector.connect
7
+ rescue ProconBypassMan::DeviceConnector::NotFoundProconError => e
8
+ ProconBypassMan.logger.error e
9
+ gadget&.close
10
+ procon&.close
11
+ raise ProconBypassMan::ConnectDeviceCommand::NotFoundProconError
12
+ rescue ProconBypassMan::SafeTimeout::Timeout
13
+ ProconBypassMan.logger.error "デバイスとの通信でタイムアウトが起きて接続ができませんでした。"
14
+ gadget&.close
15
+ procon&.close
16
+ raise ProconBypassMan::EternalConnectionError
27
17
  end
28
18
  end
@@ -4,6 +4,7 @@ class ProconBypassMan::PrintBootMessageCommand
4
4
  @table = {}
5
5
  @table[:ruby_version] = RUBY_VERSION
6
6
  @table[:pbm_version] = ProconBypassMan::VERSION
7
+ @table[:pbmenv_version] = Pbmenv::VERSION
7
8
  @table[:pid] = $$
8
9
  @table[:root_path] = ProconBypassMan.root
9
10
  @table[:pid_path] = ProconBypassMan.pid_path
@@ -12,6 +13,9 @@ class ProconBypassMan::PrintBootMessageCommand
12
13
  @table[:use_pbmenv] = !(!!`which pbmenv`.empty?)
13
14
  @table[:session_id] = ProconBypassMan.session_id
14
15
  @table[:device_id] = ProconBypassMan.device_id
16
+ @table[:bypass_mode] = ProconBypassMan.config.bypass_mode.to_s
17
+ @table[:never_exit_accidentally] = ProconBypassMan.config.never_exit_accidentally
18
+ @table[:uname] = `uname -a`.chomp
15
19
 
16
20
  # 開発中のHEADを取りたかったけど、Gem::Specification経由から取得する必要がありそう
17
21
  # build_version = `git rev-parse --short HEAD`.chomp
@@ -30,6 +34,7 @@ class ProconBypassMan::PrintBootMessageCommand
30
34
  ----
31
35
  RUBY_VERSION: #{@table[:ruby_version]}
32
36
  ProconBypassMan::VERSION: #{@table[:pbm_version]}
37
+ Pbmenv::VERSION: #{@table[:pbmenv_version]}
33
38
  pid: #{@table[:pid]}
34
39
  root: #{@table[:root_path]}
35
40
  pid_path: #{@table[:pid_path]}
@@ -38,6 +43,7 @@ class ProconBypassMan::PrintBootMessageCommand
38
43
  use_pbmenv: #{@table[:use_pbmenv]}
39
44
  session_id: #{ProconBypassMan.session_id}
40
45
  device_id: #{ProconBypassMan.device_id}
46
+ bypass_mode: #{ProconBypassMan.config.bypass_mode}
41
47
  ----
42
48
  EOF
43
49
  end
@@ -65,6 +65,17 @@ class ProconBypassMan::Configuration
65
65
  end
66
66
  end
67
67
 
68
+ def bypass_mode=(value)
69
+ @bypass_mode = ProconBypassMan::BypassMode.new(
70
+ mode: value[:mode],
71
+ gadget_to_procon_interval: value[:gadget_to_procon_interval],
72
+ )
73
+ end
74
+
75
+ def bypass_mode
76
+ @bypass_mode || ProconBypassMan::BypassMode.default_value
77
+ end
78
+
68
79
  def api_servers=(api_servers)
69
80
  @api_servers = api_servers
70
81
  return self
@@ -156,6 +167,10 @@ class ProconBypassMan::Configuration
156
167
  end
157
168
  end
158
169
 
170
+ def has_api_server?
171
+ not api_servers.length.zero?
172
+ end
173
+
159
174
  def verbose_bypass_log
160
175
  @verbose_bypass_log || !!ENV["VERBOSE_BYPASS_LOG"]
161
176
  end
@@ -61,9 +61,9 @@ class ProconBypassMan::DeviceConnector
61
61
  begin
62
62
  timer.throw_if_timeout!
63
63
  data = from_device(item).read_nonblock(64)
64
- debug_log_buffer << "read_from(#{item.read_from}): #{data}"
64
+ debug_log_buffer << "read_from(#{item.read_from}): #{data.unpack("H*")}"
65
65
  rescue IO::EAGAINWaitReadable
66
- debug_log_buffer << "read_from(#{item.read_from}): IO::EAGAINWaitReadable"
66
+ # debug_log_buffer << "read_from(#{item.read_from}): IO::EAGAINWaitReadable"
67
67
  retry
68
68
  end
69
69
 
@@ -267,6 +267,7 @@ class ProconBypassMan::DeviceConnector
267
267
  if @initialized_devices
268
268
  return
269
269
  end
270
+ ProconBypassMan::UsbDeviceController.init
270
271
 
271
272
  if path = ProconBypassMan::DeviceProconFinder.find
272
273
  @procon = File.open(path, "w+b")
@@ -276,9 +277,7 @@ class ProconBypassMan::DeviceConnector
276
277
  end
277
278
  @gadget = File.open('/dev/hidg0', "w+b")
278
279
 
279
- system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
280
- system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
281
- sleep 0.5
280
+ ProconBypassMan::UsbDeviceController.reset
282
281
 
283
282
  @initialized_devices = true
284
283
 
@@ -290,10 +289,8 @@ class ProconBypassMan::DeviceConnector
290
289
  end
291
290
  rescue Errno::ENXIO => e
292
291
  # /dev/hidg0 をopenできないときがある
293
- ProconBypassMan::SendErrorCommand.execute(error: "Errno::ENXIO (No such device or address @ rb_sysopen - /dev/hidg0)が起きました。resetします. #{e.full_message}")
294
- system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
295
- system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
296
- sleep 0.5
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
297
294
  retry
298
295
  end
299
296
  end
@@ -42,24 +42,4 @@ class ProconBypassMan::DeviceProconFinder
42
42
  done
43
43
  SHELL
44
44
  end
45
-
46
- # これいる?
47
- def is_available_device?(path)
48
- return false if !File.exist?(path)
49
-
50
- system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
51
- system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
52
- sleep 0.5
53
-
54
- file = File.open(path, "w+")
55
- begin
56
- file.read_nonblock(64)
57
- rescue EOFError
58
- file.close
59
- return false
60
- rescue IO::EAGAINWaitReadable
61
- file.close
62
- return true
63
- end
64
- end
65
45
  end
@@ -45,7 +45,7 @@ class ProconBypassMan::Domains::ProcessingProconBinary < ProconBypassMan::Domain
45
45
 
46
46
  # @param [Symbol] button
47
47
  def write_as_unpress_button(button)
48
- raise "not press button(#{button}) yet" if not ProconBypassMan::PressButtonAware.new(binary).pressing_button?(button)
48
+ raise "do not press button(#{button}) yet" if not ProconBypassMan::PressButtonAware.new(binary).pressing_button?(button)
49
49
 
50
50
  button_obj = ProconBypassMan::Procon::Button.new(button)
51
51
  value = binary[button_obj.byte_position].unpack("C").first - (2**button_obj.bit_position)
@@ -0,0 +1,29 @@
1
+ class ProconBypassMan::BypassMode
2
+ TYPE_NORMAL = :normal
3
+ TYPE_AGGRESSIVE = :aggressive
4
+ TYPES = [TYPE_NORMAL, TYPE_AGGRESSIVE]
5
+
6
+ DEFAULT_GADGET_TO_PROCON_INTERVAL = 0.5
7
+
8
+ attr_accessor :mode, :gadget_to_procon_interval
9
+
10
+ def self.default_value
11
+ new(
12
+ mode: TYPE_NORMAL,
13
+ gadget_to_procon_interval: DEFAULT_GADGET_TO_PROCON_INTERVAL,
14
+ )
15
+ end
16
+
17
+ def initialize(mode: , gadget_to_procon_interval: )
18
+ @mode = mode.to_sym
19
+ @gadget_to_procon_interval = gadget_to_procon_interval
20
+ end
21
+
22
+ def to_s
23
+ if mode == TYPE_NORMAL
24
+ "#{mode}(#{gadget_to_procon_interval})"
25
+ else
26
+ mode.to_s
27
+ end
28
+ end
29
+ end
@@ -4,6 +4,7 @@ module ProconBypassMan
4
4
  end
5
5
  end
6
6
 
7
+ require_relative "domains/bypass_mode"
7
8
  require_relative "domains/binary/base"
8
9
  require_relative "domains/binary/has_mutable_binary"
9
10
  require_relative "domains/binary/has_immutable_binary"
@@ -0,0 +1,21 @@
1
+ module ProconBypassMan
2
+ module Plugin
3
+ module Splatoon2
4
+ module Macro
5
+ module DaseiCancel
6
+ def self.display_name
7
+ :dasei_cancel
8
+ end
9
+
10
+ def self.steps
11
+ [:pressing_r_for_0_03sec, :pressing_r_and_pressing_zl_for_0_2sec].freeze
12
+ end
13
+
14
+ def self.description
15
+ '惰性キャンセル'
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end