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

myweb

Среда обитания WEB
Регистрация
10 Сен 2007
Сообщения
545
Реакции
250
есть исходник Для просмотра ссылки Войди или Зарегистрируйся
в строке 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
а как передать ету структуру незнаю.
Кто может помогите, спасибо!
 

NickSan

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

myweb

Среда обитания WEB
Регистрация
10 Сен 2007
Сообщения
545
Реакции
250
ок, давайте по очереди:
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???
 

NickSan

Постоялец
Регистрация
23 Авг 2012
Сообщения
68
Реакции
44
ок, давайте по очереди:
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???

Код:
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

Среда обитания WEB
Регистрация
10 Сен 2007
Сообщения
545
Реакции
250
Код:
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 нехочет работать.
Решение уже где то близко !!!

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

NickSan

Постоялец
Регистрация
23 Авг 2012
Сообщения
68
Реакции
44
значение прилетает у функцию через &g_enumCtx, и уже в функции void *context ет указатель на струкруру g_enumCtx, в которой я прописал idDev.
Нужно по указателю context получить данные но context->idDev нехочет работать.
Решение уже где то близко !!!

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

так будет лучше:
Код:
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 ?
попробуйте собрать конструкцию похожую по контексту в онлайн компиляторе и отточите действия в синтаксисе, думаю все получится Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:

myweb

Среда обитания WEB
Регистрация
10 Сен 2007
Сообщения
545
Реакции
250
я делаю через 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], задача то простая же, только нужно знать с++ :[
 

NickSan

Постоялец
Регистрация
23 Авг 2012
Сообщения
68
Реакции
44
всего то нужно методом с++ получить данные внутри функции usbhidEnumDevices из указателя void *context на структуру g_enumCtx , а именно char idDev[10], задача то простая же, только нужно знать с++ :[
Код:
#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;
}
2018-01-29_1706.png
 
Последнее редактирование:

myweb

Среда обитания WEB
Регистрация
10 Сен 2007
Сообщения
545
Реакции
250
Код:
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 *
 

NickSan

Постоялец
Регистрация
23 Авг 2012
Сообщения
68
Реакции
44
Код:
../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 *
Знаю, поэтому объявил структуру свою "EC"
Код:
static struct EC { char idDev[10] = "005"; } g_enumCtx;

int usbhidEnumDevices(EC *context){
    cout << context->idDev;
}

 
Сверху