mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-27 23:33:53 +03:00
0154018363
* FBT: cdefines to env, libs order * API: strtod, modf, itoa, calloc * Apps: elk js * Apps: mjs * JS: scripts as assets * mjs: composite resolver * mjs: stack trace * ELK JS example removed * MJS thread, MJS lib modified to support script interruption * JS console UI * Module system, BadUSB bindings rework * JS notifications, simple dialog, BadUSB demo * Custom dialogs, dialog demo * MJS as system library, some dirty hacks to make it compile * Plugin-based js modules * js_uart(BadUART) module * js_uart: support for byte array arguments * Script icon and various fixes * File browser: multiple extensions filter, running js scripts from app loader * Running js scripts from archive browser * JS Runner as system app * Example scripts moved to /ext/apps/Scripts * JS bytecode listing generation * MJS builtin printf cleanup * JS examples cleanup * mbedtls version fix * Unused lib cleanup * Making PVS happy & TODOs cleanup * TODOs cleanup #2 * MJS: initial typed arrays support * JS: fix mem leak in uart destructor Co-authored-by: SG <who.just.the.doctor@gmail.com> Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
109 lines
3.7 KiB
C
109 lines
3.7 KiB
C
#include <core/common_defines.h>
|
|
#include "../js_modules.h"
|
|
#include <notification/notification_messages.h>
|
|
|
|
static void js_notify(struct mjs* mjs, const NotificationSequence* sequence) {
|
|
mjs_val_t obj_inst = mjs_get(mjs, mjs_get_this(mjs), INST_PROP_NAME, ~0);
|
|
NotificationApp* notification = mjs_get_ptr(mjs, obj_inst);
|
|
furi_assert(notification);
|
|
notification_message(notification, sequence);
|
|
}
|
|
|
|
static void js_notify_success(struct mjs* mjs) {
|
|
js_notify(mjs, &sequence_success);
|
|
mjs_return(mjs, MJS_UNDEFINED);
|
|
}
|
|
|
|
static void js_notify_error(struct mjs* mjs) {
|
|
js_notify(mjs, &sequence_error);
|
|
mjs_return(mjs, MJS_UNDEFINED);
|
|
}
|
|
|
|
static const struct {
|
|
const char* color_name;
|
|
const NotificationSequence* sequence_short;
|
|
const NotificationSequence* sequence_long;
|
|
} led_sequences[] = {
|
|
{"blue", &sequence_blink_blue_10, &sequence_blink_blue_100},
|
|
{"red", &sequence_blink_red_10, &sequence_blink_red_100},
|
|
{"green", &sequence_blink_green_10, &sequence_blink_green_100},
|
|
{"yellow", &sequence_blink_yellow_10, &sequence_blink_yellow_100},
|
|
{"cyan", &sequence_blink_cyan_10, &sequence_blink_cyan_100},
|
|
{"magenta", &sequence_blink_magenta_10, &sequence_blink_magenta_100},
|
|
};
|
|
|
|
static void js_notify_blink(struct mjs* mjs) {
|
|
const NotificationSequence* sequence = NULL;
|
|
do {
|
|
size_t num_args = mjs_nargs(mjs);
|
|
if(num_args != 2) {
|
|
break;
|
|
}
|
|
mjs_val_t color_obj = mjs_arg(mjs, 0);
|
|
mjs_val_t type_obj = mjs_arg(mjs, 1);
|
|
if((!mjs_is_string(color_obj)) || (!mjs_is_string(type_obj))) break;
|
|
|
|
size_t arg_len = 0;
|
|
const char* arg_str = mjs_get_string(mjs, &color_obj, &arg_len);
|
|
if((arg_len == 0) || (arg_str == NULL)) break;
|
|
|
|
int32_t color_id = -1;
|
|
for(size_t i = 0; i < COUNT_OF(led_sequences); i++) {
|
|
size_t name_len = strlen(led_sequences[i].color_name);
|
|
if(arg_len != name_len) continue;
|
|
if(strncmp(arg_str, led_sequences[i].color_name, arg_len) == 0) {
|
|
color_id = i;
|
|
break;
|
|
}
|
|
}
|
|
if(color_id == -1) break;
|
|
|
|
arg_str = mjs_get_string(mjs, &type_obj, &arg_len);
|
|
if((arg_len == 0) || (arg_str == NULL)) break;
|
|
if(strncmp(arg_str, "short", arg_len) == 0) {
|
|
sequence = led_sequences[color_id].sequence_short;
|
|
} else if(strncmp(arg_str, "long", arg_len) == 0) {
|
|
sequence = led_sequences[color_id].sequence_long;
|
|
}
|
|
} while(0);
|
|
|
|
if(sequence == NULL) {
|
|
mjs_prepend_errorf(mjs, MJS_BAD_ARGS_ERROR, "");
|
|
} else {
|
|
js_notify(mjs, sequence);
|
|
}
|
|
mjs_return(mjs, MJS_UNDEFINED);
|
|
}
|
|
|
|
static void* js_notification_create(struct mjs* mjs, mjs_val_t* object) {
|
|
NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION);
|
|
mjs_val_t notify_obj = mjs_mk_object(mjs);
|
|
mjs_set(mjs, notify_obj, INST_PROP_NAME, ~0, mjs_mk_foreign(mjs, notification));
|
|
mjs_set(mjs, notify_obj, "success", ~0, MJS_MK_FN(js_notify_success));
|
|
mjs_set(mjs, notify_obj, "error", ~0, MJS_MK_FN(js_notify_error));
|
|
mjs_set(mjs, notify_obj, "blink", ~0, MJS_MK_FN(js_notify_blink));
|
|
*object = notify_obj;
|
|
|
|
return notification;
|
|
}
|
|
|
|
static void js_notification_destroy(void* inst) {
|
|
UNUSED(inst);
|
|
furi_record_close(RECORD_NOTIFICATION);
|
|
}
|
|
|
|
static const JsModuleDescriptor js_notification_desc = {
|
|
"notification",
|
|
js_notification_create,
|
|
js_notification_destroy,
|
|
};
|
|
|
|
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
|
.appid = PLUGIN_APP_ID,
|
|
.ep_api_version = PLUGIN_API_VERSION,
|
|
.entry_point = &js_notification_desc,
|
|
};
|
|
|
|
const FlipperAppPluginDescriptor* js_notification_ep(void) {
|
|
return &plugin_descriptor;
|
|
} |