New component for keyboards and panels.

More
04 Mar 2021 08:40 #201000 by Aciera

When I compile and build the docs locally the - comes out correctly,

www.bodgesoc.org/sendkeys.1.html


Yes, that works.

So does it depend on the machine the docs are built on? This would seem to make more sense. It's just that I got the impression that the "remote" docs worked for you on your machine but not for me on any of mine.

Please Log in or Create an account to join the conversation.

More
04 Mar 2021 08:59 #201003 by andypugh
I am starting to suspect the new style-sheet which makes the manpages look nice, but might be making them look _too_ nice.

Please Log in or Create an account to join the conversation.

More
15 Jul 2021 10:55 - 15 Jul 2021 10:57 #214837 by nkp
machine LCNC 2.7
ubuntu 12.04
sudo halcompile --install sendkeys.c



/tmp/tmp7Iyg9c/sendkeys.c:22:20: fatal error: unistd.h:No such file or directory
 #include <unistd.h>
                    ^
compilation terminated.


Why can't I install it in the version 2.7? 
nkp@nkp-desktop:~$ locate unistd.h /home/nkp/arduino-1.8.4/hardware/tools/avr/avr/include/unistd.h /usr/include/unistd.h /usr/include/asm-generic/unistd.h /usr/include/i386-linux-gnu/asm/unistd.h /usr/include/i386-linux-gnu/bits/unistd.h /usr/include/i386-linux-gnu/sys/unistd.h /usr/include/linux/unistd.h /usr/include/tcl8.5/tcl-private/compat/unistd.h /usr/include/tcl8.5/tk-private/compat/unistd.h /usr/include/xenomai/posix/unistd.h /usr/lib/syslinux/com32/include/unistd.h /usr/src/linux-headers-3.13.0-117/arch/alpha/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/alpha/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/arc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/arm/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/arm/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/arm64/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/arm64/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/avr32/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/avr32/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/blackfin/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/blackfin/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/c6x/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/cris/include/arch-v10/arch/unistd.h /usr/src/linux-headers-3.13.0-117/arch/cris/include/arch-v32/arch/unistd.h /usr/src/linux-headers-3.13.0-117/arch/cris/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/cris/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/frv/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/frv/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/hexagon/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/ia64/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/ia64/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/m32r/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/m32r/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/m68k/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/m68k/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/metag/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/metag/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/microblaze/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/microblaze/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/mips/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/mips/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/mn10300/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/mn10300/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/openrisc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/parisc/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/parisc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/powerpc/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/powerpc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/s390/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/s390/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/score/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/sh/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/sh/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/sparc/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/sparc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/tile/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/tile/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/unicore32/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/x86/include/asm/ia32_unistd.h /usr/src/linux-headers-3.13.0-117/arch/x86/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/x86/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/xtensa/include/asm/unistd.h /usr/src/linux-headers-3.13.0-117/arch/xtensa/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-117/include/asm-generic/unistd.h /usr/src/linux-headers-3.13.0-117/include/uapi/asm-generic/unistd.h /usr/src/linux-headers-3.13.0-117/include/uapi/linux/unistd.h /usr/src/linux-headers-3.13.0-32/arch/alpha/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/alpha/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/arc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/arm/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/arm/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/arm64/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/arm64/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/avr32/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/avr32/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/blackfin/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/blackfin/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/c6x/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/cris/include/arch-v10/arch/unistd.h /usr/src/linux-headers-3.13.0-32/arch/cris/include/arch-v32/arch/unistd.h /usr/src/linux-headers-3.13.0-32/arch/cris/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/cris/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/frv/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/frv/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/hexagon/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/ia64/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/ia64/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/m32r/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/m32r/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/m68k/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/m68k/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/metag/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/metag/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/microblaze/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/microblaze/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/mips/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/mips/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/mn10300/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/mn10300/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/openrisc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/parisc/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/parisc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/powerpc/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/powerpc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/s390/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/s390/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/score/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/sh/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/sh/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/sparc/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/sparc/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/tile/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/tile/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/unicore32/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/x86/include/asm/ia32_unistd.h /usr/src/linux-headers-3.13.0-32/arch/x86/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/x86/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/xtensa/include/asm/unistd.h /usr/src/linux-headers-3.13.0-32/arch/xtensa/include/uapi/asm/unistd.h /usr/src/linux-headers-3.13.0-32/include/asm-generic/unistd.h /usr/src/linux-headers-3.13.0-32/include/uapi/asm-generic/unistd.h /usr/src/linux-headers-3.13.0-32/include/uapi/linux/unistd.h /usr/src/linux-headers-3.4-9-common-rtai/arch/x86/include/asm/ia32_unistd.h /usr/src/linux-headers-3.4-9-common-rtai/arch/x86/include/asm/unistd.h /usr/src/linux-headers-3.4-9-common-rtai/include/asm-generic/unistd.h /usr/src/linux-headers-3.4-9-common-rtai/include/linux/unistd.h
Last edit: 15 Jul 2021 10:57 by nkp.

