procon_bypass_man 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +3 -2
- data/.github/workflows/ruby.yml +5 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +7 -1
- data/Gemfile +4 -0
- data/Gemfile.lock +52 -2
- data/README.md +11 -0
- data/Steepfile +39 -0
- data/bin/report_receive_server.rb +11 -0
- data/docs/setup_raspi.mitamae.rb +12 -0
- data/lib/procon_bypass_man/analog_stick_position.rb +14 -0
- data/lib/procon_bypass_man/boot_message.rb +40 -0
- data/lib/procon_bypass_man/bypass.rb +20 -7
- data/lib/procon_bypass_man/configuration/layer.rb +33 -3
- data/lib/procon_bypass_man/configuration.rb +22 -8
- data/lib/procon_bypass_man/device_connector.rb +10 -27
- data/lib/procon_bypass_man/error_reporter.rb +44 -0
- data/lib/procon_bypass_man/io_monitor.rb +7 -4
- data/lib/procon_bypass_man/on_memory_cache.rb +34 -0
- data/lib/procon_bypass_man/procon/analog_stick_cap.rb +88 -0
- data/lib/procon_bypass_man/procon/button_collection.rb +14 -6
- data/lib/procon_bypass_man/procon/debug_dumper.rb +17 -0
- data/lib/procon_bypass_man/procon/mode_registry.rb +2 -2
- data/lib/procon_bypass_man/procon/press_button_aware.rb +13 -0
- data/lib/procon_bypass_man/procon/pressed_button_helper.rb +0 -10
- data/lib/procon_bypass_man/procon/user_operation.rb +10 -3
- data/lib/procon_bypass_man/procon.rb +15 -1
- data/lib/procon_bypass_man/reporter.rb +42 -0
- data/lib/procon_bypass_man/runner.rb +34 -46
- data/lib/procon_bypass_man/uptime.rb +1 -1
- data/lib/procon_bypass_man/version.rb +1 -1
- data/lib/procon_bypass_man.rb +43 -2
- data/project_template/app.rb +3 -1
- data/sig/README.rb +4 -0
- data/sig/main.rbs +467 -0
- metadata +15 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e4ad788ed57ca3bac1d4d17b1648285c8bc8d89d23a3c0a4ca4d5aaa58e4dfd
|
4
|
+
data.tar.gz: 512a1f754cf255c6692ab597c7997d6bad3f3004c2f1203a1ce6adaec603e655
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a059a91051aee0fa59beb62aa7bd952b1c8db15a75d66c47a66fdbda96a60cd9285094524e1d3c619ec215fa47dc5f9ee44e4dd7524f6c2bd60a4d0dfcf25e3
|
7
|
+
data.tar.gz: 9748ad5293f1e3cc902d9b74bbb40997d0c9588e43e78ab4299eb4ddbb9bfd030a7f3bf717d58a3207ac51e348cc090b1a726d7f63780d705807e04db7d9201d
|
data/.circleci/config.yml
CHANGED
@@ -32,15 +32,16 @@ jobs:
|
|
32
32
|
- run: bundle install --jobs 4
|
33
33
|
- run: bundle exec rubocop
|
34
34
|
- run: bundle exec rspec
|
35
|
+
- run: bundle exec steep check
|
35
36
|
|
36
37
|
build_jobs: &build_jobs
|
37
38
|
- rspec:
|
38
39
|
matrix:
|
39
40
|
parameters:
|
40
41
|
version:
|
41
|
-
- "2.5"
|
42
42
|
- "2.7"
|
43
|
-
- "3.0"
|
43
|
+
- "3.0.1"
|
44
|
+
- "3.0.2"
|
44
45
|
workflows:
|
45
46
|
version: 2
|
46
47
|
build:
|
data/.github/workflows/ruby.yml
CHANGED
@@ -16,7 +16,7 @@ jobs:
|
|
16
16
|
runs-on: ubuntu-latest
|
17
17
|
strategy:
|
18
18
|
matrix:
|
19
|
-
ruby-version: ['2.
|
19
|
+
ruby-version: ['2.7', '3.0.1']
|
20
20
|
|
21
21
|
steps:
|
22
22
|
- uses: actions/checkout@v2
|
@@ -24,10 +24,11 @@ jobs:
|
|
24
24
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
25
25
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
26
26
|
# uses: ruby/setup-ruby@v1
|
27
|
-
uses: ruby/setup-ruby@
|
27
|
+
uses: ruby/setup-ruby@v1
|
28
28
|
with:
|
29
29
|
ruby-version: ${{ matrix.ruby-version }}
|
30
30
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
31
31
|
- name: Run tests
|
32
|
-
run:
|
33
|
-
|
32
|
+
run: |-
|
33
|
+
bundle exec rake
|
34
|
+
bundle exec steep check
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.
|
1
|
+
3.0.2
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
|
+
## [0.1.9] - 2021-10-20
|
2
|
+
- 左スティックを傾けた時に設定した最大値内に丸めることができるようになりました
|
3
|
+
- 関連メソッド: set_neutral_position, left_analog_stick_cap
|
4
|
+
- 数時間に一度起きる、数秒間入力が通らなくなる問題の改善
|
5
|
+
|
1
6
|
## [0.1.8] - 2021-09-19
|
2
|
-
-
|
7
|
+
- 使える場合、GC.auto_compactを有効にしました
|
8
|
+
- 起動ログにuptimeからの経過時間を表示しました
|
3
9
|
|
4
10
|
## [0.1.7] - 2021-09-11
|
5
11
|
- Support pbmenv
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,23 +1,47 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
procon_bypass_man (0.1.
|
4
|
+
procon_bypass_man (0.1.9)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
+
activesupport (6.1.4.1)
|
10
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
11
|
+
i18n (>= 1.6, < 2)
|
12
|
+
minitest (>= 5.1)
|
13
|
+
tzinfo (~> 2.0)
|
14
|
+
zeitwerk (~> 2.3)
|
9
15
|
ast (2.4.2)
|
10
16
|
coderay (1.1.3)
|
17
|
+
concurrent-ruby (1.1.9)
|
11
18
|
diff-lcs (1.4.4)
|
19
|
+
ffi (1.15.4)
|
20
|
+
i18n (1.8.10)
|
21
|
+
concurrent-ruby (~> 1.0)
|
22
|
+
language_server-protocol (3.16.0.3)
|
23
|
+
listen (3.7.0)
|
24
|
+
rb-fsevent (~> 0.10, >= 0.10.3)
|
25
|
+
rb-inotify (~> 0.9, >= 0.9.10)
|
12
26
|
method_source (1.0.0)
|
27
|
+
minitest (5.14.4)
|
28
|
+
mustermann (1.1.1)
|
29
|
+
ruby2_keywords (~> 0.0.1)
|
13
30
|
parallel (1.20.1)
|
14
31
|
parser (3.0.2.0)
|
15
32
|
ast (~> 2.4.1)
|
16
33
|
pry (0.14.1)
|
17
34
|
coderay (~> 1.1)
|
18
35
|
method_source (~> 1.0)
|
36
|
+
rack (2.2.3)
|
37
|
+
rack-protection (2.1.0)
|
38
|
+
rack
|
19
39
|
rainbow (3.0.0)
|
20
40
|
rake (13.0.6)
|
41
|
+
rb-fsevent (0.11.0)
|
42
|
+
rb-inotify (0.10.1)
|
43
|
+
ffi (~> 1.0)
|
44
|
+
rbs (1.6.2)
|
21
45
|
regexp_parser (2.1.1)
|
22
46
|
rexml (3.2.5)
|
23
47
|
rspec (3.10.0)
|
@@ -45,8 +69,30 @@ GEM
|
|
45
69
|
rubocop-ast (1.11.0)
|
46
70
|
parser (>= 3.0.1.1)
|
47
71
|
ruby-progressbar (1.11.0)
|
72
|
+
ruby2_keywords (0.0.5)
|
73
|
+
sinatra (2.1.0)
|
74
|
+
mustermann (~> 1.0)
|
75
|
+
rack (~> 2.2)
|
76
|
+
rack-protection (= 2.1.0)
|
77
|
+
tilt (~> 2.0)
|
78
|
+
steep (0.46.0)
|
79
|
+
activesupport (>= 5.1)
|
80
|
+
language_server-protocol (>= 3.15, < 4.0)
|
81
|
+
listen (~> 3.0)
|
82
|
+
parallel (>= 1.0.0)
|
83
|
+
parser (>= 3.0)
|
84
|
+
rainbow (>= 2.2.2, < 4.0)
|
85
|
+
rbs (>= 1.2.0)
|
86
|
+
terminal-table (>= 2, < 4)
|
87
|
+
terminal-table (3.0.2)
|
88
|
+
unicode-display_width (>= 1.1.1, < 3)
|
89
|
+
tilt (2.0.10)
|
48
90
|
timecop (0.9.4)
|
91
|
+
tzinfo (2.0.4)
|
92
|
+
concurrent-ruby (~> 1.0)
|
49
93
|
unicode-display_width (2.0.0)
|
94
|
+
webrick (1.7.0)
|
95
|
+
zeitwerk (2.4.2)
|
50
96
|
|
51
97
|
PLATFORMS
|
52
98
|
arm-linux
|
@@ -58,9 +104,13 @@ DEPENDENCIES
|
|
58
104
|
procon_bypass_man!
|
59
105
|
pry
|
60
106
|
rake (~> 13.0)
|
107
|
+
rbs
|
61
108
|
rspec
|
62
109
|
rubocop
|
110
|
+
sinatra
|
111
|
+
steep
|
63
112
|
timecop
|
113
|
+
webrick
|
64
114
|
|
65
115
|
BUNDLED WITH
|
66
|
-
2.2.
|
116
|
+
2.2.22
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# ProconBypassMan
|
2
|
+
[](https://github.com/splaplapla/procon_bypass_man/actions/workflows/ruby.yml)
|
3
|
+
|
2
4
|
* Switchに繋いだプロコンを連射機にしたり、キーのリマップをしたり、マクロを実行できるツールです
|
3
5
|
* 設定ファイルはrubyスクリプトで記述します
|
4
6
|
* 特定のタイトルに特化した振る舞いにしたい時は各プラグインを使ってください
|
@@ -70,6 +72,15 @@ end
|
|
70
72
|
sudo kill -USR2 `cat ./pbm_pid`
|
71
73
|
```
|
72
74
|
|
75
|
+
### 起動ログをサーバに送信する
|
76
|
+
* `ProconBypassMan.api_server = "http://.."` を設定すると、 `POST /api/reports` に対して起動ログを送信するようになります
|
77
|
+
|
78
|
+
### 開発環境でログの送信を確認する方法
|
79
|
+
* `bundle exec bin/report_receive_server.rb`
|
80
|
+
* `bin/console`
|
81
|
+
* `ProconBypassMan.api_server = "http://localhost:4567"`
|
82
|
+
* `message = ProconBypassMan::BootMessage.new; ProconBypassMan::Reporter.report(body: message.to_hash)"`
|
83
|
+
|
73
84
|
### リリース手順
|
74
85
|
* project_template/app.rb, lib/procon_bypass_man/version.rb のバージョンをあげる
|
75
86
|
* be rake release
|
data/Steepfile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# D = Steep::Diagnostic
|
2
|
+
#
|
3
|
+
# target :lib do
|
4
|
+
# signature "sig"
|
5
|
+
#
|
6
|
+
# check "lib" # Directory name
|
7
|
+
# check "Gemfile" # File name
|
8
|
+
# check "app/models/**/*.rb" # Glob
|
9
|
+
# # ignore "lib/templates/*.rb"
|
10
|
+
#
|
11
|
+
# # library "pathname", "set" # Standard libraries
|
12
|
+
# # library "strong_json" # Gems
|
13
|
+
#
|
14
|
+
# # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
|
15
|
+
# # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
|
16
|
+
# # configure_code_diagnostics do |hash| # You can setup everything yourself
|
17
|
+
# # hash[D::Ruby::NoMethod] = :information
|
18
|
+
# # end
|
19
|
+
# end
|
20
|
+
|
21
|
+
# target :test do
|
22
|
+
# signature "sig", "sig-private"
|
23
|
+
#
|
24
|
+
# check "test"
|
25
|
+
#
|
26
|
+
# # library "pathname", "set" # Standard libraries
|
27
|
+
# end
|
28
|
+
|
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"
|
33
|
+
|
34
|
+
signature "sig"
|
35
|
+
|
36
|
+
library "time"
|
37
|
+
library "logger"
|
38
|
+
library "monitor"
|
39
|
+
end
|
data/docs/setup_raspi.mitamae.rb
CHANGED
@@ -41,6 +41,18 @@ 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
|
+
# ruby
|
51
|
+
execute "Install ruby" do
|
52
|
+
not_if "rbenv versions | grep 3.0.1"
|
53
|
+
command "rbenv install 3.0.1"
|
54
|
+
end
|
55
|
+
|
44
56
|
run_command 'sudo systemctl disable triggerhappy.socket'
|
45
57
|
run_command 'sudo systemctl disable triggerhappy.service'
|
46
58
|
run_command 'sudo systemctl disable bluetooth'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class ProconBypassMan::BootMessage
|
2
|
+
def initialize
|
3
|
+
@table = {}
|
4
|
+
@table[:ruby_version] = RUBY_VERSION
|
5
|
+
@table[:pbm_version] = ProconBypassMan::VERSION
|
6
|
+
@table[:pid] = $$
|
7
|
+
@table[:root_path] = ProconBypassMan.root
|
8
|
+
@table[:pid_path] = ProconBypassMan.pid_path
|
9
|
+
@table[:setting_path] = ProconBypassMan::Configuration.instance.setting_path
|
10
|
+
@table[:uptime_from_boot] = ProconBypassMan::Uptime.from_boot
|
11
|
+
|
12
|
+
build_version = `git rev-parse --short HEAD`.chomp
|
13
|
+
if build_version.empty?
|
14
|
+
@table[:build_version] = 'release version'
|
15
|
+
else
|
16
|
+
@table[:build_version] = build_version
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [String]
|
21
|
+
def to_s
|
22
|
+
booted_message = <<~EOF
|
23
|
+
----
|
24
|
+
RUBY_VERSION: #{@table[:ruby_version]}
|
25
|
+
ProconBypassMan: #{@table[:pbm_version]}
|
26
|
+
pid: #{@table[:pid]}
|
27
|
+
root: #{@table[:root_path]}
|
28
|
+
pid_path: #{@table[:pid_path]}
|
29
|
+
setting_path: #{@table[:setting_path]}
|
30
|
+
uptime from boot: #{@table[:uptime_from_boot]} sec
|
31
|
+
build version: #{@table[:build_version]}
|
32
|
+
----
|
33
|
+
EOF
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Hash]
|
37
|
+
def to_hash
|
38
|
+
@table
|
39
|
+
end
|
40
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
class ProconBypassMan::Bypass
|
2
2
|
attr_accessor :gadget, :procon, :monitor
|
3
|
+
|
3
4
|
def initialize(gadget: , procon: , monitor: )
|
4
5
|
self.gadget = gadget
|
5
6
|
self.procon = procon
|
@@ -11,12 +12,13 @@ class ProconBypassMan::Bypass
|
|
11
12
|
monitor.record(:start_function)
|
12
13
|
input = nil
|
13
14
|
begin
|
14
|
-
|
15
|
-
|
15
|
+
return if $will_terminate_token
|
16
|
+
# TODO blocking readにしたい
|
17
|
+
input = self.gadget.read_nonblock(64)
|
16
18
|
ProconBypassMan.logger.debug { ">>> #{input.unpack("H*")}" }
|
17
19
|
rescue IO::EAGAINWaitReadable
|
18
20
|
monitor.record(:eagain_wait_readable_on_read)
|
19
|
-
|
21
|
+
sleep(0.001)
|
20
22
|
retry
|
21
23
|
end
|
22
24
|
|
@@ -26,23 +28,34 @@ class ProconBypassMan::Bypass
|
|
26
28
|
monitor.record(:eagain_wait_readable_on_write)
|
27
29
|
return
|
28
30
|
end
|
31
|
+
|
29
32
|
monitor.record(:end_function)
|
30
33
|
end
|
31
34
|
|
32
35
|
def send_procon_to_gadget!
|
33
36
|
monitor.record(:start_function)
|
34
37
|
output = nil
|
38
|
+
|
35
39
|
begin
|
36
|
-
|
37
|
-
|
38
|
-
|
40
|
+
return if $will_terminate_token
|
41
|
+
Timeout.timeout(1) do
|
42
|
+
output = self.procon.read(64)
|
43
|
+
ProconBypassMan.logger.debug { "<<< #{output.unpack("H*")}" }
|
44
|
+
end
|
45
|
+
rescue Timeout::Error
|
46
|
+
ProconBypassMan.logger.debug { "read timeout! do sleep. by send_procon_to_gadget!" }
|
47
|
+
ProconBypassMan.error_logger.error { "read timeout! do sleep. by send_procon_to_gadget!" }
|
48
|
+
monitor.record(:eagain_wait_readable_on_read)
|
49
|
+
retry
|
39
50
|
rescue IO::EAGAINWaitReadable
|
51
|
+
ProconBypassMan.logger.debug { "EAGAINWaitReadable" }
|
40
52
|
monitor.record(:eagain_wait_readable_on_read)
|
41
|
-
|
53
|
+
sleep(0.005)
|
42
54
|
retry
|
43
55
|
end
|
44
56
|
|
45
57
|
begin
|
58
|
+
# ProconBypassMan::Procon::DebugDumper.new(binary: output).dump_analog_sticks
|
46
59
|
self.gadget.write_nonblock(ProconBypassMan::Processor.new(output).process)
|
47
60
|
rescue IO::EAGAINWaitReadable
|
48
61
|
monitor.record(:eagain_wait_readable_on_write)
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module ProconBypassMan
|
2
2
|
class Configuration
|
3
3
|
class Layer
|
4
|
-
attr_accessor :mode, :flips, :macros, :remaps
|
4
|
+
attr_accessor :mode, :flips, :macros, :remaps, :left_analog_stick_caps
|
5
5
|
|
6
|
-
def initialize(mode: :manual
|
6
|
+
def initialize(mode: :manual)
|
7
7
|
self.mode = mode
|
8
8
|
self.flips = {}
|
9
9
|
self.macros = {}
|
10
10
|
self.remaps = {}
|
11
|
+
self.left_analog_stick_caps = {}
|
11
12
|
instance_eval(&block) if block_given?
|
12
13
|
end
|
13
14
|
|
@@ -50,7 +51,6 @@ module ProconBypassMan
|
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
PRESET_MACROS = [:fast_return]
|
54
54
|
def macro(name, if_pressed: )
|
55
55
|
if name.respond_to?(:name)
|
56
56
|
macro_name = name.name.to_sym
|
@@ -72,6 +72,36 @@ module ProconBypassMan
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
def left_analog_stick_cap(cap: , if_pressed: nil, force_neutral: nil)
|
76
|
+
hash = { cap: cap }
|
77
|
+
|
78
|
+
case if_pressed
|
79
|
+
when TrueClass
|
80
|
+
raise "not support class"
|
81
|
+
when Symbol, String
|
82
|
+
if_pressed = [if_pressed]
|
83
|
+
when Array, FalseClass
|
84
|
+
# sono mama
|
85
|
+
when NilClass
|
86
|
+
if_pressed = nil
|
87
|
+
else
|
88
|
+
raise "not support if_pressed"
|
89
|
+
end
|
90
|
+
|
91
|
+
if force_neutral
|
92
|
+
case force_neutral
|
93
|
+
when TrueClass, FalseClass
|
94
|
+
raise "ボタンを渡してください"
|
95
|
+
when Symbol, String
|
96
|
+
hash[:force_neutral] = [force_neutral]
|
97
|
+
when Array
|
98
|
+
hash[:force_neutral] = force_neutral
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
left_analog_stick_caps[if_pressed] = hash
|
103
|
+
end
|
104
|
+
|
75
105
|
# @return [Array]
|
76
106
|
def flip_buttons
|
77
107
|
flips
|
@@ -4,13 +4,13 @@ require "procon_bypass_man/configuration/layer"
|
|
4
4
|
|
5
5
|
module ProconBypassMan
|
6
6
|
class Configuration
|
7
|
-
|
8
7
|
attr_accessor :layers,
|
9
8
|
:setting_path,
|
10
9
|
:mode_plugins,
|
11
10
|
:macro_plugins,
|
12
11
|
:context,
|
13
|
-
:current_context_key
|
12
|
+
:current_context_key,
|
13
|
+
:neutral_position
|
14
14
|
|
15
15
|
def self.instance
|
16
16
|
@@current_context_key ||= :main
|
@@ -35,13 +35,21 @@ module ProconBypassMan
|
|
35
35
|
reset!
|
36
36
|
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
mode_name = mode.name.to_sym
|
42
|
-
else
|
43
|
-
mode_name = mode
|
38
|
+
module ManualMode
|
39
|
+
def self.name
|
40
|
+
'manual'
|
44
41
|
end
|
42
|
+
end
|
43
|
+
MODES = [:manual]
|
44
|
+
def layer(direction, mode: ManualMode, &block)
|
45
|
+
mode_name = case mode
|
46
|
+
when String
|
47
|
+
mode.to_sym
|
48
|
+
when Symbol
|
49
|
+
mode
|
50
|
+
else
|
51
|
+
mode.name.to_sym
|
52
|
+
end
|
45
53
|
unless (MODES + ProconBypassMan::Procon::ModeRegistry.plugins.keys).include?(mode_name)
|
46
54
|
raise("#{mode_name} mode is unknown")
|
47
55
|
end
|
@@ -67,6 +75,11 @@ module ProconBypassMan
|
|
67
75
|
self
|
68
76
|
end
|
69
77
|
|
78
|
+
def set_neutral_position(x, y)
|
79
|
+
self.neutral_position = AnalogStickPosition.new(x: x, y: y)
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
70
83
|
def prefix_keys
|
71
84
|
@prefix_keys_for_changing_layer
|
72
85
|
end
|
@@ -81,6 +94,7 @@ module ProconBypassMan
|
|
81
94
|
left: Layer.new,
|
82
95
|
right: Layer.new,
|
83
96
|
}
|
97
|
+
@neutral_position = AnalogStickPosition.new(x: 2124, y: 1808)
|
84
98
|
end
|
85
99
|
end
|
86
100
|
end
|
@@ -12,23 +12,6 @@ class ProconBypassMan::DeviceConnector
|
|
12
12
|
PROCON_PATH = "/dev/hidraw0"
|
13
13
|
PROCON2_PATH = "/dev/hidraw1"
|
14
14
|
|
15
|
-
# 画面で再接続ができたが状況は変わらない
|
16
|
-
def self.reset_connection!
|
17
|
-
s = new
|
18
|
-
s.add([
|
19
|
-
["0000"],
|
20
|
-
["0000"],
|
21
|
-
["8005"],
|
22
|
-
["0000"],
|
23
|
-
["8001"],
|
24
|
-
], read_from: :switch)
|
25
|
-
s.drain_all
|
26
|
-
s.read_procon
|
27
|
-
s.write_switch("213c910080005db7723d48720a800300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
|
28
|
-
sleep(10) # いらないかも
|
29
|
-
s
|
30
|
-
end
|
31
|
-
|
32
15
|
def self.connect
|
33
16
|
s = new(throw_error_if_timeout: true, enable_at_exit: false)
|
34
17
|
s.add([
|
@@ -75,7 +58,7 @@ class ProconBypassMan::DeviceConnector
|
|
75
58
|
timer = ProconBypassMan::Timer.new
|
76
59
|
begin
|
77
60
|
timer.throw_if_timeout!
|
78
|
-
data = from_device(item).read_nonblock(
|
61
|
+
data = from_device(item).read_nonblock(64)
|
79
62
|
rescue IO::EAGAINWaitReadable
|
80
63
|
retry
|
81
64
|
end
|
@@ -128,7 +111,7 @@ class ProconBypassMan::DeviceConnector
|
|
128
111
|
timer = ProconBypassMan::Timer.new
|
129
112
|
begin
|
130
113
|
timer.throw_if_timeout!
|
131
|
-
data = switch.read_nonblock(
|
114
|
+
data = switch.read_nonblock(64)
|
132
115
|
ProconBypassMan.logger.debug { " >>> #{data.unpack("H*")})" }
|
133
116
|
rescue IO::EAGAINWaitReadable
|
134
117
|
retry
|
@@ -163,7 +146,7 @@ class ProconBypassMan::DeviceConnector
|
|
163
146
|
timer = ProconBypassMan::Timer.new
|
164
147
|
begin
|
165
148
|
timer.throw_if_timeout!
|
166
|
-
data = procon.read_nonblock(
|
149
|
+
data = procon.read_nonblock(64)
|
167
150
|
ProconBypassMan.logger.error " <<< #{data.unpack("H*")})"
|
168
151
|
rescue IO::EAGAINWaitReadable
|
169
152
|
retry
|
@@ -184,7 +167,7 @@ class ProconBypassMan::DeviceConnector
|
|
184
167
|
timer = ProconBypassMan::Timer.new
|
185
168
|
begin
|
186
169
|
timer.throw_if_timeout!
|
187
|
-
data = procon.read_nonblock(
|
170
|
+
data = procon.read_nonblock(64)
|
188
171
|
ProconBypassMan.logger.debug { " <<< #{data.unpack("H*")})" }
|
189
172
|
rescue IO::EAGAINWaitReadable
|
190
173
|
retry
|
@@ -217,7 +200,7 @@ class ProconBypassMan::DeviceConnector
|
|
217
200
|
timer = ProconBypassMan::Timer.new
|
218
201
|
begin
|
219
202
|
timer.throw_if_timeout!
|
220
|
-
data = switch.read_nonblock(
|
203
|
+
data = switch.read_nonblock(64)
|
221
204
|
ProconBypassMan.logger.debug { " >>> #{data.unpack("H*")})" }
|
222
205
|
rescue IO::EAGAINWaitReadable
|
223
206
|
retry
|
@@ -281,7 +264,7 @@ class ProconBypassMan::DeviceConnector
|
|
281
264
|
|
282
265
|
file = File.open(path, "w+")
|
283
266
|
begin
|
284
|
-
file.read_nonblock(
|
267
|
+
file.read_nonblock(64)
|
285
268
|
rescue EOFError
|
286
269
|
file.close
|
287
270
|
return false
|
@@ -303,12 +286,12 @@ class ProconBypassMan::DeviceConnector
|
|
303
286
|
case
|
304
287
|
when is_available_device?(PROCON_PATH)
|
305
288
|
ProconBypassMan.logger.info "proconのデバイスファイルは#{PROCON_PATH}を使います"
|
306
|
-
@procon = File.open(PROCON_PATH, "w+")
|
307
|
-
@gadget = File.open('/dev/hidg0', "w+")
|
289
|
+
@procon = File.open(PROCON_PATH, "w+b")
|
290
|
+
@gadget = File.open('/dev/hidg0', "w+b")
|
308
291
|
when is_available_device?(PROCON2_PATH)
|
309
292
|
ProconBypassMan.logger.info "proconのデバイスファイルは#{PROCON2_PATH}を使います"
|
310
|
-
@procon = File.open(PROCON2_PATH, "w+")
|
311
|
-
@gadget = File.open('/dev/hidg0', "w+")
|
293
|
+
@procon = File.open(PROCON2_PATH, "w+b")
|
294
|
+
@gadget = File.open('/dev/hidg0', "w+b")
|
312
295
|
else
|
313
296
|
raise "/dev/hidraw0, /dev/hidraw1の両方見つかりませんでした"
|
314
297
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
class ProconBypassMan::ErrorReporter
|
5
|
+
PATH = "/api/error_reports" # POST
|
6
|
+
|
7
|
+
class Client
|
8
|
+
def initialize
|
9
|
+
@server = ProconBypassMan.api_server
|
10
|
+
@hostname = `hostname`.chomp
|
11
|
+
end
|
12
|
+
|
13
|
+
def post(body: )
|
14
|
+
# TODO ここでvalidationする
|
15
|
+
if @server.nil?
|
16
|
+
ProconBypassMan.logger.info('送信先が未設定なのでスキップしました')
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
uri = URI.parse("#{@server}#{PATH}")
|
21
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
22
|
+
http.use_ssl = uri.scheme === "https"
|
23
|
+
response = http.post(
|
24
|
+
uri.path,
|
25
|
+
{ report: body.full_message.to_json, hostname: @hostname }.to_json,
|
26
|
+
{ "Content-Type" => "application/json" },
|
27
|
+
)
|
28
|
+
unless response.code == /^20/
|
29
|
+
ProconBypassMan.logger.error(response.body)
|
30
|
+
end
|
31
|
+
rescue => e
|
32
|
+
puts e
|
33
|
+
ProconBypassMan.logger.error(e)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.report(body: )
|
38
|
+
ProconBypassMan.logger.error(body)
|
39
|
+
Client.new.post(body: body)
|
40
|
+
rescue => e
|
41
|
+
ProconBypassMan.logger.error(e)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -62,10 +62,13 @@ module ProconBypassMan
|
|
62
62
|
}.join(", ")
|
63
63
|
max_output_length = line.length
|
64
64
|
sleep 0.7
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
|
66
|
+
if ENV["PBM_FOREGROUND"]
|
67
|
+
print "\r"
|
68
|
+
print " " * max_output_length
|
69
|
+
print "\r"
|
70
|
+
print line
|
71
|
+
end
|
69
72
|
ProconBypassMan.logger.debug { line }
|
70
73
|
break if $will_terminate_token
|
71
74
|
end
|