Example #1
0
 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()
Example #2
0
 def ReadSensorData(cls):
     return int(Steuerung.get_pos())
Example #3
0
 def ReadSensorData(cls):
     return Steuerung.get_speed()
Example #4
0
    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...
Example #5
0
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()
Example #6
0
    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