Загрузил(а) файлы в 'htdocs/public/views'

This commit is contained in:
homyak 2024-02-24 00:22:24 +03:00
parent 3fc325d733
commit 48e5127b90
9 changed files with 2117 additions and 0 deletions

View File

@ -0,0 +1,6 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<title>Подробнее</title>
<div class="modal-inner-content modal-inner-content-about" style="padding-bottom: 30px;">
<p>Привет. Карта поднята на базе открытого проекта Aprs Track Direct. Сетевой хомяк.</p>
</div>

View File

@ -0,0 +1,103 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php
$stations = [];
$seconds = 60*60*72;
$page = $_GET['page'] ?? 1;
$rows = 50;
$offset = ($page - 1) * $rows;
$stations = StationRepository::getInstance()->getObjectList($seconds, $rows, $offset);
$count = StationRepository::getInstance()->getNumberOfStations($seconds);
$pages = ceil($count / $rows);
?>
<title>Последние принятые пакеты</title>
<div class="modal-inner-content" style="padding-bottom: 30px;">
<?php if (count($stations) > 0) : ?>
<p>
<?php echo $count; ?> станций было принято за последние 24 часа.
</p>
<?php if ($pages > 1): ?>
<div class="pagination">
<a class="tdlink" href="/views/latest.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=1"><<</a>
<?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?>
<a href="/views/latest.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a>
<?php endfor; ?>
<a class="tdlink" href="/views/latest.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $pages; ?>">>></a>
</div>
<?php endif; ?>
<div class="datagrid datagrid-search" style="max-width:1000px;">
<table>
<thead>
<tr>
<th>&nbsp;</th>
<th>Позывной</th>
<th>Последний пакет</th>
<th>Комментарий/инфо</th>
<th>На карте</th>
</tr>
</thead>
<tbody>
<?php foreach ($stations as $foundStation) : ?>
<tr>
<td>
<img src="<?php echo $foundStation->getIconFilePath(22, 22); ?>" alt="Symbol"/>
</td>
<td>
<a class="tdlink" href="/views/overview.php?id=<?php echo $foundStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($foundStation->name) ?></a>
</td>
<td class="station-latest-heard-timestamp" style="white-space: nowrap;">
<?php echo $foundStation->latestConfirmedPacketTimestamp; ?>
</td>
<td>
<?php if ($foundStation->sourceId == 5 && $foundStation->getOgnDevice() !== null) : ?>
<div style="width: 100px; display: inline-block;">Регистрация:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->registration); ?> <?php echo $foundStation->getOgnDevice()->cn ? '[' .htmlspecialchars($foundStation->getOgnDevice()->cn) . ']' : ''; ?><br/>
<div style="width: 100px; display: inline-block;">Модель самолёта:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->aircraftModel); ?>
<?php else : ?>
<?php $latestPacket = PacketRepository::getInstance()->getObjectById($foundStation->latestPacketId, $foundStation->latestPacketTimestamp); ?>
<?php echo htmlspecialchars($latestPacket->comment); ?>
<?php endif; ?>
</td>
<td>
<?php if ($foundStation->latestConfirmedPacketTimestamp > (time() - 60*60*72)) : ?>
<a href="?sid=<?php echo $foundStation->id; ?>" onclick="
if (window.parent && window.parent.trackdirect) {
$('.modal', parent.document).hide();
window.parent.trackdirect.filterOnStationId([]);
window.parent.trackdirect.filterOnStationId([<?php echo $foundStation->id; ?>]);
return false;
}">Показать</a>
<?php else : ?>
&nbsp;
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
<?php if (count($stations) == 0) : ?>
<p>
<b><i>За последние 24 часа не было принято ни одной станции.</i></b>
</p>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('.station-latest-heard-timestamp').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
});
</script>

View File

