procon_bypass_man 0.2.3 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile.lock +4 -2
  4. data/README.md +11 -33
  5. data/docs/getting_started.md +8 -0
  6. data/docs/setting/splatoon2_macro_forward_ikarole.md +34 -0
  7. data/docs/setup_raspi.md +12 -15
  8. data/docs/setup_raspi_by_mitamae.md +0 -1
  9. data/lib/procon_bypass_man/buttons_setting_configuration/layer.rb +1 -0
  10. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +2 -1
  11. data/lib/procon_bypass_man/buttons_setting_configuration.rb +11 -0
  12. data/lib/procon_bypass_man/bypass/bypass_command.rb +11 -6
  13. data/lib/procon_bypass_man/bypass/procon_to_switch.rb +44 -41
  14. data/lib/procon_bypass_man/bypass/switch_to_procon.rb +2 -0
  15. data/lib/procon_bypass_man/commands/print_boot_message_command.rb +0 -2
  16. data/lib/procon_bypass_man/configuration.rb +4 -0
  17. data/lib/procon_bypass_man/device_connection/procon_setting_overrider.rb +0 -3
  18. data/lib/procon_bypass_man/ephemeral_configuration.rb +9 -0
  19. data/lib/procon_bypass_man/plugin/splatoon2/macro/{dasei_cancel.rb → forward_ikarole.rb} +4 -4
  20. data/lib/procon_bypass_man/plugins.rb +1 -1
  21. data/lib/procon_bypass_man/procon/analog_stick_manipulator.rb +18 -4
  22. data/lib/procon_bypass_man/procon/layer_changer.rb +2 -0
  23. data/lib/procon_bypass_man/procon/macro.rb +2 -0
  24. data/lib/procon_bypass_man/procon/macro_builder.rb +13 -0
  25. data/lib/procon_bypass_man/procon/macro_registry.rb +2 -0
  26. data/lib/procon_bypass_man/procon/performance_measurement/measurements_summarizer.rb +41 -24
  27. data/lib/procon_bypass_man/procon/performance_measurement/span_transfer_buffer.rb +1 -1
  28. data/lib/procon_bypass_man/procon/performance_measurement.rb +12 -5
  29. data/lib/procon_bypass_man/procon/rumbler.rb +18 -0
  30. data/lib/procon_bypass_man/procon/suppress_rumble.rb +2 -0
  31. data/lib/procon_bypass_man/procon/user_operation.rb +3 -1
  32. data/lib/procon_bypass_man/procon/value_objects/analog_stick.rb +2 -0
  33. data/lib/procon_bypass_man/procon/value_objects/binary/inbound_procon_binary.rb +2 -0
  34. data/lib/procon_bypass_man/procon/value_objects/binary/processing_procon_binary.rb +2 -0
  35. data/lib/procon_bypass_man/procon/value_objects/rumble_binary.rb +2 -0
  36. data/lib/procon_bypass_man/procon.rb +28 -18
  37. data/lib/procon_bypass_man/remote_macro.rb +2 -0
  38. data/lib/procon_bypass_man/remote_pbm_action.rb +2 -0
  39. data/lib/procon_bypass_man/runner.rb +0 -1
  40. data/lib/procon_bypass_man/support/callbacks.rb +10 -3
  41. data/lib/procon_bypass_man/support/http_client.rb +3 -0
  42. data/lib/procon_bypass_man/support/renice_command.rb +17 -0
  43. data/lib/procon_bypass_man/version.rb +1 -1
  44. data/lib/procon_bypass_man.rb +24 -6
  45. data/procon_bypass_man.gemspec +3 -1
  46. data/project_template/app.rb +1 -4
  47. data/project_template/app.rb.erb +1 -4
  48. data/project_template/setting.yml +3 -0
  49. metadata +21 -5
  50. data/docs/setting/splatoon2_macro_dasei_cancel.md +0 -77
  51. data/lib/procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler.rb +0 -59
@@ -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