key-writer.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #include "key-writer.h"
  2. #include "key-commands.h"
  3. KeyWriter::KeyWriter(OneWireMaster* _onewire_master) {
  4. onewire_master = _onewire_master;
  5. }
  6. KeyWriter::Error KeyWriter::write(iButtonKey* key) {
  7. return write_internal(key);
  8. }
  9. void KeyWriter::start() {
  10. api_hal_power_enable_otg();
  11. onewire_master->start();
  12. }
  13. void KeyWriter::stop() {
  14. api_hal_power_disable_otg();
  15. onewire_master->stop();
  16. }
  17. KeyWriter::Error KeyWriter::write_internal(iButtonKey* key) {
  18. Error result = Error::NO_DETECT;
  19. bool same_key = false;
  20. osKernelLock();
  21. bool presence = onewire_master->reset();
  22. osKernelUnlock();
  23. if(presence) {
  24. switch(key->get_key_type()) {
  25. case iButtonKeyType::KeyDallas:
  26. same_key = compare_key_ds1990(key);
  27. if(!same_key) {
  28. bool write_result = false;
  29. // currently we can write:
  30. // RW1990, TM08v2, TM08vi-2 by write_1990_1()
  31. // RW2004, RW2004 with EEPROM by write_TM2004();
  32. if(!write_result) {
  33. write_result = write_1990_1(key);
  34. }
  35. if(!write_result) {
  36. write_result = write_1990_2(key);
  37. }
  38. if(!write_result) {
  39. write_result = write_TM2004(key);
  40. }
  41. if(write_result) {
  42. result = Error::OK;
  43. } else {
  44. result = Error::CANNOT_WRITE;
  45. }
  46. } else {
  47. result = Error::SAME_KEY;
  48. }
  49. break;
  50. default:
  51. break;
  52. }
  53. }
  54. return result;
  55. }
  56. bool KeyWriter::compare_key_ds1990(iButtonKey* key) {
  57. bool result = false;
  58. if(key->get_key_type() == iButtonKeyType::KeyDallas) {
  59. __disable_irq();
  60. bool presence = onewire_master->reset();
  61. if(presence) {
  62. onewire_master->write(DS1990::CMD_READ_ROM);
  63. result = true;
  64. for(uint8_t i = 0; i < key->get_type_data_size(); i++) {
  65. if(key->get_data()[i] != onewire_master->read()) {
  66. result = false;
  67. break;
  68. }
  69. }
  70. }
  71. __enable_irq();
  72. }
  73. return result;
  74. }
  75. bool KeyWriter::write_1990_1(iButtonKey* key) {
  76. bool result = false;
  77. if(key->get_key_type() == iButtonKeyType::KeyDallas) {
  78. __disable_irq();
  79. // unlock
  80. onewire_master->reset();
  81. onewire_master->write(RW1990_1::CMD_WRITE_RECORD_FLAG);
  82. delay_us(10);
  83. onewire_write_one_bit(0, 5000);
  84. // write key
  85. onewire_master->reset();
  86. onewire_master->write(RW1990_1::CMD_WRITE_ROM);
  87. for(uint8_t i = 0; i < key->get_type_data_size(); i++) {
  88. // inverted key for RW1990.1
  89. write_byte_ds1990(~key->get_data()[i]);
  90. delay_us(30000);
  91. }
  92. // lock
  93. onewire_master->write(RW1990_1::CMD_WRITE_RECORD_FLAG);
  94. onewire_write_one_bit(1);
  95. __enable_irq();
  96. if(compare_key_ds1990(key)) {
  97. result = true;
  98. }
  99. }
  100. return result;
  101. }
  102. bool KeyWriter::write_1990_2(iButtonKey* key) {
  103. bool result = false;
  104. if(key->get_key_type() == iButtonKeyType::KeyDallas) {
  105. __disable_irq();
  106. // unlock
  107. onewire_master->reset();
  108. onewire_master->write(RW1990_2::CMD_WRITE_RECORD_FLAG);
  109. delay_us(10);
  110. onewire_write_one_bit(1, 5000);
  111. // write key
  112. onewire_master->reset();
  113. onewire_master->write(RW1990_2::CMD_WRITE_ROM);
  114. for(uint8_t i = 0; i < key->get_type_data_size(); i++) {
  115. write_byte_ds1990(key->get_data()[i]);
  116. delay_us(30000);
  117. }
  118. // lock
  119. onewire_master->write(RW1990_2::CMD_WRITE_RECORD_FLAG);
  120. onewire_write_one_bit(0);
  121. __enable_irq();
  122. if(compare_key_ds1990(key)) {
  123. result = true;
  124. }
  125. }
  126. return result;
  127. }
  128. bool KeyWriter::write_TM2004(iButtonKey* key) {
  129. uint8_t answer;
  130. bool result = true;
  131. if(key->get_key_type() == iButtonKeyType::KeyDallas) {
  132. __disable_irq();
  133. // write rom, addr is 0x0000
  134. onewire_master->reset();
  135. onewire_master->write(TM2004::CMD_WRITE_ROM);
  136. onewire_master->write(0x00);
  137. onewire_master->write(0x00);
  138. // write key
  139. for(uint8_t i = 0; i < key->get_type_data_size(); i++) {
  140. // write key byte
  141. onewire_master->write(key->get_data()[i]);
  142. answer = onewire_master->read();
  143. // TODO: check answer CRC
  144. // pulse indicating that data is correct
  145. delay_us(600);
  146. onewire_write_one_bit(1, 50000);
  147. // read writed key byte
  148. answer = onewire_master->read();
  149. // check that writed and readed are same
  150. if(key->get_data()[i] != answer) {
  151. result = false;
  152. break;
  153. }
  154. }
  155. if(!compare_key_ds1990(key)) {
  156. result = false;
  157. }
  158. onewire_master->reset();
  159. __enable_irq();
  160. } else {
  161. result = false;
  162. }
  163. return result;
  164. }
  165. bool KeyWriter::write_TM01(iButtonKey* key) {
  166. /*bool result = true;
  167. // TODO test and encoding
  168. __disable_irq();
  169. // unlock
  170. onewire_master->reset();
  171. onewire_master->write(TM01::CMD_WRITE_RECORD_FLAG);
  172. onewire_write_one_bit(1, 10000);
  173. // write key
  174. onewire_master->reset();
  175. onewire_master->write(TM01::CMD_WRITE_ROM);
  176. // TODO: key types
  177. //if(type == KEY_METAKOM || type == KEY_CYFRAL) {
  178. //} else {
  179. for(uint8_t i = 0; i < key->get_type_data_size(); i++) {
  180. write_byte_ds1990(key->get_data()[i]);
  181. delay_us(10000);
  182. }
  183. //}
  184. // lock
  185. onewire_master->write(TM01::CMD_WRITE_RECORD_FLAG);
  186. onewire_write_one_bit(0, 10000);
  187. __enable_irq();
  188. if(!compare_key_ds1990(key)) {
  189. result = false;
  190. }
  191. __disable_irq();
  192. if(key->get_key_type() == iButtonKeyType::KeyMetakom ||
  193. key->get_key_type() == iButtonKeyType::KeyCyfral) {
  194. onewire_master->reset();
  195. if(key->get_key_type() == iButtonKeyType::KeyCyfral)
  196. onewire_master->write(TM01::CMD_SWITCH_TO_CYFRAL);
  197. else
  198. onewire_master->write(TM01::CMD_SWITCH_TO_METAKOM);
  199. onewire_write_one_bit(1);
  200. }
  201. __enable_irq();
  202. return result;*/
  203. return false;
  204. }
  205. void KeyWriter::onewire_write_one_bit(bool value, uint32_t delay) {
  206. onewire_master->write_bit(value);
  207. delay_us(delay);
  208. }
  209. void KeyWriter::write_byte_ds1990(uint8_t data) {
  210. for(uint8_t n_bit = 0; n_bit < 8; n_bit++) {
  211. onewire_master->write_bit(data & 1);
  212. delay_us(5000);
  213. data = data >> 1;
  214. }
  215. }