@ -0,0 +1,509 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?>
<?php if ($station->isExistingObject()) : ?>
<title><?php echo $station->name; ?>, подробнее</title>
<div class="modal-inner-content">
<div class="modal-inner-content-menu">
<span>Подробнее</span>
<a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Статистика</a>
<a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Графики</a>
<a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Погода</a>
<a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Телеметрия</a>
<a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Сырые данные</a>
</div>
<div class="horizontal-line">&nbsp;</div>
<div class="overview-content-summary">
<div>
<div class="overview-content-summary-hr">
<?php if ($station->sourceId == 5) : ?>
ID:
<?php else: ?>
Позывной:
<?php endif; ?>
</div>
<div class="overview-content-station" title="Name of the station/object">
<?php echo htmlentities($station->name); ?>
</div>
</div>
<div>
<div class="overview-content-summary-hr">
Идентификатор:
</div>
<div class="overview-content-station" title="Website station id">
<?php echo $station->id; ?>
</div>
</div>
<?php if ($station->sourceId != null) : ?>
<div>
<div class="overview-content-summary-hr">Источник:</div>
<div class="overview-content-station" title="Source of this station">
<?php echo $station->getSourceDescription(); ?>
</div>
</div>
<?php endif; ?>
<?php if ($station->getOgnDevice() !== null) : ?>
<br/>
<?php if ($station->getOgnDevice()->registration != null) : ?>
<div>
<div class="overview-content-summary-hr">Регистрация самолёта:</div>
<div class="overview-content-station" title="Aircraft Registration">
<b><?php echo htmlspecialchars($station->getOgnDevice()->registration); ?></b>
</div>
</div>
<?php endif; ?>
<?php if ($station->getOgnDevice()->cn != null) : ?>
<div>
<div class="overview-content-summary-hr">Aircraft CN:</div>
<div class="overview-content-station" title="Aircraft CN">
<b><?php echo htmlspecialchars($station->getOgnDevice()->cn); ?></b>
</div>
</div>
<?php endif; ?>
<?php endif; ?>
<?php if ($station->getOgnDdbAircraftTypeName() !== null) : ?>
<div>
<div class="overview-content-summary-hr">Тип самолёта:</div>
<div class="overview-content-station" title="Type of aircraft">
<?php echo htmlspecialchars($station->getOgnDdbAircraftTypeName()); ?>
</div>
</div>
<?php if ($station->getOgnDevice()->aircraftModel != null) : ?>
<div>
<div class="overview-content-summary-hr">Модель самолёта:</div>
<div class="overview-content-station" title="Aircraft Model">
<?php echo htmlspecialchars($station->getOgnDevice()->aircraftModel); ?>
</div>
</div>
<?php endif; ?>
<?php elseif ($station->getOgnAircraftTypeName() != null) : ?>
<div>
<div class="overview-content-summary-hr">Тип самолёта:</div>
<div class="overview-content-station" title="Type of aircraft">
<?php echo htmlspecialchars($station->getOgnAircraftTypeName()); ?>
</div>
</div>
<?php else : ?>
<div>
<div class="overview-content-summary-hr">Символ:</div>
<div class="overview-content-station" title="Symbol type">
<img src="<?php echo $station->getIconFilePath(24, 24); ?>" alt="Latest symbol" />
<span>&nbsp;<?php echo htmlentities($station->getLatestSymbolDescription()); ?></span>
</div>
</div>
<?php endif; ?>
<!-- Latest Packet -->
<?php if ($station->latestPacketId !== null) : ?>
<?php $latestPacket = PacketRepository::getInstance()->getObjectById($station->latestPacketId, $station->latestPacketTimestamp); ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Последний пакет:</div>
<div class="overview-content-summary-cell-type overview-content-summary-indent"><?php echo $latestPacket->getPacketTypeName(); ?> </div>
</div>
<?php $latestPacketSender = SenderRepository::getInstance()->getObjectById($latestPacket->senderId); ?>
<?php if ($latestPacketSender->name != $station->name) : ?>
<div>
<div class="overview-content-summary-hr-indent">Отправитель:</div>
<div class="overview-content-summary-indent" title="Sender of current packet">
<?php $latestPacketSenderStation = StationRepository::getInstance()->getObjectByNameAndSenderId($latestPacketSender->name, $latestPacketSender->id); ?>
<?php if ($latestPacketSenderStation->isExistingObject()) : ?>
<a class="tdlink" title="Sender of the object" href="/views/overview.php?id=<?php echo $latestPacketSenderStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">
<?php echo htmlentities($latestPacketSenderStation->name); ?>
</a>
<?php else : ?>
<?php echo $latestPacketSender->name; ?>
<?php endif; ?>
</div>
</div>
<?php endif; ?>
<div>
<div class="overview-content-summary-hr-indent">Время получения:</div>
<div title="Timestamp of the latest packet" id="latest-timestamp" class="overview-content-summary-cell-time overview-content-summary-indent">
<?php echo $station->latestPacketTimestamp; ?>
</div>
</div>
<div>
<div class="overview-content-summary-hr-indent"></div>
<div title="Age of the latest packet" id="latest-timestamp-age" class="overview-content-summary-cell-time overview-content-summary-indent">
<?php echo $station->latestPacketTimestamp; ?>
</div>
</div>
<div>
<div class="overview-content-summary-hr-indent">Путь:</div>
<div class="overview-content-summary-cell-path overview-content-summary-indent" title="Latest path"><?php echo $latestPacket->rawPath; ?></div>
</div>
<?php if ($latestPacket->comment != '') : ?>
<div>
<div class="overview-content-summary-hr-indent">Комментарий:</div>
<div title="Comment found in thelatest packet" id="latest-packet-comment" class="overview-content-summary-indent">
<?php echo htmlentities($latestPacket->comment); ?>
</div>
</div>
<?php endif;?>
<?php if ($latestPacket->getPacketOgn()->isExistingObject()) : ?>
<div style="line-height: 8px">&nbsp;</div>
<?php if ($latestPacket->getPacketOgn()->ognSignalToNoiseRatio !== null) : ?>
<div>
<div class="overview-content-summary-hr-indent">Сигнал/шум:</div>
<div class="overview-content-summary-indent" title="Signal to Noise Ratio measured upon reception"><?php echo $latestPacket->getPacketOgn()->ognSignalToNoiseRatio; ?> дБ</div>
</div>
<?php endif;?>
<?php if ($latestPacket->getPacketOgn()->ognBitErrorsCorrected !== null) : ?>
<div>
<div class="overview-content-summary-hr-indent">Исправленные биты:</div>
<div class="overview-content-summary-indent" title="The number of bit errors corrected in the packet upon reception"><?php echo $latestPacket->getPacketOgn()->ognBitErrorsCorrected; ?></div>
</div>
<?php endif;?>
<?php if ($latestPacket->getPacketOgn()->ognFrequencyOffset !== null) : ?>
<div>
<div class="overview-content-summary-hr-indent">Разнос по частоте:</div>
<div class="overview-content-summary-indent" title="The frequency offset measured upon reception"><?php echo $latestPacket->getPacketOgn()->ognFrequencyOffset; ?> кГц</div>
</div>
<?php endif;?>
<?php endif;?>
<?php endif;?>
<!-- Latest Weather -->
<?php if ($station->latestWeatherPacketTimestamp !== null) : ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Последняя погода:</div>
<div id="weather-timestamp" class="overview-content-summary-cell-weather-time" title="Latest received weather">
<?php echo $station->latestWeatherPacketTimestamp; ?>
</div>
</div>
<?php if ($station->latestWeatherPacketComment != '') : ?>
<div>
<div class="overview-content-summary-hr-indent">Комментарий/ПО:</div>
<div class="overview-content-summary-cell-time overview-content-summary-indent" title="Weather packet comment/software">
<?php echo htmlentities($station->latestWeatherPacketComment); ?><br/>
</div>
</div>
<?php endif;?>
<?php endif;?>
<!-- Latest Telemetry -->
<?php if ($station->latestTelemetryPacketTimestamp !== null) : ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Последняя телеметрия:</div>
<div id="telemetry-timestamp" class="overview-content-summary-cell-telemetry-time" title="Latest received telemetry">
<?php echo $station->latestTelemetryPacketTimestamp; ?>
</div>
</div>
<?php endif;?>
<!-- Latest Position -->
<?php if ($station->latestConfirmedPacketId !== null) : ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Последняя позиция:</div>
<div id="overview-content-latest-position" class="overview-content-summary-cell-position" title="Latest position (that is approved by our filters)">
<?php echo round($station->latestConfirmedLatitude, 5); ?>, <?php echo round($station->latestConfirmedLongitude, 5); ?>
</div>
</div>
<div>
<div class="overview-content-summary-hr-indent">Время получения:</div>
<div id="position-timestamp" class="overview-content-summary-cell-time overview-content-summary-indent" title="Latest position receive time">
<?php if ($station->latestPacketId == $station->latestConfirmedPacketId && $station->latestPacketTimestamp == $station->latestConfirmedPacketTimestamp) : ?>
(получено в последнем пакете)
<?php else : ?>
<?php echo $station->latestConfirmedPacketTimestamp; ?>
<?php endif; ?>
</div>
</div>
<div>
<div class="overview-content-summary-hr">&nbsp;</div>
<div class="overview-content-summary-cell-position">
<a href="?sid=<?php echo $station->id; ?>" onclick="
if (window.parent && window.parent.trackdirect) {
$('.modal', parent.document).hide();
window.parent.trackdirect.filterOnStationId([]);
window.parent.trackdirect.filterOnStationId([<?php echo $station->id; ?>]);
return false;
}">Показать на карте</a>
</div>
</div>
<?php $latestConfirmedPacket = PacketRepository::getInstance()->getObjectById($station->latestConfirmedPacketId, $station->latestConfirmedPacketTimestamp); ?>
<?php if ($latestConfirmedPacket->isExistingObject() && $latestConfirmedPacket->posambiguity > 0) : ?>
<div>
<div class="overview-content-summary-hr-indent">Неоднозначное положение:</div>
<div class="overview-content-summary-cell-posambiguity overview-content-summary-indent" title="If posambiguity is active the gps position is inaccurate">Да</div>
</div>
<?php endif;?>
<?php if ($latestConfirmedPacket->isExistingObject()) : ?>
<?php if ($latestConfirmedPacket->speed != '' || $latestConfirmedPacket->course != '' || $latestConfirmedPacket->altitude != '') : ?>
<?php if (round($latestConfirmedPacket->speed) != 0 || round($latestConfirmedPacket->course) != 0 || round($latestConfirmedPacket->altitude) != 0) : ?>
<?php if ($latestConfirmedPacket->speed != '') : ?>
<div>
<div class="overview-content-summary-hr-indent">Скорость:</div>
<div title="Latest speed" class="overview-content-summary-indent">
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertKilometerToMile($latestConfirmedPacket->speed), 2); ?> миль/ч
<?php else : ?>
<?php echo round($latestConfirmedPacket->speed, 2); ?> км/ч
<?php endif; ?>
</div>
</div>
<?php endif;?>
<?php if ($latestConfirmedPacket->course != '') : ?>
<div>
<div class="overview-content-summary-hr-indent">Курс:</div>
<div title="Latest course" class="overview-content-summary-indent"><?php echo $latestConfirmedPacket->course; ?>&deg;</div>
</div>
<?php endif;?>
<?php if ($latestConfirmedPacket->altitude != '') : ?>
<div>
<div class="overview-content-summary-hr-indent">Высота:</div>
<div title="Latest altitude" class="overview-content-summary-indent">
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertMeterToFeet($latestConfirmedPacket->altitude), 2); ?> ф
<?php else : ?>
<?php echo round($latestConfirmedPacket->altitude, 2); ?> м
<?php endif; ?>
</div>
</div>
<?php endif;?>
<?php endif;?>
<?php endif;?>
<?php if ($latestConfirmedPacket->getPacketOgn()->isExistingObject()) : ?>
<?php if ($latestConfirmedPacket->getPacketOgn()->ognClimbRate !== null) : ?>
<div>
<div class="overview-content-summary-hr-indent">Набор высоты:</div>
<div class="overview-content-summary-indent" title="The climb rate in feet-per-minute"><?php echo $latestConfirmedPacket->getPacketOgn()->ognClimbRate; ?> ф/мин</div>
</div>
<?php endif;?>
<?php if ($latestConfirmedPacket->getPacketOgn()->ognTurnRate !== null) : ?>
<div>
<?php $turnRateNote = true; ?>
<div class="overview-content-summary-hr-indent">Скорость поворота:</div>
<div class="overview-content-summary-indent" title="Current turn rate."><?php echo $latestConfirmedPacket->getPacketOgn()->ognTurnRate; ?> rot</div>
</div>
<?php endif;?>
<?php endif;?>
<?php endif;?>
<?php endif;?>
<!-- Latest PHG and RNG -->
<?php if ($latestConfirmedPacket && $latestConfirmedPacket->isExistingObject()) : ?>
<?php if ($latestConfirmedPacket->phg != null || $latestConfirmedPacket->latestPhgTimestamp != null) : ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Последний PHG:</div>
<div class="overview-content-summary-cell-phg" title="Power-Height-Gain (and directivity)">
<?php echo $latestConfirmedPacket->getPHGDescription(true); ?><br/>
(расчётный диапазон:
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertKilometerToMile($latestConfirmedPacket->getPHGRange(true)/1000),2); ?> миль)
<?php else : ?>
<?php echo round($latestConfirmedPacket->getPHGRange(true)/1000,2); ?> км)
<?php endif; ?>
</div>
</div>
<?php endif;?>
<?php if ($latestConfirmedPacket->rng != null || $latestConfirmedPacket->latestRngTimestamp != null) : ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Последний RNG:</div>
<div class="overview-content-summary-cell-phg" title="The pre-calculated radio range">
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertKilometerToMile($latestConfirmedPacket->getRng(true)), 2); ?> миль
<?php else : ?>
<?php echo round($latestConfirmedPacket->getRng(true), 2); ?> км
<?php endif; ?>
</div>
</div>
<?php endif;?>
<?php endif;?>
<!-- Latest Symbols -->
<?php $stationLatestSymbols = $station->getLatestIconFilePaths(22, 22); ?>
<?php if ($stationLatestSymbols !== null && count($stationLatestSymbols) > 1) : ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Последние символы:</div>
<div title="Latest symbols that this station has used">
<?php foreach ($stationLatestSymbols as $symbolPath) : ?>
<img src="<?php echo $symbolPath; ?>" alt="Symbol"/>&nbsp;
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<!-- Packet Frequency -->
<?php $packetFrequencyNumberOfPackets = null; ?>
<?php $stationPacketFrequency = $station->getPacketFrequency(null, $packetFrequencyNumberOfPackets); ?>
<?php if ($stationPacketFrequency != null) : ?>
<div class="overview-content-divider"></div>
<div>
<div class="overview-content-summary-hr">Частота следования пакетов:</div>
<div class="overview-content-packet-frequency" title="Calculated packet frequency"><span><?php echo $stationPacketFrequency; ?> сек</span> <span>(последние <?php echo $packetFrequencyNumberOfPackets; ?> пакета(ов))</span></div>
</div>
<?php endif; ?>
<div class="overview-content-divider"></div>
</div>
<div class="overview-content-symbol" id ="overview-content-symbol-<?php echo $station->id; ?>">
<img src="<?php echo $station->getIconFilePath(150, 150); ?>" alt="Latest symbol" title="<?php echo $station->getLatestSymbolDescription(); ?>"/>
<?php if ($station->latestPacketId !== null) : ?>
<br/>
<div style="text-align: center; padding-top: 30px;">
<?php if ($station->getOgnDevice() !== null && $station->getOgnDevice()->registration != null) : ?>
<div>
Искать <a href="https://www.jetphotos.com/registration/<?php echo $station->getOgnDevice()->registration; ?>" target="_blank"><?php echo htmlspecialchars($station->getOgnDevice()->registration); ?></a> фото!
</div>
<?php endif; ?>
<?php if ($station->sourceId == 1) : ?>
<?php if ($station->getLiklyHamRadioCallsign() !== null) : ?>
<div>Искать <a href="https://www.qrz.com/db/<?php echo $station->getLiklyHamRadioCallsign(); ?>" target="_blank"><?php echo htmlspecialchars($station->getLiklyHamRadioCallsign()); ?></a> на QRZ</div>
<?php endif; ?>
<?php endif; ?>
<div>Экспорт <a href="/data/kml.php?id=<?php echo $station->id; ?>"><?php echo htmlspecialchars($station->name); ?></a> данных в KML</div>
</div>
<div style="clear: both;"></div>
<?php endif; ?>
</div>
<div class="horizontal-line">&nbsp;</div>
<div class="overview-content-summary">
<!-- Related stations -->
<?php $relatedStations = StationRepository::getInstance()->getRelatedObjectListByStationId($station->id, 15); ?>
<?php if (count($relatedStations) > 1) : ?>
<div>
<?php $relatedStattionNote = true; ?>
<div class="overview-content-summary-hr">Связанные станции/объекты:</div>
<div class="overview-content-station-list" title="Stations with same call except SSID or objects with related sender">
<?php foreach ($relatedStations as $relatedStation) : ?>
<?php if ($relatedStation->id != $station->id) : ?>
<img src="<?php echo $relatedStation->getIconFilePath(22, 22); ?>" alt="Symbol"/>&nbsp;
<span><a class="tdlink" href="/views/overview.php?id=<?php echo $relatedStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($relatedStation->name) ?></a></span>
<br/>
<?php endif; ?>
<?php endforeach; ?>
</div>
</div>
<div class="overview-content-divider"></div>
<?php endif; ?>
<!-- Close by stations -->
<?php $closeByStations = StationRepository::getInstance()->getCloseByObjectListByStationId($station->id, 15); ?>
<?php if (count($closeByStations) > 1) : ?>
<div>
<div class="overview-content-summary-hr">Ближайшие станции/объекты:</div>
<div class="overview-content-station-list" title="The closest stations/objects at the current position">
<?php foreach ($closeByStations as $closeByStation) : ?>
<?php if ($closeByStation->id != $station->id) : ?>
<img src="<?php echo $closeByStation->getIconFilePath(22, 22); ?>" alt="Symbol"/>&nbsp;
<span>
<a class="tdlink" href="/views/overview.php?id=<?php echo $closeByStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($closeByStation->name) ?></a>
<span>
<?php if (isImperialUnitUser()) : ?>
<?php if (convertMeterToYard($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude)) < 1000) : ?>
<?php echo round(convertMeterToYard($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude)), 0); ?> ярд
<?php else : ?>
<?php echo round(convertKilometerToMile($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude) / 1000), 2); ?> миль
<?php endif; ?>
<?php else : ?>
<?php if ($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude) < 1000) : ?>
<?php echo round($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude), 0); ?> м
<?php else : ?>
<?php echo round($closeByStation->getDistance($station->latestConfirmedLatitude, $station->latestConfirmedLongitude) / 1000, 2); ?> км
<?php endif; ?>
<?php endif; ?>
</span>
</span>
<br/>
<?php endif; ?>
<?php endforeach; ?>
</div>
</div>
<div class="overview-content-divider"></div>
<?php endif; ?>
</div>
<?php if (count($relatedStations) > 1 || count($closeByStations) > 1) : ?>
<div class="horizontal-line">&nbsp;</div>
<?php endif; ?>
</div>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('#overview-content-comment, #overview-content-beacon, #overview-content-status').each(function() {
if ($(this).html().trim() != '') {
$(this).html(Autolinker.link($(this).html()));
}
});
$('#latest-timestamp, #comment-timestamp, #status-timestamp, #beacon-timestamp, #position-timestamp, #weather-timestamp, #telemetry-timestamp').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
if ($('#latest-timestamp-age').length && $('#latest-timestamp-age').html().trim() != '' && !isNaN($('#latest-timestamp-age').html().trim())) {
$('#latest-timestamp-age').html(moment(new Date(1000 * $('#latest-timestamp-age').html())).locale('ru').fromNow());
}
if (window.parent && window.parent.trackdirect) {
<?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?>
window.parent.trackdirect.addListener("map-created", function() {
window.parent.trackdirect.focusOnStation(<?php echo $station->id ?>, true);
});
<?php endif; ?>
}
});
</script>
<?php endif; ?>

