// for RPR220 pinMode(B3, 'input'); pinMode(B4, 'input'); // for button pinMode(B13, 'input_pulldown'); pinMode(B14, 'input_pulldown'); var Wid13; var Wid14; // for LCD var g; require('Font8x16').add(Graphics); var Detected3; var Detected4; // mesure var Length = 120.5; // mm var Mode; var Result; var Scale; var Pass; var DetectTime; var Rotation; var BothButton; var ModeString = { t: 'Test', w: 'Wait', '1': 'Wait', '2': 'Wait', p: 'Pass', S: 'Set', P: 'Set', }; var Scales = [ 220, 200, 160, 150, 120, 87, 80, 76, 48, 45, 32, 24, 22.5, ]; var Passes = [ 200, 500, 1000, ]; function start() { g.setFont8x16(); show(); } function flipDrawString(g, s, x, y) { var w = g.stringWidth(s); g.fillRect(x, y, x + w - 1, y + 15); g.setColor(0,0,0); g.drawString(s, x, y); g.setColor(1,1,1); } function show() { g.clear(); g.drawString(ModeString[Mode], 0, 12); if( Mode == 'w' ) { g.drawCircle(4,4,4); g.drawCircle(28,4,4); } else if( Mode == '1' ) { g.fillCircle(4,4,4); g.drawCircle(28,4,4); } else if( Mode == '2' ) { g.drawCircle(4,4,4); g.fillCircle(28,4,4); } else if( Mode == 'p' ) { g.fillCircle(4,4,4); g.fillCircle(28,4,4); } for( var j = 0; j < Result.length; j++ ) { var kmh = Result[j]; if( j === 0 ) { var uw = g.stringWidth('km/h'); g.setFontVector(28); g.drawString(kmh, 128 - uw - 2 - g.stringWidth(kmh), 0); g.setFont8x16(); g.drawString('km/h', 128 - uw, 14); } else { g.drawString(kmh + 'km/h', 128 - g.stringWidth(kmh + 'km/h'), 16 + j * 16); } } if( Mode == 'S' ) { flipDrawString(g, '1/' + Scale, 0, 32); } else { g.drawString('1/' + Scale, 0, 32); } if( Mode == 'P' ) { flipDrawString(g, Pass + 'm', 0, 48); } else { g.drawString(Pass + 'm', 0, 48); } g.flip(); } function calckmh(t1, t2) { var msec = (t2 - t1) * 1000; return Math.round(Length * Scale / msec * 3.6); } function setpasstime(t1, t2) { var msec = (t2 - t1) * 1000; setTimeout(function() { Mode = 'w'; setWait(); show(); }, msec * Pass / Scale * 1000 / Length); } function altshow() { g.clear(); g.drawString('Save settings ?', 0, 0); g.drawString('MOD: No', 0, 16); g.drawString('SEL: Yes', 0, 32); g.flip(); } function bothbutton() { Mode = 'a'; altshow(); } function dosave() { Mode = 'b'; g.clear(); g.drawString('Saving ...', 0, 0); g.flip(); save(); } function setTest() { setWatch(function(e){ //console.log('B3', e.state); LED1.write(e.state ? 0 : 1); }, B3, {repeat: true}); setWatch(function(e){ //console.log('B4', e.state); LED2.write(e.state ? 0 : 1); }, B4, {repeat: true}); } function detect3(e) { Detected3 = true; if( Mode == 'w' ) { Mode = '1'; DetectTime = e.time; show(); } else if( Mode == '2' ) { Mode = 'p'; var kmh = calckmh(DetectTime, e.time); Result.unshift(kmh); while( Result.length > 3 ) Result.pop(); setpasstime(DetectTime, e.time); show(); } } function detect4(e) { Detected4 = true; if( Mode == 'w' ) { Mode = '2'; DetectTime = e.time; show(); } else if( Mode == '1' ) { Mode = 'p'; var kmh = calckmh(DetectTime, e.time); Result.unshift(kmh); while( Result.length > 3 ) Result.pop(); setpasstime(DetectTime, e.time); show(); } } function setWait() { if( Detected3 ) { setWatch(detect3, B3, {repeat: false, edge: 'falling'}); } if( Detected4 ) { setWatch(detect4, B4, {repeat: false, edge: 'falling'}); } } function setButtons() { if( ! Wid13 ) { Wid13 = setWatch(function(e){ if( BothButton ) { BothButton = false; bothbutton(); return; } else if( digitalRead(B14) ) { BothButton = true; return; } if( Mode == 't' ) { Mode = 'w'; setWait(); show(); } else if( Mode == 'w' || Mode == '1' || Mode == '2' || Mode == 'p' ) { Mode = 'S'; show(); } else if( Mode == 'S' ) { Mode = 'P'; show(); } else if( Mode == 'P' ) { Mode = 't'; show(); } else if( Mode == 'a' ) { Mode = 't'; show(); } }, B13, {repeat: true, edge: 'falling', debounce: 100}); } if( ! Wid14 ) { Wid14 = setWatch(function(e){ if( BothButton ) { BothButton = false; bothbutton(); return; } else if( digitalRead(B13) ) { BothButton = true; return; } if( Mode == 't' || Mode == 'w' ) { Rotation = Rotation === 0 ? 2 : 0; g.setRotation(Rotation, false); show(); } else if( Mode == 'S' ) { var k = 0; for( var j = 0; j < Scales.length; j++ ) { if( Scale == Scales[j] ) { k = (j + 1) % Scales.length; break; } } Scale = Scales[k]; show(); } else if( Mode == 'P' ) { var k = 0; for( var j = 0; j < Passes.length; j++ ) { if( Pass == Passes[j] ) { k = (j + 1) % Passes.length; break; } } Pass = Passes[k]; show(); } else if( Mode == 'a' ) { dosave(); } }, B14, {repeat: true, edge: 'falling', debounce: 100}); } } function onInit(){ Mode = 't'; Result = []; Scale = Scale || 220; Pass = Pass || 200; // m Rotation = 0; BothButton = false; // for I2C LCD I2C1.setup({scl: B6, sda: B7}); g = require('SSD1306').connect(I2C1, start); setTest(); Detected3 = true; Detected4 = true; // Buttons setButtons(); }