StrokesPlus.net
Welcome Guest! To enable all features please Login or Register.

Notification

Icon
Error

3 Pages123>
Options
Go to last post Go to first unread
Kyrinn  
#1 Posted : Tuesday, January 21, 2020 11:21:05 PM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
This is a bit of a long, strange post, so to get to the real meat, feel free to skip to the THOUGHT EXPERIMENT part.

Hello, I have SMA Type II, a degenerative neuromuscular disorder, and I'm 36, so I've... degenerated. So much so, that I can only move one thumb a tiny bit. This is why I give a flying butt about touchpads... it's literally the only way I can use a computer, and computers are the only thing I can do independently.

The problem I'm having is that the only touchpad I've ever found that I can actually use is Synaptics. Old Synaptics drivers from 2015ish, to be specific. They have a plethora of customization options from configurable click zones, sensitivity, edge motion, momentum, etc. Why not the newer ones? No idea.

My current computer is dying. A wonderful MSI Dominator laptop of 3ish years. Just after the warranty, of course. I heard good things about Xotic PC from a friend, blew my savings, and upgraded to an MSI Titan.

Support assured me that MSI only uses Synaptics touchpads... something I was nervous about, as I did research and noticed that no models I was looking at said anything about having Synaptics touchpads.

In short, it may be a Synaptics touchpad, but does NOT support the Synaptics control panel for whatever reason.

So, a user on the Disabled Games subreddit pointed me to S+, but I have no idea if it can emulate the feature(s) I need. Here goes:

I can only use one thumb with a tiny bit of movement and I'm a gamer... you can probably start to see my problem.

Synaptics allows me to set adjustable tap zones on the corners of the touchpad I can actually reach... I usually bind these to right and middle click. I'm guessing S+ has absolutely no idea where I'm tapping on the touchpad, so I guess what I'm asking is if there's an easy/accurate way to click multiple different mouse buttons with the program.

Actually, maybe ignore all of that. It might be easier to explain what I want with the

THOUGHT EXPERIMENT:
Any gamers here, or really anyone who needs accurate/rapid clicks with multiple mouse buttons... what would YOU do with this program to make it so you can right/middle click repeatedly and/or on specific, small targets.

You can only left click, no keyboard.(I typed this with an onscreen keyboard on my old computer for you curious types).

I'm sorry for the broad and somewhat abstract question, but even after doing some searches and reading help, I'm not sure how to execute what I need, or if it's even possible.

I really don't want to return the computer, and if this program can help me do what I need... that's a beautiful, long term solution. Thank you so much!
Rob  
#2 Posted : Wednesday, January 22, 2020 4:02:33 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Hi and welcome!

Edit: Hmm, I just realized that while this works as intended, we cannot know where on the touchpad itself you tapped, so this may all not matter nor work for you :( If you're trying to tap in a game somewhere in the middle of the screen to perform a right-click, it wouldn't be in the regions we're testing for below, so it would just relay as a regular left click/tap where the cursor is currently located. However, we still might be able to figure something out...so read on and get an idea where I was going with this and see if something else comes to mind that works within the data available to S+. The key point here is that there's no way for S+ to know where you're tapping on the touchpad, only where the mouse is currently located within the screen. Keep in mind that was can leverage other logic to toggle the state of things, for example you draw a small gesture which sets a variable so the next (or until cancelled) tap instead sends a right-click or something else. Or perhaps simply gestures to perform the actions, like you draw a small line up and S+ sends a right-click or double-click at the location where the gesture started. We can also utilize timers, so single/double/triple/etc taps perform different actions.

I will note that I have a long term goal of adding support for Microsoft Precision Touchpad Drivers, which might provide the ability to know where the tap occurred, but I don't have a timeline for that yet.



I do believe we can make this work for you. While the script below may not be exactly what you want in terms of setup and events, it's a good foundation for you to see what's possible.

I tested it and it yielded the expected results, so there's no reason it can't be changed/expanded to afford you probably more than the previous Synaptics software, honestly - though it is a bit more complicated to configure.

First off, update to version 0.3.7.8 as I found a bug in the consume click event check box I recently added, so it wasn't actually consuming the event!

This configuration assumes the Left button is not defined as a primary or secondary stroke button, as I hadn't considered that at the time. We can still support that scenario, it's just a bit more complicated, so I'll first post this just so you can get and idea if it will work for you. So for the purposes of this initial test, just don't set Left as a stroke button.

The script below goes in Global Actions > Mouse Events > Left Click. Check Enabled and Consume Click Event boxes, and paste the script below.

What this does is handle every Left click (tap) that happens. It divides the screen (where the click/tap occurred) into 4 columns and 5 rows, so we can define zones to control what happens in those areas.

The main functionality here is when you tap along the last row (bottom) of the screen, there are 4 columns, in each one something different happens.

Code:
//Break the screen where the click occurred into regions (columns and rows)
var region = sp.GetRegionFromPoint(click.Window.Screen.Bounds, click.Point, 4, 5); 

if(region.Row != 5 || (region.Row == 5 && region.Column == 1)) 
{
    //--------------------
    // The click/tap happened somewhere in the first 4 rows of the region
    // OR It happened in the last row, first column (lower left region)
    /*  ____________
        |_X|_X|_X|_X|
        |_X|_X|_X|_X|
        |_X|_X|_X|_X|
        |_X|_X|_X|_X|
        |_X|__|__|__|
    */
    //--------------------

    //Replay exactly as clicked/tapped
    sp.MouseClick(click.Point, MouseButtons.Left, click.Down, !click.Down); 


   //We don't need to check the .Row value in the next else if blocks 
   //since the above if condition handles anything not in the last row
}
else if(region.Column == 2) 
{    
    //--------------------
    // The click/tap happened in the last row, second column
    /*  ____________
        |__|__|__|__|
        |__|__|__|__|
        |__|__|__|__|
        |__|__|__|__|
        |__|_X|__|__|
    */
    //--------------------

    //Only perform this double-click on click/tap down, so it only happens
    //once per tap, otherwise it would send a double-click when you pressed 
    //down, then send another double-click when you lifted your finger
    if(click.Down)
    {
        //Double-click the Left button
        sp.MouseClick(click.Point, MouseButtons.Left, true, true); 
        sp.MouseClick(click.Point, MouseButtons.Left, true, true); 
    }
}
else if(region.Column == 3) 
{
    //--------------------
    // The click/tap happened in the last row, third column
    /*  ____________
        |__|__|__|__|
        |__|__|__|__|
        |__|__|__|__|
        |__|__|__|__|
        |__|__|_X|__|
    */
    //--------------------

    //Only perform this double-click on click/tap down, so it only happens
    //once per tap, otherwise it would send a double-click when you pressed 
    //down, then send another double-click when you lifted your finger
    if(click.Down)
    {
        //Double-click the Middle button
        sp.MouseClick(click.Point, MouseButtons.Middle, true, true); 
        sp.MouseClick(click.Point, MouseButtons.Middle, true, true); 
    }
} 
else if(region.Column == 4) 
{
    //--------------------
    // The click/tap happened in the last row, fourth column
    /*  ____________
        |__|__|__|__|
        |__|__|__|__|
        |__|__|__|__|
        |__|__|__|__|
        |__|__|__|_X|
    */
    //--------------------

    //Only perform the right-click on click/tap down, so it only happens
    //once per tap, otherwise it would send a right-click when you pressed 
    //down, then send another right-click when you lifted your finger
    if(click.Down)
    {
        //Click the Right mouse button
        sp.MouseClick(click.Point, MouseButtons.Right, true, true); 
    }
} 

Edited by user Wednesday, January 22, 2020 4:09:41 PM(UTC)  | Reason: Not specified

thanks 1 user thanked Rob for this useful post.
Kyrinn on 1/22/2020(UTC)
Rob  
#3 Posted : Wednesday, January 22, 2020 4:17:01 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
The more I think about it, either drawing gestures or handling based on number of taps will be the most likely viable options.

The only issue is timing and control, as I don't know what level of function/dexterity/speed you have in your thumb, and testing for tap counts means there's inherently a slight delay as we need to wait (customizable) to see if you're done tapping before taking an action.

Are you able to quickly press down, draw a short line, and release?

How quickly can you tap in rapid succession?

Edited by user Wednesday, January 22, 2020 4:24:36 PM(UTC)  | Reason: Not specified

thanks 1 user thanked Rob for this useful post.
Kyrinn on 1/22/2020(UTC)
Kyrinn  
#4 Posted : Wednesday, January 22, 2020 9:19:31 PM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
Okay, first: wow. I'm a pessimist, so I'm trying not to get my hopes up... but you're giving me more hope than anything I've tried so far. Thank you... so much.

EDIT: Ignore all this:


I now understand exactly what you were going for and why it won't work. Great idea, if only we could send touchpad positional data. So, here's my thought...

What about the floaters? I tried making one do a simple right-click, and it didn't seem to do a thing. Not sure if I'm using it right, or if it can even do the thing I'm thinking of. I could do a few gestures, but I can see myself getting frustrated in a high-speed situation, not getting the gestures correct, and screwing up. I don't know if you're a gamer, but imagine trying to play any reflex type game and adding a gesture to every right/middle click. My current best idea would be a floater with right-click tap, right-click hold, and the same with middle click and as may other buttons or keys we can load in.

I'm hoping we could essentially click the function on the floater to "load" it on the cursor, then when I left click again, it's that function until released. Example: I click on the right click floater, move my cursor to the thing in question, then when I click again, it's now a right mouse button I can either click or hold. Upon release, it resets to left click.

It would add time to my reactions, and likely make FPS games unplayable for me, but they were already extremely difficult and required other inconvenient devices. This is just the thing that (if possible) will likely minimize my delays. Do you think a version of this is possible?

But to answer your questions about my abilities:

I can click fairly rapidly. Double and triple clicks aren't a problem. I have a very, very limited range of motion, but I use an Autohotkey script that greatly accelerates the cursor. So, I can only move my thumb maybe an inch on the touchpad? But with the Synaptics momentum setting (which I won't have, but can probably emulate with AHK) and the acceleration script, I can flick the cursor across the screen. The faster, or further I move the mouse, the more "wiggly" the cursor is, which may affect gestures.

