Restore jiggle detection.

This is no longer taken care of by the constant acceleration detector,
so we need to do it explicitly
USG_1.0
Robert Fisk 7 years ago
parent d6f66e67bd
commit 8403c9ee93

@ -45,7 +45,8 @@
//Adjust these thresholds first to tune mouse bot detection. Lower values = more sensitive //Adjust these thresholds first to tune mouse bot detection. Lower values = more sensitive
#define MOUSE_BOTDETECT_JUMP_VELOCITY_THRESHOLD 20 //Varies by mouse. Most short jumps are <= 10 velocity #define MOUSE_BOTDETECT_JUMP_VELOCITY_THRESHOLD 20 //Varies by mouse. Most short jumps are <= 10 velocity
#define MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_LIMIT 20 //10 is ok for most mice. But some mice (or users!) generate longer sequences. #define MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_LIMIT 20 //10 is ok for most mice. But some mice (or users!) generate longer sequences.
#define MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_CREDIT 40 //Non-constant-acceleration movements can build a credit that will be used before hitting the ACCEL_COUNT limit above. Handy for mice or users that exhibit constant velocity characteristics mid-movement. #define MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_CREDIT 60 //Non-constant-acceleration movements can build a credit that will be used before hitting the ACCEL_COUNT limit above. Handy for mice or users that exhibit constant velocity characteristics mid-movement.
#define MOUSE_BOTDETECT_LOCKOUT_JIGGLE_BIN_THRESHOLD 4
//----------------------------------------------------------- //-----------------------------------------------------------
#define MOUSE_BOTDETECT_VELOCITY_MULTIPLIER 10 #define MOUSE_BOTDETECT_VELOCITY_MULTIPLIER 10
@ -58,6 +59,11 @@
#define MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE 12 #define MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE 12
#define MOUSE_BOTDETECT_VELOCITY_MATCH_BASE 256 #define MOUSE_BOTDETECT_VELOCITY_MATCH_BASE 256
#define MOUSE_BOTDETECT_VELOCITY_MATCH_ERROR 6 #define MOUSE_BOTDETECT_VELOCITY_MATCH_ERROR 6
//Jiggle detection stuff
#define MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS 20 //20ms per bin
#define MOUSE_BOTDETECT_JIGGLE_BIN_COUNT 50 //50 bins at 20ms = 1 sec coverage, wrapped
#define MOUSE_BOTDETECT_JIGGLE_BIN_DIVIDER 4
#endif #endif

