| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- # Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
- #
- # 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.
- """
- Internal use only.
- This file provide method to control programmable attenuator.
- """
- import time
- import serial
- import codecs
- def set_att(port, att, att_fix=False):
- """
- set attenuation value on the attenuator
- :param port: serial port for attenuator
- :param att: attenuation value we want to set
- :param att_fix: fix the deviation with experience value
- :return: True or False
- """
- assert 0 <= att <= 62
- # fix att
- if att_fix:
- if att >= 33 and (att - 30 + 1) % 4 == 0:
- att_t = att - 1
- elif att >= 33 and (att - 30) % 4 == 0:
- att_t = att + 1
- else:
- att_t = att
- else:
- att_t = att
- serial_port = serial.Serial(port, baudrate=9600, rtscts=False, timeout=0.1)
- if serial_port.isOpen() is False:
- raise IOError("attenuator control, failed to open att port")
- cmd_hex = "7e7e10{:02x}{:x}".format(att_t, 0x10 + att_t)
- exp_res_hex = "7e7e20{:02x}00{:x}".format(att_t, 0x20 + att_t)
- cmd = codecs.decode(cmd_hex, "hex")
- exp_res = codecs.decode(exp_res_hex, "hex")
- serial_port.write(cmd)
- res = b""
- for i in range(5):
- res += serial_port.read(20)
- if res == exp_res:
- result = True
- break
- time.sleep(0.1)
- else:
- result = False
- serial_port.close()
- return result
|