Преглед изворни кода

Pre-collect info about options on field init

- When initializing fields use the configuration to determine the format
- Cache the line for each option for fastest string compare / replace
- Add logging levels for debugging
Scott Lahteine пре 10 година
родитељ
комит
94bebf31ac
2 измењених фајлова са 174 додато и 55 уклоњено
  1. 9
    0
      Marlin/configurator/index.html
  2. 165
    55
      Marlin/configurator/js/configurator.js

+ 9
- 0
Marlin/configurator/index.html Прегледај датотеку

48
         <label class="newline">Temp Sensor 2:</label><select name="TEMP_SENSOR_2"></select>
48
         <label class="newline">Temp Sensor 2:</label><select name="TEMP_SENSOR_2"></select>
49
         <label class="newline">Bed Temp Sensor:</label><select name="TEMP_SENSOR_BED"></select>
49
         <label class="newline">Bed Temp Sensor:</label><select name="TEMP_SENSOR_BED"></select>
50
 
50
 
51
+        <label class="newline">Redundant Sensor:</label>
52
+          <input name="TEMP_SENSOR_1_AS_REDUNDANT" type="checkbox" value="1" checked />
53
+
54
+        <label>Max Diff:</label>
55
+          <input name="MAX_REDUNDANT_TEMP_SENSOR_DIFF" type="text" size="3" maxlength="2" />
56
+
57
+        <label class="newline">Temp Residency Time (s):</label>
58
+          <input name="TEMP_RESIDENCY_TIME" type="text" size="3" maxlength="2" />
59
+
51
         <h2>Marlin/Configuration.h</h2>
60
         <h2>Marlin/Configuration.h</h2>
52
         <pre id="config_text" class="prettyprint linenums"></pre>
61
         <pre id="config_text" class="prettyprint linenums"></pre>
53
         <h2>Marlin/Configuration_adv.h</h2>
62
         <h2>Marlin/Configuration_adv.h</h2>

+ 165
- 55
Marlin/configurator/js/configurator.js Прегледај датотеку

34
   return len ? this.prePad(len, '0') : this;
34
   return len ? this.prePad(len, '0') : this;
35
 };
35
 };
36
 
36
 
37
+String.prototype.regEsc = function() {
38
+  return this.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
39
+}
40
+
37
 /**
41
 /**
38
  * selectField.addOptions takes an array or keyed object
42
  * selectField.addOptions takes an array or keyed object
39
  */
43
  */
66
   // Return this anonymous object as configuratorApp
70
   // Return this anonymous object as configuratorApp
