softpwm.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. class spwm:
  2. def __init__(self,pin):
  3. self.pin = pin
  4. def __call__(self,Hz):
  5. self.value(float(Hz))
  6. def value(self,hz=None):
  7. if hz: # no 0 !
  8. use.softpwm[str(self.pin)] = int(1000.0/hz)
  9. return use.softpwm[str(self.pin)]
  10. def stop(self):
  11. del use.softpwm[str(self.pin)]
  12. async def spwm(self,rise,fall):
  13. while True:
  14. pwm = use.softpwm.get( str(self.pin), None)
  15. #break on low
  16. if pwm is None:
  17. break
  18. for state in (1,0,):
  19. if state:
  20. if rise:rise()
  21. elif fall:fall()
  22. self.pin(state)
  23. await aio.asleep_ms(pwm)
  24. class softpwm(dict):
  25. spwm = spwm
  26. def __call__(self,pin,hz,rise=None,fall=None):
  27. if isinstance(pin,str):
  28. pin = gpio(pin,'w',0)
  29. pin = self.spwm(pin)
  30. pin.value(hz)
  31. aio.create_task( pin.spwm(rise,fall))
  32. return pin
  33. softpwm = softpwm()
  34. use.softpwm = softpwm
  35. del spwm, sys.modules[__name__]
  36. use.gc()