Subversion Repositories HomeAutomation

Rev

Rev 879 | Rev 1458 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 879 Rev 882
1
using System;
1
using System;
2
using System.Collections.Generic;
2
using System.Collections.Generic;
3
using System.Text;
3
using System.Text;
4
using System.Threading;
4
using System.Threading;
5
 
5
 
6
//this class should probably be integrated into canNMT instead
6
//this class should probably be integrated into canNMT instead
7
 
7
 
8
public class Downloader {
8
public class Downloader {
9
    private HexFile hf;
9
    private HexFile hf;
10
    private DaemonConnection dc;
10
    private DaemonConnection dc;
11
    private bool isBiosUpdate;
11
    private bool isBiosUpdate;
12
    private ulong dlOffset = 0;
12
    private ulong dlOffset = 0;
13
    //private Thread down;
13
    //private Thread down;
14
    private byte receiveID;
14
    private byte receiveID;
15
    private uint hwid;
15
    private uint hwid;
16
    private bool HWID_INUSE;
16
    private bool HWID_INUSE;
17
   
17
   
18
    private enum dState { SEND_START, WAIT_ACK_PRG, SEND_PGM_DATA, WAIT_ACK_DATA, RESEND_ADDR, WAIT_DONE, SEND_DONE, SEND_BIOS_UPDATE, SEND_RESET, DONE, DEBUG_STATE2, WAIT_BOOT, SEND_EMPTY_START, WAIT_ACK_PRG_EMPTY, SEND_EMPTY_DATA, WAIT_ACK_EMPTY_DATA, SEND_DONE_EMPTY, WAIT_DONE_EMPTY};
18
    private enum dState { SEND_START, WAIT_ACK_PRG, SEND_PGM_DATA, WAIT_ACK_DATA, RESEND_ADDR, WAIT_DONE, SEND_DONE, SEND_BIOS_UPDATE, SEND_RESET, DONE, DEBUG_STATE2, WAIT_BOOT, SEND_EMPTY_START, WAIT_ACK_PRG_EMPTY, SEND_EMPTY_DATA, WAIT_ACK_EMPTY_DATA, SEND_DONE_EMPTY, WAIT_DONE_EMPTY};
19
   
19
   
20
    private const byte CAN_NMT              = 0x00;
20
    private const byte CAN_NMT              = 0x00;
21
   
21
   
22
    private const byte CAN_NMT_RESET        = 0x04;
22
    private const byte CAN_NMT_RESET        = 0x04;
23
    private const byte CAN_NMT_BIOS_START   = 0x08;
23
    private const byte CAN_NMT_BIOS_START   = 0x08;
24
    private const byte CAN_NMT_PGM_START    = 0x0C;
24
    private const byte CAN_NMT_PGM_START    = 0x0C;
25
    private const byte CAN_NMT_PGM_DATA     = 0x10;
25
    private const byte CAN_NMT_PGM_DATA     = 0x10;
26
    private const byte CAN_NMT_PGM_END      = 0x14;
26
    private const byte CAN_NMT_PGM_END      = 0x14;
27
    private const byte CAN_NMT_PGM_COPY     = 0x18;
27
    private const byte CAN_NMT_PGM_COPY     = 0x18;
28
    private const byte CAN_NMT_PGM_ACK      = 0x1C;
28
    private const byte CAN_NMT_PGM_ACK      = 0x1C;
29
    private const byte CAN_NMT_PGM_NACK     = 0x20;
29
    private const byte CAN_NMT_PGM_NACK     = 0x20;
30
    private const byte CAN_NMT_START_APP    = 0x24;
30
    private const byte CAN_NMT_START_APP    = 0x24;
31
    private const byte CAN_NMT_APP_START    = 0x28;
31
    private const byte CAN_NMT_APP_START    = 0x28;
32
    private const byte CAN_NMT_HEARTBEAT    = 0x2C;
32
    private const byte CAN_NMT_HEARTBEAT    = 0x2C;
33
   
33
   
34
    private const byte MY_ID = 0x00;
34
    private const byte MY_ID = 0x00;
35
    //private const byte TARGET_ID = 0x78;
35
    //private const byte TARGET_ID = 0x78;
36
    private const byte MY_NID = 0x0;
36
    private const byte MY_NID = 0x0;
37
    private const byte ADDR0_INDEX = 0;
37
    private const byte ADDR0_INDEX = 0;
38
    private const byte ADDR1_INDEX = 1;
38
    private const byte ADDR1_INDEX = 1;
39
    private const byte ADDR2_INDEX = 2;
39
    private const byte ADDR2_INDEX = 2;
40
    private const byte ADDR3_INDEX = 3;
40
    private const byte ADDR3_INDEX = 3;
41
 
41
 
42
    private const byte HWID0_INDEX = 4;
42
    private const byte HWID0_INDEX = 4;
43
    private const byte HWID1_INDEX = 5;
43
    private const byte HWID1_INDEX = 5;
44
    private const byte HWID2_INDEX = 6;
44
    private const byte HWID2_INDEX = 6;
45
    private const byte HWID3_INDEX = 7;
45
    private const byte HWID3_INDEX = 7;
46
   
46
   
47
    private const int TIMEOUT_MS = 1000;
47
    private const int TIMEOUT_MS = 1000;
48
    private const int TIMEOUT_SHORT_MS = 200;
48
    private const int TIMEOUT_SHORT_MS = 200;
49
   
49
   
50
    private long timeStart = 0;
50
    private long timeStart = 0;
51
   
51
   
52
    public Downloader(HexFile hf, DaemonConnection dc, byte receiveID, bool isBiosUpdate, bool HWID_INUSE, uint hwid) {
52
    public Downloader(HexFile hf, DaemonConnection dc, byte receiveID, bool isBiosUpdate, bool HWID_INUSE, uint hwid) {
53
        this.hf = hf;
53
        this.hf = hf;
54
        this.dc = dc;
54
        this.dc = dc;
55
        this.receiveID = receiveID;
55
        this.receiveID = receiveID;
56
        this.isBiosUpdate = isBiosUpdate;
56
        this.isBiosUpdate = isBiosUpdate;
57
        this.hwid = hwid;
57
        this.hwid = hwid;
58
        this.HWID_INUSE = HWID_INUSE;
58
        this.HWID_INUSE = HWID_INUSE;
59
    }
59
    }
60
   
60
   
61
    public int calcCRC(HexFile hf) {
61
    public int calcCRC(HexFile hf) {
62
        int crc=0;
62
        int crc=0;
63
        for (ulong i=hf.getAddrLower(); i <= hf.getAddrUpper(); i++) {
63
        for (ulong i=hf.getAddrLower(); i <= hf.getAddrUpper(); i++) {
64
            crc = crc16_update(crc, hf.getByte(i));
64
            crc = crc16_update(crc, hf.getByte(i));
65
        }
65
        }
66
        return crc;
66
        return crc;
67
    }
67
    }
68
   
68
   
69
    public int crc16_update(int crc, byte a) {
69
    public int crc16_update(int crc, byte a) {
70
        int i;
70
        int i;
71
        crc ^= a;
71
        crc ^= a;
72
        for (i = 0; i < 8; ++i) {
72
        for (i = 0; i < 8; ++i) {
73
            if ((crc & 1) != 0)
73
            if ((crc & 1) != 0)
74
                crc = (crc >> 1) ^ 0xA001;
74
                crc = (crc >> 1) ^ 0xA001;
75
            else
75
            else
76
                crc = (crc >> 1);
76
                crc = (crc >> 1);
77
        }
77
        }
78
        return crc;
78
        return crc;
79
    }
79
    }
80
   
80
   
81
    public bool go() {
81
    public bool go() {
82
        if (dc==null || hf==null || hf.getLength()==0) return false;
82
        if (dc==null || hf==null || hf.getLength()==0) return false;
83
        return downloader();
83
        return downloader();
84
    }
84
    }
85
   
85
   
86
    public void abort() {
86
    public void abort() {
87
        //if (down != null && down.IsAlive) down.Abort();
87
        //if (down != null && down.IsAlive) down.Abort();
88
    }
88
    }
89
   
89
   
90
    public bool downloader() {
90
    public bool downloader() {
91
        dState pgs = dState.SEND_START;
91
        dState pgs = dState.SEND_START;
92
        int t = 0;
92
        int t = 0;
93
        int t2 = 0;
93
        int t2 = 0;
94
        CanPacket outCm = null;
94
        CanPacket outCm = null;
95
        CanPacket cm = null;
95
        CanPacket cm = null;
96
        byte[] data = new byte[8];
96
        byte[] data = new byte[8];
97
        uint byteSent = 0;
97
        uint byteSent = 0;
98
        ulong currentAddress = 0;
98
        ulong currentAddress = 0;
99
        bool done = false;
99
        bool done = false;
100
        bool errorOccured = false;
100
        bool errorOccured = false;
101
       
101
       
102
        //int rotstate=0;
102
        //int rotstate=0;
103
        //int dldisplaystate=0;
103
        //int dldisplaystate=0;
104
        double lastpercent=0;
104
        double lastpercent=0;
105
        double lasttenpercent=0;
105
        double lasttenpercent=0;
106
        int nrOfTicks=0;
106
        int nrOfTicks=0;
107
       
107
       
108
        try {
108
        try {
109
            if (isBiosUpdate) {
109
            if (isBiosUpdate) {
110
                dlOffset = hf.getAddrLower();
110
                dlOffset = hf.getAddrLower();
111
                //Console.WriteLine(dlOffset);
111
                //Console.WriteLine(dlOffset);
112
                //dlOffset = 200;
112
                //dlOffset = 200;
113
            }
113
            }
114
 
114
 
115
            CanNMT cpn = new CanNMT(HWID_INUSE);
115
            CanNMT cpn = new CanNMT(HWID_INUSE);
116
            cpn.setReceiver(receiveID);
116
            cpn.setReceiver(receiveID);
117
            bool hasMessage = false;
117
            bool hasMessage = false;
118
           
118
           
119
            while (!done) {
119
            while (!done) {
120
                Thread.Sleep(1);
120
                Thread.Sleep(1);
121
               
121
               
122
                switch (pgs) {
122
                switch (pgs) {
123
                    case dState.SEND_START:
123
                    case dState.SEND_START:
124
                        // Send boot start packet to target.
124
                        // Send boot start packet to target.
125
                        // and wait for ack.
125
                        // and wait for ack.
126
                        currentAddress = hf.getAddrLower();
126
                        currentAddress = hf.getAddrLower();
127
                        //data[RID_INDEX] = TARGET_ID;
127
                        //data[RID_INDEX] = TARGET_ID;
128
                        data[ADDR0_INDEX] = (byte)((currentAddress-dlOffset) & 0x0000FF);
128
                        data[ADDR0_INDEX] = (byte)((currentAddress-dlOffset) & 0x0000FF);
129
                        data[ADDR1_INDEX] = (byte)(((currentAddress-dlOffset) & 0x00FF00) >> 8);
129
                        data[ADDR1_INDEX] = (byte)(((currentAddress-dlOffset) & 0x00FF00) >> 8);
130
                        data[ADDR2_INDEX] = (byte)(((currentAddress-dlOffset) & 0xFF0000) >> 16);
130
                        data[ADDR2_INDEX] = (byte)(((currentAddress-dlOffset) & 0xFF0000) >> 16);
131
                        data[ADDR3_INDEX] = 0;
131
                        data[ADDR3_INDEX] = 0;
132
                        if (HWID_INUSE) {
132
                        if (HWID_INUSE) {
133
                            data[HWID0_INDEX] = (byte)((hwid) & 0xFF);
133
                            data[HWID0_INDEX] = (byte)((hwid) & 0xFF);
134
                            data[HWID1_INDEX] = (byte)((hwid>>8) & 0xFF);
134
                            data[HWID1_INDEX] = (byte)((hwid>>8) & 0xFF);
135
                            data[HWID2_INDEX] = (byte)((hwid>>16) & 0xFF);
135
                            data[HWID2_INDEX] = (byte)((hwid>>16) & 0xFF);
136
                            data[HWID3_INDEX] = (byte)((hwid>>24) & 0xFF);
136
                            data[HWID3_INDEX] = (byte)((hwid>>24) & 0xFF);
137
                        }
137
                        }
138
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
138
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
139
                        outCm = cpn.getPgmStartPacket(data);
139
                        outCm = cpn.getPgmStartPacket(data);
140
                        dc.sendCanPacket(outCm);
140
                        dc.sendCanPacket(outCm);
141
                        t = Environment.TickCount;
141
                        t = Environment.TickCount;
142
                        t2 = Environment.TickCount;
142
                        t2 = Environment.TickCount;
143
                        pgs = dState.WAIT_ACK_PRG;
143
                        pgs = dState.WAIT_ACK_PRG;
144
                        timeStart = Environment.TickCount;
144
                        timeStart = Environment.TickCount;
145
                        Console.WriteLine("Downloading...");
145
                        Console.WriteLine("Downloading...");
146
                        Console.Write("  0% [                                        ]\r");
146
                        //Console.Write("  0% [                                        ]\r");
147
                        Console.Write("  0% [");
147
                        Console.Write("  0% [");
148
                        break;
148
                        break;
149
                   
149
                   
150
                   
150
                   
151
                    case dState.WAIT_ACK_PRG:
151
                    case dState.WAIT_ACK_PRG:
152
                        // Check for timeout, resend start packet in that case..
152
                        // Check for timeout, resend start packet in that case..
153
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
153
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
154
                            Console.WriteLine("Timeout while waiting for start prg ack.");
154
                            Console.WriteLine("Timeout while waiting for start prg ack.");
155
                            errorOccured = true;
155
                            errorOccured = true;
156
                            pgs = dState.SEND_RESET;
156
                            pgs = dState.SEND_RESET;
157
                        }
157
                        }
158
                        //Thread.Sleep(1);
158
                        //Thread.Sleep(1);
159
                        // If received ack.
159
                        // If received ack.
160
                        hasMessage = dc.getData(out cm);
160
                        hasMessage = dc.getData(out cm);
161
                        if (hasMessage) {
161
                        if (hasMessage) {
162
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
162
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
163
                            if (cpnin.isNMTPacket()) {
163
                            if (cpnin.isNMTPacket()) {
164
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
164
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
165
                                // If no error
165
                                // If no error
166
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
166
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
167
                                    // Start sending program data..
167
                                    // Start sending program data..
168
                                    byteSent = 0;
168
                                    byteSent = 0;
169
                                    pgs = dState.SEND_PGM_DATA;
169
                                    pgs = dState.SEND_PGM_DATA;
170
                                }
170
                                }
171
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
171
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
172
                                    // else ..
172
                                    // else ..
173
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
173
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
174
                                    errorOccured = true;
174
                                    errorOccured = true;
175
                                    pgs = dState.SEND_RESET;
175
                                    pgs = dState.SEND_RESET;
176
                                }
176
                                }
177
                            }
177
                            }
178
                        }
178
                        }
179
                        break;
179
                        break;
180
                       
180
                       
181
                    case dState.SEND_PGM_DATA:
181
                    case dState.SEND_PGM_DATA:
182
 
182
 
183
                        double percent = (double)byteSent*100/((double)hf.getAddrUpper()-(double)currentAddress);
183
                        double percent = (double)byteSent*100/((double)hf.getAddrUpper()-(double)currentAddress);
184
                        //Console.Write("  0% [                                        ]");
184
                        //Console.Write("  0% [                                        ]");
185
 
185
 
186
                        if (percent >= lastpercent+2.5) {
186
                        if (percent >= lastpercent+2.5) {
187
                        //Console.WriteLine(percent);
187
                        //Console.WriteLine(percent);
188
                           Console.Write("=");
188
                           Console.Write("=");
189
                           nrOfTicks++;
189
                           nrOfTicks++;
190
                           lastpercent = lastpercent+2.5;
190
                           lastpercent = lastpercent+2.5;
191
                        }
191
                        }
192
                        if (percent > lasttenpercent+10) {
192
                        if (percent > lasttenpercent+10) {
193
                           for (int i=nrOfTicks; i<40; i++) {
193
                           for (int i=nrOfTicks; i<40; i++) {
194
                              Console.Write(" ");
194
                              Console.Write(" ");
195
                           }
195
                           }
196
                           Console.Write("]");
196
                           Console.Write("]");
197
                           Console.Write("\r");
197
                           Console.Write("\r");
198
                           Console.Write(" "+Math.Round(percent,0)+"% [");
198
                           Console.Write(" "+Math.Round(percent,0)+"% [");
199
                           
199
                           
200
                           lasttenpercent = percent;
200
                           lasttenpercent = lasttenpercent+10;
201
                           for (int i=0; i<nrOfTicks; i++) {
201
                           for (int i=0; i<nrOfTicks; i++) {
202
                              Console.Write("=");
202
                              Console.Write("=");
203
                           }
203
                           }
204
                        }
204
                        }
205
 
205
 
206
 
206
 
207
                        // Send program data.
207
                        // Send program data.
208
                        byte datalength = 2;
208
                        byte datalength = 2;
209
                        for (ulong i = 0; i < 6; i++) {
209
                        for (ulong i = 0; i < 6; i++) {
210
                            // Populate data.
210
                            // Populate data.
211
                            data[i+2] = hf.getByte(currentAddress + i + byteSent);
211
                            data[i+2] = hf.getByte(currentAddress + i + byteSent);
212
                            if (currentAddress + i + byteSent > hf.getAddrUpper()) {
212
                            if (currentAddress + i + byteSent > hf.getAddrUpper()) {
213
                                break;  //then done
213
                                break;  //then done
214
                            }
214
                            }
215
                            datalength++;
215
                            datalength++;
216
                        }
216
                        }
217
                        data[0] = (byte)(byteSent & 0x00FF);
217
                        data[0] = (byte)(byteSent & 0x00FF);
218
                        data[1] = (byte)((byteSent & 0xFF00) >> 8);
218
                        data[1] = (byte)((byteSent & 0xFF00) >> 8);
219
 
219
 
220
                        outCm = cpn.getPgmDataPacket(data, datalength);
220
                        outCm = cpn.getPgmDataPacket(data, datalength);
221
                        dc.sendCanPacket(outCm);
221
                        dc.sendCanPacket(outCm);
222
                       
222
                       
223
                        t = Environment.TickCount;
223
                        t = Environment.TickCount;
224
                        t2 = Environment.TickCount;
224
                        t2 = Environment.TickCount;
225
                        byteSent += 6;
225
                        byteSent += 6;
226
                        pgs = dState.WAIT_ACK_DATA;
226
                        pgs = dState.WAIT_ACK_DATA;
227
                        break;
227
                        break;
228
                       
228
                       
229
                       
229
                       
230
                    case dState.WAIT_ACK_DATA:
230
                    case dState.WAIT_ACK_DATA:
231
                        // Wait for pgm ack.
231
                        // Wait for pgm ack.
232
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
232
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
233
                            // Woops, error. 
233
                            // Woops, error. 
234
                            Console.WriteLine("Timeout while waiting for data ack.");
234
                            Console.WriteLine("Timeout while waiting for data ack.");
235
                            errorOccured = true;
235
                            errorOccured = true;
236
                            pgs = dState.SEND_RESET;
236
                            pgs = dState.SEND_RESET;
237
                        }
237
                        }
238
                        else if ((Environment.TickCount - t2) > TIMEOUT_SHORT_MS) {
238
                        else if ((Environment.TickCount - t2) > TIMEOUT_SHORT_MS) {
239
                            // Woops, error. 
239
                            // Woops, error. 
240
//disable                           Console.Write(":");
240
//disable                           Console.Write(":");
241
                            byteSent -= 6;
241
                            byteSent -= 6;
242
                            pgs = dState.SEND_PGM_DATA;
242
                            pgs = dState.SEND_PGM_DATA;
243
                            break;
243
                            break;
244
                        }
244
                        }
245
                        //Thread.Sleep(1);
245
                        //Thread.Sleep(1);
246
                        // If received ack.
246
                        // If received ack.
247
                        hasMessage = dc.getData(out cm);
247
                        hasMessage = dc.getData(out cm);
248
                        if (hasMessage) {
248
                        if (hasMessage) {
249
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
249
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
250
                            if (cpnin.isNMTPacket()) {
250
                            if (cpnin.isNMTPacket()) {
251
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
251
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
252
                                // If no error
252
                                // If no error
253
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
253
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
254
                                    //currentAddress += 2;
254
                                    //currentAddress += 2;
255
                                    // Check if end.
255
                                    // Check if end.
256
                                    if (currentAddress + byteSent > hf.getAddrUpper()) {
256
                                    if (currentAddress + byteSent > hf.getAddrUpper()) {
257
                                        // Yes, we are done, send done.
257
                                        // Yes, we are done, send done.
258
                                        pgs = dState.SEND_DONE;
258
                                        pgs = dState.SEND_DONE;
259
                                    }
259
                                    }
260
                                    else {
260
                                    else {
261
                                        // More to write.
261
                                        // More to write.
262
                                        //byteSent = 0;
262
                                        //byteSent = 0;
263
                                        pgs = dState.SEND_PGM_DATA;
263
                                        pgs = dState.SEND_PGM_DATA;
264
                                    }
264
                                    }
265
                                }
265
                                }
266
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
266
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
267
                                    // else ..
267
                                    // else ..
268
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
268
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
269
                                    errorOccured = true;
269
                                    errorOccured = true;
270
                                    pgs = dState.SEND_RESET;
270
                                    pgs = dState.SEND_RESET;
271
                                }
271
                                }
272
                            }
272
                            }
