Page 3 sur 9

Re: wDSPiy

Posté : lun. 5 déc. 2016 18:22
par thierryvalk
Voici un firmware qui pour code Sony va passer d'office les actions Multidspiy.


Non testé.

edit alka: suppprimé firmware remplacé par la version suivante

Re: wDSPiy

Posté : lun. 5 déc. 2016 18:30
par alka
sur l'entrée IR ou TriggerIN ?
je teste des que possible :)

Re: wDSPiy

Posté : lun. 5 déc. 2016 18:38
par thierryvalk
Les deux.

Re: wDSPiy

Posté : mar. 6 déc. 2016 20:33
par alka
testé sur quelques codes et semble ok. merci.
Le plus long a été la préparation car je n'avais rien pour Sony. Une fois mes bétises débuggées, le mix de codes adresse 0/adresse 29 fonctionne bien sur l'entrée IR. Pas testé sur entrée TriggerIn.

Prochaine étape : revoir mon code pour exploiter tout ça proprement et en profiter pour faire le ménage, harmoniser, modulariser... c'est que ça devient gros cette affaire ;)

Re: wDSPiy

Posté : dim. 11 déc. 2016 12:58
par alka
la suite...
Les parametres sont maintenant dans un fichier .txt stocké dans la partition données de la flash. Je peux mettre a jour par wifi en ftp. Super pratique d'éditer sur le pc et transférer. La prochaine étape est de stocker des parties statiques du serveur web (css, javascript, ...) de la meme manière pour faciliter le développement, test et mise a jour de la partie affichage web.

Pour la commande par IR en combinant des codes IR sony et codes multiDSPiy, je me heurte a deux éceuils.
Le premier est une anomalie me semble t il.
1. avec le nouveau firmware, tout se passe comme si les parametres NWAITCODE=1 et NLACTION=0 n'étaient pas pris en compte. Il me faut envoyer 3 fois un code IR "ON" pour le réveiller et 4 fois "unMute" pour sortir du mute. Pour SBY ou Mute un seul envoi suffit. Pour Vol+ et Vol- : le premier ordre passe de suite mais pas les suivants. Il finit par les accepter en gardant le bouton telecommande appuyé longtemps mais je n'ai pas encore réussi a comprendre sous quelles conditions. Les codes multidspiy eux sont pris en compte immédiatement mais... c'est le point 2.

2. quand il reçoit un code entrant multiDSPiy, le DSPiy n'emet pas en multiDSPiy sur IsoOut. Plus de feedback.
Ca peut se comprendre : quand il reçoit un ordre multidspiy , il est supposé etre slave et il n'est pas prévu qu'un esclave parle. J'imagine que ça ne facherait personne qu'un slave puisse aussi émettre en multidspiy ce qu'il reçoit en multidspiy. Spartacus ? ;)

Je réfléchis a des solutions.

Re: wDSPiy

Posté : dim. 11 déc. 2016 18:22
par thierryvalk
1. avec le nouveau firmware, tout se passe comme si les parametres NWAITCODE=1 et NLACTION=0 n'étaient pas pris en compte.

Il n'y a pas de raison.

2. Comme tu le dis, c'est logique.
Fâcherait personne mais complique le code car le Out devrait se faire pour chaque commande puis pas très logique vu que c'est de l'absolu, pourquoi renvoyer ce que l'on a reçu ?

Peut-être plus simple à mon niveau et plus pratique tout en étant plus logique, créer un code IR qui donnerait sur le Out l'état du DSPiy ?

Re: wDSPiy

Posté : dim. 11 déc. 2016 20:58
par alka
thierryvalk a écrit :
1. avec le nouveau firmware, tout se passe comme si les parametres NWAITCODE=1 et NLACTION=0 n'étaient pas pris en compte.

Il n'y a pas de raison.
je ne vois pas de raison non plus et pourtant... y a quelquechose qui cloche et ça y ressemble bigrement. je ne sais pas trop comment valider que c'est bien ça.

2.
Peut-être plus simple à mon niveau et plus pratique tout en étant plus logique, créer un code IR qui donnerait sur le Out l'état du DSPiy ?

