commit
f61f2ed601
3 changed files with 487 additions and 0 deletions
24
clients/AutoHotKey/LICENSE
Normal file
24
clients/AutoHotKey/LICENSE
Normal file
|
@ -0,0 +1,24 @@
|
|||
The following liscence applies to the inclueded Websocket class which was created by G33kDude (https://github.com/G33kDude/WebSocket.ahk):
|
||||
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 GeekDude
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
418
clients/AutoHotKey/LedKeyboardShortcuts.ahk
Normal file
418
clients/AutoHotKey/LedKeyboardShortcuts.ahk
Normal file
|
@ -0,0 +1,418 @@
|
|||
#NoEnv
|
||||
#SingleInstance force ; only lets one run
|
||||
SetBatchLines, -1
|
||||
|
||||
#Persistent ; prevents the script from exiting automatically
|
||||
|
||||
; Register a function to be called on exit:
|
||||
OnExit("ExitFunc")
|
||||
|
||||
; make the notification box
|
||||
notificationEnable := true ; set this to false to disable the notification popups
|
||||
notificationTime := 1 ; seconds the notifications stay
|
||||
|
||||
n := new Notification("Starting led shortcuts!", 200,14, ,notificationTime)
|
||||
|
||||
; make the socket
|
||||
socket := new McLightingServer("ws://192.168.1.33:81") ; replace with the ip address of the mclighting controller
|
||||
|
||||
incrementAmount := 10 ; how finely you adjust the color, speed, and brightness per keypress
|
||||
maxColor := 255
|
||||
maxMode := 56 ; the maximum mode id number
|
||||
|
||||
red := 127
|
||||
green := 127
|
||||
blue := 127
|
||||
|
||||
brightness := 127
|
||||
speed := 127
|
||||
mode := 1
|
||||
|
||||
^#Numpad4:: ; switch modes down
|
||||
mode := mode - 1
|
||||
if(mode < 0)
|
||||
mode := maxMode
|
||||
cmd = /%mode% ; / is the set effect mode command
|
||||
setNotification("Mode: " + mode)
|
||||
sendCmd(cmd)
|
||||
; MsgBox %cmd%
|
||||
return
|
||||
|
||||
|
||||
^#Numpad6:: ; switch modes up
|
||||
mode := mode + 1
|
||||
if(mode > maxMode)
|
||||
mode := 0
|
||||
setNotification("Mode: " + mode)
|
||||
cmd = /%mode%
|
||||
sendCmd(cmd)
|
||||
; MsgBox %cmd%
|
||||
return
|
||||
|
||||
^#Numpad5:: ; turn off
|
||||
setNotification("Leds are off")
|
||||
sendCmd("=off") ; = is the set control command
|
||||
return
|
||||
|
||||
^#Numpad0:: ; turn on to static color
|
||||
setNotification("Leds are on")
|
||||
cmd := "*"+toHexColor(red,green,blue) ; * is the set all command
|
||||
sendCmd(cmd) ; = is the set control command
|
||||
return
|
||||
|
||||
|
||||
^#NumpadSub:: ; decreases brightness
|
||||
brightness := brightness - incrementAmount
|
||||
if(brightness < 0)
|
||||
brightness := 0
|
||||
cmd = `%%brightness% ; % is the set brightness mode command. ` is the escape character
|
||||
setNotification("Brightness: " + brightness)
|
||||
sendCmd(cmd)
|
||||
; MsgBox %cmd%
|
||||
return
|
||||
|
||||
^#NumpadAdd:: ; increases brightness
|
||||
brightness := brightness + incrementAmount
|
||||
if(brightness > maxColor)
|
||||
brightness := maxColor
|
||||
cmd = `%%brightness% ; % is the set brightness mode command
|
||||
setNotification("Brightness: " + brightness)
|
||||
sendCmd(cmd)
|
||||
; MsgBox %cmd%
|
||||
return
|
||||
|
||||
^#NumpadDiv:: ; decreases speed
|
||||
speed := speed - incrementAmount
|
||||
if(speed < 0)
|
||||
speed := 0
|
||||
cmd = ?%speed% ; ? is the set brightness mode command
|
||||
setNotification("Speed: "+ speed)
|
||||
sendCmd(cmd)
|
||||
; MsgBox %cmd%
|
||||
return
|
||||
|
||||
^#NumpadMult:: ; increases speed
|
||||
speed := speed + incrementAmount
|
||||
if(speed > maxColor)
|
||||
speed := maxColor
|
||||
cmd = ?%speed% ; ? is the set brightness mode command
|
||||
setNotification("Speed: "+ speed)
|
||||
sendCmd(cmd)
|
||||
; MsgBox %cmd%
|
||||
return
|
||||
|
||||
|
||||
^#Numpad7:: ; increase red amount
|
||||
red := red + incrementAmount
|
||||
if(red > maxColor)
|
||||
red := maxColor
|
||||
|
||||
cmd := "#"+toHexColor(red,green,blue) ; # is the set main color command
|
||||
; MsgBox %cmd%
|
||||
setNotification("Red: " + red)
|
||||
sendCmd(cmd)
|
||||
|
||||
return
|
||||
|
||||
^#Numpad1:: ; decrease red amount
|
||||
red := red - incrementAmount
|
||||
if(red < 0)
|
||||
red := 0
|
||||
|
||||
cmd := "#"+toHexColor(red,green,blue) ; # is the set main color command
|
||||
; MsgBox %cmd%
|
||||
setNotification("Red: " + red)
|
||||
sendCmd(cmd)
|
||||
|
||||
return
|
||||
|
||||
^#Numpad8:: ; increase green amount
|
||||
green := green + incrementAmount
|
||||
if(green > maxColor)
|
||||
green := maxColor
|
||||
|
||||
cmd := "#"+toHexColor(red,green,blue) ; # is the set main color command
|
||||
; MsgBox %cmd%
|
||||
setNotification("Green: " + green)
|
||||
sendCmd(cmd)
|
||||
|
||||
return
|
||||
|
||||
^#Numpad2:: ; decrease green amount
|
||||
green := green - incrementAmount
|
||||
if(green < 0)
|
||||
green := 0
|
||||
|
||||
cmd := "#"+toHexColor(red,green,blue) ; # is the set main color command
|
||||
; MsgBox %cmd%
|
||||
setNotification("Green: " + green)
|
||||
sendCmd(cmd)
|
||||
|
||||
return
|
||||
|
||||
^#Numpad9:: ; increase blue amount
|
||||
blue := blue + incrementAmount
|
||||
if(blue > maxColor)
|
||||
blue := maxColor
|
||||
|
||||
cmd := "#"+toHexColor(red,green,blue) ; # is the set main color command
|
||||
; MsgBox %cmd%
|
||||
setNotification("Blue: " + blue)
|
||||
sendCmd(cmd)
|
||||
|
||||
return
|
||||
|
||||
^#Numpad3:: ; decrease blue amount
|
||||
blue := blue - incrementAmount
|
||||
if(blue < 0)
|
||||
blue := 0
|
||||
|
||||
cmd := "#"+toHexColor(red,green,blue) ; # is the set main color command
|
||||
; MsgBox %cmd%
|
||||
setNotification("Blue: " + blue)
|
||||
sendCmd(cmd)
|
||||
|
||||
return
|
||||
|
||||
sendCmd(cmd)
|
||||
{
|
||||
global socket
|
||||
; MsgBox connected: %connected%
|
||||
if( socket.connected )
|
||||
{
|
||||
socket.Send(cmd)
|
||||
; MsgBox %cmd%
|
||||
}
|
||||
else
|
||||
setNotification("Not connected to server!")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
toHexColor(r, g, b)
|
||||
{
|
||||
SetFormat, IntegerFast, hex ; To print values as hexadecimal
|
||||
colorNum := r*65536 + g*256 + b
|
||||
color = 000000%colorNum% ; convert to string and add preceeding zeros
|
||||
color := StrReplace(color, "0x") ; replace the 0x from the middle
|
||||
color := SubStr( color, -5 ) ; get last 6 characters
|
||||
|
||||
SetFormat, IntegerFast, dec ; sets the print mode back to decimal
|
||||
return ""+color ;
|
||||
}
|
||||
|
||||
setNotification(message)
|
||||
{
|
||||
global notificationEnable
|
||||
global n ; the notification class
|
||||
if(notificationEnable)
|
||||
{
|
||||
n.updateMessage(message)
|
||||
n.nshow()
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
ExitFunc(ExitReason, ExitCode)
|
||||
{
|
||||
; MsgBox Exiting
|
||||
global n ; notification class
|
||||
n.ndestroy() ; deletes the notification
|
||||
return 0 ; must return zero to exit
|
||||
}
|
||||
|
||||
class McLightingServer extends WebSocket
|
||||
{
|
||||
OnOpen(Event)
|
||||
{
|
||||
setNotification("Connection established!")
|
||||
; InputBox, Data, WebSocket, Enter some text to send through the websocket.
|
||||
; this.Send(Data)
|
||||
|
||||
; global connected
|
||||
this.connected := 1
|
||||
; MsgBox connection %connected%
|
||||
}
|
||||
|
||||
OnMessage(Event)
|
||||
{
|
||||
; MsgBox, % "Received Data: " Event.data
|
||||
; this.Close()
|
||||
}
|
||||
|
||||
OnClose(Event)
|
||||
{
|
||||
setNotification("Websocket Closed!")
|
||||
; MsgBox closed!
|
||||
this.connected := 0
|
||||
this.Disconnect()
|
||||
ExitApp
|
||||
}
|
||||
|
||||
OnError(Event)
|
||||
{
|
||||
setNotification("Websocket Error")
|
||||
; MsgBox error!
|
||||
this.connected := 0
|
||||
this.Close()
|
||||
}
|
||||
|
||||
__Delete()
|
||||
{
|
||||
; setNotification(" Exiting Led controller ") ; sticks after program closes
|
||||
ExitApp
|
||||
}
|
||||
}
|
||||
|
||||
class WebSocket
|
||||
{
|
||||
__New(WS_URL)
|
||||
{
|
||||
this.connected := false ; flag for connection status
|
||||
static wb
|
||||
|
||||
; Create an IE instance
|
||||
Gui, +hWndhOld
|
||||
Gui, New, +hWndhWnd
|
||||
this.hWnd := hWnd
|
||||
Gui, Add, ActiveX, vWB, Shell.Explorer
|
||||
Gui, %hOld%: Default
|
||||
|
||||
; Write an appropriate document
|
||||
WB.Navigate("about:<!DOCTYPE html><meta http-equiv='X-UA-Compatible'"
|
||||
. "content='IE=edge'><body></body>")
|
||||
while (WB.ReadyState < 4)
|
||||
sleep, 50
|
||||
this.document := WB.document
|
||||
|
||||
; Add our handlers to the JavaScript namespace
|
||||
this.document.parentWindow.ahk_savews := this._SaveWS.Bind(this)
|
||||
this.document.parentWindow.ahk_event := this._Event.Bind(this)
|
||||
this.document.parentWindow.ahk_ws_url := WS_URL
|
||||
|
||||
; Add some JavaScript to the page to open a socket
|
||||
Script := this.document.createElement("script")
|
||||
Script.text := "ws = new WebSocket(ahk_ws_url);`n"
|
||||
. "ws.onopen = function(event){ ahk_event('Open', event); };`n"
|
||||
. "ws.onclose = function(event){ ahk_event('Close', event); };`n"
|
||||
. "ws.onerror = function(event){ ahk_event('Error', event); };`n"
|
||||
. "ws.onmessage = function(event){ ahk_event('Message', event); };"
|
||||
this.document.body.appendChild(Script)
|
||||
}
|
||||
|
||||
; Called by the JS in response to WS events
|
||||
_Event(EventName, Event)
|
||||
{
|
||||
this["On" EventName](Event)
|
||||
}
|
||||
|
||||
; Sends data through the WebSocket
|
||||
Send(Data)
|
||||
{
|
||||
; MsgBox %Data%
|
||||
this.document.parentWindow.ws.send(Data)
|
||||
}
|
||||
|
||||
; Closes the WebSocket connection
|
||||
Close(Code:=1000, Reason:="")
|
||||
{
|
||||
this.document.parentWindow.ws.close(Code, Reason)
|
||||
}
|
||||
|
||||
; Closes and deletes the WebSocket, removing
|
||||
; references so the class can be garbage collected
|
||||
Disconnect()
|
||||
{
|
||||
if this.hWnd
|
||||
{
|
||||
this.Close()
|
||||
Gui, % this.hWnd ": Destroy"
|
||||
this.hWnd := False
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Notification
|
||||
{
|
||||
__New(message, pnW=700, pnH=300, position="b r", time=10000)
|
||||
{
|
||||
this.showTime := time ; time that the notification shows up for
|
||||
|
||||
global pn_msg
|
||||
this.pn_msg := message ; message to display
|
||||
|
||||
Gui, Notify: +AlwaysOnTop +ToolWindow -SysMenu -Caption +LastFound
|
||||
this.PN_hwnd := WinExist()
|
||||
|
||||
WinSet, ExStyle, +0x20
|
||||
WinSet, Transparent, 0 ; makes the box transparent so that it can fade in and out. 255 -> opaque; 0 -> transparent
|
||||
Gui, Notify: Color, 0x111111 ; background color
|
||||
Gui, Notify: Font, cWhite s10 w500, Terminal ; message color, size, weight, and font
|
||||
Gui, Notify: Add, Text, % " x" 20 " y" 12 " vpn_msg", % this.pn_msg ; add message
|
||||
RealW := pnW + 50
|
||||
RealH := pnH + 20
|
||||
Gui, Notify: Show, W%RealW% H%RealH% NoActivate
|
||||
this.WinMove(this.PN_hwnd, position)
|
||||
global windowID := ("ahk_id "this.PN_hwnd) ; window id
|
||||
this.nshow()
|
||||
}
|
||||
|
||||
ndestroy() {
|
||||
this.winfade(windowID,0,50) ; fades the box out
|
||||
Gui, Notify: Destroy
|
||||
return
|
||||
}
|
||||
|
||||
nhide(){ ; called by the timer
|
||||
showTimer:
|
||||
SetTimer, showTimer, Off ; turn off the timer
|
||||
global windowID
|
||||
winfade(windowID,0,50) ; fades the box out
|
||||
return
|
||||
}
|
||||
|
||||
nshow(){
|
||||
w:= ("ahk_id "+this.PN_hwnd)
|
||||
|
||||
WinGet,s,Transparent,%w% ; makes the notification visible
|
||||
s:=(s="")?255:s ;prevent trans unset bug
|
||||
WinSet,Transparent,210,%w%
|
||||
|
||||
Closetick := this.showTime*1000
|
||||
SetTimer, showTimer, % Closetick ; reset the hide timer
|
||||
return
|
||||
}
|
||||
|
||||
updateMessage(message) {
|
||||
this.pn_msg := message
|
||||
GuiControl, Notify: Text, pn_msg, % this.pn_msg
|
||||
return
|
||||
}
|
||||
|
||||
WinMove(hwnd,position) {
|
||||
SysGet, Mon, MonitorWorkArea
|
||||
WinGetPos,ix,iy,w,h, ahk_id %hwnd%
|
||||
x := InStr(position,"l") ? MonLeft : InStr(position,"hc") ? (MonRight-w)/2 : InStr(position,"r") ? MonRight - w : ix
|
||||
y := InStr(position,"t") ? MonTop : InStr(position,"vc") ? (MonBottom-h)/2 : InStr(position,"b") ? MonBottom - h : iy
|
||||
WinMove, ahk_id %hwnd%,,x,y
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
; winfade must be global for the timer to use it
|
||||
winfade(w:="",t:=128,i:=1,d:=10) {
|
||||
w:=(w="")?("ahk_id " WinActive("A")):w
|
||||
t:=(t>255)?255:(t<0)?0:t
|
||||
WinGet,s,Transparent,%w%
|
||||
s:=(s="")?255:s ;prevent trans unset bug
|
||||
WinSet,Transparent,%s%,%w%
|
||||
i:=(s<t)?abs(i):-1*abs(i)
|
||||
while(k:=(i<0)?(s>t):(s<t)&&WinExist(w)) {
|
||||
WinGet,s,Transparent,%w%
|
||||
s+=i
|
||||
WinSet,Transparent,%s%,%w%
|
||||
sleep %d%
|
||||
}
|
||||
return
|
||||
}
|
45
clients/AutoHotKey/README.md
Normal file
45
clients/AutoHotKey/README.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
!!! Make sure that the ip address is edited to match the ip address of your McLighting server !!!
|
||||
|
||||
If you are not familiar with AutoHotKey, this tutorial will get you started: https://autohotkey.com/docs/Tutorial.htm
|
||||
Once you have AutoHotKey installed, double click it to start the script.
|
||||
|
||||
If the Mclighting server goes down for some reason, a socket error notification will appear and you will have to restart the script to reconnect.
|
||||
|
||||
The script is not aware of the current state of the McLighting server and will override what is currently being displayed with its own internal values.
|
||||
|
||||
This has been tested on windows 7 and windows 10.
|
||||
Set the notificationTime variable to the time in seconds that you want the notification to stay on the screen.
|
||||
You can prevent notifications from appearing by setting the notificationEnable variable to false.
|
||||
|
||||
|
||||
The shortcuts only work on the numberpad and only when num lock is on! If you don't have a numberpad you must change the shortcuts to something else. Just be aware that you might be overrriding previously existing shortcuts! Here is the list of windows shortcuts: https://support.microsoft.com/en-us/help/12445/windows-keyboard-shortcuts
|
||||
|
||||
The shortcuts are as follows:
|
||||
|
||||
ctrl+windows+numpad4 decrements the animation mode
|
||||
|
||||
ctrl+windows+numpad6 increments the animation mode
|
||||
|
||||
ctrl+windows+numpad5 turns off the lights
|
||||
|
||||
ctrl+windows+numpad0 turns on all of the lights to the current color
|
||||
|
||||
ctrl+windows+numpadPlus increases the brightness
|
||||
|
||||
ctrl+windows+numpadSubtract decreases the brightness
|
||||
|
||||
ctrl+windows+numpadMultiply increases the speed
|
||||
|
||||
ctrl+windows+numpadDivide decreases the speed
|
||||
|
||||
ctrl+windows+numpad7 increments the red component of the current color
|
||||
|
||||
ctrl+windows+numpad1 decrements the red component of the current color
|
||||
|
||||
ctrl+windows+numpad8 increments the green component of the current color
|
||||
|
||||
ctrl+windows+numpad2 decrements the green component of the current color
|
||||
|
||||
ctrl+windows+numpad9 increments the blue component of the current color
|
||||
|
||||
ctrl+windows+numpad3 decrements the blue component of the current color
|
Loading…
Reference in a new issue