Project

General

Profile

Statistics
| Revision:

root / trunk / programmer / netprog.py @ 210

History | View | Annotate | Download (4.67 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
TT_RESET = 'r'
12

    
13
MAX_PROG_SIZE = 1024-32
14

    
15
DUMB_SERIAL = 0
16

    
17
BAUD_RATE = 9600
18

    
19
MAX_DATA_LEN = 32
20

    
21
if len(sys.argv) < 4:
22
    print "usage: netprog.py /path/to/bus/device toolnum binaryfile"
23
    exit(1)
24

    
25
#for testing, tool number 3 hardcoded
26
class dumbBus (serial.Serial):
27
    def __init__(self):
28
        self.step = 0
29
    def flushInput(self):
30
        pass
31
    def write(self, s):
32
        print '>',
33
    def read(self, n):
34
        if n == 5:
35
            if self.step == 0:
36
                #print ord('^'), 3,1,ord(TT_BOOT), (3 ^ 1 ^ ord(TT_BOOT))
37
                print '<',
38
                self.step += 1
39
                return '^' + chr(3) + chr(1) + TT_BOOT + chr(3 ^ 1 ^ ord(TT_BOOT))
40
            else:
41
                #print ord('^'), 3,1,ord(TT_ACK), (3 ^ 1 ^ ord(TT_ACK))
42
                print '<',
43
                return '^' + chr(3) + chr(1) + TT_ACK + chr(3 ^ 1 ^ ord(TT_ACK))
44
        else:
45
            return 0
46

    
47
if DUMB_SERIAL == 0:
48
    bus = serial.Serial(sys.argv[1], BAUD_RATE, timeout = 10) 
49
else:
50
    bus = dumbBus() 
51

    
52
bus.flushInput()
53

    
54
def printMsg(msg):
55
    if len(msg) < 5:
56
        print "ERROR: trying to print message thats too small!"
57
        return
58
    if msg[0] == '^':
59
        print '^',
60
    else:
61
        print str(ord(msg[0]))
62

    
63
    for c in msg[1:]:
64
        print str(ord(c)),
65

    
66
    print
67

    
68
def sendCommand(t, cmd):
69
    msg = '^' + chr(1) + chr(t) + cmd + chr(1 ^ t ^ ord(cmd))
70
    print "sending..."
71
    printMsg(msg)
72
    bus.write(msg)
73

    
74
def sendProgram(t, size):
75
    if size > 2**16:
76
        print "ERROR: program too big!!"
77

    
78
    def lsb(s): return s & 0xFF
79
    def msb(s): return (s>>8) & 0xFF
80

    
81
    body = chr(1) + chr(t) + TT_PROGRAM_MODE + chr(lsb(size)) + chr(msb(size))
82
    print 1,t,TT_PROGRAM_MODE,lsb(size),msb(size),
83
    xor = 0
84
    for c in body:
85
        xor = xor ^ ord(c)
86
    print xor
87

    
88
    msg = '^' + body + chr(xor)
89
    print "sending P"
90
    printMsg(msg)
91
    bus.write(msg)
92

    
93
dCount = 0
94

    
95
def sendData(t, data):
96
    body = chr(1) + chr(t) + TT_PROGD + data
97
    n = len(data)
98
    while n < MAX_DATA_LEN:
99
        body = body + chr(0)
100
        n = n + 1
101
    xor = 0
102
    for c in body:
103
        xor = xor ^ ord(c)
104
    msg = '^' + body + chr(xor)
105
    printMsg(msg)
106
    bus.write(msg)
107
    print '.',
108
    sys.stdout.flush()
109

    
110
def readPacket():
111
    msg = bus.read(5)
112
    if len(msg) < 5:
113
        print "message too short! len =",len(msg)
114
        if len(msg) == 0:
115
            print "probably a timeout"
116
        else:
117
            print "got:",
118
            for i in range(len(msg)):
119
                print (ord(msg[i]))," ",
120
            print 
121
        return TT_BAD
122
    if msg[0] != '^':
123
        print "did not get start delimeter! ",ord(msg[0])," packet size:",len(msg)
124
        return TT_BAD
125
    src = msg[1]
126
    #print "src: ", ord(src)
127
    if msg[2] != chr(1):
128
        print "packet dest not 1!"
129
        return TT_BAD
130
    cmd = msg[3]
131
    if msg[4] != chr(ord(src) ^ 1 ^ ord(msg[3])):
132
        print "checksum was wrong!"
133
        print ord(msg[0]), ord(msg[1]), ord(msg[2]), ord(msg[3]), ord(msg[4])
134
        print (ord(src) ^ 1 ^ ord(msg[3]))
135
        return TT_BAD
136

    
137
    return cmd
138

    
139
toolID = int(sys.argv[2])
140

    
141
print "sending file: ", sys.argv[3], " to tool ", toolID
142

    
143
fin = open(sys.argv[3], "r")
144
fin.seek(0,2)
145
flen = fin.tell()
146
fin.seek(0,0)
147

    
148
if flen > MAX_PROG_SIZE:
149
    print "Program too Large!"
150
    print "prog size:",flen
151
    print "max size:",MAX_PROG_SIZE
152
    exit(-1)
153

    
154
print "prog size:",flen
155

    
156
print "sending RESET"
157
sendCommand(toolID, TT_RESET)
158

    
159
print "waiting for boot packet..."
160
while readPacket() != TT_BOOT:
161
    print "Didn't get a boot packet, bailing out"
162
    exit(-4)
163

    
164
r = 0
165
while r != TT_ACK:
166
    sendProgram(toolID, flen)
167
    r = readPacket()
168
    if r == TT_NACK:
169
        print "WARNING: got NACK, trying again"
170
    elif r == TT_BOOT:
171
        print "ERROR: got stray boot packet"
172
        #TODO: restart the whole state machine after the boot packet
173
        exit(-2)
174
    elif r != TT_ACK:
175
        print "ERROR: got another packet:",r
176
        exit(-1)
177

    
178
print 'sending data',
179
sys.stdout.flush()
180
while True:
181
    data = fin.read(MAX_DATA_LEN)
182
    #print data
183
    #print '-------------------'
184
    if len(data) == 0:
185
        break
186

    
187
    r = 0
188
    while r != TT_ACK:
189
        sendData(toolID, data)
190
        r = readPacket()
191
        if r == TT_NACK:
192
            print "WARNING: got NACK, trying again"
193
        elif r == TT_BOOT:
194
            print "ERROR: got stray boot packet"
195
            #TODO: restart the whole state machine after the boot packet
196
            exit(-2)
197
        elif r != TT_ACK:
198
            print "ERROR: got another packet:",r
199
            exit(-1)
200

    
201
    if len(data) < MAX_DATA_LEN:
202
        break