Skip to content

Commit 52cc11a

Browse files
authored
feat: display stats (#97)
1. A new feature to display statistics has been added. This includes the creation of new files `flipp_pomodoro_statistics.c` and `flipp_pomodoro_statistics.h` in the `modules` directory, and changes to `flipp_pomodoro_app.c` and `flipp_pomodoro_app.h` to incorporate the statistics functionality. 2. The `.vscode/settings.json` file has been updated with new entries. 3. The `flipp_pomodoro_app.c` file has been updated with new functions and modifications to existing ones to accommodate the new statistics feature. 4. New scenes have been added for displaying information and statistics, as seen in the `flipp_pomodoro_scene_info.c` and `flipp_pomodoro_scene_timer.c` files. 5. A new view `flipp_pomodoro_info_view.c` has been created to display the statistics and information. 6. An image file `flipp_pomodoro_learn_50x128.png` has been added to the `images` directory. 7. A new shell script `files-list.sh` has been added to the `tools` directory.
1 parent ddda80f commit 52cc11a

14 files changed

+434
-25
lines changed

flipp_pomodoro_app.c

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "flipp_pomodoro_app_i.h"
22

3+
#define TAG "FlippPomodoro"
4+
35
enum
46
{
57
CustomEventConsumed = true,
@@ -39,6 +41,9 @@ static bool flipp_pomodoro_app_custom_event_callback(void *ctx, uint32_t event)
3941
{
4042
// REGISTER a deed on work stage complete to get an acheivement
4143
dolphin_deed(DolphinDeedPluginGameWin);
44+
FURI_LOG_I(TAG, "Focus stage reward added");
45+
46+
flipp_pomodoro_statistics__increase_focus_stages_completed(app->statistics);
4247
};
4348

4449
flipp_pomodoro__toggle_stage(app->state);
@@ -63,6 +68,8 @@ FlippPomodoroApp *flipp_pomodoro_app_alloc()
6368
app->notification_app = furi_record_open(RECORD_NOTIFICATION);
6469

6570
app->view_dispatcher = view_dispatcher_alloc();
71+
app->statistics = flipp_pomodoro_statistics__new();
72+
6673
view_dispatcher_enable_queue(app->view_dispatcher);
6774
view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
6875
view_dispatcher_set_custom_event_callback(app->view_dispatcher, flipp_pomodoro_app_custom_event_callback);
@@ -71,23 +78,32 @@ FlippPomodoroApp *flipp_pomodoro_app_alloc()
7178
view_dispatcher_set_navigation_event_callback(app->view_dispatcher, flipp_pomodoro_app_back_event_callback);
7279

7380
app->timer_view = flipp_pomodoro_view_timer_alloc();
81+
app->info_view = flipp_pomodoro_info_view_alloc();
7482

7583
view_dispatcher_add_view(
7684
app->view_dispatcher,
7785
FlippPomodoroAppViewTimer,
7886
flipp_pomodoro_view_timer_get_view(app->timer_view));
7987

80-
scene_manager_next_scene(app->scene_manager, FlippPomodoroSceneTimer);
88+
view_dispatcher_add_view(
89+
app->view_dispatcher,
90+
FlippPomodoroAppViewInfo,
91+
flipp_pomodoro_info_view_get_view(app->info_view));
8192

93+
scene_manager_next_scene(app->scene_manager, FlippPomodoroSceneTimer);
94+
FURI_LOG_I(TAG, "Alloc complete");
8295
return app;
8396
};
8497

8598
void flipp_pomodoro_app_free(FlippPomodoroApp *app)
8699
{
87100
view_dispatcher_remove_view(app->view_dispatcher, FlippPomodoroAppViewTimer);
101+
view_dispatcher_remove_view(app->view_dispatcher, FlippPomodoroAppViewInfo);
88102
view_dispatcher_free(app->view_dispatcher);
89103
scene_manager_free(app->scene_manager);
90104
flipp_pomodoro_view_timer_free(app->timer_view);
105+
flipp_pomodoro_info_view_free(app->info_view);
106+
flipp_pomodoro_statistics__destroy(app->statistics);
91107
flipp_pomodoro__destroy(app->state);
92108
free(app);
93109
furi_record_close(RECORD_GUI);
@@ -97,8 +113,10 @@ void flipp_pomodoro_app_free(FlippPomodoroApp *app)
97113
int32_t flipp_pomodoro_app(void *p)
98114
{
99115
UNUSED(p);
116+
FURI_LOG_I(TAG, "Initial");
100117
FlippPomodoroApp *app = flipp_pomodoro_app_alloc();
101118

119+
FURI_LOG_I(TAG, "Run deed added");
102120
dolphin_deed(DolphinDeedPluginGameStart);
103121

104122
view_dispatcher_run(app->view_dispatcher);

flipp_pomodoro_app.h

+6
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
#include <gui/scene_manager.h>
88
#include <notification/notification_messages.h>
99
#include "views/flipp_pomodoro_timer_view.h"
10+
#include "views/flipp_pomodoro_info_view.h"
1011

1112
#include "modules/flipp_pomodoro.h"
13+
#include "modules/flipp_pomodoro_statistics.h"
1214

1315
typedef enum
1416
{
@@ -17,6 +19,7 @@ typedef enum
1719
FlippPomodoroAppCustomEventStageComplete, // By Expiration
1820
FlippPomodoroAppCustomEventTimerTick,
1921
FlippPomodoroAppCustomEventStateUpdated,
22+
FlippPomodoroAppCustomEventResumeTimer,
2023
} FlippPomodoroAppCustomEvent;
2124

2225
typedef struct
@@ -26,10 +29,13 @@ typedef struct
2629
Gui *gui;
2730
NotificationApp *notification_app;
2831
FlippPomodoroTimerView *timer_view;
32+
FlippPomodoroInfoView *info_view;
2933
FlippPomodoroState *state;
34+
FlippPomodoroStatistics *statistics;
3035
} FlippPomodoroApp;
3136

3237
typedef enum
3338
{
3439
FlippPomodoroAppViewTimer,
40+
FlippPomodoroAppViewInfo,
3541
} FlippPomodoroAppView;

flipp_pomodoro_app_i.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#define FURI_DEBUG 1
3+
// #define FURI_DEBUG 1
44

55
/**
66
* Index of dependencies for the main app
1.21 KB
Loading

modules/flipp_pomodoro.h

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ typedef enum
1414
/// @brief State of the pomodoro timer
1515
typedef struct
1616
{
17-
PomodoroStage stage;
1817
uint8_t current_stage_index;
1918
uint32_t started_at_timestamp;
2019
} FlippPomodoroState;

modules/flipp_pomodoro_statistics.c

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include "flipp_pomodoro_statistics.h"
2+
3+
FlippPomodoroStatistics *flipp_pomodoro_statistics__new()
4+
{
5+
FlippPomodoroStatistics *statistics = malloc(sizeof(FlippPomodoroStatistics));
6+
7+
statistics->focus_stages_completed = 0;
8+
9+
return statistics;
10+
}
11+
12+
// Return the number of completed focus stages
13+
uint8_t flipp_pomodoro_statistics__get_focus_stages_completed(FlippPomodoroStatistics *statistics)
14+
{
15+
return statistics->focus_stages_completed;
16+
}
17+
18+
// Increase the number of completed focus stages by one
19+
void flipp_pomodoro_statistics__increase_focus_stages_completed(FlippPomodoroStatistics *statistics)
20+
{
21+
statistics->focus_stages_completed++;
22+
}
23+
24+
void flipp_pomodoro_statistics__destroy(FlippPomodoroStatistics *statistics)
25+
{
26+
furi_assert(statistics);
27+
free(statistics);
28+
};

modules/flipp_pomodoro_statistics.h

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#pragma once
2+
#include <furi_hal.h>
3+
4+
/** @brief FlippPomodoroStatistics structure
5+
*
6+
* This structure is used to keep track of completed focus stages.
7+
*/
8+
typedef struct
9+
{
10+
uint8_t focus_stages_completed;
11+
} FlippPomodoroStatistics;
12+
13+
/** @brief Allocate and initialize a new FlippPomodoroStatistics
14+
*
15+
* This function allocates a new FlippPomodoroStatistics structure, initializes its members
16+
* and returns a pointer to it.
17+
*
18+
* @return A pointer to a new FlippPomodoroStatistics structure
19+
*/
20+
FlippPomodoroStatistics *flipp_pomodoro_statistics__new();
21+
22+
/** @brief Get the number of completed focus stages
23+
*
24+
* This function retrieves the number of completed focus stages in a FlippPomodoroStatistics structure.
25+
*
26+
* @param statistics A pointer to a FlippPomodoroStatistics structure
27+
* @return The number of completed focus stages
28+
*/
29+
uint8_t flipp_pomodoro_statistics__get_focus_stages_completed(FlippPomodoroStatistics *statistics);
30+
31+
/** @brief Increase the number of completed focus stages
32+
*
33+
* This function increases the count of the completed focus stages by one in a FlippPomodoroStatistics structure.
34+
*
35+
* @param statistics A pointer to a FlippPomodoroStatistics structure
36+
*/
37+
void flipp_pomodoro_statistics__increase_focus_stages_completed(FlippPomodoroStatistics *statistics);
38+
39+
/** @brief Free a FlippPomodoroStatistics structure
40+
*
41+
* This function frees the memory used by a FlippPomodoroStatistics structure.
42+
*
43+
* @param statistics A pointer to a FlippPomodoroStatistics structure
44+
*/
45+
void flipp_pomodoro_statistics__destroy(FlippPomodoroStatistics *state);
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
ADD_SCENE(flipp_pomodoro, info, Info)
12
ADD_SCENE(flipp_pomodoro, timer, Timer)

scenes/flipp_pomodoro_scene.h

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#pragma once
12
#include <gui/scene_manager.h>
23

34
// Generate scene id and total number

scenes/flipp_pomodoro_scene_info.c

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <furi.h>
2+
#include <gui/view_dispatcher.h>
3+
#include <gui/scene_manager.h>
4+
#include "flipp_pomodoro_scene.h"
5+
#include "../flipp_pomodoro_app.h"
6+
#include "../views/flipp_pomodoro_info_view.h"
7+
8+
enum
9+
{
10+
SceneEventConusmed = true,
11+
SceneEventNotConusmed = false
12+
};
13+
14+
void flipp_pomodoro_scene_info_on_back_to_timer(void *ctx)
15+
{
16+
furi_assert(ctx);
17+
FlippPomodoroApp *app = ctx;
18+
19+
view_dispatcher_send_custom_event(
20+
app->view_dispatcher,
21+
FlippPomodoroAppCustomEventResumeTimer);
22+
};
23+
24+
void flipp_pomodoro_scene_info_on_enter(void *ctx)
25+
{
26+
furi_assert(ctx);
27+
FlippPomodoroApp *app = ctx;
28+
29+
view_dispatcher_switch_to_view(app->view_dispatcher, FlippPomodoroAppViewInfo);
30+
flipp_pomodoro_info_view_set_pomodoros_completed(
31+
flipp_pomodoro_info_view_get_view(app->info_view),
32+
flipp_pomodoro_statistics__get_focus_stages_completed(app->statistics));
33+
flipp_pomodoro_info_view_set_mode(flipp_pomodoro_info_view_get_view(app->info_view), FlippPomodoroInfoViewModeStats);
34+
flipp_pomodoro_info_view_set_resume_timer_cb(app->info_view, flipp_pomodoro_scene_info_on_back_to_timer, app);
35+
};
36+
37+
void flipp_pomodoro_scene_info_handle_custom_event(FlippPomodoroApp *app, FlippPomodoroAppCustomEvent custom_event)
38+
{
39+
if (custom_event == FlippPomodoroAppCustomEventResumeTimer)
40+
{
41+
scene_manager_next_scene(app->scene_manager, FlippPomodoroSceneTimer);
42+
}
43+
};
44+
45+
bool flipp_pomodoro_scene_info_on_event(void *ctx, SceneManagerEvent event)
46+
{
47+
furi_assert(ctx);
48+
FlippPomodoroApp *app = ctx;
49+
50+
switch (event.type)
51+
{
52+
case SceneManagerEventTypeBack:
53+
view_dispatcher_stop(app->view_dispatcher);
54+
return SceneEventConusmed;
55+
case SceneManagerEventTypeCustom:
56+
flipp_pomodoro_scene_info_handle_custom_event(app, event.event);
57+
return SceneEventConusmed;
58+
default:
59+
break;
60+
};
61+
return SceneEventNotConusmed;
62+
};
63+
64+
void flipp_pomodoro_scene_info_on_exit(void *ctx)
65+
{
66+
UNUSED(ctx);
67+
};

scenes/flipp_pomodoro_scene_timer.c

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include <furi.h>
22
#include <gui/scene_manager.h>
33
#include <gui/view_dispatcher.h>
4+
#include <gui/scene_manager.h>
5+
#include "flipp_pomodoro_scene.h"
46
#include "../flipp_pomodoro_app.h"
57
#include "../views/flipp_pomodoro_timer_view.h"
68

@@ -10,8 +12,6 @@ enum
1012
SceneEventNotConusmed = false
1113
};
1214

13-
uint8_t ExitSignal = 0;
14-
1515
void flipp_pomodoro_scene_timer_sync_view_state(void *ctx)
1616
{
1717
furi_assert(ctx);
@@ -40,6 +40,12 @@ void flipp_pomodoro_scene_timer_on_enter(void *ctx)
4040

4141
FlippPomodoroApp *app = ctx;
4242

43+
if (flipp_pomodoro__is_stage_expired(app->state))
44+
{
45+
flipp_pomodoro__destroy(app->state);
46+
app->state = flipp_pomodoro__new();
47+
}
48+
4349
view_dispatcher_switch_to_view(app->view_dispatcher, FlippPomodoroAppViewTimer);
4450
flipp_pomodoro_scene_timer_sync_view_state(app);
4551
flipp_pomodoro_view_timer_set_on_right_cb(
@@ -76,7 +82,8 @@ bool flipp_pomodoro_scene_timer_on_event(void *ctx, SceneManagerEvent event)
7682
event.event);
7783
return SceneEventConusmed;
7884
case SceneManagerEventTypeBack:
79-
return ExitSignal;
85+
scene_manager_next_scene(app->scene_manager, FlippPomodoroSceneInfo);
86+
return SceneEventConusmed;
8087
default:
8188
break;
8289
};

0 commit comments

Comments
 (0)