xref: /aosp_15_r20/cts/apps/CameraITS/utils/lighting_control_utils.py (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker# Copyright 2021 The Android Open Source Project
2*b7c941bbSAndroid Build Coastguard Worker#
3*b7c941bbSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*b7c941bbSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*b7c941bbSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*b7c941bbSAndroid Build Coastguard Worker#
7*b7c941bbSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*b7c941bbSAndroid Build Coastguard Worker#
9*b7c941bbSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*b7c941bbSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*b7c941bbSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*b7c941bbSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*b7c941bbSAndroid Build Coastguard Worker# limitations under the License.
14*b7c941bbSAndroid Build Coastguard Worker"""Utility functions for sensor_fusion hardware rig."""
15*b7c941bbSAndroid Build Coastguard Worker
16*b7c941bbSAndroid Build Coastguard Worker
17*b7c941bbSAndroid Build Coastguard Workerimport logging
18*b7c941bbSAndroid Build Coastguard Workerimport struct
19*b7c941bbSAndroid Build Coastguard Workerimport time
20*b7c941bbSAndroid Build Coastguard Workerimport sensor_fusion_utils
21*b7c941bbSAndroid Build Coastguard Worker
22*b7c941bbSAndroid Build Coastguard Worker# Constants for Arduino
23*b7c941bbSAndroid Build Coastguard WorkerARDUINO_BRIGHTNESS_MAX = 255
24*b7c941bbSAndroid Build Coastguard WorkerARDUINO_BRIGHTNESS_MIN = 0
25*b7c941bbSAndroid Build Coastguard WorkerARDUINO_LIGHT_START_BYTE = 254
26*b7c941bbSAndroid Build Coastguard Worker
27*b7c941bbSAndroid Build Coastguard Worker
28*b7c941bbSAndroid Build Coastguard Workerdef _toggle_screen_state(device, desired_state):
29*b7c941bbSAndroid Build Coastguard Worker  """Trigger device power key to toggle screen."""
30*b7c941bbSAndroid Build Coastguard Worker  current_state = 'ON'
31*b7c941bbSAndroid Build Coastguard Worker  if desired_state == 'ON':
32*b7c941bbSAndroid Build Coastguard Worker    current_state = 'OFF'
33*b7c941bbSAndroid Build Coastguard Worker  output = device.adb.shell('dumpsys display | grep mScreenState=')
34*b7c941bbSAndroid Build Coastguard Worker  output_val = str(output.decode('utf-8')).strip()
35*b7c941bbSAndroid Build Coastguard Worker  if current_state in output_val:
36*b7c941bbSAndroid Build Coastguard Worker    device.adb.shell(['input', 'keyevent', 'KEYCODE_POWER'])
37*b7c941bbSAndroid Build Coastguard Worker
38*b7c941bbSAndroid Build Coastguard Worker
39*b7c941bbSAndroid Build Coastguard Workerdef turn_off_device_screen(device):
40*b7c941bbSAndroid Build Coastguard Worker  """Turn off a device screen via power key if screen is on."""
41*b7c941bbSAndroid Build Coastguard Worker  _toggle_screen_state(device, 'OFF')
42*b7c941bbSAndroid Build Coastguard Worker
43*b7c941bbSAndroid Build Coastguard Worker
44*b7c941bbSAndroid Build Coastguard Workerdef turn_on_device_screen(device):
45*b7c941bbSAndroid Build Coastguard Worker  """Turn on a device screen via power key if screen is on."""
46*b7c941bbSAndroid Build Coastguard Worker  _toggle_screen_state(device, 'ON')
47*b7c941bbSAndroid Build Coastguard Worker
48*b7c941bbSAndroid Build Coastguard Worker
49*b7c941bbSAndroid Build Coastguard Workerdef set_light_brightness(ch, brightness, serial_port, delay=0):
50*b7c941bbSAndroid Build Coastguard Worker  """Turn on light to specified brightness.
51*b7c941bbSAndroid Build Coastguard Worker
52*b7c941bbSAndroid Build Coastguard Worker  Args:
53*b7c941bbSAndroid Build Coastguard Worker    ch: str; light to turn on in ARDUINO_VALID_CH
54*b7c941bbSAndroid Build Coastguard Worker    brightness: int value of brightness between 0 and 255.
55*b7c941bbSAndroid Build Coastguard Worker    serial_port: object; serial port
56*b7c941bbSAndroid Build Coastguard Worker    delay: int; time in seconds
57*b7c941bbSAndroid Build Coastguard Worker  """
58*b7c941bbSAndroid Build Coastguard Worker  if brightness < ARDUINO_BRIGHTNESS_MIN:
59*b7c941bbSAndroid Build Coastguard Worker    logging.debug('Brightness must be >= %d.', ARDUINO_BRIGHTNESS_MIN)
60*b7c941bbSAndroid Build Coastguard Worker    brightness = ARDUINO_BRIGHTNESS_MIN
61*b7c941bbSAndroid Build Coastguard Worker  elif brightness > ARDUINO_BRIGHTNESS_MAX:
62*b7c941bbSAndroid Build Coastguard Worker    logging.debug('Brightness must be <= %d.', ARDUINO_BRIGHTNESS_MAX)
63*b7c941bbSAndroid Build Coastguard Worker    brightness = ARDUINO_BRIGHTNESS_MAX
64*b7c941bbSAndroid Build Coastguard Worker
65*b7c941bbSAndroid Build Coastguard Worker  cmd = [struct.pack('B', i) for i in [
66*b7c941bbSAndroid Build Coastguard Worker      ARDUINO_LIGHT_START_BYTE, int(ch), brightness]]
67*b7c941bbSAndroid Build Coastguard Worker  sensor_fusion_utils.arduino_send_cmd(serial_port, cmd)
68*b7c941bbSAndroid Build Coastguard Worker  time.sleep(delay)
69*b7c941bbSAndroid Build Coastguard Worker
70*b7c941bbSAndroid Build Coastguard Worker
71*b7c941bbSAndroid Build Coastguard Workerdef lighting_control(lighting_cntl, lighting_ch):
72*b7c941bbSAndroid Build Coastguard Worker  """Establish communication with lighting controller.
73*b7c941bbSAndroid Build Coastguard Worker
74*b7c941bbSAndroid Build Coastguard Worker  lighting_ch is hard wired and must be determined from physical setup.
75*b7c941bbSAndroid Build Coastguard Worker
76*b7c941bbSAndroid Build Coastguard Worker  First initialize the port and send a test string defined by ARDUINO_TEST_CMD
77*b7c941bbSAndroid Build Coastguard Worker  to establish communications.
78*b7c941bbSAndroid Build Coastguard Worker
79*b7c941bbSAndroid Build Coastguard Worker  Args:
80*b7c941bbSAndroid Build Coastguard Worker    lighting_cntl: str to identify 'arduino' controller.
81*b7c941bbSAndroid Build Coastguard Worker    lighting_ch: str to identify lighting channel number.
82*b7c941bbSAndroid Build Coastguard Worker  Returns:
83*b7c941bbSAndroid Build Coastguard Worker    serial port pointer
84*b7c941bbSAndroid Build Coastguard Worker  """
85*b7c941bbSAndroid Build Coastguard Worker
86*b7c941bbSAndroid Build Coastguard Worker  logging.debug('Controller: %s, ch: %s', lighting_cntl, lighting_ch)
87*b7c941bbSAndroid Build Coastguard Worker  if lighting_cntl.lower() == 'arduino':
88*b7c941bbSAndroid Build Coastguard Worker    # identify port
89*b7c941bbSAndroid Build Coastguard Worker    arduino_serial_port = sensor_fusion_utils.serial_port_def('arduino')
90*b7c941bbSAndroid Build Coastguard Worker
91*b7c941bbSAndroid Build Coastguard Worker    # send test cmd to Arduino until cmd returns properly
92*b7c941bbSAndroid Build Coastguard Worker    sensor_fusion_utils.establish_serial_comm(arduino_serial_port)
93*b7c941bbSAndroid Build Coastguard Worker
94*b7c941bbSAndroid Build Coastguard Worker    # return serial port
95*b7c941bbSAndroid Build Coastguard Worker    return arduino_serial_port
96*b7c941bbSAndroid Build Coastguard Worker
97*b7c941bbSAndroid Build Coastguard Worker  else:
98*b7c941bbSAndroid Build Coastguard Worker    logging.debug('No lighting control: need to control lights manually.')
99*b7c941bbSAndroid Build Coastguard Worker    return None
100*b7c941bbSAndroid Build Coastguard Worker
101*b7c941bbSAndroid Build Coastguard Worker
102*b7c941bbSAndroid Build Coastguard Workerdef set_lighting_state(arduino_serial_port, lighting_ch, state):
103*b7c941bbSAndroid Build Coastguard Worker  """Turn lights ON in test rig.
104*b7c941bbSAndroid Build Coastguard Worker
105*b7c941bbSAndroid Build Coastguard Worker  Args:
106*b7c941bbSAndroid Build Coastguard Worker    arduino_serial_port: serial port object
107*b7c941bbSAndroid Build Coastguard Worker    lighting_ch: str for lighting channel
108*b7c941bbSAndroid Build Coastguard Worker    state: str 'ON/OFF'
109*b7c941bbSAndroid Build Coastguard Worker  """
110*b7c941bbSAndroid Build Coastguard Worker  if state == 'ON':
111*b7c941bbSAndroid Build Coastguard Worker    level = 255
112*b7c941bbSAndroid Build Coastguard Worker  elif state == 'OFF':
113*b7c941bbSAndroid Build Coastguard Worker    level = 0
114*b7c941bbSAndroid Build Coastguard Worker  else:
115*b7c941bbSAndroid Build Coastguard Worker    raise AssertionError(f'Lighting state not defined correctly: {state}')
116*b7c941bbSAndroid Build Coastguard Worker
117*b7c941bbSAndroid Build Coastguard Worker  if arduino_serial_port:
118*b7c941bbSAndroid Build Coastguard Worker    set_light_brightness(lighting_ch, level, arduino_serial_port, delay=1)
119*b7c941bbSAndroid Build Coastguard Worker  else:
120*b7c941bbSAndroid Build Coastguard Worker    print(f'Turn {state} lights in rig and hit <ENTER> to continue.')
121*b7c941bbSAndroid Build Coastguard Worker    input('')
122*b7c941bbSAndroid Build Coastguard Worker
123