96 lines
3.8 KiB
JavaScript
96 lines
3.8 KiB
JavaScript
|
({
|
||
|
title: "BadUSB Widget",
|
||
|
primaryAction: function (buttonNumber) {
|
||
|
// Do an action based on the button number.
|
||
|
if (buttonNumber === 1) {
|
||
|
this.api.badusb.hold("CTRL", "ALT");
|
||
|
this.api.badusb.press("DELETE");
|
||
|
this.api.badusb.release("CTRL", "ALT");
|
||
|
delay(1000);
|
||
|
this.api.badusb.press("DOWN");
|
||
|
this.api.badusb.press("DOWN");
|
||
|
delay(2000);
|
||
|
this.api.badusb.press("DOWN");
|
||
|
this.api.badusb.press("ENTER");
|
||
|
} else if (buttonNumber === 2) {
|
||
|
// Trigger sticky keys by pressing shift 5 times.
|
||
|
for (let i = 0; i < 5; i++) {
|
||
|
this.api.badusb.press("SHIFT");
|
||
|
}
|
||
|
} else if (buttonNumber === 4) {
|
||
|
this.api.badusb.println("SYMBOL TEST `!@#$%^&*()_+-=[]{};'\\:\"|,./<>?", 10);
|
||
|
} else if (buttonNumber === 8) {
|
||
|
this.api.badusb.altPrintln("Alt+Numpad `!@#$%^&*()_+-=[]{};'\\:\"|,./<>?");
|
||
|
}
|
||
|
},
|
||
|
init: function (api) {
|
||
|
this.api = api;
|
||
|
|
||
|
this.splashScreen();
|
||
|
|
||
|
// Initialize access to the Flipper Zero speaker
|
||
|
this.api.initSpeaker();
|
||
|
|
||
|
// Initialize access to the BadUSB (virtual keyboard) device
|
||
|
this.api.initBadusb("prompt");
|
||
|
|
||
|
this.initWidget();
|
||
|
},
|
||
|
splashScreen: function () {
|
||
|
this.api.require("widget");
|
||
|
this.api.widget.show();
|
||
|
let fxbmFlippy = this.api.widget.loadImageXbm(__dirpath + "/flippy.fxbm");
|
||
|
let splash = [];
|
||
|
splash.push(this.api.widget.addXbm(0, 0, fxbmFlippy));
|
||
|
splash.push(this.api.widget.addText(70, 10, "Secondary", "Be sure"));
|
||
|
splash.push(this.api.widget.addText(70, 20, "Secondary", "to attach"));
|
||
|
splash.push(this.api.widget.addText(70, 30, "Secondary", "FlipBoard."));
|
||
|
splash.push(this.api.widget.addText(70, 44, "Secondary", "Connect USB"));
|
||
|
splash.push(this.api.widget.addText(70, 54, "Secondary", "data cable"));
|
||
|
splash.push(this.api.widget.addText(70, 64, "Secondary", "to PC."));
|
||
|
delay(5000);
|
||
|
for (let i = 0; i < splash.length; i++) {
|
||
|
this.api.widget.remove(splash[i]);
|
||
|
}
|
||
|
},
|
||
|
initWidget: function () {
|
||
|
this.api.widget.addText(25, 15, "Primary", this.title);
|
||
|
this.status = this.api.widget.addText(10, 60, "Secondary", "Press a button!");
|
||
|
|
||
|
this.fxbmUp = this.api.widget.loadImageXbm(__dirpath + "/up.fxbm");
|
||
|
this.fxbmDown = this.api.widget.loadImageXbm(__dirpath + "/down.fxbm");
|
||
|
this.icons = [];
|
||
|
|
||
|
for (let i = 0; i < 4; i++) {
|
||
|
this.icons.push(this.api.widget.addXbm(9 + i * 30, 32, this.fxbmUp));
|
||
|
this.api.widget.addCircle(10 + i * 30 + 3, 36, 10);
|
||
|
}
|
||
|
},
|
||
|
updateWidget: function (buttonNumber, pressedArray) {
|
||
|
for (let i = 0; i < 4; i++) {
|
||
|
this.api.widget.remove(this.icons[i]);
|
||
|
if (pressedArray[i]) {
|
||
|
this.icons[i] = this.api.widget.addXbm(9 + i * 30, 32, this.fxbmDown);
|
||
|
} else {
|
||
|
this.icons[i] = this.api.widget.addXbm(9 + i * 30, 32, this.fxbmUp);
|
||
|
}
|
||
|
}
|
||
|
this.api.widget.remove(this.status);
|
||
|
this.status = this.api.widget.addText(10, 60, "Secondary", "Button " + to_string(buttonNumber));
|
||
|
},
|
||
|
buttonPressed: function (buttonNumber, pressedArray) {
|
||
|
// Redraw the widget to show the button press.
|
||
|
this.updateWidget(buttonNumber, pressedArray);
|
||
|
|
||
|
// A button press of 0 means the user released all of the buttons.
|
||
|
if (buttonNumber === 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Play a tone for 100ms when button pressed.
|
||
|
this.api.speaker.play(440 + 100 * buttonNumber, 1.00, 100);
|
||
|
|
||
|
// Perform the primary action.
|
||
|
this.primaryAction(buttonNumber);
|
||
|
}
|
||
|
})
|