508
htdocs/public/views/raw.php Normal file
View File

@ -0,0 +1,508 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?>
<?php if ($station->isExistingObject()) : ?>
<?php
$page = $_GET['page'] ?? 1;
$rows = $_GET['rows'] ?? 25;
$offset = ($page - 1) * $rows;
if (($_GET['category'] ?? 1) == 2) {
$packets = PacketRepository::getInstance()->getObjectListWithRawBySenderStationId($station->id, $rows, $offset);
$count = PacketRepository::getInstance()->getNumberOfPacketsWithRawBySenderStationId($station->id);
} else {
$packets = PacketRepository::getInstance()->getObjectListWithRawByStationId($station->id, $rows, $offset);
$count = PacketRepository::getInstance()->getNumberOfPacketsWithRawByStationId($station->id);
}
$pages = ceil($count / $rows);
?>
<title><?php echo $station->name; ?>, сырые данные</title>
<div class="modal-inner-content">
<div class="modal-inner-content-menu">
<a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Подробнее</a>
<a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Статистика</a>
<a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Графики</a>
<a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Погода</a>
<a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Телеметрия</a>
<span>Сырые данные</span>
</div>
<div class="horizontal-line">&nbsp;</div>
<p>
Это последние полученные пакеты, хранящиеся в базе данных для станции/объекта <?php echo $station->name; ?>. Если пакеты не отображаются, значит отправитель не отправлял никаких пакетов за последние 30 дней. Или сервер не смог их принять.
</p>
<?php if ($station->sourceId == 5) : ?>
<p>
<a target="_blank" href="http://wiki.glidernet.org/ddb">База данных устройств OGN</a>
</p>
<?php else : ?>
<p>
Если сравнивать сырые данные с аналогичными данными с других сайтов, они могут отличаться (особенно путь), причина в том, что пакеты могут быть получены с разных серверов APRS-IS. Каждый APRS-IS сервер выполняет фильтрацию дубликатов, и пакет, который считается дубликатом, может по разному отбрасываться на разных серверах. Это влияет на то, какой из множества пакетов в итоге отобразится здесь.
</p>
<?php endif; ?>
<div class="form-container">
<?php if ($station->stationTypeId == 1) : ?>
<select id="raw-category" style="float:left; margin-right: 5px;">
<option <?php echo (($_GET['category'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Пакеты рядом с <?php echo $station->name; ?></option>
<option <?php echo (($_GET['category'] ?? 1) == 2 ? 'selected' : ''); ?> value="2">Пакеты, отправленные <?php echo $station->name; ?></option>
</select>
<?php endif; ?>
<select id="raw-type" style="float:left; margin-right: 5px;">
<option <?php echo (($_GET['type'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Сырые данные</option>
<option <?php echo (($_GET['type'] ?? 1) == 2 ? 'selected' : ''); ?> value="2">Декодированные данные</option>
</select>
<select id="raw-rows" style="float:left; margin-right: 5px;" class="pagination-rows">
<option <?php echo ($rows == 25 ? 'selected' : ''); ?> value="25">25 строк</option>
<option <?php echo ($rows == 50 ? 'selected' : ''); ?> value="50">50 строк</option>
<option <?php echo ($rows == 100 ? 'selected' : ''); ?> value="100">100 строк</option>
<option <?php echo ($rows == 200 ? 'selected' : ''); ?> value="200">200 строк</option>
<option <?php echo ($rows == 300 ? 'selected' : ''); ?> value="300">300 строк</option>
</select>
</div>
<?php if ($pages > 1): ?>
<div class="pagination">
<a class="tdlink" href="/views/raw.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1) ?>&type=<?php echo ($_GET['type'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=1"><<</a>
<?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?>
<a href="/views/raw.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1) ?>&type=<?php echo ($_GET['type'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a>
<?php endfor; ?>
<a class="tdlink" href="/views/raw.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1) ?>&type=<?php echo ($_GET['type'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $pages; ?>">>></a>
</div>
<?php endif; ?>
<div id="raw-content-output">
<?php foreach (array_slice($packets, 0, $rows) as $packet) : ?>
<?php if (($_GET['type'] ?? 1) == 1) : ?>
<p>
<span class="raw-packet-timestamp"><?php echo $packet->timestamp; ?></span>:
<?php if (in_array($packet->mapId, Array(3, 6))) : ?>
<span class="raw-packet-error">
<?php else : ?>
<span>
<?php endif; ?>
<?php echo str_replace_first(htmlspecialchars($station->name . '>'), '<b>' . htmlspecialchars($station->name) . '</b>&gt;', htmlspecialchars($packet->raw)); ?>
<?php if ($packet->mapId == 3) : ?>
&nbsp;<b>[Дубликат]</b>
<?php elseif ($packet->mapId == 6) : ?>
&nbsp;<b>[Получено в неправильном порядке]</b>
<?php endif; ?>
</span>
</p>
<?php elseif (($_GET['type'] ?? 1) == 2) : ?>
<div class="decoded">
<div class="datagrid">
<table>
<thead>
<tr>
<th colspan="2">
<?php if (in_array($packet->mapId, Array(3, 6))) : ?>
<span class="raw-packet-error">
<?php else : ?>
<span>
<?php endif; ?>
<span class="raw-packet-timestamp"><?php echo $packet->timestamp; ?></span>
<?php if ($packet->mapId == 3) : ?>
&nbsp;<b>[Дубликат]</b>
<?php elseif ($packet->mapId == 6) : ?>
&nbsp;<b>[Получено в неправильном порядке]</b>
<?php endif; ?>
</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>Необработанные</td>
<td>
<?php echo str_replace_first(htmlspecialchars($station->name . '>'), '<b>' . htmlspecialchars($station->name) . '</b>&gt;', htmlspecialchars($packet->raw)); ?>
</td>
</tr>
<tr><td>Тип пакета</td><td><?php echo $packet->getPacketTypeName(); ?></td></tr>
<?php if ($packet->getStationObject()->stationTypeId == 2) : ?>
<tr><td>Название объекта</td><td><?php echo htmlspecialchars($packet->getStationObject()->name); ?></td></tr>
<?php else : ?>
<tr><td>Позывной</td><td><?php echo htmlspecialchars($packet->getStationObject()->name); ?></td></tr>
<?php endif; ?>
<?php if ($packet->getStationObject()->name != $packet->getSenderObject()->name) : ?>
<tr><td>Отправитель</td><td><?php echo htmlspecialchars($packet->getSenderObject()->name); ?></td></tr>
<?php endif; ?>
<tr><td>Путь</td><td><?php echo htmlspecialchars($packet->rawPath); ?></td></tr>
<?php if ($packet->reportedTimestamp != null) : ?>
<tr><td>Переданное время</td><td><?php echo $packet->reportedTimestamp; ?> - <span class="raw-packet-timestamp"><?php echo $packet->reportedTimestamp; ?></span></td></tr>
<?php endif; ?>
<?php if ($packet->latitude != null && $packet->longitude != null) : ?>
<tr><td>Latitude</td><td><?php echo round($packet->latitude, 5); ?></td></tr>
<tr><td>Longitude</td><td><?php echo round($packet->longitude, 5); ?></td></tr>
<?php endif; ?>
<?php if ($packet->symbol != null && $packet->symbolTable != null) : ?>
<tr><td>Символ</td><td><?php echo htmlspecialchars($packet->symbol); ?></td></tr>
<tr><td>Таблица символов</td><td><?php echo htmlspecialchars($packet->symbolTable); ?></td></tr>
<?php endif; ?>
<?php if ($packet->speed != null) : ?>
<?php if (isImperialUnitUser()) : ?>
<tr><td>Скорость</td><td><?php echo convertKilometerToMile($packet->speed); ?> миль/ч</td></tr>
<?php else : ?>
<tr><td>Скорость</td><td><?php echo $packet->speed; ?> км/ч</td></tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($packet->course != null) : ?>
<tr><td>Курс</td><td><?php echo $packet->course; ?>°</td></tr>
<?php endif; ?>
<?php if ($packet->altitude != null) : ?>
<?php if (isImperialUnitUser()) : ?>
<tr><td>Высота</td><td><?php echo convertMeterToFeet($packet->altitude); ?> ф</td></tr>
<?php else : ?>
<tr><td>Высота</td><td><?php echo $packet->altitude; ?> м</td></tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($packet->comment != null) : ?>
<?php if ($packet->packetTypeId == 10) : ?>
<tr><td>Статус</td><td><?php echo htmlspecialchars($packet->comment); ?></td></tr>
<?php elseif ($packet->packetTypeId == 7) : ?>
<tr><td>Маяк</td><td><?php echo htmlspecialchars($packet->comment); ?></td></tr>
<?php else : ?>
<tr><td>Комментарий</td><td><?php echo htmlspecialchars($packet->comment); ?></td></tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($packet->posambiguity == 1) : ?>
<tr><td>Неоднозначность положения</td><td>Да</td></tr>
<?php endif; ?>
<?php if ($packet->phg != null) : ?>
<?php if (isImperialUnitUser()) : ?>
<tr><td>PHG</td><td><?php echo $packet->phg; ?> (Расчётный диапазон: <?php echo round(convertKilometerToMile($packet->getPHGRange()/1000),2); ?> миль)</td></tr>
<?php else : ?>
<tr><td>PHG</td><td><?php echo $packet->phg; ?> (Расчётный диапазон: <?php echo round($packet->getPHGRange()/1000,2); ?> км)</td></tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($packet->rng != null) : ?>
<tr><td>RNG</td><td><?php echo $packet->rng; ?></td></tr>
<?php endif; ?>
<?php if ($station->latestWeatherPacketTimestamp !== null) : ?>
<?php $weather = $packet->getPacketWeather(); ?>
<?php if ($weather->isExistingObject()) : ?>
<tr>
<td>Погода</td>
<td>
<table>
<tbody>
<?php if ($weather->wxRawTimestamp !== null) : ?>
<tr>
<td>Время:</td><td><span class="raw-packet-timestamp"><?php echo $weather->wxRawTimestamp; ?></span></td>
</tr>
<?php endif; ?>
<?php if ($weather->temperature !== null) : ?>
<tr>
<td>Температура:</td>
<?php if (isImperialUnitUser()) : ?>
<td><?php echo round(convertCelciusToFahrenheit($weather->temperature), 2); ?>&deg; F</td>
<?php else : ?>
<td><?php echo round($weather->temperature, 2); ?>&deg; C</td>
<?php endif; ?>
</tr>
<?php endif; ?>
<?php if ($weather->humidity !== null) : ?>
<tr>
<td>Влажность:</td>
<td><?php echo $weather->humidity; ?>%</td>
</tr>
<?php endif; ?>
<?php if ($weather->pressure !== null) : ?>
<tr>
<td>Давление:</td>
<?php if (isImperialUnitUser()) : ?>
<td><?php echo round(convertMbarToMmhg($weather->pressure),1); ?> мм.рт.ст.</td>
<?php else : ?>
<td><?php echo round($weather->pressure,1); ?> гПа</td>
<?php endif; ?>
</tr>
<?php endif; ?>
<?php if ($weather->rain_1h !== null) : ?>
<tr>
<td>Осадки за последний час:</td>
<?php if (isImperialUnitUser()) : ?>
<td><?php echo round(convertMmToInch($weather->rain_1h),2); ?> in</td>
<?php else : ?>
<td><?php echo round($weather->rain_1h,2); ?> мм</td>
<?php endif; ?>
</tr>
<?php endif; ?>
<?php if ($weather->rain_24h !== null) : ?>
<tr>
<td>Осадки за последние 24 ч:</td>
<?php if (isImperialUnitUser()) : ?>
<td><?php echo round(convertMmToInch($weather->rain_24h),2); ?> in</td>
<?php else : ?>
<td><?php echo round($weather->rain_24h,2); ?> мм</td>
<?php endif; ?>
</tr>
<?php endif; ?>
<?php if ($weather->rain_since_midnight !== null) : ?>
<tr>
<td>Осадки с полуночи:</td>
<?php if (isImperialUnitUser()) : ?>
<td><?php echo round(convertMmToInch($weather->rain_since_midnight),2); ?> in</td>
<?php else : ?>
<td><?php echo round($weather->rain_since_midnight,2); ?> мм</td>
<?php endif; ?>
</tr>
<?php endif; ?>
<?php if (isImperialUnitUser()) : ?>
<?php if ($weather->wind_speed !== null && $weather->wind_speed > 0) : ?>
<tr>
<td>Скорость ветра:</td>
<td><?php echo round(convertMpsToMph($weather->wind_speed), 2); ?> миль/ч, <?php echo $weather->wind_direction; ?>&deg;</td>
</tr>
<?php elseif($weather->wind_speed !== null) : ?>
<tr>
<td>Скорость ветра:</td>
<td><?php echo round(convertMpsToMph($weather->wind_speed), 2); ?> миль/ч</td>
</tr>
<?php endif; ?>
<?php else : ?>
<?php if ($weather->wind_speed !== null && $weather->wind_speed > 0) : ?>
<tr>
<td>Скорость ветра:</td>
<td><?php echo round($weather->wind_speed, 2); ?> м/с, <?php echo $weather->wind_direction; ?>&deg;</td>
</tr>
<?php elseif($weather->wind_speed !== null) : ?>
<tr>
<td>Скорость ветра:</td>
<td><?php echo round($weather->wind_speed, 2); ?> м/с</td>
</tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($weather->luminosity !== null) : ?>
<tr>
<td>Освещённость:</td><td><?php echo round($weather->luminosity,0); ?> Вт/м&sup2;</td>
</tr>
<?php endif; ?>
<?php if ($weather->snow !== null) : ?>
<tr>
<?php if (isImperialUnitUser()) : ?>
<td>Снег:</td><td><?php echo round(convertMmToInch($weather->snow), 0); ?> in</td>
<?php else : ?>
<td>Снег:</td><td><?php echo round($weather->snow, 0); ?> мм</td>
<?php endif; ?>
</tr>
<?php endif; ?>
</tbody>
</table>
</td>
</tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($station->latestTelemetryPacketTimestamp !== null) : ?>
<?php $telemetry = $packet->getPacketTelemetry(); ?>
<?php if ($telemetry->isExistingObject()) : ?>
<tr>
<td>Аналоговые значения телеметрии</td>
<td>
<table>
<tbody>
<?php for ($i = 1; $i<=5; $i++) : ?>
<?php if ($telemetry->isValueSet($i)) : ?>
<tr>
<td><?php echo htmlspecialchars($telemetry->getValueParameterName($i)); ?>:</td>
<td><?php echo round($telemetry->getValue($i), 2); ?> <?php echo htmlspecialchars($telemetry->getValueUnit($i)); ?></td>
</tr>
<?php endif; ?>
<?php endfor; ?>
</tbody>
</table>
</td>
</tr>
<?php if ($telemetry->bits !== null) : ?>
<tr>
<td>Значения битов телеметрии</td>
<td>
<table>
<tbody>
<?php for ($i = 1; $i<=8; $i++) : ?>
<tr>
<td><?php echo htmlspecialchars($telemetry->getBitParameterName($i)); ?>:</td>
<td><?php echo $telemetry->getBit($i); ?></td>
</tr>
<?php endfor; ?>
</tbody>
</table>
</td>
</tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':UNIT.')) : ?>
<?php $pos = strpos($packet->raw, ':UNIT.'); ?>
<tr>
<td>Телеметрия: единицы</td>
<td>
<?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?>
</td>
</tr>
<?php endif; ?>
<?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':BITS.')) : ?>
<?php $pos = strpos($packet->raw, ':BITS.'); ?>
<tr>
<td>Телеметрия: биты</td>
<td>
<?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?>
</td>
</tr>
<?php endif; ?>
<?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':EQNS.')) : ?>
<?php $pos = strpos($packet->raw, ':EQNS.'); ?>
<tr>
<td>Телеметрия: EQNS</td>
<td>
<?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?>
</td>
</tr>
<?php endif; ?>
<?php if ($packet->packetTypeId == 7 && strstr($packet->raw, ':PARM.')) : ?>
<?php $pos = strpos($packet->raw, ':PARM.'); ?>
<tr>
<td>Телеметрия: PARM</td>
<td>
<?php echo htmlspecialchars(substr($packet->raw, $pos + 6)); ?>
</td>
</tr>
<?php endif; ?>
<?php endif; ?>
<?php if ($packet->getPacketOgn()->isExistingObject()) : ?>
<?php if ($packet->getPacketOgn()->ognSignalToNoiseRatio !== null) : ?>
<tr>
<td>Отношение сигнал/шум</td>
<td>
<?php echo $packet->getPacketOgn()->ognSignalToNoiseRatio; ?> dB
</td>
</tr>
<?php endif;?>
<?php if ($packet->getPacketOgn()->ognBitErrorsCorrected !== null) : ?>
<tr>
<td>Bits corrected</td>
<td>
<?php echo $packet->getPacketOgn()->ognBitErrorsCorrected; ?>
</td>
</tr>
<?php endif;?>
<?php if ($packet->getPacketOgn()->ognFrequencyOffset !== null) : ?>
<tr>
<td>Разнос частоты</td>
<td>
<?php echo $packet->getPacketOgn()->ognFrequencyOffset; ?> кГц
</td>
</tr>
<?php endif;?>
<?php if ($packet->getPacketOgn()->ognClimbRate !== null) : ?>
<tr>
<td>Скорость набора высоты</td>
<td>
<?php echo $packet->getPacketOgn()->ognClimbRate; ?> ф/м
</td>
</tr>
<?php endif;?>
<?php if ($packet->getPacketOgn()->ognTurnRate !== null) : ?>
<tr>
<td>Скорость поворота</td>
<td>
<?php echo $packet->getPacketOgn()->ognTurnRate; ?> ф/м
</td>
</tr>
<?php endif;?>
<?php endif;?>
</tbody>
</table>
</div>
</div>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php if (count($packets) == 0) : ?>
<p>
<b><i>Не найдено сырых данных.</i></b>
</p>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('.raw-packet-timestamp').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
$('#raw-category').change(function () {
loadView("/views/raw.php?id=<?php echo $station->id ?>&type=" + $('#raw-type').val() + "&category=" + $('#raw-category').val() + "&rows=" + $('#raw-rows').val() + "&page=1");
});
$('#raw-type').change(function () {
loadView("/views/raw.php?id=<?php echo $station->id ?>&type=" + $('#raw-type').val() + "&category=" + $('#raw-category').val() + "&rows=" + $('#raw-rows').val() + "&page=1");
});
$('#raw-rows').change(function () {
loadView("/views/raw.php?id=<?php echo $station->id ?>&type=" + $('#raw-type').val() + "&category=" + $('#raw-category').val() + "&rows=" + $('#raw-rows').val() + "&page=1");
});
if (window.parent && window.parent.trackdirect) {
<?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?>
window.parent.trackdirect.addListener("map-created", function() {
window.parent.trackdirect.focusOnStation(<?php echo $station->id ?>, true);
});
<?php endif; ?>
}
});
</script>
<?php endif; ?>

