Commit ee720ed3 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

prototest: json serialization

parent 96462e6b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -116,6 +116,10 @@ ifeq (${wakeup}, 1)
	COMMON_FLAGS += -DWITH_WAKEUP
endif

ifeq (${ostream}, 1)
	COMMON_FLAGS += -DWITH_OSTREAM
endif

include src/arch/${arch}/Makefile.inc

clean: arch_clean
+7 −0
Original line number Diff line number Diff line
@@ -2,6 +2,9 @@
#define OUTPUTSTREAM_H

#include <stdint.h>
#ifdef WITH_OSTREAM
#include <ostream>
#endif

class OutputStream {
 private:
@@ -39,6 +42,10 @@ class OutputStream {
	OutputStream & operator<<(double number);
	OutputStream & operator<<(OutputStream & (*fun) (OutputStream &));

#ifdef WITH_OSTREAM
	OutputStream & operator<<(std::string s);
#endif

	void setBase(uint8_t b);
	void printf_uint8(uint8_t num);
	void printf_float(float num);
+43 −3
Original line number Diff line number Diff line
@@ -9,15 +9,48 @@

char buf[256];

// TODOs
//
// Code -> JSON
// Code -> XDR
// Code -> MsgPack
// Code -> ProtoBuf
// Code -> CBOR
//
// JSON -> Code/Data
// XDR -> Code/Data
// MsgPack -> Code/Data
// ProtoBuf -> Code/Data
// CBOR -> Code/Data

void loop(void)
{
	static unsigned int ts = 0;
	char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
	ArduinoJson::StaticJsonBuffer<200> jsonBuffer;
	ArduinoJson::JsonObject& root = jsonBuffer.parseObject(json);
	const char *sensor = root["sensor"];
	kout << "sensor: " << sensor << endl;

	/*
	 * nlohmann modernjson serialization
	 */

	nlohmann::json js1;
	js1["sensor"] = "gps";
	js1["time"] = ts;
	js1["data"] = {48.756080, 2.302038};
	kout << js1.dump() << endl;

	nlohmann::json js2 = {
		{"sensor", "gps"},
		{"time", ts},
		{"data", {48.756080, 2.302038} }
	};
	kout << js2.dump() << endl;

	nlohmann::json j = R"({"compact": true, "schema": 0})"_json;
	j["ts"] = ts;
	std::vector<std::uint8_t> v_cbor = nlohmann::json::to_cbor(j);

	kout << "CBOR vector is " << hex;
@@ -26,15 +59,21 @@ void loop(void)
	}
	kout << endl;

	kout << "manual JSON: {\"sensor\":\"gps\",\"time\":" << dec << 1351824120;
	kout << "manual JSON: {\"sensor\":\"gps\",\"time\":" << dec << ts;
	kout << ",\"data\":[" << 48.756080 << "," << 2.302038 << "]}" << endl;

	/*
	 * nlohmann modernjson deserialization
	 */

	auto jd1 = R"({"compact": true, "schema": 0})"_json; 

	BufferOutput<XDRStream> foostream(buf);
	XDRInput input(buf);

	char test[] = "Obai World!";

	foostream << 123 << -2 << 123456 << 0 << 4294967296 << 0;
	foostream << 123 << -2 << ts << 0 << 4294967296 << 0;
	foostream.setNextArrayLen(3);
	foostream << fixed << "Hai";
	foostream.setNextArrayLen(sizeof(test));
@@ -50,7 +89,7 @@ void loop(void)
	kout << dec;
	kout << "foostream = " << input.get_uint32() << " = " << 123;
	kout << ", " << input.get_int32() << " = " << -2;
	kout << ", " << input.get_uint32() << " = " << 123456;
	kout << ", " << input.get_uint32() << " = " << ts;
	kout << ", " << input.get_uint32();
	kout << ", " << input.get_uint64();
	kout << ", " << input.get_uint32();
@@ -63,6 +102,7 @@ void loop(void)
#ifdef TIMER_S
	kout << dec << uptime.get_s() << endl;
#endif
	ts++;
}

int main(void)
+10 −0
Original line number Diff line number Diff line
@@ -140,6 +140,16 @@ OutputStream & OutputStream::operator<<(OutputStream & (*fkt) (OutputStream &))
	return fkt(*this);
}

#ifdef WITH_OSTREAM
OutputStream & OutputStream::operator<<(std::string s)
{
	for (auto c : s) {
		put(c);
	}
	return *this;
}
#endif

void OutputStream::setBase(uint8_t b)
{
	if (b == 2 || b == 8 || b == 10 || b == 16) {