2014-08-03 14:52:29 +00:00
/*
Copyright 2012 , 2013 Jun Wako < wakojun @ gmail . com >
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/>.
*/
2014-08-11 06:08:49 +00:00
//#include <stdbool.h>
# include <avr/pgmspace.h>
# include "keymap.h"
# include "keymap_in_eeprom.h"
2014-08-03 14:52:29 +00:00
# include "keymap_common.h"
2014-09-19 03:36:26 +00:00
static uint8_t keymaps_cache [ KEYMAPS_COUNT ] [ MATRIX_ROWS ] [ MATRIX_COLS ] = { 0 } ;
2014-08-18 05:02:46 +00:00
static uint8_t last_layer_number = 1 ;
2014-08-03 14:52:29 +00:00
2014-08-11 06:08:49 +00:00
void keymaps_cache_init ( void )
2014-08-03 14:52:29 +00:00
{
2014-08-11 06:08:49 +00:00
for ( uint8_t layer = 0 ; layer < KEYMAPS_COUNT ; layer + + ) {
2014-08-18 05:02:46 +00:00
uint8_t non_empty_key = 0 ;
2014-08-11 06:08:49 +00:00
for ( uint8_t row = 0 ; row < MATRIX_ROWS ; row + + ) {
for ( uint8_t col = 0 ; col < MATRIX_COLS ; col + + ) {
2014-08-03 14:52:29 +00:00
# ifndef KEYMAP_IN_EEPROM_ENABLE
2014-09-19 03:36:26 +00:00
keymaps_cache [ layer ] [ row ] [ col ] = pgm_read_byte ( & keymaps [ layer ] [ row ] [ col ] ) ;
2014-08-03 14:52:29 +00:00
# else
2014-09-19 03:36:26 +00:00
keymaps_cache [ layer ] [ row ] [ col ] = eeconfig_read_keymap_key ( layer , row , col ) ;
2014-08-03 14:52:29 +00:00
# endif
2014-09-19 03:36:26 +00:00
if ( keymaps_cache [ layer ] [ row ] [ col ] > KC_TRANSPARENT ) {
non_empty_key + + ;
2014-08-18 05:02:46 +00:00
}
2014-08-11 06:08:49 +00:00
}
}
2014-08-18 05:02:46 +00:00
if ( non_empty_key ) {
last_layer_number = layer ;
}
2014-08-11 06:08:49 +00:00
}
}
2014-08-18 05:02:46 +00:00
uint8_t last_layer ( void )
{
return last_layer_number ;
}
2014-08-11 06:08:49 +00:00
/* translates key to keycode */
uint8_t keymap_key_to_keycode ( uint8_t layer , key_t key )
{
return keymaps_cache [ layer ] [ key . row ] [ key . col ] ;
2014-08-03 14:52:29 +00:00
}
/* translates Fn keycode to action */
action_t keymap_fn_to_action ( uint8_t keycode )
{
# ifndef KEYMAP_IN_EEPROM_ENABLE
2014-08-18 05:02:46 +00:00
return ( action_t ) {
2014-08-03 14:52:29 +00:00
. code = pgm_read_word ( & fn_actions [ FN_INDEX ( keycode ) ] )
2014-08-18 05:02:46 +00:00
} ;
2014-08-03 14:52:29 +00:00
# else
2014-09-19 03:36:26 +00:00
return ( action_t ) {
2014-10-02 04:26:09 +00:00
. code = eeconfig_read_keymap_fn_action ( FN_INDEX ( keycode ) )
2014-09-19 03:36:26 +00:00
} ;
2014-08-03 14:52:29 +00:00
# endif
}
# ifdef KEYMAP_IN_EEPROM_ENABLE
const uint8_t * keymaps_pointer ( void ) {
return ( const uint8_t * ) keymaps ;
}
const uint16_t * fn_actions_pointer ( void ) {
return fn_actions ;
}
# endif