View File

@ -0,0 +1,132 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php
$stations = [];
$seconds = $_GET['seconds'] ?? 0;
$page = $_GET['page'] ?? 1;
$rows = $_GET['rows'] ?? 50;
$offset = ($page - 1) * $rows;
$count = 0;
if (isset($_GET['q'])) {
$stations = StationRepository::getInstance()->getObjectListByQueryString($_GET['q'], $seconds, $rows, $offset);
$count = StationRepository::getInstance()->getNumberOfStationsByQueryString($_GET['q'], $seconds);
}
$pages = ceil($count / $rows);
?>
<title>Поиск объектов</title>
<div class="modal-inner-content" style="padding-bottom: 30px;">
<p>
Введите начало позывного/идентификатора станции (или просто нажмите «Ок», чтобы просмотреть все).
</p>
<form id="station-search-form" method="get" action="">
<div style="margin-bottom: 5px;">
<select name ="seconds" style="width: 280px;" id="station-search-form-seconds">
<option <?php echo ($seconds == 0 ? 'selected' : ''); ?> value="0">Включить в поиск все известные станции</option>
<option <?php echo ($seconds == 60 ? 'selected' : ''); ?> value="60">Только станции, активные в последний час</option>
<option <?php echo ($seconds == 360 ? 'selected' : ''); ?> value="360">Только станции, активные в последние 6 часов</option>
<option <?php echo ($seconds == 720 ? 'selected' : ''); ?> value="720">Только станции, активные в последние 12 часов</option>
</select>
</div>
<div>
<input type="text" style="width: 280px; margin-bottom: 5px;" id="station-search-form-q" name="q" placeholder="Поиск" title="Search for a station/vehicle here!" value="<?php echo ($_GET['q'] ?? '') ?>">
<input type="submit" value="Ок">
</div>
</form>
<div style="clear: both;"></div>
<?php if (count($stations) > 0) : ?>
<p>
<?php echo $count; ?> найдено:
</p>
<?php if ($pages > 1): ?>
<div class="pagination">
<a class="tdlink" href="/search.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=1"><<</a>
<?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?>
<a href="/search.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a>
<?php endfor; ?>
<a class="tdlink" href="/search.php?q=<?php echo ($_GET['q'] ?? "") ?>&seconds=<?php echo $seconds ?>&page=<?php echo $pages; ?>">>></a>
</div>
<?php endif; ?>
<div class="datagrid datagrid-search" style="max-width:1000px;">
<table>
<thead>
<tr>
<th>&nbsp;</th>
<th>Позывной</th>
<th>Последний пакет</th>
<th>Комментарий/инфо</th>
<th>На карте</th>
</tr>
</thead>
<tbody>
<?php foreach ($stations as $foundStation) : ?>
<tr>
<td>
<img src="<?php echo $foundStation->getIconFilePath(22, 22); ?>" alt="Symbol"/>
</td>
<td>
<a class="tdlink" href="/views/overview.php?id=<?php echo $foundStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($foundStation->name) ?></a>
</td>
<td class="station-latest-heard-timestamp" style="white-space: nowrap;">
<?php echo $foundStation->latestConfirmedPacketTimestamp; ?>
</td>
<td>
<?php if ($foundStation->sourceId == 5 && $foundStation->getOgnDevice() !== null) : ?>
<div style="width: 100px; display: inline-block;">Регистрация:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->registration); ?> <?php echo $foundStation->getOgnDevice()->cn ? '[' .htmlspecialchars($foundStation->getOgnDevice()->cn) . ']' : ''; ?><br/>
<div style="width: 100px; display: inline-block;">Модель самолёта:</div><?php echo htmlspecialchars($foundStation->getOgnDevice()->aircraftModel); ?>
<?php else : ?>
<?php $latestPacket = PacketRepository::getInstance()->getObjectById($foundStation->latestPacketId, $foundStation->latestPacketTimestamp); ?>
<?php echo htmlspecialchars($latestPacket->comment); ?>
<?php endif; ?>
</td>
<td>
<?php if ($foundStation->latestConfirmedPacketTimestamp > (time() - 60*60*72)) : ?>
<a href="?sid=<?php echo $foundStation->id; ?>" onclick="
if (window.parent && window.parent.trackdirect) {
$('.modal', parent.document).hide();
window.parent.trackdirect.filterOnStationId([]);
window.parent.trackdirect.filterOnStationId([<?php echo $foundStation->id; ?>]);
return false;
}">Показать</a>
<?php else : ?>
&nbsp;
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
<?php if (isset($_GET['q']) && count($stations) == 0) : ?>
<p>
<b><i>Пакеты не найдены</i></b>
</p>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('.station-latest-heard-timestamp').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
$('#station-search-form').bind('submit',function(e) {
var q = $('#station-search-form-q').val();
var seconds = $('#station-search-form-seconds').val();
loadView('/views/search.php?q=' + q + '&seconds=' + seconds);
e.preventDefault();
});
});
</script>

