Lua Scripting error with G-Key script SetMkeyState - lua

I have a G602 mouse and I want to use the DPI sensitive buttons (G10, G11) to control the M-Key state of my G910 keyboard. I'm trying to write a Lua script for it, but I'm having problems trying to set the M-Key state based off the API documentation sample:
if event == "MOUSE_BUTTON_PRESSED" and arg == 11 then
SetMkeyState(1,"kb")
end
I get the following error:
[string "LuaVM"]:20: attempt to call global 'SetMkeyState' (a nil value)
I even tried the exact sample from the API documentation and I get the same error:
-- Set the current M Key state to M1 when G1 is pressed
function OnEvent(event, arg)
if (event == "G_PRESSED" and arg == 1) then
SetMkeyState(1);
end
end

The command is case-sensitive and the sample in API Documentation has a typo. The letter K in SetMkeyState should be upper-case.
Using SetMKeyState works:
if event == "MOUSE_BUTTON_PRESSED" and arg == 11 then
SetMKeyState(1,"kb")
end

Related

Using Logitech G13 LUA script to output a string to a desktop application

Due to an injury, I'm using a G13 to automate work tasks, one of which is entering the current date, in one of a few formats. Using the online compiler here: https://www.tutorialspoint.com/execute_lua_online.php, I was able to figure out how to get and format the date, but what I can't find is an output method that will send the string to Word, Chrome, Notepad, etc. - whatever the active window is. Outputting it to the log or LCD doesn't get it where I need it. Print doesn't output to the active window, and io.write gives the following error: [string "LuaVM"]:11: attempt to index global 'io' (a nil value). Os.date gave a similar error, that's why it's commented out.
My testbed code:
function OnEvent(event, arg)
OutputLogMessage("event = %s, arg = %s\n", event, arg)
local MKeyState = GetMKeyState("lhc")
--OutputLogMessage(MKeyState)
if (event == "G_PRESSED" and arg == 14 and MKeyState == 2) then
local date = GetDate("%m/%d/%y") --os.date("%m/%d/%y")
OutputLogMessage(date)
OutputLCDMessage(date)
io.write(date)
--print(os.date("%m/%d/%y"))
end
end
My testbed output:
event = PROFILE_DEACTIVATED, arg = 0
event = PROFILE_ACTIVATED, arg = 0
event = G_PRESSED, arg = 14
10/22/21[string "LuaVM"]:11: attempt to index global 'io' (a nil value)
event = G_RELEASED, arg = 14
Thanks in advance for any thoughts you might have.
As far as I can see, one has to use the function PressAndReleaseKey with each character of the string. It is further complicated by the circumstance that this function doesn't take the character itself as an argument, but rather a keyname (see the Table of scancodes and keynames in the API docs). For your date string, this could work (I haven't tested it):
for c in date:gmatch '.' do
if c == '/' then
c = "slash"
end
PressAndReleaseKey(c)
end

LOGITECH GHUB LUA: SetMKeyState

