Project

General

Profile

Statistics
| Revision:

root / trunk / programmer / netprog.py @ 208

History | View | Annotate | Download (4.63 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
def sendData(t, data):
94
    body = chr(1) + chr(t) + TT_PROGD + data
95
    n = len(data)
96
    while n < MAX_DATA_LEN:
97
        body = body + chr(0)
98
        n = n + 1
99
    xor = 0
100
    for c in body:
101
        xor = xor ^ ord(c)
102

    
103
    msg = '^' + body + chr(xor)
104
    printMsg(msg)
105
    bus.write(msg)
106
    print '.',
107
    sys.stdout.flush()
108

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

    
136
    return cmd
137

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

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

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

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

    
153
print "prog size:",flen
154

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

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

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

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

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

    
200
    if len(data) < MAX_DATA_LEN:
201
        break