View File

@ -0,0 +1,145 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?>
<?php if ($station->isExistingObject()) : ?>
<?php
$days = 10;
if (!isAllowedToShowOlderData()) {
$days = 1;
}
?>
<?php $senderStats = PacketPathRepository::getInstance()->getSenderPacketPathSatistics($station->id, time() - (60*60*24*$days)); ?>
<?php $receiverStats = PacketPathRepository::getInstance()->getReceiverPacketPathSatistics($station->id, time() - (60*60*24*$days)); ?>
<title><?php echo $station->name; ?>, статистика</title>
<div class="modal-inner-content">
<div class="modal-inner-content-menu">
<a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Подробнее</a>
<span>Статистика</span>
<a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Графики</a>
<a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Погода</a>
<a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Телеметрия</a>
<a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Сырые данные</a>
</div>
<div class="horizontal-line">&nbsp;</div>
<?php if (count($senderStats) > 0) : ?>
<p>Принятые станции <?php echo htmlspecialchars($station->name) ?> <b>напрямую</b> в течение последних <?php echo $days; ?> дней.</p>
<div class="datagrid datagrid-statistics" style="max-width:700px;">
<table>
<thead>
<tr>
<th>Станция</th>
<th>Количество пакетов</th>
<th>Последний пакет</th>
<th>Максимальное расстояние</th>
</tr>
</thead>
<tbody>
<?php foreach ($senderStats as $stats) : ?>
<?php $otherStation = StationRepository::getInstance()->getObjectById($stats["station_id"]) ?>
<tr>
<td>
<img alt="Symbol" src="<?php echo $otherStation->getIconFilePath(22, 22); ?>" style="vertical-align: middle;"/>&nbsp;
<a class="tdlink" href="/views/overview.php?id=<?php echo $otherStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($otherStation->name) ?></a>
</td>
<td>
<?php echo $stats["number_of_packets"]; ?>
</td>
<td class="latest-heard">
<?php echo $stats["latest_timestamp"];?>
</td>
<td class="longest-distance">
<?php if ($stats["longest_distance"] !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertKilometerToMile($stats["longest_distance"] / 1000), 2); ?> миль
<?php else : ?>
<?php echo round($stats["longest_distance"] / 1000, 2); ?> км
<?php endif; ?>
<?php else : ?>
&nbsp;
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<br/>
<?php endif; ?>
<?php if (count($receiverStats) > 0) : ?>
<p>Станции, <b>напрямую</b> принятые <?php echo htmlspecialchars($station->name); ?> в течение последних <?php echo $days; ?> дней.</p>
<div class="datagrid datagrid-statistics" style="max-width:700px;">
<table>
<thead>
<tr>
<th>Станция</th>
<th>Количество пакетов</th>
<th>Последний пакет</th>
<th>Максимальное расстояние</th>
</tr>
</thead>
<tbody>
<?php foreach ($receiverStats as $stats) : ?>
<?php $otherStation = StationRepository::getInstance()->getObjectById($stats["station_id"]) ?>
<tr>
<td>
<img alt="Symbol" src="<?php echo $otherStation->getIconFilePath(22, 22); ?>" style="vertical-align: middle;"/>&nbsp;
<a class="tdlink" href="/views/overview.php?id=<?php echo $otherStation->id; ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>"><?php echo htmlentities($otherStation->name) ?></a>
</td>
<td>
<?php echo $stats["number_of_packets"]; ?>
</td>
<td class="latest-heard">
<?php echo $stats["latest_timestamp"];?>
</td>
<td class="longest-distance">
<?php if ($stats["longest_distance"] !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertKilometerToMile($stats["longest_distance"] / 1000), 2); ?> миль
<?php else : ?>
<?php echo round($stats["longest_distance"] / 1000, 2); ?> км
<?php endif; ?>
<?php else : ?>
&nbsp;
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<br/>
<?php endif; ?>
<?php if (count($senderStats) == 0 && count($receiverStats) == 0): ?>
<p><i><b>Нет статистики за последние <?php echo $days; ?> дней.</b></i></p>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('.latest-heard').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
if (window.parent && window.parent.trackdirect) {
<?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?>
window.parent.trackdirect.addListener("map-created", function() {
window.parent.trackdirect.focusOnStation(<?php echo $station->id ?>, true);
});
<?php endif; ?>
}
});
</script>
<?php endif; ?>

