map_watch.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'package:common_pub/model/distance.dart';
  2. import 'package:common_pub/model/pace.dart';
  3. import 'package:common_pub/model/position.dart';
  4. import 'package:common_pub/service/controller.dart';
  5. import 'package:common_pub/ui/map_view/map_view.dart';
  6. import 'package:common_pub/ui/map_view/view_map_trace.dart';
  7. import '../service/api.dart' as pb;
  8. import 'package:fixnum/fixnum.dart';
  9. typedef MapId = Int64;
  10. class ActiveInfo{
  11. var id = 0;
  12. var name = '';
  13. var cpAllCount = 0;
  14. var userList = <UserInfo>[];
  15. final isHide = false.obs;
  16. UserInfo? getUserById(int id){
  17. for (final one in userList){
  18. if(one.gameInfo.userId==id){
  19. return one;
  20. }
  21. }
  22. return null;
  23. }
  24. Future<UserInfo> newUserInfo(pb.ToOrienteerInGameInfo info)async{
  25. final r =await pb.ApiService.to.stub.toUserInActionBasicQuery(pb.ToUserInActionBasicQueryRequest(
  26. actId: id,
  27. userId: info.userId
  28. ));
  29. return UserInfo()
  30. ..routeInfo = r.courseBaseInfo
  31. ..userInfo = r.baseInfo
  32. ..gameInfo = info
  33. ;
  34. }
  35. }
  36. extension ActiveInfoExt on pb.ToActionInfo{
  37. Future<ActiveInfo> into() async {
  38. final info = await pb.ApiService.to.stub.toActionBasicQuery(
  39. pb.IdRequest(id: Int64(actId)));
  40. final out = ActiveInfo()
  41. ..id = actId
  42. ..name = info.actName
  43. ..cpAllCount = info.totalControlNum;
  44. for(final one in userList){
  45. out.userList.add(await out.newUserInfo(one));
  46. }
  47. return out;
  48. }
  49. }
  50. class UserInfo{
  51. final isHide = false.obs;
  52. String get name => userInfo.name;
  53. String get routeName => routeInfo.courseName;
  54. Pace get pace => Pace.perKm( gameInfo.gpsInfo.pace.seconds);
  55. Duration get duration => DateTime.now().difference(gameInfo.gameSaveInfo.startAt.toModel());
  56. Distance get distance => Distance(m: gameInfo.gpsInfo.distance.toDouble());
  57. var gameInfo = pb.ToOrienteerInGameInfo();
  58. var routeInfo = pb.CourseBaseInfo();
  59. var userInfo = pb.OrienteerBaseInfo();
  60. var trace = <TracePoint>[].obs;
  61. Distance get nextDistance {
  62. final one = nextWant;
  63. if(one!= null){
  64. final p1 = Position(longitude: one.ciPosition.longitude, latitude: one.ciPosition.latitude);
  65. final p22 = gameInfo.gpsInfo.gameGpsInfos.lastOrNull;
  66. if(p22 != null){
  67. final p2 = Position(longitude: p22.longitude, latitude: p22.latitude);
  68. return p1.distance(p2);
  69. }
  70. }
  71. return const Distance(m: 1000);
  72. }
  73. pb.ToControlPoint? get nextWant{
  74. final id = gameInfo.gameSaveInfo.nextControlPoint.id;
  75. for (final one in routeInfo.controlPointSortedList){
  76. if(one.id==id){
  77. return one;
  78. }
  79. }
  80. return null;
  81. }
  82. Future<void> update(pb.ToOrienteerInGameInfo info)async{
  83. final map = MapWatchService.instance;
  84. gameInfo = info;
  85. final indexMap = <int, TracePoint>{};
  86. for (final one in trace){
  87. indexMap[one.ts.inMilliseconds]=one;
  88. }
  89. for(final one in info.gpsInfo.gameGpsInfos){
  90. final t = one.gpsTime.toModel();
  91. final ts = gameInfo.gameSaveInfo.startAt.toModel().difference(t);
  92. if(ts.inMilliseconds>0 && !indexMap.containsKey(ts.inMilliseconds)){
  93. final pos = one.toModel();
  94. trace.add(TracePoint()
  95. ..ts = ts
  96. ..position=pos
  97. );
  98. }
  99. }
  100. if(map!.plugMap.isInitFinish){
  101. for (final one in trace){
  102. if(one.onMap==Offset.zero){
  103. one.onMap = await map.plugMap.gameMap.worldToPixel(one.position);
  104. }
  105. }
  106. }
  107. }
  108. }
  109. class MapWatchService extends PlugController{
  110. static final Rx<MapWatchService?> _instance = Rx(null);
  111. static MapWatchService? get instance => _instance.value;
  112. static Future<void> setMapById(MapId id)async{
  113. final info = await pb.ApiService.to.stub.toMapDetailV2(pb.IdRequest()
  114. ..id = id);
  115. final thisInstance = MapWatchService(
  116. id: id)
  117. ..name = info.mapName
  118. ..plugMap.gameMap = info.zipImage.toGameMap() ;
  119. thisInstance.addPlugs([thisInstance.plugMap]);
  120. _instance.value = thisInstance;
  121. thisInstance.init();
  122. }
  123. MapWatchService({required this.id});
  124. final MapId id;
  125. String name= '';
  126. final plugMap = PlugMap();
  127. final activeList = <ActiveInfo>[].obs;
  128. }