LogiLcdColorSetBackground

  • Guten Abend miteinander.

    Hier im Forum gibt es bereits einen Beitrag zu diesem Problem jedoch nicht mit AutoIt (44433-Logitech-G19-Bildschirm-ansprechen-und-etwas-anzeigen) jedoch komme ich da nicht so ganz mit.
    Ich habe schon viele verschiedene Arten ausprobiert jedoch bekomme ich immer den Return 0x00000001.

    Ich hänge hier bei der Übergabe von "colorBitmap"
    Mein Code für den DllCall müsste meiner Meinung nach funktionieren.


    Spoiler anzeigen
    AutoIt: DllCall
    $LCDInitialize_DllCall = DllCall ($LCDSetBackground_LCDOpen, "ptr:cdecl", "LogiLcdColorSetBackground", "byte", $LCDSetBackground_Array)
    Spoiler anzeigen

    Hoffe mir kann hier jemand helfen hänge hier seit gestern fest und im Google komme ich leider auch nicht weiter mit dem Suchbegriff "AutoIt LogiLcdColorSetBackground" = 1 Treffer...

    Mit freundlichen Grüßen
    ZwergleAUT

  • Erstmal zwei Dinge:
    1) Der Rückgabetyp von "LogiLcdColorSetBackground" ist bool nicht ptr.
    2) Ein Wert ungleich 0 bedeutet bei der Funktion Erfolg.

    Und wg. dem letzten Grund hab ich kA wo das Problem ist.

  • Guten Abend CentuCore.

    Ok habe gerade ptr auf bool geändert nun bekomme ich 1 als Return.
    Jedoch bleibt die Farbe des Displays immer noch Schwarz.

    habe es auf 4 Arten Probiert jedoch alle ohne Erfolg Display bleibt immer Schwarz.
    Vermute das die 3te Art die richtige Art und Weise ist da hier der Array 1D ist und die selbe länge hat wie in dem Verlinkten Beitrag in #1.

    Spoiler anzeigen
    AutoIt
    Dim $LCDSetBackground_Array[320*240]
    For $Anzahl = 0 To (320*240)-1 Step 1
    	$LCDSetBackground_Array[$Anzahl] = Int (Random (0, 255))
    Next
    AutoIt
    Dim $LCDSetBackground_Array[320][240*4]
    For $Anzahl = 0 To (320)-1 Step 1
    	For $Anzahl2 = 0 To (240*4)-1 Step 1
    		$LCDSetBackground_Array[$Anzahl][$Anzahl2] = Int (Random (0, 255))
    	Next
    Next
    AutoIt
    Dim $LCDSetBackground_Array[320*240*4]
    For $Anzahl = 0 To (320*240*4)-1 Step 1
    	$LCDSetBackground_Array[$Anzahl] = Int (Random (0, 255))
    Next
    AutoIt
    Dim $LCDSetBackground_Array[320][240]
    For $Anzahl = 0 To (320)-1 Step 1
    	For $Anzahl2 = 0 To 240-1 Step 1
    		$LCDSetBackground_Array[$Anzahl][$Anzahl2] = Int (Random (0, 255))
    	Next
    Next

    2 Mal editiert, zuletzt von ZwergleAUT (20. Dezember 2015 um 17:04)

  • Du hast eh nie was falsch gemacht, ansonten wär der Returnvalue 0.
    Du hast nur die Doku nicht komplett gelesen...dir fehlt ein LogiLcdUpdate-Aufruf :)

  • Überarbeitet (Hat sich Erledigt)


    Hallo.

    Schön wäre der Fehler ;)

    Rufe die Funcs in folgender Reihenfolge auf jedoch wird der Hintergrund nicht geändert.
    Title und Text schreiben ist kein Problem also Initialisieren, Update, ... funktioniert.


    Spoiler anzeigen
    AutoIt: Aufruf-Reihenfolge
    _LogitechGaming_LCD_Open
    _LogitechGaming_LCD_Initialize
    _LogitechGaming_LCD_SetBackground
    _LogitechGaming_LCD_Update
    Code
    Func _LogitechGaming_LCD_Open ($LCDOpen_File = @ScriptDir & "\dll\x86\LogitechLcdEnginesWrapper.dll")
    	If FileExists ($LCDOpen_File) = 0 Then Return "-1"
    	$LCDOpen_DllOpen = DllOpen ($LCDOpen_File)
    	If $LCDOpen_DllOpen = -1 Then Return "-2"
    	Return $LCDOpen_DllOpen
    EndFunc
    AutoIt: _LogitechGaming_LCD_Initialize
    Func _LogitechGaming_LCD_Initialize ($LCDInitialize_LCDOpen, $LCDInitialize_AppletName, $LCDInitialize_LCDType = $_LGLCD_TypeColor)
    	If $LCDInitialize_LCDOpen = "" Or $LCDInitialize_LCDOpen = "-1" Or $LCDInitialize_LCDOpen = "-2" Then Return "-1"
    	$LCDInitialize_DllCall = DllCall ($LCDInitialize_LCDOpen, "bool:cdecl", "LogiLcdInit", "wstr", $LCDInitialize_AppletName, "int", $LCDInitialize_LCDType)
    	If IsArray ($LCDInitialize_DllCall) = 1 Then Return $LCDInitialize_DllCall[0]
    	Return $LCDInitialize_DllCall
    EndFunc
    AutoIt: _LogitechGaming_LCD_Update
    Func _LogitechGaming_LCD_Update ($LCDUpdate_LCDOpen)
    	If $LCDUpdate_LCDOpen = "" Or $LCDUpdate_LCDOpen = "-1" Or $LCDUpdate_LCDOpen = "-2" Then Return "-1"
    	$LCDInitialize_DllCall = DllCall ($LCDUpdate_LCDOpen, "int:cdecl", "LogiLcdUpdate")
    	If IsArray ($LCDInitialize_DllCall) Then Return $LCDInitialize_DllCall[0]
    	Return $LCDInitialize_DllCall
    EndFunc

    EDIT ----------------------------------

    Ok habe es nun hinbekommen, bei AutoIt wird eine DllStruct benötigt...
    Jedoch hänge ich hier gerade an den nächsten Problemen...

    1.) Ich Lade ein Bild mit GDIPlus in den Speicher und Prüfe die Width und Height auf die Pixel Länge/Höhe. (-> Funktioniert)
    2.) Danach lese ich die ganzen Farben aus und wollte diese in BGRA umwandeln jedoch funktioniert das nicht so wie ich wollte nun bekomme ich nur ein Weißes Display statt Bunt wie das Bild.
    3.) Dieser Vorgang ist ebenfalls SEHR langsam da er die Farben erst ein ein String Speichert und dann nochmals durchgeht... (eventuell liegt es am Alk das ich gerade nicht auf eine schnellere Lösung komme ^^)
    4.) Wie kann man am einfachsten ein Bild Pixel für Pixel <Blue, Green, Red, "Alpha Channel"> einzeln auslesen damit ich diese in die DllStruct übernehmen kann?

    Spoiler anzeigen

    4 Mal editiert, zuletzt von ZwergleAUT (20. Dezember 2015 um 17:03)

  • Okay, ich nehm den Hieb mit der Doku zurück. Ich war verwirrt, weil du immer wieder die Programmiersprache gewechselt hast, bzw bei AutoIt nur 'ne Variable dastand.

    Die einfachste Variante ist mittels GetPixel zurarbeiten und dann die einzelnen Werte aufzurtrennen und wieder zusammen zu setzen.

    Spoiler anzeigen
    AutoIt
    $pixel = _GDIPlus_BitmapGetPixel(...)
    ;splitten
    $alpha = BitShift(BitAnd($pixel, 0xff000000), 24)
    $red = BitShift(BitAnd($pixel, 0x00ff0000), 16)
    $green = BitShift(BitAnd($pixel, 0x0000ff00), 8)
    $blue = BitShift(BitAnd($pixel, 0x000000ff), 0)

    Oder du verwendest _GDIPlus_BitmapLockBits() da wird gleich konvertiert und gleich für die Logitech API verwendbar.

  • Guten Morgen.

    Macht doch nichts hätte ja sein können.


    Die Farben Auslesen und übernehmen funktioniert jedoch das LCD hat ein komplett anderes Bild.
    Bei Alpha kommt der Return -1, sollte da nicht auch 0 - 255 als Return kommen wie bei RGB?

    Habe es mit jpg und mit bmp wie in der Hilfe versucht jedoch beides erstellt das selbe LCD Bild.


    Habe gerade gesehen das von Gestern noch eine Änderung beim DllCall Aufruf war.

    Spoiler anzeigen
    AutoIt
    DllCall ($LCDOpen, "bool:cdecl", "LogiLcdColorSetBackground", "BYTE", DllStructGetPtr ($DllStructCreate))

    bei BYTE war PTR wann ich da BYTE stehen habe stürzt mir das Script ab mit Folgendem Consolen Eintrag:

    Spoiler anzeigen

    --> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
    !>12:42:19 AutoIt3.exe ended.rc:-1073741819
    +>12:42:19 AutoIt3Wrapper Finished.
    >Exit code: 3221225477 Time: 3.147

    Mit STR und WSTR bekomme ich wieder ein anderes Bild auf dem LCD angezeigt alles schwarz nur in der Mitte farbige Punkte.

    Mit PTR bekomme ich das Bild wo angehängt wurde <IMAG0249[1].jpg>.

    Verwende ich STRUCT bekomme ich als Return beim Bild ändern 0 (False) und das LCD bleibt schwarz.


    Spoiler anzeigen
    Spoiler anzeigen

    So sollte das LCD aussehen:
    So sieht das LCD aus: IMAG0249[1].jpg

    2 Mal editiert, zuletzt von ZwergleAUT (20. Dezember 2015 um 17:03)

  • Dass das Skript abstürzt wenn du BYTE statt PTR verwendest liegt daran, dass du nicht die richtigen Typen verwendest.
    Die Funktion erwartet einen Zeiger auf die Bitmap also musst du auch einen Pointer übergeben,

    Das Format der Bitmap (für das Logi-Sdk) ist ein simples ARGB und das ist dasselbe wie von einem GetPixel-Aufruf.
    Also musst du nichts konvertieren, sondern machst folgendes:

    AutoIt
    Local $struct = DllStructCreate("dword pixels[" & $numpixels "]")
    For $w = 0 to $BitmapWidth - 1
    	For $h = 0 to $BitmapHeight - 1
    		DllStructSetData($struct, "pixels", BitmapGetPixel($bmp, $w, $h), $w * $h)
    	Next
    Next
    
    
    LogiLcdSetBackground(..., DllstructGetPtr($struct, "pixels"))
  • Hallo CentuCore.

    Danke für deinen Tipp mit bisschen Rumprobieren habe ich es nun hinbekommen musste noch Width und Height umdrehen das zuerst Height und dann Width in der Schleife kommt da es sonst die Farben zusammengewürfelt hatte...

    Ob Mono funktioniert kann ich leider nicht sagen da ich keine Tastatur zum Testen habe.

    Spoiler anzeigen


    Ich sage mal Danke für die schnelle und nette Hilfe ( @CentuCore)