Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
        /// <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;
        }