Exemplo n.º 1
0
def IRCallback(): # egyszerre csak egy peldany fut belole, nem hiv meg parhuzamosan tobbet az IR szenzor
    global last_time, reset_active
    global RFID_warehouse_error_running
    global pause_event

#    print("IR event triggered")

    if reset_active: # szoval, ha active a reset, es vissza ert a helyere
        print("reset sequence done")
        EndDemo(3.5) # blocking
        reset_active = False # a reset flaget hozza helyre
        if systemStarted:
            client.publish(carManagement, stopReset, qos=1) # a reset flag-et az auton is billentse be ??


    elif not RFID_warehouse_error_running and (time.time() - last_time) > 15:

        if ml.GetLap() == 1:
            client.publish(carManagement, "stop", qos=1)
            #client.publish(carStatus, stopped, qos=1)  # uj
            client.publish(errorStatus, "rfid_error", qos=1)  # uj
            RFID_warehouse_error_running = True

            if not gateway_error_running and not gateway_power_error_running:
                fm.applyScenario(faultmanagerscreen.ScenarioRFIDWarehouse)
                publish_to_faultmanager(fm)

                lc.setAnimation('rfid',ledcontrol.LEDAnimationError())
                for i in range(100): # 10mp
                    time.sleep(0.1)

                    if (not systemStarted) or reset_active: # ha system shutdown vagy reset event erkezett kozben
                        return

                pause_event.wait()

                if (not systemStarted) or reset_active: # hs system shutdown vagy reset event erkezett kozben
                    return

                lc.setAnimation('rfid',ledcontrol.LEDAnimationGood())
                client.publish(errorStatus, "rfid_error_reset", qos=1)  # uj

                RFID_warehouse_error_running = False

                #kiirni metodusba
                #nagyon csunya majd kitalalni valamit
                if not (gateway_power_error_running or gateway_error_running \
                        or belt_plc_error_running):
                    client.publish(carManagement, start, qos=1)
                    #client.publish(carStatus, moving, qos=1)  # uj

                    if not (gateway_power_error_running or gateway_error_running \
                        or belt_plc_error_running):
                        reset_error()
        
        last_time = time.time()
