Lab_interaccio/2023/OSC_STAIRS/lib/ArduinoOSC/tests/test/test.ino

234 lines
7.6 KiB
Arduino
Raw Permalink Normal View History

2025-02-25 21:29:42 +01:00
#include <ArduinoOSC.h>
void hexdump(const uint8_t* s_void, size_t sz, size_t offset) {
unsigned char* s = (unsigned char*)s_void;
size_t nb = 16;
String info;
for (size_t l = 0; l < sz; l += nb) {
char tmp[12];
sprintf(tmp, "%08x ", (uint32_t)(l + offset));
info += String(tmp);
for (size_t c = 0; c < nb; ++c) {
if (l + c < sz) {
sprintf(tmp, "%02x ", s[l + c]);
info += String(tmp);
} else
info += String(" ");
}
info += String("| ");
for (size_t c = 0; c < nb; ++c) {
if (c + l < sz) {
if (s[l + c] >= ' ' && s[l + c] < 127)
info += String(s[l + c]);
else
info += String(".");
} else
info += String(" ");
}
Serial.println();
}
Serial.println(info);
}
void basicTests() {
OscMessage msg;
OscEncoder wr;
msg.init("/foot");
wr.init().encode(msg);
Serial.println("simplest message encode :");
hexdump(wr.data(), wr.size(), 0);
Serial.println();
wr.init().begin_bundle();
wr.encode(msg.init("/foo").push(1000).push(-1).push("hello").push(1.234f).push(5.678f));
wr.end_bundle();
Serial.println("larger message encode :");
hexdump(wr.data(), wr.size(), 0);
Serial.println((wr.size() == 0x3c &&
memcmp(wr.data(),
"\x23\x62\x75\x6e\x64\x6c\x65\x00\x00\x00\x00\x00\x00\x00\x00\x01"
"\x00\x00\x00\x28\x2f\x66\x6f\x6f\x00\x00\x00\x00\x2c\x69\x69\x73"
"\x66\x66\x00\x00\x00\x00\x03\xe8\xff\xff\xff\xff\x68\x65\x6c\x6c"
"\x6f\x00\x00\x00\x3f\x9d\xf3\xb6\x40\xb5\xb2\x2d",
wr.size()) == 0)
? "Success"
: "Failed");
OscDecoder pr(wr.data(), wr.size());
Serial.println("argument decode test: ");
OscMessage* mr = pr.decode();
{
int i1 = mr->arg<int32_t>(0);
int i2 = mr->arg<int32_t>(1);
String s = mr->arg<String>(2);
float f1 = mr->arg<float>(3);
float f2 = mr->arg<float>(4);
Serial.print("int1 : ");
Serial.println((i1 == 1000) ? "Success" : "Failed");
Serial.print("int2 : ");
Serial.println((i2 == -1) ? "Success" : "Failed");
Serial.print("String : ");
Serial.println((s == "hello") ? "Success" : "Failed");
Serial.print("float1 : ");
Serial.println((f1 == 1.234f) ? "Success" : "Failed");
Serial.print("float2 : ");
Serial.println((f2 == 5.678f) ? "Success" : "Failed");
}
wr.init().begin_bundle().begin_bundle().end_bundle().end_bundle();
hexdump(wr.data(), wr.size(), 0);
Serial.print("Bundle encode : ");
Serial.println((wr.size() == 40) ? "Success" : "Failed");
pr.init(wr.data(), wr.size());
Serial.print("Bundle decode : ");
Serial.println((pr.decode() == 0) ? "Success" : "Failed");
}
void checkMatch(const char* pattern, const char* test, bool expected_match = true) {
Serial.print("doing fullPatternMatch('");
Serial.print(pattern);
Serial.print("', '");
Serial.print(test);
Serial.print("'), expected result is : ");
Serial.print(expected_match ? "MATCH" : "MISMATCH");
Serial.println();
bool m = ArduinoOSC::match(pattern, test);
if (!expected_match) {
if (m) {
Serial.print("unexpected match... ");
Serial.print(pattern);
Serial.print(" with ");
Serial.println(test);
}
} else {
if (!m) {
Serial.print("unexpected mismatch... ");
Serial.print(pattern);
Serial.print(" with ");
Serial.println(test);
}
String tmp(test);
while (tmp.length() && tmp[tmp.length() - 1] != '/') tmp.remove(tmp.length() - 1);
assert(ArduinoOSC::match(pattern, tmp, false));
}
}
void patternTests() {
Serial.println("Doing pattern tests");
checkMatch("//bar", "bar", false);
checkMatch("//bar", "/bar");
checkMatch("//bar", "/foo/plop/bar");
checkMatch("/foo//", "/foo/plop/df/");
checkMatch("/foo///////bar", "/foo/plop/baz/bar");
checkMatch("*", "bar");
checkMatch("/foo/*", "/foo/bar");
checkMatch("/{bar,fo}/b[aA]r", "/fo/bar");
checkMatch("/{bar,fo}/b[aA]r", "/foo/bar", false);
checkMatch("/fo{bar,}/ba[e-t]", "/fo/bar");
checkMatch("/fo{bar,}/ba[t-z]", "/fo/bar", false);
checkMatch("/f{,ioio,bar}o/?a[!a]", "/fo/bar");
checkMatch("/foo/bar", "/foo/bar");
checkMatch("/f*o/bar", "/foo/bar");
checkMatch("/fo*o/bar", "/foo/bar");
checkMatch("/*//bar", "/foo/bar");
checkMatch("/*/bar", "/foo/bar");
checkMatch("/*o/bar", "/foo/bar");
checkMatch("/*/*/*/*a***/*/*/*/*/", "/foo/bar/foo/barrrr/foo/bar/foo/barrrr/");
checkMatch("/*/*/*/**/*/*/*/*/q", "/foo/bar/foo/barrrr/foo/bar/foo/barrrr/p", false);
}
void setup() {
delay(2000);
Serial.begin(115200);
Serial.println("start");
OscDecoder pr;
OscEncoder pw;
// osc message
Serial.println("test message");
{
OscMessage message;
// message.init("/ping").pushInt32(10).pushString("test").pushFloat(11.123);
message.init("/ping").push(10).push("test").push(4.321F).push((double)11.1234);
pw.init().encode(message);
pr.init(pw.data(), pw.size());
while (OscMessage* msg = pr.decode()) {
if (msg->match("/ping")) {
Serial.print("unpacked ");
Serial.print(msg->getArgAsInt32(0));
Serial.print(", ");
Serial.print(msg->getArgAsString(1));
Serial.print(", ");
Serial.print(msg->getArgAsFloat(2));
Serial.print(", ");
Serial.print(msg->getArgAsDouble(3));
Serial.println();
// #ifndef __AVR__
Serial.print("unpacked ");
Serial.print(msg->arg<int32_t>(0));
Serial.print(", ");
Serial.print(msg->arg<String>(1));
Serial.print(", ");
Serial.print(msg->arg<float>(2));
Serial.print(", ");
Serial.print(msg->arg<double>(3));
Serial.println();
// #endif
// int i = msg->arg(0);
// String s = msg->arg(1);
// float f = msg->arg(2);
// Serial.print("unpacked ");
// Serial.print(i); Serial.print(", ");
// Serial.print(s); Serial.print(", ");
// Serial.print(f); Serial.println();
} else
Serial.println("Server: unhandled message: ");
}
}
// osc blob
Serial.println("test blob");
{
uint8_t blob[3] = {1, 2, 3};
OscMessage message;
message.init("/blob").pushBlob(blob, sizeof(blob));
pw.init().encode(message);
pr.init(pw.data(), pw.size());
while (OscMessage* msg = pr.decode()) {
OscBlob rep;
if (msg->match("/blob")) {
Serial.print("unpacked ");
rep = msg->getArgAsBlob(0);
for (uint8_t i = 0; i < rep.size(); ++i) {
Serial.print((int)rep[i]);
Serial.print(", ");
}
Serial.println();
} else {
Serial.println("Server: unhandled message: ");
}
}
}
Serial.println("finished");
basicTests();
patternTests();
}
void loop() {
}