| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- # SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
- # SPDX-License-Identifier: Apache-2.0
- """
- Internal use only.
- This file provide method to control programmable attenuator.
- """
- import codecs
- import time
- import serial
- 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
|