View File

@ -0,0 +1,285 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?>
<?php if ($station->isExistingObject()) : ?>
<?php
$maxDays = 10;
if (!isAllowedToShowOlderData()) {
$maxDays = 1;
}
$page = $_GET['page'] ?? 1;
$rows = $_GET['rows'] ?? 25;
$offset = ($page - 1) * $rows;
$telemetryPackets = PacketTelemetryRepository::getInstance()->getLatestObjectListByStationId($station->id, $rows, $offset, $maxDays);
$latestPacketTelemetry = (count($telemetryPackets) > 0 ? $telemetryPackets[0] : new PacketTelemetry(null));
$count = PacketTelemetryRepository::getInstance()->getLatestNumberOfPacketsByStationId($station->id, $maxDays);
$pages = ceil($count / $rows);
?>
<title><?php echo $station->name; ?>, телеметрия</title>
<div class="modal-inner-content">
<div class="modal-inner-content-menu">
<a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Подробнее</a>
<a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Статистика</a>
<a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Графики</a>
<a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Погода</a>
<span>Телеметрия</span>
<a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Сырые данные</a>
</div>
<div class="horizontal-line">&nbsp;</div>
<?php if (count($telemetryPackets) > 0) : ?>
<p>Это последние полученные пакеты телеметрии, хранящиеся в базе данных для станции/объекта <?php echo $station->name; ?>. Если пакеты не отображаются, значит отправитель не передавал никакой телеметрии в последние <?php echo $maxDays; ?> дня/дней. Или сервер не смог их принять.</p>
<p>Пакеты телеметрии используются для обмена измерениями, такими как параметры ретранслятора, напряжение батареи, показания радиации (или любые другие измерения).</p>
<div class="form-container">
<select id="telemetry-category" style="float:left; margin-right: 5px;">
<option <?php echo (($_GET['category'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Значения телеметрии</option>
<option <?php echo (($_GET['category'] ?? 1) == 2 ? 'selected' : ''); ?> value="2">Биты телеметрии</option>
</select>
<select id="telemetry-rows" style="float:left; margin-right: 5px;" class="pagination-rows">
<option <?php echo ($rows == 25 ? 'selected' : ''); ?> value="25">25 строк</option>
<option <?php echo ($rows == 50 ? 'selected' : ''); ?> value="50">50 строк</option>
<option <?php echo ($rows == 100 ? 'selected' : ''); ?> value="100">100 строк</option>
<option <?php echo ($rows == 200 ? 'selected' : ''); ?> value="200">200 строк</option>
<option <?php echo ($rows == 300 ? 'selected' : ''); ?> value="300">300 строк</option>
</select>
</div>
<?php if ($pages > 1): ?>
<div class="pagination">
<a class="tdlink" href="/views/telemetry.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=1"><<</a>
<?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?>
<a href="/views/telemetry.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a>
<?php endfor; ?>
<a class="tdlink" href="/views/telemetry.php?id=<?php echo $station->id; ?>&category=<?php echo ($_GET['category'] ?? 1); ?>&rows=<?php echo $rows; ?>&page=<?php echo $pages; ?>">>></a>
</div>
<?php endif; ?>
<?php if (($_GET['category'] ?? 1) == 1) : ?>
<div class="datagrid datagrid-telemetry1" style="max-width:1000px;">
<table>
<thead>
<tr>
<th>Время</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(1)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(2)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(3)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(4)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(5)); ?>*</th>
</tr>
</thead>
<tbody>
<?php foreach ($telemetryPackets as $packetTelemetry) : ?>
<tr>
<td class="telemetrytime">
<?php echo ($packetTelemetry->wxRawTimestamp != null?$packetTelemetry->wxRawTimestamp:$packetTelemetry->timestamp); ?>
</td>
<td>
<?php if ($packetTelemetry->val1 !== null) : ?>
<?php echo round($packetTelemetry->getValue(1), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(1)); ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<td>
<?php if ($packetTelemetry->val1 !== null) : ?>
<?php echo round($packetTelemetry->getValue(2), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(2)); ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<td>
<?php if ($packetTelemetry->val1 !== null) : ?>
<?php echo round($packetTelemetry->getValue(3), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(3)); ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<td>
<?php if ($packetTelemetry->val1 !== null) : ?>
<?php echo round($packetTelemetry->getValue(4), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(4)); ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<td>
<?php if ($packetTelemetry->val1 !== null) : ?>
<?php echo round($packetTelemetry->getValue(5), 2); ?> <?php echo htmlspecialchars($packetTelemetry->getValueUnit(5)); ?>
<?php else : ?>
-
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="telemetry-subtable">
<div>
<div>
*Используемые коэффициенты уравнения:
</div>
<div>
<?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(1)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(1)); ?>
</div>
<div>
<?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(2)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(2)); ?>
</div>
<div>
<?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(3)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(3)); ?>
</div>
<div>
<?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(4)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(4)); ?>
</div>
<div>
<?php echo htmlspecialchars($latestPacketTelemetry->getValueParameterName(5)); ?>: <?php echo implode(', ', $latestPacketTelemetry->getEqnsValue(5)); ?>
</div>
</div>
</div>
<?php endif; ?>
<?php if (($_GET['category'] ?? 1) == 2) : ?>
<div class="datagrid datagrid-telemetry2" style="max-width:1000px;">
<table>
<thead>
<tr>
<th>Время</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(1)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(2)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(3)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(4)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(5)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(6)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(7)); ?>*</th>
<th><?php echo htmlspecialchars($latestPacketTelemetry->getBitParameterName(8)); ?>*</th>
</tr>
</thead>
<tbody>
<?php foreach ($telemetryPackets as $i => $packetTelemetry) : ?>
<?php if ($packetTelemetry->bits !== null && $i >= 2 ) : ?>
<tr>
<td class="telemetrytime">
<?php echo $packetTelemetry->timestamp; ?>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(1) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(1)); ?>
</div>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(2) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(2)); ?>
</div>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(3) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(3)); ?>
</div>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(4) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(4)); ?>
</div>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(5) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(5)); ?>
</div>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(6) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(6)); ?>
</div>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(7) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(7)); ?>
</div>
</td>
<td>
<div class="<?php echo ($packetTelemetry->getBit(8) == 1?'telemetry-biton':'telemetry-bitoff'); ?>">
<?php echo htmlspecialchars($packetTelemetry->getBitLabel(8)); ?>
</div>
</td>
</tr>
<?php endif; ?>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="telemetry-subtable">
<div>
<div>
*Используемое битовое значение:
</div>
<div>
<?php echo $latestPacketTelemetry->getBitSense(1); ?>
<?php echo $latestPacketTelemetry->getBitSense(2); ?>
<?php echo $latestPacketTelemetry->getBitSense(3); ?>
<?php echo $latestPacketTelemetry->getBitSense(4); ?>
<?php echo $latestPacketTelemetry->getBitSense(5); ?>
<?php echo $latestPacketTelemetry->getBitSense(6); ?>
<?php echo $latestPacketTelemetry->getBitSense(7); ?>
<?php echo $latestPacketTelemetry->getBitSense(8); ?>
</div>
</div>
</div>
<?php endif; ?>
<?php endif; ?>
<?php if (count($telemetryPackets) > 0) : ?>
<br/>
<ul>
<li>Имена параметров для аналоговых каналов будут Value1 (значение1), Value2 (значение2), Value3 (значение3 и т. д.) до Value5, если станция не отправила пакет PARAM, в котором указаны имена параметров для каждого аналогового канала.</li>
<li>Каждое аналоговое значение представляет собой десятичное число от 000 до 255 (в соответствии со спецификациями APRS). Приемник использует коэффициенты уравнения телеметрии, чтобы восстановить исходные значения датчика. Если EQNS-пакет с коэффициентами уравнения не отправлен, будет показано значение как есть (это соответствует коэффициентам уравнения a=0, b=1 и c=0).<br/>Отправленные коэффициенты уравнения используются в уравнении: a * значение<sup>2</sup> + b * значение + c.</li>
<li>Единицы для аналоговых значений не будут показаны, если станция не отправила UNIT-пакет, указывающий, какие единицы использовать.</li>
<li>Имена параметров для цифровых битов будут такими: Bit1, Bit2, Bit3 (до Bit8), если станция не отправила пакет PARAM, определяющий имена параметров для каждого цифрового бита.</li>
<li>Все битовые метки будут называться "On" (включено), если станция не отправила UNIT-пакет, в котором указана метка каждого бита.</li>
<li>Бит считается <b>On</b> (включенным), когда он равен 1, если станция не отправила пакет BITS, который указывает другой «смысл бита» (пакет BITS показывает состояние битов, которые соответствуют биту метки)</li>
</ul>
<?php endif; ?>
<?php if (count($telemetryPackets) == 0) : ?>
<p><i><b>Нет последних значений телеметрии.</b></i></p>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('.telemetrytime').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
$('#telemetry-category').change(function () {
loadView("/views/telemetry.php?id=<?php echo $station->id ?>&category=" + $('#telemetry-category').val() + "&rows=" + $('#telemetry-rows').val() + "&page=1");
});
$('#telemetry-rows').change(function () {
loadView("/views/telemetry.php?id=<?php echo $station->id ?>&category=" + $('#telemetry-category').val() + "&rows=" + $('#telemetry-rows').val() + "&page=1");
});
if (window.parent && window.parent.trackdirect) {
<?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?>
window.parent.trackdirect.addListener("map-created", function() {
window.parent.trackdirect.focusOnStation(<?php echo $station->id ?>, true);
});
<?php endif; ?>
}
});
</script>
<?php endif; ?>

