aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2015-08-10 19:30:14 +0200
committerTrygve Laugstøl <trygvis@inamo.no>2015-08-10 19:30:14 +0200
commit87fdaaabd62268936615321bc14679b3e59e286e (patch)
tree39f52f2aa1c77838e6b32ca53a6e6e5cc285c304
parent3683899605e4aaa065026fd0973bb2ea6ecf5cd6 (diff)
downloadtrygvisio_soil_moisture-87fdaaabd62268936615321bc14679b3e59e286e.tar.gz
trygvisio_soil_moisture-87fdaaabd62268936615321bc14679b3e59e286e.tar.bz2
trygvisio_soil_moisture-87fdaaabd62268936615321bc14679b3e59e286e.tar.xz
trygvisio_soil_moisture-87fdaaabd62268936615321bc14679b3e59e286e.zip
o Implementing the SoftwareSerial version of debugging.
-rw-r--r--Debug.h125
-rw-r--r--config-check.h19
-rw-r--r--trygvisio_soil_moisture.ino16
3 files changed, 116 insertions, 44 deletions
diff --git a/Debug.h b/Debug.h
index 83eb43f..4883083 100644
--- a/Debug.h
+++ b/Debug.h
@@ -3,6 +3,14 @@
#include "config-check.h"
+template<bool B, class T, class F>
+struct conditional { typedef T type; };
+
+template<class T, class F>
+struct conditional<false, T, F> { typedef F type; };
+
+#include <SoftwareSerial.h>
+
#ifdef __AVR_ATtiny85__
class Serial {
public:
@@ -20,43 +28,77 @@ extern Serial Serial;
#endif
enum DebugSink {
+ DEBUG_SINK_VOID,
DEBUG_SINK_SERIAL,
DEBUG_SINK_SOFTWARE_SERIAL,
- DEBUG_SINK_VOID,
};
-template <enum DebugSink sink>
-class Debug {
+struct DebugEmptyBase {};
+struct DebugSoftwareSerialBase {
+ // TODO: these should be customizable
+ static const int rx_pin = 1;
+ static const int tx_pin = 0;
+
+public:
+ SoftwareSerial ss;
+
+ DebugSoftwareSerialBase() : ss(rx_pin, tx_pin) {
+ }
+};
+
+template <enum DebugSink sink_>
+class Debug : public conditional<sink_ == DEBUG_SINK_SOFTWARE_SERIAL, DebugSoftwareSerialBase, DebugEmptyBase>::type
+{
+
public:
- inline void begin(const long baud_rate) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ const enum DebugSink sink;
+
+ Debug() : sink(sink_) {
+ }
+
+ inline void begin(const long baud_rate) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.begin(baud_rate);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.begin(baud_rate);
}
}
- inline operator bool() const {
- return Serial.operator bool();
+ inline operator bool() {
+ if (sink_ == DEBUG_SINK_SERIAL) {
+ Serial.operator bool();
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.operator bool();
+ } else {
+ return false;
+ }
};
- inline bool available() const {
- if (sink == DEBUG_SINK_SERIAL) {
+ inline bool available() {
+ if (sink_ == DEBUG_SINK_SERIAL) {
return Serial.available();
+ } if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ return this->ss.available();
}
return false;
};
- inline int read() const {
- if (sink == DEBUG_SINK_SERIAL) {
+ inline int read() {
+ if (sink_ == DEBUG_SINK_SERIAL) {
return Serial.read();
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ return this->ss.read();
}
return '\0';
};
- size_t write(uint8_t value) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ size_t write(uint8_t value) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.write(value);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.write(value);
}
return value;
@@ -64,74 +106,91 @@ public:
template<typename T>
inline
- void print(T t, int format = DEC) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ void print(T t, int format = DEC) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.print(t, format);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.print(t, format);
}
};
template<typename T>
inline
- void print(const T *t) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ void print(const T *t) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.print(t);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.print(t);
}
};
template<typename T>
inline
- void print(T *t) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ void print(T *t) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.print(t);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.print(t);
}
};
template<typename T>
inline
- void println(T t, int format = DEC) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ void println(T t, int format = DEC) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.println(t, format);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.println(t, format);
}
};
template<typename T>
inline
- void println(const T *t) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ void println(const T *t) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.println(t);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.println(t);
}
};
template<typename T>
inline
- void println(T *t) const {
- if (sink == DEBUG_SINK_SERIAL) {
+ void println(T *t) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.println(t);
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.println(t);
}
};
inline
- void println() const {
- if (sink == DEBUG_SINK_SERIAL) {
+ void println() {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.println();
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.println();
}
};
inline
void flush() {
- if (sink == DEBUG_SINK_SERIAL) {
+ if (sink_ == DEBUG_SINK_SERIAL) {
Serial.flush();
+ } else if (sink_ == DEBUG_SINK_SOFTWARE_SERIAL) {
+ this->ss.flush();
}
};
};
-#if DEBUG_SINK == 1
-static const Debug<DEBUG_SINK_VOID> debug;
+#if DEBUG_SINK == 0
+static Debug<DEBUG_SINK_VOID> debug;
+#elif DEBUG_SINK == 1
+static Debug<DEBUG_SINK_SERIAL> debug;
#elif DEBUG_SINK == 2
-static const Debug<DEBUG_SINK_SERIAL> debug;
+static Debug<DEBUG_SINK_SOFTWARE_SERIAL> debug;
#else
-#error Invalid value for DEBUG_SINK, must be one of 1 (for no output), 2 for serial port
-// , or 3 for software serial.
+#error Invalid value for DEBUG_SINK, must be one of 1 (for no output), 2 for serial port, or 3 for software serial.
#endif
#endif
diff --git a/config-check.h b/config-check.h
index 077d391..e33e1ad 100644
--- a/config-check.h
+++ b/config-check.h
@@ -19,6 +19,11 @@
#endif
/*
+ * 20150725: Initial version
+ * 20150808: Changed values of DEBUG_SINK.
+ */
+
+/*
*
* Configuration Section.
*
@@ -36,7 +41,6 @@
* 1: prototype-a, the hand assembled PCB
* 2: prototype-b, the china produced PCB
* 3: attiny85
- * 4: OLIMEXINO-32U4
*
* No default, has to be specified in config.h
*/
@@ -100,15 +104,14 @@
* Selects where all debug logging will go.
*
* Values:
- * 1: no logging, all logging is discarded
- * 2: Use Serial. Uses the platforms default Serial port, usually the USB or hardware serial ports on your board.
- *
- * TODO: Change this to 0=no logging, 1=serial, 2=software serial
+ * 0: no logging, all logging is discarded
+ * 1: Use Serial. Uses the platforms default Serial port, usually the USB or hardware serial ports on your board.
+ * 2: Use Software serial
*/
#ifndef DEBUG_SINK
// Default to Serial
-#define DEBUG_SINK 2
+#define DEBUG_SINK 1
#endif
/*******************************************************************************
@@ -127,8 +130,8 @@
#undef USE_LOW_POWER_MODE
#endif
-#if DEBUG_SINK == 2
-#warning DEBUG_SINK must be 1 on ATTiny85 boards
+#if DEBUG_SINK != 0 && DEBUG_SINK != 2
+#warning DEBUG_SINK must be 0 or 2 on ATTiny85 boards
#undef DEBUG_SINK
#define DEBUG_SINK 1
#endif
diff --git a/trygvisio_soil_moisture.ino b/trygvisio_soil_moisture.ino
index bb55b70..25baac0 100644
--- a/trygvisio_soil_moisture.ino
+++ b/trygvisio_soil_moisture.ino
@@ -7,6 +7,7 @@
#ifdef PERSISTENT_CONFIGURATION_SUPPORT
#include <EEPROM.h>
#endif
+#include <SoftwareSerial.h>
#include <SPI.h>
#include <lib_aci.h>
#include <aci_setup.h>
@@ -83,6 +84,7 @@ void __ble_assert(const char *file, uint16_t line)
static void go_to_sleep();
+extern SoftwareSerial ss;
void setup() {
#ifdef TXLED0
// An attempt to make sure that the RX and TX LEDs are turned off when running normally.
@@ -100,7 +102,15 @@ void setup() {
CLKPR = 0;
#endif
- debug.begin(115200);
+ if (debug.sink == DEBUG_SINK_SERIAL) {
+ debug.begin(115200);
+ } else if (debug.sink == DEBUG_SINK_SOFTWARE_SERIAL) {
+ debug.begin(9600);
+
+ while(true) {
+ debug.println("hello debug world!");
+ }
+ }
#if WAIT_FOR_SERIAL_BEFORE_STARING
// Wait until the serial port is available (useful only for the Leonardo)
@@ -153,8 +163,8 @@ static void setup_rf() {
aci_state.aci_pins.interface_is_interrupt = false;
aci_state.aci_pins.interrupt_number = 4;
-#error wat
-#elif ARDUINO_AVR_LEONARDO // Assumes OLIMEXINO-32U4 and UEXT
+#elif ARDUINO_AVR_LEONARDO
+ // Assumes OLIMEXINO-32U4 and UEXT
aci_state.aci_pins.board_name = BOARD_DEFAULT;
aci_state.aci_pins.reqn_pin = 2;
aci_state.aci_pins.rdyn_pin = 13;