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