Add motor reporter control
This commit is contained in:
		@@ -212,9 +212,9 @@ namespace pxsim.visuals {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                case NodeType.MediumMotor:
 | 
					                case NodeType.MediumMotor:
 | 
				
			||||||
                case NodeType.LargeMotor: {
 | 
					                case NodeType.LargeMotor: {
 | 
				
			||||||
                    // const state = ev3board().getMotor(port)[0];
 | 
					                    const state = ev3board().getMotors()[port];
 | 
				
			||||||
                    // view = new MotorInputControl(this.element, this.defs, state, port);
 | 
					                    view = new MotorReporterControl(this.element, this.defs, state, port);
 | 
				
			||||||
                    // break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,8 +7,6 @@ namespace pxsim.visuals {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        getInnerView() {
 | 
					        getInnerView() {
 | 
				
			||||||
            this.group = svg.elt("g") as SVGGElement;
 | 
					            this.group = svg.elt("g") as SVGGElement;
 | 
				
			||||||
            const innerHeight = 13;
 | 
					 | 
				
			||||||
            const innerWidth = 11;
 | 
					 | 
				
			||||||
            this.group.setAttribute("transform", `translate(1.02, 1.5) scale(0.8)`)
 | 
					            this.group.setAttribute("transform", `translate(1.02, 1.5) scale(0.8)`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const colorIds = ['red', 'yellow', 'blue', 'green', undefined, 'grey'];
 | 
					            const colorIds = ['red', 'yellow', 'blue', 'green', undefined, 'grey'];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										51
									
								
								sim/visuals/controls/motorReporter.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								sim/visuals/controls/motorReporter.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace pxsim.visuals {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    export class MotorReporterControl extends ControlView<MotorNode> {
 | 
				
			||||||
 | 
					        private group: SVGGElement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private circleBar: SVGCircleElement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private reporter: SVGTextElement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        getInnerView() {
 | 
				
			||||||
 | 
					            this.group = svg.elt("g") as SVGGElement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const outerCircle = pxsim.svg.child(this.group, "circle", { 'stroke-dasharray': '565.48', 'stroke-dashoffset': '0', 'cx': 100, 'cy': 100, 'r': '90', 'style': `fill:transparent; transition: stroke-dashoffset 1s linear;`, 'stroke': '#a8aaa8', 'stroke-width': '1rem' }) as SVGCircleElement;
 | 
				
			||||||
 | 
					            this.circleBar = pxsim.svg.child(this.group, "circle", { 'stroke-dasharray': '565.48', 'stroke-dashoffset': '0', 'cx': 100, 'cy': 100, 'r': '90', 'style': `fill:transparent; transition: stroke-dashoffset 1s linear;`, 'stroke': '#f12a21', 'stroke-width': '1rem' }) as SVGCircleElement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            this.reporter = pxsim.svg.child(this.group, "text", { 'x': this.getWidth() / 2, 'y': this.getHeight() / 2, 'text-anchor': 'middle', 'style': 'font-size: 50px', 'class': 'sim-text inverted number' }) as SVGTextElement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return this.group;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        getInnerWidth() {
 | 
				
			||||||
 | 
					            return 200;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        getInnerHeight() {
 | 
				
			||||||
 | 
					            return 200;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        updateState() {
 | 
				
			||||||
 | 
					            if (!this.visible) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            const node = this.state;
 | 
				
			||||||
 | 
					            const speed = node.getSpeed();
 | 
				
			||||||
 | 
					            this.updateSpeed(speed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Update reporter
 | 
				
			||||||
 | 
					            this.reporter.textContent = `${speed}`;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private updateSpeed(speed: number) {
 | 
				
			||||||
 | 
					            let c = Math.PI * (90 * 2);
 | 
				
			||||||
 | 
					            if (speed < 0) speed = 100 - speed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let pct = ((100 - speed) / 100) * c;
 | 
				
			||||||
 | 
					            this.circleBar.setAttribute('stroke-dashoffset', `${pct}`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user