from frappy.core import StringType, BoolType, Parameter, Property, PersistentParam, Command, IDLE, ERROR, WARN, Writable import time class RheoTrigger(Writable): addr = Property('Port address', StringType()) value = Parameter('Output state', BoolType(), default=0) target = Parameter('target', BoolType(), default=0, readonly=False) status = Parameter() doBeep = Property('Make noise', BoolType(), default=0) _status = 0 def initModule(self): super().initModule() with open('/sys/class/ionopimax/digital_io/'+self.addr+'_mode', 'w') as f : f.write('out') if self.doBeep: with open('/sys/class/ionopimax/buzzer/beep', 'w') as f : f.write('200 50 3') def read_value(self): with open('/sys/class/ionopimax/digital_io/'+self.addr, 'r') as f : file_value = f.read() if file_value == '0\n': value = False self._status = 0 elif file_value == '1\n': value = True self._status = 1 else: self._status = -1 value = False return value def write_target(self,target): if target == self.value: return target else: with open('/sys/class/ionopimax/digital_io/'+self.addr, 'w') as f : if target == True: f.write('1') elif target == False: f.write('0') time.sleep(0.05) if self.doBeep: with open('/sys/class/ionopimax/buzzer/beep', 'w') as f : f.write('200') self.status = self.read_status() return target def read_status(self): self.value = self.read_value() if self._status == 0: return IDLE, 'Signal low' elif self._status == 1: return IDLE, 'Signal high' else: return ERROR, 'Cannot read status' @Command def toggle(self): """Toggle output""" value = self.read_value() if value == True: self.write_target(False) else: self.write_target(True)