|
@@ -39,6 +39,9 @@ parser.add_option("", "--win-pos", dest="win_pos",default="200,164",
|
|
parser.add_option("", "--pixel-mapping", dest="pixel_mapping",default=0,
|
|
parser.add_option("", "--pixel-mapping", dest="pixel_mapping",default=0,
|
|
help="pixel_mapping file/on --pixel-mapping=_x")
|
|
help="pixel_mapping file/on --pixel-mapping=_x")
|
|
|
|
|
|
|
|
+parser.add_option("", "--dual-vpu", dest="dual_vpu",default=0,
|
|
|
|
+ help=" --dual-vpu=1/0")
|
|
|
|
+
|
|
parser.add_option("", "--countdown", dest="countdown",
|
|
parser.add_option("", "--countdown", dest="countdown",
|
|
help="enable countdown")
|
|
help="enable countdown")
|
|
|
|
|
|
@@ -870,11 +873,6 @@ def loop2_videoplayer():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
-CFG_IN = {"name":"CFG_IN","x1":40,"y1":60,"x2":300,"y2":300 ,"w":300,"h":300}
|
|
|
|
-CFG_OUT = {"name":"CFG_OUT","x1":40,"y1":60,"x2":300,"y2":300 ,"w":300,"h":300,"on":0}
|
|
|
|
-CFG_BLOCK = {"name":"CFG_BLOCK","size":16,"h-split":2,"v-split":2,"h-count":8,"v-count":8}
|
|
|
|
-
|
|
|
|
|
|
|
|
p = 16
|
|
p = 16
|
|
block = [p,p]
|
|
block = [p,p]
|
|
@@ -895,6 +893,12 @@ if options.mode:
|
|
except Exception as e:
|
|
except Exception as e:
|
|
print( "Exc",options.mode,e)
|
|
print( "Exc",options.mode,e)
|
|
|
|
|
|
|
|
+
|
|
|
|
+CFG_IN = {"name":"CFG_IN","x1":40,"y1":60,"x2":300,"y2":300 ,"w":300,"h":300}
|
|
|
|
+CFG_OUT = {"name":"CFG_OUT","x1":40,"y1":60,"x2":300,"y2":300 ,"w":300,"h":300,"on":0}
|
|
|
|
+CFG_OUT2 = {"name":"CFG_OUT2","x1":p*8+142,"y1":60,"x2":300,"y2":300 ,"w":300,"h":300,"on":0}
|
|
|
|
+CFG_BLOCK = {"name":"CFG_BLOCK","size":16,"h-split":2,"v-split":2,"h-count":8,"v-count":8}
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
if _x < 1:
|
|
if _x < 1:
|
|
@@ -963,6 +967,7 @@ for i in f:
|
|
font = pygame.font.SysFont("freemonobold",22)
|
|
font = pygame.font.SysFont("freemonobold",22)
|
|
font10 = pygame.font.SysFont("freemonobold",10)
|
|
font10 = pygame.font.SysFont("freemonobold",10)
|
|
font12 = pygame.font.SysFont("freemonobold",12)
|
|
font12 = pygame.font.SysFont("freemonobold",12)
|
|
|
|
+font12l = pygame.font.SysFont("freemono",12)
|
|
font15 = pygame.font.SysFont("freemonobold",15)
|
|
font15 = pygame.font.SysFont("freemonobold",15)
|
|
font40 = pygame.font.SysFont("freemonobold",40)
|
|
font40 = pygame.font.SysFont("freemonobold",40)
|
|
font80 = pygame.font.SysFont("freemonobold",70)
|
|
font80 = pygame.font.SysFont("freemonobold",70)
|
|
@@ -987,12 +992,17 @@ if options.pixel_mapping:
|
|
path = path.replace("\"","-")
|
|
path = path.replace("\"","-")
|
|
path = path.replace("'","-")
|
|
path = path.replace("'","-")
|
|
grid_file = HOME+"/LibreLight/vpu_grid_hd{}.csv".format(path)
|
|
grid_file = HOME+"/LibreLight/vpu_grid_hd{}.csv".format(path)
|
|
|
|
+ if options.dual_vpu:
|
|
|
|
+ grid_file = HOME+"/LibreLight/vpu_grid_dual{}.csv".format(path)
|
|
text_file = HOME+"/LibreLight/vpu_text_hd{}.csv".format(path)
|
|
text_file = HOME+"/LibreLight/vpu_text_hd{}.csv".format(path)
|
|
play_list = HOME+"/LibreLight/vpu_playlist_hd{}.csv".format(path)
|
|
play_list = HOME+"/LibreLight/vpu_playlist_hd{}.csv".format(path)
|
|
play_list = HOME+"/LibreLight/video/"
|
|
play_list = HOME+"/LibreLight/video/"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+if options.dual_vpu:
|
|
|
|
+ CFG_OUT2["on"] = 1
|
|
|
|
+
|
|
print(" ",[options.pixel_mapping],"grid_file",grid_file)
|
|
print(" ",[options.pixel_mapping],"grid_file",grid_file)
|
|
|
|
|
|
|
|
|
|
@@ -1015,6 +1025,9 @@ try:
|
|
if PIXEL_MAPPING >= 1:
|
|
if PIXEL_MAPPING >= 1:
|
|
pm_wy = 11*p
|
|
pm_wy = 11*p
|
|
CFG_IN["y1"] += 11*p
|
|
CFG_IN["y1"] += 11*p
|
|
|
|
+ if options.dual_vpu:
|
|
|
|
+ if wx < p*16+155:
|
|
|
|
+ wx = p*16+155
|
|
MAIN_SIZE=(wx,wy+pm_wy)
|
|
MAIN_SIZE=(wx,wy+pm_wy)
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
@@ -1026,6 +1039,8 @@ CFG_IN["h"] = CFG_BLOCK["size"] * CFG_BLOCK["v-count"]
|
|
CFG_OUT["w"] = CFG_BLOCK["size"] * 8
|
|
CFG_OUT["w"] = CFG_BLOCK["size"] * 8
|
|
CFG_OUT["h"] = CFG_BLOCK["size"] * 8
|
|
CFG_OUT["h"] = CFG_BLOCK["size"] * 8
|
|
|
|
|
|
|
|
+CFG_OUT2["w"] = CFG_BLOCK["size"] * 8
|
|
|
|
+CFG_OUT2["h"] = CFG_BLOCK["size"] * 8
|
|
|
|
|
|
|
|
|
|
def CFG_CALC_P(CFG):
|
|
def CFG_CALC_P(CFG):
|
|
@@ -1040,6 +1055,7 @@ def CFG_CALC_P(CFG):
|
|
|
|
|
|
CFG_CALC_P(CFG_IN)
|
|
CFG_CALC_P(CFG_IN)
|
|
CFG_CALC_P(CFG_OUT)
|
|
CFG_CALC_P(CFG_OUT)
|
|
|
|
+CFG_CALC_P(CFG_OUT2)
|
|
|
|
|
|
print("CFG_BLOCK",CFG_BLOCK)
|
|
print("CFG_BLOCK",CFG_BLOCK)
|
|
print()
|
|
print()
|
|
@@ -1483,7 +1499,8 @@ def generate_grid(mapping=0):
|
|
y=0
|
|
y=0
|
|
x=0
|
|
x=0
|
|
|
|
|
|
- for i in range((8)*(8)):
|
|
+
|
|
|
|
+ for i in range((_y)*(_x)):
|
|
|
|
|
|
if x > 8 and i%8 == 0:
|
|
if x > 8 and i%8 == 0:
|
|
|
|
|
|
@@ -1512,7 +1529,7 @@ def generate_grid(mapping=0):
|
|
|
|
|
|
return _log[:]
|
|
return _log[:]
|
|
|
|
|
|
-def init_grid(mapping=0,_x=4,_y=4):
|
|
+def init_grid(mapping=0,_x=4,_y=4,_xp=0,_yp=0,start=0,name="init_gird"):
|
|
|
|
|
|
if mapping and PIXEL_MAPPING:
|
|
if mapping and PIXEL_MAPPING:
|
|
try:
|
|
try:
|
|
@@ -1529,9 +1546,9 @@ def init_grid(mapping=0,_x=4,_y=4):
|
|
|
|
|
|
y=0
|
|
y=0
|
|
x=0
|
|
x=0
|
|
- print("CSV header",[lines[0]],[PIXEL_MAPPING])
|
|
+ print("CSV header",[lines[0]],[PIXEL_MAPPING,"len:",len(lines),"start:",start,name])
|
|
|
|
|
|
- for i,line in enumerate(lines[1:]):
|
|
+ for i,line in enumerate(lines[1+start:]):
|
|
|
|
|
|
line = line.strip()
|
|
line = line.strip()
|
|
line = line.split(",")
|
|
line = line.split(",")
|
|
@@ -1541,7 +1558,9 @@ def init_grid(mapping=0,_x=4,_y=4):
|
|
y+=1
|
|
y+=1
|
|
if y >= _y:
|
|
if y >= _y:
|
|
break
|
|
break
|
|
-
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
_id = int(line[1])
|
|
_id = int(line[1])
|
|
@@ -1551,7 +1570,7 @@ def init_grid(mapping=0,_x=4,_y=4):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- pos = [x,y]
|
|
+ pos = [x+_xp,y+_yp]
|
|
f = Fix(_id,pos,block)
|
|
f = Fix(_id,pos,block)
|
|
|
|
|
|
|
|
|
|
@@ -1581,8 +1600,13 @@ def find_pix(x,y):
|
|
return fix
|
|
return fix
|
|
|
|
|
|
GRID = []
|
|
GRID = []
|
|
-_GRID = []
|
|
+
|
|
-_GRID = init_grid(_x=8,_y=8,mapping=1)
|
|
+GRID_A = []
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+GRID_B = []
|
|
|
|
+
|
|
|
|
+
|
|
NR = 0
|
|
NR = 0
|
|
START_UNIV=2
|
|
START_UNIV=2
|
|
if options.start_univ:
|
|
if options.start_univ:
|
|
@@ -1659,13 +1683,11 @@ def grab(x=55,y=55,w=60,h=60):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-def reshape(_x,_y):
|
|
+def reshape(GRID,GRID_OUT,_x,_y,name="GRID_Z"):
|
|
"""reshape LED-WALL Block/Pixel mapping"""
|
|
"""reshape LED-WALL Block/Pixel mapping"""
|
|
if PIXEL_MAPPING <= 0:
|
|
if PIXEL_MAPPING <= 0:
|
|
return None
|
|
return None
|
|
|
|
|
|
- global GRID
|
|
|
|
- global _GRID
|
|
|
|
|
|
|
|
x = _x
|
|
x = _x
|
|
y = _y
|
|
y = _y
|
|
@@ -1678,47 +1700,63 @@ def reshape(_x,_y):
|
|
y_max = 0
|
|
y_max = 0
|
|
|
|
|
|
|
|
|
|
- pygame.draw.rect(window,[0,0,20],[0,60,600,pm_wy-1])
|
|
+
|
|
- pygame.draw.rect(window,[0,0,20],[wx,wy-80,400,pm_wy+10])
|
|
+
|
|
|
|
|
|
tmp_font = pygame.font.SysFont("freemonobold",int(p*0.8))
|
|
tmp_font = pygame.font.SysFont("freemonobold",int(p*0.8))
|
|
|
|
|
|
- fr = tmp_font.render("OUTPUT" ,1, (255,255,255))
|
|
+ fr = tmp_font.render("OUTPUT: "+str(name) ,1, (255,255,255))
|
|
- fr_r = fr.get_rect(center=(x+int(wx/2),int(60+pm_wy-p*1.5)))
|
|
+ fr_r = fr.get_rect(center=(int(wx/2),int(0+pm_wy-p*1.5)))
|
|
- window.blit(fr,fr_r)
|
|
+
|
|
|
|
+ pos= [0,0]
|
|
|
|
+ pos[0] = _x+p*3
|
|
|
|
+ pos[1] = p*8+65
|
|
|
|
+ window.blit(fr,pos)
|
|
|
|
|
|
- fr = tmp_font.render("↑ ↑ MAP ↑ ↑" ,1, (255,255,255))
|
|
+
|
|
- fr_r = fr.get_rect(center=(x+int(wx/2),int(60+pm_wy-p)))
|
|
+
|
|
- window.blit(fr,fr_r)
|
|
+
|
|
|
|
|
|
fr = tmp_font.render("INPUT" ,1, (255,255,255))
|
|
fr = tmp_font.render("INPUT" ,1, (255,255,255))
|
|
- fr_r = fr.get_rect(center=(x+int(wx/2),int(60+pm_wy-p/2)))
|
|
+ fr_r = fr.get_rect(center=(int(wx/2),int(60+pm_wy-p/2)))
|
|
window.blit(fr,fr_r)
|
|
window.blit(fr,fr_r)
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
j = 0
|
|
j = 0
|
|
- for fix in _GRID:
|
|
+ for fix in GRID_OUT:
|
|
- if j >= 8*8:
|
|
+ if j >= 64:
|
|
break
|
|
break
|
|
j+=1
|
|
j+=1
|
|
ii = i
|
|
ii = i
|
|
|
|
|
|
pos = fix.POS(40,60)
|
|
pos = fix.POS(40,60)
|
|
rgb = fix.rgb
|
|
rgb = fix.rgb
|
|
-
|
|
+ pos[0]+=_x
|
|
|
|
+ pos[1]+=_y
|
|
|
|
|
|
pygame.draw.rect(window,[0,40,0],pos)
|
|
pygame.draw.rect(window,[0,40,0],pos)
|
|
|
|
|
|
xposs = []
|
|
xposs = []
|
|
for fix2 in GRID:
|
|
for fix2 in GRID:
|
|
if fix._id == fix2._id:
|
|
if fix._id == fix2._id:
|
|
- xposs.append( fix2.POS(40,60) )
|
|
+ _xposs = fix2.POS(40,60)
|
|
-
|
|
+
|
|
|
|
+
|
|
|
|
+ xposs.append( _xposs)
|
|
|
|
+
|
|
for xpos in xposs:
|
|
for xpos in xposs:
|
|
sub = grab(xpos[0],xpos[1]+pm_wy,xpos[2],xpos[3])
|
|
sub = grab(xpos[0],xpos[1]+pm_wy,xpos[2],xpos[3])
|
|
if sub:
|
|
if sub:
|
|
if 1:
|
|
if 1:
|
|
- window.blit(sub, (x+pos[0]+z,y+pos[1]+z))
|
|
+ window.blit(sub, (pos[0]+z,pos[1]+z))
|
|
else:
|
|
else:
|
|
|
|
|
|
pygame.draw.rect(window,[40,0,0],pos)
|
|
pygame.draw.rect(window,[40,0,0],pos)
|
|
@@ -1737,22 +1775,30 @@ def reshape(_x,_y):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- apos = fix.POS(40,60+pm_wy)
|
|
+ apos = fix.POS(40,60)
|
|
|
|
+ apos[0]+=_x
|
|
|
|
+ apos[1]+=_y
|
|
argb = fix.rgb
|
|
argb = fix.rgb
|
|
|
|
|
|
|
|
|
|
if NR:
|
|
if NR:
|
|
-
|
|
+ pygame.draw.rect(window,[30,40,0],[apos[0],apos[1],12,9])
|
|
|
|
+
|
|
pygame.draw.rect(window,[20,40,0],[x+apos[0]+2+z,y+apos[1]+2+z-pm_wy,12,9])
|
|
pygame.draw.rect(window,[20,40,0],[x+apos[0]+2+z,y+apos[1]+2+z-pm_wy,12,9])
|
|
|
|
|
|
- if NR:
|
|
+ fix_id = fix._id
|
|
- if fix._id != i+1:
|
|
+ if fix_id > 8*8:
|
|
- fr = font15.render("{:02}".format(fix._id) ,1, (255,255,0))
|
|
+ fix_id -= 8*8
|
|
- window.blit(fr,(x+apos[0]+2+z,y+apos[1]+2+z-pm_wy))
|
|
+ if NR:
|
|
|
|
+ if fix_id != i+1:
|
|
|
|
+ fr = font12.render("{:02}".format(fix._id) ,1, (255,255,0))
|
|
|
|
+
|
|
|
|
+ window.blit(fr,(apos[0],apos[1]))
|
|
|
|
|
|
else:
|
|
else:
|
|
- fr = font15.render("{:02}".format(fix._id) ,1, (100,100,255))
|
|
+ fr = font12.render("{:02}".format(fix._id) ,1, (100,100,255))
|
|
- window.blit(fr,(x+apos[0]+2+z,y+apos[1]+2+z-pm_wy))
|
|
+
|
|
|
|
+ window.blit(fr,(apos[0],apos[1]))
|
|
i += 1
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
@@ -1784,10 +1830,20 @@ class Timer():
|
|
def reload_grid():
|
|
def reload_grid():
|
|
print("==== reload_grid")
|
|
print("==== reload_grid")
|
|
global GRID
|
|
global GRID
|
|
- global _GRID
|
|
+ global GRID_A
|
|
|
|
+ global GRID_B
|
|
try:
|
|
try:
|
|
- GRID = init_grid(_x=_x,_y=_y)
|
|
+ GRID = init_grid(_x=_x,_y=_y,name="GRID")
|
|
- _GRID = init_grid(_x=8,_y=8,mapping=1)
|
|
+ GRID_A = init_grid(_x=8,_y=16,mapping=1,name="GRID_A")
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
except Exception as e:
|
|
except Exception as e:
|
|
print("Except: grid re init",e)
|
|
print("Except: grid re init",e)
|
|
|
|
|
|
@@ -1814,7 +1870,7 @@ def draw_fix_nr(GRID):
|
|
|
|
|
|
|
|
|
|
if NR:
|
|
if NR:
|
|
- pygame.draw.rect(window,[0,0,0],[pos[0]+2,pos[1]+2,12,9])
|
|
+ pygame.draw.rect(window,[0,0,0],[pos[0]+2,pos[1]+2,17,9])
|
|
if fix._id%_x-1 == 0:
|
|
if fix._id%_x-1 == 0:
|
|
pygame.draw.line(window,[255,255,0],(pos[0],pos[1]+4),(pos[0],pos[1]+pos[3]-4),1)
|
|
pygame.draw.line(window,[255,255,0],(pos[0],pos[1]+4),(pos[0],pos[1]+pos[3]-4),1)
|
|
pygame.draw.line(window,[255,255,0],(pos[0],pos[1]+int(pos[3]/2)),(pos[0]+int(pos[2]/2),int(pos[1]+pos[3]/2)),1)
|
|
pygame.draw.line(window,[255,255,0],(pos[0],pos[1]+int(pos[3]/2)),(pos[0]+int(pos[2]/2),int(pos[1]+pos[3]/2)),1)
|
|
@@ -1825,10 +1881,14 @@ def draw_fix_nr(GRID):
|
|
if grid_counter +5 < time.time():
|
|
if grid_counter +5 < time.time():
|
|
grid_counter = time.time()
|
|
grid_counter = time.time()
|
|
reload_grid()
|
|
reload_grid()
|
|
|
|
+
|
|
|
|
+ if fix._id == 2 or i+1 == 2:
|
|
|
|
+ print("FIX.id,i",fix._id != i+1,end=" ")
|
|
|
|
+ print(fix._id, i+1)
|
|
if fix._id != i+1:
|
|
if fix._id != i+1:
|
|
- fr = font15.render("{:02}".format(fix._id) ,1, (255,255,0))
|
|
+ fr = font12.render("{:02}".format(fix._id) ,1, (255,255,0))
|
|
else:
|
|
else:
|
|
- fr = font15.render("{:02}".format(fix._id) ,1, (100,100,255))
|
|
+ fr = font12.render("{:02}".format(fix._id) ,1, (100,100,255))
|
|
window.blit(fr,(pos[0]+2,pos[1]+2))
|
|
window.blit(fr,(pos[0]+2,pos[1]+2))
|
|
i += 1
|
|
i += 1
|
|
|
|
|
|
@@ -2242,6 +2302,13 @@ def frame_area():
|
|
|
|
|
|
draw_frame(window,rgb,p1,p2,offset=3)
|
|
draw_frame(window,rgb,p1,p2,offset=3)
|
|
|
|
|
|
|
|
+ if CFG_OUT2["on"]:
|
|
|
|
+ rgb = [255,0,0]
|
|
|
|
+ p1 = CFG_OUT2["p1"]
|
|
|
|
+ p2 = CFG_OUT2["p2"]
|
|
|
|
+
|
|
|
|
+ draw_frame(window,rgb,p1,p2,offset=3)
|
|
|
|
+
|
|
ips=[]
|
|
ips=[]
|
|
dataA=[]
|
|
dataA=[]
|
|
data=[]
|
|
data=[]
|
|
@@ -2287,7 +2354,9 @@ count_tilt = 0
|
|
def main():
|
|
def main():
|
|
global IP
|
|
global IP
|
|
global GRID
|
|
global GRID
|
|
- global _GRID
|
|
+
|
|
|
|
+ global GRID_A
|
|
|
|
+ global GRID_B
|
|
global FUNC
|
|
global FUNC
|
|
global count_tilt
|
|
global count_tilt
|
|
global TEXT_BLOCK
|
|
global TEXT_BLOCK
|
|
@@ -2297,17 +2366,18 @@ def main():
|
|
global dataA
|
|
global dataA
|
|
global frame2
|
|
global frame2
|
|
|
|
|
|
- GRID = init_grid(_x=_x,_y=_y)
|
|
+
|
|
|
|
|
|
|
|
+ reload_grid()
|
|
print("GRID LEN:",len(GRID))
|
|
print("GRID LEN:",len(GRID))
|
|
|
|
|
|
|
|
|
|
s=time.time()
|
|
s=time.time()
|
|
- print("run")
|
|
+
|
|
r = ""
|
|
r = ""
|
|
IP = "xx"
|
|
IP = "xx"
|
|
while running:
|
|
while running:
|
|
-
|
|
+
|
|
if TEXT_BLOCK_TIME+5 < time.time():
|
|
if TEXT_BLOCK_TIME+5 < time.time():
|
|
TEXT_BLOCK = open_text_block()
|
|
TEXT_BLOCK = open_text_block()
|
|
TEXT_BLOCK_TIME = time.time()
|
|
TEXT_BLOCK_TIME = time.time()
|
|
@@ -2344,7 +2414,6 @@ def main():
|
|
draw_gobo(GRID,data)
|
|
draw_gobo(GRID,data)
|
|
|
|
|
|
|
|
|
|
- draw_fix_nr(GRID)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -2356,11 +2425,20 @@ def main():
|
|
draw_counter(COUNTER)
|
|
draw_counter(COUNTER)
|
|
|
|
|
|
pointer.draw(0,pm_wy)
|
|
pointer.draw(0,pm_wy)
|
|
|
|
+ draw_fix_nr(GRID)
|
|
|
|
+
|
|
spos = [0,0,0,0]
|
|
spos = [0,0,0,0]
|
|
if PIXEL_MAPPING >= 1:
|
|
if PIXEL_MAPPING >= 1:
|
|
- reshape(0,0)
|
|
+ try:
|
|
|
|
+ GRID_X = GRID_A[8*8:]
|
|
|
|
+ xx = p*8
|
|
|
|
+ reshape(GRID,GRID_X,xx+102,-xx,name="GRID_B")
|
|
|
|
+ except Exception as e:
|
|
|
|
+ print("Exception 23123",e)
|
|
|
|
+
|
|
|
|
+ reshape(GRID,GRID_A,0,0,name="GRID_A")
|
|
else:
|
|
else:
|
|
- reshape(spos[0]+spos[2]+20,10)
|
|
+ reshape(GRID,GRID_A,spos[0]+spos[2]+20,10)
|
|
|
|
|
|
|
|
|
|
|
|
|