TMK Help/Question

Alectardy98

05 Jan 2021, 04:15

I am trying to figure out the inner workings of TMK. Right Now I have made my num lock led light up when toggled into layer 1, and it seems to work fine... well except when I press the caps lock key. Then the num lock light turns off even though the layer is still active. In order to get the light back on I need to press num lock again twice (turning off the layer and turning it back on again)

What is wrong with my code?

Code: Select all

bool my_led_status = 0;

hook_layer_change(uint32_t layer_state)
{

    if (layer_state & (1L<<1)) {
            // LED is off, so let's turn it on
            led_set(host_keyboard_leds() | (1<<USB_LED_NUM_LOCK));
            my_led_status = 1;
     } else {
            // LED is on, so let's turn it off
            led_set(host_keyboard_leds() & ~(1<<USB_LED_NUM_LOCK));
            my_led_status = 0;
     }
    
}

cakeanalytics

05 Jan 2021, 17:23

Nothing wrong with your code AFAICT, however, it's possible that the handler for the lock keys are resetting the indicator light status.
Maybe do a project wide search for led_set ?
Also is NumLock your layer toggle key?

Alectardy98

05 Jan 2021, 19:00

here is my full code

Code: Select all

#include "unimap_trans.h"
#include "timer.h"
#include "led.h"

#define IS_LAYER_ON(NumLock)

#define AC_FN1 ACTION_MACRO(1)                          //Desktop Right
#define AC_FN2 ACTION_MACRO(2)                          //Desktop Left
#define AC_FN3 ACTION_MACRO(3)                          //New Explorer On Windows
#define AC_FN4 ACTION_MACRO(4)                          //Snip Tool Windows
#define AC_FN5 ACTION_MACRO(5)                          //V-Desktop Up
#define AC_FN6 ACTION_MACRO(6)                          //Min All
#define AC_FN7 ACTION_MACRO(7)                          //Paste
#define AC_FN8 ACTION_MACRO(8)                          //Copy All
#define AC_FN9 ACTION_MACRO(9)                          //Task Manager
#define AC_FN11 ACTION_MACRO(11)                        //Double Zero

#define AC_FN0 ACTION_LAYER_TAP_KEY(2, KC_APPLICATION)  //Hold Toggle For Layer 1
#define AC_FN10 ACTION_LAYER_TOGGLE(1)                  //Toggle NumLock


bool my_led_status = 0;
hook_layer_change(uint32_t layer_state)
{

    if (layer_state & (1L<<1)) {
            // LED is off, so let's turn it on
            led_set(host_keyboard_leds() | (1<<USB_LED_NUM_LOCK));
            my_led_status = 1;
     } else {
            // LED is on, so let's turn it off
            led_set(host_keyboard_leds() & ~(1<<USB_LED_NUM_LOCK));
            my_led_status = 0;
     }
    
}


const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    switch (id) {
        case 1:                 //Desktop Right
            return (record->event.pressed ?
                    MACRO( I(0), D(LGUI), D(LCTL), T(RGHT), U(LGUI), U(LCTL), END ) :
                    MACRO_NONE );
        case 2:                 //Desktop Left
            return (record->event.pressed ?
                    MACRO( I(0), D(LGUI), D(LCTL), T(LEFT), U(LGUI), U(LCTL), END ) :
                    MACRO_NONE );
        case 3:                 //New Explorer
            return (record->event.pressed ?
                    MACRO( I(0), D(LGUI), D(E), U(LGUI), U(E), END ) :
                    MACRO_NONE );
        case 4:                 //Snip Tool
            return (record->event.pressed ?
                    MACRO( I(0), D(LGUI), D(LSFT), T(S), U(LGUI), U(LSFT), END ) :
                    MACRO_NONE );
        case 5:                 //V-Desktop Up
            return (record->event.pressed ?
                    MACRO( I(0), D(LGUI), T(TAB), U(LGUI), END ) :
                    MACRO_NONE );
        case 6:                 //Min All
            return (record->event.pressed ?
                    MACRO( I(0), D(LGUI), T(D), U(LGUI), END ) :
                    MACRO_NONE );
        case 7:                 // Paste
            return (record->event.pressed ?
                    MACRO( I(0), T(F2), D(LCTL), T(V), U(LCTL), END ) :
                    MACRO_NONE );
        case 8:                 //Copy All
            return (record->event.pressed ?
                    MACRO( I(0), T(F2), D(LCTL), T(A), T(C), U(LCTL), END ) :
                    MACRO_NONE );
        case 9:                 //Task Manager
            return (record->event.pressed ?
                    MACRO( I(0), D(LSFT), D(LCTL), T(ESC), U(LSFT), U(LCTL), END ) :
                    MACRO_NONE );
        case 11:                 //Double Zero
            return (record->event.pressed ?
                    MACRO( I(0), T(P0), T(P0), END ) :
                    MACRO_NONE );
        
    }
    return MACRO_NONE;
}





