procon_bypass_man 0.1.19 → 0.1.20.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +25 -4
  3. data/CHANGELOG.md +20 -1
  4. data/Gemfile.lock +3 -3
  5. data/README.md +1 -11
  6. data/docs/getting_started.md +62 -6
  7. data/docs/setting/splatoon2_recommended_setting.md +127 -0
  8. data/lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb +10 -0
  9. data/lib/procon_bypass_man/background/jobs/report_error_reload_config_job.rb +11 -0
  10. data/lib/procon_bypass_man/background/jobs/report_start_reboot_job.rb +10 -0
  11. data/lib/procon_bypass_man/background.rb +3 -0
  12. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +21 -2
  13. data/lib/procon_bypass_man/buttons_setting_configuration/validator.rb +10 -0
  14. data/lib/procon_bypass_man/buttons_setting_configuration.rb +2 -0
  15. data/lib/procon_bypass_man/bypass/bypass_mode.rb +29 -0
  16. data/lib/procon_bypass_man/bypass.rb +10 -8
  17. data/lib/procon_bypass_man/commands/bypass_command.rb +20 -8
  18. data/lib/procon_bypass_man/commands/connect_device_command.rb +4 -2
  19. data/lib/procon_bypass_man/commands/print_boot_message_command.rb +6 -0
  20. data/lib/procon_bypass_man/configuration.rb +30 -1
  21. data/lib/procon_bypass_man/device_connector.rb +12 -42
  22. data/lib/procon_bypass_man/device_procon_finder.rb +45 -0
  23. data/lib/procon_bypass_man/never_exit_accidentally.rb +12 -0
  24. data/lib/procon_bypass_man/plugin/splatoon2/macro/fast_return.rb +4 -0
  25. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_left_key.rb +4 -0
  26. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_right_key.rb +4 -0
  27. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_up_key.rb +4 -0
  28. data/lib/procon_bypass_man/plugin/splatoon2/macro/sokuwari_for_splash_bomb.rb +4 -0
  29. data/lib/procon_bypass_man/plugin/splatoon2/mode/guruguru.rb +4 -0
  30. data/lib/procon_bypass_man/remote_pbm_action/change_pbm_version_action.rb +4 -1
  31. data/lib/procon_bypass_man/remote_pbm_action/reboot_os_action.rb +1 -0
  32. data/lib/procon_bypass_man/remote_pbm_action/restore_pbm_setting.rb +8 -1
  33. data/lib/procon_bypass_man/runner.rb +7 -7
  34. data/lib/procon_bypass_man/scheduler.rb +1 -1
  35. data/lib/procon_bypass_man/support/yaml_writer.rb +8 -1
  36. data/lib/procon_bypass_man/usb_device_controller.rb +53 -0
  37. data/lib/procon_bypass_man/version.rb +1 -1
  38. data/lib/procon_bypass_man/websocket/pbm_job_client.rb +13 -3
  39. data/lib/procon_bypass_man.rb +21 -11
  40. data/procon_bypass_man.gemspec +1 -1
  41. data/project_template/app.rb +13 -1
  42. data/project_template/setting.yml +6 -22
  43. data/project_template/systemd_units/pbm.service +1 -1
  44. data/sig/main.rbs +5 -0
  45. metadata +12 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7db95a3b559da58846417c4c1130c20c1fdfabae51f0b089660c3fa0d9ac9f30
4
- data.tar.gz: 397b20e751282f15fd65bc22dc81be62cde78e8a765abc5185c4bc45a63b3e5e
3
+ metadata.gz: b74bbbe94f6c14a8e8cfbabb306e7229cab042ea9d5fae34ddfe134df0911528
4
+ data.tar.gz: b42ea9a421add0181270f5c957c9d10079598871634f5f20da8e7101349c981e
5
5
  SHA512:
