The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Как правильно собрать программу для Debian (Raspbian, DimNsk (ok), 28-Дек-13, (0) [смотреть все] +1

Сообщения [Сортировка по времени | RSS]


2. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 29-Дек-13, 02:19 
Если вы имели ввиду, как для Debian/Raspbian сделать deb-пакет, то есть разные способы, простые (для себя) и сложные (если хотите добавить свой пакет в репозиторий Debian).

Самый простой способ: использовать утилиту "checkinstall" вместо команды "make install".
1. Добавить install правило в ваш Makefile:


PREFIX ?= /usr/local
APP = bmcontrol

install:
    install -m 0755 $(APP) $(PREFIX)/bin

2. Выполнить команду "make".
3. Запустить утилиту "sudo checkinstall" и ответить на вопросы. Или можно как то так:


checkinstall --pkgname=bmcontrol --install=no --default
sudo dpkg -i bmcontrol*.deb

Ответить | Правка | Наверх | Cообщить модератору

3. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от DimNskemail (ok), 29-Дек-13, 20:38 
>[оверквотинг удален]
> install:
>  install -m 0755 $(APP) $(PREFIX)/bin
>
> 2. Выполнить команду "make".
> 3. Запустить утилиту "sudo checkinstall" и ответить на вопросы. Или можно как
> то так:
>
 
> checkinstall --pkgname=bmcontrol --install=no --default
> sudo dpkg -i bmcontrol*.deb
>

Все решилось сборкой и установкой библиотеки  libusb-0.1-12
после этого файл bmcontrol собрался без ошибок
Все спасибо

Ответить | Правка | Наверх | Cообщить модератору

4. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 30-Дек-13, 00:45 
> после этого файл bmcontrol собрался без ошибок

А в курсе, чё будет с этим кодом, если gcc сказать -O2 и больше?


void USB_PAUSE(unsigned long long MS)
{   //  MS - задержка в милисекундах блокирует всё
    for (unsigned long long i=0; i<MS * USB_PAUSE_CONST; i++);
}

правильно, он превратиться в:

void USB_PAUSE(void)
{
  return;
}

если прям так уверены, что 50000 циклов сравнения и сложения прим. равны 1 мс,
то надо volatile писать.


void USB_PAUSE(unsigned long long MS)
{
    for (unsigned long long volatile i=0; i < (MS * USB_PAUSE_CONST); i++);
}

Ответить | Правка | Наверх | Cообщить модератору

5. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 30-Дек-13, 04:26 
> если прям так уверены, что 50000 циклов сравнения и сложения прим. равны
> 1 мс,
> то надо volatile писать.

Ну а если совсем по уму, то так:

1. Если можно использовать неблокирующее ожидание (по сути планировщик будет выполнять другие процессы, пока ожидание не закончится, т.е. как если бы мы делали sched_yield()):


#include <time.h>

void sleep_nonblocking(unsigned int msecs)
{
    struct timespec req;

    req.tv_sec = msecs / 1000;
    req.tv_nsec = (msecs - req.tv_sec * 1000) * 1000000;

    if (nanosleep(&req, NULL) == -1) {
        perror("Error occurred while sleeping");
        exit(EXIT_FAILURE);
    }
}


2. Если нужно обязательно блокирующее ожидание (как у вас сейчас сделано):


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

#define CLOCKS_PER_MSEC (CLOCKS_PER_SEC / 1000)

void sleep_blocking(unsigned int msecs)
{
    clock_t goal;

    goal = msecs * CLOCKS_PER_MSEC + clock();
    while (goal > clock());
}


При этом для обоих случаев можно компилировать с "-O2" и не нужно использовать volatile.

Подробнее почитать про эти вызовы можно в "man 2 nanosleep" и в "man 3 clock" (должен быть установлен пакет manpages-dev).

Да, и еще, на всякий пожарный: код с "nanosleep()" нельзя компилировать с опцией "-ansi". Подробности в /usr/include/features.h.

Что касается портируемости: вот например как сделали в VLC:

Linux:
http://git.videolan.org/?p=vlc.git;a=blob;f=src/posix/thread...

Windows:
http://git.videolan.org/?p=vlc.git;a=blob;f=src/win32/thread...

Ответить | Правка | Наверх | Cообщить модератору

7. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 30-Дек-13, 05:22 
> void sleep_nonblocking(unsigned int msecs)
> void sleep_blocking(unsigned int msecs)

Вот только с названиями я погорячился: для этих функций уже есть хорошие названия:

sleep_nonblocking() -> msleep()
sleep_blocking() -> mdelay()

Ответить | Правка | Наверх | Cообщить модератору

8. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 30-Дек-13, 21:44 
> Ну а если совсем по уму, то так:

Плоха сделал, давай ищо! Нужна через asm("rdtsc"..), с коррекцией, нормализацией таймера,
реалтаймом, и  barrier() не забудь, а то мало ли чо, мож кэш плохой.  

Ответить | Правка | К родителю #5 | Наверх | Cообщить модератору

9. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от DimNskemail (ok), 30-Дек-13, 23:01 
>> Ну а если совсем по уму, то так:
> Плоха сделал, давай ищо! Нужна через asm("rdtsc"..), с коррекцией, нормализацией таймера,
> реалтаймом, и  barrier() не забудь, а то мало ли чо, мож
> кэш плохой.

однако :)

Ответить | Правка | Наверх | Cообщить модератору

10. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 31-Дек-13, 01:02 
>> Ну а если совсем по уму, то так:
> Плоха сделал, давай ищо! Нужна через asm("rdtsc"..), с коррекцией, нормализацией таймера,
> реалтаймом, и  barrier() не забудь, а то мало ли чо, мож
> кэш плохой.

Вам когда-нибудь говорили, какой вы умный и какая у вас тонкая ирония? :)

Ответить | Правка | К родителю #8 | Наверх | Cообщить модератору

11. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 31-Дек-13, 04:11 
> Вам когда-нибудь говорили, какой вы умный и какая у вас тонкая ирония? :)

Сам тащусь :)
С наступающим Новым Годом!

Ответить | Правка | Наверх | Cообщить модератору

12. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 31-Дек-13, 06:51 
>> Вам когда-нибудь говорили, какой вы умный и какая у вас тонкая ирония? :)
> Сам тащусь :)
> С наступающим Новым Годом!

и вас по тому же месту! :)

Ответить | Правка | Наверх | Cообщить модератору

13. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от DimNskemail (ok), 31-Дек-13, 07:44 
>>> Вам когда-нибудь говорили, какой вы умный и какая у вас тонкая ирония? :)
>> Сам тащусь :)
>> С наступающим Новым Годом!
> и вас по тому же месту! :)

Продолжаем...

Функция GET_TEMPERATURE выдает ошибку:

Вот код функции