273
                        }
273
                        }
274
                        break;
274
                        break;
275
                       
275
                       
276
                    case dState.SEND_DONE:
276
                    case dState.SEND_DONE:
277
                       for (int i=nrOfTicks; i<40; i++) {
277
                       for (int i=nrOfTicks; i<40; i++) {
278
                          Console.Write(" ");
278
                          Console.Write(" ");
279
                       }
279
                       }
280
                       Console.Write("]");
280
                       Console.Write("]");
281
                       Console.Write("\r");
281
                       Console.Write("\r");
282
                       Console.Write("100% [========================================]");
282
                       Console.Write("100% [========================================]");
283
                        // Send done
283
                        // Send done
284
                        outCm = cpn.getPgmEndPacket();
284
                        outCm = cpn.getPgmEndPacket();
285
                        dc.sendCanPacket(outCm);
285
                        dc.sendCanPacket(outCm);
286
 
286
 
287
                        t = Environment.TickCount;
287
                        t = Environment.TickCount;
288
                        t2 = Environment.TickCount;
288
                        t2 = Environment.TickCount;
289
                        pgs = dState.WAIT_DONE;
289
                        pgs = dState.WAIT_DONE;
290
                        break;
290
                        break;
291
                       
291
                       
292
                       
292
                       
293
                    case dState.WAIT_DONE:
