em4100.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. /*
  37. printf("em data: ");
  38. for(uint8_t i = 0; i < 64; i++) {
  39. printf("%d ", data[i]);
  40. }
  41. printf("\n");
  42. */
  43. }
  44. void em4100_emulation(uint8_t* data, GpioPin* pin) {
  45. taskENTER_CRITICAL();
  46. gpio_write(pin, true);
  47. for(uint8_t i = 0; i < 8; i++) {
  48. for(uint8_t j = 0; j < 64; j++) {
  49. delay_us(270);
  50. gpio_write(pin, data[j]);
  51. delay_us(270);
  52. gpio_write(pin, !data[j]);
  53. }
  54. }
  55. gpio_write(pin, false);
  56. taskEXIT_CRITICAL();
  57. }