CQ出版社セミナ,2021/12/07開催「実習・C++言語によるArmマイコンのプログラミング」で使うプログラム.

Dependencies:   Array_Matrix mbed SerialTxRxIntr UIT_FFT_Real

Committer:
MikamiUitOpen
Date:
Thu Apr 02 01:12:34 2020 +0000
Revision:
5:5e55a5f440c0
Parent:
0:a80f730d32a8
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:a80f730d32a8 1 //--------------------------------------------------------
MikamiUitOpen 0:a80f730d32a8 2 // ダブル・バッファの template クラス
MikamiUitOpen 0:a80f730d32a8 3 // 内部のバッファは通常の配列を使用
MikamiUitOpen 0:a80f730d32a8 4 //
MikamiUitOpen 0:a80f730d32a8 5 // 2019/11/22, Copyright (c) 2019 MIKAMI, Naoki
MikamiUitOpen 0:a80f730d32a8 6 //--------------------------------------------------------
MikamiUitOpen 0:a80f730d32a8 7
MikamiUitOpen 0:a80f730d32a8 8 #ifndef DOUBLE_BUFFER_2DARRAY_HPP
MikamiUitOpen 0:a80f730d32a8 9 #define DOUBLE_BUFFER_2DARRAY_HPP
MikamiUitOpen 0:a80f730d32a8 10
MikamiUitOpen 0:a80f730d32a8 11 template<class T, int N> class DoubleBuffer
MikamiUitOpen 0:a80f730d32a8 12 {
MikamiUitOpen 0:a80f730d32a8 13 public:
MikamiUitOpen 0:a80f730d32a8 14 // コンストラクタ
MikamiUitOpen 0:a80f730d32a8 15 explicit DoubleBuffer(T initialValue)
MikamiUitOpen 0:a80f730d32a8 16 : ping_(0), pong_(1), index_(0), full_(false)
MikamiUitOpen 0:a80f730d32a8 17 {
MikamiUitOpen 0:a80f730d32a8 18 for (int k=0; k<2; k++)
MikamiUitOpen 0:a80f730d32a8 19 for (int n=0; n<N; n++) buf_[k][n] = initialValue;
MikamiUitOpen 0:a80f730d32a8 20 }
MikamiUitOpen 0:a80f730d32a8 21
MikamiUitOpen 0:a80f730d32a8 22 // データを格納
MikamiUitOpen 0:a80f730d32a8 23 void Store(T data) { buf_[ping_][index_++] = data; }
MikamiUitOpen 0:a80f730d32a8 24
MikamiUitOpen 0:a80f730d32a8 25 // 出力バッファからデータの取り出し
MikamiUitOpen 0:a80f730d32a8 26 T Get(int n) const { return buf_[pong_][n]; }
MikamiUitOpen 0:a80f730d32a8 27
MikamiUitOpen 0:a80f730d32a8 28 // バッファが満杯でバッファを切り替える
MikamiUitOpen 0:a80f730d32a8 29 void IfFullSwitch()
MikamiUitOpen 0:a80f730d32a8 30 {
MikamiUitOpen 0:a80f730d32a8 31 if (index_ < N) return;
MikamiUitOpen 0:a80f730d32a8 32
MikamiUitOpen 0:a80f730d32a8 33 ping_ ^= 0x1; // バッファ切換えのため
MikamiUitOpen 0:a80f730d32a8 34 pong_ ^= 0x1; // バッファ切換えのため
MikamiUitOpen 0:a80f730d32a8 35 index_ = 0;
MikamiUitOpen 0:a80f730d32a8 36 full_ = true;
MikamiUitOpen 0:a80f730d32a8 37 }
MikamiUitOpen 0:a80f730d32a8 38
MikamiUitOpen 0:a80f730d32a8 39 // バッファが満杯で,true を返す
MikamiUitOpen 0:a80f730d32a8 40 bool IsFull()
MikamiUitOpen 0:a80f730d32a8 41 {
MikamiUitOpen 0:a80f730d32a8 42 bool temp = full_;
MikamiUitOpen 0:a80f730d32a8 43 if (full_) full_ = false;
MikamiUitOpen 0:a80f730d32a8 44 return temp;
MikamiUitOpen 0:a80f730d32a8 45 }
MikamiUitOpen 0:a80f730d32a8 46
MikamiUitOpen 0:a80f730d32a8 47 private:
MikamiUitOpen 0:a80f730d32a8 48 T buf_[2][N]; // 標本化したデータのバッファ
MikamiUitOpen 0:a80f730d32a8 49 int ping_, pong_; // バッファ切替用
MikamiUitOpen 0:a80f730d32a8 50 int index_; // 入力データのカウンタ
MikamiUitOpen 0:a80f730d32a8 51 bool full_; // 満杯の場合 true
MikamiUitOpen 0:a80f730d32a8 52
MikamiUitOpen 0:a80f730d32a8 53 // コピー・コンストラクタおよび代入演算子の禁止のため
MikamiUitOpen 0:a80f730d32a8 54 DoubleBuffer(const DoubleBuffer&);
MikamiUitOpen 0:a80f730d32a8 55 DoubleBuffer& operator=(const DoubleBuffer&);
MikamiUitOpen 0:a80f730d32a8 56 };
MikamiUitOpen 0:a80f730d32a8 57 #endif // DOUBLE_BUFFER_2DARRAY_HPP
MikamiUitOpen 0:a80f730d32a8 58