1

Modificaciones DCCpp 1.4.2

Buenas a todos! Hace relativamente poco que salio la ultima actualización de la librería DCCpp de Locoduino y he aprovechado para actualizar las partes de la librería que tengo añadidos como el bluetooth y pantalla Oled

Por el momento va a ir todo un poco «apelotonado» por que lo voy haciendo al mismo tiempo que modifico y eso me lleva algo más de tiempo.

En la parte de bluetooth he creado sus propios archivos y he utilizado la misma función que utilizan en la librería DCCppEx (otra librería derivada de la original) la cual envía el comando en vez de construirlo parte a parte un ejemplo con el comando T:

Locoduino:

DCCPP_INTERFACE.print("<T");
DCCPP_INTERFACE.print(nReg); DCCPP_INTERFACE.print(" ");
DCCPP_INTERFACE.print(cab); DCCPP_INTERFACE.print(" ");
DCCPP_INTERFACE.print(tSpeed); DCCPP_INTERFACE.print(" ");
DCCPP_INTERFACE.print(tDirection);	DCCPP_INTERFACE.print(">");

Queda resumido en una sola linea:

Bluetooth::printf("<T%d %d %d %d>", nReg, cab, tSpeed, tDirection);	 

La parte Serial original no la he tocado, pero se podría cambiar también para añadirlo en el archivo TextCommand.cpp.

A continuación las partes que llevo ya modificadas y que publicaré después de hace una cuantas pruebas con el DCCpp Cab para el que dentro de poco también tendrá actualización.

Modificaciones de la librería DCCpp de Locoduino:

Archivo SerialDcc.ino:

void setup()
   Serial1.begin(115200); // Activa Serial1 para Bluetooth

Archivo Bluetooth.cpp:

// Bluetooth.cpp

#include "Arduino.h"

#include "DCCpp.h"
#include "Bluetooth.h"
#include "TextCommand.h"


////////////////////////

char Bluetooth::btCommandString[BT_MAX_COMMAND_LENGTH+1];

////////////////////////
void Bluetooth::btprocess(){

  char c;

	
	  // SERIAL1 case

while (BLUETOOTH.available()>0) {    // while there is data on the serial line
	c = BLUETOOTH.read();
	if (c == '<')         // start of new command
		btCommandString[0] = 0;
	else if (c == '>')    // end of new command
		TextCommand::parse(btCommandString);
	else if (strlen(btCommandString) < BT_MAX_COMMAND_LENGTH)	// if btCommandString still has space, append character just read from serial line
		sprintf(btCommandString, "%s%c", btCommandString, c);	// otherwise, character is ignored (but continue to look for '<' or '>')

} // while
		
} 

void Bluetooth::printf(const char *fmt, ...) {
	char buf[128] = {0};
	va_list args;
	va_start(args, fmt);
	vsnprintf(buf, sizeof(buf), fmt, args);
	va_end(args);
	
	#ifdef USE_BLUETOOTH
		BLUETOOTH.println(buf);
	#endif
}

Archivo Bluetooth.h:

//Bluetooth.h
#ifndef Bluetooth_h
#define Bluetooth_h

#include "Arduino.h"
#include "DCCpp.h"
#include "PacketRegister.h"
#include "CurrentMonitor.h"

#define BLUETOOTH Serial1
#define BT_MAX_COMMAND_LENGTH         30


class Bluetooth {
public:
	static char btCommandString[BT_MAX_COMMAND_LENGTH+1];
 	static void btprocess();
	static void printf(const char *fmt, ...);

};

#endif

Archivo DCCpp.cpp:

void DCCpp::loop ->
#ifdef USE_BLUETOOTH
	Bluetooth::btprocess();
#endif 
#ifdef USE_OLED
	Oled::updateOled();
#endif
//////////

