Hallo zusammen,
Für die korrekte (vorzeichenrichtige) Behandlung von 4bit-signed-Werten in DPT3 (Dim/Jalousien):
EDIT: DPT2 (signed 2bit) auch noch gleich hinzugefügt.
Wieder mal der Disclaimer: EXPERIMENTAL - kein Support, kein Mitleid :-)
Wer das ausprobiert, kennt sich bitte mit der Linux-Kommandozeile aus, macht vorher ein Backup seines wiregated.pl, und kann diff und patch bedienen.
Der Code ist nur grob getestet, sollte aber bei den Mini-Edits überschaubar sein...
VG, Fry
Für die korrekte (vorzeichenrichtige) Behandlung von 4bit-signed-Werten in DPT3 (Dim/Jalousien):
EDIT: DPT2 (signed 2bit) auch noch gleich hinzugefügt.
Wieder mal der Disclaimer: EXPERIMENTAL - kein Support, kein Mitleid :-)
Wer das ausprobiert, kennt sich bitte mit der Linux-Kommandozeile aus, macht vorher ein Backup seines wiregated.pl, und kann diff und patch bedienen.
Der Code ist nur grob getestet, sollte aber bei den Mini-Edits überschaubar sein...
Code:
--- wiregated.pl.mod-2012-04-28 2012-04-30 23:57:08.000000000 +0200
+++ wiregated.pl 2012-05-01 16:59:26.000000000 +0200
@@ -176,6 +176,16 @@
return $data >> 8, $data & 0xff;
}
+sub decode_dpt2 { #2bit "signed bit"
+ my $val=hex(shift) & 0x03;
+ return $val > 1 ? $val-4 : $val;
+}
+
+sub decode_dpt3 { #4bit signed integer
+ my $val=hex(shift) & 0x0f;
+ return $val > 7 ? 8-$val : $val;
+}
+
sub decode_dpt4 { #1byte char
return sprintf("%c", hex(shift));
}
@@ -289,8 +299,8 @@
when (/^20/) { $value = decode_dpt510($data); }
when (/^\d\d/) { return; } # other DPT XX 15 are unhandled
when (/^1/) { $value = int($data); }
- when (/^2/) { $value = int($data); } # somehow wrong 2bit
- when (/^3/) { $value = int($data); } # somehow wrong 4bit
+ when (/^2/) { $value = decode_dpt2($data); }
+ when (/^3/) { $value = decode_dpt3($data); }
when (/^4/) { $value = decode_dpt4($data); }
when ([5,'5.001']) { $value = decode_dpt5($data); }
when (['5.004','5.005','5.010']) { $value = decode_dpt510($data); }
@@ -435,8 +445,8 @@
when (/^17/) { $bytes = pack ("CCC", 0, $apci, $value & 0x3F); }
when (/^20/) { $bytes = pack ("CCC", 0, $apci, $value); }
when (/^\d\d/) { return; } # other DPT XX 15 are unhandled
- when (/^[1,2,3]/) { $bytes = pack ("CC", 0, $apci | ($value & 0x3f)); } #send 6bit small
- when (/^[4]/) { $bytes = pack ("CCc", 0, $apci, ord($value)); }
+ when (/^[1,2,3]/) { $bytes = pack ("CC", 0, $apci | ($value & 0x3f)); } #send 6bit small
+ when (/^4/) { $bytes = pack ("CCc", 0, $apci, ord($value)); }
when ([5,5.001]) { $bytes = pack ("CCC", 0, $apci, encode_dpt5($value)); } #EIS 6/DPT5.001 1byte
when ([5.004,5.005,5.010]) { $bytes = pack ("CCC", 0, $apci, $value); }
when (/^6/) { $bytes = pack ("CCc", 0, $apci, $value); }



Kommentar