bool GET_TEMPERATURE(unsigned long long ROM, float &T)
{
    if ( DEBUG ) printf("[D] enter GET_TEMPERATURE\n");
    unsigned long long CRC;
    unsigned long L1, L2;
    unsigned char L3;
    unsigned char FAMILY=ROM&0xFF;
    bool RESULT=false;
    unsigned char N=3;
    while (!RESULT&((N--)>0))
        if (MATCH_ROM(ROM))
            if (OW_WRITE_BYTE(0xBE))
                    if (OW_READ_4BYTE(L1))
                        if (OW_READ_4BYTE(L2))
                            if (OW_READ_BYTE(L3))
                            {
                                if ( DEBUG ) printf("[D] L1=%lx\tL2=%lx\tL3=%hhx\n", L1, L2, L3);
                                CRC=0;
                                for (int i=0; i<4; i++) CRC=CRC8(CRC, (L1>>(i*8))&0xFF);
                                if ( DEBUG ) printf("[D] CRC=%llx\n", CRC);
                                for (int i=0; i<4; i++) CRC=CRC8(CRC, (L2>>(i*8))&0xFF);
                                if ( DEBUG ) printf("[D] CRC=%llx\n", CRC);
                                CRC=CRC8(CRC, L3);
                                if ( DEBUG ) printf("[D] CRC=%llx\n", CRC);
                                RESULT=CRC==0;
                                short K=L1&0xFFFF;
                                //  DS18B20 +10.125=00A2h, -10.125=FF5Eh
                                //  DS18S20 +25.0=0032h, -25.0=FFCEh
                                //  K=0x0032;
                                T=1000;     //  for unknow FAMILY - no sensor exists
                                if ((FAMILY==0x28)|(FAMILY==0x22)) T=K*0.0625;  //  DS18B20 | DS1822
                                if (FAMILY==0x10) T=K*0.5;                      //  DS18S20 | DS1820
                                if ( DEBUG ) printf("[D] ~T=%f\n", T);
                            } else printf("[!] !OW_READ_BYTE(L3) \n");
                        else printf("[!] !OW_READ_4BYTE(L2) \n");
                    else printf("[!] !OW_READ_4BYTE(L1) \n");
                else printf("[!] !OW_WRITE_BYTE(0xBE) \n");
        else printf("[!] !MATCH_ROM(ROM) \n");
    if (!RESULT) printf("[!] Error GET_TEMPERATURE\n");
    return RESULT;
}


вот вывод  DEBUG

#  /root/mp707/bmcontrol scan

temp_id1 = 8300000483000004
temp_id2 = 40000034000003


# /root/mp707/bmcontrol temp 40000034000003
[D] enter GET_TEMPERATURE
[D] L1=ffffffff L2=ffffffff     L3=ff
[D] CRC=8d
[D] CRC=c9
[D] CRC=63
[D] ~T=1000.000000
[D] L1=ffffffff L2=ffffffff     L3=ff
[D] CRC=8d
[D] CRC=c9
[D] CRC=63
[D] ~T=1000.000000
[D] L1=ffffffff L2=ffffffff     L3=ff
[D] CRC=8d
[D] CRC=c9
[D] CRC=63
[D] ~T=1000.000000
[!] Error GET_TEMPERATURE


Что не так?

Ответить | Правка | Наверх | Cообщить модератору

14. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 31-Дек-13, 14:54 
> Что не так?

Переменная RESULT должна быть не нулевой при выходе из функции, а для этого CRC8(L3) должен быть нулем. У вас же CRC8(L3) равен 63. Очевидно, L3 некорректный (он равен ff). Да и L1, L2 тоже странные, ffffffff. И это response на команду 0xbe, для DS18B20 это "Read Scratchpad". Не похоже на корректные значения датчика. А id датчиков правильные? Либо вы неправильно программу используете, либо девайс ваш накрылся. Ну или прога кривая.

Ответить | Правка | Наверх | Cообщить модератору

15. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от DimNskemail (ok), 31-Дек-13, 15:26 
>> Что не так?
> Переменная RESULT должна быть не нулевой при выходе из функции, а для
> этого CRC8(L3) должен быть нулем. У вас же CRC8(L3) равен 63.
> Очевидно, L3 некорректный (он равен ff). Да и L1, L2 тоже
> странные, ffffffff. И это response на команду 0xbe, для DS18B20 это
> "Read Scratchpad". Не похоже на корректные значения датчика. А id датчиков
> правильные? Либо вы неправильно программу используете, либо девайс ваш накрылся. Ну
> или прога кривая.

Девайс работает и Датчики исправные  только что проверил в Win.

Насчет id датчиков  
есть подозрения что они не правильно определяются

в Win
это
83000004BFC35D28
0400000334EDDD28

а BMcontrol в Raspbian
определяет их как
8300000483000004
40000034000003


Ответить | Правка | Наверх | Cообщить модератору

17. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 01:26 
>[оверквотинг удален]
> Насчет id датчиков
> есть подозрения что они не правильно определяются
> в Win
> это
> 83000004BFC35D28
> 0400000334EDDD28
> а BMcontrol в Raspbian
> определяет их как
> 8300000483000004
> 40000034000003

Кажется, в Linux неправильно работает считывание. Заметьте, в Linux каждые 4 байта (32 бита) повторяются, например 0x83000004, а дальше опять тоже самое. Скорее всего, прога ваша глючная и не протестированная.

Ответить | Правка | Наверх | Cообщить модератору

18. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 01:48 
>[оверквотинг удален]
>> это
>> 83000004BFC35D28
>> 0400000334EDDD28
>> а BMcontrol в Raspbian
>> определяет их как
>> 8300000483000004
>> 40000034000003
> Кажется, в Linux неправильно работает считывание. Заметьте, в Linux каждые 4 байта
> (32 бита) повторяются, например 0x83000004, а дальше опять тоже самое. Скорее
> всего, прога ваша глючная и не протестированная.

Знаете, у меня есть подозрение, что как раз функция задержки у вас не выполняет свою задачу. Попробуйте заменить у себя эту функцию:


void USB_PAUSE(unsigned long long MS)
{   //  MS - задержка в милисекундах
    //  блокирует всё
    for (unsigned long long i=0; i<MS*USB_PAUSE_CONST; i++);
}


на эту:


void USB_PAUSE(unsigned int msecs)
{
    clock_t goal;

    goal = msecs * CLOCKS_PER_MSEC + clock();
    while (goal > clock());
}


а в самый верх программы добавьте это:


#include <time.h>
#include <stdlib.h>

#define CLOCKS_PER_MSEC (CLOCKS_PER_SEC / 1000)


Не удивлюсь, если после этого заработает. А автору программы надо руки пообрывать.

Ответить | Правка | К родителю #17 | Наверх | Cообщить модератору

19. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 02:03 
>[оверквотинг удален]
> Насчет id датчиков
> есть подозрения что они не правильно определяются
> в Win
> это
> 83000004BFC35D28
> 0400000334EDDD28
> а BMcontrol в Raspbian
> определяет их как
> 8300000483000004
> 40000034000003

Вот репозиторий с вашей программой, там более новая версия (1.1): https://code.google.com/p/bmcontrol/  . Попробуйте оттуда собрать, может сходу заработает. У вас по идее старая версия (1.0) отсюда: http://devphp.org.ua/?menu=scripts&sub=&sshow=5

