antirez 3 лет назад
Родитель
Сommit
864cb6618d
1 измененных файлов с 10 добавлено и 4 удалено
  1. 10 4
      protocols/oregon2.c

+ 10 - 4
protocols/oregon2.c

@@ -54,8 +54,9 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView
     uint32_t decoded =
         convert_from_line_code(buffer,sizeof(buffer),bits,numbytes,off,"1001","0110");
     FURI_LOG_E(TAG, "Oregon2 decoded bits: %lu", decoded);
+    if (decoded < 11*4) return false; /* Minimum len to extract some data. */
 
-    char temp[3] = {0}, deviceid[2] = {0};
+    char temp[3] = {0}, deviceid[2] = {0}, hum[2] = {0};
     for (int j = 0; j < 64; j += 4) {
         uint8_t nib[1];
         nib[0] = 0;
@@ -70,17 +71,22 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView
         case 3: deviceid[1] |= nib[0]; break;
         case 2: deviceid[1] |= nib[0] << 4; break;
         case 10: temp[0] = nib[0]; break;
+        /* Fixme: take the temperature sign from nibble 11. */
         case 9: temp[1] = nib[0]; break;
         case 8: temp[2] = nib[0]; break;
+        case 13: hum[0] = nib[0]; break;
+        case 12: hum[1] = nib[0]; break;
         }
     }
 
     snprintf(info->name,sizeof(info->name),"%s","Oregon v2.1");
     snprintf(info->raw,sizeof(info->raw),"%08llX", *((uint64_t*)buffer));
-    snprintf(info->info1,sizeof(info->info1),"Temp %d%d.%d",
-        temp[0],temp[1],temp[2]);
-    snprintf(info->info2,sizeof(info->info2),"ID %02X%02X",
+    snprintf(info->info1,sizeof(info->info2),"ID %02X%02X",
         deviceid[0], deviceid[1]);
+    snprintf(info->info2,sizeof(info->info1),"Temp %d%d.%d",
+        temp[0],temp[1],temp[2]);
+    snprintf(info->info3,sizeof(info->info1),"Humidity %d%d",
+        hum[0],hum[1]);
     return true;
 }