blob: 7e9b649f5d2de9ef0d1d7bf753a25b89a57ed911 [file] [log] [blame]
#!/usr/bin/python3.4
#
# Copyright 2014 - Google
#
# 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 time
import math
from .tel_defines import *
def get_atten(log, atten_obj):
"""Get attenuator current attenuation value.
Args:
log: log object.
atten_obj: attenuator object.
Returns:
Current attenuation value.
"""
return atten_obj.get_atten()
def set_atten(log, atten_obj, target_atten, step_size=0, time_per_step=0):
"""Set attenuator attenuation value.
Args:
log: log object.
atten_obj: attenuator object.
target_atten: target attenuation value.
step_size: step size (in unit of dBm) for 'attenuation value setting'.
This is optional. Default value is 0. If step_size is 0, it means
the setting will be done in only one step.
time_per_step: delay time (in unit of second) per step when setting
the attenuation value.
This is optional. Default value is 0.
Returns:
True is no error happened. Otherwise false.
"""
try:
print_name = atten_obj.path
except AttributeError:
print_name = str(atten_obj)
current_atten = get_atten(log, atten_obj)
info = "set_atten {} from {} to {}".format(print_name, current_atten,
target_atten)
if step_size>0:
info +=", step size {}, time per step {}s.".format(step_size, time_per_step)
log.info(info)
try:
delta = target_atten - current_atten
if step_size>0:
number_of_steps = int(abs(delta)/step_size)
while number_of_steps > 0:
number_of_steps -=1
current_atten += math.copysign(step_size, (target_atten - current_atten))
atten_obj.set_atten(current_atten)
time.sleep(time_per_step)
atten_obj.set_atten(target_atten)
except Exception as e:
log.error("set_atten error happened: {}".format(e))
return False
return True
def set_rssi(log, atten_obj, calibration_rssi, target_rssi, step_size=0,
time_per_step=0):
"""Set RSSI value by changing attenuation.
Args:
log: log object.
atten_obj: attenuator object.
calibration_rssi: RSSI calibration information.
target_rssi: target RSSI value.
step_size: step size (in unit of dBm) for 'RSSI value setting'.
This is optional. Default value is 0. If step_size is 0, it means
the setting will be done in only one step.
time_per_step: delay time (in unit of second) per step when setting
the attenuation value.
This is optional. Default value is 0.
Returns:
True is no error happened. Otherwise false.
"""
try:
print_name = atten_obj.path
except AttributeError:
print_name = str(atten_obj)
if target_rssi == MAX_RSSI_RESERVED_VALUE:
target_atten = ATTEN_MIN_VALUE
elif target_rssi == MIN_RSSI_RESERVED_VALUE:
target_atten = ATTEN_MAX_VALUE
else:
log.info("set_rssi {} to {}.".
format(print_name, target_rssi))
target_atten = calibration_rssi - target_rssi
if target_atten < 0:
log.info("set_rssi: WARNING - you are setting an unreachable RSSI.")
log.info("max RSSI value on {} is {}. Setting attenuation to 0.".
format(wifi_or_cell, calibration_rssi))
target_atten = 0
if not set_atten(log, atten_obj, target_atten, step_size, time_per_step):
log.error("set_rssi to {}failed".format(target_rssi))
return False
return True