Skip to content

Instantly share code, notes, and snippets.

@tgb20
Created June 2, 2022 16:51
Show Gist options
  • Select an option

  • Save tgb20/cc9e4c145f64bbb09836c2b6fc7f7b3d to your computer and use it in GitHub Desktop.

Select an option

Save tgb20/cc9e4c145f64bbb09836c2b6fc7f7b3d to your computer and use it in GitHub Desktop.

Revisions

  1. tgb20 created this gist Jun 2, 2022.
    224 changes: 224 additions & 0 deletions wedo.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,224 @@

    const iconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9Ii0yODUgMjMzIDQwIDQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC0yODUgMjMzIDQwIDQwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojRTZFN0U4O3N0cm9rZTojN0M4N0E1O3N0cm9rZS13aWR0aDowLjg2MztzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOiNFNkU3RTg7c3Ryb2tlOiM3Qzg3QTU7c3Ryb2tlLXdpZHRoOjAuODYzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9DQoJLnN0MntmaWxsOm5vbmU7c3Ryb2tlOiM3Qzg3QTU7c3Ryb2tlLXdpZHRoOjAuODYzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9DQo8L3N0eWxlPg0KPGc+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTS0yNzAuNCwyNDcuMWgtMS4zYy0wLjQsMC0wLjctMC4zLTAuNy0wLjd2LTAuN2MwLTAuMiwwLjItMC40LDAuNC0wLjRoMS45YzAuMiwwLDAuNCwwLjIsMC40LDAuNHYwLjcNCgkJQy0yNjkuNywyNDYuOC0yNzAsMjQ3LjEtMjcwLjQsMjQ3LjF6Ii8+DQoJPGVsbGlwc2UgY2xhc3M9InN0MCIgY3g9Ii0yNzEiIGN5PSIyNDUuNSIgcng9IjEuMyIgcnk9IjAuMyIvPg0KPC9nPg0KPGc+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTS0yNjUuNywyNDcuMWgtMS4zYy0wLjQsMC0wLjctMC4zLTAuNy0wLjd2LTAuN2MwLTAuMiwwLjItMC40LDAuNC0wLjRoMS45YzAuMiwwLDAuNCwwLjIsMC40LDAuNHYwLjcNCgkJQy0yNjUsMjQ2LjgtMjY1LjMsMjQ3LjEtMjY1LjcsMjQ3LjF6Ii8+DQoJPGVsbGlwc2UgY2xhc3M9InN0MCIgY3g9Ii0yNjYuMyIgY3k9IjI0NS41IiByeD0iMS4zIiByeT0iMC4zIi8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTI1OS4xLDI1Mi43aC0xLjNjLTAuNCwwLTAuNy0wLjMtMC43LTAuN3YtMC43YzAtMC4yLDAuMi0wLjQsMC40LTAuNGgxLjljMC4yLDAsMC40LDAuMiwwLjQsMC40djAuNw0KCQlDLTI1OC40LDI1Mi40LTI1OC43LDI1Mi43LTI1OS4xLDI1Mi43eiIvPg0KCTxlbGxpcHNlIGNsYXNzPSJzdDAiIGN4PSItMjU5LjciIGN5PSIyNTEuMiIgcng9IjEuMyIgcnk9IjAuMyIvPg0KPC9nPg0KPGc+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTS0yNTQuOSwyNTIuN2gtMS4zYy0wLjQsMC0wLjctMC4zLTAuNy0wLjd2LTAuN2MwLTAuMiwwLjItMC40LDAuNC0wLjRoMS45YzAuMiwwLDAuNCwwLjIsMC40LDAuNHYwLjcNCgkJQy0yNTQuMiwyNTIuNC0yNTQuNSwyNTIuNy0yNTQuOSwyNTIuN3oiLz4NCgk8ZWxsaXBzZSBjbGFzcz0ic3QwIiBjeD0iLTI1NS41IiBjeT0iMjUxLjIiIHJ4PSIxLjMiIHJ5PSIwLjMiLz4NCjwvZz4NCjxnPg0KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0tMjUyLjYsMjUxLjIiLz4NCgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNLTI1My41LDI2MC42aC0yNGMtMC41LDAtMC45LTAuNC0wLjktMC45VjI1MmMwLTIuOSwyLjQtNS4zLDUuMy01LjNoOC44YzAuOCwwLDEuNSwwLjcsMS41LDEuNWwwLDIuNQ0KCQljMCwwLjgsMC43LDEuNSwxLjUsMS41aDguMWMwLjMsMCwwLjUsMC4yLDAuNSwwLjV2Ni45Qy0yNTIuNiwyNjAuMi0yNTMsMjYwLjYtMjUzLjUsMjYwLjZ6Ii8+DQoJPHBhdGggY2xhc3M9InN0MSIgZD0iTS0yNTAsMjUxLjIiLz4NCgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNLTI1MS43LDI1MS4yIi8+DQo8L2c+DQo8cG9seWxpbmUgY2xhc3M9InN0MiIgcG9pbnRzPSItMjc4LjIsMjUzLjcgLTI3Mi43LDI1My43IC0yNjcuNywyNTguMSAtMjUyLjcsMjU4LjEgIi8+DQo8L3N2Zz4NCg==';

    class Wedo1 {

    getInfo(){
    return {
    "id": "wedo1",
    "name": "WeDo 1.0",
    "blockIconURI": iconURI,
    "blocks": [
    {
    "opcode": "turnOnTime",
    "blockType": "command",
    "text": "turn [powered] on for [num] secs",
    "arguments": {
    "powered": {
    "type": "ArgumentType.STRING",
    "menu": "POWERED",
    "defaultValue": "motor"
    },
    "num": {
    "type": "number",
    "defaultValue": "1"
    }
    }
    },
    {
    "opcode": "turnOn",
    "blockType": "command",
    "text": "turn [powered] on",
    "arguments": {
    "powered": {
    "type": "ArgumentType.STRING",
    "menu": "POWERED",
    "defaultValue": "motor"
    }
    }
    },
    {
    "opcode": "turnOff",
    "blockType": "command",
    "text": "turn [powered] off",
    "arguments": {
    "powered": {
    "type": "ArgumentType.STRING",
    "menu": "POWERED",
    "defaultValue": "motor"
    }
    }
    },
    {
    "opcode": "setPower",
    "blockType": "command",
    "text": "set [powered] power to [num]",
    "arguments": {
    "powered": {
    "type": "ArgumentType.STRING",
    "menu": "POWERED",
    "defaultValue": "motor"
    },
    "num": {
    "type": "number",
    "defaultValue": "100"
    }
    }
    },
    {
    "opcode": "setDirection",
    "blockType": "command",
    "text": "set [powered] direction to [direction]",
    "arguments": {
    "powered": {
    "type": "ArgumentType.STRING",
    "menu": "POWERED",
    "defaultValue": "motor"
    },
    "direction": {
    "type": "ArgumentType.STRING",
    "menu": "DIRECTION",
    "defaultValue": "this way"
    }
    }
    },
    {
    "opcode": "whenDistance",
    "blockType": "hat",
    "text": "when distance [op] [num]",
    "arguments": {
    "op": {
    "type": "ArgumentType.STRING",
    "menu": "OP",
    "defaultValue": "<"
    },
    "num": {
    "type": "number",
    "defaultValue": "20"
    }
    }
    },
    {
    "opcode": "whenTilt",
    "blockType": "hat",
    "text": "when tilted [tilt]",
    "arguments": {
    "tilt": {
    "type": "ArgumentType.STRING",
    "menu": "TILT",
    "defaultValue": "any"
    }
    }
    },
    {
    "opcode": "getDistance",
    "blockType": "reporter",
    "text": "distance",
    "arguments": {
    }
    },
    {
    "opcode": "getTilt",
    "blockType": "Boolean",
    "text": "tilted [tilt]?",
    "arguments": {
    "tilt": {
    "type": "ArgumentType.STRING",
    "menu": "TILT",
    "defaultValue": "any"
    }
    }
    }
    ],
    "menus": {
    OP: ['<', '>'],
    TILT: ['up', 'down', 'left', 'right', 'any'],
    POWERED: ['motor', 'motor A', 'motor B'],
    DIRECTION: ['this way', 'that way', 'reverse']
    }
    }
    }

    async getDistance({}) {
    return await this.fetchDistance()
    }

    fetchDistance(){
    return new Promise((resolve, reject) => {
    const socket = new WebSocket('ws://localhost:8080/');

    socket.addEventListener('open', function (event) {
    socket.send(JSON.stringify({type: "sensor", sensor: "distance"}));
    });

    socket.addEventListener('message', function (event) {
    var j = JSON.parse(event.data)
    socket.close();
    var fixedValue = Math.floor(j.value * 100 / 46)
    resolve(fixedValue)
    });
    })
    }

    async getTilt({tilt}){
    return await this.fetchTilt(tilt);
    }

    fetchTilt(tilt){
    return new Promise((resolve, reject) => {
    resolve(true)
    })
    }

    whenDistance({op, num}){
    return false;
    }

    whenTilt({tilt}){
    return "up";
    }

    turnOnTime({powered, num}){
    this.turnOn({powered})
    setTimeout(() => {
    this.turnOff({powered})
    }, num * 1000)
    }

    turnOn({powered}){
    const socket = new WebSocket('ws://localhost:8080/');

    socket.addEventListener('open', function (event) {
    socket.send(JSON.stringify({type: "motor", change: "status", motor: powered, status: "on"}));
    socket.close()
    });
    }

    turnOff({powered}){
    const socket = new WebSocket('ws://localhost:8080/');

    socket.addEventListener('open', function (event) {
    socket.send(JSON.stringify({type: "motor", change: "status", motor: powered, status: "off"}));
    socket.close()
    });
    }

    setPower({powered, num}){
    const socket = new WebSocket('ws://localhost:8080/');

    socket.addEventListener('open', function (event) {
    socket.send(JSON.stringify({type: "motor", change: "power", motor: powered, power: num}));
    socket.close()
    });
    }

    setDirection({powered, direction}){
    const socket = new WebSocket('ws://localhost:8080/');

    socket.addEventListener('open', function (event) {
    socket.send(JSON.stringify({type: "motor", change: "direction", motor: powered, direction: direction}));
    socket.close()
    });
    }
    }
    Scratch.extensions.register(new Wedo1());