6
- metadata.gz: d83e34d63afbd6e46da32f00cc0a79330d55dfea6c9ae1451c0ed12c14607b5c9623b96c036b6ad2ec8668047212ecf21aa6d6dd80c9b300633d514e4f4c1a0a
7
- data.tar.gz: c518539e4d905ccf1754b49ecf9de1a3ff0ed3ce1c71c9e262a6e468126647b415dbfe87d0e99cb468bfd8c3f5267ef4204622b3134831f1ab2600bf3d8dffd4
6
+ metadata.gz: df4ce5c1fc721fe5aa06236a0909c143f49b3616b4c02ca4202f0de7519206a22f5de864e58e50390e47dfe631475cdf1a04c3b4e99ed492913825cf0315039f
7
+ data.tar.gz: 8fed8f7f1181bfb51b6b214984af09b0bc1d8b83573174fa276e97e857a0569affb14148aeabf52f0ba3b90cc30083548c191346649e8c534832fcba3b6aee25
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,6 +92,14 @@ 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
+ - "2.7"
100
+ - "3.0.1"
101
+ - "3.0.2"
102
+ - "3.1.1"
82
103
  - bundle_install:
83
104
  matrix:
84
105
  parameters:
@@ -86,7 +107,7 @@ build_jobs: &build_jobs
86
107
  - "2.7"
87
108
  - "3.0.1"
88
109
  - "3.0.2"
89
- - "3.1.0"
110
+ - "3.1.1"
90
111
  - lint:
91
112
  matrix:
92
113
  parameters:
@@ -94,7 +115,7 @@ build_jobs: &build_jobs
94
115
  - "2.7"
95
116
  - "3.0.1"
96
117
  - "3.0.2"
97
- - "3.1.0"
118
+ - "3.1.1"
98
119
  requires:
99
120
  - bundle_install
100
121
  - type_check:
@@ -104,7 +125,7 @@ build_jobs: &build_jobs
104
125
  - "2.7"
105
126
  # - "3.0.1" # たまにSEGVするので
106
127
  - "3.0.2"
107
- - "3.1.0"
128
+ - "3.1.1"
108
129
  requires:
109
130
  - bundle_install
110
131
  - rspec:
@@ -114,7 +135,7 @@ build_jobs: &build_jobs
114
135
  - "2.7"
115
136
  - "3.0.1"
116
137
  - "3.0.2"
117
- - "3.1.0"
138
+ - "3.1.1"
118
139
  requires:
119
140
  - bundle_install
120
141
  workflows:
data/CHANGELOG.md CHANGED
@@ -1,6 +1,25 @@
1
+ ## [0.1.20.2] - 2022-2-18
2
+ - 起動時にreniceするようにしました
3
+ - 起動時にusb gadgetモードを有効にするようにしました
4
+ - pbm-cloudからprocon_bypass_manをアップグレードできるようになりました
5
+
6
+ ## [0.1.20.1] - 2022-02-13
7
+ - Switchからプロコンへ送信するバイパスのインターバルを設定できるようにしました(切断・フリーズ対策)
8
+
9
+ ## [0.1.20] - 2022-02-13
10
+ - pbm-cloudから再起動・設定ファイルの適用指示があったときにackイベントを返すようになりました
11
+ - 起動オプションにnever_exit_accidentallyを追加しました。これを有効にすると想定外のエラーが起きたときにプロセスが停止しなくなります。デフォルトで無効です。
12
+ - pbm-cloudから設定ファイルの適用に失敗したときにファイルへの書き込みをしないようになりました
13
+ - まだadd_procon_gadget.shを実行していないときに、接続処理をする前に処理を停止するようにしました
14
+ - ラズパイに複数のUSBデバイスが刺さっていてもプロコンのデバイスを選択できるようにしました
15
+ - Switchからプロコンへ送信するバイパスを動かし続けるようにしました(切断対策)
16
+
17
+ ## [0.1.19.1] - 2022-02-09
18
+ - 設定ファイルをpbm-cloudから復元するときに設定ファイルの改行コードが消える不具合を修正しました
19
+
1
20
  ## [0.1.19] - 2022-02-09