I'm going to read your descriptions/instructions again and try the script. I will edit this post if I figure it out.

Thank you again... I think you may actually be able to make this work for me. If you can, I can not describe what you will be doing for me for YEARS to come.

Edited by user Wednesday, January 22, 2020 10:32:56 PM(UTC)  | Reason: Massive information change.

Rob  
#5 Posted : Thursday, January 23, 2020 2:01:17 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
The floaters could be leveraged to toggle the tap mode. I've been working on something else for the past few hours which may be even better, but it's tricky to get just right, so it will take some time.

Essentially, I'm trying to make a timer which watches the mouse position and use that to toggle modes. For example, tap is left by default for normal operation. But if you move the cursor to the lower left corner it toggles the next tap to be a middle click. Bounce the cursor in each corner of the lower left, imagine SSW and WSW (directionally) and that locks in middle click until you either move the mouse to the lower left corner to reset to left, or do one of the same movements in the lower right corner of the screen, which activates either a single or locked right button mode.

I felt that would be easier to work with than having to line up above a floater, I could see it being pretty quick after some practice without needing to be precise.

Hopefully this makes some sense, lol. I was hoping it would be a little less complicated and I'd instead be posting it now, but these things are very fickle to get just right in a way where it feels fluid, etc.
Rob  
#6 Posted : Thursday, January 23, 2020 2:15:07 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
On that note, do think about that style of operation. It doesn't have to be in the corners, just consider it as another way to toggle modes and give me your thoughts on if that would work, and if so, what movements would you see being the easiest to manage and which wouldn't cause conflicts or have a high chance of accidentally switching modes, etc.

If you feel it would not be ideal, I'll put together the floater stuff. I'll probably just do that anyway tomorrow since it's much simpler, while I continue to work on the edge detection. Note that I love these kinds of technical challenges, so don't feel like you're bothering me in any way :)
thanks 1 user thanked Rob for this useful post.
Kyrinn on 1/23/2020(UTC)
Kyrinn  
#7 Posted : Thursday, January 23, 2020 5:46:47 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
I REALLY like the idea of the swipe over areas, as opposed to clicking on a thing... in theory, at least. I've used something called Altcontroller for some old school turn-based RPGs before, so I'm at least familiar. Would the hover swipe zones have a visual indicator? I ask, because I will likely need something a little smaller scale than the corners, as it's a 4k screen, and without the Synaptics momentum feature, that's a lot of pixels for me to cover. I can get more specific about placement once I know if there's a visual marker. If so, it would be good to place them close together somewhere, but if not, it likely will need to be on an edge, or somewhere easily identifiable.

I actually thought about using Altcontroller... but, I don't know... I feel like once I get used to it, I had a gut feeling that your software might be more powerful and flexible. I know it's probably difficult for you to be objective with your baby, but for what I'm asking for, do you think that's a fair assessment at a glance?

If it's not much extra work to do the floaters as well as your idea, that might be a really good idea. The swipe may be better for speed, but the floaters may be better for precision/preventing accidental toggles. I also like how easy it seems to toggle features/gestures/whatever on and off in S+.

Also, you just read my mind about being an inconvenience. :p It's usually hard for me to ask for this level of assistance, but I've exhausted my skillset and come up with absolutely nothing. So, again, thank you.
Rob  
#8 Posted : Thursday, January 23, 2020 11:24:04 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Yeah, that's something I also realized was missing, the visual aspect; figured once I had the state toggling working smoothly I'd move onto that.

