Initial commit
This commit is contained in:
commit
bd84098ff4
61
apps/idle.py
Executable file
61
apps/idle.py
Executable file
@ -0,0 +1,61 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import numpy as np
|
||||||
|
Nx = int(sys.argv[1])
|
||||||
|
Ny = int(sys.argv[2])
|
||||||
|
param = sys.argv[3]
|
||||||
|
|
||||||
|
buffer = bytearray(b" "*(3*Nx*Ny))
|
||||||
|
|
||||||
|
|
||||||
|
Lx = 32 #128 #Physikalische Laenge des Gebietes in x-Richtung
|
||||||
|
Ly =32 #128#Physikalische Laenge des Gebietes in y-Richtung
|
||||||
|
|
||||||
|
x, y = np.meshgrid(np.arange(Nx)* Lx/Nx, np.arange(Ny)* Ly/Ny) #x-Array
|
||||||
|
kx, ky = np.meshgrid(np.fft.fftfreq(Nx,Lx/(Nx*2.0*np.pi)), np.fft.fftfreq(Ny,Ly/(Ny*2.0*np.pi)))
|
||||||
|
ksq = kx*kx + ky*ky
|
||||||
|
|
||||||
|
c = 0.0+(np.random.random((Ny,Nx))-0.5)*0.1
|
||||||
|
#eps=0.3
|
||||||
|
#delta=0.0
|
||||||
|
eps = 0.1
|
||||||
|
delta = 1.0
|
||||||
|
|
||||||
|
t = 0.0
|
||||||
|
dt = 0.01
|
||||||
|
T_End = 300000
|
||||||
|
N_t = int(T_End / dt)
|
||||||
|
|
||||||
|
plotEveryNth = 100
|
||||||
|
ck = np.fft.fft2(c) #FFT(c)
|
||||||
|
# Lineare Terme
|
||||||
|
def rhs_lin(ksq):
|
||||||
|
result=eps-(1.0-ksq)**2
|
||||||
|
return result
|
||||||
|
|
||||||
|
Eu=1.0/(1.0-dt*rhs_lin(ksq))
|
||||||
|
i = 0
|
||||||
|
def lerp_sat(a, t, b):
|
||||||
|
v = (1-t)*a+t*b
|
||||||
|
v = int(v)
|
||||||
|
if v < 0:
|
||||||
|
v = 0
|
||||||
|
if v > 255:
|
||||||
|
v = 255
|
||||||
|
return v
|
||||||
|
|
||||||
|
while True:
|
||||||
|
i+= 1
|
||||||
|
ck=Eu*(ck+dt*(delta*np.fft.fft2(np.fft.ifft2(ck)**2)-np.fft.fft2(np.fft.ifft2(ck)**3)))
|
||||||
|
c=np.fft.ifft2(ck)
|
||||||
|
if(i % plotEveryNth == 0):
|
||||||
|
myc = c.real
|
||||||
|
myc = (myc-np.min(myc))/(np.max(myc)-np.min(myc))
|
||||||
|
for px in range(Nx):
|
||||||
|
for py in range(Ny):
|
||||||
|
idx = 3*(px+Nx*py)
|
||||||
|
buffer[idx+0] = lerp_sat(0xff, myc[py,px], 0x00)
|
||||||
|
buffer[idx+1] = lerp_sat(0x00, myc[py,px], 0xff)
|
||||||
|
buffer[idx+2] = 0
|
||||||
|
os.write(1, buffer)
|
2
apps/play_youtube.sh
Executable file
2
apps/play_youtube.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
youtube-dl --no-progress --output - https://www.youtube.com/watch?v=${3} -f best | ffmpeg -re -i - -pix_fmt rgb24 -vf "transpose=1,scale=${1}x${2}" -sws_flags bicubic -sws_dither bayer -vcodec rawvideo -f image2pipe -
|
12
config.py
Normal file
12
config.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
#width
|
||||||
|
ScreenX = 24
|
||||||
|
#height
|
||||||
|
ScreenY = 40
|
||||||
|
|
||||||
|
# first app is always running in IDLE
|
||||||
|
Apps = [
|
||||||
|
{"name": "pixelflut", "cmd": "apps/idle.py", "permanent": True},
|
||||||
|
{"name": "framebuffer", "cmd": "apps/framebuffercp"},
|
||||||
|
{"name": "play_youtube", "cmd": "apps/play_youtube.sh"}
|
||||||
|
]
|
81
main.py
Normal file
81
main.py
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
import config
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
import serial
|
||||||
|
import threading
|
||||||
|
import json
|
||||||
|
from bottle import route, run
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class AppRunner(threading.Thread):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.currentApp = -1
|
||||||
|
self.requestedApp = 0
|
||||||
|
self.app = None
|
||||||
|
self.lock = threading.Lock()
|
||||||
|
self.param = ""
|
||||||
|
|
||||||
|
def requestApp(self, app, param=""):
|
||||||
|
with self.lock:
|
||||||
|
self.requestedApp = app
|
||||||
|
self.param = param
|
||||||
|
|
||||||
|
def updateApp(self):
|
||||||
|
if self.app != None:
|
||||||
|
self.app.terminate()
|
||||||
|
args = [os.getcwd()+"/"+config.Apps[self.requestedApp]["cmd"], str(config.ScreenX), str(config.ScreenY), self.param]
|
||||||
|
self.app = subprocess.Popen(args, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
ser = serial.Serial("/dev/ttyACM0")
|
||||||
|
while True:
|
||||||
|
with self.lock:
|
||||||
|
if self.app == None or self.app.poll() != None:
|
||||||
|
self.requestedApp = 0
|
||||||
|
if self.currentApp != self.requestedApp:
|
||||||
|
self.currentApp = self.requestedApp
|
||||||
|
self.updateApp()
|
||||||
|
d = self.app.stdout
|
||||||
|
oshandle = d.fileno()
|
||||||
|
data = os.read(oshandle, config.ScreenX*config.ScreenY*3)
|
||||||
|
# data = d.raw.read(config.ScreenX*config.ScreenY*3)
|
||||||
|
ser.write(b"\01")
|
||||||
|
ser.write(data)
|
||||||
|
|
||||||
|
|
||||||
|
runner = AppRunner()
|
||||||
|
runner.start()
|
||||||
|
|
||||||
|
@route("/apps/list")
|
||||||
|
def apps_list():
|
||||||
|
s = []
|
||||||
|
for app in config.Apps:
|
||||||
|
s.append(app["name"])
|
||||||
|
return json.dumps(s)
|
||||||
|
|
||||||
|
@route("/apps/start/<name>")
|
||||||
|
def apps_start(name):
|
||||||
|
for i in range(len(config.Apps)):
|
||||||
|
if config.Apps[i]["name"] == name:
|
||||||
|
runner.requestApp(i)
|
||||||
|
return "ok"
|
||||||
|
return "not_found"
|
||||||
|
|
||||||
|
@route("/apps/start/<name>/<param>")
|
||||||
|
def apps_start(name, param):
|
||||||
|
for i in range(len(config.Apps)):
|
||||||
|
|
||||||
|
if config.Apps[i]["name"] == name:
|
||||||
|
runner.requestApp(i, param)
|
||||||
|
return "ok"
|
||||||
|
return "not_found"
|
||||||
|
|
||||||
|
|
||||||
|
@route("/apps/running")
|
||||||
|
def apps_running():
|
||||||
|
i = runner.currentApp
|
||||||
|
return config.Apps[i]["name"]
|
||||||
|
|
||||||
|
run(host="localhost", port=8000)
|
Loading…
Reference in New Issue
Block a user