Statistics
| Revision:

root / trunk / programmer / netprog.py @ 170

History | View | Annotate | Download (3.8 KB)

1
#!/usr/bin/python
2
import sys
3
import serial
4
5
TT_BOOT = 'b'
6
TT_PROGRAM_MODE = 'p'
7
TT_ACK     = 'a'
8
TT_NACK    = 'n'
9
TT_BAD = 0
10
TT_PROGD = 'd'
11
12
DUMB_SERIAL = 0
13
14
BAUD_RATE = 9600
15
16
MAX_DATA_LEN = 32
17
18
if len(sys.argv) < 4:
19
    print "usage: netprog.py /path/to/bus/device toolnum binaryfile"
20
    exit(1)
21
22
#for testing, tool number 3
23
class dumbBus (serial.Serial):
24
    def __init__(self):
25
        self.step = 0
26
    def flushInput(self):
27
        pass
28
    def write(self, s):
29
        print '>',
30
    def read(self, n):
31
        if n == 5:
32
            if self.step == 0:
33
                #print ord('^'), 3,1,ord(TT_BOOT), (3 ^ 1 ^ ord(TT_BOOT))
34
                print '<',
35
                self.step += 1
36
                return '^' + chr(3) + chr(1) + TT_BOOT + chr(3 ^ 1 ^ ord(TT_BOOT))
37
            else:
38
                #print ord('^'), 3,1,ord(TT_ACK), (3 ^ 1 ^ ord(TT_ACK))
39
                print '<',
40
                return '^' + chr(3) + chr(1) + TT_ACK + chr(3 ^ 1 ^ ord(TT_ACK))
41
        else:
42
            return 0
43
44
if DUMB_SERIAL == 0:
45
    bus = serial.Serial(sys.argv[1], BAUD_RATE, timeout = 10) 
46
else:
47
    bus = dumbBus() 
48
49
bus.flushInput()
50
print bus
51
52
def printMsg(msg):
53
    if len(msg) < 5:
54
        print "ERROR: trying to print message thats too small!"
55
        return
56
    if msg[0] == '^':
57
        print '^',
58
    else:
59
        print str(ord(msg[0]))
60
61
    for c in msg[1:]:
62
        print str(ord(c)),
63
64
    print
65
66
def sendCommand(t, cmd):
67
    msg = '^' + chr(1) + chr(t) + cmd + chr(1 ^ t ^ ord(cmd))
68
    print "sending..."
69
    printMsg(msg)
70
    bus.write(msg)
71
72
def sendProgram(t, size):
73
    if size > 2**16:
74
        print "ERROR: program too big!!"
75
76
    def lsb(s): return s & 0xFF
77
    def msb(s): return (s>>8) & 0xFF
78
79
    body = chr(1) + chr(t) + TT_PROGRAM_MODE + chr(lsb(size)) + chr(msb(size))
80
    print 1,t,TT_PROGRAM_MODE,lsb(size),msb(size),
81
    xor = 0
82
    for c in body:
83
        xor = xor ^ ord(c)
84
    print xor
85
86
    msg = '^' + body + chr(xor)
87
    print "sending P"
88
    printMsg(msg)
89
    bus.write(msg)
90
91
def sendData(t, data):
92
    body = chr(1) + chr(t) + TT_PROGD + data
93
    n = len(data)
94
    while n < MAX_DATA_LEN:
95
        body = body + chr(0)
96
        n = n + 1
97
    xor = 0
98
    for c in body:
99
        xor = xor ^ ord(c)
100
101
    msg = '^' + body + chr(xor)
102
    printMsg(msg)
103
    bus.write(msg)
104
    print '.',
105
    sys.stdout.flush()
106
107
def readPacket():
108
    msg = bus.read(5)
109
    if len(msg) < 5:
110
        print "message too short! len =",len(msg)
111
        if len(msg) == 0:
112
            print "probably a timeout"
113
        else:
114
            print "got:",
115
            for i in range(len(msg)):
116
                print (ord(msg[i]))," ",
117
            print 
118
        return TT_BAD
119
    if msg[0] != '^':
120
        print "did not get start delimeter! ",ord(msg[0])
121
        return TT_BAD
122
    src = msg[1]
123
    #print "src: ", ord(src)
124
    if msg[2] != chr(1):
125
        print "packet dest not 1!"
126
        return TT_BAD
127
    cmd = msg[3]
128
    if msg[4] != chr(ord(src) ^ 1 ^ ord(msg[3])):
129
        print "checksum was wrong!"
130
        print ord(msg[0]), ord(msg[1]), ord(msg[2]), ord(msg[3]), ord(msg[4])
131
        print (ord(src) ^ 1 ^ ord(msg[3]))
132
        return TT_BAD
133
134
    return cmd
135
136
toolID = int(sys.argv[2])
137
138
print "sending file: ", sys.argv[3], " to tool ", toolID
139
140
fin = open(sys.argv[3], "r")
141
fin.seek(0,2)
142
flen = fin.tell()
143
fin.seek(0,0)
144
145
print "waiting for boot packet..."
146
while readPacket() != TT_BOOT:
147
    print "Didn't get a boot packet, bailing out"
148
    exit(-4)
149
150
sendProgram(toolID, flen)
151
r = readPacket() 
152
if r != TT_ACK:
153
    print "ERROR: tool did not ACK!!! got", r
154
    exit(-1)
155
156
print 'sending data',
157
sys.stdout.flush()
158
while True:
159
    data = fin.read(MAX_DATA_LEN)
160
    #print data
161
    #print '-------------------'
162
163
    sendData(toolID, data)
164
    if readPacket() != TT_ACK:
165
        print "last data packet not ACK'd!!"
166
        break
167
168
    if len(data) < MAX_DATA_LEN:
169
        break