ich habe ein paar Verständnisfragen zu objektorientierter Programmierung. Folgendes Beispiel zeigt den grundlegenden Aufbau des Objektes Reader, das ich bauen möchte.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from threading import Lock
class Counter(object):
def __init__(self, value=0):
self.value = value
self.lock = Lock()
def increase(self, value):
with self.lock:
self.value += value
def get_and_reset(self):
with self.lock:
result = self.value
self.value = 0
return result
class Reader(object):
def __init__(self, digital_input, frequency, interval):
self.digital_input = digital_input
self.frequency = frequency
self.interval = interval
self.count = Counter()
# Example for some work to calculate
self.count.increase(self.frequency)
self.count.increase(self.digital_input)
self.count.increase(self.interval)
def show_values(self):
return self.count.get_and_reset() / 20
def main():
digital_input = 2
frequency = 100
interval = 2
test = Reader(digital_input, frequency, interval)
print test.show_values()
if __name__ == '__main__':
main()
Im grunde möchte ich realisieren, dass ich das Objekt Reader erstellen kann und dadurch automatisch der Thread mit den unten aufgeführten Funktionen startet. Anschließend sollen über objektinterne Funktionen die Counter-Werte verarbeitet werden und verschiedene Ausgaben ermöglicht werden (z.B. wie oben die Funktion show_values).
Code: Alles auswählen
def blink_led(digital_output):
piface.digital_write(digital_output, 0)
time.sleep(0.05)
piface.digital_write(digital_output, 1)
def iter_changes(event, frequency, digital_input):
for value, _ in groupby(iter_values(event, frequency, digital_input)):
yield value
def iter_values(event, frequency, digital_input):
while not event.wait(1.0/frequency):
yield piface.digital_read(digital_input)
def read_input(count, event, frequency, digital_input):
for value in iter_changes(event, frequency, digital_input):
if value == 1:
count.increase()
blink_led(digital_input)
def start_thread_read_input(count, event, frequency, digital_input):
thread = Thread(target=read_input, args=(count, event, frequency, digital_input))
thread.setDaemon(True)
thread.start()

Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from itertools import groupby
from threading import Lock
from threading import Thread
from threading import Event
import pifacedigitalio as piface
class Counter(object):
def __init__(self, value=0):
self.value = value
self.lock = Lock()
def increase(self):
with self.lock:
self.value += 1
def get_and_reset(self):
with self.lock:
result = self.value
self.value = 0
return result
class Reader(object):
def __init__(self, digital_input, frequency, interval):
self.digital_input = digital_input
self.frequency = frequency
self.interval = interval
self.count = Counter()
self.event = Event()
piface.digital_write(digital_input, 1)
# user defined functions
def blink_led(par_digital_input):
piface.digital_write(par_digital_input, 0)
time.sleep(0.05)
piface.digital_write(par_digital_input, 1)
def iter_values(par_event, par_frequency, par_digital_input):
while not par_event.wait(1.0/par_frequency):
yield piface.digital_read(par_digital_input)
def iter_changes(par_event, par_frequency, par_digital_input):
for value, _ in groupby(iter_values(par_event, par_frequency,
par_digital_input)):
yield value
def read_input(par_count, par_event, par_frequency, par_digital_input):
for value in iter_changes(par_event, par_frequency,
par_digital_input):
if value == 1:
par_count.increase()
blink_led(par_digital_input)
# start of thread
self.thread = Thread(target=read_input,
args=(self.count, self.event,self.frequency,
self.interval))
self.thread.setDaemon(True)
self.thread.start()
def show_values(self):
return self.count.get_and_reset()
def main():
piface.init()
digital_input = 1
frequency = 100
interval = 5
event_a = Event()
test = Reader(digital_input, frequency, interval)
timestamp = int(time.time() / interval) * interval
timestamp += interval
while not event_a.wait(max(0, timestamp-time.time())):
timestamp += interval
print test.show_values()
if __name__ == '__main__':
main()
Gruß
mobby