-
Notifications
You must be signed in to change notification settings - Fork 9
Entwickler
Die Arduino Plattform verfügt, von Hause aus, über keine Debugging Schnittstelle und die Serielle Schnittstelle ist durch die SRCP Kommunikation besetzt.
Um den Code trotzdem testen zu können verwende ich einen Arduino Mega und verbinde dessen Serial3 Schnittstelle mit einem Mini USB Adapter (RX/TX übers Kreuz verbinden). Alternativ kann auch ein Arduino mit ATmega328P (z.B. UNO) verwendet werden. Dazu wird die Library SoftwareSerial auf Pin 2 + 3 verwendet. Bei der Konfiguration ist darauf zu achten, dass die Pin's nicht anderweitig für Geräte oder von Shield's verwendet werden. Details zum Arduino und dem Mini USB Adapter siehe http://arduino.cc/en/Main/Products
Die Zentrale Klasse/Library zum Ein-/Ausschalten von Debugging Meldungen ist Logger im Verzeichnis log.
Anhand von verschiedenen Level's kann eingestellt werden, welche Meldungen angezeigt werden sollen. Die Level sind additiv, d.h. ist der höchste Level TRACE_LEVEL aktiviert, sind automatisch alle anderen Levels auch aktiviert.
Konfiguration des Levels anhand des Symbols LOGGER_LEVEL:
///////////////////////////////////////////////////////////////////////////////// // Meldungen #define OFF_LEVEL 0 // keine Meldungen #define ERROR_LEVEL 1 // Fehler in der Programmausfuehrung #define WARN_LEVEL 2 // Warnungen #define INFO_LEVEL 3 // Informationen, Start, Initialisierung i.o. etc. #define DEBUG_LEVEL 4 // Allgemeine Debug Infos #define TRACE_LEVEL 5 // Fein Detalierte Meldungen, nur in Ausnahmefaellen zu aktivieren #define LOGGER_LEVEL INFO_LEVEL // Ausgabe von ERROR, WARN und INFO Meldungen
Per Default sind beim Arduino Mega Info Meldungen aktiviert und beim allen anderen die Meldungen ausgeschaltet.
ACHTUNG: Der Meldungslevel beim I2C Master sollte immer gleich oder höher als bei den I2C Slave's sein, ansonsten kann der I2C Bus blockieren. Und zu lange Meldungen bei I2C Slave's können ebenfalls den I2C Bus blockieren.
Die Logger Klasse wird wie folgt verwendet, aufgezeigt anhand eines verkürzten microSRCPServer Sketches:
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <Logger.h> // in dieser Datei kann das Logging an/abgeschaltet werden
...
/**
* Initialisierung - Protokoll, Geraete etc.
*/
void setup()
{
BEGIN( 9600 ); // Initialisierung Debugging Schnittstelle
INFO( "Logger ready" ); // Einfache Info Meldung
......
#if ( LOGGER_LEVEL >= INFO_LEVEL ) // Komplexere Meldung mit zusätzlichen Ausgaben
int values[6];
DeviceManager.getDescription( 0, 0, srcp::LAN, values ); // liefert die Anzahl Geraete pro Typ.
INFO( "Devices");
Logger.print( "\tFB ");
Logger.print( values[0] );
Logger.print( "-" );
....
#endif
....
INFO ( "Server listen " );
}
/**
* Endlosloop
*/
void loop()
{
// Host Meldungen verarbeiten
server.dispatch( SENSOR_POLLING );
// Refresh der Sensoren bzw. Abfragen ob Aenderungen stattgefunden haben
DeviceManager.refresh();
TRACE( "im Loop" ); // Trace Meldung wird nur bei höchster Stufe angezeigt.
}
Die dazugehörende Ausgabe (inkl. Subklassen) sieht wie folgt aus:
0I: void setup():125 "Logger ready" 1I: static void i2c::I2CDeviceManager::begin(int):45 "search I2C bus" 44T: static int i2c::I2CDeviceManager::write(int, uint8_t*, int, int):153 "send: "1:4:0:0:0:0:6:0 344T: static int i2c::I2CDeviceManager::read(int, uint8_t*, int, int):185 "revc: "1, 1:0:255 375T: static int i2c::I2CDeviceManager::write(int, uint8_t*, int, int):153 "send: "2:4:0:0:0:0:6:0 677T: static int i2c::I2CDeviceManager::read(int, uint8_t*, int, int):185 "revc: "2, 1:1:200 708T: static int i2c::I2CDeviceManager::write(int, uint8_t*, int, int):153 "send: "2:5:0:0:0:0:7 1009T: static int i2c::I2CDeviceManager::read(int, uint8_t*, int, int):185 "revc: "2, :12:33:0:40:0:33:0:36:0:34:0:34:0 1071D: static void i2c::I2CDeviceManager::begin(int):62 "I2C addr: "2, FB 33-40, GA 33-36, GL 34-34 ... 3516I: void setup():178 "Devices" FB 1-41, GA 1-36, GL 1-34 3578I: void srcp::SRCPServerSerial::begin(long unsigned int):41 "open port ":115200 3666I: void setup():203 "Server listen " 3708T: void loop():217 "im Loop" 3743T: void loop():217 "im Loop" ....
Die Meldungen sind, wie folgt, aufgebaut:
(Millisekunden seit Start und Level E,W,I,D,T) (Klasse/Methode inkl. Zeilennummer) ("Meldung") (Optionale Parameter)
Für ein Beispiel, einer Klasse/Library und der Verwendung von Logger siehe z.B. I2CDeviceManager.
Für weitere Möglichkeiten der Ausgabe siehe die #define Anweisungen in Logger.h
Je nach dem welchen Shield man Testen will kann es vorkommen, dass die Schnittstelle/Pin's für das Debugging bereits belegt sind. Oder man verwendet, statt der Seriellen Schnittstelle für die Kommunikation mit dem Host (RocRail), den Ethernet Shield, wodurch die Pins 0 + 1 frei werden. Dann können die Meldungen auf eine andere Schnittstelle/Pin's umgeleitet werden:
Arduino Mega - #define ändern in Logger.h
#define Logger Serial2 // Ausgabe neu auf Schnittstelle 2
Arduino mit ATmega328P (z.B. UNO) - Pin's ändern in Logger.cpp
SoftwareSerial Logger( 0, 1 ); // Ethernet Shield vorhanden. Ausgabe auf Schnittstelle 1 statt Pin 2 + 3
Sketches sind die eigentlichen Hauptprogramme bzw. Steuerungen für die Arduino Boards. Libraries stellen Grundfunktionen zur Verfügung.
Die Sketches sind in einem eigenen Verzeichnis, welches gleich bezeichnet ist wie der Sketch, gespeichert. Libraries im Verzeichnis libraries.
Es existieren folgende Libraries:
- dcc + dccgen - Eigene Implementierung des DCC Protokoll
- dev - die Eigentlichen Geräte wie Signale, Servo's etc.
- i2c - Hilfsklassen für die I2C Ansteuerung
- lan - Hilfsklassen für die TCP/IP Ansteuerung
- odcc - DCC Implementierung auf Basis des OpenDCC Projektes
- srcp - SRCP Grundklassen
- log - Debugging Meldungen
Personen welche mit professionellen Entwicklungsumgebungen arbeiten vermissen in der Arduino Entwickungsumgebung einige Funktionen, wie Code Komplettierung etc.
Für diese empfiehlt es mit Eclipse (www.eclipse.org) zu arbeiten. Die Installation ist ausführlich auf der Arduino Webseite http://playground.arduino.cc/Code/Eclipse beschrieben.
Diese Arbeitsweise bedingt jedoch C++ Kenntnisse!
Ich selber verwende Eclipse, deshalb gibt es neben dem Arduino Code im microSRCP/arduino Verzeichnis noch folgende Eclipse Projekte:
- arduinoCore - Kopie der wichtigen Klassen aus der Arduino Entwickungsumgebung. Werden zur Library libarduinoCore.a compiliert
- microSRCPCore - Grundklassen des microSRCP Projektes, gelinkt aus microSRCP/arduino/libraries. Werden zur Library libmicroSRCPCore.a compiliert
- microSRCPxxx - Ausgesuchte Sketches als C++ Klasse zur Besseren Bearbeitung.
Deshalb hat sich folgendes Vorgehen bewährt. Editieren, compilieren und Syntaxprüfung der Klassen und Sketches in Eclipse. Definitive Compilierung und Upload in der Arduino Entwicklungsumgebung.