procon_bypass_man 0.2.3 → 0.3.1

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.
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
@@ -20,37 +20,54 @@ class ProconBypassMan::Procon::PerformanceMeasurement::MeasurementsSummarizer
20
20
  end
21
21
 
22
22
  # @return [PerformanceMetric]
23
+ # NOTE 中央値の表示価値が低いのでコメントアウト
23
24
  def summarize
24
- sorted_write_time = @spans.map(&:write_time).sort
25
- sorted_read_time = @spans.map(&:read_time).sort
26
- gc_count = @spans.map(&:gc_count).sum
27
- gc_time = @spans.map(&:gc_time).sum
28
25
 
29
- sorted_time_taken = @spans.select(&:succeed).map(&:time_taken).sort
30
- sorted_interval_from_previous_succeed = @spans.select(&:succeed).map(&:interval_from_previous_succeed).sort
26
+ write_time_max = 0
27
+ read_time_max = 0
28
+ time_taken_max = 0
29
+ interval_from_previous_succeed_max = 0
30
+ @spans.each do |span|
31
+ # NOTE @spans.map(&:write_time).sort.last と同じことだけど、処理コストを軽くするためにループを共通化する
32
+ write_time_max = span.write_time if write_time_max < span.write_time
33
+ read_time_max = span.read_time if write_time_max < span.read_time
34
+ time_taken_max = span.time_taken if span.succeed && time_taken_max < span.time_taken
35
+ interval_from_previous_succeed_max = span.interval_from_previous_succeed if span.succeed && interval_from_previous_succeed_max < span.interval_from_previous_succeed
36
+ end
31
37
 
32
- interval_from_previous_succeed_max = sorted_interval_from_previous_succeed.last || 0
33
- interval_from_previous_succeed_p50 = percentile(sorted_list: sorted_interval_from_previous_succeed , percentile: 0.50)
38
+ # NOTE 今はGCを無効にしており、集計するまでもないのでコメントアウトにする. 今後GCを有効にしたバイパスをするかもしれないので残しておく
39
+ gc_count = 0 # @spans.map(&:gc_count).sum
40
+ gc_time = 0 # @spans.map(&:gc_time).sum
34
41
 
35
- write_time_max = sorted_write_time.last || 0
36
- write_time_p50 = percentile(sorted_list: sorted_write_time , percentile: 0.50)
42
+ # sorted_interval_from_previous_succeed = @spans.select(&:succeed).map(&:interval_from_previous_succeed).sort
43
+ # interval_from_previous_succeed_max = sorted_interval_from_previous_succeed.last || 0
44
+ interval_from_previous_succeed_p50 = 0 # percentile(sorted_list: sorted_interval_from_previous_succeed , percentile: 0.50)
37
45
 
38
- read_time_max = sorted_read_time.last || 0
39
- read_time_p50 = percentile(sorted_list: sorted_read_time , percentile: 0.50)
46
+ # sorted_read_time = @spans.map(&:read_time).sort
47
+ read_time_p50 = 0 # percentile(sorted_list: sorted_read_time , percentile: 0.50)
48
+ # read_time_max = sorted_read_time.last || 0
40
49
 
41
- time_taken_p50 = percentile(sorted_list: sorted_time_taken, percentile: 0.50)
42
- time_taken_p95 = percentile(sorted_list: sorted_time_taken, percentile: 0.95)
43
- time_taken_p99 = percentile(sorted_list: sorted_time_taken, percentile: 0.99)
44
- time_taken_max = sorted_time_taken.last || 0
50
+ # sorted_write_time = @spans.map(&:write_time).sort
51
+ write_time_p50 = 0 # percentile(sorted_list: sorted_write_time , percentile: 0.50)
52
+ # write_time_max = sorted_write_time.last || 0
45
53
 
