]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/40percentclub/nano/matrix.c
Keyboard: Add yosino58 Keyboard (#5465)
[qmk_firmware.git] / keyboards / 40percentclub / nano / matrix.c
1 /*
2
3 Note for ErgoDox EZ customizers: Here be dragons!
4 This is not a file you want to be messing with.
5 All of the interesting stuff for you is under keymaps/ :)
6 Love, Erez
7
8 Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
9
10 This program is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 /*
25  * scan matrix
26  */
27 #include <stdint.h>
28 #include <stdbool.h>
29 #include <avr/io.h>
30 #include <util/delay.h>
31 #include "action_layer.h"
32 #include "print.h"
33 #include "debug.h"
34 #include "util.h"
35 #include "matrix.h"
36 #include "nano.h"
37 #include <string.h>
38
39 /* matrix state(1:on, 0:off) */
40 static matrix_row_t matrix[MATRIX_ROWS];
41 static matrix_row_t matrix_stage[MATRIX_ROWS];
42 static matrix_row_t matrix_debouncing[MATRIX_ROWS];
43
44 static uint16_t debouncing_time;
45 static bool debouncing = false;
46
47 __attribute__ ((weak))
48 void matrix_init_kb(void) {
49     matrix_init_user();
50 }
51
52 __attribute__ ((weak))
53 void matrix_scan_kb(void) {
54     matrix_scan_user();
55 }
56
57 __attribute__ ((weak))
58 void matrix_init_user(void) {
59 }
60
61 __attribute__ ((weak))
62 void matrix_scan_user(void) {
63 }
64
65 inline
66 uint8_t matrix_rows(void)
67 {
68     return MATRIX_ROWS;
69 }
70
71 inline
72 uint8_t matrix_cols(void)
73 {
74     return MATRIX_COLS;
75 }
76
77 void matrix_init(void)
78 {
79
80     DDRF  &= ~(1<<4 | 1<<5 | 1<<6 | 1<<7);
81     PORTF |=  (1<<4 | 1<<5 | 1<<6 | 1<<7);
82     DDRC  &= ~(1<<6);
83     PORTC |=  (1<<6);
84     DDRD  &= ~(1<<0 | 1<<1 | 1<<4);
85     PORTD |=  (1<<0 | 1<<1 | 1<<4);
86
87     for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
88         matrix[i] = 0;
89         matrix_debouncing[i] = 0;
90         matrix_stage[i] = 0;
91     }
92
93     matrix_init_quantum();
94
95 }
96
97 uint8_t matrix_scan(void)
98 {
99     matrix_stage[0] =
100         (PINF&(1<<4) ? 0 : (1<<0)) |
101         (PINF&(1<<5) ? 0 : (1<<1)) |
102         (PINF&(1<<6) ? 0 : (1<<2)) |
103         (PINF&(1<<7) ? 0 : (1<<3));
104     matrix_stage[1] =
105         (PIND&(1<<1) ? 0 : (1<<0)) |
106         (PIND&(1<<0) ? 0 : (1<<1)) |
107         (PIND&(1<<4) ? 0 : (1<<2)) |
108         (PINC&(1<<6) ? 0 : (1<<3));
109
110     if (memcmp(matrix_debouncing, matrix_stage, sizeof(matrix)) != 0) {
111         debouncing = true;
112         debouncing_time = timer_read();
113     }
114
115     matrix_debouncing[0] = matrix_stage[0];
116     matrix_debouncing[1] = matrix_stage[1];
117
118     if (debouncing && (timer_elapsed(debouncing_time) > 20)) {
119         for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
120             matrix[i] = matrix_debouncing[i];
121         }
122         debouncing = false;
123     }
124
125     matrix_scan_quantum();
126
127     return 1;
128 }
129
130 bool matrix_is_modified(void)
131 {
132     return true;
133 }
134
135 inline
136 bool matrix_is_on(uint8_t row, uint8_t col)
137 {
138     return (matrix[row] & ((matrix_row_t)1<<col));
139 }
140
141 inline
142 matrix_row_t matrix_get_row(uint8_t row)
143 {
144     return matrix[row];
145 }
146
147 void matrix_print(void)
148 {
149 }
150
151 uint8_t matrix_key_count(void)
152 {
153     uint8_t count = 0;
154     for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
155         count += bitpop16(matrix[i]);
156     }
157     return count;
158 }
159