em4100.c 1.8 KB

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