ibutton_mode_dallas_read.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #pragma once
  2. #include "ibutton.h"
  3. #include "one_wire_master.h"
  4. #include "maxim_crc.h"
  5. class AppiButtonModeDallasRead : public AppTemplateMode<AppiButtonState, AppiButtonEvent> {
  6. public:
  7. const char* name = "dallas read";
  8. AppiButton* app;
  9. OneWireMaster* onewire;
  10. void event(AppiButtonEvent* event, AppiButtonState* state);
  11. void render(Canvas* canvas, AppiButtonState* state);
  12. void acquire();
  13. void release();
  14. AppiButtonModeDallasRead(AppiButton* parent_app) {
  15. app = parent_app;
  16. // TODO open record
  17. const GpioPin* one_wire_pin_record = &ibutton_gpio;
  18. onewire = new OneWireMaster(one_wire_pin_record);
  19. };
  20. };
  21. void AppiButtonModeDallasRead::event(AppiButtonEvent* event, AppiButtonState* state) {
  22. if(event->type == AppiButtonEvent::EventTypeTick) {
  23. bool result = 0;
  24. uint8_t address[8];
  25. osKernelLock();
  26. result = onewire->reset();
  27. osKernelUnlock();
  28. if(result) {
  29. osKernelLock();
  30. __disable_irq();
  31. onewire->write(0x33);
  32. onewire->read_bytes(address, 8);
  33. __enable_irq();
  34. osKernelUnlock();
  35. if(maxim_crc8(address, 8) == 0) {
  36. memcpy(app->state.dallas_address[app->state.dallas_address_index], address, 8);
  37. app->blink_green();
  38. }
  39. }
  40. } else if(event->type == AppiButtonEvent::EventTypeKey) {
  41. if(event->value.input.type == InputTypeShort && event->value.input.key == InputKeyUp) {
  42. app->decrease_dallas_address();
  43. }
  44. if(event->value.input.type == InputTypeShort && event->value.input.key == InputKeyDown) {
  45. app->increase_dallas_address();
  46. }
  47. }
  48. }
  49. void AppiButtonModeDallasRead::render(Canvas* canvas, AppiButtonState* state) {
  50. canvas_set_font(canvas, FontSecondary);
  51. canvas_draw_str(canvas, 2, 25, "Dallas read >");
  52. app->render_dallas_list(canvas, state);
  53. }
  54. void AppiButtonModeDallasRead::acquire() {
  55. onewire->start();
  56. }
  57. void AppiButtonModeDallasRead::release() {
  58. onewire->stop();
  59. }