/// <summary> /// Смещает метку канала на заданное кол-во микросекунд. /// Возвращает смещение в микросекундах, /// на которое реально была перемещена метка канала. /// </summary> /// <param name="markerId">Идентификатор метки</param> /// <param name="markerOffset">Смещение метки в микросекундах</param> /// <param name="channelName">Имя канала данных</param> public static double MoveChannelMarker( this PatientPhysioData _this, long markerId, long markerOffset, string channelName) { if (!_this.ContainsMarker(markerId)) { return(0); } var marker = _this.GetMarkerByIdOrDefault(markerId); var channelMarker = GetChannelMarkByChannelName(marker.ChannelMarks, channelName); if (null == channelMarker) { return(0); } var channel = _this.GetChannelData(channelName); if (null == channel) { return(0); } return(_this.MoveChannelMarker(channelMarker, markerOffset, channel)); }
/// <summary> /// Смещает метку на заданное кол-во микросекунд. /// Максимальное положение метки на оси времени не контролируется. /// </summary> /// <param name="markerId">Идентификатор метки</param> /// <param name="markerOffset">Смещение метки в микросекундах</param> public static void MoveMarker( this PatientPhysioData _this, long markerId, long markerOffset) { if (!_this.ContainsMarker(markerId)) { return; } var marker = _this.GetMarkerByIdOrDefault(markerId); // нет смысла двигать маркер, если он установлен на "минус бесконечность" if (long.MinValue == marker.TimestampUsec) { return; } // метка не может быть установлена раньше начала записи данных if ((marker.TimestampUsec + markerOffset) < 0) { markerOffset = 0 - marker.TimestampUsec; } // модифицировать канальные метки, соответствующие данному маркеру // максимальное положение метки на оси времени не контролируется foreach (ChannelMark channelMark in marker.ChannelMarks) { var channelData = _this.Channels[channelMark.ChannelId]; System.Diagnostics.Debug.Assert(channelData != null); double channelMarkerOffset = _this.MoveChannelMarker(channelMark, markerOffset, channelData); // разница между требуемым смещением метки канала и реально полученным // может быть меньше нуля только тогда, когда требуемое новое положение метки // лежит на временной оси раньше начала данных канала. double markerOffsetDelta = ((double)markerOffset) - channelMarkerOffset; // дополняем смещение метки канала, невыходящее за границы временного интервала данных, // смещением до заданного нового положения метки синхронизации. channelMark.Offset += (long)Math.Floor(markerOffsetDelta); } // новое положение метки синхронизации marker.TimestampUsec += markerOffset; }