Files
libpigpio/pigtimer.cpp
2025-08-05 22:33:23 +02:00

141 lines
2.1 KiB
C++

/*****************************************************************************
source::worx libPiGPio
Copyright © 2022 c.holzheuer
chris@sourceworx.org
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Uses:
pigpiod_if2 by joan2937, pigpio @ abyz.me.uk
https://abyz.me.uk/rpi/pigpio
sigslot by 2017 Pierre-Antoine Lacaze
https://github.com/palacaze/sigslot
***************************************************************************/
#include <iostream>
#include <chrono>
#include <thread>
#include <pigtimer.h>
pigTimer::pigTimer()
{
}
pigTimer::pigTimer( int timeOn, int timeOff, int repcnt )
: _timeOn{ timeOn }, _timeOff{ timeOff }, _repcnt{ repcnt }
{
if( !_timeOff )
_timeOff = _timeOn;
}
pigTimer::~pigTimer()
{
}
void pigTimer::change_state( bool newState )
{
set_state( newState );
}
int pigTimer::timeOn()
{
return _timeOn;
}
void pigTimer::setTimeOn( int timeOn )
{
_timeOn = timeOn;
// reset??
}
int pigTimer::timeOff()
{
return _timeOff;
}
void pigTimer::setTimeOff( int timeOff )
{
_timeOff = timeOff;
}
int pigTimer::repetitions()
{
return _repcnt;
}
void pigTimer::setRepetitions( int repcnt )
{
_repcnt = repcnt;
}
void pigTimer::start()
{
_active = true;
// ewig
if( _repcnt < 1 )
{
while( _active )
sleepCycle();
return;
}
// abgezählt
for( int i=0; i<_repcnt; ++i )
sleepCycle();
}
void pigTimer::stop()
{
_active = false;
}
void pigTimer::sleepCycle()
{
sleepThread( _timeOff );
if( !_active )
return;
sleepThread( _timeOn );
}
void pigTimer::sleepThread( int delay )
{
std::thread thrd(
[=]()
{
if( !_active )
return;
std::this_thread::sleep_for( std::chrono::milliseconds( delay ) );
toggle_state();
} );
thrd.detach();
}