Registervariablen- Timing / I-O Zeiten

Hallo

ich habe eine Frage zur Benutzung von Registervariablen bzw. deren „Geschwindigkeit“.

WAS TUE ICH:
Ich sende an (Hifi-)Geräte via ClientSocket Datenpakete und bekomme Responses zurück.
Die Pakete, die ich aussende sind in der Größenordnung um 40 Bytes lang, ganz selten mal 1k (nu ein einziger Befehl ist so lange).

PROBLEM:
Gelegentlich ist die Response (noch) leer, im Folgeaufruf stehen dann zwei Responses im Buffer drin, einmal die „übersprungene“ und noch die aktuelle.

META-AUFBAU:
Grundsätzlicher Ablauf des Scripts (code siehe unten):

  • funktionsaufruf SendeDaten herstellen
  • funktionsaufruf SocketSendung durchführen
  • funktionsaufruf Response auswerten

Im Zuge des mittleren Funktionsaufrufs wird der Socketbefehl abgesetzt und hier dann auch das an den Empfangsevent gekoppelte Buffer-Auslesescript (siehe unten) ausgeführt.

DETAILS:
Mein Script im Event für empfangene Daten ist sehr kurz:


if ($IPS_SENDER == "RegisterVariable"):
	$RegVarID = $IPS_INSTANCE;
	$newdata = $IPS_VALUE;
else:
	// allow for execute to test: set variables
	$RegVarID = IPS_GetParent( $IPS_SELF);
	$newdata = date('Y.m.d H:m:s');
endif;


// READ BUFFER
$buf = RegVar_GetBuffer($RegVarID);

// WRITE NEW BUFFER == OLD BUFFER & NEW VALUE
RegVar_SetBuffer($RegVarID, $buf.$newdata);

return(true);

Das Script für Senden und Auswertung der empfangenen Daten ist auch nicht sehr groß. Ich habe TESTWEISE schon eine SLEEP Zeile zwischen abschicken der Daten und Auslesen der Buffer Variablen eingebaut, aber selbst bei Werten von 20 ms kriege ich noch dropouts.

Was kann ich da tun?

Ich hatte erwartet, dass der return im Aufruf des Socket-Kommanos erst dann kommt, wenn die Response (Handshake??) da ist.

Das scheint nicht der Fall zu sein. Muss ich da eine Warteschleifeauf eine (eigene) Semaphore machen, die ich vor dem Clientsocket setze und vor Aufruf der Response auslese oder geht das auch eleganter?

Hier das Hauptscript:



$Device['id'] = 26669 /*[CliSock.LINN#01.Majik DSI 01 [OFFICE]]*/; // WOHNEN
$Device['regvarid'] = 45053; // EVTL ABLEITEN !!!

$prm['lf'] = chr(13);
$prm['cr'] = chr(10);
$prm['nl'] = $prm['cr'];
$prm['cutoffright'] = 2;


$cmd = "all";
$cmd = "last";

$txtx = define_TransmitStrings($txtx);

$txKeys = array_keys( $txtx );
$max = count($txKeys)-1;
switch( $cmd ){
   case "last":
		$txKeysUse[] = $txKeys[$max];
   break;
   case "first":
		$txKeysUse[] = $txKeys[0];
   break;
   case "all":
		$txKeysUse = $txKeys;
   break;
};

$report[] = "SEND REPORT sending to ClientSocket " . IPS_GetName( $Device['id']) . '   [' . $Device['id'] . "] 
";
foreach( $txKeysUse as $txKey  ){

		action( $txtx[$txKey], $Device, $report, $prm );
	   IPS_Sleep(10); //################################## TESTWEISE EINGEBAUT
		response( $Device, $report, $prm );
		if( $cmd == "all" ){
		   IPS_Sleep(50);
		};
};



function define_TransmitStrings($txtx){
	$txtx['SetSource'] = 'ACTION Ds/Product 1 SetSourceIndex "0"' ; // SET Input Source
	$txtx['SetSourceIndexByName'] = 'ACTION Ds/Product 1 SetSourceIndexByName "Radio"'; // SET Input Source
	$txtx['SourceSystemName'] = 'ACTION Ds/Product 1 SourceSystemName "0"'; // GET System internal Name of Source # 0 ... Count
	$txtx['SourceCount'] = 'ACTION Ds/Product 1 SourceCount' ; // GET #of Sources available
	return( $txtx );
};



function action( $txActual, $Device, &$report, $prm ){

		$report[]= "send: [" . $txActual . "]" .  $prm['nl'];
		CSCK_SendText( $Device['id'], $txActual . $prm['nl']);

};


function response( $Device, &$report, $prm ){

	$response = RegVar_GetBuffer ( $Device['regvarid'] );
	echo "got from Buffer: " . $response;
	RegVar_SetBuffer ( $Device['regvarid'], NULL );
	$len = strlen($response);
	$lenUsed = $len - $prm['cutoffright'];
	$responseReport = substr( $response, 0, $lenUsed );
	$report[] = "response was: [" . $responseReport  . "]" . $prm['nl'];

};

function action( $txActual, $Device, &$report, $prm ){

		$report[]= "send: [" . $txActual . "]" .  $prm['nl'];
		CSCK_SendText( $Device['id'], $txActual . $prm['nl']);

};


function response( $Device, &$report, $prm ){

	$response = RegVar_GetBuffer ( $Device['regvarid'] );
	echo "got from Buffer: " . $response;
	RegVar_SetBuffer ( $Device['regvarid'], NULL );
	$len = strlen($response);
	$lenUsed = $len - $prm['cutoffright'];
	$responseReport = substr( $response, 0, $lenUsed );
	$report[] = "response was: [" . $responseReport  . "]" . $prm['nl'];

};