123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import 'dart:async';
- import 'dart:convert';
- import 'dart:ui';
- import 'package:flutter/foundation.dart';
- import 'package:flutter/material.dart';
- import 'package:get/get.dart';
- import 'package:vitalapp/architecture/utils/prompt_box.dart';
- import 'dart:ui' as ui;
- import 'index.dart';
- class EcgViewController extends GetxController {
- EcgViewController();
-
- static int get dataPerSecond => 125;
-
- static int updateFrameRate = 25;
-
- static int updatePeriod = 1000 ~/ updateFrameRate;
-
- int get timeSpan => 3;
-
- int get xDataCount => dataPerSecond * timeSpan;
-
- List<int> allPoints = [];
-
- List<int> newPointsToDraw = [];
-
- List<int> oldPointsToDraw = [];
-
- int startTime = DateTime.now().millisecondsSinceEpoch;
-
- int currentDataIndex = 0;
-
- Timer timer = Timer(Duration.zero, () {});
-
- bool isPaused = false;
-
- void addData(List<int> data) {
- if (allPoints.isEmpty) {
- startTime = DateTime.now().millisecondsSinceEpoch;
- _startTimer();
- }
- allPoints.addAll(data);
- if (isPaused) {
- isPaused = false;
- _startTimer();
- }
- }
-
- void openFullScreenDialog() {
- print("当前点总数为:${allPoints.length}");
- if (allPoints.length < dataPerSecond * 30) {
- PromptBox.toast("未完成检测,数据量不足");
- return;
- }
- Get.dialog(
- const FullScreenEcgDataDialog(),
- );
- }
-
- void reset() {
- allPoints.clear();
- newPointsToDraw.clear();
- oldPointsToDraw.clear();
- startTime = DateTime.now().millisecondsSinceEpoch;
- currentDataIndex = 0;
- timer.cancel();
- isPaused = false;
- update(['ecg_view']);
- }
-
- Future<String> getFullDataImageBase64() async {
- if (allPoints.length < dataPerSecond * 30) {
- PromptBox.toast("未完成检测,数据量不足");
- return "";
- }
- final painter = EcgPainterForAll(
- allPoints: allPoints,
- yMax: 600,
- );
- final bgPainter = GridBackgroundPainterForAll();
- const size = Size(5000, 650);
-
- final Uint8List? bytes =
- await _capturePainterToImage(painter, bgPainter, size);
- if (bytes == null) {
- return "";
- } else {
- return _convertToBase64Url(bytes);
- }
- }
-
- void _startTimer() {
- timer = Timer.periodic(
- Duration(milliseconds: updatePeriod),
- (timer) {
-
- _updateData();
- },
- );
- }
-
- void _updateData() {
-
- currentDataIndex = (DateTime.now().millisecondsSinceEpoch - startTime) ~/
- (1000 ~/ dataPerSecond);
-
- int needDataCount = currentDataIndex % xDataCount;
-
- int currentPeriod = currentDataIndex ~/ xDataCount;
-
- try {
- newPointsToDraw = allPoints.sublist(
- currentDataIndex - needDataCount,
- currentDataIndex,
- );
- if (currentPeriod > 0) {
- oldPointsToDraw = allPoints.sublist(
- (currentPeriod - 1) * xDataCount,
- currentPeriod * xDataCount,
- );
- }
-
-
- } catch (e) {
- timer.cancel();
- isPaused = true;
- }
- update(['ecg_view']);
- }
-
- String _convertToBase64Url(Uint8List imageData) {
- String base64Image = base64Encode(imageData);
- String base64Url = base64Image;
- return base64Url;
- }
-
- Future<Uint8List?> _capturePainterToImage(
- CustomPainter painter, CustomPainter bgPainter, Size size) async {
- final bounds = Offset.zero & size;
- final picture = PictureRecorder();
- final pictureCanvas = Canvas(picture);
-
- pictureCanvas.clipRect(bounds);
-
- bgPainter.paint(pictureCanvas, size);
- painter.paint(pictureCanvas, size);
-
- final borderPaint = Paint()
- ..color = Colors.black
- ..style = PaintingStyle.stroke
- ..strokeWidth = 1.0;
- pictureCanvas.drawRect(bounds, borderPaint);
-
- final recordedPicture = picture.endRecording();
- final image =
- await recordedPicture.toImage(size.width.toInt(), size.height.toInt());
-
- final byteData = await image.toByteData(format: ui.ImageByteFormat.png);
- final bytes = byteData?.buffer.asUint8List();
- return bytes;
- }
-
-
-
-
- @override
- void onReady() {
- super.onReady();
- print("onReady");
- }
- @override
- void onClose() {
- super.onClose();
- timer.cancel();
- }
- }
|