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