ibutton_key.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include <furi.h>
  2. #include <one_wire/maxim_crc.h>
  3. #include "ibutton_key.h"
  4. struct iButtonKey {
  5. uint8_t data[IBUTTON_KEY_DATA_SIZE];
  6. char name[IBUTTON_KEY_NAME_SIZE];
  7. iButtonKeyType type;
  8. };
  9. iButtonKey* ibutton_key_alloc() {
  10. iButtonKey* key = malloc(sizeof(iButtonKey));
  11. memset(key, 0, sizeof(iButtonKey));
  12. return key;
  13. }
  14. void ibutton_key_free(iButtonKey* key) {
  15. free(key);
  16. }
  17. void ibutton_key_set(iButtonKey* to, const iButtonKey* from) {
  18. memcpy(to, from, sizeof(iButtonKey));
  19. }
  20. void ibutton_key_set_data(iButtonKey* key, uint8_t* data, uint8_t data_count) {
  21. furi_check(data_count > 0);
  22. furi_check(data_count <= IBUTTON_KEY_DATA_SIZE);
  23. memset(key->data, 0, IBUTTON_KEY_DATA_SIZE);
  24. memcpy(key->data, data, data_count);
  25. }
  26. void ibutton_key_clear_data(iButtonKey* key) {
  27. memset(key->data, 0, IBUTTON_KEY_DATA_SIZE);
  28. }
  29. const uint8_t* ibutton_key_get_data_p(iButtonKey* key) {
  30. return key->data;
  31. }
  32. uint8_t ibutton_key_get_data_size(iButtonKey* key) {
  33. return ibutton_key_get_size_by_type(key->type);
  34. }
  35. void ibutton_key_set_name(iButtonKey* key, const char* name) {
  36. strlcpy(key->name, name, IBUTTON_KEY_NAME_SIZE);
  37. }
  38. const char* ibutton_key_get_name_p(iButtonKey* key) {
  39. return key->name;
  40. }
  41. void ibutton_key_set_type(iButtonKey* key, iButtonKeyType key_type) {
  42. key->type = key_type;
  43. }
  44. iButtonKeyType ibutton_key_get_type(iButtonKey* key) {
  45. return key->type;
  46. }
  47. const char* ibutton_key_get_string_by_type(iButtonKeyType key_type) {
  48. switch(key_type) {
  49. case iButtonKeyCyfral:
  50. return "Cyfral";
  51. break;
  52. case iButtonKeyMetakom:
  53. return "Metakom";
  54. break;
  55. case iButtonKeyDS1990:
  56. return "Dallas";
  57. break;
  58. default:
  59. furi_crash("Invalid iButton type");
  60. return "";
  61. break;
  62. }
  63. }
  64. bool ibutton_key_get_type_by_string(const char* type_string, iButtonKeyType* key_type) {
  65. if(strcmp(type_string, ibutton_key_get_string_by_type(iButtonKeyCyfral)) == 0) {
  66. *key_type = iButtonKeyCyfral;
  67. } else if(strcmp(type_string, ibutton_key_get_string_by_type(iButtonKeyMetakom)) == 0) {
  68. *key_type = iButtonKeyMetakom;
  69. } else if(strcmp(type_string, ibutton_key_get_string_by_type(iButtonKeyDS1990)) == 0) {
  70. *key_type = iButtonKeyDS1990;
  71. } else {
  72. return false;
  73. }
  74. return true;
  75. }
  76. uint8_t ibutton_key_get_size_by_type(iButtonKeyType key_type) {
  77. uint8_t size = 0;
  78. switch(key_type) {
  79. case iButtonKeyCyfral:
  80. size = 2;
  81. break;
  82. case iButtonKeyMetakom:
  83. size = 4;
  84. break;
  85. case iButtonKeyDS1990:
  86. size = 8;
  87. break;
  88. }
  89. return size;
  90. }
  91. uint8_t ibutton_key_get_max_size() {
  92. return IBUTTON_KEY_DATA_SIZE;
  93. }
  94. bool ibutton_key_dallas_crc_is_valid(iButtonKey* key) {
  95. return (maxim_crc8(key->data, 8, MAXIM_CRC8_INIT) == 0);
  96. }
  97. bool ibutton_key_dallas_is_1990_key(iButtonKey* key) {
  98. return (key->data[0] == 0x01);
  99. }