Please Log in or Create an account to join the conversation.

More
19 Jul 2021 13:30 #215323 by andypugh
I don't know why unistd isn't including. It's been part of Linux for ever, as far as I know.

Does is work with <asm/unistd.h> ?

Please Log in or Create an account to join the conversation.

More
20 Jul 2021 10:20 - 20 Jul 2021 10:21 #215395 by nkp
#include "rtapi.h"
#include "hal.h"
#include <linux/uinput.h>
#include <asm/unistd.h>
#include <asm/fcntl.h>


#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME 12
now does not see these files:
#include <string.h>
#include <stdio.h>
#include <stdlib.h> 
 
Last edit: 20 Jul 2021 10:21 by nkp.

Please Log in or Create an account to join the conversation.

More
20 Jul 2021 10:41 #215399 by andypugh
Do you have the headers for the actual kernel you are running?

uname -a then look in /usr/src for a match.

Please Log in or Create an account to join the conversation.

More
20 Jul 2021 10:59 #215400 by nkp
I have installed Debian10 (lcnc 2.8)
tried making a switch for a button with two values
//
//   Copyright (C) 2021 Andy Pugh
//
//   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, write to the Free Software
//   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
//

#include "rtapi.h"
#include "hal.h"
#include <linux/uinput.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME 12

static int comp_id;

typedef struct{
    hal_u32_t *keycode;
    hal_s32_t *current_event;
    hal_bit_t *toggle;
    hal_bit_t *init;
    hal_bit_t **trigger;
    hal_u32_t *event;
} sendkeys_hal;

typedef struct {
    int num_codes;
    int num_togglecodes;
    int num_events;
    int num_triggers;
    bool inited;
    int fd;
    bool *prev;
    hal_u32_t oldcode;
} sendkeys_param;

typedef struct {
    sendkeys_hal *hal;
    sendkeys_param *param;
    int num_insts;
} sendkeys ;

static sendkeys *me;

void emit(int fd, int type, int code, int val)
{
   struct input_event ie;

   ie.type = type;
   ie.code = code;
   ie.value = val;
   write(fd, &ie, sizeof(ie));
}

static void exit_handler(int sig) {
    printf("sendkeys: exiting\n");
    exit(0);
}

static void call_hal_exit(void) {
    hal_exit(comp_id);
}

