packedCom.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 # notwendige Module einbinden (packedCom)
5 import struct
6 
7 # notwendige Module einbinden (comport == serial interface)
8 import sys
9 import getopt
10 import serial
11 
12 class packedCom(object):
13  def __init__(self, pd, fmt):
14  """ Initialisiert die Klasse zum Erzeugen des packed string
15  Args:
16  pd : packet descriptor. Spezifische Nummer des Datenpakets.
17  fmt : format string. Gibt die Datenart für jedes Datum als Zeichen
18  an (siehe auch https://docs.python.org/2/library/struct.html)
19  z.B. c == ? ( char)
20  b == int8_t (signed char)
21  B == uint8_t (unsigned char)
22  h == int16_t ( short)
23  H == uint16_t (unsigned short)
24  """
25  self.pd = pd
26  self.fmt = fmt
27 
28  def crc16(self, data):
29  """ Berechnen einer Checksumme.
30  Funktion wird eingesetzt, um eine Checksumme über einen Daten-String
31  zu bilden. Diese ist Bestandteil jedes Datenpaketes welches gesendet
32  oder empfangen wird und dient zum ermitteln einer fehlerhaften
33  Übertragung.
34 
35  Args:
36  data: Zu sendender Datenstring (reine Daten)
37 
38  Returns:
39  Die Checksumme als zwei Byte langen String.
40  """
41  crc = 0xff
42  for x in data:
43  crc = self.crc_update(crc, ord(x))
44  return struct.pack('H', crc & 0xffff)
45 
46  def crc_update(self, crc, data):
47  """ Hilfsfunktion für crc16.
48  Args:
49  crc: aktuelle Checksumme
50  data: Einzelnes Zeichen, was der Checksumme hinzugefügt wird.
51 
52  Returns:
53  Die aktualisierte Checksumme (als short).
54  """
55  data ^= (crc & 0xff)
56  data = data & 0xff
57  data ^= data << 4
58  data = data & 0xff
59  return (((data << 8) | ((crc >> 8) & 0xff)) ^ (data >> 4) ^ (data << 3))
60 
61  def getAsString(self, data):
62  """ Konvertiert die aktuellen Daten in einen String
63  Args:
64  data: Daten als Liste. Die Reihenfolge muss mit dem format-string
65  bei der Initialisierung übereinstimmen.
66 
67  Returns:
68  Den vollständigen string mit Start- und Endzeichen.
69  """
70 
71  datastr = ""
72  for i in range(len(data)):
73  datastr += struct.pack(self.fmt[i], data[i])
74 
75  sendstr = ">*>"
76  sendstr += struct.pack('H', len(datastr))
77  sendstr += struct.pack('c', chr(self.pd))
78  sendstr += datastr
79  sendstr += self.crc16(datastr)
80  sendstr += "<#<"
81 
82  return sendstr
83 
84 
85 class comPort(serial.Serial):
86  def __init__(self):
87  """ Öffnet das entsprechende ComPort mit den richtigen Einstellungen
88  """
89  # Standarddevice ist Kabelgebundene USB Verbindung zum Roboter
90  dev = "/dev/tucbot/all_usb"
91 
92  # Übergabeparameter auswerten
93  # Um das Programm mit dem Roboter Hugo zu nutzen muss bspw.
94  # python packed_com.py -r hugo
95  # gestartet werden.
96  opts, args = getopt.getopt(sys.argv[1:], "r:", "robot=")
97  for opt, arg in opts:
98  if opt in ("-r","--robot"):
99  dev = "/dev/tucbot/%s_xbee" % arg
100  print("packedCom.py: Using device '%s'" % dev)
101 
102  # Objekt zum Zugriff auf serielle Schnittstelle anlegen
103  s = serial.Serial(dev, baudrate=57600, parity='N', stopbits=2, \
104  timeout=0.01)
105  # moeglicherweise noch im Puffer vorhandene Daten loeschen
106  s.flushInput()
107 
108  serial.Serial.__init__(self, dev, baudrate=57600, parity='N', \
109  stopbits=2, timeout=0.01)
crc_update
uint16_t crc_update(uint16_t crc, uint8_t data)
Internal function for incrementally calculating crc16.