It's funny, if you look at the Exclusion Zones tab under options, it's very similar to the regions in AltController....like eerily so! Of course, for different purposes.

But without creating a whole new functionality/section, I think I could enhance the floaters to have additional functionality. For example, adding hover/enter/leave tabs to define events (steps/script) as well. That would provide the ability to accomplish this easily. Plus, as you might be able to tell, I'm all about giving users the ability to do whatever they want to come up with, and this fits well into that.

I will take a look into that and see what I can come up with.
Rob  
#9 Posted : Thursday, January 23, 2020 3:31:34 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Okay, so I think I've got something working.

This setup assumes Left is not a primary or secondary stroke button. If this works as expected, we can make some updates which should allow you to use Left as a draw button and leverage this functionality as well.

So there are two floaters, Middle and Right. When the mouse enters one of them, it toggles the appropriate button mode. The floater's text color changes to green and the opacity is increased. Once you either click the mouse or move over one of the floaters again, the floater's display text/color/opacity are reset to their default values.

If you hover over one of the floaters for at least 500 milliseconds (change Hover Delay in floater settings as needed), the text color changes to red and the text is surrounded by brackets, this indicates the button mode is locked, meaning all left clicks/taps will result in pressing that button until you move over one of the floaters to either reset to Left or activate the other button mode. Note that the mode can't already be active for this, needs to be in a single event. I think once you see it in action, you'll figure it out - but essentially things happen once per mouse moving into the floater.

This setup is specific to our original discussion, but as you can imagine, there are many more possibilities! For example, hover to send keystrokes like regions in AltController, etc. I think these new floater events will prove invaluable to you over time and as you get more accustomed to thinking how S+ works and can be leveraged. This particular setup is far more complicated than most simple things, like a floater you hover over and it sends clicks at a specific location on the screen until you move the mouse, as an example; the possibilities are pretty endless, just might require some help here and there until it all clicks (ha!)


Download and Install this Unpublished Version of StrokesPlus.net
(Floaters > Import...)





Download, Extract, and Import these two Floaters
(Floaters > Import...)

MouseModeFloaters.zip

These are setup as I tested, we might need to tweak. I forgot to add comments in the scripts, but we can get back to that as needed.




Paste this Script into Global Actions > Mouse Events > Left Click
(be sure to check Enabled and Consume Click Event)


Code:
/*
    This script goes in Gobal Actions > Mouse Events > Left Click
    Be sure to check Enabled and Consume Click Event
*/
if(sp.GetStoredBool("middleMode"))
{
        //Middle mode is active, so send the Middle button instead of Left
        sp.MouseClick(click.Point, MouseButtons.Middle, click.Down, !click.Down); 

        //If the Middle mode isn't locked into constant Middle and this is the release event (finger lift),
        //then reset the mouse back to Left button after sending the Middle Up event
        if(!sp.GetStoredBool("lockedMode") && !click.Down)
        {
                sp.StoreBool("middleMode", false);
                sp.StoreBool("rightMode", false);
                sp.StoreBool("lockedMode", false);
                var middleFloater = sp.GetStoredObject("MiddleFloater");
                middleFloater.TextColor = new Color();
                middleFloater.Settings.TouchFloaterMinAlpha = sp.GetStoredNumber("MiddleDefaultAlpha");
                middleFloater.Opacity = middleFloater.Settings.TouchFloaterMinAlpha;
                middleFloater.Update();
        }
}
else if(sp.GetStoredBool("rightMode"))
{
        //Right mode is active, so send the Right button instead of Left
        sp.MouseClick(click.Point, MouseButtons.Right, click.Down, !click.Down); 

        //If the Right mode isn't locked into constant Right and this is the release event (finger lift),
        //then reset the mouse back to Left button after sending the Right Up event
        if(!sp.GetStoredBool("lockedMode") && !click.Down)
        {
                sp.StoreBool("middleMode", false);
                sp.StoreBool("rightMode", false);
                sp.StoreBool("lockedMode", false);
                var rightFloater = sp.GetStoredObject("RightFloater");
                rightFloater.TextColor = new Color();
                rightFloater.Settings.TouchFloaterMinAlpha = sp.GetStoredNumber("RightDefaultAlpha");
                rightFloater.Opacity = rightFloater.Settings.TouchFloaterMinAlpha;
                rightFloater.Update();
        }
}
else
{
        //We're not in Middle or Right mode, so send the Left button events as they occurred
        sp.MouseClick(click.Point, MouseButtons.Left, click.Down, !click.Down); 
}

Edited by user Thursday, January 23, 2020 3:44:49 PM(UTC)  | Reason: Not specified

Rob  
#10 Posted : Thursday, January 23, 2020 3:37:03 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Oh also, since these use Key Mode and do some mouse button overriding, it will be a little difficult to position them initially.

You might need to make an action/gesture/hotkey to position them using a Point which is just screen coordinates X,Y, e.g.:

Code:
sp.TouchFloaterSetCustomFloaterLocation('Middle', new Point(100,100));

sp.TouchFloaterSetCustomFloaterLocation('Right', new Point(300,100));


You can also uncheck Enabled for the Left Click under Mouse Events, click Apply, then be able to do things to move the floaters without having the mouse button altered.

Edited by user Thursday, January 23, 2020 3:38:13 PM(UTC)  | Reason: Not specified

Rob  
#11 Posted : Thursday, January 23, 2020 3:42:29 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Keep in mind we can also do some timestamp checking to prevent quickly moving over the Right floater (and outside of it) then moving back over it again from toggling it back off.

Like you wanted to enable Right, but you passed over it again accidentally while you were moving the mouse back to where you wanted to right-click. We could define some amount of time which must pass before it will toggle, for example.
Kyrinn  
#12 Posted : Friday, January 24, 2020 7:33:28 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
Got everything set up fine, but was noticing some strangeness with getting the floaters showing. Once I did, I saw the below error message. It seems to happen every time I start the program. Also, when I had the left click event enabled before the floaters were, it was jumping my mouse cursor to the bottom right corner of my screen. It could be one of the AHK scripts I use; one to accelerate the speed of the cursor, and one to use the mouse wheel by right-click drag. Once we deal with the main issues, I'll try disabling the scripts one at a time, and if it's one of them, I can share them, and you can let me know if they're interacting.

Can you tell if it's the monkeying I did with the program before you helped me, or if there's something else funky going on? What would be the easiest way to do a clean install for debugging, if necessary? I'd like to reset everything, uninstall, and reinstall your new version.

I'm thinking this looks VERY promising. We'll probably need to do some tweaking, and if I can get used to it on my current computer, I'll try it on the new one, and let you know.




