//---------------------------------------------------------------------
//  波形データを PC へ転送するためのクラス
//
//  2023/01/17, Copyright (c) 2022 MIKAMI, Naoki
//---------------------------------------------------------------------

#include "Xfer.hpp"

#ifndef XFER_WAVEFORM_HPP
#define XFER_WAVEFORM_HPP

class XferWaveform
{
public:
    // コンストラクタ
    XferWaveform(SerialRxTxIntr& rxTx, int size)
        : SIZE_(size), tx_(rxTx, size), xn_(size)  {}

    void XferToPC(const Array<float> yAbs)
    {
        Convert(yAbs);
        tx_.ToPC(xn_);
    }

private:
    const int SIZE_;        // PC に送信するデータ数
    Xfer tx_;               // PC に送信するためのクラスのオブジェクト
    Array<uint16_t> xn_;    // PC に送信するデータ

    // 転送すべきデータを転送する形式に変換
    //      -1 <= xIn[] <= 1
    //      対応関係：1 => 10000, -1 => 0
    virtual void Convert(const Array<float> xIn)
    {
        static const float FACTOR = 5000.0f;
        for (int n=0; n<SIZE_; n++)
        {
            float x = FACTOR*(xIn[n] + 1.0f);
            if (x > 10000) x = 10000;
            if (x < 0) x = 0;
            xn_[n] = (uint16_t)x;
        }
    }

    // コピー･コンストラクタおよび代入演算子の禁止のため
    XferWaveform(const XferWaveform&);
    XferWaveform& operator=(const XferWaveform&);
};
#endif  // XFER_WAVEFORM_HPP
