summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstuebinm2022-11-20 01:26:14 +0100
committerstuebinm2022-11-20 01:26:14 +0100
commit97b99ed70f900716e17771f14a210dbed2ab9841 (patch)
tree38fb159326f113fb9499632e5c74652756529577
parent2ff304bd6cb2e51379e18a237f7edca35320d475 (diff)
VDV 452 type definitions
this implements all the database table schemas defined in VDV 452, except for the ones which are very obviously not useful for talking about train timetable data. Note that I don't really understand what all of these values are supposed to be yet, so a lot of them are probably unnessary.
-rw-r--r--vdv-protocol.cabal1
-rw-r--r--vdv-server/VDV452.hs483
2 files changed, 484 insertions, 0 deletions
diff --git a/vdv-protocol.cabal b/vdv-protocol.cabal
index 43acd14..c8fa3b8 100644
--- a/vdv-protocol.cabal
+++ b/vdv-protocol.cabal
@@ -44,6 +44,7 @@ library
default-language: Haskell2010
exposed-modules: VDV453.Kommunikationsschicht
, VDV451
+ , VDV452
executable vdv-testclient
diff --git a/vdv-server/VDV452.hs b/vdv-server/VDV452.hs
new file mode 100644
index 0000000..0a54a38
--- /dev/null
+++ b/vdv-server/VDV452.hs
@@ -0,0 +1,483 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+
+
+-- |
+
+module VDV452 where
+import Data.Time (Day)
+import Data.Text (Text)
+import VDV451 (ÖPNVEncode, ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber))
+
+
+
+-- | 993
+data BasisVerGueltigkeit = BasisVerGueltigkeit
+ { basisVerGueltigkeit :: Day
+ -- ^ Primärschlüssel
+ , basisBasisVersion :: Int
+ -- ^ Fremdschlüssel von MengeBasisVersionen
+ }
+
+instance ÖPNVDatum BasisVerGueltigkeit where
+ tableName _ = "BASIS_VER_GUELTIGKEIT"
+ tableSchema _ =
+ [ ("VER_GUELTIGKEIT", ÖNum 8, F . AsNumber . basisVerGueltigkeit)
+ , ("BASIS_VERSION", ÖNum 9, F . basisBasisVersion)]
+
+-- | 485
+data MengeBasisVersionen = MengeBasisVersionen
+ { mengeBasisVersion :: Int
+ -- ^ Primärschlüssel
+ , mengeBasisVersionText :: Text
+ -- ^ Beschreibung der allgemeinen Version
+ }
+
+instance ÖPNVDatum MengeBasisVersionen where
+ tableName _ = "MENGE_BASIS_VERSIONEN"
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . mengeBasisVersion)
+ , ("BASIS_VERSION_TEXT", ÖChar 40, F . mengeBasisVersionText)]
+
+-- | 348
+data Firmenkalender = Firmenkalender
+ { firmenkalenderBasisVersion :: Integer
+ -- ^ Fremdschlüssel von MengeBasisVersionen
+ , firmenkalenderBetriebstag :: Day
+ , firmenkalenderBetriebstagText :: Text
+ , firmenkalenderTagesArtNr :: Int
+ -- TODO this is probably en enum
+ }
+
+data MengeTagesart = MengeTagesart
+ { tagesartBasisVersion :: Integer
+ -- ^ P1, Fremdschlüssel von MengeBasisVersionen
+ , tagesartTagesartNr :: Int
+ -- ^ P2
+ , tagesartTagesartText :: Text
+ }
+
+
+
+
+---- Ortsdaten
+
+data OnrTypNr =
+ OnrHaltepunkt | OnrBetriebshofpunkt | OnrOrtsmarke
+ | OnrLSAPunkt | OnrRoutenzwischenpunkt | OnrBetriebspunkt
+ | OnrGrenzpunkt
+
+data MengeOnrTyp = MengeOnrTyp
+ { onrtypBasisVersion :: Integer
+ , onrtypTypNr :: OnrTypNr
+ , onrStrTyp :: Text
+ -- TODO: this might be an enum?
+ , onrTypText :: Text
+ }
+
+data OrtTypNr = OrtHaltestelle | OrtBetriebshof
+
+data MengeOrtTyp = MengeOrtTyp
+ { orttypBasisVersion :: Integer
+ , orttypTypNr :: OrtTypNr
+ , orttypText :: Text
+ }
+
+data RecHp = RecHp
+ { rechpBasisVersion :: Integer
+ , rechpOnrTypNr :: OrtTypNr
+ , rechpOrtNr :: Integer
+ , rechpHaltepunktNr :: Int
+ , rechpZusatzInfo :: Text
+ }
+
+data RecOm = RecOm
+ { recomBasisVersion :: Integer
+ , recomOnrTypNr :: OnrTypNr
+ -- ^ nur 3..4
+ , recomOrtNr :: Integer
+ , recomOrmKuerzel :: Text
+ , recomOrmacode :: Int
+ , recOrmText :: Text
+ }
+
+-- | these are encoded in a horrible format
+newtype Longitude = Longitude Int
+newtype Latitude = Latitude Int
+
+-- | tatsächliche Ortsbeschreibung
+data RecOrt = RecOrt
+ { recortBasisVersion :: Integer
+ , recortOnrTypNr :: OnrTypNr
+ , recortOrtNr :: Integer
+ , recortOrtName :: Text
+ , recortHastNrLokal :: Int
+ , recortHstNrNational :: Integer
+ , recortHstNrInternational :: Text
+ -- these only if recortOnrTypNr = 1 or 2
+ , recortOrtRefOrt :: Int
+ , recortOrtRefOrtTyp :: OrtTypNr
+ , recortOrtRefOrtLangNr :: Maybe Int
+ , recortOrtRefOrtKuerzel :: Text
+ , recortOrtRefOrtName :: Text
+ , recortZoneWabeNr :: Maybe Int
+ --- these are entirely optional
+ , recortOrtPosLaenge :: Longitude
+ , rocortOrtPosBreite :: Latitude
+ , recortPosHoehe :: Int
+ , recortOrtRichtung :: Int
+ }
+
+
+
+
+-- Betriebsdaten
+
+data Fahrzeug = Fahrzeug
+ { fzgBasisVersion :: Integer
+ , fzgNr :: Int
+ , fzgTypNr :: Maybe Int
+ , fzgPolKenn :: Text
+ , fzgUnternehmen :: Maybe Int
+ -- ^ fremdschlüssel ZulVerkehsbetrieb
+ , fzgFIN :: Text
+ }
+
+data ZulVerkehsbetrieb = ZulVerkehsbetrieb
+ { zulBasisVersion :: Integer
+ , zulUnternehmen :: Int
+ , zulAbkUnternehmen :: Text
+ , zulBetriebsgebietBez :: Text
+ }
+
+-- | 333
+data MengeBereich = MengeBereich
+ { mengebereichBasisVersion :: Integer
+ , mengebereichBereichNr :: Text
+ , mengebereichStrBereich :: Text
+ , mengebereichBereichText :: Text
+ }
+
+-- | 293
+data MengeFzgTyp = MengeFzgTyp
+ { fzgtypBasisVersion :: Integer
+ , fzgtypFzgTypNr :: Int
+ , fzgtypFzgLaenge :: Int
+ -- ^ given in metres
+ , fzgtypBreite :: Int
+ -- ^ given in centimetres
+ , fzgtypHoehe :: Int
+ -- ^ given in centimetres
+ , fzgtypGewicht :: Integer
+ -- ^ kilograms
+ , fzgtypSitz :: Integer
+ , fzgtypSteh :: Integer
+ , fzgtypText :: Text
+ , fzgtypSonderPlatz :: Integer
+ , fzgtypStrFzgTyp :: Text
+ -- ^ kursbezeichnung des fahrzeugtyps
+ -- , fzgtypBatterieTypNr :: Maybe Int
+ -- -- this one is optional, but the others maybe not?
+ -- -- fremdschlüssel MengeBatterieTyp
+ -- , fzgtypVerbrauchDistanz :: Int
+ -- , fzgtypVerbrauchZeit :: Int
+ }
+
+-- | 996: Aufzählung von Fahrzeug-Ansagetexten
+-- this one seems to be optional
+data RecAnr = RecAnr
+ { recanrBasisVersion :: Integer
+ , recanrAnrNr :: Int
+ , recanrAnrKuerzel :: Text
+ , recanrAnrText :: Text
+ }
+
+-- | 995: Aufzählung der am Fahrzeug angezeigten Fahrtziele
+-- this one is probably optional as well
+data RecZnr = RecZnr
+ { recznrBasisVersion :: Integer
+ , recznrZnrNr :: Integer
+ , recznrKuerzel :: Text
+ , recznrFahrerkurztext :: Text
+ , recznrSeitentext :: Text
+ , recznrZnrText :: Text
+ , recznrCode :: Text
+ }
+
+
+
+
+
+------- Netzdaten
+
+-- 299
+data RecSel = RecSel
+ { recselBasisVersion :: Integer
+ , recselBereichNr :: Int
+ -- ^ fremdschlüssel MangeBereich
+ , recselOnrTypNr :: OnrTypNr
+ -- ^ fremdschlüssel MengeOnrTyp
+ , recselOrtNr :: Integer
+ -- ^ fremdschlüssel RecOrt
+ , recselSelZiel :: Integer
+ , recselSelZielTyp :: OrtTypNr
+ , recselSelLaenge :: Integer
+ }
+
+-- | 995: definition von zwischenpunkten
+-- honestly i hope this one's optional
+data RecSelZp = RecSelZp
+ { recselzpBasisVersion :: Integer
+ , recselzpBereichNr :: Int
+ , recselzpOnrTypNr :: OrtTypNr
+ , recselzpOrtNr :: Integer
+ , recselzpSelZiel :: Integer
+ , recselzpSelZielTyp :: OrtTypNr
+ , recselzpZpOnr :: Integer
+ , recselzpZpTyp :: Int
+ -- this one only takes values 3..7???
+ , recselzpSelZpLaenge :: Maybe Int
+ , recselzpZpLfdNr :: Maybe Integer
+ }
+
+-- | 222: Fahrzeitgruppen (whatever that is)
+-- seems to be optional?
+data MengeFgr = MengeFgr
+ { mengefgrBasisVersion :: Integer
+ , mengefgrFgrNr :: Integer
+ , mengefgrText :: Text
+ , mengefgrTypNr :: Int
+ }
+
+--- | 999: Angabe von Haltezeiten je Fahrzeitgruppe und Ort
+-- definitely optional, which is a good thing because
+-- i don't know what it's even for
+data OrtHztf = OrtHztf
+ { orthztfBasisVersion :: Integer
+ , orthztfFgrNr :: Integer
+ , orthztfOnrTypNr :: OrtTypNr
+ , orthztfOrtNr :: Integer
+ , orthztfHpHzt :: Int
+ }
+
+-- | 282: für streckenabschnitte planmäßig vorgesehen Fahrzeit
+-- nie als fremdschlüssel benutzt, ist optional
+data SelFztFeld = SelFztFeld
+ { selfztBasisVersion :: Integer
+ , selfztBereichNr :: Int
+ , selfztFgrNr :: Integer
+ , selfztOnrTypNr :: OrtTypNr
+ , selfztOrtNr :: Integer
+ , selfztSelZiel :: Integer
+ , selfztSelZielTyp :: OrtTypNr
+ , selfztSelFzt :: Int
+ }
+
+-- | 225: keine ahnung, irgendwas halt
+data RecUeb = RecUeb
+ { recuebBasisVersion :: Integer
+ , recuebBereichNr :: Int
+ , recuebOnrTypNr :: OrtTypNr
+ , recuebOrtNr :: Integer
+ , recuebUebZielTyp :: OrtTypNr
+ , recuebZiel :: Integer
+ , recuebLaenge :: Int
+ }
+
+-- | 247
+-- nirgendwo anders benutzt, ist wohl optional
+data UebFzt = UebFzt
+ { uebfztBasisVersion :: Integer
+ , uebfztBereichNr :: Int
+ , uebfztFgrNr :: Integer
+ , uebfztOnrTypNr :: OrtTypNr
+ , uebfztOrtNr :: Integer
+ , uebZielTyp :: OrtTypNr
+ , uebZiel :: Integer
+ , uebFahrzeit :: Int
+ }
+
+data Fahrtart = Normalfahrt | Betriebshofausfahrt
+ | Betriebshofeinfahrt | Zufahrt
+
+-- | 332: Aufzählung von Fahrtarten
+data MengeFahrtart = MengeFahrtart
+ { fahrtartBasisVersion :: Integer
+ , fahrtartNr :: Fahrtart
+ , fahrtartStrFahrtart :: Text
+ }
+
+-- | 571: Beschreibung von Flächenzonen
+data FlaechenZone = FlaechenZone
+ { flaechenBasisVersion :: Integer
+ , flaechenZoneTypNr :: Int
+ , flaechenZoneNr :: Integer
+ , flaechenZoneKuerzel :: Text
+ , flaechenZoneName :: Text
+ , flaechenZoneAmtlicheNr :: Text
+ }
+
+
+-- | 539: Zuordnung der Orte zu Flächenzonen
+-- nirgendwo referenziert, ist optional
+data FlZoneOrt = FlZoneOrt
+ { flzoneortBasisVersion :: Integer
+ , flzoneortTypNr :: Int
+ , flzoneortNr :: Integer
+ , flzoneortOnrTypNr :: OnrTypNr
+ , flzoneortOrtNr :: Integer
+ }
+
+-- TODO: this probably has more fields?
+data ZoneTypNr = Gebietskörperschaft | Verkehrszonen
+
+-- | 572: Typen von Flächenzonen (Gebietskörperschaft)
+data MengeFlaechenZoneTyp = MengeFlaechenZoneTyp
+ { flaechenzoneBasisVeresion :: Integer
+ , flaechenzoneZoneTypNr :: ZoneTypNr
+ , flaechenzoneTypText :: Text
+ }
+
+-- | 540
+-- nirgendwo fremdschlüssel, optional
+data SelFztFeldZp = SelFztFeldZp
+ { selfztfeldBasisVersion :: Integer
+ , selfztfeldBereichnr :: Int
+ , selfztfeldFgrNr :: Integer
+ , selfztfeldOnrTypNr :: OrtTypNr
+ , selfztfeldOrtNr :: Integer
+ , selfztfeldSelZiel :: Integer
+ , selfztfeldSelZielTyp :: Int
+ -- this one can only be 1 or 2??
+ , selfztfeldZpOnr :: Integer
+ , selfztfeldZpTyp :: Int
+ -- this one must always be 7???
+ , selfztfeldSelFztZp :: Int
+ }
+
+
+
+
+---- Liniendaten
+
+-- | 246: Linienverlauf als aufzählung von halten
+-- nirgendwo sonst fremdschlüssel
+data LidVerlauf = LidVerlauf
+ { verlaufBasisVersion :: Integer
+ , verlaufLfdNr :: Integer
+ , verlaufNr :: Int
+ , verlaufStrLiVar :: Text
+ , verlaufOnrTypNr :: OrtTypNr
+ , verlaufOrtNr :: Integer
+ , verlaufZnrNr :: Int
+ , verlaufAnrNr :: Maybe Int
+ , verlaufEinfangbereich :: Int
+ , verlaufLiKnoten :: Bool
+ , verlaufProduktiv :: Bool
+ , verlaufEinsteigeverbot :: Bool
+ , verlaufAussteigeverbot :: Bool
+ , verlaufInnerortsverbot :: Bool
+ , verlaufBedarfshalt :: Bool
+ }
+
+
+-- | 226
+data RecLid = RecLid
+ { reclidBasisVersion :: Integer
+ , reclidLiNr :: Int
+ , reclidStrLiVar :: Text
+ , reclidRoutenNr :: Int
+ , reclidLiRiNr :: Int
+ -- ^ 1..2
+ , reclidBereichNr :: Int
+ , reclidLiKuerzel :: Text
+ , reclidLidname :: Text
+ , reclidRoutenArt :: Fahrtart
+ , reclidLinienCode :: Maybe Integer
+ , reclidLinienId :: Text
+ -- ^ this one might just be a byte array??
+ }
+
+
+
+------ Fahrplandaten
+
+-- | 715
+data RecFrt = RecFrt
+ { recfrtBasisVersion :: Integer
+ , recfrtFid :: Integer
+ , recfrtStart :: Int
+ , recfrtLiNr :: Int
+ , recfrtTagesartNr :: Int
+ , recfrtLiKuNr :: Int
+ , recfrtFahrtartNr :: Fahrtart
+ , recfrtFgrNr :: Integer
+ , recfrtUmUid :: Maybe Integer
+ , recfrtZugNr :: Integer
+ , recfrtDurchbiFrtStart :: Bool
+ , recfrtDurchbiFrtEnde :: Bool
+ , recfrtFahrtBezeichner :: Text
+ , recfrtZielEnergieMenge :: Integer
+ }
+
+-- | 308: Fahrtabhängiges Warten am Haltepunkt (e.g. Anschlusssicherung)
+-- nicht in fremdschlüsseln erwähnt, optional
+data RecFrtHzt = RecFrtHzt
+ { recfrthztBasisVersion :: Integer
+ , recfrthztFid :: Integer
+ , recfrthztOnrTypNr :: OrtTypNr
+ , recfrthztOrtNr :: Integer
+ , recfrthztZeit :: Int
+ }
+
+-- | 310: Fahrzeugumläufe
+data RecUmlauf = RecUmlauf
+ { umlaufBasisVersion :: Integer
+ , umlaufTagesartNr :: Int
+ , umlaufUmUid :: Int
+ , umlaufAnfOrt :: Int
+ , umlaufAnfOnrTyp :: OrtTypNr
+ , umlaufEndOrt :: Int
+ , umlaufEndOnrTyp :: OrtTypNr
+ , umlaufFzgTypNr :: Maybe Int
+ }
+
+
+-- TODO: ÖPNV DM 4.1 UMS_Z_RI Bezeichner der Linien-Richtung
+data Richtung
+
+
+------ Anschlussdaten
+data Einzelanschluss = Einzelanschluss
+ { einzelBasisVersion :: Integer
+ , einzelBasisEinanNr :: Int
+ , einzelBasisAnschlussName :: Text
+ , einzelBasisAnschlussGruppe :: Text
+ , einzelLeitstellenkennung :: Int
+ , einzelZubLiNr :: Int
+ , einzelZubLiRiNr :: Richtung
+ , einzelZubOrtRefOrt :: Int
+ , einzelZubOnrTypNr :: Maybe OnrTypNr
+ , einzelZubOrtNr :: Maybe Int
+ , einzelVonOrtRefOrt :: Maybe Int
+ , einzelLinienId :: Text
+ , einzelRichtungsId :: Text
+ , einzelAsbid :: Text
+ , einzelAbbLiNr :: Int
+ , einzelAbbLiRiNr :: Int
+ , einzelAbbOrtRefOrt :: Int
+ , einzelAbbOnrTypNr :: Maybe OnrTypNr
+ , einzelNachOrtRefOrt :: Maybe Int
+ }
+
+data RecUms = RecUms
+ { recumsBasisVersion :: Integer
+ , recumsEinanNr :: Int
+ , recumsTagesartNr :: Int
+ , recumsUmsBeginn :: Int
+ , recumsUmsEnde :: Int
+ , recumsUmsMin :: Int
+ , recumsUmsMax :: Int
+ , recumsMaxVerzMan :: Int
+ , recumsMaxVerzAuto :: Int
+ }