def connection_lost(self, exc): """Wird beim (erwarteten oder unerwarteten) Verbindungsabbruch ausgefuehrt.""" print("Client {} closed the connection".format(self.peername)) for sensor in list(self.subscribedSensors): print("cancel publishing value of sensor {} to {}".format( sensor, self.peername)) self.subscribedSensors[sensor].desubscribe() del self.subscribedSensors[sensor] print("desubscribing Alerts from all Sensors...") for Sen in Sensorik.Sensoren: Sensorik.Sensoren[Sen].DesubscribeAlerts(self.SendAlert) print("Stopping Vehicle...") Steuerung.brake() Steuerung.disable_steering()
def ReadSensorData(cls): return int(Steuerung.get_pos())
def ReadSensorData(cls): return Steuerung.get_speed()
def data_received(self, receivedData): """ Wird immer aufgerufen, wenn Daten ("receiveData") von einem verbundenen Client empfangen wird. Die empfangenen Daten werden dann ausgewährtet und auf bekannte Muster geprueft. Bei korrekt empfangenen und bekannten Nachrichten wird die gewuenschte Aktion ausgeloest. """ print("Data received from Host {}: {!r}".format( self.peername, receivedData)) readPos = 0 while readPos < len(receivedData): #gehe die empfangenen bytes solange durch bis "/SRCCP/" gefunden wird if receivedData[readPos + 2:readPos + 9] == b'/SRCCP/': try: length = int.from_bytes(receivedData[readPos:readPos + 2], "big") frame = receivedData[readPos + 2:readPos + length + 2] if DEBUG: print("Received SRCCP-Packet:") print("parsed length: ", length) print("parsed frame: ", frame) if not frame.endswith(b'#/'): print( "ERROR: Wrong length or incomplete data received!") self.SendNACK( "TransmissionError", "Incomplete or malformed packet received") # suche weiter nach einem Paket... readPos += 1 continue readPos += (length + 2) headerEnd = frame.find(b'/#', 7) header = frame[:headerEnd] message = frame[headerEnd + 2:-2].decode() ack = 0 if DEBUG: print("header =\n", header) print("---") print("parsed length = ", length) print("---") print("message =\n", message) print("---") print("parsing XML...") root = ET.fromstring(message) if root.tag == "cmd": command = root.find("name").text print("command received: ", command) if command == "drive": speed = root.find("speed").text ack += Steuerung.drive(int(speed)) elif command == "brake": ack += Steuerung.brake() elif command == "steer": angle = root.find("angle").text if DEBUG: print("Steering to ", angle) ack += Steuerung.steer(int(angle)) elif command == "subscribe": if root.find("type").text == "data": for Sen in root.findall("sensor"): ack += self.subscribeSensor( Sen.text, Sen.get("interval")) elif root.find("type").text == "alert": for Sen in root.findall("sensor"): ack += self.subscribeAlert(Sen.text) elif command == "desubscribe": if root.find("type").text == "data": for sensor in root.findall("sensor"): ack += self.desubscribeSensor(sensor) elif root.find("type").text == "alert": for sensor in root.findall("sensor"): ack += self.desubscribeAlerts(sensor) elif command == "irled": if root.find("value").text == "0": Steuerung.disable_ir() elif root.find("value").text == "1": Steuerung.enable_ir() elif command == "close": print("Client '{}' closed the connection".format( self.peername)) self.transport.close() elif command == "shutdown": print( "calling shutdown.sh and shutting down pi...") subprocess.call("/home/pi/RC-Car/shutdown.sh", shell=True) elif command == "reboot": print("calling reboot.sh and rebooting pi...") subprocess.call("/home/pi/RC-Car/reboot.sh", shell=True) elif root.tag == "msg": print("message received, nothing to do here...") elif root.tag == "ctlmsg": print( "controlmessage received. ERROR: Not implemented yet!" ) # TODO: z.B. bei NACK Fehlermeldung auswerten und Nachricht evtl wiederholen! else: raise ValueError("unknown message") except ValueError as e: print("ValueError:" + e.args[0]) self.SendNACK(command, e.args[0]) except KeyError as e: print("KeyError:" + e.args[0]) self.SendNACK(command, e.args[0]) else: if ack == 0: self.SendACK(command) else: self.SendNACK(command) else: #print('unknown protocol!\n') # kann sehr Ressourcen-fressend werden, falls viele unbekannte Daten empfangen werden! readPos += 1 #gehe einfach zum naechsten Zeichen und suche weiter nach bekannten Mustern...
if EN_NODE_RED: subprocess.call( "node-red-pi -u /home/pi/RC-Car/Node-RED/ RC-Car-Flow.json &", shell=True) #definiere und registriere sigterm handler: def sigterm_handler(_signo, _stack_frame): print("Script terminated.") sys.exit(0) signal.signal(signal.SIGTERM, sigterm_handler) try: loop.run_forever() except KeyboardInterrupt: print("Interrupted by user.") finally: print("Cleaning up...") if EN_NODE_RED: subprocess.call("pkill -f node-red --signal SIGINT", shell=True) # Close the server: server.close() loop.run_until_complete(server.wait_closed()) # Stop autorefreshing the sensors: Sensorik.close() Steuerung.close() loop.run_until_complete(loop.shutdown_asyncgens()) loop.close()
def CheckAlerts(cls): global RearBeep if cls.SensorData < 10: msg = "Crash!" if cls.EN_BUZZER: cls.i = 3 if EN_BRAKE_ASSIST: # weiteres Vorwaertsfahren unterbinden Steuerung.set_speed_limit(0, "forward") if not cls.brake: # nur einmal bremsen, ansonsten kommt man nicht mehr vom Fleck Steuerung.brake() cls.brake = True elif cls.SensorData < 25: msg = "close Obstacle!" if cls.EN_BUZZER: cls.i += 2 if EN_BRAKE_ASSIST: # Geschwindigkeit auf 20% limitieren Steuerung.set_speed_limit(20, "forward") if not cls.brake: # nur einmal bremsen, ansonsten kommt man nicht mehr vom Fleck Steuerung.brake() cls.brake = True elif cls.SensorData < 50: msg = "distant Obstacle" if cls.EN_BUZZER: cls.i += 1 if EN_BRAKE_ASSIST: # Geschwindigkeit auf 50% limitieren Steuerung.set_speed_limit(50, "forward") if not cls.brake: # nur einmal bremsen, ansonsten kommt man nicht mehr vom Fleck Steuerung.brake() cls.brake = True else: msg = False cls.i = 0 if EN_BRAKE_ASSIST: # Bremsen wieder erlauben und Speedlimt zuruecksetzen cls.brake = False Steuerung.set_speed_limit(100, "forward") if cls.EN_BUZZER: if cls.i >= 3: pi.set_PWM_dutycycle(BUZZER_PIN, 50) #Beep cls.i = 0 cls.beep = True elif cls.beep: pi.set_PWM_dutycycle(BUZZER_PIN, 0) #Buzzer aus cls.beep = False return msg