nun, mein Projekt ist weiter vorangeschritten und das Progamm wurde um viele Funktionen erweitert, viele Fehler (der Absturz, siehe oben) behoben, weitere Sicherheits-Checks eingebaut...
Wer noch weitere Ideen zu Lauflichtmustern hat, bitte melden. 8 Muster stehen im Progamm zur Verfügung, 4 sind noch nicht belegt (programmiert).
Code: Alles auswählen
;
; ************************************************************************************************
; *** K8055PURE v0.8.2 (LAST CHANGE: 18 AUGUST 2010) - WRITTEN WITH PUREBASIC BY DARKWOLF! ***
; ************************************************************************************************
;
; INTRODUCTION:
; THE ORIGINAL PURPOSE WAS TO CREATE A TOOL TO CONTROL MY SELF-MADE LIGHTING CONSOLE,
; BUT THE RESULT WAS A LITTLE TOOLKIT TO INTERFACE YOUR COMPUTER WITH "YOUR WORLD" USING THE
; VELLEMAN K8055 USB-INTERFACE BOARD. THIS PROGARM IS FULLY WRITTEN IN PUREBASIC v4.40 AND THE
; SOURCE-CODE IS INCLUDED TO PROVIDE BEGINNERS AN INSIGHT HOW TO ACCESS THE K8055 - SO THEY
; CAN INCREASE THEIR SKILLS BY CODING NEW PROGRAMS BASED ON MY BASIC TOOL.
;
; AT THE MOMENT ONLY DIGITAL OUT IS INCLUDED, BUT OF COURSE ALL OTHER FUNCTIONS CAN BE ADDED,
; IF YOU LIKE. FEEL FREE TO COMPLETE THIS PROGRAM BY ADDING THESE FUNCTIONS - JUST DOWNLOAD THE
; ASSEMBLING INSTRUCTIONS AND/OR THE K8055D.DLL REFERENCE FROM THE VELLEMAN WEBSITE (LINK BELOW).
;
; THE LIBRARY K8055D.DLL (DELIVERED WITH YOUR K8055, ALSO AVAILABLE IN THE INTERNET) IS
; NECESSARY TO USE THIS PROGRAM. NOTE: IF YOU ARE USING WINDOWS VISTA OR HIGHER, MAKE SURE
; THAT YOU ARE USING REV. 3.0.2.0, OTHERWISE THIS PROGRAM CANNOT WORK PROPERLY.
;
; IMPORTANT:
; THIS PROGRAM COMES WITH ABSOLUTELY NO WARRANTY, FEEL FREE TO DISTRIBUTE THIS COPY TO YOUR
; FRIENDS, AND LAST BUT NOT LEAST: HAVE FUN WITH CRATING YOU OWN PROJECTS USING THIS EXAMPLE !
;
; LINK TO VELLEMAN: http://www.velleman.eu/distributor/products/view/?country=be&lang=en&id=351346
;
; ************************************************************************************************
; ENUMERATION FOR OBJECT-ID´S -> NAMES ARE EASIER TO HANDLE THAN NUMBERS :-)
Enumeration
#DLL_K8055
#WINDOW_MAIN
#WINDOW_HELP
#WINDOW_ABOUT
#WINDOW_ERROR
#MENU_MAIN
#MENU_CONNECT
#MENU_DISCONNECT
#MENU_CLOSE
#MENU_HELP
#MENU_ABOUT
#STATUSBAR_MAIN
#FRAME_CONFIG
#FRAME_DIGITAL_OUT
#FRAME_INDICATION
#FRAME_DELAY
#CHECKBOX_JUMPER_SK5
#CHECKBOX_JUMPER_SK6
#CHECKBOX_INDICATOR_1
#CHECKBOX_INDICATOR_2
#CHECKBOX_INDICATOR_3
#CHECKBOX_INDICATOR_4
#CHECKBOX_INDICATOR_5
#CHECKBOX_INDICATOR_6
#CHECKBOX_INDICATOR_7
#CHECKBOX_INDICATOR_8
#BUTTON_CONNECT
#BUTTON_DISCONNECT
#BUTTON_ALL_ON
#BUTTON_ALL_OFF
#BUTTON_BLINKING
#BUTTON_RANDOM
#BUTTON_PATTERN_1
#BUTTON_PATTERN_2
#BUTTON_PATTERN_3
#BUTTON_PATTERN_4
#BUTTON_PATTERN_5
#BUTTON_PATTERN_6
#BUTTON_PATTERN_7
#BUTTON_PATTERN_8
#BUTTON_MANUAL_SET
#BUTTON_MANUAL_RESET
#BUTTON_INCREASE
#BUTTON_DECREASE
#BUTTON_HELP_OK
#BUTTON_ABOUT_OK
#BUTTON_ERROR_OK
#TEXT_HELP_1
#TEXT_ABOUT_1
#TEXT_ABOUT_2
#TEXT_ABOUT_3
#TEXT_ABOUT_4
#TEXT_ERROR_1
#TEXT_ERROR_2
#TEXT_ERROR_3
#TEXT_ERROR_4
EndEnumeration
; FLAGS FOR THE MAIN WINDOW: CENTERED, INCLUDE CLOSE AND MINIMIZE-BUTTONS
#FLAGS = #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget
; DECLARATION OF GLOBAL VARIABLES
Global QUIT.b = #False ; VARIABLE FOR EXIT-CONDITION OF MAIN LOOP
Global CONNECTED.b = #False ; VARIABLE FOR STATUS OF K8055 CONNECTION
Global WAIT_TIME.l = 100 ; VARIABLE FOR DELAY TIME IN MILLISECONDS
Global CardAddress.l = 0 ; VARIABLE FOR CARD-ADDRESS
Global ProgramVersion.s = "v0.8.2" ; STRING FOR PROGRAM VERSION
; INCLUDING AN EXTERNAL PUREBASIC-FILE (CONTAINING THE PROCEDURES)
IncludeFile "Procedures.pbi" ; EXTERNAL PUREBASIC-FILE (CONTAINING THE PROCEDURES)
; TRY TO OPEN THE "K8055D.DLL" LIBRARY, IF THIS FILE IS MISSING, SHOW A MESSAGE AND QUIT PROGRAM
If OpenLibrary(#DLL_K8055, "K8055D.dll") = #False
Show_Window_DLL_ERROR() ; THIS PROCEDURE OPENS A WINDOW AND REPORTS THAT K8055.DLL IS MISSING
End
EndIf
; TRY TO CREATE THE MAIN WINDOW, ELSE SHOW A MESSAGE AND QUIT PROGRAM
If OpenWindow(#WINDOW_MAIN, 0, 0, 410, 320, "K8055PURE " + ProgramVersion + " (by DaRkWoLf!)",#FLAGS)
Frame3DGadget(#FRAME_CONFIG,10,10,100,140,"K8055 Config")
CheckBoxGadget(#CHECKBOX_JUMPER_SK5, 20, 30, 80 , 20, "Jumper SK5") ; JUMPER FOR K8055-ADDRESS
CheckBoxGadget(#CHECKBOX_JUMPER_SK6, 20, 50, 80 , 20, "Jumper SK6")
SetGadgetState(#CHECKBOX_JUMPER_SK5,1) ; ACTIVATE CHECKBOXES BY DEFAULT
SetGadgetState(#CHECKBOX_JUMPER_SK6,1)
ButtonGadget(#BUTTON_CONNECT,20,80,80,20,"Connect")
ButtonGadget(#BUTTON_DISCONNECT,20,110,80,20,"Disconnect")
Frame3DGadget(#FRAME_DIGITAL_OUT,120,10,280,140,"Digital Outputs - Automatic Control")
ButtonGadget(#BUTTON_ALL_ON,130,30,80,20,"All On")
ButtonGadget(#BUTTON_ALL_OFF,130,60,80,20,"All Off")
ButtonGadget(#BUTTON_BLINKING,130,90,80,20,"Blinking")
ButtonGadget(#BUTTON_RANDOM,130,120,80,20,"Random")
ButtonGadget(#BUTTON_PATTERN_1,220,30,80,20,"Pattern 1")
ButtonGadget(#BUTTON_PATTERN_2,220,60,80,20,"Pattern 2")
ButtonGadget(#BUTTON_PATTERN_3,220,90,80,20,"Pattern 3")
ButtonGadget(#BUTTON_PATTERN_4,220,120,80,20,"Pattern 4")
ButtonGadget(#BUTTON_PATTERN_5,310,30,80,20,"Pattern 5")
ButtonGadget(#BUTTON_PATTERN_6,310,60,80,20,"Pattern 6")
ButtonGadget(#BUTTON_PATTERN_7,310,90,80,20,"Pattern 7")
ButtonGadget(#BUTTON_PATTERN_8,310,120,80,20,"Pattern 8")
Frame3DGadget(#FRAME_INDICATION,10,160,390,50,"Digital Output Channels - Manual Control")
CheckBoxGadget(#CHECKBOX_INDICATOR_1, 20, 180, 25 , 20, "1"); CHECKBOXES FOR MANUAL CONTROL
CheckBoxGadget(#CHECKBOX_INDICATOR_2, 50, 180, 25 , 20, "2")
CheckBoxGadget(#CHECKBOX_INDICATOR_3, 80, 180, 25 , 20, "3")
CheckBoxGadget(#CHECKBOX_INDICATOR_4, 110, 180, 25 , 20, "4")
CheckBoxGadget(#CHECKBOX_INDICATOR_5, 140, 180, 25 , 20, "5")
CheckBoxGadget(#CHECKBOX_INDICATOR_6, 170, 180, 25 , 20, "6")
CheckBoxGadget(#CHECKBOX_INDICATOR_7, 200, 180, 25 , 20, "7")
CheckBoxGadget(#CHECKBOX_INDICATOR_8, 230, 180, 25 , 20, "8")
ButtonGadget(#BUTTON_MANUAL_SET,260,180,60,20,"Set Ch.")
ButtonGadget(#BUTTON_MANUAL_RESET,330,180,60,20,"Reset All")
Frame3DGadget(#FRAME_DELAY,10,220,210,50,"Delay Settings (Automatic Control)")
ButtonGadget(#BUTTON_INCREASE,20,240,90,20,"Increase Speed")
ButtonGadget(#BUTTON_DECREASE,120,240,90,20,"Decrease Speed")
If CreateMenu(#MENU_MAIN, WindowID(#WINDOW_MAIN)); TRY TO CREATE THE MAIN WINDOWS MENU
MenuTitle("File")
MenuItem(#MENU_CONNECT, "Connect K8055")
MenuItem(#MENU_DISCONNECT, "Disconnect K8055")
MenuBar(); THIS COMMAND CREATES A SEPARATOR
MenuItem(#MENU_CLOSE, "Quit" + #TAB$ + "Ctrl+Q"); A MENU ENTRY WITH SHORTCUT
; CREATES A SHORTCUT TO CLOSE THE PROGRAM WITH CTRL+Q
AddKeyboardShortcut(#WINDOW_MAIN,#PB_Shortcut_Control|#PB_Shortcut_Q,#MENU_CLOSE)
MenuTitle("Help")
MenuItem(#MENU_HELP, "K8055PURE Help" + #TAB$ + "F1")
MenuBar()
MenuItem(#MENU_ABOUT, "About K8055PURE")
AddKeyboardShortcut(#WINDOW_MAIN,#PB_Shortcut_F1,#MENU_HELP)
EndIf
If CreateStatusBar (#STATUSBAR_MAIN, WindowID(#WINDOW_MAIN))
AddStatusBarField (90)
AddStatusBarField (110)
AddStatusBarField (#PB_Ignore)
EndIf
StatusBarText (#STATUSBAR_MAIN, 1, " Actual Delay: " + Str(WAIT_TIME))
StatusBarText (#STATUSBAR_MAIN, 2, " Digital Output Indicator: 0 0 0 0 0 0 0 0 ")
; BEGIN OF THE MAIN-LOOP
Repeat
; DE-/ACTIVATION OF BUTTONS & TEXT ACCORDING TO THE STATUS OF K8055 CONNECTION
If CONNECTED = #True ; CONDITION, IF CONNECTED TO K8055
StatusBarText (#STATUSBAR_MAIN, 0, " Connected ! ")
DisableGadget (#BUTTON_CONNECT, 1)
DisableGadget (#BUTTON_DISCONNECT, 0)
DisableGadget (#BUTTON_ALL_ON, 0)
DisableGadget (#BUTTON_ALL_OFF, 0)
DisableGadget (#BUTTON_BLINKING, 0)
DisableGadget (#BUTTON_RANDOM, 0)
DisableGadget (#BUTTON_PATTERN_1, 0)
DisableGadget (#BUTTON_PATTERN_2, 0)
DisableGadget (#BUTTON_PATTERN_3, 0)
DisableGadget (#BUTTON_PATTERN_4, 0)
DisableGadget (#BUTTON_PATTERN_5, 0)
DisableGadget (#BUTTON_PATTERN_6, 0)
DisableGadget (#BUTTON_PATTERN_7, 0)
DisableGadget (#BUTTON_PATTERN_8, 0)
DisableGadget (#CHECKBOX_INDICATOR_1, 0)
DisableGadget (#CHECKBOX_INDICATOR_2, 0)
DisableGadget (#CHECKBOX_INDICATOR_3, 0)
DisableGadget (#CHECKBOX_INDICATOR_4, 0)
DisableGadget (#CHECKBOX_INDICATOR_5, 0)
DisableGadget (#CHECKBOX_INDICATOR_6, 0)
DisableGadget (#CHECKBOX_INDICATOR_7, 0)
DisableGadget (#CHECKBOX_INDICATOR_8, 0)
DisableGadget (#BUTTON_MANUAL_SET, 0)
DisableGadget (#BUTTON_MANUAL_RESET, 0)
DisableGadget (#BUTTON_INCREASE, 0)
DisableGadget (#BUTTON_DECREASE, 0)
DisableMenuItem (#MENU_MAIN, #MENU_CONNECT, 1)
DisableMenuItem (#MENU_MAIN, #MENU_DISCONNECT, 0)
Else ; CONDITION, IF NOT CONNECTED TO K8055
StatusBarText (#STATUSBAR_MAIN, 0, " Disconnected ! ")
DisableGadget (#BUTTON_CONNECT, 0)
DisableGadget (#BUTTON_DISCONNECT, 1)
DisableGadget (#BUTTON_ALL_ON, 1)
DisableGadget (#BUTTON_ALL_OFF, 1)
DisableGadget (#BUTTON_BLINKING, 1)
DisableGadget (#BUTTON_RANDOM, 1)
DisableGadget (#BUTTON_PATTERN_1, 1)
DisableGadget (#BUTTON_PATTERN_2, 1)
DisableGadget (#BUTTON_PATTERN_3, 1)
DisableGadget (#BUTTON_PATTERN_4, 1)
DisableGadget (#BUTTON_PATTERN_5, 1)
DisableGadget (#BUTTON_PATTERN_6, 1)
DisableGadget (#BUTTON_PATTERN_7, 1)
DisableGadget (#BUTTON_PATTERN_8, 1)
DisableGadget (#CHECKBOX_INDICATOR_1, 1)
DisableGadget (#CHECKBOX_INDICATOR_2, 1)
DisableGadget (#CHECKBOX_INDICATOR_3, 1)
DisableGadget (#CHECKBOX_INDICATOR_4, 1)
DisableGadget (#CHECKBOX_INDICATOR_5, 1)
DisableGadget (#CHECKBOX_INDICATOR_6, 1)
DisableGadget (#CHECKBOX_INDICATOR_7, 1)
DisableGadget (#CHECKBOX_INDICATOR_8, 1)
DisableGadget (#BUTTON_MANUAL_SET, 1)
DisableGadget (#BUTTON_MANUAL_RESET, 1)
DisableGadget (#BUTTON_INCREASE, 1)
DisableGadget (#BUTTON_DECREASE, 1)
DisableMenuItem (#MENU_MAIN, #MENU_CONNECT, 0)
DisableMenuItem (#MENU_MAIN, #MENU_DISCONNECT, 1)
EndIf
; WAITING FOR AN EVENT
EventID.l = WaitWindowEvent()
; PROCESSING THE WINDOW-EVENT WITH NESTED SELECT-CASE COMMANDS
Select EventID
Case #PB_Event_Gadget
; CODE-SEGMENT FOR GADGET EVENTS (BUTTONS)
Select EventGadget()
Case #BUTTON_CONNECT
CardAddress = 3 - (GetGadgetState(#CHECKBOX_JUMPER_SK5) + (GetGadgetState(#CHECKBOX_JUMPER_SK6) *2))
Connect_Result = CallCFunction(#DLL_K8055, "OpenDevice",CardAddress)
Select Connect_Result
Case 0,1,2,3
CONNECTED = #True
MessageRequester("Information", "Card " + Str(CardAddress) + " successfully connected !", 0)
Case -1
MessageRequester("Error", "Card " + Str(CardAddress) + " not found !", 0)
EndSelect
Case #BUTTON_DISCONNECT
If CallFunction(#DLL_K8055, "CloseDevice",0)
CONNECTED = #False
MessageRequester("Information", "Successfully disconnected !", 0)
Else
MessageRequester("Error", "Problems while disconnecting !", 0)
EndIf
Case #BUTTON_ALL_ON
CallFunction(#DLL_K8055, "SetAllDigital")
Case #BUTTON_ALL_OFF
CallFunction(#DLL_K8055, "ClearAllDigital")
Case #BUTTON_BLINKING
;For count.l = 0 To 4
CallFunction(#DLL_K8055, "SetAllDigital") : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "ClearAllDigital") : Delay(WAIT_TIME)
;Next count
Case #BUTTON_RANDOM
CallFunction(#DLL_K8055, "ClearAllDigital")
;For count.l = 0 To 16
CallFunction(#DLL_K8055, "WriteAllDigital",Random (254) + 1) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "ClearAllDigital") : Delay(WAIT_TIME)
;Next count
Case #BUTTON_PATTERN_1
CallFunction(#DLL_K8055, "WriteAllDigital",1) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",2) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",4) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",8) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",16) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",32) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",64) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",128) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "ClearAllDigital")
Case #BUTTON_PATTERN_2
CallFunction(#DLL_K8055, "ClearAllDigital")
For count.l = 0 To 8
CallFunction(#DLL_K8055, "SetDigitalChannel",count) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "ClearDigitalChannel",count) : Delay(WAIT_TIME)
Next count
Case #BUTTON_PATTERN_3
CallFunction(#DLL_K8055, "SetAllDigital")
For count.l = 0 To 8
CallFunction(#DLL_K8055, "SetDigitalChannel",count) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "ClearDigitalChannel",count) : Delay(WAIT_TIME)
Next count
Case #BUTTON_PATTERN_4
CallFunction(#DLL_K8055, "WriteAllDigital",1) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",3) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",6) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",12) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",24) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",48) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",96) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",192) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "WriteAllDigital",128) : Delay(WAIT_TIME)
CallFunction(#DLL_K8055, "ClearAllDigital")
Case #BUTTON_PATTERN_5
MessageRequester("Information", "Not implented error !", 0)
Case #BUTTON_PATTERN_6
MessageRequester("Information", "Not implented error !", 0)
Case #BUTTON_PATTERN_7
MessageRequester("Information", "Not implented error !", 0)
Case #BUTTON_PATTERN_8
MessageRequester("Information", "Not implented error !", 0)
Case #BUTTON_MANUAL_SET
MessageRequester("Information", "Not implented error !", 0)
Case #BUTTON_MANUAL_RESET
CallFunction(#DLL_K8055, "ClearAllDigital")
SetGadgetState(#CHECKBOX_INDICATOR_1,0)
SetGadgetState(#CHECKBOX_INDICATOR_2,0)
SetGadgetState(#CHECKBOX_INDICATOR_3,0)
SetGadgetState(#CHECKBOX_INDICATOR_4,0)
SetGadgetState(#CHECKBOX_INDICATOR_5,0)
SetGadgetState(#CHECKBOX_INDICATOR_6,0)
SetGadgetState(#CHECKBOX_INDICATOR_7,0)
SetGadgetState(#CHECKBOX_INDICATOR_8,0)
Case #BUTTON_INCREASE
WAIT_TIME - 10
If WAIT_TIME < 0
WAIT_TIME = 0
EndIf
StatusBarText (#STATUSBAR_MAIN, 1, " Actual Delay: " + Str(WAIT_TIME))
Case #BUTTON_DECREASE
WAIT_TIME + 10
StatusBarText (#STATUSBAR_MAIN, 1, " Actual Delay: " + Str(WAIT_TIME))
EndSelect
Case #PB_Event_Menu
; CODE-SEGMENT FOR MENU EVENTS
Select EventMenu()
Case #MENU_CONNECT
CardAddress = 3 - (GetGadgetState(#CHECKBOX_JUMPER_SK5) + (GetGadgetState(#CHECKBOX_JUMPER_SK6) *2))
Connect_Result = CallCFunction(#DLL_K8055, "OpenDevice",CardAddress)
Select Connect_Result
Case 0,1,2,3
CONNECTED = #True
MessageRequester("Information", "Card " + Str(CardAddress) + " successfully connected !", 0)
Case -1
MessageRequester("Error", "Card " + Str(CardAddress) + " not found !", 0)
EndSelect
Case #MENU_DISCONNECT
If CallFunction(#DLL_K8055, "CloseDevice",0)
CONNECTED = #False
MessageRequester("Information", "Successfully disconnected !", 0)
Else
MessageRequester("Error", "Problems while disconnecting !", 0)
EndIf
Case #MENU_CLOSE
QUIT= #True
Case #MENU_HELP
Show_Window_Help()
Case #MENU_ABOUT
Show_Window_About()
EndSelect
EndSelect
; EXIT CONDITION FOR MAIN LOOP
Until EventID = #PB_Event_CloseWindow Or QUIT = #True
; RESETTING AND DISCONNECTING THE K8055, CLOSE THE LIBRARY AND THE MAIN WINDOW
CallFunction(#DLL_K8055, "ClearAllDigital") ; RESETS THE DIGITAL OUTOUTS TO INITIAL CONDITION
CallFunction(#DLL_K8055, "CloseDevice") ; CLOSED THE CONNECTION TO THE K8055
CloseLibrary(#DLL_K8055) ; REMOVES THE "K8055D.DLL" LIBRARY FROM MEMORY
CloseWindow(#WINDOW_MAIN) ; CLOSES THE MAIN WINDOW
; THIS SEGMENT WILL BE EXECUTED, IF THERE OCCURS AN ERROR WHILE CREATING THE MAIN WINDOW
Else
MessageRequester("Error", "Can't initialize main window !", 0)
EndIf
; PROGRAM END
End