View File

@ -0,0 +1,192 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?>
<?php if ($station->isExistingObject()) : ?>
<title><?php echo $station->name; ?>, графики</title>
<div class="modal-inner-content">
<div class="modal-inner-content-menu">
<a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Подробнее</a>
<a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Статистика</a>
<span>Графики</span>
<a class="tdlink" title="Weather" href="/views/weather.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Погода</a>
<a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Телеметрия</a>
<a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Сырые данные</a>
</div>
<div class="horizontal-line">&nbsp;</div>
<p>
Показать диаграмму для:
</p>
<div class="form-container">
<select id="trail-type" style="float:left; margin-right: 5px;">
<option <?php echo (($_GET['type'] ?? 'speed') == 'speed' ? 'selected' : ''); ?> value="speed">Скорость</option>
<option <?php echo (($_GET['type'] ?? 'speed') == 'altitude' ? 'selected' : ''); ?> value="altitude">Высота</option>
</select>
<select id="trail-hours" style="float:left; margin-right: 5px;">
<option <?php echo (($_GET['hours'] ?? 1) == 1 ? 'selected' : ''); ?> value="1">Последний час</option>
<option <?php echo (($_GET['hours'] ?? 1) == 3 ? 'selected' : ''); ?> value="3">Последние 3 часа</option>
<option <?php echo (($_GET['hours'] ?? 1) == 24 ? 'selected' : ''); ?> value="24">Последние 24 часа</option>
</select>
</div>
<div style="clear: both;"></div>
<div id="trail-curve-chart" style="width:850px; height: 350px;"></div>
<p>
*ось x диаграммы основана на вашем часовом поясе (а не на часовом поясе станции).
</p>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('.raw-packet-timestamp').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
if (window.parent && window.parent.trackdirect) {
<?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?>
window.parent.trackdirect.addListener("map-created", function() {
window.parent.trackdirect.focusOnStation(<?php echo $station->id ?>, true);
});
<?php endif; ?>
}
function loadTrailChart(stationId, hours, type, imperialUnits) {
$('#trail-curve-chart').html('Загрузка');
$.ajax({
type: 'GET',
url: '/data/trail.php?id=' + stationId + '&hours=' + hours + '&type=' + type + '&imperialUnits=' + imperialUnits,
dataType: 'json'
}).done(function( result ) {
var onlyZeroValues = true;
for(i=1; i < result.length; i++) {
if (result[i][0] === parseInt(result[i][0], 10)) {
result[i][0] = new Date(result[i][0] * 1000);
}
if (result[i][1] != 0 && result[i][1] != null) {
onlyZeroValues = false;
}
}
var endTimestamp = new Date();
var startTimestamp = new Date(endTimestamp.getTime() - 1000*60*60*hours);
if (result != null && result.length > 1) {
google.charts.setOnLoadCallback(
function () {
var data = google.visualization.arrayToDataTable(result);
var pointSize = 0; // default
var dataOpacity = 1;
var trigger = 'selection';
var series = {
0: { lineWidth: 2},
1: { lineWidth: 1, color: 'darkgreen'},
};
var legend = {position: 'none'};
var title = result[0][1];
var curveType = 'none'; // can be 'function' or 'none'
var vAxis = {};
var hAxis = {
minValue: startTimestamp,
maxValue: endTimestamp
};
var explorer = {
axis: 'horizontal',
keepInBounds:true,
maxZoomIn: 50,
maxZoomOut: 1,
actions: ['dragToPan', 'rightClickToReset']
};
explorer = null;
if (result[0].length > 2) {
// We need to show legend if we plot more than one thing
legend = {position: 'top'};
title = null;
}
if (onlyZeroValues) {
// dot chart with big dots
var series = {
0: { lineWidth: 0, pointsVisible: true, pointSize: 4 },
}
} else if (hours < 24) {
// line chart
var series = {
0: { lineWidth: 2, pointsVisible: false},
}
} else {
// dot chart
var series = {
0: { lineWidth: 0, pointsVisible: true, pointSize: 1 },
}
}
if (type == 'speed') {
// I'm pretty sure we won't have negative speed
var vAxis = {
viewWindow : {
min: 0
}
};
}
var chartArea = {'width': '90%', 'height': '80%', 'left': '8%'};
var options = {
title: title,
curveType: curveType,
tooltip : {
trigger: trigger
},
pointsVisible : false,
pointSize: pointSize,
dataOpacity: dataOpacity,
series: series,
chartArea: chartArea,
legend: legend,
hAxis: hAxis,
vAxis: vAxis,
interpolateNulls: false,
crosshair: {
trigger: 'focus',
opacity: 0.5
},
explorer: explorer
};
var chart = new google.visualization.LineChart(document.getElementById('trail-curve-chart'));
chart.draw(data, options);
});
} else {
$('#trail-curve-chart').html('<br/><p><i><b>Нет данных для создания диаграммы.</b></i></p>');
}
});
}
$('#trail-hours').change(function() {
loadTrailChart(<?php echo $station->id; ?>, $('#trail-hours').val(), $('#trail-type').val(), <?php echo $_GET['imperialUnits'] ?? 0; ?>);
});
$('#trail-type').change(function() {
loadTrailChart(<?php echo $station->id; ?>, $('#trail-hours').val(), $('#trail-type').val(), <?php echo $_GET['imperialUnits'] ?? 0; ?>);
});
loadTrailChart(<?php echo $station->id; ?>, $('#trail-hours').val(), $('#trail-type').val(), <?php echo $_GET['imperialUnits'] ?? 0; ?>);
});
</script>
<?php endif; ?>