46
- total_read_error_count = @spans.map(&:read_error_count).sum
47
- total_write_error_count = @spans.map(&:write_error_count).sum
48
- succeed_rate =
49
- if @spans.length.zero?
50
- 0
51
- else
52
- succeed_rate = (sorted_time_taken.length / @spans.length.to_f).floor(3)
53
- end
54
+ # sorted_time_taken = @spans.select(&:succeed).map(&:time_taken).sort
55
+ time_taken_p50 = 0 # percentile(sorted_list: sorted_time_taken, percentile: 0.50)
56
+ time_taken_p95 = 0 # percentile(sorted_list: sorted_time_taken, percentile: 0.95)
57
+ time_taken_p99 = 0 # percentile(sorted_list: sorted_time_taken, percentile: 0.99)
58
+ # time_taken_max = sorted_time_taken.last || 0
59
+
60
+ # NOTE webに表示していないのでコメントアウト. デバッグ時に見ることがあるので残しておく
61
+ total_read_error_count = 0 # @spans.map(&:read_error_count).sum
62
+ total_write_error_count = 0 # @spans.map(&:write_error_count).sum
63
+
64
+ # succeed_rate =
65
+ # if @spans.length.zero?
66
+ # 0
67
+ # else
68
+ # succeed_rate = (sorted_time_taken.length / @spans.length.to_f).floor(3)
69
+ # end
70
+ succeed_rate = 1 # Switchへの書き込みに失敗した時にretryしているので100%になるようになってる. succeedの個数をカウントコストを減らすためにハードコード
54
71
 
55
72
  PerformanceMetric.new(interval_from_previous_succeed_max,
56
73
  interval_from_previous_succeed_p50,
@@ -34,6 +34,6 @@ class ProconBypassMan::Procon::PerformanceMeasurement::SpanTransferBuffer
34
34
  end
35
35
 
36
36
  def max_buffer
37
- 200
37
+ 50
38
38
  end
39
39
  end
@@ -45,6 +45,13 @@ module ProconBypassMan::Procon::PerformanceMeasurement
45
45
  end
46
46
  end
47
47
 
48
+ # 全部送ると負荷になるので適当にまびく
49
+ def self.is_not_measure_with_random_or_if_fast(span: )
50
+ return false if span.time_taken > 0.1
51
+ return true if rand(100) != 0 # 99/100は捨てる
52
+ return false
53
+ end
54
+
48
55
  # measureをして、measureの結果をためる
49
56
  # @return [Boolean] 成功したか. テスト時に戻り値を使いたい
50
57
  def self.measure(&bypass_process_block)
@@ -63,6 +70,8 @@ module ProconBypassMan::Procon::PerformanceMeasurement
63
70
  span.succeed = bypass_process_block.call(span)
64
71
  }.floor(3)
65
72
 
73
+ return if is_not_measure_with_random_or_if_fast(span: span)
74
+
66
75
  if span.succeed
67
76
  ProconBypassMan::Procon::PerformanceMeasurement::LastBypassAt.touch do |interval_from_previous_succeed|
68
77
  span.interval_from_previous_succeed = interval_from_previous_succeed.floor(3)
@@ -79,11 +88,9 @@ module ProconBypassMan::Procon::PerformanceMeasurement
79
88
  end
80
89
  end
81
90
 
82
- ProconBypassMan::GC.stop_gc_in do
83
- # measureするたびにperform_asyncしているとjob queueが詰まるのでbufferingしている
84
- ProconBypassMan::Procon::PerformanceMeasurement::SpanTransferBuffer.instance.push_and_run_block_if_buffer_over(span) do |spans|
85
- ProconBypassMan::ProconPerformanceSpanTransferJob.perform_async(spans.dup)
86
- end
91
+ # measureするたびにperform_asyncしているとjob queueが詰まるのでbufferingしている
92
+ ProconBypassMan::Procon::PerformanceMeasurement::SpanTransferBuffer.instance.push_and_run_block_if_buffer_over(span) do |spans|
93
+ ProconBypassMan::ProconPerformanceSpanTransferJob.perform_async(spans)
87
94
  end