@ -65,9 +65,14 @@ volatile LockoutStateTypeDef LockoutState = LOCKOUT_STATE_INACTIVE;
int32_t PreviousSmoothedAcceleration = 0; int32_t PreviousSmoothedAcceleration = 0;
int8_t ConstantAccelerationCounter = 0; int8_t ConstantAccelerationCounter = 0;
//Jiggle detection stuff
uint8_t MouseStopIntervalBinDrainDivideCount = 0;
uint8_t MouseStopIntervalBinArray[MOUSE_BOTDETECT_JIGGLE_BIN_COUNT] = {0};
//Debug: //Debug:
// int8_t ConstantAccelerationCounterMax = 0; // int8_t ConstantAccelerationCounterMax = 0;
// int8_t ConstantAccelerationCounterMin = 0; // int8_t ConstantAccelerationCounterMin = 0;
// uint8_t MouseStopIntervalBinArrayPeak = 0;
static void Upstream_HID_BotDetectMouse_DoLockout(void); static void Upstream_HID_BotDetectMouse_DoLockout(void);
#endif #endif
@ -387,6 +392,7 @@ void Upstream_HID_BotDetectMouse(uint8_t* mouseInData)
{ {
uint32_t i; uint32_t i;
uint32_t now = HAL_GetTick(); uint32_t now = HAL_GetTick();
uint32_t moveDelay;
uint32_t velocity; uint32_t velocity;
int8_t mouseX; int8_t mouseX;
int8_t mouseY; int8_t mouseY;
@ -402,10 +408,14 @@ void Upstream_HID_BotDetectMouse(uint8_t* mouseInData)
mouseY = mouseInData[2]; mouseY = mouseInData[2];
velocity = (sqrtf(((int32_t)mouseX * mouseX) + velocity = (sqrtf(((int32_t)mouseX * mouseX) +
((int32_t)mouseY * mouseY))) * MOUSE_BOTDETECT_VELOCITY_MULTIPLIER; //Multiply floating-point sqrt result to avoid integer rounding errors ((int32_t)mouseY * mouseY))) * MOUSE_BOTDETECT_VELOCITY_MULTIPLIER; //Multiply floating-point sqrt result to avoid integer rounding errors
moveDelay = now - LastMouseMoveTime;
//Did the mouse stop moving? //Did the mouse stop moving?
if ((now - LastMouseMoveTime) > ((MOUSE_BOTDETECT_MOVEMENT_STOP_PERIODS * HID_FS_BINTERVAL) - (HID_FS_BINTERVAL / 2))) if (moveDelay > ((MOUSE_BOTDETECT_MOVEMENT_STOP_PERIODS * HID_FS_BINTERVAL) - (HID_FS_BINTERVAL / 2)))
{
//Is this the start of a new movement?
if (velocity != 0)
{ {
//Reset constant acceleration detection state //Reset constant acceleration detection state
for (i = 0; i < MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE; i++) for (i = 0; i < MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE; i++)
@ -414,6 +424,34 @@ void Upstream_HID_BotDetectMouse(uint8_t* mouseInData)
} }
ConstantAccelerationCounter = 0; ConstantAccelerationCounter = 0;
//Jiggle detection: add stopped time to jiggle bins
moveDelay = moveDelay % (MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS * MOUSE_BOTDETECT_JIGGLE_BIN_COUNT); //Wrap stopped time into the array
MouseStopIntervalBinArray[(moveDelay / MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS)]++;
if (MouseStopIntervalBinArray[(moveDelay / MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS)] > MOUSE_BOTDETECT_LOCKOUT_JIGGLE_BIN_THRESHOLD)
{
Upstream_HID_BotDetectMouse_DoLockout();
}
//Debug:
// if (MouseStopIntervalBinArray[(moveDelay / MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS)] > MouseStopIntervalBinArrayPeak)
// {
// MouseStopIntervalBinArrayPeak = MouseStopIntervalBinArray[(moveDelay / MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS)];
// }
//Drain jiggle bins at specified rate
MouseStopIntervalBinDrainDivideCount++;
if (MouseStopIntervalBinDrainDivideCount >= MOUSE_BOTDETECT_JIGGLE_BIN_DIVIDER)
{
MouseStopIntervalBinDrainDivideCount = 0;
for (i = 0; i < MOUSE_BOTDETECT_JIGGLE_BIN_COUNT; i++)
{
if (MouseStopIntervalBinArray[i] > 0) MouseStopIntervalBinArray[i]--;
}
}
}
//Jump detection //Jump detection
if (MouseIsMoving) if (MouseIsMoving)
{ {
@ -521,6 +559,11 @@ static void Upstream_HID_BotDetectMouse_DoLockout(void)
} }
ConstantAccelerationCounter = 0; ConstantAccelerationCounter = 0;
for (i = 0; i < MOUSE_BOTDETECT_JIGGLE_BIN_COUNT; i++)
{
MouseStopIntervalBinArray[i] = 0;
}
TemporaryLockoutTimeMs = 0; TemporaryLockoutTimeMs = 0;
LockoutState = LOCKOUT_STATE_TEMPORARY_ACTIVE; LockoutState = LOCKOUT_STATE_TEMPORARY_ACTIVE;
LED_SetState(LED_STATUS_FLASH_BOTDETECT); LED_SetState(LED_STATUS_FLASH_BOTDETECT);

Loading…
Cancel
Save