Newer
Older
PrismSoftware / ECTrainer2 / BitalMonitor.cpp
#include "BitalMonitor.h"
#include "ECTrainer.h"
#include "myWinUtils.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 <= GComPort::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;
		//mwut::DebugPrintf(_T("check com %d\n"), com);
		if ((*comBuf >= '0' && *comBuf <= '9') || *comBuf == '#' || *comBuf == LF) {
			mwut::DebugPrintf(_T("Bital device found on com%d\n"), com);
			_useDevice = true;
			return true;
		}
	}

	mwut::DebugPrintf(_T("Bital device not found\n"));
	_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;
}