summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstuebinm2022-11-23 23:39:27 +0100
committerstuebinm2022-11-23 23:39:27 +0100
commitf0f5fa44dd3dbc2a5a6308e2dce047a82c8b1be2 (patch)
tree6ff1a8a97cc78b6e2664a0fa97227bcbf539eb0f
parent97b99ed70f900716e17771f14a210dbed2ab9841 (diff)
VDV 452 instances for serialisation
this may occasionally produce wrong output. In a lot of places I'm not entirey sure if I understood the standard correctly …
-rw-r--r--vdv-server/VDV451.hs37
-rw-r--r--vdv-server/VDV452.hs593
2 files changed, 529 insertions, 101 deletions
diff --git a/vdv-server/VDV451.hs b/vdv-server/VDV451.hs
index 1d56e1c..b962208 100644
--- a/vdv-server/VDV451.hs
+++ b/vdv-server/VDV451.hs
@@ -47,10 +47,6 @@ instance ÖPNVEncode Text where
instance ÖPNVEncode Day where
encode day = "\""+|crop 2 d|+"."+|crop 2 m|+"."+|crop 4 y|+"\""
where (y,m,d) = toGregorian day
- crop n thing = if T.length shown < n
- then T.replicate (n - T.length shown) "0" <> shown
- else T.takeEnd n shown
- where shown = T.pack $ show thing
-- | for things which can be encoded as either string or number,
-- this module defaults to strings. Add this newtype to the schema
@@ -69,6 +65,32 @@ instance ÖPNVEncode Int
instance ÖPNVEncode Integer
+-- | these are encoded in a horrible format
+newtype Longitude = Longitude Double
+newtype Latitude = Latitude Double
+
+encodeGeoLength :: Double -> ByteString
+encodeGeoLength d' = ""+|sign|+""+|crop 3 deg|+""+|crop 2 min|+""+|crop 5 sec|+""
+ where deg = truncate d
+ min = truncate (d * 60) `mod` 60
+ sec = truncate (d * 3600 * 1000) `mod` (60 * 1000)
+ d = abs d'
+ sign :: Text
+ sign = if d' < 0 then "-" else ""
+
+instance ÖPNVEncode Latitude where
+ encode (Latitude d) = encodeGeoLength d
+instance ÖPNVEncode Longitude where
+ encode (Longitude d) = encodeGeoLength d
+
+-- | this isn't specified anywhere, but seems to be what VDV 452 implies
+instance ÖPNVEncode a => ÖPNVEncode (Maybe a) where
+ encode (Just a) = encode a
+ encode Nothing = "NULL"
+
+instance ÖPNVEncode Bool where
+ encode False = "0"
+ encode True = "1"
data ÖPNVBefehl =
MOD | SRC | CHS | VER | IFV
@@ -102,6 +124,7 @@ instance ÖPNVEncode ÖPNVType where
class ÖPNVDatum a where
tableName :: Proxy a -> ByteString
+ tableNumber :: Proxy a -> Int
tableSchema :: Proxy a -> [(ByteString, ÖPNVType, a -> Feld)]
encodeRow :: forall a. ÖPNVDatum a => a -> [Feld]
@@ -145,3 +168,9 @@ data ÖPNVOptions = ÖPNVOptions
. C8.intercalate "; "
. fmap (\case { (F a) -> encode a; Raw a -> a })
(colNames, colTypes) = unzip (tableInfo (Proxy @a))
+
+
+crop n thing = if T.length shown < n
+ then T.replicate (n - T.length shown) "0" <> shown
+ else T.takeEnd n shown
+ where shown = T.pack $ show thing
diff --git a/vdv-server/VDV452.hs b/vdv-server/VDV452.hs
index 0a54a38..38e6a8d 100644
--- a/vdv-server/VDV452.hs
+++ b/vdv-server/VDV452.hs
@@ -7,7 +7,8 @@
module VDV452 where
import Data.Time (Day)
import Data.Text (Text)
-import VDV451 (ÖPNVEncode, ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber))
+import VDV451 (ÖPNVEncode (encode), ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber), Longitude, Latitude)
+import Data.ByteString (ByteString)
@@ -21,6 +22,7 @@ data BasisVerGueltigkeit = BasisVerGueltigkeit
instance ÖPNVDatum BasisVerGueltigkeit where
tableName _ = "BASIS_VER_GUELTIGKEIT"
+ tableNumber _ = 993
tableSchema _ =
[ ("VER_GUELTIGKEIT", ÖNum 8, F . AsNumber . basisVerGueltigkeit)
, ("BASIS_VERSION", ÖNum 9, F . basisBasisVersion)]
@@ -35,13 +37,14 @@ data MengeBasisVersionen = MengeBasisVersionen
instance ÖPNVDatum MengeBasisVersionen where
tableName _ = "MENGE_BASIS_VERSIONEN"
+ tableNumber _ = 485
tableSchema _ =
[ ("BASIS_VERSION", ÖNum 9, F . mengeBasisVersion)
, ("BASIS_VERSION_TEXT", ÖChar 40, F . mengeBasisVersionText)]
-- | 348
data Firmenkalender = Firmenkalender
- { firmenkalenderBasisVersion :: Integer
+ { firmenkalenderBasisVersion :: Int
-- ^ Fremdschlüssel von MengeBasisVersionen
, firmenkalenderBetriebstag :: Day
, firmenkalenderBetriebstagText :: Text
@@ -49,14 +52,33 @@ data Firmenkalender = Firmenkalender
-- TODO this is probably en enum
}
+instance ÖPNVDatum Firmenkalender where
+ tableName _ = "FIRMENKALENDER"
+ tableNumber _ = 348
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . firmenkalenderBasisVersion)
+ , ("BETRIEBSTAG", ÖNum 8, F . firmenkalenderBetriebstag)
+ , ("BETRIEBSTAG_TEXT", ÖChar 40, F . firmenkalenderBetriebstagText)
+ , ("TAGESART_NR", ÖNum 3, F . firmenkalenderTagesArtNr)
+ ]
+
+
data MengeTagesart = MengeTagesart
- { tagesartBasisVersion :: Integer
+ { tagesartBasisVersion :: Int
-- ^ P1, Fremdschlüssel von MengeBasisVersionen
, tagesartTagesartNr :: Int
-- ^ P2
, tagesartTagesartText :: Text
}
+instance ÖPNVDatum MengeTagesart where
+ tableName _ = "MENGE_TAGESART"
+ tableNumber _ = 290
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . tagesartBasisVersion)
+ , ("TAGESART_NR", ÖNum 3, F . tagesartTagesartNr)
+ , ("TAGESART_TEXT", ÖChar 40, F . tagesartTagesartText)
+ ]
@@ -66,53 +88,100 @@ data OnrTypNr =
OnrHaltepunkt | OnrBetriebshofpunkt | OnrOrtsmarke
| OnrLSAPunkt | OnrRoutenzwischenpunkt | OnrBetriebspunkt
| OnrGrenzpunkt
+ deriving (Show, Enum)
+
+instance ÖPNVEncode OnrTypNr where
+ encode typ = encode (1 + fromEnum typ)
data MengeOnrTyp = MengeOnrTyp
- { onrtypBasisVersion :: Integer
+ { onrtypBasisVersion :: Int
, onrtypTypNr :: OnrTypNr
- , onrStrTyp :: Text
+ , onrtypStrTyp :: Text
-- TODO: this might be an enum?
- , onrTypText :: Text
+ , onrtypText :: Text
}
+instance ÖPNVDatum MengeOnrTyp where
+ tableName _ = "MENGE_ONR_TYP"
+ tableNumber _ = 998
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . onrtypBasisVersion)
+ , ("ONR_TYP_NR", ÖNum 2, F . onrtypTypNr)
+ , ("STR_ONR_TYP", ÖChar 6, F . onrtypStrTyp)
+ , ("ONR_TYP_TEXT", ÖChar 40, F . onrtypText)
+ ]
+
data OrtTypNr = OrtHaltestelle | OrtBetriebshof
+ deriving Show
+
+instance ÖPNVEncode OrtTypNr where
+ encode OrtHaltestelle = encode (1 :: Int)
+ encode OrtBetriebshof = encode (2 :: Int)
data MengeOrtTyp = MengeOrtTyp
- { orttypBasisVersion :: Integer
+ { orttypBasisVersion :: Int
, orttypTypNr :: OrtTypNr
, orttypText :: Text
}
+instance ÖPNVDatum MengeOrtTyp where
+ tableName _ = "MENGE_ONR_TYP"
+ tableNumber _ = 997
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . orttypBasisVersion)
+ , ("ORT_TYP_NR", ÖNum 2, F . orttypTypNr)
+ , ("ORT_TYP_TEXT", ÖChar 40, F . orttypText)
+ ]
+
data RecHp = RecHp
- { rechpBasisVersion :: Integer
+ { rechpBasisVersion :: Int
, rechpOnrTypNr :: OrtTypNr
- , rechpOrtNr :: Integer
+ , rechpOrtNr :: Int
, rechpHaltepunktNr :: Int
, rechpZusatzInfo :: Text
}
+instance ÖPNVDatum RecHp where
+ tableName _ = "REC_HP"
+ tableNumber _ = 229
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . rechpBasisVersion)
+ , ("ONR_TYP_NR", ÖNum 2, F . rechpOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . rechpOrtNr)
+ , ("HALTEPUNKT_NR", ÖNum 2, F . rechpHaltepunktNr)
+ , ("ZUSATZ_INFO", ÖChar 40, F . rechpZusatzInfo)
+ ]
+
data RecOm = RecOm
- { recomBasisVersion :: Integer
+ { recomBasisVersion :: Int
, recomOnrTypNr :: OnrTypNr
-- ^ nur 3..4
- , recomOrtNr :: Integer
+ , recomOrtNr :: Int
, recomOrmKuerzel :: Text
, recomOrmacode :: Int
- , recOrmText :: Text
+ , recomOrmText :: Text
}
--- | these are encoded in a horrible format
-newtype Longitude = Longitude Int
-newtype Latitude = Latitude Int
+instance ÖPNVDatum RecOm where
+ tableName _ = "REC_OM"
+ tableNumber _ = 295
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recomBasisVersion)
+ , ("ONR_TYP_NR", ÖNum 2, F . recomOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . recomOrtNr)
+ , ("ORM_KUERZEL", ÖChar 6, F . recomOrmKuerzel)
+ , ("ORMACODE", ÖNum 5, F . recomOrmacode)
+ , ("ORM_TEXT", ÖChar 40, F . recomOrmText)
+ ]
-- | tatsächliche Ortsbeschreibung
data RecOrt = RecOrt
- { recortBasisVersion :: Integer
+ { recortBasisVersion :: Int
, recortOnrTypNr :: OnrTypNr
- , recortOrtNr :: Integer
+ , recortOrtNr :: Int
, recortOrtName :: Text
, recortHastNrLokal :: Int
- , recortHstNrNational :: Integer
+ , recortHstNrNational :: Int
, recortHstNrInternational :: Text
-- these only if recortOnrTypNr = 1 or 2
, recortOrtRefOrt :: Int
@@ -122,19 +191,41 @@ data RecOrt = RecOrt
, recortOrtRefOrtName :: Text
, recortZoneWabeNr :: Maybe Int
--- these are entirely optional
- , recortOrtPosLaenge :: Longitude
- , rocortOrtPosBreite :: Latitude
- , recortPosHoehe :: Int
- , recortOrtRichtung :: Int
+ , recortOrtPosLaenge :: Maybe Longitude
+ , recortOrtPosBreite :: Maybe Latitude
+ , recortPosHoehe :: Maybe Int
+ , recortOrtRichtung :: Maybe Int
}
+instance ÖPNVDatum RecOrt where
+ tableName _ = "REC_ORT"
+ tableNumber _ = 253
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recortBasisVersion)
+ , ("ONR_TYP_NR", ÖNum 2, F . recortOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . recortOrtNr)
+ , ("ORT_NAME", ÖChar 40, F . recortOrtName)
+ , ("ORT_REF_ORT", ÖNum 6, F . recortOrtRefOrt)
+ , ("ORT_REF_ORT_TYP", ÖNum 2, F . recortOrtRefOrtTyp)
+ , ("ORT_REF_ORT_LangNr", ÖNum 7, F . recortOrtRefOrtLangNr)
+ , ("ORT_REF_ORT_KUERZEL", ÖChar 8, F . recortOrtRefOrtKuerzel)
+ , ("ORT_REF_ORT_NAME", ÖChar 40, F . recortOrtRefOrtName)
+ , ("ZONE_WABE_NR", ÖNum 5, F . recortZoneWabeNr)
+ , ("ORT_POS_LAENGE", ÖNum 10, F . recortOrtPosLaenge)
+ , ("ORT_POS_BREITE", ÖNum 10, F . recortOrtPosBreite)
+ , ("ORT_POS_HOEHE", ÖNum 10, F . recortPosHoehe)
+ , ("ORT_RICHTUNG", ÖNum 3, F . recortOrtRichtung)
+ , ("HAST_NR_LOKAL", ÖNum 9, F . recortHastNrLokal)
+ , ("HST_NR_NATIONAL", ÖNum 9, F . recortHstNrNational)
+ , ("HST_NR_INTERNATIONAL", ÖChar 30, F . recortHstNrInternational)
+ ]
-- Betriebsdaten
data Fahrzeug = Fahrzeug
- { fzgBasisVersion :: Integer
+ { fzgBasisVersion :: Int
, fzgNr :: Int
, fzgTypNr :: Maybe Int
, fzgPolKenn :: Text
@@ -143,24 +234,56 @@ data Fahrzeug = Fahrzeug
, fzgFIN :: Text
}
+instance ÖPNVDatum Fahrzeug where
+ tableName _ = "FAHRZEUG"
+ tableNumber _ = 443
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . fzgBasisVersion)
+ , ("FZG_NR", ÖNum 4, F . fzgNr)
+ , ("FZG_TYP_NR", ÖNum 3, F . fzgTypNr)
+ , ("POLKENN", ÖChar 20, F . fzgPolKenn)
+ , ("FIN", ÖChar 17, F . fzgFIN)
+ ]
+
+
data ZulVerkehsbetrieb = ZulVerkehsbetrieb
- { zulBasisVersion :: Integer
+ { zulBasisVersion :: Int
, zulUnternehmen :: Int
, zulAbkUnternehmen :: Text
, zulBetriebsgebietBez :: Text
}
+instance ÖPNVDatum ZulVerkehsbetrieb where
+ tableName _ = "ZUL_VERKEHRSBETRIEB"
+ tableNumber _ = 992
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . zulBasisVersion)
+ , ("UNTERNEHMEN", ÖNum 3, F . zulUnternehmen)
+ , ("ABK_UNTERNEHMEN", ÖChar 6, F . zulAbkUnternehmen)
+ , ("BETRIEBSGEBIET_BEZ", ÖChar 40, F . zulBetriebsgebietBez)
+ ]
+
-- | 333
data MengeBereich = MengeBereich
- { mengebereichBasisVersion :: Integer
+ { mengebereichBasisVersion :: Int
, mengebereichBereichNr :: Text
, mengebereichStrBereich :: Text
, mengebereichBereichText :: Text
}
+instance ÖPNVDatum MengeBereich where
+ tableName _ = "MENGE_BEREICH"
+ tableNumber _ = 333
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . mengebereichBasisVersion)
+ , ("BEREICH_NR", ÖNum 3, F . mengebereichBereichNr)
+ , ("STR_BEREICH", ÖChar 6, F . mengebereichStrBereich)
+ , ("BEREICH_TEXT", ÖChar 40, F . mengebereichBereichText)
+ ]
+
-- | 293
data MengeFzgTyp = MengeFzgTyp
- { fzgtypBasisVersion :: Integer
+ { fzgtypBasisVersion :: Int
, fzgtypFzgTypNr :: Int
, fzgtypFzgLaenge :: Int
-- ^ given in metres
@@ -168,12 +291,12 @@ data MengeFzgTyp = MengeFzgTyp
-- ^ given in centimetres
, fzgtypHoehe :: Int
-- ^ given in centimetres
- , fzgtypGewicht :: Integer
+ , fzgtypGewicht :: Int
-- ^ kilograms
- , fzgtypSitz :: Integer
- , fzgtypSteh :: Integer
+ , fzgtypSitz :: Int
+ , fzgtypSteh :: Int
, fzgtypText :: Text
- , fzgtypSonderPlatz :: Integer
+ , fzgtypSonderPlatz :: Int
, fzgtypStrFzgTyp :: Text
-- ^ kursbezeichnung des fahrzeugtyps
-- , fzgtypBatterieTypNr :: Maybe Int
@@ -183,20 +306,49 @@ data MengeFzgTyp = MengeFzgTyp
-- , fzgtypVerbrauchZeit :: Int
}
+instance ÖPNVDatum MengeFzgTyp where
+ tableName _ = "MENGE_FZG_TYP"
+ tableNumber _ = 293
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . fzgtypBasisVersion)
+ , ("FZG_TYP_NR", ÖNum 3, F . fzgtypFzgTypNr)
+ , ("FZG_LAENGE", ÖNum 2, F . fzgtypFzgLaenge)
+ , ("FZG_TYP_BREITE", ÖNum 3, F . fzgtypBreite)
+ , ("FZG_TYP_HOEHE", ÖNum 3, F . fzgtypHoehe)
+ , ("FZG_TYP_GEWICHT", ÖNum 6, F . fzgtypGewicht)
+ , ("FZG_TYP_SITZ", ÖNum 3, F . fzgtypSitz)
+ , ("FZG_TYP_STEH", ÖNum 3, F . fzgtypSteh)
+ , ("FZG_TYP_TEXT", ÖChar 40, F . fzgtypText)
+ , ("SONDER_PLATZ", ÖNum 3, F . fzgtypSonderPlatz)
+ , ("STR_FZG_TYP", ÖChar 6, F . fzgtypStrFzgTyp)
+ ]
+
-- | 996: Aufzählung von Fahrzeug-Ansagetexten
-- this one seems to be optional
data RecAnr = RecAnr
- { recanrBasisVersion :: Integer
+ { recanrBasisVersion :: Int
, recanrAnrNr :: Int
, recanrAnrKuerzel :: Text
, recanrAnrText :: Text
}
+instance ÖPNVDatum RecAnr where
+ tableName _ = "REC_ANR"
+ tableNumber _ = 996
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recanrBasisVersion)
+ , ("ANR_NR", ÖNum 4, F . recanrAnrNr)
+ , ("ANR_KUERZEL", ÖChar 10, F . recanrAnrKuerzel)
+ , ("ANR_TEXT", ÖChar 200, F . recanrAnrText)
+ ]
+
+
+
-- | 995: Aufzählung der am Fahrzeug angezeigten Fahrtziele
-- this one is probably optional as well
data RecZnr = RecZnr
- { recznrBasisVersion :: Integer
- , recznrZnrNr :: Integer
+ { recznrBasisVersion :: Int
+ , recznrZnrNr :: Int
, recznrKuerzel :: Text
, recznrFahrerkurztext :: Text
, recznrSeitentext :: Text
@@ -204,7 +356,18 @@ data RecZnr = RecZnr
, recznrCode :: Text
}
-
+instance ÖPNVDatum RecZnr where
+ tableName _ = "REC_ZNR"
+ tableNumber _ = 994
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recznrBasisVersion)
+ , ("ZNR_NR", ÖNum 4, F . recznrZnrNr)
+ , ("ZNR_KUERZEL", ÖChar 10, F . recznrKuerzel)
+ , ("FAHRERKURZTEXT", ÖChar 44, F . recznrFahrerkurztext)
+ , ("SEITENTEXT", ÖChar 160, F . recznrSeitentext)
+ , ("ZNR_TEXT", ÖChar 160, F . recznrZnrText)
+ , ("ZNR_CODE", ÖChar 68, F . recznrCode)
+ ]
@@ -212,150 +375,304 @@ data RecZnr = RecZnr
-- 299
data RecSel = RecSel
- { recselBasisVersion :: Integer
+ { recselBasisVersion :: Int
, recselBereichNr :: Int
-- ^ fremdschlüssel MangeBereich
, recselOnrTypNr :: OnrTypNr
-- ^ fremdschlüssel MengeOnrTyp
- , recselOrtNr :: Integer
+ , recselOrtNr :: Int
-- ^ fremdschlüssel RecOrt
- , recselSelZiel :: Integer
+ , recselSelZiel :: Int
, recselSelZielTyp :: OrtTypNr
- , recselSelLaenge :: Integer
+ , recselSelLaenge :: Int
}
+instance ÖPNVDatum RecSel where
+ tableName _ = "REC_SEL"
+ tableNumber _ = 299
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recselBasisVersion)
+ , ("BEREICH_NR", ÖNum 3, F . recselBereichNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . recselOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . recselOrtNr)
+ , ("SEL_ZIEL", ÖNum 6, F . recselSelZiel)
+ , ("SEL_ZIEL_TYP", ÖNum 2, F . recselSelZielTyp)
+ , ("SEL_LAENGE", ÖNum 5, F . recselSelLaenge)
+ ]
+
+
+
-- | 995: definition von zwischenpunkten
-- honestly i hope this one's optional
data RecSelZp = RecSelZp
- { recselzpBasisVersion :: Integer
+ { recselzpBasisVersion :: Int
, recselzpBereichNr :: Int
, recselzpOnrTypNr :: OrtTypNr
- , recselzpOrtNr :: Integer
- , recselzpSelZiel :: Integer
+ , recselzpOrtNr :: Int
+ , recselzpSelZiel :: Int
, recselzpSelZielTyp :: OrtTypNr
- , recselzpZpOnr :: Integer
+ , recselzpZpOnr :: Int
, recselzpZpTyp :: Int
-- this one only takes values 3..7???
, recselzpSelZpLaenge :: Maybe Int
- , recselzpZpLfdNr :: Maybe Integer
+ , recselzpZpLfdNr :: Maybe Int
}
+instance ÖPNVDatum RecSelZp where
+ tableName _ = "REC_SEL_ZP"
+ tableNumber _ = 995
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recselzpBasisVersion)
+ , ("BEREICH_NR", ÖNum 3, F . recselzpBereichNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . recselzpOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . recselzpOrtNr)
+ , ("SEL_ZIEL", ÖNum 6, F . recselzpSelZiel)
+ , ("SEL_ZIEL_TYP", ÖNum 2, F . recselzpSelZielTyp)
+ , ("ZP_ONR", ÖNum 6, F . recselzpZpOnr)
+ , ("ZP_TYP", ÖNum 2, F . recselzpZpTyp)
+ , ("SEL_ZP_LAENGE", ÖNum 5, F . recselzpSelZpLaenge)
+ , ("ZP_LFD_NR", ÖNum 3, F . recselzpZpLfdNr)
+ ]
+
-- | 222: Fahrzeitgruppen (whatever that is)
-- seems to be optional?
data MengeFgr = MengeFgr
- { mengefgrBasisVersion :: Integer
- , mengefgrFgrNr :: Integer
+ { mengefgrBasisVersion :: Int
+ , mengefgrFgrNr :: Int
, mengefgrText :: Text
, mengefgrTypNr :: Int
}
+instance ÖPNVDatum MengeFgr where
+ tableName _ = "MENGE_FGR"
+ tableNumber _ = 222
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . mengefgrBasisVersion)
+ , ("FGR_NR", ÖNum 9, F . mengefgrFgrNr)
+ , ("FGR_TEXT", ÖChar 40, F . mengefgrText)
+ , ("FGR_TYP_NR", ÖNum 3, F . mengefgrTypNr)
+ ]
+
--- | 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
+ { orthztfBasisVersion :: Int
+ , orthztfFgrNr :: Int
, orthztfOnrTypNr :: OrtTypNr
- , orthztfOrtNr :: Integer
+ , orthztfOrtNr :: Int
, orthztfHpHzt :: Int
}
+instance ÖPNVDatum OrtHztf where
+ tableName _ = "ORT_HZTF"
+ tableNumber _ = 999
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . orthztfBasisVersion)
+ , ("FGR_NR", ÖNum 9, F . orthztfFgrNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . orthztfOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . orthztfOrtNr)
+ , ("HP_HZT", ÖNum 6, F . orthztfHpHzt)
+ ]
+
-- | 282: für streckenabschnitte planmäßig vorgesehen Fahrzeit
-- nie als fremdschlüssel benutzt, ist optional
data SelFztFeld = SelFztFeld
- { selfztBasisVersion :: Integer
+ { selfztBasisVersion :: Int
, selfztBereichNr :: Int
- , selfztFgrNr :: Integer
+ , selfztFgrNr :: Int
, selfztOnrTypNr :: OrtTypNr
- , selfztOrtNr :: Integer
- , selfztSelZiel :: Integer
+ , selfztOrtNr :: Int
+ , selfztSelZiel :: Int
, selfztSelZielTyp :: OrtTypNr
, selfztSelFzt :: Int
}
+instance ÖPNVDatum SelFztFeld where
+ tableName _ = "SEL_FZT_FELD"
+ tableNumber _ = 282
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . selfztBasisVersion)
+ , ("BEREICH_NR", ÖNum 3, F . selfztBereichNr)
+ , ("FGR_NR", ÖNum 9, F . selfztFgrNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . selfztOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . selfztOrtNr)
+ , ("SEL_ZIEL", ÖNum 6, F . selfztSelZiel)
+ , ("SEL_ZIEL_TYP", ÖNum 2, F . selfztSelZielTyp)
+ , ("SEL_FZT", ÖNum 6, F . selfztSelFzt)
+ ]
+
-- | 225: keine ahnung, irgendwas halt
data RecUeb = RecUeb
- { recuebBasisVersion :: Integer
+ { recuebBasisVersion :: Int
, recuebBereichNr :: Int
, recuebOnrTypNr :: OrtTypNr
- , recuebOrtNr :: Integer
- , recuebUebZielTyp :: OrtTypNr
- , recuebZiel :: Integer
+ , recuebOrtNr :: Int
+ , recuebZielTyp :: OrtTypNr
+ , recuebZiel :: Int
, recuebLaenge :: Int
}
+instance ÖPNVDatum RecUeb where
+ tableName _ = "REC_UEB"
+ tableNumber _ = 225
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recuebBasisVersion)
+ , ("BEREICH_NR", ÖNum 3, F . recuebBereichNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . recuebOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . recuebOrtNr)
+ , ("UEB_ZIEL_TYP", ÖNum 2, F . recuebZielTyp)
+ , ("UEB_ZIEL", ÖNum 6, F . recuebZiel)
+ , ("UEB_LAENGE", ÖNum 6, F . recuebLaenge)
+ ]
+
-- | 247
-- nirgendwo anders benutzt, ist wohl optional
data UebFzt = UebFzt
- { uebfztBasisVersion :: Integer
+ { uebfztBasisVersion :: Int
, uebfztBereichNr :: Int
- , uebfztFgrNr :: Integer
+ , uebfztFgrNr :: Int
, uebfztOnrTypNr :: OrtTypNr
- , uebfztOrtNr :: Integer
- , uebZielTyp :: OrtTypNr
- , uebZiel :: Integer
- , uebFahrzeit :: Int
+ , uebfztOrtNr :: Int
+ , uebfztZielTyp :: OrtTypNr
+ , uebfztZiel :: Int
+ , uebfztFahrzeit :: Int
}
+instance ÖPNVDatum UebFzt where
+ tableName _ = "UEB_FZT"
+ tableNumber _ = 247
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . uebfztBasisVersion)
+ , ("BEREICH_NR", ÖNum 3, F . uebfztBereichNr)
+ , ("FGR_NR", ÖNum 9, F . uebfztFgrNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . uebfztOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . uebfztOrtNr)
+ , ("UEB_ZIEL_TYP", ÖNum 2, F . uebfztZielTyp)
+ , ("UEB_ZIEL", ÖNum 6, F . uebfztZiel)
+ , ("UEB_Fahrzeit", ÖNum 6, F . uebfztFahrzeit)]
+
data Fahrtart = Normalfahrt | Betriebshofausfahrt
| Betriebshofeinfahrt | Zufahrt
+ deriving (Show, Enum)
+
+instance ÖPNVEncode Fahrtart where
+ encode a = encode (1 + fromEnum a)
-- | 332: Aufzählung von Fahrtarten
data MengeFahrtart = MengeFahrtart
- { fahrtartBasisVersion :: Integer
+ { fahrtartBasisVersion :: Int
, fahrtartNr :: Fahrtart
, fahrtartStrFahrtart :: Text
}
+instance ÖPNVDatum MengeFahrtart where
+ tableName _ = "MENGE_FAHRTART"
+ tableNumber _ = 332
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . fahrtartBasisVersion)
+ , ("FAHRTART_NR", ÖNum 2, F . fahrtartNr)
+ , ("STR_FAHRTART", ÖChar 6, F . fahrtartStrFahrtart)]
+
-- | 571: Beschreibung von Flächenzonen
data FlaechenZone = FlaechenZone
- { flaechenBasisVersion :: Integer
+ { flaechenBasisVersion :: Int
, flaechenZoneTypNr :: Int
- , flaechenZoneNr :: Integer
+ , flaechenZoneNr :: Int
, flaechenZoneKuerzel :: Text
, flaechenZoneName :: Text
, flaechenZoneAmtlicheNr :: Text
}
+instance ÖPNVDatum FlaechenZone where
+ tableName _ = "FLAECHEN_ZONE"
+ tableNumber _ = 571
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . flaechenBasisVersion)
+ , ("FL_ZONE_TYP_NR", ÖNum 1, F . flaechenZoneTypNr)
+ , ("FL_ZONE_NR", ÖNum 6, F . flaechenZoneNr)
+ , ("FL_ZONE_KUERZEL", ÖChar 8, F . flaechenZoneKuerzel)
+ , ("FL_ZONE_NAME", ÖChar 40, F . flaechenZoneName)
+ , ("FL_AMTLICHE_NR", ÖChar 20, F . flaechenZoneAmtlicheNr)
+ ]
-- | 539: Zuordnung der Orte zu Flächenzonen
-- nirgendwo referenziert, ist optional
data FlZoneOrt = FlZoneOrt
- { flzoneortBasisVersion :: Integer
- , flzoneortTypNr :: Int
- , flzoneortNr :: Integer
- , flzoneortOnrTypNr :: OnrTypNr
- , flzoneortOrtNr :: Integer
+ { flzoneBasisVersion :: Int
+ , flzoneTypNr :: Int
+ , flzoneNr :: Int
+ , flzoneOnrTypNr :: OnrTypNr
+ , flzoneOrtNr :: Int
}
+instance ÖPNVDatum FlZoneOrt where
+ tableName _ = "FL_ZONE_ORT"
+ tableNumber _ = 539
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . flzoneBasisVersion)
+ , ("FL_ZONE_TYP_NR", ÖNum 1, F . flzoneTypNr)
+ , ("FL_ZONE_NR", ÖNum 6, F . flzoneNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . flzoneOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . flzoneOrtNr)
+ ]
+
-- TODO: this probably has more fields?
data ZoneTypNr = Gebietskörperschaft | Verkehrszonen
+ deriving Show
+
+instance ÖPNVEncode ZoneTypNr where
+ encode Gebietskörperschaft = encode (1 :: Int)
+ encode Verkehrszonen = encode (1 ::Int)
-- | 572: Typen von Flächenzonen (Gebietskörperschaft)
data MengeFlaechenZoneTyp = MengeFlaechenZoneTyp
- { flaechenzoneBasisVeresion :: Integer
- , flaechenzoneZoneTypNr :: ZoneTypNr
- , flaechenzoneTypText :: Text
+ { mflzoneBasisVersion :: Int
+ , mflzoneTypNr :: ZoneTypNr
+ , mflzoneTypText :: Text
}
+instance ÖPNVDatum MengeFlaechenZoneTyp where
+ tableName _ = "MENGE_FLAECHEN_ZONE_TYP"
+ tableNumber _ = 572
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . mflzoneBasisVersion)
+ , ("FL_ZONE_TYP_NR", ÖNum 1, F . mflzoneTypNr)
+ , ("FL_ZONE_TYP_TEXT", ÖChar 40, F . mflzoneTypText)
+ ]
+
-- | 540
-- nirgendwo fremdschlüssel, optional
data SelFztFeldZp = SelFztFeldZp
- { selfztfeldBasisVersion :: Integer
- , selfztfeldBereichnr :: Int
- , selfztfeldFgrNr :: Integer
+ { selfztfeldBasisVersion :: Int
+ , selfztfeldBereichNr :: Int
+ , selfztfeldFgrNr :: Int
, selfztfeldOnrTypNr :: OrtTypNr
- , selfztfeldOrtNr :: Integer
- , selfztfeldSelZiel :: Integer
+ , selfztfeldOrtNr :: Int
+ , selfztfeldSelZiel :: Int
, selfztfeldSelZielTyp :: Int
-- this one can only be 1 or 2??
- , selfztfeldZpOnr :: Integer
+ , selfztfeldZpOnr :: Int
, selfztfeldZpTyp :: Int
-- this one must always be 7???
, selfztfeldSelFztZp :: Int
}
-
+instance ÖPNVDatum SelFztFeldZp where
+ tableName _ = "SEL_FZT_FELD_ZP"
+ tableNumber _ = 540
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . selfztfeldBasisVersion)
+ , ("BEREICH_NR", ÖNum 3, F . selfztfeldBereichNr)
+ , ("FGR_NR", ÖNum 9, F . selfztfeldFgrNr)
+ , ("ONR_TYP_NR", ÖNum 2, F . selfztfeldOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . selfztfeldOrtNr)
+ , ("SEL_ZIEL", ÖNum 6, F . selfztfeldSelZiel)
+ , ("SEL_ZIEL_TYP", ÖNum 2, F . selfztfeldSelZielTyp)
+ , ("ZP_ONR", ÖNum 6, F . selfztfeldZpOnr)
+ , ("ZP_TYP", ÖNum 2, F . selfztfeldZpTyp)
+ , ("SEL_FZT_ZP", ÖNum 6, F . selfztfeldSelFztZp)
+ ]
---- Liniendaten
@@ -363,12 +680,12 @@ data SelFztFeldZp = SelFztFeldZp
-- | 246: Linienverlauf als aufzählung von halten
-- nirgendwo sonst fremdschlüssel
data LidVerlauf = LidVerlauf
- { verlaufBasisVersion :: Integer
- , verlaufLfdNr :: Integer
+ { verlaufBasisVersion :: Int
+ , verlaufLfdNr :: Int
, verlaufNr :: Int
, verlaufStrLiVar :: Text
, verlaufOnrTypNr :: OrtTypNr
- , verlaufOrtNr :: Integer
+ , verlaufOrtNr :: Int
, verlaufZnrNr :: Int
, verlaufAnrNr :: Maybe Int
, verlaufEinfangbereich :: Int
@@ -380,10 +697,30 @@ data LidVerlauf = LidVerlauf
, verlaufBedarfshalt :: Bool
}
+instance ÖPNVDatum LidVerlauf where
+ tableName _ = "LID_VERLAUF"
+ tableNumber _ = 246
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . verlaufBasisVersion)
+ , ("LI_LFD_NR", ÖNum 3, F . verlaufLfdNr)
+ , ("LI_NR", ÖNum 6, F . verlaufNr)
+ , ("STR_LI_VAR", ÖChar 6, F . verlaufStrLiVar)
+ , ("ONR_TYP_NR", ÖNum 2, F . verlaufOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . verlaufOrtNr)
+ , ("ZNR_NR", ÖNum 4, F . verlaufZnrNr)
+ , ("ANR_NR", ÖNum 4, F . verlaufAnrNr)
+ , ("EINFANGBEREICH", ÖNum 3, F . verlaufEinfangbereich)
+ , ("LI_KNOTEN", ÖNum 1, F . verlaufLiKnoten)
+ , ("PRODUKTIV", ÖNum 1, F . verlaufProduktiv)
+ , ("EINSTEIGEVERBOT", ÖNum 1, F . verlaufEinsteigeverbot)
+ , ("AUSSTEIGEVERBOT", ÖNum 1, F . verlaufAussteigeverbot)
+ , ("INNERORTSVERBOT", ÖNum 1, F . verlaufInnerortsverbot)
+ , ("BEDARFSHALT", ÖNum 1, F . verlaufBedarfshalt)
+ ]
-- | 226
data RecLid = RecLid
- { reclidBasisVersion :: Integer
+ { reclidBasisVersion :: Int
, reclidLiNr :: Int
, reclidStrLiVar :: Text
, reclidRoutenNr :: Int
@@ -393,46 +730,95 @@ data RecLid = RecLid
, reclidLiKuerzel :: Text
, reclidLidname :: Text
, reclidRoutenArt :: Fahrtart
- , reclidLinienCode :: Maybe Integer
+ , reclidLinienCode :: Maybe Int
, reclidLinienId :: Text
-- ^ this one might just be a byte array??
}
+instance ÖPNVDatum RecLid where
+ tableName _ = "REC_LID"
+ tableNumber _ = 226
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . reclidBasisVersion)
+ , ("LI_NR", ÖNum 6, F . reclidLiNr)
+ , ("STR_LI_VAR", ÖChar 6, F . reclidStrLiVar)
+ , ("ROUTEN_NR", ÖNum 4, F . reclidRoutenNr)
+ , ("LI_RI_NR", ÖNum 3, F . reclidLiRiNr)
+ , ("BEREICH_NR", ÖNum 3, F . reclidBereichNr)
+ , ("LI_KUERZEL", ÖChar 6, F . reclidLiKuerzel)
+ , ("LIDNAME", ÖChar 40, F . reclidLidname)
+ , ("ROUTEN_ART", ÖNum 2, F . reclidRoutenArt)
+ , ("LINIEN_CODE", ÖNum 2, F . reclidLinienCode)
+ , ("LinienID", ÖChar 128, F . reclidLinienId)
+ ]
------ Fahrplandaten
-- | 715
data RecFrt = RecFrt
- { recfrtBasisVersion :: Integer
- , recfrtFid :: Integer
+ { recfrtBasisVersion :: Int
+ , recfrtFid :: Int
, recfrtStart :: Int
, recfrtLiNr :: Int
, recfrtTagesartNr :: Int
, recfrtLiKuNr :: Int
, recfrtFahrtartNr :: Fahrtart
- , recfrtFgrNr :: Integer
- , recfrtUmUid :: Maybe Integer
- , recfrtZugNr :: Integer
+ , recfrtFgrNr :: Int
+ , recfrtStrLiVar :: Text
+ , recfrtUmUid :: Maybe Int
+ , recfrtZugNr :: Int
, recfrtDurchbiFrtStart :: Bool
, recfrtDurchbiFrtEnde :: Bool
, recfrtFahrtBezeichner :: Text
- , recfrtZielEnergieMenge :: Integer
+ , recfrtZielEnergieMenge :: Int
}
+instance ÖPNVDatum RecFrt where
+ tableName _ = "REC_FRT"
+ tableNumber _ = 715
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recfrtBasisVersion)
+ , ("FRT_FID", ÖNum 10, F . recfrtFid)
+ , ("FRT_START", ÖNum 6, F . recfrtStart)
+ , ("LI_NR", ÖNum 6, F . recfrtLiNr)
+ , ("TAGESART_NR", ÖNum 3, F . recfrtTagesartNr)
+ , ("LI_KU_NR", ÖNum 6, F . recfrtLiKuNr)
+ , ("FAHRTART_NR", ÖNum 2, F . recfrtFahrtartNr)
+ , ("FGR_NR", ÖNum 9, F . recfrtFgrNr)
+ , ("STR_LI_VAR", ÖChar 6, F . recfrtStrLiVar)
+ , ("UM_UID", ÖNum 8, F . recfrtUmUid)
+ , ("ZUGNR", ÖNum 7, F . recfrtZugNr)
+ , ("DURCHBI_FRT_START", ÖNum 1, F . recfrtDurchbiFrtStart)
+ , ("DURCHBI_FRT_ENDE", ÖNum 1, F . recfrtDurchbiFrtEnde)
+ , ("FahrtBezeichner", ÖChar 128, F . recfrtFahrtBezeichner)
+ , ("ZIEL_ENERGIE_MENGE", ÖNum 6, F . recfrtZielEnergieMenge)
+ ]
+
-- | 308: Fahrtabhängiges Warten am Haltepunkt (e.g. Anschlusssicherung)
-- nicht in fremdschlüsseln erwähnt, optional
data RecFrtHzt = RecFrtHzt
- { recfrthztBasisVersion :: Integer
- , recfrthztFid :: Integer
+ { recfrthztBasisVersion :: Int
+ , recfrthztFid :: Int
, recfrthztOnrTypNr :: OrtTypNr
- , recfrthztOrtNr :: Integer
+ , recfrthztOrtNr :: Int
, recfrthztZeit :: Int
}
+instance ÖPNVDatum RecFrtHzt where
+ tableName _ = "REC_FRT_HZT"
+ tableNumber _ = 308
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . recfrthztBasisVersion)
+ , ("FRT_FID", ÖNum 10, F . recfrthztFid)
+ , ("ONR_TYP_NR", ÖNum 2, F . recfrthztOnrTypNr)
+ , ("ORT_NR", ÖNum 6, F . recfrthztOrtNr)
+ , ("FRT_HZT_ZEIT", ÖNum 6, F . recfrthztZeit)
+ ]
+
-- | 310: Fahrzeugumläufe
data RecUmlauf = RecUmlauf
- { umlaufBasisVersion :: Integer
+ { umlaufBasisVersion :: Int
, umlaufTagesartNr :: Int
, umlaufUmUid :: Int
, umlaufAnfOrt :: Int
@@ -442,6 +828,19 @@ data RecUmlauf = RecUmlauf
, umlaufFzgTypNr :: Maybe Int
}
+instance ÖPNVDatum RecUmlauf where
+ tableName _ = "REC_UMLAUF"
+ tableNumber _ = 310
+ tableSchema _ =
+ [ ("BASIS_VERSION", ÖNum 9, F . umlaufBasisVersion)
+ , ("TAGESART_NR", ÖNum 3, F . umlaufTagesartNr)
+ , ("UM_UID", ÖNum 8, F . umlaufUmUid)
+ , ("ANF_ORT", ÖNum 6, F . umlaufAnfOrt)
+ , ("ANF_ONR_TYP", ÖNum 2, F . umlaufAnfOnrTyp)
+ , ("END_ORT", ÖNum 6, F . umlaufEndOrt)
+ , ("END_ONR_TYP", ÖNum 2, F . umlaufEndOnrTyp)
+ , ("FZG_TYP_NR", ÖNum 3, F . umlaufFzgTypNr)
+ ]
-- TODO: ÖPNV DM 4.1 UMS_Z_RI Bezeichner der Linien-Richtung
data Richtung
@@ -449,7 +848,7 @@ data Richtung
------ Anschlussdaten
data Einzelanschluss = Einzelanschluss
- { einzelBasisVersion :: Integer
+ { einzelBasisVersion :: Int
, einzelBasisEinanNr :: Int
, einzelBasisAnschlussName :: Text
, einzelBasisAnschlussGruppe :: Text
@@ -471,7 +870,7 @@ data Einzelanschluss = Einzelanschluss
}
data RecUms = RecUms
- { recumsBasisVersion :: Integer
+ { recumsBasisVersion :: Int
, recumsEinanNr :: Int
, recumsTagesartNr :: Int
, recumsUmsBeginn :: Int