Gtl.ranges var

Материал из GTL-wiki
Перейти к навигации Перейти к поиску

Уствновка пользовательских диапазонов воспроизведения сигнала по триггеру

"use strict";
let options = gtl.options;
let point = gtl.options.point;
let record = gtl.options.record;
let signals = gtl.options.record.signalsModel;

let src = gtl.analog_inputs[0]; //источник сигнала
let time = 20; //время записи для анализа
let time_window = 0.02 //временное окно наблюдения
let time_impulse = 0.5 //временное окно для анализа импульса (не менее времени построения спектра)
let time_pre = time_window / 2; //время предыстории
let ranges = []; //массив диапазонов для импульсов
let tries = 0; //циклы диагностки
let is_ranges = false; //состояние готовности диапазонов

let __max = gtl.create_moving_max({
    src: src,
    name: "max",
    time: time_window
}); //скользящая амплитуда для создания "огибающей" импульса
__max.history = 2; //история сохраненных данных сигнала

let __thresh = gtl.create_moving_thresh({
    src: __max,
    name: "thresh",
    time: time_window,
    level: 315
}); //порог
__thresh.history = 2; //история сохраненных данных сигнала

__thresh.triggered.connect(thresh_triggered_event); //подключаем функцию
function thresh_triggered_event(flag, sample) {
    if (is_ranges) return;
    if (flag) {
        let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера
        gtl.log.info("trigger on time", start);

        let range = {
            min: start,
            max: start + time_impulse
        };
        ranges.push(range); //добавляем диапазон в массив
    };
};

// Функция диагностики. 
/*
  Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
  После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
  Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики
  Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/

gtl.diagnostic.interval = time; //интервал запуска функции диагностики
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость
function diagnose() {
    if (!is_ranges) {
        gtl.player.custom_ranges = ranges; // добавляем пользовательские диапазоны в плеер
        gtl.results = { ranges: ranges }; // добавляем диапазоны в результат
        gtl.log.info('creating ranges', true);
        gtl.log.info('ranges', JSON.stringify(ranges));
        is_ranges = true; // пользовательские диапазоны готовы
        gtl.diagnostic.interval = time_impulse; // задаем время запуска функции диагностики, равное длине импульса

        gtl.log.info("Количество диапазонов в плеере", ranges.length);
        gtl.log.info("Установленный интервал запуска диагностики", time_impulse);
        gtl.log.info("acq_time", gtl.acq_time);

        plot.add({
            color: 0x0000ff, //цвет графика
            name: "max", //наименование графика
            x: 1 / __max.rate, //частотное разрешение
            y: __max.getHistoryArray() //значения амплитуд
        }); //рисуем сигнал для контроля

        plot.add({
            color: 0xff00ff, //цвет графика
            name: "thresh", //наименование графика
            x: 1 / __thresh.rate, //частотное разрешение
            y: __thresh.getHistoryArray() //значения амплитуд
        }); //рисуем сигнал для контроля
    }

    if (tries > 0) {
        gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`)

        /*
          Математика обработки сигнала
        */
    }

    tries++;
    if (tries > ranges.length) gtl.diagnostic.stop(); // останавливаем диагностику после окончания диапазонов
}