TNB Library
TnbPollingTrigger.h
[詳解]
1#pragma once
11#include "TnbThread.h"
12
13
14
15//TNB Library
16namespace TNB
17{
18
19
20
37template<typename TYP = BYTE>
39{
40public:
41
52 struct IPort
53 {
55 virtual ~IPort(void) {}
62 virtual DWORD GetPortData(TYP& _dat) = 0;
63 };
64
75 struct IListener
76 {
78 virtual ~IListener(void) {}
84 virtual void OnPollingBitChanged(TYP changeBit, TYP dataBit) = 0;
89 virtual void OnPollingError(DWORD error) = 0;
90 };
91
92
93 //---------------------------------------
94
95
97 CPollingTriggerT(void) : m_pListener(NULL), m_interval(100), m_chatter(3), m_chatCount(0)
98 {
99 }
100
102 virtual ~CPollingTriggerT(void)
103 {
104 m_thread.Stop();
105 }
106
112 bool Start(void)
113 {
114 m_thread.Stop();
115 m_thread.SetRunner(this);
116 return m_thread.Start(_T("PollingTigger"));
117 }
118
120 void Stop(void)
121 {
122 m_thread.Stop();
123 }
124
133 void SetParameter(IPort* P, IListener* L, DWORD interval = 100, DWORD chatter = 3)
134 {
135 Stop();
136 m_pPort = P;
137 m_pListener = L;
138 m_chatData.Resize(chatter);
139 loop ( i, m_chatData.GetSize() )
140 {
141 m_chatData[i] = 0;
142 }
143 m_interval = interval;
144 m_chatter = chatter;
145 m_chatCount = chatter;
146 m_fixData = 0;
147 }
148
154 {
155 return m_thread;
156 }
157
158protected:
160 virtual DWORD Run(void)
161 {
162 while ( IsRunnable() )
163 {
164 ::Sleep(m_interval);
165 TYP b;
166 DWORD r = m_pPort->GetPortData(b);
167 if ( r != 0 )
168 {
169 if ( m_pListener != NULL )
170 {
171 m_pListener->OnPollingError(r);
172 }
173 }
174 else
175 {
176 m_Input(b);
177 }
178 }
179 return 0;
180 }
186 void m_Input(TYP b)
187 {
188 if ( m_chatter > 1 )
189 {
190 TYP cf = 0; // 変化フラグ 最終的に 0 なら確定
191 loop ( i, m_chatter - 1 )
192 {
193 TYP t = m_chatData[(m_chatCount - i) % m_chatter];
194 cf |= TYP(t ^ b); //差異のあるBITは1になる。
195 }
196 TYP da = TYP((m_fixData & cf) | (b & ~cf)); //確定したものを格納。それ以外は前のまま
197 TYP ch = TYP(m_fixData ^ da); // 変化したら BITが1になる。
198 m_fixData = da;
199 if ( ch != 0 && m_pListener != NULL )
200 {
201 //TRACE2(" 変化;[%02X] 確定;[%02X]\n", ch, da);
202 m_pListener->OnPollingBitChanged(ch, da);
203 }
204 m_chatCount++;
205 m_chatData[m_chatCount % m_chatter] = b;
206 }
207 else
208 {
209 TYP ch = TYP(m_fixData ^ b); // 変化したら BITが1になる。
210 m_fixData = b;
211 if ( ch != 0 && m_pListener != NULL )
212 {
213 m_pListener->OnPollingBitChanged(ch, b);
214 }
215 }
216 }
217
218private:
219 CThread m_thread;
220 IPort* m_pPort;
221 IListener* m_pListener;
222 DWORD m_interval;
223 DWORD m_chatter;
224 CWorkMemT<TYP> m_chatData;
225 DWORD m_chatCount;
226 TYP m_fixData;
227 friend class CPollingTriggerTest;
228};
229
230
231
243
244
245
246}; //TNB
247
248
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
スレッド管理関係のヘッダ
ポーリングトリガークラス.
CThreadStatus & ReferThreadStatus(void)
[参照] 監視スレッド状態参照.
virtual ~CPollingTriggerT(void)
デストラクタ
void Stop(void)
[設定] クローズ.
CPollingTriggerT(void)
コンストラクタ
void m_Input(TYP b)
受信処理.
bool Start(void)
[設定] ポーリング開始
virtual DWORD Run(void)
スレッド
void SetParameter(IPort *P, IListener *L, DWORD interval=100, DWORD chatter=3)
[設定] ポーリング設定
スレッド状態管理クラス
Definition: TnbThread.h:128
スレッド管理クラス
Definition: TnbThread.h:316
bool SetRunner(IRunner *pRunner)
[設定] ランナー、設定
Definition: TnbThread.h:420
bool Stop(DWORD dwWait=15000)
[設定] スレッド停止 スレッドに対して停止要求します。
Definition: TnbThread.h:505
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
Definition: TnbThread.h:618
ワークメモリテンプレート.
Definition: TnbDef.h:633
CPollingTriggerT< BYTE > CPollingTrigger
ポーリングトリガークラス.
TNB Library
Definition: TnbDoxyTitle.txt:2
ポーリングトリガーリスナーインターフェース.
virtual void OnPollingError(DWORD error)=0
[通知] エラー通知
virtual void OnPollingBitChanged(TYP changeBit, TYP dataBit)=0
[通知] トリガー変化通知
virtual ~IListener(void)
デストラクタ
ポーリングトリガーポートインターフェース.
virtual DWORD GetPortData(TYP &_dat)=0
[取得] ポートデータ取得
virtual ~IPort(void)
デストラクタ
スレッド実行管理ランナーインターフェース
Definition: TnbThread.h:341
bool IsRunnable(void) const
[確認] 実行可能か否か
Definition: TnbThread.h:355