293
                    case dState.WAIT_DONE:
294
                        // Check for timeout, resend done packet in that case..
294
                        // Check for timeout, resend done packet in that case..
295
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
295
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
296
                            Console.WriteLine("Timeout while waiting for end prg ack.");
296
                            Console.WriteLine("Timeout while waiting for end prg ack.");
297
                            errorOccured = true;
297
                            errorOccured = true;
298
                            pgs = dState.SEND_RESET;
298
                            pgs = dState.SEND_RESET;
299
                        }
299
                        }
300
                        //Thread.Sleep(1);
300
                        //Thread.Sleep(1);
301
                       
301
                       
302
                        hasMessage = dc.getData(out cm);
302
                        hasMessage = dc.getData(out cm);
303
                        if (hasMessage) {
303
                        if (hasMessage) {
304
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
304
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
305
                            if (cpnin.isNMTPacket()) {
305
                            if (cpnin.isNMTPacket()) {
306
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
306
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
307
                                // If no error
307
                                // If no error
308
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
308
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
309
                                    Console.WriteLine("");
309
                                    Console.WriteLine("");
310
                                    //
310
                                    //
311
                                    int crc = calcCRC(hf);
311
                                    int crc = calcCRC(hf);
312
                               
312
                               
313
                                    if (cm.getDataLength() == 2) {
313
                                    if (cm.getDataLength() == 2) {
314
                                        byte[] cmdata = cm.getData();
314
                                        byte[] cmdata = cm.getData();
315
                                        if ((cmdata[0] == (crc & 0xFF)) && (cmdata[1] == (crc>>8))) {
315
                                        if ((cmdata[0] == (crc & 0xFF)) && (cmdata[1] == (crc>>8))) {
316
                                            if (!isBiosUpdate) {
316
                                            if (!isBiosUpdate) {
317
                                                Console.WriteLine("Done, successfully programmed application.");
317
                                                Console.WriteLine("Done, successfully programmed application.");
318
                                                pgs = dState.SEND_RESET;
318
                                                pgs = dState.SEND_RESET;
319
                                            } else {
319
                                            } else {
320
                                                Console.WriteLine("Done, successfully programmed bios to application space.");
320
                                                Console.WriteLine("Done, successfully programmed bios to application space.");
321
                                                pgs = dState.SEND_BIOS_UPDATE;
321
                                                pgs = dState.SEND_BIOS_UPDATE;
322
                                            }
322
                                            }
323
                                        } else {
323
                                        } else {
324
                                            string nodecrc = String.Format("{0:x4}", (int)cmdata[0] + (int)(cmdata[1]<<8));
324
                                            string nodecrc = String.Format("{0:x4}", (int)cmdata[0] + (int)(cmdata[1]<<8));
325
                                            nodecrc = "0x"+nodecrc;
325
                                            nodecrc = "0x"+nodecrc;
326
                                            string realcrc = String.Format("{0:x4}", (int)(crc & 0xFF) + (int)(crc & 0xFF00));
326
                                            string realcrc = String.Format("{0:x4}", (int)(crc & 0xFF) + (int)(crc & 0xFF00));
327
                                            realcrc = "0x"+realcrc;
327
                                            realcrc = "0x"+realcrc;
328
                                            Console.WriteLine("CRC failed. Node sent CRC "+nodecrc+" but should be "+realcrc+".");
328
                                            Console.WriteLine("CRC failed. Node sent CRC "+nodecrc+" but should be "+realcrc+".");
329
                                            errorOccured = true;
329
                                            errorOccured = true;
330
                                            pgs = dState.SEND_RESET;
330
                                            pgs = dState.SEND_RESET;
331
                                        }
331
                                        }
332
                                       
332
                                       
333
                                        byteSent = 0;
333
                                        byteSent = 0;
334
                                    }
334
                                    }
335
                                    //Console.WriteLine("crc: " + crc + " " + (crc>>8) + " " + (crc & 0xFF));
335
                                    //Console.WriteLine("crc: " + crc + " " + (crc>>8) + " " + (crc & 0xFF));
336
                                    //Console.WriteLine("ACKpkg with CRC: " + cm.ToString());
336
                                    //Console.WriteLine("ACKpkg with CRC: " + cm.ToString());
337
                                    // 
337
                                    // 
338
                                }
338
                                }
339
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK) {
339
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK) {
340
                                    // else resend addr..
340
                                    // else resend addr..
341
                                    Console.WriteLine("Nack on CAN_NMT_PGM_END.");
341
                                    Console.WriteLine("Nack on CAN_NMT_PGM_END.");
342
                                    errorOccured = true;
342
                                    errorOccured = true;
343
                                    pgs = dState.SEND_RESET;
343
                                    pgs = dState.SEND_RESET;
344
                                }
344
                                }