88
95
  return span.succeed
89
96
  end
@@ -0,0 +1,18 @@
1
+ class ProconBypassMan::Procon::Rumbler
2
+ def self.monitor
3
+ @@must_rumble = false
4
+ return yield
5
+ end
6
+
7
+ def self.rumble!
8
+ @@must_rumble = true
9
+ end
10
+
11
+ def self.must_rumble?
12
+ @@must_rumble
13
+ end
14
+
15
+ def self.binary
16
+ ["100c00000000" + "00001010"].pack("H*")
17
+ end
18
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::SuppressRumble
2
4
  # @param [String] binary
3
5
  def initialize(binary: )
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # ボタンを押しているか判断するクラス。バイナリの書き換えはしない
2
4
  class ProconBypassMan::Procon::UserOperation
3
5
  attr_reader :binary
@@ -36,7 +38,7 @@ class ProconBypassMan::Procon::UserOperation
36
38
  # @param [Symbol, Array<Symbol>] macro_step
37
39
  def press_button_only_or_tilt_sticks(macro_step)
38
40
  macro_step = [macro_step] if not macro_step.is_a?(Array)
39
- # スティック操作の時はボタン入力を通す
41
+ # スティック操作を含む時はボタン入力を通す
40
42
  binary.set_no_action! if is_button?(macro_step)
41
43
 
42
44
  macro_step.uniq.each do |ms|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::Procon::AnalogStick
2
4
  attr_accessor :neutral_position
3
5
  attr_writer :bin_x, :bin_y
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # proconから取得したばかりのバイナリ
2
4
  class ProconBypassMan::Domains::InboundProconBinary < ProconBypassMan::Domains::Binary::Base
3
5
  include ProconBypassMan::Domains::HasImmutableBinary
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # バイナリの書き換えのみをする
2
4
  class ProconBypassMan::Domains::ProcessingProconBinary < ProconBypassMan::Domains::Binary::Base
3
5
  include ProconBypassMan::Domains::HasMutableBinary
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ProconBypassMan::RumbleBinary
2
4
  # @param [String] binary
3
5
  def initialize(binary: )
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "procon_bypass_man/procon/macro_plugin_map"
2
4
 
3
5
  class ProconBypassMan::Procon
@@ -20,17 +22,17 @@ class ProconBypassMan::Procon
20
22
  require "procon_bypass_man/procon/flip_cache"
21
23
  require "procon_bypass_man/procon/press_button_aware"
22
24
  require "procon_bypass_man/procon/suppress_rumble"
25
+ require "procon_bypass_man/procon/rumbler"
23
26
 
24
27
  attr_accessor :user_operation
25
28
 
26
29
  def self.reset!
27
30
  @@status = {
28
- buttons: {},
29
- current_layer_key: :up,
30
31
  ongoing_macro: MacroRegistry.load(:null),
31
- ongoing_mode: ModeRegistry.load(:manual),
32
+ ongoing_mode: ModeRegistry.load(:manual), # 削除予定
32
33
  }
33
- @@left_stick_tilting_power_scaler = ProconBypassMan::AnalogStickTiltingPowerScaler.new
34
+ BlueGreenProcess::SharedVariable.instance.data["buttons"] = {}
35
+ BlueGreenProcess::SharedVariable.instance.data["current_layer_key"] = :up
34
36
  end
35
37
  reset!
36
38
 
@@ -41,10 +43,20 @@ class ProconBypassMan::Procon
41
43
  )
42
44
  end
43
45
 
44
- def status; @@status[:buttons]; end
46
+ def status
47
+ BlueGreenProcess::SharedVariable.instance.data["buttons"]
48
+ end
49
+
50
+ def current_layer_key
51
+ BlueGreenProcess::SharedVariable.instance.data["current_layer_key"].to_sym
52
+ end
53
+
54
+ def current_layer_key=(layer)
55
+ BlueGreenProcess::SharedVariable.instance.data["current_layer_key"] = layer
56
+ end
57
+
45
58
  def ongoing_macro; @@status[:ongoing_macro]; end
