qmk-dactyl-manuform-a/keyboards/ploopyco/opt_encoder.h

67 lines
2.0 KiB
C

/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
* Copyright 2020 Ploopy Corporation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdbool.h>
#ifndef SCROLLER_AR_SIZE
# define SCROLLER_AR_SIZE 31
#endif
#ifndef SCROLL_THRESH_RANGE_LIM
# define SCROLL_THRESH_RANGE_LIM 10
#endif
enum State { HIHI, HILO, LOLO, LOHI };
extern enum State state;
/* Variables used for scroll wheel functionality. */
extern bool lohif;
extern bool hilof;
extern int lowA;
extern int highA;
extern bool cLowA;
extern bool cHighA;
extern int lowIndexA;
extern int highIndexA;
extern bool lowOverflowA;
extern bool highOverflowA;
extern int lowB;
extern int highB;
extern bool cLowB;
extern bool cHighB;
extern int lowIndexB;
extern int highIndexB;
extern bool lowOverflowB;
extern bool highOverflowB;
extern int scrollThresholdA;
extern int scrollThresholdB;
extern int arLowA[SCROLLER_AR_SIZE];
extern int arHighA[SCROLLER_AR_SIZE];
extern int arLowB[SCROLLER_AR_SIZE];
extern int arHighB[SCROLLER_AR_SIZE];
void calculateThresholdA(int curA);
void calculateThresholdB(int curB);
int calculateThreshold(int cur, int* low, int* high, bool* cLow, bool* cHigh, int arLow[], int arHigh[], int* lowIndex, int* highIndex, bool* lowOverflow, bool* highOverflow);
int thresholdEquation(int lo, int hi);
void incrementIndex(int* index, bool* ovflw);
void opt_encoder_init(void);
int opt_encoder_handler(int curA, int curB);