keyboard stuff
at master 194 lines 6.0 kB view raw
1/* Copyright 2021 Balz Guenat 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 2 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 17#include "gtest/gtest.h" 18#include "gmock/gmock.h" 19#include <vector> 20#include <algorithm> 21#include <stdio.h> 22 23extern "C" { 24#include "encoder.h" 25#include "encoder/tests/mock_split.h" 26} 27 28struct update { 29 int8_t index; 30 bool clockwise; 31}; 32 33uint8_t updates_array_idx = 0; 34update updates[32]; 35 36bool isMaster; 37bool isLeftHand; 38 39extern "C" { 40bool is_keyboard_master(void) { 41 return isMaster; 42} 43 44bool encoder_update_kb(uint8_t index, bool clockwise) { 45 if (!is_keyboard_master()) { 46 // this method has no effect on slave half 47 printf("ignoring update on slave (%d,%s)\n", index, clockwise ? "CW" : "CC"); 48 return true; 49 } 50 updates[updates_array_idx % 32] = {index, clockwise}; 51 updates_array_idx++; 52 return true; 53} 54}; 55 56bool setAndRead(pin_t pin, bool val) { 57 setPin(pin, val); 58 return encoder_task(); 59} 60 61class EncoderSplitTestLeftGreaterThanRight : public ::testing::Test { 62 protected: 63 void SetUp() override { 64 updates_array_idx = 0; 65 for (int i = 0; i < 32; i++) { 66 pinIsInputHigh[i] = 0; 67 pins[i] = 0; 68 } 69 } 70}; 71 72TEST_F(EncoderSplitTestLeftGreaterThanRight, TestInitLeft) { 73 isLeftHand = true; 74 encoder_init(); 75 EXPECT_EQ(pinIsInputHigh[0], true); 76 EXPECT_EQ(pinIsInputHigh[1], true); 77 EXPECT_EQ(pinIsInputHigh[2], true); 78 EXPECT_EQ(pinIsInputHigh[3], true); 79 EXPECT_EQ(pinIsInputHigh[4], true); 80 EXPECT_EQ(pinIsInputHigh[5], true); 81 EXPECT_EQ(pinIsInputHigh[6], false); 82 EXPECT_EQ(pinIsInputHigh[7], false); 83 EXPECT_EQ(pinIsInputHigh[8], false); 84 EXPECT_EQ(pinIsInputHigh[9], false); 85 EXPECT_EQ(updates_array_idx, 0); // no updates received 86} 87 88TEST_F(EncoderSplitTestLeftGreaterThanRight, TestInitRight) { 89 isLeftHand = false; 90 encoder_init(); 91 EXPECT_EQ(pinIsInputHigh[0], false); 92 EXPECT_EQ(pinIsInputHigh[1], false); 93 EXPECT_EQ(pinIsInputHigh[2], false); 94 EXPECT_EQ(pinIsInputHigh[3], false); 95 EXPECT_EQ(pinIsInputHigh[4], false); 96 EXPECT_EQ(pinIsInputHigh[5], false); 97 EXPECT_EQ(pinIsInputHigh[6], true); 98 EXPECT_EQ(pinIsInputHigh[7], true); 99 EXPECT_EQ(pinIsInputHigh[8], true); 100 EXPECT_EQ(pinIsInputHigh[9], true); 101 EXPECT_EQ(updates_array_idx, 0); // no updates received 102} 103 104TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseLeftMaster) { 105 isMaster = true; 106 isLeftHand = true; 107 encoder_init(); 108 // send 4 pulses. with resolution 4, that's one step and we should get 1 update. 109 setAndRead(0, false); 110 setAndRead(1, false); 111 setAndRead(0, true); 112 setAndRead(1, true); 113 114 EXPECT_EQ(updates_array_idx, 1); // one update received 115 EXPECT_EQ(updates[0].index, 0); 116 EXPECT_EQ(updates[0].clockwise, true); 117 118 int events_queued = 0; 119 encoder_events_t events; 120 encoder_retrieve_events(&events); 121 while (events.tail != events.head) { 122 events.tail = (events.tail + 1) % MAX_QUEUED_ENCODER_EVENTS; 123 ++events_queued; 124 } 125 EXPECT_EQ(events_queued, 0); // No events should be queued on master 126} 127 128TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseRightMaster) { 129 isMaster = true; 130 isLeftHand = false; 131 encoder_init(); 132 // send 4 pulses. with resolution 4, that's one step and we should get 1 update. 133 setAndRead(6, false); 134 setAndRead(7, false); 135 setAndRead(6, true); 136 setAndRead(7, true); 137 138 EXPECT_EQ(updates_array_idx, 1); // one update received 139 EXPECT_EQ(updates[0].index, 3); 140 EXPECT_EQ(updates[0].clockwise, true); 141 142 int events_queued = 0; 143 encoder_events_t events; 144 encoder_retrieve_events(&events); 145 while (events.tail != events.head) { 146 events.tail = (events.tail + 1) % MAX_QUEUED_ENCODER_EVENTS; 147 ++events_queued; 148 } 149 EXPECT_EQ(events_queued, 0); // No events should be queued on master 150} 151 152TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseLeftSlave) { 153 isMaster = false; 154 isLeftHand = true; 155 encoder_init(); 156 // send 4 pulses. with resolution 4, that's one step and we should get 1 update. 157 setAndRead(0, false); 158 setAndRead(1, false); 159 setAndRead(0, true); 160 setAndRead(1, true); 161 162 EXPECT_EQ(updates_array_idx, 0); // no updates received 163 164 int events_queued = 0; 165 encoder_events_t events; 166 encoder_retrieve_events(&events); 167 while (events.tail != events.head) { 168 events.tail = (events.tail + 1) % MAX_QUEUED_ENCODER_EVENTS; 169 ++events_queued; 170 } 171 EXPECT_EQ(events_queued, 1); // One event should be queued on slave 172} 173 174TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseRightSlave) { 175 isMaster = false; 176 isLeftHand = false; 177 encoder_init(); 178 // send 4 pulses. with resolution 4, that's one step and we should get 1 update. 179 setAndRead(6, false); 180 setAndRead(7, false); 181 setAndRead(6, true); 182 setAndRead(7, true); 183 184 EXPECT_EQ(updates_array_idx, 0); // no updates received 185 186 int events_queued = 0; 187 encoder_events_t events; 188 encoder_retrieve_events(&events); 189 while (events.tail != events.head) { 190 events.tail = (events.tail + 1) % MAX_QUEUED_ENCODER_EVENTS; 191 ++events_queued; 192 } 193 EXPECT_EQ(events_queued, 1); // One event should be queued on slave 194}