aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/tools/uf2/patcher/web.js
blob: 180fb18aec5159bd8d7a4d7aebaa3cbfd3bfc43f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"use strict";

function savePatch(ev) {
    let text = document.getElementById("patch")
    localStorage["UF2_PATCH"] = text.value
}

function genRnd(ev) {
    ev.preventDefault()
    let vals = new Uint32Array(1)
    window.crypto.getRandomValues(vals)
    document.getElementById("rnd-res").textContent = "Random number: 0x" + 
        ("000000000" + vals[0].toString(16)).slice(-8)
}

function restorePatch() {
    let text = document.getElementById("patch")
    text.value = localStorage["UF2_PATCH"] || ""
    document.getElementById("apply").onclick = applyPatch
    document.getElementById("rnd").onclick = genRnd
}

function download(buf, name) {
    let blob = new Blob([buf], {
        type: "application/x-uf2"
    });
    let url = URL.createObjectURL(blob);

    let a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    a.href = url;
    a.download = name;
    a.click();
    window.URL.revokeObjectURL(url);
}

let currUF2 = null
let currUF2Name = ""

function showMSG() {
    if (infoMsg)
        document.getElementById("currconfig").textContent = infoMsg
}

function wrap(f) {
    try {
        infoMsg = ""
        f()
        showMSG()
    } catch (e) {
        log("Exception: " + e.message)
        showMSG()
    }
}

function defines() {
    download(configkeysH(), "configkeys.h")
}

function applyPatch() {
    wrap(() => {
        let text = document.getElementById("patch")
        let newcfg = text.value.trim()
        if (!currUF2)
            log("You have to drop a UF2 or BIN file with bootloader above before applying patches.")
        else if (!newcfg)
            log("You didn't give any patch to apply.")
        else {
            let buf = currUF2.slice()
            let r = patchConfig(buf, newcfg)
            if (!r.changes) {
                log("No changes.")
            } else {
                log("\nChanges:\n" + r.changes)
            }
            log("Downloading " + currUF2Name)
            download(r.patched, currUF2Name)
        }
    })
}

function dropHandler(ev) {
    ev.preventDefault();

    for (let i = 0; i < ev.dataTransfer.items.length; i++) {
        if (ev.dataTransfer.items[i].kind === 'file') {
            let file = ev.dataTransfer.items[i].getAsFile();
            let reader = new FileReader();
            infoMsg = ""
            reader.onload = e => {
                wrap(() => {
                    let buf = new Uint8Array(reader.result)
                    let cfg = readConfig(buf)
                    currUF2 = buf
                    infoMsg += "\n" + cfg
                    currUF2Name = file.name
                })
            }
            reader.readAsArrayBuffer(file);
            break
        }
    }
}

function dragOverHandler(ev) {
    ev.preventDefault();
    ev.dataTransfer.dropEffect = 'copy';
}