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