procon_bypass_man 0.1.14 → 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -0
  3. data/.github/workflows/release.yml +33 -0
  4. data/CHANGELOG.md +15 -0
  5. data/Gemfile +1 -0
  6. data/Gemfile.lock +28 -7
  7. data/README.md +26 -3
  8. data/Steepfile +31 -17
  9. data/docs/setting/left-analogstick-cap.md +60 -0
  10. data/docs/setup_raspi.md +2 -0
  11. data/docs/setup_raspi.mitamae.rb +7 -8
  12. data/docs/setup_raspi_by_mitamae.md +37 -1
  13. data/lib/ext/em_pure_ruby.rb +25 -0
  14. data/lib/procon_bypass_man/background.rb +0 -1
  15. data/lib/procon_bypass_man/buttons_setting_configuration/layer.rb +35 -13
  16. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +1 -0
  17. data/lib/procon_bypass_man/buttons_setting_configuration/validator.rb +36 -0
  18. data/lib/procon_bypass_man/buttons_setting_configuration.rb +28 -13
  19. data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +6 -4
  20. data/lib/procon_bypass_man/bypass.rb +13 -6
  21. data/lib/procon_bypass_man/commands/print_boot_message_command.rb +50 -1
  22. data/lib/procon_bypass_man/commands/print_message_command.rb +8 -0
  23. data/lib/procon_bypass_man/commands/run_remote_pbm_action_dispatch_command.rb +3 -1
  24. data/lib/procon_bypass_man/commands/send_reload_config_event_command.rb +1 -2
  25. data/lib/procon_bypass_man/commands.rb +1 -0
  26. data/lib/procon_bypass_man/configuration.rb +32 -1
  27. data/lib/procon_bypass_man/domains/binary/base.rb +25 -0
  28. data/lib/procon_bypass_man/domains/binary/has_immutable_binary.rb +5 -0
  29. data/lib/procon_bypass_man/domains/binary/has_mutable_binary.rb +5 -0
  30. data/lib/procon_bypass_man/domains/binary/inbound_procon_binary.rb +9 -0
  31. data/lib/procon_bypass_man/domains/binary/processing_procon_binary.rb +66 -0
  32. data/lib/procon_bypass_man/domains.rb +11 -0
  33. data/lib/procon_bypass_man/plugin/splatoon2/macro/fast_return.rb +17 -0
  34. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_left_key.rb +17 -0
  35. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_right_key.rb +17 -0
  36. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_up_key.rb +17 -0
  37. data/lib/procon_bypass_man/plugin/splatoon2/mode/guruguru.rb +59 -0
  38. data/lib/procon_bypass_man/plugin/splatoon2/version.rb +9 -0
  39. data/lib/procon_bypass_man/plugins.rb +11 -0
  40. data/lib/procon_bypass_man/processor.rb +4 -5
  41. data/lib/procon_bypass_man/procon/button.rb +11 -0
  42. data/lib/procon_bypass_man/procon/button_collection.rb +9 -11
  43. data/lib/procon_bypass_man/procon/layer_changer.rb +3 -2
  44. data/lib/procon_bypass_man/procon/macro_registry.rb +8 -5
  45. data/lib/procon_bypass_man/procon/mode_registry.rb +4 -4
  46. data/lib/procon_bypass_man/procon/press_button_aware.rb +9 -7
  47. data/lib/procon_bypass_man/procon/user_operation.rb +46 -63
  48. data/lib/procon_bypass_man/procon/{analog_stick.rb → value_objects/analog_stick.rb} +3 -4
  49. data/lib/procon_bypass_man/procon/value_objects/procon_reader.rb +34 -0
  50. data/lib/procon_bypass_man/procon.rb +18 -16
  51. data/lib/procon_bypass_man/remote_pbm_action/change_pbm_version_action.rb +4 -0
  52. data/lib/procon_bypass_man/remote_pbm_action/{lib → commands}/update_remote_pbm_action_status_command.rb +0 -0
  53. data/lib/procon_bypass_man/remote_pbm_action/reboot_os_action.rb +4 -0
  54. data/lib/procon_bypass_man/remote_pbm_action/restore_pbm_setting.rb +28 -0
  55. data/lib/procon_bypass_man/remote_pbm_action/stop_pbm_action.rb +4 -0
  56. data/lib/procon_bypass_man/{value_objects → remote_pbm_action/value_objects}/remote_pbm_action_object.rb +0 -0
  57. data/lib/procon_bypass_man/remote_pbm_action.rb +3 -2
  58. data/lib/procon_bypass_man/runner.rb +4 -4
  59. data/lib/procon_bypass_man/scheduler.rb +0 -7
  60. data/lib/procon_bypass_man/support/compress_array.rb +5 -0
  61. data/lib/procon_bypass_man/support/http_client.rb +4 -0
  62. data/lib/procon_bypass_man/support/on_memory_cache.rb +3 -1
  63. data/lib/procon_bypass_man/support/report_http_client.rb +3 -3
  64. data/lib/procon_bypass_man/support/server_pool.rb +4 -0
  65. data/lib/procon_bypass_man/version.rb +1 -1
  66. data/lib/procon_bypass_man/websocket/pbm_job_client.rb +90 -0
  67. data/lib/procon_bypass_man.rb +50 -33
  68. data/procon_bypass_man.gemspec +2 -0
  69. data/project_template/README.md +10 -5
  70. data/project_template/app.rb +1 -1
  71. data/project_template/setting.yml +8 -8
  72. data/sig/main.rbs +226 -41
  73. data/sig/on_memory_cache.rbs +16 -0
  74. metadata +59 -20
  75. data/lib/procon_bypass_man/background/jobs/fetch_and_run_remote_pbm_action_job.rb +0 -29
  76. data/lib/procon_bypass_man/boot_message.rb +0 -48
  77. data/lib/procon_bypass_man/commands/run_local_shell_command.rb +0 -6
  78. data/lib/procon_bypass_man/procon_reader.rb +0 -31
  79. data/lib/procon_bypass_man/splatoon2/macro/fast_return.rb +0 -15
  80. data/lib/procon_bypass_man/splatoon2/macro/jump_to_left_key.rb +0 -15
  81. data/lib/procon_bypass_man/splatoon2/macro/jump_to_right_key.rb +0 -15
  82. data/lib/procon_bypass_man/splatoon2/macro/jump_to_up_key.rb +0 -15
  83. data/lib/procon_bypass_man/splatoon2/mode/guruguru.rb +0 -57
  84. data/lib/procon_bypass_man/splatoon2/version.rb +0 -7
  85. data/lib/procon_bypass_man/splatoon2.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 346ad7fa333241bf5464ac38fce07caec0e0a021def6e2d456b7dc49a1f70b0a
