From e2c839490791f199852c1d7a2cac40fa35b8c200 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Wed, 18 Sep 2019 18:38:17 +0200 Subject: [PATCH] add basic docu --- _info/Changelog.md | 0 _info/packet.md | 289 ------------------ boswatch/packet.py | 2 +- docu/docs/changelog.md | 1 + {_info => docu/docs}/config.md | 15 +- .../docs/develop/ModulPlugin.md | 74 +++-- docu/docs/develop/packet.md | 61 ++++ docu/docs/img/bw3.png | Bin 0 -> 35934 bytes docu/docs/index.md | 18 +- docu/mkdocs.yml | 19 +- 10 files changed, 131 insertions(+), 348 deletions(-) delete mode 100644 _info/Changelog.md delete mode 100644 _info/packet.md create mode 100644 docu/docs/changelog.md rename {_info => docu/docs}/config.md (91%) rename _info/ownModulePlugin.md => docu/docs/develop/ModulPlugin.md (60%) create mode 100644 docu/docs/develop/packet.md create mode 100644 docu/docs/img/bw3.png diff --git a/_info/Changelog.md b/_info/Changelog.md deleted file mode 100644 index e69de29..0000000 diff --git a/_info/packet.md b/_info/packet.md deleted file mode 100644 index 8a0cc99..0000000 --- a/_info/packet.md +++ /dev/null @@ -1,289 +0,0 @@ -## Format of the BOSWatch packets - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
fieldfmspocsagzveimsgwildcarddescription
serverNameXXXX{SNAME}name of the boswatch server instance
serverVersionXXXX{SVERS}in case of new version, server can notify
serverBuildDateXXXX{SDATE}
serverBranchXXXX{SBRCH}
clientNameXXXX{CNAME}name of the boswatch client instance
clientIPXXXX{CIP}
clientVersionXXXX{CVERS}in case of new version, server can notify
clientBuildDateXXXX{CDATE}
clientBranchXXXX{CBRCH}
inputSourceXXXX{INSRC}(stick, audio)
timestampXXXX{TIMES}
frequencyXXXX{FREQ}
modeXXXX{MODE}(fms, pocsag, zvei, msg)
descriptionShortXXX{DESCS}loaded from optional CSV file
descriptionLongXXX{DESCL}loaded from optional CSV file
bitrateX{BIT}
ricX{RIC}
subricX{SRIC}(1, 2, 3, 4)
subricTextX{SRICT}(a, b, c, d)
messageXX{MSG}
toneX{TONE}5-tone sequence
fmsX{FMS}
serviceX{SERV}
countryX{COUNT}
locationX{LOC}
vehicleX{VEHC}
statusX{STAT}
directionX{DIR}
dirextionTextX{DIRT}(Fhz->Lst, Lst->Fhz)
tacticalInfoX{TACI}(I, II, III, IV)
- -