345
                            }
345
                            }
346
                        }
346
                        }
347
                        break;
347
                        break;
348
                       
348
                       
349
                    case dState.SEND_BIOS_UPDATE:
349
                    case dState.SEND_BIOS_UPDATE:
350
                        data[0] = (byte)(0 & 0x00FF);
350
                        data[0] = (byte)(0 & 0x00FF);
351
                        data[1] = (byte)((0 & 0xFF00) >> 8);
351
                        data[1] = (byte)((0 & 0xFF00) >> 8);
352
                        data[2] = (byte)(dlOffset & 0x00FF);
352
                        data[2] = (byte)(dlOffset & 0x00FF);
353
                        data[3] = (byte)((dlOffset & 0xFF00) >> 8);
353
                        data[3] = (byte)((dlOffset & 0xFF00) >> 8);
354
                        data[4] = (byte)((hf.getAddrUpper()-hf.getAddrLower()+1) & 0x00FF);
354
                        data[4] = (byte)((hf.getAddrUpper()-hf.getAddrLower()+1) & 0x00FF);
355
                        data[5] = (byte)(((hf.getAddrUpper()-hf.getAddrLower()+1) & 0xFF00) >> 8);
355
                        data[5] = (byte)(((hf.getAddrUpper()-hf.getAddrLower()+1) & 0xFF00) >> 8);