#ifdef KEYMAP_SECTION_ENABLE
const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
#else
const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
#endif
    UNIMAP(
              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
    DEL,       ESC, FN9, F23, F24, FN8, FN7, FN4, FN3, FN2, FN1,TRNS,TRNS,           SLCK,FN10,TRNS,         TRNS,TRNS,TRNS,
    GRV,    1,   2,   3,   4,   5,   6,   7,   8,   9,   0,MINS, EQL,TRNS,BSPC,       FN0,TRNS,TRNS,    CAPS,TRNS,PPLS,PMNS,
    TAB,    Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,LBRC,RBRC,     BSLS,      TRNS,TRNS,TRNS,     INS,HOME,PGUP,PENT,
    LGUI,   A,   S,   D,   F,   G,   H,   J,   K,   L,SCLN,QUOT,     LEFT, ENT,                          DEL, END,PGDN,TRNS,
    LSFT,TRNS,   Z,   X,   C,   V,   B,   N,   M,COMM, DOT,SLSH,     TRNS,RSFT,           TRNS,           NO,  UP,  NO,TRNS,
    LCTL,LGUI,LALT,TRNS,           SPC,          TRNS, FN0,TRNS,TRNS,BSLS,TRNS,      TRNS,TRNS,TRNS,         DOWN,RGHT,TRNS
    ),
    UNIMAP(
              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
    TRNS,     TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,          TRNS,TRNS,TRNS,         TRNS,TRNS,TRNS,
    TRNS,   1,   2,   3,   4,   5,   6,   7,   8,   9,   0,MINS, EQL,TRNS,TRNS,     TRNS,TRNS,TRNS,    TRNS,TRNS,TRNS,TRNS,
    TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,     TRNS,TRNS,TRNS,       7,   8,   9,TRNS,
    TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,        0,TRNS,                           4,   5,   6,TRNS,
    TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,          TRNS,            1,   2,   3,TRNS,
    TRNS,TRNS,TRNS,TRNS,          TRNS,          TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,TRNS,         FN11,PDOT,TRNS
    ),
    UNIMAP(
              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
    TRNS,     TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,          TRNS,TRNS,TRNS,         TRNS,TRNS,TRNS,
    TRNS, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,TRNS,TRNS,     TRNS,TRNS,TRNS,    TRNS,TRNS,TRNS,TRNS,
    TRNS,TRNS,TRNS,FN3 ,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,     TRNS,TRNS,TRNS,    TRNS,TRNS,TRNS,TRNS,
    TRNS,TRNS,FN4 ,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     MPRV,TRNS,                        TRNS,TRNS,TRNS,TRNS,
    TRNS,TRNS,TRNS,TRNS,FN8 ,FN7 ,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,          TRNS,          MPLY,VOLU,MPLY,TRNS,
    TRNS,TRNS,TRNS,TRNS,          TRNS,          TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,TRNS,          VOLD,MNXT,TRNS
    ),
};


Alectardy98

05 Jan 2021, 19:34

I Think what I have to do is disassociate the Num Lock led from the AT scan, so the num lock would no longer trigger the light
I think when the caps lock key is pressed, it checks to see what toggles are set pc side and changes the leds accordingly, which turns off my fake num lock light

Alectardy98

05 Jan 2021, 22:29

This almost works, but the caps lock will triger the num lock and the caps lock led on first press and only the first press, otherwise, it works as it should

Code: Select all

bool my_led_status = 1;

hook_layer_change(uint32_t layer_state)
{
    if (my_led_status);

        if (layer_state & (1L<<1)) {
            // LED is off, so let's turn it on
            led_set(host_keyboard_leds() | (1<<USB_LED_NUM_LOCK));
            my_led_status = 1;
        } else {
            // LED is on, so let's turn it off
            led_set(host_keyboard_leds() & ~(1<<USB_LED_NUM_LOCK));
            my_led_status = 0;
            
     }
    
}

hook_keyboard_leds_change(uint8_t led_status)
{
    if (my_led_status)
            {
                // LED is on, so let's turn it off
                led_set(host_keyboard_leds() | (1<<USB_LED_NUM_LOCK));
            }
            else
            {
                // LED is off, so let's turn it on
                led_set(host_keyboard_leds() & ~(1<<USB_LED_NUM_LOCK));            }
        }
    

Alectardy98

06 Jan 2021, 00:31

I was able to make it work, although It is most likely very messy, I am new to working in C

Code: Select all

bool my_led_status = 1;

hook_layer_change(uint32_t layer_state)
{
    if (my_led_status);

        if (layer_state & (1L<<1)) {
            // LED is off, so let's turn it on
            led_set(host_keyboard_leds() | (1<<USB_LED_NUM_LOCK));
            my_led_status = 1;
        } else {
            // LED is on, so let's turn it off
            led_set(host_keyboard_leds() & ~(1<<USB_LED_NUM_LOCK));
            my_led_status = 0;
            
     }
    
}


hook_keyboard_leds_change(uint8_t led_status)
{
    if (my_led_status)
            {
                // LED is off, so let's turn it on
                led_set(host_keyboard_leds() | (1<<USB_LED_NUM_LOCK));
                my_led_status = 1;
            }
            else
            {
                // LED is on, so let's turn it off
                led_set(host_keyboard_leds() & ~(1<<USB_LED_NUM_LOCK));
                my_led_status = 0;
            }
        }
    
hook_late_init(void)
{
if (my_led_status)

    {
        led_set(host_keyboard_leds() & ~(1<<USB_LED_NUM_LOCK));
        my_led_status = 0;
    }
}

Post Reply

Return to “Keyboards”