Skip to content
Snippets Groups Projects
muebtransmitter_p.h 1.92 KiB
Newer Older
  • Learn to ignore specific revisions
  • #ifndef LIBMUEB_MUEBTRANSMITTER_P_H_
    #define LIBMUEB_MUEBTRANSMITTER_P_H_
    
    #include <QByteArray>
    #include <QDebug>
    #include <QNetworkDatagram>
    #include <QUdpSocket>
    #include <QtConcurrent>
    
    bodzsoaa's avatar
    bodzsoaa committed
    #include <functional>
    
    
    #include "configuration.h"
    #include "muebtransmitter.h"
    
    
    bodzsoaa's avatar
    bodzsoaa committed
    namespace libmueb {
    
    
    class MuebTransmitterPrivate {
      Q_DECLARE_PUBLIC(MuebTransmitter)
      Q_DISABLE_COPY(MuebTransmitterPrivate)
    
     public:
    
      explicit MuebTransmitterPrivate(MuebTransmitter* transmitter)
    
    bodzsoaa's avatar
    bodzsoaa committed
          : configuration_(Configuration::Instance()),
            datagram_(QByteArray(), configuration_.target_address(),
    
    bodzsoaa's avatar
    bodzsoaa committed
                      configuration_.animation_port()),
    
            q_ptr(transmitter) {
    
    bodzsoaa's avatar
    bodzsoaa committed
        qInfo().noquote()
    
    bodzsoaa's avatar
    bodzsoaa committed
            << QString("[MuebTransmitter] UDP Socket will send frame to %2:%3")
    
    bodzsoaa's avatar
    bodzsoaa committed
                   .arg(configuration_.target_address().toString())
    
    bodzsoaa's avatar
    bodzsoaa committed
                   .arg(configuration_.animation_port());
    
    bodzsoaa's avatar
    bodzsoaa committed
      Configuration& configuration_;
    
      QUdpSocket socket_;
      QNetworkDatagram datagram_;
      MuebTransmitter* q_ptr;
    
    bodzsoaa's avatar
    bodzsoaa committed
    
      // FIXME Remove in Qt 6
    
    bodzsoaa's avatar
    bodzsoaa committed
      /* Reference:
       * http://threadlocalmutex.com/?p=48
       * http://threadlocalmutex.com/?page_id=60
       */
    
    bodzsoaa's avatar
    bodzsoaa committed
      std::function<uchar(const uchar&)> reduceColor =
          [this](const uchar& color) -> uchar {
        if (configuration_.color_depth() == 3) {
          return (color * 225 + 4096) >> 13;
        } else if (configuration_.color_depth() == 4) {
          return (color * 15 + 135) >> 8;
        }
    
        return color;
      };
    
      // FIXME Remove in Qt 6
      std::function<void(QByteArray&, const uchar&)> compressColor =
          [this](QByteArray& compressed_colors, const uchar& color) {
            static bool msb{true};
    
            // Compress 2 color components into 1 byte
            if (msb) {
    
    bodzsoaa's avatar
    bodzsoaa committed
              compressed_colors.append(color << Configuration::kFactor);
    
    bodzsoaa's avatar
    bodzsoaa committed
            } else {
              compressed_colors.back() = compressed_colors.back() | color;
            }
    
            msb = !msb;
          };
    
    bodzsoaa's avatar
    bodzsoaa committed
    }  // namespace libmueb
    
    
    #endif  // LIBMUEB_MUEBTRANSMITTER_P_H_