Exemplo n.º 2
0
def on_message(client, userdata, msg):
    global stop_active, reset_active, pause_event
    global fill_paused  # ez is ronda... rosz... csunya...
    global shutdown_timer  # ez rosszabb
    global publish_no_trigger  # uj

    print("Topic: ", msg.topic + " Message: " + str(msg.payload))

    if msg.topic == carManagement:

        if msg.payload == "start":
            stop_active = False
            print(obstacle)
            print(stop_active)

        elif msg.payload == "stop":
            stop_active = True

        elif msg.payload == "stopAndBlink":
            publish_no_trigger = 1  # uj
            stop_active = True
            lc.setAnimation("battery", ledcontrol.LEDAnimationError())
            time.sleep(10)
            pause_event.wait()  # wait for pause to set
            lc.setAnimation("battery", ledcontrol.LEDAnimationGood())
            client.publish("forklift_power_error_reset", 0)

        elif msg.payload == "startFill":
            fill_paused = False  # ezt is csak azert, ha a resume full nem jott volna meg, akkor ez a resz ne bugoljon be
            blc.startFill(
                True, False
            )  # ez se csinaljon auto unpause-t, mert akkor ha megall a vonalon mielott toltene, es pause-t kap, akkor elkezdene feltoltodni

        elif msg.payload == "stopFill":  # ez csak pause
            fill_paused = True
            blc.pause()

        elif msg.payload == "resumeFill":
            fill_paused = False
            blc.resume()

        elif msg.payload == "emptyBottle":
            fill_paused = False  # csak iderakom mert csak
            blc.startEmpty(
                True, False
            )  # ne legyen auto unpause amikor indul ez az anim, azert, hogy ha akkor pauseolunk amikor a vonalra er, ne menjen le az anim, amig nem tolunk unpause-t

        elif msg.payload == "startReset":  # ezt kapod akkor, ha futas kozben megnyomtak a start gombot, azaz az autonak a helyere kell mennie
            fill_paused = False  # hogyha pause_fill utan jon a reset, akkor ezt is reseteljuk, es ne ragadjon be
            blc.startWipe()  # letorli szepen a flakon ledeket
            lc.setAnimation(
                "battery",
                carconfig.getResetAnimation())  # azt a villogast csinalja
            stop_active = False  # elinditja az autot, ha esetleg meg lenne allva
            reset_active = True  # vonal skippeles be

        elif msg.payload == "stopReset":  # ezt a demo megallitasa utan kell kapni
            lc.setAnimation(
                "battery",
                ledcontrol.LEDAnimationGood())  # megalllitja azt a villogast
            blc.setDefault()  # felkapcsolja a legalso piros ledet
            reset_active = False  # vonal skippeles ki

        elif msg.payload == "terminate":  # stop_system-nel van
            stop_active = True
            fill_paused = False  # hogyha a terminate pause fill alatt jon, akkor azt is resetelni kell
            reset_active = False  # vonal skippeles ki
            pause_event.set()  # unblock paused stuff
            lc.setAnimation("battery", ledcontrol.LEDAnimationOff())
            blc.setOff()  # auto unpause

        elif msg.payload == "initLED":  # start_system
            stop_active = True  # pause -> gateway kapcsolat megszakad -> terminate -> start_system-re az auto elindulna, ugyhogy allitsuk meg
            fill_paused = False  # tank animacio unpause lock ki
            reset_active = False  # vonal skippeles ki
            pause_event.set(
            )  # unblock paused stuff.... ilyent start_system-re kapunk
            lc.setAnimation("battery", ledcontrol.LEDAnimationGood())
            blc.setDefault()

        elif msg.payload == "pause":
            pause_event.clear()  # sets blocking
            blc.pause()

        elif msg.payload == "unpause":
            pause_event.set()
            if not fill_paused:  # ez azert van, hogyha volt egy pause/unpause a tank liquid error alatt, akkor ne induljon el a feltoltes
                blc.resume()

    # azert nem a terminate-t hasznalom, mert nem akarok abba meg plusz dologokat beleirogatni, eleg ha az csak az auto lelkivilagalval foglalkozik
    # tovabba ott az uzenetek se teljesen utalnak arra, hogy minek kellene tortennie
    # illetve ennek akkor is mukodnie kell, ha a gateway nem elerheto valamilyen okbol (becrashelt, kilepett, stb.)
    # ha lehal a gateway akkor nincs broker es akkor nincs shutdown

    elif msg.topic == "start_system":  # cancel shutdown timer

        if shutdown_timer:
            shutdown_timer.cancel()
            print("Shutdown canceled")

    elif msg.topic == "stop_system":  # start shutdown timer

        shutdown_timer = threading.Timer(15, shutdown_system)
        shutdown_timer.start()
        print("System shutdown in 15s! Use start_system to cancel.")
