def create_and_save_and_reload(t, func, fname): obj = t() obj = func(obj) n = count_bytes(obj) mem = bytearray(n) copy_to_mem(obj, mem) name = obj.__class__.__name__ filename = join(dirname(__file__), "output", name + f"_{fname}.bin") filename_txt = join(dirname(__file__), "output", name + f"_{fname}.txt") with StringIO() as f: printto(obj, f) text_version = f.getvalue() with open(filename, "wb") as f: f.write(mem) with open(filename, "rb") as f: read_back_data = bytearray(f.read()) read_back_obj = t() copy_from_mem(read_back_data, read_back_obj) with StringIO() as f2: printto(read_back_obj, f2) read_back_text_version = f2.getvalue() with open(filename_txt, "w") as f: f.write(text_version) assert len(text_version) > 0 assert text_version == read_back_text_version return text_version
def get_data(): global cnt data = Points() data.n=3 adjust_array_sizes_and_variants(data) for p in range(data.n): data.p[p].x= p data.p[p].y= cnt/1000 cnt += 1 n = count_bytes(data) click.echo(f"{cnt}: send {n} bytes...") b = bytearray(n) m = copy_to_mem(data, b) assert(n==m) return b
def send_via_udp(count, host, port): """Simple program that send data for a total of COUNT times.""" MULTICAST_TTL = 2 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, MULTICAST_TTL) for x in range(count): data = MultiMessage() if x%3==0: data.header.id = TypeSelector.POLY adjust_array_sizes_and_variants(data) data.code=np.int32(-99) data.onoff[0]=OnOff.ON data.onoff[1]=OnOff.OFF data.onoff[2]=OnOff.OFF data.onoff[3]=OnOff.ON data.onoff[4]=OnOff.ON data.onoff[5]=OnOff.ON data.abc=ABC.C data.payload.n=3+x adjust_array_sizes_and_variants(data) for p in range(data.payload.n): data.payload.p[p].x= p+0.99 data.payload.p[p].y= -p-.33 elif x%3==1: data.header.id = TypeSelector.POINT adjust_array_sizes_and_variants(data) data.code=np.int32(100+x) data.payload.x=1 data.payload.y=2 else: data.header.id = TypeSelector.TRIANGLE data.code=np.int32(100+x) adjust_array_sizes_and_variants(data) set_length_field(data) n = count_bytes(data) click.echo(f"send {x}: {n} bytes...") #printto(data, sys.stdout) b = bytearray(n) m = copy_to_mem(data, b) assert(n==m) #print(b) sock.sendto(b, (host, port))
def send_via_udp(count, host, port): """Simple program that send data for a total of COUNT times.""" MULTICAST_TTL = 2 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, MULTICAST_TTL) for x in range(count): data = Polygon() data.n=3+x adjust_array_sizes_and_variants(data) for p in range(data.n): data.p[p].x= p+0.99 data.p[p].y= -p-.33 n = count_bytes(data) click.echo(f"send {x}: {n} bytes...") #printto(data, sys.stdout) b = bytearray(n) m = copy_to_mem(data, b) assert(n==m) #print(b) sock.sendto(b, (host, port))
def compute_length(s): from mdsd.item.io import count_bytes # todo: use unit of length return count_bytes(s)
def test_io_bin_output(): path = join(dirname(__file__), "output") if exists(path): shutil.rmtree(path) os.mkdir(path) print(path) def init_default(o): init_default_values(o) return o def init_min(o): init_min_values(o) return o def init_max(o): init_max_values(o) return o def create_and_save_and_reload(t, func, fname): obj = t() obj = func(obj) n = count_bytes(obj) mem = bytearray(n) copy_to_mem(obj, mem) name = obj.__class__.__name__ filename = join(dirname(__file__), "output", name + f"_{fname}.bin") filename_txt = join(dirname(__file__), "output", name + f"_{fname}.txt") with StringIO() as f: printto(obj, f) text_version = f.getvalue() with open(filename, "wb") as f: f.write(mem) with open(filename, "rb") as f: read_back_data = bytearray(f.read()) read_back_obj = t() copy_from_mem(read_back_data, read_back_obj) with StringIO() as f2: printto(read_back_obj, f2) read_back_text_version = f2.getvalue() with open(filename_txt, "w") as f: f.write(text_version) assert len(text_version) > 0 assert text_version == read_back_text_version return text_version for t in get_all_test_structs(): create_and_save_and_reload(t, init_default, "default") create_and_save_and_reload(t, init_min, "min") create_and_save_and_reload(t, init_max, "max") # individual test from big_example.AllInOne import AllInOne from big_example.OnOff import OnOff from big_example.Point import Point from mdsd.item_support import adjust_array_sizes_and_variants demo = AllInOne() for k in range(len(demo.embedded_enum_array)): demo.embedded_enum_array[k] = OnOff.ON if k%2 == 0 else OnOff.OFF demo.payload.n = 4 demo.m = 2 adjust_array_sizes_and_variants(demo) assert demo.headers.shape == (2,3) for k in range(len(demo.payload.p)): if k<2: demo.payload.p[k] = Point(80 + k / 2, 20 + k) else: demo.payload.p[k].x = 80+k/2 demo.payload.p[k].y = 20+k assert demo.payload.p[0].y == pytest.approx(20) assert demo.payload.p[1].y == pytest.approx(21) assert demo.payload.p[2].y == pytest.approx(22) assert demo.payload.p[3].y == pytest.approx(23) n = count_bytes(demo) mem = bytearray(n) copy_to_mem(demo, mem) filename = join(dirname(__file__), "output", "AllInOne_demo.bin") with open(filename, "wb") as f: f.write(mem) with StringIO() as f2: printto(demo, f2) text_version = f2.getvalue() with open(filename, "rb") as f: read_back_data = bytearray(f.read()) read_back_obj = AllInOne() copy_from_mem(read_back_data, read_back_obj) with StringIO() as f2: printto(read_back_obj, f2) read_back_text_version = f2.getvalue() assert read_back_obj.header.length > 0 assert read_back_obj.header.length == len(read_back_data) # next line is for bugfixing (if the model change, the value changes...) # assert read_back_obj.header.length == 342 assert read_back_obj.header.length == compute_length(read_back_obj) assert "ON" in read_back_text_version assert text_version == read_back_text_version filename_txt = join(dirname(__file__), "output", "AllInOne_demo.txt") with open(filename_txt, "w") as f: f.write(read_back_text_version)