2
21
  - 設定ファイルを再読み込みするときに構文がエラーがあると、接続が切れる不具合を修正しました
3
- - 設定ファイルをpbm-cloudから復元するときに設定ファイルの改行コードが消える不具合を修正しました
22
+ - ~設定ファイルをpbm-cloudから復元するときに設定ファイルの改行コードが消える不具合を修正しました~
4
23
 
5
24
  ## [0.1.18] - 2022-02-05
6
25
  - macroでできることが増えました
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.1.19)
4
+ procon_bypass_man (0.1.20.2)
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.7)
39
+ pbmenv (0.1.9)
40
40
  pry (0.14.1)
41
41
  coderay (~> 1.1)
42
42
  method_source (~> 1.0)
data/README.md CHANGED
@@ -7,6 +7,7 @@
7
7
  * 設定ファイルはrubyスクリプトで記述します
8
8
  * 特定のタイトルに特化した振る舞いにしたい時は各プラグインを使ってください
9
9
  * ドキュメントは [getting_started.md](docs/getting_started.md) にまとめています
10
+ * https://pbm-cloud.herokuapp.com を使うと、webだけで運用が可能です
10
11
 
11
12
  ![image](https://user-images.githubusercontent.com/1664497/123414210-942f6980-d5ee-11eb-8192-955bd9e37e0b.png)
12
13
 
@@ -50,17 +51,6 @@ Switch <-- (PBM): ZR連打
50
51
  ## Plugins
51
52
  * https://github.com/splaplapla/procon_bypass_man-splatoon2
52
53
 
53
- ## 関連ソフトウェア
54
- * procon_bypass_man_cloud
55
- * webアプリケーション
56
- * https://github.com/splaplapla/procon_bypass_man_cloud
57
- * このwebアプリからOS自体の再起動、設定ファイルのバックアップ・変更、PBMのバージョンアップができます
58
- * ご自身でホストティングもできますが、 私がホスティングをしている https://pbm-cloud.herokuapp.com を使うことができます
59
- * [使い方](https://pbm-cloud.herokuapp.com/faq)
60
- * pbmenv
61
- * procon_bypass_manのバージョンマネージャー
62
- * https://github.com/splaplapla/pbmenv
63
-
64
54
  ## FAQ
65
55
  * どうやって動かすの?
66
56
  * このツールはRaspberry Pi4をUSBガジェットモードで起動して有線でプロコンとSwitchに接続して使います
@@ -4,20 +4,19 @@
4
4
  * [procon_bypass_manで解決したいこと](#procon_bypass_manで解決したいこと)
5
5
  * [procon_bypass_manでできること](#procon_bypass_manでできること)
6
6
  * [セットアップ](#セットアップ)
7
- * ラズベリーパイのセットアップ
8
- * procon_bypass_manのインストール
9
- * pbmenvを使う方法
10
- * pbmenvを使わない方法
11
- * とりあえず動かす方法
7
+ * [ラズベリーパイのセットアップ](#ラズベリーパイのセットアップ)
8
+ * [procon_bypass_manのインストール](#procon_bypass_manのインストール)
9
+ * [pbmenvを使う方法](#pbmenvを使う方法)
10
+ * [pbmenvを使わない方法](#pbmenvを使わない方法)
12
11
  * [普段使いをするためのセットアップ](#普段使いをするためのセットアップ)
13
12
  * レイヤー
14
13
  * モード
15
14
  * マクロ
16
15
  * 左スティックの感度調整
17
16
  * 設定ファイルの書き方
18
- * layer
19
17
  * プラグインの書き方
20
18
  * 設定ファイルの書き方がわからない、エラーが起きるとき
19
+ * [procon_bypass_manのアップグレード方法](#procon_bypass_manのアップグレード方法)
21
20
  * procon_bypass_man_cloudについて
22
21
 
23
22
  ## はじめに
@@ -29,6 +28,7 @@
29
28
  このツールを使うことで、使い慣れたコントローラーを使ってボタン連射ができます。また、設定内容はテキストで管理しているため一目瞭然です。
30
29
 
31
30
  ### procon_bypass_manでできること
31
+
32
32
  * 設定内容を即時に入れ替え(レイヤー管理)
33
33
  * 連射
34
34
  * 連射中は特定のキーの入力を無視したり、複数のキーをトリガーに連射することもできます
@@ -41,8 +41,35 @@
41
41
  * ボタンリマップ
42
42
 
43
43
  ## セットアップ
44
+ ### ラズベリーパイのセットアップ
45
+
44
46
  * 後で書きます
45
47
 
48
+ ### procon_bypass_manのインストール
49
+
50
+ pbmenvを使うと https://pbm-cloud.herokuapp.com と連携ができるのでおすすめですが、pbmenvを使わなくてもprocon_bypass_manをインストールすることは可能です。
51
+
52
+ #### pbmenvを使う方法
53
+
54
+ https://github.com/splaplapla/pbmenv
55
+ pbmenvはprocon_bypass_manのバージョンマネジャーです。procon_bypass_manはバージョンアップによって起動スクリプトに変更が入ることがあって、バージョンアップするときはpbmenvを使うとエラーが起きることなくインストールができるようになります。また、pbm-cloudと連携してすべての機能を使うには、pbmenvの利用が必須になります。
56
+
57
+ ```
58
+ gem install pbmenv
59
+ sudo pbmenv install latest
60
+ cd /usr/share/pbm/current
61
+ sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
62
+ ```
63
+
64
+ #### pbmenvを使わない方法
65
+
66
+ https://github.com/jiikko/procon_bypass_man_sample にある app.rb と setting.yml を Raspberry Pi にダウンロードし、ruby 3.0.1 をインストールすれば起動することができます。
67
+
68
+ ```
69
+ rbenv install 3.0.1
70
+ sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
71
+ ```
72
+
46
73
  ## 普段使いをするためのセットアップ
47
74
 
48
75
  procon_bypass_manを起動するだけでプロコンと接続ができるようになったら、Raspberry Piを起動したときにprocon_bypass_manも自動起動するように設定しましょう。
@@ -58,3 +85,32 @@ sudo systemctl enable pbm.service
58
85
  pbmenvを使っていない場合は、 https://github.com/splaplapla/procon_bypass_man/blob/master/project_template/systemd_units/pbm.service をダウンロードして、 `systemctl link` をしてください。
59
86
 
60
87
  ゲームをやめたくなったらSwitchはそのままスリープに入って問題ないです。このときにRaspberry Piも一緒に電源が切れてしまいますが故障することはありません。
88
+
89
+ ## レイヤー
90
+ * 後で書きます
91
+
92
+ ## モード
93
+ * 後で書きます
94
+
95
+ ## マクロ
96
+ * 後で書きます
97
+
98
+ ## 左スティックの感度調整
99
+ * 後で書きます
100
+
101
+ ## 設定ファイルの書き方
102
+ * 後で書きます
103
+
104
+ ## プラグインの書き方
105
+ * 後で書きます
106
+
107
+ ## 設定ファイルの書き方がわからない、エラーが起きるとき
108
+
109
+ 設定部分は、Rubyスクリプトになっているので構文エラーが起きることがあります。
110
+ discordで質問してみてください。
111
+
112
+ ## procon_bypass_manのアップグレード方法
113
+ [/docs/upgrade_pbm.md](/docs/upgrade_pbm.md)
114
+
115
+ ## procon_bypass_man_cloudについて
116
+ * 後で書きます
@@ -0,0 +1,127 @@
1
+ # スプラトゥーン2: おすすめの設定
2
+ ## 1 全般
3
+ ### 1.1 デスしてから最速スパジャンのためのAボタン連打
4
+
5
+ `flip :a, if_pressed: [:a]`
6
+ Aボタンを連打にします。復帰してから最速で前線復帰ができます
7
+
8
+ ### 1.2 簡単スニーキング
9
+
10
+ ボタンを押している間は、水飛沫のたたないスニーキングの感度まで調整することができます。
11
+ [設定方法](/docs/setting/left-analogstick-cap.md)
12
+
13
+ ### 1.3 ナイス玉連打
14
+
15
+ `flip :down, if_pressed: :down`
16
+ 十字キーの下ボタンは常に連打にしておくとナイス玉が来たときに楽です。
17
+
18
+ ### 1.4 最速スーパージャンプ
19
+
20
+ ```
21
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::FastReturn
22
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::JumpToUpKey
23
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::JumpToRightKey
24
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::JumpToLeftKey
25
+
26
+ layer :up do
27
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::FastReturn, if_pressed: [:y, :b, :down]
28
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::JumpToUpKey, if_pressed: [:y, :b, :up]
29
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::JumpToRightKey, if_pressed: [:y, :b, :right]
30
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::JumpToLeftKey, if_pressed: [:y, :b, :left]
31
+ end
32
+ ```
33
+
34
+ マップを開かずにジャンプができます。トリガーは自由に設定できます。
35
+
36
+ ## 2 武器に特化した設定
37
+ ### 2.1 パブロ向け
38
+
39
+ `flip :zr, if_pressed: :zr, force_neutral: :zl`
40
+ zrを連打にします。`force_neutral: :zl` というオプションをつけることで、ZRを押している間はZLを押しても無視されるようになります。パブロでは意味がありませんが、シューターだと煽りのような動作を抑制することができます。
41
+
42
+ ### 2.2 ボトルガイザー(フォイル)向け
43
+
44
+ バブル即割のマクロがあります。
45
+ [設定方法](/docs/setting/splatoon2_macro_sokuwari_bubble.md)
46
+
47
+ ## 3 設定例
48
+ ### 3.1 シンプルなパブロ向け
49
+
50
+ * ZRボタン, ZLボタン, Lボタンを同時押しながら十字キーを押すとレイヤーを切り替える
51
+ * ナイス玉が来たときにゲージを貯めるために十字キーの下を連打
52
+ * 復帰から最速ジャンプのためにAボタンを連打
53
+ * 筆を振るためにZRボタンを連打
54
+ * 筆ダッシュをするためにLボタンをZRボタンに変更
55
+
56
+ ```yaml
57
+ version: 1.0
58
+ setting: |-
59
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
60
+
61
+ layer :up do
62
+ flip :zr, if_pressed: :zr, force_neutral: :zl
63
+ flip :a, if_pressed: [:a]
64
+ flip :down, if_pressed: :down
65
+ remap :l, to: :zr
66
+ end
67
+
68
+ layer :right do
69
+ end
70
+
71
+ layer :left do
72
+ end
73
+
74
+ layer :down do
75
+ end
76
+ ```
77
+
78
+ ### 3.2 全部盛り
79
+
80
+ * ZRボタン, ZLボタン, Lボタンを同時押しながら十字キーを押すとレイヤーを切り替える
81
+ * ナイス玉が来たときにゲージを貯めるために十字キーの下を連打
82
+ * 筆を振るためにZRボタンを連打
83
+ * 復帰から最速ジャンプのためにAボタンを連打
84
+ * YボタンとBボタンと十字キーの上を同時に押したときに、マップ開いた時の↑に設定されている味方にスーパージャンプ
85
+ * YボタンとBボタンと十字キーの左を同時に押したときに、マップ開いた時の←に設定されている味方にスーパージャンプ
86
+ * YボタンとBボタンと十字キーの右を同時に押したときに、マップ開いた時の→に設定されている味方にスーパージャンプ
87
+ * YボタンとBボタンと十字キーの下を同時に押したときに、リスポーンにスーパージャンプ
88
+ * ZLボタンと十字キーの右ボタンを同時に、バブル即割を発動
89
+ * 筆ダッシュをするためにLボタンをZRボタンに変更
90
+ * ZLボタンとAボタンを同時に押したときに移動するとスニーキング
91
+
92
+ ```yaml
93
+ version: 1.0
94
+ setting: |-
95
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::FastReturn
96
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::JumpToUpKey
97
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::JumpToRightKey
98
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::JumpToLeftKey
99
+ install_macro_plugin ProconBypassMan::Plugin::Splatoon2::Macro::SokuwariForSplashBomb
100
+
101
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
102
+ set_neutral_position 2100, 2000
103
+
104
+ layer :up do
105
+ flip :zr, if_pressed: :zr, force_neutral: :zl
106
+ flip :a, if_pressed: [:a]
107
+ flip :down, if_pressed: :down
108
+
109
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::FastReturn, if_pressed: [:y, :b, :down]
110
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::JumpToUpKey, if_pressed: [:y, :b, :up]
111
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::JumpToRightKey, if_pressed: [:y, :b, :right]
112
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::JumpToLeftKey, if_pressed: [:y, :b, :left]
113
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::SokuwariForSplashBomb, if_pressed: [:zl, :right]
114
+
115
+ remap :l, to: :zr
116
+ left_analog_stick_cap cap: 1100, if_pressed: [:zl, :a], force_neutral: :a
117
+ end
118
+
119
+ layer :right do
120
+ end
121
+
122
+ layer :left do
123
+ end
124
+
125
+ layer :down do
126
+ end
127
+ ```
@@ -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
@@ -0,0 +1,11 @@
1
+ class ProconBypassMan::ReportErrorReloadConfigJob < ProconBypassMan::ReportEventBaseJob
2
+ extend ProconBypassMan::HasExternalApiSetting
3
+
4
+ # @param [String] body
5
+ def self.perform(body)
6
+ ProconBypassMan::ReportHttpClient.new(
7
+ path: path,
8
+ server_pool: server_pool,
9
+ ).post(body: body, event_type: :error_reload_config)
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class ProconBypassMan::ReportStartRebootJob < 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: :start_reboot)
9
+ end
10
+ end
@@ -6,8 +6,11 @@ require "procon_bypass_man/background/job_performer"
6
6
  require "procon_bypass_man/background/jobs/base_job"
7
7
  require "procon_bypass_man/background/jobs/report_event_base_job"
8
8
  require "procon_bypass_man/background/jobs/report_boot_job"
9
+ require "procon_bypass_man/background/jobs/report_start_reboot_job"
9
10
  require "procon_bypass_man/background/jobs/report_reload_config_job"
11
+ require "procon_bypass_man/background/jobs/report_error_reload_config_job"
10
12
  require "procon_bypass_man/background/jobs/report_load_config_job"
11
13
  require "procon_bypass_man/background/jobs/report_error_job"
12
14
  require "procon_bypass_man/background/jobs/report_pressed_buttons_job"
15
+ require "procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job"
13
16
  require "procon_bypass_man/background/jobs/sync_device_stats_job"
@@ -5,6 +5,8 @@ module ProconBypassMan
5
5
 
6
6
  # @return [ProconBypassMan::ButtonsSettingConfiguration]
7
7
  def self.load(setting_path: )
8
+ ProconBypassMan::ButtonsSettingConfiguration.instance.setting_path = setting_path
9
+
8
10
  ProconBypassMan::ButtonsSettingConfiguration.switch_new_context(:validation) do |new_instance|
9
11
  yaml = YAML.load_file(setting_path) or raise "読み込みに失敗しました"
10
12
  new_instance.instance_eval(yaml["setting"])
@@ -12,17 +14,19 @@ module ProconBypassMan
12
14
  if validator.valid?
13
15
  next
14
16
  else
15
- raise ProconBypassMan::CouldNotLoadConfigError, validator.errors
17
+ raise ProconBypassMan::CouldNotLoadConfigError, validator.errors_to_s
16
18
  end
17
19
  rescue SyntaxError
20
+ fallback_setting_if_has_backup(current_setting_path: setting_path)
18
21
  raise ProconBypassMan::CouldNotLoadConfigError, "Rubyスクリプトのシンタックスエラーです"
19
22
  rescue NoMethodError
23
+ fallback_setting_if_has_backup(current_setting_path: setting_path)
20
24
  raise ProconBypassMan::CouldNotLoadConfigError, "Rubyスクリプトに未定義の定数・変数があります"
21
25
  rescue Psych::SyntaxError
26
+ fallback_setting_if_has_backup(current_setting_path: setting_path)
22
27
  raise ProconBypassMan::CouldNotLoadConfigError, "yamlのシンタックスエラーです"
23
28
  end
24
29
 
25
- ProconBypassMan::ButtonsSettingConfiguration.instance.setting_path = setting_path
26
30
  ProconBypassMan::ButtonsSettingConfiguration.instance.reset!
27
31
  ProconBypassMan.reset!
28
32
 
@@ -38,12 +42,27 @@ module ProconBypassMan
38
42
 
39
43
  File.write(ProconBypassMan.digest_path, Digest::MD5.hexdigest(yaml["setting"]))
40
44
 
45
+ if File.exist?(ProconBypassMan.fallback_setting_path)
46
+ FileUtils.rm_rf(ProconBypassMan.fallback_setting_path)
47
+ end
48
+
41
49
  ProconBypassMan::ButtonsSettingConfiguration.instance
42
50
  end
43
51
 
44
52
  def self.reload_setting
45
53
  self.load(setting_path: ProconBypassMan::ButtonsSettingConfiguration.instance.setting_path)
46
54
  end
55
+
56
+ def self.fallback_setting_if_has_backup(current_setting_path: )
57
+ return unless File.exist?(ProconBypassMan.fallback_setting_path)
58
+ return if current_setting_path.nil?
59
+
60
+ FileUtils.copy(
61
+ ProconBypassMan.fallback_setting_path,
62
+ current_setting_path,
63
+ )
64
+ FileUtils.rm_rf(ProconBypassMan.fallback_setting_path)
65
+ end
47
66
  end
48
67
  end
49
68
  end
@@ -32,6 +32,16 @@ module ProconBypassMan
32
32
  @errors ||= Hash.new {|h,k| h[k] = [] }
33
33
  end
34
34
 
35
+ # @return [Array<String>]
36
+ def errors_to_s
37
+ errors.map { |_x, message|
38
+ value = <<~EOH
39
+ #{message.map { |m| "layer #{m}" }.join("\n")}
40
+ EOH
41
+ value.chomp
42
+ }.join("\n")
43
+ end
44
+
35
45
  private
36
46
 
37
47
  def validate_config_of_button_lonely
@@ -101,6 +101,8 @@ module ProconBypassMan
101
101
  def reset!
102
102
  @prefix_keys_for_changing_layer = []
103
103
  self.mode_plugins = {}
104
+ # プロセスを一度起動するとsetting_pathは変わらない、という想定なので適当に扱う. resetでは初期化しない
105
+ # self.setting_path = nil
104
106
  self.macro_plugins = {}
105
107
  self.layers = {
106
108
  up: Layer.new,
@@ -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
@@ -1,10 +1,12 @@
1
1
  require "procon_bypass_man/bypass/usb_hid_logger"
2
+ require "procon_bypass_man/bypass/bypass_mode"
2
3
 
3
4
  class ProconBypassMan::Bypass
4
5
  include ProconBypassMan::Bypass::UsbHidLogger
5
6
 
6
7
  class BypassValue < Struct.new(:binary, :sent)
7
8
  def to_text
9
+ return unless binary
8
10
  "#{binary.unpack.first} #{'x' unless sent}"
9
11
  end
10
12
  end
@@ -31,16 +33,16 @@ class ProconBypassMan::Bypass
31
33
  self.bypass_value.binary = ProconBypassMan::Domains::InboundProconBinary.new(binary: input)
32
34
  rescue IO::EAGAINWaitReadable
33
35
  monitor.record(:eagain_wait_readable_on_read)
34
- sleep(0.001)
35
- retry
36
36
  end
37
37
 
38
- begin
39
- self.procon.write_nonblock(input)
40
- self.bypass_value.sent = true
41
- rescue IO::EAGAINWaitReadable
42
- monitor.record(:eagain_wait_readable_on_write)
43
- break
38
+ if input
39
+ begin
40
+ self.procon.write_nonblock(input)
41
+ self.bypass_value.sent = true
42
+ rescue IO::EAGAINWaitReadable
43
+ monitor.record(:eagain_wait_readable_on_write)
44
+ break
45
+ end
44
46
  end
45
47
  end
46
48
 
@@ -27,19 +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
34
  timer = ProconBypassMan::SafeTimeout.new(timeout: Time.now + 10)
32
- bypass = ProconBypassMan::Bypass.new(gadget: @gadget, procon: @procon, monitor: monitor1)
35
+ @did_first_step = false
33
36
  loop do
37
+ bypass = ProconBypassMan::Bypass.new(gadget: @gadget, procon: @procon, monitor: monitor1)
34
38
  break if $will_terminate_token
35
- timer.throw_if_timeout!
39
+ !@did_first_step && timer.throw_if_timeout!
36
40
  bypass.send_gadget_to_procon!
37
- sleep(0.005)
41
+ sleep(@send_interval)
38
42
  rescue ProconBypassMan::SafeTimeout::Timeout
39
- ProconBypassMan.logger.info "10秒経過したのでThread1を終了します"
40
- monitor1.shutdown
41
- puts "10秒経過したのでThread1を終了します"
42
- break
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
43
55
  rescue Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN => e
44
56
  ProconBypassMan::SendErrorCommand.execute(error: "Switchとの切断されました.終了処理を開始します. #{e.full_message}")
45
57
  Process.kill "TERM", Process.ppid
@@ -80,7 +92,7 @@ class ProconBypassMan::BypassCommand
80
92
  [t1, t2].each(&:join)
81
93
  @gadget&.close
82
94
  @procon&.close
83
- exit 1
95
+ exit 1 # child processなのでexitしていい
84
96
  end
85
97
  end
86
98
  end
@@ -1,4 +1,6 @@
1
1
  class ProconBypassMan::ConnectDeviceCommand
2
+ class NotFoundProconError < StandardError; end
3
+
2
4
  # @return [void]
3
5
  def self.execute!
4
6
  gadget, procon = ProconBypassMan::DeviceConnector.connect
@@ -6,11 +8,11 @@ class ProconBypassMan::ConnectDeviceCommand
6
8
  ProconBypassMan.logger.error e
7
9
  gadget&.close
8
10
  procon&.close
9
- raise ProconBypassMan::NotFoundProconError
11
+ raise ProconBypassMan::ConnectDeviceCommand::NotFoundProconError
10
12
  rescue ProconBypassMan::SafeTimeout::Timeout
11
13
  ProconBypassMan.logger.error "デバイスとの通信でタイムアウトが起きて接続ができませんでした。"
12
14
  gadget&.close
13
15
  procon&.close
14
- raise ::ProconBypassMan::EternalConnectionError
16
+ raise ProconBypassMan::EternalConnectionError
15
17
  end
16
18
  end