quinta-feira, 24 de agosto de 2023

Controle Liga/Desliga para CAPS, NUM e SCROLL

- A ideia é usar uma placa de teclado USB como interface alternativa para se criar 3 chaves liga/desliga controladas via computador.

- Segue abaixo um tutorial de produção do programa e o código fonte.

- Passo a passo para implementar e testar o código que permite ligar e desligar os LEDs Caps Lock, Num Lock e Scroll Lock usando um teclado padrão no Linux.

Passo 1: Instalar Dependências

Garanta que as dependências corretas estejam instaladas. O pacote libevdev-dev é necessário para acessar os LEDs via sysfs.

Para instalar o pacote libevdev-dev no Ubuntu, você pode usar o seguinte comando:

bash
sudo apt update sudo apt install libevdev-dev

Passo 2: Criar o Código

Crie um novo arquivo de código-fonte chamado ligadesliga_leds.c e cole o código C fornecido anteriormente no arquivo.

Passo 3: Compilar o Código

Abra um terminal e navegue até o diretório onde você criou o arquivo ligadesliga_leds.c. Em seguida, execute o seguinte comando para compilar o código:

bash
sudo gcc -o ligadesliga_leds ligadesliga_leds.c -levdev

Isso compilará o código e gerará um executável chamado ligadesliga_leds.

Passo 4: Executar o Programa

Agora, você pode executar o programa usando o comando sudo para garantir que tenha as permissões necessárias para acessar os LEDs:

bash
sudo ./ligadesliga_leds

Passo 5: Testar o Programa

Após executar o programa, ele exibirá instruções no terminal. Pressione as teclas 'c', 'n' ou 's' para alternar o brilho dos LEDs Caps Lock, Num Lock e Scroll Lock, respectivamente. Pressione 'x' para sair do programa.

Lembre-se de que a capacidade de controlar os LEDs Caps Lock, Num Lock e Scroll Lock depende do seu hardware e do suporte do sistema operacional. Pode haver variações entre sistemas e distribuições Linux.

 

CÓDIGO FONTE DO PROGRAMA

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

#define CAPSLOCK_PATH "/sys/class/leds/input4::capslock/brightness"
#define NUMLOCK_PATH "/sys/class/leds/input4::numlock/brightness"
#define SCROLLLOCK_PATH "/sys/class/leds/input4::scrolllock/brightness"

int main() {
    struct termios old_settings, new_settings;
    char input;

    tcgetattr(STDIN_FILENO, &old_settings);
    new_settings = old_settings;
    new_settings.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &new_settings);

    printf("Pressione 'c' para alternar o LED Caps Lock.\n");
    printf("Pressione 'n' para alternar o LED Num Lock.\n");
    printf("Pressione 's' para alternar o LED Scroll Lock.\n");
    printf("Pressione 'x' para sair.\n");

    while (1) {
        input = getchar();
        if (input == 'x') {
            break;
        } else if (input == 'c') {
            FILE* capslock_file = fopen(CAPSLOCK_PATH, "r+");
            if (capslock_file) {
                char value;
                fscanf(capslock_file, "%c", &value);
                fseek(capslock_file, 0, SEEK_SET);
                fprintf(capslock_file, "%c", (value == '0') ? '1' : '0');
                fclose(capslock_file);
            }
        } else if (input == 'n') {
            FILE* numlock_file = fopen(NUMLOCK_PATH, "r+");
            if (numlock_file) {
                char value;
                fscanf(numlock_file, "%c", &value);
                fseek(numlock_file, 0, SEEK_SET);
                fprintf(numlock_file, "%c", (value == '0') ? '1' : '0');
                fclose(numlock_file);
            }
        } else if (input == 's') {
            FILE* scrolllock_file = fopen(SCROLLLOCK_PATH, "r+");
            if (scrolllock_file) {
                char value;
                fscanf(scrolllock_file, "%c", &value);
                fseek(scrolllock_file, 0, SEEK_SET);
                fprintf(scrolllock_file, "%c", (value == '0') ? '1' : '0');
                fclose(scrolllock_file);
            }
        }
    }

    tcsetattr(STDIN_FILENO, TCSANOW, &old_settings);
    return 0;
}

 

Nenhum comentário:

Postar um comentário