123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #!/usr/bin/python3
- # -*- coding: utf-8 -*-
- # -*- mode: Python -*-
-
-
- '''
-
- redilysis_lines
- v0.1.0
-
- Add a line on every frame and scroll
-
- see https://git.interhacker.space/teamlaser/redilysis for more informations
- about the redilysis project
-
- LICENCE : CC
-
- by cocoa
-
-
- '''
- from __future__ import print_function
- import argparse
- import ast
- import os
- import math
- import random
- import redis
- import sys
- import time
- name = "generator::redilysis_lines"
-
- def debug(*args, **kwargs):
- if( verbose == False ):
- return
- print(*args, file=sys.stderr, **kwargs)
- def msNow():
- return time.time()
-
- CHAOS = 1
- REDIS_FREQ = 33
-
- # General Args
- argsparser = argparse.ArgumentParser(description="Redilysis filter")
- argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose")
- # Redis Args
- argsparser.add_argument("-i","--ip",help="IP address of the Redis server ",default="127.0.0.1",type=str)
- argsparser.add_argument("-p","--port",help="Port of the Redis server ",default="6379",type=str)
- argsparser.add_argument("-F","--redis-freq",help="Query Redis every x (in milliseconds). Default:{}".format(REDIS_FREQ),default=REDIS_FREQ,type=int)
- # General args
- argsparser.add_argument("-n","--nlines",help="number of lines on screen",default=60,type=int)
- argsparser.add_argument("-x","--centerX",help="geometrical center X position",default=400,type=int)
- argsparser.add_argument("-y","--centerY",help="geometrical center Y position",default=400,type=int)
- argsparser.add_argument("-W","--max-width",help="geometrical max width",default=800,type=int)
- argsparser.add_argument("-H","--max-height",help="geometrical max height",default=800,type=int)
- argsparser.add_argument("-f","--fps",help="Frame Per Second",default=30,type=int)
-
- args = argsparser.parse_args()
- verbose = args.verbose
- ip = args.ip
- port = args.port
- fps = args.fps
- centerX = args.centerX
- centerY = args.centerY
- redisFreq = args.redis_freq / 1000
- maxWidth = args.max_width
- maxHeight = args.max_height
- nlines = args.nlines
- optimal_looptime = 1 / fps
-
- redisKeys = ["spectrum_120","spectrum_10"]
- debug(name,"Redis Keys:{}".format(redisKeys))
- redisData = {}
- redisLastHit = msNow() - 99999
- r = redis.Redis(
- host=ip,
- port=port)
-
- white = 16777215
- lineList = []
-
- scroll_speed = int(maxHeight / nlines )
- line_length = int(maxWidth / 10)
- line_pattern = []
-
- def rgb2int(rgb):
- #debug(name,"::rgb2int rbg:{}".format(rgb))
- return int('0x%02x%02x%02x' % tuple(rgb),0)
-
- def spectrum_10( ):
- delList = []
- spectrum = ast.literal_eval(redisData["spectrum_10"])
- debug( name, "spectrum:{}".format(spectrum))
- # scroll lines
- for i,line in enumerate(lineList):
- skip_line = False
- new_y = int(line[0][1] + scroll_speed)
- if( new_y >= maxHeight ):
- debug(name,"{} > {}".format(new_y,maxHeight))
- debug(name,"delete:{}".format(i))
- delList.append(i)
- continue
-
- for j,point in enumerate(line):
- line[j][1] = new_y
- lineList[i] = line
-
- for i in delList:
- del lineList[i]
-
- # new line
- currentLine = []
- for i in range(0,10):
- x = int(i * line_length)
- y = 0
- # get frequency level
- level = spectrum[i]
- # get color
- comp = int(255*level)
- color = rgb2int( (comp,comp,comp))
- # new point
- currentLine.append( [x,y,color] )
-
- # add line to list
- lineList.append( currentLine)
-
-
- def refreshRedis():
- global redisLastHit
- global redisData
- # Skip if cache is sufficent
- diff = msNow() - redisLastHit
- if diff < redisFreq :
- #debug(name, "refreshRedis not updating redis, {} < {}".format(diff, redisFreq))
- pass
- else:
- #debug(name, "refreshRedis updating redis, {} > {}".format(diff, redisFreq))
- redisLastHit = msNow()
- for key in redisKeys:
- redisData[key] = r.get(key).decode('ascii')
- #debug(name,"refreshRedis key:{} value:{}".format(key,redisData[key]))
- # Only update the TTLs
- if 'bpm' in redisKeys:
- redisData['bpm_pttl'] = r.pttl('bpm')
- #debug(name,"refreshRedis key:bpm_ttl value:{}".format(redisData["bpm_pttl"]))
- #debug(name,"redisData:{}".format(redisData))
- return True
-
- def linelistToPoints( lineList ):
- pl = []
- for i,line in enumerate(lineList):
- # add a blank point
- pl.append([ line[0][0], line[0][1], 0 ])
- # append all the points of the line
- pl += line
- #debug(name,"pl:{}".format(pl))
- debug(name,"pl length:{}".format(len(pl)))
- return pl
-
- try:
- while True:
- refreshRedis()
- start = time.time()
- # Do the thing
- pointsList = spectrum_10()
- print( linelistToPoints(lineList), flush=True )
- looptime = time.time() - start
- # debug(name+" looptime:"+str(looptime))
- if( looptime < optimal_looptime ):
- time.sleep( optimal_looptime - looptime)
- # debug(name+" micro sleep:"+str( optimal_looptime - looptime))
- except EOFError:
- debug(name+" break")# no more information
|