See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
at StrokesPlus.net.Forms.frmFloater.Form1_Load(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at StrokesPlus.net.Forms.frmFloater.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
Assembly Version: 4.0.0.0
Win32 Version: 4.8.4075.0 built by: NET48REL1LAST
CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll

StrokesPlus.net
Assembly Version: 0.3.7.9
Win32 Version: 0.3.7.9
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/StrokesPlus.net.exe

System.Windows.Forms
Assembly Version: 4.0.0.0
Win32 Version: 4.8.4042.0 built by: NET48REL1LAST_C
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll

System
Assembly Version: 4.0.0.0
Win32 Version: 4.8.4001.0 built by: NET48REL1LAST_C
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll

System.Drawing
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll

ManagedWinapi
Assembly Version: 0.3.0.0
Win32 Version: 0.3
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/ManagedWinapi.DLL

System.Configuration
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll

System.Core
Assembly Version: 4.0.0.0
Win32 Version: 4.8.4110.0 built by: NET48REL1LAST_B
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll

System.Xml
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

WindowsInput
Assembly Version: 1.0.4.0
Win32 Version: 1.0.4.0
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/WindowsInput.DLL

ClearScript
Assembly Version: 5.5.5.0
Win32 Version: 5.5.5.0
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/ClearScript.DLL

System.Security
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Security/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Security.dll

Accessibility
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll

System.Windows
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll

System.Net
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Net/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Net.dll

System.Net.Http
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Net.Http/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll

System.Speech
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Speech/v4.0_4.0.0.0__31bf3856ad364e35/System.Speech.dll

ClearScriptV8-64
Assembly Version: 5.5.5.0
Win32 Version: 5.5.5.0
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/ClearScriptV8-64.DLL

Microsoft.CSharp
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.CSharp/v4.0_4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll

TestPlugIn
Assembly Version: 1.0.0.0
Win32 Version: 0.3.7.9
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/StrokesPlus.net.exe

System.Dynamic
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Dynamic/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll

Anonymously Hosted DynamicMethods Assembly
Assembly Version: 0.0.0.0
Win32 Version: 4.8.4075.0 built by: NET48REL1LAST
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_64/mscorlib/v4.0_4.0.0.0__b77a5c561934e089/mscorlib.dll

Common
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/Common.DLL

TestPlugIn
Assembly Version: 1.0.0.0
Win32 Version: 0.3.7.9
CodeBase: file:///C:/Program%20Files/StrokesPlus.net/StrokesPlus.net.exe

System.Data
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_64/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll

System.Numerics
Assembly Version: 4.0.0.0
Win32 Version: 4.8.3752.0 built by: NET48REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll


************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.


Rob  
#13 Posted : Friday, January 24, 2020 1:51:12 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Hmm, I can't get that error to occur.

Download this default configuration without only the floaters and mouse script added:

https://strokesplus.net/files/exports/MouseModeDefaultConfig.zip

Exit StrokesPlus.net and replace the which exists in your user app data folder with the file in the ZIP, it will probably be located somewhere like here, replacing my name with your username:

C:\Users\robya\AppData\Roaming\StrokesPlus.net

The StrokesPlus.net.bin file contains all of your settings. There really shouldn't be any need to uninstall/reinstall.

Actually, rename your current StrokesPlus.net.bin first, as I might want to see it to determine the cause of the error.

Also, can you send or point me to your AHK scripts? I don't use AHK, but I'd like to see the logic involved.

Let me know if this default config is still giving you errors.
thanks 1 user thanked Rob for this useful post.
Kyrinn on 1/28/2020(UTC)
Rob  
#14 Posted : Saturday, January 25, 2020 1:56:46 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
I updated the floaters ZIP (not the full config, just the two individual floater exports) to include timestamp checking, to prevent quickly passing over a floater twice from toggling on then back off.

It's in the Enter tab, there's a comment near the top, it's set to 250 milliseconds by default.

http://strokesplus.net/files/exports/MouseModeFloaters.zip

Ack, hang on I need to update the 0.3.7.9 download as I also updated StoreNumber to support larger values.

Edited by user Saturday, January 25, 2020 1:57:42 PM(UTC)  | Reason: Not specified

thanks 1 user thanked Rob for this useful post.
Kyrinn on 1/28/2020(UTC)
Rob  
#15 Posted : Saturday, January 25, 2020 4:02:15 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
I've updated and released 0.3.7.9. You won't get an update notification since you're already running that version number, even though it's out of date. You can use the original 0.3.7.9 link posted above or download latest from the Downloads page.
thanks 1 user thanked Rob for this useful post.
Kyrinn on 1/28/2020(UTC)
Kyrinn  
#16 Posted : Tuesday, January 28, 2020 10:05:33 PM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
Okay, good news/bad news time.

Good news: no more crashing!

Bad news: left click doesn't work.

When I left click with my mouse sensitivity script on, the cursor jumps to the bottom right corner of the screen every time. Thankfully, it doesn't when I go to disable S+. Right and middle click seems fine.

What I think is really interesting is when I disable my accelerator script, the cursor still moves, but jumps maybe one or two pixels to the left. Oh, and in case it wasn't clear, the left click event never occurs... just the movement.

I will attach my script, which obviously exacerbates the problem, but I don't think it's the cause. I know almost nothing about scripting, but what does the

click.Point do in the " sp.MouseClick(click.Point, MouseButtons.Left, click.Down, !click.Down); " do?

Anyway, here's the AHK:

;The SendInput DllCall is specifically 32-bit. So check for the correct bitness of AutoHotkey and if not, try to run the right one.
If (A_PtrSize=8){
SplitPath, A_AhkPath,,Dir
Run %Dir%\AutoHotkeyU32.exe %A_ScriptFullPath%
ExitApp
}

;Call below to accelerate the mouse input. The first two parameters are the integer factors of artificial amplification added on top of the physical input.
;The first is for horizontal/x-axis movement, the second for vertical/y-axis movement.
new MouseAccelerator(10, 3)

F12::ExitApp


; Gets called when mouse moves or stops
; x and y are DELTA moves (Amount moved since last message), NOT coordinates.
MouseAcceleratorEvent(x := 0, y := 0, accelerationx := 2, accelerationy := 2){
static MouseAcceleratorPaused
If !(MouseAcceleratorPaused){
MouseAcceleratorPaused:=true
VarSetCapacity( MouseInput, 28, 0 )
NumPut( x * accelerationx, MouseInput, 4, "Int" ) ; dx
NumPut( y * accelerationy, MouseInput, 8, "Int" ) ; dy
NumPut( 0x0001, MouseInput, 16, "UInt" ) ; MOUSEEVENTF_MOVE = 0x0001
DllCall("SendInput", "UInt", 1, "UInt", &MouseInput, "Int", 28 )
sleep,-1
MouseAcceleratorPaused:=false
}
}

; ================================== LIBRARY ========================================
; Instantiate this class and pass it a func name or a Function Object
; The specified function will be called with the delta move for the X and Y axes
; Normally, there is no windows message "mouse stopped", so one is simulated.
; After 10ms of no mouse movement, the callback is called with 0 for X and Y
; https://autohotkey.com/b...pic.php?f=19&t=10159
Class MouseAccelerator {
__New(accelerationx:=2, accelerationy:=2, callback:="MouseAcceleratorEvent"){
static DevSize := 8 + A_PtrSize
static RIDEV_INPUTSINK := 0x00000100

this.TimeoutFn := this.TimeoutFunc.Bind(this)

this.Callback := callback
this.Accelerationx := accelerationx
this.Accelerationy := accelerationy
; Register mouse for WM_INPUT messages.
VarSetCapacity(RAWINPUTDEVICE, DevSize)
NumPut(1, RAWINPUTDEVICE, 0, "UShort")
NumPut(2, RAWINPUTDEVICE, 2, "UShort")
NumPut(RIDEV_INPUTSINK, RAWINPUTDEVICE, 4, "Uint")
; WM_INPUT needs a hwnd to route to, so get the hwnd of the AHK Gui.
; It doesn't matter if the GUI is showing, it still exists
Gui +hwndhwnd
NumPut(hwnd, RAWINPUTDEVICE, 8, "Uint")

this.RAWINPUTDEVICE := RAWINPUTDEVICE
DllCall("RegisterRawInputDevices", "Ptr", &RAWINPUTDEVICE, "UInt", 1, "UInt", DevSize )
fn := this.MouseMoved.Bind(this)
OnMessage(0x00FF, fn)
}

__Delete(){
static RIDEV_REMOVE := 0x00000001
static DevSize := 8 + A_PtrSize
RAWINPUTDEVICE := this.RAWINPUTDEVICE
NumPut(RIDEV_REMOVE, RAWINPUTDEVICE, 4, "Uint")
DllCall("RegisterRawInputDevices", "Ptr", &RAWINPUTDEVICE, "UInt", 1, "UInt", DevSize )
}

; Called when the mouse moved.
; Messages tend to contain small (+/- 1) movements, and happen frequently (~20ms)
MouseMoved(wParam, lParam){
; RawInput statics
static DeviceSize := 2 * A_PtrSize, iSize := 0, sz := 0, offsets := {x: (20+A_PtrSize*2), y: (24+A_PtrSize*2)}, uRawInput

static axes := {x: 1, y: 2}

; Find size of rawinput data - only needs to be run the first time.
if (!iSize){
r := DllCall("GetRawInputData", "UInt", lParam, "UInt", 0x10000003, "Ptr", 0, "UInt*", iSize, "UInt", 8 + (A_PtrSize * 2))
VarSetCapacity(uRawInput, iSize)
}
sz := iSize ; param gets overwritten with # of bytes output, so preserve iSize
; Get RawInput data
r := DllCall("GetRawInputData", "UInt", lParam, "UInt", 0x10000003, "Ptr", &uRawInput, "UInt*", sz, "UInt", 8 + (A_PtrSize * 2))

x := NumGet(&uRawInput, offsets.x, "Int")
y := NumGet(&uRawInput, offsets.y, "Int")

this.Callback.(x, y, this.Accelerationx, this.Accelerationy)

; There is no message for "Stopped", so simulate one
fn := this.TimeoutFn
SetTimer, % fn, -10
}

TimeoutFunc(){
this.Callback.(0, 0)
}

}
Rob  
#17 Posted : Wednesday, January 29, 2020 12:27:47 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
So the click.Point is the location that the click occurred. Essentially when S+ receives the click message, it passes along the data in a object called "click", with Point being one of the properties.

click.Down is a boolean (true/false) holding if the mouse event was mouse (button) down (true), or mouse button up (click.Down = false);

What the script is intending to do is simply relay the left mouse click as it happened; at the same location and sending the down and up events accordingly. The click script gets executed twice, once when the mouse is pressed down and again when it is released.

Looking at the AHK script, it's doing some low level receiving of mouse input messages, due to S+ also being a low-level mouse app it's certainly possible to have some conflicts. So for now, I want to focus on finding the left click issue when the AHK script is not running.

On a side note, I think we should be able to create a S+ plug-in to handle mouse acceleration, replacing the AHK script. Is this acceleration based on previous movement speed, like does it not move as fast if you move slowly, or is it pretty fixed, just amplifies each movement's tick by a certain amount? It looks like you specify certain movement boosts per axis (x, y), is that an accurate assumption?

On to the left click.



So just to make sure, the Left button is not set as a stroke button (primary or secondary), correct?

Also, do you have anything else running which you think might possibly interfere with touchpad/mouse inputs in any way?

I downloaded just the default config and the mouse floater updates posted above and the left click works fine for my mouse, touchpad, and even touching the screen - all resulted in a full left click down and up; so I'm baffled why it wouldn't work on your end. It's like something is off, but I can't think of it.

Download the trace version of S+, select the following options (can right-click tray icon, Set Trace Options):
- HookStateGeneralEvents
- MouseHookGeneralEvents

Then perform a left click/tap, and exit S+.

See this post for info about the trace build and how it works, where the log file goes - which should be in a folder below where your StrokesPlus.net.binfile is located:
https://forum.strokesplus.net/posts/t3012-Tracing-Logging-Builds-for-Troubleshooting

Then post the last part of the contents of that file, it should be relatively obvious about the portion in question.
Kyrinn  
#18 Posted : Wednesday, January 29, 2020 9:38:36 PM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
Thank you, I will try to figure this out tonight.

For now, your understanding of my explanation looks correct. I can't think of anything else running that would interfere with S+.

I suppose the real test would be to set it up on the new computer and see if it works. If not, then I'm doing something wrong and will try the trace version. It may take me a little while to get everything on the new computer to the point where I can even LEFT click, as it's not friendly to me by default... hence the whole reason we're having this conversation, I guess.

I'm really stressing out on this, because the vendor is dragging its feet on a hardware solution(I'm trying multiple angles), and the return deadline is nearly here. I'm hoping they'll extend it, as it's their screw up.

