Winrt (#545)
* initial winrt work * Add new vid/pid * E2E working * Remove wrong hid selector
This commit is contained in:
		
				
					committed by
					
						
						Peli de Halleux
					
				
			
			
				
	
			
			
			
						parent
						
							e97496d39a
						
					
				
				
					commit
					4b45ecea87
				
			@@ -31,89 +31,87 @@ namespace pxt.editor {
 | 
			
		||||
 | 
			
		||||
    class DAPWrapper {
 | 
			
		||||
        cortexM: DapJS.CortexM
 | 
			
		||||
        packetIo: HF2.PacketIO;
 | 
			
		||||
 | 
			
		||||
        constructor(h: HF2.PacketIO) {
 | 
			
		||||
            let pbuf = new U.PromiseBuffer<Uint8Array>()
 | 
			
		||||
            this.packetIo = h;
 | 
			
		||||
            let pbuf = new U.PromiseBuffer<Uint8Array>();
 | 
			
		||||
 | 
			
		||||
            let sendMany = (cmds: Uint8Array[]) => {
 | 
			
		||||
                return h.talksAsync(cmds.map(c => ({ cmd: 0, data: c })))
 | 
			
		||||
                return h.talksAsync(cmds.map(c => ({ cmd: 0, data: c })));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!h.talksAsync)
 | 
			
		||||
                sendMany = null
 | 
			
		||||
                sendMany = null;
 | 
			
		||||
 | 
			
		||||
            let dev = new DapJS.DAP({
 | 
			
		||||
                write: writeAsync,
 | 
			
		||||
                close: closeAsync,
 | 
			
		||||
                close: this.disconnectAsync,
 | 
			
		||||
                read: readAsync,
 | 
			
		||||
                sendMany: sendMany
 | 
			
		||||
            })
 | 
			
		||||
            this.cortexM = new DapJS.CortexM(dev)
 | 
			
		||||
            });
 | 
			
		||||
            this.cortexM = new DapJS.CortexM(dev);
 | 
			
		||||
 | 
			
		||||
            h.onData = buf => {
 | 
			
		||||
                pbuf.push(buf)
 | 
			
		||||
                pbuf.push(buf);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function writeAsync(data: ArrayBuffer) {
 | 
			
		||||
                h.sendPacketAsync(new Uint8Array(data))
 | 
			
		||||
                return Promise.resolve()
 | 
			
		||||
                h.sendPacketAsync(new Uint8Array(data));
 | 
			
		||||
                return Promise.resolve();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function readAsync() {
 | 
			
		||||
                return pbuf.shiftAsync()
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function closeAsync() {
 | 
			
		||||
                return h.disconnectAsync()
 | 
			
		||||
                return pbuf.shiftAsync();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        reconnectAsync(first: boolean) {
 | 
			
		||||
            return this.cortexM.init()
 | 
			
		||||
            return this.cortexM.init();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        disconnectAsync() {
 | 
			
		||||
            return this.packetIo.disconnectAsync();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let previousDapWrapper: DAPWrapper;
 | 
			
		||||
    function dapAsync() {
 | 
			
		||||
        return pxt.HF2.mkPacketIOAsync()
 | 
			
		||||
        return Promise.resolve()
 | 
			
		||||
            .then(() => {
 | 
			
		||||
                if (previousDapWrapper) {
 | 
			
		||||
                    return previousDapWrapper.disconnectAsync()
 | 
			
		||||
                        .finally(() => {
 | 
			
		||||
                            previousDapWrapper = null;
 | 
			
		||||
                        });
 | 
			
		||||
                }
 | 
			
		||||
                return Promise.resolve();
 | 
			
		||||
            })
 | 
			
		||||
            .then(() => pxt.HF2.mkPacketIOAsync())
 | 
			
		||||
            .then(h => {
 | 
			
		||||
                let w = new DAPWrapper(h)
 | 
			
		||||
                previousDapWrapper = w;
 | 
			
		||||
                return w.reconnectAsync(true)
 | 
			
		||||
                    .then(() => w)
 | 
			
		||||
            })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let noHID = false
 | 
			
		||||
 | 
			
		||||
    let initPromise: Promise<DAPWrapper>
 | 
			
		||||
    function initAsync() {
 | 
			
		||||
        if (initPromise)
 | 
			
		||||
            return initPromise
 | 
			
		||||
 | 
			
		||||
        let canHID = false
 | 
			
		||||
        if (U.isNodeJS) {
 | 
			
		||||
            canHID = true
 | 
			
		||||
        } else {
 | 
			
		||||
            const forceHexDownload = /forceHexDownload/i.test(window.location.href);
 | 
			
		||||
            if (Cloud.isLocalHost() && Cloud.localToken && !forceHexDownload)
 | 
			
		||||
            const isUwp = !!(window as any).Windows;
 | 
			
		||||
            if (Cloud.isLocalHost() && Cloud.localToken && !forceHexDownload || isUwp)
 | 
			
		||||
                canHID = true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (noHID)
 | 
			
		||||
            canHID = false
 | 
			
		||||
 | 
			
		||||
        if (canHID) {
 | 
			
		||||
            initPromise = dapAsync()
 | 
			
		||||
                .catch(err => {
 | 
			
		||||
                    initPromise = null
 | 
			
		||||
                    noHID = true
 | 
			
		||||
                    return Promise.reject(err)
 | 
			
		||||
                })
 | 
			
		||||
            return dapAsync();
 | 
			
		||||
        } else {
 | 
			
		||||
            noHID = true
 | 
			
		||||
            initPromise = Promise.reject(new Error("no HID"))
 | 
			
		||||
            return Promise.reject(new Error("no HID"))
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return initPromise
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function pageAlignBlocks(blocks: UF2.Block[], pageSize: number) {
 | 
			
		||||
@@ -234,13 +232,8 @@ namespace pxt.editor {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        startTime = 0
 | 
			
		||||
 | 
			
		||||
        if (noHID) return saveHexAsync()
 | 
			
		||||
 | 
			
		||||
        let wrap: DAPWrapper
 | 
			
		||||
 | 
			
		||||
        log("init")
 | 
			
		||||
 | 
			
		||||
        let logV = (msg: string) => { }
 | 
			
		||||
        //let logV = log
 | 
			
		||||
 | 
			
		||||
@@ -339,11 +332,7 @@ namespace pxt.editor {
 | 
			
		||||
                    })
 | 
			
		||||
            })
 | 
			
		||||
            .catch(e => {
 | 
			
		||||
                // if we failed to initalize, retry
 | 
			
		||||
                if (noHID)
 | 
			
		||||
                    return saveHexAsync()
 | 
			
		||||
                else
 | 
			
		||||
                    return Promise.reject(e)
 | 
			
		||||
                return saveHexAsync();
 | 
			
		||||
            })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -371,16 +360,16 @@ namespace pxt.editor {
 | 
			
		||||
                    }, name: data.meta.name
 | 
			
		||||
                })
 | 
			
		||||
            }, {
 | 
			
		||||
                    id: "td",
 | 
			
		||||
                    canImport: data => data.meta.cloudId == "microbit.co.uk" && data.meta.editor == "touchdevelop",
 | 
			
		||||
                    importAsync: (project, data) =>
 | 
			
		||||
                        project.createProjectAsync({
 | 
			
		||||
                            filesOverride: { "main.blocks": "", "main.ts": "  " },
 | 
			
		||||
                            name: data.meta.name
 | 
			
		||||
                        })
 | 
			
		||||
                            .then(() => project.convertTouchDevelopToTypeScriptAsync(data.source))
 | 
			
		||||
                            .then(text => project.overrideTypescriptFile(text))
 | 
			
		||||
                }]
 | 
			
		||||
                id: "td",
 | 
			
		||||
                canImport: data => data.meta.cloudId == "microbit.co.uk" && data.meta.editor == "touchdevelop",
 | 
			
		||||
                importAsync: (project, data) =>
 | 
			
		||||
                    project.createProjectAsync({
 | 
			
		||||
                        filesOverride: { "main.blocks": "", "main.ts": "  " },
 | 
			
		||||
                        name: data.meta.name
 | 
			
		||||
                    })
 | 
			
		||||
                        .then(() => project.convertTouchDevelopToTypeScriptAsync(data.source))
 | 
			
		||||
                        .then(text => project.overrideTypescriptFile(text))
 | 
			
		||||
            }]
 | 
			
		||||
        };
 | 
			
		||||
        pxt.commands.deployCoreAsync = deployCoreAsync;
 | 
			
		||||
        return Promise.resolve<pxt.editor.ExtensionResult>(res);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user