46
59
  def ongoing_mode; @@status[:ongoing_mode]; end
47
- def current_layer_key; @@status[:current_layer_key]; end
48
60
 
49
61
  def current_layer
50
62
  ProconBypassMan::ButtonsSettingConfiguration.instance.layers[current_layer_key]
@@ -54,13 +66,15 @@ class ProconBypassMan::Procon
54
66
  def apply!
55
67
  layer_changer = ProconBypassMan::Procon::LayerChanger.new(binary: user_operation.binary)
56
68
  if layer_changer.change_layer?
57
- @@status[:current_layer_key] = layer_changer.next_layer_key if layer_changer.pressed_next_layer?
69
+ if layer_changer.pressed_next_layer?
70
+ self.current_layer_key = layer_changer.next_layer_key
71
+ ProconBypassMan::Procon::Rumbler.rumble!
72
+ end
58
73
  user_operation.set_no_action!
59
74
  return
60
75
  end
61
76
 
62
77
  analog_stick = ProconBypassMan::Procon::AnalogStick.new(binary: user_operation.binary.raw)
63
- dumped_tilting_power = @@left_stick_tilting_power_scaler.add_sample(analog_stick.relative_hypotenuse)
64
78
 
65
79
  enable_all_macro = true
66
80
  enable_macro_map = Hash.new {|h,k| h[k] = true }
@@ -78,16 +92,6 @@ class ProconBypassMan::Procon
78
92
  current_layer.macros.each do |macro_name, options|
79
93
  next unless enable_macro_map[macro_name]
80
94
 
81
- if(if_tilted_left_stick_value = options[:if_tilted_left_stick])
82
- threshold = (if_tilted_left_stick_value.is_a?(Hash) && if_tilted_left_stick_value[:threshold]) || ProconBypassMan::AnalogStickTiltingPowerScaler::DEFAULT_THRESHOLD
83
- if dumped_tilting_power&.tilting?(threshold: threshold, current_position_x: analog_stick.relative_x, current_position_y: analog_stick.relative_y) && user_operation.pressing_all_buttons?(options[:if_pressed])
84
- @@status[:ongoing_macro] = MacroRegistry.load(macro_name)
85
- break
86
- end
87
-
88
- next
89
- end
90
-
91
95
  if user_operation.pressing_all_buttons?(options[:if_pressed])
92
96
  @@status[:ongoing_macro] = MacroRegistry.load(macro_name, force_neutral_buttons: options[:force_neutral])
93
97
  break
@@ -97,10 +101,14 @@ class ProconBypassMan::Procon
97
101
 
98
102
  # remote macro
99
103
  if task = ProconBypassMan::RemoteMacro::TaskQueueInProcess.non_blocking_shift
104
+ no_op_step = :wait_for_0_3 # マクロの最後に固まって最後の入力をし続けるので、無の状態を最後に注入する
105
+ BlueGreenProcess::SharedVariable.extend_run_on_this_process = true
100
106
  ProconBypassMan::Procon::MacroRegistry.cleanup_remote_macros!
101
107
  macro_name = task.name || "RemoteMacro-#{task.steps.join}".to_sym
108
+ task.steps << no_op_step
102
109
  ProconBypassMan::Procon::MacroRegistry.install_plugin(macro_name, steps: task.steps, macro_type: :remote)
103
110
  @@status[:ongoing_macro] = MacroRegistry.load(macro_name, macro_type: :remote) do
111
+ GC.start # NOTE: extend_run_on_this_process = true するとGCされなくなるので手動で呼び出す
104
112
  ProconBypassMan::PostCompletedRemoteMacroJob.perform_async(task.uuid)
105
113
  end
106
114
  end
