From cb6c83eec71d99dc6dc2e2cc0b6364d33b7ab628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Moskal?= Date: Wed, 9 Oct 2019 13:57:06 -0700 Subject: [PATCH] Add sources for the file manager program (#944) --- libs/core/platform.cpp | 39 ++++++++++++++++- scripts/file_manager.ts | 97 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 scripts/file_manager.ts diff --git a/libs/core/platform.cpp b/libs/core/platform.cpp index fd994729..5f83ed7d 100644 --- a/libs/core/platform.cpp +++ b/libs/core/platform.cpp @@ -120,7 +120,7 @@ void stopLMS() { if (!pid) continue; char namebuf[100]; - snprintf(namebuf, 1000, "/proc/%d/cmdline", pid); + snprintf(namebuf, 100, "/proc/%d/cmdline", pid); FILE *f = fopen(namebuf, "r"); if (f) { fread(namebuf, 1, 99, f); @@ -195,5 +195,42 @@ void target_startup() { void initKeys() {} +static const char *progPath = "/mnt/ramdisk/prjs/BrkProg_SAVE"; + +// These are disabled except when building File_manager.pdf +// % +void deletePrjFile(String filename) { + const char *d = filename->getUTF8Data(); + if (strlen(d) > 500 || strchr(d, '/')) + return; + char buf[1024]; + snprintf(buf, sizeof(buf), "%s/%s", progPath, d); + unlink(buf); +} + +// % +RefCollection *listPrjFiles() { + auto res = Array_::mk(); + registerGCObj(res); + + auto dp = opendir(progPath); + + for (;;) { + dirent *ep = dp ? readdir(dp) : NULL; + if (!ep) + break; + if (ep->d_name[0] == '.') + continue; + auto str = mkString(ep->d_name, -1); + registerGCObj(str); + res->head.push((TValue)str); + unregisterGCObj(str); + } + if (dp) + closedir(dp); + unregisterGCObj(res); + + return res; +} } diff --git a/scripts/file_manager.ts b/scripts/file_manager.ts new file mode 100644 index 00000000..a0e1f610 --- /dev/null +++ b/scripts/file_manager.ts @@ -0,0 +1,97 @@ +//% shim=pxt::listPrjFiles +function getPrjs() { + let programs = [ + "pxt", + "my amazing robot", + ] + for (let i = 1; i < 6; ++i) + programs.push("Untitled-" + i) + return programs +} + +//% shim=pxt::deletePrjFile +function delPrj(fn: string) { + return +} + +const programs = getPrjs() + .filter(s => s.substr(s.length - 4, 4) == ".rbf") + .map(s => s.substr(0, s.length - 4)) + .filter(s => s != "File_manager") + +programs.push("") +programs.push("Cancel") +programs.push("Delete 0 files") + +let todel: boolean[] = [] +let scrollTop = 0 +let cursor = 0 +let confirm = false +function showMenu() { + if (cursor < scrollTop + 2) + scrollTop = cursor - 2 + else if (cursor > scrollTop + 11) + scrollTop = cursor - 11 + if (scrollTop < 0) + scrollTop = 0 + let num = 0 + for (let i = 0; i < todel.length; ++i) + if (todel[i]) num++ + programs[programs.length - 1] = + confirm ? "Enter to confirm" : "Delete " + num + " file(s)" + + brick.clearScreen() + + const h = brick.lineHeight() + for (let i = 0; i < 13; ++i) { + const y = i * h + const idx = scrollTop + i + const fg = idx == cursor ? 0 : 1 + const bg = idx == cursor ? 1 : 0 + // screen.fillRect(0, y, screen.width, h, bg); + let text = (idx == cursor ? ">" : " ") + + (todel[idx] ? "*" : " ") + + " " + + (programs[scrollTop + i] || "") + screen.print(text, 0, y, fg, brick.font); + } +} +function move(d: number) { + confirm = false + const nc = cursor + d + if (0 <= nc && nc < programs.length) + cursor = nc + showMenu() +} +brick.buttonDown.onEvent(ButtonEvent.Pressed, () => move(1)) +brick.buttonUp.onEvent(ButtonEvent.Pressed, () => move(-1)) +brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () { + if (cursor < programs.length - 3) { + todel[cursor] = !todel[cursor] + move(1) + } else if (cursor == programs.length - 3) { + // nothing + } else if (cursor == programs.length - 2) { + control.reset() + } else if (cursor == programs.length - 1) { + if (todel.every(x => !x)) + return + if (confirm) { + brick.clearScreen() + brick.showString("deleting...", 6) + for (let i = 0; i < todel.length; ++i) { + if (todel[i]) { + delPrj(programs[i] + ".elf") + delPrj(programs[i] + ".rbf") + } + } + pause(1000) + control.reset() + } else { + confirm = true + showMenu() + } + } +}) +showMenu() +