ibutton.cpp 2.9 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. if(get_event(&event, 100)) {
  23. if(event.type == AppiButtonEvent::EventTypeKey) {
  24. // press events
  25. if(event.value.input.state && event.value.input.input == InputBack) {
  26. printf("[ibutton] bye!\n");
  27. // TODO remove all widgets create by app
  28. widget_enabled_set(widget, false);
  29. furiac_exit(NULL);
  30. }
  31. if(event.value.input.state && event.value.input.input == InputLeft) {
  32. decrease_mode();
  33. }
  34. if(event.value.input.state && event.value.input.input == InputRight) {
  35. increase_mode();
  36. }
  37. }
  38. } else {
  39. event.type = AppiButtonEvent::EventTypeTick;
  40. }
  41. acquire_state();
  42. mode[state.mode_index]->event(&event, &state);
  43. release_state();
  44. widget_update(widget);
  45. };
  46. }
  47. // render app
  48. void AppiButton::render(CanvasApi* canvas) {
  49. canvas->set_color(canvas, ColorBlack);
  50. canvas->set_font(canvas, FontPrimary);
  51. canvas->draw_str(canvas, 2, 12, "iButton");
  52. if(mode[state.mode_index] != NULL) {
  53. mode[state.mode_index]->render(canvas, &state);
  54. }
  55. }
  56. void AppiButton::blink_red() {
  57. gpio_write(red_led_record, 0);
  58. delay(10);
  59. gpio_write(red_led_record, 1);
  60. }
  61. void AppiButton::blink_green() {
  62. gpio_write(green_led_record, 0);
  63. delay(10);
  64. gpio_write(green_led_record, 1);
  65. }
  66. void AppiButton::increase_mode() {
  67. acquire_state();
  68. if(state.mode_index < (modes_count - 1)) {
  69. mode[state.mode_index]->release();
  70. state.mode_index++;
  71. mode[state.mode_index]->acquire();
  72. }
  73. release_state();
  74. }
  75. void AppiButton::decrease_mode() {
  76. acquire_state();
  77. if(state.mode_index > 0) {
  78. mode[state.mode_index]->release();
  79. state.mode_index--;
  80. mode[state.mode_index]->acquire();
  81. }
  82. release_state();
  83. }
  84. void AppiButton::switch_to_mode(uint8_t mode_index) {
  85. acquire_state();
  86. mode[state.mode_index]->release();
  87. state.mode_index = mode_index;
  88. mode[state.mode_index]->acquire();
  89. release_state();
  90. }
  91. // app enter function
  92. extern "C" void app_ibutton(void* p) {
  93. AppiButton* app = new AppiButton();
  94. app->run();
  95. }