セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2024-09-06 現在

axis_xyzt

加速度データのコンテナクラス
    3軸の加速度センサーの値を格納するための構造体ですが、格納したデータの利便性を向上するための手続きを追加しています。
    struct axis_xyzt {
        int16_t x;
        int16_t y;
        int16_t z;
        uint16_t t;
    };

    get_axis_{x,y,z}_iter()

    /*戻り型は長いテンプレート型名なのでauto&&と記載します*/
    auto&& get_axis_x_iter(Iter p)
    auto&& get_axis_y_iter(Iter p)
    auto&& get_axis_z_iter(Iter p)

    axis_xyztを格納したコンテナクラスのイテレータをパラメータとして、X, Y, Z 軸のいずれかの要素にアクセスするイテレータを生成します。

    以下の例では、buf.begin(), buf.end()をX軸用のイテレータとしてアルゴリズムstd::minmax_elementに用いています。

    ##include <algorithm>
    
    void myfunc() {
      // コンテナクラス
      smplbuf_local<axis_xyzt, 10> buf;
    
      // テスト用にデータを投入
      buf[0] = { 1, 2, 3, 4 };
      buf[1] = { 2, 3, 4, 5 };
      ...
    
      // 最大、最小値を得るアルゴリズム
      auto&& minmax = std::minmax_element(
        get_axis_x_iter(buf.begin()),
        get_axis_x_iter(buf.end()));
    
      Serial << "min=" << int(*minmax.first)
            << ",max=" << int(*minmax.second) << mwx::crlf;
    }

    get_axis_{x,y,z}()

    /*戻り型は長いテンプレート型名なのでauto&&と記載します*/
    auto&& get_axis_x(T& c)
    auto&& get_axis_y(T& c)
    auto&& get_axis_z(T& c)

    axis_xyztを格納したコンテナクラスのXYZ軸のいずれかの軸を取り出した仮想的なコンテナクラスを生成する関数です。この生成したクラスにはbegin()end()メソッドのみ実装されています。このbegin()end()メソッドで取得できるイテレータは前節get_axis_{x,y,z}_iter()のイテレータと同じものになります。

    ##include <algorithm>
    
    void myfunc() {
      // コンテナクラス
      smplbuf_local<axis_xyzt, 10> buf;
    
      // テスト用にデータを投入
      buf[0] = { 1, 2, 3, 4 };
      buf[1] = { 2, 3, 4, 5 };
      ...
    
      // キューの中の X 軸を取り出す
      auto&& vx = get_axis_x(que);
    
      // 範囲for文の利用
      for (auto&& e : vx) { Serial << int(e) << ','; }
    
      // 最大、最小値を得るアルゴリズム
      auto&& minmax = std::minmax_element(
          vx.begin(), vx.end());
    
      Serial << "min=" << int(*minmax.first)
            << ",max=" << int(*minmax.second) << mwx::crlf;
    }