Regardless, that doesn't really have anything to do with you, as this may help me, no matter what computer I end up getting.

Stressful!
Rob  
#19 Posted : Wednesday, January 29, 2020 11:52:05 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Okay. And yes, I can imagine it being stressful!

Also, I am working on building in mouse acceleration, but it's being a little tricky - getting close though.
Rob  
#20 Posted : Saturday, February 1, 2020 3:28:31 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
I've added mouse acceleration in this unpublished release:

https://www.strokesplus.net/files/StrokesPlus.net_Setup_0.3.8.0.exe

I feel like it might have some hiccups here and there, but figured you could at least try it out some anyway; under Options > Advanced > Mouse Acceleration.

It has X and Y axes settings, like the AHK script. Though S+ uses percentages which are usually going to require a much higher value since the mouse movement messages happen at very short distances. So you can start with something like 300 or higher to get a noticeable acceleration. Play around with it and let me know your thoughts/experience.



Also you know what I was thinking? We just need to get a RaspberryPi or Arduino module connected to a small touch screen and USB to your PC. Then we could define the touch screen areas however we want, plus have visual hot spots on the touch screen itself to see where a right click is, etc. In theory, that would really resolve this particular issue and greatly expand the amount of ways it could be customized, for your needs but also in ways for other folks who may have a different presentation in their motor skills limitations, etc.

