diff options
-rw-r--r-- | vdv-protocol.cabal | 1 | ||||
-rw-r--r-- | vdv-server/VDV452.hs | 483 |
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 + } |