oregon2.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "../app.h"
  2. static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) {
  3. if (numbits < 32) return false;
  4. const char *sync_pattern = "01100110" "01100110" "10010110" "10010110";
  5. uint64_t off = bitmap_seek_bits(bits,numbytes,0,sync_pattern);
  6. if (off == BITMAP_SEEK_NOT_FOUND) return false;
  7. FURI_LOG_E(TAG, "Oregon2 prelude+sync found");
  8. off += 32; /* Skip preamble. */
  9. uint8_t buffer[8];
  10. uint32_t decoded =
  11. convert_from_line_code(buffer,sizeof(buffer),bits,numbytes,off,"1001","0110");
  12. FURI_LOG_E(TAG, "Oregon2 decoded bits: %lu", decoded);
  13. if (decoded < 11*4) return false; /* Minimum len to extract some data. */
  14. char temp[3] = {0}, deviceid[2] = {0}, hum[2] = {0};
  15. for (int j = 0; j < 64; j += 4) {
  16. uint8_t nib[1];
  17. nib[0] = 0;
  18. bitmap_set(nib,1,0,bitmap_get(buffer,8,j+0));
  19. bitmap_set(nib,1,1,bitmap_get(buffer,8,j+1));
  20. bitmap_set(nib,1,2,bitmap_get(buffer,8,j+2));
  21. bitmap_set(nib,1,3,bitmap_get(buffer,8,j+3));
  22. FURI_LOG_E(TAG, "Not inverted nibble[%d]: %x", j/4, (unsigned int)nib[0]);
  23. switch(j/4) {
  24. case 1: deviceid[0] |= nib[0]; break;
  25. case 0: deviceid[0] |= nib[0] << 4; break;
  26. case 3: deviceid[1] |= nib[0]; break;
  27. case 2: deviceid[1] |= nib[0] << 4; break;
  28. case 10: temp[0] = nib[0]; break;
  29. /* Fixme: take the temperature sign from nibble 11. */
  30. case 9: temp[1] = nib[0]; break;
  31. case 8: temp[2] = nib[0]; break;
  32. case 13: hum[0] = nib[0]; break;
  33. case 12: hum[1] = nib[0]; break;
  34. }
  35. }
  36. snprintf(info->name,sizeof(info->name),"%s","Oregon v2.1");
  37. /* The following line crashes the Flipper because of broken
  38. * snprintf() implementation. */
  39. if (0) snprintf(info->raw,sizeof(info->raw),"%08llX", *((uint64_t*)buffer));
  40. snprintf(info->info1,sizeof(info->info1),"Sensor ID %02X%02X",
  41. deviceid[0], deviceid[1]);
  42. snprintf(info->info2,sizeof(info->info2),"Temperature %d%d.%d",
  43. temp[0],temp[1],temp[2]);
  44. snprintf(info->info3,sizeof(info->info3),"Humidity %d%d",
  45. hum[0],hum[1]);
  46. return true;
  47. }
  48. ProtoViewDecoder Oregon2Decoder = {
  49. "Oregon2", decode
  50. };