0

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 92 veces, 1 visitas hoy)

Deja una respuesta

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