ibutton_mode_dallas_read.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #pragma once
  2. #include "ibutton.h"
  3. #include "one_wire_gpio.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. OneWireGpio* 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 OneWireGpio(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. printf("device on line\n");
  30. delay(50);
  31. osKernelLock();
  32. onewire->write(0x33);
  33. onewire->read_bytes(address, 8);
  34. osKernelUnlock();
  35. printf("address: %x", address[0]);
  36. for(uint8_t i = 1; i < 8; i++) {
  37. printf(":%x", address[i]);
  38. }
  39. printf("\n");
  40. printf("crc8: %x\n", maxim_crc8(address, 7));
  41. if(maxim_crc8(address, 8) == 0) {
  42. printf("CRC valid\n");
  43. memcpy(app->state.dallas_address[app->state.dallas_address_index], address, 8);
  44. app->blink_green();
  45. } else {
  46. printf("CRC invalid\n");
  47. }
  48. } else {
  49. }
  50. } else if(event->type == AppiButtonEvent::EventTypeKey) {
  51. if(event->value.input.state && event->value.input.input == InputUp) {
  52. app->decrease_dallas_address();
  53. }
  54. if(event->value.input.state && event->value.input.input == InputDown) {
  55. app->increase_dallas_address();
  56. }
  57. }
  58. }
  59. void AppiButtonModeDallasRead::render(Canvas* canvas, AppiButtonState* state) {
  60. canvas_set_font(canvas, FontSecondary);
  61. canvas_draw_str(canvas, 2, 25, "Dallas read >");
  62. app->render_dallas_list(canvas, state);
  63. }
  64. void AppiButtonModeDallasRead::acquire() {
  65. onewire->start();
  66. }
  67. void AppiButtonModeDallasRead::release() {
  68. onewire->stop();
  69. }