So, bin schon ein Stück weiter mit dem Datenprotokoll von meinem Arbeitskollegen. Ich würde nur gerne wissen, ob man vor jedem Zeichen, das man senden will, den CTS-Signalstatus abfragt oder sendet man nur zu Beginn der Übertragung ein RTS-Signal und wartet dann solange, bis das CTS-Signal anliegt.
Was muss ich sonst noch beim Senden beachten ? Wie sieht es mit dem AvailableSerialPortOutput(#SerialPort) Puffer aus ? Wenn ich den nach dem Senden eines Zeichens debugge, ist er immer leer...
Code: Alles auswählen
Enumeration
#PanelGadget
#Editor_88
#String_77
#Button_82
#Editor_73
#String_71
#String_51
#Frame3D_76
#Text_48
#Text_47
#Text_46
#Text_45
#Text_44
#Text_43
#Text_41
#Text_40
#Text_39
#Text_38
#Text_37
#Text_36
#Text_35
#Text_34
#Text_33
#Text_32
#Text_21
#Text_20
#Text_19
#Text_18
#Text_17
#Text_16
#Frame3D_27
#ComboBox_15
#ComboBox_22
#ComboBox_23
#ComboBox_24
#ComboBox_25
#ComboBox_28
#Frame3D_29
#Frame3D_30
#Frame3D_31
#String_52
#ComboBox_54
#String_55
#ComboBox_58
#ComboBox_61
#ComboBox_62
#ComboBox_63
#ComboBox_64
#ComboBox_65
#ComboBox_66
#ComboBox_67
#String_68
#String_69
#String_70
#Button_78
#Image_79
#Image_80
#ProgressBar_81
#ExplorerTree_83
#Frame3D_84
#Button_85
EndEnumeration
Enumeration
#Image_Image_79
#Image_Image_80
EndEnumeration
Enumeration
#Window
EndEnumeration
Enumeration
#StatusBar_Window
EndEnumeration
DataSection
Image_Image_79:
IncludeBinary "pc.ico"
Image_Image_80:
IncludeBinary "zahnrad.ico"
EndDataSection
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
#Preference = "ncmax.ini"
Global programdata.s
Procedure CreateWindow()
If OpenWindow(#Window, 498, 168, 678, 677, "NC-Max", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
If CreateStatusBar(#StatusBar_Window, WindowID(#Window))
EndIf
ButtonGadget(#Button_78, 38, 577, 149, 38, "Übertragung starten")
ImageGadget(#Image_79, 218, 579, 32, 32, CatchImage(#Image_Image_79, ?Image_Image_79))
ImageGadget(#Image_80, 589, 579, 32, 32, CatchImage(#Image_Image_80, ?Image_Image_80))
ProgressBarGadget(#ProgressBar_81, 260, 583, 318, 22, 0, 100)
Frame3DGadget(#Frame3D_84, 17, 560, 638, 72, "", #PB_Frame3D_Double|#PB_Frame3D_Flat|#PB_Frame3D_Single)
PanelGadget(#PanelGadget, 17, 15, 639, 535)
AddGadgetItem(#PanelGadget, -1, "CNC-Programme")
EditorGadget(#Editor_88, 13, 384, 602, 98, #PB_Editor_ReadOnly)
StringGadget(#String_77, 194, 319, 366, 22, "", #PB_String_UpperCase|#WS_BORDER)
Frame3DGadget(#Frame3D_76, 11, 18, 602, 350, " Programm auswählen")
ExplorerTreeGadget(#ExplorerTree_83, 34, 52, 430, 242, "*.NC")
ButtonGadget(#Button_85, 33, 316, 147, 27, "Programm laden")
AddGadgetItem(#PanelGadget, -1, "COM1")
ButtonGadget(#Button_82, 474, 449, 139, 38, "Einstellungen speichern")
StringGadget(#String_71, 192, 251, 65, 20, "300", #PB_String_Numeric)
StringGadget(#String_51, 194, 43, 65, 21, "300", #PB_String_Numeric)
TextGadget(#Text_48, 297, 384, 182, 21, "Stringausgabe nach Zeilenende", #SS_CENTERIMAGE)
TextGadget(#Text_47, 297, 357, 182, 21, "Stringausgabe nach (M02/M30)", #SS_CENTERIMAGE)
TextGadget(#Text_46, 297, 330, 182, 21, "Stringausgabe nach Programmende", #SS_CENTERIMAGE)
TextGadget(#Text_45, 297, 302, 182, 21, "Stringausgabe vor Programmbeginn", #SS_CENTERIMAGE)
TextGadget(#Text_44, 297, 276, 182, 21, "Anzahl HEX(00) Zeichen als Nachlauf", #SS_CENTERIMAGE)
TextGadget(#Text_43, 297, 249, 182, 21, "Anzahl HEX(00) Zeichen als Vorlauf", #SS_CENTERIMAGE)
TextGadget(#Text_41, 29, 355, 154, 21, "[%] Zeichen ausfiltern", #SS_CENTERIMAGE)
TextGadget(#Text_40, 29, 329, 154, 21, "St.Zeichen Hex(00-1F) ausfiltern", #SS_CENTERIMAGE)
TextGadget(#Text_39, 29, 303, 154, 21, "Puffergrösse", #SS_CENTERIMAGE)
TextGadget(#Text_38, 29, 277, 154, 21, "Anzeigen von Sonderzeichen", #SS_CENTERIMAGE)
TextGadget(#Text_37, 29, 251, 154, 21, "TimeOut", #SS_CENTERIMAGE)
TextGadget(#Text_36, 30, 151, 154, 21, "St.ZeichenHex (00-1F) ausfiltern", #SS_CENTERIMAGE)
TextGadget(#Text_35, 30, 124, 154, 21, "Einlesen Beenden mit Zeichen", #SS_CENTERIMAGE)
TextGadget(#Text_34, 30, 97, 154, 21, "Puffergrösse", #SS_CENTERIMAGE)
TextGadget(#Text_33, 30, 70, 154, 21, "Anzeigen von Sonderzeichen", #SS_CENTERIMAGE)
TextGadget(#Text_32, 30, 43, 154, 21, "TimeOut", #SS_CENTERIMAGE)
TextGadget(#Text_21, 342, 178, 95, 21, "Handshake", #SS_CENTERIMAGE)
TextGadget(#Text_20, 342, 151, 95, 21, "Stopbits", #SS_CENTERIMAGE)
TextGadget(#Text_19, 342, 124, 95, 21, "Parität", #SS_CENTERIMAGE)
TextGadget(#Text_18, 342, 97, 95, 21, "Datenbits", #SS_CENTERIMAGE)
TextGadget(#Text_17, 342, 43, 95, 21, "Baudrate", #SS_CENTERIMAGE)
TextGadget(#Text_16, 342, 70, 95, 21, "COM-Nummer", #SS_CENTERIMAGE)
Frame3DGadget(#Frame3D_27, 322, 18, 288, 200, " Übertragung ")
ComboBoxGadget(#ComboBox_15, 456, 43, 123, 21)
ComboBoxGadget(#ComboBox_22, 456, 70, 123, 21)
ComboBoxGadget(#ComboBox_23, 456, 97, 123, 21)
ComboBoxGadget(#ComboBox_24, 194, 97, 65, 21)
ComboBoxGadget(#ComboBox_25, 456, 151, 123, 21)
ComboBoxGadget(#ComboBox_28, 456, 178, 123, 21)
Frame3DGadget(#Frame3D_29, 12, 18, 288, 200, " Einlesen ")
Frame3DGadget(#Frame3D_30, 14, 226, 598, 200, " Ausgeben ")
Frame3DGadget(#Frame3D_31, 15, 441, 441, 53, " Extra-Parameter ")
StringGadget(#String_52, 485, 302, 95, 21, "")
ComboBoxGadget(#ComboBox_54, 456, 124, 123, 21)
StringGadget(#String_55, 194, 124, 65, 21, "04")
ComboBoxGadget(#ComboBox_58, 192, 277, 65, 21)
ComboBoxGadget(#ComboBox_61, 194, 70, 65, 21)
ComboBoxGadget(#ComboBox_62, 194, 151, 65, 21)
ComboBoxGadget(#ComboBox_63, 485, 275, 95, 21)
ComboBoxGadget(#ComboBox_64, 485, 248, 95, 21)
ComboBoxGadget(#ComboBox_65, 192, 355, 65, 21)
ComboBoxGadget(#ComboBox_66, 192, 303, 65, 21)
ComboBoxGadget(#ComboBox_67, 192, 329, 65, 21)
StringGadget(#String_68, 485, 329, 95, 21, "")
StringGadget(#String_69, 485, 356, 95, 21, "")
StringGadget(#String_70, 485, 383, 95, 21, "")
AddGadgetItem(#PanelGadget, -1, "Protokoll")
EditorGadget(#Editor_73, 24, 22, 578, 466, #PB_Editor_ReadOnly)
CloseGadgetList()
EndIf
EndProcedure
Procedure FillComboBoxes()
;Baudrate
AddGadgetItem(#ComboBox_15, -1, "50")
AddGadgetItem(#ComboBox_15, -1, "75")
AddGadgetItem(#ComboBox_15, -1, "110")
AddGadgetItem(#ComboBox_15, -1, "150")
AddGadgetItem(#ComboBox_15, -1, "300")
AddGadgetItem(#ComboBox_15, -1, "600")
AddGadgetItem(#ComboBox_15, -1, "1200")
AddGadgetItem(#ComboBox_15, -1, "1800")
AddGadgetItem(#ComboBox_15, -1, "2400")
AddGadgetItem(#ComboBox_15, -1, "4800")
AddGadgetItem(#ComboBox_15, -1, "9600")
AddGadgetItem(#ComboBox_15, -1, "19200")
AddGadgetItem(#ComboBox_15, -1, "38400")
AddGadgetItem(#ComboBox_15, -1, "57600")
AddGadgetItem(#ComboBox_15, -1, "115200")
;COM-Name
AddGadgetItem(#ComboBox_22, -1, "COM1")
AddGadgetItem(#ComboBox_22, -1, "COM2")
AddGadgetItem(#ComboBox_22, -1, "COM3")
;Datenbits
AddGadgetItem(#ComboBox_23, -1, "7")
AddGadgetItem(#ComboBox_23, -1, "8")
;Parität
AddGadgetItem(#ComboBox_54, -1, "NOPARITY")
AddGadgetItem(#ComboBox_54, -1, "EVENPARITY")
AddGadgetItem(#ComboBox_54, -1, "MARKPARITY")
AddGadgetItem(#ComboBox_54, -1, "ODDPARITY")
AddGadgetItem(#ComboBox_54, -1, "SPACEPARITY")
;Stopbit
AddGadgetItem(#ComboBox_25, -1, "1")
AddGadgetItem(#ComboBox_25, -1, "2")
AddGadgetItem(#ComboBox_25, -1, "1.5")
;Protokoll
AddGadgetItem(#ComboBox_28, -1, "NOHANDSHAKE")
AddGadgetItem(#ComboBox_28, -1, "RTSHANDSHAKE")
AddGadgetItem(#ComboBox_28, -1, "RTS/CTS")
AddGadgetItem(#ComboBox_28, -1, "XON/XOFF")
;Einlesen Sonderzeichen
AddGadgetItem(#ComboBox_61, -1, "Ja")
AddGadgetItem(#ComboBox_61, -1, "Nein")
;Einlesen Puffergrösse
AddGadgetItem(#ComboBox_24, -1, "4096")
;Einlesen Hex ausfiltern
AddGadgetItem(#ComboBox_62, -1, "Ja")
AddGadgetItem(#ComboBox_62, -1, "Nein")
;Ausgeben Sonderzeichen
AddGadgetItem(#ComboBox_58, -1, "Ja")
AddGadgetItem(#ComboBox_58, -1, "Nein")
;Ausgeben Puffergrösse
AddGadgetItem(#ComboBox_66, -1, "4096")
;Ausgeben Prozentzeichen ausfiltern
AddGadgetItem(#ComboBox_67, -1, "Ja")
AddGadgetItem(#ComboBox_67, -1, "Nein")
;Ausgeben Hex ausfiltern
AddGadgetItem(#ComboBox_65, -1, "Ja")
AddGadgetItem(#ComboBox_65, -1, "Nein")
;Anzahl Hexzeichen Vorlauf
AddGadgetItem(#ComboBox_64, -1, "0")
AddGadgetItem(#ComboBox_64, -1, "1")
AddGadgetItem(#ComboBox_64, -1, "2")
AddGadgetItem(#ComboBox_64, -1, "3")
;Anzahl Hexzeichen Nachlauf
AddGadgetItem(#ComboBox_63, -1, "0")
AddGadgetItem(#ComboBox_63, -1, "1")
AddGadgetItem(#ComboBox_63, -1, "2")
AddGadgetItem(#ComboBox_63, -1, "3")
EndProcedure
Procedure WritePreference()
;CreatePreferences(#Preference)
OpenPreferences(#Preference)
WritePreferenceString("Baudrate", GetGadgetText(#ComboBox_15))
WritePreferenceString("COM-Nummer", GetGadgetText(#ComboBox_22))
WritePreferenceString("Datenbits", GetGadgetText(#ComboBox_23))
WritePreferenceString("Parität", GetGadgetText(#ComboBox_54))
WritePreferenceString("Stopbits", GetGadgetText(#ComboBox_25))
WritePreferenceString("Protokoll", GetGadgetText(#ComboBox_28))
WritePreferenceString("TimeOut_Einlesen", GetGadgetText(#String_51))
WritePreferenceString("Sonderzeichen_Einlesen", GetGadgetText(#ComboBox_61))
WritePreferenceString("Puffergrösse_Einlesen", GetGadgetText(#ComboBox_24))
WritePreferenceString("Einlesen_Beenden", GetGadgetText(#String_55))
WritePreferenceString("Hex_Ausfiltern_Einlesen", GetGadgetText(#ComboBox_62))
WritePreferenceString("TimeOut_Ausgeben", GetGadgetText(#String_71))
WritePreferenceString("Sonderzeichen_Ausgeben", GetGadgetText(#ComboBox_58))
WritePreferenceString("Puffergrösse_Ausgeben", GetGadgetText(#ComboBox_66))
WritePreferenceString("Prozent_Filtern_Ausgeben", GetGadgetText(#ComboBox_67))
WritePreferenceString("Hex_Ausfiltern_Ausgeben", GetGadgetText(#ComboBox_65))
WritePreferenceString("Anzahl_Hexzeichen_Vorlauf", GetGadgetText(#ComboBox_64))
WritePreferenceString("Anzahl_Hexzeichen_Nachlauf", GetGadgetText(#ComboBox_63))
WritePreferenceString("Stringausgabe_Beginn", GetGadgetText(#String_52))
WritePreferenceString("Stringausgabe_Ende", GetGadgetText(#String_68))
WritePreferenceString("Stringausgabe_(M02/M30)", GetGadgetText(#String_69))
WritePreferenceString("Stringausgabe_nach_Zeilenende", GetGadgetText(#String_70))
ClosePreferences()
EndProcedure
Procedure LoadPreferences()
OpenPreferences(#Preference)
SetGadgetText(#ComboBox_15, ReadPreferenceString("Baudrate", "4800"))
SetGadgetText(#ComboBox_22, ReadPreferenceString("COM-Nummer", "COM1"))
SetGadgetText(#ComboBox_23, ReadPreferenceString("Datenbits", "8"))
SetGadgetText(#ComboBox_54, ReadPreferenceString("Parität", "NOPARITY"))
SetGadgetText(#ComboBox_25, ReadPreferenceString("Stopbits", "1"))
SetGadgetText(#ComboBox_28, ReadPreferenceString("Protokoll", "NOHANDSHAKE"))
SetGadgetText(#String_51, ReadPreferenceString("TimeOut_Einlesen", "300"))
SetGadgetText(#ComboBox_61, ReadPreferenceString("Sonderzeichen_Einlesen", "Nein"))
SetGadgetText(#ComboBox_24, ReadPreferenceString("Puffergrösse_Einlesen", "4096"))
SetGadgetText(#String_55, ReadPreferenceString("Einlesen_Beenden", "04"))
SetGadgetText(#ComboBox_62, ReadPreferenceString("Hex_Ausfiltern_Einlesen", "Nein"))
SetGadgetText(#String_71, ReadPreferenceString("TimeOut_Ausgeben", "300"))
SetGadgetText(#ComboBox_58, ReadPreferenceString("Sonderzeichen_Ausgeben", "Nein"))
SetGadgetText(#ComboBox_66, ReadPreferenceString("Puffergrösse_Ausgeben", "4096"))
SetGadgetText(#ComboBox_67, ReadPreferenceString("Prozent_Filtern_Ausgeben", "Nein"))
SetGadgetText(#ComboBox_65, ReadPreferenceString("Hex_Ausfiltern_Ausgeben", "Nein"))
SetGadgetText(#ComboBox_64, ReadPreferenceString("Anzahl_Hexzeichen_Vorlauf", "0"))
SetGadgetText(#ComboBox_63, ReadPreferenceString("Anzahl_Hexzeichen_Nachlauf", "0"))
SetGadgetText(#String_52, ReadPreferenceString("Stringausgabe_Beginn", ""))
SetGadgetText(#String_68, ReadPreferenceString("Stringausgabe_Ende", ""))
SetGadgetText(#String_69, ReadPreferenceString("Stringausgabe_(M02/M30)", ""))
SetGadgetText(#String_70, ReadPreferenceString("Stringausgabe_nach_Zeilenende", ""))
SetGadgetText(#ExplorerTree_83, ReadPreferenceString("Path", "*.nc"))
ClosePreferences()
EndProcedure
Procedure SendToMachine()
If GetGadgetText(#String_77) = "" : ProcedureReturn : EndIf
Baud = Val(GetGadgetText(#ComboBox_15))
Com.s = GetGadgetText(#ComboBox_22)
DataBits = Val(GetGadgetText(#ComboBox_23))
StopBits = Val(GetGadgetText(#ComboBox_25))
InputBuffer = Val(GetGadgetText(#ComboBox_24))
OutputBuffer = Val(GetGadgetText(#ComboBox_66))
Select GetGadgetText(#ComboBox_54)
Case "NOPARITY"
Parity = #PB_SerialPort_NoParity
Case "EVENPARITY"
Parity = #PB_SerialPort_EvenParity
Case "MARKPARITY"
Parity = #PB_SerialPort_MarkParity
Case "ODDPARITY"
Parity = #PB_SerialPort_OddParity
Case "SPACEPARITY"
Parity = #PB_SerialPort_SpaceParity
EndSelect
Select GetGadgetText(#ComboBox_28)
Case "NOHANDSHAKE"
Handshake = #PB_SerialPort_NoHandshake
Case "RTSHANDSHAKE"
Handshake = #PB_SerialPort_RtsHandshake
Case "RTS/CTS"
Handshake = #PB_SerialPort_RtsCtsHandshake
Case "XON/XOFF"
Handshake = #PB_SerialPort_XonXoffHandshake
EndSelect
port = OpenSerialPort(#PB_Any, Com, Baud, Parity, DataBits, Stopbits, Handshake, InputBuffer, OutputBuffer)
ClearGadgetItems(#Editor_88)
;Prozentsatz = Anzahl / (Gesamtzahl/100)
datalen = Len(Programdata)
If Port <> 0
AddGadgetItem(#Editor_88, -1, "serielle Schnittstelle geöffnet ("+ Str(port)+")")
Else
AddGadgetItem(#Editor_88, -1, "Fehler! serielle Schnittstelle konnte nicht geöffnet werden.")
ProcedureReturn
EndIf
If Handshake = #PB_SerialPort_RtsCtsHandshake
SetSerialPortStatus(port, #PB_SerialPort_RTS, 1)
AddGadgetItem(#Editor_88, -1, "RTS an Maschine gesendet, warte auf Antwort...")
EndIf
SetGadgetText(#Button_78, "Abbrechen")
For i = 1 To Len(programdata)
If Handshake = #PB_SerialPort_RtsCtsHandshake
While GetSerialPortStatus(port, #PB_SerialPort_CTS) = 0
Ev = WaitWindowEvent(10)
If Ev = #PB_Event_Gadget
EventGadget = EventGadget()
EndIf
If EventGadget = #Button_78
Breakk = 1
Break
EndIf
Wend
If Breakk = 1
AddGadgetItem(#Editor_88, -1, "Übertragung vorzeitig abgebrochen.")
SetGadgetText(#Button_78, "Übertragung starten")
SetGadgetState(#ProgressBar_81, 0)
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)
CloseSerialPort(Port)
ProcedureReturn
EndIf
EndIf
If Handshake = #PB_SerialPort_RtsCtsHandshake
If CTS = 0 : AddGadgetItem(#Editor_88, -1, "CTS von Maschine erhalten. Daten werden übertragen...") : CTS = 1 : EndIf
EndIf
Tick = WriteSerialPortString(Port, Mid(programdata,i,1)) ;: Debug AvailableSerialPortOutput(port)
If Tick = 0
Error = SerialPortError(Port)
AddGadgetItem(#Editor_88, -1, "Übertragungsfehler !!! Error "+ Str(Error))
Else
Bytes + Tick
Prozent = Bytes / (datalen / 100)
SetGadgetState(#ProgressBar_81, Prozent)
EndIf
Ev = WindowEvent()
If Ev = #PB_Event_Gadget
EventGadget = EventGadget()
EndIf
If EventGadget = #Button_78
AddGadgetItem(#Editor_88, -1, "Übertragung vorzeitig abgebrochen.")
SetGadgetText(#Button_78, "Übertragung starten")
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)
SetGadgetState(#ProgressBar_81, 0)
CloseSerialPort(Port)
ProcedureReturn
EndIf
Next i
If Handshake = #PB_SerialPort_RtsCtsHandshake
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)
EndIf
CloseSerialPort(Port)
AddGadgetItem(#Editor_88, -1, "Übertragung beendet. " + Str(Bytes)+ " Bytes gesendet.")
SetGadgetText(#Button_78, "Übertragung starten")
SetGadgetText(#String_77, "")
EndProcedure
Procedure LoadProgram()
If GetGadgetState(#ExplorerTree_83) = #PB_Explorer_Directory : ProcedureReturn : EndIf
file.s = GetGadgetText(#ExplorerTree_83)
filepart.s = GetFilePart(file)
SetGadgetText(#String_77, filepart)
OpenPreferences(#Preference)
WritePreferenceString("Path", GetPathPart(file))
ClosePreferences()
ClearGadgetItems(#Editor_73)
programdata = ""
If ReadFile(0, file)
length = Lof(0)
*Mem = AllocateMemory(length)
If *Mem
bytes = ReadData(0, *Mem, length)
EndIf
CloseFile(0)
EndIf
programdata = PeekS(*Mem,length) : FreeMemory(*Mem)
; programdata = RemoveString(programdata, Chr(1))
; programdata = RemoveString(programdata, Chr(2))
; programdata = RemoveString(programdata, Chr(3))
; programdata = RemoveString(programdata, Chr(4))
; programdata = RemoveString(programdata, Chr(5))
; programdata = RemoveString(programdata, Chr(6))
; programdata = RemoveString(programdata, Chr(7))
; programdata = RemoveString(programdata, Chr(8))
; programdata = RemoveString(programdata, Chr(9))
; programdata = RemoveString(programdata, Chr(11))
; programdata = RemoveString(programdata, Chr(12))
; programdata = RemoveString(programdata, Chr(13))
; programdata = RemoveString(programdata, Chr(14))
; programdata = RemoveString(programdata, Chr(15))
; programdata = RemoveString(programdata, Chr(16))
; programdata = RemoveString(programdata, Chr(17))
; programdata = RemoveString(programdata, Chr(18))
; programdata = RemoveString(programdata, Chr(19))
; programdata = RemoveString(programdata, Chr(20))
; programdata = RemoveString(programdata, Chr(21))
; programdata = RemoveString(programdata, Chr(22))
; programdata = RemoveString(programdata, Chr(23))
; programdata = RemoveString(programdata, Chr(24))
; programdata = RemoveString(programdata, Chr(25))
; programdata = RemoveString(programdata, Chr(26))
; programdata = RemoveString(programdata, Chr(27))
; programdata = RemoveString(programdata, Chr(28))
; programdata = RemoveString(programdata, Chr(29))
; programdata = RemoveString(programdata, Chr(30))
; programdata = RemoveString(programdata, Chr(31))
; For i = 1 To Len(programdata)
; ;Debug Mid(programdata,i,1)
; Debug Asc(Mid(programdata,i,1))
; Next i
programdata = ReplaceString(programdata, Chr(10), (Chr(13)+Chr(10)))
SetGadgetText(#Editor_73, programdata)
SetGadgetState(#ProgressBar_81, 0)
ClearGadgetItems(#Editor_88)
EndProcedure
CreateWindow()
FillComboBoxes()
LoadPreferences()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
EventGadget = EventGadget()
EventType = EventType()
If EventGadget = #PanelGadget
ElseIf EventGadget = #Editor_88
ElseIf EventGadget = #String_77
ElseIf EventGadget = #Button_82 : WritePreference()
ElseIf EventGadget = #Editor_73
ElseIf EventGadget = #String_71
ElseIf EventGadget = #String_51
ElseIf EventGadget = #Frame3D_76
ElseIf EventGadget = #Text_48
ElseIf EventGadget = #Text_47
ElseIf EventGadget = #Text_46
ElseIf EventGadget = #Text_45
ElseIf EventGadget = #Text_44
ElseIf EventGadget = #Text_43
ElseIf EventGadget = #Text_41
ElseIf EventGadget = #Text_40
ElseIf EventGadget = #Text_39
ElseIf EventGadget = #Text_38
ElseIf EventGadget = #Text_37
ElseIf EventGadget = #Text_36
ElseIf EventGadget = #Text_35
ElseIf EventGadget = #Text_34
ElseIf EventGadget = #Text_33
ElseIf EventGadget = #Text_32
ElseIf EventGadget = #Text_21
ElseIf EventGadget = #Text_20
ElseIf EventGadget = #Text_19
ElseIf EventGadget = #Text_18
ElseIf EventGadget = #Text_17
ElseIf EventGadget = #Text_16
ElseIf EventGadget = #Frame3D_27
ElseIf EventGadget = #ComboBox_15
ElseIf EventGadget = #ComboBox_22
ElseIf EventGadget = #ComboBox_23
ElseIf EventGadget = #ComboBox_24
ElseIf EventGadget = #ComboBox_25
ElseIf EventGadget = #ComboBox_28
ElseIf EventGadget = #Frame3D_29
ElseIf EventGadget = #Frame3D_30
ElseIf EventGadget = #Frame3D_31
ElseIf EventGadget = #String_52
ElseIf EventGadget = #ComboBox_54
ElseIf EventGadget = #String_55
ElseIf EventGadget = #ComboBox_58
ElseIf EventGadget = #ComboBox_61
ElseIf EventGadget = #ComboBox_62
ElseIf EventGadget = #ComboBox_63
ElseIf EventGadget = #ComboBox_64
ElseIf EventGadget = #ComboBox_65
ElseIf EventGadget = #ComboBox_66
ElseIf EventGadget = #ComboBox_67
ElseIf EventGadget = #String_68
ElseIf EventGadget = #String_69
ElseIf EventGadget = #String_70
ElseIf EventGadget = #Button_78 : SendToMachine()
ElseIf EventGadget = #Image_79
ElseIf EventGadget = #Image_80
ElseIf EventGadget = #ProgressBar_81
ElseIf EventGadget = #ExplorerTree_83
ElseIf EventGadget = #Frame3D_84
ElseIf EventGadget = #Button_85 : LoadProgram()
EndIf
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = #Window
CloseWindow(#Window)
Break
EndIf
EndSelect
ForEver