-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtrains.js
More file actions
122 lines (115 loc) · 4.59 KB
/
Copy pathtrains.js
File metadata and controls
122 lines (115 loc) · 4.59 KB
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
var lineSequences = require('./data/line_sequences.json');
var linepoints = require('./data/linepoints.json');
var stations = require('./public/javascripts/data/stations.json');
var moment = require('moment');
var triptimes = require('./public/javascripts/data/triptimes.json');
var config = require('./config');
var request = require('request');
var _ = require('lodash');
_.str = require('underscore.string');
var getPrevStation = function(train){
if(lineSequences[train.Line] === undefined) return null;
if(train.DestinationCode === null) return null;
var stationIndex = _.findIndex(lineSequences[train.Line], function(station){
return station.StationCode == train.LocationCode;
});
var destIndex = _.findIndex(lineSequences[train.Line], function(station){
return station.StationCode == train.DestinationCode;
});
if(stationIndex < destIndex){
if(stationIndex - 1 < 0) return null;
else return lineSequences[train.Line][stationIndex - 1].StationCode;
}
else{
if(stationIndex >= lineSequences[train.Line].length - 1) return train.LocationCode;
else return lineSequences[train.Line][stationIndex + 1].StationCode;
}
};
var createUpdateObject = function(trains){
_.forEach(trains, function(t){
if(t.Min == 'BRD' || t.Min == 'ARR') t.Min = 0;
else t.Min = parseInt(t.Min);
})
var updates = _.groupBy(trains, function(train){
return train.LocationCode;
});
_.forOwn(updates, function(trains, station){
var groups = _.groupBy(trains, function(train){return train.Group;});
updates[station] = {track_1: null, track_2: null};
if(groups[1] !== undefined){
updates[station].track_1 = _.min(groups[1], function(t){
return t.Min == 'BRD' || t.Min == 'ARR' ? 0 : t.Min;
});
}
if(groups[2] !== undefined){
updates[station].track_2 = _.min(groups[2], function(t){
return t.Min == 'BRD' || t.Min == 'ARR' ? 0 : t.Min;
});
}
});
return updates;
};
var updates = {};
_.forEach(_.keys(stations), function(station){
updates[station] = {track_1: null, track_2: null};
});
var moveEnrouteTrains = function(io){
var now = moment().unix();
_.forOwn(updates, function(tracks, station){
_.forOwn(tracks, function(train, track){
if(train !== null){
var a = {x: train.latlon_a[0], y: train.latlon_a[1]};
var b = {x: train.latlon_b[0], y: train.latlon_b[1]};
var progress = (now - train.StartTime) / train.Duration;
if(progress <= 1){
var dx = (b.x - a.x) * progress;
var dy = (b.y - a.y) * progress;
train.position = [a.x + dx, a.y + dy];
}
else{
updates[station][track] = null;
}
}
})
});
var coords = [];
_.forEach(_.values(updates), function(tracks){
if(tracks.track_1 !== null) coords.push({
latlon: tracks.track_1.position,
line: tracks.track_1.Line
});
if(tracks.track_2 !== null) coords.push({
latlon: tracks.track_2.position,
line: tracks.track_2.Line
});
});
io.emit('train_updates', coords);
}
var updateTrains = function(){
var url = _.str.sprintf(config.metro.ALL_UPDATES_URL, config.metro.API_KEY);
request({url: url, json: true}, function(err, res, body){
var newUpdates = createUpdateObject(body.Trains);
_.forOwn(newUpdates, function(tracks, station){
_.forOwn(tracks, function(train, track){
if(train !== null){
var lastUpdate = updates[station][track];
var stop_a = getPrevStation(train);
var stop_b = train.LocationCode;
var tripTime = triptimes[stop_a + ',' + stop_b];
if(lastUpdate === null && stop_a !== null && train.Min <= tripTime){
train['Duration'] = train.Min * 60;
train['latlon_a'] = [stations[stop_a].Lat, stations[stop_a].Lon];
train['latlon_b'] = [stations[stop_b].Lat, stations[stop_b].Lon];
train['StartTime'] = moment().unix();
train['position'] = train.latlon_a;
updates[station][track] = train;
}
}
});
});
});
};
module.exports = {
moveEnrouteTrains: moveEnrouteTrains,
updateTrains: updateTrains
}