void DCCpp::powerOff ->
#if defined USE_BLUETOOTH
	Bluetooth::printf("<p0>";
#endif
#ifdef USE_OLED
	Oled::showOledOn(false);   // OLED
#endif
#ifdef USE_SOUND
	Sound::SoundOff(); 
#endif
///////////

void DCCpp::powerOn ->
#if defined USE_BLUETOOTH
	Bluetooth::printf("<p1>";
#endif
#ifdef USE_OLED
	Oled::showOledOn(true);   // OLED
#endif
#ifdef USE_SOUND
	Sound::SoundOn(); 
#endif

Archivo TextCommand.cpp:

bool TextCommand::parse ->
case 'c':
#if defined USE_BLUETOOTH
	Bluetooth::printf("<a%d>", data.id);
#endif
case 'E':
#if defined USE_BLUETOOTH
	Bluetooth::printf("<e%d %d %d>", 
          EEStore::data.nTurnouts, 
          EEStore::data.nSensors, 
          EEStore::data.nOutputs);
#endif
case 'e':
#if defined USE_BLUETOOTH
	Bluetooth::printf("<O>");
#endif
case 'F':     
#ifdef USE_BLUETOOTH
	BLUETOOTH.print("<f");
	BLUETOOTH.print((int) &v - (__brkval == 0 ? (int)
         &__heap_start : (int) __brkval));
	BLUETOOTH.print(">");
#ifdef USE_OLED
	Sram = (int) &v - (__brkval == 0 ? (int) &__heap_start : 
          (int) __brkval);
	Oled::printSram(Sram);
#endif

Archivo Turnout.cpp

#ifdef USE_BLUETOOTH
#include "Bluetooth.h"
#endif
#ifdef USE_OLED
#include "Oled.h"
#endif

void Turnout::begin ->
#if defined USE_BLUETOOTH
	Bluetooth::printf("<O>");	 
#endif
/////////

void Turnout::activate ->
#ifdef USE_BLUETOOTH
	if (data.tStatus == 0){
		Bluetooth::printf("<H%d %d>", data.id, 0);	 
	} else {
		Bluetooth::printf("<H%d %d>", data.id, 1);	 
	}
#endif
#ifdef USE_OLED
	Oled::printAccesories(this->data.address, this->data.subAddress, this->data.tStatus); // OLED
#endif		
/////////

void Turnout::remove
#if defined USE_BLUETOOTH
	Bluetooth::printf("<X>");	 
#endif
#ifdef USE_SOUND
	Sound::ActionOff();
#endif
#if defined USE_BLUETOOTH
	Bluetooth::printf("<O>");	 
#endif
#ifdef USE_SOUND
	Sound::ActionOK();
#endif
/////////

void Turnout::store ->
#ifdef USE_OLED 
	Oled::printSaved( 0, true);
#endif
/////////

bool Turnout::parse
#if defined USE_BLUETOOTH
	if (t->data.tStatus == 0){
		Bluetooth::printf("<H%d %d>", n, 0);	 
	} else {
		Bluetooth::printf("<H%d %d>", n, 1);	 
	}
#endif
#if defined USE_BLUETOOTH
	Bluetooth::printf("<X>");	 
#endif
#ifdef USE_OLED					 
        Oled::printErrorOption(1);
#endif
/////////

Turnout *Turnout::create ->
#if defined USE_BLUETOOTH
	Bluetooth::printf("<X>");	 
#endif
#ifdef USE_OLED 
	Oled::printSaved( 0, false);
#endif
//////////

void Turnout::show ->
int count;	
#if defined USE_BLUETOOTH
	Bluetooth::printf("<X>");	 
#endif
#ifdef USE_OLED
	Oled::printErrorOption(1);     // OLED
#endif
#if defined USE_BLUETOOTH
	if (tt->data.tStatus == 0){				 
             Bluetooth::printf("<H%d %d %d %d>", 
                tt->data.id, tt->data.address, tt-> data.subAddress, 0);	 
	} else {
		Bluetooth::printf("<H%d %d %d %d>", 
                  tt->data.id, tt->data.address, tt-> data.subAddress, 1);	 
		}
#endif
count++;
#ifdef USE_OLED
	Oled::printList(1, count);
#endif
////

Archivo Sensor.cpp

void Sensor::begin ->
#if defined USE_BLUETOOTH
	Bluetooth::printf("<O>");	 
#endif
/////////

void Sensor::remove ->
#ifdef USE_OLED
	Oled::printDelete(2, false, n);       // OLED = muestra en pantalla guadado con exito
#endif
#if defined USE_BLUETOOTH
	Bluetooth::printf("<X>");	 
#endif
#ifdef USE_OLED
	Oled::printDelete(2, true, n);
#endif	
#if defined USE_BLUETOOTH
	Bluetooth::printf("<O>");	 
#endif
////////

void Sensor::check ->
#if defined USE_BLUETOOTH 	
      	Bluetooth::printf("<Q%d>", tt->data.snum);	 
#endif
#if defined USE_BLUETOOTH 	
      	Bluetooth::printf("<q%d>", tt->data.snum);	 
#endif
////////

void Sensor::show ->
#if defined USE_BLUETOOTH
	Bluetooth::printf("<X>");	 
#endif
#if defined USE_BLUETOOTH
	Bluetooth::printf("<Q%d %d %d>", 
          tt->data.snum, tt->data.pin, tt-> data.pullUp);	 
#endif
#ifdef USE_OLED
	Oled::printList(2, count);
#endif
////////

void Sensor::status ->
#if defined USE_BLUETOOTH
      Bluetooth::printf("<X>");	 
#endif
#if defined USE_BLUETOOTH
        if (tt->active){
	       Bluetooth::printf("<Q%d>", tt->data.snum);	 
	} else {
		Bluetooth::printf("<q%d>", tt->data.snum);	 
	}
#endif
////////

void Sensor::store ->
#ifdef USE_OLED 
	Oled::printSaved(0, true);
#endif
////////

bool Sensor::parse ->
#ifdef USE_OLED
	Oled::printDefined(2, n, s, m);
#endif
#ifdef USE_BLUETOOTH
        Bluetooth::printf("<X>");	 	
#endif
////////

Sensor *Sensor::create ->
ifdef USE_BLUETOOTH
	Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_OLED
	Oled::printSaved(snum, false);
#endif	
#ifdef USE_SOUND
	Sound::ActionError();
#endif

Archivo PacketRegister.cpp:


void RegisterList::setThrottle ->
#ifdef USE_BLUETOOTH
	Bluetooth::printf("<T%d %d %d %d>", 
          nReg, cab, tSpeed, tDirection);	 
#endif
#ifdef USE_BLUETOOTH
	Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
////

void RegisterList::setFunction->
#ifdef USE_BLUETOOTH
	Bluetooth::printf("<F%d %d %d %d>", 
          nReg, cab, fByte, eByte);	 
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
////

void RegisterList::setAccessory ->
#ifdef USE_BLUETOOTH
    Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
#ifdef USE_OLED
    Oled::printAccesories(aAdd, aNum, activate); // OLED
#endif
#ifdef USE_SOUND
    Sound::ActionOK();
#endif
////

void RegisterList::writeTextPacket ->
#ifdef USE_BLUETOOTH
      Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
////

int RegisterList::readCVraw->
#ifdef USE_BLUETOOTH
      Bluetooth::printf("<r%d|%d|%d %d>", 
    callBack, callBackSub, cv + 1, bValue);	 
#endif
////

int RegisterList::readCVmain ->
#ifdef USE_BLUETOOTH
      Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
////

bool RegisterList::writeCVByte ->
#ifdef USE_BLUETOOTH
       Bluetooth::printf("<r%d|%d|%d %d>", 
         callBack, callBackSub, cv + 1, bValue);	 
#endif
////

bool RegisterList::writeCVByte ->
#ifdef USE_BLUETOOTH
       Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
////

bool RegisterList::writeCVBit ->
#ifdef USE_BLUETOOTH
       Bluetooth::printf("<r%d|%d|%d %d %d>", 
         callBack, callBackSub, cv + 1, bNum, bValue);
#endif
////

bool RegisterList::writeCVBit ->
#ifdef USE_BLUETOOTH
       Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
////

void RegisterList::writeCVByteMain ->
#ifdef USE_BLUETOOTH
       Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif
////

void RegisterList::writeCVBitMain ->
#ifdef USE_BLUETOOTH
       Bluetooth::printf("<X>");	 	
#endif
#ifdef USE_SOUND
	Sound::ActionError();
#endif

Como comento al principio esto aun esta en proceso, pero si alguien quiere los archivos para ir probando, pero seguramente algunas cosas pueden fallar, aunque las principales (locomotoras y desvíos) ya están probadas.

Descargar Librería DCCpp 1.4.2 (Modificación Oled, Sonido, Bluetooth)

Seguiré actualizando!!!

(Visitado 223 veces, 2 visitas hoy)

Un comentario

  1. Perdona por las molestias pero tengo una pregunta que imagino que será muy tonta pero prefiero quedar de ignorante antes no poder disfrutar de este pedazo de trabajo. La cuestión es que he instalado el programa de dccpp en arduino (el que has traducido) y logro encender y apagar la central . Tengo problemas con el Bluetooth y he pensado que esta librería me podría ayudar. El problema es que no se como acoplarla al resto de librerías. Si me puedes indicar te lo agradezco.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *