周睿 2 rokov pred
rodič
commit
8d782b9a9b

+ 13 - 1
lib/service/api.dart

@@ -1,6 +1,6 @@
 import 'dart:async';
 import 'dart:typed_data';
-
+import 'package:common_pub/model/position.dart';
 import 'package:common_pub/model/game_map.dart';
 import 'package:get/get.dart';
 import 'package:grpc/grpc.dart';
@@ -170,4 +170,16 @@ extension NetImageExt on pb.NetImage{
       ..md5 = md5Data
       ..readerBuilder = ()=> ApiService.to.getBinReaderByMd5(md5Data);
   }
+}
+
+extension DateTimeExt on pb.Timestamp{
+  DateTime toModel(){
+    return toDateTime(toLocal: true);
+  }
+}
+extension PositionExt on pb.GameGpsInfo{
+  Position toModel(){
+    return Position(latitude: latitude, longitude: longitude)
+      ..altitude=altitude;
+  }
 }

+ 49 - 11
lib/service/map_watch.dart

@@ -68,30 +68,68 @@ class UserInfo{
   String get name => userInfo.name;
   String get routeName => routeInfo.courseName;
   Pace get pace => Pace.perKm( gameInfo.gpsInfo.pace.seconds);
-  Duration get duration => Duration(seconds: gameInfo.gameSaveInfo.duration.seconds.toInt());
+  Duration get duration => DateTime.now().difference(gameInfo.gameSaveInfo.startAt.toModel());
   Distance get distance => Distance(m: gameInfo.gpsInfo.distance.toDouble());
   var gameInfo = pb.ToOrienteerInGameInfo();
   var routeInfo = pb.CourseBaseInfo();
   var userInfo = pb.OrienteerBaseInfo();
   var trace = <TracePoint>[].obs;
-  Distance get nextDistance {
-    final next = gameInfo.gameSaveInfo.nextControlPoint;
 
-    for (final one in routeInfo.controlPointSortedList){
-      if(one.id==next.id){
-        final p1 = Position(longitude: one.ciPosition.longitude, latitude: one.ciPosition.latitude);
-        final p22 = gameInfo.gpsInfo.gameGpsInfos.lastOrNull;
-        if(p22 == null){
-          break;
-        }
 
+  Distance get nextDistance {
+    final one = nextWant;
+    if(one!= null){
+      final p1 = Position(longitude: one.ciPosition.longitude, latitude: one.ciPosition.latitude);
+      final p22 = gameInfo.gpsInfo.gameGpsInfos.lastOrNull;
+      if(p22 != null){
         final p2 = Position(longitude: p22.longitude, latitude: p22.latitude);
         return p1.distance(p2);
       }
     }
-
     return const Distance(m: 1000);
   }
+
+  pb.ToControlPoint? get nextWant{
+    final id = gameInfo.gameSaveInfo.nextControlPoint.id;
+    for (final one in routeInfo.controlPointSortedList){
+      if(one.id==id){
+        return one;
+      }
+    }
+    return null;
+  }
+
+  Future<void> update(pb.ToOrienteerInGameInfo info)async{
+    final map = MapWatchService.instance;
+
+
+    gameInfo = info;
+    final indexMap = <int, TracePoint>{};
+
+    for (final one in trace){
+      indexMap[one.ts.inMilliseconds]=one;
+    }
+
+    for(final one in info.gpsInfo.gameGpsInfos){
+      final t = one.gpsTime.toModel();
+      final ts = gameInfo.gameSaveInfo.startAt.toModel().difference(t);
+      if(ts.inMilliseconds>0 && !indexMap.containsKey(ts.inMilliseconds)){
+        final pos = one.toModel();
+        trace.add(TracePoint()
+            ..ts = ts
+            ..position=pos
+        );
+      }
+    }
+
+    if(map!.plugMap.isInitFinish){
+      for (final one in trace){
+        if(one.onMap==Offset.zero){
+          one.onMap = await map.plugMap.gameMap.worldToPixel(one.position);
+        }
+      }
+    }
+  }
 }
 
 

+ 39 - 6
lib/view/home/field_control/field_control.dart

@@ -2,6 +2,7 @@ import 'package:application/widget.dart';
 import 'package:common_pub/ui/map_view/map_view.dart';
 import 'package:common_pub/ui/map_view/view_map_image.dart';
 import 'package:common_pub/ui/map_view/view_map_touch.dart';
+import 'package:common_pub/ui/map_view/view_map_user_point.dart';
 import 'package:common_pub/ui/map_view/view_plug_loading.dart';
 import 'package:common_pub/utils.dart';
 import 'field_control_controller.dart';
@@ -50,6 +51,7 @@ class FieldControlPage extends StatelessWidget{
             Expanded(child: ViewMapStack(plug: map.plugMap, children: [
               ViewPlugLoading(map.plugMap),
               ViewMapImage(map.plugMap),
+              _ViewTrace(map: map),
               ViewMapTouch(map.plugMap)
             ])),
             _MsgView(),
@@ -60,7 +62,37 @@ class FieldControlPage extends StatelessWidget{
     );
   }
 }
+class _ViewTrace extends GetView<FieldControlController>{
+  const _ViewTrace({required this.map});
+  final MapWatchService map;
 
+  @override
+  Widget build(BuildContext context) {
+    return Obx((){
+      final children = <Widget>[
+
+      ];
+
+      for(final act in controller.activeList){
+        for(final user in act.userList){
+          if(user.isHide.value){
+            continue;
+          }
+          final trace = user.trace.lastOrNull;
+          if(trace != null){
+            children.add(ViewMapUserPoint(map.plugMap, trace));
+          }
+        }
+      }
+
+      return Stack(
+        alignment: Alignment.topLeft,
+          children: children
+      );
+    });
+  }
+
+}
 class _ActiveInfoView extends GetView<FieldControlController>{
 
   @override
@@ -140,7 +172,7 @@ class _UserInfoView extends GetView<FieldControlController>{
               Row(
                 children: [
                   container(null, cpInfo, Colors.blue),
-                  container(const Icon(Icons.favorite, size: 13, color: Colors.white,), hrInfo, Colors.blue),
+                  container(const Icon(Icons.favorite, size: 13, color: Colors.white,), ' ${hr==0?'--':hr}', 0.toHRPColor()),
                   container(null, paceInfo, Colors.blue)
                 ],
               ),
@@ -169,16 +201,17 @@ class _UserInfoView extends GetView<FieldControlController>{
       ),
     );
   }
-  String get hrInfo{
-    return ' ${data.gameInfo.hrInfo.hrInfo.lastOrNull??0}';
+  int get hr{
+    return data.gameInfo.hrInfo.hrInfo.lastOrNull?.hr??0;
   }
+
   String get cpInfo{
-    final next = data.gameInfo.gameSaveInfo.nextControlPoint;
-    return '${next.orderNo}号点(${next.sn})';
+    final next = data.nextWant;
+    return '${data.gameInfo.gameSaveInfo.nextControlPoint.orderNo}号点(${next?.sn})';
   }
   String get paceInfo{
     Duration;
-    return '${data.pace.toMinSecondString()}/km';
+    return data.pace.toString();
   }
 
   Widget container(Widget? icon, String text, Color color){

+ 2 - 1
lib/view/home/field_control/field_control_controller.dart

@@ -15,7 +15,8 @@ extension ActiveInfoExt2 on ActiveInfo{
       final oUser = getUserById(nUser.userId);
       if (oUser != null) {
         user = oUser;
-        user.gameInfo = nUser;
+        await user.update(nUser);
+
       }else{
         user = await newUserInfo(nUser);
       }

+ 1 - 1
third_party/common_pub

@@ -1 +1 @@
-Subproject commit 195aa65bee16dea43f03522f00421d62b9d29ba2
+Subproject commit 90c7f69e87f45cb675728d77d74dd2e8262c279d