c'est une idée.
Par exemple, il reçoit un code IR sony (adresse 30, commande 127 ) et il enverrait sur IsoOout 4 trames successives :
Address 31, commande = encodage sur 1 bit de son état (ON ou SBY), et 1 bit pour Mute ou unMute,
Address 32, commande = encodage sur 7 bits du numéro de preset en cours (4 bits) et numéro de source (3 bits).
Address 32, commande = code volume de 0 à 110
Address 33, commande = code balance de 1 à 50
ou alors prévoir 4 codes de demande séparés (adr 30 - cmd 124, 125, 126, 127) et il ne répond qu'une trame, histoire de ne pas surcharger inutilement le traffic.


Pour l'instant, j'arrive a m'en sortir en bombardant de codes pour contrer 1.
Pour le 2, j'utilise au maximum les codes IR directs qui provoquent la réponse multiDSpiy et pour le reste, j'envoie "en aveugle". Si une commande a raté, ca finira par se resynchroniser au prochain multidspiy recu (si je touche un bouton par exemple). Pour l'instant faut dire que ca ne rate jamais donc le feedback est plutot une assurance.

ton idée me plait quand même car me permettrait de savoir Source et Preset auxquels je n'ai aucun accès.

Re: wDSPiy

Posté : dim. 11 déc. 2016 21:09
par thierryvalk
ou alors prévoir 4 codes de demande séparés (adr 30 - cmd 124, 125, 126, 127) et il ne répond qu'une trame, histoire de ne pas surcharger inutilement le traffic.

Je préfère car envoyer une trame n'est pas brocante mais plusieurs oui.

Et en I2C comme je l'avais proposé? Car tout ceci reste un peu du bricolage, une commande telco n'a rien avoir avec ce que tu fais.

Re: wDSPiy

Posté : dim. 11 déc. 2016 21:25
par alka
thierryvalk a écrit :
ou alors prévoir 4 codes de demande séparés (adr 30 - cmd 124, 125, 126, 127) et il ne répond qu'une trame, histoire de ne pas surcharger inutilement le traffic.
Je préfère car envoyer une trame n'est pas brocante mais plusieurs oui.
tiens une nouvelle expression... ;)

Et en I2C comme je l'avais proposé? Car tout ceci reste un peu du bricolage, une commande telco n'a rien avoir avec ce que tu fais.
je sais bien mais c'est ce qui existe pour communiquer et finalement, ca marche bien vu la vitesse lente des interactions. Ca ressemble a une télécommande avec retour d'information. Passer à l' i2c devient intrusif, donc potentiellement risqué pour l'intégrité du dspiy si je fais une bétise. Et puis gros boulot de firmware coté DSPiy pour prévoir une interface de pilotage par I2C. Pour si peu d'usage, c'est trop de travail.

Re: wDSPiy

Posté : lun. 12 déc. 2016 01:00
par alka
tiens, je relisais le code de l'entrée IR du DSPiy publié plus haut. J'aurai du lire bien en détail la première fois, j'aurai gagné du temps :mrgreen:

Code : Tout sélectionner

if(D01_IR_CODE==1)if(IRcode==laction){laction=0xff;return 1;}//return si même action 2 fois de suite pour sony12bits
            laction=IRcode;

            if(nwaitcode){nwaitcode--; return 1;}

Cette particuliarité "doublon Sony" explique bien des choses !
En outre, pourquoi je n'arrivais plus a rien en envoyant deux fois de suite Vol+ ou Vol- pour sauter les volumes décimaux alors que ça marchait tres bien en Nec.

envoi successifs de monCode sony (D01_NWAITCODE est configuré à 1)
je suppose que hors de la fonction, nwaitcode est mis à 0 au départ. sinon nwait a la valeur mise précédemment.

1er envoi: accepté car monCode != laction et nwaitcode=0 ou refusé si nwaitcode avait été mis a 1 (SBY ou MUTE)
si accepté : nwait devient -1 reste a 0 ; laction devient monCode ; plus loin loin nwait est mis à 1 pour les codes mute, standby.
si refusé pour cause de doublon (toggle mute/unmute) nwaitcode reste inchangé à 1.
si refusé pour cause de nwait >0 (cas du ON), nwait décrémenté devient 0.

2eme : refusé car doublon sony. nwait inchangé et laction devient FF

