diff --git a/CHANGED b/CHANGED index 6a7c2b744..142044f56 100644 --- a/CHANGED +++ b/CHANGED @@ -474,3 +474,4 @@ - bugfix: FileLog get (pgm2 plots) wont find the first row in the file - feature: 00_CUL: Answer CUR requests (status/time/fht) - bugfix: support for second correction factor for EMWZ in 15_CUL_EM added + - feature: CUL further sets/gets added diff --git a/FHEM/00_CUL.pm b/FHEM/00_CUL.pm index 2093d6118..fda7ee6d9 100755 --- a/FHEM/00_CUL.pm +++ b/FHEM/00_CUL.pm @@ -13,22 +13,29 @@ sub CUL_ReadAnswer($$); sub CUL_Ready($); sub CUL_HandleCurRequest($$); -my $initstr = "X01"; # Only translated messages, no RSSI +my $initstr = "X21"; # Only translated messages + RSSI my %msghist; # Used when more than one CUL is attached my $msgcount = 0; my %gets = ( "version" => "V", "raw" => "", "ccconf" => "=", + "uptime" => "t", ); my %sets = ( "raw" => "", + "freq" => "", + "bWidth" => "", + "rAmpl" => "", + "sens" => "", "verbose" => "X", - "freq" => "=", - "bandwidth" => "=", + "led" => "l", + "patable" => "x", ); +my @ampllist = (24, 27, 30, 33, 36, 38, 40, 42); + sub CUL_Initialize($) { @@ -157,16 +164,15 @@ CUL_Set($@) my $f1 = sprintf("%02x", int($f % 65536) / 256); my $f0 = sprintf("%02x", $f % 256); $arg = sprintf("%.3f", (hex($f2)*65536+hex($f1)*256+hex($f0))/65536*26); - my $msg = "Setting FREQ2..0 (0D,0E,0F) to $f2 $f1 $f0 = $arg MHz, ". - "verbose to $initstr"; + my $msg = "Setting FREQ2..0 (0D,0E,0F) to $f2 $f1 $f0 = $arg MHz"; Log GetLogLevel($name,4), $msg; - CUL_SimpleWrite($hash, "W0F$f2"); # Will reprogram the CC1101 + CUL_SimpleWrite($hash, "W0F$f2"); CUL_SimpleWrite($hash, "W10$f1"); CUL_SimpleWrite($hash, "W11$f0"); - CUL_SimpleWrite($hash, $initstr); + CUL_SimpleWrite($hash, $initstr); # Will reprogram the CC1101 return $msg; - } elsif($type eq "bandwidth") { # KHz + } elsif($type eq "bWidth") { # KHz my $ob = 5; if(!IsDummy($hash->{NAME})) { @@ -184,19 +190,47 @@ CUL_Set($@) goto GOTBW if($arg >= $bw); } } + GOTBW: $ob = sprintf("%02x", $ob+$bits); - my $msg = "Setting MDMCFG4 (10) to $ob = $bw KHz, verbose to $initstr"; + my $msg = "Setting MDMCFG4 (10) to $ob = $bw KHz"; Log GetLogLevel($name,4), $msg; CUL_SimpleWrite($hash, "W12$ob"); CUL_SimpleWrite($hash, $initstr); return $msg; - } else { + } elsif($type eq "rAmpl") { # dB + + return "a numerical value between 24 and 42 is expected" + if($arg !~ m/^\d+$/ || $arg < 24 || $arg > 42); + my ($v, $w); + for($v = 0; $v < @ampllist; $v++) { + last if($ampllist[$v] > $arg); + } + $v = sprintf("%02d", $v-1); + $w = $ampllist[$v]; + my $msg = "Setting AGCCTRL2 (1B) to $v / $w dB"; + CUL_SimpleWrite($hash, "W1D$v"); + CUL_SimpleWrite($hash, $initstr); + return $msg; + + } elsif($type eq "sens") { # dB + + return "a numerical value between 4 and 16 is expected" + if($arg !~ m/^\d+$/ || $arg < 4 || $arg > 16); + my $w = int($arg/4)*4; + my $v = sprintf("9%d",$arg/4-1); + my $msg = "Setting AGCCTRL0 (1D) to $v / $w dB"; + CUL_SimpleWrite($hash, "W1F$v"); + CUL_SimpleWrite($hash, $initstr); + return $msg; + + + } else { return "Expecting a 0-padded hex number" - if((length($arg)&1) == 1 && $type ne "raw"); + if((length($arg)&1) == 0 && $type ne "raw"); $initstr = "X$arg" if($type eq "verbose"); Log GetLogLevel($name,4), "set $name $type $arg"; CUL_SimpleWrite($hash, $sets{$type} . $arg); @@ -228,10 +262,10 @@ CUL_Get($@) my @answ = split(" ", CUL_ReadAnswer($hash, "C$a")); $r{$a} = $answ[4]; } - $msg = sprintf("Freq:%.3fMHz Bwidth:%dKHz Ampl:%ddB Sens:%ddB", + $msg = sprintf("freq:%.3fMHz bWidth:%dKHz rAmpl:%ddB sens:%ddB", 26*(($r{"0D"}*256+$r{"0E"})*256+$r{"0F"})/65536, #Freq 26000/(8 * (4+(($r{"10"}>>4)&3)) * (1 << (($r{"10"}>>6)&3))), #Bw - $r{"1B"}&7<4 ? 24+3*($r{"1B"}&7) : 36+2*(($r{"1B"}&7)-4), #Ampl + $ampllist[$r{"1B"}], 4+4*($r{"1D"}&3) #Sens ); @@ -551,7 +585,7 @@ CUL_Read($) $msghist{$msgcount}{MSG} = $dmsg; $msgcount++; - if($initstr =~ m/X2/ && $dmsg =~ m/[A-F0-9][A-F0-9]$/) { # RSSI + if($initstr =~ m/X2/ && $dmsg =~ m/[FEHT]([A-F0-9][A-F0-9])+$/) { # RSSI my $l = length($dmsg); my $rssi = hex(substr($dmsg, $l-2, 2)); $dmsg = substr($dmsg, 0, $l-2); @@ -601,7 +635,7 @@ CUL_Read($) } elsif($fn eq "E") { # CUL_EM / Native ; } else { - Log GetLogLevel($name,4), "CUL: unknown message $dmsg"; + #Log GetLogLevel($name,4), "CUL: unknown message $dmsg"; goto NEXTMSG; } diff --git a/docs/commandref.html b/docs/commandref.html index 6df1109ee..a10a78191 100644 --- a/docs/commandref.html +++ b/docs/commandref.html @@ -1515,9 +1515,13 @@ A line ending with \ will be concatenated with the next one, so long lines Issue a CUL firmware command. See the CUL firmware README document for details on CUL commands.
-
  • freq / bandwidth
    - Set the CUL frequency / bandwidth. Use it with care, it may destroy - your hardware and it even may be illegal to do so. +
  • freq / bWidth / rAmpl / sens
    + Set the CUL frequency / bandwidth / receiver-amplitude / sensitivity. + Use it with care, it may destroy your hardware and it even may be + illegal to do so. +

  • +
  • led>
    + Set the CUL led off (00), on (01) or blinking (02).

  • @@ -1527,6 +1531,8 @@ A line ending with \ will be concatenated with the next one, so long lines
  • version
    return the CUL firmware version

  • +
  • uptime
    + return the CUL uptime (time since CUL reset).
  • raw
    Issue a CUL firmware command, and wait for one line of data returned by the CUL. See the CUL firmware README document for details on CUL diff --git a/fhem.pl b/fhem.pl index df8cc40d8..de872d654 100755 --- a/fhem.pl +++ b/fhem.pl @@ -148,7 +148,7 @@ my %intAt; # Internal at timer hash. my $nextat; # Time when next timer will be triggered. my $intAtCnt=0; my $AttrList = "room comment"; -my $cvsid = '$Id: fhem.pl,v 1.61 2008-12-28 14:36:58 rudolfkoenig Exp $'; +my $cvsid = '$Id: fhem.pl,v 1.62 2009-01-03 12:30:29 rudolfkoenig Exp $'; my $namedef = "where is either:\n" . "- a single device name\n" . @@ -890,8 +890,8 @@ DoSet(@) my @a = @_; my $dev = $a[0]; - return "No set implemented for $dev" - if(!$defs{$dev} || !$modules{$defs{$dev}{TYPE}}{SetFn}); + return "Please define $dev first" if(!$defs{$dev}); + return "No set implemented for $dev" if(!$modules{$defs{$dev}{TYPE}}{SetFn}); my $ret = CallFn($dev, "SetFn", $defs{$dev}, @a); return $ret if($ret);