Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

moved into a class, so multiple frequencies can be created #5

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ As of now, Cronus implements two features:
* Allows a continuous while loop to run at a fixed frequency

```python
import cronus.beat as beat
from cronus.beat import Beat
import time
import datetime

Expand All @@ -31,6 +31,7 @@ def do_some_work():

if __name__ == "__main__":
# specify rate in Hz
beat = Beat()
beat.set_rate(2)
while beat.true():
do_some_work()
Expand Down
85 changes: 45 additions & 40 deletions cronus/beat.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,46 +7,51 @@
import datetime
import time

loop_start_time = None
loop_duration = 0

def set_rate(rate):
"""Defines the ideal rate at which computation is to be performed

:arg rate: the frequency in Hertz
:type rate: int or float

:raises: TypeError: if argument 'rate' is not int or float
"""
if not (isinstance(rate, int) or isinstance(rate, float)):
raise TypeError("argument to set_rate is expected to be int or float")
global loop_duration
loop_duration = 1.0/rate

def sleep():
"""Sleeps for a dynamic duration of time as determined by set_rate() and true().

:raises: BeatError: if this function is called before calling set_rate() or \
before calling true()
"""
if loop_duration == 0:
raise BeatError("call beat.set_rate() before calling sleep")
if loop_start_time == None:
raise BeatError("call beat.true() before calling sleep")
td = datetime.datetime.now() - loop_start_time
duration_to_sleep = loop_duration - td.total_seconds()
if duration_to_sleep < 0:
raise BeatError("skipping sleep. Too much work!")
time.sleep(duration_to_sleep)

def true():
"""A substitute to True. Use 'while beat.true()' instead of 'while True'

:returns: True
"""
global loop_start_time
loop_start_time = datetime.datetime.now()
return True



class Beat():
def __init__(self):
self.loop_start_time = None
self.loop_duration = 0

def set_rate(self,rate):
"""Defines the ideal rate at which computation is to be performed

:arg rate: the frequency in Hertz
:type rate: int or float

:raises: TypeError: if argument 'rate' is not int or float
"""
if not (isinstance(rate, int) or isinstance(rate, float)):
raise TypeError("argument to set_rate is expected to be int or float")

self.loop_duration = 1.0/rate

def sleep(self):
"""Sleeps for a dynamic duration of time as determined by set_rate() and true().

:raises: BeatError: if this function is called before calling set_rate() or \
before calling true()
"""
if self.loop_duration == 0:
raise BeatError("call beat.set_rate() before calling sleep")
if self.loop_start_time == None:
raise BeatError("call beat.true() before calling sleep")
td = datetime.datetime.now() - self.loop_start_time
duration_to_sleep = self.loop_duration - td.total_seconds()
if duration_to_sleep < 0:
raise BeatError("skipping sleep. Too much work!")
time.sleep(duration_to_sleep)

def true(self):
"""A substitute to True. Use 'while beat.true()' instead of 'while True'

:returns: True
"""

self.loop_start_time = datetime.datetime.now()
return True


class BeatError(Exception):
Expand Down