diff --git a/clients/AutoHotKey/LICENSE b/clients/AutoHotKey/LICENSE new file mode 100644 index 0000000..13de1fd --- /dev/null +++ b/clients/AutoHotKey/LICENSE @@ -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. diff --git a/clients/AutoHotKey/LedKeyboardShortcuts.ahk b/clients/AutoHotKey/LedKeyboardShortcuts.ahk new file mode 100644 index 0000000..5d44d08 --- /dev/null +++ b/clients/AutoHotKey/LedKeyboardShortcuts.ahk @@ -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:") + 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:=(st):(s