You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							46 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
	
	
							46 lines
						
					
					
						
							1.3 KiB
						
					
					
				import os
 | 
						|
import subprocess
 | 
						|
 | 
						|
def sudo_write(val: str, path: str) -> None:
 | 
						|
  try:
 | 
						|
    with open(path, 'w') as f:
 | 
						|
      f.write(str(val))
 | 
						|
  except PermissionError:
 | 
						|
    os.system(f"sudo chmod a+w {path}")
 | 
						|
    try:
 | 
						|
      with open(path, 'w') as f:
 | 
						|
        f.write(str(val))
 | 
						|
    except PermissionError:
 | 
						|
      # fallback for debugfs files
 | 
						|
      os.system(f"sudo su -c 'echo {val} > {path}'")
 | 
						|
 | 
						|
def sudo_read(path: str) -> str:
 | 
						|
  try:
 | 
						|
    return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip()
 | 
						|
  except Exception:
 | 
						|
    return ""
 | 
						|
 | 
						|
class MovingAverage:
 | 
						|
  def __init__(self, window_size: int):
 | 
						|
    self.window_size: int = window_size
 | 
						|
    self.buffer: list[float] = [0.0] * window_size
 | 
						|
    self.index: int = 0
 | 
						|
    self.count: int = 0
 | 
						|
    self.sum: float = 0.0
 | 
						|
 | 
						|
  def add_value(self, new_value: float):
 | 
						|
    # Update the sum: subtract the value being replaced and add the new value
 | 
						|
    self.sum -= self.buffer[self.index]
 | 
						|
    self.buffer[self.index] = new_value
 | 
						|
    self.sum += new_value
 | 
						|
 | 
						|
    # Update the index in a circular manner
 | 
						|
    self.index = (self.index + 1) % self.window_size
 | 
						|
 | 
						|
    # Track the number of added values (for partial windows)
 | 
						|
    self.count = min(self.count + 1, self.window_size)
 | 
						|
 | 
						|
  def get_average(self) -> float:
 | 
						|
    if self.count == 0:
 | 
						|
      return float('nan')
 | 
						|
    return self.sum / self.count
 | 
						|
 |