OSCServer.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #pragma once
  2. #ifndef ARDUINOOSC_OSCSERVER_H
  3. #define ARDUINOOSC_OSCSERVER_H
  4. #ifdef ESP_PLATFORM
  5. #include <WiFi.h>
  6. #include <WiFiUdp.h>
  7. #elif defined (ESP8266)
  8. #include <ESP8266WiFi.h>
  9. #include <WiFiUdp.h>
  10. #elif defined (TEENSYDUINO) || defined (__AVR__)
  11. #include <Ethernet.h>
  12. #include <EthernetUdp.h>
  13. #endif
  14. #include "lib/oscpkt.hh"
  15. #include "lib/Packetizer.h"
  16. namespace ArduinoOSC
  17. {
  18. using OscMessage = oscpkt::Message;
  19. using OscReader = oscpkt::PacketReader;
  20. template <typename S>
  21. class OscServer
  22. {
  23. #ifdef __AVR__
  24. typedef void (*CallbackType)(OscMessage& m);
  25. struct Map { String addr; CallbackType func; };
  26. using CallbackMap = RingBuffer<Map, 8>;
  27. #else
  28. using CallbackType = std::function<void(OscMessage& m)>;
  29. struct Map { String addr; CallbackType func; };
  30. using CallbackMap = std::vector<Map>;
  31. #endif
  32. public:
  33. virtual ~OscServer() {}
  34. void attach(S& s) { stream = &s; }
  35. void subscribe(const String& addr, CallbackType value) { callbacks.push_back({addr, value}); }
  36. virtual void parse() = 0;
  37. protected:
  38. OscReader reader;
  39. CallbackMap callbacks;
  40. S* stream;
  41. };
  42. template <typename S>
  43. class OscServerUdp : public OscServer<S>
  44. {
  45. public:
  46. virtual ~OscServerUdp() {}
  47. virtual void parse()
  48. {
  49. const size_t size = this->stream->parsePacket();
  50. if (size == 0) return;
  51. uint8_t data[size];
  52. this->stream->read(data, size);
  53. this->reader.init(data, size);
  54. if (OscMessage* msg = this->reader.decode())
  55. {
  56. if (msg->available())
  57. {
  58. msg->ip(this->stream->S::remoteIP());
  59. msg->port((uint16_t)this->stream->S::remotePort());
  60. for (auto& c : this->callbacks) if (msg->match(c.addr)) c.func(*msg);
  61. }
  62. else
  63. {
  64. Serial.println("message decode error invalid");
  65. }
  66. }
  67. else
  68. {
  69. Serial.println("message decode error nullptr");
  70. }
  71. }
  72. };
  73. class OscServerSerial : public OscServer<Stream>
  74. {
  75. public:
  76. virtual ~OscServerSerial() {}
  77. virtual void parse()
  78. {
  79. const size_t size = stream->available();
  80. if (size == 0) return;
  81. uint8_t data[size];
  82. stream->readBytes((char*)data, size);
  83. unpacker.feed(data, size);
  84. while (unpacker.available())
  85. {
  86. reader.init(unpacker.data(), unpacker.size());
  87. if (OscMessage* msg = reader.decode())
  88. if (msg->available())
  89. for (auto& c : callbacks)
  90. if (msg->match(c.addr)) c.func(*msg);
  91. unpacker.pop();
  92. }
  93. }
  94. private:
  95. #ifdef __AVR__
  96. Packetizer::Unpacker_<1, 64, 0> unpacker;
  97. #else
  98. Packetizer::Unpacker unpacker;
  99. #endif
  100. };
  101. }
  102. #endif // ARDUINOOSC_OSCSERVER_H