-### Other possible wildcards: -- {BR} - Line break (\\r\\n) -- {LPAR} - Left parenthesis ( -- {RPAR} - Right parenthesis ) -- {TIME} - Actual timestamp diff --git a/boswatch/packet.py b/boswatch/packet.py index 185bed7..a0fcce8 100644 --- a/boswatch/packet.py +++ b/boswatch/packet.py @@ -73,7 +73,7 @@ class Packet: self.set("clientVersion", version.client) self.set("clientBuildDate", version.date) self.set("clientBranch", version.branch) - self.set("inputSource", config.get("client", "inoutSource")) + self.set("inputSource", config.get("client", "inputSource")) self.set("frequency", config.get("inputSource", "sdr", "frequency")) def addServerData(self, config): diff --git a/docu/docs/changelog.md b/docu/docs/changelog.md new file mode 100644 index 0000000..132c88c --- /dev/null +++ b/docu/docs/changelog.md @@ -0,0 +1 @@ +## Changelog \ No newline at end of file diff --git a/_info/config.md b/docu/docs/config.md similarity index 91% rename from _info/config.md rename to docu/docs/config.md index 7c00dbc..707860d 100644 --- a/_info/config.md +++ b/docu/docs/config.md @@ -1,6 +1,6 @@ ## Konfiguration -Die Konfiguration von BOSWatch 3 ist im YAML Format abgelegt und wird nachfolgend beschrieben. +Die Konfiguration von BOSWatch 3 ist im YAML Format abgelegt und wird nachfolgend beschrieben. Immer wenn für eine Einstellung ein **Default** Wert angegeben ist, muss diese Einstellung nicht zwingend in die Konfiguration eingetragen werden. @@ -12,11 +12,12 @@ Nachfolgend alle Paramater der Client Konfiguration |Feld|Beschreibung|Default| |----|------------|-------| |name|Name zur Identifizierung der Client Instanz|| -|inoutSource|Art der zu nutzenden Input Quelle (aktuell nur `sdr`)|| +|inputSource|Art der zu nutzenden Input Quelle (aktuell nur `sdr`)|| |useBroadcast|Verbindungsdaten per Broadcast beziehen|no| #### `server:` -Der Abschnitt `server:` wird nur genutzt, wenn `useBroadcast: no` gesetzt ist. +Der Abschnitt `server:` wird nur genutzt, wenn `useBroadcast: no` gesetzt ist. +Ansonsten wird versucht die Verbindungsdaten per Broadcast Paket direkt vom Server zu beziehen. |Feld|Beschreibung|Default| |----|------------|-------| @@ -72,8 +73,8 @@ Enthält eine Liste der Router Namen, welche bei einem Alarm direkt gestartet we Bsp: ```yaml alarmRouter: -- Name des Routers -- ein weiter Router + - Name des Routers + - ein weiter Router ``` #### `router:` @@ -118,8 +119,8 @@ Bsp: ```yaml config: allowed: - - fms - - zvei + - fms + - zvei ``` --- diff --git a/_info/ownModulePlugin.md b/docu/docs/develop/ModulPlugin.md similarity index 60% rename from _info/ownModulePlugin.md rename to docu/docs/develop/ModulPlugin.md index 55bb5be..be80245 100644 --- a/_info/ownModulePlugin.md +++ b/docu/docs/develop/ModulPlugin.md @@ -1,21 +1,21 @@ -## Eigene Module und Plugins schreiben +## Eigenes Modul/Plugin schreiben -Um ein eigenes Modul oder Plugin zu schreiben, sollte man sich -am besten zuerst einmal das das `template` im entsprechenden Ordner ansehen. -Dies kann als Vorlage für das eigene Plugin genutzt werden. +Um ein eigenes Modul oder Plugin zu schreiben, sollte man sich am besten zuerst einmal das das `template` im entsprechenden Ordner ansehen. Dies kann als Vorlage für das eigene Modul oder Plugin genutzt werden. -### 1 Informationen anpassen +### Informationen anpassen - Dateikopf anpassen -### 2 Benötigte Methoden überschreiben -#### 2.1 Modul +### Benötigte Methoden überschreiben +#### Modul Die Modul Basisklasse bietet einige Methoden, welche vom Modul überschrieben werden können. + - `onLoad()` wird direkt beim Import des Moduls ausgeführt - `doWork(bwPacket)` wird bei der Ausführung aufgerufen - `onUnload()` wird beim Zerstören der Plugin Modul zum Programmende ausgeführt -#### 2.2 Plugin +#### Plugin Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben werden können. + - `onLoad()` wird direkt beim Import des Plugins ausgeführt - `setup()` wird vor jeder Ausführung gerufen - `fms(bwPacket)` wird bei einem FMS Paket ausgeführt @@ -25,12 +25,12 @@ Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben - `teardown()` wird nach jeder Ausführung gerufen - `onUnload()` wird beim Zerstören der Plugin Instanz zum Programmende ausgeführt -### 3 Konfiguration -#### 3.1 Konfiguration anlegen +### Konfiguration +#### Konfiguration anlegen Jedes Modul oder Plugin wird in einem Router folgendermaßen deklariert: ```yaml -- type: module # oder plugin - name: template_module # Name der Python Datei +- type: module # oder 'plugin' + name: template_module # Name der Python Datei (ohne .py) config: # config-Sektion option1: value 1 option2: value 2 @@ -40,49 +40,47 @@ Jedes Modul oder Plugin wird in einem Router folgendermaßen deklariert: - list 1 - list 2 ``` -Eine entsprechende Dokumentation der Parameter ist in der Config-Readme zu hinterlegen. +Eine entsprechende Dokumentation der Parameter ist in der Dokumentation der [Konfiguration](../config.md) zu hinterlegen. + +#### Konfiguration verwenden +Wird der Instanz eine Konfiguration übergeben wird diese in `self.config` abgelegt und kann folgendermaßen abgerufen werden: -#### 3.2 Konfiguration nutzen -Wird der Instanz eine Konfiguration übergeben wird diese in `self.config` -abgelegt und kann folgendermaßen abgerufen werden: - `self.config.get("option1")` einzelnes Feld - - liefert `value 1` +> `value 1` - `self.config.get("option2", "underOption1")` verschachteltes Feld (beliebig viele möglich) - - liefert `value 21` -- `self.config.get("notSet", default="defValue")` Es kann ein Default Wert angegeben werden (wenn Eintrag in Config fehlt) - - liefert `defValue` +> liefert `value 21` +- `self.config.get("notSet", default="defValue")` Es kann ein Default Wert angegeben werden +> liefert `defValue` - `for item in self.config.get(FIELD):` Über Listen kann iteriert werden - - liefert ein Element je Durchgang - hier `list1` und `list2` +> liefert ein Element je Iteration - hier `list 1` und `list 2` -Wird ein End-Wert ausgelesen, wird dieser direkt zurück gegeben. -Sollten weitere Unterelemente oder eine Liste exisitieren -wird erneut ein Element der Klasse `Config()` zurück gegeben +Wird ein End-Wert ausgelesen, wird dieser direkt zurück gegeben. +Sollten weitere Unterelemente oder eine Liste exisitieren wird erneut ein Objekt der Klasse `Config()` zurück gegeben, auf welches wiederum nach obigem Schema zugegriffen werden kann. -### 4 Arbeiten mit dem bwPacket -An das Modul bzw. Plugin wird eine Instanz eines BOSWatch-Packet Objekts übergeben. +### Arbeiten mit dem bwPacket +An das Modul bzw. Plugin wird eine Instanz eines BOSWatch-Packet Objekts übergeben. -Aus dieser kann mittels `bwPacket.get(FIELDNAME)` das entsprechende Feld -ausgelesen werden. +Aus dieser kann mittels `bwPacket.get(FIELDNAME)` das entsprechende Feld ausgelesen werden. -Mittels `bwPacket.set(FIELDNAME, VALUE)` kann es hinzugefügt/modifiziert werden. +Mittels `bwPacket.set(FIELDNAME, VALUE)` kann es hinzugefügt/modifiziert werden. -Eine Auflistung der bereitgestellten Informationen -findet sich im entsprechenden BOSWatch-Packet Dokument. +Eine Auflistung der bereitgestellten Informationen findet sich im entsprechenden [BOSWatch Paket](packet.md) Dokumentation. -#### 4.1 Zu beachten bei Module -Module können Pakete beliebig verändern. +#### Zu beachten bei Module +Module können Pakete beliebig verändern. Diese Änderungen werden im Router entsprechend weitergeleitet. Mögliche Rückgabewerte eines Moduls: + - `return bwPacket` gibt das modifizierte bwPacket an den Router zurück - `return None` Router fährt mit dem unveränderten bwPacket fort (Input = Output) - `return False` Router stopt sofort die Ausführung (zB. in Filtern verwendet) -#### 4.2 Zu beachten bei Plugins -Plugins geben keine Pakete mehr zurück. Sie fungieren ausschließlich als Endpunkt. +#### Zu beachten bei Plugins +Plugins geben keine Pakete mehr zurück. Sie fungieren ausschließlich als Endpunkt. Die Plugin Basisklasse liefert intern immer ein `None` an den Router zurück, was zur weiteren Ausführung des Routers führt. -### 5 Wildcards parsen (NUR IN PLUGIN) -Das parsen der Wildcars funktioniert komfortabel über die interne Methode `self.parseWildcards(MSG)`. -Die Platzhalter für die Wildcards findet man in `boswatch/utils/wildcard.py` oder in der `packet.md`. +### Wildcards parsen (Plugin only) +Das parsen der Wildcars funktioniert komfortabel über die interne Methode `self.parseWildcards(MSG)`. +Die Platzhalter der Wildcards findet man in der [BOSWatch Paket](packet.md) Dokumentation. diff --git a/docu/docs/develop/packet.md b/docu/docs/develop/packet.md new file mode 100644 index 0000000..4a301d4 --- /dev/null +++ b/docu/docs/develop/packet.md @@ -0,0 +1,61 @@ +## BOSWatch Packet Format + +Ein BOSWatch Datenpaket wird in einem Python Dict abgebildet. In der nachfolgenden Tabelle sind die genutzten Felder abgebildet. + +### Allgemeine Informationen + +|Feldname|FMS|POCSAG|ZVEI|MSG|Wildcard|Beschreibung| +|--------|:-:|:----:|:--:|:-:|--------|------------| +|serverName|X|X|X|X|`{SNAME}`|Name der BOSWatch Server Instanz| +|serverVersion|X|X|X|X|`{SVERS}`|| +|serverBuildDate|X|X|X|X|`{SDATE}`|| +|serverBranch|X|X|X|X|`{SBRCH}`|| +|clientName|X|X|X|X|`{CNAME}`|Name der BOSWatch Client Instanz| +|clientIP|X|X|X|X|`{CIP}`|| +|clientVersion|X|X|X|X|`{CVERS}`|| +|clientBuildDate|X|X|X|X|`{CDATE}`|| +|clientBranch|X|X|X|X|`{CBRCH}`|| +|inputSource|X|X|X|X|`{INSRC}`|(sdr, audio)| +|timestamp|X|X|X|X|`{TIMES}`|| +|frequency|X|X|X|X|`{FREQ}`|| +|mode|X|X|X|X|`{MODE}`|(fms, pocsag, zvei, msg)| +|descriptionShort|X|X|X||`{DESCS}`|Kann aus optinalem CSV File geladen werden| +|descriptionLong|X|X|X||`{DESCL}`|Kann aus optinalem CSV File geladen werden| + +### Speziell für POCSAG + +|Feldname|FMS|POCSAG|ZVEI|MSG|Wildcard|Beschreibung| +|--------|:-:|:----:|:--:|:-:|--------|------------| +|bitrate||X|||`{BIT}`|| +|ric||X|||`{RIC}`|| +|subric||X|||`{SRIC}`|(1, 2, 3, 4)| +|subricText||X|||`{SRICT}`|(a, b, c, d)| +|message||X||X|`{MSG}`|Kann außerdem für ein Message Paket genutzt werden| + +### Speziell für ZVEI + +|Feldname|FMS|POCSAG|ZVEI|MSG|Wildcard|Beschreibung| +|--------|:-:|:----:|:--:|:-:|--------|------------| +|tone|||X||`{TONE}`|5-Ton Sequenz nach ZVEI| + +### Speziell für FMS + +|Feldname|FMS|POCSAG|ZVEI|MSG|Wildcard|Beschreibung| +|--------|:-:|:----:|:--:|:-:|--------|------------| +|fms|X||||`{FMS}`|| +|service|X||||`{SERV}`|| +|country|X||||`{COUNT}`|| +|location|X||||`{LOC}`|| +|vehicle|X||||`{VEC}`|| +|status|X||||`{STAT}`|| +|direction|X||||`{DIR}`|| +|dirextionText|X||||`{DIRT}`|(Fhz->Lst, Lst->Fhz)| +|vehicle|X||||`{VEC}`|| +|vehicle|X||||`{VEC}`|| +|tacticalInfo|X||||`{TACI}`|(I, II, III, IV)| + +### Weitere Wildcards +- `{BR}` - Zeilenumbruch `\r\n` +- `{LPAR}` - öffnende Klammer `(` +- `{RPAR}` - schließende Klammer `)` +- `{TIME}` - Aktueller zeitstempel diff --git a/docu/docs/img/bw3.png b/docu/docs/img/bw3.png new file mode 100644 index 0000000000000000000000000000000000000000..b229bbfcae378a037ef2bc16d786dec9eaee6074 GIT binary patch literal 35934 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 literal 0 HcmV?d00001 diff --git a/docu/docs/index.md b/docu/docs/index.md index d388039..b953b18 100644 --- a/docu/docs/index.md +++ b/docu/docs/index.md @@ -1,17 +1,11 @@ -# Welcome to MkDocs +# BOSWatch 3 -For full documentation visit [mkdocs.org](https://mkdocs.org). +![BOSWatch](img/bw3.png "BOSWatch 3 Logo") -## Commands -* `mkdocs new [dir-name]` - Create a new project. -* `mkdocs serve` - Start the live-reloading docs server. -* `mkdocs build` - Build the documentation site. -* `mkdocs help` - Print this help message. +**Es wird darauf hingewiesen, dass für die Teilnahme am BOS-Funk nur nach den Technischen Richtlinien der BOS zugelassene Funkanlagen verwendet werden dürfen.** +**Der BOS-Funk ist ein nichtöffentlicher mobiler Landfunk. Privatpersonen gehören nicht zum Kreis der berechtigten Funkteilnehmer.** _(Quelle: TR-BOS)_ -## Project layout +*** - mkdocs.yml # The configuration file. - docs/ - index.md # The documentation homepage. - ... # Other markdown pages, images and other files. +**The intercept of the German BOS radio is strictly prohibited and will be prosecuted. The use is only permitted for authorized personnel.** \ No newline at end of file diff --git a/docu/mkdocs.yml b/docu/mkdocs.yml index c97182f..f075849 100644 --- a/docu/mkdocs.yml +++ b/docu/mkdocs.yml @@ -1 +1,18 @@ -site_name: My Docs +site_name: BOSWatch3 Core +site_author: Bastian Schroll & BW3 Dev team + +nav: + # - BW3: index.md + - Quick Start Guide: config.md + # - Module: index.md + # - Plugins: index.md + - Entwickler: + - Eigenes Modul/Plugin: develop/ModulPlugin.md + - BOSWatch Packet Format: develop/packet.md +# - BW3 Source Docu: /api/index.html + - Changelog: changelog.md + +theme: + name: mkdocs + highlightjs: true + hljs_style: github \ No newline at end of file