-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
JS: Backport³ and more additions & fixes (#3961)
* JS: Fix file select for fbt launch js_app * JS: badusb: Add numpad keys Co-authored-by: oldip <oldip@users.noreply.github.com> * JS: badusb: Layout support * JS: badusb: altPrint() and altPrintln() Co-authored-by: oldip <oldip@users.noreply.github.com> * JS: badusb: quit() * JS: serial: readAny() * JS: serial: end() * JS: serial: Auto disable expansion service * JS: storage: Add example script * JS: gui: text_input: Fix NULL ptr when no prop given * JS: gui: text_input: Default text props Co-authored-by: xMasterX <xMasterX@users.noreply.github.com> * JS: gui: byte_input Co-authored-by: xMasterX <xMasterX@users.noreply.github.com> * JS: gui: file_picker * JS: gui: viewDispatcher.currentView * JS: gui: view.hasProperty() * JS: gui: Add some missing typedefs comments * JS: globals: Fix toString() with negative numbers * JS: globals: parseInt() Co-authored-by: Spooks4576 <Spooks4576@users.noreply.github.com> * JS: globals: toUpperCase() and toLowerCase() Co-authored-by: Spooks4576 <Spooks4576@users.noreply.github.com> * JS: globals: Add some missing typedefs * JS: Add example for string functions Co-authored-by: Spooks4576 <Spooks4576@users.noreply.github.com> * JS: globals: __dirpath and __filepath Co-authored-by: jamisonderek <jamisonderek@users.noreply.github.com> * JS: globals: load() typedef missing scope param * JS: Add interactive REPL script example * JS: Add missing icon for file picker * JS: Rename to __filename and __dirname * JS: Move toUpperCase() and toLowerCase() to string class * JS: parseInt() refactor * JS: Typedef base param for parseInt() * Revert "JS: gui: view.hasProperty()" This reverts commit 1967ec0. * JS: Move toString() to Number class * JS: Fix duplicate plugin files in plugins, `requires` is used to determine which app to distribute the .fal under `apps_data/appid/plugins` * JS: math: Missing typedefs, use camelCase * JS: badusb: layoutPath is optional in typedef * Fix ASS scoping * Rename mjs term prop type value * Change load() description * Enlarge buffers in default prop assign * More checks for default data/text size * Make PVS happy * Fix icon symbol * Update types for JS SDK * toString() was moved to number class Co-authored-by: oldip <oldip@users.noreply.github.com> Co-authored-by: xMasterX <xMasterX@users.noreply.github.com> Co-authored-by: Spooks4576 <Spooks4576@users.noreply.github.com> Co-authored-by: jamisonderek <jamisonderek@users.noreply.github.com> Co-authored-by: hedger <hedger@users.noreply.github.com> Co-authored-by: あく <alleteam@gmail.com>
- Loading branch information
1 parent
1907f23
commit c807ffc
Showing
35 changed files
with
1,048 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
93 changes: 93 additions & 0 deletions
93
applications/system/js_app/examples/apps/Scripts/interactive.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
let eventLoop = require("event_loop"); | ||
let gui = require("gui"); | ||
let dialog = require("gui/dialog"); | ||
let textInput = require("gui/text_input"); | ||
let loading = require("gui/loading"); | ||
let storage = require("storage"); | ||
|
||
// No eval() or exec() so need to run code from file, and filename must be unique | ||
storage.makeDirectory("/ext/.tmp"); | ||
storage.makeDirectory("/ext/.tmp/js"); | ||
storage.rmrf("/ext/.tmp/js/repl") | ||
storage.makeDirectory("/ext/.tmp/js/repl") | ||
let ctx = { | ||
tmpTemplate: "/ext/.tmp/js/repl/", | ||
tmpNumber: 0, | ||
persistentScope: {}, | ||
}; | ||
|
||
let views = { | ||
dialog: dialog.makeWith({ | ||
header: "Interactive Console", | ||
text: "Press OK to Start", | ||
center: "Run Some JS" | ||
}), | ||
textInput: textInput.makeWith({ | ||
header: "Type JavaScript Code:", | ||
minLength: 0, | ||
maxLength: 256, | ||
defaultText: "2+2", | ||
defaultTextClear: true, | ||
}), | ||
loading: loading.make(), | ||
}; | ||
|
||
eventLoop.subscribe(views.dialog.input, function (_sub, button, gui, views) { | ||
if (button === "center") { | ||
gui.viewDispatcher.switchTo(views.textInput); | ||
} | ||
}, gui, views); | ||
|
||
eventLoop.subscribe(views.textInput.input, function (_sub, text, gui, views, ctx) { | ||
gui.viewDispatcher.switchTo(views.loading); | ||
|
||
let path = ctx.tmpTemplate + (ctx.tmpNumber++).toString(); | ||
let file = storage.openFile(path, "w", "create_always"); | ||
file.write(text); | ||
file.close(); | ||
|
||
// Hide GUI before running, we want to see console and avoid deadlock if code fails | ||
gui.viewDispatcher.sendTo("back"); | ||
let result = load(path, ctx.persistentScope); // Load runs JS and returns last value on stack | ||
storage.remove(path); | ||
|
||
// Must convert to string explicitly | ||
if (result === null) { // mJS: typeof null === "null", ECMAScript: typeof null === "object", IDE complains when checking "null" type | ||
result = "null"; | ||
} else if (typeof result === "string") { | ||
result = "'" + result + "'"; | ||
} else if (typeof result === "number") { | ||
result = result.toString(); | ||
} else if (typeof result === "bigint") { // mJS doesn't support BigInt() but might aswell check | ||
result = "bigint"; | ||
} else if (typeof result === "boolean") { | ||
result = result ? "true" : "false"; | ||
} else if (typeof result === "symbol") { // mJS doesn't support Symbol() but might aswell check | ||
result = "symbol"; | ||
} else if (typeof result === "undefined") { | ||
result = "undefined"; | ||
} else if (typeof result === "object") { | ||
result = "object"; // JSON.stringify() is not implemented | ||
} else if (typeof result === "function") { | ||
result = "function"; | ||
} else { | ||
result = "unknown type: " + typeof result; | ||
} | ||
|
||
gui.viewDispatcher.sendTo("front"); | ||
views.dialog.set("header", "JS Returned:"); | ||
views.dialog.set("text", result); | ||
gui.viewDispatcher.switchTo(views.dialog); | ||
views.textInput.set("defaultText", text); | ||
}, gui, views, ctx); | ||
|
||
eventLoop.subscribe(gui.viewDispatcher.navigation, function (_sub, _, eventLoop) { | ||
eventLoop.stop(); | ||
}, eventLoop); | ||
|
||
gui.viewDispatcher.switchTo(views.dialog); | ||
|
||
// Message behind GUI if something breaks | ||
print("If you're stuck here, something went wrong, re-run the script") | ||
eventLoop.run(); | ||
print("\n\nFinished correctly :)") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
let math = load("/ext/apps/Scripts/load_api.js"); | ||
let math = load(__dirname + "/load_api.js"); | ||
let result = math.add(5, 10); | ||
print(result); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
let storage = require("storage"); | ||
|
||
print("script has __dirname of" + __dirname); | ||
print("script has __filename of" + __filename); | ||
if (storage.fileExists(__dirname + "/math.js")) { | ||
print("math.js exist here."); | ||
} else { | ||
print("math.js does not exist here."); | ||
} |
29 changes: 29 additions & 0 deletions
29
applications/system/js_app/examples/apps/Scripts/storage.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
let storage = require("storage"); | ||
let path = "/ext/storage.test"; | ||
|
||
print("File exists:", storage.fileExists(path)); | ||
|
||
print("Writing..."); | ||
let file = storage.openFile(path, "w", "create_always"); | ||
file.write("Hello "); | ||
file.close(); | ||
|
||
print("File exists:", storage.fileExists(path)); | ||
|
||
file = storage.openFile(path, "w", "open_append"); | ||
file.write("World!"); | ||
file.close(); | ||
|
||
print("Reading..."); | ||
file = storage.openFile(path, "r", "open_existing"); | ||
let text = file.read("ascii", 128); | ||
file.close(); | ||
print(text); | ||
|
||
print("Removing...") | ||
storage.remove(path); | ||
|
||
print("Done") | ||
|
||
// You don't need to close the file after each operation, this is just to show some different ways to use the API | ||
// There's also many more functions and options, check type definitions in firmware repo |
19 changes: 19 additions & 0 deletions
19
applications/system/js_app/examples/apps/Scripts/stringutils.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
let sampleText = "Hello, World!"; | ||
|
||
let lengthOfText = "Length of text: " + sampleText.length.toString(); | ||
print(lengthOfText); | ||
|
||
let start = 7; | ||
let end = 12; | ||
let substringResult = sampleText.slice(start, end); | ||
print(substringResult); | ||
|
||
let searchStr = "World"; | ||
let result2 = sampleText.indexOf(searchStr).toString(); | ||
print(result2); | ||
|
||
let upperCaseText = "Text in upper case: " + sampleText.toUpperCase(); | ||
print(upperCaseText); | ||
|
||
let lowerCaseText = "Text in lower case: " + sampleText.toLowerCase(); | ||
print(lowerCaseText); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.