ibutton.cpp 2.8 KB

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