weather_station_receiver_info.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "weather_station_receiver.h"
  2. #include "../weather_station_app_i.h"
  3. #include "weather_station_icons.h"
  4. #include "../protocols/ws_generic.h"
  5. #include <input/input.h>
  6. #include <gui/elements.h>
  7. #include "math.h"
  8. #define abs(x) ((x) > 0 ? (x) : -(x))
  9. struct WSReceiverInfo {
  10. View* view;
  11. };
  12. typedef struct {
  13. FuriString* protocol_name;
  14. WSBlockGeneric* generic;
  15. } WSReceiverInfoModel;
  16. void ws_view_receiver_info_update(WSReceiverInfo* ws_receiver_info, FlipperFormat* fff) {
  17. furi_assert(ws_receiver_info);
  18. furi_assert(fff);
  19. with_view_model(
  20. ws_receiver_info->view,
  21. WSReceiverInfoModel * model,
  22. {
  23. flipper_format_rewind(fff);
  24. flipper_format_read_string(fff, "Protocol", model->protocol_name);
  25. ws_block_generic_deserialize(model->generic, fff);
  26. },
  27. true);
  28. }
  29. void ws_view_receiver_info_draw(Canvas* canvas, WSReceiverInfoModel* model) {
  30. char buffer[64];
  31. canvas_clear(canvas);
  32. canvas_set_color(canvas, ColorBlack);
  33. canvas_set_font(canvas, FontSecondary);
  34. snprintf(
  35. buffer,
  36. sizeof(buffer),
  37. "%s %db",
  38. furi_string_get_cstr(model->protocol_name),
  39. model->generic->data_count_bit);
  40. canvas_draw_str(canvas, 5, 8, buffer);
  41. snprintf(buffer, sizeof(buffer), "Ch: %01d", model->generic->channel);
  42. canvas_draw_str(canvas, 105, 8, buffer);
  43. snprintf(buffer, sizeof(buffer), "Sn: 0x%02lX", model->generic->id);
  44. canvas_draw_str(canvas, 5, 20, buffer);
  45. snprintf(buffer, sizeof(buffer), "Batt: %s", (!model->generic->battery_low ? "ok" : "low"));
  46. canvas_draw_str(canvas, 85, 20, buffer);
  47. snprintf(buffer, sizeof(buffer), "Data: 0x%llX", model->generic->data);
  48. canvas_draw_str(canvas, 5, 32, buffer);
  49. elements_bold_rounded_frame(canvas, 2, 37, 123, 25);
  50. canvas_set_font(canvas, FontPrimary);
  51. canvas_draw_icon(canvas, 13 + 5, 42, &I_Therm_7x16);
  52. snprintf(
  53. buffer,
  54. sizeof(buffer),
  55. "%3.2d.%d C",
  56. (int16_t)model->generic->temp,
  57. abs(((int16_t)(model->generic->temp * 10) - (((int16_t)model->generic->temp) * 10))));
  58. canvas_draw_str_aligned(canvas, 58 + 5, 46, AlignRight, AlignTop, buffer);
  59. canvas_draw_circle(canvas, 50 + 5, 45, 1);
  60. canvas_draw_icon(canvas, 70 + 5, 42, &I_Humid_10x15);
  61. snprintf(buffer, sizeof(buffer), "%d%%", model->generic->humidity);
  62. canvas_draw_str(canvas, 86 + 5, 54, buffer);
  63. }
  64. bool ws_view_receiver_info_input(InputEvent* event, void* context) {
  65. furi_assert(context);
  66. //WSReceiverInfo* ws_receiver_info = context;
  67. if(event->key == InputKeyBack) {
  68. return false;
  69. }
  70. return true;
  71. }
  72. void ws_view_receiver_info_enter(void* context) {
  73. furi_assert(context);
  74. }
  75. void ws_view_receiver_info_exit(void* context) {
  76. furi_assert(context);
  77. WSReceiverInfo* ws_receiver_info = context;
  78. with_view_model(
  79. ws_receiver_info->view,
  80. WSReceiverInfoModel * model,
  81. { furi_string_reset(model->protocol_name); },
  82. false);
  83. }
  84. WSReceiverInfo* ws_view_receiver_info_alloc() {
  85. WSReceiverInfo* ws_receiver_info = malloc(sizeof(WSReceiverInfo));
  86. // View allocation and configuration
  87. ws_receiver_info->view = view_alloc();
  88. view_allocate_model(ws_receiver_info->view, ViewModelTypeLocking, sizeof(WSReceiverInfoModel));
  89. view_set_context(ws_receiver_info->view, ws_receiver_info);
  90. view_set_draw_callback(ws_receiver_info->view, (ViewDrawCallback)ws_view_receiver_info_draw);
  91. view_set_input_callback(ws_receiver_info->view, ws_view_receiver_info_input);
  92. view_set_enter_callback(ws_receiver_info->view, ws_view_receiver_info_enter);
  93. view_set_exit_callback(ws_receiver_info->view, ws_view_receiver_info_exit);
  94. with_view_model(
  95. ws_receiver_info->view,
  96. WSReceiverInfoModel * model,
  97. {
  98. model->generic = malloc(sizeof(WSBlockGeneric));
  99. model->protocol_name = furi_string_alloc();
  100. },
  101. true);
  102. return ws_receiver_info;
  103. }
  104. void ws_view_receiver_info_free(WSReceiverInfo* ws_receiver_info) {
  105. furi_assert(ws_receiver_info);
  106. with_view_model(
  107. ws_receiver_info->view,
  108. WSReceiverInfoModel * model,
  109. {
  110. furi_string_free(model->protocol_name);
  111. free(model->generic);
  112. },
  113. false);
  114. view_free(ws_receiver_info->view);
  115. free(ws_receiver_info);
  116. }
  117. View* ws_view_receiver_info_get_view(WSReceiverInfo* ws_receiver_info) {
  118. furi_assert(ws_receiver_info);
  119. return ws_receiver_info->view;
  120. }