Я реализую библиотеку функциональных блоков ПЛК.Одним из функциональных блоков является функциональный блок «Импульс таймера», поведение которого следующее:
Я реализовал этот функциональный блок следующим образом
Tpulse.h:
#include <stdint.h>
#include "LogicBlk.h"
namespace LogicBlocks
{
// Timer Pulse i.e. logic one at the output for specified time as soon as 0->1 at the input
class Tpulse : public LogicBlk{
public:
Tpulse(uint32_t*, uint32_t, uint32_t, uint32_t);
virtual ~Tpulse();
void Update(void);
private:
uint32_t *m_BitsArray;
uint32_t m_Input;
uint32_t m_Output;
uint32_t m_PulseTime;
uint32_t m_StartTime;
uint32_t m_ElapsedTime;
uint32_t m_CurrentTime;
};
}
Tpulse.cpp:
LogicBlocks::Tpulse::Tpulse(uint32_t *bitsArray, uint32_t input, uint32_t output, uint32_t pulseTime):
m_BitsArray{bitsArray}, m_Input{input}, m_Output{output}, m_PulseTime{pulseTime}{
m_StartTime = 0;
m_ElapsedTime = 0;
m_CurrentTime = 0;
}
LogicBlocks::Tpulse::~Tpulse(){
}
void LogicBlocks::Tpulse::Update(void){
if(Utils::TestBitSet(m_BitsArray, m_Input) && Utils::TestBitClr(m_BitsArray, m_Output) && !m_ElapsedTime){
m_StartTime = GetTick();
SetBit(m_BitsArray, m_Output);
}else if(Utils::TestBitSet(m_BitsArray, m_Output)){
m_CurrentTime = GetTick();
m_ElapsedTime = m_CurrentTime - m_StartTime;
if(m_ElapsedTime >= m_PulseTime){
ClrBit(m_BitsArray, m_Output);
if(TestBitClr(m_BitsArray, m_Input)){
m_ElapsedTime = 0;
}
}
}else if(TestBitClr(m_BitsArray, m_Input) && TestBitClr(m_BitsArray, m_Output)){
m_ElapsedTime = 0;
}
}
Основываясь на уже проведенных мною тестах, мне кажется, что он работает нормально, но я не уверен.Кто-нибудь может оценить мой код с точки зрения функциональности и стиля программирования?Заранее благодарю за любые предложения.