[working as designed] IPS_RegisterVariableEvent() - mehrere Probleme

Folgende Sachen passieren bei IPS_RegisterVariableEvent() :

a) scheinbar werden im Augenblick nur Variablen vom Typ ‚String‘ registriert

b) eine Variable kann x-mal für ein Event und ein Skript registriert werden - in der Liste bei den Events des Skripts taucht die Variable entsprechende oft auf

Gruss,
Olli

Ergänzung:

man kann auch mit der IPS-Oberfläche eine Variable mehrfach einem Skript/Event zuordnen… macht das Sinn?

Gruss,
Olli

zu a)

zu b)
Könnte ich ändern. Kann ja aber sein, dass jemand ein Script doppelt triggern will/muss, zumal es ja für die einzelnen Sachen wie OnLimit, OnUpdate eh doppelt eingestellt werden kann (z.b. bei verschiedenen Limits)

paresy

Das ist Klasse! (und ein wenig gemein - das mit den ‚Variablentypen‘ :wink: )

Naja, ich versteh halt nicht warum man eine Variable mehrmals bei einem speziellen Event eines Skriptes unterbringen kann. Derzeit könnte ich z.B. 6 mal die Variable ‚foo‘ dem Event ‚OnUpdate‘ eines Skriptes zuordnen…

Gruss und Danke,
Olli

Ich habe den Link zu http://www.ipsymcon.de/forum/showthread.php?t=1748 grade mal in die Wiki eingetragen… besser als nix :wink:

Wenn jemand eine etwas abgesicherte Variante von IPS_RegisterVariableEvent() sucht kann es hiermit probieren:


//************************************************************************
 RegisterVariableEvent( $Varname: String, $EventType: String, $Script: String)
 
 Params:
   $Varname: your IPS-variable
   $EventType: "OnUpdate", "OnChange", "OnLimitExceed", "OnLimitDrop", "OnValue"
   $Script: your IPS-script
 Return:
   true = success
   false = fail
   
 Sample:
   RegisterVariableEvent( "myvar", "OnUpdate", "myscript")
************************************************************************/
function RegisterVariableEvent( $Varname, $EventType, $Script)
{
   if( !IPS_VariableExists( $Varname))    return( false);
   if( !IPS_ScriptExists( $Script)   )    return( false);
   
   $l = IPS_GetVariableEventList( $Varname);
   foreach( $l as $e)
   {
      if( $e['EventScript']==$Script && $e['EventType']==$EventType)
          return( false);
   }
   
   $vt = IPS_GetVariableType( $Varname);
   switch( $vt)
   {
      case 'Float'   : return( IPS_RegisterVariableEvent( $Varname, $EventType, 0.0 , $Script));
      case 'Boolean' : return( IPS_RegisterVariableEvent( $Varname, $EventType, true, $Script));
      case 'String'  : return( IPS_RegisterVariableEvent( $Varname, $EventType, ""  , $Script));
      case 'Integer' : return( IPS_RegisterVariableEvent( $Varname, $EventType, 0   , $Script));
      default        : return( false);
   }
}

Damit bietest du aber keinen Parameter für:

„OnLimitExceed“, „OnLimitDrop“, „OnValue“

Für die ist der 3. Parameter, damit IPS weiß auf welchen Wert getriggert werden soll. Deine Funktion macht nur für OnUpdate/OnChange sinn.

paresy

Ok, dann ein Update der Funktion um auch diese Fälle abzuhandeln:


/************************************************************************
 RegisterVariableEvent( $Varname: String, $EventType: String, $Script: String [, $TriggerValue: Mixed])
 Params:
   $Varname      : your IPS-variable (case-sensitive!)
   
   $EventType    : "OnUpdate", "OnChange", "OnLimitExceed", "OnLimitDrop", "OnValue"
   
   $Script       : your IPS-script (case-sensitiv!)
   
   $TriggerValue : (optional) value for Events "OnLimitExceed", "OnLimitDrop", "OnValue"
   
   $Mode         : (optional) "EREPLACE", "EADD" (case-sensitiv!)
                     EREPLACE= replace an existing event if the combination {$Varname, $EventType, $Script} exists
                     EADD    = allways add a new event
                   Default: 'EREPLACE'
 Return:
   true  = success
   false = fail
 Samples:
   RegisterVariableEvent( "myvar", "OnUpdate", "myscript");
   RegisterVariableEvent( "myvar", "OnValue", "myscript", 20);
   RegisterVariableEvent( "myvar", "OnValue", "myscript", 22, 'EADD');
   RegisterVariableEvent( "myvar", "OnUpdate", "myscript", null, 'EADD');
************************************************************************/
function RegisterVariableEvent( $Varname, $EventType, $Script, $TriggerValue=null, $Mode='EREPLACE')
{
   if( !IPS_VariableExists( $Varname))    return( false);
   if( !IPS_ScriptExists( $Script)   )    return( false);
   if( !in_array( $Mode, array('EREPLACE','EADD') ))
                                          return( false);
   switch( IPS_GetVariableType( $Varname))
   {
      case 'Float'   : $TriggerValue = ($TriggerValue==null) ? 0.0  : floatval($TriggerValue); break;
      case 'Boolean' : $TriggerValue = ($TriggerValue==null) ? true : $TriggerValue;           break;
      case 'String'  : $TriggerValue = ($TriggerValue==null) ? ""   : strval($TriggerValue);   break;
      case 'Integer' : $TriggerValue = ($TriggerValue==null) ? 0    : intval($TriggerValue);   break;
      default        : return( false);
   }
   if( $Mode == 'EREPLACE')
   {
      foreach( IPS_GetVariableEventList( $Varname) as $e)
      {
         if( $e['EventScript']==$Script && !strcasecmp($e['EventType'],$EventType) )
               IPS_UnregisterVariableEvent( $Varname, $e['EventType'], $e['EventTrigger'], $e['EventScript']);
      }
   }
   return( IPS_RegisterVariableEvent( $Varname, $EventType, $TriggerValue, $Script));
}

Mit dem letzten optionalen Parameter $Mode kann gesteuert werden, ob ein Event ersetzt werden soll (=‚EREPLACE‘) oder grundsätzlich hinzugefügt werden soll (=‚EADD‘) - egal ob es Sinn macht oder nicht.

Bei $Mode == ‚EREPLACE‘ (der Default) und folgendem Aufruf:


RegisterVariableEvent("myTempVariable", "OnValue", "myTempScript", 20.0);
RegisterVariableEvent("myTempVariable", "OnValue", "myTempScript", 22.0);

wird nur der letzte Aufruf mit dem Wert 22.0 in der Eventliste der Variable für das entsprechende Script+Eventtyp übrigbleiben.

Für die Eventtypen ‚OnChange‘ und ‚OnUpdate‘ reicht weiterhin ein Aufruf mit drei Parametern:


RegisterVariableEvent("myTempVariable", "OnChange", "myTempScript");

Gruss,
Olli