Еще думаю вам будет интересно почитать вот это (и комментарии ниже): https://plus.google.com/+SergeyShpikin/posts/PYWwMJB6Wv3


Вот еще парочка интересных ссылок по MP707:

http://www.masterkit.ru/forum/viewtopic.php?t=1370&postdays=...

http://www.sinava.ru/MP707.php

http://habrahabr.ru/post/164399/

http://blog-i.ru/umniy-dom-versiya-2-0/temperaturniy-kontrol...


Ответить | Правка | Наверх | Cообщить модератору

20. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 02:06 
Ссылка на репозиторий плохо вставилась, вот правильная: https://code.google.com/p/bmcontrol/
Ответить | Правка | К родителю #19 | Наверх | Cообщить модератору

21. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 02:35 
> Вот репозиторий с вашей программой, там более новая версия (1.1): https://code.google.com/p/bmcontrol/

А еще лучше используйте мою версию отсюда: https://code.google.com/r/joeskb7-bmcontrol/

Ответить | Правка | К родителю #19 | Наверх | Cообщить модератору

23. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 02-Янв-14, 17:47 
>> Вот репозиторий с вашей программой, там более новая версия (1.1): https://code.google.com/p/bmcontrol/
> А еще лучше используйте мою версию отсюда: https://code.google.com/r/joeskb7-bmcontrol/

Нефеншуй! :-P

RESULT = usb_control_msg(lvr_winusb, 0xA1, 0x01, 0x300, 0, (char *)USB_BUFI, 0x8, timeout);

Нада

#include <linux/usb.h>

RESULT = usb_control_msg(lvr_winusb, 0xA1, 0x01, 0x300, 0, (char *)USB_BUFI, 0x8, USB_CTRL_SET_TIMEOUT);

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

24. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 18:12 
>>> Вот репозиторий с вашей программой, там более новая версия (1.1): https://code.google.com/p/bmcontrol/
>> А еще лучше используйте мою версию отсюда: https://code.google.com/r/joeskb7-bmcontrol/
> Нефеншуй! :-P
> RESULT = usb_control_msg(lvr_winusb, 0xA1, 0x01, 0x300, 0, (char *)USB_BUFI, 0x8, timeout);
> Нада
> #include <linux/usb.h>
> RESULT = usb_control_msg(lvr_winusb, 0xA1, 0x01, 0x300, 0, (char *)USB_BUFI, 0x8, USB_CTRL_SET_TIMEOUT);

Во-первых для юзерспейса (в /usr/include) нет хедера linux/usb.h, это только для ядра. Во-вторых, под вендой (в MinGW) уж точно такого нет, а я пытался сделать чтобы всё стало кросс-платформенно.

Ответить | Правка | К родителю #23 | Наверх | Cообщить модератору

25. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 02-Янв-14, 18:30 
Кстати, после каждого usb_control_msg() нужно 20 мс. таймаут ставить.
Если после записи сразу попытаешься считать.
Примерно из 100 раз одно значение будет неверное.
Можешь тестовый брутфорс на флешке устроить.

libusb ваще корявое угэ.

Ответить | Правка | К родителю #24 | Наверх | Cообщить модератору

26. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 20:40 
> Кстати, после каждого usb_control_msg() нужно 20 мс. таймаут ставить.
> Если после записи сразу попытаешься считать.
> Примерно из 100 раз одно значение будет неверное.
> Можешь тестовый брутфорс на флешке устроить.
> libusb ваще корявое угэ.

Т.е. в каждый вызов usb_control_msg() нужно передавать в качестве timeout не менее 20 мс? А где можно почитать об этом баге? И не знаете, был ли он исправлен в libusb-1.0 (по отношению к 0.1)?

Я просто никогда с libusb не работал, поэтому ничего не знаю про него, а по поводу моих фиксов -- они относятся к коду bmcontrol вообще, а не к работе с libusb.

Ответить | Правка | К родителю #25 | Наверх | Cообщить модератору

27. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 02-Янв-14, 22:34 
>  А где можно почитать об этом баге? был ли он исправлен в libusb-1.0 (по отношению к 0.1)?