I must admit that I have been looking for a reason to do something with RaspberryPi/Arduino BigGrin No promises or timelines, of course, but it's really not expensive to get an Arduino board and a small touch screen, just matter of whether the responsiveness is there from touch/move to reaction within Windows. Though I feel like it should be able to work.
thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/2/2020(UTC)
Kyrinn  
#21 Posted : Sunday, February 2, 2020 6:08:05 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
I'm going to test out a few things... probably on Monday. First, I'll see if the new release fixes the pixel jump on my current computer. If not, I'll have one of my personal chre attendants use an external mouse to see if it's just the touchpad on this computer. If THAT doesn't work, I'll do a fresh install on the new computer(my return deadline is almost up, but even if I do return it, there's zero promise I'll be able to find a computer with what I need...), and if that doesn't work, then I know I'm doing something wrong with the setup.

Originally Posted by: Rob Go to Quoted Post

Also you know what I was thinking? We just need to get a RaspberryPi or Arduino module connected to a small touch screen and USB to your PC. Then we could define the touch screen areas however we want, plus have visual hot spots on the touch screen itself to see where a right click is, etc. In theory, that would really resolve this particular issue and greatly expand the amount of ways it could be customized, for your needs but also in ways for other folks who may have a different presentation in their motor skills limitations, etc.

I must admit that I have been looking for a reason to do something with RaspberryPi/Arduino BigGrin No promises or timelines, of course, but it's really not expensive to get an Arduino board and a small touch screen, just matter of whether the responsiveness is there from touch/move to reaction within Windows. Though I feel like it should be able to work.


Timeline isn't super important, as long as I have some way to use my new computer, even if it's not the most optimal.

But... this idea definitely gave me a spark of serious excitement. How do you think it would stack up against my (failed) idea of converting a touchpad from one of my old computers that know I can use to USB as far as ease of setup and advantages? The only reason the idea failed so far, is that the person I got to work on it realized they were in way over their head when they got the touchpad out and it did NOT meet the Youtube tutorial. If you would like to play with either version of the project, just PM me with whatever costs you might have, and I would be MORE than happy to cover them.

Anyway, I can't thank you enough for everything you're doing. Above and beyond to a ridiculous degree.
Rob  
#22 Posted : Sunday, February 2, 2020 3:31:04 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Yeah I found some of those videos/tutorials as well, but I didn't want to create a new solution with a limited scope (e.g. being able to find some old touchpad which needs to meet certain technical specs, etc.). Which is why I thought of using an open hardware/software platform with support, flexibility, and (hopefully) longevity to help make it future-proof.

I went ahead and ordered these two products:

https://www.adafruit.com/product/50

https://www.adafruit.com/product/1947

I found this repo which looks like it should make it easy to communicate with the Adafruit board via USB using C# (same programming language S+ is written in..my comfort zone):

https://github.com/christophediericx/ArduinoDriver

I'll make a separate program for interfacing with the hardware, which simply receives input and translates them to mouse/keyboard events; figured I'd support mouse and keyboard in case we want to have area(s) of the screen which trigger a hot key combination or something, probably also support page scrolling along the edge of the small touchscreen as well. In theory, this separate app could be used to interact with S+ really no different than a mouse/keyboard, as the input from the hardware would just inject mouse or keyboard events which S+ would see as no different than any other mouse/keyboard message. The difference being that with the code running in the board, we can control the type of event occurs, like touching/dragging from a certain area of the touchscreen sends a right mouse event or a keyboard message like a single key or hot key combination, then any program would just do what it does; you wouldn't even need S+ unless you wanted to use it for its intended purpose. The separate app could have some things like adding acceleration, or perhaps that just remains in the board's software; it might be better to have on-board to improve efficiency, but we'll see how it all shakes out. Everything seems like it should work fine, the only concern I have is speed and responsiveness - will it feel fluid, without any noticeable lag, etc.

I'll make the code for the Adafruit board and the standalone app open source, so anyone can download/modify/improve, again with the purpose of making this accessible to all. Anyone could then buy off the shelf hardware, download the source code for the board and Windows app, and be up and running in whatever way they would like to leverage the foundation. Folks with Linux/Mac development experience could also port the Windows app code to work on other OS platforms as well.

Don't worry about reimbursement at this point - if it all works out as expected, you can certainly cover the costs later when you have the hardware and it's all working out.
thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/3/2020(UTC)
Kyrinn  
#23 Posted : Monday, February 3, 2020 5:17:51 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
Well, jebus... I don't even know what to say. I very much want it to work, but at the same time, it's also not really the point. I'm just so blown away by the amount of work you're putting into this. The fact that this might future-proof me in Touchpad Postapocalyptia is... exciting. It's been something that's literally kept me up at night. Which, I understand may sound silly under normal circumstances, but it would be like if mice were getting phased out in favor of morse code controlled pointing devices. Could people do it? Probably with enough effort... but it would suuuuuck!

I should hear what the computer vendor is willing to do in the short term for me, but regardless of whether or not they'll do something about the current touchpad, I think it would be very prudent to continue with your experiment if you're willing.

Besides... it just sounds way cooler.
Rob  
#24 Posted : Saturday, February 8, 2020 2:59:01 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
So the board and screen showed up today!

I've done a little prototyping this evening and wanted to show you a video of the concept, before I go any further; just to make sure it seems like a good solution.

Let me know what you think, and please be brutally honest as I'm just guessing and really have no idea what is actually practical for you - so any and all ideas/suggestions/concerns are most welcome!

Also, for some reason I wrapped up the video saying "bye" as though we were on the phone...ignore that Laugh I guess it's better than me shouting at you to "SMASH THAT LIKE AND SUBSCRIBE BUTTON!!1!!"



Rob  
#25 Posted : Saturday, February 8, 2020 3:12:56 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Oh, I also ordered a trackpad they sell, but it won't be here until Monday.

After ordering the touchscreen I realized that it probably wouldn't have a z axis (for pressure) and thought it might not work well without being able to distinguish between mouse move and mouse click/drag; though what I did come up with was better than expected.

So I'll also mess around with the trackpad to see the capabilities and differences.
Rob  
#26 Posted : Sunday, February 9, 2020 1:39:40 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Okay so I was able to slap together a simple program to receive data from the board and translate them into actual mouse events.

There's a random lag that I'm trying to isolate, I can't find any reason for it. I might try writing a C++ app instead of .NET to eliminate a heavy framework as the culprit.

