10 Předvěsti

Ve stanici Panský používáme rychlostní návěstní soustavu. Dosud jsme se nezabývali otázkou předvěstění návěstí na následujícím návěstidle. Pro předvěstění rychlosti se používají dva typy skriptů. Jeden typ skriptu pro předvěsti vjezdových návěstidel a druhý typ skriptu pro předvěsti odjezdových návěstidel.

Předvěst vjezdového návěstidla

Ukázkový skript pro předvěstění vjezdového návěstidla L je Predvest_k_L.py. Podobné skripty jsou i pro předvěsti vjezdových návěstidel S a SK.

Třída Predvest_k_L

Skript Predvest_k_L.py obsahuje třídu Predvest_k_L, která je potomkem třídy Siglet. Definice třídy vypadá následovně:

# Predvest_k_L.py

# Petr Šídlo

import jarray

import jmri

class Predvest_k_L(jmri.jmrit.automat.Siglet) :

    # defineIO() spouští se jednou při startu

    # načte pole pole vstupů

    # jakákoliv změna vstupu spustí metodu setOutput()

    def defineIO(self):

        # tělo metody

   

    # setOutput je voláno při každé změně vstupu

    # podle výpočtu změní výstup

    def setOutput(self):

        # tělo metody

# konec definice třídy

Spuštění třídy

Tato třída se nespouští ve vlákně. Spouští se jako posluchač událostí vybraných objektů. Po spuštění třídy je vytvořena instance třídy, ale skript neběží. Čeká na spouštěcí událost. V případě, že dojde k zadané události, tak je kód třídy vykonán. Po vykonání předepsaného kódu se vykonávání instance třídy zastaví a znovu se čeká na zadanou událost.

Instance třídy se spouští následovně:

# start

Predvest_k_L().start()

Metoda defineIO()

Metoda defineIO() se spustí pouze jednou při vytvoření instance třídy. V metodě se provede registrace objektů na jejichž události se bude čekat. V případě vjezdového návěstidla se jedná o toto návěstidlo. Potom se běh instance zastaví.

def defineIO(self):

   

    self.L = masts.getSignalMast("L")

   

    # registrace vstupů

   

    self.setInputs(jarray.array([self.L], jmri.NamedBean))

   

    return

Metoda setOutput()

Metoda setOutput() se spustí při výskytu jakékoliv události ze seznamu zaregistrovaných objektů.

V našem příkladu se nejdříve definují proměnné. Těmi jsou předvěst vjezdového návěstidla PřL a návěsti vjezdového návěstidla a předvěsti. Potom se testuje jakou návěst zobrazuje vjezdové návěstidlo. Podle toho se nastaví příslušná návěst předvěsti.

def setOutput(self):

   

    self.PrL = masts.getSignalMast("PřL".decode("UTF-8"))

   

    # návěsti

    self.STUJ                       = "Stůj".decode("UTF-8")

    self.VOLNO                      = "Volno"

    self.VYSTRAHA                   = "Výstraha".decode("UTF-8")

    self.OCEKAVEJ_40                = "Očekávej 40".decode("UTF-8")

    self.RYCHLOST_40_A_VOLNO        = "Rychlost 40 a volno"

    self.RYCHLOST_40_A_VYSTRAHA     = "Rychlost 40 a výstraha".decode("UTF-8")

    self.RYCHLOST_40_A_OCEKAVEJ_40  = "Rychlost 40 a očekávej 40".decode("UTF-8")

    self.POSUN_ZAKAZAN              = "Posun zakázán".decode("UTF-8")

    self.POSUN_DOVOLEN              = "Posun dovolen"

    self.OPATRNE_NA_PRIVOLAVACI_NAVEST = "Opatrně na přivolávací návěst".decode("UTF-8")

           

   

    if ((self.L.getAspect() == self.VOLNO) \

      or (self.L.getAspect() == self.VYSTRAHA)) :

        self.PrL.setAspect(self.VOLNO)

    elif ((self.L.getAspect() == self.RYCHLOST_40_A_VOLNO) \

      or (self.L.getAspect() == self.RYCHLOST_40_A_VYSTRAHA) \

      or (self.L.getAspect() == self.RYCHLOST_40_A_OCEKAVEJ_40)) :

        self.PrL.setAspect(self.OCEKAVEJ_40)

    else :

        self.PrL.setAspect(self.VYSTRAHA)

   

    return