Exemplo n.º 3
0
def on_message(client, userdata, msg):
    print("Topic: " + msg.topic + "  Message: " + msg.payload)
    
    global belt_plc_error_running
    global gateway_error_running
    global gateway_power_error_running
    global RFID_warehouse_error_running
    global forklift_power_error_running
    global forklift_obstacle_error_running
    global liquid_error_running
    
    global temp
    global systemStarted
    global reset_active
    
    global fm,lc,ml

    global shutdown_timer


    
    if not systemStarted:
        if msg.topic == "start_system":

            if shutdown_timer:
                shutdown_timer.cancel() # cancel shutting down
                print("System shutdown canceled")

            systemStarted = True
            lc.setAllAnimation(ledcontrol.LEDAnimationGood())
            client.publish(carManagement, "initLED", qos=1)
            pause_event.set() # ha esetleg valahogy netalantan ez bebugolt volna clear allapotban, akkor reseteljuk, mert kulonben nem indul a demo

    else:
        if msg.topic == "stop_system":
            #kell egy "clear" logika
            systemStarted = False
            ml._Init()
            #vagy megallitjuk azonnal, vagy a helyere visszuk
            client.publish(carManagement, terminate, qos=1)
            lc.setAllAnimation(ledcontrol.LEDAnimationOff())

            ResetAllErrors() # internal flags
            reset_error() # faultmanager board according to internal flags and publishses it
            reset_active = False # ha reset kozben csaptunk ra a stop_system-re, akkor kovetkezo inditasnal egy ilyen fel-reset-fel-nem-reset allapot keletkezett, ezt fixalja ez a sor
            pause_event.set() # unblocking stuff, this should be reseted on system stop as well


            shutdown_timer = threading.Timer(15,shutdown_system) # start system shutdown timer
            shutdown_timer.start()
            print("System shutdown in 15s! Use start_system to cancel.")


        #"Demo felelesztese alvo modbol", Demot meg nem inditottak el        
        #elif msg.topic == "restart_system" and not reset_active:
        elif msg.topic == "restart_system" and not ml.IsRunning():
            #ml._Init()
            ml.SetRunning(True)
            client.publish(carManagement, start, qos=1)
            reset_error()
            temp = 0

        elif ml.IsRunning():
            #nem kell kikopni az errort, mert itt generaljuk
            if msg.topic == "forklift_obstacle_error":
                forklift_obstacle_error_running = True
                client.publish(errorStatus, "forklift_obstacle_error", qos=1)  # uj

                if not (gateway_power_error_running or gateway_error_running\
                        or belt_plc_error_running):
                    fm.applyScenario(faultmanagerscreen.ScenarioForkliftObstacle)
                    publish_to_faultmanager(fm)

                    if ml.GetNext() == 1: # ha a szalagon van epp
                        client.publish("obstacle_belt_stop","belt_pause",qos=1)

            elif msg.topic == "forklift_obstacle_error_reset":
                forklift_obstacle_error_running = False
                client.publish(errorStatus, "forklift_obstacle_error_reset", qos=1)  # uj

                if not (gateway_error_running or gateway_power_error_running\
                        or belt_plc_error_running):
                    reset_error()


                    if ml.GetNext() == 1: # ha a szalagon van epp
                        client.publish("obstacle_belt_stop","belt_resume",qos=1)


            elif msg.topic == "forklift_power_error_reset":
                forklift_power_error_running = False
                client.publish(errorStatus, "forklift_power_error_reset", qos=1)  # uj

                #IsConsolErrorRunning metodus a demoerror classhoz
                if not (gateway_error_running or gateway_power_error_running\
                        or belt_plc_error_running):
                    client.publish(carManagement, start, qos=1)
                    reset_error()
                    
            elif msg.topic == "no_liquid_error":
                liquid_error_running = True
                client.publish(errorStatus, "no_liquid_error", qos=1)  # uj
                client.publish(carManagement, stop, qos=1)
                      
                if not gateway_power_error_running and not gateway_error_running:
                    fm.applyScenario(faultmanagerscreen.ScenarioNoLiquidError)
                    publish_to_faultmanager(fm)
                    
            elif msg.topic == "no_liquid_error_reset":       
                liquid_error_running = False
                client.publish(errorStatus, "no_liquid_error_reset", qos=1)  # uj
                
                if not gateway_power_error_running and not gateway_error_running:
                    client.publish(carManagement, start, qos=1)
                    client.publish(carManagement, resumeFill, qos=1)
                    reset_error()
                           
            elif msg.topic == "belt_plc_error":   
                belt_plc_error_running = True

                if not gateway_error_running and not gateway_power_error_running:
                    client.publish(carManagement, stop, qos=1)
                    client.publish(errorStatus, "belt_plc_error", qos=1)  # uj
                    if ml.GetNext() == 1:       
                        client.publish(carManagement, stopFill, qos=1)
                    
                    fm.applyScenario(faultmanagerscreen.ScenarioBeltPlcError)
                    publish_to_faultmanager(fm)

            elif msg.topic=="belt_plc_error_reset":
                belt_plc_error_running = False
                
                if not gateway_error_running and not gateway_power_error_running:
                    client.publish(carManagement, start, qos=1)
                    client.publish(errorStatus, "belt_plc_error_reset", qos=1)  # uj
                    
                    if ml.GetNext() == 1:
                        client.publish(carManagement, "resumeFill", qos=1)
                    
                    reset_error()

            elif msg.topic == "gateway_error":
                gateway_error_running = True
                      
                if not (gateway_power_error_running or belt_plc_error_running):
                    client.publish(carManagement, stop, qos=1)
                    client.publish(errorStatus, "gateway_error", qos=1)  # uj
                    #valami belt check metodusba ezeket kikellene szervezni
                    if ml.GetNext() == 1:
                        client.publish(carManagement, stopFill, qos=1)
                    
                    fm.applyScenario(faultmanagerscreen.ScenarioGatewayError)
                    
                    lc.setAnimation('gw',ledcontrol.LEDAnimationError())

                    publish_to_faultmanager(fm)
                    
             
            elif msg.topic == "gateway_error_reset":
                gateway_error_running = False
                lc.setAnimation('gw',ledcontrol.LEDAnimationGood())
                client.publish(errorStatus, "gateway_error_reset", qos=1)  # uj
                print(IsErrorActive())
                
                if not IsErrorActive():
                    client.publish(carManagement, start, qos=1)
                    if ml.GetNext() == 1:
                        client.publish(carManagement, resumeFill, qos=1)
                    
                    reset_error()
                    
            elif msg.topic == "gateway_power_error":
                gateway_power_error_running = True
                
                client.publish(carManagement, stop, qos=1)
                client.publish(errorStatus, "gateway_power_error", qos=1)  # uj
                #valami belt check metodusba ezeket kikellene szervezni
                if ml.GetNext() == 1:
                    client.publish(carManagement, stopFill, qos=1)
                     
                fm.applyScenario(faultmanagerscreen.ScenarioGatewayPowerError)

                lc.setAnimation('gw_power',ledcontrol.LEDAnimationError())
                
                publish_to_faultmanager(fm)       
                
            elif msg.topic == "gateway_power_error_reset":
                gateway_power_error_running = False
                lc.setAnimation('gw_power',ledcontrol.LEDAnimationGood())
                client.publish(errorStatus, "gateway_power_error_reset", qos=1)  # uj
                #kitenni majd a metodusba
                if not (gateway_error_running or belt_plc_error_running):
                    client.publish(carManagement, start, qos=1)
                
                    if ml.GetNext() == 1:
                        client.publish(carManagement, resumeFill, qos=1)
                    
                    
                    reset_error()

            elif msg.topic == carManagement:
                if msg.payload == "update": # ilyent akkor kapunk, ha az auto at haladt egy meroleges vonalon
                    #ezt majd atkell helyezni de a kocsi egyelore ezt tudja publisholni
                    ml.UpdatePosition(temp)
                    temp += 1


                    #muszaj kulon szaloninditani kulonben nem kulon kuldi az mqtt uzeneteket
                    t = threading.Thread(target=ScenarioTest)
                    t.setDaemon(True)
                    t.start()

                    if temp > 2: # 0,1,2
                        temp = 0

                #ugytunik nem hasznaljuk mar, kiveheto
                if msg.payload == "ready":
                    pass
                    #client.publish(carManagement, start)
                
                
            elif msg.topic == positionManagement:
                
                try:
                    inputpos = int(msg.payload)
                    #if inputpos == 1:

                    #ml.UpdatePosition(input)

                except ValueError: # ha sima except van it, akkor a KeyboardInterrupt-ot is elkapja
                    traceback.print_exc()
                    logging.debug("Konvertalasi hiba, payload: %s" % msg.payload)
                    
            #ha futas kozben nyomjak a resetet
            #az IR sensorra hagytam nem a szamlalasra
            elif msg.topic == "restart_system":
                reset_active = True
                ml.SetRunning(False)
                client.publish(carManagement, startReset, qos=1)
                ResetAllErrors() # internal flags
                reset_error() # fault manager screen
                lc.setAllAnimation(ledcontrol.LEDAnimationGood()) # ledek
                temp = 0

            elif msg.topic == "console":

                if msg.payload == "stop":
                    client.publish(carManagement, "pause", qos=1)
       	            pause_event.clear() # stuff will be blocked

                elif msg.payload == "start":
                    client.publish(carManagement, "unpause", qos=1)
                    pause_event.set() # unblocking stuff
Exemplo n.º 4
0
from RPi import GPIO
import ledcontrol
from bottleledcontrol import BottleLedControl
import configloader

# first

carconfig = configloader.ConfigLoader(
    "/etc/carconfig.json"
)  # any exception this function throws should kill the program

#init / setup metodusba
GPIO.setmode(GPIO.BCM)

lc = ledcontrol.LEDControl(
    carconfig.getLedconfig(), ledcontrol.LEDAnimationGood(),
    carconfig.getLedInversion(
    ))  # inicializaljuk a ledvezerlot a car descriptionnak megfeleloen
lc.start()

blc = BottleLedControl(12, BottleLedControl.ANIMATION_OFF)
blc.start()

carManagement = "carManagement"
carStatus = "carStatus"  # uj
moving = "car_moving"  # uj
stopped = "car_stopped"  # uj
carFlag = 0  # uj , 0: stopped; 1: moving
publish_no_trigger = 0  # uj , forklift_power_error publish skip

stop_active = True