Я уж и не вспомню, года 3 не работал с libusb.
Погугли на тему: libusb timer error
Они ж там для задержек используют таймеры вместо *sleep()/*delay(), вот чёй-то там накосячили.

Ответить | Правка | К родителю #26 | Наверх | Cообщить модератору

28. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 03-Янв-14, 05:14 
А, ещё косяк вспомнил: после освобождения драйвера прибора usb_detach_kernel_driver_np()
драйвер особо и не освобождался, в моём случае это был uvcvideo.ko
Второй раз подключится к нему нельзя было. Если драйвер в виде модуля,
то спасало rmmod/insmod, а если монолитом, только ребут.
  

Ответить | Правка | К родителю #27 | Наверх | Cообщить модератору

29. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 04-Янв-14, 16:06 
> Т.е. в каждый вызов usb_control_msg() нужно передавать в качестве timeout не менее 20 мс?

Не-не-не, туда по стандарту - USB_CTRL_SET_TIMEOUT. Я имел ввиду после.

ret = usb_control_msg();
usleep(20);
if ( ret < 0 )
   ля-ля-ля ...error;


Ответить | Правка | К родителю #26 | Наверх | Cообщить модератору

30. "Как правильно собрать программу для Debian (Raspbian"  +1 +/
Сообщение от skb7 (ok), 04-Янв-14, 20:03 
>> Т.е. в каждый вызов usb_control_msg() нужно передавать в качестве timeout не менее 20 мс?
> Не-не-не, туда по стандарту - USB_CTRL_SET_TIMEOUT. Я имел ввиду после.
> ret = usb_control_msg();
> usleep(20);
> if ( ret < 0 )
>    ля-ля-ля ...error;

Сделал: https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

31. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от DimNskemail (ok), 04-Янв-14, 20:16 
>>> Т.е. в каждый вызов usb_control_msg() нужно передавать в качестве timeout не менее 20 мс?
>> Не-не-не, туда по стандарту - USB_CTRL_SET_TIMEOUT. Я имел ввиду после.
>> ret = usb_control_msg();
>> usleep(20);
>> if ( ret < 0 )
>>    ля-ля-ля ...error;
> Сделал: https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Собрал. Работает!
Ваша версия: сканирование проходит дольше чем сборка для OpenWRT,
а вот опрос датчиков быстрее раза в два.

Ответить | Правка | К родителю #30 | Наверх | Cообщить модератору

32. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 04-Янв-14, 20:30 
>>>> Т.е. в каждый вызов usb_control_msg() нужно передавать в качестве timeout не менее 20 мс?
>>> Не-не-не, туда по стандарту - USB_CTRL_SET_TIMEOUT. Я имел ввиду после.
>>> ret = usb_control_msg();
>>> usleep(20);
>>> if ( ret < 0 )
>>>    ля-ля-ля ...error;
>> Сделал: https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...
> Собрал. Работает!
> Ваша версия: сканирование проходит дольше чем сборка для OpenWRT,
> а вот опрос датчиков быстрее раза в два.

Сборка под OpenWRT -- вот эта https://github.com/bubbafix/openwrt-bm1707/blob/master/packa...? Я дорабатывал оригинальную версию, про другие переделки ничего не могу сказать. Надеюсь, автор получил моё письмо и затянет изменения к себе в mainline.

Ответить | Правка | К родителю #31 | Наверх | Cообщить модератору

34. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 05-Янв-14, 00:04 
>[оверквотинг удален]
>>>> if ( ret < 0 )
>>>>    ля-ля-ля ...error;
>>> Сделал: https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...
>> Собрал. Работает!
>> Ваша версия: сканирование проходит дольше чем сборка для OpenWRT,
>> а вот опрос датчиков быстрее раза в два.
> Сборка под OpenWRT -- вот эта https://github.com/bubbafix/openwrt-bm1707/blob/master/packa...
>  ? Я дорабатывал оригинальную версию, про другие переделки ничего не
> могу сказать. Надеюсь, автор получил моё письмо и затянет изменения к
> себе в mainline.


diff -ru a/main.c b/main.c
--- a/main.c    1979-12-31 00:00:00.000000000 +0300
+++ b/main.c    2014-01-05 00:08:35.859593000 +0400
@@ -370,10 +370,10 @@
     D2=(B>>16)&0xFF;
     D3=(B>>24)&0xFF;
     USB_BUF_CLEAR();
-    USB_BUFO[0]=0x18;    USB_BUFO[1]=0x84;    USB_BUFO[2]=B&0xFF;
-    USB_BUFO[3]=(B>>8)&0xFF;
-    USB_BUFO[4]=(B>>16)&0xFF;
-    USB_BUFO[5]=(B>>24)&0xFF;
+    USB_BUFO[0]=0x18;    USB_BUFO[1]=0x84;    USB_BUFO[2]=D0;
+    USB_BUFO[3]=D1;
+    USB_BUFO[4]=D2;
+    USB_BUFO[5]=D3;
     if (USB_SET_FEATURE())
         {
         USB_PAUSE(2);
@@ -414,13 +414,11 @@
{    bool RESULT=false;
     unsigned char N=ONEWIRE_REPEAT;
     unsigned char BIT;
-    bool CL[64];
+    bool CL[64]= {false}; // array of false :)
     int i;
     uint64_t RL[64];
     uint64_t B1=1, CRC, ROM;

-    for (i=0; i<64; i++) CL[i]=false;
-
     while (!RESULT && N--)
         {
         ROM=0;

Ответить | Правка | К родителю #32 | Наверх | Cообщить модератору

35. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от Andrey Mitrofanov (?), 05-Янв-14, 00:18 
> @@ -414,13 +414,11 @@
>  {    bool RESULT=false;
>      unsigned char N=ONEWIRE_REPEAT;
>      unsigned char BIT;
> -    bool CL[64];
> +    bool CL[64]= {false}; // array of false :)
> -    for (i=0; i<64; i++) CL[i]=false;
> -

Ну, я понял бы, заменил бы memset-ом, но ведь инициализация переменной в стеке будет сделана компилятором тем же циклом.   ...  Или это такой хитрый способ  исполнить именно memset "руками" компилера?

Ответить | Правка | К родителю #34 | Наверх | Cообщить модератору

38. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 05-Янв-14, 05:40 
> Или это такой хитрый способ  исполнить именно memset "руками" компилера?

Ага.


mov      $0x0,%eax        ; чем заполняем, в EAX
mov      $0x20,%edx       ; длина - 32 или 0x20  (32 WORD или 64 BYTE)
mov      %ebx,%edi        ; указатель на начало в EDI
mov      %edx,%ecx        ; длину в ECX  
rep stos %eax,%es:(%edi)  ; повторять запись по адресу указанному в (ES:EDI) значением в EAX, пока ECX не будет равен 0  
sub      $0xffffff80,%esp ; новый указатель  

На x86_64 оно за 10 повторов обнулит, даже если у тя тип будет unsigned char или short.
Поэтому типы меньше int на x64 практически бесполезны.  

Это обычный цикл

из-за операции сравнения (i < 64) получим цикл loop 64 раза.


    jg     out
    mov    0xc(%esp),%eax
loop:
    mov    0xc(%esp),%eax
    inc    %eax
    mov    %eax,0xc(%esp)
    mov    0xc(%esp),%eax
    cmp    $0x3f,%eax
    jle    loop
out:
    add    $0x10,%esp

---
Так что, чтоб лишний раз не дёргать glibc. Конечно есть __builtin_memset,
но он всё равно тормознутее и не портабельно, а эта фича STD C99
Ответить | Правка | К родителю #35 | Наверх | Cообщить модератору

36. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 05-Янв-14, 03:27 
>
 
> diff -ru a/main.c b/main.c
>

https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Авторство сохранено.

Ответить | Правка | К родителю #34 | Наверх | Cообщить модератору

43. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 06-Янв-14, 21:20 
>...


diff -ur a/main.c b/main.c
--- a/main.c    1979-12-31 00:00:00.000000000 +0300
+++ b/main.c    2014-01-06 21:19:23.107679000 +0400
@@ -11,8 +11,11 @@
#include <string.h>
#include <stdint.h>
#include <time.h>
+#include <stdbool.h>

+#ifndef bool
typedef enum { false, true } bool;
+#endif

#define VERSION "1.1.1"
#define VENDOR_ID 0x16c0

Ответить | Правка | К родителю #36 | Наверх | Cообщить модератору

44. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 08-Янв-14, 03:30 
>[оверквотинг удален]
>  #include <string.h>
>  #include <stdint.h>
>  #include <time.h>
> +#include <stdbool.h>
> +#ifndef bool
>  typedef enum { false, true } bool;
> +#endif
>  #define VERSION "1.1.1"
>  #define VENDOR_ID 0x16c0
>

Сделал так: https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Ответить | Правка | К родителю #43 | Наверх | Cообщить модератору

45. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 08-Янв-14, 04:39 
> Сделал так: https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Заодно для пущей портабельности вот такую штуку сделал: https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Ответить | Правка | К родителю #44 | Наверх | Cообщить модератору

33. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 04-Янв-14, 22:38 
>>> Т.е. в каждый вызов usb_control_msg() нужно передавать в качестве timeout не менее 20 мс?
>> Не-не-не, туда по стандарту - USB_CTRL_SET_TIMEOUT. Я имел ввиду после.
>> ret = usb_control_msg();
>> usleep(20);
>> if ( ret < 0 )
>>    ля-ля-ля ...error;
> Сделал:

Ага, оно самое.  

Там бы знаешь ещё что, - понять что за константы в функции usb_control_msg()

эта GET // from device
usb_control_msg(lvr_winusb, 0xA1, 0x01, 0x300, 0, (char *)USB_BUFI, 0x8, timeout);

эта SET // to device
usb_control_msg(lvr_winusb, 0x21, 0x09, 0x300, 0, (char *)USB_BUFO, 0x8, timeout);

Я так думаю, что:

0xA1 - (USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN) /* (0x01 << 5) | 0x01 | 0x80 */
0x21 - (USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT) /* (0x01 << 5) | 0x01 | 0x00 */