However, I'm quite happy with the progress made today. Single tap is a left click, or use the green square to hold left and move/drag. Also added the scrolling support and toggle for fast or fine movement.

Kyrinn  
#27 Posted : Sunday, February 9, 2020 5:43:04 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
Oh, man... extremely intrigued. However, I will be brutally honest as you requested through this process, because like you said, you can't know what my abilities or needs are unless I am.

So, first thing! I realized that one of the easier ways to show what I need is by screenshotting what's important to me from the Synaptics control panel.

Synaptics settings

I've expanded the important ones, and I'll explain from top to bottom. Feel free to ask more questions, if needed.

1. Touch Sensitivity: You already covered this when you talked about getting the other touchpad. Something I'll explain more later is that I get fantastically sweaty hands, and at least with most touchpads I've used, depending on thumb temp, room temp, and humidity, that means I need to play with the "Touch Sensitivity" setting, or the cursor jumps around erratically, or I can't apply enough pressure to do anything. A good rule of -- nope, I can't do the pun -- a good thing to remember for testing is that I can apply slightly more than minimum pressure possible. So, if you need to push down with almost any force, it's likely more than I can manage.

2. Momentum/Glide: This is really nice for me, but not required if the acceleration/cursor speed is high enough. I LOVE the idea of a precision toggle. If I want to do that now, it means I need to close my AHK script, then reopen it. Not ideal.

3. Tap Zone Sizes: This is the big one, as it seems like you'll be able to get the Tap Zone functions handled. So, as you can see and probably read, the green striped areas are currently my right and middle click. These can be assigned to all manner of functions, including keyboard keys and macros. The important part of this is that I can resize(to a degree) the different zones. There's 4, but I can only reach 2 at a time, and because I lay down when I use the computer, it needs to be the right zones. My knuckles would rest on the touchpad if I tried to use the left ones.

Every day when I get set up, the sizes need to be adjustable, as my abilities change... even over the course of the session. The ability for me to adjust these zones means that I require WAY less physical adjustments and increase my independence.

Thoughts so far, and things to try:

If the adjustable zone/square sizes aren't feasible, then would it be possible to have a UI element eventually that lets me move where they are on the touchscreen? Another thing that's helpful about that is that I'm not sure if I will be able to see the squares at a glance on the physical touchpad. If I have an onscreen representation, then I'll be able to see at a glance if I'm even close.

I don't know if the changeable size is important if I'm able to move the squares anywhere. The main important point about size in the Synaptics drivers is because the zones are anchored to the corners.

About my disgusting, sweaty thumb... it's bad enough that I actually wrap it in medical tape to decrease moisture and friction. If you can try testing to make sure the touchscreen/pad registers clicks with medical, cloth, or probably even masking tape over your thumb, that would be a good idea. It would NOT be cool if you went through all this work, only to realize thumb sweat invalidated everything.

Another thing that is welcome, but maybe not a priority, is the scroll function. I currently use an AHK script that makes it so right/middle click and hold while moving the cursor up or down with trigger the scroll wheel. The Synaptics drivers have a few scroll options, but a lot of games don't actually register a mouse wheel event when using those. Again, could be useful, but I have other options if there are issues with your scroll function.

Anyway, super impressed, and I'm really hoping you can get the lag worked out.

It's a very, very good thing that I found you, as I'm fairly certain the computer vendor screwed me on the return date, so it looks like I'm stuck with it now!

No pressure.:p

Edited by user Sunday, February 9, 2020 5:46:37 AM(UTC)  | Reason: Not specified

Rob  
#28 Posted : Sunday, February 9, 2020 6:33:42 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
I'll follow up in more detail tomorrow, as I'm chilling in bed now.

But the zone location/sizes are completely flexible. I just picked some arbitrary locations and sizes for the purpose of prototyping.

Regarding pressure/sweat, this screen is a capacitive display so it needs basically no pressure. It's just the same as a moderns smartphone. Now that does raise the question about moisture, so will need to test it out.

On that note, what's your experience in using smartphones with touchscreens? If you do interact with them, do you have issues with moisture/pressure? Because it's basically that.

The lag is probably the biggest concern at the moment. It's just inconsistent/random. I did some debugging and it's not between the main board and the app, that communication is flying along fine. It seems to be between the micro controller and the screen board.

The screen has it's own controller (chip) that communicates with the primary CPU. The CPU is asking for the coordinates, but they are sometimes coming back the same as the previous n calls, so nothing happens because it doesn't look like the finger has moved.

I'll keep poking around, I think I can bypass that translation layer and get an interrupt directly from the screen controller... But beyond a very novice understanding of what that even means and limited experience from my teenage years of dabbling in electronics, it's going to take some learning/forum posting/etc.

thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/9/2020(UTC)
Rob  
#29 Posted : Sunday, February 9, 2020 7:07:50 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Another follow up - we're focusing thus far on touchpad/thumb interaction. But I do want to put out there that we're allowed to think outside the box. For example, any other functions you have at all can be leveraged. Such as tube for negative/positive air pressure (mouth), I mean literally anything that you can control can be utilized in some way; just use different sensors, etc.

Just wanted to make sure you think about anything which might help add to this, especially in terms of toggling modes, adding other control functions, etc.

Some things are easy, some not so much, but it never hurts to consider all possibilities.
thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/9/2020(UTC)
Rob  
#30 Posted : Monday, February 10, 2020 4:50:25 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
The touchpad will arrive later today and I'm optimistic about the capabilities. Especially since it can be put into absolute mode, meaning we can do different things based on where on the touchpad the touch occurs. It also has pressure and contact data, so it should work out well.

The code will be pretty easy to port from the touch screen and I'm thinking it's going to have much better resolution, so smaller movements can be detected (huge plus!).

Plus it:
  • is cheaper than the touch screen
  • is fully enclosed with a cable
  • can be connected to a smaller/less powerful controller board
  • is also capacitive, so it should have good sensitivity

I will see how things go with the board I already have and if it goes well, I'll order one of the smaller/simpler boards just to confirm. Then it can be put into a small case with the PS/2 connector and a USB cable to the computer.

Edited by user Monday, February 10, 2020 4:52:10 PM(UTC)  | Reason: Not specified

Rob  
#31 Posted : Tuesday, February 11, 2020 2:43:20 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Success!

The touchpad has a much better resolution, approximately 1024 x 768 - so it picks up small movements MUCH better than the touch screen. While the screen is cool, this is much better for this particular application.

I was able to quickly put together a crude app which receives data from the touchpad and reacts accordingly. I was able to define upper and lower right "tap zones". In those zones I added some extra functionality (which is optional), but double tapping toggles something. Like in the upper right zone, which is right click for single tap, double tapping toggles acceleration for example. This was mostly just for a proof of concept, it may not be viable based on other functional expectations, etc.

