procon_bypass_man 0.2.3 → 0.3.1

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/CHANGELOG.md +12 -0
  3. data/Gemfile.lock +4 -2
  4. data/README.md +11 -33
  5. data/docs/getting_started.md +8 -0
  6. data/docs/setting/splatoon2_macro_forward_ikarole.md +34 -0
  7. data/docs/setup_raspi.md +12 -15
  8. data/docs/setup_raspi_by_mitamae.md +0 -1
  9. data/lib/procon_bypass_man/buttons_setting_configuration/layer.rb +1 -0
  10. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +2 -1
  11. data/lib/procon_bypass_man/buttons_setting_configuration.rb +11 -0
  12. data/lib/procon_bypass_man/bypass/bypass_command.rb +11 -6
  13. data/lib/procon_bypass_man/bypass/procon_to_switch.rb +44 -41
  14. data/lib/procon_bypass_man/bypass/switch_to_procon.rb +2 -0
  15. data/lib/procon_bypass_man/commands/print_boot_message_command.rb +0 -2
  16. data/lib/procon_bypass_man/configuration.rb +4 -0
  17. data/lib/procon_bypass_man/device_connection/procon_setting_overrider.rb +0 -3
  18. data/lib/procon_bypass_man/ephemeral_configuration.rb +9 -0
  19. data/lib/procon_bypass_man/plugin/splatoon2/macro/{dasei_cancel.rb → forward_ikarole.rb} +4 -4
  20. data/lib/procon_bypass_man/plugins.rb +1 -1
  21. data/lib/procon_bypass_man/procon/analog_stick_manipulator.rb +18 -4
  22. data/lib/procon_bypass_man/procon/layer_changer.rb +2 -0
  23. data/lib/procon_bypass_man/procon/macro.rb +2 -0
  24. data/lib/procon_bypass_man/procon/macro_builder.rb +13 -0
  25. data/lib/procon_bypass_man/procon/macro_registry.rb +2 -0
  26. data/lib/procon_bypass_man/procon/performance_measurement/measurements_summarizer.rb +41 -24
  27. data/lib/procon_bypass_man/procon/performance_measurement/span_transfer_buffer.rb +1 -1
  28. data/lib/procon_bypass_man/procon/performance_measurement.rb +12 -5
  29. data/lib/procon_bypass_man/procon/rumbler.rb +18 -0
  30. data/lib/procon_bypass_man/procon/suppress_rumble.rb +2 -0
  31. data/lib/procon_bypass_man/procon/user_operation.rb +3 -1
  32. data/lib/procon_bypass_man/procon/value_objects/analog_stick.rb +2 -0
  33. data/lib/procon_bypass_man/procon/value_objects/binary/inbound_procon_binary.rb +2 -0
  34. data/lib/procon_bypass_man/procon/value_objects/binary/processing_procon_binary.rb +2 -0
  35. data/lib/procon_bypass_man/procon/value_objects/rumble_binary.rb +2 -0
  36. data/lib/procon_bypass_man/procon.rb +28 -18
  37. data/lib/procon_bypass_man/remote_macro.rb +2 -0
  38. data/lib/procon_bypass_man/remote_pbm_action.rb +2 -0
  39. data/lib/procon_bypass_man/runner.rb +0 -1
  40. data/lib/procon_bypass_man/support/callbacks.rb +10 -3
  41. data/lib/procon_bypass_man/support/http_client.rb +3 -0
  42. data/lib/procon_bypass_man/support/renice_command.rb +17 -0
  43. data/lib/procon_bypass_man/version.rb +1 -1
  44. data/lib/procon_bypass_man.rb +24 -6
  45. data/procon_bypass_man.gemspec +3 -1
  46. data/project_template/app.rb +1 -4
  47. data/project_template/app.rb.erb +1 -4
  48. data/project_template/setting.yml +3 -0
  49. metadata +21 -5
  50. data/docs/setting/splatoon2_macro_dasei_cancel.md +0 -77
  51. data/lib/procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dddf32b941507a57c7b2c5656879e132132f51eefcd64f29788567c81566c235
4
- data.tar.gz: e3649afcdb4877b41c6d05754ed77176d46a1fcc46a3d45751e15b1c91f6a23d
3
+ metadata.gz: 3d7e6a739dbaf4be4022b97c591828d5ccca8d947c0c3bc0a0a8ffa8097a2b95
4
+ data.tar.gz: f7ad824a4e34d051c3f3514d18f6c6ab4b3e23b0cf6d9c574af1038afe9118b0
5
5
  SHA512:
