def test_fountain(): """ 测试喷泉吗的简单demo, 从文件中读取数据作为喷泉吗编解码使用的数据""" glass_id = 233 m = open(os.path.join(DOC_PATH, FOUNTAIN_TEXT), 'r').read() my_fountain = Fountain(m) my_glass = Glass(my_fountain.num_chunks) while my_glass.getString() != m: # fillAmt(my_fountain, my_glass, 10) # my_glass.addDroplet(my_fountain.droplet()) a_drop = my_glass.droplet_from_Bytes(my_fountain.droplet().toBytes()) my_glass.addDroplet(a_drop) sleep(2) # print 'add 10 drop' print('+++++++++++++++++++++++++++++') print(my_glass.getString()) print('done')
def main_test_ew_fountain(): m = open(os.path.join(DOC_PATH, 'fountain.txt'), 'r').read() fountain = EW_Fountain(m, chunk_size=10) glass = Glass(fountain.num_chunks) ew_drop = None i = 0 drop_size = 0 while not glass.isDone(): i += 1 a_drop = fountain.droplet() ew_drop = EW_Droplet(a_drop.data, a_drop.seed, a_drop.num_chunks) drop_size = len(ew_drop.data) glass.addDroplet(ew_drop) # sleep(1) logging.info('+++++++++++++++++++++++++++++') logging.info(glass.getString()) logging.info("data size : {}".format(len(m))) logging.info("send drop num : {} drop size : {}".format(i, drop_size)) logging.info("send data size : {}".format(i * drop_size)) logging.info("scale : {}".format((i * drop_size) / float(len(m)))) logging.info('done')
class Receiver: def __init__( self, bus, device, ): self.spiRecv = spidev.SpiDev() self.spiRecv.open(bus, device) self.spiRecv.max_speed_hz = 6250000 #976000 self.spiRecv.mode = 0b00 self.spiSend = spidev.SpiDev() self.spiSend.open(bus, 0) self.spiSend.max_speed_hz = 6250000 #976000 self.spiSend.mode = 0b00 spi_init() self.drop_id = 0 self.glass = Glass(0) self.chunk_size = 0 self.current_recv_bits_len = 0 self.recv_done_flag = False self.data_rec = "" '''LT喷泉码接收解码部分''' def begin_to_catch(self): a_drop_bytes = self.catch_a_drop_spi() # bytes if a_drop_bytes is not None: check_data = recv_check(a_drop_bytes) if not check_data == None: self.drop_id += 1 print("recv drops id : ", self.drop_id) self.drop_byte_size = len(check_data) self.add_a_drop(check_data) # bytes --- drop --- bits def catch_a_drop_spi(self): if GPIO.input(25): spi_recv = self.spiRecv.readbytes(239) rec_bytes = bytes(spi_recv) frame_len = len(rec_bytes) print("framelen: ", frame_len) while (rec_bytes[frame_len - 1] == 0): frame_len = frame_len - 1 rec_bytes = rec_bytes[:frame_len] print("droplen: ", frame_len) self.data_rec = rec_bytes if self.data_rec[0:2] == b'##' and self.data_rec[ frame_len - 2:frame_len] == b'$$': data_array = bytearray(self.data_rec) data_array.pop(0) data_array.pop(0) data_array.pop() data_array.pop() a = len(data_array) print('drop len(crc) :', a) return bytes(data_array) else: print(self.data_rec[0:2], b'##') print(self.data_rec[frame_len - 2:frame_len], b'$$') print('Wrong receive frame !') def add_a_drop(self, d_byte): drop = self.glass.droplet_from_Bytes(d_byte) # drop print('drop data len: ', len(drop.data)) if self.glass.num_chunks == 0: print('init num_chunks : ', drop.num_chunks) self.glass = Glass(drop.num_chunks) # 初始化接收glass self.chunk_size = len(drop.data) self.glass.addDroplet(drop) # glass add drops logging.info('current chunks') logging.info( [ii if ii == None else '++++' for ii in self.glass.chunks]) logging.info('=============================') if self.glass.isDone(): self.recv_done_flag = True logging.info('============Recv done===========') logging.info(self.glass.getString()) self.send_recv_done_ack() # 接收完成返回ack def send_recv_done_ack(self): if self.recv_done_flag: ack = b'#$' acklen = len(ack) acksend = bytearray(ack) while (acklen < 239): acksend.insert(acklen, 0) acklen += 1 self.spiSend.xfer2(acksend) logging.info('Send fountain ACK done')