event for ultrasonic module
This commit is contained in:
		@@ -38,6 +38,9 @@
 | 
			
		||||
  "input.TouchSensor.onEvent": "Do something when a touch sensor is touched...",
 | 
			
		||||
  "input.TouchSensor.onEvent|param|body": "code to run when the event is raised",
 | 
			
		||||
  "input.UltraSonicSensor.distance": "Gets the distance from the sonar in millimeters",
 | 
			
		||||
  "input.UltraSonicSensor.onObject": "Registers code to run when the given color is close",
 | 
			
		||||
  "input.UltraSonicSensor.onObject|param|distance": "the distance in centimeters when an object is close, eg: 10",
 | 
			
		||||
  "input.UltraSonicSensor.onObject|param|handler": "the code to run when detected",
 | 
			
		||||
  "input.buttonDown": "Down button on the EV3 Brick.",
 | 
			
		||||
  "input.buttonEnter": "Enter button on the EV3 Brick.",
 | 
			
		||||
  "input.buttonLeft": "Left button on the EV3 Brick.",
 | 
			
		||||
 
 | 
			
		||||
@@ -44,6 +44,7 @@
 | 
			
		||||
  "input.TouchSensor.isTouched|block": "%sensor|is touched",
 | 
			
		||||
  "input.TouchSensor.onEvent|block": "on %sensor|%event",
 | 
			
		||||
  "input.UltraSonicSensor.distance|block": "%sensor|distance",
 | 
			
		||||
  "input.UltraSonicSensor.onObject|block": "on %sensor|object within %distance|cm",
 | 
			
		||||
  "input.buttonDown|block": "brick button down",
 | 
			
		||||
  "input.buttonEnter|block": "brick button enter",
 | 
			
		||||
  "input.buttonLeft|block": "brick button left",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,55 @@
 | 
			
		||||
enum UltrasonicEvent {
 | 
			
		||||
    ObjectClose = 1,
 | 
			
		||||
    ObjectDetected = 2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace input {
 | 
			
		||||
 | 
			
		||||
    //% fixedInstances
 | 
			
		||||
    export class UltraSonicSensor extends internal.UartSensor {
 | 
			
		||||
        private threshold: number;
 | 
			
		||||
 | 
			
		||||
        constructor(port: number) {
 | 
			
		||||
            super(port)
 | 
			
		||||
            this.threshold = 10;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _deviceType() {
 | 
			
		||||
            return DAL.DEVICE_TYPE_ULTRASONIC
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _query(): number {
 | 
			
		||||
            const d = this.getNumber(NumberFormat.UInt16LE, 0) & 0x0fff;            
 | 
			
		||||
            return d < this.threshold ? UltrasonicEvent.ObjectClose
 | 
			
		||||
                : d > this.threshold + 5 ? UltrasonicEvent.ObjectDetected
 | 
			
		||||
                : 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _update(prev: number, curr: number) {
 | 
			
		||||
            if (curr) 
 | 
			
		||||
                control.raiseEvent(this._id, curr);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Registers code to run when the given color is close
 | 
			
		||||
         * @param distance the distance in centimeters when an object is close, eg: 10
 | 
			
		||||
         * @param handler the code to run when detected
 | 
			
		||||
         */
 | 
			
		||||
        //% help=input/ultrasonic/on-object
 | 
			
		||||
        //% block="on %sensor|object within %distance|cm"
 | 
			
		||||
        //% blockId=ultrasonicOnObjectClose
 | 
			
		||||
        //% parts="ultrasonicsensor"
 | 
			
		||||
        //% blockNamespace=input
 | 
			
		||||
        //% weight=100 blockGap=8
 | 
			
		||||
        //% group="Ultrasonic Sensor"
 | 
			
		||||
        onObject(distance: number, handler: () => void) {
 | 
			
		||||
            this.threshold = Math.max(1, Math.min(95, distance));
 | 
			
		||||
            control.onEvent(this._id, UltrasonicEvent.ObjectClose, handler);
 | 
			
		||||
            this._setMode(0)
 | 
			
		||||
            if (this._query() == UltrasonicEvent.ObjectClose)
 | 
			
		||||
                control.runInBackground(handler);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Gets the distance from the sonar in millimeters
 | 
			
		||||
         * @param sensor the ultrasonic sensor port
 | 
			
		||||
@@ -24,7 +64,7 @@ namespace input {
 | 
			
		||||
        distance() {
 | 
			
		||||
            // it supposedly also has an inch mode, but we stick to mm
 | 
			
		||||
            this._setMode(0)
 | 
			
		||||
            return this.getNumber(NumberFormat.UInt16LE, 0) & 0x0fff
 | 
			
		||||
            return this.getNumber(NumberFormat.UInt16LE, 0) & 0x0fff;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user