4
- data.tar.gz: 5f9f6d94706fd00c9ecc738f9626c5a2e6418039997f487f856d2298a6a9df1c
3
+ metadata.gz: 93bbba4d48bc92fc4f9882a5708d5947fde2e52fc9dbba3df2db6fe7530c52ec
4
+ data.tar.gz: d963b6553736bdf606f63588c4664ec19153e0c9824dc52293c4f0bf99bbaeb6
5
5
  SHA512:
6
- metadata.gz: 792586a96060eb9adb8e7c0cf31bd56663da6343fa753709158890d47aed1025e87f24f670d176dea543d71cf6de2c6e8bb200b3bf109981f99e0f73b8eaa932
7
- data.tar.gz: 8e82db2b88efb8d5752797eab1e203379d30edf6e71fcda3ff35bdba8e46e27923e5da313442be366c50e6c38b8a0583296a36e94c35f078d648fb18f59c2a0d
6
+ metadata.gz: f36218eabf2625618182d45969cb5dd796fa3a9284d1921ab7a923062315f5302e422b7fe49a8d67fbef2e25de4fbd7b6ee378a29fa7f9eb2738de1b406a8c72
7
+ data.tar.gz: fe700aa1c024c3ae45ed57698dcdf35d898032c5a11954ffcf9b70fdcd2e5254bd947f2cb5b5e62d495bfad5e338337c109dafe5dd5bf7f1a1e543bc96ff54f2
data/.circleci/config.yml CHANGED
@@ -42,6 +42,7 @@ build_jobs: &build_jobs
42
42
  - "2.7"
43
43
  - "3.0.1"
44
44
  - "3.0.2"
45
+ - "3.1.0"
45
46
  workflows:
46
47
  version: 2
47
48
  build:
@@ -0,0 +1,33 @@
1
+ name: Publish to RubyGems
2
+
3
+ on:
4
+ [workflow_dispatch]
5
+
6
+ jobs:
7
+ release:
8
+ runs-on: ubuntu-latest
9
+ permissions:
10
+ contents: write
11
+
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ with:
15
+ token: ${{ secrets.GITHUB_TOKEN }}
16
+ - name: Set up Ruby 3.0.1
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: 3.0.1
20
+ bundler-cache: true
21
+ - name: Publish to RubyGems
22
+ run: |
23
+ git config --local user.email "action@github.com"
24
+ git config --local user.name "GitHub Action"
25
+
26
+ mkdir -p $HOME/.gem
27
+ touch $HOME/.gem/credentials
28
+ chmod 0600 $HOME/.gem/credentials
29
+ printf -- "---\n:rubygems_api_key: ${RUBYGEMS_API_TOKEN}\n" > $HOME/.gem/credentials
30
+ bundle exec rake release
31
+ env:
32
+ RUBYGEMS_API_TOKEN: "${{secrets.RUBYGEMS_API_TOKEN}}"
33
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [0.1.17] - 2022-01
2
+ - procon_bypass_man_cloudに組み込むために、内部のデータ構造を変更しました
3
+ - 設定ファイルにmacroを直接打ち込めるようになりました
4
+ - ex) `open_macro :special_command, steps: [:x, :y, :up], if_pressed: [:y]`
5
+
6
+ ## [0.1.16.1] - 2022-01-22
7
+ - 初期状態ではinternal api(pbm-web)の通信を無効にしました
8
+
9
+ ## [0.1.16] - 2021-12-26
10
+ - websocket経由で外部サーバからの命令を受け取れるようになりました
11
+
12
+ ## [0.1.15] - 2021-12-08
13
+ - 外部サーバから設定ファイルのリストアができるようになりました
14
+ - splatoon2 pluginのネームスペースを変更しました
15
+
1
16
  ## [0.1.14] - 2021-12-02
