#include "BaseProcess.h"
#include "BitalMonitor.h"
#include "ECTrainer.h"
#include "Worker.h"
// コンストラクタ
BitalMonitor::BitalMonitor(ECTrainer* pEct)
:BaseProcess(pEct)
, _rrInterval()
, _useDevice(false)
, _lastRR(0)
{
::ZeroMemory(lastBuf, BUF_LEN);
_rrInterval.Put(0);
}
// 初期化
bool BitalMonitor::Init() {
// デバイスの探索
for (int com = 1; com <= COM_SEARCH_MAX; com++) {
if (!_Com.Open(com, _T("baud=19200 parity=N data=8 stop=1"))) continue;
// ポートチェック
char comBuf[BUF_LEN] = { '\0' };
DWORD readBytes = _Com.Receive((BYTE*)comBuf, BUF_LEN - 1);
if (readBytes < 1) continue;
if ((*comBuf >= '0' && *comBuf <= '9') || *comBuf == '#' || *comBuf == LF) {
Ect()->PWorker()->EventLog(_T("Bital device connected."));
_useDevice = true;
return true;
}
}
Ect()->PWorker()->EventLog(_T("Bital device not found."));
_useDevice = false;
return true;
}
// ループ
bool BitalMonitor::Routine() {
if (!_useDevice) {
::Sleep(100);
return true;
}
// バイタル
char comBuf[BUF_LEN] = { '\0' };
DWORD readBytes = _Com.Receive((BYTE*)comBuf, BUF_LEN / 2); // 前回の残り文字列に追加するため読み込み量を抑制する
if (readBytes > 0) {
//std::cout << "readBytes:" << readBytes << std::endl;
comBuf[readBytes] = '\0';
//std::cout << "comBuf:" << comBuf << std::endl;
strcat_s(lastBuf, BUF_LEN - 1, comBuf);
//std::cout << "lastBuf:" << lastBuf << std::endl;
char* sp = lastBuf;
char* pt = sp;
for (; *pt != '\0'; pt++) {
if (*pt == LF) {
//*pt = '\0';
//std::cout << "value:" << sp << std::endl;
if (*sp == '#') {
int RR = atoi(sp + 1);
if (RR > 0) {
_rrInterval.Put(RR);
_lastRR = timeGetTime();
}
//std::cout << "Read:" << RR << std::endl;
}
sp = pt + 1;
}
}
if (*sp == '\0') lastBuf[0] = '\0';
else strcpy_s(lastBuf, BUF_LEN - 1, sp);
//std::cout << "lastBuf2:" << lastBuf << std::endl;
}
// 無信号検出
if (_lastRR > 0 && timeGetTime() - _lastRR > NO_SIGNAL_TIMEOUT) {
_rrInterval.Put(0);
_lastRR = 0;
}
::Sleep(10);
return true;
}