Fixed paths in templates. Added more demo content
|
@ -1,5 +1,5 @@
|
|||
# The URL the site will be built for
|
||||
base_url = "https://eit.rptu.de/gruppen/amateurfunkforschungsgruppe/"
|
||||
base_url = "https://files.zenerdio.de/DL0XK/website-prototype/"
|
||||
|
||||
# Whether to automatically compile all Sass files in the sass directory
|
||||
compile_sass = true
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
+++
|
||||
title = "Relais & Digipeater"
|
||||
title = "Relais & Digipeater DB0KL"
|
||||
|
||||
weight = 2
|
||||
|
BIN
content/db0kl/digipeater/ausbreitung_db0kl_2m-aprs_1920x1080.png
Normal file
After Width: | Height: | Size: 3.8 MiB |
25
content/db0kl/digipeater/index.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
+++
|
||||
title = "Digipeater (2m)"
|
||||
date = 2024-05-11T16:42:10+01:00
|
||||
+++
|
||||
|
||||
Unser APRS Digipeater empfängt und APRS Pakete und sendet diese verstärkt wieder aus.
|
||||
Weitere Information zu APRS finde man [hier](https://eit.rptu.de/gruppen/amateurfunkforschungsgruppe/projekte-aktivitaeten/aprs).
|
||||
|
||||
Hier kann man sehen welche Pakete über unseren Digipeater aktuell laufen:
|
||||
* Übersicht: [http://aprs.fi/info/a/DB0KL-3](http://aprs.fi/info/a/DB0KL-3)
|
||||
* Aktuelle Trafficstatistik: [http://aprs.fi/info/graphs/a/DB0KL-3](http://aprs.fi/info/graphs/a/DB0KL-3)
|
||||
* Als [Karte](http://aprs.fi/#!mt=roadmap&z=14&call=a%2FDB0KL-4%2Ca%2FDB0KL-3&timerange=3600&tail=3600)
|
||||
|
||||
## Technische Daten
|
||||
|
||||
* Bandbreite: 12,5 kHz
|
||||
* Frequenz: 144.800 MHz Simplex
|
||||
* Sendeart: F1D
|
||||
* Sendeleistung: 6 W EIRP
|
||||
* Datenrate: 1.2 kBd/s
|
||||
|
||||
## Ausbreitung und Reichweite
|
||||
{{ lightbox(image="/db0kl/digipeater/ausbreitung_db0kl_2m-aprs_1920x1080.png", alt="Reichtweite und Ausbreitungscharakteristik") }}
|
||||
|
||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
@ -21,9 +21,17 @@ Technische Daten
|
|||
|
||||
![Antennenstandort](antennen_mit_logo.jpg)
|
||||
|
||||
Prinzipiell besteht ein Relais aus einem Empfänger und Sender, die auf ihre jeweilige Frequenz fest abgestimmt sind. Der Sender wird bei Bedarf automatisch aktiviert, meldet sich mit Rufzeichen und strahlt das empfangene Signal wieder aus.
|
||||
|
||||
Der von uns verwendete Empfänger und Sender basiert auf einer Entwicklung von DF9IC, DF2VO und DF3VI. Die Steuerung übernimmt ein ATmega8 Mikrocontroller von Atmel, der nicht nur den Sender steuert, sondern auch Störer und Störungen erkennt und blockiert.
|
||||
|
||||
Sender und Empfänger teilen sich dieselbe Antenne und sind deshalb über eine Duplexweiche an die Antenne angeschlossen. Zusätzlich filtert ein Diplexer außerdem das 2m APRS Signal und leitet es zum APRS Digipeater weiter.
|
||||
|
||||
{{ lightbox(image="/db0kl/relais/db0kl_schematisch.png", alt="Schematischer Aufbau der Relais-Funkstelle") }}
|
||||
|
||||
Zur Zeit arbeitet das Relais als DMR und C4FM Repeater. DMR (Digital Mobile Radio) ist ein ETSI Standard für digitalen Mobilfunk für die Übertragung von Sprache und Daten. Die Datenübertragung erfolgt im Zeitmultiplex und belegt eine Bandbreite von 12,5 kHz.
|
||||
|
||||
{{ lightbox(image="/content/relais/relais/ausbreitung_db0kl_70cm_1920x1080.png", alt="Reichtweite und Ausbreitungscharakteristik") }}
|
||||
{{ lightbox(image="/db0kl/relais/ausbreitung_db0kl_70cm_1920x1080.png", alt="Reichtweite und Ausbreitungscharakteristik") }}
|
||||
|
||||
Die Hardware besteht aus einem MMDVM Board (Modem + Arduino). Das Board erzeugt die DMR Signale per Software,
|
||||
zu der auch die Amateurfunkgruppe (DG4MA) beigetragen hat.
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
9
content/projekte/_index.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
+++
|
||||
title = "Projekte & Aktivitäten"
|
||||
|
||||
weight = 4
|
||||
|
||||
[extra]
|
||||
menu_dropdown = true
|
||||
+++
|
||||
|
Before Width: | Height: | Size: 80 KiB |
|
@ -1,6 +1,7 @@
|
|||
+++
|
||||
title = "Kontakte in die Welt"
|
||||
date = 2024-05-11T16:42:10+01:00
|
||||
template = "gallery.html"
|
||||
+++
|
||||
|
||||
Weltweite Kommunikation ist ein wichtiger Aspekt im Amateurfunk. Über Kurzwelle (3-30 MHz) können mit nur wenigen Watt Sendeleistung Verbindungen in die ganze Welt aufgebaut werden. Trotz Internet und Mobilfunk ist Kurzwelle auch heute noch interessant, da
|
||||
|
@ -11,15 +12,9 @@ Weltweite Kommunikation ist ein wichtiger Aspekt im Amateurfunk. Über Kurzwelle
|
|||
|
||||
Kommen Verbindungen zwischen Funkamateuren zustande, werden oft QSL Karten (eine Art Postkarte als Empfangsbestätigung) ausgetauscht. Die QSL Karte unserer Uni kann man hier sehen:
|
||||
|
||||
![QSL Karte DL0XK](dl0xk_qsl.jpg)
|
||||
![QSL Karte DL0XK](/afg/home/dl0xk_qsl.jpg)
|
||||
|
||||
Im Laufe der Zeit hat sich auch die ein oder andere Karte aus allen Teilen der Welt bei uns angesammelt - wie man hier sehen kann:
|
||||
|
||||
## Aus Fernost
|
||||
|
||||
## Vom amerikanischen Kontinent
|
||||
|
||||
## Aus der Karibik
|
||||
|
||||
## Europa
|
||||
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
|
@ -26,7 +26,7 @@ body {
|
|||
|
||||
header {
|
||||
background: {
|
||||
image: linear-gradient(rgba($background-color, 0.0), rgba($background-color, 1)), url("/images/header.jpg");
|
||||
image: linear-gradient(rgba($background-color, 0.0), rgba($background-color, 1)), url("../images/header.jpg");
|
||||
size: cover;
|
||||
}
|
||||
height: 300px;
|
||||
|
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 16 KiB |
|
@ -35,11 +35,11 @@
|
|||
</main>
|
||||
|
||||
<script type="module">
|
||||
import PhotoSwipeLightbox from '/js/photoswipe/photoswipe-lightbox.esm.min.js';
|
||||
import PhotoSwipeLightbox from '{{ get_url(path="js/photoswipe/photoswipe-lightbox.esm.min.js") }}';
|
||||
const lightbox = new PhotoSwipeLightbox({
|
||||
gallery: '.gallery',
|
||||
children: 'a',
|
||||
pswpModule: () => import('/js/photoswipe/photoswipe.esm.min.js')
|
||||
pswpModule: () => import('{{ get_url(path="js/photoswipe/photoswipe.esm.min.js") }}')
|
||||
});
|
||||
lightbox.init();
|
||||
</script>
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
<br/><br/>
|
||||
For comments you can use your fediverse account to reply to this
|
||||
<a href="https://{{page.extra.masto_instance}}/@{{page.extra.masto_user}}/{{page.extra.masto_id}}">toot</a>.<br/>
|
||||
<div id="mastodon-comments-list">
|
||||
<button id="load-comment">Load comments</button><br/>
|
||||
</div>
|
||||
<noscript>You need JavaScript to view the comments.</noscript>
|
||||
<script src="/js/purify.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
function escapeHtml(unsafe) {
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
document.getElementById("load-comment").addEventListener("click", function() {
|
||||
document.getElementById("load-comment").innerHTML = "Loading";
|
||||
fetch('https://{{page.extra.masto_instance}}/api/v1/statuses/{{page.extra.masto_id}}/context')
|
||||
.then(function(response) {
|
||||
return response.json();
|
||||
})
|
||||
.then(function(data) {
|
||||
if(data['descendants'] &&
|
||||
Array.isArray(data['descendants']) &&
|
||||
data['descendants'].length > 0) {
|
||||
document.getElementById('mastodon-comments-list').innerHTML = "";
|
||||
data['descendants'].forEach(function(reply) {
|
||||
reply.account.display_name = escapeHtml(reply.account.display_name);
|
||||
reply.account.emojis.forEach(emoji => {
|
||||
reply.account.display_name = reply.account.display_name.replace(`:${emoji.shortcode}:`,
|
||||
`<img src="${escapeHtml(emoji.static_url)}" alt="Emoji ${emoji.shortcode}" height="20" width="20" />`);
|
||||
});
|
||||
mastodonComment =
|
||||
`<div class="mastodon-comment">
|
||||
<div class="avatar">
|
||||
<img src="${escapeHtml(reply.account.avatar_static)}" height=60 width=60 alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="author">
|
||||
<a href="${reply.account.url}" rel="nofollow">
|
||||
<span>${reply.account.display_name}</span>
|
||||
</a>
|
||||
<a class="date" href="${reply.uri}" rel="nofollow">
|
||||
${reply.created_at.substr(0, 10)}
|
||||
</a>
|
||||
</div>
|
||||
<div class="mastodon-comment-content">${reply.content}</div>
|
||||
</div>
|
||||
</div>`;
|
||||
document.getElementById('mastodon-comments-list').appendChild(DOMPurify.sanitize(mastodonComment, {'RETURN_DOM_FRAGMENT': true}));
|
||||
});
|
||||
} else {
|
||||
document.getElementById('mastodon-comments-list').innerHTML = "<p>Not comments found</p>";
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -3,25 +3,25 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="/css/normalize.css">
|
||||
<link rel="stylesheet" type="text/css" href="/css/redhat-text/redhat-text.css">
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path='css/normalize.css') }}">
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path='css/redhat-text/redhat-text.css') }}">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/js/photoswipe/photoswipe.css">
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path='js/photoswipe/photoswipe.css') }}">
|
||||
|
||||
{% block additional_css %}{% endblock %}
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/style.css">
|
||||
<link rel="stylesheet" type="text/css" href="{{ get_url(path='css/style.css') }}">
|
||||
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS Feed for {{ config.title }}" href="/rss.xml" />
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS Feed for {{ config.title }}" href="{{ get_url(path='/rss.xml') }}" />
|
||||
|
||||
<script src="/js/mathjax/tex-chtml-full.js" id="MathJax-script" async></script>
|
||||
<script src="{{ get_url(path='/js/mathjax/tex-chtml-full.js') }}" id="MathJax-script" async></script>
|
||||
|
||||
<title>{% block title %}{{ config.title }} :: {{ page.title }}{% endblock title %}</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<img class="logo" src="/images/logo.png" />
|
||||
<img class="logo" src="{{ get_url(path='/images/logo.png') }}" />
|
||||
|
||||
<div class="text">
|
||||
<div class="heading">{{ config.title }}</div>
|
||||
|
@ -39,12 +39,16 @@
|
|||
<button class="dropbtn">{{subsec.title}} ⌄</button>
|
||||
<div class="dropdown-content">
|
||||
{% for subsec_page in subsec.pages %}
|
||||
<a href="{{subsec_page.path}}">{{subsec_page.title}}</a>
|
||||
<a href="{{ get_url(path=subsec_page.path) }}">{{subsec_page.title}}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<a href="{{subsec.path}}">{{subsec.title}}</a>
|
||||
{%if subsec.pages | length == 1 %}
|
||||
<a href="{{ get_url(path=subsec.pages[0].path) }}">{{subsec.title}}</a>
|
||||
{% else %}
|
||||
<a href="{{ get_url(path=subsec.path) }}">{{subsec.title}}</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<a href="javascript:void(0);" style="font-size:15px;" class="icon" onclick="expandHamburger()">☰</a>
|
||||
|
@ -83,10 +87,10 @@
|
|||
</script>
|
||||
|
||||
<script type="module">
|
||||
import PhotoSwipeLightbox from '/js/photoswipe/photoswipe-lightbox.esm.min.js';
|
||||
import PhotoSwipeLightbox from '{{ get_url(path="/js/photoswipe/photoswipe-lightbox.esm.min.js") }}';
|
||||
const options = {
|
||||
gallery: 'main .lightbox',
|
||||
pswpModule: () => import('/js/photoswipe/photoswipe.esm.min.js')
|
||||
pswpModule: () => import('{{ get_url(path="/js/photoswipe/photoswipe.esm.min.js") }}')
|
||||
};
|
||||
const lightbox = new PhotoSwipeLightbox(options);
|
||||
lightbox.init();
|
||||
|
|