2
17
  - 外部サーバからOSの再起動やprocon_bypass_manのバージョンアップができるようになりました
3
18
 
data/Gemfile CHANGED
@@ -11,6 +11,7 @@ gem "pry"
11
11
  gem "timecop"
12
12
  gem "rubocop", require: false
13
13
  gem "steep", require: false
14
+ gem 'typeprof', require: false
14
15
  gem 'rbs', require: false
15
16
  gem "sinatra", require: false
16
17
  gem "webrick", require: false
data/Gemfile.lock CHANGED
@@ -1,12 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.1.14)
4
+ procon_bypass_man (0.1.17)
5
+ action_cable_client
5
6
  pbmenv
7
+ sorted_set
6
8
 
7
9
  GEM
8
10
  remote: https://rubygems.org/
9
11
  specs:
12
+ action_cable_client (3.1.0)
13
+ websocket-eventmachine-client (>= 1.2.0)
10
14
  activesupport (6.1.4.1)
11
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
12
16
  i18n (>= 1.6, < 2)
@@ -17,6 +21,7 @@ GEM
17
21
  coderay (1.1.3)
18
22
  concurrent-ruby (1.1.9)
19
23
  diff-lcs (1.4.4)
24
+ eventmachine (1.2.7)
20
25
  ffi (1.15.4)
21
26
  i18n (1.8.11)
22
27
  concurrent-ruby (~> 1.0)
@@ -29,9 +34,9 @@ GEM
29
34
  mustermann (1.1.1)
30
35
  ruby2_keywords (~> 0.0.1)
31
36
  parallel (1.21.0)
32
- parser (3.0.2.0)
37
+ parser (3.0.3.2)
33
38
  ast (~> 2.4.1)
34
- pbmenv (0.1.5)
39
+ pbmenv (0.1.7)
35
40
  pry (0.14.1)
36
41
  coderay (~> 1.1)
37
42
  method_source (~> 1.0)
@@ -44,7 +49,8 @@ GEM
44
49
  rb-inotify (0.10.1)
45
50
  ffi (~> 1.0)
46
51
  rbs (1.7.1)
47
- regexp_parser (2.1.1)
52
+ rbtree (0.4.4)
53
+ regexp_parser (2.2.0)
48
54
  rexml (3.2.5)
49
55
  rspec (3.10.0)
50
56
  rspec-core (~> 3.10.0)
@@ -68,32 +74,46 @@ GEM
68
74
  rubocop-ast (>= 1.12.0, < 2.0)
69
75
  ruby-progressbar (~> 1.7)
70
76
  unicode-display_width (>= 1.4.0, < 3.0)
71
- rubocop-ast (1.13.0)
77
+ rubocop-ast (1.14.0)
72
78
  parser (>= 3.0.1.1)
73
79
  ruby-progressbar (1.11.0)
74
80
  ruby2_keywords (0.0.5)
81
+ set (1.0.2)
75
82
  sinatra (2.1.0)
76
83
  mustermann (~> 1.0)
77
84
  rack (~> 2.2)
78
85
  rack-protection (= 2.1.0)
79
86
  tilt (~> 2.0)
80
- steep (0.46.0)
87
+ sorted_set (1.0.3)
88
+ rbtree
89
+ set (~> 1.0)
90
+ steep (0.47.0)
81
91
  activesupport (>= 5.1)
82
92
  language_server-protocol (>= 3.15, < 4.0)
83
93
  listen (~> 3.0)
84
94
  parallel (>= 1.0.0)
85
95
  parser (>= 3.0)
86
96
  rainbow (>= 2.2.2, < 4.0)
87
- rbs (>= 1.2.0)
97
+ rbs (~> 1.7.0)
88
98
  terminal-table (>= 2, < 4)
89
99
  terminal-table (3.0.2)