The point being that we can receive all of the data we need, then it's basically however I write the Windows app to do whatever we want based on those data. The controller board just relays all of the available data, it doesn't have any real logic, so any tweaks/enhancements/fixes would just involve you downloading an updated app; wouldn't need to worry about the hardware side of things. The data coming out of the touchpad/controller is very fast, things feel very fluid. It also has physical buttons below the touchpad for left and right clicks. They may be irrelevant, but keep in mind that we can have those buttons do whatever we want as well, they don't have to be mouse clicks.

The app needs a lot of work, though, as it's very crude right now. However, it shouldn't take too long. I'm going to order another set of the hardware to assemble and send to you, by the time I get it, do the stuff, and you receive it I should have the app in a pretty decent state. The only variable now is the sensitivity, physical layout, etc. But the only way to really know is to have you try - so we'll give it a shot and see how it goes!

Edited by user Tuesday, February 11, 2020 2:46:36 AM(UTC)  | Reason: Not specified

thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/11/2020(UTC)
Kyrinn  
#32 Posted : Tuesday, February 11, 2020 6:21:44 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
Because life is funny, the computer vendor is now offering me a refund.

However, regardless of if I actually return it, as I said earlier, I'm just going to run into this same problem again... now, or down the road. So, it doesn't change what you're doing for me, I just think it's really amusing timing.

Anyway, I was very much hoping the touchpad would be better. It's a bummer we lose the flashiness of the touchscreen, but seeing as I likely wasn't going to be able to use the visual functions, I think that's a pretty good trade-off.:p

Oh! I've never really used a sip and puff, but I actually think that might be a really great idea. Even more so if it's modular... some days I might not want a plastic wang in my face.

Do I need any special kind, or will any due? Is it something we could layer on after getting the touchpad features up and running?
Rob  
#33 Posted : Tuesday, February 11, 2020 11:32:09 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
The same company sells a sip and puff sensor, so I'll add that to the order and put it into the housing as well.

https://www.adafruit.com/product/3965

Like the trackpad, I'll just code the board to transmit the raw data out so the app can use it however we want.
Rob  
#34 Posted : Tuesday, February 11, 2020 5:47:20 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Everything has been ordered!

Here's a little demo of the crude app, it looks like a hot mess because it's not currently in a state meant for an end user; just prototyping the technical stuff.

thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/13/2020(UTC)
Rob  
#35 Posted : Wednesday, February 12, 2020 1:01:34 AM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Hopefully you don't mind my bringing a little levity into this :P

So other than adding the sip & puff basic reading of data into the app, I think I'm just going to leave it at this for now, until we can actually have you test things out. In software development, however long it takes to make something purely function, it usually takes 3-4 times that effort to make it all polished/pretty/etc.

The Pad Left/Right/Top/Bottom are the boundaries of the touchpad as it reports. I just touched all the way along the edges to see the furthest numbers possible. Those boundaries are used in other calculations, but depending on each touchpad's calibration, they could be off a little so this gives the ability to adjust.

Upper/Lower Right X/Y/B/R: Just define the boundaries of the rectangles (tap zones).
- X,Y are the starting coordinates on the touchpad (Left, Top)
- B is the Bottom y-coordinate, where it ends vertically (B - Y = Height of Rectangle)
- R is the Right x-coordinate, where it ends horizontally (R - X = Width of Rectangle)

But if there's anything off the top of your head you can think you might want to have sip & puff do, let me know. Do keep in mind that we can treat sip/puff actions kind of like gestures. For example, long sip and two quick puffs does something, etc; a lot of possibilities. But again, it will all be app driven, so it won't matter in terms of assembly and shipping it off.

Will probably be a week until I get all the stuff here, then I'm guessing a day or so to assemble, and finally get it shipped out. I'll keep you posted!

https://www.strokesplus.net/images/touchpad/AllThumbs.jpg

Edited by user Wednesday, February 12, 2020 1:05:50 AM(UTC)  | Reason: Not specified

thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/13/2020(UTC)
Kyrinn  
#36 Posted : Wednesday, February 12, 2020 4:36:32 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
I don't remember if I've given you my plan of action, but here it is:

1. Test physical positioning and capabilities.
2. Make sure it basically functions on both systems.
3. Use my familiar computer to try and make sure all my Synaptics functionality is replicable. I figure it will be easier to switch them on and off for comparison.
4. Once we've cloned(or dare I say... improved!?) the required features, go back to the new hotness uber computer and make sure there are no bugs or system-specific quirks.
5. Sip'n Puff and beyond!

Also, pardon my German, but... fuck yes.
Rob  
#37 Posted : Friday, February 14, 2020 5:47:39 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
I ran into an issue with the touchpad polling which was blocking other input until the touchpad had some activity (touch, click). Took a solid day to figure out a solution, but I finally did!

This was crucial in terms of collecting touchpad and other input (sip 'n puff) in parallel, but thankfully I got it resolved (whew).

I still don't have all of the hardware/parts yet, but I was able to convert this AHK script to add in glide/momentum functionality.

https://www.autohotkey.com/boards/viewtopic.php?t=35934
thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/17/2020(UTC)
Rob  
#38 Posted : Friday, February 14, 2020 9:53:37 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
Also, if we find the sensitivity is not sufficient, I did find this kit which has an Arduino board and seems like is very high resolution/quality. Even supports gestures and multi-touch, not that those matter for our particular purposes, but does point to the quality of the device itself.

https://www.cirque.com/gen4-trackpad-dev-kit

Now that I'm more familiar with what to look for, I'm able to actually find things BigGrin

So the good news is that I really feel like there's no reason we can't find a hardware/software combination to make this work.

Of course, we'll start with what I have and go from there.
thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/17/2020(UTC)
Kyrinn  
#39 Posted : Monday, February 17, 2020 6:05:53 AM(UTC)
Kyrinn

Rank: Advanced Member

Reputation:

Groups: Approved
Joined: 1/21/2020(UTC)
Posts: 48
United States
Location: The Pale

Thanks: 33 times
I just wanted to do a really quick reply to let you know I haven't disappeared, I've just had a rough couple of days, and haven't been able to reply to a lot of stuff. I hopefully will give you a more deserving response in a day or three.

Very excited!
Rob  
#40 Posted : Monday, February 17, 2020 2:18:23 PM(UTC)
Rob

Rank: Administration

Reputation:

Groups: Translators, Members, Administrators
Joined: 1/11/2018(UTC)
Posts: 1,349
United States
Location: Tampa, FL

Thanks: 28 times
Was thanked: 416 time(s) in 354 post(s)
No worries, I understand it's not as easy for you to quickly see and post replies.

Just like to keep you updated, also some things are for my own future reference as well :)
thanks 1 user thanked Rob for this useful post.
Kyrinn on 2/17/2020(UTC)
Users browsing this topic
3 Pages123>
Forum Jump  
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.