diff --git a/applications/system/js_app/examples/apps/Scripts/usbdisk.js b/applications/system/js_app/examples/apps/Scripts/usbdisk.js index 7d148ab4c..87f3224dc 100644 --- a/applications/system/js_app/examples/apps/Scripts/usbdisk.js +++ b/applications/system/js_app/examples/apps/Scripts/usbdisk.js @@ -1,4 +1,6 @@ let usbdisk = require("usbdisk"); +// print("Creating image..."); +// usbdisk.createImage("/ext/apps_data/mass_storage/128MB.img", 128 * 1024 * 1024); print("Starting UsbDisk..."); usbdisk.start("/ext/apps_data/mass_storage/128MB.img"); print("Started, waiting until ejected..."); diff --git a/applications/system/js_app/modules/js_usbdisk/js_usbdisk.c b/applications/system/js_app/modules/js_usbdisk/js_usbdisk.c index 8ff744b84..89ebd3601 100644 --- a/applications/system/js_app/modules/js_usbdisk/js_usbdisk.c +++ b/applications/system/js_app/modules/js_usbdisk/js_usbdisk.c @@ -71,6 +71,72 @@ static void js_usbdisk_internal_stop_free(JsUsbdiskInst* usbdisk) { } } +static void js_usbdisk_create_image(struct mjs* mjs) { + size_t size = 0; + const char* path = NULL; + + const char* error = NULL; + do { + if(mjs_nargs(mjs) != 2) { + error = "Wrong argument count"; + break; + } + + mjs_val_t path_arg = mjs_arg(mjs, 0); + if(!mjs_is_string(path_arg)) { + error = "Path must be a string"; + break; + } + + size_t path_len = 0; + path = mjs_get_string(mjs, &path_arg, &path_len); + if((path_len == 0) || (path == NULL)) { + error = "Bad path argument"; + break; + } + + mjs_val_t size_arg = mjs_arg(mjs, 1); + if(!mjs_is_number(size_arg)) { + error = "Size must be a number"; + break; + } + + size = (size_t)mjs_get_int32(mjs, size_arg); + } while(0); + + if(!error) { + Storage* storage = furi_record_open(RECORD_STORAGE); + File* file = storage_file_alloc(storage); + do { + if(!storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_NEW)) { + error = storage_file_get_error_desc(file); + break; + } + + if(!storage_file_expand(file, size)) { + error = storage_file_get_error_desc(file); + break; + } + + error = "Image formatting failed"; + if(storage_virtual_init(storage, file) != FSE_OK) break; + if(storage_virtual_format(storage) != FSE_OK) break; + if(storage_virtual_quit(storage) != FSE_OK) break; + error = NULL; + } while(0); + storage_file_free(file); + furi_record_close(RECORD_STORAGE); + } + + if(error) { + mjs_prepend_errorf(mjs, MJS_BAD_ARGS_ERROR, "%s", error); + mjs_return(mjs, MJS_UNDEFINED); + return; + } + + mjs_return(mjs, MJS_UNDEFINED); +} + static void js_usbdisk_start(struct mjs* mjs) { mjs_val_t obj_inst = mjs_get(mjs, mjs_get_this(mjs), INST_PROP_NAME, ~0); JsUsbdiskInst* usbdisk = mjs_get_ptr(mjs, obj_inst); @@ -167,6 +233,7 @@ static void* js_usbdisk_create(struct mjs* mjs, mjs_val_t* object) { JsUsbdiskInst* usbdisk = malloc(sizeof(JsUsbdiskInst)); mjs_val_t usbdisk_obj = mjs_mk_object(mjs); mjs_set(mjs, usbdisk_obj, INST_PROP_NAME, ~0, mjs_mk_foreign(mjs, usbdisk)); + mjs_set(mjs, usbdisk_obj, "createImage", ~0, MJS_MK_FN(js_usbdisk_create_image)); mjs_set(mjs, usbdisk_obj, "start", ~0, MJS_MK_FN(js_usbdisk_start)); mjs_set(mjs, usbdisk_obj, "stop", ~0, MJS_MK_FN(js_usbdisk_stop)); mjs_set(mjs, usbdisk_obj, "wasEjected", ~0, MJS_MK_FN(js_usbdisk_was_ejected));