@@ -110,6 +118,7 @@ class ProconBypassMan::Procon
110
118
  @@status[:ongoing_mode] = ModeRegistry.load(:manual)
111
119
  current_layer.flip_buttons.each do |button, options|
112
120
  if !options[:if_pressed]
121
+ # FIXME マルチプロセス化したので、クラス変数に状態を保持するFlipCacheは意図した挙動にならない. BlueGreenProcess.shared_variables を使って状態をプロセス間で共有すれば動く
113
122
  FlipCache.fetch(key: button, expires_in: options[:flip_interval]) do
114
123
  status[button] = !status[button]
115
124
  end
@@ -146,6 +155,7 @@ class ProconBypassMan::Procon
146
155
  end
147
156
 
148
157
  if ongoing_macro.ongoing? && (step = ongoing_macro.next_step)
158
+ BlueGreenProcess::SharedVariable.extend_run_on_this_process = true
149
159
  ongoing_macro.force_neutral_buttons&.each do |force_neutral_button|
150
160
  user_operation.unpress_button(force_neutral_button)
151
161
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ProconBypassMan
2
4
  module RemoteMacro
3
5
  require "procon_bypass_man/remote_macro/remote_macro_object"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ProconBypassMan
2
4
  module RemotePbmAction
3
5
  require "procon_bypass_man/remote_pbm_action/base_action"
@@ -19,7 +19,6 @@ class ProconBypassMan::Runner
19
19
  end
20
20
 
21
21
  loop do
22
- # NOTE メインプロセスではThreadをいくつか起動しているので念のためパフォーマンスを優先するためにforkしていく
23
22
  child_pid = Kernel.fork do
24
23
  $will_terminate_token = false
25
24
  ProconBypassMan.after_fork_on_bypass_process
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ProconBypassMan
2
4
  module CallbacksRegisterable
3
5
  attr_accessor :callbacks
@@ -93,9 +95,14 @@ module ProconBypassMan
93
95
  return self.class.__callbacks[kind.to_sym]
94
96
  end
95
97
 
96
- list = self.class.callbacks.flat_map { |callback_mod|
97
- callback_mod.__callbacks && callback_mod.__callbacks[kind.to_sym]
98
- }.compact
98
+ list =
99
+ if self.class.callbacks.nil?
100
+ []
101
+ else
102
+ self.class.callbacks.flat_map { |callback_mod|
103
+ callback_mod.__callbacks && callback_mod.__callbacks[kind.to_sym]
104
+ }.compact
105
+ end
99
106
  if(self.class.respond_to?(:__callbacks) && chain = self.class.__callbacks[kind.to_sym])
100
107
  list << chain
101
108
  end
@@ -34,6 +34,7 @@ module ProconBypassMan
34
34
 
35
35
  def get
36
36
  handle_request do
37
+ ProconBypassMan.logger.info "[HTTP] GET #{@uri}"
37
38
  response = HttpRequest::Get.request!(
38
39
  uri: @uri,
39
40
  )
@@ -44,6 +45,7 @@ module ProconBypassMan
44
45
  def post(request_body: )
45
46
  handle_request do
46
47
  body = {}.merge!(request_body)
