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 ![]() (image error) 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 ![]() (image error) Size: 16 KiB After ![]() (image error) Size: 16 KiB ![]() ![]() |
Before ![]() (image error) Size: 1.4 MiB After ![]() (image error) Size: 1.4 MiB ![]() ![]() |
Before ![]() (image error) Size: 59 KiB After ![]() (image error) Size: 59 KiB ![]() ![]() |
|
@ -21,9 +21,17 @@ Technische Daten
|
|||
|
||||

|
||||
|
||||
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 ![]() (image error) Size: 64 KiB After ![]() (image error) Size: 64 KiB ![]() ![]() |
Before ![]() (image error) Size: 53 KiB After ![]() (image error) Size: 53 KiB ![]() ![]() |
Before ![]() (image error) Size: 133 KiB After ![]() (image error) Size: 133 KiB ![]() ![]() |
Before ![]() (image error) Size: 39 KiB After ![]() (image error) 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 ![]() (image error) 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:
|
||||
|
||||

|
||||

|
||||
|
||||
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 ![]() (image error) Size: 69 KiB After ![]() (image error) Size: 69 KiB ![]() ![]() |
Before ![]() (image error) Size: 118 KiB After ![]() (image error) Size: 118 KiB ![]() ![]() |
Before ![]() (image error) Size: 55 KiB After ![]() (image error) Size: 55 KiB ![]() ![]() |
Before ![]() (image error) Size: 160 KiB After ![]() (image error) Size: 160 KiB ![]() ![]() |
Before ![]() (image error) Size: 64 KiB After ![]() (image error) Size: 64 KiB ![]() ![]() |
Before ![]() (image error) Size: 27 KiB After ![]() (image error) Size: 27 KiB ![]() ![]() |
Before ![]() (image error) Size: 95 KiB After ![]() (image error) Size: 95 KiB ![]() ![]() |
Before ![]() (image error) Size: 64 KiB After ![]() (image error) Size: 64 KiB ![]() ![]() |
Before ![]() (image error) Size: 76 KiB After ![]() (image error) Size: 76 KiB ![]() ![]() |
Before ![]() (image error) Size: 72 KiB After ![]() (image error) Size: 72 KiB ![]() ![]() |
Before ![]() (image error) Size: 171 KiB After ![]() (image error) Size: 171 KiB ![]() ![]() |
Before ![]() (image error) Size: 178 KiB After ![]() (image error) Size: 178 KiB ![]() ![]() |
Before ![]() (image error) Size: 65 KiB After ![]() (image error) Size: 65 KiB ![]() ![]() |
Before ![]() (image error) Size: 98 KiB After ![]() (image error) Size: 98 KiB ![]() ![]() |
Before ![]() (image error) Size: 88 KiB After ![]() (image error) Size: 88 KiB ![]() ![]() |
Before ![]() (image error) Size: 103 KiB After ![]() (image error) Size: 103 KiB ![]() ![]() |
Before ![]() (image error) Size: 112 KiB After ![]() (image error) Size: 112 KiB ![]() ![]() |
Before ![]() (image error) Size: 82 KiB After ![]() (image error) Size: 82 KiB ![]() ![]() |
Before ![]() (image error) Size: 72 KiB After ![]() (image error) Size: 72 KiB ![]() ![]() |
Before ![]() (image error) Size: 81 KiB After ![]() (image error) Size: 81 KiB ![]() ![]() |
Before ![]() (image error) Size: 78 KiB After ![]() (image error) Size: 78 KiB ![]() ![]() |
Before ![]() (image error) Size: 84 KiB After ![]() (image error) Size: 84 KiB ![]() ![]() |
Before ![]() (image error) Size: 60 KiB After ![]() (image error) Size: 60 KiB ![]() ![]() |
Before ![]() (image error) Size: 82 KiB After ![]() (image error) Size: 82 KiB ![]() ![]() |
Before ![]() (image error) Size: 133 KiB After ![]() (image error) 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 ![]() (image error) Size: 22 KiB After ![]() (image error) 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();
|
||||
|
|