356
                       
356
                       
357
                        outCm = cpn.getPgmCopyPacket(data);
357
                        outCm = cpn.getPgmCopyPacket(data);
358
                        Console.WriteLine("Now say a prayer, moving bios");
358
                        Console.WriteLine("Now say a prayer, moving bios");
359
                        dc.sendCanPacket(outCm);
359
                        dc.sendCanPacket(outCm);
360
                        t = Environment.TickCount;
360
                        t = Environment.TickCount;
361
                        t2 = Environment.TickCount;
361
                        t2 = Environment.TickCount;
362
                        pgs = dState.WAIT_BOOT;
362
                        pgs = dState.WAIT_BOOT;
363
                        //pgs = dState.DONE;
363
                        //pgs = dState.DONE;
364
                        break;
364
                        break;
365
 
365
 
366
                    case dState.WAIT_BOOT:
366
                    case dState.WAIT_BOOT:
367
                        // Wait for node reset answer (boot msg).
367
                        // Wait for node reset answer (boot msg).
368
                        if ((Environment.TickCount - t) > 3*TIMEOUT_MS) {
368
                        if ((Environment.TickCount - t) > 3*TIMEOUT_MS) {
369
                            // Woops, error. 
369
                            // Woops, error. 
370
                            Console.WriteLine("Timeout while waiting for node to boot.");
370
                            Console.WriteLine("Timeout while waiting for node to boot.");
371
                            errorOccured = true;
371
                            errorOccured = true;
372
                            pgs = dState.SEND_DONE;
372
                            pgs = dState.SEND_DONE;
373
                        }
373
                        }
