Просмотр исходного кода

Fieldset: more fixes to bytes field type.

antirez 3 лет назад
Родитель
Сommit
9344e86e8c
2 измененных файлов с 15 добавлено и 16 удалено
  1. 5 9
      fields.c
  2. 10 7
      protocols/keeloq.c

+ 5 - 9
fields.c

@@ -66,14 +66,12 @@ int field_to_string(char *buf, size_t len, ProtoViewField *f) {
     case FieldTypeBytes:
     case FieldTypeBytes:
         {
         {
             uint64_t idx = 0;
             uint64_t idx = 0;
-            uint32_t nibble_num = f->len;
-            while(idx < len-1 && nibble_num) {
+            while(idx < len-1 && idx < f->len) {
                 const char *charset = "0123456789ABCDEF";
                 const char *charset = "0123456789ABCDEF";
-                uint32_t nibble = nibble_num & 1 ?
-                    (f->bytes[idx/2] >> 4) :
-                    (f->bytes[idx/2] & 0xf);
+                uint32_t nibble = idx & 1 ?
+                    (f->bytes[idx/2] & 0xf) :
+                    (f->bytes[idx/2] >> 4);
                 buf[idx++] = charset[nibble];
                 buf[idx++] = charset[nibble];
-                nibble_num--;
             }
             }
             buf[idx] = 0;
             buf[idx] = 0;
             return idx;
             return idx;
@@ -140,7 +138,6 @@ bool field_set_from_string(ProtoViewField *f, char *buf, size_t len) {
         {
         {
             if (len > f->len) return false;
             if (len > f->len) return false;
             uint64_t idx = 0;
             uint64_t idx = 0;
-            uint64_t nibble_idx = len-1;
             while(buf[idx]) {
             while(buf[idx]) {
                 uint8_t nibble = 0;
                 uint8_t nibble = 0;
                 char c = toupper(buf[idx]);
                 char c = toupper(buf[idx]);
@@ -148,14 +145,13 @@ bool field_set_from_string(ProtoViewField *f, char *buf, size_t len) {
                 else if (c >= 'A' && c <= 'F') nibble = 10+(c-'A');
                 else if (c >= 'A' && c <= 'F') nibble = 10+(c-'A');
                 else return false;
                 else return false;
 
 
-                if (nibble_idx & 1) {
+                if (idx & 1) {
                     f->bytes[idx/2] = 
                     f->bytes[idx/2] = 
                         (f->bytes[idx/2] & 0xF0) | nibble;
                         (f->bytes[idx/2] & 0xF0) | nibble;
                 } else {
                 } else {
                     f->bytes[idx/2] = 
                     f->bytes[idx/2] = 
                         (f->bytes[idx/2] & 0x0F) | (nibble<<4);
                         (f->bytes[idx/2] & 0x0F) | (nibble<<4);
                 }
                 }
-                nibble_idx--;
                 idx++;
                 idx++;
             }
             }
             buf[idx] = 0;
             buf[idx] = 0;

+ 10 - 7
protocols/keeloq.c

@@ -61,22 +61,25 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView
     bitmap_reverse_bytes(raw,sizeof(raw)); /* Keeloq is LSB first. */
     bitmap_reverse_bytes(raw,sizeof(raw)); /* Keeloq is LSB first. */
 
 
     int buttons = raw[7]>>4;
     int buttons = raw[7]>>4;
-    int remote_id = ((raw[7]&0x0f) << 24) |
-                     (raw[6] << 16) |
-                     (raw[5] << 8) |
-                     (raw[4] << 0);
+    uint8_t remote_id[4];
+    bitmap_copy(remote_id,sizeof(remote_id),0,raw+4,sizeof(raw)-4,4,28);
     int lowbat = (raw[8]&0x80) != 0;
     int lowbat = (raw[8]&0x80) != 0;
 
 
     fieldset_add_bytes(info->fieldset,"raw",raw,9*2);
     fieldset_add_bytes(info->fieldset,"raw",raw,9*2);
     fieldset_add_bytes(info->fieldset,"encr",raw,4*2);
     fieldset_add_bytes(info->fieldset,"encr",raw,4*2);
-    fieldset_add_hex(info->fieldset,"id",remote_id,28);
+    fieldset_add_bytes(info->fieldset,"id",remote_id,7); // 28 bits, 7 nibbles
     fieldset_add_bin(info->fieldset,"s2 s1 s0 s3",buttons,4);
     fieldset_add_bin(info->fieldset,"s2 s1 s0 s3",buttons,4);
     fieldset_add_bin(info->fieldset,"low battery",lowbat,1);
     fieldset_add_bin(info->fieldset,"low battery",lowbat,1);
     return true;
     return true;
 }
 }
 
 
-static void get_fields(ProtoViewFieldSet *fields) {
-    UNUSED(fields);
+static void get_fields(ProtoViewFieldSet *fieldset) {
+    uint8_t remote_id[4] = {0xab, 0xcd, 0xef, 0xa0};
+    uint8_t encr[4] = {0xab, 0xab, 0xab, 0xab};
+    fieldset_add_bytes(fieldset,"encr",encr,8);
+    fieldset_add_bytes(fieldset,"id",remote_id,7);
+    fieldset_add_bin(fieldset,"s[2,1,0,3]",2,4);
+    fieldset_add_bin(fieldset,"low battery",0,1);
 }
 }
 
 
 static void build_message(RawSamplesBuffer *samples, ProtoViewFieldSet *fields)
 static void build_message(RawSamplesBuffer *samples, ProtoViewFieldSet *fields)