Problem mit Performance und IR

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Seppel
Posts: 17
Joined: Tue Jan 24, 2006 10:25 pm

Problem mit Performance und IR

Post by Seppel »

Hallo, ich versuche übver den IOW ein Display anzusteuern und über das IR Modul den Computer fernzusteuern.
Das mit dem Display klappt auch schon ganz gut, nur bei der Fernbedienung gibts Probleme.
Bin gerade an der Lautstärke und Versuche die Lautstärke von Winamp zu verändern. Ich habe den IOW 24 und benutze Visual C++ MFC.
Um das Infrarot Modul zu aktivieren starte ich einen THread, welcher immer den Read aufruft. Poste hier mal den relevanten Code.
Das Problem ist nun, das es zwar generell funktioniert, aber er scheinbar zuviel abarbeiten muss oder wie auch immer, auf jedenfall, wenn ich den knopf gedrückt halte für die lautstärke, dann kommt er öftermal ins stocken.
Vielleicht hat ja jemand ne Idee was zu tun ist.
Vielen Dank im vorraus.

Hier nun die Funktion die durch den Thread aufgerufen wird, der Thread hat übrigens die höchste Priorität.
Wenn er diese nicht hat, stockt er nochmehr...

Code: Select all

void CIOWProjectDlg::IRSteuerung()
{
	int IRCode, IRGeraet;
	while(TRUE) 
	{ 
		IOWKIT_HANDLE m_ioHandle;
		m_ioHandle = IowKitOpenDevice();
		IOWKIT_SPECIAL_REPORT rep;		//Variable für SpecialMode erstellen
		rep.ReportID = 0x0c;				//ReportID 12 für IR
		rep.Bytes[0] = 0x01;				// IR einschalten	
		IOWKIT_SPECIAL_REPORT repnew;	//Variable zum ERgebnis auslesen des IR
		//' zum IOW schreiben mit numpipe =1  für Specialmode
		IowKitWrite(m_ioHandle, 1,
			(PCHAR) &rep, IOWKIT_SPECIAL_REPORT_SIZE); 
		//' vom IOW lesen mit numpipe =1  für Specialmode und 8-Bytes lang
		IowKitRead(m_ioHandle, 1,
			(PCHAR) &repnew, IOWKIT_SPECIAL_REPORT_SIZE);
		//Einschalten des Displays laut SDK

		//IR Signal ausweiter, erstmal aufspaltung, was ist es für eine Funktion
		
		IRCode = (int) repnew.Bytes[0];
		IRGeraet = repnew.Bytes[1];
		IRGeraet = (IRGeraet & 0x1f);

		//WinampVolume(WINAMP_VOLUMEDOWN);

		switch (IRGeraet)
		{
		case 20:
			switch (IRCode)
			{
			case 55:
				VolumeWinamp(WINAMP_VOLUMEDOWN);
				break;
			case 57:
				VolumeWinamp(WINAMP_VOLUMEUP);
				break;
			}
			break;
		case 16:
			switch (IRCode)
			{
			case 16:
				VolumeSystem();
				break;
			case 17:
				VolumeSystem();
				break;
			}
			break;
		}

	}
}


void CIOWProjectDlg::VolumeWinamp(int WABefehl)
{
	
	int i=0, intWinampLautst,intFullVol;
	HWND hwndWinamp = ::FindWindow("Winamp v1.x", NULL);
	for (i;i<3;i++) //GEschwindigkeit des Reglers über die Forschleife einstellen
	{
		::SendMessage(hwndWinamp, WM_COMMAND,WABefehl,0);
	}
	
	
	KillTimer(TIMERID_LAUFTEXT);
	KillTimer(TIMERID_ZEITAKT);
	ClearLCD();
	//Wie Teilt man die Lautstärke jetzt auf die 16 übrigbleibenden Kästchen
	intWinampLautst = ::SendMessage(hwndWinamp,WM_WA_IPC,-666,IPC_SETVOLUME);  //Ergebnis mit eine int Zahl von 0 bis 255
	intFullVol = (intWinampLautst+1) / 16;
	//Diese Zahl dann durch 16 für jedes Käschen und bei den einzelnen Kästchen nochmal durch 5
	LCDWriteEinzeilig(1, 0, "Lautstärke Winamp");
	LCDWriteEinzeilig(3, 0, "- "); //Beschreibt die ersten 2 Zeichen der Zeile
	for (i=2; i <= intFullVol+1;i++)
	{
		LCDWriteEinzeilig(3, i, '\xD6',0);  //Die 0 als Optionaler Parameter sorgt dafür, das Sonderzeichen nicht ersetzt werden
	}
	for (i;i<=18;i++)
	{
		LCDWriteEinzeilig(3, i, '\x20',0);  //Die 0 als Optionaler Parameter sorgt dafür, das Sonderzeichen nicht ersetzt werden
	}
	LCDWriteEinzeilig(3, 18, " +");
	
	KillTimer(TIMERID_BACKSCREEN);
	SetTimer(TIMERID_BACKSCREEN, 1000, NULL);  //startet das Timerereignis zum scrollen des Texts
}
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Warum ueberhaupt ein Thread? Ein Timer reicht voellig aus.
IR muss nur einmal eingeschaltet werden (wie alle anderen Special Mode auch). Der Handler fuer den Timer liest mit IowKitReadNonBlocking() und checkt die ReportID damit ihn eventuelle Antwortreports anderer Special Modes nicht stoeren. Das Lesen mit IowKitReadNonBlocking() sollte in einer schleife erfolgen, damit man alle aufgelaufenen Reports wegliest.
Seppel
Posts: 17
Joined: Tue Jan 24, 2006 10:25 pm

Post by Seppel »

Wie du das mit dem Timer meinst ist mir ncoh nicht ganz klar, vielleicht könnten sie das noch einmal genauer ausführen.
Die andereSache ist, das mein IOW soweit ich weiß die funktion IowKitReadNonBlocking() noch nicht kennt, es steht zumindest nichts in der sdk.
Ich hab nur IowKitReadImmediate, diese geht aber wohl nicht für Special Mode.
Ich hab auch das Gefühl, das es es eventuell daran liegen könnte, das er wenn ich die Taste auf der Fernbedienung drücke, einfach zu viele ereignisse erzeugt die abgearbeitet werden müssen, so das es da zu diesen Problemen kommt, ist das möglich?

wenn das mit dem Timer bei mir ginge, wäre es schön, weil ich ja dann von den threads wegkomme.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Das aktuelle SDK von unserer Webseite herunterladen. Das IowKit 1.5 enthaelt auch die Funktion IowKitReadNonBlocking. Die Funktion gleicht IowKitRead, aber sie kommt sofort zurueck wenn es nichts zu lesen gibt. Einfach einen Timer einrichten und dort mit IowkitReadNonBlocking solange Reports lesen bis keiner mehr da ist. Es koennen naemlich mehrere Reports warten.

Eine IR Fernbedienung funktioniert nicht wie eine Tastatur. Beim Druecken eines Buttons wird in schneller Folge der IR-Code der Taste gesendet bis man wieder loslaesst. Es ist praktisch unmoeglich nur ein Datenpaket zu bekommen. Kein Finger ist da schnell genug beim Loslassen. Das Toggle-Bit sagt an das ein neuer Tastendruck erfolgt ist. Es wechselt bei jedem Tastendruck.
Post Reply