From 091d7848216be4e70d4cea147fee5bacac291819 Mon Sep 17 00:00:00 2001 From: RogueMaster Date: Sun, 16 Oct 2022 00:04:16 -0400 Subject: [PATCH] new app --- ReadMe.md | 1 + applications/plugins/pomodoro/LICENSE | 121 +++++++++ applications/plugins/pomodoro/README.md | 34 +++ applications/plugins/pomodoro/application.fam | 14 + applications/plugins/pomodoro/misc/1.png | Bin 0 -> 12663 bytes applications/plugins/pomodoro/misc/2.png | Bin 0 -> 12446 bytes applications/plugins/pomodoro/misc/3.png | Bin 0 -> 12478 bytes applications/plugins/pomodoro/misc/4.png | Bin 0 -> 12896 bytes applications/plugins/pomodoro/misc/5.png | Bin 0 -> 12592 bytes applications/plugins/pomodoro/pomodoro.c | 164 ++++++++++++ applications/plugins/pomodoro/pomodoro.h | 34 +++ .../plugins/pomodoro/pomodoro_timer.c | 241 ++++++++++++++++++ .../plugins/pomodoro/pomodoro_timer.h | 33 +++ .../plugins/pomodoro/pomodoro_timer.png | Bin 0 -> 306 bytes .../plugins/pomodoro/views/pomodoro_10.c | 46 ++++ .../plugins/pomodoro/views/pomodoro_10.h | 10 + .../plugins/pomodoro/views/pomodoro_25.c | 46 ++++ .../plugins/pomodoro/views/pomodoro_25.h | 10 + .../plugins/pomodoro/views/pomodoro_50.c | 46 ++++ .../plugins/pomodoro/views/pomodoro_50.h | 10 + 20 files changed, 810 insertions(+) create mode 100644 applications/plugins/pomodoro/LICENSE create mode 100644 applications/plugins/pomodoro/README.md create mode 100644 applications/plugins/pomodoro/application.fam create mode 100644 applications/plugins/pomodoro/misc/1.png create mode 100644 applications/plugins/pomodoro/misc/2.png create mode 100644 applications/plugins/pomodoro/misc/3.png create mode 100644 applications/plugins/pomodoro/misc/4.png create mode 100644 applications/plugins/pomodoro/misc/5.png create mode 100644 applications/plugins/pomodoro/pomodoro.c create mode 100644 applications/plugins/pomodoro/pomodoro.h create mode 100644 applications/plugins/pomodoro/pomodoro_timer.c create mode 100644 applications/plugins/pomodoro/pomodoro_timer.h create mode 100644 applications/plugins/pomodoro/pomodoro_timer.png create mode 100644 applications/plugins/pomodoro/views/pomodoro_10.c create mode 100644 applications/plugins/pomodoro/views/pomodoro_10.h create mode 100644 applications/plugins/pomodoro/views/pomodoro_25.c create mode 100644 applications/plugins/pomodoro/views/pomodoro_25.h create mode 100644 applications/plugins/pomodoro/views/pomodoro_50.c create mode 100644 applications/plugins/pomodoro/views/pomodoro_50.h diff --git a/ReadMe.md b/ReadMe.md index d7b272ac7..d152e7af0 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -13,6 +13,7 @@ - Known Issues: `Chess` - Last Synced/Checked [Unleashed/xMasterX](https://github.com/DarkFlippers/unleashed-firmware), changes in [changelog](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/blob/420/CHANGELOG.md): `2022-10-14 20:25 GMT` - Last Synced/Checked [OFW](https://github.com/flipperdevices/flipperzero-firmware), changes in [commits](https://github.com/flipperdevices/flipperzero-firmware/commits/dev): `2022-10-14 20:25 GMT` +- Added: [Pomodoro Timer (By sbrin)](https://github.com/sbrin/flipperzero_pomodoro)
TO DO / REMOVED
diff --git a/applications/plugins/pomodoro/LICENSE b/applications/plugins/pomodoro/LICENSE new file mode 100644 index 000000000..0e259d42c --- /dev/null +++ b/applications/plugins/pomodoro/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/applications/plugins/pomodoro/README.md b/applications/plugins/pomodoro/README.md new file mode 100644 index 000000000..e8e7491f5 --- /dev/null +++ b/applications/plugins/pomodoro/README.md @@ -0,0 +1,34 @@ +# flipperzero_pomodoro + +The Pomodoro Technique is a time management method developed by Francesco Cirillo in the late 1980s.[1] It uses a kitchen timer to break work into intervals, typically 25 minutes in length, separated by short breaks. Each interval is known as a pomodoro, from the Italian word for tomato, after the tomato-shaped kitchen timer Cirillo used as a university student. + +Flipper Zero is a portable Tamagotchi-like multi-functional device developed for interaction with access control systems. The device is able to read, copy, and emulate radio-frequency (RFID) tags, radio remotes, and digital access keys. + +## Pomodoro timer application for Flipper Zero + +Three timers available: + +- classic 25 min work, 5 min rest +- long 50 min work, 10 min rest +- sprint 10 min work, 2 min rest + +With tomato counter + +Plays sound alerts + +Has built-in clocks + +Screenshots: + +![](./misc/1.png) + +![](./misc/2.png) + +![](./misc/3.png) + +![](./misc/4.png) + +![](./misc/5.png) + + +Compatible with firmware v. F81999EA from 14 Oct. 2022 diff --git a/applications/plugins/pomodoro/application.fam b/applications/plugins/pomodoro/application.fam new file mode 100644 index 000000000..5a8c4debb --- /dev/null +++ b/applications/plugins/pomodoro/application.fam @@ -0,0 +1,14 @@ +App( + appid="Pomodoro_Timer", + name="Pomodoro Timer", + apptype=FlipperAppType.EXTERNAL, + entry_point="pomodoro_app", + stack_size=1 * 1024, + cdefines=["APP_POMODORO"], + requires=[ + "gui", + ], + order=10, + fap_icon="pomodoro_timer.png", + fap_category="Tools", +) diff --git a/applications/plugins/pomodoro/misc/1.png b/applications/plugins/pomodoro/misc/1.png new file mode 100644 index 0000000000000000000000000000000000000000..e8543a2551e298c5885ed3305a4e5baf48a75ec7 GIT binary patch literal 12663 zcmY*=Wmp_t6XoFU?(Xgcf)6lAa00XqotvYgGq@A003}QKtLS;01*ZNASj_Dyz@E&Zvik@fWcj2834c^t^$6H#7=C4}WE`#K4brp;{LYY1V90Vcbx*aQd*8TwC9?1TV#$_RFk3aPK`mLNnO7hV zkuDOI9H=jH!TU0#3$nm0(RPuUzCW<7HHDcc5!g2J@)-pQ$zV;Tas|0~1iib_e+pMK zprIi>9n11;(9ncm<%FTDqg8Q>$jBw2E(s$nj<9-mMa|w$OIr1A zkc#Rm|52l^hlI<(ETt@E2r<*K#Xa;X!Z=ERNv2O=7Z>f~97~}LiagtNNR4w#o+R;T z=5+dMl2);7)7o!*va~fDqw^xIacLIFzbW6mKO)NpPUvJpLpHhiSa@U`LHasRmgd`~ zVr@A}`AEE@UBhPIXfHOpoJqrfswS;Xu8jF_Ru?rfxU12C`Hams)D>p1m@k);q+}CO zMHf?VusMYFlQ!9$O}%F@7Nqqh;hxAbfotl<9CEpwG=5c4CKf^oDC5?gV}Y{HmVL%t zIIT`?e$olILOWe0uI*CykxyL|%$Q3FPtiZio_GgMY2}-9%Rc>GYr^*cm925IllsXf zSHdO92Mi-M((Yz&`sum~c!S)u_#)GA6BqGquh2ejSryRth_6H#wcsg$Bo*{lK2sx{ zr&e$oPUlQY1urh(w-YOztaNE{!O>G!3G_#F0X>fFhC=>9*TMYw?a2EwHE$}wFEKyy zw6)m~l5ayrKn^sB9=boZuxkR;bU5HR?lOuZN=n5al$#^%rqQqI8#5H_&C=vss%Xo{ z@iT6v=y#T=CN`0{6iixJlOZ!`@F?dAsXx6RZbW9V%I63&>O)k_n{5Q&%Pw^Zl|!&z zdS%+wPCqUyI1s_QHZ(NX+k261=#+Jb5}4 zAzeLr>cYL*zWcZpjM1yU=52rmj$mx+SQUT43#w}>?Op>6!p$oX9* zf>{nuuYJ1JLV&6@I)p{!B^`m~`*(TOPuCRN!g>F#Xo-bDd#JLO!{EeokQ zNThtQZ>X<+oR?{gY~dq<**lT-{^)3vJ?0LeFrwqa2*#Va3*EoqiLdWm3{Ec%y7o<7 zgiPDB;&qyR@wRucIEX^K)8#2G1H_@L69aP}k?T1W={y((DaTblkpqR5%?)l?gQuf^ zee7t^_ zf?Is<5k8|3bn#_|c4{c#uhX>1BENdoiGlrtEA2LpwD~P8^i&~i37;iLuZ~IKWGr

% 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 literal 0 HcmV?d00001 diff --git a/applications/plugins/pomodoro/misc/2.png b/applications/plugins/pomodoro/misc/2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5f28476af84e6e11e7073715fd6b09b314dba6 GIT binary patch literal 12446 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 Tf1U8U;Q*lePD`;t-ZK1uGHKUp literal 0 HcmV?d00001 diff --git a/applications/plugins/pomodoro/misc/3.png b/applications/plugins/pomodoro/misc/3.png new file mode 100644 index 0000000000000000000000000000000000000000..32473be3cd88be74aa4910ddc84ede0274cc3117 GIT binary patch literal 12478 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 literal 0 HcmV?d00001 diff --git a/applications/plugins/pomodoro/misc/4.png b/applications/plugins/pomodoro/misc/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0b48b9fdc378d90cbb4c0889b71d656e49e72de2 GIT binary patch literal 12896 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 EKUuH0B>(^b literal 0 HcmV?d00001 diff --git a/applications/plugins/pomodoro/misc/5.png b/applications/plugins/pomodoro/misc/5.png new file mode 100644 index 0000000000000000000000000000000000000000..1a53bc074cd8d2a89bdd9b4bf7f171fab90c78a2 GIT binary patch literal 12592 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 O0-&LytNb!afBQe@_6_L( literal 0 HcmV?d00001 diff --git a/applications/plugins/pomodoro/pomodoro.c b/applications/plugins/pomodoro/pomodoro.c new file mode 100644 index 000000000..5b1db1984 --- /dev/null +++ b/applications/plugins/pomodoro/pomodoro.c @@ -0,0 +1,164 @@ +#include "pomodoro.h" +#include + +#define TAG "PomodoroApp" + +enum PomodoroDebugSubmenuIndex { + PomodoroSubmenuIndex10, + PomodoroSubmenuIndex25, + PomodoroSubmenuIndex50, +}; + +void pomodoro_submenu_callback(void* context, uint32_t index) { + furi_assert(context); + Pomodoro* app = context; + if(index == PomodoroSubmenuIndex10) { + app->view_id = PomodoroView10; + view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroView10); + } + if(index == PomodoroSubmenuIndex25) { + app->view_id = PomodoroView25; + view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroView25); + } + if(index == PomodoroSubmenuIndex50) { + app->view_id = PomodoroView50; + view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroView50); + } +} + +void pomodoro_dialog_callback(DialogExResult result, void* context) { + furi_assert(context); + Pomodoro* app = context; + if(result == DialogExResultLeft) { + view_dispatcher_stop(app->view_dispatcher); + } else if(result == DialogExResultRight) { + view_dispatcher_switch_to_view(app->view_dispatcher, app->view_id); // Show last view + } else if(result == DialogExResultCenter) { + view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroViewSubmenu); + } +} + +uint32_t pomodoro_exit_confirm_view(void* context) { + UNUSED(context); + return PomodoroViewExitConfirm; +} + +uint32_t pomodoro_exit(void* context) { + UNUSED(context); + return VIEW_NONE; +} + +Pomodoro* pomodoro_app_alloc() { + Pomodoro* app = malloc(sizeof(Pomodoro)); + + // Gui + app->gui = furi_record_open(RECORD_GUI); + + // Notifications + app->notifications = furi_record_open(RECORD_NOTIFICATION); + + // View dispatcher + app->view_dispatcher = view_dispatcher_alloc(); + view_dispatcher_enable_queue(app->view_dispatcher); + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + + // Submenu view + app->submenu = submenu_alloc(); + submenu_add_item( + app->submenu, + "Classic: 25 work 5 rest", + PomodoroSubmenuIndex25, + pomodoro_submenu_callback, + app); + submenu_add_item( + app->submenu, + "Long: 50 work 10 rest", + PomodoroSubmenuIndex50, + pomodoro_submenu_callback, + app); + submenu_add_item( + app->submenu, + "Sprint: 10 work 2 rest", + PomodoroSubmenuIndex10, + pomodoro_submenu_callback, + app); + view_set_previous_callback(submenu_get_view(app->submenu), pomodoro_exit); + view_dispatcher_add_view( + app->view_dispatcher, PomodoroViewSubmenu, submenu_get_view(app->submenu)); + + // Dialog view + app->dialog = dialog_ex_alloc(); + dialog_ex_set_result_callback(app->dialog, pomodoro_dialog_callback); + dialog_ex_set_context(app->dialog, app); + dialog_ex_set_left_button_text(app->dialog, "Exit"); + dialog_ex_set_right_button_text(app->dialog, "Stay"); + dialog_ex_set_center_button_text(app->dialog, "Menu"); + dialog_ex_set_header(app->dialog, "Close Current App?", 16, 12, AlignLeft, AlignTop); + view_dispatcher_add_view( + app->view_dispatcher, PomodoroViewExitConfirm, dialog_ex_get_view(app->dialog)); + + // 25 minutes view + app->pomodoro_25 = pomodoro_25_alloc(); + view_set_previous_callback(pomodoro_25_get_view(app->pomodoro_25), pomodoro_exit_confirm_view); + view_dispatcher_add_view( + app->view_dispatcher, PomodoroView25, pomodoro_25_get_view(app->pomodoro_25)); + + // 50 minutes view + app->pomodoro_50 = pomodoro_50_alloc(); + view_set_previous_callback(pomodoro_50_get_view(app->pomodoro_50), pomodoro_exit_confirm_view); + view_dispatcher_add_view( + app->view_dispatcher, PomodoroView50, pomodoro_50_get_view(app->pomodoro_50)); + + // 10 minutes view + app->pomodoro_10 = pomodoro_10_alloc(); + view_set_previous_callback(pomodoro_10_get_view(app->pomodoro_10), pomodoro_exit_confirm_view); + view_dispatcher_add_view( + app->view_dispatcher, PomodoroView10, pomodoro_10_get_view(app->pomodoro_10)); + + // TODO switch to menu after Media is done + app->view_id = PomodoroViewSubmenu; + view_dispatcher_switch_to_view(app->view_dispatcher, app->view_id); + + return app; +} + +void pomodoro_app_free(Pomodoro* app) { + furi_assert(app); + + // Reset notification + notification_internal_message(app->notifications, &sequence_reset_blue); + + // Free views + view_dispatcher_remove_view(app->view_dispatcher, PomodoroViewSubmenu); + submenu_free(app->submenu); + view_dispatcher_remove_view(app->view_dispatcher, PomodoroViewExitConfirm); + dialog_ex_free(app->dialog); + view_dispatcher_remove_view(app->view_dispatcher, PomodoroView25); + pomodoro_25_free(app->pomodoro_25); + view_dispatcher_remove_view(app->view_dispatcher, PomodoroView50); + pomodoro_50_free(app->pomodoro_50); + view_dispatcher_remove_view(app->view_dispatcher, PomodoroView10); + pomodoro_10_free(app->pomodoro_10); + view_dispatcher_free(app->view_dispatcher); + + // Close records + furi_record_close(RECORD_GUI); + app->gui = NULL; + furi_record_close(RECORD_NOTIFICATION); + app->notifications = NULL; + + // Free rest + free(app); +} + +int32_t pomodoro_app(void* p) { + UNUSED(p); + // Switch profile to Hid + Pomodoro* app = pomodoro_app_alloc(); + + view_dispatcher_run(app->view_dispatcher); + + pomodoro_app_free(app); + + return 0; +} diff --git a/applications/plugins/pomodoro/pomodoro.h b/applications/plugins/pomodoro/pomodoro.h new file mode 100644 index 000000000..53dedb8e3 --- /dev/null +++ b/applications/plugins/pomodoro/pomodoro.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include "pomodoro_timer.h" +#include "views/pomodoro_10.h" +#include "views/pomodoro_25.h" +#include "views/pomodoro_50.h" + +typedef struct { + Gui* gui; + NotificationApp* notifications; + ViewDispatcher* view_dispatcher; + Submenu* submenu; + DialogEx* dialog; + PomodoroTimer* pomodoro_10; + PomodoroTimer* pomodoro_25; + PomodoroTimer* pomodoro_50; + uint32_t view_id; +} Pomodoro; + +typedef enum { + PomodoroViewSubmenu, + PomodoroView10, + PomodoroView25, + PomodoroView50, + PomodoroViewExitConfirm, +} PomodoroView; diff --git a/applications/plugins/pomodoro/pomodoro_timer.c b/applications/plugins/pomodoro/pomodoro_timer.c new file mode 100644 index 000000000..4937e987c --- /dev/null +++ b/applications/plugins/pomodoro/pomodoro_timer.c @@ -0,0 +1,241 @@ +#include "pomodoro_timer.h" +#include +#include +#include +#include + +const NotificationSequence sequence_finish = { + &message_display_backlight_on, + &message_green_255, + &message_vibro_on, + &message_note_c5, + &message_delay_100, + &message_vibro_off, + &message_vibro_on, + &message_note_e5, + &message_delay_100, + &message_vibro_off, + &message_vibro_on, + &message_note_g5, + &message_delay_100, + &message_vibro_off, + &message_vibro_on, + &message_note_b5, + &message_delay_250, + &message_vibro_off, + &message_vibro_on, + &message_note_c6, + &message_delay_250, + &message_vibro_off, + &message_sound_off, + NULL, +}; + +const NotificationSequence sequence_rest = { + &message_display_backlight_on, + &message_red_255, + &message_vibro_on, + &message_note_c6, + &message_delay_100, + &message_vibro_off, + &message_vibro_on, + &message_note_b5, + &message_delay_100, + &message_vibro_off, + &message_vibro_on, + &message_note_g5, + &message_delay_100, + &message_vibro_off, + &message_vibro_on, + &message_note_e5, + &message_delay_100, + &message_vibro_off, + &message_vibro_on, + &message_note_c5, + &message_delay_250, + &message_vibro_off, + &message_sound_off, + NULL, +}; + +void pomodoro_timer_process(PomodoroTimer* pomodoro_timer, InputEvent* event) { + with_view_model( + pomodoro_timer->view, + PomodoroTimerModel * model, + { + if(event->type == InputTypePress) { + if(event->key == InputKeyOk) { + model->ok_pressed = true; + } else if(event->key == InputKeyLeft) { + model->reset_pressed = true; + } else if(event->key == InputKeyBack) { + model->back_pressed = true; + } + } else if(event->type == InputTypeRelease) { + if(event->key == InputKeyOk) { + model->ok_pressed = false; + + // START/STOP TIMER + FuriHalRtcDateTime curr_dt; + furi_hal_rtc_get_datetime(&curr_dt); + uint32_t current_timestamp = furi_hal_rtc_datetime_to_timestamp(&curr_dt); + + // STARTED -> PAUSED + if(model->timer_running) { + // Update stopped seconds + model->timer_stopped_seconds = + current_timestamp - model->timer_start_timestamp; + } else if(!model->time_passed) { + // INITIAL -> STARTED + model->timer_start_timestamp = current_timestamp; + model->rest_running = false; + } else { + // PAUSED -> STARTED + model->timer_start_timestamp = + current_timestamp - model->timer_stopped_seconds; + } + model->timer_running = !model->timer_running; + } else if(event->key == InputKeyLeft) { + if(!model->timer_running) { + furi_record_close(RECORD_NOTIFICATION); + model->timer_stopped_seconds = 0; + model->timer_start_timestamp = 0; + model->time_passed = 0; + model->timer_running = false; + } + model->reset_pressed = false; + } else if(event->key == InputKeyBack) { + model->back_pressed = false; + } + } + }, + true); +} + +void pomodoro_draw_callback(Canvas* canvas, void* context, int max_seconds, int max_seconds_rest) { + furi_assert(context); + PomodoroTimerModel* model = context; + FuriHalRtcDateTime curr_dt; + furi_hal_rtc_get_datetime(&curr_dt); + uint32_t current_timestamp = furi_hal_rtc_datetime_to_timestamp(&curr_dt); + + // Header + canvas_set_font(canvas, FontPrimary); + elements_multiline_text_aligned(canvas, 0, 0, AlignLeft, AlignTop, "Pomodoro"); + + canvas_draw_icon(canvas, 68, 1, &I_Pin_back_arrow_10x8); + canvas_set_font(canvas, FontSecondary); + elements_multiline_text_aligned(canvas, 127, 1, AlignRight, AlignTop, "Hold to exit"); + + // Start/Pause/Continue + int txt_main_y = 34; + canvas_draw_icon(canvas, 63, 23, &I_Space_65x18); // button + if(model->ok_pressed) { + elements_slightly_rounded_box(canvas, 66, 25, 60, 13); + canvas_set_color(canvas, ColorWhite); + } + if(model->timer_running) { + model->time_passed = current_timestamp - model->timer_start_timestamp; + elements_multiline_text_aligned(canvas, 83, txt_main_y, AlignLeft, AlignBottom, "Pause"); + canvas_draw_box(canvas, 71, 27, 2, 8); + canvas_draw_box(canvas, 75, 27, 2, 8); + } else { + if(model->time_passed) { + elements_multiline_text_aligned( + canvas, 83, txt_main_y, AlignLeft, AlignBottom, "Continue"); + } else { + elements_multiline_text_aligned( + canvas, 83, txt_main_y, AlignLeft, AlignBottom, "Start"); + } + canvas_draw_icon(canvas, 70, 26, &I_Ok_btn_9x9); // OK icon + } + canvas_set_color(canvas, ColorBlack); + + // Reset + if(!model->timer_running && model->time_passed) { + canvas_draw_icon(canvas, 63, 46, &I_Space_65x18); + if(model->reset_pressed) { + elements_slightly_rounded_box(canvas, 66, 48, 60, 13); + canvas_set_color(canvas, ColorWhite); + } + canvas_draw_icon(canvas, 72, 50, &I_ButtonLeft_4x7); + elements_multiline_text_aligned(canvas, 83, 57, AlignLeft, AlignBottom, "Reset"); + canvas_set_color(canvas, ColorBlack); + } + + char buffer[64]; + + // Time to work + int total_time_left = (max_seconds - (uint32_t)model->time_passed); + int minutes_left = total_time_left / 60; + int seconds_left = total_time_left % 60; + canvas_set_font(canvas, FontBigNumbers); + + // Play sound + if(total_time_left == 0 && !model->sound_playing) { + model->sound_playing = true; + notification_message(furi_record_open(RECORD_NOTIFICATION), &sequence_finish); + } + if(total_time_left < 0) { + model->timer_running = false; + model->time_passed = 0; + model->sound_playing = false; + + model->rest_running = true; + model->rest_start_timestamp = current_timestamp; + seconds_left = 0; + model->counter += 1; + } + if(!model->rest_running) { + snprintf(buffer, sizeof(buffer), "%02d:%02d", minutes_left, seconds_left); + canvas_draw_str(canvas, 0, 39, buffer); + } + if(model->timer_running) { + canvas_set_font(canvas, FontPrimary); + elements_multiline_text_aligned(canvas, 0, 50, AlignLeft, AlignTop, "Time to work"); + } + + // Time to rest + if(model->rest_running && !model->timer_running) { + canvas_set_font(canvas, FontBigNumbers); + int rest_passed = current_timestamp - model->rest_start_timestamp; + int rest_total_time_left = (max_seconds_rest - rest_passed); + int rest_minutes_left = rest_total_time_left / 60; + int rest_seconds_left = rest_total_time_left % 60; + + // Play sound + if(rest_total_time_left == 0 && !model->sound_playing) { + model->sound_playing = true; + notification_message(furi_record_open(RECORD_NOTIFICATION), &sequence_rest); + } + if(rest_total_time_left < 0) { + rest_seconds_left = 0; + model->rest_running = false; + model->sound_playing = false; + } + snprintf(buffer, sizeof(buffer), "%02d:%02d", rest_minutes_left, rest_seconds_left); + canvas_draw_str(canvas, 0, 60, buffer); + + canvas_set_font(canvas, FontPrimary); + elements_multiline_text_aligned(canvas, 0, 27, AlignLeft, AlignTop, "Have a rest"); + } + + // Clocks + canvas_set_font(canvas, FontSecondary); + snprintf( + buffer, + sizeof(buffer), + "%02ld:%02ld:%02ld", + ((uint32_t)current_timestamp % (60 * 60 * 24)) / (60 * 60), + ((uint32_t)current_timestamp % (60 * 60)) / 60, + (uint32_t)current_timestamp % 60); + canvas_draw_str(canvas, 0, 20, buffer); + + // Tomato counter + if(model->counter > 5) { + model->counter = 1; + } + for(int i = 0; i < model->counter; ++i) { + canvas_draw_disc(canvas, 122 - i * 10, 15, 4); + } +} diff --git a/applications/plugins/pomodoro/pomodoro_timer.h b/applications/plugins/pomodoro/pomodoro_timer.h new file mode 100644 index 000000000..284f0a6c6 --- /dev/null +++ b/applications/plugins/pomodoro/pomodoro_timer.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include +#include + +typedef struct PomodoroTimer PomodoroTimer; + +struct PomodoroTimer { + View* view; +}; + +typedef struct PomodoroTimerModel PomodoroTimerModel; + +struct PomodoroTimerModel { + bool ok_pressed; + bool reset_pressed; + bool back_pressed; + bool connected; + bool timer_running; + bool rest_running; + bool sound_playing; + uint32_t timer_start_timestamp; + uint32_t timer_stopped_seconds; + uint32_t time_passed; + uint32_t rest_start_timestamp; + int counter; +}; + +void pomodoro_timer_process(PomodoroTimer* pomodoro_timer, InputEvent* event); + +void pomodoro_draw_callback(Canvas* canvas, void* context, int max_seconds, int max_seconds_rest); diff --git a/applications/plugins/pomodoro/pomodoro_timer.png b/applications/plugins/pomodoro/pomodoro_timer.png new file mode 100644 index 0000000000000000000000000000000000000000..b25c2718e0e6e84fa1c074e48b432c16cd0215f9 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>aY>EvO!M_+ z&;qhK7#Q0#8CXC{fLIEM85o!sFfuR$X-1IP0w%aD*8*k)8>G;>V#ik?C6npm9|EMA zKw?0^3d9;v8pKX5;9)5Q(uSTcjv*SNNk95oBqSvMDJQF}{Lf>+=fP;@AjW)p5yyhe zhLen$A(JosRETy+a?u94>i_?)x=pWv40Dj?*gi%s1_KVJzyFs@d$Dg*I295!Y1!!= zx9>dC&JnI|v9S1ec~ORfMT2wLn$P8%C# +#include +#include +#include + +static void pomodoro_10_draw_callback(Canvas* canvas, void* context) { + int max_seconds = 60 * 10; + int max_seconds_rest = 60 * 2; + pomodoro_draw_callback(canvas, context, max_seconds, max_seconds_rest); +} + +static bool pomodoro_10_input_callback(InputEvent* event, void* context) { + furi_assert(context); + PomodoroTimer* pomodoro_10 = context; + + if(event->type == InputTypeLong && event->key == InputKeyBack) { + return false; + } else { + pomodoro_timer_process(pomodoro_10, event); + return true; + } +} + +PomodoroTimer* pomodoro_10_alloc() { + PomodoroTimer* pomodoro_10 = malloc(sizeof(PomodoroTimer)); + pomodoro_10->view = view_alloc(); + view_set_context(pomodoro_10->view, pomodoro_10); + view_allocate_model(pomodoro_10->view, ViewModelTypeLocking, sizeof(PomodoroTimerModel)); + view_set_draw_callback(pomodoro_10->view, pomodoro_10_draw_callback); + view_set_input_callback(pomodoro_10->view, pomodoro_10_input_callback); + + return pomodoro_10; +} + +void pomodoro_10_free(PomodoroTimer* pomodoro_10) { + furi_assert(pomodoro_10); + view_free(pomodoro_10->view); + free(pomodoro_10); +} + +View* pomodoro_10_get_view(PomodoroTimer* pomodoro_10) { + furi_assert(pomodoro_10); + return pomodoro_10->view; +} diff --git a/applications/plugins/pomodoro/views/pomodoro_10.h b/applications/plugins/pomodoro/views/pomodoro_10.h new file mode 100644 index 000000000..8f27e6bd6 --- /dev/null +++ b/applications/plugins/pomodoro/views/pomodoro_10.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "../pomodoro_timer.h" + +PomodoroTimer* pomodoro_10_alloc(); + +void pomodoro_10_free(PomodoroTimer* pomodoro_10); + +View* pomodoro_10_get_view(PomodoroTimer* pomodoro_10); diff --git a/applications/plugins/pomodoro/views/pomodoro_25.c b/applications/plugins/pomodoro/views/pomodoro_25.c new file mode 100644 index 000000000..01c5a7125 --- /dev/null +++ b/applications/plugins/pomodoro/views/pomodoro_25.c @@ -0,0 +1,46 @@ +#include "../pomodoro_timer.h" +#include "pomodoro_25.h" +#include +#include +#include +#include + +static void pomodoro_25_draw_callback(Canvas* canvas, void* context) { + int max_seconds = 60 * 25; + int max_seconds_rest = 60 * 5; + pomodoro_draw_callback(canvas, context, max_seconds, max_seconds_rest); +} + +static bool pomodoro_25_input_callback(InputEvent* event, void* context) { + furi_assert(context); + PomodoroTimer* pomodoro_25 = context; + + if(event->type == InputTypeLong && event->key == InputKeyBack) { + return false; + } else { + pomodoro_timer_process(pomodoro_25, event); + return true; + } +} + +PomodoroTimer* pomodoro_25_alloc() { + PomodoroTimer* pomodoro_25 = malloc(sizeof(PomodoroTimer)); + pomodoro_25->view = view_alloc(); + view_set_context(pomodoro_25->view, pomodoro_25); + view_allocate_model(pomodoro_25->view, ViewModelTypeLocking, sizeof(PomodoroTimerModel)); + view_set_draw_callback(pomodoro_25->view, pomodoro_25_draw_callback); + view_set_input_callback(pomodoro_25->view, pomodoro_25_input_callback); + + return pomodoro_25; +} + +void pomodoro_25_free(PomodoroTimer* pomodoro_25) { + furi_assert(pomodoro_25); + view_free(pomodoro_25->view); + free(pomodoro_25); +} + +View* pomodoro_25_get_view(PomodoroTimer* pomodoro_25) { + furi_assert(pomodoro_25); + return pomodoro_25->view; +} diff --git a/applications/plugins/pomodoro/views/pomodoro_25.h b/applications/plugins/pomodoro/views/pomodoro_25.h new file mode 100644 index 000000000..c3eb43976 --- /dev/null +++ b/applications/plugins/pomodoro/views/pomodoro_25.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "../pomodoro_timer.h" + +PomodoroTimer* pomodoro_25_alloc(); + +void pomodoro_25_free(PomodoroTimer* pomodoro_25); + +View* pomodoro_25_get_view(PomodoroTimer* pomodoro_25); diff --git a/applications/plugins/pomodoro/views/pomodoro_50.c b/applications/plugins/pomodoro/views/pomodoro_50.c new file mode 100644 index 000000000..74f89122a --- /dev/null +++ b/applications/plugins/pomodoro/views/pomodoro_50.c @@ -0,0 +1,46 @@ +#include "../pomodoro_timer.h" +#include "pomodoro_50.h" +#include +#include +#include +#include + +static void pomodoro_50_draw_callback(Canvas* canvas, void* context) { + int max_seconds = 60 * 50; + int max_seconds_rest = 60 * 10; + pomodoro_draw_callback(canvas, context, max_seconds, max_seconds_rest); +} + +static bool pomodoro_50_input_callback(InputEvent* event, void* context) { + furi_assert(context); + PomodoroTimer* pomodoro_50 = context; + + if(event->type == InputTypeLong && event->key == InputKeyBack) { + return false; + } else { + pomodoro_timer_process(pomodoro_50, event); + return true; + } +} + +PomodoroTimer* pomodoro_50_alloc() { + PomodoroTimer* pomodoro_50 = malloc(sizeof(PomodoroTimer)); + pomodoro_50->view = view_alloc(); + view_set_context(pomodoro_50->view, pomodoro_50); + view_allocate_model(pomodoro_50->view, ViewModelTypeLocking, sizeof(PomodoroTimerModel)); + view_set_draw_callback(pomodoro_50->view, pomodoro_50_draw_callback); + view_set_input_callback(pomodoro_50->view, pomodoro_50_input_callback); + + return pomodoro_50; +} + +void pomodoro_50_free(PomodoroTimer* pomodoro_50) { + furi_assert(pomodoro_50); + view_free(pomodoro_50->view); + free(pomodoro_50); +} + +View* pomodoro_50_get_view(PomodoroTimer* pomodoro_50) { + furi_assert(pomodoro_50); + return pomodoro_50->view; +} diff --git a/applications/plugins/pomodoro/views/pomodoro_50.h b/applications/plugins/pomodoro/views/pomodoro_50.h new file mode 100644 index 000000000..e0246d2d2 --- /dev/null +++ b/applications/plugins/pomodoro/views/pomodoro_50.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "../pomodoro_timer.h" + +PomodoroTimer* pomodoro_50_alloc(); + +void pomodoro_50_free(PomodoroTimer* pomodoro_50); + +View* pomodoro_50_get_view(PomodoroTimer* pomodoro_50);