Ich versuche immer noch verzweifelt mit Chromoflex RC III über die Serielle Schnittstelle am PI betreiben (IPS 4.2)
Wenn ich das unten angeführte Skript nutze um zu inialisieren oder über den ColorPicker ( Chromoflex RC Steuerung mit RGB Fader und Color Picker )das ausführe bekomme ich die diese Meldung! Und die LED Stripes lassen sich nicht steuern.
04.05.2017 13:59:08*| ScriptEngine*| Semaphore 24055 for ScriptID 24055 was not released
Ich kann leider garnicht zu ordnen wo der Fehler liegen könnte, kann mir jemand erklären was es das genau mit " Semaphore " auf sich hat
<?
//ID der I/O Instanz vom Chromoflex RC III.
//Konfiguration: 115200, 8, 1, N
$id = 32594 /*[Chromoflex COM]*/; //I/O Instanz
/*******************************************************************************
Copyright 2012, IP-Symcon/meike0_0. Version 1.2.0 - DO NOT MODIFY BELOW THIS LINE!
********************************************************************************/
if($_IPS['SENDER'] == "RunScript")
{
if(isset($_IPS['Action']))
{
switch($_IPS['Action'])
{
case "Initialize":
Initialize();
break;
case "SetColor":
if(!isset($_IPS['Net']))
$_IPS['Net'] = 8;
if(!isset($_IPS['DeviceID']))
$_IPS['DeviceID'] = "000000";
if(!isset($_IPS['R']))
$_IPS['R'] = 0xFF;
if(!isset($_IPS['G']))
$_IPS['G'] = 0xFF;
if(!isset($_IPS['B']))
$_IPS['B'] = 0xFF;
if(!isset($_IPS['D']))
$_IPS['D'] = 0xFF;
if(IPS_SemaphoreEnter($_IPS['SELF'],5000)){}else
{
$x = "";
$x .= chr($_IPS['Net']); //Network
$x .= HexToStr($_IPS['DeviceID']); //Remote Serial
$x .= chr(GetSequenceNumber());
$x .= chr(0xFF).chr(0xFF).chr(0xFE); //PC Serial
$x .= chr(0x80); //Command: Write
$x .= chr(0x01); //RAM Adress (???)
$x .= chr(0x12); //ProgramPC (???)
$x .= chr(max(1, $_IPS['D'])); //Dimmer (0 = ON, 1 = 0%, 255 = 100%)
$x .= chr(0x00); //Index (???)
$x .= chr(0x01); //Dummy (???)
$x .= chr(0xFF); //Temp (???)
$x .= chr($_IPS['R']); //Red
$x .= chr($_IPS['G']); //Green
$x .= chr($_IPS['B']); //Blue
SPRT_SendText($id, CreatePacket($x));
IPS_Sleep(100);
IPS_SemaphoreLeave($_IPS["SELF"]);
}
break;
case "SetProgram":
if(!isset($_IPS['Net']))
$_IPS['Net'] = 8;
if(!isset($_IPS['DeviceID']))
$_IPS['DeviceID'] = "000000";
if(!isset($_IPS['P']))
$_IPS['P'] = 0;
// if(!isset($_IPS['D']))
// $_IPS['D'] = 0xFF;
if(IPS_SemaphoreEnter($_IPS['SELF'],5000)){}else
{
switch ($_IPS['P'])
{
case 0: //Aus
case 1: //Speichern&Aus
case 2: //Fix Color
case 3: //Color Change
case 4: //Med.Color
case 5: //Slow.Color
case 6: //Blob
case 7: //LSD
case 8: //Fire
case 9: //Flashes
case 10: //Bursts
case 11: //User 1
case 12: //User 2
case 13: //User 3
case 14: //Slow Strobo
case 15: //Strobo
case 16: //Fast Strobo
case 17: //Mix
case 18: //Color
$x = "";
$x .= chr($_IPS['Net']); //Network
$x .= HexToStr($_IPS['DeviceID']); //Remote Serial
$x .= chr(GetSequenceNumber());
$x .= chr(0xFF).chr(0xFF).chr(0xFE); //PC Serial
// $x .= chr(max(1, $_IPS['D'])); //Dimmer (0 = ON, 1 = 0%, 255 = 100%)
$x .= chr(0x80); //Index (???)
$x .= chr(0x01); //Dummy (???)
$x .= chr($_IPS['P']); //Temp (???)
$x .= chr(0x00); //Temp (???)
break;
}
SPRT_SendText($id, CreatePacket($x));
IPS_Sleep(100);
IPS_SemaphoreLeave($_IPS["SELF"]);
}
break;
}
}
}
if($_IPS['SENDER'] == "Execute")
{
Initialize();
IPS_Sleep(200);
IPS_RunScriptEx($_IPS['SELF'], Array("Action"=>"SetColor", "R"=> rand(0, 255), "G" => rand(0, 255), "B" => rand(0, 255)));
}
function Initialize()
{
global $id;
SPRT_SetDTR($id, true);
SPRT_SetRTS($id, true);
SPRT_SendText($id, "!n0701\r");
}
function GetSequenceNumber()
{
//32-47 Sequence Number (0..15 + 32)
$seq_id = 25812 /*[Scripte_oli\Scripte\Licht\RGB_Control\Sequence Number]*/;//CreateVariableByIdent($_IPS['SELF'], "SequenceNumber", "Sequence Number", 1);
$seq = GetValue($seq_id);
$seq = ($seq+1) % 16;
SetValue($seq_id, $seq);
return $seq + 32;
}
function CreateVariableByIdent($id, $ident, $name, $type)
{
$vid = @IPS_GetObjectIDByIdent($ident, $id);
if($vid === false)
{
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetIdent($vid, $ident);
IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
}
return $vid;
}
function CreatePacket($data)
{
return "!x0000".StrToHex(Chr(strlen($data)+2)).StrToHex($data).StrToHex(MakeCRC($data))."\r\r";
}
function MakeCRC($data)
{
// Fast generation of CRC by using a table...
$CRC_TABLE_A = Array(
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
);
$CRC_TABLE_B = Array(
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
);
$CRC_A = 0xFF;
$CRC_B = 0xFF;
for($i=0; $i<strlen($data); $i++)
{
$INDEX = $CRC_A ^ Ord($data{$i});
$CRC_A = $CRC_TABLE_A[$INDEX] ^ $CRC_B;
$CRC_B = $CRC_TABLE_B[$INDEX];
}
return Chr($CRC_B) . Chr($CRC_A);
}
//Copy&Paste from php.net (http://php.net/manual/de/function.hexdec.php)
function StrToHex($x) {
$s = '';
$p = str_split($x);
foreach($p as $c)
$s .= strtolower(sprintf("%02X",ord($c)));
return($s);
}
function HexToStr($x) {
$s = '';
$p = explode("
",trim(chunk_split($x,2)));
foreach($p as $h)
$s .= chr(hexdec($h));
return($s);
}
?>