# Copyright 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys import time import hardware as hw import serial NUM_ROTATIONS = 10 SLEEP_TIME = 2 # seconds DATA_DELIMITER = '\r\n' ROT_RIG_DEVICE = 'relay' ROT_RIG_VID = '04d8' ROT_RIG_PID = 'fc73' ROT_RIG_CHAN = '1' RELAY_BAUDRATE = 115200 RELAY_COM_SLEEP = 0.05 RELAY_SET_CMD = 'REL' VALID_RELAY_COMMANDS = ['ON', 'OFF'] VALID_RELAY_CHANNELS = ['1', '2', '3', '4'] SERIAL_SEND_TIMEOUT = 0.02 def cmd_send(vid, pid, cmd_str): """Wrapper for sending serial command. Args: vid: str; vendor ID pid: str; product ID cmd_str: str; value to send to device. """ hw_list = hw.Device(ROT_RIG_DEVICE, vid, pid, '1', '0') relay_port = hw_list.get_tty_path('relay') relay_ser = serial.Serial(relay_port, RELAY_BAUDRATE, timeout=SERIAL_SEND_TIMEOUT, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS) try: relay_ser.write(DATA_DELIMITER) time.sleep(RELAY_COM_SLEEP) # This is critcal for relay. relay_ser.write(cmd_str) relay_ser.close() except ValueError: print 'Port %s:%s is not open' % (vid, pid) sys.exit() def set_relay_channel_state(vid, pid, channel, relay_state): """Set relay channel and state. Args: vid: str; vendor ID pid: str; product ID channel: str; channel number of relay to set. '1', '2', '3', or '4' relay_state: str; either 'ON' or 'OFF' Returns: None """ if channel in VALID_RELAY_CHANNELS and relay_state in VALID_RELAY_COMMANDS: cmd_send(vid, pid, RELAY_SET_CMD + channel + '.' + relay_state + '\r\n') else: print 'Invalid channel or command, no command sent.' def main(): """Main function. expected rotator string is vid:pid:ch. vid:pid can be found through lsusb on the host. ch is hard wired and must be determined from the box. """ for s in sys.argv[1:]: if s[:8] == 'rotator=': if len(s) > 8: rotator_ids = s[8:].split(':') if len(rotator_ids) == 3: vid = '0x' + rotator_ids[0] pid = '0x' + rotator_ids[1] ch = rotator_ids[2] elif len(rotator_ids) == 1: if rotator_ids[0] in VALID_RELAY_CHANNELS: print ('Using default values %s:%s for VID:PID ' 'of rotator' % (ROT_RIG_VID, ROT_RIG_PID)) vid = '0x' + ROT_RIG_VID pid = '0x' + ROT_RIG_PID ch = rotator_ids[0] elif rotator_ids[0] == 'default': print ('Using default values %s:%s:%s for VID:PID:CH ' 'of rotator' % (ROT_RIG_VID, ROT_RIG_PID, ROT_RIG_CHAN)) vid = '0x' + ROT_RIG_VID pid = '0x' + ROT_RIG_PID ch = ROT_RIG_CHAN else: print 'Invalid channel: %s' % rotator_ids[0] sys.exit() else: err_string = 'Rotator ID (if entered) must be of form: ' err_string += 'rotator=VID:PID:CH or rotator=CH' print err_string sys.exit() print 'Rotating phone %dx' % NUM_ROTATIONS for _ in xrange(NUM_ROTATIONS): set_relay_channel_state(vid, pid, ch, 'ON') time.sleep(SLEEP_TIME) set_relay_channel_state(vid, pid, ch, 'OFF') time.sleep(SLEEP_TIME) if __name__ == '__main__': main()