diff -urN rt_v25/Makefile rt_v26/Makefile --- rt_v25/Makefile 2018-04-19 14:49:00.000000000 +0900 +++ rt_v26/Makefile 2018-04-20 23:52:43.000000000 +0900 @@ -1,10 +1,10 @@ CC = gcc CFLAGS += -Wall -OBJS = sock.o rt.o cross.o lstx.o ax.o cylx.o fcx.o vecs.o line.o v.o mt.o +OBJS = rt_sock.o rt.o cross.o lstx.o ax.o cylx.o fcx.o vecs.o line.o v.o mt.o -all: sock +all: rt_sock -sock: $(OBJS) +rt_sock: $(OBJS) gcc -o $@ $(OBJS) -lm clean: rm -f *.o *~ diff -urN rt_v25/bin.py rt_v26/bin.py --- rt_v25/bin.py 2018-04-20 01:37:14.000000000 +0900 +++ rt_v26/bin.py 2018-04-20 23:52:43.000000000 +0900 @@ -16,6 +16,25 @@ unpack_i4 = lambda s: ( struct.unpack_from('=i', s)[0], s[4:] ) +def pack_col(col): + if col == []: + col = [-1,-1,-1] + return b''.join( map( pack_i4, col ) ) + +def unpack_col(s): + col = [0,0,0] + for i in range(3): + ( col[i], s ) = unpack_i4(s) + if col == [-1,-1,-1]: + col = [] + return (col, s) + +pack_str = lambda str: pack_i4( len(str) ) + str.encode() + +def unpack_str(s): + (n, s) = unpack_i4(s) + return ( s.decode(), s ) + pack_np64 = lambda np64_arr: np64_arr.tobytes() if six.PY3 else bytes( np.getbuffer(np64_arr) ) unpack_np64 = lambda s, n: ( np.frombuffer( s[:8*n], dtype=np.float64 ), s[8*n:] ) @@ -92,6 +111,17 @@ ( dic[k], s ) = nm_dic_unpack.get(nm)(s) return (dic, s) +def pack_lst(lst, nm_lst): + f = lambda i: nm_dic_pack.get( nm_lst[i] )( lst[i] ) + return b''.join( map( f, range( len(nm_lst) ) ) ) + +def unpack_lst(s, nm_lst): + lst = [] + for nm in nm_lst: + (v, s) = nm_dic_unpack.get(nm)(s) + lst.append(v) + return (lst, s) + rtd_k_nm_lst = [ ('base', 'f8'), ('diff', 'f8'), @@ -135,8 +165,8 @@ return (ltd, s) nms = [ - 'i4', 'np64', 'f8', 'p', 'line', 'vs', 'ax', 'cx', 'fx', 'xx', - 'lx', 'rtd', 'ltd', + 'i4', 'col', 'np64', 'f8', 'p', 'line', 'vs', + 'ax', 'cx', 'fx', 'xx', 'lx', 'rtd', 'ltd', ] nm_dic_pack = dict( map( lambda nm: ( nm, eval('pack_' + nm) ), nms ) ) nm_dic_unpack = dict( map( lambda nm: ( nm, eval('unpack_' + nm) ), nms ) ) diff -urN rt_v25/cg.py rt_v26/cg.py --- rt_v25/cg.py 2018-04-19 14:50:57.000000000 +0900 +++ rt_v26/cg.py 2018-04-21 00:30:33.000000000 +0900 @@ -11,11 +11,12 @@ import fcx import lstx import img +import img_sock import way import wf import rt import dat -import sock +import rt_sock def if_not_set_opt(d, k, v): ut.if_not_set(d, k, v) @@ -25,7 +26,8 @@ if k in d: v = d.get(k) if type(v) != int: - d[k] = img.get_idx(v) + f = img_sock.client.get_idx if 'use_img_srv' in sys.argv else img.get_idx + d[k] = f(v) def m_setup(d, m): # 'fn' in d @@ -33,7 +35,10 @@ if_not_set_idx( m, 'fn' ) if_not_set_idx( m, 'fn_r' ) - if_not_set_opt( m, 'wh2xyz', [ ax.fn_map( m.get('fn') ) ] ) + #if_not_set_opt( m, 'wh2xyz', [ ax.fn_map( m.get('fn') ) ] ) + wh_func = img_sock.client.wh if 'use_img_srv' in sys.argv else img.wh + (w, h) = wh_func( m.get('fn') ) + if_not_set_opt( m, 'wh2xyz', [ ax.wh_map(w, h) ] ) if 'xyz2t' not in m: lst = [] @@ -253,15 +258,19 @@ if __name__ == "__main__": + if 'use_img_srv' in sys.argv: + img_sock.srv_boot() + img_sock.client.conn() + data = sum( map( d_setup, dat.data ), [] ) lights = dat.lights if 'use_srv' in sys.argv: - sock.server_boot( len(data) ) - sock.client.conn() - sock.client.add_data(data) - sock.client.add_lights(lights) + rt_sock.server_boot( len(data) ) + rt_sock.client.conn() + rt_sock.client.add_data(data) + rt_sock.client.add_lights(lights) (w, h) = ( ut.arg_i('w', 640) , ut.arg_i('h', 480) ) div = ut.arg_i('div', 1) @@ -303,5 +312,7 @@ video.clear() video.fin() if 'use_srv' in sys.argv: - sock.client.quit() + rt_sock.client.quit() + if 'use_img_srv' in sys.argv: + img_sock.client.quit() # EOF diff -urN rt_v25/img.py rt_v26/img.py --- rt_v25/img.py 2018-04-18 13:32:19.000000000 +0900 +++ rt_v26/img.py 2018-04-20 23:52:43.000000000 +0900 @@ -47,32 +47,34 @@ def read_video(fn): vc = cv2.VideoCapture(fn) - ks = [ 3, 4, 5 ] - if hasattr(cv2, 'CAP_PROP_FRAME_WIDTH'): - ks = [ - cv2.CAP_PROP_FRAME_WIDTH, - cv2.CAP_PROP_FRAME_HEIGHT, - cv2.CAP_PROP_FPS, - ] - elif hasattr(cv2.cv, 'CV_CAP_PROP_FRAME_WIDTH'): - ks = [ - cv2.cv.CV_CAP_PROP_FRAME_WIDTH, - cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, - cv2.cv.CV_CAP_PROP_FPS, - ] - - (w, h, fps) = map( vc.get, ks ) - (w, h) = map( int, (w, h) ) - - video = [] - while vc.isOpened(): - (ret, img) = vc.read() - if not ret: - break - video.append(img) - n = len(video) + kd = { 'i': 1, 'w': 3, 'h': 4, 'fps': 5, 'n': 7 } + get_prop = lambda k: vc.get( kd.get(k) ) + set_prop = lambda k, v: vc.set( kd.get(k), v ) + fix_type = lambda k, v: int(v) if k != 'fps' else v + + dic = dict( map( lambda k: ( k, fix_type( k, get_prop(k) ) ), kd.keys() ) ) + + fps = dic.get('fps') + n = dic.get('n') + + def img_idx(i): + i %= n # loop + if dic.get('i') != i: + set_prop('i', i) + dic['i'] = i + if 'img' in dic: + dic.pop('img') + if 'img' not in dic: + ( ret, dic['img'] ) = vc.read() + return dic.get('img') + dic['img_idx'] = img_idx - return { 'w': w, 'h': h, 'n': n, 'fps': fps, 'imgs': video } + sec_to_i = lambda sec: int(fps * sec) + dic['img_sec'] = lambda sec: img_idx( sec_to_i(sec) ) + + dic['imgs'] = lambda : map( img_idx, range(n) ) # func + + return dic def new_videos(): d = {} @@ -89,9 +91,10 @@ e.wh = lambda fn: ( e.w(fn), e.h(fn) ) e.n = lambda fn: get(fn).get('n') e.fps = lambda fn: get(fn).get('fps') - e.imgs = lambda fn: get(fn).get('imgs') - img_sec = lambda fn, sec: e.imgs(fn)[ int( e.fps(fn) * sec ) % e.n(fn) ] + e.img_sec = img_sec = lambda fn, sec: get(fn).get('img_sec')(sec) + e.imgs = lambda fn: get(fn).get('imgs')() + e.in_img = lambda fn, x, y: ( lambda w, h: 0 <= x and x < w and 0 <= y and y < h )( *e.wh(fn) ) def col(fn, sec, x, y, def_col=[128,128,128], rep=None): diff -urN rt_v25/img_sock.py rt_v26/img_sock.py --- rt_v25/img_sock.py 1970-01-01 09:00:00.000000000 +0900 +++ rt_v26/img_sock.py 2018-04-20 23:52:43.000000000 +0900 @@ -0,0 +1,163 @@ +#!/usr/bin/env python + +import sys +import socket +import six +import ut +import img +import bin + +HOST = 'localhost' +PORT = ut.arg_i('port', 23456) + 1 +FIFO = 'fifo_img' + +cmds = [ 'get_idx', 'wh', 'col', 'quit' ] +cmdi = lambda s: bin.pack_i4( cmds.index(s) ) +cmdi_ck = lambda i: 0 <= i and i < len(cmds) + +k_nm_lst = [ + ('fn', 'i4'), # idx + ('dmy', 'i4'), + ('sec', 'f8'), + ('x', 'i4'), + ('y', 'i4'), + ('def_col', 'col'), + ('dmy2', 'i4'), + ('rep_x', 'i4'), + ('rep_y', 'i4'), +] + +nm_lst = ut.map_up_lst( lambda k, nm: nm, k_nm_lst ) + +def new_client(): + e = ut.Empty() + e.proc = None + e.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + e.conn = lambda : e.sock.connect((HOST, PORT)) + + recv = lambda n: e.sock.recv(n) if n > 0 else '' + + def send_recv(s, rn): + e.sock.sendall(s) + return recv(rn) + + def quit(): + send_recv( cmdi('quit'), 1 ) + ut.kill_proc(e.proc) + ut.cmd_exec('rm ' + FIFO) + e.quit = quit + + def get_idx(fn): # fn: str + s = bin.pack_str(fn) + s = cmdi('get_idx') + bin.pack_i4( len(s) ) + s + + s = send_recv(s, 4) + + (idx, s) = bin.unpack_i4(s) + return idx + + e.get_idx = get_idx + + def wh(fn): # fn: idx + s = cmdi('wh') + bin.pack_i4(fn) + + s = send_recv(s, 4*2) + + (w, s) = bin.unpack_i4(s) + (h, s) = bin.unpack_i4(s) + return (w, h) + e.wh = wh + + def col(fn, sec, x, y, def_col=[128,128,128], rep=None): + (rep_x, rep_y) = rep if rep else (False, False) + lst = [ fn, 0, sec, x, y, def_col, 0, int(rep_x), int(rep_y) ] + s = bin.pack_lst(lst, nm_lst) + s = cmdi('col') + bin.pack_i4( len(s) ) + s + + s = send_recv(s, 4*3) + + (col_, s) = bin.unpack_col(s) + return col_ + e.col = col + + return e + +client = new_client() + +### + +def srv_boot(): + cmd1 = 'nc -l {}'.format(PORT) + cmd2 = './img_sock.py' + cmd = 'rm -f @ ; mkfifo @ ; cat @ | {} | {} > @'.replace('@', FIFO) + cmd = cmd.format(cmd1, cmd2) + client.proc = ut.cmd_proc(cmd) + ut.sleep(3.0) # + +recv = lambda n: sys.stdin.buffer.read(n) if six.PY3 else sys.stdin.read(n) + +def send(s): + if six.PY3: + sys.stdout.buffer.write(s) + else: + sys.stdout.write(s) + sys.stdout.flush() + +err_msg = lambda s: sys.stderr.write(s + '\n') + +def get_idx(): + n = bin.unpack_i4( recv(4) )[0] + s = recv(n) + (fn, s) = bin.unpack_str(s) + + idx = img.get_idx(fn) + + send( bin.pack_i4(idx) ) + +def wh(): + fn = bin.unpack_i4( recv(4) )[0] + + (w, h) = img.wh(fn) + + s = bin.pack_i4(w) + bin.pack_i4(h) + send(s) + +def col(): + n = bin.unpack_i4( recv(4) )[0] + s = recv(n) + + (d, s) = bin.unpack_dic(s, k_nm_lst) + + rep = tuple( map( lambda k: bool( d.get(k) ), ['rep_x', 'rep_y' ] ) ) + if rep == (False, False): + rep = None + + lst = [ d.get('fn'), d.get('sec'), d.get('x'), d.get('y'), d.get('def_col'), rep ] + + col = img.col(*lst) + + send( bin.pack_col(col) ) + +def quit(): + send(b'r') + sys.exit(0) + +if __name__ == "__main__": + + dic = { + 'get_idx': get_idx, + 'wh': wh, + 'col': col, + 'quit': quit, + } + while True: + cmd_idx = bin.unpack_i4( recv(4) )[0] + if cmdi_ck(cmd_idx): + cmd = cmds[ cmd_idx ] + f = dic.get(cmd) + f() + else: + msg = '?' + ( ' cmd_idx={:02x}' if cmd_idx else '' ) + err_msg(msg) + sys.exit(1) +# EOF diff -urN rt_v25/rt.py rt_v26/rt.py --- rt_v25/rt.py 2018-04-20 01:44:58.000000000 +0900 +++ rt_v26/rt.py 2018-04-20 23:52:43.000000000 +0900 @@ -10,9 +10,12 @@ import lstx import cross import img -import sock +import img_sock +import rt_sock -def map_col(crs, rev, video): +use_img_srv = 'use_img_srv' in sys.argv + +def map_col(crs, rev, sec): d = crs.get('d') def_col = d.get( 'def_col', v.all(128) ) @@ -32,8 +35,9 @@ fn = m.get(k) #(x, y, _) = lstx.tr( m.get('wh2xyz'), 'g2l', nv_line.p ) (x, y, _) = lstx.tr_p( m.get('wh2xyz'), 'g2l', nv_line.p ) - sec = video.cur_sec() + ut.arg_f('init_sec', 0.0) - return img.col( fn, sec, int(x), int(y), [], m.get('rep') ) + + col_func = img_sock.client.col if use_img_srv else img.col + return col_func( fn, sec, int(x), int(y), [], m.get('rep') ) cols = map( f, d.get('maps') ) cols = ut.filter_lst( lambda col: col != [], cols ) @@ -45,14 +49,14 @@ use_srv = 'use_srv' in sys.argv -def get_col(data, lights, l_g, video, nest_rate=1.0, prev_d=None): +def get_col(data, lights, l_g, sec, nest_rate=1.0, prev_d=None): if nest_rate < 0.01: return [] crs = {} if use_srv: prev_idx = data.index(prev_d) if prev_d else -1 - crs = sock.client.cross(l_g, prev_idx) + crs = rt_sock.client.cross(l_g, prev_idx) idx = crs.get('idx') if idx < 0: return [] @@ -80,7 +84,7 @@ ang_nv_eyev_nega = -ang_nv_eyev rev = ang_nv_eyev_nega < 0 - col = map_col( crs, rev, video ) + col = map_col( crs, rev, sec ) col = mt.arr(col) diff = crs.get('diff') if use_srv else calc_diff(d, lights, crs) @@ -94,7 +98,7 @@ return [] ref_v = nv * ( 2 * ang_nv_eyev_nega ) + eyev ref_l = line.new( crsp, ref_v ) - col = get_col( data, lights, ref_l, video, nest_rate * reflect, d ) + col = get_col( data, lights, ref_l, sec, nest_rate * reflect, d ) return col * reflect if col != [] else [] col_ = reflect_col() @@ -122,7 +126,7 @@ return [] ref_v = reflact_v() ref_l = line.new( crsp, ref_v ) - col = get_col( data, lights, ref_l, video, nest_rate * reflact, d ) + col = get_col( data, lights, ref_l, sec, nest_rate * reflact, d ) return col * reflact if col != [] else [] col_ = reflact_col() @@ -135,19 +139,18 @@ (w, h, d_) = sc_sz wh2g = lstx.opt( wh2eye + [ eye2g ] ) cnt = ut.new_cnt_wh(w, h, 'wh') + sec = video.cur_sec() + ut.arg_f('init_sec', 0.0) show = '-quiet' not in sys.argv while cnt.up(show): (ix, iy) = cnt.cur() #p = lstx.tr( wh2g, 'l2g', mt.arr( [ix,iy,-d_] ) ) p = lstx.tr_p( wh2g, 'l2g', mt.arr( [ix,iy,-d_] ) ) l_g = line.new_p2(eye2g.p, p) - col = get_col(data, lights, l_g, video) + col = get_col(data, lights, l_g, sec) if col != []: col = np.fmin( col, 255 ) video.set(ix, iy, col) -# for sock.py server - def calc_diff(d, lights, crs): rtd = d.get('rtd', {}) diff = rtd.get('diff', 0.9) diff -urN rt_v25/rt_sock.c rt_v26/rt_sock.c --- rt_v25/rt_sock.c 1970-01-01 09:00:00.000000000 +0900 +++ rt_v26/rt_sock.c 2018-04-20 23:52:43.000000000 +0900 @@ -0,0 +1,267 @@ +#include +#include +#include +#include "cross.h" +#include "lstx.h" +#include "rt.h" + +/* FILE *dbg; */ + +#define CMD_CLEAR 0 +#define CMD_ADD 1 +#define CMD_ADD_LIGHTS 2 +#define CMD_CROSS 3 +#define CMD_QUIT 4 + +struct data *data = NULL; +int data_n = 0; + +struct lights lights = { 0, NULL }; + +void +alloc(int n) +{ + int i, sz = sizeof(*data) * n; + + if(data){ + free(data); + data = NULL; + } + data = malloc(sz); + data_n = n; + for(i=0; iv3); + memcpy(vs->v3, bp, n); bp += n; + vecs_init(vs); /* ! */ + return bp; +} + +char * +unpack_xx(char *bp, struct x_x *xx) +{ + int n; + + n = 4; + memcpy(&xx->typ, bp, n); bp += n; + + switch(xx->typ){ + case TYP_AX: + n = sizeof(xx->ax.p); + memcpy(&xx->ax.p, bp, n); bp += n; + bp = unpack_vs(bp, &xx->ax.vs); + break; + case TYP_CX: + n = sizeof(xx->cx); + memcpy(&xx->cx, bp, n); bp += n; + break; + case TYP_FX: + n = sizeof(xx->fx); + memcpy(&xx->fx, bp, n); bp += n; + break; + default: + break; + } + return bp; +} + +char * +unpack_lx(char *bp, struct lstx *lx) +{ + int n, i; + + n = 4; + memcpy(&lx->n, bp, n); bp += n; + + lx->lst = malloc( sizeof(*lx->lst) * lx->n ); + + for(i=0; in; i++){ + bp = unpack_xx(bp, &lx->lst[i]); + } + return bp; +} + +void +add(void) +{ + int n, i, ki; + char *buf, *bp; + + fread(&n, sizeof(int), 1, stdin); + bp = buf = malloc(n); + + fread(buf, 1, n, stdin); + + n = 4; + memcpy(&i, bp, n); bp += n; + memcpy(&ki, bp, n); bp += n; + + data[i].ki = ki; + bp = unpack_lx(bp, &data[i].l2g); + + n = sizeof( data[i].rtd ); + memcpy(&data[i].rtd, bp, n); bp += n; + + if(buf){ + free(buf); + } + /* + fprintf(dbg, "a %d %d/%f %f %f/%f %f %f,%f %f %f,%f %f %f\n", + i, data[i].ki, + data[i].l2g.p[0], + data[i].l2g.p[1], + data[i].l2g.p[2], + data[i].l2g.vs.v3[0], + data[i].l2g.vs.v3[1], + data[i].l2g.vs.v3[2], + data[i].l2g.vs.v3[3], + data[i].l2g.vs.v3[4], + data[i].l2g.vs.v3[5], + data[i].l2g.vs.v3[6], + data[i].l2g.vs.v3[7], + data[i].l2g.vs.v3[8]); + */ +} + +void +add_lights(void) +{ + int n; + char *buf, *bp; + + fread(&n, sizeof(n), 1, stdin); + bp = buf = malloc(n); + + fread(buf, 1, n, stdin); + + n = 4; + memcpy(&lights.n, bp, n); bp += n; + + n = sizeof(*lights.lst) * lights.n; + lights.lst = malloc(n); + + memcpy(lights.lst, bp, n); bp += n; + + if(buf){ + free(buf); + } +} + +void +cross_(void) +{ + char buf[ sizeof(struct line) + sizeof(int) ], *bp = buf; + int n, i, prev_idx, idx, sz; + double dbuf[ sizeof(struct line) / sizeof(double) ]; + struct line l_g; + struct cross_ret ret, ret_; + char sbuf[ sizeof(int) * 2 + sizeof(ret) ]; + + n = sizeof(buf); + fread(buf, 1, n, stdin); + + n = sizeof(dbuf); + memcpy(dbuf, bp, n); bp += n; + + n = sizeof(int); + memcpy(&prev_idx, bp, n); + + line_new( &l_g, &dbuf[0], &dbuf[3] ); + + idx = -1; + memset(&ret, 0, sizeof(ret)); + + for(i=0; i= 0 ){ + cross_nv( data[idx].ki, &data[idx].l2g.lst[0].ax, &l_g, &ret ); + ret.diff = rt_calc_diff( &data[idx], &lights, &ret ); + } + + sz = sizeof(sbuf); + bp = sbuf; + + n = sizeof(int); + memcpy(bp, &sz, n); bp += n; + + memcpy(bp, &idx, n); bp += n; + + n = sizeof(ret); + memcpy(bp, &ret, n); bp += n; + + n = sz; + fwrite(sbuf, 1, n, stdout); + fflush(stdout); +} + +int +main(int ac, char **av) +{ + char *key = "n="; + int key_n = strlen(key), cmd, i, n; + + /* dbg = fopen("dbg.txt", "w"); */ + + for(i=1; i 0 else '' + + def send_recv(s, rn): + e.sock.sendall(s) + return recv(rn) + + def quit(): + send_recv( cmdi('quit'), 1 ) + ut.kill_proc(e.proc) + ut.cmd_exec('rm ' + FIFO) + e.quit = quit + + e.clear = lambda : send_recv( cmdi('clear'), 0 ) + + def add(i, d): + dic = { + 'idx': i, + 'ki': kinds.index( d.get('kind') ), + 'l2g': d.get('l2g'), + 'rtd': d.get('rtd'), + } + s = bin.pack_dic(dic, add_k_nm_lst) + s = cmdi('add') + bin.pack_i4( len(s) ) + s + send_recv(s, 0) + e.add = add + + def add_data(data): + for (i, d) in enumerate(data): + add(i, d) + e.add_data = add_data + + def add_lights(lights): + s = bin.pack_i4( len(lights) ) + for ltd in lights: + s += bin.pack_ltd(ltd) + s = cmdi('add_lights') + bin.pack_i4( len(s) ) + s + send_recv(s, 0) + e.add_lights = add_lights + + def cross(l_g, prev_idx=-1): + s = cmdi('cross_') + s += bin.pack_line(l_g) + s += bin.pack_i4(prev_idx) + + s = send_recv(s, 4) + s = recv( bin.unpack_i4(s)[0] ) + + (crs, s) = bin.unpack_dic(s, cross_ret_k_nm_lst) + return crs + e.cross = cross + + return e + +client = new_client() + +### + +def server_boot(n=100): + cmd1 = 'nc -l {}'.format(PORT) + cmd2 = './rt_sock.py n={} xname={}'.format( n, ut.arg_s('xname', 'xdat') ) + if 'srv_c' in sys.argv: + cmd2 = './rt_sock n={}'.format(n) + cmd = 'rm -f @ ; mkfifo @ ; cat @ | {} | {} > @'.replace('@', FIFO) + cmd = cmd.format(cmd1, cmd2) + client.proc = ut.cmd_proc(cmd) + ut.sleep(3.0) # + +def new_server(): + e = ut.Empty() + e.data = [] + e.lights = [] + + def alloc(n): + e.data = [] + for i in range(n): + e.data.append({}) + + clear = lambda : alloc( len(e.data) ) + + recv = lambda n: sys.stdin.buffer.read(n) if six.PY3 else sys.stdin.read(n) + + def send(s): + if six.PY3: + sys.stdout.buffer.write(s) + else: + sys.stdout.write(s) + sys.stdout.flush() + + err_msg = lambda s: sys.stderr.write(s + '\n') + + def add(): + s = recv( bin.unpack_i4( recv(4) )[0] ) + (dic, s) = bin.unpack_dic(s, add_k_nm_lst) + d = e.data[ dic.get('idx') ] + d['kind'] = kinds[ dic.get('ki') ] + d['l2g'] = dic.get('l2g') + d['rtd'] = dic.get('rtd') + + def add_lights(): + s = recv( bin.unpack_i4( recv(4) )[0] ) + (n, s) = bin.unpack_i4(s) + for i in range(n): + (ltd, s) = bin.unpack_ltd(s) + e.lights.append(ltd) + + e.in_ = [] + e.out = [] + + def cross_(): + s = recv(8*3*2 + 4) + + if e.in_: + send( e.in_.pop(0) ) + return + + (l_g, s) = bin.unpack_line(s) + (prev_idx, s) = bin.unpack_i4(s) + + lst = [] + for (i, d) in enumerate(e.data): + if not d: + continue + crs = { 'l_g': l_g, 'd': d, 'eq_d': i == prev_idx } + if not cross.cross(crs): + continue + crs['idx'] = i + lst.append(crs) + + crs = { + 'idx': -1, + 't': 0, + 'l': line.new(mt.zero, v.zero), + 'p': mt.zero, + 'l_nv_g': line.new(mt.zero, v.zero), + 'nv': v.zero, + 'eyev': v.zero, + 'ang_nv_eyev': 0, + 'diff': 0, + } + if lst: + crs = min( lst, key=lambda crs: crs.get('t') ) + cross.nv(crs) + + d = e.data[ crs.get('idx') ] + crs['diff'] = rt.calc_diff(d, e.lights, crs) + + s = bin.pack_dic(crs, cross_ret_k_nm_lst) + s = bin.pack_i4( len(s) ) + s + send(s) + e.out.append(s) + + e.fn = ut.arg_s('xname', 'xdat') + + def save(): + if not e.out or ut.exists(e.fn): + return + with open(e.fn, 'wb') as f: + s = b''.join(e.out) + f.write(s) + + def load(): + if not ut.exists(e.fn): + return + with open(e.fn, 'rb') as f: + s = f.read() + e.in_ = [] + while s: + (n, _) = bin.unpack_i4(s) + sz = 4 + n + e.in_.append( s[:sz] ) + s = s[sz:] + + def quit(): + save() + send(b'r') + sys.exit(0) + + def main_loop(): + alloc( ut.arg_i('n', 100) ) + load() + dic = { + 'clear': clear, + 'add': add, + 'add_lights': add_lights, + 'cross_': cross_, + 'quit': quit, + } + while True: + cmd_idx = bin.unpack_i4( recv(4) )[0] + if cmdi_ck(cmd_idx): + cmd = cmds[ cmd_idx ] + f = dic.get(cmd) + f() + else: + msg = '?' + ( ' cmd_idx={:02x}' if cmd_idx else '' ) + err_msg(msg) + sys.exit(1) + e.main_loop = main_loop + + return e + +server = new_server() + +if __name__ == "__main__": + server.main_loop() +# EOF diff -urN rt_v25/sock.c rt_v26/sock.c --- rt_v25/sock.c 2018-04-20 01:14:42.000000000 +0900 +++ rt_v26/sock.c 1970-01-01 09:00:00.000000000 +0900 @@ -1,267 +0,0 @@ -#include -#include -#include -#include "cross.h" -#include "lstx.h" -#include "rt.h" - -/* FILE *dbg; */ - -#define CMD_CLEAR 0 -#define CMD_ADD 1 -#define CMD_ADD_LIGHTS 2 -#define CMD_CROSS 3 -#define CMD_QUIT 4 - -struct data *data = NULL; -int data_n = 0; - -struct lights lights = { 0, NULL }; - -void -alloc(int n) -{ - int i, sz = sizeof(*data) * n; - - if(data){ - free(data); - data = NULL; - } - data = malloc(sz); - data_n = n; - for(i=0; iv3); - memcpy(vs->v3, bp, n); bp += n; - vecs_init(vs); /* ! */ - return bp; -} - -char * -unpack_xx(char *bp, struct x_x *xx) -{ - int n; - - n = 4; - memcpy(&xx->typ, bp, n); bp += n; - - switch(xx->typ){ - case TYP_AX: - n = sizeof(xx->ax.p); - memcpy(&xx->ax.p, bp, n); bp += n; - bp = unpack_vs(bp, &xx->ax.vs); - break; - case TYP_CX: - n = sizeof(xx->cx); - memcpy(&xx->cx, bp, n); bp += n; - break; - case TYP_FX: - n = sizeof(xx->fx); - memcpy(&xx->fx, bp, n); bp += n; - break; - default: - break; - } - return bp; -} - -char * -unpack_lx(char *bp, struct lstx *lx) -{ - int n, i; - - n = 4; - memcpy(&lx->n, bp, n); bp += n; - - lx->lst = malloc( sizeof(*lx->lst) * lx->n ); - - for(i=0; in; i++){ - bp = unpack_xx(bp, &lx->lst[i]); - } - return bp; -} - -void -add(void) -{ - int n, i, ki; - char *buf, *bp; - - fread(&n, sizeof(int), 1, stdin); - bp = buf = malloc(n); - - fread(buf, 1, n, stdin); - - n = 4; - memcpy(&i, bp, n); bp += n; - memcpy(&ki, bp, n); bp += n; - - data[i].ki = ki; - bp = unpack_lx(bp, &data[i].l2g); - - n = sizeof( data[i].rtd ); - memcpy(&data[i].rtd, bp, n); bp += n; - - if(buf){ - free(buf); - } - /* - fprintf(dbg, "a %d %d/%f %f %f/%f %f %f,%f %f %f,%f %f %f\n", - i, data[i].ki, - data[i].l2g.p[0], - data[i].l2g.p[1], - data[i].l2g.p[2], - data[i].l2g.vs.v3[0], - data[i].l2g.vs.v3[1], - data[i].l2g.vs.v3[2], - data[i].l2g.vs.v3[3], - data[i].l2g.vs.v3[4], - data[i].l2g.vs.v3[5], - data[i].l2g.vs.v3[6], - data[i].l2g.vs.v3[7], - data[i].l2g.vs.v3[8]); - */ -} - -void -add_lights(void) -{ - int n; - char *buf, *bp; - - fread(&n, sizeof(n), 1, stdin); - bp = buf = malloc(n); - - fread(buf, 1, n, stdin); - - n = 4; - memcpy(&lights.n, bp, n); bp += n; - - n = sizeof(*lights.lst) * lights.n; - lights.lst = malloc(n); - - memcpy(lights.lst, bp, n); bp += n; - - if(buf){ - free(buf); - } -} - -void -cross_(void) -{ - char buf[ sizeof(struct line) + sizeof(int) ], *bp = buf; - int n, i, prev_idx, idx, sz; - double dbuf[ sizeof(struct line) / sizeof(double) ]; - struct line l_g; - struct cross_ret ret, ret_; - char sbuf[ sizeof(int) * 2 + sizeof(ret) ]; - - n = sizeof(buf); - fread(buf, 1, n, stdin); - - n = sizeof(dbuf); - memcpy(dbuf, bp, n); bp += n; - - n = sizeof(int); - memcpy(&prev_idx, bp, n); - - line_new( &l_g, &dbuf[0], &dbuf[3] ); - - idx = -1; - memset(&ret, 0, sizeof(ret)); - - for(i=0; i= 0 ){ - cross_nv( data[idx].ki, &data[idx].l2g.lst[0].ax, &l_g, &ret ); - ret.diff = rt_calc_diff( &data[idx], &lights, &ret ); - } - - sz = sizeof(sbuf); - bp = sbuf; - - n = sizeof(int); - memcpy(bp, &sz, n); bp += n; - - memcpy(bp, &idx, n); bp += n; - - n = sizeof(ret); - memcpy(bp, &ret, n); bp += n; - - n = sz; - fwrite(sbuf, 1, n, stdout); - fflush(stdout); -} - -int -main(int ac, char **av) -{ - char *key = "n="; - int key_n = strlen(key), cmd, i, n; - - /* dbg = fopen("dbg.txt", "w"); */ - - for(i=1; i 0 else '' - - def send_recv(s, rn): - e.sock.sendall(s) - return recv(rn) - - def quit(): - send_recv( bin.pack_i4( cmds.index('quit') ), 1 ) - ut.kill_proc(e.proc) - ut.cmd_exec('rm fifo') - e.quit = quit - - e.clear = lambda : send_recv( bin.pack_i4( cmds.index('clear') ), 0 ) - - def add(i, d): - dic = { - 'idx': i, - 'ki': kinds.index( d.get('kind') ), - 'l2g': d.get('l2g'), - 'rtd': d.get('rtd'), - } - s = bin.pack_dic(dic, add_k_nm_lst) - s = bin.pack_i4( cmds.index('add') ) + bin.pack_i4( len(s) ) + s - send_recv(s, 0) - e.add = add - - def add_data(data): - for (i, d) in enumerate(data): - add(i, d) - e.add_data = add_data - - def add_lights(lights): - s = bin.pack_i4( len(lights) ) - for ltd in lights: - s += bin.pack_ltd(ltd) - s = bin.pack_i4( cmds.index('add_lights') ) + bin.pack_i4( len(s) ) + s - send_recv(s, 0) - e.add_lights = add_lights - - def cross(l_g, prev_idx=-1): - s = bin.pack_i4( cmds.index('cross_') ) - s += bin.pack_line(l_g) - s += bin.pack_i4(prev_idx) - - s = send_recv(s, 4) - s = recv( bin.unpack_i4(s)[0] ) - - (crs, s) = bin.unpack_dic(s, cross_ret_k_nm_lst) - return crs - e.cross = cross - - return e - -client = new_client() - -### - -def server_boot(n=100): - cmd1 = 'nc -l {}'.format(PORT) - cmd2 = './sock.py n={} xname={}'.format( n, ut.arg_s('xname', 'xdat') ) - if 'srv_c' in sys.argv: - cmd2 = './sock n={}'.format(n) - cmd = 'rm -f fifo ; mkfifo fifo ; cat fifo | {} | {} > fifo'.format(cmd1, cmd2) - client.proc = ut.cmd_proc(cmd) - ut.sleep(3.0) # - -def new_server(): - e = ut.Empty() - e.data = [] - e.lights = [] - - def alloc(n): - e.data = [] - for i in range(n): - e.data.append({}) - - clear = lambda : alloc( len(e.data) ) - - recv = lambda n: sys.stdin.buffer.read(n) if six.PY3 else sys.stdin.read(n) - - def send(s): - if six.PY3: - sys.stdout.buffer.write(s) - else: - sys.stdout.write(s) - sys.stdout.flush() - - err_msg = lambda s: sys.stderr.write(s + '\n') - - def add(): - s = recv( bin.unpack_i4( recv(4) )[0] ) - (dic, s) = bin.unpack_dic(s, add_k_nm_lst) - d = e.data[ dic.get('idx') ] - d['kind'] = kinds[ dic.get('ki') ] - d['l2g'] = dic.get('l2g') - d['rtd'] = dic.get('rtd') - - def add_lights(): - s = recv( bin.unpack_i4( recv(4) )[0] ) - (n, s) = bin.unpack_i4(s) - for i in range(n): - (ltd, s) = bin.unpack_ltd(s) - e.lights.append(ltd) - - e.in_ = [] - e.out = [] - - def cross_(): - s = recv(8*3*2 + 4) - - if e.in_: - send( e.in_.pop(0) ) - return - - (l_g, s) = bin.unpack_line(s) - (prev_idx, s) = bin.unpack_i4(s) - - lst = [] - for (i, d) in enumerate(e.data): - if not d: - continue - crs = { 'l_g': l_g, 'd': d, 'eq_d': i == prev_idx } - if not cross.cross(crs): - continue - crs['idx'] = i - lst.append(crs) - - crs = { - 'idx': -1, - 't': 0, - 'l': line.new(mt.zero, v.zero), - 'p': mt.zero, - 'l_nv_g': line.new(mt.zero, v.zero), - 'nv': v.zero, - 'eyev': v.zero, - 'ang_nv_eyev': 0, - 'diff': 0, - } - if lst: - crs = min( lst, key=lambda crs: crs.get('t') ) - cross.nv(crs) - - d = e.data[ crs.get('idx') ] - crs['diff'] = rt.calc_diff(d, e.lights, crs) - - s = bin.pack_dic(crs, cross_ret_k_nm_lst) - s = bin.pack_i4( len(s) ) + s - send(s) - e.out.append(s) - - e.fn = ut.arg_s('xname', 'xdat') - - def save(): - if not e.out or ut.exists(e.fn): - return - with open(e.fn, 'wb') as f: - s = b''.join(e.out) - f.write(s) - - def load(): - if not ut.exists(e.fn): - return - with open(e.fn, 'rb') as f: - s = f.read() - e.in_ = [] - while s: - (n, _) = bin.unpack_i4(s) - sz = 4 + n - e.in_.append( s[:sz] ) - s = s[sz:] - - def quit(): - save() - send(b'r') - sys.exit(0) - - def main_loop(): - alloc( ut.arg_i('n', 100) ) - load() - while True: - dic = { - 'clear': clear, - 'add': add, - 'add_lights': add_lights, - 'cross_': cross_, - 'quit': quit, - } - cmd_idx = bin.unpack_i4( recv(4) )[0] - if 0 <= cmd_idx and cmd_idx < len(cmds): - cmd = cmds[ cmd_idx ] - f = dic.get(cmd) - f() - else: - msg = '?' + ( ' cmd_idx={:02x}' if cmd_idx else '' ) - err_msg(msg) - sys.exit(1) - e.main_loop = main_loop - - return e - -server = new_server() - -if __name__ == "__main__": - server.main_loop() -# EOF