Rev 1043 | Rev 1066 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1043 | Rev 1063 | ||
|---|---|---|---|
| Line 98... | Line 98... | ||
| 98 | this.onlineHandler(); |
98 | this.onlineHandler(); |
| 99 | } |
99 | } |
| 100 | 100 | ||
| 101 | CanNode.prototype.startProgramming = function(hexData, progressCallback, isBios) |
101 | CanNode.prototype.startProgramming = function(hexData, progressCallback, isBios) |
| 102 | { |
102 | { |
| - | 103 | this.myProgrammingCallback = progressCallback; |
|
| 103 | if (isBios) |
104 | if (isBios) |
| 104 | { |
105 | { |
| 105 | this.myProgrammingIsBios = isBios; |
106 | this.myProgrammingIsBios = isBios; |
| 106 | this.myProgrammingBiosOffset = hexData.getAddrLower(); |
107 | this.myProgrammingBiosOffset = hexData.getAddrLower(); |
| 107 |
|
108 | //this.myProgrammingCallback(true, "", "got IsBios, address: " + this.myProgrammingBiosOffset, false); |
| 108 | } |
109 | } |
| 109 | else |
110 | else |
| 110 | { |
111 | { |
| 111 | this.myProgrammingIsBios = false; |
112 | this.myProgrammingIsBios = false; |
| 112 | } |
113 | } |
| 113 | 114 | ||
| 114 | this.myProgramming = true; |
115 | this.myProgramming = true; |
| 115 | this.myProgrammingHex = hexData; |
116 | this.myProgrammingHex = hexData; |
| 116 | this.myProgrammingCallback = progressCallback; |
- | |
| 117 | 117 | ||
| 118 | CanProgrammingNode = this; |
118 | CanProgrammingNode = this; |
| 119 | 119 | ||
| 120 | var self = this; |
120 | var self = this; |
| 121 | this.myProgrammingTimeout = new Interval(function() { self.programmingTimeout() }, 6000); |
121 | this.myProgrammingTimeout = new Interval(function() { self.programmingTimeout() }, 6000); |
| Line 131... | Line 131... | ||
| 131 | { |
131 | { |
| 132 | case "RESET": |
132 | case "RESET": |
| 133 | this.stopProgramming(true, "Timeout while waiting for node to reset"); |
133 | this.stopProgramming(true, "Timeout while waiting for node to reset"); |
| 134 | this.reset(); |
134 | this.reset(); |
| 135 | break; |
135 | break; |
| 136 | case "DATA": |
136 | case "DATA": |
| 137 | this.stopProgramming(true, "Timeout while waiting for node to ack data packet"); |
137 | this.stopProgramming(true, "Timeout while waiting for node to ack data packet"); |
| 138 | this.reset(); |
138 | this.reset(); |
| 139 | break; |
139 | break; |
| 140 | case "END": |
140 | case "END": |
| 141 | this.stopProgramming(true, "Timeout while waiting for node to ack data packet*"); |
141 | this.stopProgramming(true, "Timeout while waiting for node to ack data packet*"); |
| 142 | this.reset(); |
142 | this.reset(); |
| 143 | break; |
143 | break; |
| 144 | case "CRC": |
144 | case "CRC": |
| 145 | this.stopProgramming(true, "Timeout while waiting for node to send crc"); |
145 | this.stopProgramming(true, "Timeout while waiting for node to send crc"); |
| 146 | this.reset(); |
146 | this.reset(); |
| 147 | break; |
147 | break; |
| 148 | case "COPY": |
148 | case "COPY": |
| 149 | //this will never occur, bios does not send ack for copy command, it just moves data in flash then reset itself |
149 | //this will never occur, bios does not send ack for copy command, it just moves data in flash then reset itself |
| - | 150 | this.myProgrammingCallback(true, "ERROR", "Unexpected error 100", false); |
|
| 150 | break; |
151 | break; |
| 151 | default: |
152 | default: |
| - | 153 | this.myProgrammingCallback(true, "ERROR", "Unexpected error 101, state: " + this.myProgrammingState, false); |
|
| 152 | break; |
154 | break; |
| 153 | } |
155 | } |
| 154 | } |
156 | } |
| 155 | 157 | ||
| 156 | CanNode.prototype.programmingResend = function() |
158 | CanNode.prototype.programmingResend = function() |
| 157 | { |
159 | { |
| 158 | this.myProgrammingCallback(true, "", "Resend timeout, a packet was lost, either program data or ack", false); |
160 | this.myProgrammingCallback(true, "", "Resend timeout, a packet was lost, either program data or ack", false); |
| 159 | this.myProgrammingResend.reset(); |
161 | this.myProgrammingResend.reset(); |
| 160 | //if we did not got ack then try to resend the data |
162 | //if we did not got ack then try to resend the data |
| Line 162... | Line 164... | ||
| 162 | } |
164 | } |
| 163 | 165 | ||
| 164 | CanNode.prototype.handleBiosStart = function(biosVersion, hasApplication) |
166 | CanNode.prototype.handleBiosStart = function(biosVersion, hasApplication) |
| 165 | { |
167 | { |
| 166 | if (this.myResetCallback) |
168 | if (this.myResetCallback) |
| 167 | { |
169 | { |
| 168 | this.myResetCallback(true); |
170 | this.myResetCallback(true); |
| 169 | this.myResetCallback = null; |
171 | this.myResetCallback = null; |
| 170 | } |
172 | } |
| 171 | 173 | ||
| 172 | if (this.myResetTimer) |
174 | if (this.myResetTimer) |
| 173 | { |
175 | { |
| 174 | this.myResetTimer.stop(); |
176 | this.myResetTimer.stop(); |
| 175 | this.myResetTimer = null; |
177 | this.myResetTimer = null; |
| 176 | } |
178 | } |
| 177 | 179 | ||
| 178 | //print("node was reset and bios just started, ver:" + biosVersion); |
180 | //print("node was reset and bios just started, ver:" + biosVersion); |
| 179 | if (this.myProgramming) |
181 | if (this.myProgramming) |
| 180 | { |
182 | { |
| - | 183 | switch (this.myProgrammingState) |
|
| - | 184 | { |
|
| - | 185 | case "RESET": |
|
| 181 | this.myProgrammingHexAddress = this.myProgrammingHex.getAddrLower(); |
186 | this.myProgrammingHexAddress = this.myProgrammingHex.getAddrLower(); |
| 182 | this.myProgrammingWantAck = (((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)<<8)|((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)>>8))&0xffff; |
187 | this.myProgrammingWantAck = (((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)<<8)|((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)>>8))&0xffff; |
| 183 | 188 | ||
| 184 | var canMessage = new CanNMTMessage("nmt", "Pgm_Start"); |
189 | var canMessage = new CanNMTMessage("nmt", "Pgm_Start"); |
| 185 | canMessage.setData("HardwareId", this.myHardwareId); |
190 | canMessage.setData("HardwareId", this.myHardwareId); |
| 186 | canMessage.setData("Address0", (this.myProgrammingHexAddress-this.myProgrammingBiosOffset)&0xff); |
191 | canMessage.setData("Address0", (this.myProgrammingHexAddress-this.myProgrammingBiosOffset)&0xff); |
| 187 | canMessage.setData("Address1", ((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)>>8)&0xff); |
192 | canMessage.setData("Address1", ((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)>>8)&0xff); |
| 188 | canMessage.setData("Address3", ((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)>>16)&0xff); |
193 | canMessage.setData("Address3", ((this.myProgrammingHexAddress-this.myProgrammingBiosOffset)>>16)&0xff); |
| Line 193... | Line 198... | ||
| 193 | var self = this; |
198 | var self = this; |
| 194 | this.myProgrammingTimeout.setTimeout(1000); |
199 | this.myProgrammingTimeout.setTimeout(1000); |
| 195 | 200 | ||
| 196 | this.myProgrammingResend = new Interval(function() { self.programmingResend() }, 1100); |
201 | this.myProgrammingResend = new Interval(function() { self.programmingResend() }, 1100); |
| 197 | this.myProgrammingResend.start(); |
202 | this.myProgrammingResend.start(); |
| 198 | 203 | ||
| 199 | var date = new Date(); |
204 | var date = new Date(); |
| 200 | this.myProgrammingTimeStarted = date.getTime(); |
205 | this.myProgrammingTimeStarted = date.getTime(); |
| 201 | 206 | ||
| 202 | this.myProgrammingCallback(true, "START", "Started programming of node", false); |
207 | this.myProgrammingCallback(true, "START", "Started programming of node", false); |
| 203 | this.myProgrammingCallback(true, "", " 0% [", true); |
208 | this.myProgrammingCallback(true, "", " 0% [", true); |
| - | 209 | break; |
|
| - | 210 | case "COPY": |
|
| - | 211 | //bios was moved and now started (so it seems like it was successfully programmed and moved) |
|
| - | 212 | //now we should send a new programming with one empty packet to erase application area |
|
| - | 213 | this.myProgrammingWantAck = 0; |
|
| - | 214 | var canMessage = new CanNMTMessage("nmt", "Pgm_Start"); |
|
| - | 215 | canMessage.setData("HardwareId", this.myHardwareId); |
|
| - | 216 | canMessage.setData("Address0", 0); |
|
| - | 217 | canMessage.setData("Address1", 0); |
|
| - | 218 | canMessage.setData("Address3", 0); |
|
| - | 219 | canMessage.setData("Address4", 0); |
|
| - | 220 | canMessage.send(); |
|
| - | 221 | this.myProgrammingState = "APPCLEANDATA"; |
|
| - | 222 | break; |
|
| - | 223 | case "DONE": |
|
| - | 224 | this.stopProgramming(true, "Done, successful"); |
|
| - | 225 | break; |
|
| - | 226 | default: |
|
| - | 227 | this.myProgrammingCallback(true, "ERROR", "Unexpected error 105, state: " + this.myProgrammingState, false); |
|
| - | 228 | break; |
|
| - | 229 | } |
|
| - | 230 | ||
| 204 | } |
231 | } |
| 205 | } |
232 | } |
| 206 | 233 | ||
| 207 | CanNode.prototype.handleNack = function(data) |
234 | CanNode.prototype.handleNack = function(data) |
| 208 | { |
235 | { |
| Line 289... | Line 316... | ||
| 289 | if (percent >= this.myProgrammingLastPercent+2.5) |
316 | if (percent >= this.myProgrammingLastPercent+2.5) |
| 290 | { |
317 | { |
| 291 | this.myProgrammingCallback(true, "", "=", true); |
318 | this.myProgrammingCallback(true, "", "=", true); |
| 292 | this.myProgrammingLastPercent+=2.5; |
319 | this.myProgrammingLastPercent+=2.5; |
| 293 | this.myProgrammingnrOfTicks++; |
320 | this.myProgrammingnrOfTicks++; |
| 294 | } |
321 | } |
| 295 | if (percent > this.myProgrammingLastTenPercent+10) |
322 | if (percent > this.myProgrammingLastTenPercent+10) |
| 296 | { |
323 | { |
| 297 | for (var i=this.myProgrammingnrOfTicks; i<40; i++) this.myProgrammingCallback(true, "", " ", true); |
324 | for (var i=this.myProgrammingnrOfTicks; i<40; i++) this.myProgrammingCallback(true, "", " ", true); |
| 298 | this.myProgrammingCallback(true, "", "]", true); |
325 | this.myProgrammingCallback(true, "", "]", true); |
| 299 | this.myProgrammingCallback(true, "", "\r", true); |
326 | this.myProgrammingCallback(true, "", "\r", true); |
| Line 336... | Line 363... | ||
| 336 | 363 | ||
| 337 | case "CRC": |
364 | case "CRC": |
| 338 | //is this a bios programming? |
365 | //is this a bios programming? |
| 339 | if (this.myProgrammingIsBios) |
366 | if (this.myProgrammingIsBios) |
| 340 | { |
367 | { |
| - | 368 | this.myProgrammingTimeout.setTimeout(6000); |
|
| 341 | this.myProgrammingState = "COPY"; |
369 | this.myProgrammingState = "COPY"; |
| 342 | this.myProgrammingCallback(true, "\nBIOS", "Start to copy bios to new location", false); |
370 | this.myProgrammingCallback(true, "\nBIOS", "Start to copy bios to new location", false); |
| 343 | var canMessage = new CanNMTMessage("nmt", "Pgm_Copy"); |
371 | var canMessage = new CanNMTMessage("nmt", "Pgm_Copy"); |
| 344 | canMessage.setData("Source0", 0); |
372 | canMessage.setData("Source0", 0); |
| 345 | canMessage.setData("Source1", 0); |
373 | canMessage.setData("Source1", 0); |
| 346 | canMessage.setData("Destination0", this.myProgrammingBiosOffset&0xff); |
374 | canMessage.setData("Destination0", this.myProgrammingBiosOffset&0xff); |
| 347 | canMessage.setData("Destination1", (this.myProgrammingBiosOffset>>8)&0xff); |
375 | canMessage.setData("Destination1", (this.myProgrammingBiosOffset>>8)&0xff); |
| 348 | canMessage.setData("Length0", (this.myProgrammingHex.getLength() |
376 | canMessage.setData("Length0", (this.myProgrammingHex.getLength())&0xff); |
| 349 | canMessage.setData("Length1", |
377 | canMessage.setData("Length1", (this.myProgrammingHex.getLength()>>8)&0xff); |
| 350 | canMessage.send(); |
378 | canMessage.send(); |
| 351 |
|
379 | //this.stopProgramming(); |
| 352 | } |
380 | } |
| 353 | else |
381 | else |
| 354 | { |
382 | { |
| 355 | this. |
383 | this.myProgrammingState = "DONE"; |
| 356 | this.reset(); |
384 | this.reset(); |
| 357 | } |
385 | } |
| 358 | break; |
386 | break; |
| 359 | 387 | ||
| 360 | case "COPY": //this will never occur, bios does not send ack for copy command, it just moves data in flash then reset itself |
388 | case "COPY": //this will never occur, bios does not send ack for copy command, it just moves data in flash then reset itself |
| - | 389 | break; |
|
| - | 390 | case "APPCLEANDATA": |
|
| - | 391 | var canMessage = new CanNMTMessage("nmt", "Pgm_Data_16"); |
|
| - | 392 | this.myProgrammingWantAck = 0; |
|
| - | 393 | this.myProgrammingState = "APPCLEANEND"; |
|
| - | 394 | canMessage.setData("Data0", 0xff); |
|
| - | 395 | canMessage.setData("Data1", 0xff); |
|
| - | 396 | canMessage.send(); |
|
| - | 397 | break; |
|
| - | 398 | case "APPCLEANEND": |
|
| - | 399 | this.myProgrammingWantAck = 0x1b0; |
|
| - | 400 | this.myProgrammingState = "APPCLEANCRC"; |
|
| - | 401 | var canMessage = new CanNMTMessage("nmt", "Pgm_End"); |
|
| - | 402 | canMessage.send(); |
|
| - | 403 | break; |
|
| - | 404 | case "APPCLEANCRC": |
|
| - | 405 | this.myProgrammingState = "DONE"; |
|
| - | 406 | this.reset(); |
|
| 361 | break; |
407 | break; |
| 362 | 408 | ||
| 363 | default: |
409 | default: |
| - | 410 | this.myProgrammingCallback(true, "ERROR", "Unexpected error 104, state: " + this.myProgrammingState, false); |
|
| 364 | break; |
411 | break; |
| 365 | } |
412 | } |
| 366 | } |
413 | } |
| 367 | else |
414 | else |
| 368 | { |
415 | { |
| Line 378... | Line 425... | ||
| 378 | case "CRC": |
425 | case "CRC": |
| 379 | this.stopProgramming(true, "Failed to program, CRC not matching, expected data: "+this.myProgrammingWantAck+" got: "+data); |
426 | this.stopProgramming(true, "Failed to program, CRC not matching, expected data: "+this.myProgrammingWantAck+" got: "+data); |
| 380 | this.reset(); |
427 | this.reset(); |
| 381 | break; |
428 | break; |
| 382 | case "COPY": //this will never occur, bios does not send ack for copy command, it just moves data in flash then reset itself |
429 | case "COPY": //this will never occur, bios does not send ack for copy command, it just moves data in flash then reset itself |
| - | 430 | this.myProgrammingCallback(true, "ERROR", "Unexpected error 103", false); |
|
| 383 | break; |
431 | break; |
| 384 | default: |
432 | default: |
| - | 433 | this.myProgrammingCallback(true, "ERROR", "Unexpected error 102, state: " + this.myProgrammingState, false); |
|
| 385 | break; |
434 | break; |
| 386 | } |
435 | } |
| 387 | } |
436 | } |
| 388 | } |
437 | } |
| 389 | 438 | ||