90
100
  unicode-display_width (>= 1.1.1, < 3)
91
101
  tilt (2.0.10)
92
102
  timecop (0.9.4)
103
+ typeprof (0.20.4)
104
+ rbs (>= 1.6.2)
93
105
  tzinfo (2.0.4)
94
106
  concurrent-ruby (~> 1.0)
95
107
  unicode-display_width (2.1.0)
96
108
  webrick (1.7.0)
109
+ websocket (1.2.9)
110
+ websocket-eventmachine-base (1.2.0)
111
+ eventmachine (~> 1.0)
112
+ websocket (~> 1.0)
113
+ websocket-native (~> 1.0)
114
+ websocket-eventmachine-client (1.3.0)
115
+ websocket-eventmachine-base (~> 1.0)
116
+ websocket-native (1.0.0)
97
117
  zeitwerk (2.5.1)
98
118
 
99
119
  PLATFORMS
@@ -113,6 +133,7 @@ DEPENDENCIES
113
133
  sinatra
114
134
  steep
115
135
  timecop
136
+ typeprof
116
137
  webrick
117
138
 
118
139
  BUNDLED WITH
data/README.md CHANGED
@@ -28,12 +28,30 @@ Switch <-- (PBM): ZR連打
28
28
  ## Usage
29
29
  * USBガジェットモードで起動するRaspberry Pi4を用意する
30
30
  * https://github.com/splaplapla/procon_bypass_man/blob/master/docs/setup_raspi.md