0x01 - это по-моему запрос .... скорее всего CLEAR_FEATURE
0x09 - тута видимо SET_CONFIGURATION  

0x8 - это sizeof(USB_BUFI) и sizeof(USB_BUFO)  // размер буфера
0 - смещение он начала буфера.

0x300 - это типа сколько байт будет передано. Видимо афтор оригинала тоже где-то скопипастил код. :)


Ответить | Правка | К родителю #30 | Наверх | Cообщить модератору

37. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 05-Янв-14, 03:41 
> Там бы знаешь ещё что, - понять что за константы в функции usb_control_msg()

Как говорится, good point. Только я по незнанию немного подвис на этом этапе. Но вроде разобрался. Ниже результаты.


> 0xA1 - (USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN) /* (0x01 << 5) | 0x01 | 0x80 */
> 0x21 - (USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT) /* (0x01 << 5) | 0x01 | 0x00 */

Верно, только в include/usb.h нет USB_DIR_*, там USB_ENDPOINT_* взамен.


> 0x01 - это по-моему запрос .... скорее всего CLEAR_FEATURE
> 0x09 - тута видимо SET_CONFIGURATION

Думаю это скорее вот что:


/*
* HID class requests
*/
#define HID_REQ_GET_REPORT 0x01
#define HID_REQ_SET_REPORT 0x09

украдено отсюда: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux....


> 0x300 - это типа сколько байт будет передано

Мне кажется, это вот что: если взять вот эту спеку: http://www.usb.org/developers/devclass_docs/HID1_11.pdf ...есть на этой странице http://www.usb.org/developers/hidpage/ )

и посмотреть на главу "7.2.1 Get_Report Request", там в Remarks написано вот что:


The wValue field specifies the Report Type in the high byte and the Report
ID in the low byte. Set Report ID to 0 (zero) if Report IDs are not used.

Report Type is specified as follows:
Value   Report Type
01      Input
02      Output
03      Feature
04-FF   Reserved

Так что 0x0300 это просто Report Type = Feature (0x03 в верхем байте), при том что Report ID = 0, т.е. Report IDs не используются.

Короче вот мой полный коммит:
https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Ответить | Правка | К родителю #33 | Наверх | Cообщить модератору

39. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 05-Янв-14, 06:23 
> Думаю это скорее вот что:
>
 
> /*
>  * HID class requests
>  */
> #define HID_REQ_GET_REPORT 0x01
> #define HID_REQ_SET_REPORT 0x09
>

А эта приблуда HID девайс? =-о

Ответить | Правка | К родителю #37 | Наверх | Cообщить модератору

40. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 05-Янв-14, 07:40 
>> Думаю это скорее вот что:
>>
 
>> /*
>>  * HID class requests
>>  */
>> #define HID_REQ_GET_REPORT 0x01
>> #define HID_REQ_SET_REPORT 0x09
>>

> А эта приблуда HID девайс? =-о

Всё указывает на это. А что?

Суть девайса: контроллер ATTiny, который с одной стороны умеет общаться с PC по USB, а с другой стороны выступает в качестве хоста сенсоров, т.е. коллектит данные сенсоров, которые висят на 1-wire шине (температурные датчики ds1820). Даём команды с компа через эту тулзовину на контроллер (по USB) и получаем выхлоп -- температуру датчиков, их ID и т.д. По идее логично такой девайс сделать HID.

Ответить | Правка | К родителю #39 | Наверх | Cообщить модератору

41. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 05-Янв-14, 08:25 
>> А эта приблуда HID девайс? =-о
> Всё указывает на это. А что?

Отсюда http://ru.wikipedia.org/wiki/USB_HID :


Другие устройства

...

Этим стали массово пользоваться, и появилось огромное количество устройств, которые, по сути, интерфейсами взаимодействия с человеком не являются. Например, *термометр*, ..... Любое устройство может принадлежать к USB HID классу, если оно удовлетворяет логическим спецификациям HID Consumer Control.

Так что имеем USB HID термометр :)

Подобного добра уже было наделано много, в чём можно убедиться нагуглив по запросу "USB HID thermometer ATTiny45 DS18B20".

В прошивке они обычно юзают вот эту софтварную (bitbang) реализацию USB: http://www.obdev.at/products/vusb/index.html

Даже общие рекомендации есть: https://github.com/eldavido/cp-hidkeys/blob/master/Readme.txt

Ответить | Правка | К родителю #40 | Наверх | Cообщить модератору

42. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 05-Янв-14, 18:42 
>>> Думаю это скорее вот что:
>>>
 
>>> /*
>>>  * HID class requests
>>>  */
>>> #define HID_REQ_GET_REPORT 0x01
>>> #define HID_REQ_SET_REPORT 0x09
>>>

>> А эта приблуда HID девайс? =-о
> Всё указывает на это. А что?

Да это так, условности. HID, Audio, COM,...

USB делятся всего на 4 типа, по режиму передачи: Изохронные, Управляющие, Прерывания и Блобы (BULK).
По назначению  - все девайсы ENDPOINTы (Хабы отдельная песня)

Ответить | Правка | К родителю #40 | Наверх | Cообщить модератору

46. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 21-Фев-14, 10:49 
>> Вот репозиторий с вашей программой, там более новая версия (1.1): https://code.google.com/p/bmcontrol/
> А еще лучше используйте мою версию отсюда: https://code.google.com/r/joeskb7-bmcontrol/

Добрый день,
Пытаюсь собрать bmcontrol для роутера ASUS WL500gP v.1 с прошивкой WL500gp-1.9.2.7-rtn-r5066.trx на ядре 2.6.22. Компилирую на самом устройстве. Версия программы 1.1 компилируется без ошибок, но неверно определяется ID датчиков, как у  DimNsk. Пробовал последнюю версию 1.1.1 от skb7, компилится с ошибками:

[admin@WL-500gP bm]$ make
cc -Wall -pedantic -O2 -s -Iinclude -std=c99 -D_POSIX_C_SOURCE=199309L -c -o src/main.o src/main.c
In file included from include/os/usb.h:5,
                 from src/main.c:8:
/opt/include/usb.h:67: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:73: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:80: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:93: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:118: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:144: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:161: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:178: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:253: error: expected specifier-qualifier-list before Б─≤u_int8_tБ─≥
/opt/include/usb.h:265: error: expected specifier-qualifier-list before Б─≤u_int32_tБ─≥
src/main.c: In function Б─≤find_lvr_winusbБ─≥:
src/main.c:88: error: Б─≤struct usb_device_descriptorБ─≥ has no member named Б─≤idVendorБ─≥
src/main.c:89: error: Б─≤struct usb_device_descriptorБ─≥ has no member named Б─≤idProductБ─≥
make: *** [src/main.o] Error 1

