浏览代码

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,6 +48,15 @@
48 48
         <label class="newline">Temp Sensor 2:</label><select name="TEMP_SENSOR_2"></select>
49 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 60
         <h2>Marlin/Configuration.h</h2>
52 61
         <pre id="config_text" class="prettyprint linenums"></pre>
53 62
         <h2>Marlin/Configuration_adv.h</h2>

+ 165
- 55
Marlin/configurator/js/configurator.js 查看文件

@@ -34,6 +34,10 @@ String.prototype.zeroPad = function(len) {
34 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 42
  * selectField.addOptions takes an array or keyed object
39 43
  */
@@ -66,6 +70,7 @@ var configuratorApp = (function(){
66 70
   // Return this anonymous object as configuratorApp
67 71
   return {
68 72
     my_public_var: 4,
73
+    logging: 1,
69 74
 
70 75
     init: function() {
71 76
       self = this; // a 'this' for use when 'this' is something else
@@ -74,7 +79,7 @@ var configuratorApp = (function(){
74 79
       var $uploader = $('#file-upload');
75 80
       var fileUploader = new BinaryFileUploader({
76 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 85
       if (!fileUploader.hasFileUploaderSupport()) alert('Your browser doesn\'t support the file reading API');
@@ -107,6 +112,7 @@ var configuratorApp = (function(){
107 112
         success: function(txt) {
108 113
           // File contents into the textarea
109 114
           $config.text(txt);
115
+          // Get thermistor info too
110 116
           self.initThermistorsFromText(txt);
111 117
         },
112 118
         error: errFunc
@@ -130,7 +136,7 @@ var configuratorApp = (function(){
130 136
 
131 137
     initBoardsFromText: function(txt) {
132 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 140
       while((r = findDef.exec(txt)) !== null) {
135 141
         boards_list[r[1]] = r[2].prePad(3, '  ') + " — " + r[4].replace(/\).*/, ')');
136 142
       }
@@ -165,7 +171,7 @@ var configuratorApp = (function(){
165 171
           this.initField('MOTHERBOARD');
166 172
           break;
167 173
         default:
168
-          console.log("Can't parse "+filename);
174
+          this.log("Can't parse "+filename, 1);
169 175
           break;
170 176
       }
171 177
     },
@@ -247,6 +253,10 @@ var configuratorApp = (function(){
247 253
       this.initField('TEMP_SENSOR_2');
248 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 261
       $('#serial_stepper').jstepper({
252 262
         min: 0,
@@ -266,58 +276,108 @@ var configuratorApp = (function(){
266 276
       // prettyPrint();
267 277
     },
268 278
 
279
+    /**
280
+     * initField - make a field responsive and get info
281
+     * about its configuration file define
282
+     */
269 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 289
       this.setFieldFromDefine(name);
272
-      isText ? $elm.bind('input', this.handleChange) : $elm.change(this.handleChange)
273 290
     },
274 291
 
275 292
     handleChange: function(e) {
276
-      self.updateDefineForField(e.target);
293
+      self.updateDefineForField(e.target.id);
277 294
     },
278 295
 
279 296
     handleSwitch: function(e) {
280 297
       var $elm = $(e.target), $prev = $elm.prev();
281 298
       var on = $elm.prop('checked') || false;
282 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 383
     setFieldFromDefine: function(name, adv) {
@@ -325,6 +385,8 @@ var configuratorApp = (function(){
325 385
       var isCheck = $elm.attr('type') == 'checkbox';
326 386
       var val = this.defineValue(name, adv);
327 387
 
388
+      this.log('setFieldFromDefine:' + name + ' to ' + val, 4);
389
+
328 390
       isCheck ? $elm.prop('checked', val) : $elm.val("" + val);
329 391
 
330 392
       // If the item has a checkbox then set enabled state too
@@ -336,40 +398,88 @@ var configuratorApp = (function(){
336 398
       }
337 399
     },
338 400
 
339
-    defineValue: function(name, adv) {
401
+    getDefineInfo: function(name, adv) {
402
+      this.log('getDefineInfo:'+name,4);
340 403
       var $elm = $('#'+name), elm = $elm[0];
341 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 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 480
     logOnce: function(o) {
371 481
       if (typeof o.didLogThisObject === 'undefined') {
372
-        console.log(o);
482
+        this.log(o);
373 483
         o.didLogThisObject = true;
374 484
       }
375 485
     },

正在加载...
取消
保存