Repository navigation
Expand file tree
/
Copy pathmeta.py
More file actions
538 lines (532 loc) · 45.1 KB
/
Copy pathmeta.py
File metadata and controls
538 lines (532 loc) · 45.1 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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
"""
meta.py — версія програми та історія змін (об'єднано з колишніх
version.py + changelog.py — обидва були зовсім маленькі й завжди
редагувались разом при кожному релізі, тож логічно тримати їх в
одному місці). Показується на сторінці «Довідка» (Help).
Онови VERSION і додай новий запис у ПОЧАТОК списку ENTRIES при
значимих оновленнях.
"""
from __future__ import annotations
VERSION = "1.1.0"
AUTHOR = "Sergey Gorbachevsky"
ENTRIES = [
{
"version": "1.1.0",
"date": "2026-09-11",
"uk": (
"Велике оновлення — повноцінна оптимізація висоти (нова "
"вкладка «Висота»), значні виправлення координатної "
"оптимізації, і живий компас у HUD.\n\n"
"**Оптимізація висоти (нове).** Після обходу заборонних зон "
"по горизонталі — окремий алгоритм підганяє висоту вздовж "
"усього маршруту під реальний рельєф (SRTM), ліміт кута "
"набору/зниження з профілю апарату, і бюджет точок з типу "
"маршруту. Працює послідовними фазами з поверненням: спершу "
"усуваються критичні (від'ємний кліренс) порушення, потім "
"повністю контролюється кут (зсувом наявних точок, а якщо "
"точку затиснуто вимогами з обох боків — зміною її власної "
"висоти), потім — недостатній кліренс (пріоритет підняттю "
"наявних точок у межах кута, вставка нової — лише якщо цього "
"не досить), і нарешті, поки лишається бюджет — щільніше "
"прилягання до рельєфу дробленням найдовших ребер. Перехід "
"через лінію розмежування — окремий, ізольований блок зі "
"своїм лімітом кута (нове поле в «Тип маршруту»), щоб не "
"плутатись зі звичайною логікою.\n\n"
"Розрахунок виконується у фоновому потоці (інтерфейс "
"лишається живим), є покроковий режим (пробіл/кнопка "
"«Далі») з живими графіками «було/стало» й кута нахилу "
"траєкторії, і кнопка «Скасувати» для дострокової зупинки. "
"Звіт показує окремо найгірший кліренс і найгірший кут з "
"точними координатами — легко знайти причину, якщо щось "
"лишилось невиправленим.\n\n"
"**Координатна оптимізація (виправлення).** Знайдено й "
"виправлено серйозний регрес: фільтр, що прибирав фізично "
"безглузді мікроребра між геть далекими перешкодами, у "
"складних сценаріях (багато сіл поруч) міг узагалі не "
"знаходити шлях обходу. Тепер — автоматичний відкат до "
"повного графа, якщо з фільтром шлях не знайдено; "
"коректність обходу більше ніколи не приноситься в жертву.\n\n"
"**HUD (виправлення).** Курс (компас) уже надходив у потоці "
"телеметрії VFR_HUD, але не малювався — додано стрічку "
"курсу внизу штучного горизонту (N/E/S/W, поділки кожні "
"10°), і числові поля путьової швидкості та вертикальної "
"швидкості, які теж уже були в тому самому потоці.\n\n"
"**Окремий інструмент.** Новий самостійний скрипт "
"`clearance_distribution.py` (лише стандартна бібліотека) — "
"будує розподіл кліренсу над рельєфом для однієї чи двох "
"місій одразу, накладених на спільній координатній сітці, "
"для наочного порівняння «було/стало» по всьому маршруту "
"разом, не по окремих точках."
),
"en": (
"Major update — full altitude optimization (new \"Altitude\" "
"tab), significant fixes to coordinate optimization, and a "
"live compass in the HUD.\n\n"
"**Altitude optimization (new).** After horizontal no-fly-"
"zone avoidance, a separate algorithm fits the altitude "
"along the entire route to the real terrain (SRTM), the "
"climb/descent angle limit from the aircraft profile, and "
"the point budget from the route type. It runs in "
"sequential phases with feedback: first critical (negative "
"clearance) violations are cleared, then the angle is fully "
"controlled (by shifting existing points, or — if a point "
"is pinched by requirements from both sides — by changing "
"its own altitude instead), then insufficient clearance "
"(priority given to raising existing points within the "
"angle limit, a new point is only inserted if that's not "
"enough), and finally, while budget remains, tighter "
"terrain-hugging by splitting the longest remaining edges. "
"Crossing the demarcation line is a separate, isolated "
"block with its own angle limit (new field in \"Route "
"type\"), so it never gets tangled up with the regular "
"logic.\n\n"
"The computation runs on a background thread (the interface "
"stays responsive), there's a step-by-step mode (space bar "
"or the \"Next\" button) with live before/after and flight-"
"path-angle charts, and a \"Cancel\" button to stop early. "
"The report shows the worst clearance and the worst angle "
"separately, with exact coordinates — easy to find the "
"cause if something is left unresolved.\n\n"
"**Coordinate optimization (fix).** Found and fixed a "
"serious regression: the filter that removed physically "
"meaningless micro-edges between far-apart obstacles could, "
"in complex scenarios (many nearby settlements), fail to "
"find a detour path at all. Now there's an automatic "
"fallback to the full graph if no path is found with the "
"filter — correctness of the detour is never sacrificed "
"again.\n\n"
"**HUD (fix).** Heading (compass) data was already arriving "
"in the VFR_HUD telemetry stream but was never drawn — "
"added a heading tape below the artificial horizon (N/E/S/W, "
"10° ticks), plus numeric ground speed and climb rate "
"readouts, which were also already in the same stream.\n\n"
"**Separate tool.** New standalone script "
"`clearance_distribution.py` (standard library only) — "
"builds a terrain clearance distribution for one or two "
"missions at once, overlaid on a shared coordinate grid, "
"for an at-a-glance before/after comparison across the "
"whole route rather than individual points."
),
},
{
"version": "1.0.6",
"date": "2026-09-03",
"uk": (
"Нова вкладка «Обліт НП» на сторінці «Аналіз» — перевірка "
"маршруту на близькість до населених пунктів. Запитує реальні "
"координати сіл/міст поблизу маршруту (Overpass API, OpenStreetMap), "
"рахує мінімальну відстань від кожного відрізка маршруту до "
"найближчого населеного пункту (не тільки від самих точок — і від "
"ліній між ними), і позначає порушення заданого порогу (за "
"замовчуванням 1 км, редагується).\n\n"
"Результат — карта маршруту з кольоровими позначками (червоний — "
"порушення, жовтий — близько, зелений — безпечно) і таблиця "
"порушень з точними відстанями, номерами відрізків та назвами "
"населених пунктів. Для довгих маршрутів (сотні кілометрів) "
"автоматично приховує на карті безпечно далекі позначки, лишаючи "
"лише релевантні — щоб карта не перетворювалась на суцільну пляму "
"з тисяч точок.\n\n"
"Важливе технічне застереження, зазначене прямо у звіті: "
"перевірка використовує координати ЦЕНТРУ населеного пункту з "
"OpenStreetMap, не межі забудови — для малих сіл похибка мінімальна, "
"для великих міст реальна відстань до найближчого будинку може бути "
"меншою за розраховану.\n\n"
"Виправлено помилку HTTP 406 при зверненні до Overpass API "
"(сервер посилив захист від автоматичних запитів — додано коректні "
"заголовки) та додано автоматичний перехід на резервний сервер, "
"якщо основний тимчасово недоступний.\n\n"
"Карта тепер вписується у висоту видимого вікна (раніше на дуже "
"широких моніторах могла розтягуватись на весь екран без потреби)."
),
"en": (
"New \"Settlements\" tab on the \"Analysis\" page — checks the "
"route for proximity to populated areas. Queries real coordinates "
"of villages/towns near the route (Overpass API, OpenStreetMap), "
"computes the minimum distance from each route leg to the nearest "
"settlement (not just from the waypoints themselves — from the "
"lines between them too), and flags violations of a configurable "
"threshold (1 km by default).\n\n"
"Results: a route map with color-coded markers (red — violation, "
"yellow — close, green — safe) and a violations table with exact "
"distances, leg numbers, and settlement names. For long routes "
"(hundreds of kilometers), safely-distant markers are automatically "
"hidden from the map, keeping only the relevant ones — so the map "
"doesn't turn into a solid blob of thousands of dots.\n\n"
"Important caveat, stated directly in the report: the check uses "
"the settlement's CENTER coordinate from OpenStreetMap, not its "
"built-up boundary — negligible error for small villages, but for "
"large cities the real distance to the nearest building may be "
"smaller than calculated.\n\n"
"Fixed an HTTP 406 error when querying the Overpass API (the "
"server tightened its anti-bot protection — proper headers added) "
"and added automatic fallback to a mirror server if the primary "
"one is temporarily unavailable.\n\n"
"The map now fits within the visible window height (previously "
"could stretch across the entire screen on very wide monitors "
"without need)."
),
},
{
"version": "1.0.5",
"date": "2026-09-01",
"uk": (
"Кнопка «Команди» — живий тест підключеного контролера: "
"перевіряє ~186 команд MAVLink по черзі через мініатюрні тестові "
"місії і показує, які саме прийняті прошивкою як елемент місії "
"(не за документацією, а реальним запитом). Поточна місія на платі "
"тимчасово підмінюється й відновлюється автоматично. Прогрес видно "
"в рядку стану по кожній команді.\n\n"
"Кнопка «Параметри» — читає критичні параметри місії безпосередньо "
"з підключеного борту. Набір параметрів залежить від типу апарату "
"(крило, коптер, ровер): для крила — швидкості, висоти RTL, "
"максимальний крен, failsafe; для коптера — батарея на першому місці. "
"Діалог показує значення з підписами на мові інтерфейсу і підтримує "
"копіювання правою кнопкою.\n\n"
"Кнопка «Info» тепер показує живий HUD (штучний горизонт): крен, "
"тангаж, висота і температура барометра оновлюються в реальному часі "
"поки діалог відкритий. Нижче — текстовий звіт як раніше.\n\n"
"Сканування Lua-скриптів (APM/scripts/) розширено: новий стандарт "
"розмітки MCP-NAME/MCP-TYPE/MCP-VERSION/MCP-DESC дозволяє описати "
"призначення будь-якого скрипта — не лише команди місії, а й фонові "
"скрипти. Для скриптів без розмітки евристика шукає номери команд у "
"коді (паттерни local CMD_X = 80, if cmd == 80) і показує їх з "
"технічними іменами констант.\n\n"
"Виправлено показ git-хешу прошивки: раніше виводився hex-дамп байтів "
"(3364623462633765), тепер коректно декодується як ASCII (3db4bc7e). "
"Додано відображення версій middleware та OS з AUTOPILOT_VERSION — "
"там може зберігатись кастомний номер версії виробника БПЛА.\n\n"
"Датчики у звіті Info: для зовнішніх датчиків (GPS, диференційний "
"тиск, RC-приймач) при несправності додається підказка «(відсутній?)» "
"— щоб відрізняти реальну несправність від просто непідключеного "
"обладнання. Показується абсолютний тиск і температура барометра.\n\n"
"Кнопки Info/Команди/Параметри/Файли SD лишаються візуально «натиснутими» "
"поки відповідний діалог відкритий, і відтискаються точно при його "
"закритті — незалежно від того, чи закрив користувач хрестиком чи "
"іншим способом."
),
"en": (
"\"Commands\" button — live test of the connected controller: checks "
"~186 MAVLink commands one by one via minimal test missions and shows "
"which ones the firmware actually accepts as a mission item (a real "
"query, not documentation). The current mission on the board is "
"temporarily replaced and automatically restored. Progress is shown "
"in the status bar per command.\n\n"
"\"Parameters\" button — reads mission-critical parameters directly "
"from the connected vehicle. The parameter set depends on vehicle type "
"(fixed-wing, copter, rover): for fixed-wing — airspeeds, RTL altitude, "
"max bank angle, failsafe; for copter — battery parameters first. "
"The dialog shows values with labeled descriptions in the UI language "
"and supports right-click copy.\n\n"
"The \"Info\" button now shows a live HUD (artificial horizon): roll, "
"pitch, altitude, and barometer temperature update in real time while "
"the dialog is open. The text report is shown below as before.\n\n"
"Lua script scanning (APM/scripts/) extended: a new markup standard "
"MCP-NAME/MCP-TYPE/MCP-VERSION/MCP-DESC lets you describe any script's "
"purpose — not just mission commands but also background scripts. "
"For scripts without markup, heuristics search for command numbers in "
"code (patterns like local CMD_X = 80, if cmd == 80) and show them "
"with their constant names.\n\n"
"Fixed firmware git hash display: previously showed a hex dump of bytes "
"(3364623462633765), now correctly decoded as ASCII (3db4bc7e). Added "
"middleware and OS version fields from AUTOPILOT_VERSION — these may "
"contain the manufacturer's custom firmware version number.\n\n"
"Sensors in the Info report: external sensors (GPS, differential "
"pressure, RC receiver) now show \"(absent?)\" when unhealthy — "
"to distinguish a real fault from simply unplugged hardware. Absolute "
"barometric pressure and temperature are now displayed.\n\n"
"Info/Commands/Parameters/SD Files buttons remain visually pressed "
"while their dialog is open and release exactly when it is closed — "
"whether the user pressed the X or closed it any other way."
),
},
{
"version": "1.0.4",
"date": "2026-08-29",
"uk": (
"Кнопка «Info» тепер правильно визначає тип апарату навіть коли "
"на тій самій шині MAVLink є інші пристрої (ADS-B приймач, гімбал, "
"компаньйон-комп'ютер) — раніше їхній HEARTBEAT міг випадково "
"перезаписати дані автопілота, і замість реального типу апарату "
"показувалось щось на кшталт «INVALID / ADS-B передавач».\n\n"
"Нова кнопка «Команди» (поруч із «Файли SD») — перевіряє, які саме "
"команди MAV_CMD реально приймає ПІДКЛЮЧЕНА ЗАРАЗ плата як елемент "
"місії (не за документацією, а живим тестом): завантажує короткі "
"тестові місії по черзі для кожної команди, дивиться на відповідь "
"контролера. Поточна місія на платі тимчасово підмінюється й "
"автоматично відновлюється одразу після завершення перевірки. "
"Прогрес видно в рядку стану по кожній команді окремо.\n\n"
"Кнопка «Info» також тепер сканує SD-карту (APM/scripts/) на "
"власні Lua-скрипти з розпізнаваною розміткою (MCP-COMMAND) — "
"якщо десь підключений скрипт додає власні команди в місію (напр. "
"приклад «Змійка», що додається окремим файлом), у звіті одразу "
"видно, з якими параметрами й як їх вставити. Для скриптів без "
"розмітки звіт чесно показує «без розмітки», а не мовчить.\n\n"
"Копіювання тексту (Ctrl+C, права кнопка миші) полагоджено в усіх "
"діалогах програми одразу, не по одному — причина була в тому, що "
"прив'язка спрацьовувала лише на латинській розкладці клавіатури; "
"тепер визначається за фізичною клавішею, а не символом, який вона "
"друкує в поточній розкладці.\n\n"
"Прибрано кнопку «Закрити» з усіх діалогів (дублювала звичайний "
"хрестик у кутку вікна).\n\n"
"Виправлено помилку в перемальовці карти після правок у "
"редакторі місії — раніше кожна дрібна зміна (додавання чи "
"видалення точки) непотрібно перезавантажувала всі тайли карти "
"заново; тепер оновлюється лише сама лінія маршруту.\n\n"
"Номери точок на карті тепер завжди білі, незалежно від теми "
"застосунку (раніше могли зливатися з темними ділянками карти)."
),
"en": (
"The \"Info\" button now correctly detects the vehicle type even "
"when other devices share the same MAVLink bus (an ADS-B receiver, "
"a gimbal, a companion computer) — previously their HEARTBEAT could "
"accidentally overwrite the autopilot's own data, showing something "
"like \"INVALID / ADS-B transponder\" instead of the real vehicle "
"type.\n\n"
"New \"Commands\" button (next to \"SD Files\") — checks which "
"MAV_CMD commands the CURRENTLY CONNECTED board actually accepts "
"as a mission item (a live test, not just documentation): uploads "
"short test missions one by one for each command and reads the "
"controller's response. The current mission on the board is "
"temporarily swapped out and automatically restored right after "
"the scan finishes. Progress is shown in the status bar for each "
"command individually.\n\n"
"The \"Info\" button also now scans the SD card (APM/scripts/) for "
"custom Lua scripts with recognizable markup (MCP-COMMAND) — if a "
"connected script adds its own mission commands (e.g. the \"Snake\" "
"example, distributed as a separate file), the report immediately "
"shows what parameters to use and how to embed them. For scripts "
"without markup, the report honestly says \"no markup found\" "
"instead of staying silent.\n\n"
"Text copying (Ctrl+C, right-click) fixed across every dialog in "
"the app at once, not one at a time — the underlying cause was "
"that the shortcut only worked on a Latin keyboard layout; it's "
"now detected by physical key position rather than the character "
"that key types in the current layout.\n\n"
"Removed the \"Close\" button from every dialog (it duplicated the "
"regular X in the window's corner).\n\n"
"Fixed a bug in map redrawing after mission editor changes — "
"previously every small edit (adding or deleting a point) "
"needlessly reloaded all map tiles from scratch; now only the "
"route line itself is updated.\n\n"
"Waypoint numbers on the map are now always white, regardless of "
"the app's theme (previously they could blend into dark areas of "
"the map)."
),
},
{
"version": "1.0.3",
"date": "2026-08-27",
"uk": (
"Редактор місії суттєво доопрацьовано: логіка правої кнопки миші тепер "
"ЄДИНА на всіх трьох поверхнях — у таблиці, на карті й на графіку висот. "
"Правий клік у будь-якому з цих місць відкриває те саме контекстне меню з "
"трьома пунктами: «Додати точку» (завжди рівно посередині між точкою, на "
"яку клікнули, і наступною — не важливо, де саме в межах відрізка стався "
"клік), «Додати команду» (службова команда без власних координат, "
"вставляється туди ж) і «Видалити» (прибирає обрану точку; точку Home "
"видалити не можна). На карті й у таблиці клік одразу визначає, яку точку "
"мається на увазі; на графіку висот для цього автоматично обирається "
"найближча до кліку точка (за відстанню вздовж маршруту) — вибір видно й у "
"таблиці одразу після кліку.\n\n"
"Графік висот отримав зум: лівою кнопкою миші, не на маркер точки, "
"виділяється прямокутник — ділянка під ним розтягується на всю ширину "
"графіка, з деталізацією рельєфу, що зростає пропорційно (принцип лупи: "
"чим сильніший зум, тим щільніше видно точки SRTM саме на цій ділянці, а "
"не розтягнуті рідкісні точки з усього маршруту). Зум можна заглиблювати "
"послідовно, скільки завгодно разів поспіль. У правому верхньому куті "
"графіка — число поточного зуму (відношення довжини всього маршруту до "
"видимого відрізка, округлене; спочатку завжди 1). У лівому верхньому куті "
"— та сама кнопка скидання вигляду, що й на карті, повертає до всього "
"маршруту з будь-якого рівня зуму.\n\n"
"Перетягування точки на графіку висот тепер працює у двох напрямках "
"одночасно: вертикально — висота (як і раніше), горизонтально — позиція "
"точки вздовж прямої між її найближчими сусідами по маршруту (перша й "
"остання точки маршруту не мають сусіда з одного боку, тому рухаються лише "
"по вертикалі).\n\n"
"Карта на «Місія» тепер малюється прогресивно: кожен тайл з'являється на "
"екрані одразу по готовності (замість очікування, доки завантажаться геть "
"усі), а маршрут (лінія й точки) видно з першої секунди — ще до того, як "
"тайли навколо нього встигли довантажитись."
),
"en": (
"Mission editor significantly improved: right-click logic is now UNIFIED "
"across all three surfaces — table, map, and elevation chart. Right-clicking "
"in any of these opens the same context menu with three items: \"Add "
"waypoint\" (always exactly midway between the clicked point and the next "
"one — regardless of where within the segment the click landed), \"Add "
"command\" (a service command with no coordinates of its own, inserted at "
"the same spot), and \"Delete\" (removes the selected point; the Home point "
"cannot be deleted). On the map and in the table, the click directly "
"determines which point is meant; on the elevation chart, the nearest point "
"to the click (by distance along the route) is automatically selected — the "
"table selection updates right after the click, so it's visible immediately.\n\n"
"The elevation chart now supports zoom: left-click-dragging anywhere except "
"on a point marker draws a selection rectangle — the segment underneath "
"stretches to fill the whole chart width, with terrain detail increasing "
"proportionally (magnifying-glass principle: the stronger the zoom, the "
"denser the SRTM sample points shown for that specific segment, instead of "
"sparse points spread across the whole route). Zoom can be applied "
"sequentially, any number of times in a row. The top-right corner of the "
"chart shows the current zoom number (ratio of total route length to the "
"visible segment, rounded; starts at 1). The top-left corner has the same "
"reset-view button as the map, returning to the whole route from any zoom "
"level.\n\n"
"Dragging a point on the elevation chart now works in two directions at "
"once: vertically — altitude (as before), horizontally — the point's "
"position along the straight line between its immediate neighbors on the "
"route (the first and last points of the route have no neighbor on one "
"side, so they only move vertically).\n\n"
"The map on \"Mission\" now renders progressively: each tile appears on "
"screen as soon as it's ready (instead of waiting for all of them to "
"finish loading), and the route (line and points) is visible from the "
"first second — even before the tiles around it have finished loading in."
),
},
{
"version": "1.0.2",
"date": "2026-08-22",
"uk": (
"Редактор місії на «Місія»: перетягування точок мишею просто на карті, "
"редагування комірок таблиці подвійним кліком, перетягування висоти на "
"профілі висот, додавання/видалення точок і команд через праву кнопку миші. "
"Вмикається окремою кнопкою «Редагувати» — усі зміни спрацьовують лише в "
"цьому режимі, звичайний перегляд і панорамування карти лишаються "
"недоторканими.\n\n"
"Карта на «Місія» тепер поводиться як у Mission Planner: після завантаження "
"місії весь маршрут вміщується в екран без прокрутки, зум можна підняти аж "
"до 24 (раніше впирався в ліміт тайлів на широких маршрутах) — на високому "
"зумі довантажується лише видима область навколо точки огляду, а не весь "
"маршрут одразу. Кнопка-піктограма у верхньому лівому куті карти повертає до "
"початкового вигляду з будь-якого зуму чи положення. Панорамування більше не "
"мигтить порожнім екраном під час руху.\n\n"
"Темна/світла тема на весь застосунок (перемикається в Конфігурації, "
"застосовується одразу): фон, таблиця місії, графіки висоти/кута/глісади, "
"PDF-звіт завжди зберігається світлим для друку незалежно від активної теми "
"екрана.\n\n"
"Список команд у редакторі місії звужено з ~188 до 47 — лише ті, що реально "
"валідні як елемент місії ArduPilot (як у Mission Planner), решта (ARM/DISARM, "
"preflight-калібрування, точки geofence тощо) прибрана як така, що ніколи не "
"з'являється в .waypoints-файлі.\n\n"
"Графіки висоти на «Місія» і «Аналіз» тепер узгоджені за кольором: маршрут/"
"висота польоту завжди червоні, рельєф — завжди синій, без заливки під ним.\n\n"
"Базовий набір супутникових тайлів (Україна + Європейська частина Росії, "
"загальний огляд) постачається разом із програмою — карта показує щось одразу "
"після встановлення, ще до першого підключення до інтернету. Детальний перегляд "
"маршруту завжди довантажується з мережі, як і раніше."
),
"en": (
"Mission editor on \"Mission\": drag waypoints directly on the map, "
"double-click to edit table cells, drag altitude on the elevation profile, "
"add/delete waypoints and commands via right-click. Enabled with a separate "
"\"Edit\" button — all changes only take effect in this mode, normal viewing "
"and map panning stay untouched.\n\n"
"The map on \"Mission\" now behaves like Mission Planner: after loading a "
"mission the whole route fits the screen with no scrolling, zoom can go up to "
"24 (previously capped by the tile limit on wide routes) — at high zoom only "
"the visible area around the viewpoint loads, not the whole route at once. An "
"icon button in the map's top-left corner resets the view from any zoom or "
"position. Panning no longer flashes an empty screen mid-drag.\n\n"
"App-wide dark/light theme (switch in Configuration, applies instantly): "
"background, mission table, elevation/angle/glide-slope charts, PDF reports "
"always stay light for printing regardless of the active screen theme.\n\n"
"The mission editor's command list is narrowed from ~188 to 47 — only the ones "
"actually valid as a mission item in ArduPilot (matching Mission Planner), the "
"rest (ARM/DISARM, preflight calibration, geofence points, etc.) removed as "
"never appearing in a .waypoints file.\n\n"
"Elevation charts on \"Mission\" and \"Analysis\" now share consistent colors: "
"route/flight altitude is always red, terrain is always blue, no fill "
"underneath it.\n\n"
"A base set of satellite tiles (Ukraine + European Russia, general overview) "
"ships with the app — the map shows something right after install, even before "
"the first internet connection. Detailed route view still loads from the "
"network as before."
),
},
{
"version": "1.0.1",
"date": "2026-08-16",
"uk": (
"Карта на «Місія» і «Аналіз → Маршрут»: тепер завжди рівно по ширині "
"екрана, без сірих полів по боках — масштабується під реальні пропорції "
"маршруту, а не підганяється під фіксований контейнер. Зум підбирається "
"автоматично під розмір канваса при кожному завантаженні місії, замість "
"старого значення з налаштувань.\n\n"
"Графік кута нахилу траєкторії: точка LAND більше не враховується — різкий "
"кут заходу на посадку (десятки градусів) більше не «з'їдає» масштаб графіка "
"для решти маршруту (для самого заходу є окрема перевірка — глісада).\n\n"
"Виправлено висоту шапки — раніше вона «стрибала» між сторінками "
"«Конфігурація»/«Довідка» і «Місія»/«Аналіз».\n\n"
"Повна локалізація UA/EN: кнопки, підписи вкладок, статусні повідомлення, "
"текст погоди (зліт/посадка), заголовки PDF-звіту — раніше частина "
"інтерфейсу лишалась українською навіть в англійському режимі. Заразом "
"виправлено розподіл звіту по вкладках (висота/кут/глісада), який у "
"англійському режимі міг класти все не туди."
),
"en": (
"Map on \"Mission\" and \"Analysis → Route\": now always exactly screen-width, "
"no gray bars on the sides — scales to the route's real proportions instead of "
"being forced into a fixed container. Zoom is picked automatically for the "
"canvas size on every mission load, instead of reusing the old saved value.\n\n"
"Flight path angle graph: the LAND point is no longer included — the steep "
"landing approach angle (tens of degrees) no longer skews the scale for the "
"rest of the route (landing approach has its own dedicated check — glide "
"slope).\n\n"
"Fixed header height — it used to \"jump\" between the \"Configuration\"/\"Help\" "
"pages and \"Mission\"/\"Analysis\".\n\n"
"Full UA/EN localization: buttons, tab labels, status messages, weather text "
"(takeoff/landing), PDF report headings — some of the interface previously "
"stayed in Ukrainian even in English mode. Also fixed report distribution "
"across tabs (elevation/angle/glide), which could misfile everything in "
"English mode."
),
},
{
"version": "1.0.0",
"date": "2026-08-02",
"uk": (
"Перший реліз.\n\n"
"Аналіз місії (.waypoints, QGC WPL 110):\n"
"- критично низька висота (за файлом і за рельєфом SRTM — як у самих точках, "
"так і вздовж усієї лінії польоту між ними)\n"
"- критично гострі кути повороту\n"
"- кут нахилу траєкторії (набір/зниження) поза допуском\n"
"- глісада заходу на посадку: дистанція/азимут/кут по останніх відрізках до LAND, "
"з урахуванням команд DO_CHANGE_SPEED\n\n"
"Графіки: висота (з рельєфом), кут траєкторії, глісада — усі з наскрізною нумерацією "
"реальних точок маршруту.\n\n"
"Карта: тайли з інтернету (OpenStreetMap / Google Maps / Google Satellite / Google "
"Гібрид) із диск-кешем по провайдерах, зум колесом миші, шар окупованих територій / "
"лінії зіткнення (deepstatemap.live).\n\n"
"Таблиця місії на сторінці «Місія» — усі команди файлу, як у Mission Planner.\n\n"
"Інтерфейс: 4 сторінки (Місія / Аналіз / Конфігурація / Довідка) з навігацією іконка+"
"підпис, тема оформлення у стилі Mission Planner, локалізація UA/EN без російської, "
"автозбереження налаштувань між запусками, сплеш-екран зі версією при старті."
),
"en": (
"First release.\n\n"
"Mission analysis (.waypoints, QGC WPL 110):\n"
"- critically low altitude (from the file and from SRTM terrain — both at the points "
"themselves and along the whole flight line between them)\n"
"- critically sharp turn angles\n"
"- flight path angle (climb/descent) out of tolerance\n"
"- landing approach glide slope: distance/bearing/angle for the final legs before "
"LAND, including DO_CHANGE_SPEED commands\n\n"
"Graphs: elevation (with terrain), flight path angle, glide slope — all with "
"consistent numbering of the real route points.\n\n"
"Map: tiles from the internet (OpenStreetMap / Google Maps / Google Satellite / "
"Google Hybrid) with a per-provider disk cache, mouse-wheel zoom, occupied-"
"territories / line-of-contact layer (deepstatemap.live).\n\n"
"Mission table on the Mission page — every command in the file, like in Mission "
"Planner.\n\n"
"Interface: 4 pages (Mission / Analysis / Configuration / Help) with icon+label "
"navigation, Mission-Planner-style theme, UA/EN localization (no Russian), settings "
"auto-saved between runs, splash screen with version on startup."
),
},
]
def format_changelog(lang: str) -> str:
parts = []
for e in ENTRIES:
text = e.get(lang) or e.get("en", "")
parts.append(f"{e['version']} — {e['date']}\n\n{text}")
return "\n\n" + ("\n\n" + "=" * 40 + "\n\n").join(parts)