X-Git-Url: http://git.droids-corp.org/?p=aversive.git;a=blobdiff_plain;f=projects%2Fmicrob2010%2Ftests%2Fstatic_beacon%2Fcksum.py;fp=projects%2Fmicrob2010%2Ftests%2Fstatic_beacon%2Fcksum.py;h=38d6634d16b40dcfc17aa81b0d4f2f97a6224fa3;hp=0000000000000000000000000000000000000000;hb=d992c7dd579170e226cfceabb652cdda6edb97b4;hpb=844fa3427676e08d7e9f92279788def635377714 diff --git a/projects/microb2010/tests/static_beacon/cksum.py b/projects/microb2010/tests/static_beacon/cksum.py new file mode 100644 index 0000000..38d6634 --- /dev/null +++ b/projects/microb2010/tests/static_beacon/cksum.py @@ -0,0 +1,51 @@ +#!/usr/bin/python + +import random + +# val is 12 bits. Return the 16 bits value that includes the 4 bits +# cksum in MSB. +def do_cksum(val): + x = (val & 0xfff) + # add the three 4-bits blocks of x together + cksum = x & 0xf + x = x >> 4 + cksum += x & 0xf + cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4) + x = x >> 4 + cksum += x & 0xf + cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4) + cksum = (~cksum) & 0xf + return (cksum << 12) + (val & 0xfff) + +# val is 16 bits, including 4 bits-cksum in MSB, return 0xFFFF is cksum +# is wrong, or the 12 bits value on success. +def verify_cksum(val): + x = (val & 0xfff) + # add the four 4-bits blocks of val together + cksum = val & 0xf + val = val >> 4 + cksum += val & 0xf + cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4) + val = val >> 4 + cksum += val & 0xf + cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4) + val = val >> 4 + cksum += val & 0xf + cksum = (cksum & 0xf) + ((cksum & 0xf0) >> 4) + if cksum == 0xf: + return x + return 0xffff # wrong value + + + +err = 0 +total = 0 +for i in range(200): + x = random.randint(0,(1<<12)-1) + y = do_cksum(x) + y = random.randint(0,(1<<16)-1) + z = verify_cksum(y) + if z == 0xffff: + err += 1 + total += 1 +print "%d errors / %d"%(err, total)