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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +24 -8
- data/.github/workflows/ruby.yml +1 -1
- data/.rspec +1 -0
- data/CHANGELOG.md +24 -1
- data/Gemfile.lock +3 -3
- data/docs/getting_started.md +38 -5
- data/docs/setting/splatoon2_macro_dasei_cancel.md +73 -0
- data/lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb +10 -0
- data/lib/procon_bypass_man/background.rb +1 -0
- data/lib/procon_bypass_man/buttons_setting_configuration/layer.rb +28 -5
- data/lib/procon_bypass_man/buttons_setting_configuration.rb +1 -1
- data/lib/procon_bypass_man/commands/bypass_command.rb +21 -2
- data/lib/procon_bypass_man/commands/connect_device_command.rb +11 -21
- data/lib/procon_bypass_man/commands/print_boot_message_command.rb +6 -0
- data/lib/procon_bypass_man/configuration.rb +15 -0
- data/lib/procon_bypass_man/device_connector.rb +6 -9
- data/lib/procon_bypass_man/device_procon_finder.rb +0 -20
- data/lib/procon_bypass_man/domains/binary/processing_procon_binary.rb +1 -1
- data/lib/procon_bypass_man/domains/bypass_mode.rb +29 -0
- data/lib/procon_bypass_man/domains.rb +1 -0
- data/lib/procon_bypass_man/plugin/splatoon2/macro/dasei_cancel.rb +21 -0
- data/lib/procon_bypass_man/plugin/splatoon2/macro/fast_return.rb +4 -0
- data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_left_key.rb +4 -0
- data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_right_key.rb +4 -0
- data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_up_key.rb +4 -0
- data/lib/procon_bypass_man/plugin/splatoon2/macro/sokuwari_for_splash_bomb.rb +4 -0
- data/lib/procon_bypass_man/plugin/splatoon2/mode/guruguru.rb +4 -0
- data/lib/procon_bypass_man/plugins.rb +1 -0
- data/lib/procon_bypass_man/procon/button_collection.rb +0 -8
- data/lib/procon_bypass_man/procon/macro.rb +48 -23
- data/lib/procon_bypass_man/procon/macro_builder.rb +31 -21
- data/lib/procon_bypass_man/procon/macro_registry.rb +7 -2
- data/lib/procon_bypass_man/procon/user_operation.rb +1 -1
- data/lib/procon_bypass_man/procon/value_objects/analog_stick.rb +9 -5
- data/lib/procon_bypass_man/procon.rb +32 -12
- data/lib/procon_bypass_man/remote_pbm_action/change_pbm_version_action.rb +4 -1
- data/lib/procon_bypass_man/scheduler.rb +1 -1
- data/lib/procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler.rb +59 -0
- data/lib/procon_bypass_man/{never_exit_accidentally.rb → support/never_exit_accidentally.rb} +0 -0
- data/lib/procon_bypass_man/usb_device_controller.rb +53 -0
- data/lib/procon_bypass_man/version.rb +1 -1
- data/lib/procon_bypass_man/websocket/forever.rb +47 -0
- data/lib/procon_bypass_man/websocket/pbm_job_client.rb +14 -7
- data/lib/procon_bypass_man/websocket/watchdog.rb +19 -0
- data/lib/procon_bypass_man.rb +8 -7
- data/procon_bypass_man.gemspec +1 -1
- data/project_template/app.rb +11 -1
- data/project_template/systemd_units/pbm.service +1 -1
- data/sig/main.rbs +20 -0
- metadata +13 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44670b11efa75a8b57df0580f3c796d65419ec87914d8458ab0fc426527fb58b
|
4
|
+
data.tar.gz: 883add3b8224f5490ba62ab2caabbb42b251a86197080bb7f8d3f219c89d465c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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.
|
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.
|
133
|
+
- "3.1.1"
|
118
134
|
requires:
|
119
135
|
- bundle_install
|
120
136
|
workflows:
|
data/.github/workflows/ruby.yml
CHANGED
data/.rspec
CHANGED
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
|
-
-
|
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.
|
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.
|
39
|
+
pbmenv (0.1.9)
|
40
40
|
pry (0.14.1)
|
41
41
|
coderay (~> 1.1)
|
42
42
|
method_source (~> 1.0)
|
data/docs/getting_started.md
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
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
|
294
|
-
|
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
|
@@ -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
|