usb-relay-hid поправить логику работы [c++]

Тема в разделе "ASM, С/С++, Delphi, Java", создана пользователем myweb, 28 янв 2018.

  1. myweb

    myweb Среда обитания WEB

    Регистр.:
    10 сен 2007
    Сообщения:
    546
    Симпатии:
    246
    есть исходник https://github.com/pavel-a/usb-relay-hid/blob/master/commandline/hiddata_libusb01.c
    в строке 68
    Код:
     for (dev=bus->devices; dev; dev=dev->next) {
    обход Device, но у меня два реле с одинаковым ID но у них разные Device
    Код:
    Bus 004 Device 003: ID 16c0:05df VOTI
    Bus 004 Device 005: ID 16c0:05df VOTI
    и ето не учтено в даном коде, потому я хочу добавить еще проверку dev,
    путем експеремента нашол что 005 и 003 есть в dev->filename
    и нужно сделать
    Код:
    if (dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product && dev->filename == device_from_argv )
    но как передать у функцию usbhidEnumDevices значениэ переменную device_from_argv?
    ... уже в структуру добавил новий параметр
    Код:
    // Data for enumeration func:
    static struct
    {
        USBDEVHANDLE mydev;
        char id[USB_RELAY_ID_STR_LEN * 2];
        char idDev[10];
    } g_enumCtx;
    в main дописал
    Код:
     if ( strncasecmp(arg1, "id=", 3) == 0 ) {
      strncpy(g_enumCtx.id, &arg1[3],5);
    strncpy(g_enumCtx.idDev, &arg1[9],3);
    
    чтоб парсило параметр
    Код:
     hidusb-relay-cmd ID=ABCDE:005 ON 2
    а как передать ету структуру незнаю.
    Кто может помогите, спасибо!
     
  2. NickSan

    NickSan Постоялец

    Регистр.:
    23 авг 2012
    Сообщения:
    69
    Симпатии:
    38
    Тебе нужно обрабатывать device_from_argv в функции usbhidEnumDevices , я правильно понял? пишите пожалуйста без ошибок.
    "ета" слова нет в русском языке
    то что ты дописал проверял? В чем вопрос? Какую структуру и куда?
     
  3. myweb

    myweb Среда обитания WEB

    Регистр.:
    10 сен 2007
    Сообщения:
    546
    Симпатии:
    246
    ок, давайте по очереди:
    1) в структуру static struct { .... } g_enumCtx; я добавил поле char idDev[10];
    2) в main я распарсил входние даные arg и через функцию strncpy(g_enumCtx.idDev, &arg1[9],3); прописал в idDev например 005;
    3) как мне в usbhidEnumDevices получить 005 из g_enumCtx, если смотреть по коду
    Код:
    int usbhidEnumDevices(int vendor, int product,
                          void *context,
                          int (*usbhidEnumFunc)(USBDEVHANDLE usbh, void *ctx))
    то она должна бить в void *context, как обратися к idDev???
     
  4. NickSan

    NickSan Постоялец

    Регистр.:
    23 авг 2012
    Сообщения:
    69
    Симпатии:
    38
    Код:
    int usbhidEnumDevices(int vendor, int product,
                          void *context,
                          int (*usbhidEnumFunc)(USBDEVHANDLE usbh, void *ctx),
                          int DEVID)
    
    main(){
      int TEMP = g_enumCtx.idDev; // 005
      usbhidEnumDevices(... , ... , TEMP );
    }
    или хранить в глобальной переменной, если надо
    или парсить непосредственно в функции.
     
    myweb нравится это.
  5. myweb

    myweb Среда обитания WEB

    Регистр.:
    10 сен 2007
    Сообщения:
    546
    Симпатии:
    246
    Код:
    static USBDEVHANDLE openDevice(void)
    {
        int err;
        err = usbhidEnumDevices(USB_CFG_VENDOR_ID, USB_CFG_DEVICE_ID, &g_enumCtx, enumFunc);
        if ( err || !g_enumCtx.mydev )
        {
            printerr("error finding USB relay: %s\n", usbErrorMessage(err));
            return NULL;
        }
        return g_enumCtx.mydev;
    }
    
    значение прилетает у функцию через &g_enumCtx, и уже в функции void *context ет указатель на струкруру g_enumCtx, в которой я прописал idDev.
    Нужно по указателю context получить данные но context->idDev нехочет работать.
    Решение уже где то близко !!!

    П.С я уже думал сделать так как вы написали но тогда нужно будет править все вызовы функций и тд.
     
  6. NickSan

    NickSan Постоялец

    Регистр.:
    23 авг 2012
    Сообщения:
    69
    Симпатии:
    38
    так будет лучше:
    Код:
    if ( (dev->descriptor.idVendor == vendor) && (dev->descriptor.idProduct == product) && (dev->filename == device_from_argv) )
    Где бибиотека usb.h и в функции вызываются другие

    Код:
    int usbhidEnumDevices(int vendor, int product,
                          void *context,
                          int (*usbhidEnumFunc)(USBDEVHANDLE usbh, void *ctx))
    
    {
        struct usb_bus      *bus;
        struct usb_device   *dev;
        usb_dev_handle      *handle = NULL;
        int                 errorCode = USBHID_ERR_NOTFOUND;
        static int          didUsbInit = 0;
    
        if(!didUsbInit){
            usb_init();
            didUsbInit = 1;
        }
        usb_find_busses();
        usb_find_devices();
    мб usb_device->idDev ?
    попробуйте собрать конструкцию похожую по контексту в онлайн компиляторе и отточите действия в синтаксисе, думаю все получится тык
     
    Последнее редактирование: 29 янв 2018
  7. myweb

    myweb Среда обитания WEB

    Регистр.:
    10 сен 2007
    Сообщения:
    546
    Симпатии:
    246
    я делаю через make, и как загрузить ет в компилятор без понятия.
    Но вернемся к теме, вы предложили попробовать usb_device->idDev но зачем ето уже совсем другая структура с указателем на *dev,
    можете посмотреть внимательней в коде обявлена структура :
    Код:
    // Data for enumeration func:
    static struct
    {
        USBDEVHANDLE mydev;
        char id[USB_RELAY_ID_STR_LEN * 2];
        char idDev[10];
    } g_enumCtx;
    она передается в функцию &g_enumCtx
    Код:
    usbhidEnumDevices(USB_CFG_VENDOR_ID, USB_CFG_DEVICE_ID, &g_enumCtx, enumFunc);
    всего то нужно методом с++ получить данные внутри функции usbhidEnumDevices из указателя void *context на структуру g_enumCtx , а именно char idDev[10], задача то простая же, только нужно знать с++ :[
     
  8. NickSan

    NickSan Постоялец

    Регистр.:
    23 авг 2012
    Сообщения:
    69
    Симпатии:
    38
    Код:
    #include <iostream>
    using namespace std;
    
    static struct EC { char idDev[10] = "005"; } g_enumCtx;
    
    int usbhidEnumDevices(EC *context){
        cout << context->idDev;
    }
    int main()
    {
        usbhidEnumDevices(&g_enumCtx);
        return 0;
    }
    [​IMG]
     
    Последнее редактирование: 29 янв 2018
    myweb нравится это.
  9. myweb

    myweb Среда обитания WEB

    Регистр.:
    10 сен 2007
    Сообщения:
    546
    Симпатии:
    246
    Код:
    int usbhidEnumDevices(int vendor, int product,
                          void *context,
                          int (*usbhidEnumFunc)(USBDEVHANDLE usbh, void *ctx))
    
    {
        struct usb_bus      *bus;
        struct usb_device   *dev;
        usb_dev_handle      *handle = NULL;
        int                 errorCode = USBHID_ERR_NOTFOUND;
        static int          didUsbInit = 0;
    
         printf("! %s !",context->idDev);
    ....
    
    Код:
    ../hiddata_libusb01.c: In function 'usbhidEnumDevices':
    ../hiddata_libusb01.c:68:29: warning: dereferencing 'void *' pointer [enabled by default]
    ../hiddata_libusb01.c:68:29: error: request for member 'idDev' in something not a structure or union make: *** [hiddata_libusb01.o] Error 1
    
    тут какойто прикол с void *
     
  10. NickSan

    NickSan Постоялец

    Регистр.:
    23 авг 2012
    Сообщения:
    69
    Симпатии:
    38
    Знаю, поэтому объявил структуру свою "EC"