2
2
3
3
import svgText from "../microbit-drawing.svg" ;
4
4
import { AudioUI } from "./audio" ;
5
- import { MICROBIT_HAL_PIN_FACE } from "./constants" ;
5
+ import {
6
+ MICROBIT_HAL_PIN_FACE ,
7
+ MICROBIT_HAL_PIN_P0 ,
8
+ MICROBIT_HAL_PIN_P1 ,
9
+ MICROBIT_HAL_PIN_P2 ,
10
+ } from "./constants" ;
6
11
import {
7
12
convertAccelerometerStringToNumber ,
8
13
convertSoundEventStringToNumber ,
@@ -74,8 +79,12 @@ export class BoardUI {
74
79
this . pins = Array ( 33 ) ;
75
80
this . pins [ MICROBIT_HAL_PIN_FACE ] = new PinUI (
76
81
this . svg . querySelector ( "#Logo" ) ! ,
77
- "pin_logo"
82
+ "pinLogo" ,
83
+ onSensorChange
78
84
) ;
85
+ this . pins [ MICROBIT_HAL_PIN_P0 ] = new PinUI ( null , "pin0" , onSensorChange ) ;
86
+ this . pins [ MICROBIT_HAL_PIN_P1 ] = new PinUI ( null , "pin1" , onSensorChange ) ;
87
+ this . pins [ MICROBIT_HAL_PIN_P2 ] = new PinUI ( null , "pin2" , onSensorChange ) ;
79
88
this . audio = new AudioUI ( ) ;
80
89
this . temperature = new RangeSensor ( "temperature" , - 5 , 50 , 21 , "°C" ) ;
81
90
this . accelerometer = new AccelerometerUI ( onSensorChange ) ;
@@ -90,6 +99,10 @@ export class BoardUI {
90
99
this . microphone . soundLevel ,
91
100
this . buttons [ 0 ] . button ,
92
101
this . buttons [ 1 ] . button ,
102
+ this . pins [ MICROBIT_HAL_PIN_FACE ] . pin ,
103
+ this . pins [ MICROBIT_HAL_PIN_P0 ] . pin ,
104
+ this . pins [ MICROBIT_HAL_PIN_P1 ] . pin ,
105
+ this . pins [ MICROBIT_HAL_PIN_P2 ] . pin ,
93
106
...this . accelerometer . sensors ,
94
107
] ;
95
108
this . sensorsById = new Map ( ) ;
@@ -288,6 +301,7 @@ export class ButtonUI {
288
301
public button : RangeSensor ;
289
302
private _presses : number = 0 ;
290
303
private _mouseDown : boolean = false ;
304
+ private _internalChange : boolean = false ;
291
305
private keyListener : ( e : KeyboardEvent ) => void ;
292
306
private mouseDownListener : ( e : MouseEvent ) => void ;
293
307
private mouseUpListener : ( e : MouseEvent ) => void ;
@@ -301,7 +315,10 @@ export class ButtonUI {
301
315
this . _presses = 0 ;
302
316
this . button = new RangeSensor ( label , 0 , 1 , 0 , undefined ) ;
303
317
this . button . onchange = ( _ , curr : number ) : void => {
304
- this . onSensorChange ( ) ;
318
+ if ( this . _internalChange == true ) {
319
+ this . onSensorChange ( ) ;
320
+ this . _internalChange = false ;
321
+ }
305
322
if ( curr ) {
306
323
this . _presses ++ ;
307
324
}
@@ -319,8 +336,10 @@ export class ButtonUI {
319
336
case " " :
320
337
e . preventDefault ( ) ;
321
338
if ( e . type === "keydown" ) {
339
+ this . _internalChange = true ;
322
340
this . press ( ) ;
323
341
} else {
342
+ this . _internalChange = true ;
324
343
this . release ( ) ;
325
344
}
326
345
}
@@ -329,15 +348,21 @@ export class ButtonUI {
329
348
this . mouseDownListener = ( e ) => {
330
349
e . preventDefault ( ) ;
331
350
this . _mouseDown = true ;
351
+ this . _internalChange = true ;
332
352
this . press ( ) ;
333
353
} ;
334
354
this . mouseUpListener = ( e ) => {
335
355
e . preventDefault ( ) ;
336
- this . _mouseDown = false ;
337
- this . release ( ) ;
356
+ if ( this . _mouseDown ) {
357
+ this . _mouseDown = false ;
358
+ this . _internalChange = true ;
359
+ this . release ( ) ;
360
+ }
338
361
} ;
339
362
this . mouseLeaveListener = ( e ) => {
340
363
if ( this . _mouseDown ) {
364
+ this . _mouseDown = false ;
365
+ this . _internalChange = true ;
341
366
this . release ( ) ;
342
367
}
343
368
} ;
@@ -495,73 +520,104 @@ export class MicrophoneUI {
495
520
}
496
521
497
522
export class PinUI {
498
- private _isTouched : boolean ;
523
+ public pin : RangeSensor ;
524
+ private _mouseDown : boolean = false ;
525
+ private _internalChange : boolean = false ;
499
526
private keyListener : ( e : KeyboardEvent ) => void ;
500
527
private mouseDownListener : ( e : MouseEvent ) => void ;
501
528
private mouseUpListener : ( e : MouseEvent ) => void ;
502
529
private mouseLeaveListener : ( e : MouseEvent ) => void ;
503
530
504
- constructor ( private element : SVGElement , private label : string ) {
505
- this . label = label ;
506
- this . _isTouched = false ;
531
+ constructor (
532
+ private element : SVGElement | null ,
533
+ label : string ,
534
+ private onSensorChange : ( ) => void
535
+ ) {
536
+ this . pin = new RangeSensor ( label , 0 , 1 , 0 , undefined ) ;
537
+ this . pin . onchange = ( ) : void => {
538
+ if ( this . _internalChange == true ) {
539
+ this . onSensorChange ( ) ;
540
+ this . _internalChange = false ;
541
+ }
542
+ this . render ( ) ;
543
+ } ;
507
544
508
- this . element = element ;
509
- this . element . setAttribute ( "role" , "button" ) ;
510
- this . element . setAttribute ( "tabindex" , "0" ) ;
511
- this . element . ariaLabel = label ;
512
- this . element . style . cursor = "pointer" ;
545
+ if ( this . element ) {
546
+ this . element . setAttribute ( "role" , "button" ) ;
547
+ this . element . setAttribute ( "tabindex" , "0" ) ;
548
+ this . element . ariaLabel = label ;
549
+ this . element . style . cursor = "pointer" ;
550
+ }
513
551
514
552
this . keyListener = ( e ) => {
515
553
switch ( e . key ) {
516
554
case "Enter" :
517
555
case " " :
518
556
e . preventDefault ( ) ;
519
557
if ( e . type === "keydown" ) {
558
+ this . _internalChange = true ;
520
559
this . press ( ) ;
521
560
} else {
561
+ this . _internalChange = true ;
522
562
this . release ( ) ;
523
563
}
524
564
}
525
565
} ;
526
566
527
567
this . mouseDownListener = ( e ) => {
528
568
e . preventDefault ( ) ;
569
+ this . _mouseDown = true ;
570
+ this . _internalChange = true ;
529
571
this . press ( ) ;
530
572
} ;
531
573
this . mouseUpListener = ( e ) => {
532
574
e . preventDefault ( ) ;
533
- this . release ( ) ;
575
+ if ( this . _mouseDown ) {
576
+ this . _mouseDown = false ;
577
+ this . _internalChange = true ;
578
+ this . release ( ) ;
579
+ }
534
580
} ;
535
581
this . mouseLeaveListener = ( e ) => {
536
- this . release ( ) ;
582
+ if ( this . _mouseDown ) {
583
+ this . _mouseDown = false ;
584
+ this . _internalChange = true ;
585
+ this . release ( ) ;
586
+ }
537
587
} ;
538
588
539
- this . element . addEventListener ( "mousedown" , this . mouseDownListener ) ;
540
- this . element . addEventListener ( "mouseup" , this . mouseUpListener ) ;
541
- this . element . addEventListener ( "keydown" , this . keyListener ) ;
542
- this . element . addEventListener ( "keyup" , this . keyListener ) ;
543
- this . element . addEventListener ( "mouseleave" , this . mouseLeaveListener ) ;
589
+ if ( this . element ) {
590
+ this . element . addEventListener ( "mousedown" , this . mouseDownListener ) ;
591
+ this . element . addEventListener ( "mouseup" , this . mouseUpListener ) ;
592
+ this . element . addEventListener ( "keydown" , this . keyListener ) ;
593
+ this . element . addEventListener ( "keyup" , this . keyListener ) ;
594
+ this . element . addEventListener ( "mouseleave" , this . mouseLeaveListener ) ;
595
+ }
544
596
}
545
597
546
598
press ( ) {
547
- this . _isTouched = true ;
548
- this . render ( ) ;
599
+ this . pin . setValue (
600
+ this . pin . value === this . pin . min ? this . pin . max : this . pin . min
601
+ ) ;
549
602
}
550
603
551
604
release ( ) {
552
- this . _isTouched = false ;
553
- this . render ( ) ;
605
+ this . pin . setValue (
606
+ this . pin . value === this . pin . max ? this . pin . min : this . pin . max
607
+ ) ;
554
608
}
555
609
556
610
isTouched ( ) {
557
- return this . _isTouched ;
611
+ return ! ! this . pin . value ;
558
612
}
559
613
560
614
render ( ) {
561
- const fill = this . _isTouched ? "red" : "url(#an)" ;
562
- this . element . querySelectorAll ( "path" ) . forEach ( ( p ) => {
563
- p . style . fill = fill ;
564
- } ) ;
615
+ if ( this . element ) {
616
+ const fill = ! ! this . pin . value ? "red" : "url(#an)" ;
617
+ this . element . querySelectorAll ( "path" ) . forEach ( ( p ) => {
618
+ p . style . fill = fill ;
619
+ } ) ;
620
+ }
565
621
}
566
622
567
623
initialize ( ) { }
0 commit comments