Envoi Et Réception Irda En C++


Xo Sonic oX
 Share

Messages recommandés

Bonjour,

voilà, j'ai débuté en C++ pour PSP...

J'aimerais apprendre comment utiliser la librairie infrarouge : comment envoyer et recevoir les signaux infrarouge de la psp..

Est ce quelqu'un pourrait m'aider ?

Salut,

D'une manière générale, le lien incontournable pour la programmation PSP (en anglais) c'est ps2dev.org.

Plus particulièrement dans ce post LA (auteur shine) si tu suis les liens tu as des exemples de code C/C++ qui utilisent l'IrDA (trois liens pour trois modes Ir différents).

Bon courage!

@+

Modifié par m@li
Lien vers le commentaire
Partager sur d'autres sites

Merci,

j'ai donc lu les sources, et j'ai quelques petites questions :

quelle est la diffèrence entre Irda, et SIrCS ?

SIrCS envoit il aussi des codes haxadecimaux par IR ?

et j'aimerais bien qu'on m'explique ces deux sources :

SIRCS :

http://svn.ps2dev.org/filedetails.php?repn...in.c&rev=0&sc=0

IRda :

http://svn.ps2dev.org/filedetails.php?repn...in.c&rev=0&sc=0

J'aimerais pas qu'on m'explique tout le programme, mais comment on proce à l'envoi et à la reception :

variable à declarer, et pourquoi le declarer,

quelle fonctions utilisée, et quels sont les arguments à lui passer...

et une autre question :

Dans IrDa :

   unsigned char padHighbyte = pad.Buttons >> 8; int otherPad = data << 8;

Vous pouvez aussi m'expliquer ces deux lignes ?

Lien vers le commentaire
Partager sur d'autres sites

Je ne suis pas très calé en infrarouge, mais IRDA c'est un standard d'échange de données par infrarouge (pour faire communiquer deux machines, par ex un oardinateur et un téléphone portable, ou deux PSP, ..) et SIRCS c'est un protocole pour les télécommandes Sony (TV/Hifi, mais aussi les Aibot). D'ailleurs, je me demande comment fonctionne la télécommande LIRC vu que ce n'est ni du irda ou sircs.

a mon avis, Google t'aidera à trouver les infos dont tu as besoin.

Pour les explications de code, je crois que c'est un peu à toi de trouver les réponses, en lisant les docs que tu peux trouver sur Irda ou SIRCS, et si ça a un rapport avec le PSPSDK (les fonctions sceXXX), essaye de voir dans le code source de pspsdk s'il n'y a pas des commentaires intéressants à propos des fonctions qui te posent problème.

Sinon je ne sais pas si tu sais, mais dans le pspsdk, il y a une doc succinte mais qui peut rendre service, sur toutes les fonctions disponibles. C'est une doc en HTML, et elle est générée avec doxygen à partir des sources, au moment de l'installation du sdk.

et sinon, pour les opérateurs "<<" et ">>", ce sont les opérateurs de décalage du langage C (et donc aussi du C++). va falloir te mettre à niveau, si c'est un problème de langage, tu risques d'avoir beaucoup de problèmes pour comprendre les sources !

va voir cette page pour les opérateurs du C : http://www.cybwarrior.com/articles/read.php?id=47

Lien vers le commentaire
Partager sur d'autres sites

Donc si je comprend bien

 unsigned char padHighbyte = pad.Buttons >> 8;						sceIoWrite(fd, &padHighbyte, 1);

Il récupère la constante du bouton pressé.

après le décalage de bit ( pour exemple : pas.Buttons = 5 )

padHighbyte = 000000005...

Ok, ca j'ai compris.

Ensuite il envoit cette valeur : sceIoWrite(fd, &padHighbyte, 1);

ok compris...

mais ca :

		sceCtrlSetSamplingCycle(0);		sceCtrlSetSamplingMode(PSP_CTRL_MODE_DIGITAL);

je ne comprend pas...

Lien vers le commentaire
Partager sur d'autres sites

