lfrfid-view-tune-vm.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "lfrfid-view-tune-vm.h"
  2. #include <callback-connector.h>
  3. #include <gui/elements.h>
  4. struct LfRfidViewTuneVMModel {
  5. bool dirty;
  6. bool fine;
  7. uint32_t ARR;
  8. uint32_t CCR;
  9. int pos;
  10. };
  11. void LfRfidViewTuneVM::view_draw_callback(Canvas* canvas, void* _model) {
  12. LfRfidViewTuneVMModel* model = reinterpret_cast<LfRfidViewTuneVMModel*>(_model);
  13. canvas_clear(canvas);
  14. canvas_set_color(canvas, ColorBlack);
  15. if(model->fine) {
  16. canvas_draw_box(
  17. canvas,
  18. 128 - canvas_string_width(canvas, "Fine") - 4,
  19. 0,
  20. canvas_string_width(canvas, "Fine") + 4,
  21. canvas_current_font_height(canvas) + 1);
  22. canvas_set_color(canvas, ColorWhite);
  23. }
  24. canvas_draw_str_aligned(canvas, 128 - 2, 2, AlignRight, AlignTop, "Fine");
  25. canvas_set_color(canvas, ColorBlack);
  26. constexpr uint8_t buffer_size = 128;
  27. char buffer[buffer_size + 1];
  28. snprintf(
  29. buffer,
  30. buffer_size,
  31. "%sARR: %lu\n"
  32. "freq = %.4f\n"
  33. "%sCCR: %lu\n"
  34. "duty = %.4f",
  35. model->pos == 0 ? ">" : "",
  36. model->ARR,
  37. (float)SystemCoreClock / ((float)model->ARR + 1),
  38. model->pos == 1 ? ">" : "",
  39. model->CCR,
  40. ((float)model->CCR + 1) / ((float)model->ARR + 1) * 100.0f);
  41. elements_multiline_text_aligned(canvas, 2, 2, AlignLeft, AlignTop, buffer);
  42. }
  43. bool LfRfidViewTuneVM::view_input_callback(InputEvent* event, void* context) {
  44. LfRfidViewTuneVM* _this = reinterpret_cast<LfRfidViewTuneVM*>(context);
  45. bool consumed = false;
  46. // Process key presses only
  47. if(event->type == InputTypeShort || event->type == InputTypeRepeat) {
  48. consumed = true;
  49. switch(event->key) {
  50. case InputKeyLeft:
  51. _this->button_left();
  52. break;
  53. case InputKeyRight:
  54. _this->button_right();
  55. break;
  56. case InputKeyUp:
  57. _this->button_up();
  58. break;
  59. case InputKeyDown:
  60. _this->button_down();
  61. break;
  62. case InputKeyOk:
  63. _this->button_ok();
  64. break;
  65. default:
  66. consumed = false;
  67. break;
  68. }
  69. }
  70. return consumed;
  71. }
  72. void LfRfidViewTuneVM::button_up() {
  73. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  74. if(model->pos > 0) model->pos--;
  75. return true;
  76. });
  77. }
  78. void LfRfidViewTuneVM::button_down() {
  79. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  80. if(model->pos < 1) model->pos++;
  81. return true;
  82. });
  83. }
  84. void LfRfidViewTuneVM::button_left() {
  85. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  86. if(model->pos == 0) {
  87. if(model->fine) {
  88. model->ARR -= 1;
  89. } else {
  90. model->ARR -= 10;
  91. }
  92. } else if(model->pos == 1) {
  93. if(model->fine) {
  94. model->CCR -= 1;
  95. } else {
  96. model->CCR -= 10;
  97. }
  98. }
  99. model->dirty = true;
  100. return true;
  101. });
  102. }
  103. void LfRfidViewTuneVM::button_right() {
  104. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  105. if(model->pos == 0) {
  106. if(model->fine) {
  107. model->ARR += 1;
  108. } else {
  109. model->ARR += 10;
  110. }
  111. } else if(model->pos == 1) {
  112. if(model->fine) {
  113. model->CCR += 1;
  114. } else {
  115. model->CCR += 10;
  116. }
  117. }
  118. model->dirty = true;
  119. return true;
  120. });
  121. }
  122. void LfRfidViewTuneVM::button_ok() {
  123. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  124. model->fine = !model->fine;
  125. return true;
  126. });
  127. }
  128. LfRfidViewTuneVM::LfRfidViewTuneVM() {
  129. view = view_alloc();
  130. view_set_context(view, this);
  131. view_allocate_model(view, ViewModelTypeLocking, sizeof(LfRfidViewTuneVMModel));
  132. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  133. model->dirty = true;
  134. model->fine = false;
  135. model->ARR = 511;
  136. model->CCR = 255;
  137. model->pos = 0;
  138. return true;
  139. });
  140. view_set_draw_callback(
  141. view, cbc::obtain_connector(this, &LfRfidViewTuneVM::view_draw_callback));
  142. view_set_input_callback(
  143. view, cbc::obtain_connector(this, &LfRfidViewTuneVM::view_input_callback));
  144. }
  145. LfRfidViewTuneVM::~LfRfidViewTuneVM() {
  146. view_free(view);
  147. }
  148. View* LfRfidViewTuneVM::get_view() {
  149. return view;
  150. }
  151. void LfRfidViewTuneVM::clean() {
  152. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  153. model->dirty = true;
  154. model->fine = false;
  155. model->ARR = 511;
  156. model->CCR = 255;
  157. model->pos = 0;
  158. return true;
  159. });
  160. }
  161. bool LfRfidViewTuneVM::is_dirty() {
  162. bool result;
  163. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  164. result = model->dirty;
  165. model->dirty = false;
  166. return false;
  167. });
  168. return result;
  169. }
  170. uint32_t LfRfidViewTuneVM::get_ARR() {
  171. uint32_t result;
  172. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  173. result = model->ARR;
  174. return false;
  175. });
  176. return result;
  177. }
  178. uint32_t LfRfidViewTuneVM::get_CCR() {
  179. uint32_t result;
  180. with_view_model_cpp(view, LfRfidViewTuneVMModel, model, {
  181. result = model->CCR;
  182. return false;
  183. });
  184. return result;
  185. }