# 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()