67
   return {
71
   return {
68
     my_public_var: 4,
72
     my_public_var: 4,
73
+    logging: 1,
69
 
74
 
70
     init: function() {
75
     init: function() {
71
       self = this; // a 'this' for use when 'this' is something else
76
       self = this; // a 'this' for use when 'this' is something else
74
       var $uploader = $('#file-upload');
79
       var $uploader = $('#file-upload');
75
       var fileUploader = new BinaryFileUploader({
80
       var fileUploader = new BinaryFileUploader({
76
         element:    $uploader[0],
81
         element:    $uploader[0],
77
-        onFileLoad: function(file) { console.log(this); self.handleFileLoad(file, $uploader); }
82
+        onFileLoad: function(file) { self.handleFileLoad(file, $uploader); }
78
       });
83
       });
79
 
84
 
80
       if (!fileUploader.hasFileUploaderSupport()) alert('Your browser doesn\'t support the file reading API');
85
       if (!fileUploader.hasFileUploaderSupport()) alert('Your browser doesn\'t support the file reading API');
107
         success: function(txt) {
112
         success: function(txt) {
108
           // File contents into the textarea
113
           // File contents into the textarea
109
           $config.text(txt);
114
           $config.text(txt);
115
+          // Get thermistor info too
110
           self.initThermistorsFromText(txt);
116
           self.initThermistorsFromText(txt);
111
         },
117
         },
112
         error: errFunc
118
         error: errFunc
130
 
136
 
131
     initBoardsFromText: function(txt) {
137
     initBoardsFromText: function(txt) {
132
       boards_list = {};
138
       boards_list = {};
133
-      var r, findDef = new RegExp('[ \\t]*#define[ \\t]+(BOARD_[^ \\t]+)[ \\t]+(\\d+)[ \\t]*(//[ \\t]*)?(.+)?', 'gm');
139
+      var r, findDef = new RegExp('[ \\t]*#define[ \\t]+(BOARD_[\\w_]+)[ \\t]+(\\d+)[ \\t]*(//[ \\t]*)?(.+)?', 'gm');
134
       while((r = findDef.exec(txt)) !== null) {
140
       while((r = findDef.exec(txt)) !== null) {
135
         boards_list[r[1]] = r[2].prePad(3, '  ') + " — " + r[4].replace(/\).*/, ')');
141
         boards_list[r[1]] = r[2].prePad(3, '  ') + " — " + r[4].replace(/\).*/, ')');
136
       }
142
       }
165
           this.initField('MOTHERBOARD');
171
           this.initField('MOTHERBOARD');
166
           break;
172
           break;
167
         default:
173
         default:
168
-          console.log("Can't parse "+filename);
174
+          this.log("Can't parse "+filename, 1);
169
           break;
175
           break;
170
       }
176
       }
171
     },
177
     },
247
       this.initField('TEMP_SENSOR_2');
253
       this.initField('TEMP_SENSOR_2');
248
       this.initField('TEMP_SENSOR_BED');
254
       this.initField('TEMP_SENSOR_BED');
249
 
255
 
256
+      this.initField('TEMP_SENSOR_1_AS_REDUNDANT');
257
+      this.initField('MAX_REDUNDANT_TEMP_SENSOR_DIFF');
258
+
259
+      this.initField('TEMP_RESIDENCY_TIME');
250
 
260
 
