diff --git a/applications/system/js_app/examples/apps/Scripts/badusb_demo.js b/applications/system/js_app/examples/apps/Scripts/badusb_demo.js index 21090f603..bbeedd445 100644 --- a/applications/system/js_app/examples/apps/Scripts/badusb_demo.js +++ b/applications/system/js_app/examples/apps/Scripts/badusb_demo.js @@ -31,3 +31,6 @@ if (badusb.isConnected()) { print("USB not connected"); notify.error(); } + +// Optional, but allows to interchange with usbdisk +badusb.quit(); \ No newline at end of file diff --git a/applications/system/js_app/modules/js_badusb.c b/applications/system/js_app/modules/js_badusb.c index 7b524c901..0ac5c47da 100644 --- a/applications/system/js_app/modules/js_badusb.c +++ b/applications/system/js_app/modules/js_badusb.c @@ -54,6 +54,16 @@ static const struct { {"F12", HID_KEYBOARD_F12}, }; +static void js_badusb_quit_free(JsBadusbInst* badusb) { + if(badusb->usb_if_prev) { + furi_hal_hid_kb_release_all(); + furi_check(furi_hal_usb_set_config(badusb->usb_if_prev, NULL)); + } + if(badusb->hid_cfg) { + free(badusb->hid_cfg); + } +} + static bool setup_parse_params(struct mjs* mjs, mjs_val_t arg, FuriHalUsbHidConfig* hid_cfg) { if(!mjs_is_object(arg)) { return false; @@ -126,6 +136,22 @@ static void js_badusb_setup(struct mjs* mjs) { mjs_return(mjs, MJS_UNDEFINED); } +static void js_badusb_quit(struct mjs* mjs) { + mjs_val_t obj_inst = mjs_get(mjs, mjs_get_this(mjs), INST_PROP_NAME, ~0); + JsBadusbInst* badusb = mjs_get_ptr(mjs, obj_inst); + furi_assert(badusb); + + if(badusb->usb_if_prev == NULL) { + mjs_prepend_errorf(mjs, MJS_INTERNAL_ERROR, "HID is not started"); + mjs_return(mjs, MJS_UNDEFINED); + return; + } + + js_badusb_quit_free(badusb); + + mjs_return(mjs, MJS_UNDEFINED); +} + static void js_badusb_is_connected(struct mjs* mjs) { mjs_val_t obj_inst = mjs_get(mjs, mjs_get_this(mjs), INST_PROP_NAME, ~0); JsBadusbInst* badusb = mjs_get_ptr(mjs, obj_inst); @@ -367,6 +393,7 @@ static void* js_badusb_create(struct mjs* mjs, mjs_val_t* object) { mjs_val_t badusb_obj = mjs_mk_object(mjs); mjs_set(mjs, badusb_obj, INST_PROP_NAME, ~0, mjs_mk_foreign(mjs, badusb)); mjs_set(mjs, badusb_obj, "setup", ~0, MJS_MK_FN(js_badusb_setup)); + mjs_set(mjs, badusb_obj, "quit", ~0, MJS_MK_FN(js_badusb_quit)); mjs_set(mjs, badusb_obj, "isConnected", ~0, MJS_MK_FN(js_badusb_is_connected)); mjs_set(mjs, badusb_obj, "press", ~0, MJS_MK_FN(js_badusb_press)); mjs_set(mjs, badusb_obj, "hold", ~0, MJS_MK_FN(js_badusb_hold)); @@ -379,13 +406,7 @@ static void* js_badusb_create(struct mjs* mjs, mjs_val_t* object) { static void js_badusb_destroy(void* inst) { JsBadusbInst* badusb = inst; - if(badusb->usb_if_prev) { - furi_hal_hid_kb_release_all(); - furi_check(furi_hal_usb_set_config(badusb->usb_if_prev, NULL)); - } - if(badusb->hid_cfg) { - free(badusb->hid_cfg); - } + js_badusb_quit_free(badusb); free(badusb); }