ibutton.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "ibutton.h"
  2. #include "ibutton_mode_dallas_read.h"
  3. #include "ibutton_mode_dallas_emulate.h"
  4. // start app
  5. void AppiButton::run() {
  6. acquire_state();
  7. mode[0] = new AppiButtonModeDallasRead(this);
  8. mode[1] = new AppiButtonModeDallasEmulate(this);
  9. release_state();
  10. switch_to_mode(0);
  11. // create pin
  12. GpioPin red_led = led_gpio[0];
  13. GpioPin green_led = led_gpio[1];
  14. // TODO open record
  15. red_led_record = &red_led;
  16. green_led_record = &green_led;
  17. // configure pin
  18. gpio_init(red_led_record, GpioModeOutputOpenDrain);
  19. gpio_init(green_led_record, GpioModeOutputOpenDrain);
  20. AppiButtonEvent event;
  21. while(1) {
  22. osStatus_t event_status = osMessageQueueGet(event_queue, &event, NULL, 100);
  23. if(event_status == osOK) {
  24. if(event.type == AppiButtonEvent::EventTypeKey) {
  25. // press events
  26. if(event.value.input.state && event.value.input.input == InputBack) {
  27. printf("[ibutton] bye!\n");
  28. // TODO remove all widgets create by app
  29. widget_enabled_set(widget, false);
  30. furiac_exit(NULL);
  31. }
  32. if(event.value.input.state && event.value.input.input == InputLeft) {
  33. decrease_mode();
  34. }
  35. if(event.value.input.state && event.value.input.input == InputRight) {
  36. increase_mode();
  37. }
  38. }
  39. } else {
  40. event.type = AppiButtonEvent::EventTypeTick;
  41. }
  42. acquire_state();
  43. mode[state.mode_index]->event(&event, &state);
  44. release_state();
  45. widget_update(widget);
  46. };
  47. }
  48. // render app
  49. void AppiButton::render(CanvasApi* canvas) {
  50. canvas->set_color(canvas, ColorBlack);
  51. canvas->set_font(canvas, FontPrimary);
  52. canvas->draw_str(canvas, 2, 12, "iButton");
  53. mode[state.mode_index]->render(canvas, &state);
  54. }
  55. void AppiButton::blink_red() {
  56. gpio_write(red_led_record, 0);
  57. delay(10);
  58. gpio_write(red_led_record, 1);
  59. }
  60. void AppiButton::blink_green() {
  61. gpio_write(green_led_record, 0);
  62. delay(10);
  63. gpio_write(green_led_record, 1);
  64. }
  65. void AppiButton::increase_mode() {
  66. acquire_state();
  67. if(state.mode_index < (modes_count - 1)) {
  68. mode[state.mode_index]->release();
  69. state.mode_index++;
  70. mode[state.mode_index]->acquire();
  71. }
  72. release_state();
  73. }
  74. void AppiButton::decrease_mode() {
  75. acquire_state();
  76. if(state.mode_index > 0) {
  77. mode[state.mode_index]->release();
  78. state.mode_index--;
  79. mode[state.mode_index]->acquire();
  80. }
  81. release_state();
  82. }
  83. void AppiButton::switch_to_mode(uint8_t mode_index) {
  84. acquire_state();
  85. mode[state.mode_index]->release();
  86. state.mode_index = mode_index;
  87. mode[state.mode_index]->acquire();
  88. release_state();
  89. }
  90. // app enter function
  91. extern "C" void app_ibutton(void* p) {
  92. AppiButton* app = new AppiButton();
  93. app->run();
  94. }