I would like to use the SetMKeyState(...) and GetMKeyState(...) functions available in the Logitech LUA scripting api, to write some macros.
I am using Windows 10 and the latest version of Logitech GHUB (I can't use LGS for various reasons). On my keyboard, Logitech G815, it seems that any call to SetMKeyState(...) from a LUA macro does not do anything. While the GetMKeyState(...) seems to correctly return the current MKey state. I have read the docs related to these two functions in the "G-series Lua API V8.45" documentation and it looks like I am using them correctly.
For example, the following LUA script should switch the MKey state between M1/M2/M3 using the G1 key, but actually does not do anything (although the code is executed, as the debug log lines appear):
function OnEvent(event, arg)
if (event == "G_PRESSED" and arg == 1) then
currentState = GetMKeyState("kb")
OutputLogMessage("Current MKey state: %d\n", currentState)
newState = currentState + 1
if newState == 4 then
newState = 1
end
OutputLogMessage("Setting new MKey state: %d\n", newState )
SetMKeyState(newState , "kb");
end
end
Am I doing anything wrong here ?
If it is expected that the SetMKeyState(...) function is not supported on the Logitech G815, then which keyboard model would correctly support the SetMKeyState(...) function to change the MKey state ?
It's not actually an answer, just a suggestion, but IDK the way to paste the code in comments, so hope you will forgive me :)
There is a reference code in API doc:
-- Set the current M Key state to M1 when G1 is pressed
function OnEvent(event, arg)
if (event == "G_PRESSED" and arg == 1) then
SetMkeyState(1);
end
end
If I were you I'd get started from the check if it works or not as it is, without any change.
Then, step by step:
add debug messages;
recheck;
try to set it to 2 instead of 1;
try to set it to 3;
try to read and print current state, before and after the operation, considering this remark from API doc: "Calling GetMKeyState immediately afterwards, will likely return the previous state. Use the OnEvent handler to determine when the operation has completed."

Hi how to use the lua script in order to toggle macro on and off

function OnEvent(event, arg, family)
if (event == "MOUSE_BUTTON_PRESSED" and arg == 5 and family == "mouse") then
PlayMacro("Lustre Rotation")
end
if (event == "MOUSE_BUTTON_RELEASED" and arg == 5 and family == "mouse") then
AbortMacro()
end
end
Hi I've been using the lua script (on Logitech G Hub) above in order to stop the macro as soon as I release the mouse button, but I don't wanna hold mouse button, instead I want to use the mouse button to toggle the macro. Please guide me through the script how to change to toggle on/off macro with mouse button. Thank you!
function OnEvent(event, arg)
if event == "G_PRESSED" and arg == 1 then
AutoToggle = not AutoToggle
if AutoToggle then
PlayMacro("Lustre Rotation")
else
AbortMacro()
end
end

Script for pressing a keyboard key when a mouse button is pressed

I'm trying to give me logitech mouse an order using lua script that when the primary key is pressed a key in the keyboard is also clicked until I stop holding the mouse button
I tried this one but it works perfectly with all the mouse buttons but no actions happens when I set it up for the primary key.
function OnEvent(event, arg)
if event == "MOUSE_BUTTON_PRESSED" and arg == 1 then
PressKey("V")
end
if event == "MOUSE_BUTTON_RELEASED" and arg == 1 then
ReleaseKey("V")
end
end
any help?
Thanks in Advance.
By default primary mouse button events are disabled.
You need to enable them explicitly.
local v_pressed
function OnEvent(event, arg)
if event == "PROFILE_ACTIVATED" then
EnablePrimaryMouseButtonEvents(true)
elseif event == "MOUSE_BUTTON_PRESSED" and arg == 1 and IsKeyLockOn("scrolllock") then
PressKey("V")
v_pressed = true
elseif event == "MOUSE_BUTTON_RELEASED" and arg == 1 and v_pressed then
ReleaseKey("V")
end
end
UPDATE
The script works only when ScrollLock LED is on.

Logitech/LGHUB Lua - Loop with break

i recently picked up Lua while making a macro script for my LG mouse.
Unfortunately the Lua-API is really restricted with debug, io and file not working (source: http://www.softpanorama.org/Hardware/Peripherals/Keyboards/Logitech_G_keyboard_macros/lua_scripting.shtml#Limitations)
Here is also the official reference: https://douile.github.io/logitech-toggle-keys/APIDocs.pdf
The script is running a LGHUB macro while i want to attach mouse movement to that macro while it is running. There is no function for checking if a macro is currently running to just loop and stop the lua-side.
So I'm looking for a possibility in Lua to 'run a loop independent' which does not stop the execution of the rest of my script (to check if a status variable [isMacroRunning] has changed). I also want to break that macro if i hit another button while the macro is running.
BUT if i loop the mouse-movement, i cannot trigger another onEvent-function because the script-pointer(?) is still stuck in my loop. My current idea is to break that with a coroutine but iam not sure how to continue while no key-input is happening.
The script doesnt stop and wait if it encounters 'PlayMacro()', also this API-Function has no return value to just attach lua actions to the PlayMacro-function.
There would be also the possibility to transfer the LGHUB-macro (essentially its just pressButton A and leftclick for 40s then release the buttons) but that doesnt solve the problem (at least i cant find a solution within this) with the function being stuck in the loop and no way to break it.
For example, if MouseButton11 triggers a loop and i press MouseButton10, the $arg variable does not change to 10 but stays at 11 because the script-pointer(?) is still in the loop instead of triggering the onEvent function.
The script seems to get executed once at load (example on switching mouse-profiles) and then the onEvent-function listens. If i could somehow run a looping check on [isMacroRunning] while still be able to trigger the onEvent-function, i can make this work. But otherwise i know to little about Lua and its behavior.
Edit1: Added "essential script" which only describes the needed core-functions. This is not working due to a 2nd onEvent cannot be triggered until the 1st onEvent has finished. But the 1st onEvent is designed to break on a variable change. The variable change is triggered in the 2nd onEvent. Needed solution: some kind of workaround or use of other Lua functions to seperate the 1st onEvent execution from the 2nd onEvent.
Essential Script:
```
isMacroRunning = false
function wiggle()
PressKey("a")
while true do
if not isMacroRunning then break end
OutputLogMessage("wiggle\n")
MoveMouseRelative (5, 0)
Sleep(150)
MoveMouseRelative (-5, 0)
Sleep(150)
end
end
function OnEvent(event, arg)
if (event == "MOUSE_BUTTON_PRESSED" and arg == 11) then
isMacroRunning = true
wiggle()
end
if(event == "MOUSE_BUTTON_PRESSED" and arg == 10 and isMacroRunning) then
isMacroRunning = false
ReleaseKey("a")
end
end
´´´
Full Script:
local isMacroRunning = false
coco = coroutine.create(function()
while true do
if not isMacroRunning then break end
MoveMouseRelative (5, 0)
Sleep(150)
MoveMouseRelative (-5, 0)
Sleep(150)
coroutine.yield()
end
end)
function OnEvent(event, arg)
if (event == "MOUSE_BUTTON_PRESSED" and arg == 11) then
isMacroRunning = true
runMacro()
elseif(event == "MOUSE_BUTTON_PRESSED" and arg == 10 and isMacroRunning) then
isMacroRunning = false
runMacro()
end
end
function runMacro()
if isMacroRunning then
PlayMacro('farm')
coroutine.resume(coco)
OutputLogMessage("Start Macro\n")
else
AbortMacro()
OutputLogMessage("Aborted\n")
end
end
coroutine.resume(coco)
´´´
Step 1.
Make sure you're not using MB#4 ("backward") in the game.
If some action is assigned to MB#4 in the game, do the following:
choose keyboard button you don't currently use in the game (for example, F12)
goto GHUB(KEYS tab); bind F12 to your physical MB#4
goto game options; bind the action to F12 instead of MB#4
Now when you press physical MB#4, the game sees F12 and executes your old action.
Step 2.
Goto GHUB(SYSTEM tab); bind "Back" to MB#10
Step 3.
The script.
function OnEvent(event, arg)
if event == "MOUSE_BUTTON_PRESSED" and arg == 11 then
PressMouseButton(1) -- down LMB
PressKey("A") -- down "A"
repeat
MoveMouseRelative(5,0)
Sleep(150)
MoveMouseRelative(-5,0)
Sleep(150)
until IsMouseButtonPressed(4) -- btn#4 is bound to btn#10
ReleaseKey("A") -- up "A"
ReleaseMouseButton(1) -- up LMB
end
end
How does it work:
When you press MB#11, the loop starts.
When you later press MB#10, IsMouseButtonPressed() sees that button#4 is pressed, and the loop exits.

Resources