-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdashboard.html
More file actions
227 lines (204 loc) · 56.7 KB
/
dashboard.html
File metadata and controls
227 lines (204 loc) · 56.7 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Orbital Compute Simulator</title>
<style>
:root { --bg: #0a0e17; --card: #141b2d; --border: #1e2a45; --text: #e0e6f0;
--dim: #6b7a99; --accent: #4fc3f7; --green: #66bb6a; --orange: #ffa726;
--red: #ef5350; --purple: #ab47bc; }
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: var(--bg); color: var(--text); font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 13px; padding: 20px; }
h1 { font-size: 18px; color: var(--accent); margin-bottom: 4px; }
h2 { font-size: 14px; color: var(--dim); margin-bottom: 16px; font-weight: normal; }
h3 { font-size: 13px; color: var(--accent); margin-bottom: 8px; padding-bottom: 4px;
border-bottom: 1px solid var(--border); }
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; }
.grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; margin-bottom: 16px; }
.card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; }
.card-full { grid-column: 1 / -1; }
.stat { text-align: center; padding: 12px; }
.stat .value { font-size: 28px; font-weight: bold; color: var(--accent); }
.stat .label { font-size: 11px; color: var(--dim); margin-top: 4px; }
table { width: 100%; border-collapse: collapse; }
th { text-align: left; color: var(--dim); font-weight: normal; padding: 6px 8px;
border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }
td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
.bar { height: 8px; border-radius: 4px; background: var(--border); position: relative; }
.bar-fill { height: 100%; border-radius: 4px; position: absolute; left: 0; top: 0; }
.green { color: var(--green); }
.orange { color: var(--orange); }
.red { color: var(--red); }
canvas { width: 100%; height: 200px; }
.timeline { position: relative; height: 40px; background: var(--bg); border-radius: 4px;
margin: 4px 0; overflow: hidden; }
.timeline-block { position: absolute; height: 100%; border-radius: 2px; }
.timeline-eclipse { background: rgba(239,83,80,0.3); }
.timeline-compute { background: rgba(79,195,247,0.5); }
.timeline-contact { background: rgba(102,187,106,0.5); }
.legend { display: flex; gap: 16px; margin-top: 8px; font-size: 11px; color: var(--dim); }
.legend-dot { width: 10px; height: 10px; border-radius: 2px; display: inline-block;
margin-right: 4px; vertical-align: middle; }
.contact-list { max-height: 200px; overflow-y: auto; }
.contact-item { display: flex; justify-content: space-between; padding: 4px 0;
border-bottom: 1px solid var(--border); font-size: 12px; }
</style>
</head>
<body>
<h1>ORBITAL COMPUTE SIMULATOR</h1>
<h2>Schedule compute jobs across satellite constellations</h2>
<div class="grid-3" id="stats"></div>
<div class="grid" id="main-panels"></div>
<div class="card card-full" id="timeline-panel"></div>
<div class="grid" id="detail-panels" style="margin-top:16px"></div>
<script>
const DATA = {"config": {"n_satellites": 12, "sim_hours": 12.0, "n_jobs": 80}, "scheduler": {"total_jobs": 80, "completed": 80, "running": 0, "queued": 0, "preempted": 0, "idle_steps": 5819, "charge_steps": 0}, "fleet_utilization_pct": 32.2, "total_compute_hours": 46.36, "satellite_details": {"SAT-000": {"compute_pct": 32.1, "eclipse_pct": 36.9, "avg_battery_pct": 98.2, "avg_temp_c": -11.2, "max_temp_c": 21.9, "min_battery_pct": 82.5, "contact_windows": 14, "total_contact_minutes": 81.0}, "SAT-001": {"compute_pct": 32.8, "eclipse_pct": 34.4, "avg_battery_pct": 98.0, "avg_temp_c": -9.3, "max_temp_c": 21.1, "min_battery_pct": 79.1, "contact_windows": 16, "total_contact_minutes": 93.0}, "SAT-002": {"compute_pct": 30.3, "eclipse_pct": 34.3, "avg_battery_pct": 97.8, "avg_temp_c": -13.1, "max_temp_c": 23.2, "min_battery_pct": 77.9, "contact_windows": 17, "total_contact_minutes": 98.0}, "SAT-003": {"compute_pct": 32.6, "eclipse_pct": 26.0, "avg_battery_pct": 98.3, "avg_temp_c": -7.4, "max_temp_c": 23.8, "min_battery_pct": 82.0, "contact_windows": 17, "total_contact_minutes": 93.0}, "SAT-004": {"compute_pct": 32.4, "eclipse_pct": 27.6, "avg_battery_pct": 98.8, "avg_temp_c": -9.1, "max_temp_c": 23.2, "min_battery_pct": 82.2, "contact_windows": 19, "total_contact_minutes": 107.0}, "SAT-005": {"compute_pct": 35.3, "eclipse_pct": 36.9, "avg_battery_pct": 97.4, "avg_temp_c": -11.8, "max_temp_c": 20.5, "min_battery_pct": 75.7, "contact_windows": 18, "total_contact_minutes": 104.0}, "SAT-006": {"compute_pct": 34.4, "eclipse_pct": 37.1, "avg_battery_pct": 97.8, "avg_temp_c": -10.5, "max_temp_c": 23.0, "min_battery_pct": 82.2, "contact_windows": 17, "total_contact_minutes": 98.0}, "SAT-007": {"compute_pct": 30.8, "eclipse_pct": 34.6, "avg_battery_pct": 98.4, "avg_temp_c": -13.1, "max_temp_c": 20.4, "min_battery_pct": 79.4, "contact_windows": 13, "total_contact_minutes": 79.0}, "SAT-008": {"compute_pct": 36.1, "eclipse_pct": 35.4, "avg_battery_pct": 97.3, "avg_temp_c": -11.2, "max_temp_c": 22.9, "min_battery_pct": 75.6, "contact_windows": 14, "total_contact_minutes": 86.0}, "SAT-009": {"compute_pct": 31.8, "eclipse_pct": 28.7, "avg_battery_pct": 98.5, "avg_temp_c": -9.1, "max_temp_c": 23.3, "min_battery_pct": 82.1, "contact_windows": 15, "total_contact_minutes": 94.0}, "SAT-010": {"compute_pct": 30.3, "eclipse_pct": 29.0, "avg_battery_pct": 98.8, "avg_temp_c": -10.8, "max_temp_c": 22.2, "min_battery_pct": 82.4, "contact_windows": 13, "total_contact_minutes": 79.0}, "SAT-011": {"compute_pct": 32.9, "eclipse_pct": 37.4, "avg_battery_pct": 96.2, "avg_temp_c": -11.4, "max_temp_c": 22.2, "min_battery_pct": 71.5, "contact_windows": 12, "total_contact_minutes": 74.0}}, "completed_jobs": [{"job_id": "JOB-0045", "satellite": "SAT-002", "duration_s": 323.7, "power_w": 553.1}, {"job_id": "JOB-0034", "satellite": "SAT-001", "duration_s": 833.1, "power_w": 424.3}, {"job_id": "JOB-0058", "satellite": "SAT-004", "duration_s": 1005.4, "power_w": 491.4}, {"job_id": "JOB-0062", "satellite": "SAT-005", "duration_s": 1279.1, "power_w": 292.9}, {"job_id": "JOB-0015", "satellite": "SAT-002", "duration_s": 991.4, "power_w": 422.1}, {"job_id": "JOB-0030", "satellite": "SAT-000", "duration_s": 1734.7, "power_w": 266.9}, {"job_id": "JOB-0001", "satellite": "SAT-010", "duration_s": 2730.4, "power_w": 333.9}, {"job_id": "JOB-0009", "satellite": "SAT-011", "duration_s": 2708.1, "power_w": 684.3}, {"job_id": "JOB-0064", "satellite": "SAT-006", "duration_s": 3114.0, "power_w": 501.7}, {"job_id": "JOB-0055", "satellite": "SAT-003", "duration_s": 3124.7, "power_w": 684.8}, {"job_id": "JOB-0067", "satellite": "SAT-007", "duration_s": 3237.9, "power_w": 271.9}, {"job_id": "JOB-0065", "satellite": "SAT-011", "duration_s": 564.4, "power_w": 776.5}, {"job_id": "JOB-0071", "satellite": "SAT-008", "duration_s": 3365.8, "power_w": 474.3}, {"job_id": "JOB-0076", "satellite": "SAT-009", "duration_s": 3557.9, "power_w": 567.0}, {"job_id": "JOB-0026", "satellite": "SAT-001", "duration_s": 2913.9, "power_w": 576.5}, {"job_id": "JOB-0078", "satellite": "SAT-007", "duration_s": 743.2, "power_w": 763.4}, {"job_id": "JOB-0025", "satellite": "SAT-009", "duration_s": 455.5, "power_w": 254.5}, {"job_id": "JOB-0028", "satellite": "SAT-004", "duration_s": 3140.6, "power_w": 782.6}, {"job_id": "JOB-0037", "satellite": "SAT-005", "duration_s": 3197.4, "power_w": 234.8}, {"job_id": "JOB-0005", "satellite": "SAT-011", "duration_s": 1218.0, "power_w": 469.5}, {"job_id": "JOB-0046", "satellite": "SAT-002", "duration_s": 3287.9, "power_w": 337.4}, {"job_id": "JOB-0056", "satellite": "SAT-010", "duration_s": 2083.9, "power_w": 591.3}, {"job_id": "JOB-0051", "satellite": "SAT-000", "duration_s": 3150.7, "power_w": 446.7}, {"job_id": "JOB-0000", "satellite": "SAT-005", "duration_s": 382.5, "power_w": 583.7}, {"job_id": "JOB-0002", "satellite": "SAT-011", "duration_s": 404.9, "power_w": 554.3}, {"job_id": "JOB-0077", "satellite": "SAT-003", "duration_s": 2130.2, "power_w": 600.7}, {"job_id": "JOB-0014", "satellite": "SAT-008", "duration_s": 2397.8, "power_w": 366.8}, {"job_id": "JOB-0016", "satellite": "SAT-011", "duration_s": 864.8, "power_w": 565.5}, {"job_id": "JOB-0033", "satellite": "SAT-007", "duration_s": 1975.3, "power_w": 705.0}, {"job_id": "JOB-0039", "satellite": "SAT-004", "duration_s": 1868.4, "power_w": 277.0}, {"job_id": "JOB-0006", "satellite": "SAT-000", "duration_s": 1422.8, "power_w": 618.9}, {"job_id": "JOB-0072", "satellite": "SAT-006", "duration_s": 3594.9, "power_w": 475.0}, {"job_id": "JOB-0017", "satellite": "SAT-003", "duration_s": 1552.2, "power_w": 298.0}, {"job_id": "JOB-0031", "satellite": "SAT-001", "duration_s": 3190.3, "power_w": 772.3}, {"job_id": "JOB-0003", "satellite": "SAT-002", "duration_s": 2286.7, "power_w": 339.6}, {"job_id": "JOB-0038", "satellite": "SAT-009", "duration_s": 2992.9, "power_w": 639.1}, {"job_id": "JOB-0011", "satellite": "SAT-005", "duration_s": 2341.1, "power_w": 697.6}, {"job_id": "JOB-0004", "satellite": "SAT-010", "duration_s": 2614.4, "power_w": 629.6}, {"job_id": "JOB-0079", "satellite": "SAT-009", "duration_s": 813.0, "power_w": 645.5}, {"job_id": "JOB-0047", "satellite": "SAT-003", "duration_s": 1219.0, "power_w": 508.5}, {"job_id": "JOB-0044", "satellite": "SAT-006", "duration_s": 1415.7, "power_w": 334.8}, {"job_id": "JOB-0043", "satellite": "SAT-000", "duration_s": 2008.0, "power_w": 462.9}, {"job_id": "JOB-0012", "satellite": "SAT-009", "duration_s": 451.2, "power_w": 622.7}, {"job_id": "JOB-0049", "satellite": "SAT-001", "duration_s": 1860.8, "power_w": 345.8}, {"job_id": "JOB-0041", "satellite": "SAT-004", "duration_s": 2792.4, "power_w": 757.3}, {"job_id": "JOB-0022", "satellite": "SAT-006", "duration_s": 760.8, "power_w": 285.7}, {"job_id": "JOB-0018", "satellite": "SAT-008", "duration_s": 3081.4, "power_w": 610.8}, {"job_id": "JOB-0036", "satellite": "SAT-011", "duration_s": 3044.5, "power_w": 727.2}, {"job_id": "JOB-0032", "satellite": "SAT-009", "duration_s": 651.2, "power_w": 504.6}, {"job_id": "JOB-0010", "satellite": "SAT-010", "duration_s": 1549.2, "power_w": 783.9}, {"job_id": "JOB-0040", "satellite": "SAT-007", "duration_s": 3179.0, "power_w": 359.0}, {"job_id": "JOB-0059", "satellite": "SAT-001", "duration_s": 307.1, "power_w": 298.8}, {"job_id": "JOB-0052", "satellite": "SAT-002", "duration_s": 2703.1, "power_w": 236.4}, {"job_id": "JOB-0008", "satellite": "SAT-005", "duration_s": 3096.7, "power_w": 258.0}, {"job_id": "JOB-0070", "satellite": "SAT-004", "duration_s": 1606.1, "power_w": 343.2}, {"job_id": "JOB-0027", "satellite": "SAT-000", "duration_s": 2266.4, "power_w": 430.9}, {"job_id": "JOB-0069", "satellite": "SAT-002", "duration_s": 974.1, "power_w": 760.8}, {"job_id": "JOB-0042", "satellite": "SAT-007", "duration_s": 1616.7, "power_w": 627.8}, {"job_id": "JOB-0035", "satellite": "SAT-010", "duration_s": 1912.4, "power_w": 559.4}, {"job_id": "JOB-0068", "satellite": "SAT-001", "duration_s": 1683.4, "power_w": 571.6}, {"job_id": "JOB-0019", "satellite": "SAT-003", "duration_s": 2956.7, "power_w": 693.1}, {"job_id": "JOB-0029", "satellite": "SAT-009", "duration_s": 2072.0, "power_w": 609.0}, {"job_id": "JOB-0007", "satellite": "SAT-004", "duration_s": 1410.8, "power_w": 774.3}, {"job_id": "JOB-0075", "satellite": "SAT-008", "duration_s": 3051.4, "power_w": 294.6}, {"job_id": "JOB-0074", "satellite": "SAT-006", "duration_s": 3201.6, "power_w": 728.5}, {"job_id": "JOB-0020", "satellite": "SAT-011", "duration_s": 3313.3, "power_w": 239.7}, {"job_id": "JOB-0073", "satellite": "SAT-005", "duration_s": 1969.4, "power_w": 522.6}, {"job_id": "JOB-0023", "satellite": "SAT-002", "duration_s": 1713.8, "power_w": 648.2}, {"job_id": "JOB-0063", "satellite": "SAT-002", "duration_s": 488.6, "power_w": 648.8}, {"job_id": "JOB-0053", "satellite": "SAT-010", "duration_s": 2069.7, "power_w": 315.0}, {"job_id": "JOB-0050", "satellite": "SAT-007", "duration_s": 2474.6, "power_w": 256.6}, {"job_id": "JOB-0066", "satellite": "SAT-009", "duration_s": 2528.2, "power_w": 557.0}, {"job_id": "JOB-0013", "satellite": "SAT-000", "duration_s": 3122.5, "power_w": 791.1}, {"job_id": "JOB-0021", "satellite": "SAT-004", "duration_s": 1947.5, "power_w": 327.6}, {"job_id": "JOB-0060", "satellite": "SAT-003", "duration_s": 2890.9, "power_w": 755.9}, {"job_id": "JOB-0057", "satellite": "SAT-001", "duration_s": 3100.7, "power_w": 755.8}, {"job_id": "JOB-0054", "satellite": "SAT-011", "duration_s": 1826.7, "power_w": 310.1}, {"job_id": "JOB-0048", "satellite": "SAT-006", "duration_s": 2687.1, "power_w": 523.5}, {"job_id": "JOB-0061", "satellite": "SAT-005", "duration_s": 2710.7, "power_w": 618.0}, {"job_id": "JOB-0024", "satellite": "SAT-008", "duration_s": 3591.2, "power_w": 417.2}], "preemption_events": 0, "telemetry": {"SAT-000": {"eclipse_windows": [{"start_min": 34.0, "duration_min": 35.0}, {"start_min": 129.0, "duration_min": 35.0}, {"start_min": 224.0, "duration_min": 35.0}, {"start_min": 319.0, "duration_min": 35.0}, {"start_min": 419.0, "duration_min": 35.0}, {"start_min": 514.0, "duration_min": 35.0}, {"start_min": 609.0, "duration_min": 35.0}, {"start_min": 704.0, "duration_min": 16.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 230.0}], "contact_windows": [{"start_min": 27.0, "duration_min": 6.0, "station": "Wallops"}, {"start_min": 61.0, "duration_min": 1.0, "station": "Hartebeest"}, {"start_min": 116.0, "duration_min": 3.0, "station": "Fairbanks"}, {"start_min": 126.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 213.0, "duration_min": 5.0, "station": "Fairbanks"}, {"start_min": 227.0, "duration_min": 4.0, "station": "Wallops"}, {"start_min": 284.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 312.0, "duration_min": 4.0, "station": "Fairbanks"}, {"start_min": 341.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 382.0, "duration_min": 7.0, "station": "Bangalore"}, {"start_min": 441.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 465.0, "duration_min": 7.0, "station": "Hartebeest"}, {"start_min": 482.0, "duration_min": 6.0, "station": "Bangalore"}, {"start_min": 565.0, "duration_min": 6.0, "station": "Hartebeest"}]}, "SAT-001": {"eclipse_windows": [{"start_min": 4.0, "duration_min": 5.0}, {"start_min": 69.0, "duration_min": 35.0}, {"start_min": 164.0, "duration_min": 35.0}, {"start_min": 259.0, "duration_min": 35.0}, {"start_min": 354.0, "duration_min": 35.0}, {"start_min": 454.0, "duration_min": 35.0}, {"start_min": 549.0, "duration_min": 35.0}, {"start_min": 644.0, "duration_min": 35.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 235.0}], "contact_windows": [{"start_min": 21.0, "duration_min": 7.0, "station": "Canberra"}, {"start_min": 65.0, "duration_min": 1.0, "station": "Wallops"}, {"start_min": 93.0, "duration_min": 9.0, "station": "Hartebeest"}, {"start_min": 121.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 163.0, "duration_min": 6.0, "station": "Wallops"}, {"start_min": 251.0, "duration_min": 4.0, "station": "Fairbanks"}, {"start_min": 262.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 349.0, "duration_min": 5.0, "station": "Fairbanks"}, {"start_min": 420.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 449.0, "duration_min": 2.0, "station": "Fairbanks"}, {"start_min": 477.0, "duration_min": 9.0, "station": "Santiago"}, {"start_min": 518.0, "duration_min": 8.0, "station": "Bangalore"}, {"start_min": 578.0, "duration_min": 6.0, "station": "Santiago"}, {"start_min": 601.0, "duration_min": 8.0, "station": "Hartebeest"}, {"start_min": 620.0, "duration_min": 3.0, "station": "Bangalore"}, {"start_min": 703.0, "duration_min": 1.0, "station": "Hartebeest"}]}, "SAT-002": {"eclipse_windows": [{"start_min": 9.0, "duration_min": 30.0}, {"start_min": 104.0, "duration_min": 30.0}, {"start_min": 199.0, "duration_min": 30.0}, {"start_min": 294.0, "duration_min": 35.0}, {"start_min": 389.0, "duration_min": 35.0}, {"start_min": 489.0, "duration_min": 30.0}, {"start_min": 584.0, "duration_min": 30.0}, {"start_min": 679.0, "duration_min": 30.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 215.0}], "contact_windows": [{"start_min": 0.0, "duration_min": 4.0, "station": "Wallops"}, {"start_min": 99.0, "duration_min": 3.0, "station": "Wallops"}, {"start_min": 132.0, "duration_min": 5.0, "station": "Hartebeest"}, {"start_min": 157.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 201.0, "duration_min": 2.0, "station": "Wallops"}, {"start_min": 230.0, "duration_min": 8.0, "station": "Hartebeest"}, {"start_min": 257.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 299.0, "duration_min": 7.0, "station": "Wallops"}, {"start_min": 387.0, "duration_min": 4.0, "station": "Fairbanks"}, {"start_min": 398.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 459.0, "duration_min": 4.0, "station": "Singapore"}, {"start_min": 485.0, "duration_min": 5.0, "station": "Fairbanks"}, {"start_min": 556.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 613.0, "duration_min": 9.0, "station": "Santiago"}, {"start_min": 640.0, "duration_min": 2.0, "station": "Hartebeest"}, {"start_min": 654.0, "duration_min": 8.0, "station": "Bangalore"}, {"start_min": 715.0, "duration_min": 5.0, "station": "Santiago"}]}, "SAT-003": {"eclipse_windows": [{"start_min": 39.0, "duration_min": 25.0}, {"start_min": 134.0, "duration_min": 25.0}, {"start_min": 234.0, "duration_min": 25.0}, {"start_min": 329.0, "duration_min": 25.0}, {"start_min": 424.0, "duration_min": 25.0}, {"start_min": 519.0, "duration_min": 25.0}, {"start_min": 614.0, "duration_min": 25.0}, {"start_min": 709.0, "duration_min": 11.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 235.0}], "contact_windows": [{"start_min": 33.0, "duration_min": 7.0, "station": "Wallops"}, {"start_min": 70.0, "duration_min": 1.0, "station": "Bangalore"}, {"start_min": 133.0, "duration_min": 7.0, "station": "Wallops"}, {"start_min": 196.0, "duration_min": 2.0, "station": "Canberra"}, {"start_min": 236.0, "duration_min": 2.0, "station": "Wallops"}, {"start_min": 267.0, "duration_min": 7.0, "station": "Hartebeest"}, {"start_min": 293.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 337.0, "duration_min": 3.0, "station": "Wallops"}, {"start_min": 367.0, "duration_min": 7.0, "station": "Hartebeest"}, {"start_min": 393.0, "duration_min": 7.0, "station": "Canberra"}, {"start_min": 435.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 523.0, "duration_min": 5.0, "station": "Fairbanks"}, {"start_min": 535.0, "duration_min": 7.0, "station": "Wallops"}, {"start_min": 594.0, "duration_min": 6.0, "station": "Singapore"}, {"start_min": 621.0, "duration_min": 5.0, "station": "Fairbanks"}, {"start_min": 652.0, "duration_min": 5.0, "station": "Santiago"}, {"start_min": 693.0, "duration_min": 6.0, "station": "Singapore"}]}, "SAT-004": {"eclipse_windows": [{"start_min": 64.0, "duration_min": 30.0}, {"start_min": 159.0, "duration_min": 30.0}, {"start_min": 259.0, "duration_min": 25.0}, {"start_min": 354.0, "duration_min": 25.0}, {"start_min": 449.0, "duration_min": 30.0}, {"start_min": 544.0, "duration_min": 30.0}, {"start_min": 639.0, "duration_min": 30.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 230.0}], "contact_windows": [{"start_min": 11.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 26.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 88.0, "duration_min": 3.0, "station": "Tromso"}, {"start_min": 103.0, "duration_min": 9.0, "station": "Bangalore"}, {"start_min": 112.0, "duration_min": 4.0, "station": "Singapore"}, {"start_min": 129.0, "duration_min": 3.0, "station": "Canberra"}, {"start_min": 169.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 269.0, "duration_min": 7.0, "station": "Wallops"}, {"start_min": 331.0, "duration_min": 4.0, "station": "Canberra"}, {"start_min": 373.0, "duration_min": 1.0, "station": "Wallops"}, {"start_min": 403.0, "duration_min": 8.0, "station": "Hartebeest"}, {"start_min": 429.0, "duration_min": 9.0, "station": "Canberra"}, {"start_min": 473.0, "duration_min": 4.0, "station": "Wallops"}, {"start_min": 504.0, "duration_min": 5.0, "station": "Hartebeest"}, {"start_min": 530.0, "duration_min": 5.0, "station": "Canberra"}, {"start_min": 562.0, "duration_min": 1.0, "station": "Fairbanks"}, {"start_min": 571.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 659.0, "duration_min": 5.0, "station": "Fairbanks"}, {"start_min": 671.0, "duration_min": 7.0, "station": "Wallops"}]}, "SAT-005": {"eclipse_windows": [{"start_min": 4.0, "duration_min": 30.0}, {"start_min": 94.0, "duration_min": 35.0}, {"start_min": 189.0, "duration_min": 35.0}, {"start_min": 284.0, "duration_min": 35.0}, {"start_min": 384.0, "duration_min": 30.0}, {"start_min": 479.0, "duration_min": 30.0}, {"start_min": 574.0, "duration_min": 35.0}, {"start_min": 669.0, "duration_min": 35.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 250.0}], "contact_windows": [{"start_min": 63.0, "duration_min": 7.0, "station": "Canberra"}, {"start_min": 92.0, "duration_min": 6.0, "station": "Santiago"}, {"start_min": 125.0, "duration_min": 5.0, "station": "Tromso"}, {"start_min": 147.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 162.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 209.0, "duration_min": 2.0, "station": "Wallops"}, {"start_min": 224.0, "duration_min": 3.0, "station": "Tromso"}, {"start_min": 239.0, "duration_min": 9.0, "station": "Bangalore"}, {"start_min": 305.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 406.0, "duration_min": 6.0, "station": "Wallops"}, {"start_min": 467.0, "duration_min": 5.0, "station": "Canberra"}, {"start_min": 539.0, "duration_min": 8.0, "station": "Hartebeest"}, {"start_min": 566.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 609.0, "duration_min": 5.0, "station": "Wallops"}, {"start_min": 641.0, "duration_min": 4.0, "station": "Hartebeest"}, {"start_min": 668.0, "duration_min": 1.0, "station": "Canberra"}, {"start_min": 697.0, "duration_min": 3.0, "station": "Fairbanks"}, {"start_min": 707.0, "duration_min": 8.0, "station": "Wallops"}]}, "SAT-006": {"eclipse_windows": [{"start_min": 34.0, "duration_min": 35.0}, {"start_min": 129.0, "duration_min": 35.0}, {"start_min": 224.0, "duration_min": 35.0}, {"start_min": 319.0, "duration_min": 35.0}, {"start_min": 414.0, "duration_min": 35.0}, {"start_min": 509.0, "duration_min": 40.0}, {"start_min": 609.0, "duration_min": 35.0}, {"start_min": 704.0, "duration_min": 16.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 245.0}], "contact_windows": [{"start_min": 30.0, "duration_min": 3.0, "station": "Santiago"}, {"start_min": 128.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 165.0, "duration_min": 1.0, "station": "Tromso"}, {"start_min": 199.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 229.0, "duration_min": 4.0, "station": "Santiago"}, {"start_min": 261.0, "duration_min": 5.0, "station": "Tromso"}, {"start_min": 278.0, "duration_min": 4.0, "station": "Bangalore"}, {"start_min": 283.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 299.0, "duration_min": 7.0, "station": "Canberra"}, {"start_min": 343.0, "duration_min": 5.0, "station": "Wallops"}, {"start_min": 360.0, "duration_min": 2.0, "station": "Tromso"}, {"start_min": 376.0, "duration_min": 8.0, "station": "Bangalore"}, {"start_min": 441.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 543.0, "duration_min": 5.0, "station": "Wallops"}, {"start_min": 603.0, "duration_min": 6.0, "station": "Canberra"}, {"start_min": 675.0, "duration_min": 8.0, "station": "Hartebeest"}, {"start_min": 702.0, "duration_min": 8.0, "station": "Canberra"}]}, "SAT-007": {"eclipse_windows": [{"start_min": 4.0, "duration_min": 5.0}, {"start_min": 69.0, "duration_min": 35.0}, {"start_min": 164.0, "duration_min": 35.0}, {"start_min": 259.0, "duration_min": 35.0}, {"start_min": 354.0, "duration_min": 35.0}, {"start_min": 449.0, "duration_min": 35.0}, {"start_min": 549.0, "duration_min": 35.0}, {"start_min": 644.0, "duration_min": 35.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 220.0}], "contact_windows": [{"start_min": 165.0, "duration_min": 5.0, "station": "Santiago"}, {"start_min": 264.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 300.0, "duration_min": 3.0, "station": "Tromso"}, {"start_min": 335.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 397.0, "duration_min": 5.0, "station": "Tromso"}, {"start_min": 413.0, "duration_min": 7.0, "station": "Bangalore"}, {"start_min": 419.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 436.0, "duration_min": 6.0, "station": "Canberra"}, {"start_min": 478.0, "duration_min": 7.0, "station": "Wallops"}, {"start_min": 513.0, "duration_min": 6.0, "station": "Bangalore"}, {"start_min": 577.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 680.0, "duration_min": 4.0, "station": "Wallops"}, {"start_min": 714.0, "duration_min": 4.0, "station": "Hartebeest"}]}, "SAT-008": {"eclipse_windows": [{"start_min": 9.0, "duration_min": 30.0}, {"start_min": 104.0, "duration_min": 30.0}, {"start_min": 199.0, "duration_min": 30.0}, {"start_min": 294.0, "duration_min": 30.0}, {"start_min": 389.0, "duration_min": 35.0}, {"start_min": 484.0, "duration_min": 35.0}, {"start_min": 579.0, "duration_min": 35.0}, {"start_min": 679.0, "duration_min": 30.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 260.0}], "contact_windows": [{"start_min": 0.0, "duration_min": 3.0, "station": "Santiago"}, {"start_min": 19.0, "duration_min": 9.0, "station": "Hartebeest"}, {"start_min": 301.0, "duration_min": 6.0, "station": "Santiago"}, {"start_min": 400.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 435.0, "duration_min": 4.0, "station": "Tromso"}, {"start_min": 457.0, "duration_min": 6.0, "station": "Singapore"}, {"start_min": 471.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 533.0, "duration_min": 4.0, "station": "Tromso"}, {"start_min": 549.0, "duration_min": 7.0, "station": "Bangalore"}, {"start_min": 556.0, "duration_min": 7.0, "station": "Singapore"}, {"start_min": 573.0, "duration_min": 5.0, "station": "Canberra"}, {"start_min": 614.0, "duration_min": 8.0, "station": "Wallops"}, {"start_min": 650.0, "duration_min": 4.0, "station": "Bangalore"}, {"start_min": 714.0, "duration_min": 7.0, "station": "Wallops"}]}, "SAT-009": {"eclipse_windows": [{"start_min": 39.0, "duration_min": 25.0}, {"start_min": 134.0, "duration_min": 30.0}, {"start_min": 229.0, "duration_min": 30.0}, {"start_min": 324.0, "duration_min": 30.0}, {"start_min": 424.0, "duration_min": 25.0}, {"start_min": 519.0, "duration_min": 25.0}, {"start_min": 614.0, "duration_min": 25.0}, {"start_min": 709.0, "duration_min": 11.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 225.0}], "contact_windows": [{"start_min": 32.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 58.0, "duration_min": 4.0, "station": "Hartebeest"}, {"start_min": 72.0, "duration_min": 9.0, "station": "Bangalore"}, {"start_min": 134.0, "duration_min": 4.0, "station": "Santiago"}, {"start_min": 155.0, "duration_min": 9.0, "station": "Hartebeest"}, {"start_min": 437.0, "duration_min": 7.0, "station": "Santiago"}, {"start_min": 510.0, "duration_min": 5.0, "station": "Canberra"}, {"start_min": 536.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 571.0, "duration_min": 4.0, "station": "Tromso"}, {"start_min": 593.0, "duration_min": 7.0, "station": "Singapore"}, {"start_min": 607.0, "duration_min": 8.0, "station": "Canberra"}, {"start_min": 669.0, "duration_min": 4.0, "station": "Tromso"}, {"start_min": 685.0, "duration_min": 8.0, "station": "Bangalore"}, {"start_min": 693.0, "duration_min": 5.0, "station": "Singapore"}, {"start_min": 710.0, "duration_min": 4.0, "station": "Canberra"}]}, "SAT-010": {"eclipse_windows": [{"start_min": 64.0, "duration_min": 30.0}, {"start_min": 159.0, "duration_min": 30.0}, {"start_min": 259.0, "duration_min": 30.0}, {"start_min": 354.0, "duration_min": 30.0}, {"start_min": 449.0, "duration_min": 30.0}, {"start_min": 544.0, "duration_min": 30.0}, {"start_min": 639.0, "duration_min": 30.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 215.0}], "contact_windows": [{"start_min": 12.0, "duration_min": 7.0, "station": "Singapore"}, {"start_min": 40.0, "duration_min": 4.0, "station": "Fairbanks"}, {"start_min": 70.0, "duration_min": 6.0, "station": "Santiago"}, {"start_min": 112.0, "duration_min": 5.0, "station": "Singapore"}, {"start_min": 168.0, "duration_min": 9.0, "station": "Santiago"}, {"start_min": 193.0, "duration_min": 6.0, "station": "Hartebeest"}, {"start_min": 209.0, "duration_min": 8.0, "station": "Bangalore"}, {"start_min": 272.0, "duration_min": 1.0, "station": "Santiago"}, {"start_min": 292.0, "duration_min": 8.0, "station": "Hartebeest"}, {"start_min": 573.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 645.0, "duration_min": 6.0, "station": "Canberra"}, {"start_min": 673.0, "duration_min": 7.0, "station": "Santiago"}, {"start_min": 707.0, "duration_min": 4.0, "station": "Tromso"}]}, "SAT-011": {"eclipse_windows": [{"start_min": 4.0, "duration_min": 30.0}, {"start_min": 94.0, "duration_min": 35.0}, {"start_min": 189.0, "duration_min": 35.0}, {"start_min": 289.0, "duration_min": 30.0}, {"start_min": 384.0, "duration_min": 35.0}, {"start_min": 479.0, "duration_min": 35.0}, {"start_min": 574.0, "duration_min": 35.0}, {"start_min": 669.0, "duration_min": 35.0}], "compute_windows": [{"start_min": 4.0, "duration_min": 235.0}], "contact_windows": [{"start_min": 77.0, "duration_min": 5.0, "station": "Fairbanks"}, {"start_min": 90.0, "duration_min": 6.0, "station": "Wallops"}, {"start_min": 148.0, "duration_min": 8.0, "station": "Singapore"}, {"start_min": 176.0, "duration_min": 4.0, "station": "Fairbanks"}, {"start_min": 206.0, "duration_min": 7.0, "station": "Santiago"}, {"start_min": 247.0, "duration_min": 5.0, "station": "Bangalore"}, {"start_min": 305.0, "duration_min": 8.0, "station": "Santiago"}, {"start_min": 329.0, "duration_min": 7.0, "station": "Hartebeest"}, {"start_min": 345.0, "duration_min": 8.0, "station": "Bangalore"}, {"start_min": 428.0, "duration_min": 7.0, "station": "Hartebeest"}, {"start_min": 612.0, "duration_min": 1.0, "station": "Santiago"}, {"start_min": 709.0, "duration_min": 8.0, "station": "Santiago"}]}}, "ground_contacts": [{"satellite": "SAT-002", "station": "Wallops", "start_time": "00:00", "duration_min": 4.0, "max_elev": 35.7}, {"satellite": "SAT-008", "station": "Santiago", "start_time": "00:00", "duration_min": 3.0, "max_elev": 16.4}, {"satellite": "SAT-004", "station": "Singapore", "start_time": "00:11", "duration_min": 8.0, "max_elev": 33.2}, {"satellite": "SAT-010", "station": "Singapore", "start_time": "00:12", "duration_min": 7.0, "max_elev": 27.2}, {"satellite": "SAT-008", "station": "Hartebeest", "start_time": "00:19", "duration_min": 9.0, "max_elev": 75.7}, {"satellite": "SAT-001", "station": "Canberra", "start_time": "00:21", "duration_min": 7.0, "max_elev": 23.0}, {"satellite": "SAT-004", "station": "Canberra", "start_time": "00:26", "duration_min": 8.0, "max_elev": 46.2}, {"satellite": "SAT-000", "station": "Wallops", "start_time": "00:27", "duration_min": 6.0, "max_elev": 16.7}, {"satellite": "SAT-006", "station": "Santiago", "start_time": "00:30", "duration_min": 3.0, "max_elev": 11.6}, {"satellite": "SAT-009", "station": "Santiago", "start_time": "00:32", "duration_min": 8.0, "max_elev": 70.4}, {"satellite": "SAT-003", "station": "Wallops", "start_time": "00:33", "duration_min": 7.0, "max_elev": 42.6}, {"satellite": "SAT-010", "station": "Fairbanks", "start_time": "00:40", "duration_min": 4.0, "max_elev": 14.0}, {"satellite": "SAT-009", "station": "Hartebeest", "start_time": "00:58", "duration_min": 4.0, "max_elev": 12.7}, {"satellite": "SAT-000", "station": "Hartebeest", "start_time": "01:01", "duration_min": 1.0, "max_elev": 10.3}, {"satellite": "SAT-005", "station": "Canberra", "start_time": "01:03", "duration_min": 7.0, "max_elev": 28.1}, {"satellite": "SAT-001", "station": "Wallops", "start_time": "01:05", "duration_min": 1.0, "max_elev": 10.1}, {"satellite": "SAT-003", "station": "Bangalore", "start_time": "01:10", "duration_min": 1.0, "max_elev": 10.6}, {"satellite": "SAT-010", "station": "Santiago", "start_time": "01:10", "duration_min": 6.0, "max_elev": 16.9}, {"satellite": "SAT-009", "station": "Bangalore", "start_time": "01:12", "duration_min": 9.0, "max_elev": 82.8}, {"satellite": "SAT-011", "station": "Fairbanks", "start_time": "01:17", "duration_min": 5.0, "max_elev": 15.6}, {"satellite": "SAT-004", "station": "Tromso", "start_time": "01:28", "duration_min": 3.0, "max_elev": 6.7}, {"satellite": "SAT-011", "station": "Wallops", "start_time": "01:30", "duration_min": 6.0, "max_elev": 20.8}, {"satellite": "SAT-005", "station": "Santiago", "start_time": "01:32", "duration_min": 6.0, "max_elev": 20.0}, {"satellite": "SAT-001", "station": "Hartebeest", "start_time": "01:33", "duration_min": 9.0, "max_elev": 57.9}, {"satellite": "SAT-002", "station": "Wallops", "start_time": "01:39", "duration_min": 3.0, "max_elev": 12.6}, {"satellite": "SAT-004", "station": "Bangalore", "start_time": "01:43", "duration_min": 9.0, "max_elev": 73.0}, {"satellite": "SAT-004", "station": "Singapore", "start_time": "01:52", "duration_min": 4.0, "max_elev": 12.5}, {"satellite": "SAT-010", "station": "Singapore", "start_time": "01:52", "duration_min": 5.0, "max_elev": 15.3}, {"satellite": "SAT-000", "station": "Fairbanks", "start_time": "01:56", "duration_min": 3.0, "max_elev": 12.2}, {"satellite": "SAT-001", "station": "Canberra", "start_time": "02:01", "duration_min": 8.0, "max_elev": 51.5}, {"satellite": "SAT-005", "station": "Tromso", "start_time": "02:05", "duration_min": 5.0, "max_elev": 7.4}, {"satellite": "SAT-000", "station": "Wallops", "start_time": "02:06", "duration_min": 8.0, "max_elev": 63.8}, {"satellite": "SAT-006", "station": "Santiago", "start_time": "02:08", "duration_min": 8.0, "max_elev": 59.4}, {"satellite": "SAT-004", "station": "Canberra", "start_time": "02:09", "duration_min": 3.0, "max_elev": 11.9}, {"satellite": "SAT-002", "station": "Hartebeest", "start_time": "02:12", "duration_min": 5.0, "max_elev": 17.1}, {"satellite": "SAT-003", "station": "Wallops", "start_time": "02:13", "duration_min": 7.0, "max_elev": 28.6}, {"satellite": "SAT-009", "station": "Santiago", "start_time": "02:14", "duration_min": 4.0, "max_elev": 12.9}, {"satellite": "SAT-005", "station": "Singapore", "start_time": "02:27", "duration_min": 8.0, "max_elev": 54.9}, {"satellite": "SAT-011", "station": "Singapore", "start_time": "02:28", "duration_min": 8.0, "max_elev": 45.9}, {"satellite": "SAT-009", "station": "Hartebeest", "start_time": "02:35", "duration_min": 9.0, "max_elev": 66.4}, {"satellite": "SAT-002", "station": "Canberra", "start_time": "02:37", "duration_min": 8.0, "max_elev": 29.6}, {"satellite": "SAT-005", "station": "Canberra", "start_time": "02:42", "duration_min": 8.0, "max_elev": 34.7}, {"satellite": "SAT-001", "station": "Wallops", "start_time": "02:43", "duration_min": 6.0, "max_elev": 20.1}, {"satellite": "SAT-006", "station": "Tromso", "start_time": "02:45", "duration_min": 1.0, "max_elev": 5.3}, {"satellite": "SAT-007", "station": "Santiago", "start_time": "02:45", "duration_min": 5.0, "max_elev": 14.7}, {"satellite": "SAT-010", "station": "Santiago", "start_time": "02:48", "duration_min": 9.0, "max_elev": 49.3}, {"satellite": "SAT-004", "station": "Wallops", "start_time": "02:49", "duration_min": 8.0, "max_elev": 63.1}, {"satellite": "SAT-011", "station": "Fairbanks", "start_time": "02:56", "duration_min": 4.0, "max_elev": 13.1}, {"satellite": "SAT-010", "station": "Hartebeest", "start_time": "03:13", "duration_min": 6.0, "max_elev": 17.8}, {"satellite": "SAT-003", "station": "Canberra", "start_time": "03:16", "duration_min": 2.0, "max_elev": 10.8}, {"satellite": "SAT-006", "station": "Canberra", "start_time": "03:19", "duration_min": 8.0, "max_elev": 41.1}, {"satellite": "SAT-002", "station": "Wallops", "start_time": "03:21", "duration_min": 2.0, "max_elev": 10.7}, {"satellite": "SAT-011", "station": "Santiago", "start_time": "03:26", "duration_min": 7.0, "max_elev": 25.2}, {"satellite": "SAT-005", "station": "Wallops", "start_time": "03:29", "duration_min": 2.0, "max_elev": 11.0}, {"satellite": "SAT-010", "station": "Bangalore", "start_time": "03:29", "duration_min": 8.0, "max_elev": 49.2}, {"satellite": "SAT-000", "station": "Fairbanks", "start_time": "03:33", "duration_min": 5.0, "max_elev": 15.8}, {"satellite": "SAT-005", "station": "Tromso", "start_time": "03:44", "duration_min": 3.0, "max_elev": 6.2}, {"satellite": "SAT-000", "station": "Wallops", "start_time": "03:47", "duration_min": 4.0, "max_elev": 14.3}, {"satellite": "SAT-006", "station": "Santiago", "start_time": "03:49", "duration_min": 4.0, "max_elev": 13.3}, {"satellite": "SAT-002", "station": "Hartebeest", "start_time": "03:50", "duration_min": 8.0, "max_elev": 36.6}, {"satellite": "SAT-003", "station": "Wallops", "start_time": "03:56", "duration_min": 2.0, "max_elev": 11.1}, {"satellite": "SAT-005", "station": "Bangalore", "start_time": "03:59", "duration_min": 9.0, "max_elev": 64.9}, {"satellite": "SAT-011", "station": "Bangalore", "start_time": "04:07", "duration_min": 5.0, "max_elev": 15.0}, {"satellite": "SAT-001", "station": "Fairbanks", "start_time": "04:11", "duration_min": 4.0, "max_elev": 13.3}, {"satellite": "SAT-002", "station": "Canberra", "start_time": "04:17", "duration_min": 8.0, "max_elev": 34.1}, {"satellite": "SAT-006", "station": "Tromso", "start_time": "04:21", "duration_min": 5.0, "max_elev": 7.5}, {"satellite": "SAT-001", "station": "Wallops", "start_time": "04:22", "duration_min": 8.0, "max_elev": 75.4}, {"satellite": "SAT-007", "station": "Santiago", "start_time": "04:24", "duration_min": 8.0, "max_elev": 69.3}, {"satellite": "SAT-003", "station": "Hartebeest", "start_time": "04:27", "duration_min": 7.0, "max_elev": 26.5}, {"satellite": "SAT-004", "station": "Wallops", "start_time": "04:29", "duration_min": 7.0, "max_elev": 23.0}, {"satellite": "SAT-010", "station": "Santiago", "start_time": "04:32", "duration_min": 1.0, "max_elev": 10.0}, {"satellite": "SAT-006", "station": "Bangalore", "start_time": "04:38", "duration_min": 4.0, "max_elev": 13.0}, {"satellite": "SAT-006", "station": "Singapore", "start_time": "04:43", "duration_min": 8.0, "max_elev": 68.7}, {"satellite": "SAT-000", "station": "Singapore", "start_time": "04:44", "duration_min": 8.0, "max_elev": 76.8}, {"satellite": "SAT-010", "station": "Hartebeest", "start_time": "04:52", "duration_min": 8.0, "max_elev": 40.4}, {"satellite": "SAT-003", "station": "Canberra", "start_time": "04:53", "duration_min": 8.0, "max_elev": 40.9}, {"satellite": "SAT-002", "station": "Wallops", "start_time": "04:59", "duration_min": 7.0, "max_elev": 25.0}, {"satellite": "SAT-006", "station": "Canberra", "start_time": "04:59", "duration_min": 7.0, "max_elev": 26.4}, {"satellite": "SAT-007", "station": "Tromso", "start_time": "05:00", "duration_min": 3.0, "max_elev": 5.9}, {"satellite": "SAT-008", "station": "Santiago", "start_time": "05:01", "duration_min": 6.0, "max_elev": 19.1}, {"satellite": "SAT-005", "station": "Wallops", "start_time": "05:05", "duration_min": 8.0, "max_elev": 77.5}, {"satellite": "SAT-011", "station": "Santiago", "start_time": "05:05", "duration_min": 8.0, "max_elev": 34.3}, {"satellite": "SAT-000", "station": "Fairbanks", "start_time": "05:12", "duration_min": 4.0, "max_elev": 11.9}, {"satellite": "SAT-011", "station": "Hartebeest", "start_time": "05:29", "duration_min": 7.0, "max_elev": 25.6}, {"satellite": "SAT-004", "station": "Canberra", "start_time": "05:31", "duration_min": 4.0, "max_elev": 13.0}, {"satellite": "SAT-007", "station": "Canberra", "start_time": "05:35", "duration_min": 8.0, "max_elev": 58.5}, {"satellite": "SAT-003", "station": "Wallops", "start_time": "05:37", "duration_min": 3.0, "max_elev": 11.6}, {"satellite": "SAT-000", "station": "Santiago", "start_time": "05:41", "duration_min": 8.0, "max_elev": 37.9}, {"satellite": "SAT-006", "station": "Wallops", "start_time": "05:43", "duration_min": 5.0, "max_elev": 16.5}, {"satellite": "SAT-011", "station": "Bangalore", "start_time": "05:45", "duration_min": 8.0, "max_elev": 29.5}, {"satellite": "SAT-001", "station": "Fairbanks", "start_time": "05:49", "duration_min": 5.0, "max_elev": 15.6}, {"satellite": "SAT-006", "station": "Tromso", "start_time": "06:00", "duration_min": 2.0, "max_elev": 5.5}, {"satellite": "SAT-003", "station": "Hartebeest", "start_time": "06:07", "duration_min": 7.0, "max_elev": 24.8}, {"satellite": "SAT-004", "station": "Wallops", "start_time": "06:13", "duration_min": 1.0, "max_elev": 10.4}, {"satellite": "SAT-006", "station": "Bangalore", "start_time": "06:16", "duration_min": 8.0, "max_elev": 37.2}, {"satellite": "SAT-000", "station": "Bangalore", "start_time": "06:22", "duration_min": 7.0, "max_elev": 24.2}, {"satellite": "SAT-002", "station": "Fairbanks", "start_time": "06:27", "duration_min": 4.0, "max_elev": 14.2}, {"satellite": "SAT-003", "station": "Canberra", "start_time": "06:33", "duration_min": 7.0, "max_elev": 23.1}, {"satellite": "SAT-007", "station": "Tromso", "start_time": "06:37", "duration_min": 5.0, "max_elev": 7.4}, {"satellite": "SAT-002", "station": "Wallops", "start_time": "06:38", "duration_min": 8.0, "max_elev": 54.6}, {"satellite": "SAT-008", "station": "Santiago", "start_time": "06:40", "duration_min": 8.0, "max_elev": 55.7}, {"satellite": "SAT-004", "station": "Hartebeest", "start_time": "06:43", "duration_min": 8.0, "max_elev": 41.6}, {"satellite": "SAT-005", "station": "Wallops", "start_time": "06:46", "duration_min": 6.0, "max_elev": 18.6}, {"satellite": "SAT-007", "station": "Bangalore", "start_time": "06:53", "duration_min": 7.0, "max_elev": 20.6}, {"satellite": "SAT-007", "station": "Singapore", "start_time": "06:59", "duration_min": 8.0, "max_elev": 44.2}, {"satellite": "SAT-001", "station": "Singapore", "start_time": "07:00", "duration_min": 8.0, "max_elev": 54.2}, {"satellite": "SAT-011", "station": "Hartebeest", "start_time": "07:08", "duration_min": 7.0, "max_elev": 25.6}, {"satellite": "SAT-004", "station": "Canberra", "start_time": "07:09", "duration_min": 9.0, "max_elev": 58.4}, {"satellite": "SAT-003", "station": "Wallops", "start_time": "07:15", "duration_min": 8.0, "max_elev": 31.3}, {"satellite": "SAT-008", "station": "Tromso", "start_time": "07:15", "duration_min": 4.0, "max_elev": 6.4}, {"satellite": "SAT-007", "station": "Canberra", "start_time": "07:16", "duration_min": 6.0, "max_elev": 20.3}, {"satellite": "SAT-009", "station": "Santiago", "start_time": "07:17", "duration_min": 7.0, "max_elev": 25.4}, {"satellite": "SAT-000", "station": "Santiago", "start_time": "07:21", "duration_min": 8.0, "max_elev": 24.7}, {"satellite": "SAT-006", "station": "Wallops", "start_time": "07:21", "duration_min": 8.0, "max_elev": 57.0}, {"satellite": "SAT-001", "station": "Fairbanks", "start_time": "07:29", "duration_min": 2.0, "max_elev": 10.6}, {"satellite": "SAT-008", "station": "Singapore", "start_time": "07:37", "duration_min": 6.0, "max_elev": 15.6}, {"satellite": "SAT-002", "station": "Singapore", "start_time": "07:39", "duration_min": 4.0, "max_elev": 12.8}, {"satellite": "SAT-000", "station": "Hartebeest", "start_time": "07:45", "duration_min": 7.0, "max_elev": 38.1}, {"satellite": "SAT-005", "station": "Canberra", "start_time": "07:47", "duration_min": 5.0, "max_elev": 16.1}, {"satellite": "SAT-008", "station": "Canberra", "start_time": "07:51", "duration_min": 8.0, "max_elev": 73.0}, {"satellite": "SAT-004", "station": "Wallops", "start_time": "07:53", "duration_min": 4.0, "max_elev": 13.2}, {"satellite": "SAT-001", "station": "Santiago", "start_time": "07:57", "duration_min": 9.0, "max_elev": 58.8}, {"satellite": "SAT-007", "station": "Wallops", "start_time": "07:58", "duration_min": 7.0, "max_elev": 23.7}, {"satellite": "SAT-000", "station": "Bangalore", "start_time": "08:02", "duration_min": 6.0, "max_elev": 19.2}, {"satellite": "SAT-002", "station": "Fairbanks", "start_time": "08:05", "duration_min": 5.0, "max_elev": 15.2}, {"satellite": "SAT-004", "station": "Hartebeest", "start_time": "08:24", "duration_min": 5.0, "max_elev": 17.7}, {"satellite": "SAT-009", "station": "Canberra", "start_time": "08:30", "duration_min": 5.0, "max_elev": 15.4}, {"satellite": "SAT-007", "station": "Bangalore", "start_time": "08:33", "duration_min": 6.0, "max_elev": 22.6}, {"satellite": "SAT-001", "station": "Bangalore", "start_time": "08:38", "duration_min": 8.0, "max_elev": 39.1}, {"satellite": "SAT-003", "station": "Fairbanks", "start_time": "08:43", "duration_min": 5.0, "max_elev": 14.9}, {"satellite": "SAT-004", "station": "Canberra", "start_time": "08:50", "duration_min": 5.0, "max_elev": 15.7}, {"satellite": "SAT-008", "station": "Tromso", "start_time": "08:53", "duration_min": 4.0, "max_elev": 7.2}, {"satellite": "SAT-003", "station": "Wallops", "start_time": "08:55", "duration_min": 7.0, "max_elev": 37.0}, {"satellite": "SAT-009", "station": "Santiago", "start_time": "08:56", "duration_min": 8.0, "max_elev": 37.4}, {"satellite": "SAT-005", "station": "Hartebeest", "start_time": "08:59", "duration_min": 8.0, "max_elev": 65.3}, {"satellite": "SAT-006", "station": "Wallops", "start_time": "09:03", "duration_min": 5.0, "max_elev": 15.7}, {"satellite": "SAT-008", "station": "Bangalore", "start_time": "09:09", "duration_min": 7.0, "max_elev": 32.5}, {"satellite": "SAT-002", "station": "Singapore", "start_time": "09:16", "duration_min": 8.0, "max_elev": 31.8}, {"satellite": "SAT-008", "station": "Singapore", "start_time": "09:16", "duration_min": 7.0, "max_elev": 26.7}, {"satellite": "SAT-004", "station": "Fairbanks", "start_time": "09:22", "duration_min": 1.0, "max_elev": 10.2}, {"satellite": "SAT-000", "station": "Hartebeest", "start_time": "09:25", "duration_min": 6.0, "max_elev": 16.5}, {"satellite": "SAT-005", "station": "Canberra", "start_time": "09:26", "duration_min": 8.0, "max_elev": 76.2}, {"satellite": "SAT-004", "station": "Wallops", "start_time": "09:31", "duration_min": 8.0, "max_elev": 41.3}, {"satellite": "SAT-009", "station": "Tromso", "start_time": "09:31", "duration_min": 4.0, "max_elev": 6.9}, {"satellite": "SAT-008", "station": "Canberra", "start_time": "09:33", "duration_min": 5.0, "max_elev": 16.2}, {"satellite": "SAT-010", "station": "Santiago", "start_time": "09:33", "duration_min": 8.0, "max_elev": 34.0}, {"satellite": "SAT-007", "station": "Wallops", "start_time": "09:37", "duration_min": 8.0, "max_elev": 43.7}, {"satellite": "SAT-001", "station": "Santiago", "start_time": "09:38", "duration_min": 6.0, "max_elev": 19.1}, {"satellite": "SAT-009", "station": "Singapore", "start_time": "09:53", "duration_min": 7.0, "max_elev": 25.3}, {"satellite": "SAT-003", "station": "Singapore", "start_time": "09:54", "duration_min": 6.0, "max_elev": 20.8}, {"satellite": "SAT-001", "station": "Hartebeest", "start_time": "10:01", "duration_min": 8.0, "max_elev": 58.9}, {"satellite": "SAT-006", "station": "Canberra", "start_time": "10:03", "duration_min": 6.0, "max_elev": 19.9}, {"satellite": "SAT-009", "station": "Canberra", "start_time": "10:07", "duration_min": 8.0, "max_elev": 58.8}, {"satellite": "SAT-005", "station": "Wallops", "start_time": "10:09", "duration_min": 5.0, "max_elev": 15.1}, {"satellite": "SAT-011", "station": "Santiago", "start_time": "10:12", "duration_min": 1.0, "max_elev": 10.2}, {"satellite": "SAT-002", "station": "Santiago", "start_time": "10:13", "duration_min": 9.0, "max_elev": 85.9}, {"satellite": "SAT-008", "station": "Wallops", "start_time": "10:14", "duration_min": 8.0, "max_elev": 33.9}, {"satellite": "SAT-001", "station": "Bangalore", "start_time": "10:20", "duration_min": 3.0, "max_elev": 12.3}, {"satellite": "SAT-003", "station": "Fairbanks", "start_time": "10:21", "duration_min": 5.0, "max_elev": 14.6}, {"satellite": "SAT-002", "station": "Hartebeest", "start_time": "10:40", "duration_min": 2.0, "max_elev": 10.4}, {"satellite": "SAT-005", "station": "Hartebeest", "start_time": "10:41", "duration_min": 4.0, "max_elev": 12.4}, {"satellite": "SAT-010", "station": "Canberra", "start_time": "10:45", "duration_min": 6.0, "max_elev": 22.7}, {"satellite": "SAT-008", "station": "Bangalore", "start_time": "10:50", "duration_min": 4.0, "max_elev": 13.9}, {"satellite": "SAT-003", "station": "Santiago", "start_time": "10:52", "duration_min": 5.0, "max_elev": 13.6}, {"satellite": "SAT-002", "station": "Bangalore", "start_time": "10:54", "duration_min": 8.0, "max_elev": 62.3}, {"satellite": "SAT-004", "station": "Fairbanks", "start_time": "10:59", "duration_min": 5.0, "max_elev": 15.4}, {"satellite": "SAT-005", "station": "Canberra", "start_time": "11:08", "duration_min": 1.0, "max_elev": 10.2}, {"satellite": "SAT-009", "station": "Tromso", "start_time": "11:09", "duration_min": 4.0, "max_elev": 6.8}, {"satellite": "SAT-004", "station": "Wallops", "start_time": "11:11", "duration_min": 7.0, "max_elev": 25.5}, {"satellite": "SAT-010", "station": "Santiago", "start_time": "11:13", "duration_min": 7.0, "max_elev": 25.1}, {"satellite": "SAT-006", "station": "Hartebeest", "start_time": "11:15", "duration_min": 8.0, "max_elev": 65.6}, {"satellite": "SAT-007", "station": "Wallops", "start_time": "11:20", "duration_min": 4.0, "max_elev": 13.5}, {"satellite": "SAT-009", "station": "Bangalore", "start_time": "11:25", "duration_min": 8.0, "max_elev": 53.2}, {"satellite": "SAT-003", "station": "Singapore", "start_time": "11:33", "duration_min": 6.0, "max_elev": 19.9}, {"satellite": "SAT-009", "station": "Singapore", "start_time": "11:33", "duration_min": 5.0, "max_elev": 16.5}, {"satellite": "SAT-005", "station": "Fairbanks", "start_time": "11:37", "duration_min": 3.0, "max_elev": 11.5}, {"satellite": "SAT-006", "station": "Canberra", "start_time": "11:42", "duration_min": 8.0, "max_elev": 59.0}, {"satellite": "SAT-001", "station": "Hartebeest", "start_time": "11:43", "duration_min": 1.0, "max_elev": 10.1}, {"satellite": "SAT-005", "station": "Wallops", "start_time": "11:47", "duration_min": 8.0, "max_elev": 58.5}, {"satellite": "SAT-010", "station": "Tromso", "start_time": "11:47", "duration_min": 4.0, "max_elev": 7.1}, {"satellite": "SAT-011", "station": "Santiago", "start_time": "11:49", "duration_min": 8.0, "max_elev": 47.9}, {"satellite": "SAT-009", "station": "Canberra", "start_time": "11:50", "duration_min": 4.0, "max_elev": 13.2}, {"satellite": "SAT-007", "station": "Hartebeest", "start_time": "11:54", "duration_min": 4.0, "max_elev": 13.2}, {"satellite": "SAT-008", "station": "Wallops", "start_time": "11:54", "duration_min": 7.0, "max_elev": 33.3}, {"satellite": "SAT-002", "station": "Santiago", "start_time": "11:55", "duration_min": 5.0, "max_elev": 14.8}], "power_config": {"solar_watts": 2000.0, "battery_wh": 5000.0, "housekeeping_watts": 150.0}};
function render() {
const d = DATA;
const s = d.scheduler;
// Stats cards
document.getElementById('stats').innerHTML = `
<div class="card stat">
<div class="value">${d.config.n_satellites}</div>
<div class="label">SATELLITES</div>
</div>
<div class="card stat">
<div class="value">${s.completed}/${s.total_jobs}</div>
<div class="label">JOBS COMPLETED</div>
</div>
<div class="card stat">
<div class="value">${d.fleet_utilization_pct}%</div>
<div class="label">FLEET UTILIZATION</div>
</div>
<div class="card stat">
<div class="value">${d.total_compute_hours}h</div>
<div class="label">COMPUTE DELIVERED</div>
</div>
<div class="card stat">
<div class="value">${d.preemption_events}</div>
<div class="label">PREEMPTIONS</div>
</div>
<div class="card stat">
<div class="value">${d.config.sim_hours}h</div>
<div class="label">SIM DURATION</div>
</div>
`;
// Satellite table
const satRows = Object.entries(d.satellite_details).map(([name, det]) => {
const compColor = det.compute_pct > 50 ? 'green' : det.compute_pct > 20 ? 'orange' : 'red';
const tempColor = det.max_temp_c > 75 ? 'red' : det.max_temp_c > 60 ? 'orange' : 'green';
const battColor = det.min_battery_pct < 25 ? 'red' : det.min_battery_pct < 40 ? 'orange' : 'green';
return `<tr>
<td>${name}</td>
<td><span class="${compColor}">${det.compute_pct}%</span></td>
<td>${det.eclipse_pct}%</td>
<td><span class="${battColor}">${det.avg_battery_pct}%</span></td>
<td><span class="${tempColor}">${det.avg_temp_c}°C</span></td>
<td>${det.max_temp_c}°C</td>
<td>${det.contact_windows || 0}</td>
<td>${det.total_contact_minutes || 0}m</td>
</tr>`;
}).join('');
// Jobs table
const jobRows = d.completed_jobs.slice(0, 15).map(j => `<tr>
<td>${j.job_id}</td>
<td>${j.satellite}</td>
<td>${(j.duration_s / 60).toFixed(1)}m</td>
<td>${j.power_w}W</td>
</tr>`).join('');
document.getElementById('main-panels').innerHTML = `
<div class="card">
<h3>SATELLITE FLEET</h3>
<table>
<tr><th>Sat</th><th>Compute</th><th>Eclipse</th><th>Battery</th>
<th>Avg Temp</th><th>Max Temp</th><th>Contacts</th><th>Contact Time</th></tr>
${satRows}
</table>
</div>
<div class="card">
<h3>COMPLETED JOBS</h3>
<table>
<tr><th>Job</th><th>Satellite</th><th>Duration</th><th>Power</th></tr>
${jobRows}
</table>
${d.completed_jobs.length > 15 ? '<div style="color:var(--dim);margin-top:8px">... and ' + (d.completed_jobs.length - 15) + ' more</div>' : ''}
</div>
`;
// Timeline visualization
renderTimelines(d);
// Ground stations + power charts
renderDetails(d);
}
function renderTimelines(d) {
const panel = document.getElementById('timeline-panel');
let html = '<h3>SATELLITE TIMELINES</h3>';
const totalMinutes = d.config.sim_hours * 60;
Object.entries(d.telemetry || {}).forEach(([name, tel]) => {
html += `<div style="display:flex;align-items:center;gap:8px">
<span style="width:60px;font-size:11px;color:var(--dim)">${name}</span>
<div class="timeline" style="flex:1">`;
// Eclipse blocks
(tel.eclipse_windows || []).forEach(w => {
const left = (w.start_min / totalMinutes * 100);
const width = (w.duration_min / totalMinutes * 100);
html += `<div class="timeline-block timeline-eclipse"
style="left:${left}%;width:${Math.max(width, 0.3)}%"
title="Eclipse: ${w.duration_min.toFixed(0)}min"></div>`;
});
// Compute blocks
(tel.compute_windows || []).forEach(w => {
const left = (w.start_min / totalMinutes * 100);
const width = (w.duration_min / totalMinutes * 100);
html += `<div class="timeline-block timeline-compute"
style="left:${left}%;width:${Math.max(width, 0.3)}%"
title="Computing: ${w.duration_min.toFixed(0)}min"></div>`;
});
// Contact blocks
(tel.contact_windows || []).forEach(w => {
const left = (w.start_min / totalMinutes * 100);
const width = (w.duration_min / totalMinutes * 100);
html += `<div class="timeline-block timeline-contact"
style="left:${left}%;width:${Math.max(width, 0.5)}%"
title="${w.station}: ${w.duration_min.toFixed(0)}min"></div>`;
});
html += `</div></div>`;
});
html += `<div class="legend">
<span><span class="legend-dot" style="background:rgba(239,83,80,0.5)"></span> Eclipse</span>
<span><span class="legend-dot" style="background:rgba(79,195,247,0.5)"></span> Computing</span>
<span><span class="legend-dot" style="background:rgba(102,187,106,0.5)"></span> Ground Contact</span>
</div>`;
panel.innerHTML = html;
}
function renderDetails(d) {
const panel = document.getElementById('detail-panels');
// Ground station contacts
let contactHtml = '<h3>GROUND STATION CONTACTS</h3><div class="contact-list">';
(d.ground_contacts || []).slice(0, 30).forEach(c => {
contactHtml += `<div class="contact-item">
<span>${c.satellite} → ${c.station}</span>
<span>${c.start_time} (${c.duration_min.toFixed(1)}m, max elev ${c.max_elev}°)</span>
</div>`;
});
contactHtml += '</div>';
// Power summary
let powerHtml = '<h3>POWER BUDGET</h3>';
powerHtml += `<table>
<tr><th>Parameter</th><th>Value</th></tr>
<tr><td>Solar Panel Output</td><td>${d.power_config?.solar_watts || 2000}W</td></tr>
<tr><td>Battery Capacity</td><td>${d.power_config?.battery_wh || 5000}Wh</td></tr>
<tr><td>Housekeeping Load</td><td>${d.power_config?.housekeeping_watts || 150}W</td></tr>
<tr><td>Avg Eclipse Duration</td><td>${d.avg_eclipse_minutes?.toFixed(1) || '~35'}min</td></tr>
<tr><td>Orbital Period</td><td>~95min (LEO 550km)</td></tr>
<tr><td>Max Sustainable Heat</td><td>${d.max_sustainable_heat_w?.toFixed(0) || 'N/A'}W</td></tr>
</table>`;
panel.innerHTML = `
<div class="card">${contactHtml}</div>
<div class="card">${powerHtml}</div>
`;
}
render();
</script>
</body>
</html>