#pragma once //----------------------------------------------------------------------------- // старинный простейший модуль детекции пульсвых волн с оксиметрического датчика // и расчет SPO // клон аппаратного модуля // одноканальный // входной сигнал 100Гц // 24.055.2021 //----------------------------------------------------------------------------- #include "JDefines.h" #include "JTerminal.h" namespace Incart::Common { class SpoDetector { const bool MYDEBUG = false; protected: float LvH = 100.f; float LvL = -1.f; float m_bufIrd[4]; // буфер тахоосциллограммы на 40ms float m_bufRed[4]; // буфер тахоосциллограммы на 40ms int m_pntBuf = 0; // public: float m_compLv = LvL; // float tachoIrd; float tachoRed; float m_tachoRg; int m_counter_from_zero = 0; int m_counterF1 = 0; float m_SignalRgF1 = 0.f; float m_SignalRgMax = 0.f; public: SpoDetector() { JT() << __FUNCTION__; memset(m_bufIrd,0,sizeof(m_bufIrd)); memset(m_bufRed,0,sizeof(m_bufRed)); m_pntBuf = 0; } bool exe(float ir,float rd) { // расчет тахоосццилограммы (первая разность в окне 40 ms) float irl = m_bufIrd[m_pntBuf]; m_bufIrd[m_pntBuf] = ir; float rdl = m_bufRed[m_pntBuf]; m_bufRed[m_pntBuf] = rd; m_pntBuf++; m_pntBuf %= 4; tachoIrd = irl- ir; tachoRed = rdl - rd; // компаратор с гистерезисом float signal = rd; float tacho = tachoRed; // переход через 0 m_counter_from_zero++; if( SIGN(m_tachoRg) != SIGN(tacho) ) { m_counter_from_zero = 0; } m_tachoRg = tacho; // сохраняем значение на следующий шаг // m_counterF1++; // if ( m_SignalRgMax < tacho ) m_SignalRgMax = tacho; // bool res = false; if(m_compLv < 0) // выбор типа полуволны компаратора { // Lv<0 положительный полупериод if(tacho < m_compLv)// тест на смену полупериода { // m_compLv = LvH; // переключаем уровень компаратора res = true; // точка детекции пульсации JTerminal() << __FUNCTION__ << "f2" << m_counter_from_zero << signal << signal - m_SignalRgF1 << m_SignalRgMax << m_counterF1; } } else { // Lv>0 отрицательный полупериод // OksiPls.CompLv = OksiPls.LvP / 2; if(tacho > m_compLv) // тест на смену полупериода { m_compLv = LvL; // переключаем уровень компаратора // точка расчета SPO - есть интервал до и пооослее пульсации // OksiDtcPars(); // pacчет параметров пульсовой волны // OksiPls.RegRedBegin = OksiPls.RegRedEnd; // регистр значения светопроводимости в начале пульсации // OksiPls.RegIrBegin = OksiPls.RegIrEnd; // регистр значения светопроводимости в начале пульсации // PackDevSetOxyPls(OksiPls.Result,OksiPls.tR,OksiPls.AmplRed,OksiPls.AmplIr,OksiPls.tSpo,OksiPls.rSpo); // OksiDtcRestart(); // Начало цикла детекции периода сигнала JTerminal() << __FUNCTION__ << "f1" << m_counter_from_zero << m_counterF1; // m_SignalRgF1 = signal; m_SignalRgMax = 0.f; m_counterF1 = 0; } /* if(OksiPls.Tch