aboutsummaryrefslogtreecommitdiff
path: root/keyboards/ploopyco/opt_encoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/ploopyco/opt_encoder.c')
-rw-r--r--keyboards/ploopyco/opt_encoder.c248
1 files changed, 0 insertions, 248 deletions
diff --git a/keyboards/ploopyco/opt_encoder.c b/keyboards/ploopyco/opt_encoder.c
deleted file mode 100644
index 226db0a809..0000000000
--- a/keyboards/ploopyco/opt_encoder.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <[email protected]>
- * 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/>.
- */
-#include "opt_encoder.h"
-#include <stdbool.h>
-
-enum State { HIHI, HILO, LOLO, LOHI };
-
-enum State state;
-
-/* Variables used for scroll wheel functionality. */
-bool lohif;
-bool hilof;
-int lowA;
-int highA;
-bool cLowA;
-bool cHighA;
-int lowIndexA;
-int highIndexA;
-bool lowOverflowA;
-bool highOverflowA;
-int lowB;
-int highB;
-bool cLowB;
-bool cHighB;
-int lowIndexB;
-int highIndexB;
-bool lowOverflowB;
-bool highOverflowB;
-int scrollThresholdA;
-int scrollThresholdB;
-int arLowA[SCROLLER_AR_SIZE];
-int arHighA[SCROLLER_AR_SIZE];
-int arLowB[SCROLLER_AR_SIZE];
-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);
-
-/* Setup function for the scroll wheel. Initializes
- the relevant variables. */
-void opt_encoder_init(void) {
- state = HIHI;
- lohif = false;
- hilof = false;
- lowA = 1023;
- highA = 0;
- cLowA = false;
- cHighA = false;
- lowIndexA = 0;
- highIndexA = 0;
- lowOverflowA = false;
- highOverflowA = false;
- lowB = 1023;
- highB = 0;
- cLowB = false;
- cHighB = false;
- lowIndexB = 0;
- highIndexB = 0;
- lowOverflowB = false;
- highOverflowB = false;
- scrollThresholdA = 0;
- scrollThresholdB = 0;
-}
-
-int8_t opt_encoder_handler(uint16_t curA, uint16_t curB) {
- if (lowOverflowA == false || highOverflowA == false) calculateThresholdA(curA);
- if (lowOverflowB == false || highOverflowB == false) calculateThresholdB(curB);
-
- bool LO = false;
- bool HI = true;
- bool sA, sB;
- int ret = 0;
-
- if (curA < scrollThresholdA)
- sA = LO;
- else
- sA = HI;
-
- if (curB < scrollThresholdB)
- sB = LO;
- else
- sB = HI;
-
- if (state == HIHI) {
- if (sA == LO && sB == HI) {
- state = LOHI;
- if (hilof) {
- ret = 1;
- hilof = false;
- }
- } else if (sA == HI && sB == LO) {
- state = HILO;
- if (lohif) {
- ret = -1;
- lohif = false;
- }
- }
- }
-
- else if (state == HILO) {
- if (sA == HI && sB == HI) {
- state = HIHI;
- hilof = true;
- lohif = false;
- } else if (sA == LO && sB == LO) {
- state = LOLO;
- hilof = true;
- lohif = false;
- }
- }
-
- else if (state == LOLO) {
- if (sA == HI && sB == LO) {
- state = HILO;
- if (lohif) {
- ret = 1;
- lohif = false;
- }
- } else if (sA == LO && sB == HI) {
- state = LOHI;
- if (hilof) {
- ret = -1;
- hilof = false;
- }
- }
- }
-
- else { // state must be LOHI
- if (sA == HI && sB == HI) {
- state = HIHI;
- lohif = true;
- hilof = false;
- } else if (sA == LO && sB == LO) {
- state = LOLO;
- lohif = true;
- hilof = false;
- }
- }
-
- return ret;
-}
-
-void calculateThresholdA(int curA) { scrollThresholdA = calculateThreshold(curA, &lowA, &highA, &cLowA, &cHighA, arLowA, arHighA, &lowIndexA, &highIndexA, &lowOverflowA, &highOverflowA); }
-
-void calculateThresholdB(int curB) { scrollThresholdB = calculateThreshold(curB, &lowB, &highB, &cLowB, &cHighB, arLowB, arHighB, &lowIndexB, &highIndexB, &lowOverflowB, &highOverflowB); }
-
-int calculateThreshold(int cur, int* low, int* high, bool* cLow, bool* cHigh, int arLow[], int arHigh[], int* lowIndex, int* highIndex, bool* lowOverflow, bool* highOverflow) {
- if (cur < *low) *low = cur;
- if (cur > *high) *high = cur;
-
- int curThresh = thresholdEquation(*low, *high);
- int range = *high - *low;
-
- // The range is enforced to be over a certain limit because noise
- // can cause erroneous readings, making these calculations unstable.
- if (range >= SCROLL_THRESH_RANGE_LIM) {
- if (cur < curThresh) {
- if (*cHigh == true) {
- // We were just high, and now we crossed to low.
- // high reflects a sample of a high reading.
- arHigh[*highIndex] = *high;
- incrementIndex(highIndex, highOverflow);
- int midpoint = ((*high - *low) / 2) + *low;
- *low = midpoint;
- *high = midpoint;
- *cLow = false;
- *cHigh = false;
- } else {
- *cLow = true;
- }
- }
- if (cur > curThresh) {
- if (*cLow == true) {
- // We were just low, and now we crossed to high.
- // low reflects a sample of a low reading.
- arLow[*lowIndex] = *low;
- incrementIndex(lowIndex, lowOverflow);
- int midpoint = ((*high - *low) / 2) + *low;
- *low = midpoint;
- *high = midpoint;
- *cLow = false;
- *cHigh = false;
- } else {
- *cHigh = true;
- }
- }
- }
-
- int calcHigh = 0;
- if (*highOverflow == true) {
- for (int i = 0; i < SCROLLER_AR_SIZE; i++) {
- calcHigh += arHigh[i];
- }
- calcHigh = calcHigh / SCROLLER_AR_SIZE;
- } else if (*highIndex != 0) {
- for (int i = 0; i < *highIndex; i++) {
- calcHigh += arHigh[i];
- }
- calcHigh = calcHigh / *highIndex;
- } else {
- calcHigh = *high;
- }
-
- int calcLow = 0;
- if (*lowOverflow == true) {
- for (int i = 0; i < SCROLLER_AR_SIZE; i++) {
- calcLow += arLow[i];
- }
- calcLow = calcLow / SCROLLER_AR_SIZE;
- } else if (*lowIndex != 0) {
- for (int i = 0; i < *lowIndex; i++) {
- calcLow += arLow[i];
- }
- calcLow = calcLow / *lowIndex;
- } else {
- calcLow = *low;
- }
-
- return thresholdEquation(calcLow, calcHigh);
-}
-
-int thresholdEquation(int lo, int hi) { return ((hi - lo) / 3) + lo; }
-
-void incrementIndex(int* index, bool* ovflw) {
- if (*index < SCROLLER_AR_SIZE - 1)
- (*index)++;
- else {
- *index = 0;
- *ovflw = true;
- }
-}