6
- metadata.gz: 231bb01ab26c17cdd6d044030a71479dfd1016d05e353de537e3ecd3978f5f4d23b2d8c4058e4f86cadbd555e3762e6124f7cb36920df2544c306e154d568bfe
7
- data.tar.gz: 8ae5c0a6b510d9b6dc22eb54fbf748e21e9b2b90671f00dc197baad2f90d00473ba4ee64f6ff148e7a200498df8f22edd738281979ab5e1240233a6bbc9e349b
6
+ metadata.gz: 5ab67436d5d4dbca83ec68d42b0621d6737370388e10d5d86738914506dd6261aa6f495b7074f36ec685d1392b433ec1d7070f9417c2dfe4e7927b6840829633
7
+ data.tar.gz: 4c0034304beda74a99126b4dfd1cd35b2f0ac00b78c200dea9f6bfd64a19b0c39407a4e24afcd0914764e9899058a328e4a1c18130efc83421eb7202b2543e1c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [0.3.1] - 2022-10-07
2
+ * レイヤーを変更しているときにコントローラーを振動できるようになりました
3
+ * setting.yml で `enable(:rumble_on_layer_change)` と記述してください
4
+ * イカロールをするマクロを追加しました
5
+ * 詳しい設定方法については docs/setting/splatoon2_macro_forward_ikarole.md を参照してください
6
+ * スプラ用マクロ、惰性キャンセルを削除しました
7
+
8
+ ## [0.3.0] - 2022-9-9
9
+ * 表示入力機能を一時的に削除しました #185
10
+ * バイパス処理中の小さなラグがほぼなくなりました #185
11
+ * バイパス処理をマルチプロセスで行うようにしたのでGCによる停止時間がほぼなくなったため
12
+
1
13
  ## [0.2.3] - 2022-8-27
2
14
  * プロコンのラグ具合をpbm-cloudに送信し、グラフで見れるようになりました #158
3
15
  * 非同期ジョブをmasterプロセス経由で実行するようになりました #191
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.2.3)
4
+ procon_bypass_man (0.3.1)
5
5
  action_cable_client
6
+ blue_green_process
6
7
  pbmenv (>= 0.1.9)
7
8
  sorted_set
8
9
 
@@ -18,6 +19,7 @@ GEM
18
19
  tzinfo (~> 2.0)
19
20
  zeitwerk (~> 2.3)
20
21
  ast (2.4.2)
22
+ blue_green_process (0.1.3)
21
23
  coderay (1.1.3)
22
24
  concurrent-ruby (1.1.9)
23
25
  diff-lcs (1.4.4)
@@ -78,7 +80,7 @@ GEM
78
80
  parser (>= 3.0.1.1)
79
81
  ruby-progressbar (1.11.0)
80
82
  ruby2_keywords (0.0.5)
81
- set (1.0.2)
83
+ set (1.0.3)
82
84
  sinatra (2.2.0)
83
85
  mustermann (~> 1.0)
84
86
  rack (~> 2.2)
data/README.md CHANGED
@@ -3,9 +3,7 @@
3
3
 
