AutoIt und IgorPlug

  • Hallo Zusammen.

    Erst einmal muss ich mein Lob aussprechen für das Geniale Programm ;)

    Nun komme ich aber leider an meine Grenzen. Daher hoffe ich das ihr mir helfen könnt.
    Ich möchte gerne meinen USB-IR Empfänger (für Fernbedienungen) über AutoIt auswerten. Der Empfänger ist ein Bausatz der mit dem IgorPlug arbeitet. In der Doku. (im Anhang) von Igor kann man entnehmen wie man mit der DLL kommuniziert. Ich bekomme es leider nicht hin. Könnt ihr mir bitte ein kleines Code-Beispiel geben?

    Vielen dank für eure Unterstützung.

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

    Einmal editiert, zuletzt von Homer J. S. (31. Mai 2009 um 12:58)

  • Ich denke, die DLLCalls sollten in etwa so aussehen ;) Den Rest schaffst du acuh alleine denke ich.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $IgorUSBDLL = DllOpen("IgorUSB.dll");
    ;~ //return values from IgorUSBDLL functions:
    Global Const $NO_ERROR = 0;
    Global Const $DEVICE_NOT_PRESENT = 1;
    Global Const $NO_DATA_AVAILABLE = 2;
    Global Const $INVALID_BAUDRATE = 3;
    Global Const $OVERRUN_ERROR = 4;
    Global Const $DLLCALL_ERROR = 5;

    [/autoit] [autoit][/autoit] [autoit]

    ;~ int __stdcall DoGetInfraCode(uchar * TimeCodeDiagram, int DummyInt, int * DiagramLength);
    Func _DoGetInfraCode(ByRef $TimeCodeDiagram, ByRef $DiagramLength)
    ; Prog@ndy
    $TimeCodeDiagram = DllStructCreate("byte[256]")
    $pTimeCodeDiagram = DllStructGetPtr($TimeCodeDiagram)
    $DiagramLength = 0
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoGetInfraCode", "ptr", $pTimeCodeDiagram, "int", 0, "int*", $DiagramLength)
    If @error Then Return SetError(5,@error, False)
    $DiagramLength = $aREsult[3]
    Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    EndFunc
    ;~ int __stdcall DoSetDataPortDirection(uchar DirectionByte);
    Func _DoSetDataPortDirection($DirectionByte)
    ; Author: Prog@ndy
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoSetDataPortDirection", "byte", $DirectionByte)
    If @error Then Return SetError( $DLLCALL_ERROR ,@error, False)
    Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    EndFunc
    ;~ int __stdcall DoGetDataPortDirection(uchar * DataDirectionByte);
    Func _DoGetDataPortDirection(ByRef $DataDirectionByte)
    ; Author: Prog@ndy
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoGetDataPortDirection", "byte*", $DataDirectionByte)
    If @error Then Return SetError( $DLLCALL_ERROR ,@error, False)
    $DataDirectionByte = $aREsult[1]
    Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    EndFunc
    ;~ int __stdcall DoSetOutDataPort(uchar DataOutByte);
    Func _DoSetOutDataPort($DataOutByte)
    ; Author: Prog@ndy
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoSetOutDataPort", "byte", $DataOutByte)
    If @error Then Return SetError( $DLLCALL_ERROR ,@error, False)
    Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    EndFunc
    ;~ int __stdcall DoGetOutDataPort(uchar * DataOutByte);
    Func _DoGetOutDataPort(ByRef $DataOutByte)
    ; Author: Prog@ndy
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoGetOutDataPort", "byte*", $DataOutByte)
    If @error Then Return SetError( $DLLCALL_ERROR ,@error, False)
    $DataOutByte = $aREsult[1]
    Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    int __stdcall DoGetInDataPort(uchar * DataInByte);
    int __stdcall DoEEPROMRead(uchar Address, uchar * DataInByte);
    int __stdcall DoEEPROMWrite(uchar Address, uchar DataOutByte);
    int __stdcall DoRS232Send(uchar DataOutByte);
    int __stdcall DoRS232Read(uchar * DataInByte);
    int __stdcall DoSetRS232Baud(int BaudRate);
    int __stdcall DoGetRS232Baud(int * BaudRate);
    #ce

    [/autoit]
  • Vielen Dank für deine schnelle Hilfe progandy.

    Werde das heute Abend mal testen und über den Erfolg oder Misserfolg berichten!

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • Hallo progandy.

    Habe gestern dein Code getestet mit einem Teilerfolg.

    Hier ist mein Testcode:

    Spoiler anzeigen
    [autoit]


    Global Const $IgorUSBDLL = DllOpen("IgorUSB.dll");
    ;~ //return values from IgorUSBDLL functions:
    Global Const $NO_ERROR= 0;
    Global Const $DEVICE_NOT_PRESENT = 1;
    Global Const $NO_DATA_AVAILABLE = 2;
    Global Const $INVALID_BAUDRATE = 3;
    Global Const $OVERRUN_ERROR = 4;
    Global Const $DLLCALL_ERROR = 5;

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Call("_DoGetInfraCode", 83, 256)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _DoGetInfraCode(ByRef $TimeCodeDiagram, ByRef $DiagramLength)
    ; Prog@ndy
    $TimeCodeDiagram = DllStructCreate("byte[256]")
    $pTimeCodeDiagram = DllStructGetPtr($TimeCodeDiagram)
    $DiagramLength = 0
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoGetInfraCode", "ptr", $pTimeCodeDiagram, "int", 0, "int*", $DiagramLength)
    If @error Then Return SetError(5,@error, False)
    $DiagramLength = $aREsult[3]
    ;Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    MsgBox(4096, "Test", $aREsult[0] & " " & $aREsult[1] & " " & $aREsult[2] & " " & $aREsult[3])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    int __stdcall DoGetInDataPort(uchar * DataInByte);
    int __stdcall DoEEPROMRead(uchar Address, uchar * DataInByte);
    int __stdcall DoEEPROMWrite(uchar Address, uchar DataOutByte);
    int __stdcall DoRS232Send(uchar DataOutByte);
    int __stdcall DoRS232Read(uchar * DataInByte);
    int __stdcall DoSetRS232Baud(int BaudRate);
    int __stdcall DoGetRS232Baud(int * BaudRate);
    #ce

    [/autoit]

    Folgende Ergebnisse habe ich bekommen:

    Wenn das Gerät nicht angeschlossen ist:
    $aREsult[0] = 1
    $aREsult[1] = 0x013C1058
    $aREsult[2] = 0
    $aREsult[3] = 0

    Wenn das Gerät angeschlossen ist:
    $aREsult[0] = 0
    $aREsult[1] = 0x013C1058
    $aREsult[2] = 0
    $aREsult[3] = 0

    Wenn das Gerät angeschlossen ist und dann irgend eine Taste von der Fernbedienung gedrückt wurde:
    $aREsult[0] = 0
    $aREsult[1] = 0x013C1058
    $aREsult[2] = 0
    $aREsult[3] = 23

    Der Teilerfolg zeigt, das dein Code mir einen vorherigen Tastendruck der Fernbedienung anzeigt :D
    Leider zeigt mir der Code, egal bei was für einem Tastendruck der Fernbedienung , immer nur im $aREsult[3] die 23 an
    Wenn ich die "23" abgerufen habe und dann denn Code erneut ausführe, dann zeigt mir $aREsult[3] die 0 wieder an.

    Ich habe unterschiedliche Variablentypen und werte getestet mit dem Ergebniss, das sich dann zwar $aREsult[1] ändert aber bei
    einem Tastendruck kommt wieder die 23 bei $aREsult[3].
    Den Empfänger habe ich mit EventGhost getestet um diesen als Fehlerquelle auszuschliessen. Der Test war erfolgreich und somit funktioniert
    der Empänger einwandfrei.

    Das antwortet EventGhost:
    IgorPlugUSB.Unknown.15F5DDD (Taste Volume +)
    IgorPlugUSB.Unknown.17F5DDD (Taste Volume -)

    Hast du eine Idee was das sein bzw. wie man das lösen könnte?
    Vielen dank schonmal für deine Hilfe.

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • Das heißt doch, dass es funktoiniert ;)
    Das Ergebnis ist eine DLLStruct , die du in $TimeCodeDiagram erhältst. $DiagramLength gibt an, wie viele Bytes der Struktur belegt sind (die ersten 23 Bytes). Aufrufen musst du also so: (mit der unveränderten Funktion)

    [autoit]

    Local $paramTimeCodeDiagram, $paramDiagramLength
    While 1
    If _DoGetInfraCode($paramTimeCodeDiagram, $paramDiagramLength) = $NO_ERROR _
    And $paramDiagramLength > 0 _
    Then
    $ReceivedData = BinaryMid(DllStructGetData($paramTimeCodeDiagram),1 $paramDiagramLength)
    ToolTip($ReceivedData, 10, 10, "IR - Empfangene Daten")
    EndIf
    Sleep(10)
    WEnd

    [/autoit]
  • Hallo progandy.

    Habe deinen Aufruf verwendet. Die If-Abfrage habe ich angepasst, da diese einen Fehler aufgewiesen hat.

    Nach einem neuen Test kam dann folgende Fehlerausgabe in der Console wenn ich einen IR-Code mir der FB geschickt habe:

    C:\Dokumente und Einstellungen\... : ==> Incorrect number of parameters in function call.:
    $ReceivedData = BinaryMid(DllStructGetData($paramTimeCodeDiagram),1 $paramDiagramLength)
    $ReceivedData = BinaryMid(^ ERROR

    Hier ist der aktuelle Code:

    Spoiler anzeigen
    [autoit]

    Global Const $IgorUSBDLL = DllOpen("IgorUSB.dll");
    ;~ //return values from IgorUSBDLL functions:
    Global Const $NO_ERROR= 0;
    Global Const $DEVICE_NOT_PRESENT = 1;
    Global Const $NO_DATA_AVAILABLE = 2;
    Global Const $INVALID_BAUDRATE = 3;
    Global Const $OVERRUN_ERROR = 4;
    Global Const $DLLCALL_ERROR = 5;
    Global $tempi = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;While 1
    ;Call("_DoGetInfraCode", 83, 256)
    ;WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $paramTimeCodeDiagram, $paramDiagramLength
    While 1
    If _DoGetInfraCode($paramTimeCodeDiagram, $paramDiagramLength) = $NO_ERROR And $paramDiagramLength > 0 Then
    $ReceivedData = BinaryMid(DllStructGetData($paramTimeCodeDiagram),1 $paramDiagramLength)
    MsgBox(4096, "Test", $ReceivedData)
    EndIf
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _DoGetInfraCode(ByRef $TimeCodeDiagram, ByRef $DiagramLength)
    ; Prog@ndy
    $TimeCodeDiagram = DllStructCreate("byte[256]")
    $pTimeCodeDiagram = DllStructGetPtr($TimeCodeDiagram)
    $DiagramLength = 0
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoGetInfraCode", "ptr", $pTimeCodeDiagram, "int", 0, "int*", $DiagramLength)
    If @error Then Return SetError(5,@error, False)
    $DiagramLength = $aREsult[3]
    MsgBox(4096, "Test 2", $aREsult[0] & " " & $aREsult[1] & " " & $aREsult[2] & " " & $aREsult[3])
    EndFunc

    [/autoit]

    Was habe ich falsch gemacht?
    Danke für deine Bemühungen!

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • ließ doch mal die Fehlermeldung...
    ich hab zwischen 1 $paramDiagramLength ein Komma vergessen. Und Ich hab gerade gemerkt, dass ich in der If-Abfrage aus Versehen was falsches stehen hab. Korrigiert:

    Spoiler anzeigen
    [autoit]

    Global Const $IgorUSBDLL = DllOpen("IgorUSB.dll");
    ;~ //return values from IgorUSBDLL functions:
    Global Const $NO_ERROR= 0;
    Global Const $DEVICE_NOT_PRESENT = 1;
    Global Const $NO_DATA_AVAILABLE = 2;
    Global Const $INVALID_BAUDRATE = 3;
    Global Const $OVERRUN_ERROR = 4;
    Global Const $DLLCALL_ERROR = 5;

    [/autoit] [autoit][/autoit] [autoit]

    Local $paramTimeCodeDiagram, $paramDiagramLength
    While 1
    If _DoGetInfraCode($paramTimeCodeDiagram, $paramDiagramLength) = True And $paramDiagramLength > 0 Then
    $ReceivedData = BinaryMid(DllStructGetData($paramTimeCodeDiagram, 1),1 $paramDiagramLength)
    MsgBox(4096, "Test", $ReceivedData)
    EndIf
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;~ int __stdcall DoGetInfraCode(uchar * TimeCodeDiagram, int DummyInt, int * DiagramLength);
    Func _DoGetInfraCode(ByRef $TimeCodeDiagram, ByRef $DiagramLength)
    ; Prog@ndy
    $TimeCodeDiagram = DllStructCreate("byte[256]")
    $pTimeCodeDiagram = DllStructGetPtr($TimeCodeDiagram)
    $DiagramLength = 0
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoGetInfraCode", "ptr", $pTimeCodeDiagram, "int", 0, "int*", $DiagramLength)
    If @error Then Return SetError(5,@error, False)
    $DiagramLength = $aREsult[3]
    Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    EndFunc

    [/autoit]
  • Hallo progandy.

    Leider immer noch folgende Fehlermeldung:

    C:\Dokumente und Einstellungen\...(19) : ==> Incorrect number of parameters in function call.:
    $ReceivedData = BinaryMid(DllStructGetData($paramTimeCodeDiagram), 1,$paramDiagramLength)
    $ReceivedData = BinaryMid(^ ERROR

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • Habs noch mal geändert. OMG. gleich zwei Fehler in einer Zeile ;( Das kommt davon, wenn man Code nicht testen kann.

    Kopiers noch mal aus dem Post über dir.

  • Hallo progandy.

    Habe es nochmal Kopiert und das Komma eingefügt und es antwortet mir :D
    Werde die Codes der FB mal Testen und mich dann nochmal melden.

    Vielen dank schonmal für deine Hilfe!!

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • Hallo progandy.

    Habe einige Tests mit einer "Sony CD-Player Fernbedienung" gemacht.


    Test Play-Taste

    In EventGhost bekomme ich folgenden Wert bei drücken der Play-Taste: IgorPlugUSB.SIRC12.08B2
    Beim loslassen passiert nichts.

    Bei dem AutoIt Code bekomme ich folgende Werte beim drücken der Play-Taste:
    (Einmal drücken der Taste liefert erst die erste Zeile beim loslassen die zweite Zeile)

    Test 1:
    Erste Zeile: 0x1D060806100509050905100510060806100509050905090510
    Zweite Zeile: 0x1C0608070E07070707070F060F0608070E070707070707070F

    Test 2:
    Erste Zeile: 0x1D0509051104090608060F0610050905100509060806080610
    Zweite Zeile: 0x1B0707070F06080608070E070E0707070F060806080707070E

    Test 3:
    Erste Zeile: 0x1D0509060F06080609051005100509060F0608060905090510
    Zweite Zeile: 0x1C0608060F07070707070E070F0608060F070707070707070F

    Test 4:
    Erste Zeile: 0x1D0509051005090608060F0510050905100509060806080610
    Zweite Zeile: 0x1D050905100608060806100510050905100608060806090510


    Test Pause-Taste

    In EventGhost bekomme ich folgenden Wert bei drücken der Pause-Taste: IgorPlugUSB.SIRC12.08B9
    Beim loslassen passiert nichts.

    Bei dem AutoIt Code bekomme ich folgende Werte beim drücken der Pause-Taste:
    (Einmal drücken der Taste liefert erst die erste Zeile beim loslassen die zweite Zeile)

    Test 1:
    Erste Zeile: 0x1D06100509050905100510060F06090510050905090608060F
    Zweite Zeile: 0x1D06100509050905100510060F06090510050905090509060F

    Test 2:
    Erste Zeile: 0x1D051005090509060F06100510050905100509060806090510
    Zweite Zeile: 0x1D051005090509060F06100510050905100608060806080610

    Test 3:
    Erste Zeile: 0x1D060F06080609051005100510060806100509050905090510
    Zweite Zeile: 0x1D060F0609050905100510060F060806100509050905090510

    Test 4:
    Erste Zeile: 0x1C060F06080707070E070E070F0608060F070707070707070F
    Zweite Zeile: 0x1D051005090608060F06100510050905100608060806090510


    Wie man bei den Tests sehen kann, bekomme ich immer etwas anderes zurück geliefert :cursing:


    Der aktuelle AuotIt code:

    Spoiler anzeigen
    [autoit]

    Global Const $IgorUSBDLL = DllOpen("IgorUSB.dll");
    Global Const $NO_ERROR= 0;
    Local $paramTimeCodeDiagram, $paramDiagramLength

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    If _DoGetInfraCode($paramTimeCodeDiagram, $paramDiagramLength) = True And $paramDiagramLength > 0 Then
    $ReceivedData = BinaryMid(DllStructGetData($paramTimeCodeDiagram, 1), 1,$paramDiagramLength)
    MsgBox(4096, "IR-Empfangen",$ReceivedData)
    EndIf
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _DoGetInfraCode(ByRef $TimeCodeDiagram, ByRef $DiagramLength)
    ; Prog@ndy
    $TimeCodeDiagram = DllStructCreate("byte[256]")
    $pTimeCodeDiagram = DllStructGetPtr($TimeCodeDiagram)
    $DiagramLength = 0
    Local $aREsult = DllCall($IgorUSBDLL, "int", "DoGetInfraCode", "ptr", $pTimeCodeDiagram, "int", 0, "int*", $DiagramLength)
    If @error Then Return SetError(5,@error, False)
    $DiagramLength = $aREsult[3]
    ;MsgBox(4096, "IR-Empfangen",$aREsult[1] & "-" & $aREsult[2] & "-" & $aREsult[3])
    Return SetError($aREsult[0], 0, $aREsult[0] = $NO_ERROR)
    EndFunc

    [/autoit]

    Im Anhang habe ich das Plugin von EventGhost im txt-Format angehängt.
    Hast du (oder ein anderer) noch Ideen wie man das Lösen kann ?

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • Hallo progandy.

    Mit der Sleep Time ist es besser geworden aber immer noch nicht Perfekt.

    Mit dem Code von Kooders.com bin ich nicht zu recht gekommen.
    Kannst du mir, auch wenn ich gefahr laufe dich zu nerven, bei dem Code helfen?

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • Das hat mich jezt auch interessiert. Zumindest die Testcodes geben bei mir übereinstimmende Werte ;) ( nur ganz am Ende sind ein paar Testzeilen)

    Spoiler anzeigen
    [autoit]

    Func ShiftInBits(ByRef Const $data, $start, $end, $threshold)
    Local $buffer = 0
    for $i = $start To $end + 1 Step 2
    $buffer = BitShift($buffer, -1)
    if $data[$i] >= $threshold Then _
    $buffer = BitOR($buffer, 1)
    Next
    return $buffer
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ShiftInBitsReverse(ByRef Const $data, $start, $end, $threshold)
    Local $buffer = 0
    for $i = $end - 1 To $start - 1 Step -2
    $buffer = BitShift($buffer, -1)
    if $data[$i] >= $threshold Then _
    $buffer = BitOR($buffer, 1)
    Next
    return $buffer
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Rc5Decode(ByRef Const $data, $start, $end, $threshold)
    Local $state = 0
    Local $buffer = 1
    Local $length = 0, $value
    for $i = $start To $end
    $value = $data[$i]
    if $state = 0 Then ; # Mid1
    if $value < $threshold Then
    $state = 1
    else
    $state = 2
    $buffer = BitShift($buffer, -1)
    $length += 1
    EndIf
    ElseIf $state = 1 Then ; # Start1
    if $value < $threshold Then
    $state = 0
    $buffer = BitShift($buffer, -1)
    $buffer = BitOR($buffer, 1)
    $length += 1
    else
    return ""
    EndIf
    ElseIf $state = 2 Then ; # Mid0
    if $value < $threshold Then
    $state = 3
    else
    $state = 0
    $buffer = BitShift($buffer, -1)
    $buffer = BitOR($buffer, 1)
    $length += 1
    EndIf
    Else ; # Start0
    if $value < $threshold Then
    $state = 2
    $buffer = BitShift($buffer, -1)
    $length += 1
    else
    return ""
    EndIf
    EndIf
    Next
    return $buffer
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $sampleTime=85.3
    Global $IrDecoder_sampleTime = $sampleTime

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $SHARP_TIME = 0.000320 ;# 320 micro-seconds
    Global Const $IrDecoder_SHARP_PULSE_MIN = _IrDecoder_MakeMinTime($SHARP_TIME)
    Global Const $IrDecoder_SHARP_PULSE_MAX = _IrDecoder_MakeMaxTime($SHARP_TIME)
    Global Const $IrDecoder_SHARP_SPACE0_MIN = _IrDecoder_MakeMinTime(2 * $SHARP_TIME)
    Global Const $IrDecoder_SHARP_SPACE0_MAX = _IrDecoder_MakeMaxTime(2 * $SHARP_TIME)
    Global Const $IrDecoder_SHARP_SPACE1_MIN = _IrDecoder_MakeMinTime(5 * $SHARP_TIME)
    Global Const $IrDecoder_SHARP_SPACE1_MAX = _IrDecoder_MakeMaxTime(5 * $SHARP_TIME)
    Global Const $IrDecoder_SHARP_THRESHOLD = _IrDecoder_MakeTime(3.5 * $SHARP_TIME)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $SIRC_TIME = 0.600e-3 ;# 600 micro-seconds
    Global Const $IrDecoder_SIRC_PREPULSE_MIN = _IrDecoder_MakeMinTime(4 * $SIRC_TIME)
    Global Const $IrDecoder_SIRC_PREPULSE_MAX = _IrDecoder_MakeMaxTime(4 * $SIRC_TIME)
    Global Const $IrDecoder_SIRC_SPACE_MIN = _IrDecoder_MakeMinTime($SIRC_TIME)
    Global Const $IrDecoder_SIRC_SPACE_MAX = _IrDecoder_MakeMaxTime($SIRC_TIME)
    Global Const $IrDecoder_SIRC_PULSE0_MIN = _IrDecoder_MakeMinTime($SIRC_TIME)
    Global Const $IrDecoder_SIRC_PULSE0_MAX = _IrDecoder_MakeMaxTime($SIRC_TIME)
    Global Const $IrDecoder_SIRC_PULSE1_MIN = _IrDecoder_MakeMinTime(2 * $SIRC_TIME)
    Global Const $IrDecoder_SIRC_PULSE1_MAX = _IrDecoder_MakeMaxTime(2 * $SIRC_TIME)
    Global Const $IrDecoder_SIRC_THRESHOLD = _IrDecoder_MakeTime(1.5 * $SIRC_TIME)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $RC5_TIME = 0.889e-3 ;# 889 micro-seconds
    Global Const $IrDecoder_RC5_PULSE_MIN = _IrDecoder_MakeMinTime($RC5_TIME)
    Global Const $IrDecoder_RC5_PULSE_MAX = _IrDecoder_MakeMaxTime($RC5_TIME * 2.0)
    Global Const $IrDecoder_RC5_SPACE_MIN = _IrDecoder_MakeMinTime($RC5_TIME)
    Global Const $IrDecoder_RC5_SPACE_MAX = _IrDecoder_MakeMaxTime($RC5_TIME * 2.0)
    Global Const $IrDecoder_RC5_THRESHOLD = _IrDecoder_MakeTime($RC5_TIME * 1.50)
    Global Const $IrDecoder_suppressRc5ToggleBit = True

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _IrDecoder_MakeMinTime($tvalue)
    return int(round((($tvalue / $IrDecoder_sampleTime) * 0.66) - 2))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _IrDecoder_MakeMaxTime($tvalue)
    return int(round((($tvalue / $IrDecoder_sampleTime) * 1.33) + 2))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _IrDecoder_MakeTime($tvalue)
    return int(round(($tvalue / $IrDecoder_sampleTime)))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Decode(ByRef Const $data, $dataLen)
    if $dataLen < 3 Then _
    return ""
    Local $min_high = 10000
    Local $min_low = 10000
    Local $max_high = 0
    Local $max_low = 0
    for $i = 2 To $dataLen-1
    $value = $data[$i]
    if Mod($i , 2) Then
    if $value > $max_low Then _
    $max_low = $value
    if $value < $min_low Then _
    $min_low = $value
    else
    if $value > $max_high Then _
    $max_high = $value
    if $value < $min_high Then _
    $min_high = $value
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $prePulse = $data[0]
    $preSpace = $data[1]

    [/autoit] [autoit][/autoit] [autoit]

    ;#print min_high, max_high, min_low, max_low
    if ( _
    $dataLen = 31 And _
    $prePulse >= $IrDecoder_SHARP_PULSE_MIN And _
    $prePulse <= $IrDecoder_SHARP_PULSE_MAX And _
    $preSpace >= $IrDecoder_SHARP_SPACE0_MIN And _
    $preSpace <= $IrDecoder_SHARP_SPACE1_MAX And _
    $min_high >= $IrDecoder_SHARP_PULSE_MIN And _
    $max_high <= $IrDecoder_SHARP_PULSE_MAX And _
    $min_low >= $IrDecoder_SHARP_SPACE0_MIN And _
    $max_low <= $IrDecoder_SHARP_SPACE1_MAX _
    ) Then
    $code = ShiftInBits($data, 1, 30, $IrDecoder_SHARP_THRESHOLD)
    if BitAND($code , 256) Then _
    $code = BitAND($code, BitNOT(0x03ff))
    return StringFormat("Sharp_%0.4X" , $code)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if ( _
    $prePulse >= $IrDecoder_SIRC_PREPULSE_MIN And _
    $prePulse <= $IrDecoder_SIRC_PREPULSE_MAX And _
    ( _
    ($dataLen = 25) Or _
    ($dataLen = 31) Or _
    ($dataLen = 41) _
    ) And _
    $min_high >= $IrDecoder_SIRC_PULSE0_MIN And _
    $max_high <= $IrDecoder_SIRC_PULSE1_MAX And _
    $min_low >= $IrDecoder_SIRC_SPACE_MIN And _
    $max_low <= $IrDecoder_SIRC_SPACE_MAX And _
    $preSpace >= $IrDecoder_SIRC_SPACE_MIN And _
    $preSpace <= $IrDecoder_SIRC_SPACE_MAX _
    ) Then
    $code = ShiftInBitsReverse($data, 2, $dataLen, $IrDecoder_SIRC_THRESHOLD)
    return StringFormat("SIRC%d_%0.4X" , $dataLen / 2, $code)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if ( _
    $prePulse >= $IrDecoder_RC5_PULSE_MIN And _
    $prePulse <= $IrDecoder_RC5_PULSE_MAX And _
    $preSpace >= $IrDecoder_RC5_SPACE_MIN And _
    $preSpace <= $IrDecoder_RC5_SPACE_MAX And _
    $min_high >= $IrDecoder_RC5_PULSE_MIN And _
    $max_high <= $IrDecoder_RC5_PULSE_MAX And _
    $min_low >= $IrDecoder_RC5_SPACE_MIN And _
    $max_low <= $IrDecoder_RC5_SPACE_MAX _
    ) Then
    $code = Rc5Decode($data, 0, $dataLen, $IrDecoder_RC5_THRESHOLD)
    if IsString($code)=False Then
    if $IrDecoder_suppressRc5ToggleBit Then _
    $code = BitAND($code , 0xF7FF)
    return StringFormat("RC5_%0.4X" , $code)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $level_high = ($min_high + $max_high) / 2
    $level_low = ($min_low + $max_low) / 2
    if ($max_high - $min_high) < 5 Then _
    $level_high += 4
    if ($max_low - $min_low) < 5 Then _
    $level_low += 4

    [/autoit] [autoit][/autoit] [autoit]

    $code = 3
    for $i = 0 To $dataLen-1
    $value = $data[$i]
    $code = BitShift($code , -1)
    if Mod($i , 2) Then
    if $value > $level_low Then _
    $code = BitOR($code, 1)
    else
    if $value > $level_high Then _
    $code = BitOR($code, 1)
    EndIf
    Next
    return StringFormat("U%X" , $code)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; testcode:
    ;~ $bin = Binary("0x1C060F06080707070E070E070F0608060F070707070707070F") ; U7415101
    ;~ $bin = Binary("0x1D051005090509060F06100510050905100509060806090510") ; U7415101

    [/autoit] [autoit][/autoit] [autoit]

    ;~ $bin = Binary("0x1D0509060F06080609051005100509060F0608060905090510")
    Local $Array[BinaryLen($bin)]
    For $i = 1 To BinaryLen($bin)
    $Array[$i-1] = Dec(Hex(BinaryMid($bin,$i,1)))
    Next
    MsgBox(0, '', Decode($Array,BinaryLen($bin)))

    [/autoit]
  • Hallo progandy.

    Das sieht gut aus. :thumbup:
    Ich habe das mal in den vorhanden-Code eingefügt und getestet. Meine ersten Tests bestätigen, das es scheinbar funktioniert :rock:

    Ein fettes Lob und Dank an dich !!!

    Ich habe übrigens bei Kooders.com den IrDecoder2 gefunden
    -> http://www.koders.com/python/fid3437…aspx?s=timer#L2

    Was ist deine meinung zu dem IrDecoder2? Lohn es sich, den auch noch für AutoIt um zu codieren?

    Gruß
    Homer J. S.

    ...wenn die Donuts auch nur halb so gut schmecken wie sie aussehen, dann sehen sie doppelt so gut aus wie sie schmecken...

  • Hallo progandy.

    Das sieht gut aus. :thumbup:
    Ich habe das mal in den vorhanden-Code eingefügt und getestet. Meine ersten Tests bestätigen, das es scheinbar funktioniert :rock:

    Ein fettes Lob und Dank an dich !!!

    Gern geschehen ;)


    Ich habe übrigens bei Kooders.com den IrDecoder2 gefunden
    -> http://www.koders.com/python/fid3437…aspx?s=timer#L2

    Was ist deine meinung zu dem IrDecoder2? Lohn es sich, den auch noch für AutoIt um zu codieren?

    Gruß
    Homer J. S.


    Ich denke, das lohnt sich nicht. Es würde auch gar nicht funktionieren. Der Code zum Dekodieren ist genau der gleiche, nur dass ein extra Thread im Hintergrund läuft, der das Dekodieren im Hintergrund erledigt, ohne das Prorgamm zu unterbrechen (mit AutoIt ist das nicht möglich)