3eme: accepté si nwait est =0 (cas du ON) soit refusé si nwait =1 (cas du MUTE). nwait décrémenté et devient 0.

4eme : refusé car doublon si accepté au coup d'avant ou accepté sinon.
Ensuite, un sur deux est accepté

explique ce que je trouvais empiriquement : faut envoyer 4 fois unmute apres un mute puisque c'est la meme touche bascule et que nwait est initialisé a 1 lors du MUTE
Explique aussi pourquoi 3x ON quand il est en sby puisque nwait est initialisé à 1 lors de la mise en SBY et ce n'est pas le meme code pour ON et SBY dans la configuration.

Une plaie ce "doublon sony". Ca doit bien perturber l'appui long sur Vol+/Vol-.
Peut etre essayer d'envoyer un code intermédiaire qui n'existe pas pour le tromper.

edit: correction dans la compréhension du déroulement du code

Re: wDSPiy

Posté : lun. 12 déc. 2016 01:09
par alka
cette gestion de doublon sony ne pourrait pas être liée a une config télécommande nommée Sonyx2 par exemple, afin de ne pas pénaliser ceux qui ont une télécommande normale qui n'envoie pas tout en double ?

Re: wDSPiy

Posté : lun. 12 déc. 2016 01:25
par alka
et pendant qu'on y est ce serait possible de rajouter une ligne :

Code : Tout sélectionner

static unsigned char laction;
//static unsigned char blaction;
static unsigned char nlaction;
static unsigned char nwaitcode;
unsigned char preset_actl;

            if(D01_IR_NWAITCODE==0) D01_IR_NWAITCODE = 3;   // pour la compatibilite avec le passe
            if(D01_IR_NWAITCODE==127) D01_IR_NWAITCODE = 0;  //  <---- ajout pour permettre nwaitcode = 0

IRnewcode=0;
//tempo repeat

Re: wDSPiy

Posté : lun. 12 déc. 2016 08:09
par thierryvalk
nwait devient -1. laction devient monCode.

Je doute qu''il devienne -1.

Il me semble que c'est bien dans le protocole Sony d'envoyer 2x la même commande, en théorie, on devrait les vérifier pour sécurisé la réception.

vais voir avec le code, mais cela me semble bien possible de rajouter :

if(D01_IR_NWAITCODE==127) D01_IR_NWAITCODE = 0; // <---- ajout pour permettre nwaitcode = 0

Re: wDSPiy

Posté : lun. 12 déc. 2016 08:27
par alka
oui j'y ai pensé apres. J'ai édité car nwait reste a 0. c'etait trop tard hier :0
Sur le fond ca explique tout de meme pourquoi 4 et pourquoi 3.

Sony "officiel" n'envoie pas les commandes en double. Certaines télécommandes prennent peut etre des libertés. Les commandes sont répétées toutes les 45ms si on maintient la touche enfoncée ce qui est autre chose. Peut etre que la confusion vient de la ?
http://www.sbprojects.com/knowledge/ir/sirc.php

Re: wDSPiy

Posté : lun. 12 déc. 2016 08:53
par alka
thierryvalk a écrit :vais voir avec le code, mais cela me semble bien possible de rajouter :

if(D01_IR_NWAITCODE==127) D01_IR_NWAITCODE = 0; // <---- ajout pour permettre nwaitcode = 0

merci
j'ai mis 127 mais c'est peut etre une valeur utilisée pour des tests.
C'est sans doute mieux de mettre une valeur bien précise comme 99 ou 126. personne n'ira mettre ce genre de valeur normalement.

Re: wDSPiy

Posté : lun. 12 déc. 2016 08:55
par thierryvalk
Sony "officiel" n'envoie pas les commandes en double.

As-tu la vraie doc officielle ? celle de Sony ?
Pour ma part, testé avec une vraie telco Sony.

Re: wDSPiy

Posté : lun. 12 déc. 2016 10:41
par alka
je fais appel a mon avocat :)
Pas acces aux documents de Sony , mais :
- les librairies qui décodent le Sony pour arduino n'implémentent pas ce double code. Vu le nombre d'utilisateurs, ça se serait remarqué s'il y avait un défaut.
- testé avec une Logitech Harmony en émulateur sony et elle ne le fait pas
- les docs disponibles sur internet n'en parlent pas. Deux exemples sérieux :
-- http://www.sbprojects.com/knowledge/ir/sirc.php
-- http://picprojects.org.uk/projects/sirc/sonysirc.pdf

