procon_bypass_man 0.1.11 → 0.1.12
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/.gitignore +1 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +2 -2
- data/README.md +3 -2
- data/bin/dev_api_server.rb +1 -1
- data/lib/procon_bypass_man/background/has_server_pool.rb +54 -0
- data/lib/procon_bypass_man/background/http_client.rb +70 -0
- data/lib/procon_bypass_man/background/job_performer.rb +16 -0
- data/lib/procon_bypass_man/background/job_runnable.rb +16 -0
- data/lib/procon_bypass_man/background/{report_thread.rb → job_runner.rb} +10 -8
- data/lib/procon_bypass_man/background/jobs/base_job.rb +12 -0
- data/lib/procon_bypass_man/background/jobs/report_boot_job.rb +10 -0
- data/lib/procon_bypass_man/background/jobs/report_error_job.rb +10 -0
- data/lib/procon_bypass_man/background/jobs/report_heartbeat_job.rb +10 -0
- data/lib/procon_bypass_man/background/jobs/report_pressed_buttons_job.rb +18 -0
- data/lib/procon_bypass_man/background/jobs/report_reload_config_job.rb +10 -0
- data/lib/procon_bypass_man/background.rb +10 -0
- data/lib/procon_bypass_man/boot_message.rb +9 -7
- data/lib/procon_bypass_man/{configuration → buttons_setting_configuration}/layer.rb +0 -0
- data/lib/procon_bypass_man/{configuration → buttons_setting_configuration}/loader.rb +5 -4
- data/lib/procon_bypass_man/{configuration → buttons_setting_configuration}/validator.rb +0 -0
- data/lib/procon_bypass_man/buttons_setting_configuration.rb +4 -5
- data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +16 -7
- data/lib/procon_bypass_man/bypass.rb +15 -14
- data/lib/procon_bypass_man/commands/connect_device_command.rb +11 -0
- data/lib/procon_bypass_man/commands/print_boot_message_command.rb +9 -0
- data/lib/procon_bypass_man/commands/send_error_command.rb +18 -0
- data/lib/procon_bypass_man/commands/send_reload_config_event_command.rb +10 -0
- data/lib/procon_bypass_man/commands/write_device_id_command.rb +11 -0
- data/lib/procon_bypass_man/commands/write_session_id_command.rb +13 -0
- data/lib/procon_bypass_man/commands.rb +6 -0
- data/lib/procon_bypass_man/configuration.rb +27 -5
- data/lib/procon_bypass_man/device_connector.rb +1 -2
- data/lib/procon_bypass_man/io_monitor.rb +9 -4
- data/lib/procon_bypass_man/procon/{data.rb → consts.rb} +1 -1
- data/lib/procon_bypass_man/procon/layer_changer.rb +40 -0
- data/lib/procon_bypass_man/procon/user_operation.rb +11 -17
- data/lib/procon_bypass_man/procon.rb +6 -12
- data/lib/procon_bypass_man/{readonly_procon.rb → procon_reader.rb} +3 -4
- data/lib/procon_bypass_man/runner.rb +18 -30
- data/lib/procon_bypass_man/uptime.rb +13 -3
- data/lib/procon_bypass_man/version.rb +1 -1
- data/lib/procon_bypass_man.rb +19 -12
- data/project_template/app.rb +2 -2
- data/sig/main.rbs +9 -11
- metadata +27 -14
- data/lib/procon_bypass_man/outbound/base.rb +0 -53
- data/lib/procon_bypass_man/outbound/error_reporter.rb +0 -13
- data/lib/procon_bypass_man/outbound/pressed_buttons_reporter.rb +0 -13
- data/lib/procon_bypass_man/outbound/reporter.rb +0 -12
- data/lib/procon_bypass_man/procon/layer_changeable.rb +0 -28
- data/lib/procon_bypass_man/procon/pressed_button_helper.rb +0 -15
@@ -1,5 +1,5 @@
|
|
1
1
|
class ProconBypassMan::Configuration
|
2
|
-
module
|
2
|
+
module ClassMethods
|
3
3
|
def root
|
4
4
|
config.root
|
5
5
|
end
|
@@ -23,10 +23,20 @@ class ProconBypassMan::Configuration
|
|
23
23
|
def cache
|
24
24
|
@@cache_table ||= ProconBypassMan::OnMemoryCache.new
|
25
25
|
end
|
26
|
+
|
27
|
+
# @return [String]
|
28
|
+
def session_id
|
29
|
+
ProconBypassMan::WriteSessionIdCommand.execute
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [String]
|
33
|
+
def device_id
|
34
|
+
ProconBypassMan::WriteDeviceIdCommand.execute
|
35
|
+
end
|
26
36
|
end
|
27
37
|
|
28
|
-
|
29
|
-
|
38
|
+
attr_accessor :enable_critical_error_logging, :raw_setting
|
39
|
+
attr_writer :verbose_bypass_log
|
30
40
|
|
31
41
|
def root=(path)
|
32
42
|
@root = path
|
@@ -41,8 +51,8 @@ class ProconBypassMan::Configuration
|
|
41
51
|
end
|
42
52
|
end
|
43
53
|
|
44
|
-
def
|
45
|
-
@
|
54
|
+
def api_servers=(api_servers)
|
55
|
+
@api_servers = api_servers
|
46
56
|
return self
|
47
57
|
end
|
48
58
|
|
@@ -86,4 +96,16 @@ class ProconBypassMan::Configuration
|
|
86
96
|
].compact
|
87
97
|
end
|
88
98
|
end
|
99
|
+
|
100
|
+
def api_servers
|
101
|
+
if !!ENV["API_SERVER"]
|
102
|
+
[ENV["API_SERVER"]].reject(&:nil?)
|
103
|
+
else
|
104
|
+
[@api_servers].flatten.reject(&:nil?)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def verbose_bypass_log
|
109
|
+
@verbose_bypass_log || !!ENV["VERBOSE_BYPASS_LOG"]
|
110
|
+
end
|
89
111
|
end
|
@@ -309,8 +309,7 @@ class ProconBypassMan::DeviceConnector
|
|
309
309
|
end
|
310
310
|
rescue Errno::ENXIO => e
|
311
311
|
# /dev/hidg0 をopenできないときがある
|
312
|
-
ProconBypassMan.
|
313
|
-
ProconBypassMan.logger.error e
|
312
|
+
ProconBypassMan::SendErrorCommand.execute(error: "Errno::ENXIO (No such device or address @ rb_sysopen - /dev/hidg0)が起きました。resetします. #{e.full_message}")
|
314
313
|
system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
|
315
314
|
system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
|
316
315
|
sleep 2
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module ProconBypassMan
|
2
2
|
class Counter
|
3
|
-
attr_accessor :label, :table, :previous_table
|
3
|
+
attr_accessor :label, :table, :previous_table, :active
|
4
4
|
|
5
5
|
def initialize(label: )
|
6
6
|
self.label = label
|
7
7
|
self.table = {}
|
8
8
|
self.previous_table = {}
|
9
|
+
self.active = true
|
9
10
|
end
|
10
11
|
|
11
12
|
# アクティブなバケットは1つだけ
|
@@ -24,7 +25,7 @@ module ProconBypassMan
|
|
24
25
|
self
|
25
26
|
end
|
26
27
|
|
27
|
-
def
|
28
|
+
def formatted_previous_table
|
28
29
|
t = previous_table.dup
|
29
30
|
start_function = t[:start_function] || 0
|
30
31
|
end_function = t[:end_function] || 0
|
@@ -32,6 +33,10 @@ module ProconBypassMan
|
|
32
33
|
eagain_wait_readable_on_write = t[:eagain_wait_readable_on_write] || 0
|
33
34
|
"(#{(end_function / start_function.to_f * 100).floor(1)}%(#{end_function}/#{start_function}), loss: #{eagain_wait_readable_on_read}, #{eagain_wait_readable_on_write})"
|
34
35
|
end
|
36
|
+
|
37
|
+
def shutdown
|
38
|
+
self.active = false
|
39
|
+
end
|
35
40
|
end
|
36
41
|
|
37
42
|
module IOMonitor
|
@@ -51,14 +56,14 @@ module ProconBypassMan
|
|
51
56
|
Thread.start do
|
52
57
|
max_output_length = 0
|
53
58
|
loop do
|
54
|
-
list = @@list.dup
|
59
|
+
list = @@list.select(&:active).dup
|
55
60
|
unless list.all? { |x| x&.previous_table.is_a?(Hash) }
|
56
61
|
sleep 0.5
|
57
62
|
next
|
58
63
|
end
|
59
64
|
|
60
65
|
line = list.map { |counter|
|
61
|
-
"#{counter.label}(#{counter.
|
66
|
+
"#{counter.label}(#{counter.formatted_previous_table})"
|
62
67
|
}.join(", ")
|
63
68
|
max_output_length = line.length
|
64
69
|
sleep 0.7
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class ProconBypassMan::Procon::LayerChanger
|
2
|
+
def initialize(binary: )
|
3
|
+
@procon_reader = ProconBypassMan::ProconReader.new(binary: binary)
|
4
|
+
end
|
5
|
+
|
6
|
+
# @return [Symbol]
|
7
|
+
def next_layer_key
|
8
|
+
case
|
9
|
+
when pressed?(button: :up)
|
10
|
+
:up
|
11
|
+
when pressed?(button: :right)
|
12
|
+
:right
|
13
|
+
when pressed?(button: :left)
|
14
|
+
:left
|
15
|
+
when pressed?(button: :down)
|
16
|
+
:down
|
17
|
+
else
|
18
|
+
ProconBypassMan.logger.warn("next_layer_key is unknown")
|
19
|
+
:up
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [Boolean]
|
24
|
+
def change_layer?
|
25
|
+
if ProconBypassMan::ButtonsSettingConfiguration.instance.prefix_keys.empty?
|
26
|
+
raise "prefix_keysが未設定です"
|
27
|
+
end
|
28
|
+
ProconBypassMan::ButtonsSettingConfiguration.instance.prefix_keys.map { |b| pressed?(button: b) }.all?
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return [Boolean]
|
32
|
+
def pressed_next_layer?
|
33
|
+
change_layer? && (pressed?(button: :up) || pressed?(button: :right) || pressed?(button: :left) || pressed?(button: :down))
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Boolean]
|
37
|
+
def pressed?(button: )
|
38
|
+
@procon_reader.pressed.include?(button)
|
39
|
+
end
|
40
|
+
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
class ProconBypassMan::Procon
|
2
2
|
class UserOperation
|
3
|
-
include LayerChangeable
|
4
|
-
extend PressedButtonHelper::Dynamic
|
5
|
-
|
6
3
|
attr_reader :binary
|
7
4
|
|
5
|
+
::ProconBypassMan::Procon::ButtonCollection::BUTTONS_MAP.each do |button, _value|
|
6
|
+
define_method "pressed_#{button}?" do
|
7
|
+
pressed_button?(button)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
8
11
|
def initialize(binary)
|
9
|
-
self.class.compile_if_not_compile_yet!
|
10
12
|
unless binary.encoding.name == ASCII_ENCODING
|
11
13
|
raise "おかしいです"
|
12
14
|
end
|
@@ -16,20 +18,16 @@ class ProconBypassMan::Procon
|
|
16
18
|
ZERO_BIT = ["0"].pack("H*").freeze
|
17
19
|
ASCII_ENCODING = "ASCII-8BIT"
|
18
20
|
|
19
|
-
# @depilicate
|
20
|
-
def binary=(binary)
|
21
|
-
unless binary.encoding.name == ASCII_ENCODING
|
22
|
-
raise "おかしいです"
|
23
|
-
end
|
24
|
-
@binary = binary
|
25
|
-
end
|
26
|
-
|
27
21
|
def set_no_action!
|
28
22
|
binary[3] = ZERO_BIT
|
29
23
|
binary[4] = ZERO_BIT
|
30
24
|
binary[5] = ZERO_BIT
|
31
25
|
end
|
32
26
|
|
27
|
+
def apply_left_analog_stick_cap(cap: )
|
28
|
+
binary[6..8] = ProconBypassMan::Procon::AnalogStickCap.new(binary).capped_position(cap_hypotenuse: cap).to_binary
|
29
|
+
end
|
30
|
+
|
33
31
|
def unpress_button(button)
|
34
32
|
return if not pressed_button?(button)
|
35
33
|
|
@@ -38,10 +36,6 @@ class ProconBypassMan::Procon
|
|
38
36
|
binary[byte_position] = ["%02X" % value.to_s].pack("H*")
|
39
37
|
end
|
40
38
|
|
41
|
-
def apply_left_analog_stick_cap(cap: )
|
42
|
-
binary[6..8] = ProconBypassMan::Procon::AnalogStickCap.new(binary).capped_position(cap_hypotenuse: cap).to_binary
|
43
|
-
end
|
44
|
-
|
45
39
|
def press_button(button)
|
46
40
|
return if pressed_button?(button)
|
47
41
|
|
@@ -51,7 +45,7 @@ class ProconBypassMan::Procon
|
|
51
45
|
end
|
52
46
|
|
53
47
|
def press_button_only(button)
|
54
|
-
[ProconBypassMan::Procon::
|
48
|
+
[ProconBypassMan::Procon::Consts::NO_ACTION.dup].pack("H*").tap do |no_action_binary|
|
55
49
|
ButtonCollection.load(button).byte_position
|
56
50
|
byte_position = ButtonCollection.load(button).byte_position
|
57
51
|
value = 2**ButtonCollection.load(button).bit_position
|
@@ -1,10 +1,9 @@
|
|
1
1
|
class ProconBypassMan::Procon
|
2
|
-
require "procon_bypass_man/procon/
|
2
|
+
require "procon_bypass_man/procon/consts"
|
3
3
|
require "procon_bypass_man/procon/mode_registry"
|
4
4
|
require "procon_bypass_man/procon/macro_registry"
|
5
|
-
require "procon_bypass_man/procon/
|
5
|
+
require "procon_bypass_man/procon/layer_changer"
|
6
6
|
require "procon_bypass_man/procon/button_collection"
|
7
|
-
require "procon_bypass_man/procon/pressed_button_helper"
|
8
7
|
require "procon_bypass_man/procon/user_operation"
|
9
8
|
require "procon_bypass_man/procon/flip_cache"
|
10
9
|
require "procon_bypass_man/procon/press_button_aware"
|
@@ -35,8 +34,9 @@ class ProconBypassMan::Procon
|
|
35
34
|
end
|
36
35
|
|
37
36
|
def apply!
|
38
|
-
|
39
|
-
|
37
|
+
layer_changer = ProconBypassMan::Procon::LayerChanger.new(binary: user_operation.binary)
|
38
|
+
if layer_changer.change_layer?
|
39
|
+
@@status[:current_layer_key] = layer_changer.next_layer_key if layer_changer.pressed_next_layer?
|
40
40
|
user_operation.set_no_action!
|
41
41
|
return
|
42
42
|
end
|
@@ -137,13 +137,7 @@ class ProconBypassMan::Procon
|
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
|
-
|
141
|
-
ProconBypassMan.cache.fetch key: 'user_operation.binary', expires_in: 60 do
|
142
|
-
left_analog_stick = ProconBypassMan::ReadonlyProcon.new(binary: b).left_analog_stick
|
143
|
-
ProconBypassMan.logger.debug "x: #{left_analog_stick[:x]}, val: #{left_analog_stick[:x].to_s(2)}"
|
144
|
-
ProconBypassMan.logger.debug "y: #{left_analog_stick[:y]}, val: #{left_analog_stick[:y].to_s(2)}"
|
145
|
-
end
|
146
|
-
b
|
140
|
+
user_operation.binary
|
147
141
|
end
|
148
142
|
|
149
143
|
private
|
@@ -1,15 +1,14 @@
|
|
1
|
-
|
2
|
-
class ProconBypassMan::ReadonlyProcon
|
1
|
+
class ProconBypassMan::ProconReader
|
3
2
|
def initialize(binary: )
|
4
3
|
@binary = binary
|
5
|
-
@user_operation = ProconBypassMan::Procon::UserOperation.new(binary.dup)
|
6
4
|
@analog_stick = ProconBypassMan::Procon::AnalogStick.new(binary: binary)
|
7
5
|
end
|
8
6
|
|
9
7
|
# @return [Array<Symbol>]
|
10
8
|
def pressed
|
9
|
+
aware = ProconBypassMan::PpressButtonAware.new(@binary)
|
11
10
|
pressed_table = ::ProconBypassMan::Procon::ButtonCollection::BUTTONS.reduce({}) do |acc, button|
|
12
|
-
acc[button] =
|
11
|
+
acc[button] = aware.pressed_button?(button)
|
13
12
|
acc
|
14
13
|
end
|
15
14
|
pressed_table.select { |_key, value| value }.keys
|
@@ -1,15 +1,20 @@
|
|
1
1
|
require_relative "io_monitor"
|
2
2
|
require_relative "uptime"
|
3
3
|
require_relative "boot_message"
|
4
|
-
require_relative "background/
|
4
|
+
require_relative "background/job_runner"
|
5
5
|
|
6
6
|
class ProconBypassMan::Runner
|
7
7
|
class InterruptForRestart < StandardError; end
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
9
|
+
def initialize(gadget: , procon: )
|
10
|
+
@gadget = gadget
|
11
|
+
@procon = procon
|
12
|
+
|
13
|
+
ProconBypassMan::PrintBootMessageCommand.execute
|
14
|
+
ProconBypassMan::Background::JobRunner.start!
|
15
|
+
end
|
12
16
|
|
17
|
+
def run
|
13
18
|
self_read, self_write = IO.pipe
|
14
19
|
%w(TERM INT USR1 USR2).each do |sig|
|
15
20
|
begin
|
@@ -17,7 +22,7 @@ class ProconBypassMan::Runner
|
|
17
22
|
self_write.puts(sig)
|
18
23
|
end
|
19
24
|
rescue ArgumentError
|
20
|
-
ProconBypassMan.
|
25
|
+
ProconBypassMan::SendErrorCommand.execute(error: "Signal #{sig} not supported")
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
@@ -37,10 +42,10 @@ class ProconBypassMan::Runner
|
|
37
42
|
ProconBypassMan.logger.info("Reloading config file")
|
38
43
|
begin
|
39
44
|
ProconBypassMan::ButtonsSettingConfiguration::Loader.reload_setting
|
40
|
-
puts "設定ファイルの再読み込みができました"
|
41
45
|
rescue ProconBypassMan::CouldNotLoadConfigError
|
42
|
-
ProconBypassMan.
|
46
|
+
ProconBypassMan::SendErrorCommand.execute(error: "設定ファイルが不正です。再読み込みができませんでした")
|
43
47
|
end
|
48
|
+
ProconBypassMan::SendReloadConfigEventCommand.execute
|
44
49
|
ProconBypassMan.logger.info("バイパス処理を再開します")
|
45
50
|
rescue Interrupt
|
46
51
|
$will_terminate_token = true
|
@@ -59,7 +64,7 @@ class ProconBypassMan::Runner
|
|
59
64
|
|
60
65
|
def main_loop
|
61
66
|
ProconBypassMan::IOMonitor.start!
|
62
|
-
ProconBypassMan::Background::
|
67
|
+
ProconBypassMan::Background::JobRunner.start!
|
63
68
|
|
64
69
|
# gadget => procon
|
65
70
|
# 遅くていい
|
@@ -76,15 +81,15 @@ class ProconBypassMan::Runner
|
|
76
81
|
sleep(0.005)
|
77
82
|
rescue ProconBypassMan::Timer::Timeout
|
78
83
|
ProconBypassMan.logger.info "10秒経過したのでThread1を終了します"
|
84
|
+
monitor1.shutdown
|
79
85
|
puts "10秒経過したのでThread1を終了します"
|
80
86
|
break
|
81
87
|
rescue Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError => e
|
82
|
-
ProconBypassMan.
|
88
|
+
ProconBypassMan::SendErrorCommand.execute(error: "Switchとの切断されました.終了処理を開始します. #{e.full_message}")
|
83
89
|
Process.kill "TERM", Process.ppid
|
84
90
|
rescue Errno::ETIMEDOUT => e
|
85
91
|
# TODO まれにこれが発生する. 再接続したい
|
86
|
-
ProconBypassMan::
|
87
|
-
ProconBypassMan.logger.error "Switchとの切断されました.終了処理を開始します"
|
92
|
+
ProconBypassMan::SendErrorCommand.execute(error: "Switchと意図せず切断されました.終了処理を開始します. #{e.full_message}")
|
88
93
|
Process.kill "TERM", Process.ppid
|
89
94
|
end
|
90
95
|
ProconBypassMan.logger.info "Thread1を終了します"
|
@@ -99,10 +104,10 @@ class ProconBypassMan::Runner
|
|
99
104
|
break if $will_terminate_token
|
100
105
|
bypass.send_procon_to_gadget!
|
101
106
|
rescue EOFError => e
|
102
|
-
ProconBypassMan.
|
107
|
+
ProconBypassMan::SendErrorCommand.execute(error: "Proconが切断されました。終了処理を開始します. #{e.full_message}")
|
103
108
|
Process.kill "TERM", Process.ppid
|
104
109
|
rescue Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError => e
|
105
|
-
ProconBypassMan.
|
110
|
+
ProconBypassMan::SendErrorCommand.execute(error: "Proconが切断されました。終了処理を開始します2. #{e.full_message}")
|
106
111
|
Process.kill "TERM", Process.ppid
|
107
112
|
end
|
108
113
|
ProconBypassMan.logger.info "Thread2を終了します"
|
@@ -134,15 +139,6 @@ class ProconBypassMan::Runner
|
|
134
139
|
end
|
135
140
|
end
|
136
141
|
|
137
|
-
def first_negotiation
|
138
|
-
@gadget, @procon = ProconBypassMan::DeviceConnector.connect
|
139
|
-
rescue ProconBypassMan::Timer::Timeout
|
140
|
-
::ProconBypassMan.logger.error "デバイスとの通信でタイムアウトが起きて接続ができませんでした。"
|
141
|
-
@gadget&.close
|
142
|
-
@procon&.close
|
143
|
-
raise ::ProconBypassMan::EternalConnectionError
|
144
|
-
end
|
145
|
-
|
146
142
|
def handle_signal(sig)
|
147
143
|
ProconBypassMan.logger.info "#{$$}で#{sig}を受け取りました"
|
148
144
|
case sig
|
@@ -152,12 +148,4 @@ class ProconBypassMan::Runner
|
|
152
148
|
raise Interrupt
|
153
149
|
end
|
154
150
|
end
|
155
|
-
|
156
|
-
# @return [void]
|
157
|
-
def print_booted_message
|
158
|
-
message = ProconBypassMan::BootMessage.new
|
159
|
-
ProconBypassMan.logger.info(message.to_s)
|
160
|
-
Thread.new { ProconBypassMan::Reporter.report(body: message.to_hash) }
|
161
|
-
puts message.to_s
|
162
|
-
end
|
163
151
|
end
|
@@ -2,10 +2,20 @@ require "time"
|
|
2
2
|
|
3
3
|
module ProconBypassMan
|
4
4
|
class Uptime
|
5
|
+
# @return [Integer]
|
5
6
|
def self.from_boot
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
new(uptime_cmd_result: `uptime -s`.chomp).from_boot
|
8
|
+
end
|
9
|
+
|
10
|
+
# @param [String] uptime_cmd_result
|
11
|
+
def initialize(uptime_cmd_result: )
|
12
|
+
@result = uptime_cmd_result
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Integer]
|
16
|
+
def from_boot
|
17
|
+
return -1 if @result == '' # darwin系だとsオプションが使えない
|
18
|
+
boot_time = Time.parse(@result).to_i
|
9
19
|
return Time.now.to_i - boot_time.to_i
|
10
20
|
rescue => e
|
11
21
|
ProconBypassMan.logger.error(e)
|
data/lib/procon_bypass_man.rb
CHANGED
@@ -3,6 +3,7 @@ require 'yaml'
|
|
3
3
|
require "json"
|
4
4
|
require "net/http"
|
5
5
|
require "fileutils"
|
6
|
+
require "securerandom"
|
6
7
|
|
7
8
|
require_relative "procon_bypass_man/version"
|
8
9
|
require_relative "procon_bypass_man/callbacks"
|
@@ -13,22 +14,20 @@ require_relative "procon_bypass_man/runner"
|
|
13
14
|
require_relative "procon_bypass_man/processor"
|
14
15
|
require_relative "procon_bypass_man/configuration"
|
15
16
|
require_relative "procon_bypass_man/buttons_setting_configuration"
|
16
|
-
require_relative "procon_bypass_man/
|
17
|
+
require_relative "procon_bypass_man/procon_reader"
|
17
18
|
require_relative "procon_bypass_man/procon"
|
18
19
|
require_relative "procon_bypass_man/procon/analog_stick"
|
19
20
|
require_relative "procon_bypass_man/procon/analog_stick_cap"
|
20
|
-
require_relative "procon_bypass_man/
|
21
|
-
require_relative "procon_bypass_man/
|
22
|
-
require_relative "procon_bypass_man/outbound/pressed_buttons_reporter"
|
21
|
+
require_relative "procon_bypass_man/background"
|
22
|
+
require_relative "procon_bypass_man/commands"
|
23
23
|
require_relative "procon_bypass_man/on_memory_cache"
|
24
24
|
|
25
25
|
STDOUT.sync = true
|
26
26
|
Thread.abort_on_exception = true
|
27
27
|
|
28
28
|
module ProconBypassMan
|
29
|
-
extend ProconBypassMan::Configuration::
|
29
|
+
extend ProconBypassMan::Configuration::ClassMethods
|
30
30
|
|
31
|
-
class ProConRejected < StandardError; end
|
32
31
|
class CouldNotLoadConfigError < StandardError; end
|
33
32
|
class FirstConnectionError < StandardError; end
|
34
33
|
class EternalConnectionError < StandardError; end
|
@@ -45,25 +44,27 @@ module ProconBypassMan
|
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
47
|
+
# @return [void]
|
48
48
|
def self.run(setting_path: nil, &block)
|
49
49
|
ProconBypassMan.logger.info "PBMを起動しています"
|
50
50
|
puts "PBMを起動しています"
|
51
51
|
buttons_setting_configure(setting_path: setting_path, &block)
|
52
|
+
initialize_pbm
|
52
53
|
File.write(pid_path, $$)
|
53
|
-
|
54
|
+
ProconBypassMan::WriteSessionIdCommand.execute
|
55
|
+
gadget, procon = ProconBypassMan::ConnectDeviceCommand.execute!
|
56
|
+
Runner.new(gadget: gadget, procon: procon).run
|
54
57
|
rescue CouldNotLoadConfigError
|
55
|
-
ProconBypassMan.
|
56
|
-
puts "設定ファイルが不正です。設定ファイルの読み込みに失敗しました"
|
58
|
+
ProconBypassMan::SendErrorCommand.execute(error: "設定ファイルが不正です。設定ファイルの読み込みに失敗しました")
|
57
59
|
FileUtils.rm_rf(ProconBypassMan.pid_path)
|
58
60
|
FileUtils.rm_rf(ProconBypassMan.digest_path)
|
59
61
|
exit 1
|
60
62
|
rescue EternalConnectionError
|
61
|
-
ProconBypassMan.
|
62
|
-
puts "接続の見込みがないのでsleepしまくります"
|
63
|
+
ProconBypassMan::SendErrorCommand.execute(error: "接続の見込みがないのでsleepしまくります")
|
63
64
|
FileUtils.rm_rf(ProconBypassMan.pid_path)
|
64
65
|
sleep(999999999)
|
65
66
|
rescue FirstConnectionError
|
66
|
-
|
67
|
+
ProconBypassMan::SendErrorCommand.execute(error: "接続を確立できませんでした。やりなおします。")
|
67
68
|
retry
|
68
69
|
end
|
69
70
|
|
@@ -73,10 +74,12 @@ module ProconBypassMan
|
|
73
74
|
@@configuration
|
74
75
|
end
|
75
76
|
|
77
|
+
# @return [ProconBypassMan::Configuration]
|
76
78
|
def self.config
|
77
79
|
@@configuration ||= ProconBypassMan::Configuration.new
|
78
80
|
end
|
79
81
|
|
82
|
+
# @return [void]
|
80
83
|
def self.reset!
|
81
84
|
ProconBypassMan::Procon::MacroRegistry.reset!
|
82
85
|
ProconBypassMan::Procon::ModeRegistry.reset!
|
@@ -84,4 +87,8 @@ module ProconBypassMan
|
|
84
87
|
ProconBypassMan::ButtonsSettingConfiguration.instance.reset!
|
85
88
|
ProconBypassMan::IOMonitor.reset!
|
86
89
|
end
|
90
|
+
|
91
|
+
def self.initialize_pbm
|
92
|
+
ProconBypassMan::WriteDeviceIdCommand.execute
|
93
|
+
end
|
87
94
|
end
|
data/project_template/app.rb
CHANGED
@@ -5,7 +5,7 @@ require 'bundler/inline'
|
|
5
5
|
gemfile do
|
6
6
|
source 'https://rubygems.org'
|
7
7
|
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
8
|
-
gem 'procon_bypass_man', '0.1.
|
8
|
+
gem 'procon_bypass_man', '0.1.12'
|
9
9
|
gem 'procon_bypass_man-splatoon2', github: 'splaplapla/procon_bypass_man-splatoon2', tag: "0.1.1"
|
10
10
|
end
|
11
11
|
|
@@ -13,7 +13,7 @@ ProconBypassMan.configure do |config|
|
|
13
13
|
config.root = File.expand_path(__dir__)
|
14
14
|
config.logger = Logger.new("#{ProconBypassMan.root}/app.log", 5, 1024 * 1024 * 10)
|
15
15
|
config.logger.level = :debug
|
16
|
-
#
|
16
|
+
# config.api_servers = ['https://...']
|
17
17
|
config.enable_critical_error_logging = true
|
18
18
|
end
|
19
19
|
|
data/sig/main.rbs
CHANGED
@@ -8,9 +8,6 @@ interface _Pluginable
|
|
8
8
|
end
|
9
9
|
|
10
10
|
module ProconBypassMan
|
11
|
-
class ProConRejected < StandardError
|
12
|
-
end
|
13
|
-
|
14
11
|
class CouldNotLoadConfigError < StandardError
|
15
12
|
end
|
16
13
|
|
@@ -168,7 +165,7 @@ module ProconBypassMan
|
|
168
165
|
end
|
169
166
|
|
170
167
|
class ProconBypassMan::Configuration
|
171
|
-
module
|
168
|
+
module ClassMethods
|
172
169
|
def root: () -> untyped
|
173
170
|
|
174
171
|
def logger: () -> untyped
|
@@ -427,10 +424,6 @@ module ProconBypassMan::Procon::PressedButtonHelper
|
|
427
424
|
module Static
|
428
425
|
def pressed_button?: (untyped button) -> untyped
|
429
426
|
end
|
430
|
-
|
431
|
-
module Dynamic
|
432
|
-
def compile_if_not_compile_yet!: () -> untyped
|
433
|
-
end
|
434
427
|
end
|
435
428
|
|
436
429
|
class ProconBypassMan::Procon
|
@@ -439,8 +432,6 @@ class ProconBypassMan::Procon
|
|
439
432
|
|
440
433
|
include PressedButtonHelper::Static
|
441
434
|
|
442
|
-
extend PressedButtonHelper::Dynamic
|
443
|
-
|
444
435
|
attr_reader binary: untyped
|
445
436
|
|
446
437
|
def initialize: (untyped binary) -> untyped
|
@@ -498,7 +489,14 @@ end
|
|
498
489
|
|
499
490
|
module ProconBypassMan
|
500
491
|
class Uptime
|
501
|
-
|
492
|
+
# @return [Integer]
|
493
|
+
def self.from_boot: () -> Integer
|
494
|
+
|
495
|
+
# @param [String] uptime_cmd_result
|
496
|
+
def initialize: (uptime_cmd_result: String uptime_cmd_result) -> void
|
497
|
+
|
498
|
+
# @return [Integer]
|
499
|
+
def from_boot: () -> Integer
|
502
500
|
end
|
503
501
|
end
|
504
502
|
|