int init(int argc, char* argv[]){
    int *codes;
    int *pins;
    int i, j;
    comp_id = hal_init("sendkeys");
    if (comp_id < 0) {
        rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys: ERROR: hal_init() failed\n");
        return -1;
    }

    me = hal_malloc(sizeof(sendkeys));
    codes = malloc(sizeof(int));
    pins = malloc(sizeof(int));
    // This is all because RTAPI_MP_ARRAY_** macros do not appear to work in usersapce
    for (i = 1; i < argc; i++){
        static int index = -1;
        static int type = -1;
        int ptr = 0;
        bool toggle = 0;
        if (strncmp(argv[i], "config=", 7) == 0) type = 1, ptr = 6;
        if (strncmp(argv[i], "names=", 6) == 0) type = 2, ptr = 5;
        switch (type) {
        case 1: // config
            while (argv[i][ptr]){
                switch (argv[i][ptr]){
                case '=':
                case ' ':
                case ',':
                    index++;
                    codes = realloc(codes, (index + 1) * sizeof(int));
                    pins = realloc(pins, (index + 1) * sizeof(int));
                    codes[index] = 0;
                    pins[index] = 0;
                    toggle = 0;
                    break;
                case 's':
                case 'S':
                    toggle = 0;
                    break;
                case 't':
                case 'T':
                    toggle = 1;
                    break;
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                    if (toggle){
                    pins[index] = pins[index] * 10 + argv[i][ptr] - '0';
                    } else {
                    codes[index] = codes[index] * 10 + argv[i][ptr] - '0';
                    }
                    break;
                }
                ptr++;;
            }
            me->num_insts = index + 1;
            break;
        case 2: //  Parsing of "names" would be here, but is not enabled yet
            while (argv[i][ptr]){
                ptr++;
            }
            break;
        }
    }
    me->hal = (sendkeys_hal*)hal_malloc(me->num_insts * sizeof(sendkeys_hal));
    me->param = malloc(me->num_insts * sizeof(sendkeys_param));
    for (i = 0; i < me->num_insts; i++){
        sendkeys_hal* hal = &(me->hal[i]);
        sendkeys_param* param = &(me->param[i]);
        if (hal_pin_u32_newf(HAL_IN, &(hal->keycode), comp_id,
        "sendkeys.%i.keycode", i) < 0) {
        rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.keycode error\n");
        return -ENOMEM;}
        if (hal_pin_s32_newf(HAL_OUT, &(hal->current_event), comp_id,
        "sendkeys.%i.current-event", i) < 0) {
        rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.current-event error\n");
        return -ENOMEM;}
        if (hal_pin_bit_newf(HAL_IN, &(hal->init), comp_id,
        "sendkeys.%i.init", i) < 0) {
        rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.init error\n");
        return -ENOMEM;}

        if (hal_pin_bit_newf(HAL_IN, &(hal->toggle), comp_id,
        "sendkeys.%i.toggle", i) < 0) {
        rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.toggle error\n");
        return -ENOMEM;}

        // event params
        rtapi_print_msg(RTAPI_MSG_DBG, "instance %i events %i triggers %i\n", i, codes[i], pins[i]);
        param->num_triggers = pins[i];
        param->num_codes = codes[i];
        param->num_events = codes[i] + pins[i];
        hal->event = hal_malloc(param->num_events  * sizeof(hal_u32_t*));
        for (j = 0; j < param->num_codes; j++){
            if (hal_param_u32_newf(HAL_RW, &(hal->event[j]), comp_id,
                    "sendkeys.%i.scan-event-%02i", i, j) < 0) {
                rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.scan-event-%02i error\n", j);
                return -ENOMEM;}
        }
        for (j = 0; j < param->num_triggers; j++){
            if (hal_param_u32_newf(HAL_RW, &(hal->event[j + param->num_codes]), comp_id,
                    "sendkeys.%i.pin-event-%02i", i, j) < 0) {
                rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.pin-event-%02i error\n", j);
                return -ENOMEM;}
        }



        for (j = 0; j < param->num_triggers; j++){
            if (hal_param_u32_newf(HAL_RW, &(hal->event[j + param->num_togglecodes]), comp_id,
                    "sendkeys.%i.togglepin-event-%02i", i, j) < 0) {
                rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.togglepin-event-%02i error\n", j);
                return -ENOMEM;}
        }





        // trigger pins
        hal->trigger = hal_malloc(param->num_triggers * sizeof(hal_bit_t*));
        param->prev = malloc(param->num_triggers * sizeof(hal_bit_t));
        for (j = 0; j < param->num_triggers; j++){
            if (hal_pin_bit_newf(HAL_IN, &(hal->trigger[j]), comp_id,
                    "sendkeys.%i.trigger-%02i", i, j) < 0) {
                rtapi_print_msg(RTAPI_MSG_ERR, "sendkeys.N.trigger-%02i error\n",j);
                return -ENOMEM;}
            param->prev[j] = 0;
        }
    }
    return 0;
}

