Subversion Repositories HomeAutomation

Rev

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
this.myProgrammingCallback(true, "", "got IsBios, address: " + this.myProgrammingBiosOffset, false);
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()+1)&0xff);
376
                canMessage.setData("Length0", (this.myProgrammingHex.getLength())&0xff);
349
                canMessage.setData("Length1", ((this.myProgrammingHex.getLength()+1)>>8)&0xff);
377
                canMessage.setData("Length1", (this.myProgrammingHex.getLength()>>8)&0xff);
350
                canMessage.send();
378
                canMessage.send();
351
                this.stopProgramming();
379
                //this.stopProgramming();
352
            }
380
            }
353
            else
381
            else
354
            {
382
            {
355
                this.stopProgramming(true, "Done, successful");
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