31
- * Raspberry Pi4 で sudo pbmenv install latest && cd /usr/share/pbm/current && sudo ruby app.rb
31
+ * Raspberry Pi4 でprocon_bypass_manを実行するための準備
32
+ * rubyのインストール
33
+ * sudo apt-get install rbenv
34
+ * git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
35
+ * rbenv install 3.0.1
36
+ * sudo gem install pbmenv
37
+ * sudo [pbmenv](https://github.com/splaplapla/pbmenv) install latest
38
+ * Raspberry Pi4 でprocon_bypass_manを実行する
39
+ * cd /usr/share/pbm/current
40
+ * sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
32
41
  * 動いたのを確認したらserviceとして登録にするなどしてください
42
+ * [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)
33
43
 
34
44
  ## Plugins
35
45
  * https://github.com/splaplapla/procon_bypass_man-splatoon2
36
46
 
47
+ ## 関連ソフトウェア
48
+ * サーバソフトウェア(WIP)
49
+ * https://github.com/splaplapla/procon_bypass_man_cloud
50
+ * このサーバからOS自体の再起動、設定ファイルの変更、PBMのバージョンアップができます
51
+ * 自分でホストティングしてください
52
+ * pbmenv
53
+ * バージョンマネージャー
54
+
37
55
  ## FAQ
38
56
  * どうやって動かすの?
39
57
  * このツールはRaspberry Pi4をUSBガジェットモードで起動して有線でプロコンとSwitchに接続して使います
@@ -46,6 +64,8 @@ Switch <-- (PBM): ZR連打
46
64
  * マクロは特定のキーを順番に入れていく機能。キーの入力が終わったらマクロは終了する
47
65
  * レイヤーとは?
48
66
  * 自作キーボードみたいな感じでレイヤー毎に設定内容を記述して切り替えれる
67
+ * レイヤーを切り替える方法は?
68
+ * 設定ファイルに記述している `prefix_keys_for_changing_layer`の後ろにあるキーを同時押しながら、十字キーのどれかを押すことで任意のレイヤーに切り替わります
49
69
  * このツールでできることは?
50
70
  * キーリマップ, 連射, マクロ, 特定の同じ操作の繰り返し(mode)
51
71
  * リマップは1つのキーを別のキーに割り当てます
@@ -54,11 +74,14 @@ Switch <-- (PBM): ZR連打
54
74
  * 操作するdeviceファイルの所有者がrootだから
55
75
  * 市販されているサードパーティ製連射機との違いは?
56
76
  * サードパーティ製のコントローラーは、設定方法や形状が特殊で買い換えるたびに学習・設定コストが発生します。本ツールを使えば、設定内容はテキストで管理することができ、使い慣れたプロコンで同等のことができます。
77
+ * sshなしで運用は可能ですか?
78
+ * 後述するWEBアプリケーションを使えば、sshを使わずに運用が可能です
79
+ * https://github.com/splaplapla/procon_bypass_man_cloud
80
+ * 機能開発中ですが、使ってくれる人を探しているのでdiscordからお問合せください
57
81
 
58
82
  ## TODO
59
83
  * レコーディング機能(プロコンの入力をマクロとして登録ができる)
60
84
  * マクロにdelayを入れれるようにする
61
- * 設定ファイル マクロの引数に、ボタンを取れるようにする
62
85
 
63
86
  ## 開発系
64
87
  ### プロコンとの接続を維持したまま、現在の設定ファイルをPBMに反映する
@@ -83,6 +106,6 @@ sudo kill -USR2 `cat ./pbm_pid`
83
106
 
84
107
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
85
108
 
86
-
87
109
  ## Links
88
110
  * https://discord.gg/bEcRNKf4ep
111
+ * 質問などご意見をdiscordでも受け付けています
data/Steepfile CHANGED
@@ -1,15 +1,15 @@
1
1
  # D = Steep::Diagnostic
2
2
  #
3
3
  # target :lib do
4
- # signature "sig"
4
+ # signature 'sig'
5
5
  #
6
- # check "lib" # Directory name
7
- # check "Gemfile" # File name
8
- # check "app/models/**/*.rb" # Glob
9
- # # ignore "lib/templates/*.rb"
6
+ # check 'lib' # Directory name
7
+ # check 'Gemfile' # File name
8
+ # check 'app/models/**/*.rb' # Glob
9
+ # # ignore 'lib/templates/*.rb'
10
10
  #
11
- # # library "pathname", "set" # Standard libraries
12
- # # library "strong_json" # Gems
11
+ # # library 'pathname', 'set' # Standard libraries
12
+ # # library 'strong_json' # Gems
13
13
  #
14
14
  # # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
15
15
  # # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
@@ -19,21 +19,35 @@
19
19
  # end
20
20
 
21
21
  # target :test do
22
- # signature "sig", "sig-private"
22
+ # signature 'sig', 'sig-private'
23
23
  #
24
- # check "test"
24
+ # check 'test'
25
25
  #
26
- # # library "pathname", "set" # Standard libraries
26
+ # # library 'pathname', 'set' # Standard libraries
27
27
  # end
28
28
 
29
29
  target :lib do
30
- check "lib/procon_bypass_man/timer.rb"
31
- check "lib/procon_bypass_man/uptime.rb"
32
- check "lib/procon_bypass_man/configuration.rb"
30
+ check 'lib/procon_bypass_man/timer.rb'
31
+ check 'lib/procon_bypass_man/configuration.rb'
32
+ check 'lib/procon_bypass_man/processor'
33
+ check 'lib/procon_bypass_man/procon/macro_registry'
34
+ check 'lib/procon_bypass_man/procon/mode_registry'
35
+ check 'lib/procon_bypass_man/domains/*'
36
+ check 'lib/procon_bypass_man/domains'
37
+ check 'lib/procon_bypass_man/support/report_http_client'
38
+ check 'lib/procon_bypass_man/support/http_client'
39
+ check 'lib/procon_bypass_man/support/send_device_stats_http_client'
40
+ check 'lib/procon_bypass_man/support/on_memory_cache'
41
+ check 'lib/procon_bypass_man/support/server_pool'
42
+ check 'lib/procon_bypass_man/support/uptime.rb'
43
+ check 'lib/procon_bypass_man/support/safe_timeout'
44
+ check 'lib/procon_bypass_man/support/update_remote_pbm_action_status_http_client'
45
+ check 'lib/procon_bypass_man/support/compress_array'
33
46
 
34
- signature "sig"
47
+ signature 'sig'
35
48
 
36
- library "time"
37
- library "logger"
38
- library "monitor"
49
+ library 'time'
50
+ library 'logger'
51
+ library 'monitor'
52
+ library 'uri'
39
53
  end
@@ -0,0 +1,60 @@
1
+ # 左アナログスティック感度調整の設定方法
2
+ https://user-images.githubusercontent.com/1664497/150636857-f3d40900-2713-41b8-856a-279c200d9ae7.mp4
3
+
4
+ * procon_bypass_man: 0.1.9以上が必要です
5
+ * PBMには、左アナログスティックの入力の最大値を書き換える機能があります。それをsetting.ymlに書く方法を説明します
6
+ * これを使うと、特定のボタンを押している間は、スティックを完全に倒している状態で、スプラトゥーンでいうところの `スニーキング` で移動ができるようになります
7
+
8
+ ## 1. プロコンの左スティックのほぼニュートラルな状態の座標を記述する
9
+ * `set_neutral_position x, y`を使って、プロコンの左スティックのほぼニュートラルな状態の座標を記述します
10
+ * 完全にニュートラルな値を記述すると最速のスニーキングが出ないので微妙にずらします
11
+ * プロコンごとにニュートラルな状態の座標に個体差があって、最速のスニーキングを出すには本数値を調整する必要があります
12
+ * 実際に設定している座標の例
13
+ * `set_neutral_position 1906, 1886`
14
+ * `set_neutral_position 2100, 2000`
15
+
16
+ ## 2. 左アナログスティックの入力の最大値を設定する
17
+ * ニュートラルな状態の座標が決まったら、次はどのボタンを押したときに、どれくらいスティック感度を書き換えるか、を設定します
18
+ * 設定には `left_analog_stick_cap` を使います
19
+ * 実際にパラメータを記述した例を用いると `left_analog_stick_cap cap: 1100, if_pressed: [:zl, :a], force_neutral: :a` のようになります
20
+ * パラメータは3つあります
21
+ * `cap: 1100`
22
+ * こちらはニュートラル座標からの最大距離をどのくらいにするか、を決めます
23
+ * 指定したボタンが押されている間は、ニュートラル座標から1100までの範囲に「現在の座標」を書き換える、という設定になります
24
+ * スプラトゥーンのスニーキング用途であれば、1100固定で問題ありません
25
+ * `if_pressed: [:zl, :a]`
26
+ * こちらは zlボタン, aボタンが両方押されている状態の時に本設定が発動する、という設定になります。トリガーです
27
+ * つまり、zlとaを同時押ししている時に、左アナログスティックの入力を書き換えます
28
+ * `force_neutral: :a`
29
+ * こちらは、左アナログスティックの入力を書き換えている時は、「強制的にaボタンを押していない状態にする」という設定になります
30
+ * つまり、zlボタンとaボタンを同時押ししている時には、左アナログスティックの入力を書き換えて、aボタンは押していない状態になります
31
+ * どうしてこれが必要かというと、ゲームタイトルによるのですが、スプラトゥーンの場合は、ガチアサリ中に、保有しているアサリを投げないために必要になっています
32
+ * force_neutralはoptionalです
33
+
34
+ ## 3. 設定を反映させる
35
+ * 上記の記述を加えたsetting.ymlを起動中のprocon_bypass_manプロセスで読み込むには、プロセスにその旨を伝える必要があります
36
+ * ラズベリーパイを再起動して、プロセスを立ち上げ直す、でも目的は達成できますが、もっと簡単にsetting.ymlを再読み込みする必要があります
37
+ * 書き換えたsetting.ymlを、起動中のprocon_bypass_manプロセスへ即時反映するには、procon_bypass_manプロセスを動かしたまま、別のshellから 以下をを実行してください
38
+ * setting.ymlのシンタックスが正しければ、switchとの接続が継続したままsetting.ymlの内容を読み込んでいるはずです
39
+
40
+ ```shell
41
+ sudo kill -USR2 `cat ./pbm_pid`
42
+ ```
43
+
44
+ ## まとめ
45
+ * スティックの中央値を設定します
46
+ * スプラトゥーンでの最速スニーキングを出すには、set_neutral_positionの値を変更してください
47
+ * 発動するボタンを設定します
48
+ * setting.ymlを再読み込みします
49
+
50
+ ## 設定例
51
+ ```yaml
52
+ version: 1.0
53
+ setting: |-
54
+ prefix_keys_for_changing_layer [:zr, :zl, :l]
55
+ set_neutral_position 2100, 2000
56
+
57
+ layer :up, mode: :manual do
58
+ left_analog_stick_cap cap: 1100, if_pressed: [:zl, :a], force_neutral: :a
59
+ end
60
+ ```
data/docs/setup_raspi.md CHANGED
@@ -1,3 +1,5 @@
1
+ https://github.com/splaplapla/procon_bypass_man/blob/master/docs/setup_raspi_by_mitamae.md に半自動化した手順があります
2
+
1
3
  # Raspberry Pi4のセットアップ手順
2
4
  * SDカードにRaspberry Pi OS (32-bit)を焼く
3
5
  * SDカードをRaspberry Pi4本体に挿して起動する
@@ -1,6 +1,6 @@
1
1
  run_command "apt-get update"
2
2
 
3
- package 'ruby' do
3
+ package 'rbenv' do
4
4
  action :install
5
5
  end
6
6
 
@@ -41,16 +41,15 @@ execute "Initialize PBM" do
41
41
  SHELL
42
42
  end
43
43
 
44
- # rbenv
45
- execute "Install rbenv" do
46
- not_if "which rbenv"
47
- command "git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build"
48
- end
49
-
50
44
  # ruby
51
45
  execute "Install ruby" do
46
+ user "pi"
52
47
  not_if "rbenv versions | grep 3.0.1"
53
- command "rbenv install 3.0.1"
48
+ command <<~EOH
49
+ mkdir -p "$(rbenv root)"/plugins
50
+ git clone https://github.com/rbenv/ruby-build.git --depth 1 "$(rbenv root)"/plugins/ruby-build
51
+ rbenv install 3.0.1
52
+ EOH
54
53
  end
55
54
 
56
55
  run_command 'sudo systemctl disable triggerhappy.socket'
@@ -1,9 +1,11 @@
1
+ セットアップ手順を半自動化にしました
2
+
1
3
  # Raspberry Pi4のセットアップ手順 With mitamae
2
4
  * SDカードにRaspberry Pi OS lite (32-bit)を焼く
3
5
  * sshをできる状態で焼いておく
4
6
  * SDカードをRaspberry Pi4本体に挿して起動する
5
7
  * sshする
6
- * curl -L https://github.com/itamae-kitchen/mitamae/releases/latest/download/mitamae-armhf-linux.tar.gz | tar xvz
8
+ * wget -O - "https://github.com/itamae-kitchen/mitamae/releases/latest/download/mitamae-armhf-linux.tar.gz" | tar xvz
7
9
  * wget https://raw.githubusercontent.com/splaplapla/procon_bypass_man/master/docs/setup_raspi.mitamae.rb -O setup_raspi.mitamae.rb
8
10
  * sudo ./mitamae-armhf-linux local setup_raspi.mitamae.rb -l debug
9
11
  * sudo reboot
@@ -12,3 +14,37 @@
12
14
  * PCとRaspberry Pi4を接続し、プロコンとして認識していることを確認する
13
15
  * sudo gem i pbmenv
14
16
  * sudo pbmenv install latest
17
+
18
+ ## 上記手順の動作確認方法
19
+ * 使えそうなイメージ
20
+ * navikey/raspbian-bullseye
21
+ * balenalib/raspberry-pi
22
+
23
+ ```shell
24
+ docker run -it --rm --name my-running-app2 navikey/raspbian-bullseye bash
25
+ ```
26
+
27
+ ### 準備
28
+ * docker runするとrootなのでpiでログインする
29
+
30
+ ```shell
31
+ useradd -m --uid 1000 --groups sudo pi
32
+ echo pi:pi | chpasswd
33
+ su pi
34
+ cd ~ && sudo ls
35
+ ```
36
+
37
+ ### mitamaeスクリプトを実行する
38
+
39
+ ```
40
+ wget -O - "https://github.com/itamae-kitchen/mitamae/releases/latest/download/mitamae-armhf-linux.tar.gz" | tar xvz
41
+ wget https://raw.githubusercontent.com/splaplapla/procon_bypass_man/master/docs/setup_raspi.mitamae.rb -O setup_raspi.mitamae.rb
42
+ sudo ./mitamae-armhf-linux local setup_raspi.mitamae.rb -l debug
43
+ ```
44
+
45
+ 実行に成功したら以下を確認する
46
+
47
+ * /home/pi/.rbenv/verions に ruby3.0.1がインストールしていること
48
+ * /etc/modules に指定の文字列があること
49
+ * /boot/config.txt に指定の文字列があること
50
+ * /usr/share/pbm/shared/add_procon_gadget.sh が存在していること
@@ -0,0 +1,25 @@
1
+ # https://github.com/eventmachine/eventmachine/pull/929 is not released yet.
2
+ # i will delete this patch if released.
3
+ module EventMachine
4
+ # @private
5
+ class Reactor
6
+ def run_timers
7
+ timers_to_delete = []
8
+ @timers.each {|t|
9
+ if t.first <= @current_loop_time
10
+ #@timers.delete t
11
+ timers_to_delete << t
12
+ EventMachine::event_callback "", TimerFired, t.last
13
+ else
14
+ break
15
+ end
16
+ }
17
+ timers_to_delete.map{|c| @timers.delete c}
18
+ timers_to_delete = nil
19
+ #while @timers.length > 0 and @timers.first.first <= now
20
+ # t = @timers.shift
21
+ # EventMachine::event_callback "", TimerFired, t.last
22
+ #end
23
+ end
24
+ end
25
+ end
@@ -10,5 +10,4 @@ require "procon_bypass_man/background/jobs/report_reload_config_job"
10
10
  require "procon_bypass_man/background/jobs/report_load_config_job"
11
11
  require "procon_bypass_man/background/jobs/report_error_job"
12
12
  require "procon_bypass_man/background/jobs/report_pressed_buttons_job"
13
- require "procon_bypass_man/background/jobs/fetch_and_run_remote_pbm_action_job"
14
13
  require "procon_bypass_man/background/jobs/sync_device_stats_job"
@@ -8,9 +8,8 @@ module ProconBypassMan
8
8
  self.flips = {}
9
9
  self.macros = {}
10
10
  self.remaps = {}
11
- self.left_analog_stick_caps = {}
11
+ self.left_analog_stick_caps = []
12
12
  self.disables = []
13
- instance_eval(&block) if block_given?
14
13
  end
15
14
 
16
15
  # @param [Symbol] button
@@ -50,19 +49,22 @@ module ProconBypassMan
50
49
  end
51
50
  hash[:flip_interval] = interval
52
51
  end
53
- if self.flips[button]
54
- raise "#{button}への設定をすでに割り当て済みです"
55
- else
56
- self.flips[button] = hash
57
- end
52
+
53
+ self.flips[button] = hash
58
54
  end
59
55
 
56
+ # @param [String, Class] プラグインのclass
60
57
  def macro(name, if_pressed: )
61
- if name.respond_to?(:name)
62
- macro_name = name.name.to_sym
63
- else
64
- macro_name = name
65
- end
58
+ macro_name = name.to_s.to_sym
59
+ self.macros[macro_name] = { if_pressed: if_pressed }
60
+ end
61
+
62
+ # 設定ファイルに直接マクロを打ち込める
63
+ # @param [String, Class] macroの識別子
64
+ # @paramh[Array<Symbol>] macroの本体. ボタンの配列
65
+ def open_macro(name, steps: , if_pressed: )
66
+ macro_name = name || "OpenMacro-#{steps.join}".to_sym
67
+ ProconBypassMan::Procon::MacroRegistry.install_plugin(macro_name, steps: steps)
66
68
  self.macros[macro_name] = { if_pressed: if_pressed }
67
69
  end
68
70
 
@@ -92,6 +94,10 @@ module ProconBypassMan
92
94
  raise "not support value"
93
95
  end
94
96
 
97
+ if if_pressed
98
+ hash[:if_pressed] = if_pressed
99
+ end
100
+
95
101
  case force_neutral
96
102
  when TrueClass
97
103
  raise "ボタンを渡してください"
@@ -105,7 +111,7 @@ module ProconBypassMan
105
111
  raise "not support value"
106
112
  end
107
113
 
108
- left_analog_stick_caps[if_pressed] = hash
114
+ left_analog_stick_caps << hash
109
115
  end
110
116
 
111
117
  def disable(button)
@@ -127,6 +133,22 @@ module ProconBypassMan
127
133
  def flip_buttons
128
134
  flips
129
135
  end
136
+
137
+ # @return [String]
138
+ def to_json(*)
139
+ to_hash.to_json
140
+ end
141
+
142
+ # @return [Hash]
143
+ def to_hash
144
+ { mode: mode,
145
+ flips: flips,
146
+ macros: macros,
147
+ remaps: remaps,
148
+ disables: disables,
149
+ left_analog_stick_caps: left_analog_stick_caps,
150
+ }
151
+ end
130
152
  end
131
153
  end
132
154
  end
@@ -3,6 +3,7 @@ module ProconBypassMan
3
3
  module Loader
4
4
  require 'digest/md5'
5
5
 
6
+ # @return [ProconBypassMan::ButtonsSettingConfiguration]
6
7
  def self.load(setting_path: )
7
8
  ProconBypassMan::ButtonsSettingConfiguration.switch_new_context(:validation) do |new_instance|
8
9
  yaml = YAML.load_file(setting_path) or raise "読み込みに失敗しました"
@@ -2,6 +2,8 @@ module ProconBypassMan
2
2
  class ButtonsSettingConfiguration
3
3
  class Validator
4
4
  def initialize(config)
5
+ @macro_plugins = config.macro_plugins
6
+ @mode_plugins = config.mode_plugins
5
7
  @layers = config.layers
6
8
  @prefix_keys = config.prefix_keys
7
9
  end
@@ -14,6 +16,8 @@ module ProconBypassMan
14
16
  validate_config_of_button_lonely
15
17
  validate_verify_button_existence
16
18
  validate_flip_and_remap_are_hate_each_other
19
+ validate_verify_mode_plugins
20
+ validate_verify_macro_plugins
17
21
 
18
22
  @errors.empty?
19
23
  end
@@ -86,6 +90,38 @@ module ProconBypassMan
86
90
  end
87
91
  end
88
92
  end
93
+
94
+ def validate_verify_mode_plugins
95
+ @mode_plugins.each do |key, mode|
96
+ begin
97
+ Module.const_get(key.to_s)
98
+ rescue NameError
99
+ next
100
+ end
101
+
102
+ if(const = Module.const_get(key.to_s))
103
+ if not const.respond_to?(:binaries) && mode.call
104
+ @errors[:mode] << "モード #{key}を読み込めませんでした。"
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ def validate_verify_macro_plugins
111
+ @macro_plugins.each do |key, macro|
112
+ begin
113
+ Module.const_get(key.to_s)
114
+ rescue NameError
115
+ next
116
+ end
117
+
118
+ if(const = Module.const_get(key.to_s))
119
+ if not const.respond_to?(:steps) && macro.call
120
+ @errors[:macro] << "マクロ #{key}を読み込めませんでした。"
121
+ end
122
+ end
123
+ end
124
+ end
89
125
  end
90
126
  end
91
127
  end