power_off.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "power_off.h"
  2. #include <furi.h>
  3. #include <gui/elements.h>
  4. struct PowerOff {
  5. View* view;
  6. };
  7. typedef struct {
  8. PowerOffResponse response;
  9. uint32_t time_left_sec;
  10. } PowerOffModel;
  11. static void power_off_draw_callback(Canvas* canvas, void* _model) {
  12. furi_assert(_model);
  13. PowerOffModel* model = _model;
  14. char buff[32];
  15. canvas_set_color(canvas, ColorBlack);
  16. canvas_set_font(canvas, FontPrimary);
  17. canvas_draw_str_aligned(canvas, 64, 1, AlignCenter, AlignTop, "Battery low!");
  18. canvas_draw_icon(canvas, 0, 18, &I_BatteryBody_52x28);
  19. canvas_draw_icon(canvas, 16, 25, &I_FaceNopower_29x14);
  20. elements_bubble(canvas, 54, 17, 70, 30);
  21. canvas_set_font(canvas, FontSecondary);
  22. if(model->response == PowerOffResponseDefault) {
  23. snprintf(buff, sizeof(buff), "Charge me!\nOff in %lds!", model->time_left_sec);
  24. elements_multiline_text_aligned(canvas, 70, 23, AlignLeft, AlignTop, buff);
  25. elements_button_left(canvas, "Cancel");
  26. elements_button_center(canvas, "OK");
  27. elements_button_right(canvas, "Hide");
  28. } else {
  29. snprintf(buff, sizeof(buff), "Charge me!\nDont't forget!");
  30. elements_multiline_text_aligned(canvas, 70, 23, AlignLeft, AlignTop, buff);
  31. canvas_draw_str_aligned(canvas, 64, 60, AlignCenter, AlignBottom, "Hold a second...");
  32. }
  33. }
  34. static bool power_off_input_callback(InputEvent* event, void* context) {
  35. PowerOff* power_off = context;
  36. bool consumed = false;
  37. PowerOffModel* model = view_get_model(power_off->view);
  38. if(model->response == PowerOffResponseDefault && event->type == InputTypeShort) {
  39. if(event->key == InputKeyOk) {
  40. model->response = PowerOffResponseOk;
  41. consumed = true;
  42. } else if(event->key == InputKeyLeft) {
  43. model->response = PowerOffResponseCancel;
  44. consumed = true;
  45. } else if(event->key == InputKeyRight) {
  46. model->response = PowerOffResponseHide;
  47. consumed = true;
  48. }
  49. }
  50. view_commit_model(power_off->view, consumed);
  51. return true;
  52. }
  53. PowerOff* power_off_alloc() {
  54. PowerOff* power_off = malloc(sizeof(PowerOff));
  55. power_off->view = view_alloc();
  56. view_allocate_model(power_off->view, ViewModelTypeLocking, sizeof(PowerOffModel));
  57. view_set_context(power_off->view, power_off);
  58. view_set_draw_callback(power_off->view, power_off_draw_callback);
  59. view_set_input_callback(power_off->view, power_off_input_callback);
  60. return power_off;
  61. }
  62. void power_off_free(PowerOff* power_off) {
  63. furi_assert(power_off);
  64. view_free(power_off->view);
  65. free(power_off);
  66. }
  67. View* power_off_get_view(PowerOff* power_off) {
  68. furi_assert(power_off);
  69. return power_off->view;
  70. }
  71. void power_off_set_time_left(PowerOff* power_off, uint8_t time_left) {
  72. furi_assert(power_off);
  73. with_view_model(
  74. power_off->view, (PowerOffModel * model) {
  75. model->time_left_sec = time_left;
  76. return true;
  77. });
  78. }
  79. PowerOffResponse power_off_get_response(PowerOff* power_off) {
  80. furi_assert(power_off);
  81. PowerOffResponse response;
  82. with_view_model(
  83. power_off->view, (PowerOffModel * model) {
  84. response = model->response;
  85. return false;
  86. });
  87. return response;
  88. }