ibutton.cpp 2.7 KB

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