Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programm zum setzen IR-Repeat (USB-IRMP) gesplittet von Status USB-IR Empfänger
#1
Ich hab mal den Author von ir_control angeschrieben wegen Ungereimtheiten bei der Repeat-Rate...
Evtl. hat aber auch von euch jemand nen Hinweis dazu. Oberlooser hatte ein komischen Verhalten der Repeat Rate aus der zweiten Charge der Receiver berichtet... (EEPROM wurde bei beiden Chargen nicht von mir angefasst. Ich hab nur noch neu geflashte Receiver, ggf. lese ich später mal das EEPROM aus)

Hinweise zum C-Code wären somit erbeten...

(31.12.2013, 15:26)Martin link schrieb:...
ich hab mir mal ir_control angesehen...
Ist es Absicht dass das Setzen der Repeat-Rate deaktiviert ist ?
(Die Option "-d" funktioniert Beispielsweise prächtig)

Weiter unten sieht es doch schon fertig implementiert aus...


Zitat:                case 'd':
                        del_code = 1;
                        break;
                case 'p':
                        if(strcmp(optarg,"0") == 0)
                                poweron_enable = 0;
                        else
                                poweron_enable = 1;
                        break;
                case 'r':
                        printf("%s: not yet implemented r=%s\n", PACKAGE, optarg);
                        break;
Zitat:int deleteTrainedIRCode() {
        int err;

        IR_DATA emptyCode;

        emptyCode.repeat = 23;
        emptyCode.protocol = 0;
        emptyCode.address = 0;
        emptyCode.command = 0;
        emptyCode.flags = 0;

        err = usb_control_msg(handle, /* dev_handle */
                        0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT,  /* bmRequestType */
                        0x09, /* bRequest */
                        0x0305, /* wValue */
                        0x0000, /* wIndex */
                        (char*) &emptyCode, /* data */
                        sizeof(emptyCode), /* wLength */
                        3000); /* timeout */
        return err == 8 ? 0 : err;
}

