View difference between Paste ID: 2nC1sYga and 66dKFtJ1
SHOW: | | - or go back to the newest paste.
1
#!/usr/bin/python
2
# -*- coding: UTF-8 -*-
3
# Contec CMS 50F firmware 3.7 dumper
4
# (C) 2014, François Revol <[email protected]>
5
6
#cf. http://elinux.org/Serial_port_programming
7
8
import serial
9
import sys
10
import time
11
12
13
def send_cmd(p, c):
14
	print "> %s" % c
15
	c = c.replace(' ', '')
16
	c = c.decode("hex")
17
	#print c.encode("hex")
18
	p.write(c)
19
	#p.flush()
20
21
def recv_data(p, l=None):
22
	data = ''
23
	while l is None or len(data) < l:
24
		time.sleep(0.5)
25
		if p.inWaiting() < 1:
26
			print "No more data..."
27
			# XXX: do something?
28
			if l is None:
29
				break
30
		want = max(p.inWaiting(), 1)
31
		if l is not None:
32
			want = min(want, l - len(data))
33
		# just for nicer hex dump, wrap at 8 bytes
34
		want = min(want, 8)
35
		#print len
36
		d = p.read(want)
37
		hx = d.encode("hex")
38
		print "< %s" % " ".join(hx[i:i+2] for i in range(0, len(hx), 2))
39
		data += d
40
	print
41
	return data
42
43
if len(sys.argv) < 2:
44
	print "Usage: %s serialdev" % sys.argv[0]
45
	exit(1)
46
47
#, parity=serial.PARITY_ODD
48
with serial.Serial(port=sys.argv[1], baudrate=115200) as p:
49
50
	send_cmd(p, '7d 81 a7 80 80 80 80 80 80')
51
	recv_data(p, 2)
52
	send_cmd(p, '7d 81 a2 80 80 80 80 80 80')
53
	recv_data(p, 2)
54
	send_cmd(p, '7d 81 a0 80 80 80 80 80 80')
55
	recv_data(p, 4)
56
57
	send_cmd(p, '7d 81 b0 80 80 80 80 80 80')
58
	recv_data(p)
59
60
	send_cmd(p, '7d 81 ac 80 80 80 80 80 80')
61
	recv_data(p)
62
63
	send_cmd(p, '7d 81 b3 80 80 80 80 80 80')
64
	recv_data(p)
65
66
	send_cmd(p, '7d 81 ad 80 80 80 80 80 80')
67
	recv_data(p)
68
69
	send_cmd(p, '7d 81 a3 80 80 80 80 80 80')
70
	recv_data(p)
71
72
	send_cmd(p, '7d 81 ab 80 80 80 80 80 80')
73
	recv_data(p)
74
75
	send_cmd(p, '7d 81 a4 80 80 80 80 80 80')
76
	recv_data(p)
77
78
	send_cmd(p, '7d 81 a5 80 80 80 80 80 80')
79
	d = recv_data(p)
80
	print "timestamp:"
81
	packet = d[0:8]
82
	if packet[0] == '\x07':
83
		print "%02d%02d-%02d-%02d" % (
84
			ord(packet[4]) & ~0x80,
85
			ord(packet[5]) & ~0x80,
86
			ord(packet[6]) & ~0x80,
87
			ord(packet[7]) & ~0x80)
88
	packet = d[8:16]
89
	if packet[0] == '\x12':
90
		print "%02d:%02d:%02d.%02d" % (
91-
	recv_data(p)
91+
			ord(packet[4]) & ~0x80,
92
			ord(packet[5]) & ~0x80,
93
			ord(packet[6]) & ~0x80,
94
			ord(packet[7]) & ~0x80)
95
96
	send_cmd(p, '7d 81 af 80 80 80 80 80 80')
97
	recv_data(p)
98
99
	send_cmd(p, '7d 81 a7 80 80 80 80 80 80')
100
	recv_data(p)
101
102
	send_cmd(p, '7d 81 a2 80 80 80 80 80 80')
103
	recv_data(p)
104
105
106
	send_cmd(p, '7d 81 a6 80 80 80 80 80 80')
107
	d = recv_data(p)
108
	print "data:"
109
	for i in range(0, len(d) / 8):
110
		packet = d[i*8:i*8+8]
111
		print "packet %d" % (i)
112
		if packet[0] != '\x0f':
113
			print "invalid data packet:"
114
			print packet.encode("hex")
115
			continue
116
		if packet[1] != '\x80':
117
			print "unknown code for packet: %02x" % ord(packet[1])
118
119
		print "%d%% %dbpm" % (ord(packet[2]) & ~0x80, ord(packet[3]) & ~0x80)
120
		print "%d%% %dbpm" % (ord(packet[4]) & ~0x80, ord(packet[5]) & ~0x80)
121
		print "%d%% %dbpm" % (ord(packet[6]) & ~0x80, ord(packet[7]) & ~0x80)