Hi..
Danke nochmal water
Für alle die die Erweiterten Rückgabemöglichkeiten suchen...
MFG
Chris
Hi..
Danke nochmal water
Für alle die die Erweiterten Rückgabemöglichkeiten suchen...
MFG
Chris
Schau Dir die Start-/Endzeiten in meinem Beispiel (genauer die Vergleichsoperatoren) nochmals genauer an.
Danke
Immer die kleinen ">" und "<" ....
OK ich verstehe... das Objekt ist in der ersten Stelle gespeichert.....
Bekomme aber leider immer noch kein richtiges Ergebnis...
Global $oOutlook = _OL_Open()
;~ Global $aFolder = _OL_FolderAccess($oOutlook, "\\iCloud\calendar")
Global $aFolder = _OL_FolderAccess($oOutlook, "iCloud\Arbeit ausführend", $olFolderCalendar)
If @error <> 0 Then MsgBox(16, "", "@error = " & @error)
;~ _ArrayDisplay($aFolder )
;_OL_ItemFind($oOL, $vFolder, $iObjectClass = Default, $sRestrict = "", $sSearchName = "", $sSearchValue = "", $sReturnProperties = "", $sSort = "", $iFlags = 0, $sWarningClick = "")
Global $aItems = _OL_ItemFind($oOutlook,$aFolder[1], $olAppointment,"[Start]='2020-05-26 00:00' And [End]='2020-05-26 23:59'" )
If IsArray($aItems) Then
_ArrayDisplay($aItems)
Else
MsgBox(48, "", "@error = " & @error & ", @extended: " & @extended)
EndIf
Alles anzeigen
ergibt das...
MFG Chris
Hi water
Danke. Das sieht schon einmal viel besser aus.
Jetzt zeigt er mir bei ....
Global $oOutlook = _OL_Open()
Global $aFolder = _OL_FolderAccess($oOutlook, "iCloud", $olFolderCalendar)
If @error <> 0 Then MsgBox(16, "", "@error = " & @error)
_ArrayDisplay($aFolder )
Wenn ich jetzt eine suche starte mit z.b.
Global $aItems = _OL_ItemFind($oOutlook, "iCloud", $olAppointment );"[Start]='2020-01-01 00:00' And [End]='2020-05-27 23:59'"
If IsArray($aItems) Then
_ArrayDisplay($aItems, "OutlookEX UDF: _OL_ItemFind Example Script - Unread mails")
Else
MsgBox(48, "", "@error = " & @error & ", @extended: " & @extended)
EndIf
bekomme ich ein Ergebnis
was sagt mir das?
Hier mal eine Übersicht wie der Kalender im Outlook aussieht ...
Ich müsste hier alles Einträge für den aktuellen Tag aus dem Kalender "Arbeit ausführend" wissen.
Vielen Dank schon einmal für deine Hilfe Water
MFG
Chris
Hallo Ihr Zwei...
Sorry das ich einen so alten Post ausgrabe, aber er passt fast perfekt.
Ich habe eigentlich das gleiche Problem wie Therion
Ich würde gerne aus einem Kalender der aus einer ICloud im Outlook geöffnet ist die Termine auslesen.
wenn ich mir bei dem entsprechendem Kalender die Eigenschaften anzeigen lasse ist unter Ort folgendes "\\iCloud"
Wenn ich jetzt folgendes teste...
#include <OutlookEx\OutlookEX.au3>
#include <Array.au3>
Global $oOutlook = _OL_Open()
Global $aFolder = _OL_FolderAccess($oOutlook, "*",$olFolderCalendar)
If @error <> 0 Then MsgBox(16, "", "@error = " & @error)
_ArrayDisplay($aFolder )
Bekomme ich als ergebnis:
Das ist ja mein Kalender der auch unter Eigenschaften als "\\c.s****@******.de" ist...
Aber wie finde ich jetzt die "iCloud" Kalender?
Vielen Dank für die Antwort schon mal.
MFG
Chris
Hallo
Ich arbeite schon mit _PixelSearch und nur noch in einem festen Bereich , aber mit einer angeblich etwas schnelleren Version
Func _GDIPlus_BitmapGetPixelEx($hBitmap, $iX, $iY)
Local $tArgb, $pArgb, $aRet
$tArgb = DllStructCreate("dword Argb")
$pArgb = DllStructGetPtr($tArgb)
$aRet = DllCall('gdiplus.dll', "int", "GdipBitmapGetPixel", "hwnd", $hBitmap, "int", $iX, "int", $iY, "ptr", $pArgb)
Return '0x'&StringTrimLeft(Hex(DllStructGetData($tArgb, "Argb")),8)
EndFunc ;==>GDIPlus_BitmapGetPixel
Hallo
Mal wieder nach langer Zeit ein Beitrag bzw. ein Hilferuf von mir.
Ich habe mir eine spezielle Photobox gebaut, die aus einer großen Kiste besteht,
in der sich die Personen hinein stellen und dann fotografiert werden.
Damit der Effekt auch rüber kommt muss das Bild als ein Quadrat beschnitten werden.
Anschließend wird mit einem Autoitscript nach Positionsmarkierungen ( im jetzigen Fall noch neongrüne Punkte ) gesucht.
Leider ist durch unterschiedliche Lichtverhältnisse ( Tag zu Nacht ) trotz Blitzanlage aufgefallen das sich die Farben der Punkte so stark verändern
das die Erkennung eine zu hohe Fehlerrate hat.
Hierzu ein paar Bilder zum verstehen....
Daher würde ich gerne eine Ähnliche erkennung wie die Positionsmarkierungen in den QR-Codes einarbeiten,
die nicht von Farben abhängig sondern von der Form erkannt wird.
Wenn ich das richtig gesehen habe sind die qr-code reader, die ich in Autoit gesehen habe alle mittels dll eingebunden.
D.h. man kommt nicht wirklich an eine einzelne Unterfunktion ran.
Kann mir evtl. jemand einen Tipp geben wie man per GDI z.B. so etwas schnell ( am besten unter 1 sec ) erkennen könnte?
Im Netz dazu finde ich auch nicht wirklich eine genaue Erklärung.
Hier etwas, wie er aufgebaut ist .. http://www.keyence.com/ss/products/au…re/basic_2d/qr/
MFG Chris
Erster Post auf aktuellen Stand gebracht.
Aktueller Stand ( 9 Beispiele
TinkerForge_Bsp1_LCDHelloWorld
TinkerForge_Bsp2_LCDProgessBar
TinkerForge_Bsp3_FirstEvent
TinkerForge_Bsp4_GetStackData
TinkerForge_Bsp5_Poti
TinkerForge_Bsp10_1_ServoBrick
TinkerForge_Bsp10_2_ServoBrick_Event
TinkerForge_Bsp11_1_StepperBrick
TinkerForge_Bsp12_16IO
Da es gerade mal ein sehr sehr kleiner Teil ist den ich übersetzen konnte ( sind jetzt schon über 3,2k Zeilen ) wäre es cool wenn jemand mit machen würde... naja...
MFG Chris
Hey...
Was zum Thema Fritzbox...
Mir ist gerade aufgefallen das man über die Verbindung schönen nen Traffic Monitor bauen kann, der nicht nur den Traffic vom PC sondern von der Fritzbox ( komplettes Haus ) anzeigt...
Sollte auf den meisten FritzBoxen funzen...
#include<string.au3>
#include<array.au3>
$FB_WANCommonInterface = 1
$FB_Port = 49000
$FB_IP = '192.168.178.1'
Global $NewByteSendRate,$NewByteReceiveRate,$NewPacketSendRate,$NewPacketReceiveRate,$NewTotalBytesSent, _
$NewTotalBytesReceived,$NewAutoDisconnectTime,$NewIdleDisconnectTime,$NewDNSServer1,$NewDNSServer2, _
$NewVoipDNSServer1,$NewVoipDNSServer2,$NewUpnpControlEnabled,$NewRoutedBridgedModeBoth
TCPStartup()
$Conn = TCPConnect($FB_IP,$FB_Port)
If @error Then
MsgBox (16,"error","Kann nicht verbinden")
EndIf
While 1
[/autoit] [autoit][/autoit] [autoit]_FB_GetAddonInfos($Conn)
ToolTip( 'NewByteSendRate: '&_ConvertSize($NewByteSendRate)&'/s'&@CRLF& _
'NewByteReceiveRate: '&_ConvertSize($NewByteReceiveRate)&'/s'&@CRLF& _
'NewTotalBytesSent: '&_ConvertSize($NewTotalBytesSent)&@CRLF& _
'NewTotalBytesReceived: '&_ConvertSize($NewTotalBytesReceived)&@CRLF)
Sleep ( 1000 )
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit]Func _FB_GetAddonInfos($Conn)
[/autoit] [autoit][/autoit] [autoit]$FB_POST_DATA = @crlf&'<?xml version="1.0"?>'&@crlf& _
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"'&@crlf& _
's:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'&@crlf& _
'<s:Body><u:GetAddonInfos xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:'&$FB_WANCommonInterface&'"></u:GetAddonInfos>'&@crlf& _
'</s:Body>'&@crlf& _
'</s:Envelope>'
$FB_POST_HEADER='POST /upnp/control/WANCommonIFC1 HTTP/1.1'&@crlf& _
'SOAPACTION: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:'&$FB_WANCommonInterface&'#GetAddonInfos'&@crlf& _
'Content-Type: text/xml; charset="utf-8"'&@crlf& _
'User-Agent: AVM UPnP/1.0 Client 1.0'&@crlf& _
'Host: fritz.box:'&$FB_Port&@crlf& _
'Content-Length: '&StringLen($FB_POST_DATA)&@crlf& _
'Expect: 100-continue'&@crlf& _
'Connection: Keep-Alive'&@crlf&@crlf
TCPSend ( $Conn, $FB_POST_HEADER )
TCPSend ( $Conn, $FB_POST_DATA )
$FB_Recv = TCPRecv($Conn,2048)
[/autoit] [autoit][/autoit] [autoit]$NewByteSendRate = _StringBetweenAsString($FB_Recv,'<NewByteSendRate>','</NewByteSendRate>')
$NewByteReceiveRate = _StringBetweenAsString($FB_Recv,'<NewByteReceiveRate>','</NewByteReceiveRate>')
$NewPacketSendRate = _StringBetweenAsString($FB_Recv,'<NewPacketSendRate>','</NewPacketSendRate>')
$NewPacketReceiveRate = _StringBetweenAsString($FB_Recv,'<NewPacketReceiveRate>','</NewPacketReceiveRate>')
$NewTotalBytesSent = _StringBetweenAsString($FB_Recv,'<NewTotalBytesSent>','</NewTotalBytesSent>')
$NewTotalBytesReceived = _StringBetweenAsString($FB_Recv,'<NewTotalBytesReceived>','</NewTotalBytesReceived>')
$NewAutoDisconnectTime = _StringBetweenAsString($FB_Recv,'<NewAutoDisconnectTime>','</NewAutoDisconnectTime>')
$NewIdleDisconnectTime = _StringBetweenAsString($FB_Recv,'<NewIdleDisconnectTime>','</NewIdleDisconnectTime>')
$NewDNSServer1 = _StringBetweenAsString($FB_Recv,'<NewIdleDisconnectTime>','</NewDNSServer1>')
$NewDNSServer2 = _StringBetweenAsString($FB_Recv,'<NewDNSServer2>','</NewDNSServer2>')
$NewVoipDNSServer1 = _StringBetweenAsString($FB_Recv,'<NewVoipDNSServer1>','</NewVoipDNSServer1>')
$NewVoipDNSServer2 = _StringBetweenAsString($FB_Recv,'<NewVoipDNSServer2>','</NewVoipDNSServer2>')
$NewUpnpControlEnabled = _StringBetweenAsString($FB_Recv,'<NewUpnpControlEnabled>','</NewUpnpControlEnabled>')
$NewRoutedBridgedModeBoth = _StringBetweenAsString($FB_Recv,'<NewRoutedBridgedModeBoth>','</NewRoutedBridgedModeBoth>')
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _StringBetweenAsString($String,$start,$end)
[/autoit] [autoit][/autoit] [autoit]$return = _StringBetween($String,$start,$end)
If @error Or Not IsArray($return) Then
SetError( 1,0,'' )
Else
Return $return[0]
EndIf
EndFunc
[/autoit] [autoit][/autoit] [autoit]; THX crzftx @ http://www.autoitscript.com/forum/topic/63…ile-size-in-mb/
Func _ConvertSize($inputSize, $inputUnit = 0, $outputPlaces = 2, $outputString = True, $inputBits = False, $outputBits = False, $outputUnit = -4)
Local $unitNames[9] = ["","K","M","G"]
Local $bytes = $inputSize * 1024 ^ $inputUnit
Local $b = "B"
If $inputBits Then $bytes /= 8
If $outputBits Then
$bytes *= 8
$b = "b"
EndIf
If $outputUnit < 0 Then
Local $outputMax = Abs($outputUnit)
$outputUnit = Int(Log($bytes)/Log(1024))
If $outputUnit > $outputMax Then $outputUnit = $outputMax
EndIf
If $outputString Then
Return String(Round($bytes / 1024 ^ $outputUnit, $outputPlaces)) & $unitNames[$outputUnit] & $b
Else
Return Round($bytes / 1024 ^ $outputUnit, $outputPlaces)
EndIf
EndFunc
Gleich mal in die UDF fürs Display von Tinkerforge machen *muhahahaha*
MFG Chris
Hey...
7170 läuft perfekt!
MFG Chris
Es kommt auf die Anwendung an. Z.B. kannst du _ArrayDisplay in einer WM Funktion vergessen, wenn du ein Array debuggen willst.
UEZ perfekt danke...
Passt sehr gut hier hin... Bei dem Post wegen dem _ArrayDisplay im eingenen EventMode.
Hardware Baukasten Tinkerforge
MFG Chris
Erster Post auf aktuellen Stand gebracht ( 5 Beispiele
TinkerForge_Bsp1_LCDHelloWorld
TinkerForge_Bsp2_LCDProgessBar
TinkerForge_Bsp3_FirstEvent
TinkerForge_Bsp4_GetStackData
TinkerForge_Bsp5_Poti
Wenn jemand noch Ideen und weitere Anregungen hat immer raus damit!
MFG Chris
Hey Andy
Keinesfalls darfst du Events blocken!
Noch eine Frage.
Warum ist das mit dem Blocken so?
Es klappt eigentlich alles in den Events bis auf _ArrayDisplay() warum?
Das hier bleibt hängen...
#include <array.au3>
Global Const $FD_READ = 1
Global Const $FD_WRITE = 2
Global Const $FD_OOB = 4
Global Const $FD_ACCEPT = 8
Global Const $FD_CONNECT = 16
Global Const $FD_CLOSE = 32
Global $hWs2_32 = -1
TCPStartup()
$iListenSocket = TCPListen ( '127.0.0.1', 4222 )
Do
$iSocket = TCPAccept($iListenSocket)
Until $iSocket <> -1
TCPCloseSocket($iListenSocket)
$__TCP_WINDOW = GUICreate("GUIRegisterMsg")
$hWs2_32 = DllOpen( "Ws2_32.dll" )
DllCall( $hWs2_32,"int", "WSAAsyncSelect", "uint", $iSocket, "hwnd", $__TCP_WINDOW, "uint", 0x0400, "int", $FD_READ )
GUIRegisterMsg( 0x0400, "Event" )
While 1
Sleep(5)
WEnd
Func Event($hWnd, $iMsgID, $WParam, $LParam)
$sDataBuff = TCPRecv($iSocket, 1024)
Local $aArray_Base[2] = ["Org Item 0", "Org item 1"]
_ArrayDisplay($aArray_Base, "1D - Base array")
DllCall( $hWs2_32,"int", "WSAAsyncSelect", "uint", $iSocket, "hwnd", $__TCP_WINDOW, "uint", 0x0400, "int", $FD_READ )
EndFunc
Mache ich das hier bei Opt("GUIOnEventMode",1 ) klappt es ja auch...in etwa so....
#include <GUIConstantsEx.au3>
#include <array.au3>
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
[/autoit] [autoit][/autoit] [autoit]Local $hMainGUI = GUICreate("Hello World", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton")
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
Local $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($iOKButton, "OKButton")
GUISetState(@SW_SHOW, $hMainGUI)
While 1
Sleep(100) ; Sleep to reduce CPU usage
WEnd
Func OKButton()
; Note: At this point @GUI_CtrlId would equal $iOKButton,
; and @GUI_WinHandle would equal $hMainGUI
Local $aArray_Base[2] = ["Org Item 0", "Org item 1"]
_ArrayDisplay($aArray_Base, "1D - Base array")
EndFunc ;==>OKButton
Func CLOSEButton()
; Note: At this point @GUI_CtrlId would equal $GUI_EVENT_CLOSE,
; and @GUI_WinHandle would equal $hMainGUI
MsgBox(0, "GUI Event", "You selected CLOSE! Exiting...")
Exit
EndFunc ;==>CLOSEButton
Gibts da irgendeine Möglichkeit?
MFG Chris
Perfekt... Danke Andy..
Ja Hausaufgaben auf jeden fall ... vor allem das ordentlich in die UDF einzubauen..
Vielen Dank ihr beiden...
MFG Chris
Hey Andy
Danke für die Hilfe...
Ich konnte jetzt etwas weiter kommen. Zumindestens wird das Event jetzt 1x aufgerufen.
Aber leider nicht öfters... Wo könnte mein Fehler liegen?
Hier der Dummy der die Daten sendet..
TCPStartup()
$hConn = TCPConnect('127.0.0.1',4222)
If @error Then
MsgBox(16,@error,"TCP Connect Error")
Exit
EndIf
$i = 0
Do
$i += 1
ToolTip("Sende Msg "&$i)
Sleep ( 1000 )
TCPSend($hConn,@HOUR&':'&@MIN&':'&@SEC)
If @error Then
MsgBox(16,@error,"TCP Send Error")
Exit
EndIf
Until $i > 40
[/autoit]und hier der Empfang mit der Event Func
Global Const $FD_READ = 1
Global Const $FD_WRITE = 2
Global Const $FD_OOB = 4
Global Const $FD_ACCEPT = 8
Global Const $FD_CONNECT = 16
Global Const $FD_CLOSE = 32
Global $hWs2_32 = -1
TCPStartup()
$iListenSocket = TCPListen ( '127.0.0.1', 4222 )
Do
$iSocket = TCPAccept($iListenSocket)
Until $iSocket <> -1
TCPCloseSocket($iListenSocket)
$__TCP_WINDOW = GUICreate("GUIRegisterMsg")
$hWs2_32 = DllOpen( "Ws2_32.dll" )
DllCall( $hWs2_32,"int", "WSAAsyncSelect", "uint", $iSocket, "hwnd", $__TCP_WINDOW, "uint", 0x0400, "int", $FD_WRITE )
GUIRegisterMsg( 0x0400, "Event" )
While 1
Sleep(5)
WEnd
Func Event($hWnd, $iMsgID, $WParam, $LParam)
$sDataBuff = TCPRecv($iSocket, 1024)
MsgBox(0,"",$sDataBuff)
EndFunc
Danke schonmal...
MFG Chris
Hi..
Nein das ist richtig... wäre viel zu aufwändig.. aber das brauchst du ja auch überhaupt nicht.
Im Prinzip hat das was ich brauche und mein Problem ist, ja auch nicht mehr mit Tinkerforge zu tun.
Wir brauchen nur einen Weg eine TcpOnRecvEvent Funktion, die auf das normale TCPConnect() aufsattelt zu bauen.
Den Rest mache ich alleine...
Ich hab mal etwas getestet...
Das hier ist der Test-Dummy der TF ersetzt und einfach eine TCP Conn aufbaut und ein Datenpaket verschickt
TCPStartup()
$hConn = TCPConnect('127.0.0.1',4222)
If @error Then
MsgBox(16,@error,"TCP Connect Error")
Exit
EndIf
TCPSend($hConn,@HOUR&':'&@SEC)
If @error Then
MsgBox(16,@error,"TCP Send Error")
Exit
EndIf
Den am besten compilieren weil man nicht zwei Scripts gleichzeitig laufen lassen kann. ( Oder ich nur nicht weiß das das in Scite geht )
Wenn man jetzt das zweite Script startet... und dann den Dummy startet...
Global Const $FD_READ = 1
Global Const $FD_WRITE = 2
Global Const $FD_OOB = 4
Global Const $FD_ACCEPT = 8
Global Const $FD_CONNECT = 16
Global Const $FD_CLOSE = 32
Global $hWs2_32 = -1
Global Const $TCP_SEND = 1
Global Const $TCP_RECEIVE = 2
Global Const $TCP_CONNECT = 4
Global Const $TCP_DISCONNECT = 8
Global Const $TCP_NEWCLIENT = 16
TCPStartup()
Global Const $__TCP_WINDOW = GUICreate("Async Sockets UDF")
Global $__TCP_SOCKETS[1][7]
$hServer = _TCP_Server_Create(4222,'127.0.0.1')
_TCP_RegisterEvent($hServer, $TCP_RECEIVE, "Buffer")
While 1
Sleep(5)
;~ MsgBox(0,"",55 )
;~ Exit
WEnd
Func Buffer($hSocket,$aData,$error)
Call("Event",$aData)
EndFunc
Func Event($aData)
MsgBox(0,0,$aData )
Exit
EndFunc
;##################################################################################################
[/autoit] [autoit][/autoit] [autoit]Func _TCP_Server_Create($iPort, $sIP="0.0.0.0")
[/autoit] [autoit][/autoit] [autoit]Local $hListenSocket = ___ASocket()
___ASockSelect( $hListenSocket, $__TCP_WINDOW, 0x0400, $FD_ACCEPT)
GUIRegisterMsg( 0x0400, "___TCP_OnAccept" )
___ASockListen( $hListenSocket, $sIP, $iPort )
$__TCP_SOCKETS[0][0] = $hListenSocket
$__TCP_SOCKETS[0][1] = 0x0400
Return $hListenSocket
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func ___TCP_OnAccept($hWnd, $iMsgID, $WParam, $LParam)
[/autoit] [autoit][/autoit] [autoit]Local $hSocket = $WParam
Local $iError = ___HiWord( $LParam )
Local $iEvent = ___LoWord( $LParam )
Local $hClient, $uBound
Abs($hWnd) ; Stupid AU3Check...
[/autoit] [autoit][/autoit] [autoit]If $iMsgID = $__TCP_SOCKETS[0][1] Then
[/autoit] [autoit][/autoit] [autoit]If $iEvent = $FD_ACCEPT Then
[/autoit] [autoit][/autoit] [autoit]If Not $iError Then
[/autoit] [autoit][/autoit] [autoit]ReDim $__TCP_SOCKETS[UBound($__TCP_SOCKETS)+1][7]
$uBound = UBound($__TCP_SOCKETS)
$hClient = TCPAccept($hSocket)
[/autoit] [autoit][/autoit] [autoit]___ASockSelect($hClient, $__TCP_WINDOW, 0x0400 + $uBound - 1, BitOR($FD_READ, $FD_WRITE, $FD_CLOSE))
GUIRegisterMsg(0x0400 + $uBound - 1, "___TCP_Server_OnSocketEvent" )
$__TCP_SOCKETS[UBound($__TCP_SOCKETS)-1][0] = $hClient
$__TCP_SOCKETS[UBound($__TCP_SOCKETS)-1][1] = 0x0400 + $uBound - 1
Call($__TCP_SOCKETS[0][6], $hClient, $iError)
[/autoit] [autoit][/autoit] [autoit]Else
[/autoit] [autoit][/autoit] [autoit]Call($__TCP_SOCKETS[0][6], 0, $iError)
[/autoit] [autoit][/autoit] [autoit]EndIf
[/autoit] [autoit][/autoit] [autoit]ElseIf $iEvent = $FD_CONNECT Then
[/autoit] [autoit][/autoit] [autoit]Call($__TCP_SOCKETS[0][4], $hSocket, $iError)
[/autoit] [autoit][/autoit] [autoit]EndIf
[/autoit] [autoit][/autoit] [autoit]EndIf
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func ___TCP_Server_OnSocketEvent( $hWnd, $iMsgID, $WParam, $LParam )
[/autoit] [autoit][/autoit] [autoit]Local $hSocket = $WParam
Local $iError = ___HiWord( $LParam )
Local $iEvent = ___LoWord( $LParam )
Local $sDataBuff, $iElement, $i
[/autoit] [autoit][/autoit] [autoit]Abs($hWnd)
[/autoit] [autoit][/autoit] [autoit]$hSocket = 0
$iElement = 0
For $i = 1 to UBound($__TCP_SOCKETS)-1
[/autoit] [autoit][/autoit] [autoit]If $__TCP_SOCKETS[$i][1] = $iMsgID Then
$hSocket = $__TCP_SOCKETS[$i][0]
$iElement = $i
ExitLoop
EndIf
Next
[/autoit] [autoit][/autoit] [autoit]If $hSocket Then
[/autoit] [autoit][/autoit] [autoit]Switch $iEvent
Case $FD_READ
$sDataBuff = TCPRecv($hSocket, 1024)
[/autoit] [autoit][/autoit] [autoit]Call($__TCP_SOCKETS[0][2], $hSocket, $sDataBuff, $iError)
[/autoit] [autoit][/autoit] [autoit]Case $FD_WRITE
[/autoit] [autoit][/autoit] [autoit]Call($__TCP_SOCKETS[0][3], $hSocket, $iError)
[/autoit] [autoit][/autoit] [autoit]Case $FD_CLOSE
[/autoit] [autoit][/autoit] [autoit]___ASockShutdown($hSocket)
TCPCloseSocket($hSocket)
Call($__TCP_SOCKETS[0][5], $hSocket, $iError)
[/autoit] [autoit][/autoit] [autoit]___ArrayDelete($__TCP_SOCKETS, $iElement)
[/autoit] [autoit][/autoit] [autoit]EndSwitch
[/autoit] [autoit][/autoit] [autoit]EndIf
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _TCP_RegisterEvent($hSocket, $iEvent, $sFunction)
[/autoit] [autoit][/autoit] [autoit]Local $iSelected = 0
Local $i
If $__TCP_SOCKETS[0][0] Then
[/autoit] [autoit][/autoit] [autoit]$iSelected = 0
[/autoit] [autoit][/autoit] [autoit]Else
[/autoit] [autoit][/autoit] [autoit]For $i = 0 to UBound($__TCP_SOCKETS)-1
If $__TCP_SOCKETS[$i][0] = $hSocket Then
$iSelected = $i
ExitLoop
EndIf
Next
If Not $iSelected Then Return 0
[/autoit] [autoit][/autoit] [autoit]EndIf
[/autoit] [autoit][/autoit] [autoit]Switch $iEvent
Case $TCP_SEND
$__TCP_SOCKETS[$iSelected][3] = $sFunction
Case $TCP_RECEIVE
$__TCP_SOCKETS[$iSelected][2] = $sFunction
Case $TCP_CONNECT
$__TCP_SOCKETS[$iSelected][4] = $sFunction
Case $TCP_DISCONNECT
$__TCP_SOCKETS[$iSelected][5] = $sFunction
Case $TCP_NEWCLIENT
$__TCP_SOCKETS[$iSelected][6] = $sFunction
Case Else
Return False
EndSwitch
Return True
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit];==================================================================================================================
;
; Zatorg's Asynchronous Sockets UDF Starts from here.
;
;==================================================================================================================
Func ___ASocket($iAddressFamily = 2, $iType = 1, $iProtocol = 6)
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
Local $hSocket = DllCall($hWs2_32, "uint", "socket", "int", $iAddressFamily, "int", $iType, "int", $iProtocol)
If @error Then
SetError(1, @error)
Return -1
EndIf
If $hSocket[ 0 ] = -1 Then
SetError(2, ___WSAGetLastError())
Return -1
EndIf
Return $hSocket[ 0 ]
EndFunc ;==>_ASocket
Func ___ASockShutdown($hSocket)
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
Local $iRet = DllCall($hWs2_32, "int", "shutdown", "uint", $hSocket, "int", 2)
If @error Then
SetError(1, @error)
Return False
EndIf
If $iRet[ 0 ] <> 0 Then
SetError(2, ___WSAGetLastError())
Return False
EndIf
Return True
EndFunc ;==>_ASockShutdown
Func ___ASockClose($hSocket)
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
Local $iRet = DllCall($hWs2_32, "int", "closesocket", "uint", $hSocket)
If @error Then
SetError(1, @error)
Return False
EndIf
If $iRet[ 0 ] <> 0 Then
SetError(2, ___WSAGetLastError())
Return False
EndIf
Return True
EndFunc ;==>_ASockClose
Func ___ASockSelect($hSocket, $hWnd, $uiMsg, $iEvent)
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
Local $iRet = DllCall( _
$hWs2_32, _
"int", "WSAAsyncSelect", _
"uint", $hSocket, _
"hwnd", $hWnd, _
"uint", $uiMsg, _
"int", $iEvent _
)
If @error Then
SetError(1, @error)
Return False
EndIf
If $iRet[ 0 ] <> 0 Then
SetError(2, ___WSAGetLastError())
Return False
EndIf
Return True
EndFunc ;==>_ASockSelect
; Note: you can see that $iMaxPending is set to 5 by default.
; IT DOES NOT MEAN THAT DEFAULT = 5 PENDING CONNECTIONS
; 5 == SOMAXCONN, so don't worry be happy
Func ___ASockListen($hSocket, $sIP, $uiPort, $iMaxPending = 5); 5 == SOMAXCONN => No need to change it.
Local $iRet
Local $stAddress
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
[/autoit] [autoit][/autoit] [autoit]$stAddress = ___SockAddr($sIP, $uiPort)
If @error Then
SetError(@error, @extended)
Return False
EndIf
$iRet = DllCall($hWs2_32, "int", "bind", "uint", $hSocket, "ptr", DllStructGetPtr($stAddress), "int", DllStructGetSize($stAddress))
If @error Then
SetError(3, @error)
Return False
EndIf
If $iRet[ 0 ] <> 0 Then
$stAddress = 0; Deallocate
SetError(4, ___WSAGetLastError())
Return False
EndIf
$iRet = DllCall($hWs2_32, "int", "listen", "uint", $hSocket, "int", $iMaxPending)
If @error Then
SetError(5, @error)
Return False
EndIf
If $iRet[ 0 ] <> 0 Then
$stAddress = 0; Deallocate
SetError(6, ___WSAGetLastError())
Return False
EndIf
Return True
EndFunc ;==>_ASockListen
Func ___ASockConnect($hSocket, $sIP, $uiPort)
Local $iRet
Local $stAddress
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
[/autoit] [autoit][/autoit] [autoit]$stAddress = ___SockAddr($sIP, $uiPort)
If @error Then
SetError(@error, @extended)
Return False
EndIf
$iRet = DllCall($hWs2_32, "int", "connect", "uint", $hSocket, "ptr", DllStructGetPtr($stAddress), "int", DllStructGetSize($stAddress))
If @error Then
SetError(3, @error)
Return False
EndIf
$iRet = ___WSAGetLastError()
If $iRet = 10035 Then; WSAEWOULDBLOCK
Return True; Asynchronous connect attempt has been started.
EndIf
SetExtended(1); Connected immediately
Return True
EndFunc ;==>_ASockConnect
; A wrapper function to ease all the pain in creating and filling the sockaddr struct
Func ___SockAddr($sIP, $iPort, $iAddressFamily = 2)
Local $iRet
Local $stAddress
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
[/autoit] [autoit][/autoit] [autoit]$stAddress = DllStructCreate("short; ushort; uint; char[8]")
If @error Then
SetError(1, @error)
Return False
EndIf
DllStructSetData($stAddress, 1, $iAddressFamily)
$iRet = DllCall($hWs2_32, "ushort", "htons", "ushort", $iPort)
DllStructSetData($stAddress, 2, $iRet[ 0 ])
$iRet = DllCall($hWs2_32, "uint", "inet_addr", "str", $sIP)
If $iRet[ 0 ] = 0xffffffff Then; INADDR_NONE
$stAddress = 0; Deallocate
SetError(2, ___WSAGetLastError())
Return False
EndIf
DllStructSetData($stAddress, 3, $iRet[ 0 ])
Return $stAddress
EndFunc ;==>__SockAddr
Func ___WSAGetLastError()
If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
Local $iRet = DllCall($hWs2_32, "int", "WSAGetLastError")
If @error Then
;ConsoleWrite("+> _WSAGetLastError(): WSAGetLastError() failed. Script line number: " & @ScriptLineNumber & @CRLF)
SetExtended(1)
Return 0
EndIf
Return $iRet[ 0 ]
EndFunc ;==>_WSAGetLastError
; Got these here:
; http://www.autoitscript.com/forum/index.ph…620&hl=MAKELONG
Func ___MakeLong($LoWord, $HiWord)
Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF)); Thanks Larry
EndFunc ;==>_MakeLong
Func ___HiWord($Long)
Return BitShift($Long, 16); Thanks Valik
EndFunc ;==>_HiWord
Func ___LoWord($Long)
Return BitAND($Long, 0xFFFF); Thanks Valik
EndFunc ;==>_LoWord
; ========================================= Array functions
[/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayDelete
; Description ...: Deletes the specified element from the given array.
; Syntax.........: _ArrayDelete(ByRef $avArray, $iElement)
; Parameters ....: $avArray - Array to modify
; $iElement - Element to delete
; Return values .: Success - New size of the array
; Failure - 0, sets @error to:
; |1 - $avArray is not an array
; |3 - $avArray has too many dimensions (only up to 2D supported)
; |(2 - Deprecated error code)
; Author ........: Cephas <cephas at clergy dot net>
; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - array passed ByRef, Ultima - 2D arrays supported, reworked function (no longer needs temporary array; faster when deleting from end)
; Remarks .......: If the array has one element left (or one row for 2D arrays), it will be set to "" after _ArrayDelete() is used on it.
; Related .......: _ArrayAdd, _ArrayInsert, _ArrayPop, _ArrayPush
; Link ..........;
; Example .......; Yes
; ===============================================================================================================================
Func ___ArrayDelete(ByRef $avArray, $iElement)
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
Local $iUBound = UBound($avArray, 1) - 1
[/autoit] [autoit][/autoit] [autoit]If Not $iUBound Then
$avArray = ""
Return 0
EndIf
; Bounds checking
If $iElement < 0 Then $iElement = 0
If $iElement > $iUBound Then $iElement = $iUBound
; Move items after $iElement up by 1
Switch UBound($avArray, 0)
Case 1
For $i = $iElement To $iUBound - 1
$avArray[$i] = $avArray[$i + 1]
Next
ReDim $avArray[$iUBound]
Case 2
Local $iSubMax = UBound($avArray, 2) - 1
For $i = $iElement To $iUBound - 1
For $j = 0 To $iSubMax
$avArray[$i][$j] = $avArray[$i + 1][$j]
Next
Next
ReDim $avArray[$iUBound][$iSubMax + 1]
Case Else
Return SetError(3, 0, 0)
EndSwitch
Return $iUBound
EndFunc ;==>_ArrayDelete
passiert genau das was ich brauche. Eine Anfrage über TCP wird anscheinend über GUIRegisterMsg() und einen Dummy Gui abgefangen und daher als Event ausgegeben.
Anscheinend wird aber hier irgendwas anders gemacht als das Hauseigene TCP von Autoit. Dahinter muss ich noch kommen und am besten auch wie das ganze klappt und wie ich das etwas smarter in die UDF einbauen kann...
Naja ich teste mal weiter...
Wenn jemand anderes noch was weiß immer raus damit ...
EDIT: Was bedeutet z.B. GUIRegisterMsg( 0x0400, "___TCP_OnAccept" ). Also was bringt hier die 0x0400
MFG Chris
Hey..
EDIT: Oops, jetzt hatte ich deinen Spoiler gar nicht gelesen - ich schaue es mir nochmal genauer an.
Ja jetzt glaube ich hast du mich verstanden
Da das ganze ja eine UDF werden soll möchte ich den Nuter der UDF ja nicht damit beschäftigen das er danach schaut ob ein Aktion von TF anliegt.
Es muss ja auch nicht immer eine Antwort auf eine Abfrage der UDF sein. Es kann ja auch ein Tastendruck eines Tasters von TF sein.
Der Beitrag auf http://www.autoitscript.com/forum/topic/74…f-event-driven/ kommt dem ganzen schon recht nahe.
Aber leider sehr verstrickt. Das muss man doch irgendwie smarter lösen können.
Es müsste ja nur eine Buffer() Funktion ausgelöst werden sobald ein TCP Paket rein kommt..das würde mir reichen...
Sowas wie
TcpRecvEvent($Conn,"_DeineFunktion")
[/autoit]Ich habe mit der UDF aus dem Englischen Forum etwas rumgespielt und es hinbekommen das sogar wenn das eigentliche Programm an einer MsgBox wartet,
die Funktion durch ein TCP Paket aufgerufen wird. Aber dann funktioniert der Rest meiner UDF nicht mehr, da der Socked da irgendwie anders aufgebaut wird. Mit DLLs oder so...
MFG Chris
Hey BugFix
Danke für die lehrreiche Stunde . Wie immer mal wieder was dazu gelernt.
Wenn dem so ist, habe ich den Begriff "CallBack" in der Hinsicht bis jetzt falsch interpretiert.
Daher weiß ich jetzt, das es nicht das ist was ich suche / brauche.
Das was ich brauche ist dann eher doch was in Richtung GUIRegisterMsg()
Es geht ja darum wenn eine Antwort von Tinkerforge mittels TCP kommt, das dann eine Funktion ausgelöst wird.
Die Idee ist es hier hin zu kommen...
_TF_EventMode(True); Ab jetzt werden Funktionen Automatisch aufgerufen Wenn ein Event von TF mittels TCP kommt
_TF_SetOnEvent_BrickletLCD20x4_Button0_Pressed($TF_BrickletLCD20x4_UID,'_MeineLCDButtonFunktion_Button0'); Wenn man den Taster am Dispay drückt, dann Funktion '_MeineLCDButtonFunktion_Button0' aufrufen
While 1
Sleep(10)
WEnd
Func _MeineLCDButtonFunktion_Button0()
_TF_BrickletLCD20x4_Backlight($TFc,$TF_BrickletLCD20x4_UID ); Hintergrundlich des Displays einschalten
EndFunc
[/autoit]
Wie realisiere ich so etwas?
Edit: Mit AdlibRegister() habe ich schon getestet, aber das läuft irgendwie unrund...
Edit2: Gefunden habe ich das hier bis jetzt... http://www.autoitscript.com/forum/topic/35389-tcp-event-mode/
Wie immer vielen Dank schon einmal für eine Antwort...
MFG Chris