251
       $('#serial_stepper').jstepper({
261
       $('#serial_stepper').jstepper({
252
         min: 0,
262
         min: 0,
266
       // prettyPrint();
276
       // prettyPrint();
267
     },
277
     },
268
 
278
 
279
+    /**
280
+     * initField - make a field responsive and get info
281
+     * about its configuration file define
282
+     */
269
     initField: function(name) {
283
     initField: function(name) {
270
-      var $elm = $('#'+name), isText = $elm.attr('type') == 'text';
284
+      var $elm = $('#'+name), elm = $elm[0];
285
+      if (elm.configInfo === undefined) {
286
+        elm.configInfo = this.getDefineInfo(name);
287
+        $elm.on($elm.attr('type') == 'text' ? 'input' : 'change', this.handleChange);
288
+      }
271
       this.setFieldFromDefine(name);
289
       this.setFieldFromDefine(name);
272
-      isText ? $elm.bind('input', this.handleChange) : $elm.change(this.handleChange)
273
     },
290
     },
274
 
291
 
275
     handleChange: function(e) {
292
     handleChange: function(e) {
276
-      self.updateDefineForField(e.target);
293
+      self.updateDefineForField(e.target.id);
277
     },
294
     },
278
 
295
 
279
     handleSwitch: function(e) {
296
     handleSwitch: function(e) {
280
       var $elm = $(e.target), $prev = $elm.prev();
297
       var $elm = $(e.target), $prev = $elm.prev();
281
       var on = $elm.prop('checked') || false;
298
       var on = $elm.prop('checked') || false;
282
       $prev.attr('disabled', !on);
299
       $prev.attr('disabled', !on);
283
-      self.setDefineEnabled($prev[0], on);
300
+      self.setDefineEnabled($prev[0].id, on);
284
     },
301
     },
285
 
302
 
286
-    setDefineEnabled: function(elm, val) {
287
-      var $elm = $(elm);
303
+    setDefineEnabled: function(name, val) {
304
+      this.log('setDefineEnabled:'+name,3);
288
 
305
 
289
-      // console.log("Enable: " + elm.id + " = " + val);
306
+      var $elm = $('#'+name), elm = $elm[0], inf = elm.configInfo;
307
+      var $c = $config; // for now
308
+      var txt = $c.text();
290
 
309
 
291
-      var txt = $config.text();
310
+      var slash = val ? '' : '// ';
311
+      var newline = inf.line
312
+        .replace(/^([ \t]*)(\/\/)([ \t]*)/, '$1$3') // remove slashes
313
+        .replace('#define', slash + '#define');     // add them back
292
 
314
 
293
-      var findDef = new RegExp('^[ \\t]*(//[ \\t]*)?(#define[ \\t]+' + elm.id + '([ \\t].*)?)$', 'm');
294
-      txt = txt.replace(findDef, val ? '$2': '//$2');
315
+      txt = txt.replace(inf.line, newline);
316
+      inf.line = newline;
317
+      this.log(newline, 2);
295
 
318
 
296
-      // Now set the text in the field
297
-      $config.text(txt);
319
+      $c.text(txt);
298
     },
320
     },
299
 
321
 
300
-    updateDefineForField: function(elm) {
301
-      var $elm = $(elm),
302
-          isCheck = $elm.attr('type') == 'checkbox',
303
-          val = isCheck ? $elm.prop('checked') : $elm.val();
322
+    defineIsEnabled: function(name, adv) {
323
+      this.log('defineIsEnabled:'+name,4);
324
+      var $elm = $('#'+name), elm = $elm[0];
325
+      var $c = adv ? $config_adv : $config;
304
 
326
 
305
-      // console.log("Set: " + elm.id + " = " + val);
327
+      var result = elm.configInfo.regex.exec($c.text());
328
+      this.log(result,2);
306
 
329
 
307
-      var txt = $config.text();
330
+      var on = result !== null ? result[1].trim() != '//' : true;
331
+      this.log(name + ' = ' + on, 4);
308
 
332
 
309
-      if (isCheck) {
310
-        var findDef = new RegExp('^([ \\t]*)(//[ \\t]*)?(#define[ \\t]+' + elm.id + '([ \\t].*)?)$', 'm');
311
-        txt = txt.replace(findDef, val ? '$1$3': '$1//$3');
312
-      }
313
-      else {
314
-        // Match the define name, 1 = "#define name ", 3=value, 4=comment
315
-        var findDef = new RegExp('^([ \\t]*(//)?[ \\t]*#define[ \\t]+' + elm.id + '[ \\t]+)(.*)([ \\t]*(//)?.*)$', 'm');
316
-        if ($elm.hasClass('quote')) val = '"' + val + '"'
317
-        txt = txt.replace(findDef, '$1!!REGEXP!!$4').replace('!!REGEXP!!', val);
333
+      return on;
334
+    },
335
+
336
+    updateDefineForField: function(name, adv) {
337
+      this.log('updateDefineForField:'+name,4);
338
+      var $elm = $('#'+name), elm = $elm[0], inf = elm.configInfo;
339
+      var $c = adv ? $config_adv : $config;
340
+      var txt = $c.text();
341
+
342
+      // var result = inf.repl.exec(txt);
343
+      // this.log(result, 2);
344
+
345
+      var isCheck = $elm.attr('type') == 'checkbox',
346
+          val = isCheck ? $elm.prop('checked') : $elm.val();
347
+
348
+      var newline;
349
+      switch(inf.type) {
350
+        case 'switch':
351
+          var slash = val ? '' : '//';
352
+          newline = (inf.pre + slash + inf.define + inf.post);
353
+          break;
354
+        case 'quoted':
355
+          if (isCheck) {
356
+            this.log(name + ' should not be a checkbox', 1);
357
+            var slash = val ? '' : '//';
358
+            newline = (inf.pre + slash + inf.define + '"'+val+'"' + inf.post);
359
+          }
360
+          else {
361
+            newline = inf.pre + inf.define + '"'+val+'"' + inf.post;
362
+          }
363
+          break;
364
+        case 'plain':
365
+          if (isCheck) {
366
+            this.log(name + ' should not be a checkbox', 1);
367
+            var slash = val ? '' : '//';
368
+            newline = (inf.pre + slash + inf.define + val + inf.post);
369
+          }
370
+          else {
371
+            newline = inf.pre + inf.define + val + inf.post;
372
+          }
373
+          break;
318
       }
374
       }
319
-      // Now set the text in the field
320
-      $config.text(txt);
375
+
376
+      txt = txt.replace(inf.line, newline);
377
+      inf.line = newline;
378
+      this.log(newline, 2);
379
+
380
+      $c.text(txt);
321
     },
381
     },
322
 
382
 
323
     setFieldFromDefine: function(name, adv) {
383
     setFieldFromDefine: function(name, adv) {
325
       var isCheck = $elm.attr('type') == 'checkbox';
385
       var isCheck = $elm.attr('type') == 'checkbox';
326
       var val = this.defineValue(name, adv);
386
       var val = this.defineValue(name, adv);
327
 
387
 
388
+      this.log('setFieldFromDefine:' + name + ' to ' + val, 4);
389
+
328
       isCheck ? $elm.prop('checked', val) : $elm.val("" + val);
390
       isCheck ? $elm.prop('checked', val) : $elm.val("" + val);
329
 
391
 
330
       // If the item has a checkbox then set enabled state too
392
       // If the item has a checkbox then set enabled state too
336
       }
398
       }
337
     },
399
     },
