Skip to content

Instantly share code, notes, and snippets.

@fitzterra
Last active December 7, 2022 22:18
Show Gist options
  • Select an option

  • Save fitzterra/3ac5a09f83e3b116d1c0bf53e2a357bd to your computer and use it in GitHub Desktop.

Select an option

Save fitzterra/3ac5a09f83e3b116d1c0bf53e2a357bd to your computer and use it in GitHub Desktop.
Arduino lib to support the << streaming operator on Streams

Arduino Streaming Library

I found this gem by Mikal Hart somewhere on the interwebs but can not now remember where :-(

This library adds support for the C++ "<<" operator on any class derived from the arduino Stream class. Most notably this is the Serial functionality, but any other library extending Stream that normally uses the clunky print() and println() functions can use this like:

int i = 8;
float f = 3.14;
const char* world = "world";

Serial << F("Hello") << " " << world << "\n" <<
          F("int: ") << i << "\tfloat: " << f << endl;

This is much more elegant that a bunch of print() and println() calls

Installation

Clone into your sketchbook/libraries directory with:

$ git clone https://gist.github.com/3ac5a09f83e3b116d1c0bf53e2a357bd.git Streaming

Usage

Simple example:

#include <Streaming.h>

void setup() {
    Serial.begin(115200);
    Serial << "Ready...\n";
}

There is also support for printing hex, binary, octal formats, and specifying precision for floating point values. Look in the header for more on these.

/*
Streaming.h - Arduino library for supporting the << streaming operator
Copyright (c) 2010-2012 Mikal Hart. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef ARDUINO_STREAMING
#define ARDUINO_STREAMING
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#define STREAMING_LIBRARY_VERSION 5
// Generic template
template<class T>
inline Print &operator <<(Print &stream, T arg)
{ stream.print(arg); return stream; }
struct _BASED
{
long val;
int base;
_BASED(long v, int b): val(v), base(b)
{}
};
#if ARDUINO >= 100
struct _BYTE_CODE
{
byte val;
_BYTE_CODE(byte v) : val(v)
{}
};
#define _BYTE(a) _BYTE_CODE(a)
inline Print &operator <<(Print &obj, const _BYTE_CODE &arg)
{ obj.write(arg.val); return obj; }
#else
#define _BYTE(a) _BASED(a, BYTE)
#endif
#define _HEX(a) _BASED(a, HEX)
#define _DEC(a) _BASED(a, DEC)
#define _OCT(a) _BASED(a, OCT)
#define _BIN(a) _BASED(a, BIN)
// Specialization for class _BASED
// Thanks to Arduino forum user Ben Combee who suggested this
// clever technique to allow for expressions like
// Serial << _HEX(a);
inline Print &operator <<(Print &obj, const _BASED &arg)
{ obj.print(arg.val, arg.base); return obj; }
#if ARDUINO >= 18
// Specialization for class _FLOAT
// Thanks to Michael Margolis for suggesting a way
// to accommodate Arduino 0018's floating point precision
// feature like this:
// Serial << _FLOAT(gps_latitude, 6); // 6 digits of precision
struct _FLOAT
{
float val;
int digits;
_FLOAT(double v, int d): val(v), digits(d)
{}
};
inline Print &operator <<(Print &obj, const _FLOAT &arg)
{ obj.print(arg.val, arg.digits); return obj; }
#endif
// Specialization for enum _EndLineCode
// Thanks to Arduino forum user Paul V. who suggested this
// clever technique to allow for expressions like
// Serial << "Hello!" << endl;
enum _EndLineCode { endl };
inline Print &operator <<(Print &obj, _EndLineCode arg)
{ obj.println(); return obj; }
#endif
@Gerdathlete
Copy link
Copy Markdown

This library has been updated and can be found in the library manager or installed from its github repository: https://github.com/janelia-arduino/Streaming

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment