oregon2.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "../app.h"
  2. #if 0
  3. /* Invert byte ordering. */
  4. static void invert_nibbles(uint8_t *p, uint32_t len) {
  5. len *= 8;
  6. for (uint32_t j = 0; j < len; j += 4) {
  7. bool b0 = bitmap_get(p,len,j);
  8. bool b1 = bitmap_get(p,len,j+1);
  9. bool b2 = bitmap_get(p,len,j+2);
  10. bool b3 = bitmap_get(p,len,j+3);
  11. bitmap_set(p,len,j,b3);
  12. bitmap_set(p,len,j+1,b2);
  13. bitmap_set(p,len,j+2,b1);
  14. bitmap_set(p,len,j+3,b0);
  15. }
  16. }
  17. #endif
  18. static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) {
  19. if (numbits < 32) return false;
  20. const char *sync_pattern = "01100110" "01100110" "10010110" "10010110";
  21. uint64_t off = bitmap_seek_bits(bits,numbytes,0,sync_pattern);
  22. if (off == BITMAP_SEEK_NOT_FOUND) return false;
  23. FURI_LOG_E(TAG, "Oregon2 prelude+sync found");
  24. off += 32; /* Skip preamble. */
  25. FURI_LOG_E(TAG, "Bits: %d%d%d%d",
  26. bitmap_get(bits,numbytes,off),
  27. bitmap_get(bits,numbytes,off+1),
  28. bitmap_get(bits,numbytes,off+2),
  29. bitmap_get(bits,numbytes,off+3));
  30. FURI_LOG_E(TAG, "Bits: %d%d%d%d",
  31. bitmap_get(bits,numbytes,off+4),
  32. bitmap_get(bits,numbytes,off+5),
  33. bitmap_get(bits,numbytes,off+6),
  34. bitmap_get(bits,numbytes,off+7));
  35. FURI_LOG_E(TAG, "Bits: %d%d%d%d",
  36. bitmap_get(bits,numbytes,off+8),
  37. bitmap_get(bits,numbytes,off+9),
  38. bitmap_get(bits,numbytes,off+10),
  39. bitmap_get(bits,numbytes,off+11));
  40. FURI_LOG_E(TAG, "Bits: %d%d%d%d",
  41. bitmap_get(bits,numbytes,off+12),
  42. bitmap_get(bits,numbytes,off+13),
  43. bitmap_get(bits,numbytes,off+14),
  44. bitmap_get(bits,numbytes,off+15));
  45. uint8_t buffer[8];
  46. uint32_t decoded =
  47. convert_from_line_code(buffer,sizeof(buffer),bits,numbytes,off,"1001","0110");
  48. FURI_LOG_E(TAG, "Oregon2 decoded bits: %lu", decoded);
  49. char temp[3] = {0}, deviceid[2] = {0};
  50. for (int j = 0; j < 64; j += 4) {
  51. uint8_t nib[1];
  52. nib[0] = 0;
  53. bitmap_set(nib,1,0,bitmap_get(buffer,8,j+0));
  54. bitmap_set(nib,1,1,bitmap_get(buffer,8,j+1));
  55. bitmap_set(nib,1,2,bitmap_get(buffer,8,j+2));
  56. bitmap_set(nib,1,3,bitmap_get(buffer,8,j+3));
  57. FURI_LOG_E(TAG, "Not inverted nibble[%d]: %x", j/4, (unsigned int)nib[0]);
  58. switch(j/4) {
  59. case 1: deviceid[0] |= nib[0]; break;
  60. case 0: deviceid[0] |= nib[0] << 4; break;
  61. case 3: deviceid[1] |= nib[0]; break;
  62. case 2: deviceid[1] |= nib[0] << 4; break;
  63. case 10: temp[0] = nib[0]; break;
  64. case 9: temp[1] = nib[0]; break;
  65. case 8: temp[2] = nib[0]; break;
  66. }
  67. }
  68. snprintf(info->name,sizeof(info->name),"%s","Oregon v2.1");
  69. snprintf(info->raw,sizeof(info->raw),"%08llX", *((uint64_t*)buffer));
  70. snprintf(info->info1,sizeof(info->info1),"Temp %d%d.%d",
  71. temp[0],temp[1],temp[2]);
  72. snprintf(info->info2,sizeof(info->info2),"ID %02X%02X",
  73. deviceid[0], deviceid[1]);
  74. return true;
  75. }
  76. ProtoViewDecoder Oregon2Decoder = {
  77. "Oregon2", decode
  78. };