UNPKG

dozee-ecg-chart

Version:

A library for drawing ECG charts with real-time data

1 lines 16.8 kB
{"version":3,"file":"dozee-ecg-chart.mjs","sources":["../../../projects/dozee-ecg-chart/src/lib/dozee-ecg-chart.service.ts","../../../projects/dozee-ecg-chart/src/lib/dozee-ecg-chart.component.ts","../../../projects/dozee-ecg-chart/src/lib/dozee-ecg-chart.component.html","../../../projects/dozee-ecg-chart/src/lib/dozee-ecg-chart.module.ts","../../../projects/dozee-ecg-chart/src/public-api.ts","../../../projects/dozee-ecg-chart/src/dozee-ecg-chart.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DozeeEcgChartService {\n\n constructor() { }\n}\n","import { Component, OnInit, Input, Renderer2, NgZone } from '@angular/core';\nimport {\n Chart,\n CategoryScale,\n LinearScale,\n LineController,\n LineElement,\n PointElement,\n Title,\n Tooltip,\n Legend,\n} from 'chart.js';\n\ninterface EcgSignalData {\n Key: string;\n Timestamp: number;\n Values: number[];\n}\n\ninterface Xy {\n Timestamp: number;\n Value: number;\n}\n\n@Component({\n selector: 'app-ecg-chart',\n templateUrl: './dozee-ecg-chart.component.html',\n styleUrls: ['./dozee-ecg-chart.component.css'],\n})\nexport class DozeeEcgChartComponent implements OnInit {\n @Input() accessToken!: string;\n @Input() userId!: string;\n @Input() stage!: string;\n @Input() strokeColor: string = '#00ff00';\n @Input() backgroundColor: string = '#000000';\n\n private eventSource: EventSource | null = null;\n private buffer: Xy[][] = [];\n private chart!: Chart;\n private frequency = 256; // Hz\n private duration = 8; // seconds\n private maxPoints = this.frequency * this.duration; // 2048 points\n private ecgData = Array(this.maxPoints).fill(null);\n private bufferLimit = 64 * 64;\n private isPageActive = true;\n private intervalId: any;\n private inactivityTimeout: any; // Timer to track inactivity\n private readonly INACTIVE_DELAY = 30000;\n private readonly RETRY_DELAY = 6000;\n\n constructor(private renderer: Renderer2, private ngZone: NgZone) {}\n\n ngOnInit(): void {\n // Register necessary chart components\n Chart.register(\n CategoryScale,\n LinearScale,\n LineController,\n LineElement,\n PointElement,\n Title,\n Tooltip,\n Legend\n );\n\n const ctx = document.getElementById('ecgChart') as HTMLCanvasElement;\n ctx.style.backgroundColor = this.backgroundColor;\n\n this.chart = new Chart(ctx, {\n type: 'line',\n data: {\n labels: Array(this.maxPoints).fill(0.0), // Empty labels as X axis is fixed\n datasets: [\n {\n label: 'ECG Data',\n data: this.ecgData,\n borderColor: this.strokeColor,\n borderWidth: 1,\n fill: false,\n pointRadius: 0, // Hide points for smooth line\n },\n ],\n },\n options: {\n animation: false,\n responsive: true,\n maintainAspectRatio: false,\n scales: {\n x: {\n type: 'linear',\n min: 0,\n max: this.maxPoints, // Set fixed X-axis range (8 seconds)\n display: false, // Hide the x-axis\n grid: { display: false },\n },\n y: {\n max: 4000, // Adjust based on ECG value range\n min: 0,\n type: 'linear',\n beginAtZero: true,\n grid: { display: false },\n display: false,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n },\n elements: {\n line: {\n tension: 0.4,\n },\n },\n },\n });\n\n // Initialize SSE connection\n this.initializeSse();\n\n this.renderer.listen('document', 'visibilitychange', () => {\n if (document.hidden) {\n console.log('Page became inactive, starting 30s timeout...');\n this.startInactivityTimer();\n } else {\n console.log('Page is active again, canceling inactivity timeout');\n this.cancelInactivityTimer();\n this.startInterval();\n }\n });\n\n // Start interval initially\n this.startInterval();\n }\n\n private startInterval() {\n if (!this.intervalId) {\n // Update chart data at regular intervals\n this.intervalId = setInterval(() => {\n\n if (this.buffer.length > this.bufferLimit && this.currentIndex === 0) {\n if (this.stage === 'sit') {\n console.warn(`Buffer overflow: Skipping ${this.buffer.length - 64} old entries`);\n }\n this.buffer.splice(0, this.buffer.length - 64);\n }\n\n if (this.buffer.length > 0) {\n const entry = this.buffer.shift() as Xy[];\n for (const e of entry) {\n this.addData(e);\n }\n }\n }, 16); // Update frequency (256 Hz)\n }\n }\n\n private startInactivityTimer() {\n this.inactivityTimeout = setTimeout(() => {\n console.log('Page has been inactive for 30 seconds, stopping updates.');\n this.isPageActive = false;\n this.clearInterval();\n }, this.INACTIVE_DELAY);\n }\n\n private cancelInactivityTimer() {\n if (this.inactivityTimeout) {\n clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = null;\n }\n this.isPageActive = true;\n }\n\n private clearInterval() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private currentIndex = 0;\n addData(e: Xy) {\n if (this.chart.data.labels) {\n this.ecgData[this.currentIndex] = e.Value;\n this.chart.data.labels[this.currentIndex] = this.currentIndex;\n\n for (\n let i = this.currentIndex + 1;\n i < Math.min(this.currentIndex + 64, this.maxPoints);\n i++\n ) {\n this.ecgData[i] = null;\n }\n\n // Advance the index, and wrap around if it exceeds maxPoints\n this.currentIndex = (this.currentIndex + 1) % this.maxPoints;\n if (this.stage === 'sit') {\n console.log('Current index:', this.currentIndex);\n }\n\n // Update the chart data\n this.chart.data.datasets[0].data = this.ecgData;\n this.chart.update();\n }\n }\n\n initializeSse(): void {\n const sseUrl = `https://ecgsse${this.stage ? `-${this.stage}`: ''}.dozee.cloud/sse/ecgstream?userId=${this.userId}&accessToken=${this.accessToken}&ngsw-bypass=true`;\n\n this.ngZone.runOutsideAngular(() => {\n this.eventSource = new EventSource(sseUrl);\n this.eventSource.onmessage = (e: MessageEvent) => {\n const data = JSON.parse(e.data) as EcgSignalData;\n if (data.Key === 'SIGNAL' && this.isPageActive) {\n this.ngZone.run(() => {\n // Angular will detect this change and update bindings\n let entry: Xy[] = [];\n data.Values.forEach((s: number, i: number) => {\n entry.push({\n Timestamp: data.Timestamp + i * (1000 / this.frequency), // Adjust timestamp for frequency\n Value: s,\n });\n\n if (entry.length === 4) {\n this.buffer.push(entry);\n if (this.stage === 'sit') {\n console.log('Buffer length:', this.buffer.length);\n }\n entry = [];\n }\n });\n });\n }\n };\n\n this.eventSource.onerror = (error) => {\n console.error('SSE error, will retry in 6s', error);\n this.closeConnection();\n\n // schedule a reconnect\n setTimeout(() => {\n this.initializeSse();\n }, this.RETRY_DELAY);\n };\n });\n }\n\n ngOnDestroy(): void {\n this.closeConnection();\n }\n\n private closeConnection(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n}\n","<div class=\"chart-container\">\n <canvas id=\"ecgChart\"></canvas>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DozeeEcgChartComponent } from './dozee-ecg-chart.component';\n\n@NgModule({\n declarations: [DozeeEcgChartComponent], // Declare the component\n imports: [CommonModule], // Import necessary modules\n exports: [DozeeEcgChartComponent], // Export the component so it can be used outside\n})\nexport class DozeeEcgChartModule {}\n","/*\n * Public API Surface of dozee-ecg-chart\n */\n\nexport * from './lib/dozee-ecg-chart.service';\nexport * from './lib/dozee-ecg-chart.component';\nexport * from './lib/dozee-ecg-chart.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}