Je pense que c'est tout bete : confusion avec le repeat de codes. Ou alors tu possède le seul modele de télécommande sony bègue :(

C'est embétant de créer un nouveau protocole Sony1 avec le numéro 6 qui est libre ? ca réglerait le souci sans perturber personne.

Ou alors lier au parametre D01_IR_NWAITCODE :

Code : Tout sélectionner

if(D01_IR_CODE==1)if((IRcode==laction)&&(D01_IR_NWAITCODE != 126)){laction=0xff;return 1;}//return si même action 2 fois de suite pour sony12bits
            laction=IRcode;

            if(D01_IR_NWAITCODE==0) D01_IR_NWAITCODE = 3;   // pour la compatibilite avec le passe
            if(D01_IR_NWAITCODE==126) D01_IR_NWAITCODE = 0;  //  <---- ajout pour permettre nwaitcode = 0




Sinon, je viens de tester un joli (ou moche c'est selon) hack qui fonctionne parfaitement avec le DSPiy
envoi MUTE + code sony fake (0x01 qui correspond a adr=0, cmd=120 inutilisé)
a réception du code fake, laction est changé ET nwaitcode est décrémenté devient 0

le premier UNMUTE qui suit est traité :)

Re: wDSPiy

Posté : lun. 12 déc. 2016 17:09
par thierryvalk
je fais appel a mon avocat :

sous la menace.
<fichier supprimé>

Code : Tout sélectionner

void multidspiy_in()
{
        unsigned char preset_actl;
        unsigned char vmout=0;

        if(IRdevice==29)//test adresse si nouvelle trame
                    {
                    if(IRcode<111)//volume
                        {volume_level=IRcode;update_volume();
                        lvolume_level=volume_level;
                        return;}
                    if(IRcode<120)//preset
                        {preset_actl=IRcode-110;if(load_prog_flash(preset_actl,0)){preset_act=preset_actl;pact_save=Tpactsave;return;}
                        }
                    if(IRcode==121)//standby
                        {if(!standby_mode)standby();}
                    if(IRcode==122)//out standby
                        {if(standby_mode==1){standby_mode=2;}
                        }
                    if(IRcode==123)//mute
                        {Mute();vmute=0;}
                    if(IRcode==124)//unmute
                        {vmute=3;}
                        return;
                    }
        if(IRdevice==30)
                    {
                    if(IRcode<51)//balance
                        {balance_level=IRcode;update_volume();pact_save=Tpactsave;return;}
                    if(IRcode<61)//newsource
                        {newsource=IRcode-50;select_sourceIR(3);return;}
                    if(IRcode==61)//lecture volume
                        {vmout=volume_level;}
                    if(IRcode==62)//lecture preset act
                        {vmout=preset_act;}
                    if(IRcode==63)//lecture etat standby
                        {
                        if(standby_mode==1){vmout=122;}
                        if(!standby_mode){vmout=121;}
                        }
                    if(IRcode==64)//lecture etat mute
                        {
                        if(vmute){vmout=124;}
                        else {vmout=123;}
                        }

                    if(vmout){multidspyout((29<<7)+vmout);return;}

                    if(IRcode==65)//lecture balance
                        {vmout=balance_level;}
                    if(IRcode==66)//lecture source
                        {vmout=newsource;}

                    if(vmout){multidspyout((30<<7)+vmout);return;}
                    }
 


Code : Tout sélectionner

....
            if(D01_IR_NWAITCODE==0)D01_IR_NWAITCODE=3;

IRnewcode=0;
//tempo repeat

            if(D01_IR_NWAITCODE != 126)if(D01_IR_CODE==1)if(IRcode==laction){laction=0xff;return 1;}//return si même action 2 fois de suite pour sony12bits
            laction=IRcode;

            if(D01_IR_NWAITCODE != 126)if(nwaitcode){nwaitcode--; return 1;}
....
 

Non testé, a voir s'il n'y a pas d'inversion dans les code Standby et mute.