338
 
400
 
339
-    defineValue: function(name, adv) {
401
+    getDefineInfo: function(name, adv) {
402
+      this.log('getDefineInfo:'+name,4);
340
       var $elm = $('#'+name), elm = $elm[0];
403
       var $elm = $('#'+name), elm = $elm[0];
341
       var $c = adv ? $config_adv : $config;
404
       var $c = adv ? $config_adv : $config;
342
-      if ($elm.attr('type') == 'checkbox') {
343
-        // maybe spaces, maybe comment, #define, spaces, name, maybe a comment
344
-        var findDef = new RegExp('^[ \\t]*(//[ \\t]*)?(#define[ \\t]+' + elm.id + '([ \\t]*(//)?.*)?)$', 'm');
345
-        var result = findDef.exec($c.text());
346
-        return (result ? result[1] == undefined || result[1].trim() != '//' : false);
405
+
406
+      // a switch line with no value
407
+      var findDef = new RegExp('^(.*//)?(.*#define[ \\t]+' + elm.id + ')([ \\t]*/[*/].*)?$', 'm');
408
+      var result = findDef.exec($c.text());
409
+      if (result !== null) {
410
+        var info = {
411
+          type: 'switch',
412
+          line: result[0], // whole line
413
+          pre: result[1] === undefined ? '' : result[1].replace('//',''),
414
+          define: result[2],
415
+          post: result[3] === undefined ? '' : result[3]
416
+        };
417
+        info.regex = new RegExp('(.*//)?(.*' + info.define.regEsc() + info.post.regEsc() + ')', 'm');
418
+        info.repl = info.regex;
419
+        this.log(info,2);
420
+        return info;
347
       }
421
       }
348
-      else {
349
-        // maybe spaces, maybe comment, #define, spaces, name, one or more spaces, value, maybe a comment
350
-        var findDef = new RegExp('^([ \\t]*(//[ \\t]*)?#define[ \\t]+' + elm.id + '[ \\t]+)(.*)([ \\t]*(//)?.*)$', 'm');
351
-        var result = findDef.exec($c.text());
352
-        if (result !== null) {
353
-          var val = result[3];
354
-          if (val.search(/^".*"$/) >= 0) $elm.addClass('quote');
355
-          if ($elm.hasClass('quote')) val = val.replace(/^"(.*)"$/, '$1');
356
-          return val;
357
-        }
358
-        return 'fail';
422
+
423
+      // a define with quotes
424
+      findDef = new RegExp('^(.*//)?(.*#define[ \\t]+' + elm.id + '[ \\t]+)("[^"]*")([ \\t]*/[*/].*)?$', 'm');
425
+      result = findDef.exec($c.text());
426
+      if (result !== null) {
427
+        var info = {
428
+          type: 'quoted',
429
+          line: result[0],
430
+          pre: result[1] === undefined ? '' : result[1].replace('//',''),
431
+          define: result[2],
432
+          post: result[4] === undefined ? '' : result[4]
433
+        };
434
+        info.regex = new RegExp('(.*//)?.*' + info.define.regEsc() + '"([^"]*)"' + info.post.regEsc(), 'm');
435
+        info.repl  = new RegExp('((.*//)?.*' + info.define.regEsc() + '")[^"]*("' + info.post.regEsc() + ')', 'm');
436
+        this.log(info,2);
437
+        return info;
438
+      }
439
+
440
+      // a define with no quotes
441
+      findDef = new RegExp('^(.*//)?(.*#define[ \\t]+' + elm.id + '[ \\t]+)(\\S*)([ \\t]*/[*/].*)?$', 'm');
442
+      result = findDef.exec($c.text());
443
+      if (result !== null) {
444
+        var info = {
445
+          type: 'plain',
446
+          line: result[0],
447
+          pre: result[1] === undefined ? '' : result[1].replace('//',''),
448
+          define: result[2],
449
+          post: result[4] === undefined ? '' : result[4]
450
+        };
451
+        info.regex = new RegExp('(.*//)?.*' + info.define.regEsc() + '(\\S*)' + info.post.regEsc(), 'm');
452
+        info.repl = new RegExp('((.*//)?.*' + info.define.regEsc() + ')\\S*(' + info.post.regEsc() + ')', 'm');
453
+        this.log(info,2);
454
+        return info;
359
       }
455
       }
456
+
457
+      return null;
360
     },
458
     },
