$ make | $ make | ||||
Debuging | |||||
-------- | |||||
Debug print is on if 4 keys are pressed during booting. | |||||
Use PJRC's hid_listen.exe to see debug messages. | |||||
AVR Target board | AVR Target board | ||||
---------------- | ---------------- | ||||
Teensy/Teensy++ | Teensy/Teensy++ | ||||
will be coded when bouncing occurs. | will be coded when bouncing occurs. | ||||
bouncing doesnt occur on my ALPS switch so far. | bouncing doesnt occur on my ALPS switch so far. | ||||
scan rate is too slow?(to be measure) | scan rate is too slow?(to be measure) | ||||
layer switch | |||||
layer switching | |||||
time before switching | time before switching | ||||
timeout when not used during specific time | timeout when not used during specific time | ||||
debug on/off | |||||
Fn key conbination during normal operation | |||||
matrix print on/off | |||||
key print on/off | |||||
mouse print on/off | |||||
Trackpoint(PS/2) | Trackpoint(PS/2) | ||||
receive PS/2 signal from TrackPoint | receive PS/2 signal from TrackPoint | ||||
2010/10/23 | 2010/10/23 | ||||
souce code cleaning | souce code cleaning | ||||
2010/10/23 | 2010/10/23 | ||||
debug on/off | |||||
debug off by default | |||||
pressing keys during booting | |||||
2010/10/23 | |||||
EOF | EOF |
static bool matrix_has_ghost_in_row(int row); | static bool matrix_has_ghost_in_row(int row); | ||||
static int bit_pop(uint8_t bits); | |||||
inline | inline | ||||
} | } | ||||
bool matrix_is_modified(void) { | bool matrix_is_modified(void) { | ||||
for (int i=0; i <MATRIX_ROWS; i++) { | |||||
for (int i = 0; i < MATRIX_ROWS; i++) { | |||||
if (matrix[i] != matrix_prev[i]) | if (matrix[i] != matrix_prev[i]) | ||||
return true; | return true; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
int matrix_key_count(void) { | |||||
int count = 0; | |||||
for (int i = 0; i < MATRIX_ROWS; i++) { | |||||
count += bit_pop(~matrix[i]); | |||||
} | |||||
return count; | |||||
} | |||||
inline | inline | ||||
static bool matrix_has_ghost_in_row(int row) { | static bool matrix_has_ghost_in_row(int row) { | ||||
return false; | return false; | ||||
} | } | ||||
static int bit_pop(uint8_t bits) { | |||||
int c; | |||||
for (c = 0; bits; c++) | |||||
bits &= bits -1; | |||||
return c; | |||||
} |
#define MOUSE_DELAY_ACC 5 | #define MOUSE_DELAY_ACC 5 | ||||
// TODO: refactoring | |||||
void proc_matrix(void) { | void proc_matrix(void) { | ||||
static int mouse_repeat = 0; | static int mouse_repeat = 0; | ||||
#include <avr/pgmspace.h> | #include <avr/pgmspace.h> | ||||
#include "print.h" | #include "print.h" | ||||
bool print_enable = false; | |||||
void print_P(const char *s) | void print_P(const char *s) | ||||
{ | { | ||||
if (!print_enable) return; | |||||
char c; | char c; | ||||
while (1) { | while (1) { | ||||
void phex1(unsigned char c) | void phex1(unsigned char c) | ||||
{ | { | ||||
if (!print_enable) return; | |||||
usb_debug_putchar(c + ((c < 10) ? '0' : 'A' - 10)); | usb_debug_putchar(c + ((c < 10) ? '0' : 'A' - 10)); | ||||
} | } | ||||
void phex(unsigned char c) | void phex(unsigned char c) | ||||
{ | { | ||||
if (!print_enable) return; | |||||
phex1(c >> 4); | phex1(c >> 4); | ||||
phex1(c & 15); | phex1(c & 15); | ||||
} | } | ||||
void phex16(unsigned int i) | void phex16(unsigned int i) | ||||
{ | { | ||||
if (!print_enable) return; | |||||
phex(i >> 8); | phex(i >> 8); | ||||
phex(i); | phex(i); | ||||
} | } | ||||
void pbin(unsigned char c) | void pbin(unsigned char c) | ||||
{ | { | ||||
if (!print_enable) return; | |||||
for (int i = 7; i >= 0; i--) { | for (int i = 7; i >= 0; i--) { | ||||
usb_debug_putchar((c & (1<<i)) ? '1' : '0'); | usb_debug_putchar((c & (1<<i)) ? '1' : '0'); | ||||
} | } | ||||
void pbin_reverse(unsigned char c) | void pbin_reverse(unsigned char c) | ||||
{ | { | ||||
if (!print_enable) return; | |||||
for (int i = 0; i < 8; i++) { | for (int i = 0; i < 8; i++) { | ||||
usb_debug_putchar((c & (1<<i)) ? '1' : '0'); | usb_debug_putchar((c & (1<<i)) ? '1' : '0'); | ||||
} | } |
#ifndef PRINT_H__ | #ifndef PRINT_H__ | ||||
#define PRINT_H__ 1 | #define PRINT_H__ 1 | ||||
#include <stdbool.h> | |||||
#include <avr/pgmspace.h> | #include <avr/pgmspace.h> | ||||
#include "usb_debug.h" | #include "usb_debug.h" | ||||
bool print_enable; | |||||
// this macro allows you to write print("some text") and | // this macro allows you to write print("some text") and | ||||
// the string is automatically placed into flash memory :) | // the string is automatically placed into flash memory :) | ||||
#define print(s) print_P(PSTR(s)) | #define print(s) print_P(PSTR(s)) |
usb_init(); | usb_init(); | ||||
while (!usb_configured()) /* wait */ ; | while (!usb_configured()) /* wait */ ; | ||||
// Wait an extra second for the PC's operating system to load drivers | |||||
// and do whatever it does to actually be ready for input | |||||
// needs such long time in my PC. | |||||
/* wait for debug print. no need for normal use */ | |||||
for (int i =0; i < 6; i++) { | |||||
LED_CONFIG; | |||||
LED_ON; | |||||
_delay_ms(500); | |||||
LED_OFF; | |||||
_delay_ms(500); | |||||
} | |||||
// Configure timer 0 to generate a timer overflow interrupt every | // Configure timer 0 to generate a timer overflow interrupt every | ||||
// 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock | // 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock | ||||
// This demonstrates how to use interrupts to implement a simple | // This demonstrates how to use interrupts to implement a simple | ||||
matrix_init(); | matrix_init(); | ||||
matrix_scan(); | |||||
// debug on when 4 keys are pressed | |||||
if (matrix_key_count() == 4) print_enable = true; | |||||
/* wait for debug pipe to print greetings. */ | |||||
if (print_enable) { | |||||
for (int i =0; i < 6; i++) { | |||||
LED_CONFIG; | |||||
LED_ON; | |||||
_delay_ms(500); | |||||
LED_OFF; | |||||
_delay_ms(500); | |||||
} | |||||
} | |||||
print("\nt.m.k. keyboard 1.2\n"); | print("\nt.m.k. keyboard 1.2\n"); | ||||
while (1) { | while (1) { | ||||
proc_matrix(); | proc_matrix(); |