View File

@ -0,0 +1,237 @@
<?php require dirname(__DIR__) . "../../includes/bootstrap.php"; ?>
<?php $station = StationRepository::getInstance()->getObjectById($_GET['id'] ?? null); ?>
<?php if ($station->isExistingObject()) : ?>
<?php
$maxDays = 10;
if (!isAllowedToShowOlderData()) {
$maxDays = 1;
}
$page = $_GET['page'] ?? 1;
$rows = $_GET['rows'] ?? 25;
$offset = ($page - 1) * $rows;
$weatherPackets = PacketWeatherRepository::getInstance()->getLatestObjectListByStationIdAndLimit($station->id, $rows, $offset, $maxDays);
$count = PacketWeatherRepository::getInstance()->getLatestNumberOfPacketsByStationIdAndLimit($station->id, $maxDays);
$pages = ceil($count / $rows);
?>
<title><?php echo $station->name; ?>, погода</title>
<div class="modal-inner-content">
<div class="modal-inner-content-menu">
<a class="tdlink" title="Overview" href="/views/overview.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Подробнее</a>
<a class="tdlink" title="Statistics" href="/views/statistics.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Статистика</a>
<a class="tdlink" title="Trail Chart" href="/views/trail.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Графики</a>
<span>Погода</span>
<a class="tdlink" title="Telemetry" href="/views/telemetry.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Телеметрия</a>
<a class="tdlink" title="Raw packets" href="/views/raw.php?id=<?php echo $station->id ?>&imperialUnits=<?php echo $_GET['imperialUnits'] ?? 0; ?>">Сырые данные</a>
</div>
<div class="horizontal-line">&nbsp;</div>
<?php if (count($weatherPackets) > 0) : ?>
<p>Это последние полученные погодные пакеты, хранящиеся в базе данных для станции/объекта <?php echo $station->name; ?>. Если пакеты не отображаются, отправитель не передавал никаких погодных пакетов в последние <?php echo $maxDays; ?> дня/дней.</p>
<div class="form-container">
<select id="weather-rows" style="float:left; margin-right: 5px;" class="pagination-rows">
<option <?php echo ($rows == 25 ? 'selected' : ''); ?> value="25">25 строк</option>
<option <?php echo ($rows == 50 ? 'selected' : ''); ?> value="50">50 строк</option>
<option <?php echo ($rows == 100 ? 'selected' : ''); ?> value="100">100 строк</option>
<option <?php echo ($rows == 200 ? 'selected' : ''); ?> value="200">200 строк</option>
<option <?php echo ($rows == 300 ? 'selected' : ''); ?> value="300">300 строк</option>
</select>
</div>
<?php if ($pages > 1): ?>
<div class="pagination">
<a class="tdlink" href="/views/weather.php?id=<?php echo $station->id; ?>&rows=<?php echo $rows; ?>&page=1"><<</a>
<?php for($i = max(1, $page - 3); $i <= min($pages, $page + 3); $i++) : ?>
<a href="/views/weather.php?id=<?php echo $station->id; ?>&rows=<?php echo $rows; ?>&page=<?php echo $i; ?>" <?php echo ($i == $page ? 'class="tdlink active"': 'class="tdlink"')?>><?php echo $i ?></a>
<?php endfor; ?>
<a class="tdlink" href="/views/weather.php?id=<?php echo $station->id; ?>&rows=<?php echo $rows; ?>&page=<?php echo $pages; ?>">>></a>
</div>
<?php endif; ?>
<div class="datagrid datagrid-weather" style="max-width:1000px;">
<table>
<thead>
<tr>
<th>Время</th>
<th>Температура</th>
<th>Влажность</th>
<th>Давление</th>
<th>Осадки*</th>
<th>Ветер**</th>
<th>Освещённость</th>
<th>Снег</th>
</tr>
</thead>
<tbody>
<?php foreach ($weatherPackets as $packetWeather) : ?>
<tr>
<td class="weathertime">
<?php echo ($packetWeather->wxRawTimestamp != null?$packetWeather->wxRawTimestamp:$packetWeather->timestamp); ?>
</td>
<td>
<?php if ($packetWeather->temperature !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertCelciusToFahrenheit($packetWeather->temperature), 2); ?>&deg; F
<?php else : ?>
<?php echo round($packetWeather->temperature, 2); ?>&deg; C
<?php endif; ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<td>
<?php if ($packetWeather->humidity !== null) : ?>
<?php echo $packetWeather->humidity; ?>%
<?php else : ?>
-
<?php endif; ?>
</td>
<td>
<?php if ($packetWeather->pressure !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertMbarToMmhg($packetWeather->pressure),1); ?> мм.рт.ст.
<?php else : ?>
<?php echo round($packetWeather->pressure,1); ?> гПа
<?php endif; ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<?php if ($weatherPackets[0]->rain_1h !== null) : ?>
<td title="<?php echo $packetWeather->getRainSummary(false, true, true); ?>">
<?php if ($packetWeather->rain_1h !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertMmToInch($packetWeather->rain_1h), 2); ?> in
<?php else : ?>
<?php echo round($packetWeather->rain_1h, 2); ?> мм
<?php endif; ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<?php elseif ($weatherPackets[0]->rain_24h !== null) : ?>
<td title="<?php echo $packetWeather->getRainSummary(true, false, true); ?>">
<?php if ($packetWeather->rain_24h !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertMmToInch($packetWeather->rain_24h), 2); ?> in
<?php else : ?>
<?php echo round($packetWeather->rain_24h, 2); ?> мм
<?php endif; ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<?php else : ?>
<td title="<?php echo $packetWeather->getRainSummary(true, true, false); ?>">
<?php if ($packetWeather->rain_since_midnight !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertMmToInch($packetWeather->rain_since_midnight), 2); ?> in
<?php else : ?>
<?php echo round($packetWeather->rain_since_midnight, 2); ?> мм
<?php endif; ?>
<?php else : ?>
-
<?php endif; ?>
</td>
<?php endif; ?>
<td title="Wind gust: <?php echo ($packetWeather->wind_gust !== null?round($packetWeather->wind_gust,2):'-'); ?> м/с">
<?php if (isImperialUnitUser()) : ?>
<?php if ($packetWeather->wind_speed !== null && $packetWeather->wind_speed > 0) : ?>
<?php echo round(convertMpsToMph($packetWeather->wind_speed), 2); ?> миль/ч, <?php echo $packetWeather->wind_direction; ?>&deg;
<?php elseif($packetWeather->wind_speed !== null) : ?>
<?php echo round(convertMpsToMph($packetWeather->wind_speed), 2); ?> миль/ч
<?php else : ?>
-
<?php endif; ?>
<?php else : ?>
<?php if ($packetWeather->wind_speed !== null && $packetWeather->wind_speed > 0) : ?>
<?php echo round($packetWeather->wind_speed, 2); ?> м/с, <?php echo $packetWeather->wind_direction; ?>&deg;
<?php elseif($packetWeather->wind_speed !== null) : ?>
<?php echo round($packetWeather->wind_speed, 2); ?> м/с
<?php else : ?>
-
<?php endif; ?>
<?php endif; ?>
</td>
<td>
<?php if ($packetWeather->luminosity !== null) : ?>
<?php echo round($packetWeather->luminosity,0); ?> Вт/м&sup2;
<?php else : ?>
-
<?php endif; ?>
</td>
<td>
<?php if ($packetWeather->snow !== null) : ?>
<?php if (isImperialUnitUser()) : ?>
<?php echo round(convertMmToInch($packetWeather->snow), 0); ?> in
<?php else : ?>
<?php echo round($packetWeather->snow, 0); ?> мм
<?php endif; ?>
<?php else : ?>
-
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<p>
<?php if ($weatherPackets[0]->rain_1h !== null) : ?>
* Осадки за последний час (наведите курсор, чтобы увидеть другие измерения)<br/>
<?php elseif ($weatherPackets[0]->rain_24h !== null) : ?>
* Осадки за последние 24 часа (наведите курсор, чтобы увидеть другие измерения)<br/>
<?php else : ?>
* Осадки с полуночи (наведите курсор, чтобы увидеть другие измерения)<br/>
<?php endif; ?>
** Текущая скорость ветра в м/с (наведите курсор, чтобы увидеть текущую скорость порывов ветра)
</p>
<?php endif; ?>
<?php if (count($weatherPackets) == 0) : ?>
<p><i><b>Нет последних погодных отчётов.</b></i></p>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
$('.weathertime').each(function() {
if ($(this).html().trim() != '' && !isNaN($(this).html().trim())) {
$(this).html(moment(new Date(1000 * $(this).html())).format('L LTSZ'));
}
});
$('#weather-rows').change(function () {
loadView("/views/weather.php?id=<?php echo $station->id ?>&rows=" + $('#weather-rows').val() + "&page=1");
});
if (window.parent && window.parent.trackdirect) {
<?php if ($station->latestConfirmedLatitude != null && $station->latestConfirmedLongitude != null) : ?>
window.parent.trackdirect.addListener("map-created", function() {
window.parent.trackdirect.focusOnStation(<?php echo $station->id ?>, true);
});
<?php endif; ?>
}
});
</script>
<?php endif; ?>