martedì 9 giugno 2015

La lettura delle CV (3)

Buona serata ai miei lettori!

Finalmente sono riuscito a sistemare la lettura delle CV sul mio booster. La settimana scorsa ero effettivamente riuscito a leggere le CV in modalità lenta, ma i tempi di acquisizione erano troppo lenti per i miei gusti. La modalità "fastgetcv" offerta da RocRail avrebbe dovuto risolvere il problema, ma in realtà ne ha creato uno nuovo, legato al fatto che il programma leggeva sempre un valore in più rispetto al dovuto.

Lavorando durante il weekend sono riuscito a risolvere il problema.

Prima di tutto mi sono stufato di dover ricompilare tutte le volte TUTTO RocRail anche in presenza di minime variazioni di una porzione di codice secondaria. Di conseguenza, non me ne vogliano a male gli sviluppatori, ho disabilitato la ripulitura del codice a livello di makefile.

Ho pertanto ritoccato il file 'makefile' nella cartella 'rocrail', rimuovendo il comando

$(MAKE) clean PLATFORM=$(PLATFORM) NATIVE=$(NATIVE)$(CS)

dalle righe 162-167 e 171, in pratica da così...

makefile_pre

a così...

makefile_post

(guardate le foto ingrandite se volete vedere qualcosa...)

A questo punto, ogni volta che ricompilo il programma, il sistema si preoccupa soltanto dei file che ho modificato, così da mezzora di compilazione siamo passati ad un minuto. Ora sì che si ragiona!

Bene. Ora tocca alla funzione 'nmragetcvbyte' a cui si fa riferimento alla riga 495 di ddx.c. Questa funzione si occupa di inviare il segnale DCC per la lettura della CV ed aspettare il segnale di ACK corrispondente.

La parte incriminata della funzione parte intorno alla riga 1356, ovvero il ciclo di lettura vero e proprio. Immagino che le sviste di programmazione presenti siano legate ad una sedimentazione di diverse versioni, o almeno lo spero...

Dopo aver rimosso alcune inizializzazioni multiple della variale associata al segnale di ACK, la vera chiave di volta per il mio booster è stato abilitare il ciclo di attesa 'waitMM' anche in modalità 'fastgetcv'. Ovvero ho sostituito questo:

SerialOp.flush(data->serial);
ack = scanACK(data->serial);
sendsize = __createCVgetpacket(cv, value, SendStream, start);
if( value % 10 == 0 || !fastcvget )
  TraceOp.trc( __FILE__, TRCLEVEL_MONITOR, __LINE__, 9999,\
   "PT: sending %d bytes checking value %d...", sendsize, value);
SerialOp.write(data->serial,SendStream,sendsize);
if (start)
  ThreadOp.sleep(240);
else if( !fastcvget )
  ThreadOp.sleep(40);
ack = 0;
/* wait for UART: */
ack=waitUARTempty_scanACK(data->serial);
for( i = 0; i < (fastcvget ? 5:120) && ack == 0; i++ ) {
  ack = scanACK(data->serial);
  if( !fastcvget )
    SerialOp.waitMM(data->serial,5000,100);
}

con questo:

SerialOp.flush(data->serial);
sendsize = __createCVgetpacket(cv, value, SendStream, start);
if( value % 10 == 0 || !fastcvget )
  TraceOp.trc( __FILE__, TRCLEVEL_MONITOR, __LINE__, 9999,\
    "PT: sending %d bytes checking value %d...", sendsize, value);
SerialOp.write(data->serial,SendStream,sendsize);
if (start)
  ThreadOp.sleep(240);
else if( !fastcvget )
  ThreadOp.sleep(40);
/* wait for UART: */
ack = waitUARTempty_scanACK(data->serial);
for( i = 0; (ack == 0) && i < (fastcvget ? 5:120); i++ ) {
  ack = scanACK(data->serial);
  SerialOp.waitMM(data->serial,5000,100);
}

Non è molto diverso, ma è quel tanto che basta per fare la differenza! Ora posso finalmente scaricare il profilo di velocità della mia E191.003 FuoriMuro.

curvaVel_E191

Ed infatti, eccolo qui. Giusto qualche minuto di attesa e finalmente ho sotto mano la curva.
Ora posso sistemare la velocità massima e tutte le intermedie come si deve.

A presto!

Nessun commento:

Posta un commento