ibutton_mode_dallas_emulate.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #pragma once
  2. #include "ibutton.h"
  3. #include "one_wire_slave_gpio.h"
  4. #include "one_wire_device_ds_1990.h"
  5. class AppiButtonModeDallasEmulate : public AppTemplateMode<AppiButtonState, AppiButtonEvent> {
  6. public:
  7. const char* name = "dallas emulate";
  8. AppiButton* app;
  9. OneWireGpioSlave* onewire_slave;
  10. DS1990 key;
  11. void event(AppiButtonEvent* event, AppiButtonState* state);
  12. void render(Canvas* canvas, AppiButtonState* state);
  13. void acquire();
  14. void release();
  15. AppiButtonModeDallasEmulate(AppiButton* parent_app)
  16. : key(1, 2, 3, 4, 5, 6, 7) {
  17. app = parent_app;
  18. // TODO open record
  19. const GpioPin* one_wire_pin_record = &ibutton_gpio;
  20. onewire_slave = new OneWireGpioSlave(one_wire_pin_record);
  21. onewire_slave->attach(key);
  22. };
  23. };
  24. void AppiButtonModeDallasEmulate::event(AppiButtonEvent* event, AppiButtonState* state) {
  25. if(event->type == AppiButtonEvent::EventTypeTick) {
  26. onewire_slave->detach(key);
  27. memcpy(key.id_storage, state->dallas_address[state->dallas_address_index], 8);
  28. onewire_slave->attach(key);
  29. if(onewire_slave->emulate()) {
  30. app->blink_green();
  31. }
  32. } else if(event->type == AppiButtonEvent::EventTypeKey) {
  33. if(event->value.input.state && event->value.input.input == InputUp) {
  34. app->decrease_dallas_address();
  35. }
  36. if(event->value.input.state && event->value.input.input == InputDown) {
  37. app->increase_dallas_address();
  38. }
  39. }
  40. }
  41. void AppiButtonModeDallasEmulate::render(Canvas* canvas, AppiButtonState* state) {
  42. canvas_set_font(canvas, FontSecondary);
  43. canvas_draw_str(canvas, 2, 25, "< Dallas emulate >");
  44. app->render_dallas_list(canvas, state);
  45. }
  46. void AppiButtonModeDallasEmulate::acquire() {
  47. onewire_slave->start();
  48. }
  49. void AppiButtonModeDallasEmulate::release() {
  50. onewire_slave->stop();
  51. }