361
 
459
 
362
-    defineIsEnabled: function(name, adv) {
363
-      var $elm = $('#'+name);
460
+    defineValue: function(name, adv) {
461
+      this.log('defineValue:'+name,4);
462
+      var $elm = $('#'+name), elm = $elm[0];
364
       var $c = adv ? $config_adv : $config;
463
       var $c = adv ? $config_adv : $config;
365
-      var findDef = new RegExp('^[ \\t]*(//[ \\t]*)?(#define[ \\t]+' + name + '([ \\t]*(//)?.*)?)$', 'm');
366
-      var result = findDef.exec($c.text());
367
-      return (result ? result[1].trim() != '//' : false);
464
+      var inf = elm.configInfo;
465
+
466
+      var result = inf.regex.exec($c.text());
467
+      this.log(result,2);
468
+      switch(inf.type) {
469
+        case 'switch': return result[1] != '//';
470
+        case 'quoted': return result[2];
471
+        case 'plain':  return result[2];
472
+      }
473
+    },
474
+
475
+    log: function(o,l) {
476
+      if (l === undefined) l = 0;
477
+      if (this.logging>=l*1) console.log(o);
368
     },
478
     },
369
 
479
 
370
     logOnce: function(o) {
480
     logOnce: function(o) {
371
       if (typeof o.didLogThisObject === 'undefined') {
481
       if (typeof o.didLogThisObject === 'undefined') {
372
-        console.log(o);
482
+        this.log(o);
373
         o.didLogThisObject = true;
483
         o.didLogThisObject = true;
374
       }
484
       }
375
     },
485
     },

Loading…
Откажи
Сачувај