]> git.donarmstrong.com Git - kiibohd-controller.git/blob - Scan/avr-capsense/scan_loop.c
Debugging kishsaver.
[kiibohd-controller.git] / Scan / avr-capsense / scan_loop.c
1 /* Copyright (C) 2011-2013 by Joseph Makuch
2  * Additions by Jacob Alexander (2013)
3  *
4  * dfj, put whatever license here you want -HaaTa
5  */
6
7 // ----- Includes -----
8
9 // Compiler Includes
10 #include <Lib/ScanLib.h>
11
12 // Project Includes
13 #include <led.h>
14 #include <print.h>
15
16 // Local Includes
17 #include "scan_loop.h"
18
19
20
21 // ----- Defines -----
22
23 // TODO dfj defines...needs cleaning up and commenting...
24 #define THRESHOLD 0x0a
25 #define BUMP_THRESHOLD 0x50
26 //((THRESHOLD) * 3)
27 #define BUMP_REST_US 1200
28
29 #define HYST 1
30 #define HYST_T 0x10
31
32 #define TEST_KEY_STROBE (0x05)
33 #define TEST_KEY_MASK (1 << 0)
34
35 #define ADHSM 7
36
37 /** Whether to use all of D and C, vs using E0, E1 instead of D6, D7,
38  * or alternately all of D, and E0,E1 and C0,..5 */
39 //#define ALL_D_C
40 //#define SHORT_D
41 #define SHORT_C
42
43 // rough offset voltage: one diode drop, about 50mV = 0x3ff * 50/3560 = 20
44 //#define OFFSET_VOLTAGE 0x14
45 #define OFFSET_VOLTAGE 0x28
46
47
48 #define RIGHT_JUSTIFY 0
49 #define LEFT_JUSTIFY (0xff)
50
51 // set left or right justification here:
52 #define JUSTIFY_ADC RIGHT_JUSTIFY
53
54 #define ADLAR_MASK (1 << ADLAR)
55 #ifdef JUSTIFY_ADC
56 #define ADLAR_BITS ((ADLAR_MASK) & (JUSTIFY_ADC))
57 #else // defaults to right justification.
58 #define ADLAR_BITS 0
59 #endif
60
61
62 // full muxmask
63 #define FULL_MUX_MASK ((1 << MUX0) | (1 << MUX1) | (1 << MUX2) | (1 << MUX3) | (1 << MUX4))
64
65 // F0-f7 pins only muxmask.
66 #define MUX_MASK ((1 << MUX0) | (1 << MUX1) | (1 << MUX2))
67
68 #define MUX_1_1 0x1e
69 #define MUX_GND 0x1f
70
71
72         // set ADC clock prescale
73 #define PRESCALE_MASK ((1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2))
74 #define PRESCALE_SHIFT (ADPS0)
75 #define PRESCALE 3
76
77
78 #ifdef EXTENDED_STROBE
79
80 #define STROBE_LINES 18
81
82 #else
83
84 #define STROBE_LINES 16
85
86 #endif
87
88 #define STROBE_LINES_XSHIFT 4
89 #define STROBE_LINES_MASK 0x0f
90 #define MUXES_COUNT 8
91 #define MUXES_COUNT_XSHIFT 3
92 #define MUXES_MASK 0x7
93
94 #define WARMUP_LOOPS ( 1024 )
95
96 #define RECOVERY_US 6
97
98 #define SAMPLES 10
99
100
101 #define SAMPLE_OFFSET ((SAMPLES) - MUXES_COUNT)
102 //#define SAMPLE_OFFSET 9
103 #define STROBE_OFFSET 0
104
105
106 #define KEY_COUNT ((STROBE_LINES) * (MUXES_COUNT))
107
108 #define LX2FX
109
110
111 #define RECOVERY_CONTROL 1
112
113 #define RECOVERY_SOURCE 0
114 #define RECOVERY_SINK 2
115 #define RECOVERY_MASK 0x03
116
117
118 // mix in 1/4 of the current average to the running average. -> (@mux_mix = 2)
119 #define MUX_MIX 2
120
121
122 #define IDLE_COUNT_MASK 0xff
123 #define MAX_ICS 8
124
125 #define IDLE_COUNT_SHIFT 4
126 #define KEYS_AVERAGES_MIX 2
127
128
129 #ifdef ALL_D_C
130
131 #define D_MASK (0xff)
132 #define D_SHIFT 0
133
134 #define E_MASK (0x00)
135 #define E_SHIFT 0
136
137 #define C_MASK (0xff)
138 #define C_SHIFT 8
139
140 #else
141 #if defined(SHORT_D)
142
143 #define D_MASK (0x3f)
144 #define D_SHIFT 0
145
146 #define E_MASK (0x03)
147 #define E_SHIFT 6
148
149 #define C_MASK (0xff)
150 #define C_SHIFT 8
151
152 #else
153 #if defined(SHORT_C)
154
155 #define D_MASK (0xff)
156 #define D_SHIFT 0
157
158 #define E_MASK (0x03)
159 #define E_SHIFT 6
160
161 #define C_MASK (0xff)
162 #define C_SHIFT 8
163 #endif
164 #endif
165 #endif
166
167
168
169
170
171 // ----- Macros -----
172
173 // Make sure we haven't overflowed the buffer
174 #define bufferAdd(byte) \
175                 if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \
176                         KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte
177
178
179 // TODO dfj macros...needs cleaning up and commenting...
180 #define STROBE_CASE(SC_CASE, SC_REG_A) case (SC_CASE): PORT##SC_REG_A = \
181         (( (PORT##SC_REG_A) & ~(1 << (SC_CASE - SC_REG_A##_SHIFT)) ) | (1 << (SC_CASE - SC_REG_A##_SHIFT)))
182
183 #define SET_MUX(X) ((ADMUX) = (((ADMUX) & ~(MUX_MASK)) | ((X) & (MUX_MASK))))
184 #define SET_FULL_MUX(X) ((ADMUX) = (((ADMUX) & ~(FULL_MUX_MASK)) | ((X) & (FULL_MUX_MASK))))
185
186
187
188
189
190 // ----- Variables -----
191
192 // Buffer used to inform the macro processing module which keys have been detected as pressed
193 volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
194 volatile uint8_t KeyIndex_BufferUsed;
195
196
197 // TODO dfj variables...needs cleaning up and commenting
198          uint8_t  blink = 0;
199 volatile uint8_t  idle_count = 1;
200 volatile uint16_t full_av = 0;
201
202 /**/ uint8_t ze_strober = 0;
203
204 int16_t samples [SAMPLES];
205
206 //int16_t gsamples [SAMPLES];
207
208 /**/ int16_t adc_mux_averages[MUXES_COUNT];
209 /**/ int16_t adc_strobe_averages[STROBE_LINES];
210
211
212 /**/ uint8_t cur_keymap[STROBE_LINES];
213 // /**/ int8_t last_keymap[STROBE_LINES];
214 /**/ uint8_t usb_keymap[STROBE_LINES];
215 uint8_t dirty;
216 uint8_t unstable;
217 uint8_t usb_dirty;
218
219 int16_t threshold = THRESHOLD;
220 uint16_t tests = 0;
221
222 uint8_t col_a=0;
223 uint8_t col_b=0;
224 uint8_t col_c=0;
225
226 uint8_t column=0;
227
228
229 int16_t keys_averages_acc[KEY_COUNT];
230 uint16_t keys_averages[KEY_COUNT];
231
232 uint8_t full_samples[KEY_COUNT];
233
234 /* viable starting biases for near 0.830V offset. and adc PRESCALE 3
235 0017 0016 001B 001A 0016 0016 000F 000E 001B 001E 001E 0018 0017 0015 000E 001D
236 001B 001A 0016 0016 000F 000E 001C 001B 001E 0018 0017 0015 000E 001D 0024 001F
237 0016 0016 000F 000E 001C 001B 001E 001E 0017 0015 000E 001D 0024 001F 0020 001F
238 000F 000E 001C 001B 001E 001E 0018 0017 000E 001D 0024 001F 0020 001F 0020 0017
239 001C 001B 001E 001E 0018 0017 0015 000E 0024 001F 0020 001F 0020 0017 0010 001D
240 001E 001E 0018 0017 0015 000E 001D 0024 0020 001F 0020 0017 0010 001D 0024 0021
241 0018 0017 0015 000E 001D 0024 001F 0020 0020 0017 0010 001D 0024 0021 0021 0021
242 0015 000E 001D 0024 001F 0020 001F 0020 0010 001D 0024 0021 0021 0021 0021 0018
243 */
244
245 /*** starting bias relative to fixed offset estimate of 820mV (0x50)
246  *   77 69 65 5B 50 4E 4C 45   66 53 4D 49 45 3F 3E 35
247  *   68 54 4F 49 45 40 3F 34   74 66 5F 56 4E 4D 4C 3F
248  *   6D 5D 53 4C 49 46 45 38   6D 5A 53 4E 49 48 45 3E
249  *   6F 5D 56 4E 4B 48 48 3A   6D 5C 54 4E 48 48 45 37
250  *   75 68 5F 57 4F 4D 4C 3F   60 4E 48 41 3C 3C 39 2F
251  *   65 53 4E 49 41 3F 3E 34   65 54 4E 49 43 3F 3E 34
252  *   60 51 4A 45 3F 3E 3C 30   57 4C 45 3E 3B 37 37 2E
253  *   64 4E 48 44 3C 3B 39 2F   5D 4F 48 45 3E 3C 3B 30
254  */
255
256 /*volatile*/ uint16_t count = 0;
257
258 /*volatile*/ uint8_t error = 0;
259 uint16_t error_data = 0;
260
261
262 int16_t mux_averages[MUXES_COUNT];
263 int16_t strobe_averages[STROBE_LINES];
264
265 uint8_t dump_count = 0;
266
267
268
269 // ----- Function Declarations -----
270
271 void dump    ( void );
272 void dumpkeys( void );
273
274 void recovery( uint8_t on );
275
276 int sampleColumn  ( uint8_t column );
277 //int sampleColumn_i( uint8_t column, uint8_t muxes, int16_t * buffer); // XXX Not currently used
278 int sampleColumn_k( uint8_t column, int16_t *buffer );
279
280 void setup_ADC( void );
281
282 void strobe_w( uint8_t strobe_num );
283
284 uint8_t testColumn( uint8_t strobe );
285
286
287
288 // ----- Functions -----
289
290 // Initial setup for cap sense controller
291 inline void scan_setup()
292 {
293         // TODO dfj code...needs cleanup + commenting...
294         setup_ADC();
295
296         // Configure timer 0 to generate a timer overflow interrupt every
297         // 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock
298         // This demonstrates how to use interrupts to implement a simple
299         // inactivity timeout.
300         //TCCR0A = 0x00;
301         //TCCR0B = 0x05;
302         //TIMSK0 = (1<<TOIE0);
303
304         DDRC = C_MASK;
305         PORTC = 0;
306         DDRD = D_MASK;
307         PORTD = 0;
308         DDRE = E_MASK;
309         PORTE = 0 ;
310
311         //DDRC |= (1 << 6);
312         //PORTC &= ~(1<< 6);
313
314         //uint16_t strobe = 1;
315
316
317         // TODO all this code should probably be in scan_resetKeyboard
318         for (int i=0; i< STROBE_LINES; ++i) {
319                 cur_keymap[i] = 0;
320                 //last_keymap[i] = 0;
321                 usb_keymap[i] = 0;
322         }
323
324         for(int i=0; i < MUXES_COUNT; ++i) {
325                 adc_mux_averages[i] = 0x20; // experimentally determined.
326         }
327         for(int i=0; i < STROBE_LINES; ++i) {
328                 adc_strobe_averages[i] = 0x20; // yup.
329         }
330
331         for(int i=0; i< KEY_COUNT; ++i) {
332                 keys_averages[i] = 0x40;
333                 keys_averages_acc[i] = (0x400);
334         }
335
336         /** warm things up a bit before we start collecting data, taking real samples. */
337         for(uint8_t i = 0; i< STROBE_LINES; ++i) {
338                 sampleColumn(i);
339         }
340
341
342         // Reset the keyboard before scanning, we might be in a wierd state
343         // Also sets the KeyIndex_BufferUsed to 0
344         scan_resetKeyboard();
345 }
346
347
348 // Main Detection Loop
349 // This is where the important stuff happens
350 inline uint8_t scan_loop()
351 {
352         // TODO dfj code...needs commenting + cleanup...
353         uint8_t strober = 0;
354         uint32_t full_av_acc = 0;
355
356         for (strober = 0; strober < STROBE_LINES; ++strober) {
357
358                 uint8_t tries;
359                 tries = 1;
360                 while (tries++ && sampleColumn(strober)) { tries &= 0x7; } // don't waste this one just because the last one was poop.
361                 column = testColumn(strober);
362
363                 if( column != cur_keymap[strober] && (count >= WARMUP_LOOPS) ) {
364                         tests++;
365
366                         tries = 1;
367                         while (tries++ && sampleColumn(strober)) { tries &= 0x7; } // don't waste this one just because the last one was poop.
368                         col_a = testColumn(strober);
369
370                         tries = 1;
371                         while (tries++ && sampleColumn(strober)) { tries &= 0x7; } // don't waste this one just because the last one was poop.
372                         col_b = testColumn(strober);
373
374                         tries = 1;
375                         while (tries++ && sampleColumn(strober)) { tries &= 0x7; } // don't waste this one just because the last one was poop.
376                         col_c = testColumn(strober);
377
378                         if( (col_a == col_b) && (col_b == col_c) && (cur_keymap[strober] != col_a) ) {
379                                 cur_keymap[strober] = col_a;
380                                 usb_dirty = 1;
381                         }
382                 }
383
384                 if(error == 0x50) {
385                         error_data |= (((uint16_t)strober) << 12);
386                 }
387
388                 for(int i=0; i<MUXES_COUNT; ++i) {
389                         full_samples[(strober << MUXES_COUNT_XSHIFT) + i] = samples[SAMPLE_OFFSET + i];
390                 }
391
392                 strobe_averages[strober] = 0;
393                 for (uint8_t i = SAMPLE_OFFSET; i < (SAMPLE_OFFSET + MUXES_COUNT); ++i) {
394                         //samples[i] -= samples[i-SAMPLE_OFFSET]; // av; // + full_av); // -something.
395                         //samples[i] -= OFFSET_VOLTAGE; // moved to sampleColumn.
396
397                         full_av_acc += (samples[i]);
398                         mux_averages[i - SAMPLE_OFFSET] += samples[i];
399                         strobe_averages[strober] += samples[i];
400                         //samples[i] -= (full_av - HYST_T);
401
402                         //++count;
403                 }
404                 adc_strobe_averages[strober] += strobe_averages[strober] >> 3;
405                 adc_strobe_averages[strober] >>= 1;
406
407                 /** test if we went negative. */
408                 if ((adc_strobe_averages[strober] & 0xFF00) && (count
409                                 >= WARMUP_LOOPS)) {
410                         //count = 0; // TODO : constrain properly.
411                         error = 0xf; error_data = adc_strobe_averages[strober];
412                 }
413
414                 uint8_t strobe_line = strober << MUXES_COUNT_XSHIFT;
415                 for (int i = 0; i < MUXES_COUNT; ++i) {
416                         keys_averages_acc[strobe_line + i]
417                                         += samples[SAMPLE_OFFSET + i];
418                 }
419
420         } // for strober
421
422         if (count < WARMUP_LOOPS) {
423                 error = 0x0C;
424                 error_data = count;
425                 count++;
426         }
427
428         // verify test key is not down.
429         if((cur_keymap[TEST_KEY_STROBE] & TEST_KEY_MASK) ) {
430                 //count=0;
431                 error = 0x05;
432                 error_data = cur_keymap[TEST_KEY_STROBE] << 8;
433                 error_data += full_samples[TEST_KEY_STROBE * 8];
434                 //threshold++;
435         }
436
437         // calc mux averages.
438         if (count < WARMUP_LOOPS) {
439                 full_av += (full_av_acc >> (7));
440                 full_av >>= 1;
441                 //full_av = full_av_acc / count;
442                 full_av_acc = 0;
443                 for (int i=0; i < MUXES_COUNT; ++i) {
444
445                         adc_mux_averages[i] = (adc_mux_averages[i] << MUX_MIX) - adc_mux_averages[i];
446                         adc_mux_averages[i] += (mux_averages[i] >> 4);
447                         adc_mux_averages[i] >>= MUX_MIX;
448
449                         mux_averages[i] = 0;
450                 }
451
452         }
453
454         idle_count++;
455         idle_count &= IDLE_COUNT_MASK;
456
457         if (/*usb_dirty &&*/ (count >= WARMUP_LOOPS) ) {
458                 for (int i=0; i<STROBE_LINES; ++i) {
459                         usb_keymap[i] = cur_keymap[i];
460                 }
461
462                 dumpkeys();
463                 usb_dirty=0;
464                 _delay_ms(2);
465         }
466
467         if (count < WARMUP_LOOPS) {
468                 for (uint8_t i = 0; i < KEY_COUNT; ++i) {
469                         uint16_t acc = keys_averages_acc[i];
470                         uint32_t av = keys_averages[i];
471
472                         av = av + av + av + acc;
473                         av >>= 2;
474
475                         keys_averages[i] = av;
476                         keys_averages_acc[i] = 0;
477                 }
478         }
479
480
481         if(!idle_count) {
482
483                 for (int i=0; i< KEY_COUNT; ++i) {
484                         keys_averages_acc[i] = 0;
485                 }
486
487                 sampleColumn(0x0); // to resync us if we dumped a mess 'o text.
488         }
489
490
491         // Return non-zero if macro and USB processing should be delayed
492         // Macro processing will always run if returning 0
493         // USB processing only happens once the USB send timer expires, if it has not, scan_loop will be called
494         //  after the macro processing has been completed
495         return 0;
496 }
497
498
499 // Reset Keyboard
500 void scan_resetKeyboard( void )
501 {
502         // Empty buffer, now that keyboard has been reset
503         KeyIndex_BufferUsed = 0;
504 }
505
506
507 // Send data to keyboard
508 // NOTE: Only used for converters, since the scan module shouldn't handle sending data in a controller
509 uint8_t scan_sendData( uint8_t dataPayload )
510 {
511         return 0;
512 }
513
514
515 // Reset/Hold keyboard
516 // NOTE: Only used for converters, not needed for full controllers
517 void scan_lockKeyboard( void )
518 {
519 }
520
521 // NOTE: Only used for converters, not needed for full controllers
522 void scan_unlockKeyboard( void )
523 {
524 }
525
526
527 // Signal KeyIndex_Buffer that it has been properly read
528 // NOTE: Only really required for implementing "tricks" in converters for odd protocols
529 void scan_finishedWithBuffer( uint8_t sentKeys )
530 {
531         // Convenient place to clear the KeyIndex_Buffer
532         KeyIndex_BufferUsed = 0;
533         return;
534 }
535
536
537 // Signal KeyIndex_Buffer that it has been properly read and sent out by the USB module
538 // NOTE: Only really required for implementing "tricks" in converters for odd protocols
539 void scan_finishedWithUSBBuffer( uint8_t sentKeys )
540 {
541         return;
542 }
543
544
545 void
546 _delay_loop(uint8_t __count)
547 {
548         __asm__ volatile (
549                 "1: dec %0" "\n\t"
550                 "brne 1b"
551                 : "=r" (__count)
552                 : "0" (__count)
553         );
554 }
555
556
557 void setup_ADC (void) {
558         // disable adc digital pins.
559         DIDR1 |= (1 << AIN0D) | (1<<AIN1D); // set disable on pins 1,0.
560         //DIDR0 = 0xff; // disable all. (port F, usually). - testing w/o disable.
561         DDRF = 0x0;
562         PORTF = 0x0;
563         uint8_t mux = 0 & 0x1f; // 0 == first. // 0x1e = 1.1V ref.
564
565         // 0 = external aref 1,1 = 2.56V internal ref
566         uint8_t aref = ((1 << REFS1) | (1 << REFS0)) & ((1 << REFS1) | (1 << REFS0));
567 //      uint8_t adlar = 0xff & (1 << ADLAR); // 1 := left justify bits, 0 := right
568         uint8_t adate = (1 << ADATE) & (1 << ADATE); // trigger enable
569         uint8_t trig = 0 & ((1 << ADTS0) | (1 << ADTS1) | (1 << ADTS2)); // 0 = free running
570         // ps2, ps1 := /64 ( 2^6 ) ps2 := /16 (2^4), ps1 := 4, ps0 :=2, PS1,PS0 := 8 (2^8)
571         uint8_t prescale = ( ((PRESCALE) << PRESCALE_SHIFT) & PRESCALE_MASK ); // 001 == 2^1 == 2
572         uint8_t hispeed = (1 << ADHSM);
573         uint8_t en_mux = (1 << ACME);
574
575         //ADCSRA = (ADCSRA & ~PRESCALES) | ((1 << ADPS1) | (1 << ADPS2)); // 2, 1 := /64 ( 2^6 )
576         //ADCSRA = (ADCSRA & ~PRESCALES) | ((1 << ADPS0) | (1 << ADPS2)); // 2, 0 := /32 ( 2^5 )
577         //ADCSRA = (ADCSRA & ~PRESCALES) | ((1 << ADPS2)); // 2 := /16 ( 2^4 )
578
579         ADCSRA = (1 << ADEN) | prescale; // ADC enable
580
581         // select ref.
582         //ADMUX |= ((1 << REFS1) | (1 << REFS0)); // 2.56 V internal.
583         //ADMUX |= ((1 << REFS0) ); // Vcc with external cap.
584         //ADMUX &= ~((1 << REFS1) | (1 << REFS0)); // 0,0 : aref.
585         ADMUX = aref | mux | ADLAR_BITS;
586
587         // enable MUX
588         // ADCSRB |= (1 << ACME);       // enable
589         // ADCSRB &= ~(1 << ADEN); // ?
590
591         // select first mux.
592         //ADMUX = (ADMUX & ~MUXES); // start at 000 = ADC0
593
594         // clear adlar to left justify data
595         //ADMUX = ~();
596
597         // set adlar to right justify data
598         //ADMUX |= (1 << ADLAR);
599
600
601         // set free-running
602         ADCSRA |= adate; // trigger enable
603         ADCSRB  = en_mux | hispeed | trig | (ADCSRB & ~((1 << ADTS0) | (1 << ADTS1) | (1 << ADTS2))); // trigger select free running
604
605 //      ADCSRA |= (1 << ADATE); // tiggger enable
606
607         ADCSRA |= (1 << ADEN); // ADC enable
608         ADCSRA |= (1 << ADSC); // start conversions q
609
610 }
611
612
613 void recovery(uint8_t on) {
614         DDRB |= (1 << RECOVERY_CONTROL);
615
616         PORTB &= ~(1 << RECOVERY_SINK);    // SINK always zero
617         DDRB &= ~(1 << RECOVERY_SOURCE);  // SOURCE high imp
618
619         if(on) {
620                 DDRB |= (1 << RECOVERY_SINK);   // SINK pull
621
622
623                 PORTB |= (1 << RECOVERY_CONTROL);
624
625                 PORTB |= (1 << RECOVERY_SOURCE); // SOURCE high
626                 DDRB |= (1 << RECOVERY_SOURCE);
627         } else {
628                 _delay_loop(10);
629                 PORTB &= ~(1 << RECOVERY_CONTROL);
630
631                 DDRB &= ~(1 << RECOVERY_SOURCE);
632                 PORTB &= ~(1 << RECOVERY_SOURCE); // SOURCE low
633                 DDRB &= ~(1 << RECOVERY_SINK);  // SINK high-imp
634
635                 //DDRB &= ~(1 << RECOVERY_SINK);
636         }
637 }
638
639
640 void strobe_w(uint8_t strobe_num) {
641
642         PORTC &= ~(C_MASK);
643         PORTD &= ~(D_MASK);
644         PORTE &= ~(E_MASK);
645
646 #ifdef SHORT_C
647         strobe_num = 15 - strobe_num;
648 #endif
649         /*
650         printHex( strobe_num );
651         print(" ");
652         strobe_num = 9 - strobe_num;
653         printHex( strobe_num );
654         print("\n");
655         */
656
657         switch(strobe_num) {
658
659         // XXX Kishsaver strobe (note that D0, D1 are not used)
660         case 2: PORTD |= (1 << 2); break;
661         case 3: PORTD |= (1 << 3); break;
662         case 4: PORTD |= (1 << 4); break;
663         case 5: PORTD |= (1 << 5); break;
664
665         // TODO REMOVEME
666         case 6: PORTD |= (1 << 6); break;
667         case 7: PORTD |= (1 << 7); break;
668         case 8: PORTE |= (1 << 0); break;
669         case 9: PORTE |= (1 << 1); break;
670         case 15: PORTC |= (1 << 5); break;
671 /*
672 #ifdef ALL_D
673
674         case 6: PORTD |= (1 << 6); break;
675         case 7: PORTD |= (1 << 7); break;
676
677         case 8:  PORTC |= (1 << 0); break;
678         case 9:  PORTC |= (1 << 1); break;
679         case 10: PORTC |= (1 << 2); break;
680         case 11: PORTC |= (1 << 3); break;
681         case 12: PORTC |= (1 << 4); break;
682         case 13: PORTC |= (1 << 5); break;
683         case 14: PORTC |= (1 << 6); break;
684         case 15: PORTC |= (1 << 7); break;
685
686         case 16: PORTE |= (1 << 0); break;
687         case 17: PORTE |= (1 << 1); break;
688
689 #else
690 #ifdef SHORT_D
691
692         case 6: PORTE |= (1 << 0); break;
693         case 7: PORTE |= (1 << 1); break;
694
695         case 8:  PORTC |= (1 << 0); break;
696         case 9:  PORTC |= (1 << 1); break;
697         case 10: PORTC |= (1 << 2); break;
698         case 11: PORTC |= (1 << 3); break;
699         case 12: PORTC |= (1 << 4); break;
700         case 13: PORTC |= (1 << 5); break;
701         case 14: PORTC |= (1 << 6); break;
702         case 15: PORTC |= (1 << 7); break;
703
704 #else
705 #ifdef SHORT_C
706
707         case 6: PORTD |= (1 << 6); break;
708         case 7: PORTD |= (1 << 7); break;
709
710         case 8: PORTE |= (1 << 0); break;
711         case 9: PORTE |= (1 << 1); break;
712
713         case 10:  PORTC |= (1 << 0); break;
714         case 11:  PORTC |= (1 << 1); break;
715         case 12: PORTC |= (1 << 2); break;
716         case 13: PORTC |= (1 << 3); break;
717         case 14: PORTC |= (1 << 4); break;
718         case 15: PORTC |= (1 << 5); break;
719
720         case 16: PORTC |= (1 << 6); break;
721         case 17: PORTC |= (1 << 7); break;
722
723 #endif
724 #endif
725 #endif
726 */
727
728         default:
729                 break;
730         }
731
732 }
733
734 #if 0
735 int sampleColumn_i(uint8_t column, uint8_t muxes, int16_t * buffer) {
736
737         // ensure all probe lines are driven low, and chill for recovery delay.
738         PORTC &= ~C_MASK;
739         PORTD &= ~D_MASK;
740         PORTE &= ~E_MASK;
741         recovery(1);
742         _delay_us(RECOVERY_US);
743         recovery(0);
744
745         //uint8_t index = 0;
746
747         for (uint8_t i=0; i<8; ++i) {
748                 if(muxes & (1 << i)) {
749                         buffer[index++] = i;
750                 }
751         }
752
753         SET_FULL_MUX(MUX_1_1); // crap sample will use this.
754         ADCSRA |= (1 << ADEN) | (1 << ADSC); // enable and start conversions
755         ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
756
757         //uint16_t sample;
758
759         while (! (ADCSRA & (1 << ADIF))); // wait until ready.
760         sample = ADC; // 1st sample, icky.
761         //ADC; // 1st sample, icky. XXX Not sure if the compiler throws this away, but less compiler warnings -HaaTa
762
763         strobe_w(column);
764         //recovery(0);
765
766         /**
767          * we are running in continuous mode, so we must setup the next
768          * read _before_ the current read completes.
769          *
770          * setup 0,
771          * read garbage,
772          * do not store
773          *
774          * setup 1,
775          * read 0,
776          * store 0,
777          *
778          * ...
779          *
780          * setup junk,
781          * read n
782          * store n
783          *
784          * */
785
786
787         ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
788         //wait for last read to complete.
789         while (! (ADCSRA & (1 << ADIF)));
790         sample = ADC; // throw away strobe'd value.
791         //ADC; // throw away strobe'd value.
792
793 #if 0
794         for (uint8_t i=0; i <= index; ++i) {
795
796                 // setup i'th read.
797                 SET_FULL_MUX(buffer[i]); // _next_ read will use this.
798                 // wait for i-1'th read to complete:
799                 ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
800                 while (! (ADCSRA & (1 << ADIF)));
801
802                 // retrieve last (i-1'th) read.
803                 if (i) {
804                         buffer[i-1] = ADC - OFFSET_VOLTAGE;
805                 } /*else {
806                         buffer[0] = ADC - OFFSET_VOLTAGE;
807                 }*/
808
809                 //index++;
810         }
811 #else
812         for (uint8_t i=0; i < index; ++i) {
813
814                 // setup i'th read.
815                 SET_FULL_MUX(buffer[i]); // _next_ read will use this.
816
817                 ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
818                 while (! (ADCSRA & (1 << ADIF)));
819                 sample = ADC; // throw away warmup value.
820                 //ADC; // throw away warmup value.
821
822
823
824                 /*
825                 ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
826                 while (! (ADCSRA & (1 << ADIF)));
827                 //sample = ADC; // throw away warmup value.
828                 ADC; // throw away warmup value.
829 */
830
831                 ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
832                 while (! (ADCSRA & (1 << ADIF)));
833
834                 // retrieve current read.
835                 buffer[i] = ADC - OFFSET_VOLTAGE;
836
837
838         }
839 #endif
840
841
842         // turn off adc.
843         ADCSRA &= ~(1 << ADEN);
844
845         // pull all columns' probe-lines low.
846         PORTC &= ~C_MASK;
847         PORTD &= ~D_MASK;
848         PORTE &= ~E_MASK;
849
850         // test for humps. :/
851         /*uint16_t delta = full_av;
852         if(buffer[0] > BUMP_THRESHOLD + delta) {
853                 // ze horror.
854                 return 1;
855         } else {
856                 return 0; //all good.
857         }*/
858         return 0;
859
860 }
861 #endif
862
863
864 int sampleColumn_k(uint8_t column, int16_t * buffer) {
865         // ensure all probe lines are driven low, and chill for recovery delay.
866         uint16_t sample;
867
868         ADCSRA |= (1 << ADEN) | (1 << ADSC); // enable and start conversions
869         ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
870
871         // sync up with adc clock:
872         while (! (ADCSRA & (1 << ADIF))); // wait until ready.
873         //ADC; // throw it away. // XXX Not sure if the compiler throws this away, but less compiler warnings -HaaTa
874         sample = ADC; // throw it away.
875
876         for(uint8_t mux=0; mux < 8; ++mux) {
877
878                 PORTC &= ~C_MASK;
879                 PORTD &= ~D_MASK;
880                 PORTE &= ~E_MASK;
881
882                 SET_FULL_MUX(mux); // our sample will use this
883
884                 for(uint8_t i=0; i < 2; ++i) {
885                         ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
886                         //wait for last read to complete.
887                         while (! (ADCSRA & (1 << ADIF)));
888                         sample = ADC; // throw away strobe'd value.
889                         //ADC; // throw away strobe'd value.
890                 }
891
892                 recovery(0);
893                 strobe_w(column);
894
895                 ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
896                 //wait for last read to complete.
897                 while (! (ADCSRA & (1 << ADIF)));
898                 sample = ADC; // throw away strobe'd value.
899                 //ADC; // throw away strobe'd value.
900
901                 ADCSRA |= (1 << ADIF); // clear int flag by writing 1.
902                 while (! (ADCSRA & (1 << ADIF)));
903
904                 // retrieve current read.
905                 buffer[mux] = ADC - OFFSET_VOLTAGE;
906                 recovery(1);
907
908         }
909
910         // turn off adc.
911         ADCSRA &= ~(1 << ADEN);
912
913         // pull all columns' probe-lines low.
914         PORTC &= ~C_MASK;
915         PORTD &= ~D_MASK;
916         PORTE &= ~E_MASK;
917 //              recovery(1);
918
919
920         return 0;
921 }
922
923
924 int sampleColumn(uint8_t column) {
925         int rval = 0;
926
927         /*
928         sampleColumn_i(column, 0x0f, samples+SAMPLE_OFFSET);
929         sampleColumn_i(column, 0xf0, samples+SAMPLE_OFFSET + 4 );
930 */
931
932         rval = sampleColumn_k(column, samples+SAMPLE_OFFSET);
933
934         //for(uint8_t i=0; i<1; ++i) { // TODO REMOVEME
935         for(uint8_t i=0; i<8; ++i) {
936                 if(samples[SAMPLE_OFFSET + i] - adc_mux_averages[i] > BUMP_THRESHOLD) {
937                         // was a hump
938
939                         _delay_us(BUMP_REST_US);
940                         rval++;
941                         error = 0x50;
942                         error_data = samples[SAMPLE_OFFSET +i]; //  | ((uint16_t)i << 8);
943                         return rval;
944                 }
945         }
946
947         return rval;
948 }
949
950
951 uint8_t testColumn(uint8_t strobe) {
952     uint8_t column = 0;
953     uint8_t bit = 1;
954     for (uint8_t i=0; i < MUXES_COUNT; ++i) {
955                 uint16_t delta = keys_averages[(strobe << MUXES_COUNT_XSHIFT) + i];
956                 if ((int16_t)samples[SAMPLE_OFFSET + i] > threshold + delta) {
957                         column |= bit;
958                 }
959                 bit <<= 1;
960         }
961     return column;
962 }
963
964
965 void dumpkeys(void) {
966         //print(" \n");
967         if(error) {
968                 if (count >= WARMUP_LOOPS && error) {
969                         dump();
970                 }
971
972                 // Key scan debug
973                 /*
974                 for (uint8_t i=0; i < STROBE_LINES; ++i) {
975                                 printHex(usb_keymap[i]);
976                                 print(" ");
977                 }
978
979                 print(" : ");
980                 printHex(error);
981                 error = 0;
982                 print(" : ");
983                 printHex(error_data);
984                 error_data = 0;
985                 print(" : " NL);
986                 */
987         }
988
989         // XXX Will be cleaned up eventually, but this will do for now :P -HaaTa
990         for (uint8_t i=0; i < STROBE_LINES; ++i) {
991                 for(uint8_t j=0; j<MUXES_COUNT; ++j) {
992                         if ( usb_keymap[i] & (1 << j) ) {
993                                 uint8_t key = (i << MUXES_COUNT_XSHIFT) + j;
994
995                                 // Add to the Macro processing buffer
996                                 // Automatically handles converting to a USB code and sending off to the PC
997                                 //bufferAdd( key );
998
999                                 if(usb_dirty)
1000                                 {
1001                                 /*
1002                                         printHex( key );
1003                                         print(" ");
1004                                 */
1005                                 }
1006                         }
1007                 }
1008         }
1009         //if(usb_dirty) print("\n");
1010         usb_keyboard_send();
1011 }
1012
1013
1014 void dump(void) {
1015
1016         if(!dump_count) {  // we don't want to debug-out during the measurements.
1017
1018                 // Averages currently set per key
1019                 for(int i =0; i< KEY_COUNT; ++i) {
1020                         if(!(i & 0x0f)) {
1021                                 print("\n");
1022                         } else if (!(i & 0x07)) {
1023                                 print("  ");
1024                         }
1025                         print(" ");
1026                         //printHex (keys_averages[(i >> MUXES_COUNT_XSHIFT) + (i & STROBE_LINES_MASK) ]);
1027                         printHex (keys_averages[i]);
1028                 }
1029
1030                 print("\n");
1031
1032                 // Previously read full ADC scans?
1033                 for(int i =0; i< KEY_COUNT; ++i) {
1034                         if(!(i & 0x0f)) {
1035                                 print("\n");
1036                         } else if (!(i & 0x07)) {
1037                                 print("  ");
1038                         }
1039                         print(" ");
1040                         //printHex (keys_averages[(i >> MUXES_COUNT_XSHIFT) + (i & STROBE_LINES_MASK) ]);
1041                         //printHex (keys_averages_acc[i]);
1042                         printHex(full_samples[i]);
1043                 }
1044         }
1045
1046         // Per strobe information
1047 //      uint8_t cur_strober = 0xe;
1048         uint8_t cur_strober = ze_strober;
1049         print("\n");
1050
1051         printHex(cur_strober);
1052         //print(":         ");
1053 #if 1
1054         // Previously read ADC scans on current strobe
1055         print(" :");
1056         for (uint8_t i=0; i < MUXES_COUNT; ++i) {
1057                 print(" ");
1058                 printHex(full_samples[(cur_strober << MUXES_COUNT_XSHIFT) + i]);
1059         }
1060
1061         // Averages current set on current strobe
1062         print(" :");
1063 //      printHex(threshold);
1064         for (uint8_t i=0; i < MUXES_COUNT; ++i) {
1065                 print(" ");
1066                 printHex(keys_averages[(cur_strober << MUXES_COUNT_XSHIFT) + i]);
1067         }
1068
1069 #endif
1070         /*
1071         for (uint8_t i=0; i< SAMPLES; ++i) {
1072                 print(" ");
1073                 printHex(samples[i]);
1074                 //printHex(ADC);
1075         }*/
1076         //print(" : ");
1077         //dPrint((was_active)?" ":"*");
1078
1079         //printHex(keymap[TEST_KEY_STROBE] & TEST_KEY_MASK);
1080         /*print(" "); */
1081         //printHex(keymap[TEST_KEY_STROBE]);
1082
1083
1084         //print("\n");
1085         //print(":");
1086         //printHex(full_av);
1087         //printHex(count);
1088         //print(" : ");
1089         print("\n      ");
1090
1091         // Current keymap values
1092         for (uint8_t i=0; i < STROBE_LINES; ++i) {
1093                 printHex(cur_keymap[i]);
1094                 print(" ");
1095
1096                 //print(" ");
1097         }
1098
1099
1100         //print(": ");
1101         //printHex(adc_strobe_averages[ze_strober]);
1102         //print(" ");
1103
1104
1105         /* Already printing this above...
1106         for (uint8_t i=0; i < MUXES_COUNT; ++i) {
1107                 print(" ");
1108                 //printHex(adc_mux_averages[i] + adc_strobe_averages[ze_strober] - full_av);
1109                 //printHex((adc_mux_averages[i] + adc_strobe_averages[ze_strober]) >> 1);
1110                 //printHex((adc_mux_averages[i] * 3  + adc_strobe_averages[ze_strober]) >> 2);
1111                 //printHex(adc_mux_averages[i] + threshold);
1112                 //printHex(gsamples[i + SAMPLE_OFFSET] - (adc_mux_averages[i] + threshold) + 0x100);
1113                 //printHex(keys_averages[(ze_strober << MUXES_COUNT_XSHIFT) + i] + (uint8_t)threshold);
1114                 printHex(keys_averages[(ze_strober << MUXES_COUNT_XSHIFT) + i]);
1115         }
1116         */
1117
1118         /* Being printed in dumpkeys()
1119         if(error) {
1120                 print(" ");
1121                 printHex(error);
1122                 print(" ");
1123                 printHex(error_data);
1124                 error = 0;
1125                 error_data = 0;
1126         }
1127         //print("\n");
1128         */
1129
1130         ze_strober++;
1131         ze_strober &= 0xf;
1132
1133
1134         dump_count++;
1135         dump_count &= 0x0f;
1136
1137
1138
1139         //ze_strobe = (1 << (ze_strober ) );
1140
1141
1142
1143         //printHex(ADCSRA);
1144         //print(" ");
1145         //print("\n");
1146 }
1147