Files
past-project-past_code_cc2650/python_test_code/sti/sti10.py
T
2019-06-13 14:44:11 +08:00

134 lines
3.2 KiB
Python

from typing import Dict, Any
from devlib.util import print_instruction, DeviceInstruction
CHANNEL_STI_0 = 0
CHANNEL_STI_1 = 1
STI_WAVEFORM_POS = 0x00
STI_WAVEFORM_NEG = 0x01
STI_WAVEFORM_P2N = 0x02
STI_WAVEFORM_N2P = 0x03
STI_PRECISION_10 = 0
STI_PRECISION_01 = 1
STI_NUM_INFINITE = 1000
STI_INSTRUCTION = {
'GLOBAL': '3b001#header#;1b0;12bCURRENT',
'LOCAL': '3b010#header;1b0;4b>CHANNEL;3b>STI_MODE;1b>PRECISION;12b>STI_FREQ;10b>STI_PW;10b>STI_PW_IPI;10b>STI_NUM'
}
DEFAULT_PARAMETER = {
'CURRENT': 10, # uA
'CHANNEL': CHANNEL_STI_0,
'STI_MODE': STI_WAVEFORM_POS,
'PRECISION': STI_PRECISION_10,
'STI_FREQ': 1000, # Hz
'STI_PW': 100, # us
'STI_PW_IPI': 50, # us
'STI_NUM': STI_NUM_INFINITE,
}
def validate_frequency_parameter(parameter: Dict[str, Any]) -> bool:
p = int(parameter['PRECISION'])
f = int(parameter['STI_FREQ'])
w = int(parameter['STI_PW'])
i = int(parameter['STI_PW_IPI'])
return 1e6 * (1 if p == 0 else 10) / f >= 2 * w + i
SPIN_TIMEOUT = [
(10, 53),
(20, 106),
(30, 160),
(40, 214),
(50, 265),
(60, 319),
(70, 374),
(80, 427),
(100, 533),
(150, 800),
(200, 1066),
(300, 1600),
(400, 2133),
(500, 2666),
(1000, 5332),
]
def get_spin_timeout_value(timeout_us: int) -> int:
if timeout_us == 0:
return 0
elif timeout_us <= SPIN_TIMEOUT[0][0]:
return SPIN_TIMEOUT[0][1]
elif timeout_us >= SPIN_TIMEOUT[-1][0]:
return SPIN_TIMEOUT[-1][1]
else:
for i in range(len(SPIN_TIMEOUT)):
t0 = SPIN_TIMEOUT[i][0]
v0 = SPIN_TIMEOUT[i][1]
if timeout_us == t0:
return v0
t1 = SPIN_TIMEOUT[i + 1][0]
v1 = SPIN_TIMEOUT[i + 1][1]
if t0 < timeout_us < t1:
dt = t1 - t0
return int((t1 - timeout_us) * v0 / dt + (timeout_us - t0) * v1 / dt)
raise RuntimeError()
# -------------------------------------------------------------------------------------------------------------------- #
STI_PARAMETER_0 = {
'CURRENT': 10, # uA
'CHANNEL': CHANNEL_STI_0,
'STI_MODE': STI_WAVEFORM_POS,
'PRECISION': STI_PRECISION_10,
'STI_FREQ': 10, # Hz
'STI_PW': 10, # us
'STI_PW_IPI': 10, # us
'STI_NUM': STI_NUM_INFINITE,
}
STI_PARAMETER_1 = {
'CURRENT': 10, # uA
'CHANNEL': CHANNEL_STI_1,
'STI_MODE': STI_WAVEFORM_NEG,
'PRECISION': STI_PRECISION_10,
'STI_FREQ': 10, # Hz
'STI_PW': 10, # us
'STI_PW_IPI': 10, # us
'STI_NUM': STI_NUM_INFINITE,
}
print_instruction(STI_INSTRUCTION['GLOBAL'], STI_PARAMETER_0, append_ris_type=False)
if not validate_frequency_parameter(STI_PARAMETER_0):
print('invalidate parameter')
else:
print('----')
print_instruction(STI_INSTRUCTION['LOCAL'], STI_PARAMETER_0, append_ris_type=False)
if not validate_frequency_parameter(STI_PARAMETER_1):
print('invalidate parameter')
else:
print('----')
print_instruction(STI_INSTRUCTION['LOCAL'], STI_PARAMETER_1, append_ris_type=False)
print('--sti--')
print_instruction(DeviceInstruction.VIS_STI, {})
print('--int--')
print_instruction(DeviceInstruction.VIS_INT, {})