Расширить DEIF, загрузку CAN и общую обработку сигналов
Добавить общее ядро DEIF, эмуляцию приборов и переносимые панели Python/Qt. Расширить загрузчики F2812 и F28335, обновление Flash и профиль STM Invertor. Добавить альтернативный МНК Eigen, модели неисправностей и диагностику сигналов. Обновить справочники устройств, проекты CCS и регрессионные проверки.
This commit is contained in:
@@ -17,7 +17,7 @@ class Waveform:
|
||||
vref: float
|
||||
period_ms: float
|
||||
|
||||
def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2):
|
||||
def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2, *, backend="native"): # Именованный выбор решателя сохраняет прежние вызовы генератора.
|
||||
"""One cyclic period, last endpoint excluded (no duplicated seam sample)."""
|
||||
if type(sample_rate) is not int or not 1 <= sample_rate <= 1000000:
|
||||
raise ValueError("Частота отсчётов должна быть 1…1000000 Гц")
|
||||
@@ -36,23 +36,23 @@ def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2):
|
||||
raise ValueError("Период × частота должны давать от 2 до 4096 отсчётов")
|
||||
if abs(exact_count - count) > 1e-7:
|
||||
raise ValueError("Период должен содержать целое число отсчётов при выбранной частоте")
|
||||
result = reconstruct(points, method, count, degree, endpoint=False)
|
||||
result = reconstruct(points, method, count, degree, endpoint=False, backend=backend) # Формируем циклическую таблицу выбранным пользователем вариантом МНК.
|
||||
# Check the endpoint too: polynomial fitting can move its value.
|
||||
checked = reconstruct(points, method, count + 1, degree)
|
||||
checked = reconstruct(points, method, count + 1, degree, backend=backend) # Конечную точку проверяем тем же решателем, исключая расхождение проверки диапазона ЦАП и результата.
|
||||
dac12([p[1] for p in checked.points], vref)
|
||||
codes = dac12([p[1] for p in result.points], vref)
|
||||
return Waveform(tuple(result.points), codes, sample_rate, vref, period)
|
||||
|
||||
def recipe(points, sample_rate, vref, method, degree):
|
||||
def recipe(points, sample_rate, vref, method, degree, *, backend="native"): # Новый необязательный параметр сохраняет совместимость ранее записанных рецептов версии 1.
|
||||
return {"version": 1, "points_ms_volts": [list(pair) for pair in points], "sample_rate": sample_rate,
|
||||
"vref": vref, "method": method, "degree": degree}
|
||||
"vref": vref, "method": method, "degree": degree, "backend": backend} # Сохраняем выбранный решатель для воспроизводимого восстановления сигнала.
|
||||
|
||||
def load_recipe(text):
|
||||
data = json.loads(text)
|
||||
if not isinstance(data, dict) or data.get("version") != 1:
|
||||
raise ValueError("Неизвестная версия задания генератора")
|
||||
points = tuple((float(x), float(y)) for x, y in data["points_ms_volts"])
|
||||
generate(points, data["sample_rate"], data["vref"], data["method"], data["degree"])
|
||||
generate(points, data["sample_rate"], data["vref"], data["method"], data["degree"], backend=data.get("backend", "native")) # Старые рецепты без варианта используют прежний алгоритм, новые проверяют именно сохранённый решатель.
|
||||
return points, data
|
||||
|
||||
def c_header(wave):
|
||||
|
||||
Reference in New Issue
Block a user