class EventSpiSensor(SpiSensorConf, EventDrivenIo, SensorException): """This class is for the event driven sensors""" def __init__(self, device=0, bus=0): super().__init__(device, bus) self.event_handlers = EventHandler() def add_event_handler(self, event, handler): # This method is for add event handler. # eventを指定して、そのイベントにメソッドを追加する self.event_handlers.add(event, handler) def run(self): self.sensor_thread = threading.Thread(target=self.sensor_method, args()) def sensor_thread(self, user_method): while True: # ポーリングで特定のレジスタを読んでくる # センサーで読み取ってくる値 = イベントの値 # ここでの問題は計算式に入れる前の値をセンサーはとってくるので、イベントをしっかり設定する必要あり assert read_method is not None, 'Please gave sensing method.' self.sensor_value = sensor_method() # ユーザ定義のセンシングメソッドを実行 if self.sensor_value in self.event_handlers.events.keys(): # keyの中に取得してきた値があれば、そのキーに対応したメソッドをよぶ self.event_handlers(self.sensor_value) else: # それ以外の場合otherをキーとするメソッドを呼ぶ self.event_handlers('other') def read(self, addr, byte=1): return self.spi.readByte(addr, byte) def write(self, addr, byte=1, values, mode='byte'): if mode == 'byte': self.spi.writeBytes(addr, values) elif mode == 'xfer' return self.xfer2(values) def remove_event_handler(self, event): self.event_handlers.remove() def user_method(self): # 値を取得するセンシングメソッドを記述 pass def exception_method(self): self.event_handlers.remove() self.spi.close()
class EventSmbusSensor(SmbusSensorConf, EventDrivenIo, SensorException): """This class is for the event driven sensors""" def __init__(self, address=None, bus=1): assert address is not None, 'Please select address.' super().__init__(address, bus) self.event_handlers = EventHandler() def add_event_handler(self, event, handler): # eventを指定して、そのイベントにメソッドを追加する self.event_handlers.add(event, handler) def run(self): self.sensor_thread = threading.Thread(target=self.sensor_method, args()) def sensor_method(self, user_method): # センシングメソッドを与える, 与えたメソッドを呼ぶ得られた値がイベントとしてあるか調べる while True: # ポーリングで特定のレジスタを読んでくる # センサーで読み取ってくる値 = イベントの値 assert read_method is not None, 'Please gave sensing method.' self.sensor_value = sensor_method() # ユーザ定義のセンシングメソッドを実行 if self.sensor_value in event_handler.events.keys(): # keyの中に取得してきた値があれば、そのキーに対応したメソッドをよぶ self.event_handlers(self.sensor_value) else: # それ以外の場合otherをキーとするメソッドを呼ぶ self.event_handlers('other') def read(self, mode='byte', cmd=None, *blocks): if mode == 'byte': return self.i2c.read_byte(self.address) elif mode == 'byte' and cmd != None: return self.i2c.read_byte_data(self.address, cmd) elif mode == 'block' and cmd != None: return self.i2c.read_block_data(self.address, cmd, blocks[0]) else: print('Not Supported data.') return False def write(value, mode='byte', cmd=None): if mode == 'byte': self.i2c.write_byte(self.address, value) elif mode == 'byte' and cmd != None: self.i2c.write_byte_data(self.address, cmd, value) elif mode == 'word' and cmd != None: self.i2c.write_word_data(self.address, cmd, value) elif mode == 'process' and cmd != None: return self.i2c.process_call(self.address, cmd, value) else: return False def remove_event_handler(self, event): self.event_handlers.remove() def user_method(self): # 値を取得するセンシングメソッドを記述 pass def exception_method(self): self.event_handlers.remove()