gps.py
· 4.1 KiB · Python
Originalformat
#!/usr/bin/env python
import serial
import struct
ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=2)
msgid = {
0x10 : "GPS",
0x20 : "MAG"
}
msgid_inv = {
"GPS" : 0x10,
"MAG" : 0x20
}
fixtype = {
0x00 : "No Fix",
0x02 : "2D Lock",
0x03 : "3D Lock"
}
def ParseDateTime(data):
seconds = (data & 0x3F ) >> 0
minutes = (data & 0xFC0 ) >> 6
hours = (data & 0xF000 ) >> 12
day = (data & 0x1F0000 ) >> 16
month = (data & 0x1E00000 ) >> 21
year = (data & 0xFE000000 ) >> 25
return {"seconds":seconds,"minutes":minutes,"hours":hours,"day":day,"month":month,"year":year}
def bin(s):
return str(s) if s<=1 else bin(s>>1) + str(s&1)
def GenMagMask(b9):
b9b = bin(b9).rjust(8,"0")
_0 = int(b9b[7])
_1 = int(b9b[6])
_2 = int(b9b[5])
_3 = int(b9b[4])
_4 = int(b9b[3])
_5 = int(b9b[2])
_6 = int(b9b[1])
_7 = int(b9b[0])
mask = [0,0,0,0,0,0,0,0]
mask[7] = _0 ^ _4
mask[6] = _1 ^ _5
mask[5] = _2 ^ _6
mask[4] = _3 ^ _7 ^ _0
mask[3] = _1
mask[2] = _2
mask[1] = _3
mask[0] = _4 ^ _0
mask = int("".join([str(x) for x in mask]), 2)
return mask
while True:
buff = ser.read(2)
if buff == "\x55\xAA":
#print "Received message! Decoding"
id = ser.read(1)
size = ser.read(1)
#print "Message size: %s Message ID: %s" %(hex(ord(size[0])),hex(ord(id[0])))
buff = ser.read(ord(size[0]))
#print "Message: %s" %buff
checksum = ser.read(2)
if ord(id) == msgid_inv["GPS"]:
xormask = struct.unpack("B", buff[55])[0]
sequence = struct.unpack("H", buff[55:57])[0]
numSat = struct.unpack("B", buff[48])[0]
print "Mask: %s" %xormask
buff = bytearray(buff)
for i in range(len(buff)):
buff[i] = buff[i] ^ xormask
buff = str(buff)
datetime = struct.unpack("I", buff[0:4])[0]
latitude = struct.unpack("i", buff[4:8])[0]
longitude = struct.unpack("i", buff[8:12])[0]
altitude = struct.unpack("i", buff[12:16])[0]
horzacc = struct.unpack("I", buff[16:20])[0]
vertacc = struct.unpack("I", buff[20:24])[0]
zero0 = struct.unpack("I", buff[24:28])[0]
nedNV = struct.unpack("I", buff[28:32])[0]
nedEV = struct.unpack("I", buff[32:36])[0]
nedDV = struct.unpack("I", buff[36:40])[0]
posDOP = struct.unpack("H", buff[40:42])[0]
verDOP = struct.unpack("H", buff[42:44])[0]
norDOP = struct.unpack("H", buff[44:46])[0]
easDOP = struct.unpack("H", buff[46:48])[0]
zero1 = struct.unpack("B", buff[49])[0]
fixtype = struct.unpack("B", buff[50])[0]
zero2 = struct.unpack("B", buff[51])[0]
fixstatus = struct.unpack("B", buff[52])[0]
zero3 = struct.unpack("H", buff[52:54])[0]
print "%s %s" %(latitude/1e7,longitude/1e7)
#print datetime
print ParseDateTime(datetime)
elif ord(id) == msgid_inv["MAG"]:
buff = bytearray(buff)
bmask = buff[4]
xormask = GenMagMask(bmask)
for i in range(len(buff)):
if i != 4:
buff[i] ^= xormask
buff = str(buff)
magx = struct.unpack("h", buff[0:2])[0]
magy = struct.unpack("h", buff[2:4])[0]
magz = struct.unpack("h", buff[4:6])[0]
print "Mag(%s,%s,%s)" %(magx,magy,magz)
| 1 | #!/usr/bin/env python |
| 2 | |
| 3 | |
| 4 | import serial |
| 5 | import struct |
| 6 | |
| 7 | ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=2) |
| 8 | |
| 9 | msgid = { |
| 10 | 0x10 : "GPS", |
| 11 | 0x20 : "MAG" |
| 12 | } |
| 13 | |
| 14 | msgid_inv = { |
| 15 | "GPS" : 0x10, |
| 16 | "MAG" : 0x20 |
| 17 | } |
| 18 | |
| 19 | fixtype = { |
| 20 | 0x00 : "No Fix", |
| 21 | 0x02 : "2D Lock", |
| 22 | 0x03 : "3D Lock" |
| 23 | } |
| 24 | |
| 25 | def ParseDateTime(data): |
| 26 | seconds = (data & 0x3F ) >> 0 |
| 27 | minutes = (data & 0xFC0 ) >> 6 |
| 28 | hours = (data & 0xF000 ) >> 12 |
| 29 | day = (data & 0x1F0000 ) >> 16 |
| 30 | month = (data & 0x1E00000 ) >> 21 |
| 31 | year = (data & 0xFE000000 ) >> 25 |
| 32 | return {"seconds":seconds,"minutes":minutes,"hours":hours,"day":day,"month":month,"year":year} |
| 33 | |
| 34 | def bin(s): |
| 35 | return str(s) if s<=1 else bin(s>>1) + str(s&1) |
| 36 | |
| 37 | def GenMagMask(b9): |
| 38 | b9b = bin(b9).rjust(8,"0") |
| 39 | _0 = int(b9b[7]) |
| 40 | _1 = int(b9b[6]) |
| 41 | _2 = int(b9b[5]) |
| 42 | _3 = int(b9b[4]) |
| 43 | _4 = int(b9b[3]) |
| 44 | _5 = int(b9b[2]) |
| 45 | _6 = int(b9b[1]) |
| 46 | _7 = int(b9b[0]) |
| 47 | mask = [0,0,0,0,0,0,0,0] |
| 48 | mask[7] = _0 ^ _4 |
| 49 | mask[6] = _1 ^ _5 |
| 50 | mask[5] = _2 ^ _6 |
| 51 | mask[4] = _3 ^ _7 ^ _0 |
| 52 | mask[3] = _1 |
| 53 | mask[2] = _2 |
| 54 | mask[1] = _3 |
| 55 | mask[0] = _4 ^ _0 |
| 56 | mask = int("".join([str(x) for x in mask]), 2) |
| 57 | return mask |
| 58 | |
| 59 | while True: |
| 60 | buff = ser.read(2) |
| 61 | if buff == "\x55\xAA": |
| 62 | #print "Received message! Decoding" |
| 63 | id = ser.read(1) |
| 64 | size = ser.read(1) |
| 65 | #print "Message size: %s Message ID: %s" %(hex(ord(size[0])),hex(ord(id[0]))) |
| 66 | buff = ser.read(ord(size[0])) |
| 67 | #print "Message: %s" %buff |
| 68 | checksum = ser.read(2) |
| 69 | if ord(id) == msgid_inv["GPS"]: |
| 70 | xormask = struct.unpack("B", buff[55])[0] |
| 71 | sequence = struct.unpack("H", buff[55:57])[0] |
| 72 | numSat = struct.unpack("B", buff[48])[0] |
| 73 | |
| 74 | print "Mask: %s" %xormask |
| 75 | |
| 76 | buff = bytearray(buff) |
| 77 | for i in range(len(buff)): |
| 78 | buff[i] = buff[i] ^ xormask |
| 79 | buff = str(buff) |
| 80 | |
| 81 | datetime = struct.unpack("I", buff[0:4])[0] |
| 82 | |
| 83 | latitude = struct.unpack("i", buff[4:8])[0] |
| 84 | longitude = struct.unpack("i", buff[8:12])[0] |
| 85 | altitude = struct.unpack("i", buff[12:16])[0] |
| 86 | |
| 87 | horzacc = struct.unpack("I", buff[16:20])[0] |
| 88 | vertacc = struct.unpack("I", buff[20:24])[0] |
| 89 | |
| 90 | zero0 = struct.unpack("I", buff[24:28])[0] |
| 91 | |
| 92 | nedNV = struct.unpack("I", buff[28:32])[0] |
| 93 | nedEV = struct.unpack("I", buff[32:36])[0] |
| 94 | nedDV = struct.unpack("I", buff[36:40])[0] |
| 95 | |
| 96 | posDOP = struct.unpack("H", buff[40:42])[0] |
| 97 | verDOP = struct.unpack("H", buff[42:44])[0] |
| 98 | norDOP = struct.unpack("H", buff[44:46])[0] |
| 99 | easDOP = struct.unpack("H", buff[46:48])[0] |
| 100 | |
| 101 | zero1 = struct.unpack("B", buff[49])[0] |
| 102 | fixtype = struct.unpack("B", buff[50])[0] |
| 103 | zero2 = struct.unpack("B", buff[51])[0] |
| 104 | fixstatus = struct.unpack("B", buff[52])[0] |
| 105 | |
| 106 | zero3 = struct.unpack("H", buff[52:54])[0] |
| 107 | |
| 108 | |
| 109 | print "%s %s" %(latitude/1e7,longitude/1e7) |
| 110 | #print datetime |
| 111 | print ParseDateTime(datetime) |
| 112 | elif ord(id) == msgid_inv["MAG"]: |
| 113 | buff = bytearray(buff) |
| 114 | bmask = buff[4] |
| 115 | xormask = GenMagMask(bmask) |
| 116 | for i in range(len(buff)): |
| 117 | if i != 4: |
| 118 | buff[i] ^= xormask |
| 119 | buff = str(buff) |
| 120 | magx = struct.unpack("h", buff[0:2])[0] |
| 121 | magy = struct.unpack("h", buff[2:4])[0] |
| 122 | magz = struct.unpack("h", buff[4:6])[0] |
| 123 | print "Mag(%s,%s,%s)" %(magx,magy,magz) |
| 124 | |
| 125 | |
| 126 |