sceCtrlSetSamplingCycle(0);

Cette ligne permet de définir le cycle concernant le controller. D'après le .h, il faut le mettre à 0. (la méthode te retourne le précédent réglage)

sceCtrlSetSamplingMode(PSP_CTRL_MODE_DIGITAL);

Et celle là signifie le mode da la PSP, si c'est en analogique ou en digital. (la méthode te retourne elle aussi l'ancien mode utilisé)

Après, je n'est pas fait plus de teste approfondis à ce niveau, a toi d'en faire. ;)

(et puis je ne suis pas un pro, j'ai peut-être dis une bétise ^^)

Concernant le décalage de bits, tu t'es un peu trompé. :P

En faites, "0xF285 >> 8" reviens à décaller 0xF285 de 8 bits vers la droite, ce qui nous donnera 0x00F2 (quand on décalle de 8 bits vers la droite, ça reviens à tout décaller d'un octet) --> "1111 0010 1000 0101" et après : "0000 0000 1111 0010".

Mais ce que je ne comprends pas, c'est cette ligne-là :

unsigned char padHighbyte = pad.Buttons >> 8;

Etant donné qu'un char (ou même un unsigned char), c'est un octet, donc 8 bits, si on décalle de 8 bits, on se retrouve avec des 0 partout.

(enfin, je sais pas si vous m'avez compris blush )

(je me suis peut-être aussi un peu trompé :s )

Modifié par MadJ37
Lien vers le commentaire
Partager sur d'autres sites

rien compris, nievau du décalage de bits...

en fait, on va plutot dire que niveau bit, octets, voilà quoi....

et ca lui sett à quoi de faire ca?

Pourquoi n'envoit il pas directement la constante du boutron envoyé?

J'ai éssayé de faire un petit programme qui permet juste de n'afficher le code d'un signal recu qui peut donc venir d'une télécommande, une psp...

Mais je n'arrive pas à le compiler... j'utilise PSPide, et quand je compile :

Make error, no target... ( si vous savez d'où ca peut venir :D )

Bref, je le met en pièce jointe, pouvez vous y jeter un coup d'oeuil, et le compiler si possible ?

main.zip

Modifié par Xo Sonic oX
Lien vers le commentaire
Partager sur d'autres sites

Euh... oui, effectivement, me suis mal expliquer pour le décallage de bits. :s

Par exemple, si on fait "int Toto = 8 >> 2;", on aura donc "Toto = 2;".

Explication :

8 = (1000)

Décaller de 2 bits vers la droite :

(1000) --> (0100) --> (0010) = 2

Donc Toto vaudras 2.

Si on décalle de 3 bits :

(1000) --> (0100) --> (0010) --> (0001) = 1

"8 >> 3 = 1"

Mais si on décalle de 4 bits :

(1000) --> (0100) --> (0010) --> (0001) --> (0000) = 0 (le bits à 1 disparait car il sort du champ "utile")

----------

Faisons un exemple.

Déclarons 2 char :

char TotoH = 0;char TotoB = 0;

Et un int :

int Toto;

Imaginons que l'on mette la valeur 0xF536 à Toto :

Toto = 0xF536;

C'est comme si qu'il avait cette valeur là en bits : (1111 0101 0011 1010)

Faisons cette ligne-là :

TotoH = Toto >> 8;

Nous avons donc 0xF536 décallé d'un octet vers la droite, ce qui nous donne : 0x00F5.

Donc :

Toto == 0xF536

TotoH == 0x00F5 (mais vu que c'est un char, ça deviens 0xF5)

TotoB == 0

Nous voyons donc que TotoH contient les bits de poids fort de Toto.

Celà nous permet donc de faire des tests directement avec TotoH au lieu de faire un masquage.

D'ailleurs, pour mon exemple, si on veux mettre que 0x36 dans TotoB (ce à quoi il est destiné), il faudrait utiliser les masquage. Si tu veux que je te l'explique, dis-le moi. ;)

-----------

Donc, c'est ce que cette ligne de codes fait.

Je la rappelle :

unsigned char padHighbyte = pad.Buttons >> 8;

En regardant dant le fichier "pspCtrl.h", on peux voir que pad.Buttons est un unsigned int ayant la plus grande valeur comme 0x800000.

Les valeurs 0x001000, 0x002000, 0x004000 et 0x008000 désigne respectivement les touches Triangle, Rond, Croix et Carré.

Comme vu plus haut pour le décallage de bits, le mec décalle donc tous ces bits d'un octet vers la droite, ce qui nous donne : 0x000010, 0x000020, 0x000040 et 0x000080. Après, il met ça dans un "char", ce qui nous donne au final les valeurs : 0x10, 0x20, 0x40 et 0x80.

Maintenant, sa variable "padHighByte" représente l'état des touches Triangle, Rond, Croix et Carré.

J'ai était clair ? blush

(si ça l'est pas, ajoute moi à ton MSN si tu l'a, j'essayerais de te l'expliquer autrement ;) )

Modifié par MadJ37
Lien vers le commentaire
Partager sur d'autres sites

Salut, désolé pour le retard de la réponse mais je vois que tu as déjà eu d'excellentes réponses...

Pour ma part, je n'ai fait que partager un lien avec toi (ps2dev.org) dans la mesure ou j'aime bien de temps en temps mettre mon nez dans les sources. Je ne programme pas spécialement sur PSP et encore moins pour manipuler l'IR donc je ne te suis pas d'une grande aide dans ce domaine...

rien compris, nievau du décalage de bits...

en fait, on va plutot dire que niveau bit, octets, voilà quoi....

et ca lui sett à quoi de faire ca?

Pourquoi n'envoit il pas directement la constante du boutron envoyé?

Peut-être tout simplement parce-que les différentes fonctions de ta SDK pour traiter l'IR réclament un char en argument, non? C'était juste une idée parce-que je ne connais pas la SDK qui te sert à développer sur PSP... ;)

Mais je n'arrive pas à le compiler... j'utilise PSPide, et quand je compile :

Make error, no target... ( si vous savez d'où ca peut venir :D )

Je ne programme pas pour PSP mais ce genre d'erreur signifie en général que tu n'as pas de Makefile, non? En général quand on programme avec un RAD (type Visual C++, etc..) ce qu'a l'air d'être PSPide, il faut créer un projet dans lequel tu mets ton code et dans ce cas le makefile doit être généré automatiquement...à condition qu'il trouve l'ensemble des includes (.h) de ta SDK. Peut-être y a t'il une étape de configuration de PSPide que tu as loupée? (genre répertoire où trouver la SDK, le compilo, etc...)

Bon courage!

@+

Lien vers le commentaire
Partager sur d'autres sites

Ca va déjà mieux..

Je t'ajoute dans mon msn ..T'aurais un site explicant les convertion haxadecimal : byte ?

Bon ensuite dans mon programme, j'essaie de recupérer les valeurs d'un signaux infraouge que la psp recoit d'une télécommande, et affiche le code sur l'écran...

Mais une télecommande envoit des signaux en haxadecimal, et moi, j'ai essayé de la récupérer dans une variable "char" qui m'affiche donc des caractère, et dans une variable int ( qui m'affiche un nomre relatif... )

Quel type de variable faut il utiliser pour récupérer la valeur dans une variable en haxadecimal ?

Ensuite, j'aimerais que l'utilisateur puisse renvoyer ce signal ( une sorte de mirroir )...

et donc renvoyer ce code en hexadecimal...

J 'ai essayer avec des "char" d'envoyer un signal... cependant, mon port infrarouge ne s'allume pas, normalement, il doit s'éclairer en rouge ( voir sony remote )... mais rien ne se passe...

Lien vers le commentaire
Partager sur d'autres sites

J'ai bien recu ton invitation MSN. ;)

Faut bien faire la différence entre bytes et bits. 1 bytes = 1 octet = 8 bits.

Après, il n'y a pas de convertion proprement dite pour l'hexadécimal.

Par exemple :

0xFF : 1111 1111

0xFE : 1111 1110

0xFD : 1111 1101

0xFC : 1111 1100

etc...

Dans un processeur, tout est codé en binaire. L'hexadécimal n'est là que pour l'humain, tout en sachant que si tu met un nombre en décimal, en hexa ou en binaire, une fois compilé, tout ça deviens du binaire.

Donc récupérer une valeur hexadécimal est la même chose que récupérer du binaire ou du décimal.

Pour stocker un caractère hexadécimal, un char suffit amplement.

Lien vers le commentaire
Partager sur d'autres sites

Une télécommande renvoit un signal de quel type ?

et donc quelle type de variable utilisé pour récupérer ce signal?

Ensuite, venons en à ceci : sceIoWrite(fd, &padHighbyte, 1);

Je sais que lorsqu'on met un & avant le nom d'une varaible, c'est pour indiquer son adresse, et pas sa valeur...

pourtant, on veut envoyer sa valeur par Ir, et non son adresse, non?

et lorsqu'on envoit un signal avec ir, la led rouge doit s'élairer sur le port infrarouge ou ca ne le fait qu'avec Ircs ?

Modifié par Xo Sonic oX
Lien vers le commentaire
Partager sur d'autres sites

Une télécommande renvoit un signal de quel type ?

et donc quelle type de variable utilisé pour récupérer ce signal?

Normalement ta SDK doit fournir une doc ou au minimum un fichier .h correctement renseigné avec quelques commentaires sur le fonctions disponibles. Je suppose que dans le fichier pspsircs.h tu dois avoir une fonction du style char * sceIoRead( arg1, arg2, ...) et qui te dit ce qu'elle retourne: ici un pointeur sur char (juste un exemple, je connais pas cette SDK...). Tu dois donc pouvoir trouver la réponse et au pire tape toi tranquillement les 3 codes, tu vas bien finir par trouver la réponse...

Ensuite, venons en à ceci : sceIoWrite(fd, &padHighbyte, 1);

Je sais que lorsqu'on met un & avant le nom d'une varaible, c'est pour indiquer son adresse, et pas sa valeur...

pourtant, on veut envoyer sa valeur par Ir, et non son adresse, non?

Qui te dit que dans la fonction sceIoWrite ce n'est pas la valeur qui est traitée? :) C'est ce qu'on appelle un passage par adresse et non par valeur. L'intérêt? Si tu mets padHighByte au lieu de &padHighByte tu ne communiques que la valeur de la variable et toutes les opérations que tu fais à l'intérieur de la fonction n'affectent pas cette variable: elle reste inchangée!! Le fait de mettre &padHighByte fait que la variable manipulée dans la fonction est celle contenue à l'adresse indiquée et donc toute modification affecte la variable...Ce sont des notions qui font intervenir les pointeurs et c'est plutôt chaud. Jette un coup d'oeil ICI pour plus de détails. ;)

et lorsqu'on envoit un signal avec ir, la led rouge doit s'élairer sur le port infrarouge ou ca ne le fait qu'avec Ircs ?

La doc, le fichier header te donneront beaucoup de réponses et à commencer par celle-là sûrement. :ok:

Comme tu as l'air de débuter, je me permets de te donner un petit conseil: lit beaucoup les commentaires des sources ou des fichiers header. De plus si tu veux une bonne base en prog C/C++ je te conseille l'ouvrage Programmation C++ par la pratique de Steve Oualline aux éditions O'Reilly.

Bon courage!

@+

Modifié par m@li
Lien vers le commentaire
Partager sur d'autres sites

Avec MADJ37, on a donc réussi à faire un programme recevant les signaux, et les ffichants..

Nous avons constaté que le signal reçu d'une télécommande, même si on appuie sur la m^me touche, n'est jamais le même...

Donc, en fait on est bloqué au niveau du fonctionnement d'une télécommande...

Lien vers le commentaire
Partager sur d'autres sites

  • 2 weeks later...

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
 Share