vt100: include pgmspace.h as we use PROGMEM macro
[aversive.git] / projects / microb2010 / tests / static_beacon / cksum.py
1 #!/usr/bin/python
2
3 import random
4
5 # val is 12 bits. Return the 16 bits value that includes the 4 bits
6 # cksum in MSB.
7 def do_cksum(val):
8     x = (val & 0xfff)
9     # add the three 4-bits blocks of x together
10     cksum = x & 0xf
11     x = x >> 4
12     cksum += x & 0xf
13     cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4)
14     x = x >> 4
15     cksum += x & 0xf
16     cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4)
17     cksum = (~cksum) & 0xf
18     return (cksum << 12) + (val & 0xfff)
19
20 # val is 16 bits, including 4 bits-cksum in MSB, return 0xFFFF is cksum
21 # is wrong, or the 12 bits value on success.
22 def verify_cksum(val):
23     x = (val & 0xfff)
24     # add the four 4-bits blocks of val together
25     cksum = val & 0xf
26     val = val >> 4
27     cksum += val & 0xf
28     cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4)
29     val = val >> 4
30     cksum += val & 0xf
31     cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4)
32     val = val >> 4
33     cksum += val & 0xf
34     cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4)
35     if cksum == 0xf:
36         return x
37     return 0xffff # wrong value
38
39
40 err = 0
41 total = 0
42 for i in range(200):
43     x = random.randint(0,(1<<12)-1)
44     y = do_cksum(x)
45     y = random.randint(0,(1<<16)-1)
46     z = verify_cksum(y)
47     if z == 0xffff:
48         err += 1
49     total += 1
50 print "%d errors / %d"%(err, total)