Skip to content
This repository has been archived by the owner on Jul 28, 2024. It is now read-only.

Commit

Permalink
JS: Create disk image with usbdisk.createImage("/ext/file", 123)
Browse files Browse the repository at this point in the history
  • Loading branch information
Willy-JL committed Feb 20, 2024
1 parent 28c5ad2 commit bcc78a5
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
2 changes: 2 additions & 0 deletions applications/system/js_app/examples/apps/Scripts/usbdisk.js
Original file line number Diff line number Diff line change
@@ -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...");
Expand Down
67 changes: 67 additions & 0 deletions applications/system/js_app/modules/js_usbdisk/js_usbdisk.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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));
Expand Down

0 comments on commit bcc78a5

Please sign in to comment.