Remove obsolete audio and buzzer control documentation files, including detailed guides and HTML interfaces, to streamline the repository and eliminate redundancy. This cleanup enhances maintainability and focuses on essential resources for the reTerminal DM4 audio and buzzer functionalities.

This commit is contained in:
nearxos
2026-02-20 15:39:39 +02:00
parent 9656771d5a
commit 58d9144752
101 changed files with 80 additions and 193 deletions

View File

@@ -0,0 +1,350 @@
#!/usr/bin/env python3
"""
Flask LED and Buzzer Control Application for reTerminal DM4
Provides REST API for controlling both the LED and buzzer
"""
from flask import Flask, jsonify, request
import subprocess
import time
import threading
app = Flask(__name__)
LED_PATH = '/sys/class/leds/usr-led/brightness'
BUZZER_PATH = '/sys/class/leds/usr-buzzer/brightness'
class LEDController:
"""LED controller class"""
def __init__(self):
self.is_active = False
self.thread = None
def _write(self, value):
"""Internal method to write to LED"""
try:
subprocess.run(['sudo', 'tee', LED_PATH],
input=str(value), text=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
check=True)
return True
except subprocess.CalledProcessError:
return False
def on(self):
"""Turn LED ON"""
return self._write(1)
def off(self):
"""Turn LED OFF"""
return self._write(0)
def toggle(self):
"""Toggle LED state"""
try:
result = subprocess.run(['cat', LED_PATH],
capture_output=True, text=True, check=True)
current = result.stdout.strip()
new_state = '0' if current == '1' else '1'
return self._write(new_state)
except:
return False
def blink(self, count=5, on_time=0.2, off_time=0.2):
"""Blink LED specified number of times"""
if self.is_active:
return False
def _blink():
self.is_active = True
for _ in range(count):
self.on()
time.sleep(on_time)
self.off()
time.sleep(off_time)
self.is_active = False
self.thread = threading.Thread(target=_blink, daemon=True)
self.thread.start()
return True
def pulse(self, duration=2, interval=0.1):
"""Pulse LED for specified duration"""
if self.is_active:
return False
def _pulse():
self.is_active = True
end_time = time.time() + duration
while time.time() < end_time:
self.on()
time.sleep(interval)
self.off()
time.sleep(interval)
self.is_active = False
self.thread = threading.Thread(target=_pulse, daemon=True)
self.thread.start()
return True
def status(self):
"""Get LED status"""
try:
result = subprocess.run(['cat', LED_PATH],
capture_output=True, text=True, check=True)
state = result.stdout.strip()
return 'ON' if state == '1' else 'OFF'
except:
return 'UNKNOWN'
class BuzzerController:
"""Buzzer controller class"""
def __init__(self):
self.is_playing = False
self.play_thread = None
def _write(self, value):
"""Internal method to write to buzzer"""
try:
subprocess.run(['sudo', 'tee', BUZZER_PATH],
input=str(value), text=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
check=True)
return True
except subprocess.CalledProcessError:
return False
def on(self):
"""Turn buzzer ON"""
return self._write(1)
def off(self):
"""Turn buzzer OFF"""
return self._write(0)
def beep(self, duration=0.2):
"""Play a single beep"""
self.on()
time.sleep(duration)
self.off()
def play_pattern(self, pattern):
"""Play a pattern"""
if self.is_playing:
return False
def _play():
self.is_playing = True
for on_time, off_time in pattern:
self.on()
time.sleep(on_time)
self.off()
time.sleep(off_time)
self.is_playing = False
self.play_thread = threading.Thread(target=_play, daemon=True)
self.play_thread.start()
return True
def status(self):
"""Get buzzer status"""
try:
result = subprocess.run(['cat', BUZZER_PATH],
capture_output=True, text=True, check=True)
state = result.stdout.strip()
return 'ON' if state == '1' else 'OFF'
except:
return 'UNKNOWN'
# Create global controllers
led = LEDController()
buzzer = BuzzerController()
@app.route('/')
def index():
"""API documentation endpoint"""
return jsonify({
'status': 'LED and Buzzer Control API',
'version': '1.0',
'endpoints': {
'LED': {
'/led/on': 'Turn LED ON (POST, GET)',
'/led/off': 'Turn LED OFF (POST, GET)',
'/led/toggle': 'Toggle LED (POST, GET)',
'/led/blink': 'Blink LED (GET: ?count=5&on_time=0.2&off_time=0.2)',
'/led/pulse': 'Pulse LED (GET: ?duration=2&interval=0.1)',
'/led/status': 'Get LED status (GET)'
},
'Buzzer': {
'/buzzer/on': 'Turn buzzer ON (POST, GET)',
'/buzzer/off': 'Turn buzzer OFF (POST, GET)',
'/buzzer/beep': 'Play beep (GET: ?duration=0.2)',
'/buzzer/status': 'Get buzzer status (GET)'
},
'Combined': {
'/alert': 'Alert with LED and buzzer (GET: ?type=info|success|error|warning)'
}
}
})
# LED Endpoints
@app.route('/led/on', methods=['POST', 'GET'])
def led_on():
"""Turn LED ON"""
if led.on():
return jsonify({'status': 'success', 'message': 'LED turned ON'})
return jsonify({'status': 'error', 'message': 'Failed to turn LED ON'}), 500
@app.route('/led/off', methods=['POST', 'GET'])
def led_off():
"""Turn LED OFF"""
if led.off():
return jsonify({'status': 'success', 'message': 'LED turned OFF'})
return jsonify({'status': 'error', 'message': 'Failed to turn LED OFF'}), 500
@app.route('/led/toggle', methods=['POST', 'GET'])
def led_toggle():
"""Toggle LED state"""
if led.toggle():
return jsonify({'status': 'success', 'message': 'LED toggled'})
return jsonify({'status': 'error', 'message': 'Failed to toggle LED'}), 500
@app.route('/led/blink', methods=['POST', 'GET'])
def led_blink():
"""Blink LED"""
count = int(request.args.get('count', 5))
on_time = float(request.args.get('on_time', 0.2))
off_time = float(request.args.get('off_time', 0.2))
if led.blink(count, on_time, off_time):
return jsonify({
'status': 'success',
'message': f'LED blinking {count} times'
})
return jsonify({
'status': 'error',
'message': 'LED is already active'
}), 409
@app.route('/led/pulse', methods=['POST', 'GET'])
def led_pulse():
"""Pulse LED"""
duration = float(request.args.get('duration', 2))
interval = float(request.args.get('interval', 0.1))
if led.pulse(duration, interval):
return jsonify({
'status': 'success',
'message': f'LED pulsing for {duration} seconds'
})
return jsonify({
'status': 'error',
'message': 'LED is already active'
}), 409
@app.route('/led/status', methods=['GET'])
def led_status():
"""Get LED status"""
state = led.status()
return jsonify({
'status': 'success',
'led': state,
'is_active': led.is_active
})
# Buzzer Endpoints
@app.route('/buzzer/on', methods=['POST', 'GET'])
def buzzer_on():
"""Turn buzzer ON"""
if buzzer.on():
return jsonify({'status': 'success', 'message': 'Buzzer turned ON'})
return jsonify({'status': 'error', 'message': 'Failed to turn buzzer ON'}), 500
@app.route('/buzzer/off', methods=['POST', 'GET'])
def buzzer_off():
"""Turn buzzer OFF"""
if buzzer.off():
return jsonify({'status': 'success', 'message': 'Buzzer turned OFF'})
return jsonify({'status': 'error', 'message': 'Failed to turn buzzer OFF'}), 500
@app.route('/buzzer/beep', methods=['POST', 'GET'])
def buzzer_beep():
"""Play a beep"""
duration = float(request.args.get('duration', 0.2))
if duration < 0 or duration > 5:
return jsonify({
'status': 'error',
'message': 'Duration must be between 0 and 5 seconds'
}), 400
buzzer.beep(duration)
return jsonify({
'status': 'success',
'message': f'Beeped for {duration} seconds'
})
@app.route('/buzzer/status', methods=['GET'])
def buzzer_status():
"""Get buzzer status"""
state = buzzer.status()
return jsonify({
'status': 'success',
'buzzer': state,
'is_playing': buzzer.is_playing
})
# Combined Alert Endpoint
@app.route('/alert', methods=['GET'])
def alert():
"""Alert with LED and buzzer"""
alert_type = request.args.get('type', 'info')
patterns = {
'info': {
'led': (1, 0.2, 0.2), # 1 blink
'buzzer': (0.1, 0.1) # Short beep
},
'success': {
'led': (2, 0.1, 0.1), # 2 fast blinks
'buzzer': (0.2, 0.1) # Medium beep
},
'warning': {
'led': (2, 0.3, 0.3), # 2 slow blinks
'buzzer': (0.3, 0.2) # Longer beep
},
'error': {
'led': (3, 0.05, 0.05), # 3 very fast blinks
'buzzer': (0.2, 0.05) # Fast beeps
}
}
if alert_type not in patterns:
return jsonify({
'status': 'error',
'message': 'Invalid alert type. Use: info, success, warning, error'
}), 400
pattern = patterns[alert_type]
# Start LED blink
count, on_time, off_time = pattern['led']
led.blink(count, on_time, off_time)
# Play buzzer pattern
beep_duration, pause = pattern['buzzer']
buzzer_pattern = [(beep_duration, pause)] * count
buzzer.play_pattern(buzzer_pattern)
return jsonify({
'status': 'success',
'message': f'Alert ({alert_type}) triggered'
})
if __name__ == '__main__':
print("Starting LED and Buzzer Control API...")
print("API available at http://0.0.0.0:5000")
print("Documentation at http://0.0.0.0:5000/")
app.run(host='0.0.0.0', port=5000, debug=True)