На Ubuntu все работает, а на роутере нет. Подскажите, в чем может быть проблема?

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

47. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 22-Фев-14, 03:05 
Вычитывание ID датчиков неправильно работает из-за слишком маленькой задержки ожидания. Как временное решение можете использовать bmcontrol 1.1, но исправьте функцию задержки, как я описал в ответе #18 в этом треде.

Лучше конечно попробовать починить мою версию для вашего девайса.
Чтобы пофиксить мою версию, я хотел бы узнать следующее:
1. Какая версия libusb используется? 0.1 или 1.0?
2. По хорошему такое должно делаться кросс-компиляцией, а не компилить на самом девайсе. Есть тулчейн для вашего девайса? Я хотел бы воспроизвести вашу ошибку у себя и посмотреть, в чем дело.
3. Ваша прошивка -- это не OpenWRT случайно?

Ответить | Правка | К родителю #46 | Наверх | Cообщить модератору

48. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 23-Фев-14, 23:33 
Большое спасибо за отклик.

Попробую собрать bmcontrol 1.1 с исправленной функцией задержки, напишу о результате.

Давайте попробуем починить вашу версию bmcontrol:
1. В прошивке роутера по умолчанию стоит libusb1.0, я дополнительно устанавливал libusb_0.1.12-2_mipsel.ipk отсюда http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/.

2. Я изначально хотел собрать кросс-компиляцией на Ubuntu 12.10, но там было очень много ошибок во время компиляции, которые поправить мне не удалось. Поэтому стал пытаться уже на самом устройстве. Тулчейн есть тут - https://code.google.com/p/wl500g/downloads/list. Я пробовал на версии hndtools-mipsel-uclibc-4.6.4-K26-r5299.tar.bz2.

3. Неа, прошивка не OpenWRT. Это прощивка от Олега доработанная энтузиастами 1.9.2.7-rtn-r5066 - https://code.google.com/p/wl500g/

Ответить | Правка | К родителю #47 | Наверх | Cообщить модератору

50. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 24-Фев-14, 01:54 
> 1. В прошивке роутера по умолчанию стоит libusb1.0, я дополнительно устанавливал libusb_0.1.12-2_mipsel.ipk
> отсюда http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/.

т.е. вы собирали с 1.0? или с 0.1? потому что bmcontrol написана под libusb-0.1, естественно в 1.0 все изменилось и не будет собираться. Меня на эту мысль навело отсутствие полей idVendor и idProduct в структуре usb_device_descriptor (судя по ошибкам компиляции из вашего вывода сборки). Убедитесь в следующем:
1. при сборке должен использоваться хедер usb.h именно от версии 0.1 (строка номер 5 в файле include/os/usb.h в моем проекте).

Если у вас этот хедер лежит не в стандартном месте (/usr/include), то нужно явно это указать компилятору при сборке. Сделать это можно в файле Makefile: во второй строке (CFLAGS) указать этот путь с помощью флага "-I" таким образом (для /opt/include):


CFLAGS = -Wall -pedantic -O2 -s -Iinclude -I/opt/include

Также покажите вывод следующих команд:


$ pkg-config --cflags libusb
$ pkg-config --libs libusb

По хорошему вывод первой надо использовать в Makefile для задания CFLAGS в Makefile, а вывод второй -- для задания LDFLAGS в Makefile; CLFAGS и LDFLAGS попросту скармливаются потом компилятору и компоновщику соответственно, а поскольку "gcc" выступает в роли обоих -- то оба этих списка скармливаются gcc. Если у вас оно отработает корректно -- я поменяю у себя в проекте таким образом поведение мейк-файла.

2. при компоновке (linking) должна использоваться библиотека libusb именно версии 0.1
У меня в Makefile есть строка:


LDFLAGS = -lusb

это указывает компоновщику линковать проект с библиотекой libusb.so или libusb.a, но библиотека ищется по стандартным путям только (/usr/lib и т.д.). Если у вас libusb-0.1 лежит не по стандартному пути, нужно в LDFLAGS дописать путь к вашей либе таким образом (пример для случая если у вас либа лежит в /opt/lib):


LDFLAGS = -lusb -L/opt/lib

Т.е. у меня подозрение, что это не у меня криво сделано, а просто нестандартные пути у вас. Хотя правда возникает вопрос, почему версия 1.1 у вас нормально собирается... В общем, попробуйте сделать, что я написал пока, а насчет кросс-компиляции -- позже посмотрю и напишу.

Ответить | Правка | К родителю #48 | Наверх | Cообщить модератору

51. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 24-Фев-14, 02:18 
В общем, я внес изменение в свой проект, чтобы использовался pkg-config при сборке, не знаю, может это поможет, проверьте. Обновить проект можно так:

$ git pull --rebase

Вот само изменение:

https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Но если у вас нет pkg-config или нет для него файла для libusb-0.1 (у меня он например поставляется с пакетом libusb-dev и находится тут: /usr/lib/x86_64-linux-gnu/pkgconfig/libusb.pc), то ничего вообще не соберется.

Ответить | Правка | К родителю #50 | Наверх | Cообщить модератору

52. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 24-Фев-14, 02:38 
> Версия программы 1.1 компилируется без ошибок

Посмотрел, какие различия между моим и его мейк-файлом. Попробуйте сделать следующие шаги. После каждого пробуйте собирать. Один из них наверняка поможет (скорее всего самый первый пункт). Напишите потом плиз о резултьтатах. Вот что стоит попробовать:

1. Добавить в самое начало моего Makefile строку:


CC = g++


2. В список CFLAGS (в моем Makefile) добавить такое:


-I/usr/include


3. В список LDFLAGS добавить тоже самое что в предыдущем пункте было добавлено в CFLAGS.

4. В список LDFLAGS добавить:


-L/usr/lib


5. В список CFLAGS добавить:


$(EXTRA_CFLAGS)

Ответить | Правка | К родителю #48 | Наверх | Cообщить модератору

53. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 24-Фев-14, 10:49 
> т.е. вы собирали с 1.0? или с 0.1?

Собирал для версии libusb-0.1, но я был не уверен, что компилятор использует именно версию 0.1, т.к. установлено обе версии libusb.

> В общем, я внес изменение в свой проект, чтобы использовался pkg-config при сборке, не
> знаю, может это поможет, проверьте.

Обновил проект. pkg-config на роутере есть, пути подставляются в Makrefile корректно. Но все равно ошибки, как в моем сообщении №46.


> 1. Добавить в самое начало моего Makefile строку: CC = g++

Добавил строку CC, вот такие ошибки:

[admin@WL-500gP bm1.1.2]$ make
g++ -Wall -pedantic -O2 -s -Iinclude -I/opt/include   -std=c99 -D_POSIX_C_SOURCE=199309L -c -o src/main.o src/main.c
cc1plus: warning: command line option "-std=c99" is valid for C/ObjC but not for C++
src/main.c: In function Б─≤uint64_t HexStringToUInt(char*)Б─≥:
src/main.c:641: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make: *** [src/main.o] Error 1

