opensteno_qmk/users/csc027/csc027.c
csc027 1b8cb95f2e [Keymap] csc027/macro-sync-keymap (#7873)
* Basic functionality to synchronize the strings and enums using C preprocessor macros.

* Updated all the custom convenience macros to work.

* Removed some duplicate update_tri_layer calls.

* Simplified the convenience accelerator macros for synchronizing enums and strings by removing the short enum names.

* Updated the CUSTOM_MACROS macro to use SS_LCTL instead of SS_LCTRL.

* Fixed a bug where the right side of the convenience layer in the Iris keymap was incorrectly listed twice.

* Removed the tenkey from the convenience layer.  Added Windows 10 virtual desktop shortcuts to the convenience layer.

* Fixed a bug where the macro range was not set correctly.

* Added sigil values for the keycode enum so that additions to the sync macros will not require changes to the process_record_user ranges.

* Hacked send_string_P to work with ChibiOS boards.

* Switched to using I2C for the Iris keyboard.

* Finished a comment.

* Updated comments to explain that for non-AVR MCUs, the PROGMEM macro doesn't do anything.

* Updated the synchronization macros to use the more descriptive "NAME" instead of "CALL".  Moved the Control-Alt-Delete chord macro to the  synchronization macro.

* Simplified the custom macros by consolidating the macros into a context change macro instead of using alt-tab and minimize macros.

* Fixed a formatting issue where several tabs were used instead of 4 spaces.

* Added more comments to explain the synchronization macros.

* Simplified the PARAMS macro, since any parameters could be passed with a space by the declarer instead.

* Consolidated the synchronization macros into a single list.  Simplified the synchronization mechanism.

* Removed the overloading macro, since it is no longer needed.

* Updated the convenience layer comments to reflect the changes made.

* Renamed the git_macros pointer table to custom_macros, since it no longer solely consists of git macros.

* Clarified that the send_string_P function's use of pgm_read_byte is different for AVR and non-AVR compilation targets.
2020-01-13 09:41:13 -08:00

53 lines
2 KiB
C

#include "csc027.h"
// Declare the strings in PROGMEM using the convenience macro
CUSTOM_MACROS(CUSTOM_DEF, CUSTOM_MACRO_STRING, SEMI_DELIM);
static const char* const custom_macros[] PROGMEM = {
// Declare the pointer to the strings in PROGMEM
CUSTOM_MACROS(CUSTOM_VAR, DROP, COMMA_DELIM)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
case LOWER:
if(record->event.pressed) {
layer_on(_LW);
} else {
layer_off(_LW);
}
update_tri_layer(_LW, _RS, _MS);
return false;
case RAISE:
if(record->event.pressed) {
layer_on(_RS);
} else {
layer_off(_RS);
}
update_tri_layer(_LW, _RS, _MS);
return false;
case (MC_first + 1)...(MC_last - 1):
if(record->event.pressed) {
send_string_P(
#if defined(__AVR__)
// The accessor here first reads from the pointer array that is located
// in PROGMEM. The pointer is taken and passed to the send_string_P
// function, which is aware of the difference between RAM and PROGMEM
// pointers.
(char*)pgm_read_word(&custom_macros[keycode - MC_first - 1])
#else
// For non-AVR MCUs, the PROGMEM macro is defined as nothing. So, the strings are
// declared in RAM instead of flash. The send_string_P function, when compiled for
// non-AVR targets, uses a different definition of pgm_read_byte internally. This
// definition uses RAM pointers instead. This is why the raw pointer is passed for
// non-AVR MCUs.
custom_macros[keycode - MC_first - 1]
#endif
);
return true;
}
return false;
default:
return true;
}
}