Add blink feature
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from microdot import Microdot, send_file
|
||||
import machine, sys, neopixel, time
|
||||
import machine, sys, neopixel, time, asyncio
|
||||
|
||||
app = Microdot()
|
||||
|
||||
@@ -22,6 +22,10 @@ blColor = statusColors.get('OFF')
|
||||
blStatus = 'off'
|
||||
blPreviousStatus='off'
|
||||
blBrightness = 0.1 # Adjust the brightness (0.0 - 1.0)
|
||||
blBlinking = False
|
||||
blBlinkFrequency = 0
|
||||
blBlinkDuration = 0
|
||||
blBlinkStartTime = 0
|
||||
|
||||
def __setColor(color):
|
||||
r, g , b = color
|
||||
@@ -152,6 +156,82 @@ async def setStatus(request, status):
|
||||
|
||||
return {'status': blStatus}
|
||||
|
||||
async def __blinkTask(color, brightness, frequency, duration):
|
||||
global blBlinking, blStatus, blColor, blBrightness
|
||||
blBlinking = True
|
||||
interval = 1.0 / (frequency * 2) # half period in seconds
|
||||
elapsed = 0.0
|
||||
while blBlinking:
|
||||
neoPixelStrip.fill(__setColor(color))
|
||||
neoPixelStrip.write()
|
||||
await asyncio.sleep(interval)
|
||||
neoPixelStrip.fill((0, 0, 0))
|
||||
neoPixelStrip.write()
|
||||
await asyncio.sleep(interval)
|
||||
if duration > 0:
|
||||
elapsed += interval * 2
|
||||
if elapsed >= duration:
|
||||
break
|
||||
# Restore previous state
|
||||
blBlinking = False
|
||||
__setBusyLightColor(color, brightness)
|
||||
blStatus = blPreviousStatus
|
||||
|
||||
@app.post('/api/blink')
|
||||
async def setBlink(request):
|
||||
frequency = request.json.get('frequency')
|
||||
duration = request.json.get('duration')
|
||||
|
||||
if frequency is None or duration is None:
|
||||
return {'error': 'missing frequency or duration parameter'}, 400
|
||||
|
||||
if not isinstance(frequency, int) or frequency <= 0:
|
||||
return {'error': 'frequency must be a positive integer (Hz)'}, 400
|
||||
|
||||
if not (isinstance(duration, (int, float))) or duration < 0:
|
||||
return {'error': 'duration must be a positive float in seconds (0 = endless)'}, 400
|
||||
|
||||
# Save current state
|
||||
global blPreviousStatus, blBlinking, blBlinkFrequency, blBlinkDuration, blBlinkStartTime
|
||||
blPreviousStatus = blStatus
|
||||
savedColor = blColor
|
||||
savedBrightness = blBrightness
|
||||
|
||||
# Stop any ongoing blink
|
||||
blBlinking = False
|
||||
await asyncio.sleep(0)
|
||||
|
||||
# Save blink params
|
||||
blBlinkFrequency = frequency
|
||||
blBlinkDuration = duration
|
||||
blBlinkStartTime = time.ticks_ms()
|
||||
|
||||
# Launch blink task
|
||||
asyncio.create_task(__blinkTask(savedColor, savedBrightness, frequency, duration))
|
||||
|
||||
return {'status': 'blinking', 'frequency': frequency, 'duration': duration}
|
||||
|
||||
@app.get('/api/blink')
|
||||
async def getBlink(request):
|
||||
if blBlinking and blBlinkDuration > 0:
|
||||
elapsed = time.ticks_diff(time.ticks_ms(), blBlinkStartTime) / 1000.0
|
||||
remains = max(0.0, blBlinkDuration - elapsed)
|
||||
else:
|
||||
remains = 0.0
|
||||
|
||||
return {
|
||||
'isblinking': blBlinking,
|
||||
'frequency': blBlinkFrequency,
|
||||
'duration': blBlinkDuration,
|
||||
'remains': remains
|
||||
}
|
||||
|
||||
@app.post('/api/blink/stop')
|
||||
async def blinkStop(request):
|
||||
global blBlinking
|
||||
blBlinking = False
|
||||
return {'status': blStatus}
|
||||
|
||||
@app.get('/api/color')
|
||||
async def getColor(request):
|
||||
r, g, b = neoPixelStrip.__getitem__(0)
|
||||
|
||||
Reference in New Issue
Block a user