Удалил строку СС и еще удалил строку CFLAGS += -std=c99 -D_POSIX_C_SOURCE=199309L из Makefile. Сборка прошла без ошибок, bmcontrol работает и теперь ID датчика определяется верно!

[admin@WL-500gP bm1.1.2]$ make
cc -Wall -pedantic -O2 -s -Iinclude -I/opt/include   -c -o src/main.o src/main.c
cc -o bmcontrol src/main.o -L/opt/lib -lusb
[admin@WL-500gP bm1.1.2]$ ./bmcontrol info
Firmware: 3h
USB series: 29h
USB identifier: a9bh
[admin@WL-500gP bm1.1.2]$ ./bmcontrol scan
temp_id1 = 8900000357526b28
[admin@WL-500gP bm1.1.2]$ ./bmcontrol temp 8900000357526b28
21.875000

Спасибо огромное.

P.S. Осталось только проверить правдивость показаний датчика.

Ответить | Правка | К родителю #52 | Наверх | Cообщить модератору

55. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 11-Мрт-14, 09:31 
> P.S. Осталось только проверить правдивость показаний датчика.

Результаты измерений похожи на правду.

Написал скрипт, который снимает показания каждые 5 минут и записывает их в файл. За несколько дней наблюдений выявилась странная особенность, иногда вместе с результатом измерения появляется сообщение - Error OW_WRITE_BYTE. Измерение температуры в этот момент происходит, как видно из лога:

16.7 11.03.2014_08:05
16.7 11.03.2014_08:10
Error OW_WRITE_BYTE 16.6 11.03.2014_08:15
16.6 11.03.2014_08:20
16.6 11.03.2014_08:25

Смотрел в код, но так и не смог разобраться, почему появляется это сообщение.

Ответить | Правка | К родителю #53 | Наверх | Cообщить модератору

56. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 11-Мрт-14, 11:43 
>[оверквотинг удален]
> файл. За несколько дней наблюдений выявилась странная особенность, иногда вместе с
> результатом измерения появляется сообщение - Error OW_WRITE_BYTE. Измерение температуры
> в этот момент происходит, как видно из лога:
> 16.7 11.03.2014_08:05
> 16.7 11.03.2014_08:10
> Error OW_WRITE_BYTE 16.6 11.03.2014_08:15
> 16.6 11.03.2014_08:20
> 16.6 11.03.2014_08:25
> Смотрел в код, но так и не смог разобраться, почему появляется это
> сообщение.

Пока что не разбирался, в чем проблема, но сделал такой коммит:
https://code.google.com/r/joeskb7-bmcontrol/source/detail?r=...

Если вы обновите исходники, чтобы получить это изменение:


$ git pull --rebase


и пересоберете проект, то можно будет "выкинуть" сообщения об ошибках, чтобы они не мешали вашему скрипту:


$ ./bmcontrol 2>/dev/null

или если надо вести логи, то можно как-то так:


$ ./bmcontrol 2>log-err.txt | tee log-out.txt

Ответить | Правка | К родителю #55 | Наверх | Cообщить модератору

57. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 11-Мрт-14, 12:16 
> иногда вместе с результатом измерения появляется сообщение - Error OW_WRITE_BYTE

Очень похоже на то, что говорил pavlinux здесь:
https://www.opennet.ru/openforum/vsluhforumID9/9804.html#25

Попробуйте увеличить QUIRK_LIBUSB_SLEEP до 100. По-хорошему конечно надо переехать с libusb-0.1 на libusb-1.0, по идее там это починили.


> Смотрел в код, но так и не смог разобраться, почему появляется это
> сообщение.

Это сообщение показывается, если вызов OW_WRITE_BYTE() завершился некорректно в одной из следующих функций:
- MATCH_ROM()
- SEARCH_ROM()
- SKIP_ROM_CONVERT()
- GET_TEMPERATURE()

Думаю, в вашем случае это была GET_TEMPERATURE().

В каждой из этих функций в случае некорректного завершения OW_WRITE_BYTE делается несколько повторов (ONEWIRE_REPEAT=5), что видно из кода:


    while (!RESULT && N--)


Если за 5 повторов так и не вышло нормально выполнить OW_WRITE_BYTE(), тогда будет выведено сообщение о том, в какой верхней функции произошла ошибка (список этих функций я написал выше). Но поскольку вы видите всего один вывод об ошибке, значит при повторном чтении программе удалось нормально прочитать значение датчика и вывести его. Иначе бы вы увидели 5 выводов "Error OW_WRITE_BYTE" и потом еще вывод об ошибке верхней функции.

Глядя в код OW_WRITE_BYTE() можно увидеть, что всего 3 возможных причины ошибки:
1. ошибка в вызове USB_SET_FEATURE()
2. ошибка в вызове USB_GET_FEATURE()
3. некорректный USB буффер после чтения записанного значения (т.е. либо записалось что-то не то, либо прочиталось неправильно).

В нашем случае это 3-я ошибка. Почему она возникает -- см. в самом верху этого сообщения.

Ответить | Правка | К родителю #55 | Наверх | Cообщить модератору

58. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 11-Мрт-14, 13:37 
> Очень похоже на то, что говорил pavlinux здесь:
> https://www.opennet.ru/openforum/vsluhforumID9/9804.html#25
> Попробуйте увеличить QUIRK_LIBUSB_SLEEP до 100. По-хорошему конечно надо переехать с libusb-0.1
> на libusb-1.0, по идее там это починили.

Спасибо за развернутый ответ. Увеличил QUIRK_LIBUSB_SLEEP до 100, продолжаю наблюдение. Если не поможет, то поправлю скрипт, чтобы не выводил сообщения об ошибках по вашей инструкции.

Ответить | Правка | К родителю #57 | Наверх | Cообщить модератору

59. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 11-Мрт-14, 16:18 
> Спасибо за развернутый ответ. Увеличил QUIRK_LIBUSB_SLEEP до 100, продолжаю наблюдение.
> Если не поможет, то поправлю скрипт, чтобы не выводил сообщения об
> ошибках по вашей инструкции.

Напишите плиз о результатах. Если поможет увеличение задержки на libusb_quirks -- я вмержу в свою ветку это изменение.

Ответить | Правка | К родителю #58 | Наверх | Cообщить модератору

60. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 12-Мрт-14, 10:08 
>> Спасибо за развернутый ответ. Увеличил QUIRK_LIBUSB_SLEEP до 100, продолжаю наблюдение.
>> Если не поможет, то поправлю скрипт, чтобы не выводил сообщения об
>> ошибках по вашей инструкции.
> Напишите плиз о результатах. Если поможет увеличение задержки на libusb_quirks -- я
> вмержу в свою ветку это изменение.

Не помогло. Вчера утром внес изменения - увеличил QUIRK_LIBUSB_SLEEP до 100, ошибок не было. Вечером добавил к плате еще два датчика температуры DS18B20, скрипт теперь считывает показания с трех датчиков и записывает результаты в файл. Наблюдал весь вечер - ошибок не было. Утром глянул лог, а там снова куча ошибок. Первая появилась около часа ночи, потом они стали регулярными:

16.5 0.6 20.6 12.03.2014_06:01
16.5 0.5 Error OW_WRITE_BYTE 20.6 12.03.2014_06:05
16.4 Error OW_WRITE_BYTE 0.5 Error OW_WRITE_BYTE Error OW_WRITE_BYTE 20.6 12.03.2014_06:10
Error OW_WRITE_BYTE Error OW_WRITE_BYTE 16.4 0.4 20.6 12.03.2014_06:15
16.4 Error OW_WRITE_BYTE 0.3 20.6 12.03.2014_06:20
16.4 0.3 20.6 12.03.2014_06:25
16.3 0.2 20.5 12.03.2014_06:30

Ответить | Правка | К родителю #59 | Наверх | Cообщить модератору

61. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 12-Мрт-14, 14:15 
> Не помогло. Вчера утром внес изменения - увеличил QUIRK_LIBUSB_SLEEP до 100, ошибок
> не было. Вечером добавил к плате еще два датчика температуры DS18B20,
> скрипт теперь считывает показания с трех датчиков и записывает результаты в
> файл. Наблюдал весь вечер - ошибок не было. Утром глянул лог,
> а там снова куча ошибок. Первая появилась около часа ночи, потом
> они стали регулярными:

Ну это не дело, конечно. Проблема может быть не только в libusb, а еще и в прошивке контроллера. Конечно, неплохо было бы разработать свой подобный девайс, написать там всё по уму, сделать его опен-сорсным. В этом девайсе, конечно, приходится только догадываться, что пошло не так.

Еще вариант (поскольку проблемы начались после подключения дополнительных датчиков) -- неправильное подключение внешних датчиков. Посмотрите по этой ссылке, как их подключать: http://www.sinava.ru/MP707.php

а именно ответ на этот вопрос:


- Подключил к устройству термодатчик на расстоянии 5 метров - работает нормально. Затем подключил его на расстоянии 40 метров - устройство его не видит! Но ведь заявлено расстояние до последнего термодатчика 100 метров по витой паре 5 категории. Но у меня растояние 40 метров! При этом хоть ВИТАЯ, хоть НЕ ВИТАЯ ПАРА, но устройство не видит термодатчик! Что можно сделать?

Ответить | Правка | К родителю #60 | Наверх | Cообщить модератору

62. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 12-Мрт-14, 15:25 
> Ну это не дело, конечно. Проблема может быть не только в libusb,
> а еще и в прошивке контроллера. Конечно, неплохо было бы разработать
> свой подобный девайс, написать там всё по уму, сделать его опен-сорсным.
> В этом девайсе, конечно, приходится только догадываться, что пошло не так.

Верно, это было бы лучшим вариантом. К сожалению, разработчики контроллера не участвуют в дальнейшей его поддержки для *nix систем.

>[оверквотинг удален]
> http://www.sinava.ru/MP707.php
> а именно ответ на этот вопрос:
>

 
> - Подключил к устройству термодатчик на расстоянии 5 метров - работает нормально.
> Затем подключил его на расстоянии 40 метров - устройство его не
> видит! Но ведь заявлено расстояние до последнего термодатчика 100 метров по
> витой паре 5 категории. Но у меня растояние 40 метров! При
> этом хоть ВИТАЯ, хоть НЕ ВИТАЯ ПАРА, но устройство не видит
> термодатчик! Что можно сделать?
>

Да, видел эту статью. На ее основе подключал датчики. Я не думаю, что проблема с подключением, т.к. все дополнительные датчики определяются без проблем и показывают действительные показания температуры. Попробую потом отключить доп.датчики и посмотрю на наличие ошибок.

Ответить | Правка | К родителю #61 | Наверх | Cообщить модератору

49. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 24-Фев-14, 00:49 
> src/main.c: In function Б─≤find_lvr_winusbБ─≥:
> src/main.c:88: error: Б─≤struct usb_device_descriptorБ─≥ has no member named Б─≤idVendorБ─≥  
> src/main.c:89: error: Б─≤struct usb_device_descriptorБ─≥ has no member named Б─≤idProductБ─≥
>  Подскажите, в чем может быть проблема?

Из браузера мышом копипастил? :)


Ответить | Правка | К родителю #46 | Наверх | Cообщить модератору

54. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от did5 (ok), 24-Фев-14, 10:50 
>> src/main.c: In function Б─≤find_lvr_winusbБ─≥:
>> src/main.c:88: error: Б─≤struct usb_device_descriptorБ─≥ has no member named Б─≤idVendorБ─≥
>> src/main.c:89: error: Б─≤struct usb_device_descriptorБ─≥ has no member named Б─≤idProductБ─≥
>>  Подскажите, в чем может быть проблема?
> Из браузера мышом копипастил? :)

Копировал мышкой, но не из браузера, а из окна PuTTy.

Ответить | Правка | К родителю #49 | Наверх | Cообщить модератору

22. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 02-Янв-14, 07:50 
Поскольку у вас есть девайс, не могли бы вы попробовать собрать и протестировать эту прогу на linux и windows? Я пофиксил несколько багов и сделал код кросс-платформенным, так что должно собираться и по идее работать на linux и windows. Написал автору на почту, может он себе в mainline затащит эти патчи.

Вот репозиторий: https://code.google.com/r/joeskb7-bmcontrol/

Склонировать исходники можно с помощб Git, командой:


git clone https://code.google.com/r/joeskb7-bmcontrol/


Инструкции по сборке -- в файле README.

Напишите результат как проверите.

Ответить | Правка | Наверх | Cообщить модератору

16. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от pavlinux (ok), 31-Дек-13, 22:22 
>[оверквотинг удален]
> [D] CRC=c9
> [D] CRC=63
> [D] ~T=1000.000000
> [D] L1=ffffffff L2=ffffffff     L3=ff
> [D] CRC=8d
> [D] CRC=c9
> [D] CRC=63
> [D] ~T=1000.000000
> [!] Error GET_TEMPERATURE
> Что не так?


if (OW_READ_4BYTE(L1))
   if (OW_READ_4BYTE(L2))
      if (OW_READ_BYTE(L3)) {
     if (DEBUG)
            printf("[D] L1=%lx\tL2=%lx\tL3=%hhx\n", L1, L2, L3);

L1, L2, L3 - не инициализируются и передаются в эти функции, обратно - хрен, точнее bool.
  

Ответить | Правка | К родителю #13 | Наверх | Cообщить модератору

6. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от skb7 (ok), 30-Дек-13, 05:18 
Тогда уже так, чтобы было более понятно, что это просто loop delay:


void ldelay(volatile unsigned long loops)
{
    while (loops--);
}

Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

63. "Как правильно собрать программу для Debian (Raspbian"  +/
Сообщение от lukich (ok), 02-Ноя-14, 23:15 
Скажите пожалуйста, как добиться чтобы bmcontrol заработал без sudo?

/home/lukich/Downloads/bmcontrol temp a2000003351bd328
Could not set configuration 1 :
Device not plugged

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру