Auteur Sujet: Fonctions DCC de 21 à 28  (Lu 14993 fois)

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Fonctions DCC de 21 à 28
« le: octobre 10, 2018, 01:52:31 am »
Bonjour à tous,
j'ai trouvé une explication sur les fonctions mais que de 0 à 20, la voici:
// Format DCC des fonctions
<f CAB BYTE1 [BYTE2]>

F0-F4 : BYTE1: 128 + (F1 * 1) + (F2 * 2) + (F3 * 4) + (F4 * 8) + (F0 * 16)
128 = 10000000

F5-F8 : BYTE1: 176 + (F5 * 1) + (F6 * 2) + (F7 * 4) + (F8 * 8)
176 = 10110000

F9-F12 : BYTE1: 160 + (F9 * 1) + (F10 * 2) + (F11 * 4) + (F12 * 8)
160 = 10100000

F13-F20 : BYTE1: 222
BYTE2: (F13*1) + (F14*2) + (F15*4) + (F16*8) + (F17*16) + (F18*32) + (F19*64) + (F20*128)

Je suppose que parmi les grands spécialistes du forum il se trouve une âme charitable qui pourrait me fournir le codage des fonctions de 21 à 28.

Je vous en remercie par avance.

Cordialement
Antoine

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #1 le: octobre 10, 2018, 08:52:53 am »
Bonjour,

Je ne vois pas trop où est ton problème à partir du moment où tu as fait le plus difficile et es déjà allé jusqu'à F20. Pour F21 à 28, c'est la même chose qu'avec F13-F20 sauf byte 1 = 223

$scope.setFn = function (n) { // OPERATE ENGINE DECODER FUNCTIONS F0-F28
var res = 0;
var arg = 0;
var data = "f"; // <f CAB BYTE1 [BYTE2]>
data += " ";
data += $scope.locoSelectionnee.address;
data += " ";

for( var i = 0; i < arguments.length; i++) {
$scope.locoSelectionnee.fn[arguments[i]] = $scope.locoSelectionnee.btn_fn[arguments[i]] ? Math.pow(2, i) : 0;
res += $scope.locoSelectionnee.fn[arguments[i]];
}
switch (n) {
case 0:
data += 128 + res;
break;
case 5:
data += 176 + res;
break;
case 9:
data += 160 + res;
break;
case 13:
data += 222;
data += " ";
data += res;
break;
case 21:
data += 223;
data += " ";
data += res;
break;
}
$scope.setParamLocos(data);
}

C'est aussi expliqué sur le github : https://github.com/DccPlusPlus/BaseStation/wiki/Commands-for-DCCpp-BaseStation

Bien amicalement

Christophe

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #2 le: octobre 10, 2018, 09:04:20 am »
Bonjour Christophe,

en effet, maintenant il y a aussi les fonctions de 21 à 28 sur GITHUB, ce n'était pas le cas quand je l'avais consulté pour prendre mes premières infos.

En tous les cas merci à toi pour la rapidité de ta réponse.

Bonne journée à tous.
Antoine

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #3 le: octobre 10, 2018, 06:30:09 pm »
Re Bonjour,

je me trouve devant un autre (petit) casse-tête pour un ami qui a des locos avec 64 crans de vitesse.
Comment dois-je gérer cette exception avec DCCpp, faut-il tout simplement afficher 64 et envoyer 128 (127) à l'arduino ou y a-t-il une autre solution.

Au sujet de ces 127 crans, toutes les centrales affichent 128 au maximum, alors que DCCpp n'accepte que 127 (voir 126, il faudrait que je fasse un nouveau test).
J'ai lu dans PacketRegister.cpp que 1 correspond à l'arrêt d'urgence, est-ce à dire que si j'envoie <t 1 3 11> ma loco va s'arrêter (la aussi nouveau test à faire mais ma centrale est indisponible pour l'instant). Je suis preneur de tout éclaircissement.

Merci par avance et bonne soirée à tous
Antoine

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 904
  • HO avec DCC++
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #4 le: octobre 10, 2018, 07:36:44 pm »
Mon cher Antoine, l'arrêt d'urgence, aussi appelé e stop est - 1 !!!

        //*******************************************************************************************//
//*************************************** eStop ********************************************//
//*******************************************************************************************//


// Arret immediat de la locomotive
$scope.eStop = function() {
if($scope.locoSelectionnee != null) {
$scope.locoSelectionnee.vitesse = -1;
$scope.setTraction ();
}
}

Quand tu sais pas tu demandes ;-))))))

Et contrairement à ce que l'on peut voir de temps en temps, selon la norme NMRA, l'e stop ne s'applique que pour une loco. Pour tout arrêter, faire par exemple une boucle for sur les locos dont la vitesse est supérieure à 0.

Bien amicalement

Christophe


Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #5 le: octobre 10, 2018, 09:54:00 pm »
Citer
Quand tu sais pas tu demandes ;-))))))
Je ne m'en prive pas comme tu peux le voir, mais voilà pourquoi j'étais dans mon idée:
void RegisterList::setThrottle(int nReg, int cab, int tSpeed, int tDirection) volatile
.......
b[nB++] = 0x3F;                        // 128-step speed control byte
if (tSpeed >= 0)
b[nB++] = tSpeed + (tSpeed>0) + tDirection * 128;   // max speed is 126, but speed codes range from 2-127 (0=stop, 1=emergency stop)
else {
.......

on ne me parle pas de -1 dans ce void mais bien de 1, et c'est là aussi que je me pose la question des crans (127, 128 ???)

Facile le DCC disiez-vous ? Non, mais tellement passionnant.

Merci Christophe et à+

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 744
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #6 le: octobre 11, 2018, 10:50:34 am »
Pour être plus précis, il faut se référer à la norme NMRA https://www.nmra.org/sites/default/files/s-9.2.1_2012_07.pdf qui définit les valeurs possibles pour la vitesse. Extraits :

Mode 14 pas de vitesse:
Citer
In this mode, Speed U0000 is stop, speed U0001 is emergency stop, speed U0010 is the
first speed step and speed U1111 is full speed
. This provides 14 discrete speed steps in each direction.
250 If a decoder receives a new speed step that is within one step of current speed step, the Digital Decoder may select a
step half way between these two speed steps. This provides the potential to control 56 speed steps should the
command station alternate speed packets.

Mode 128 pas
Citer
CCCCC = 11111: 128 Speed Step Control - Instruction "11111" is used to send one of 126 Digital Decoder speed
steps. The subsequent single byte shall define speed and direction with bit 7 being direction ("1" is forward and "0"
is reverse) and the remaining bits used to indicate speed. The most significant speed bit is bit 6. A data-byte value
of U0000000 is used for stop, and a data-byte value of U0000001 is used for emergency stop
. This allows up to 126
210 speed steps.

Il me semble que dans tous les cas, 0 signifie vitesse 0 donc arrêt normal, 1 impose un arrêt immédiat à l'engin moteur concerné, et le reste donne les différents crans de vitesse.

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #7 le: octobre 11, 2018, 02:33:29 pm »
Bonjour Thierry, Christophe et tous les autres,

1 ou -1 that is the question. Je passerai par des essais, merci pour ta réponse claire sur les pas.

J'en ai une autre beaucoup plus pointue. Comme je vous l'ai déjà annoncé à maintes reprises, je n'arrive absolument pas à intégrer ou plutôt à appliquer le monde des objets.
Pour un cas un peu particulier je voudrais, dans mon code, récupérer la réponse de DCCpp pour l'écriture d'un CV. Pour la lecture j'ai réussi avec cela:
int monINT = DCCpp::progRegs.readCV(3,101,101);
Serial.print("monINT = ");
Serial.println(monINT);
DCCpp me répond bien par la bonne valeur dans monINT.

Tout fier du résultat, j'ai lancé cela pour écrire un CV:
int monINTW = DCCpp::progRegs.writeCVByte(1,11,101,101);
Serial.print("monINTW = ");
Serial.println(monINTW);

Mais là la réponse est: "invalid use of void expression"

De toute façon j'ai le mauvais pressentiment que même pour la lecture mon code n'est pas correct. J'ai bien essayer de "fouiller" désespérément dans  ta bibliothèque "DcDccNanoController" pour trouver une guide mais j'ai abandonné pour les raisons évoquées plus haut (autrement dit, je suis nul).

Pourriez-vous une fois de plus me guider dans cette opération ?

Merci par avance
Antoine

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 744
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #8 le: octobre 11, 2018, 03:00:34 pm »
La réponse est visible à deux endroits : le fichier include concernant le type utilisé, ici un RegisterList puisque tu utilises DCCpp::progRegs, c'est à dire en clair PacketRegister.h . Si tu cherches readCV() tu verras que le type de retour est fixé à 'int'. writeCVByte() et assimilés n'ont pas de valeur de retour : 'void' pour vide en Français. Donc tu ne peux pas récupérer d'information suite à l'écriture. C'est conforme à l'implémentation originale de DCC++ par Gregg .
L'autre endroit, c'est la documentation livrée avec la bibliothèque, visible depuis son répertoire 'extras' en cliquant sur le fichier index.html , toujours en cherchant RegisterList et writeCVByte().
Enfin, il n'y a que très peu de besoins justifiants de passer par autre chose que les fonctions de DCCpp, et ton utilisation n'en fait pas partie. Ce n'est pas faux, mais DCCpp est justement là pour masquer la complexité de ce qu'il y a derrière. Tu devrais utiliser DCCpp::readCVProg() et DCCpp::writeCVProg() ...

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 744
    • Voir le profil
Re : Re : Fonctions DCC de 21 à 28
« Réponse #9 le: octobre 11, 2018, 03:03:20 pm »
1 ou -1 that is the question. Je passerai par des essais, merci pour ta réponse claire sur les pas.

Sans vouloir fâcher qui que ce soit, c'est tout vu ! N'oublions pas que l'on parle d'arguments passés en DCC sous forme de bits. Or lorsqu'on parle de -1 sur un champs de bit qui n'a pas de signe comme ici, dire -1 revient à mettre tous les bits à 1 ! En clair si tu mets -1 tu iras à fond !

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Re : Fonctions DCC de 21 à 28
« Réponse #10 le: octobre 11, 2018, 06:57:18 pm »
Tu devrais utiliser DCCpp::readCVProg() et DCCpp::writeCVProg() ...

Ça y est, j'ai eu du mal mais j'ai trouvé grâce à ton conseil Thierry, de plus tu m'as fais découvrir une doc fort intéressante.

Sujet clos, merci à vous et bonne soirée.

Cordialement
Antoine
« Modifié: octobre 11, 2018, 08:52:57 pm par Tony04 »

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #11 le: octobre 15, 2018, 11:25:59 pm »
Bonjour à tous,

je reviens à la charge pour mon problème de 28, 64 ou 128 crans selon le décodeur de la loco.

Est-ce que à votre connaissance DCCpp permet d'utiliser ce genre de décodeur (28 ou 64), j'ai beau chercher dans la doc html et à part dans le titre de la page "Text Commands Syntax" ou la seconde ligne est: SET ENGINE THROTTLES USING 128-STEP SPEED CONTROL , je n'ai rien trouvé.

Merci pour vos retours d'expériences.

Cordialement
Antoine

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #12 le: octobre 16, 2018, 04:57:06 pm »
Bonjour Antoine,

La norme NMRA ne mentionne pas de vitesse sur 64 crans :
https://www.nmra.org/sites/default/files/s-9.2.1_2012_07.pdf

C’est soit 28 soit 128.

DCC++ gère 128 crans et je ne vois pas bien l’intérêt des 28 crans sauf avec des très vieux décodeurs.

Dominique
Cordialement,
Dominique

Tony04

  • Hero Member
  • *****
  • Messages: 549
    • Voir le profil
Re : Fonctions DCC de 21 à 28
« Réponse #13 le: octobre 16, 2018, 07:26:07 pm »
Merci et bonsoir Dominique,
c'est un ami du club de Grasse qui utilise des locos américaines et qui m'a demandé cela;
donc je peux répondre sans me tromper que DCCpp ne gère que les 128 pas.

Très bonne soirée.
Antoine