summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
+ }