int writeMinRepeats(int count) {
        int retcount;
        char buffer[2];
        buffer[1] = count;

        retcount = usb_control_msg(handle, /* dev_handle */
                        0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT,  /* bmRequestType */
                        0x09, /* bRequest */
                        0x0304, /* wValue */
                        0x0000, /* wIndex */
                        buffer, /* data */
                        0x02, /* wLength */
                        3000); /* timeout */
        return retcount != 2 ? -1 : 0;
}
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#2
Hallo
Zitat:int writeMinRepeats(int count) {

So weit ich das sehe wird der Wert count zum USB Receiver geschoben.
Ob das Reicht? Wobei das dann eine HW Sache wäre, also ich sage dem Empfänger wie oft er repeaten soll.
Fragt sich dann nur je Sekunde? Oder Insgesamt nur X mal?
Da müsste man mehr wissen.

Gruß und gutes Neues Jahr
Bleifuss
Produktiv-VDR:
Board GA H77-DS3H, Intel Intel® Core™ i5-3470, Cine S2 DVB, WD 3TB Green, WDC WD20EARS-00J  2TB, Geforce 750Ti oder Intel HD
Easyvdr 3.0
Zitieren
#3
(01.01.2014, 13:24)Bleifuss2 link schrieb: Hallo
Zitat:int writeMinRepeats(int count) {

So weit ich das sehe wird der Wert count zum USB Receiver geschoben.
(..)
Bleifuss

Sieht eher wie fehlerhafter quellcode aus in dieser Funktion.
libusb bekommt einen lokalen buffer übergeben der zwei bytes groß ist. Davor wird der buffer mit Inhalt initialisiert:    buffer[1] = count;

dem zweiten byte, also buffer[1] wird ein Wert zugewiesen, das erste byte ( buffer[0] ) ist gar nicht erst initialisiert worden. Noch schlimmer: count ist ein 'int' also vermutlich zwei bytes groß, also größer als buffer[1], die oberen acht bit des integers werden also vermutlich verworfen. Was auch immer das bewirken sollte, so sieht es mal falsch aus.
Zitieren
#4
Ich hab gestern mal die Windows Tools angesehen: Wenig erfreulich, denn diese laufen wie erwartet alle nicht mit unserem Receiver wegen der geänderten USB-ID. (Und jetzt noch unter Windows kompilieren anfangen macht m.E. keinen Sinn...)

Ziel wäre also IR-Control zu fixen. Zumindest ich schaffe das nur mit massiver Hilfe.

Die "Firmware" sieht schon mal so aus:
(https://github.com/ranseyer/USBasp-IR-Ad...ain.c#L131)
Zitat:/* Memory addresses in eeprom */
static uchar        AdressPowerOn                = 0;
static uchar        AdressTrainedCode        = 1;
static uchar        AdressMinRepeats        = 7;


Somit wäre ich dankbar über ein Codeschnipsel welches bei "-r 5" die Zahl 5 passend in die Adresse 7 im EEPROM schreibt... (und  nen Hinweis wie der Code oben zu ändern ist, damit das Schreiben auch ausgeführt wird...)
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#5
Hallo

Ob das dann an der Adresse 7 landet keine Ahnung.
Ich gehe mal davon aus das das passt:
Zitat:// bRequest:
//                        0x01        USBRQ_HID_GET_REPORT
//                                wValue:
//                                                ReportType (highbyte),
//                                                        3
//                                                ReportID (lowbyte):
//                                                        2                ReadPowerOnEnabled
//                                                        3                ReadTrainendIRCode
//                                                        7                ReadIrmpVersion
//                                                        11                ReadLogData

//                        0x09        USBRQ_HID_SET_REPORT
//                                wValue:
//                                                ReportType (highbyte),
//                                                        3
//                                                ReportID (lowbyte):
//                                                        4                SetPowerOnEnabled
//                                                        5                SetTrainedIRCode
//                                                        8                SetMinRepeats


Code:
int writeMinRepeats(uchar count) {
        int retcount;
        char buffer[2];
        buffer[0] = count;

        retcount = usb_control_msg(handle, /* dev_handle */
                        0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT, /* bmRequestType */
                        0x09, /* bRequest */
                        0x0308, /* wValue */
                        0x0000, /* wIndex */
                        buffer, /* data */
                        0x01, /* wLength */
                        3000); /* timeout */
        return retcount != 2 ? -1 : 0;
}

Code:
               case 'p':
                        if(strcmp(optarg,"0") == 0)
                                poweron_enable = 0;
                        else
                                poweron_enable = 1;
                        break;
                case 'r':
                        writeMinRepeats((uchar)10); //die 10 mit dem gewünschten wert ersetzen max. 255
                        break;
                case 's':

Wenn es funktioniert baue ich dir die Eingabe noch ein, aber teste bitte erst mal.
Ich weiß aber nicht ob es der richtige repeat ist es gibt ja 2 im Windows Code.

Gruß
Peter
Produktiv-VDR:
Board GA H77-DS3H, Intel Intel® Core™ i5-3470, Cine S2 DVB, WD 3TB Green, WDC WD20EARS-00J  2TB, Geforce 750Ti oder Intel HD
Easyvdr 3.0
Zitieren
#6
(02.01.2014, 12:19)Bleifuss2 link schrieb: Hallo

Ob das dann an der Adresse 7 landet keine Ahnung.
Ich gehe mal davon aus das das passt:


Deine Zahl landet hier in der firmware ..
Code:
uchar   usbFunctionWrite(uchar *data, uchar len)
{
......
    else if ( DoWriteReport == SetMinRepeats )
    {
        eeprom_write_block(&data[1], (uchar *)0 + currentAddress, len);                        // store new MinRepeats in eeprom
        memcpy(&MinRepeats, &data[1], sizeof(MinRepeats));                                    // update new MinRepeats received from host
    }
    currentAddress += len;
    bytesRemaining -= len;
    return bytesRemaining == 0;                                                             /* return 1 if this was the last chunk */
}


Zitat:
Code:
int writeMinRepeats(uchar count) {
        int retcount;
        char buffer[2];
        buffer[0] = count;
so wie es ausschaut, werden zwei bytes übertragen und landen in usbFunctionWrite als 'data', aber das erste in der fw nicht verwendet, sondern das zweite. Also buffer[1] oder fw anpassen.
Sehr schön, dass du count korrekt als uchar übergibst.

Zitat:
Code:
                case 'r':
                        writeMinRepeats((uchar)10); //die 10 mit dem gewünschten wert ersetzen max. 255
                        break;

Besser:
Code:
                case 'r':
                        {
                        uchar cnt:=atoi(optarg);
                        writeMinRepeats(cnt);
                        }
                        break;

Dann muss noch im string mit den möglichen argumenten 'r' durch 'r:' ersetzt werden, damit option r auch ein argument verlangt/erlaubt.
Zitieren
#7
Und kommst du weiter, oder braucht du noch Hilfe.
Produktiv-VDR:
Board GA H77-DS3H, Intel Intel® Core™ i5-3470, Cine S2 DVB, WD 3TB Green, WDC WD20EARS-00J  2TB, Geforce 750Ti oder Intel HD
Easyvdr 3.0
Zitieren
#8
"Weitergekommen" bin ich schon. Aber noch ohne Erfolg...

Zitat:[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$ make
gcc `libusb-config --cflags` -O -Wall -c ir_control.c
ir_control.c: In function ‘main’:
ir_control.c:50:25: error: unknown type name ‘uchar’
                        uchar cnt:=atoi(optarg);
                        ^
ir_control.c:50:34: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
                        uchar cnt:=atoi(optarg);
                                  ^
ir_control.c:51:41: error: ‘cnt’ undeclared (first use in this function)
                        writeMinRepeats(cnt);
                                        ^
ir_control.c:51:41: note: each undeclared identifier is reported only once for each function it appears in
ir_control.c: At top level:
ir_control.c:234:21: error: unknown type name ‘uchar’
int writeMinRepeats(uchar count) {
                    ^
make: *** [ir_control.o] Fehler 1

[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$

cp ir_control.c ir_control.c.txt

[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$


Ich hab mich bemüht die Vorschläge von euch beiden gleich komplett umzusetzen...
Nur fehle ja wohl vor Zeile 50 sowas wie eine Deklaration oder so... (?)

Zitat:werden zwei bytes übertragen und landen in usbFunctionWrite als 'data', aber das erste in der fw nicht verwendet, sondern das zweite. Also buffer[1] oder fw anpassen.
Die Firmware des AVRs möchte ich möglichst nicht anfassen.
@Wirbel: Dann muss ich dann an Deinen Codeblock noch eine Anpassung machen?

Zitat:Dann muss noch im string mit den möglichen argumenten 'r' durch 'r:' ersetzt werden, damit option r auch ein argument verlangt/erlaubt.
Ist das des Wurzels Übel ?
Dachte das passt:
Zitat:        while ((opt = getopt(argc, argv, "hVdp:rConfusedi")) != -1) {

Mein Stand ist in der Anlage... Wenn Ihr wollte gerne auch als Patch um die Änderungen zu sehen...


Angehängte Dateien
.txt   ir_control.c.txt (Größe: 8,39 KB / Downloads: 2)
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#9
Hallo

Das geht nicht :=

Wenn dann so, aber ich denke das passt auch nicht, kommt darauf an was in optarg drinn steht.
Code:
uchar cnt=(uchar)atoi(optarg);

Oder wenn er meckert:
Code:
uchar cnt;
cnt=(uchar)atoi(optarg);

Da müsste ich mich einlesen.
Vorschlag, teste es mal ohne Parameterübergabe wenn das dann geht ist der Rest nicht wild.

Code:
writeMinRepeats(10);

Und falls wie Wirbel schreibt das 2. Byte verwendet wird dann noch so ändern:

Code:
buffer[0] = 0;
buffer[1] = count;

0x02, /* wLength */

Wobei 0x02, /* wLength */ w auch wort sein könnte dann wäre die 0x01 richtig (1wort 2Byte)

Gruß
Produktiv-VDR:
Board GA H77-DS3H, Intel Intel® Core™ i5-3470, Cine S2 DVB, WD 3TB Green, WDC WD20EARS-00J  2TB, Geforce 750Ti oder Intel HD
Easyvdr 3.0
Zitieren
#10
mach mal aus uchar ein 'unsigned char'


Zitat:        while ((opt = getopt(argc, argv, "hVdp:rConfusedi")) != -1) {

Das ist genau richtig für 'r', hinter dem r ist ein doppelpunkt.

Und wie Bleifuss schreibt
buffer[0] = 0;
buffer[1] = count;
Zitieren
#11
Danke schon viel besser. Weiss nur nicht ob ich zu viel gefrickelt habe. (mehrere Änderungen von uchar nach "unsigned char"...)
Mein Stand:
https://github.com/ranseyer/USBasp-IR-Ad...920077cc28

Nun lese ich noch eine Überschneidung Header / Source-Code heraus...

Zitat:[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$ make
gcc `libusb-config --cflags` -O -Wall -c ir_control.c
ir_control.c:235:5: error: conflicting types for ‘writeMinRepeats’
int writeMinRepeats(unsigned char count) {
    ^
In file included from ir_control.c:13:0:
ir_control.h:38:5: note: previous declaration of ‘writeMinRepeats’ was here
int writeMinRepeats(int count);
    ^
make: *** [ir_control.o] Fehler 1
[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$

Header:
Zitat:int writeMinRepeats(int count);
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#12
ir_control.h

--int writeMinRepeats(int count);
++int writeMinRepeats(unsigned char count);
Zitieren
#13
Danke nun kompiliert es wieder und die anderen Optionen funktionieren wieder.
https://github.com/ranseyer/USBasp-IR-Ad...55ce655272

Ob/was das setzen der Option etwas bewirkt kann ich bis jetzt nicht sagen.
(Ich bin da sonst auch nicht so aufmerksam in Timing-Fragen)
Deshalb baue ich das Paket mal neu und bitte Oberlooser um nen Test...
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#14
Zu früh gefreut...

Auszug Syslog:
Code:
Jan  3 21:03:06 martin-VirtualBox kernel: [31081.215293] ir_control[24897]: segfault at 0 ip 00007f04c532fbe6 sp 00007fffed6f6970 error 4 in libusb-0.1.so.4.4.4[7f04c532c000+7000]
Jan  3 21:03:10 martin-VirtualBox kernel: [31085.454748] ir_control[24899]: segfault at 0 ip 00007f5f077bfbe6 sp 00007fff197a2b10 error 4 in libusb-0.1.so.4.4.4[7f5f077bc000+7000]
Jan  3 21:03:17 martin-VirtualBox kernel: [31092.377470] ir_control[24902]: segfault at 0 ip 00007f96183d7be6 sp 00007ffff8c499e0 error 4 in libusb-0.1.so.4.4.4[7f96183d4000+7000]
Jan  3 21:03:52 martin-VirtualBox kernel: [31127.826481] ir_control[24920]: segfault at 0 ip 00007fd2bd8b7be6 sp 00007fff3a0c6f80 error 4 in libusb-0.1.so.4.4.4[7fd2bd8b4000+7000]
Jan  3 21:04:25 martin-VirtualBox kernel: [31160.803317] ir_control[24926]: segfault at 0 ip 00007ffcce9e0be6 sp 00007fffcddd5d80 error 4 in libusb-0.1.so.4.4.4[7ffcce9dd000+7000]
[email protected]:/tmp/1# ./ir_control -r 5
Speicherzugriffsfehler (Speicherabzug geschrieben)
[email protected]:/tmp/1#
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#15
Hallo

Der Code läuft so:
Code:
/*
* main.c
*
*  Created on: 20.05.2012
*      Author: muebau
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <usb.h>    /* this is libusb, see http://libusb.sourceforge.net/ */
#include <getopt.h>

#include "ir_control.h"

int ignore_dev = 0;
int del_code = 0;
int poweron_enable = -1;
int readPowerOn = 0;
int printVersion = 0;
unsigned char writeMinirepeats =0;

usb_dev_handle *handle = NULL;

int main(int argc, char **argv) {
    if(argc < 2)
        usage(0);

    int opt = 0;
    while ((opt = getopt(argc, argv, "hVdp:r:si")) != -1) {
        switch (opt) {
        case 'h':
            usage(0);
            break;
        case 'V':
            printVersion = 1;
            break;
            //        case 'v':
            //            printf("%s: Verbose option is set `%c'\n", PACKAGE, optopt);
            //            break;
        case 'd':
            del_code = 1;
            break;
        case 'p':
            if(strcmp(optarg,"0") == 0)
                poweron_enable = 0;
            else
                poweron_enable = 1;
            break;
        case 'r':
            writeMinirepeats=(unsigned char)atoi(optarg);
            break;
        case 's':
            readPowerOn = 1;
            break;
        case 't':
            break;
        case 'i':
            ignore_dev = 1;
            break;
        case ':':
            fprintf(stderr, "%s: Error - Option `%c' needs a value\n\n",
                    PACKAGE, optopt);
            usage(1);
            break;
        case '?':
            fprintf(stderr, "%s: Error - No such option: `%c'\n\n", PACKAGE,
                    optopt);
            usage(1);
        }
    }

    //    usb_set_debug(1);
    usb_init();

    if ((handle = findDevice()) == NULL) {
        fprintf(stderr,    "Could not find USB device \"USB IR Remote Receiver\" with vid=0x%x pid=0x%x\n", USBDEV_SHARED_VENDOR, USBDEV_SHARED_PRODUCT);
        return 1;
    }

    usb_detach_kernel_driver_np(handle, 0);
    usb_claim_interface(handle, 0);

    if(printVersion) {
        char buffer[12];
        readIrmpVersion(buffer);
        printf("%s %s\nIRMP: %s\n", PACKAGE, VERSION, buffer);
        return 0;
    }

    if(readPowerOn) {
        printf("%d\n", readPowerOnEnabled());
        return 0;
    }

    if(del_code) {
        deleteTrainedIRCode();
    }

    if(poweron_enable != -1) {
        writePowerOnEnabled(poweron_enable);
    }

    if(writeMinirepeats>0)
        writeMinRepeats(writeMinirepeats);


    
    usb_release_interface(handle, 0);
    usb_close(handle);
    return 0;
}

void usage(int exval) {
    printf("%s, %s control the \"USB IR Remote Receiver\"\n (www.mikrocontroller.net/articles/USB_IR_Remote_Receiver).\n\n",
            PACKAGE, VERSION);
    printf("%s [-h] | [-V] | [[[-d] | [-p[1|0]] | [-rCOUNT] | [-s] | [-t]] [-i]]\n\n",
            PACKAGE);

    printf("  -h              print this help and exit\n");
    printf("  -V              print version and exit\n\n");

    //printf("  -v              set verbose flag\n");
    printf("  -d              delete the PowerOn IR code.\n");
    printf("                  The next received code becomes the new PowerOn code\n");
    //printf("  -n              set new PowerOn IR code\n");
    printf("  -p [1|0]        set PowerOn (ON=1/OFF=0)\n");
    printf("  -r COUNT        set repeat count (default=5)\n");
    printf("  -s              status of: PowerOn (ON=1/OFF=0)\n");
    //printf("  -t              print trained IR code (PowerOn)\n");
    //printf("  -u ven:dev      use a different VENDOR:DEVICE id\n");
    printf("  -i              ignore device name. (just checks the vendor:device ID)\n");
    printf("                  needs one of the other options.\n\n");

    exit(exval);
}

// bRequest:
//            0x01    USBRQ_HID_GET_REPORT
//                 wValue:
//                        ReportType (highbyte),
//                            3
//                        ReportID (lowbyte):
//                            2        ReadPowerOnEnabled
//                            3        ReadTrainendIRCode
//                            7        ReadIrmpVersion
//                            11        ReadLogData

//            0x09    USBRQ_HID_SET_REPORT
//                 wValue:
//                        ReportType (highbyte),
//                            3
//                        ReportID (lowbyte):
//                            4        SetPowerOnEnabled
//                            5        SetTrainedIRCode
//                            8        SetMinRepeats

int readPowerOnEnabled() {
    int count;
    char buffer[2];

    count = usb_control_msg(handle, /* dev_handle */
            0xa1,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT,  /* bmRequestType */
            0x01, /* bRequest */
            0x0302, /* wValue */
            0x0000, /* wIndex */
            buffer, /* data */
            0x02, /* wLength */
            3000); /* timeout */
    if(count != 2)
        return -1;

    return buffer[1];
}

void readTrainedIRCode(IR_DATA *code) {

}

int readIrmpVersion(char* buffer) {

    return usb_control_msg(handle, /* dev_handle */
            0xa1,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT,  /* bmRequestType */
            0x01, /* bRequest */
            0x0307, /* wValue */
            0x0000, /* wIndex */
            buffer, /* data */
            0x12, /* wLength */
            3000); /* timeout */
}

void readLogData() {

}

int writePowerOnEnabled(int status) {
    int count;
    char buffer[2];
    buffer[0] = 0x04;
    if(status == 0)
        buffer[1] = 0x00;
    else
        buffer[1] = 0x01;

    count = usb_control_msg(handle, /* dev_handle */
            0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT,  /* bmRequestType */
            0x09, /* bRequest */
            0x0308, /* wValue */
            0x0000, /* wIndex */
            buffer, /* data */
            0x02, /* wLength */
            3000); /* timeout */
    return count != 2 ? -1 : 0;
}

int deleteTrainedIRCode() {
    int err;

    IR_DATA emptyCode;

    emptyCode.repeat = 23;
    emptyCode.protocol = 0;
    emptyCode.address = 0;
    emptyCode.command = 0;
    emptyCode.flags = 0;

    err = usb_control_msg(handle, /* dev_handle */
            0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT,  /* bmRequestType */
            0x09, /* bRequest */
            0x0305, /* wValue */
            0x0000, /* wIndex */
            (char*) &emptyCode, /* data */
            sizeof(emptyCode), /* wLength */
            3000); /* timeout */
    return err == 8 ? 0 : err;
}

int writeMinRepeats(unsigned char count) {
        int retcount;
        char buffer[2];
        buffer[0] = 0;
        buffer[1] = count;
    
        retcount = usb_control_msg(handle, /* dev_handle */
                        0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT, /* bmRequestType */
                        0x09, /* bRequest */
                        0x0308, /* wValue */
                        0x0000, /* wIndex */
                        buffer, /* data */
                        0x02, /* wLength */
                        3000); /* timeout */
        return retcount != 2 ? -1 : 0;
         
}



static int usbGetStringAscii(usb_dev_handle *dev, int index, int langid,
        char *buf, int buflen) {
    char buffer[256];
    int rval, i;

    if ((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
            (USB_DT_STRING << 8) + index, langid, buffer, sizeof(buffer), 1000))
            < 0)
        return rval;
    if (buffer[1] != USB_DT_STRING)
        return 0;
    if ((unsigned char) buffer[0] < rval)
        rval = (unsigned char) buffer[0];
    rval /= 2;
    /* lossy conversion to ISO Latin1 */
    for (i = 1; i < rval; i++) {
        if (i > buflen) /* destination buffer overflow */
            break;
        buf[i - 1] = buffer[2 * i];
        if (buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */
            buf[i - 1] = '?';
    }
    buf[i - 1] = 0;
    return i - 1;
}

static usb_dev_handle *findDevice(void) {
    struct usb_bus *bus;
    struct usb_device *dev;
    usb_dev_handle *handle = 0;

    usb_find_busses();
    usb_find_devices();
    for (bus = usb_busses; bus; bus = bus->next) {
        for (dev = bus->devices; dev; dev = dev->next) {
            if (dev->descriptor.idVendor == USBDEV_SHARED_VENDOR
                    && dev->descriptor.idProduct == USBDEV_SHARED_PRODUCT) {
                char string[256];
                int len;
                handle = usb_open(dev); /* we need to open the device in order to query strings */
                if (!handle) {
                    fprintf(stderr, "Warning: cannot open USB device: %s\n",
                            usb_strerror());
                    continue;
                }

                if(ignore_dev)
                    break;

                /* now find out whether the device actually is obdev's Remote Sensor: */
                len = usbGetStringAscii(handle, dev->descriptor.iManufacturer,
                        0x0409, string, sizeof(string));
                if (len < 0) {
                    fprintf(
                            stderr,
                            "warning: cannot query manufacturer for device: %s\n",
                            usb_strerror());
                    goto skipDevice;
                }

                //fprintf(stderr, "seen device from vendor ->%s<-\n", string);
                if (strcmp(string, "www.mikrocontroller.net/articles/USB_IR_Remote_Receiver") != 0 )
                    goto skipDevice;
                len = usbGetStringAscii(handle, dev->descriptor.iProduct,
                        0x0409, string, sizeof(string));
                if (len < 0) {
                    fprintf(stderr,
                            "warning: cannot query product for device: %s\n",
                            usb_strerror());
                    goto skipDevice;
                }

                //fprintf(stderr, "seen product ->%s<-\n", string);
                if (strcmp(string, "USB IR Remote Receiver") == 0)
                    break;
                skipDevice: usb_close(handle);
                handle = NULL;
            }
        }
        if (handle)
            break;
    }
    if (!handle)
        fprintf(stderr, "Could not find USB device www.anyma.ch/uDMX\n");
    return handle;
}

Aber:

Zitat:int writeMinRepeats(unsigned char count) {
        int retcount;
        char buffer[2];
        buffer[0] = 0;
        buffer[1] = count;

        retcount = usb_control_msg(handle, /* dev_handle */
                        0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT, /* bmRequestType */
                        0x09, /* bRequest */
                        0x0308, /* wValue */
                        0x0000, /* wIndex */
                        buffer, /* data */
                        0x02, /* wLength */
                        3000); /* timeout */
Zitat:int writePowerOnEnabled(int status) {
int count;
char buffer[2];
buffer[0] = 0x04;
if(status == 0)
buffer[1] = 0x00;
else
buffer[1] = 0x01;

count = usb_control_msg(handle, /* dev_handle */
0x21,// LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT,  /* bmRequestType */
0x09, /* bRequest */
0x0308, /* wValue */
0x0000, /* wIndex */
buffer, /* data */
0x02, /* wLength */
3000); /* timeout */
return count != 2 ? -1 : 0;
}

2x Die 308 da habe ich Zweifel das es passt.
Du kannst die 0 auch mal durch die 04 ändern.

Gruß
Produktiv-VDR:
Board GA H77-DS3H, Intel Intel® Core™ i5-3470, Cine S2 DVB, WD 3TB Green, WDC WD20EARS-00J  2TB, Geforce 750Ti oder Intel HD
Easyvdr 3.0
Zitieren
#16
In writePowerOnEnabled gehört 0x304.

buffer[0] scheint unbenutzt.
Zitieren
#17
Danke nochmals. Ohne eure Hilfe hätte ich hier nichts hinbekommen...

Nun kann ich also Befehle absetzen und scheinbar passiert auch etwas. Denn nach den Änderungen muss der "IR-Stick" erst mal gezogen werden bevor IRW wieder reagiert...

Zitat:[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$ sudo ./ir_control -r 1
[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$ sudo ./ir_control -r 9
[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$ sudo ./ir_control -r 255
[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$ sudo ./ir_control -r 2555
[email protected]:~/Schreibtisch/USBasp-IR-AddOn-master/SW/ir-control$

Was mir unklar ist, ist der Wertevorrat (dachte uchar ist bis 255 ...)

Mit meinem Zeitgefühl kann ich auch keinen Unterschied zwischen 1 und 255 ausmachen... (Default soll ja 5 sein)
Drücke ich kurz, kommt nur erste Zeile siehe Anhang mit 00 am Ende. Bleibe ich länger auf der Taste kommt zuerst wieder 00 und dann immer mit 01 am Ende. Beschleunigung oder Verzögerung kann ich keine feststellen...

Somit fällt mir nur ein mal das EEPROM auszulesen...

PS: der CodeStand: https://github.com/ranseyer/USBasp-IR-Ad...920077cc28



Angehängte Dateien
.jpg   irw.jpg (Größe: 5,66 KB / Downloads: 87)
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#18
char -128..127
signed char = char
unsigned char = 0..255

Also genau ein byte oder 8bit.



Falls du debuggen möchtest, dann würde ich dir das hier empfehlen (~15..20eur), ein mini logik analyzer am USB-2.0 port:

* http://wirbel.htpc-forum.de/electronics/...ndex2.html
Zitieren
#19
Danke das ist cool. (Hab ich zufällig schon mal gelsen und gegen den Kauf entschieden weil man das ja auch nutzen müsste...)
Geiles Teil. Mal sehen evtl doch...

(04.01.2014, 17:15)Wirbel link schrieb: Falls du debuggen möchtest, dann würde ich dir das hier empfehlen (~15..20eur), ein mini logik analyzer am USB-2.0 port:
* http://wirbel.htpc-forum.de/electronics/...ndex2.html

Bei w-Duino klappt der Link nicht:
Zitat:Eagle design files
Ist das Absicht ?
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#20
Zitat:Bei w-Duino klappt der Link nicht:
Zitat:Eagle design files
Ist das Absicht ?

Eig. nicht; aber ich seh grad, dass die Datein auch online fehlen, upss...
Zitieren
#21
hallo

  möchte mal nach dem status --  fragen obs nun klappert
    ich wollte ja was kleines dafür basteln

  und da ich mit irmprecord fast fertig bin ....


  gruß
    matthias
pille: (vdr1)
Anubis TYPHOON DVB-T Light;Terratec Cinergy1200; GA-M56S-S3; AMD X2 3800(35W); 2x1GB, PCIe 9500GT/LE-40M86BD; Hitachi 320GB; IDE DVD; OCZ 32GB SSD; Trust C-5250/opt./Denon-AV; lirc/DVICO/MD81035; USB-HD 256GB & 1TB ; GraphTFT/LCD 15"; easyVDR 1.0
chekov: (vdr2)
Esprimo5600/1,5GB/AMD Athlon64 X2 3800+; Club-3D GS8400 512MB/G98/19"CRT;Nova T-500; OCZ 32GB SSD, IDE DVD-Rom;  lirc/DVICO/MD82467; easyvdr1.0

[color=#00008B]scotty: (work - no vdr)
GA-M52L-S3; AMD X4; 4x1GB, NVidia 9800GT/1GByte; Hitachi 320GB;60GByte SSD; 80GByte Hd for wine; SATA DVD; Trust C-5250;Kubuntu 12.10; Netz: Intel GBit PCIe cardt + ...
Zitieren
#22
Zitat:saleae/index2.html
Meine Konto hatte noch 7,5€ Überdruck... (Und da die Regale noch Füllung brauchen...)

Zitat:  möchte mal nach dem status --  fragen obs nun klappert
A)Schon immer funktioniert hat das zurücksetzen des Einschalt-Codes:
ir_control -d

B)Dank Wirbel+Peter kann man nun auch den Befehl zum "etwas anderes ins EEPROM des Mikrocontrollers schreiben" ohne Fehlermeldung absetzen.
Das ist zwar hier "irgendwie Mein Projekt", trotzdem wäre mir gerade Andis Partman Sache wichtiger...
Deshalb kann ich zu der Repeat-Sache noch wenig sagen:
-Der Befehl zum Einstellen läuft durch
-Unterschied hab ich keinen in der Verwendung festgestellt. (Muss ja gar nix heissen)
-Das EEPROM hab ich noch nicht ausgelesen ob sich da etwas ändert...

Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#23
hi

Zitat:trotzdem wäre mir gerade Andis Partman Sache wichtiger...

obwohl nur biologischer Prozessor  ( und keine Frau)
  - bin ich in gewissem Umfang multitaskingfähig.  Wink

  gruß
pille: (vdr1)
Anubis TYPHOON DVB-T Light;Terratec Cinergy1200; GA-M56S-S3; AMD X2 3800(35W); 2x1GB, PCIe 9500GT/LE-40M86BD; Hitachi 320GB; IDE DVD; OCZ 32GB SSD; Trust C-5250/opt./Denon-AV; lirc/DVICO/MD81035; USB-HD 256GB & 1TB ; GraphTFT/LCD 15"; easyVDR 1.0
chekov: (vdr2)
Esprimo5600/1,5GB/AMD Athlon64 X2 3800+; Club-3D GS8400 512MB/G98/19"CRT;Nova T-500; OCZ 32GB SSD, IDE DVD-Rom;  lirc/DVICO/MD82467; easyvdr1.0

[color=#00008B]scotty: (work - no vdr)
GA-M52L-S3; AMD X4; 4x1GB, NVidia 9800GT/1GByte; Hitachi 320GB;60GByte SSD; 80GByte Hd for wine; SATA DVD; Trust C-5250;Kubuntu 12.10; Netz: Intel GBit PCIe cardt + ...
Zitieren
#24
Zitat:trotzdem wäre mir gerade Andis Partman Sache wichtiger...
Das war nicht auf Dich bezogen!

Trotzdem Danke... Big Grin
Grüße
Martin
-----------------------------------------------------------------------------------------------------------
Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken) 

Zitieren
#25
Hallo,

ich wollte bei meinem IR-Empfaenger via ir_control -r[X] die Wiederholrate beschleunigen.
Vorher ging es etwa im 500 ms-Takt oder sogar schneller, fast zufriedenstellend.

Nun dauert es etwa 8 Sekunden, bis die Wiederholung beginnt. Die geht dann aber flott.

Ich sehe keine Aenderung, wenn ich ir_control anwende. Funktioniert das ueberhaupt?
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste