Desktop,Cli: add uptime info (#2874)
This commit is contained in:
parent
92c0baa461
commit
b55d97f827
@ -89,6 +89,14 @@ void cli_command_help(Cli* cli, FuriString* args, void* context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cli_command_uptime(Cli* cli, FuriString* args, void* context) {
|
||||||
|
UNUSED(cli);
|
||||||
|
UNUSED(args);
|
||||||
|
UNUSED(context);
|
||||||
|
uint32_t uptime = furi_get_tick() / furi_kernel_get_tick_frequency();
|
||||||
|
printf("Uptime: %luh%lum%lus", uptime / 60 / 60, uptime / 60 % 60, uptime % 60);
|
||||||
|
}
|
||||||
|
|
||||||
void cli_command_date(Cli* cli, FuriString* args, void* context) {
|
void cli_command_date(Cli* cli, FuriString* args, void* context) {
|
||||||
UNUSED(cli);
|
UNUSED(cli);
|
||||||
UNUSED(context);
|
UNUSED(context);
|
||||||
@ -451,6 +459,7 @@ void cli_commands_init(Cli* cli) {
|
|||||||
cli_add_command(cli, "?", CliCommandFlagParallelSafe, cli_command_help, NULL);
|
cli_add_command(cli, "?", CliCommandFlagParallelSafe, cli_command_help, NULL);
|
||||||
cli_add_command(cli, "help", CliCommandFlagParallelSafe, cli_command_help, NULL);
|
cli_add_command(cli, "help", CliCommandFlagParallelSafe, cli_command_help, NULL);
|
||||||
|
|
||||||
|
cli_add_command(cli, "uptime", CliCommandFlagDefault, cli_command_uptime, NULL);
|
||||||
cli_add_command(cli, "date", CliCommandFlagParallelSafe, cli_command_date, NULL);
|
cli_add_command(cli, "date", CliCommandFlagParallelSafe, cli_command_date, NULL);
|
||||||
cli_add_command(cli, "log", CliCommandFlagParallelSafe, cli_command_log, NULL);
|
cli_add_command(cli, "log", CliCommandFlagParallelSafe, cli_command_log, NULL);
|
||||||
cli_add_command(cli, "sysctl", CliCommandFlagDefault, cli_command_sysctl, NULL);
|
cli_add_command(cli, "sysctl", CliCommandFlagDefault, cli_command_sysctl, NULL);
|
||||||
|
|||||||
@ -14,8 +14,6 @@ void desktop_scene_debug_callback(DesktopEvent event, void* context) {
|
|||||||
void desktop_scene_debug_on_enter(void* context) {
|
void desktop_scene_debug_on_enter(void* context) {
|
||||||
Desktop* desktop = (Desktop*)context;
|
Desktop* desktop = (Desktop*)context;
|
||||||
|
|
||||||
desktop_debug_get_dolphin_data(desktop->debug_view);
|
|
||||||
|
|
||||||
desktop_debug_set_callback(desktop->debug_view, desktop_scene_debug_callback, desktop);
|
desktop_debug_set_callback(desktop->debug_view, desktop_scene_debug_callback, desktop);
|
||||||
view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewIdDebug);
|
view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewIdDebug);
|
||||||
}
|
}
|
||||||
@ -32,24 +30,6 @@ bool desktop_scene_debug_on_event(void* context, SceneManagerEvent event) {
|
|||||||
dolphin_flush(dolphin);
|
dolphin_flush(dolphin);
|
||||||
consumed = true;
|
consumed = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DesktopDebugEventDeed:
|
|
||||||
dolphin_deed(DolphinDeedTestRight);
|
|
||||||
desktop_debug_get_dolphin_data(desktop->debug_view);
|
|
||||||
consumed = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DesktopDebugEventWrongDeed:
|
|
||||||
dolphin_deed(DolphinDeedTestLeft);
|
|
||||||
desktop_debug_get_dolphin_data(desktop->debug_view);
|
|
||||||
consumed = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DesktopDebugEventSaveState:
|
|
||||||
dolphin_flush(dolphin);
|
|
||||||
consumed = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -60,6 +40,5 @@ bool desktop_scene_debug_on_event(void* context, SceneManagerEvent event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void desktop_scene_debug_on_exit(void* context) {
|
void desktop_scene_debug_on_exit(void* context) {
|
||||||
Desktop* desktop = (Desktop*)context;
|
UNUSED(context);
|
||||||
desktop_debug_reset_screen_idx(desktop->debug_view);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,96 +18,71 @@ void desktop_debug_set_callback(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void desktop_debug_render(Canvas* canvas, void* model) {
|
void desktop_debug_render(Canvas* canvas, void* model) {
|
||||||
|
UNUSED(model);
|
||||||
canvas_clear(canvas);
|
canvas_clear(canvas);
|
||||||
DesktopDebugViewModel* m = model;
|
|
||||||
const Version* ver;
|
const Version* ver;
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
|
|
||||||
static const char* headers[] = {"Device Info:", "Dolphin Info:"};
|
|
||||||
|
|
||||||
canvas_set_color(canvas, ColorBlack);
|
canvas_set_color(canvas, ColorBlack);
|
||||||
canvas_set_font(canvas, FontPrimary);
|
canvas_set_font(canvas, FontPrimary);
|
||||||
canvas_draw_str_aligned(
|
|
||||||
canvas, 64, 1 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignTop, headers[m->screen]);
|
uint32_t uptime = furi_get_tick() / furi_kernel_get_tick_frequency();
|
||||||
|
snprintf(
|
||||||
|
buffer,
|
||||||
|
sizeof(buffer),
|
||||||
|
"Uptime: %luh%lum%lus",
|
||||||
|
uptime / 60 / 60,
|
||||||
|
uptime / 60 % 60,
|
||||||
|
uptime % 60);
|
||||||
|
canvas_draw_str_aligned(canvas, 64, 1 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignTop, buffer);
|
||||||
|
|
||||||
canvas_set_font(canvas, FontSecondary);
|
canvas_set_font(canvas, FontSecondary);
|
||||||
|
|
||||||
if(m->screen != DesktopViewStatsMeta) {
|
// Hardware version
|
||||||
// Hardware version
|
const char* my_name = furi_hal_version_get_name_ptr();
|
||||||
const char* my_name = furi_hal_version_get_name_ptr();
|
snprintf(
|
||||||
snprintf(
|
buffer,
|
||||||
buffer,
|
sizeof(buffer),
|
||||||
sizeof(buffer),
|
"%d.F%dB%dC%d %s:%s %s",
|
||||||
"%d.F%dB%dC%d %s:%s %s",
|
furi_hal_version_get_hw_version(),
|
||||||
furi_hal_version_get_hw_version(),
|
furi_hal_version_get_hw_target(),
|
||||||
furi_hal_version_get_hw_target(),
|
furi_hal_version_get_hw_body(),
|
||||||
furi_hal_version_get_hw_body(),
|
furi_hal_version_get_hw_connect(),
|
||||||
furi_hal_version_get_hw_connect(),
|
furi_hal_version_get_hw_region_name(),
|
||||||
furi_hal_version_get_hw_region_name(),
|
furi_hal_region_get_name(),
|
||||||
furi_hal_region_get_name(),
|
my_name ? my_name : "Unknown");
|
||||||
my_name ? my_name : "Unknown");
|
canvas_draw_str(canvas, 0, 19 + STATUS_BAR_Y_SHIFT, buffer);
|
||||||
canvas_draw_str(canvas, 0, 19 + STATUS_BAR_Y_SHIFT, buffer);
|
|
||||||
|
|
||||||
ver = furi_hal_version_get_firmware_version();
|
ver = furi_hal_version_get_firmware_version();
|
||||||
const BleGlueC2Info* c2_ver = NULL;
|
const BleGlueC2Info* c2_ver = NULL;
|
||||||
#ifdef SRV_BT
|
#ifdef SRV_BT
|
||||||
c2_ver = ble_glue_get_c2_info();
|
c2_ver = ble_glue_get_c2_info();
|
||||||
#endif
|
#endif
|
||||||
if(!ver) { //-V1051
|
if(!ver) { //-V1051
|
||||||
canvas_draw_str(canvas, 0, 30 + STATUS_BAR_Y_SHIFT, "No info");
|
canvas_draw_str(canvas, 0, 30 + STATUS_BAR_Y_SHIFT, "No info");
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(
|
|
||||||
buffer,
|
|
||||||
sizeof(buffer),
|
|
||||||
"%s [%s]",
|
|
||||||
version_get_version(ver),
|
|
||||||
version_get_builddate(ver));
|
|
||||||
canvas_draw_str(canvas, 0, 30 + STATUS_BAR_Y_SHIFT, buffer);
|
|
||||||
|
|
||||||
uint16_t api_major, api_minor;
|
|
||||||
furi_hal_info_get_api_version(&api_major, &api_minor);
|
|
||||||
snprintf(
|
|
||||||
buffer,
|
|
||||||
sizeof(buffer),
|
|
||||||
"%s%s [%d.%d] %s",
|
|
||||||
version_get_dirty_flag(ver) ? "[!] " : "",
|
|
||||||
version_get_githash(ver),
|
|
||||||
api_major,
|
|
||||||
api_minor,
|
|
||||||
c2_ver ? c2_ver->StackTypeString : "<none>");
|
|
||||||
canvas_draw_str(canvas, 0, 40 + STATUS_BAR_Y_SHIFT, buffer);
|
|
||||||
|
|
||||||
snprintf(
|
|
||||||
buffer, sizeof(buffer), "[%d] %s", version_get_target(ver), version_get_gitbranch(ver));
|
|
||||||
canvas_draw_str(canvas, 0, 50 + STATUS_BAR_Y_SHIFT, buffer);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN);
|
|
||||||
DolphinStats stats = dolphin_stats(dolphin);
|
|
||||||
furi_record_close(RECORD_DOLPHIN);
|
|
||||||
|
|
||||||
uint32_t current_lvl = stats.level;
|
|
||||||
uint32_t remaining = dolphin_state_xp_to_levelup(m->icounter);
|
|
||||||
|
|
||||||
canvas_set_font(canvas, FontSecondary);
|
|
||||||
snprintf(buffer, sizeof(buffer), "Icounter: %lu Butthurt %lu", m->icounter, m->butthurt);
|
|
||||||
canvas_draw_str(canvas, 5, 19 + STATUS_BAR_Y_SHIFT, buffer);
|
|
||||||
|
|
||||||
snprintf(
|
|
||||||
buffer,
|
|
||||||
sizeof(buffer),
|
|
||||||
"Level: %lu To level up: %lu",
|
|
||||||
current_lvl,
|
|
||||||
(remaining == (uint32_t)(-1) ? remaining : 0));
|
|
||||||
canvas_draw_str(canvas, 5, 29 + STATUS_BAR_Y_SHIFT, buffer);
|
|
||||||
|
|
||||||
// even if timestamp is uint64_t, it's safe to cast it to uint32_t, because furi_hal_rtc_datetime_to_timestamp only returns uint32_t
|
|
||||||
snprintf(buffer, sizeof(buffer), "%lu", (uint32_t)m->timestamp);
|
|
||||||
|
|
||||||
canvas_draw_str(canvas, 5, 39 + STATUS_BAR_Y_SHIFT, buffer);
|
|
||||||
canvas_draw_str(canvas, 0, 49 + STATUS_BAR_Y_SHIFT, "[< >] icounter value [ok] save");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
snprintf(
|
||||||
|
buffer, sizeof(buffer), "%s [%s]", version_get_version(ver), version_get_builddate(ver));
|
||||||
|
canvas_draw_str(canvas, 0, 30 + STATUS_BAR_Y_SHIFT, buffer);
|
||||||
|
|
||||||
|
uint16_t api_major, api_minor;
|
||||||
|
furi_hal_info_get_api_version(&api_major, &api_minor);
|
||||||
|
snprintf(
|
||||||
|
buffer,
|
||||||
|
sizeof(buffer),
|
||||||
|
"%s%s [%d.%d] %s",
|
||||||
|
version_get_dirty_flag(ver) ? "[!] " : "",
|
||||||
|
version_get_githash(ver),
|
||||||
|
api_major,
|
||||||
|
api_minor,
|
||||||
|
c2_ver ? c2_ver->StackTypeString : "<none>");
|
||||||
|
canvas_draw_str(canvas, 0, 40 + STATUS_BAR_Y_SHIFT, buffer);
|
||||||
|
|
||||||
|
snprintf(
|
||||||
|
buffer, sizeof(buffer), "[%d] %s", version_get_target(ver), version_get_gitbranch(ver));
|
||||||
|
canvas_draw_str(canvas, 0, 50 + STATUS_BAR_Y_SHIFT, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
View* desktop_debug_get_view(DesktopDebugView* debug_view) {
|
View* desktop_debug_get_view(DesktopDebugView* debug_view) {
|
||||||
@ -115,61 +90,43 @@ View* desktop_debug_get_view(DesktopDebugView* debug_view) {
|
|||||||
return debug_view->view;
|
return debug_view->view;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool desktop_debug_input(InputEvent* event, void* context) {
|
static bool desktop_debug_input(InputEvent* event, void* context) {
|
||||||
furi_assert(event);
|
furi_assert(event);
|
||||||
furi_assert(context);
|
furi_assert(context);
|
||||||
|
|
||||||
DesktopDebugView* debug_view = context;
|
DesktopDebugView* debug_view = context;
|
||||||
|
|
||||||
if(event->type != InputTypeShort && event->type != InputTypeRepeat) {
|
if(event->key == InputKeyBack && event->type == InputTypeShort) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DesktopViewStatsScreens current = 0;
|
|
||||||
with_view_model(
|
|
||||||
debug_view->view,
|
|
||||||
DesktopDebugViewModel * model,
|
|
||||||
{
|
|
||||||
#ifdef SRV_DOLPHIN_STATE_DEBUG
|
|
||||||
if((event->key == InputKeyDown) || (event->key == InputKeyUp)) {
|
|
||||||
model->screen = !model->screen;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
current = model->screen;
|
|
||||||
},
|
|
||||||
true);
|
|
||||||
|
|
||||||
size_t count = (event->type == InputTypeRepeat) ? 10 : 1;
|
|
||||||
if(current == DesktopViewStatsMeta) {
|
|
||||||
if(event->key == InputKeyLeft) {
|
|
||||||
while(count-- > 0) {
|
|
||||||
debug_view->callback(DesktopDebugEventWrongDeed, debug_view->context);
|
|
||||||
}
|
|
||||||
} else if(event->key == InputKeyRight) {
|
|
||||||
while(count-- > 0) {
|
|
||||||
debug_view->callback(DesktopDebugEventDeed, debug_view->context);
|
|
||||||
}
|
|
||||||
} else if(event->key == InputKeyOk) {
|
|
||||||
debug_view->callback(DesktopDebugEventSaveState, debug_view->context);
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(event->key == InputKeyBack) {
|
|
||||||
debug_view->callback(DesktopDebugEventExit, debug_view->context);
|
debug_view->callback(DesktopDebugEventExit, debug_view->context);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void desktop_debug_enter(void* context) {
|
||||||
|
DesktopDebugView* debug_view = context;
|
||||||
|
furi_timer_start(debug_view->timer, furi_ms_to_ticks(1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void desktop_debug_exit(void* context) {
|
||||||
|
DesktopDebugView* debug_view = context;
|
||||||
|
furi_timer_stop(debug_view->timer);
|
||||||
|
}
|
||||||
|
void desktop_debug_timer(void* context) {
|
||||||
|
DesktopDebugView* debug_view = context;
|
||||||
|
view_get_model(debug_view->view);
|
||||||
|
view_commit_model(debug_view->view, true);
|
||||||
|
}
|
||||||
|
|
||||||
DesktopDebugView* desktop_debug_alloc() {
|
DesktopDebugView* desktop_debug_alloc() {
|
||||||
DesktopDebugView* debug_view = malloc(sizeof(DesktopDebugView));
|
DesktopDebugView* debug_view = malloc(sizeof(DesktopDebugView));
|
||||||
debug_view->view = view_alloc();
|
debug_view->view = view_alloc();
|
||||||
view_allocate_model(debug_view->view, ViewModelTypeLocking, sizeof(DesktopDebugViewModel));
|
debug_view->timer = furi_timer_alloc(desktop_debug_timer, FuriTimerTypePeriodic, debug_view);
|
||||||
view_set_context(debug_view->view, debug_view);
|
view_set_context(debug_view->view, debug_view);
|
||||||
view_set_draw_callback(debug_view->view, (ViewDrawCallback)desktop_debug_render);
|
view_set_draw_callback(debug_view->view, (ViewDrawCallback)desktop_debug_render);
|
||||||
view_set_input_callback(debug_view->view, desktop_debug_input);
|
view_set_input_callback(debug_view->view, desktop_debug_input);
|
||||||
|
view_set_enter_callback(debug_view->view, desktop_debug_enter);
|
||||||
|
view_set_exit_callback(debug_view->view, desktop_debug_exit);
|
||||||
|
|
||||||
return debug_view;
|
return debug_view;
|
||||||
}
|
}
|
||||||
@ -177,27 +134,7 @@ DesktopDebugView* desktop_debug_alloc() {
|
|||||||
void desktop_debug_free(DesktopDebugView* debug_view) {
|
void desktop_debug_free(DesktopDebugView* debug_view) {
|
||||||
furi_assert(debug_view);
|
furi_assert(debug_view);
|
||||||
|
|
||||||
|
furi_timer_free(debug_view->timer);
|
||||||
view_free(debug_view->view);
|
view_free(debug_view->view);
|
||||||
free(debug_view);
|
free(debug_view);
|
||||||
}
|
}
|
||||||
|
|
||||||
void desktop_debug_get_dolphin_data(DesktopDebugView* debug_view) {
|
|
||||||
Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN);
|
|
||||||
DolphinStats stats = dolphin_stats(dolphin);
|
|
||||||
with_view_model(
|
|
||||||
debug_view->view,
|
|
||||||
DesktopDebugViewModel * model,
|
|
||||||
{
|
|
||||||
model->icounter = stats.icounter;
|
|
||||||
model->butthurt = stats.butthurt;
|
|
||||||
model->timestamp = stats.timestamp;
|
|
||||||
},
|
|
||||||
true);
|
|
||||||
|
|
||||||
furi_record_close(RECORD_DOLPHIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
void desktop_debug_reset_screen_idx(DesktopDebugView* debug_view) {
|
|
||||||
with_view_model(
|
|
||||||
debug_view->view, DesktopDebugViewModel * model, { model->screen = 0; }, true);
|
|
||||||
}
|
|
||||||
|
|||||||
@ -8,26 +8,13 @@ typedef struct DesktopDebugView DesktopDebugView;
|
|||||||
|
|
||||||
typedef void (*DesktopDebugViewCallback)(DesktopEvent event, void* context);
|
typedef void (*DesktopDebugViewCallback)(DesktopEvent event, void* context);
|
||||||
|
|
||||||
// Debug info
|
|
||||||
typedef enum {
|
|
||||||
DesktopViewStatsFw,
|
|
||||||
DesktopViewStatsMeta,
|
|
||||||
DesktopViewStatsTotalCount,
|
|
||||||
} DesktopViewStatsScreens;
|
|
||||||
|
|
||||||
struct DesktopDebugView {
|
struct DesktopDebugView {
|
||||||
View* view;
|
View* view;
|
||||||
|
FuriTimer* timer;
|
||||||
DesktopDebugViewCallback callback;
|
DesktopDebugViewCallback callback;
|
||||||
void* context;
|
void* context;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t icounter;
|
|
||||||
uint32_t butthurt;
|
|
||||||
uint64_t timestamp;
|
|
||||||
DesktopViewStatsScreens screen;
|
|
||||||
} DesktopDebugViewModel;
|
|
||||||
|
|
||||||
void desktop_debug_set_callback(
|
void desktop_debug_set_callback(
|
||||||
DesktopDebugView* debug_view,
|
DesktopDebugView* debug_view,
|
||||||
DesktopDebugViewCallback callback,
|
DesktopDebugViewCallback callback,
|
||||||
@ -36,7 +23,5 @@ void desktop_debug_set_callback(
|
|||||||
View* desktop_debug_get_view(DesktopDebugView* debug_view);
|
View* desktop_debug_get_view(DesktopDebugView* debug_view);
|
||||||
|
|
||||||
DesktopDebugView* desktop_debug_alloc();
|
DesktopDebugView* desktop_debug_alloc();
|
||||||
void desktop_debug_free(DesktopDebugView* debug_view);
|
|
||||||
|
|
||||||
void desktop_debug_get_dolphin_data(DesktopDebugView* debug_view);
|
void desktop_debug_free(DesktopDebugView* debug_view);
|
||||||
void desktop_debug_reset_screen_idx(DesktopDebugView* debug_view);
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user