Project

General

Profile

Statistics
| Revision:

root / trunk / programmer / netprog.py @ 163

History | View | Annotate | Download (3.57 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
        return TT_BAD
112
    if msg[0] != '^':
113
        print "did not get start delimeter!"
114
        return TT_BAD
115
    src = msg[1]
116
    #print "src: ", ord(src)
117
    if msg[2] != chr(1):
118
        print "packet dest not 1!"
119
        return TT_BAD
120
    cmd = msg[3]
121
    if msg[4] != chr(ord(src) ^ 1 ^ ord(msg[3])):
122
        print "checksum was wrong!"
123
        print ord(msg[0]), ord(msg[1]), ord(msg[2]), ord(msg[3]), ord(msg[4])
124
        print (ord(src) ^ 1 ^ ord(msg[3]))
125
        return TT_BAD
126

    
127
    return cmd
128

    
129
toolID = int(sys.argv[2])
130

    
131
print "sending file: ", sys.argv[3], " to tool ", toolID
132

    
133
fin = open(sys.argv[3], "r")
134
fin.seek(0,2)
135
flen = fin.tell()
136
fin.seek(0,0)
137

    
138
print "waiting for boot packet..."
139
while readPacket() != TT_BOOT:
140
    print "got some other byte ???"
141
    exit(-4)
142

    
143
sendProgram(toolID, flen)
144
r = readPacket() 
145
if r != TT_ACK:
146
    print "ERROR: tool did not ACK!!! got", r
147
    exit(-1)
148

    
149
print 'sending data',
150
sys.stdout.flush()
151
while True:
152
    data = fin.read(MAX_DATA_LEN)
153
    #print data
154
    #print '-------------------'
155

    
156
    sendData(toolID, data)
157
    if readPacket() != TT_ACK:
158
        print "last data packet not ACK'd!!"
159
        break
160

    
161
    if len(data) < MAX_DATA_LEN:
162
        break