Release Vulpes OS 2.7-preview.22
This commit is contained in:
parent
200d1fb235
commit
a138f97877
294 changed files with 515786 additions and 187 deletions
51
tundra/devices/beatles/hardware_control.py
Normal file
51
tundra/devices/beatles/hardware_control.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
# SPDX-License-Identifier: MPL-2.0
|
||||
"""Fixed Nokia controls mounted writable only in the trusted broker namespace."""
|
||||
import math
|
||||
from pathlib import Path
|
||||
import time
|
||||
|
||||
|
||||
class HardwareControl:
|
||||
def __init__(self,root=Path('/work/hardware-controls')):
|
||||
self.root=root;self.original=None;self.pattern=[];self.next_at=0;self.on=False
|
||||
|
||||
def write(self,name,value):
|
||||
(self.root/name).write_text(str(value)+'\n')
|
||||
|
||||
def request(self,value):
|
||||
if not isinstance(value,dict):raise ValueError('INVALID_REQUEST')
|
||||
op=value.get('operation')
|
||||
if op=='screen':
|
||||
level=value.get('level');enabled=value.get('enabled')
|
||||
if type(enabled) is not bool or type(level) not in (int,float) or not math.isfinite(level) or not 0<=level<=1:
|
||||
raise ValueError('INVALID_REQUEST')
|
||||
maximum=int((self.root/'backlight-max').read_text())
|
||||
if not 1<=maximum<=65535:raise RuntimeError('NOT_SUPPORTED')
|
||||
if self.original is None:self.original=int((self.root/'backlight').read_text())
|
||||
brightness=max(1,int(level*maximum+.5)) if enabled else 0
|
||||
self.write('backlight',brightness)
|
||||
actual=int((self.root/'backlight').read_text())
|
||||
if actual!=brightness:raise RuntimeError('HARDWARE_READBACK_FAILED')
|
||||
return {'brightness':actual,'maximum':maximum}
|
||||
if op=='vibrate':
|
||||
pattern=value.get('pattern')
|
||||
if not isinstance(pattern,list) or len(pattern)>32 or any(type(n) is not int or not 0<=n<=10000 for n in pattern) or sum(pattern)>10000:
|
||||
raise ValueError('INVALID_REQUEST')
|
||||
self.write('vibrator',0)
|
||||
self.pattern=list(pattern);self.on=False;self.next_at=0;self.tick()
|
||||
return True
|
||||
raise ValueError('NOT_SUPPORTED')
|
||||
|
||||
def tick(self):
|
||||
now=time.monotonic()
|
||||
while self.pattern and now>=self.next_at:
|
||||
duration=self.pattern.pop(0);self.on=not self.on
|
||||
self.write('vibrator',duration if self.on else 0)
|
||||
self.next_at=now+duration/1000
|
||||
|
||||
def restore(self):
|
||||
self.pattern=[]
|
||||
for name,value in [('vibrator',0),('backlight',self.original)]:
|
||||
if value is not None:
|
||||
try:self.write(name,value)
|
||||
except OSError:pass
|
||||
Loading…
Reference in a new issue