Předvěst odjezdového návěstidla

Ukázkový skript pro předvěstění odjezdového návěstidla L1 je Predvest_k_L1.py. Podobné skripty jsou i pro předvěsti odjezdových návěstidel L2, S1 a S2.

Třída Predvest_k_L1

Skript Predvest_k_L1.py obsahuje třídu Predvest_k_L1, která je potomkem třídy Siglet. Definice třídy je stejná jako u třídy Predvest_k_L.

Metoda defineIO()

V metodě defineIO() se provede registrace objektů na jejichž události se bude čekat. V případě odjezdového návěstidla je to odjezdové návěstidlo.

def defineIO(self):

   

    self.L1 = masts.getSignalMast("L1")

   

    # registrace vstupů

   

    self.setInputs(jarray.array([self.L1], jmri.NamedBean))

   

    return

Metoda setOutput()

Metoda setOutput() se spustí při výskytu jakékoliv události ze seznamu zaregistrovaných objektů.

V našem příkladu se nejdříve definují proměnné. Těmi jsou předvěst odjezdového návěstidla, tedy vjezdové návěstidlo L a návěsti vjezdového a odjezdového návěstidla. Dále se definují proměnné bloků v cestě od vjezdového návěstidla až po odjezdové a layout-bloky stejné cesty. Potom se testuje zdali je postavená jízdní cesta od vjezdového návěstidla k návěstidlu odjezdovému. Pokud ano, tak se návěst vjezdového návěstidla nastaví podle návěsti odjezdového návěstidla.

def setOutput(self):

   

    self.L = masts.getSignalMast("L".decode("UTF-8"))

   

    # návěsti

    self.STUJ                       = "Stůj".decode("UTF-8")

    self.VOLNO                      = "Volno"

    self.VYSTRAHA                   = "Výstraha".decode("UTF-8")

    self.OCEKAVEJ_40                = "Očekávej 40".decode("UTF-8")

    self.RYCHLOST_40_A_VOLNO        = "Rychlost 40 a volno"

    self.RYCHLOST_40_A_VYSTRAHA     = "Rychlost 40 a výstraha".decode("UTF-8")

    self.RYCHLOST_40_A_OCEKAVEJ_40  = "Rychlost 40 a očekávej 40".decode("UTF-8")

    self.POSUN_ZAKAZAN              = "Posun zakázán".decode("UTF-8")

    self.POSUN_DOVOLEN              = "Posun dovolen"

    self.OPATRNE_NA_PRIVOLAVACI_NAVEST = "Opatrně na přivolávací návěst".decode("UTF-8")

   

    # bloky

    self.BK1 = blocks.getBlock("BK1")

    self.BV1 = blocks.getBlock("BV1")

    self.BMi1 = blocks.getBlock("BMi1")

    self.layout_blok_BK1 = layoutblocks.getLayoutBlock(self.BK1)

    self.layout_blok_BV1 = layoutblocks.getLayoutBlock(self.BV1)

    self.layout_blok_BMi1 = layoutblocks.getLayoutBlock(self.BMi1)

           

    if ((self.layout_blok_BK1 == None) \

      or (self.layout_blok_BV1 == None) \

      or (self.layout_blok_BMi1 == None)) :

        return 

   

    if ((self.layout_blok_BK1.getUseExtraColor() == True) \

      and (self.layout_blok_BV1.getUseExtraColor() == True) \

      and (self.layout_blok_BMi1.getUseExtraColor() == True) \

      and ((self.L.getAspect() == self.VYSTRAHA) \

      or (self.L.getAspect() == self.VOLNO))) :

        if (self.L1.getAspect() == self.VOLNO) :

            self.L.setAspect(self.VOLNO)

        else :

            self.L.setAspect(self.VYSTRAHA)

   

    return

vytvořeno 17. 10. 2019