From 6143c2a13cba5569c46a4bd33cb3e36fba5b67bc Mon Sep 17 00:00:00 2001 From: Rolando Diaz Hichez Date: Mon, 4 Apr 2022 16:20:57 -0400 Subject: [PATCH 1/7] chore(qsc/q_sys_camera): Ported ACAEngine ruby driver --- drivers/qsc/q_sys_camera.cr | 95 ++++++++++++++++++++++++++++++++ drivers/qsc/q_sys_camera_spec.cr | 2 + 2 files changed, 97 insertions(+) create mode 100644 drivers/qsc/q_sys_camera.cr create mode 100644 drivers/qsc/q_sys_camera_spec.cr diff --git a/drivers/qsc/q_sys_camera.cr b/drivers/qsc/q_sys_camera.cr new file mode 100644 index 00000000000..2f7275d9cab --- /dev/null +++ b/drivers/qsc/q_sys_camera.cr @@ -0,0 +1,95 @@ +# encoding: ASCII-8BIT +# frozen_string_literal: true + +require "placeos-driver" + +class Qsc::QSysCamera < PlaceOS::Driver + # include Interface::Powerable + + # Discovery Information + descriptive_name "QSC PTZ Camera Proxy" + generic_name :Camera + + Delimiter = "\r\n" + state: Bool = false + @ids = Hash(String, String).new + @mod_id: String = "Mixer" + + default_settings({ + "ids": { + "pan_left": "3122-RGHT-PTZ-12x72PanLeft", + "pan_right": "3122-RGHT-PTZ-12x72PanRight", + "power": "3122-RGHT-PTZ-12x72PrivacyMode", + "preset_home_load": "3122-RGHT-PTZ-12x72Home", + "tilt_down": "3122-RGHT-PTZ-12x72TiltDown", + "tilt_up": "3122-RGHT-PTZ-12x72TiltUp", + "zoom_in": "3122-RGHT-PTZ-12x72ZoomIn", + "zoom_out": "3122-RGHT-PTZ-12x72ZoomOut" + } + } + ) + + def on_load + transport.tokenizer = Tokenizer.new(Delimiter) + on_update + end + + def on_update + @mod_id = setting?(String, :driver) || "Mixer" + @ids = setting?(Hash(String, String), :ids) || Hash(String, String).new + self[:no_discrete_zoom] = true + end + + def power(state : Bool) + camera.mute(@ids[:power], state) + end + + def adjust_tilt(direction : String) + case direction + when :down + camera.mute(@ids[:tilt_down], true) + when :up + camera.mute(@ids[:tilt_up], true) + else # stop + camera.mute(@ids[:tilt_up], false) + camera.mute(@ids[:tilt_down], false) + end + end + + def adjust_pan(direction : String) + + case direction + when :right + camera.mute(@ids[:pan_right], true) + when :left + camera.mute(@ids[:pan_left], true) + else # stop + camera.mute(@ids[:pan_right], false) + camera.mute(@ids[:pan_left], false) + end + end + + def home + camera.trigger(@ids[:preset_home_load]) + end + + def preset(presetName : String) + home + end + + def zoom(direction : String) + case direction + when :in + camera.mute(@ids[:zoom_in], true) + when :out + camera.mute(@ids[:zoom_out], true) + else #stop + camera.mute(@ids[:zoom_in], false) + camera.mute(@ids[:zoom_out], false) + end + end + + protected def camera + system[@mod_id] + end +end \ No newline at end of file diff --git a/drivers/qsc/q_sys_camera_spec.cr b/drivers/qsc/q_sys_camera_spec.cr new file mode 100644 index 00000000000..cbff2be238d --- /dev/null +++ b/drivers/qsc/q_sys_camera_spec.cr @@ -0,0 +1,2 @@ +require "placeos-driver/spec" + From 1efbfa25bf54e3838ad7dec91a87d0ec438a99d9 Mon Sep 17 00:00:00 2001 From: Rolando Diaz Hichez Date: Wed, 6 Apr 2022 17:34:50 -0400 Subject: [PATCH 2/7] chore(qsc/q_sys_camera): changed symbol type to string --- drivers/qsc/q_sys_camera.cr | 147 ++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 75 deletions(-) diff --git a/drivers/qsc/q_sys_camera.cr b/drivers/qsc/q_sys_camera.cr index 2f7275d9cab..77520a3d152 100644 --- a/drivers/qsc/q_sys_camera.cr +++ b/drivers/qsc/q_sys_camera.cr @@ -1,95 +1,92 @@ # encoding: ASCII-8BIT # frozen_string_literal: true - +require "placeos-driver/interface/powerable" require "placeos-driver" class Qsc::QSysCamera < PlaceOS::Driver - # include Interface::Powerable + include Interface::Powerable - # Discovery Information - descriptive_name "QSC PTZ Camera Proxy" - generic_name :Camera + # Discovery Information + descriptive_name "QSC PTZ Camera Proxy" + generic_name :Camera - Delimiter = "\r\n" - state: Bool = false - @ids = Hash(String, String).new - @mod_id: String = "Mixer" + state : Bool = false + @ids = Hash(String, String).new + @mod_id : String = "Mixer" - default_settings({ - "ids": { - "pan_left": "3122-RGHT-PTZ-12x72PanLeft", - "pan_right": "3122-RGHT-PTZ-12x72PanRight", - "power": "3122-RGHT-PTZ-12x72PrivacyMode", - "preset_home_load": "3122-RGHT-PTZ-12x72Home", - "tilt_down": "3122-RGHT-PTZ-12x72TiltDown", - "tilt_up": "3122-RGHT-PTZ-12x72TiltUp", - "zoom_in": "3122-RGHT-PTZ-12x72ZoomIn", - "zoom_out": "3122-RGHT-PTZ-12x72ZoomOut" - } - } - ) + default_settings({ + "ids": { + "pan_left": "3122-RGHT-PTZ-12x72PanLeft", + "pan_right": "3122-RGHT-PTZ-12x72PanRight", + "power": "3122-RGHT-PTZ-12x72PrivacyMode", + "preset_home_load": "3122-RGHT-PTZ-12x72Home", + "tilt_down": "3122-RGHT-PTZ-12x72TiltDown", + "tilt_up": "3122-RGHT-PTZ-12x72TiltUp", + "zoom_in": "3122-RGHT-PTZ-12x72ZoomIn", + "zoom_out": "3122-RGHT-PTZ-12x72ZoomOut", + }, + } + ) - def on_load - transport.tokenizer = Tokenizer.new(Delimiter) - on_update - end + def on_load + on_update + end - def on_update - @mod_id = setting?(String, :driver) || "Mixer" - @ids = setting?(Hash(String, String), :ids) || Hash(String, String).new - self[:no_discrete_zoom] = true - end + def on_update + @mod_id = setting?(String, :driver) || "Mixer" + @ids = setting?(Hash(String, String), :ids) || Hash(String, String).new + self[:no_discrete_zoom] = true + end - def power(state : Bool) - camera.mute(@ids[:power], state) - end + def power(state : Bool) + camera.mute(@ids[:power], state) + end - def adjust_tilt(direction : String) - case direction - when :down - camera.mute(@ids[:tilt_down], true) - when :up - camera.mute(@ids[:tilt_up], true) - else # stop - camera.mute(@ids[:tilt_up], false) - camera.mute(@ids[:tilt_down], false) - end + def adjust_tilt(direction : String) + case direction + when "down" + camera.mute(@ids[:tilt_down], true) + when "up" + camera.mute(@ids[:tilt_up], true) + else # stop + camera.mute(@ids[:tilt_up], false) + camera.mute(@ids[:tilt_down], false) end + end - def adjust_pan(direction : String) - - case direction - when :right - camera.mute(@ids[:pan_right], true) - when :left - camera.mute(@ids[:pan_left], true) - else # stop - camera.mute(@ids[:pan_right], false) - camera.mute(@ids[:pan_left], false) - end + def adjust_pan(direction : String) + case direction + when "right" + camera.mute(@ids[:pan_right], true) + when "left" + camera.mute(@ids[:pan_left], true) + else # stop + camera.mute(@ids[:pan_right], false) + camera.mute(@ids[:pan_left], false) end + end - def home - camera.trigger(@ids[:preset_home_load]) - end + def home + camera.trigger(@ids[:preset_home_load]) + end - def preset(presetName : String) - home - end + def preset(presetName : String) + home + end - def zoom(direction : String) - case direction - when :in - camera.mute(@ids[:zoom_in], true) - when :out - camera.mute(@ids[:zoom_out], true) - else #stop - camera.mute(@ids[:zoom_in], false) - camera.mute(@ids[:zoom_out], false) - end + def zoom(direction : String) + case direction + when "in" + camera.mute(@ids[:zoom_in], true) + when "out" + camera.mute(@ids[:zoom_out], true) + else # stop + camera.mute(@ids[:zoom_in], false) + camera.mute(@ids[:zoom_out], false) end + end - protected def camera - system[@mod_id] - end -end \ No newline at end of file + protected def camera + system[@mod_id] + end +end From 7e431e91160fd16a7a52b41ce9041d6fe9ce7b73 Mon Sep 17 00:00:00 2001 From: Rolando Diaz Hichez Date: Wed, 6 Apr 2022 17:38:04 -0400 Subject: [PATCH 3/7] chore(qsc/q_sys_camera): added crystal tool formatting --- drivers/qsc/q_sys_camera.cr | 143 ++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/drivers/qsc/q_sys_camera.cr b/drivers/qsc/q_sys_camera.cr index 77520a3d152..9bfd3ee6b69 100644 --- a/drivers/qsc/q_sys_camera.cr +++ b/drivers/qsc/q_sys_camera.cr @@ -4,89 +4,90 @@ require "placeos-driver/interface/powerable" require "placeos-driver" class Qsc::QSysCamera < PlaceOS::Driver - include Interface::Powerable + include Interface::Powerable - # Discovery Information - descriptive_name "QSC PTZ Camera Proxy" - generic_name :Camera + # Discovery Information + descriptive_name "QSC PTZ Camera Proxy" + generic_name :Camera - state : Bool = false - @ids = Hash(String, String).new - @mod_id : String = "Mixer" + state: Bool = false + @ids = Hash(String, String).new + @mod_id: String = "Mixer" - default_settings({ - "ids": { - "pan_left": "3122-RGHT-PTZ-12x72PanLeft", - "pan_right": "3122-RGHT-PTZ-12x72PanRight", - "power": "3122-RGHT-PTZ-12x72PrivacyMode", - "preset_home_load": "3122-RGHT-PTZ-12x72Home", - "tilt_down": "3122-RGHT-PTZ-12x72TiltDown", - "tilt_up": "3122-RGHT-PTZ-12x72TiltUp", - "zoom_in": "3122-RGHT-PTZ-12x72ZoomIn", - "zoom_out": "3122-RGHT-PTZ-12x72ZoomOut", - }, - } - ) + default_settings({ + "ids": { + "pan_left": "3122-RGHT-PTZ-12x72PanLeft", + "pan_right": "3122-RGHT-PTZ-12x72PanRight", + "power": "3122-RGHT-PTZ-12x72PrivacyMode", + "preset_home_load": "3122-RGHT-PTZ-12x72Home", + "tilt_down": "3122-RGHT-PTZ-12x72TiltDown", + "tilt_up": "3122-RGHT-PTZ-12x72TiltUp", + "zoom_in": "3122-RGHT-PTZ-12x72ZoomIn", + "zoom_out": "3122-RGHT-PTZ-12x72ZoomOut" + } + } + ) - def on_load - on_update - end + def on_load + on_update + end - def on_update - @mod_id = setting?(String, :driver) || "Mixer" - @ids = setting?(Hash(String, String), :ids) || Hash(String, String).new - self[:no_discrete_zoom] = true - end + def on_update + @mod_id = setting?(String, :driver) || "Mixer" + @ids = setting?(Hash(String, String), :ids) || Hash(String, String).new + self[:no_discrete_zoom] = true + end - def power(state : Bool) - camera.mute(@ids[:power], state) - end + def power(state : Bool) + camera.mute(@ids[:power], state) + end - def adjust_tilt(direction : String) - case direction - when "down" - camera.mute(@ids[:tilt_down], true) - when "up" - camera.mute(@ids[:tilt_up], true) - else # stop - camera.mute(@ids[:tilt_up], false) - camera.mute(@ids[:tilt_down], false) + def adjust_tilt(direction : String) + case direction + when "down" + camera.mute(@ids[:tilt_down], true) + when "up" + camera.mute(@ids[:tilt_up], true) + else # stop + camera.mute(@ids[:tilt_up], false) + camera.mute(@ids[:tilt_down], false) + end end - end - def adjust_pan(direction : String) - case direction - when "right" - camera.mute(@ids[:pan_right], true) - when "left" - camera.mute(@ids[:pan_left], true) - else # stop - camera.mute(@ids[:pan_right], false) - camera.mute(@ids[:pan_left], false) + def adjust_pan(direction : String) + + case direction + when "right" + camera.mute(@ids[:pan_right], true) + when "left" + camera.mute(@ids[:pan_left], true) + else # stop + camera.mute(@ids[:pan_right], false) + camera.mute(@ids[:pan_left], false) + end end - end - def home - camera.trigger(@ids[:preset_home_load]) - end + def home + camera.trigger(@ids[:preset_home_load]) + end - def preset(presetName : String) - home - end + def preset(presetName : String) + home + end - def zoom(direction : String) - case direction - when "in" - camera.mute(@ids[:zoom_in], true) - when "out" - camera.mute(@ids[:zoom_out], true) - else # stop - camera.mute(@ids[:zoom_in], false) - camera.mute(@ids[:zoom_out], false) + def zoom(direction : String) + case direction + when "in" + camera.mute(@ids[:zoom_in], true) + when "out" + camera.mute(@ids[:zoom_out], true) + else #stop + camera.mute(@ids[:zoom_in], false) + camera.mute(@ids[:zoom_out], false) + end end - end - protected def camera - system[@mod_id] - end -end + protected def camera + system[@mod_id] + end +end \ No newline at end of file From ed3b944b418acc6530beb64574955ba1aebbc58c Mon Sep 17 00:00:00 2001 From: Rolando Diaz Hichez Date: Wed, 6 Apr 2022 18:08:39 -0400 Subject: [PATCH 4/7] chore(qsc/q_sys_camera): added crystal tool formatting --- drivers/qsc/q_sys_camera.cr | 143 +++++++++++++++---------------- drivers/qsc/q_sys_camera_spec.cr | 1 - 2 files changed, 71 insertions(+), 73 deletions(-) diff --git a/drivers/qsc/q_sys_camera.cr b/drivers/qsc/q_sys_camera.cr index 9bfd3ee6b69..77520a3d152 100644 --- a/drivers/qsc/q_sys_camera.cr +++ b/drivers/qsc/q_sys_camera.cr @@ -4,90 +4,89 @@ require "placeos-driver/interface/powerable" require "placeos-driver" class Qsc::QSysCamera < PlaceOS::Driver - include Interface::Powerable + include Interface::Powerable - # Discovery Information - descriptive_name "QSC PTZ Camera Proxy" - generic_name :Camera + # Discovery Information + descriptive_name "QSC PTZ Camera Proxy" + generic_name :Camera - state: Bool = false - @ids = Hash(String, String).new - @mod_id: String = "Mixer" + state : Bool = false + @ids = Hash(String, String).new + @mod_id : String = "Mixer" - default_settings({ - "ids": { - "pan_left": "3122-RGHT-PTZ-12x72PanLeft", - "pan_right": "3122-RGHT-PTZ-12x72PanRight", - "power": "3122-RGHT-PTZ-12x72PrivacyMode", - "preset_home_load": "3122-RGHT-PTZ-12x72Home", - "tilt_down": "3122-RGHT-PTZ-12x72TiltDown", - "tilt_up": "3122-RGHT-PTZ-12x72TiltUp", - "zoom_in": "3122-RGHT-PTZ-12x72ZoomIn", - "zoom_out": "3122-RGHT-PTZ-12x72ZoomOut" - } - } - ) + default_settings({ + "ids": { + "pan_left": "3122-RGHT-PTZ-12x72PanLeft", + "pan_right": "3122-RGHT-PTZ-12x72PanRight", + "power": "3122-RGHT-PTZ-12x72PrivacyMode", + "preset_home_load": "3122-RGHT-PTZ-12x72Home", + "tilt_down": "3122-RGHT-PTZ-12x72TiltDown", + "tilt_up": "3122-RGHT-PTZ-12x72TiltUp", + "zoom_in": "3122-RGHT-PTZ-12x72ZoomIn", + "zoom_out": "3122-RGHT-PTZ-12x72ZoomOut", + }, + } + ) - def on_load - on_update - end + def on_load + on_update + end - def on_update - @mod_id = setting?(String, :driver) || "Mixer" - @ids = setting?(Hash(String, String), :ids) || Hash(String, String).new - self[:no_discrete_zoom] = true - end + def on_update + @mod_id = setting?(String, :driver) || "Mixer" + @ids = setting?(Hash(String, String), :ids) || Hash(String, String).new + self[:no_discrete_zoom] = true + end - def power(state : Bool) - camera.mute(@ids[:power], state) - end + def power(state : Bool) + camera.mute(@ids[:power], state) + end - def adjust_tilt(direction : String) - case direction - when "down" - camera.mute(@ids[:tilt_down], true) - when "up" - camera.mute(@ids[:tilt_up], true) - else # stop - camera.mute(@ids[:tilt_up], false) - camera.mute(@ids[:tilt_down], false) - end + def adjust_tilt(direction : String) + case direction + when "down" + camera.mute(@ids[:tilt_down], true) + when "up" + camera.mute(@ids[:tilt_up], true) + else # stop + camera.mute(@ids[:tilt_up], false) + camera.mute(@ids[:tilt_down], false) end + end - def adjust_pan(direction : String) - - case direction - when "right" - camera.mute(@ids[:pan_right], true) - when "left" - camera.mute(@ids[:pan_left], true) - else # stop - camera.mute(@ids[:pan_right], false) - camera.mute(@ids[:pan_left], false) - end + def adjust_pan(direction : String) + case direction + when "right" + camera.mute(@ids[:pan_right], true) + when "left" + camera.mute(@ids[:pan_left], true) + else # stop + camera.mute(@ids[:pan_right], false) + camera.mute(@ids[:pan_left], false) end + end - def home - camera.trigger(@ids[:preset_home_load]) - end + def home + camera.trigger(@ids[:preset_home_load]) + end - def preset(presetName : String) - home - end + def preset(presetName : String) + home + end - def zoom(direction : String) - case direction - when "in" - camera.mute(@ids[:zoom_in], true) - when "out" - camera.mute(@ids[:zoom_out], true) - else #stop - camera.mute(@ids[:zoom_in], false) - camera.mute(@ids[:zoom_out], false) - end + def zoom(direction : String) + case direction + when "in" + camera.mute(@ids[:zoom_in], true) + when "out" + camera.mute(@ids[:zoom_out], true) + else # stop + camera.mute(@ids[:zoom_in], false) + camera.mute(@ids[:zoom_out], false) end + end - protected def camera - system[@mod_id] - end -end \ No newline at end of file + protected def camera + system[@mod_id] + end +end diff --git a/drivers/qsc/q_sys_camera_spec.cr b/drivers/qsc/q_sys_camera_spec.cr index cbff2be238d..301371b2962 100644 --- a/drivers/qsc/q_sys_camera_spec.cr +++ b/drivers/qsc/q_sys_camera_spec.cr @@ -1,2 +1 @@ require "placeos-driver/spec" - From f0bc3a086e0ffcf364861193ce97635fc4469616 Mon Sep 17 00:00:00 2001 From: Rolando Diaz Hichez Date: Wed, 6 Apr 2022 18:14:14 -0400 Subject: [PATCH 5/7] chore(qsc/q_sys_camera): added crystal tool formatting --- drivers/xy_sense/location_service_spec.cr | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/xy_sense/location_service_spec.cr b/drivers/xy_sense/location_service_spec.cr index c2f86fc32ae..3a1142ed47f 100644 --- a/drivers/xy_sense/location_service_spec.cr +++ b/drivers/xy_sense/location_service_spec.cr @@ -33,18 +33,18 @@ class XYSenseMock < DriverSpecs::MockDriver capacity: 1, category: "Workpoint", }, - { - id: "xysense-desk-456-id", - name: "desk-456", - capacity: 1, - category: "Workpoint", - }, - { - id: "xysense-area-567-id", - name: "area-567", - capacity: 20, - category: "Lobby", - }], + { + id: "xysense-desk-456-id", + name: "desk-456", + capacity: 1, + category: "Workpoint", + }, + { + id: "xysense-area-567-id", + name: "area-567", + capacity: 20, + category: "Lobby", + }], }, } From b4ea4783e50fc42f563c6ea919e10826f9d69d51 Mon Sep 17 00:00:00 2001 From: Mia Bennett Date: Mon, 5 Dec 2022 10:58:21 +0930 Subject: [PATCH 6/7] refactor(qsc): remove ruby stuff --- drivers/qsc/q_sys_camera.cr | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/qsc/q_sys_camera.cr b/drivers/qsc/q_sys_camera.cr index 77520a3d152..4614dc7a597 100644 --- a/drivers/qsc/q_sys_camera.cr +++ b/drivers/qsc/q_sys_camera.cr @@ -1,5 +1,3 @@ -# encoding: ASCII-8BIT -# frozen_string_literal: true require "placeos-driver/interface/powerable" require "placeos-driver" From 7700901ae401846656662407148508c2b24812c7 Mon Sep 17 00:00:00 2001 From: Mia Bennett Date: Wed, 21 Dec 2022 13:47:28 +0930 Subject: [PATCH 7/7] fix(qsys): hash lookup --- drivers/qsc/q_sys_camera.cr | 28 ++++++++++++++-------------- drivers/qsc/q_sys_camera_spec.cr | 12 ++++++++++++ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/drivers/qsc/q_sys_camera.cr b/drivers/qsc/q_sys_camera.cr index 4614dc7a597..047e64d46ab 100644 --- a/drivers/qsc/q_sys_camera.cr +++ b/drivers/qsc/q_sys_camera.cr @@ -37,35 +37,35 @@ class Qsc::QSysCamera < PlaceOS::Driver end def power(state : Bool) - camera.mute(@ids[:power], state) + camera.mute(@ids["power"], state) end def adjust_tilt(direction : String) case direction when "down" - camera.mute(@ids[:tilt_down], true) + camera.mute(@ids["tilt_down"], true) when "up" - camera.mute(@ids[:tilt_up], true) + camera.mute(@ids["tilt_up"], true) else # stop - camera.mute(@ids[:tilt_up], false) - camera.mute(@ids[:tilt_down], false) + camera.mute(@ids["tilt_up"], false) + camera.mute(@ids["tilt_down"], false) end end def adjust_pan(direction : String) case direction when "right" - camera.mute(@ids[:pan_right], true) + camera.mute(@ids["pan_right"], true) when "left" - camera.mute(@ids[:pan_left], true) + camera.mute(@ids["pan_left"], true) else # stop - camera.mute(@ids[:pan_right], false) - camera.mute(@ids[:pan_left], false) + camera.mute(@ids["pan_right"], false) + camera.mute(@ids["pan_left"], false) end end def home - camera.trigger(@ids[:preset_home_load]) + camera.trigger(@ids["preset_home_load"]) end def preset(presetName : String) @@ -75,12 +75,12 @@ class Qsc::QSysCamera < PlaceOS::Driver def zoom(direction : String) case direction when "in" - camera.mute(@ids[:zoom_in], true) + camera.mute(@ids["zoom_in"], true) when "out" - camera.mute(@ids[:zoom_out], true) + camera.mute(@ids["zoom_out"], true) else # stop - camera.mute(@ids[:zoom_in], false) - camera.mute(@ids[:zoom_out], false) + camera.mute(@ids["zoom_in"], false) + camera.mute(@ids["zoom_out"], false) end end diff --git a/drivers/qsc/q_sys_camera_spec.cr b/drivers/qsc/q_sys_camera_spec.cr index 301371b2962..b83d2ccf131 100644 --- a/drivers/qsc/q_sys_camera_spec.cr +++ b/drivers/qsc/q_sys_camera_spec.cr @@ -1 +1,13 @@ require "placeos-driver/spec" + +DriverSpecs.mock_driver "Qsc::QSysCamera" do + exec(:power, true) + + exec(:adjust_tilt, "up") + exec(:adjust_tilt, "") + exec(:adjust_pan, "right") + exec(:adjust_pan, "") + + exec(:home) + exec(:power, false) + end