4
4
  [![Ruby](https://github.com/splaplapla/procon_bypass_man/actions/workflows/ruby.yml/badge.svg?branch=master)](https://github.com/splaplapla/procon_bypass_man/actions/workflows/ruby.yml)
5
5
 
6
- * Switchに繋いだプロコンを連射機にしたり、ボタンのリマップをしたり、マクロを実行できる、Raspberry Pi上で動かすツールです
7
- * 設定ファイルはrubyスクリプトで記述します
8
- * 特定のタイトルに特化した振る舞いにしたい時は各プラグインを使ってください
6
+ * Nintendo Switch Proコントローラーを連射機などにするRaspberry Pi上で動かすコンバータです
9
7
  * ドキュメントは [getting_started.md](docs/getting_started.md) にまとめています
10
8
  * https://pbm-cloud.herokuapp.com を使うと、webだけで運用が可能です
11
9
 
@@ -14,44 +12,17 @@
14
12
 
15
13
  https://user-images.githubusercontent.com/1664497/171327108-f12f56a5-fc36-48da-95a5-65e976553a20.mov
16
14
 
17
- <!--
18
- ![image](https://user-images.githubusercontent.com/1664497/123414210-942f6980-d5ee-11eb-8192-955bd9e37e0b.png)
19
- ```
20
- @startuml
21
- ProController \-\-> (PBM): ZR押しっぱなし
22
- Switch <-- (PBM): ZR連打
23
- @enduml
24
- ```
25
- -->
26
-
27
15
  ## 使うハードウェア
28
- * プロコン
16
+ * Nintendo Switch Proコントローラー
29
17
  * Switch本体とドック
30
- * Raspberry Pi4 Model B/4GB(Raspberry Pi OS (32-bit))
18
+ * Raspberry Pi4 (Raspberry Pi OS)
31
19
  * 他のシリーズは未確認です
32
- * zeroは非対応
33
20
  * データ通信が可能なUSBケーブル
34
21
 
35
22
  ## 使うソフトウェア
36
23
  * ruby 2.5 以上
37
24
 
38
- ## Usage
39
- * USBガジェットモードで起動するRaspberry Pi4を用意する
40
- * https://github.com/splaplapla/procon_bypass_man/blob/master/docs/setup_raspi.md
41
- * Raspberry Pi4 でprocon_bypass_manを実行するための準備
42
- * rubyのインストール
43
- * sudo apt-get install rbenv
44
- * git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
45
- * rbenv install 3.0.1
46
- * gem install pbmenv
47
- * sudo [pbmenv](https://github.com/splaplapla/pbmenv) install latest
48
- * Raspberry Pi4 でprocon_bypass_manを実行する
49
- * cd /usr/share/pbm/current
50
- * sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
51
- * 動いたのを確認したらserviceとして登録にするなどしてください
52
- * [serviceとして登録する方法](https://github.com/splaplapla/procon_bypass_man/tree/master/project_template#systemd%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
53
-
54
- ## Plugins
25
+ ## プラグイン
55
26
  * https://github.com/splaplapla/procon_bypass_man-splatoon2
56
27
 
57
28
  ## FAQ
@@ -109,6 +80,13 @@ sudo kill -USR2 `cat ./pbm_pid`
109
80
  * githubのreleaseを作成する
110
81
  -->
111
82
 
83
+ ## Raspberry Pi4のセットアップを代行します
84
+ * Raspberry Pi4を開発者である私の家に配送してくれれば、セットアップを代行します。セットアップが終わり次第送り返します
85
+ * 使い方に関しては、https://pbm-cloud.herokuapp.com ですべて完結するので、Linuxの知識は不要です
86
+ * 何か問題が起きた時はリモートログインでサポート可能です
87
+ * 希望者はDiscordの `kawagu#7684` にDMを送ってください
88
+ * お金はかかりません
89
+
112
90
  ## 開発を支援してくれる人を募集しています
113
91
  * https://jiikko.fanbox.cc/
114
92
  * procon_bypassの運営・開発・サーバー費用に充てさせていただきます。また、問い合わせに優先して対応します。
@@ -3,6 +3,7 @@
3
3
  * [はじめに](#はじめに)
4
4
  * [procon_bypass_manで解決したいこと](#procon_bypass_manで解決したいこと)
5
5
  * [procon_bypass_manでできること](#procon_bypass_manでできること)
6
+ * [セットアップを代行できます](#セットアップを代行できます)
6
7
  * [セットアップ](#セットアップ)
7
8
  * [ラズベリーパイのセットアップ](#ラズベリーパイのセットアップ)
8
9
  * [procon_bypass_manのインストール](#procon_bypass_manのインストール)
@@ -45,6 +46,13 @@
45
46
  * 入力表示
46
47
  * https://github.com/splaplapla/switch-procon-input-viewer
47
48
 
49
+ ## セットアップを代行できます
50
+ * Raspberry Pi4を開発者である私の家に配送してくれれば、セットアップを代行します。セットアップが終わり次第送り返します
51
+ * 使い方に関しては、https://pbm-cloud.herokuapp.com ですべて完結するので、Linuxの知識は不要です
52
+ * 何か問題が起きた時はリモートログインでサポート可能です
53
+ * 希望者はDiscordの `kawagu#7684` にDMを送ってください
54
+ * お金はかかりません
55
+
48
56
  ## セットアップ
49
57
  ### ラズベリーパイのセットアップ
50
58
 
@@ -0,0 +1,34 @@
1
+ # スプラトゥーン2: イカロール マクロの設定方法
2
+
3
+ * procon_bypass_man: 0.3.1以上が必要です
4
+ * このマクロは、右から上へ高速にスティックを入れることでイカロールを行います
5
+ * 後述する設定例では、左スティックを押し込むことでイカロールを発動してます
6
+
7
+ https://user-images.githubusercontent.com/1664497/193837089-1c56af8d-2c1b-436a-b2a7-89c083a408d7.mov
8
+
9
+
10
+ ## 設定例1
11
+ ```yaml
12
+ version: 1.0
13
+ setting: |-
14
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
15
+
16
+ layer :up do
17
+ open_macro :forward_ikarole, steps: [:forward_ikarole1], if_pressed: [:thumbl], force_neutral: []
18
+ end
19
+ ```
20
+
21
+ ## 設定例2
22
+ pluginとして登録してあるので、 `macro` を使っても同じことができます。
23
+
24
+ ```yaml
25
+ version: 1.0
26
+ setting: |-
27
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
28
+
29
+ install_macro_plugin(ProconBypassMan::Plugin::Splatoon2::Macro::ForwardIkarole)
30
+
31
+ layer :up do
32
+ macro ProconBypassMan::Plugin::Splatoon2::Macro::ForwardIkarole, if_pressed: [:thumbl], force_neutral: []
33
+ end
34
+ ```
data/docs/setup_raspi.md CHANGED
@@ -1,41 +1,38 @@
1
1
  https://github.com/splaplapla/procon_bypass_man/blob/master/docs/setup_raspi_by_mitamae.md に半自動化した手順があります
2
2
 
3
3
  # Raspberry Pi4のセットアップ手順
4
- * SDカードにRaspberry Pi OS (32-bit)を焼く
4
+ * SDカードにRaspberry Pi OS (32 or 64-bit)を焼く
5
5
  * SDカードをRaspberry Pi4本体に挿して起動する
6
6
  * ラズパイGUI
7
7
  * 無線LANに接続する
8
8
  * sshdを許可する
9
9
  * macからsshする
10
+ * sudo apt-get update
10
11
  * sudo apt-get dist-upgrade
11
- * hostnameを変える
12
- * sudo hostnamectl set-hostname raspizero
13
- * /etc/hosts に追記する
14
- * 仮想メモリを増やす(optional)
15
- * /etc/dphys-swapfile を CONF_SWAPSIZE=1024 にする
16
- * sudo /etc/init.d/dphys-swapfile restart && swapon -s
17
- * tailscale をインストールする(optional)
18
12
  * sudo apt-get install vim rbenv git -y
19
13
  * rbenvでrubyを入れる
20
14
  * git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
21
15
  * rbenv install 3.0.1
22
16
  * rbenv local 3.0.1
23
17
  * gem i bundler
24
- * sshkeyを作成する
25
- * github に鍵を登録する
26
- * ~/.ssh/authorized_keys に鍵を登録する
27
18
  * ガジェットモードで起動する
28
19
  * /boot/config.txtに、dtoverlay=dwc2を追記
29
20
  * echo "dwc2" | sudo tee -a /etc/modules
30
21
  * echo "libcomposite" | sudo tee -a /etc/modules
31
22
  * sudo cat /etc/modules
32
- * cd ~ && wget https://gist.githubusercontent.com/jiikko/3f9fb3194c0cc7685e31fbfcb5b5f9ff/raw/23ddee29d94350be80b79d290ac3c8ce8400bd88/add_procon_gadget.sh
33
- * chmod 755 ~/add_procon_gadget.sh
34
23
  * sudo reboot
35
- * sudo sh ~/add_procon_gadget.sh の実行に成功させる
36
24
  * cd ~ && mkdir -p src && cd ~/src && git clone https://github.com/jiikko/procon_bypass_man_sample && cd procon_bypass_man_sample
37
25
 
38
- おわり. 起動する時は都度 sudo ruby app.rb を実行する
26
+ おわりです.
27
+
28
+ 起動する時は下記を確認の上、`sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb` を実行してください。
29
+
30
+ * 「ラズパイとSwitch」と「ラズパイとプロコン」を **データ通信可能なケーブル** で接続する
31
+ * **Proコントローラーの有線通信** をONにする
32
+
33
+
34
+ ![image](https://user-images.githubusercontent.com/1664497/193258615-1da27049-6d1f-4bfc-af1d-2f894f9c610e.png)
35
+
39
36
 
40
37
  ## 参考
41
38
  * https://mtosak-tech.hatenablog.jp/entry/2020/08/22/114622
@@ -38,7 +38,6 @@ sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
38
38
  use_pbmenv: true
39
39
  session_id: s_c6f36422-c20f-4a04-a446-b4a235c2face
40
40
  device_id: d_8b0c90d8-90*************************
41
- bypass_mode: normal(5)
42
41
  ----
43
42
  ```
44
43
 
@@ -53,6 +53,7 @@ module ProconBypassMan
53
53
  end
54
54
 
55
55
  # @param [String, Class] プラグインのclass
56
+ # @param [Hash, NilClass] if_tilted_left_stick 非推奨
56
57
  def macro(name, if_pressed: nil, if_tilted_left_stick: nil, force_neutral: nil)
57
58
  case if_tilted_left_stick
58
59
  when Integer, String, Symbol, Array
@@ -21,7 +21,7 @@ module ProconBypassMan
21
21
  rescue SyntaxError
22
22
  fallback_setting_if_has_backup(current_setting_path: setting_path)
23
23
  raise ProconBypassMan::CouldNotLoadConfigError, "Rubyスクリプトのシンタックスエラーです"
24
- rescue NoMethodError
24
+ rescue NameError
25
25
  fallback_setting_if_has_backup(current_setting_path: setting_path)
26
26
  raise ProconBypassMan::CouldNotLoadConfigError, "Rubyスクリプトに未定義の定数・変数があります"
27
27
  rescue Psych::SyntaxError
@@ -52,6 +52,7 @@ module ProconBypassMan
52
52
  end
53
53
 
54
54
  def self.reload_setting
55
+ ProconBypassMan.ephemeral_config.reset!
55
56
  self.load(setting_path: ProconBypassMan::ButtonsSettingConfiguration.instance.setting_path)
56
57
  end
57
58
 
@@ -98,6 +98,17 @@ module ProconBypassMan
98
98
  @prefix_keys_for_changing_layer
99
99
  end
100
100
 
101
+ # @param [Symbol, String] setting_name
102
+ # @return [void]
103
+ def enable(setting_name)
104
+ case setting_name.to_sym
105
+ when :rumble_on_layer_change
106
+ ProconBypassMan.ephemeral_config.enable_rumble_on_layer_change = true
107
+ else
108
+ warn "存在しないenable(#{setting_name.to_sym})が呼び出されました。"
109
+ end
110
+ end
111
+
101
112
  def reset!
102
113
  @prefix_keys_for_changing_layer = []
103
114
  self.mode_plugins = {}
@@ -30,11 +30,6 @@ class ProconBypassMan::BypassCommand
30
30
  cycle_sleep = ProconBypassMan::CycleSleep.new(cycle_interval: 1, execution_cycle: ProconBypassMan.config.bypass_mode.gadget_to_procon_interval)
31
31
 
32
32
  t1 = Thread.new do
33
- if ProconBypassMan.config.bypass_mode.mode == ProconBypassMan::BypassMode::TYPE_AGGRESSIVE
34
- ProconBypassMan.logger.info "TYPE_AGGRESSIVEなのでThread1を終了します"
35
- next
36
- end
37
-
38
33
  bypass = ProconBypassMan::Bypass::SwitchToProcon.new(gadget: @gadget, procon: @procon)
39
34
  loop do
40
35
  break if $will_terminate_token
@@ -58,22 +53,32 @@ class ProconBypassMan::BypassCommand
58
53
  # シビア
59
54
  t2 = Thread.new do
60
55
  bypass = ProconBypassMan::Bypass::ProconToSwitch.new(gadget: @gadget, procon: @procon)
56
+ process = BlueGreenProcess.new(worker_instance: bypass, max_work: 200)
61
57
  loop do
62
58
  if $will_terminate_token
63
59
  if $will_terminate_token == WILL_TERMINATE_TOKEN::TERMINATE
64
60
  bypass.direct_connect_switch_via_bluetooth
65
61
  end
62
+ process.shutdown
66
63
  break
67
64
  end
68
65
 
69
- bypass.run
66
+ process.work
67
+
68
+ process_switching_time_before_work = BlueGreenProcess.performance.process_switching_time_before_work
69
+ if process_switching_time_before_work > 0.1
70
+ ProconBypassMan.logger.info("slow process_switching_time_before_work: #{process_switching_time_before_work}")
71
+ end
72
+
70
73
  rescue EOFError => e
71
74
  ProconBypassMan::SendErrorCommand.execute(error: "Proconが切断されました。終了処理を開始します. #{e.full_message}")
72
75
  Process.kill "TERM", Process.ppid
76
+ process.shutdown
73
77
  break
74
78
  rescue Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN => e
75
79
  ProconBypassMan::SendErrorCommand.execute(error: "Proconが切断されました。終了処理を開始します2. #{e.full_message}")
76
80
  Process.kill "TERM", Process.ppid
81
+ process.shutdown
77
82
  break
78
83
  end
79
84
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "procon_bypass_man/bypass/bypass_command"
2
4
 
3
5
  class ProconBypassMan::Bypass::ProconToSwitch
@@ -7,12 +9,13 @@ class ProconBypassMan::Bypass::ProconToSwitch
7
9
  class CouldNotReadFromProconError < StandardError; end
8
10
  class CouldNotWriteToSwitchError < StandardError; end
9
11
 
10
- define_callbacks :run
11
- set_callback :run, :after, :log_after_run
12
+ define_callbacks :work
13
+ set_callback :work, :after, :log_after_run
12
14
 
13
- register_callback_module(ProconBypassMan::ProconDisplay::BypassHook)
15
+ # マルチプロセス化したので一旦無効にする
16
+ # register_callback_module(ProconBypassMan::ProconDisplay::BypassHook)
14
17
 
15
- attr_accessor :gadget, :procon, :bypass_value, :procon_binary_queue
18
+ attr_accessor :gadget, :procon, :bypass_value
16
19
 
17
20
  def initialize(gadget: , procon: )
18
21
  self.gadget = gadget
@@ -21,20 +24,18 @@ class ProconBypassMan::Bypass::ProconToSwitch
21
24
 
22
25
  # @raise [Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN, Errno::ETIMEDOUT]
23
26
  # @return [void]
24
- def run
27
+ def work(*)
25
28
  ProconBypassMan::Procon::PerformanceMeasurement.measure do |measurement|
26
29
  self.bypass_value = ProconBypassMan::Bypass::BypassValue.new(nil)
27
30
 
28
- next(run_callbacks(:run) {
31
+ next(run_callbacks(:work) {
29
32
  next(false) if $will_terminate_token
30
33
 
31
34
  raw_output = nil
32
35
  measurement.record_read_time do
33
36
  begin
34
- ProconBypassMan::GC.stop_gc_in do
35
- return(false) if $will_terminate_token
36
- raw_output = self.procon.read_nonblock(64)
37
- end
37
+ return(false) if $will_terminate_token
38
+ raw_output = self.procon.read_nonblock(64)
38
39
  rescue IO::EAGAINWaitReadable
39
40
  sleep(0.002)
40
41
  retry
@@ -42,36 +43,43 @@ class ProconBypassMan::Bypass::ProconToSwitch
42
43
  return(false) if $will_terminate_token
43
44
  raise
44
45
  end
46
+
47
+ self.bypass_value.binary = ProconBypassMan::Domains::InboundProconBinary.new(binary: raw_output)
45
48
  end
46
49
 
47
- self.bypass_value.binary = ProconBypassMan::Domains::InboundProconBinary.new(binary: raw_output)
48
-
49
- result = ProconBypassMan::GC.stop_gc_in do
50
- result = measurement.record_write_time do
51
- begin
52
- ProconBypassMan::Retryable.retryable(tries: 5, on_no_retry: [Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN, Errno::ETIMEDOUT]) do
53
- begin
54
- # 終了処理を希望されているのでブロックを無視してメソッドを抜けてOK
55
- return(false) if $will_terminate_token # rubocop:disable Lint/NoReturnInBeginEndBlocks
56
- self.gadget.write_nonblock(
57
- ProconBypassMan::Processor.new(bypass_value.binary).process
58
- )
59
- next(true)
60
- rescue IO::EAGAINWaitReadable
61
- return(false) if $will_terminate_token # rubocop:disable Lint/NoReturnInBeginEndBlocks
62
- measurement.record_write_error
63
- raise CouldNotWriteToSwitchError
64
- rescue Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN, Errno::ETIMEDOUT => e
65
- return(false) if $will_terminate_token # rubocop:disable Lint/NoReturnInBeginEndBlocks
66
- raise
50
+ result = measurement.record_write_time do
51
+ begin
52
+ ProconBypassMan::Retryable.retryable(tries: 5, on_no_retry: [Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN, Errno::ETIMEDOUT]) do
53
+ begin
54
+ # 終了処理を希望されているのでブロックを無視してメソッドを抜けてOK
55
+ return(false) if $will_terminate_token # rubocop:disable Lint/NoReturnInBeginEndBlocks
56
+ binary = ::ProconBypassMan::Procon::Rumbler.monitor do
57
+ ProconBypassMan::Processor.new(bypass_value.binary).process
67
58
  end
59
+ self.gadget.write_nonblock(binary)
60
+
61
+ if ProconBypassMan.ephemeral_config.enable_rumble_on_layer_change && ProconBypassMan::Procon::Rumbler.must_rumble?
62
+ begin
63
+ self.procon.write_nonblock(ProconBypassMan::Procon::Rumbler.binary)
64
+ ProconBypassMan.logger.debug { ProconBypassMan::Procon::Rumbler.binary.unpack('H*').first }
65
+ rescue => e
66
+ ProconBypassMan::SendErrorCommand.execute(error: e)
67
+ end
68
+ end
69
+
70
+ next(true)
71
+ rescue IO::EAGAINWaitReadable
72
+ return(false) if $will_terminate_token # rubocop:disable Lint/NoReturnInBeginEndBlocks
73
+ measurement.record_write_error
74
+ raise CouldNotWriteToSwitchError
75
+ rescue Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN, Errno::ETIMEDOUT => e
76
+ return(false) if $will_terminate_token # rubocop:disable Lint/NoReturnInBeginEndBlocks
77
+ raise
68
78
  end
69
- rescue CouldNotWriteToSwitchError
70
- next(false)
71
79
  end
80
+ rescue CouldNotWriteToSwitchError
81
+ next(false)
72
82
  end
73
-
74
- next(result)
75
83
  end
76
84
 
77
85
  next(result)
@@ -94,14 +102,9 @@ class ProconBypassMan::Bypass::ProconToSwitch
94
102
  private
95
103
 
96
104
  def log_after_run
105
+ return unless ProconBypassMan.config.verbose_bypass_log
97
106
  return unless bypass_value.to_text
98
107
 
99
- if ProconBypassMan.config.verbose_bypass_log
100
- ProconBypassMan.logger.debug { "<<< #{bypass_value.to_text}" }
101
- else
102
- ProconBypassMan.cache.fetch key: 'bypass_log', expires_in: 1 do
103
- ProconBypassMan.logger.debug { "<<< #{bypass_value.to_text}" }
104
- end
105
- end
108
+ ProconBypassMan.logger.debug { "<<< #{bypass_value.to_text}" }
106
109
  end
107
110
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "procon_bypass_man/bypass/bypass_command"
2
4
 
3
5
  class ProconBypassMan::Bypass::SwitchToProcon
@@ -13,7 +13,6 @@ class ProconBypassMan::PrintBootMessageCommand
13
13
  @table[:use_pbmenv] = !(!!`which pbmenv`.empty?)
14
14
  @table[:session_id] = ProconBypassMan.session_id
15
15
  @table[:device_id] = ProconBypassMan.device_id
16
- @table[:bypass_mode] = ProconBypassMan.config.bypass_mode.to_s
17
16
  @table[:never_exit_accidentally] = ProconBypassMan.config.never_exit_accidentally
18
17
  @table[:uname] = `uname -a`.chomp
19
18
 
@@ -43,7 +42,6 @@ class ProconBypassMan::PrintBootMessageCommand
43
42
  use_pbmenv: #{@table[:use_pbmenv]}
44
43
  session_id: #{ProconBypassMan.session_id}
45
44
  device_id: #{ProconBypassMan.device_id.gsub(/.{25}$/, "*"*25)}
46
- bypass_mode: #{ProconBypassMan.config.bypass_mode}
47
45
  ----
48
46
  EOF
49
47
  end
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # app.rbから設定される値。プロセスを起動してから不変
1
4
  class ProconBypassMan::Configuration
2
5
  module ClassMethods
3
6
  def root
@@ -70,6 +73,7 @@ class ProconBypassMan::Configuration
70
73
  end
71
74
  end
72
75
 
76
+ # NOTE 不具合の原因は修正済みなので可変である必要は無くなった。削除したいが各端末内の設定ファイルに存在している場合があるのでしばらく残す
73
77
  def bypass_mode=(value)
74
78
  @bypass_mode = ProconBypassMan::BypassMode.new(
75
79
  mode: value[:mode],
@@ -5,17 +5,14 @@ class ProconBypassMan::DeviceConnection::ProconSettingOverrider
5
5
  SUB_COMMAND_VIBRATION = "48"
6
6
 
7
7
  SUB_COMMAND_ARG_HOME_LED_ON = "1FF0FF"
8
- SUB_COMMAND_ARG_VIBRATION_OFF = "00"
9
8
 
10
9
  ALL_SETTINGS = {
11
10
  home_led_on: [SUB_COMMAND_HOME_LED_ON, SUB_COMMAND_ARG_HOME_LED_ON],
12
- vibration_off: [SUB_COMMAND_VIBRATION, SUB_COMMAND_ARG_VIBRATION_OFF],
13
11
  }
14
12
 
15
13
  # TODO 自動生成する
16
14
  SPECIAL_SUB_COMMAND_ARGS = {
17
15
  SUB_COMMAND_HOME_LED_ON => SUB_COMMAND_ARG_HOME_LED_ON,
18
- SUB_COMMAND_VIBRATION => SUB_COMMAND_ARG_VIBRATION_OFF,
19
16
  }
20
17
 
21
18
  def initialize(procon: )
@@ -0,0 +1,9 @@
1
+
2
+ # setting.yamlから設定される値。設定ファイルを再読み込みするとすべて消える
3
+ class ProconBypassMan::EphemeralConfiguration
4
+ attr_accessor :enable_rumble_on_layer_change
5
+
6
+ def reset!
7
+ self.enable_rumble_on_layer_change = false
8
+ end
9
+ end
@@ -2,17 +2,17 @@ module ProconBypassMan
2
2
  module Plugin
3
3
  module Splatoon2
4
4
  module Macro
5
- module DaseiCancel
5
+ module ForwardIkarole
6
6
  def self.display_name
7
- :dasei_cancel
7
+ :forward_ikarole
8
8
  end
9
9
 
10
10
  def self.steps
11
- [:pressing_r_for_0_03sec, :pressing_r_and_pressing_zl_for_0_2sec].freeze
11
+ [:forward_ikarole1].freeze
12
12
  end
13
13
 
14
14
  def self.description
15
- '惰性キャンセル'
15
+ '前方にイカロールをします'
16
16
  end
17
17
  end
18
18
  end
@@ -4,7 +4,7 @@ require_relative "plugin/splatoon2/macro/jump_to_right_key"
4
4
  require_relative "plugin/splatoon2/macro/jump_to_up_key"
5
5
  require_relative "plugin/splatoon2/macro/jump_to_left_key"
6
6
  require_relative "plugin/splatoon2/macro/sokuwari_for_splash_bomb"
7
- require_relative "plugin/splatoon2/macro/dasei_cancel"
7
+ require_relative "plugin/splatoon2/macro/forward_ikarole"
8
8
  require_relative "plugin/splatoon2/macro/charge_tansan_bomb"
9
9
  require_relative "plugin/splatoon2/mode/guruguru"
10
10
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::Procon::AnalogStickManipulator
2
4
  attr_accessor :manipulated_abs_x, :manipulated_abs_y
3
5
 
@@ -18,11 +20,23 @@ class ProconBypassMan::Procon::AnalogStickManipulator
18
20
  self.manipulated_abs_x = 3400
19
21
  self.manipulated_abs_y = 1808
20
22
  end
21
- else
22
- warn "error stick manipulator"
23
- self.manipulated_abs_x = analog_stick.abs_x
24
- self.manipulated_abs_y = analog_stick.abs_y
23
+
24
+ return
25
+ end
26
+
27
+ if method =~ /tilt_left_stick_(completely)_to_(\d+)deg/
28
+ power_level = $1
29
+ arc_degree = $2.to_i
30
+ syahen = 1800 # 最大まで傾けた状態
31
+ neutral_position = ProconBypassMan::ButtonsSettingConfiguration.instance.neutral_position
32
+ self.manipulated_abs_x = (syahen * Math.cos(arc_degree * Math::PI / 180)).to_i - neutral_position.x
33
+ self.manipulated_abs_y = (syahen * Math.sin(arc_degree * Math::PI / 180)).to_i - neutral_position.y
34
+ return
25
35
  end
36
+
37
+ warn "error stick manipulator"
38
+ self.manipulated_abs_x = analog_stick.abs_x
39
+ self.manipulated_abs_y = analog_stick.abs_y
26
40
  end
27
41
 
28
42
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::Procon::LayerChanger
2
4
  # @param [ProconBypassMan::Domains::ProcessingProconBinary] binary
3
5
  def initialize(binary: )
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::Procon::Macro
2
4
  class BaseNestedStep
3
5
  def initialize(value)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::Procon::MacroBuilder
2
4
  class SubjectMerger
3
5
  def self.merge(subjects)
@@ -92,6 +94,17 @@ class ProconBypassMan::Procon::MacroBuilder
92
94
  ]
93
95
  end
94
96
 
97
+ # NOTE: マクロ構文で生成したいけど、スティックとボタン同時押しの構文が思いつかないので、ハードコードする
98
+ if /forward_ikarole1/ =~ step
99
+ # NOTE: 0degはx: 1, y: 0, 90degはx: 0, y: 1, 180degはx: -1, y: 0.
100
+ # NOTE: スティックを前方に倒している状態で270度回転させる
101
+ for_forward_ikarole_steps = [
102
+ [:tilt_left_stick_completely_to_0deg, :b],
103
+ [:tilt_left_stick_completely_to_90deg],
104
+ ]
105
+ return { steps: for_forward_ikarole_steps }
106
+ end
107
+
95
108
  if %r!^(pressing_|toggle_|shake_left_stick_)! =~ step && (subjects = step.scan(%r!pressing_[^_]+|shake_left_stick|toggle_[^_]+!)) && (match = step.match(%r!_for_([\d_]+)(sec)?\z!))
96
109
  if sec = match[1]
97
110
  return {
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::Procon::MacroRegistry
2
4
  PRESETS = {
3
5
  null: [],