em4100.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <furi.h>
  2. #include <api-hal.h>
  3. void prepare_data(uint32_t ID, uint32_t VENDOR, uint8_t* data) {
  4. uint8_t value[10];
  5. // vendor rows (4 bit in a row)
  6. value[0] = (VENDOR >> 4) & 0xF;
  7. value[1] = VENDOR & 0xF;
  8. const uint8_t ROW_SIZE = 4;
  9. const uint8_t HEADER_SIZE = 9;
  10. // ID rows (4 bit in a row)
  11. for(int i = 0; i < 8; i++) {
  12. value[i + 2] = (ID >> (28 - i * ROW_SIZE)) & 0xF;
  13. }
  14. for(uint8_t i = 0; i < HEADER_SIZE; i++) {
  15. data[i] = 1; // header
  16. }
  17. for(uint8_t i = 0; i < 10; i++) { // data
  18. for(uint8_t j = 0; j < ROW_SIZE; j++) {
  19. data[HEADER_SIZE + i * (ROW_SIZE + 1) + j] = (value[i] >> ((ROW_SIZE - 1) - j)) & 1;
  20. }
  21. // row parity
  22. data[HEADER_SIZE + i * (ROW_SIZE + 1) + ROW_SIZE] =
  23. (data[HEADER_SIZE + i * (ROW_SIZE + 1) + 0] +
  24. data[HEADER_SIZE + i * (ROW_SIZE + 1) + 1] +
  25. data[HEADER_SIZE + i * (ROW_SIZE + 1) + 2] +
  26. data[HEADER_SIZE + i * (ROW_SIZE + 1) + 3]) %
  27. 2;
  28. }
  29. for(uint8_t i = 0; i < ROW_SIZE; i++) { //checksum
  30. uint8_t checksum = 0;
  31. for(uint8_t j = 0; j < 10; j++) {
  32. checksum += data[HEADER_SIZE + i + j * (ROW_SIZE + 1)];
  33. }
  34. data[i + 59] = checksum % 2;
  35. }
  36. data[63] = 0; // stop bit
  37. /*
  38. printf("em data: ");
  39. for(uint8_t i = 0; i < 64; i++) {
  40. printf("%d ", data[i]);
  41. }
  42. printf("\r\n");
  43. */
  44. }
  45. void em4100_emulation(uint8_t* data, GpioPin* pin) {
  46. taskENTER_CRITICAL();
  47. gpio_write(pin, true);
  48. for(uint8_t i = 0; i < 8; i++) {
  49. for(uint8_t j = 0; j < 64; j++) {
  50. delay_us(260);
  51. gpio_write(pin, data[j]);
  52. delay_us(260);
  53. gpio_write(pin, !data[j]);
  54. }
  55. }
  56. gpio_write(pin, false);
  57. taskEXIT_CRITICAL();
  58. }