374
                        //Thread.Sleep(1);
374
                        //Thread.Sleep(1);
375
                        // If received boot msg.
375
                        // If received boot msg.
376
                        hasMessage = dc.getData(out cm);
376
                        hasMessage = dc.getData(out cm);
377
                        if (hasMessage) {
377
                        if (hasMessage) {
378
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
378
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
379
                            if (cpnin.isNMTPacket()) {
379
                            if (cpnin.isNMTPacket()) {
380
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
380
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
381
                                // If no error
381
                                // If no error
382
                                if (cpnin.getType() == CAN_NMT_BIOS_START) {
382
                                if (cpnin.getType() == CAN_NMT_BIOS_START) {
383
                                    pgs = dState.SEND_EMPTY_START;
383
                                    pgs = dState.SEND_EMPTY_START;
384
                                }
384
                                }
385
                                else {
385
                                else {
386
                                    // else ..
386
                                    // else ..
387
                                }
387
                                }
388
                            }
388
                            }
389
                        }
389
                        }
390
                        break;
390
                        break;
391
                       
391
                       
392
                    case dState.SEND_EMPTY_START:
392
                    case dState.SEND_EMPTY_START:
393
                        // Send boot start packet to target.
393
                        // Send boot start packet to target.
394
                        // and wait for ack.
394
                        // and wait for ack.
395
                       
395
                       
396
                        //data[RID_INDEX] = TARGET_ID;
396
                        //data[RID_INDEX] = TARGET_ID;
397
                        data[ADDR0_INDEX] = (byte)((0) & 0x0000FF);
397
                        data[ADDR0_INDEX] = (byte)((0) & 0x0000FF);
398
                        data[ADDR1_INDEX] = (byte)(((0) & 0x00FF00) >> 8);
398
                        data[ADDR1_INDEX] = (byte)(((0) & 0x00FF00) >> 8);
399
                        data[ADDR2_INDEX] = (byte)(((0) & 0xFF0000) >> 16);
399
                        data[ADDR2_INDEX] = (byte)(((0) & 0xFF0000) >> 16);
400
                        data[ADDR3_INDEX] = 0;
400
                        data[ADDR3_INDEX] = 0;
401
                        if (HWID_INUSE) {
401
                        if (HWID_INUSE) {
402
                            data[HWID0_INDEX] = (byte)((hwid) & 0xFF);
402
                            data[HWID0_INDEX] = (byte)((hwid) & 0xFF);
403
                            data[HWID1_INDEX] = (byte)((hwid>>8) & 0xFF);
403
                            data[HWID1_INDEX] = (byte)((hwid>>8) & 0xFF);
404
                            data[HWID2_INDEX] = (byte)((hwid>>16) & 0xFF);
404
                            data[HWID2_INDEX] = (byte)((hwid>>16) & 0xFF);
405
                            data[HWID3_INDEX] = (byte)((hwid>>24) & 0xFF);
405
                            data[HWID3_INDEX] = (byte)((hwid>>24) & 0xFF);
406
                        }
406
                        }
407
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
407
                        //outCm = new CanPacket(CAN_NMT, CAN_NMT_PGM_START, MY_ID, receiveID, 4, data);
408
                        outCm = cpn.getPgmStartPacket(data);
408
                        outCm = cpn.getPgmStartPacket(data);
409
                        dc.sendCanPacket(outCm);
409
                        dc.sendCanPacket(outCm);
410
                        t = Environment.TickCount;
410
                        t = Environment.TickCount;
411
                        t2 = Environment.TickCount;
411
                        t2 = Environment.TickCount;
412
                        pgs = dState.WAIT_ACK_PRG_EMPTY;
412
                        pgs = dState.WAIT_ACK_PRG_EMPTY;
413
                        break;
413
                        break;
