Refactor golden image handling in backup upload process</message>
<message>Update the _set_golden_from_path function to improve the handling of existing golden image files. Replace the existing unlink logic with a more robust method that safely removes files or broken symlinks using the missing_ok parameter. This change enhances the reliability of the backup upload process by ensuring that stale references are properly cleared before setting a new golden image path.
This commit is contained in:
116
backup-from-device/gnss-guard/test_buzzer.py
Executable file
116
backup-from-device/gnss-guard/test_buzzer.py
Executable file
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Buzzer Test Script for reTerminal DM4
|
||||
Tests various buzzer patterns and functions
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import time
|
||||
import sys
|
||||
|
||||
BUZZER_PATH = '/sys/class/leds/usr-buzzer/brightness'
|
||||
|
||||
def buzzer_on():
|
||||
"""Turn buzzer ON"""
|
||||
subprocess.run(['sudo', 'tee', BUZZER_PATH],
|
||||
input='1', text=True,
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL)
|
||||
|
||||
def buzzer_off():
|
||||
"""Turn buzzer OFF"""
|
||||
subprocess.run(['sudo', 'tee', BUZZER_PATH],
|
||||
input='0', text=True,
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL)
|
||||
|
||||
def beep(duration=0.2):
|
||||
"""Play a single beep"""
|
||||
buzzer_on()
|
||||
time.sleep(duration)
|
||||
buzzer_off()
|
||||
|
||||
def blink(count=3, on_time=0.1, off_time=0.1):
|
||||
"""Blink buzzer multiple times"""
|
||||
for _ in range(count):
|
||||
buzzer_on()
|
||||
time.sleep(on_time)
|
||||
buzzer_off()
|
||||
time.sleep(off_time)
|
||||
|
||||
def get_status():
|
||||
"""Get current buzzer status"""
|
||||
try:
|
||||
result = subprocess.run(['cat', BUZZER_PATH],
|
||||
capture_output=True, text=True, check=True)
|
||||
return 'ON' if result.stdout.strip() in ['1', '255'] else 'OFF'
|
||||
except:
|
||||
return 'UNKNOWN'
|
||||
|
||||
def main():
|
||||
print("=" * 50)
|
||||
print(" reTerminal DM4 Buzzer Test Script (Python)")
|
||||
print("=" * 50)
|
||||
print()
|
||||
|
||||
# Test 1: Single beep
|
||||
print("Test 1: Single beep (0.2s)")
|
||||
beep(0.2)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Test 2: Double beep
|
||||
print("Test 2: Double beep")
|
||||
blink(2, 0.1, 0.1)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Test 3: Triple beep
|
||||
print("Test 3: Triple beep")
|
||||
blink(3, 0.1, 0.1)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Test 4: Long beep
|
||||
print("Test 4: Long beep (0.5s)")
|
||||
beep(0.5)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Test 5: Rapid beeps
|
||||
print("Test 5: Rapid beeps (5x)")
|
||||
blink(5, 0.05, 0.05)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Test 6: Slow beeps
|
||||
print("Test 6: Slow beeps (3x)")
|
||||
blink(3, 0.3, 0.3)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Test 7: Success pattern
|
||||
print("Test 7: Success pattern (2 short)")
|
||||
blink(2, 0.1, 0.1)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Test 8: Error pattern
|
||||
print("Test 8: Error pattern (3 fast)")
|
||||
blink(3, 0.05, 0.05)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Ensure buzzer is off
|
||||
buzzer_off()
|
||||
|
||||
print()
|
||||
print("=" * 50)
|
||||
print(" Buzzer test complete!")
|
||||
print("=" * 50)
|
||||
print()
|
||||
print(f"Current buzzer status: {get_status()}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
main()
|
||||
except KeyboardInterrupt:
|
||||
print("\n\nTest interrupted by user")
|
||||
buzzer_off()
|
||||
sys.exit(0)
|
||||
except Exception as e:
|
||||
print(f"\n\nError: {e}")
|
||||
buzzer_off()
|
||||
sys.exit(1)
|
||||
Reference in New Issue
Block a user