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;
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
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.
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.
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)
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
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.
"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
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:ri")) != -1) {
Mein Stand ist in der Anlage... Wenn Ihr wollte gerne auch als Patch um die Änderungen zu sehen...
Grüße
Martin
----------------------------------------------------------------------------------------------------------- Du brauchst Hilfe? Wir brauchen Daten! English-Version: Don't eat yellow snow!
Meine VDRs (Spoiler klicken)
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)
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)
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)
/*
* 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;
}
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");
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;
}
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...
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...
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)
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)
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?