oregon2.c 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. if (decoded < 11*4) return false; /* Minimum len to extract some data. */
  50. char temp[3] = {0}, deviceid[2] = {0}, hum[2] = {0};
  51. for (int j = 0; j < 64; j += 4) {
  52. uint8_t nib[1];
  53. nib[0] = 0;
  54. bitmap_set(nib,1,0,bitmap_get(buffer,8,j+0));
  55. bitmap_set(nib,1,1,bitmap_get(buffer,8,j+1));
  56. bitmap_set(nib,1,2,bitmap_get(buffer,8,j+2));
  57. bitmap_set(nib,1,3,bitmap_get(buffer,8,j+3));
  58. FURI_LOG_E(TAG, "Not inverted nibble[%d]: %x", j/4, (unsigned int)nib[0]);
  59. switch(j/4) {
  60. case 1: deviceid[0] |= nib[0]; break;
  61. case 0: deviceid[0] |= nib[0] << 4; break;
  62. case 3: deviceid[1] |= nib[0]; break;
  63. case 2: deviceid[1] |= nib[0] << 4; break;
  64. case 10: temp[0] = nib[0]; break;
  65. /* Fixme: take the temperature sign from nibble 11. */
  66. case 9: temp[1] = nib[0]; break;
  67. case 8: temp[2] = nib[0]; break;
  68. case 13: hum[0] = nib[0]; break;
  69. case 12: hum[1] = nib[0]; break;
  70. }
  71. }
  72. snprintf(info->name,sizeof(info->name),"%s","Oregon v2.1");
  73. snprintf(info->raw,sizeof(info->raw),"%08llX", *((uint64_t*)buffer));
  74. snprintf(info->info1,sizeof(info->info2),"ID %02X%02X",
  75. deviceid[0], deviceid[1]);
  76. snprintf(info->info2,sizeof(info->info1),"Temp %d%d.%d",
  77. temp[0],temp[1],temp[2]);
  78. snprintf(info->info3,sizeof(info->info1),"Humidity %d%d",
  79. hum[0],hum[1]);
  80. return true;
  81. }
  82. ProtoViewDecoder Oregon2Decoder = {
  83. "Oregon2", decode
  84. };