414
                   
414
                   
415
                   
415
                   
416
                    case dState.WAIT_ACK_PRG_EMPTY:
416
                    case dState.WAIT_ACK_PRG_EMPTY:
417
                        // Check for timeout, resend start packet in that case..
417
                        // Check for timeout, resend start packet in that case..
418
                        if ((Environment.TickCount - t) > 3*TIMEOUT_MS) {
418
                        if ((Environment.TickCount - t) > 3*TIMEOUT_MS) {
419
                            Console.WriteLine("Timeout while waiting for start prg ack during empty-first-block-cycle.");
419
                            Console.WriteLine("Timeout while waiting for start prg ack during empty-first-block-cycle.");
420
                            errorOccured = true;
420
                            errorOccured = true;
421
                            pgs = dState.SEND_RESET;
421
                            pgs = dState.SEND_RESET;
422
                        }
422
                        }
423
                        //Thread.Sleep(1);
423
                        //Thread.Sleep(1);
424
                        // If received ack.
424
                        // If received ack.
425
                        hasMessage = dc.getData(out cm);
425
                        hasMessage = dc.getData(out cm);
426
                        if (hasMessage) {
426
                        if (hasMessage) {
427
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
427
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
428
                            if (cpnin.isNMTPacket()) {
428
                            if (cpnin.isNMTPacket()) {
429
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
429
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
430
                                // If no error
430
                                // If no error
431
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
431
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
432
                                    // Start sending program data..
432
                                    // Start sending program data..
433
                                    byteSent = 0;
433
                                    byteSent = 0;
434
                                    pgs = dState.SEND_EMPTY_DATA;
434
                                    pgs = dState.SEND_EMPTY_DATA;
435
                                }
435
                                }
436
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
436
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
437
                                    // else ..
437
                                    // else ..
438
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
438
                                    Console.WriteLine("Nack on CAN_NMT_PGM_START.");
439
                                    errorOccured = true;
439
                                    errorOccured = true;
440
                                    pgs = dState.SEND_RESET;
440
                                    pgs = dState.SEND_RESET;
441
                                }
441
                                }
442
                            }
442
                            }
443
                        }
443
                        }
444
                        break;
444
                        break;
445
                       
445
                       
446
                    case dState.SEND_EMPTY_DATA:
446
                    case dState.SEND_EMPTY_DATA:
447
                        // Send program data.
447
                        // Send program data.
448
                        data[0] = 0;
448
                        data[0] = 0;
449
                        data[1] = 0;
449
                        data[1] = 0;
450
                        data[2] = 0xff;
450
                        data[2] = 0xff;
451
                        data[3] = 0xff;
451
                        data[3] = 0xff;
452
 
452
 
453
                        outCm = cpn.getPgmDataPacket(data, 4);
453
                        outCm = cpn.getPgmDataPacket(data, 4);
454
                        dc.sendCanPacket(outCm);
454
                        dc.sendCanPacket(outCm);
455
                       
455
                       
456
                        t = Environment.TickCount;
456
                        t = Environment.TickCount;
457
                        t2 = Environment.TickCount;
457
                        t2 = Environment.TickCount;
458
                        byteSent += 6;
458
                        byteSent += 6;
459
                        pgs = dState.WAIT_ACK_EMPTY_DATA;
459
                        pgs = dState.WAIT_ACK_EMPTY_DATA;
460
                        break;
460
                        break;
461
                       
461
                       
462
                       
462
                       
463
                    case dState.WAIT_ACK_EMPTY_DATA:
463
                    case dState.WAIT_ACK_EMPTY_DATA:
464
                        // Wait for pgm ack.
464
                        // Wait for pgm ack.
465
                        if ((Environment.TickCount - t) > 2*TIMEOUT_MS) {
465
                        if ((Environment.TickCount - t) > 2*TIMEOUT_MS) {
466
                            // Woops, error. 
466
                            // Woops, error. 
467
                            Console.WriteLine("Timeout while waiting for data ack.");
467
                            Console.WriteLine("Timeout while waiting for data ack.");
468
                            errorOccured = true;
468
                            errorOccured = true;
469
                            pgs = dState.SEND_RESET;
469
                            pgs = dState.SEND_RESET;
470
                        }
470
                        }
471
                        //Thread.Sleep(1);
471
                        //Thread.Sleep(1);
472
                        // If received ack.
472
                        // If received ack.
473
                        hasMessage = dc.getData(out cm);
473
                        hasMessage = dc.getData(out cm);
474
                        if (hasMessage) {
474
                        if (hasMessage) {
475
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
475
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
476
                            if (cpnin.isNMTPacket()) {
476
                            if (cpnin.isNMTPacket()) {
477
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
477
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
478
                                // If no error
478
                                // If no error
479
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
479
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
480
                                    pgs = dState.SEND_DONE_EMPTY;
480
                                    pgs = dState.SEND_DONE_EMPTY;
481
                                }
481
                                }
482
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
482
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK ) {
483
                                    // else ..
483
                                    // else ..
484
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
484
                                    Console.WriteLine("Nack on CAN_NMT_PGM_DATA.");
485
                                    errorOccured = true;
485
                                    errorOccured = true;
486
                                    pgs = dState.SEND_RESET;
486
                                    pgs = dState.SEND_RESET;
487
                                }
487
                                }
488
                            }
488
                            }
489
                        }
489
                        }
490
                        break;
490
                        break;
491
                       
491
                       
492
                    case dState.SEND_DONE_EMPTY:
492
                    case dState.SEND_DONE_EMPTY:
493
                        // Send done
493
                        // Send done
494
                        outCm = cpn.getPgmEndPacket();
494
                        outCm = cpn.getPgmEndPacket();
495
                        dc.sendCanPacket(outCm);
495
                        dc.sendCanPacket(outCm);