int main(int argc, char* argv[]) {
    struct uinput_user_dev uidev;
    int i, j;
    
    signal(SIGINT, exit_handler);
    signal(SIGTERM, exit_handler);
    atexit(call_hal_exit);

    //parse configs and create pins
    init(argc, argv);
    hal_ready(comp_id);
    
    while (1) {
        for (i = 0; i < me->num_insts; i++){
            sendkeys_hal* hal = &(me->hal[i]);
            sendkeys_param* param = &(me->param[i]);
            if ((*hal->keycode & 0xC0) == 0x80){
                *hal->current_event = (*hal->keycode & 0x3f);
            } else {
                *hal->current_event = -1;
            }
            // The event codes are written to pins in HAL after the
            // component is loaded.
            // We need to set up the keyboard based on the events selected
            // so there is a secondary init here.
            if (! *hal->init) continue;
            if (*hal->init && ! param->inited) {
                param->fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
                if (param->fd < 0) rtapi_print_msg(RTAPI_MSG_ERR,
                    "Cannot open /dev/uinput. Suggest chmod 666 /dev/uinput\n");
                ioctl(param->fd, UI_SET_EVBIT, EV_KEY);
                for (j = 0; j < param->num_events; j++){
                    if (hal->event[j] > 0 && hal->event[j] < KEY_MAX){
                        ioctl(param->fd, UI_SET_KEYBIT, hal->event[j]);
                        rtapi_print("SET_EVBIT %i\n", hal->event[j]);
                    }
                }
                memset(&uidev, 0, sizeof(uidev));
                strcpy(uidev.name, "linuxcnc-hal");
                uidev.id.bustype = BUS_USB;
                uidev.id.vendor  = 0x1;
                uidev.id.product = 0x1;
                uidev.id.version = 1;

                write(param->fd, &uidev, sizeof(uidev));
                ioctl(param->fd, UI_DEV_CREATE);
                param->inited = 1;
            }
            if (*hal->keycode != param->oldcode) {
                /* Key press, report the event, send key release, and report again*/
                if ((*hal->keycode & 0x3F) > param->num_events) continue;
                if (hal->event[*hal->keycode & 0x3F] == 0) continue;
                if ((*hal->keycode & 0xC0) == 0xC0){ // keydown
                    emit(param->fd, EV_KEY, hal->event[*hal->keycode & 0x3F], 1);
                    emit(param->fd, EV_SYN, SYN_REPORT, 0);
                } else if ((*hal->keycode & 0xC0) == 0x80){ // keyup
                    emit(param->fd, EV_KEY, hal->event[*hal->keycode & 0x3F], 0);
                    emit(param->fd, EV_SYN, SYN_REPORT, 0);
                }
                param->oldcode = *hal->keycode;
            }
            for (j = 0; j < param->num_triggers; j++){
                if (param->prev[j] != *hal->trigger[j]){
                    if (*hal->trigger[j]){ // keydown
                        if (*hal->toggle){
                          emit(param->fd, EV_KEY, hal->event[param->num_togglecodes + j], 1);
                          emit(param->fd, EV_SYN, SYN_REPORT, 0);
                        } else {
                          emit(param->fd, EV_KEY, hal->event[param->num_codes + j], 1);
                          emit(param->fd, EV_SYN, SYN_REPORT, 0);
                     }
                    } else { // keyup
                        if (*hal->toggle){
                          emit(param->fd, EV_KEY, hal->event[param->num_togglecodes + j], 0);
                          emit(param->fd, EV_SYN, SYN_REPORT, 0);
                        } else {
                          emit(param->fd, EV_KEY, hal->event[param->num_codes + j], 0);
                          emit(param->fd, EV_SYN, SYN_REPORT, 0);
                     }
                    }
                    param->prev[j] = *hal->trigger[j];
                }
            }
        }
    }
}

Please Log in or Create an account to join the conversation.

More
20 Jul 2021 11:03 #215401 by andypugh

Please Log in or Create an account to join the conversation.

More
20 Jul 2021 12:33 #215408 by nkp
 
if the button can have two meanings 
Attachments:

Please Log in or Create an account to join the conversation.

More
20 Jul 2021 13:19 #215412 by andypugh
Probably..

How do you plan to select the alternate function?

Please Log in or Create an account to join the conversation.

Time to create page: 0.195 seconds
Powered by Kunena Forum