-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrallydata.js
123 lines (93 loc) · 4.24 KB
/
rallydata.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
RallyData = function() {
this.odometerCoeff = 1.0; // coefficient to multiply real distance by to get odometer distance
this.startTime = null;
this.startOdo = null;
this.nextPoint = 0;
this.path = [];
};
RallyData.prototype = {
setOdometerCoeff: function( realDistance, odoDistance ) {
this.odometerCoeff = odoDistance / realDistance;
},
addPathElement: function( distanceFromStart, avgSpeed, expectedDelay, comment ) {
var pathPoint = { "dist": distanceFromStart, "avgSpeed": avgSpeed, "expectedDelay": expectedDelay, "comment": comment };
path.push(pathPoint);
},
//-------------------------------------
start: function( realOdo, realTime ) {
this.startTime = realTime;
this.startOdo = realOdo;
},
passPathElement: function( realOdo, realTime ) {
var pathPoint = path[nextPoint];
pathPoint["realOdo"] = realOdo;
pathPoint["realTime"] = realTime;
this.nextPoint++;
},
undoPass: function() {
this.nextPoint--;
var pathPoint = path[nextPoint];
delete pathPoint.realOdo;
delete pathPoint.realTime;
},
addTimeReset: function( realOdo, realTime, claimedDelay ) {
var currentPathPoint = path[nextPoint];
var expectedCurrentDistance = ...
var pathPoint = { "dist": expectedCurrentDistance,
"avgSpeed": currentPathPoint.avgSpeed,
"expectedDelay": 0,
"comment": "checkpoint",
"timeReset": true,
"realOdo": realOdo,
"realTime": realTime,
"claimedDelay": claimedDelay
};
this.path.splice(nextPoint, 0, pathPoint);
this.nextPoint++;
},
//-------------------------------------
computeExpectedOdoAndTime: function(pathElement, onlySome) {
var expectedData = [];
var expectedOdo = this.startOdo;
var expectedTime = this.startTime;
var windowSize = 100;
if (onlySome) windowSize = 10;
var from = Math.max(0, this.nextPoint - windowSize);
var to = Math.min(this.path.length, this.nextPoint + windowSize*2);
if (to < from + windowSize*3) {
from = Math.max(0, to - windowSize*3);
to = math.min(this.path.length, from + windowSize*3);
}
for (var i = from; i < to; i++) {
var pathPoint = path[i];
expectedOdo = pathPoint.timeReset ? pathPoint.realOdo : this._computeExpectedOdo( expectedOdo, pathPoint.dist );
expectedTime = pathPoint.timeReset ? pathPoint.realTime : this._computeExpectedTime( expectedTime, pathPoint.dist, pathPoint.avgSpeed, pathPoint.delay );
var element = { "comment": pathPoint.comment,
"dist": pathPoint.dist,
"acgSpeed": pathPoint.avgSpeed,
"delay": pathPoint.delay,
"expectedOdo": expectedOdo,
"expectedTime": expectedTime,
"realOdo": pathPoint.hasOwnProperty("realOdo") ? pathPoint.realOdo : null,
"realTime": pathPoint.hasOwnProperty("realTime") ? pathPoint.realTime : null };
var str = this._toString(element);
element["asString"] = str;
expectedData.push( element);
}
return { "next": this.nextPoint, "data": expectedData };
},
_computeExpectedOdo: function( knownRealOdoPoint, distanceFromThatPoint )
{
return knownRealOdoPoint + distanceFromThatPoint * this.odometerCoeff;
},
_computeExpectedTime: function( prevPointTime, distanceFromThatPoint, averageSpeed, delay )
{
var timeToDrive = (distanceFromThatPoint == 0 || averageSpeed == 0) ? 0 : distanceFromThatPoint / averageSpeed;
var timeToPass = timeToDrive * 60*60 + delay;
return this._addTime( prevPointTime, timeToPass );
},
_addTime: function( time1, diffInSeconds )
{
return new Date(time1.getTime() + diffInSeconds*1000);
}
};