496
 
496
 
497
                        t = Environment.TickCount;
497
                        t = Environment.TickCount;
498
                        t2 = Environment.TickCount;
498
                        t2 = Environment.TickCount;
499
                        pgs = dState.WAIT_DONE_EMPTY;
499
                        pgs = dState.WAIT_DONE_EMPTY;
500
                        break;
500
                        break;
501
                       
501
                       
502
                       
502
                       
503
                    case dState.WAIT_DONE_EMPTY:
503
                    case dState.WAIT_DONE_EMPTY:
504
                        // Check for timeout, resend done packet in that case..
504
                        // Check for timeout, resend done packet in that case..
505
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
505
                        if ((Environment.TickCount - t) > TIMEOUT_MS) {
506
                            Console.WriteLine("Timeout while waiting for end prg ack.");
506
                            Console.WriteLine("Timeout while waiting for end prg ack.");
507
                            errorOccured = true;
507
                            errorOccured = true;
508
                            pgs = dState.SEND_RESET;
508
                            pgs = dState.SEND_RESET;
509
                        }
509
                        }
510
                        //Thread.Sleep(1);
510
                        //Thread.Sleep(1);
511
                       
511
                       
512
                        hasMessage = dc.getData(out cm);
512
                        hasMessage = dc.getData(out cm);
513
                        if (hasMessage) {
513
                        if (hasMessage) {
514
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
514
                            CanNMT cpnin = new CanNMT(cm, HWID_INUSE);
515
                            if (cpnin.isNMTPacket()) {
515
                            if (cpnin.isNMTPacket()) {
516
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
516
                            //if (cpnin.isNMTPacket() && (cpnin.getSender() == receiveID)) {
517
                                // If no error
517
                                // If no error
518
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
518
                                if (cpnin.getType() == CAN_NMT_PGM_ACK) {
519
                                    Console.WriteLine("");
519
                                    Console.WriteLine("");
520
                                    //
520
                                    //
521
                                    Console.WriteLine("Done, successfully cleaned application flash.");
521
                                    Console.WriteLine("Done, successfully cleaned application flash.");
522
                                    pgs = dState.SEND_RESET;
522
                                    pgs = dState.SEND_RESET;
523
                                }
523
                                }
524
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK) {
524
                                else if (cpnin.getType() == CAN_NMT_PGM_NACK) {
525
                                    // else resend addr..
525
                                    // else resend addr..
526
                                    Console.WriteLine("Nack on CAN_NMT_PGM_END.");
526
                                    Console.WriteLine("Nack on CAN_NMT_PGM_END.");
527
                                    errorOccured = true;
527
                                    errorOccured = true;
528
                                    pgs = dState.SEND_RESET;
528
                                    pgs = dState.SEND_RESET;
529
                                }
529
                                }
530
                            }
530
                            }
531
                        }
531
                        }
532
                        break;                     
532
                        break;                     
533
                    case dState.SEND_RESET:
533
                    case dState.SEND_RESET:
534
                        // Send reset
534
                        // Send reset
535
                        cpn.doReset(dc, receiveID, hwid);
535
                        cpn.doReset(dc, receiveID, hwid);
536
                        t = Environment.TickCount;
536
                        t = Environment.TickCount;
537
                        t2 = Environment.TickCount;
537
                        t2 = Environment.TickCount;
538
                        pgs = dState.DONE;
538
                        pgs = dState.DONE;
539
                        break;
539
                        break;
540
                       
540
                       
541
                       
541
                       
542
                    case dState.DONE:
542
                    case dState.DONE:
543
                        done = true;
543
                        done = true;
544
                        //down.Abort();
544
                        //down.Abort();
545
                        if (!errorOccured) {
545
                        if (!errorOccured) {
546
                            long tsecs = ((Environment.TickCount - timeStart) / 1000);
546
                            long tsecs = ((Environment.TickCount - timeStart) / 1000);
547
                            double bitRate = hf.getLength() / ((double)(Environment.TickCount - timeStart) / 1000.0);
547
                            double bitRate = hf.getLength() / ((double)(Environment.TickCount - timeStart) / 1000.0);
548
                           
548
                           
549
                            if (tsecs <= 0) tsecs = 1;
549
                            if (tsecs <= 0) tsecs = 1;
550
                            long mins = tsecs / 60;
550
                            long mins = tsecs / 60;
551
                            long secs = tsecs % 60;
551
                            long secs = tsecs % 60;
552
                            string pad = "";
552
                            string pad = "";
553
                            if (secs < 10) {
553
                            if (secs < 10) {
554
                                pad = "0";
554
                                pad = "0";
555
                            }
555
                            }
556
                            Console.WriteLine("Time spent: " + mins + ":" + pad + secs + ", " + Math.Round(bitRate, 2) + " bytes/s");
556
                            Console.WriteLine("Time spent: " + mins + ":" + pad + secs + ", " + Math.Round(bitRate, 2) + " bytes/s");
557
                        }
557
                        }
558
                        //Console.Write("> ");
558
                        //Console.Write("> ");
559
                        break;
559
                        break;
560
                }
560
                }
561
            }
561
            }
562
           
562
           
563
        } catch(Exception) {
563
        } catch(Exception) {
564
            Console.WriteLine("Exception occured");
564
            Console.WriteLine("Exception occured");
565
            //Console.WriteLine(e);
565
            //Console.WriteLine(e);
566
            //skriva ut antal bytes skrivna vore bra här, kanske nån annan form av hjälp för debug, något gick snett liksom
566
            //skriva ut antal bytes skrivna vore bra här, kanske nån annan form av hjälp för debug, något gick snett liksom
567
           
567
           
568
        }
568
        }
569
       
569
       
570
        return !errorOccured;
570
        return !errorOccured;
571
    }
571
    }
572
}
572
}
573
 
573