48
+ ProconBypassMan.logger.info "[HTTP] POST #{@uri}"
47
49
  response = HttpRequest::Post.request!(
48
50
  uri: @uri,
49
51
  request_body: body,
@@ -57,6 +59,7 @@ module ProconBypassMan
57
59
  body = {
58
60
  hostname: `hostname`.chomp,
59
61
  }.merge!(request_body)
62
+ ProconBypassMan.logger.info "[HTTP] PUT #{@uri}"
60
63
  response = HttpRequest::Put.request!(
61
64
  uri: @uri,
62
65
  request_body: body,
@@ -0,0 +1,17 @@
1
+ module ProconBypassMan
2
+ class ReniceCommand
3
+ def self.change_priority(to: , pid: )
4
+ cmd =
5
+ case to
6
+ when :high
7
+ "renice -n -20 -p #{pid}"
8
+ when :low
9
+ "renice -n 20 -p #{pid}"
10
+ else
11
+ raise "unknown priority"
12
+ end
13
+ ProconBypassMan.logger.debug { "[SHELL] #{cmd}" }
14
+ `#{cmd}`
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ProconBypassMan
4
- VERSION = "0.2.3"
4
+ VERSION = "0.3.1"
5
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "logger"
2
4
  require 'yaml'
3
5
  require "json"
@@ -10,6 +12,7 @@ require "ext/em_pure_ruby"
10
12
  require "ext/module"
11
13
  require "resolv-replace"
12
14
  require "pbmenv"
15
+ require "blue_green_process"
13
16
 
14
17
  require_relative "procon_bypass_man/version"
15
18
 
@@ -32,12 +35,12 @@ require_relative "procon_bypass_man/support/remote_macro_http_client"
32
35
  require_relative "procon_bypass_man/support/update_remote_pbm_action_status_http_client"
33
36
  require_relative "procon_bypass_man/support/send_device_stats_http_client"
34
37
  require_relative "procon_bypass_man/support/procon_performance_http_client"
35
- require_relative "procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler"
36
38
  require_relative "procon_bypass_man/support/never_exit_accidentally"
37
39
  require_relative "procon_bypass_man/support/cycle_sleep"
38
40
  require_relative "procon_bypass_man/support/can_over_process"
39
41
  require_relative "procon_bypass_man/support/gc"
40
42
  require_relative "procon_bypass_man/support/retryable"
43
+ require_relative "procon_bypass_man/support/renice_command"
41
44
  require_relative "procon_bypass_man/procon_display"
42
45
  require_relative "procon_bypass_man/background"
43
46
  require_relative "procon_bypass_man/commands"
@@ -46,6 +49,7 @@ require_relative "procon_bypass_man/device_status"
46
49
  require_relative "procon_bypass_man/runner"
47
50
  require_relative "procon_bypass_man/processor"
48
51
  require_relative "procon_bypass_man/configuration"
52
+ require_relative "procon_bypass_man/ephemeral_configuration"
49
53
  require_relative "procon_bypass_man/buttons_setting_configuration"
50
54
  require_relative "procon_bypass_man/procon"
51
55
  require_relative "procon_bypass_man/device_model"
@@ -139,6 +143,11 @@ module ProconBypassMan
139
143
  @@configuration ||= ProconBypassMan::Configuration.new
140
144
  end
141
145
 
146
+ # @return [ProconBypassMan::EphemeralConfiguration]
147
+ def self.ephemeral_config
148
+ @@ephemeral_configuration ||= ProconBypassMan::EphemeralConfiguration.new
149
+ end
150
+
142
151
  # @return [void]
143
152
  def self.reset!
144
153
  ProconBypassMan::Procon::MacroRegistry.reset!
@@ -149,7 +158,7 @@ module ProconBypassMan
149
158
 
150
159
  # @return [void]
151
160
  def self.initialize_pbm
152
- `renice -n 20 -p #{$$}`
161
+ ProconBypassMan::ReniceCommand.change_priority(to: :low, pid: $$)
153
162
  ProconBypassMan::Background::JobQueue.start!
154
163
  ProconBypassMan::Websocket::Client.start!
155
164
  # TODO ProconBypassMan::DrbObjects.start_all! みたいな感じで書きたい
@@ -173,18 +182,27 @@ module ProconBypassMan
173
182
 
174
183
  # @return [void]
175
184
  def self.after_fork_on_bypass_process
176
- `renice -n -20 -p #{$$}`
185
+ ProconBypassMan::ReniceCommand.change_priority(to: :high, pid: $$)
177
186
  ::GC.start
178
187
  DRb.start_service if defined?(DRb)
179
- ProconBypassMan::RemoteMacroReceiver.start!
180
- ProconBypassMan::ProconDisplay::Server.start!
188
+ # GC対策することによって一時的に削除した機能
189
+ # ProconBypassMan::ProconDisplay::Server.start!
190
+
191
+ DRb.start_service if defined?(DRb)
192
+ BlueGreenProcess.configure do |config|
193
+ config.after_fork = -> {
194
+ DRb.start_service if defined?(DRb)
195
+ ProconBypassMan::RemoteMacroReceiver.start!
196
+ BlueGreenProcess.config.logger = ProconBypassMan.logger
197
+ }
198
+ config.shared_variables = [:buttons, :current_layer_key]
199
+ end
181
200
  end
182
201
 
183
202
  # @return [void]
184
203
  def self.terminate_pbm
185
204
  FileUtils.rm_rf(ProconBypassMan.pid_path)
186
205
  FileUtils.rm_rf(ProconBypassMan.digest_path)
187
- ProconBypassMan::Background::JobQueue.shutdown
188
206
  ProconBypassMan::RemoteMacro::QueueOverProcess.shutdown
189
207
  ProconBypassMan::Procon::PerformanceMeasurement::QueueOverProcess.shutdown
190
208
  self.worker&.shutdown
@@ -28,9 +28,11 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ["lib"]
29
29
 
30
30
  # Uncomment to register a new dependency of your gem
31
- spec.add_dependency "pbmenv", ">= 0.1.9" # Pbmenv.installでのenable_pbm_cloudに依存している
31
+ spec.add_dependency "pbmenv", ">= 0.1.9" # enable_pbm_cloud連携機能でPbmenv.installを使っている.
32
32
  spec.add_dependency "action_cable_client"
33
33
  spec.add_dependency "sorted_set"
34
+ spec.add_dependency "blue_green_process"
35
+ # spec.add_dependency "blue_green_process"
34
36
 
35
37
  # For more information and examples about making a new gem, checkout our
36
38
  # guide at: https://bundler.io/guides/creating_gem.html
@@ -12,7 +12,7 @@ begin
12
12
  gemfile do
13
13
  source 'https://rubygems.org'
14
14
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
15
- gem 'procon_bypass_man', '0.2.3'
15
+ gem 'procon_bypass_man', '0.3.1'
16
16
  end
17
17
  rescue Bundler::Source::Git::GitCommandError => e
18
18
  retry_count_on_git_command_error = retry_count_on_git_command_error + 1
@@ -49,9 +49,6 @@ ProconBypassMan.configure do |config|
49
49
 
50
50
  # 接続に成功したらコントローラーのHOME LEDを光らせるか
51
51
  config.enable_home_led_on_connect = true
52
-
53
- # 操作が高頻度で固まるときは、 gadget_to_procon_interval の数値を大きくしてください
54
- config.bypass_mode = { mode: :normal, gadget_to_procon_interval: 10 }
55
52
  end
56
53
 
57
54
  ProconBypassMan.run(setting_path: "/usr/share/pbm/current/setting.yml")
@@ -12,7 +12,7 @@ begin
12
12
  gemfile do
13
13
  source 'https://rubygems.org'
14
14
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
15
- gem 'procon_bypass_man', '0.2.3'
15
+ gem 'procon_bypass_man', '0.3.1'
16
16
  end
17
17
  rescue Bundler::Source::Git::GitCommandError => e
18
18
  retry_count_on_git_command_error = retry_count_on_git_command_error + 1
@@ -54,9 +54,6 @@ ProconBypassMan.configure do |config|
54
54
 
55
55
  # 接続に成功したらコントローラーのHOME LEDを光らせるか
56
56
  config.enable_home_led_on_connect = true
57
-
58
- # 操作が高頻度で固まるときは、 gadget_to_procon_interval の数値を大きくしてください
59
- config.bypass_mode = { mode: :normal, gadget_to_procon_interval: 10 }
60
57
  end
61
58
 
62
59
  ProconBypassMan.run(setting_path: "/usr/share/pbm/current/setting.yml")
@@ -1,5 +1,8 @@
1
1
  version: 1.0
2
2
  setting: |-
3
+ # レイヤー変更時にコントローラーが振動する。有効にすると稀に、コントローラーが数秒間固まることがあります。
4
+ # enable(:rumble_on_layer_change)
5
+
3
6
  prefix_keys_for_changing_layer [:zr, :zl, :l]
4
7
 
5
8
  layer :up do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: procon_bypass_man
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jiikko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-26 00:00:00.000000000 Z
11
+ date: 2022-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pbmenv
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: blue_green_process
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: A programmable converter for Nintendo Switch Pro Controller
56
70
  email:
57
71
  - n905i.1214@gmail.com
@@ -81,7 +95,7 @@ files:
81
95
  - docs/getting_started.md
82
96
  - docs/how_to_connect_procon.md
83
97
  - docs/setting/left-analogstick-cap.md
84
- - docs/setting/splatoon2_macro_dasei_cancel.md
98
+ - docs/setting/splatoon2_macro_forward_ikarole.md
85
99
  - docs/setting/splatoon2_macro_sokuwari_bubble.md
86
100
  - docs/setting/splatoon2_recommended_setting.md
87
101
  - docs/setting/splatoon2_shake_tansan.md
@@ -147,9 +161,10 @@ files:
147
161
  - lib/procon_bypass_man/device_connection/spoofing_output_report_watcher.rb
148
162
  - lib/procon_bypass_man/device_model.rb
149
163
  - lib/procon_bypass_man/device_status.rb
164
+ - lib/procon_bypass_man/ephemeral_configuration.rb
150
165
  - lib/procon_bypass_man/plugin/splatoon2/macro/charge_tansan_bomb.rb
151
- - lib/procon_bypass_man/plugin/splatoon2/macro/dasei_cancel.rb
152
166
  - lib/procon_bypass_man/plugin/splatoon2/macro/fast_return.rb
167
+ - lib/procon_bypass_man/plugin/splatoon2/macro/forward_ikarole.rb
153
168
  - lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_left_key.rb
154
169
  - lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_right_key.rb
155
170
  - lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_up_key.rb
@@ -180,6 +195,7 @@ files:
180
195
  - lib/procon_bypass_man/procon/performance_measurement/span_queue.rb
181
196
  - lib/procon_bypass_man/procon/performance_measurement/span_transfer_buffer.rb
182
197
  - lib/procon_bypass_man/procon/press_button_aware.rb
198
+ - lib/procon_bypass_man/procon/rumbler.rb
183
199
  - lib/procon_bypass_man/procon/suppress_rumble.rb
184
200
  - lib/procon_bypass_man/procon/user_operation.rb
185
201
  - lib/procon_bypass_man/procon/value_objects/analog_stick.rb
@@ -218,7 +234,6 @@ files:
218
234
  - lib/procon_bypass_man/remote_pbm_action/value_objects/remote_pbm_action_object.rb
219
235
  - lib/procon_bypass_man/runner.rb
220
236
  - lib/procon_bypass_man/scheduler.rb
221
- - lib/procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler.rb
222
237
  - lib/procon_bypass_man/support/callbacks.rb
223
238
  - lib/procon_bypass_man/support/can_over_process.rb
224
239
  - lib/procon_bypass_man/support/compress_array.rb
@@ -232,6 +247,7 @@ files:
232
247
  - lib/procon_bypass_man/support/on_memory_cache.rb
233
248
  - lib/procon_bypass_man/support/procon_performance_http_client.rb
234
249
  - lib/procon_bypass_man/support/remote_macro_http_client.rb
250
+ - lib/procon_bypass_man/support/renice_command.rb
235
251
  - lib/procon_bypass_man/support/report_http_client.rb
236
252
  - lib/procon_bypass_man/support/retryable.rb
237
253
  - lib/procon_bypass_man/support/safe_timeout.rb