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()
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.")
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
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