Модуль генератора событий

Данный модуль используется в демонстрационных примерах для моделирования работы графического полотна с сигналами, изменяющимися в реальном времени. Он имитирует поток событий, как если бы данные поступали из внешнего источника в режиме реального времени.

Исходный код модуля

Установка

Модуль подключается как git submodule. Рекомендуется размещать его в директории src/submodules.

  $ git submodule add git@github.com:IncartDev/signal-generator-js.git

Файл конфигурации

Работа генератора настраивается с помощью конфигурационного файла формата .json.

{
    "interval": 1000,
    "marks": []
}
Название Тип Значение поумолчанию Описание
interval int ОБЯЗАТЕЛЬНОЕ Интервал генерации событий в миллисекундах.
marks Array<object> ОБЯЗАТЕЛЬНОЕ Список описаний генерируемых меток.

Свойство marks

marks описывается объектом следующего вида:

{
  "marks": [
    {
      "name": "RR",
      "freq": 1,
      "type": "int",
      "min_value": 1000,
      "max_value": 1001,
    }
  ]
}
Название Тип Значение поумолчанию Описание
name string ОБЯЗАТЕЛЬНОЕ Уникальное имя события. Используется для привязки к компонентам визуализации.
freq int ОБЯЗАТЕЛЬНОЕ Количество событий, генерируемых за каждый интервал.
type string ОБЯЗАТЕЛЬНОЕ Тип создаваемой метки: number — метки с числовым значением, empty — метки без дополнительных данных.
min_value int ОБЯЗАТЕЛЕН (для type = number) Минимальное значение генерируемых числовых меток.
max_value int ОБЯЗАТЕЛЕН (для type = number) Максимальное значение генерируемых числовых меток.

Пример полной конфигурации

Подключение генератора сигналов

Подключение модуля рекомендуется выполнять в инициализационном скрипте графического полотна.

  import {
    ContinuousRawSignalGenerator,
    EventGenerator,
    ContinuousGeneratorSettingsParser,
    EventGeneratorSettingsParser
  } from "@incartdev/signal-generator-js";
  import { 
    JagmRawVisScreenDataParser,
    RawDataEventMessageParser,
    RawDataEventMessage
    } from "@incartdev/jagm-chart";


  import signalGeneratorSettings from "./SignalGeneratorSettings.json";
  import eventGeneratorSettings from "./EventGeneratorSettings.json";

  // Функция отрисовки событий на графике
  async function pushEventMessage(message: RawDataEventMessage): Promise<void> {
    if (chartProvider === undefined) {
      return;
    }
    
    // Для каждого графического полотна
    for (let chartIndex = 0; chartIndex < chartProvider.charts.length; ++chartIndex) {

      // Поиск контент группы меток для выбранного полотна
      const chart = chartProvider.charts[chartIndex];
      const marksGroup = chart.findContentGroup("marks");
      if (marksGroup === undefined || !(marksGroup instanceof JagmOnlineMarksChartContentGroup)) {
        continue;
      }

      // Добавление метки
      await marksGroup.addMark(message);
    }
  }

  async function install(): Promise<void> {
    // Создание экземпляра класса генератора сигналов
    const generator = new ContinuousRawSignalGenerator();
  
    // Преобразование настроек
    const signalGenSettings = ContinuousGeneratorSettingsParser.parse(signalGeneratorSettings);
    if (signalGenSettings === undefined) {
      return;
    }

    // Инициализациия генератора сигналов
    generator.init(signalGenSettings);
  
    // Создание экземпляра класса генератора событий
    const eventGenerator = new EventGenerator();

    // Преобразование настроек
    const eventGenSettings = EventGeneratorSettingsParser.parse(eventGeneratorSettings);
    if (eventGenSettings === undefined) {
      return;
    }
  
    // Инициализациия генератора событий
    eventGenerator.init(eventGenSettings);
  
    // Подписка на поступление данных сигналов
    generator.addListener(async message => {
      if (generator === undefined || eventGenerator === undefined || chartProvider === undefined) {
        return;
      }

      // Преобразование сгенерированных данных
      const typedMessage = JagmRawVisScreenDataParser.parse(message);
      if (typedMessage === undefined) {
        return;
      }
      
      // Получение координаты последнего сгенерироавнного блока данных
      const pointIndex = generator.getChannelPointCounter(0, 0);
      // Установка координаты события
      eventGenerator.setPointIndex(pointIndex);

      // Отрисовка данных сигнаов на графике
      await chartProvider.pushVisMessage(typedMessage);
    });
  
    eventGenerator.onFrameIsReady = message => {
      // Преобразование сгенерированных данных
      const typedMessage = RawDataEventMessageParser.parse(message);
      if (typedMessage === undefined) {
        return;
      }
      
      // Отрисовка событий на графике
      pushEventMessage(typedMessage);
    };
  
    // Запуск генератора сигнала
    generator.start();
    eventGenerator.start();
  }

Пример использования генератора событий

API

Свойство Тип Описание
onFrameIsReady(handler: func) Функция Обработчик, вызываемый при готовности нового блока данных.
setPointIndex(index: int) Функция Устанавливает координату, с которой связываются события.
start() Функция Запуск генерации сигналов.
stop() Функция Завершение генерации сигналов.

Доступ к содержимому по ссылке возможен только для авторизованных пользователей GitHub, являющихся участниками организации IncartDev
Ссылка на ресурс

Доступ к содержимому по ссылке возможен только для авторизованных пользователей GitHub, являющихся участниками организации IncartDev
Ссылка на ресурс

Следующая