def sendTxCtrlToPhy(lc, chan, bandwidth, mcs_idx, gain_value, slots, sequence_number, send_to_id, module, data, rfboost, debug): # Basic Control trx_flag = PHY_TX_ST # TRX Mode. 1 TX - 0 RX; 2 send_to = send_to_id # ID of the radio where to send a packet to. seq_number = sequence_number # Sequence number. bw_idx = bandwidth # By default use BW: 5 MHz. Possible values: 0 - 1.4 MHz, 1 - 3 MHz, 2 - 5 MHz, 3 - 10 MHz. mcs = mcs_idx # It has no meaning for RX. MCS is recognized automatically by receiver. MCS varies from 0 to 28. channel = chan # By default use channel 0. slot = 0 # Slot number (not used now, for future use) frame = 0 # Frame number. gain = gain_value # RX gain. We use -1 for AGC mode. num_slots = slots # Number of slots. How many data slots we expect to receive from peer. # Create an Internal message for TX procedure. internal = interf.Internal() # Add sequence number to internal message. internal.transaction_index = seq_number # Set basic control with proper values. internal.send.basic_ctrl.trx_flag = trx_flag internal.send.basic_ctrl.send_to = send_to internal.send.basic_ctrl.bw_index = bw_idx internal.send.basic_ctrl.ch = channel internal.send.basic_ctrl.frame = frame internal.send.basic_ctrl.slot = slot internal.send.basic_ctrl.timestamp = 0 internal.send.basic_ctrl.mcs = mcs internal.send.basic_ctrl.gain = gain internal.send.basic_ctrl.rf_boost = rfboost internal.send.basic_ctrl.length = num_slots*getTransportBlockSize(bw_idx, mcs) internal.send.app_data.data = data # Check size of transmited data. if(len(internal.send.app_data.data) != internal.send.basic_ctrl.length): print("Length of data is diffrent of field length.") sys.exit(-1) # Send basic control to PHY. lc.send(Message(module, interf.MODULE_PHY, internal))
def sendRxCtrlToPhy(lc, bandwidth_idx, chan, mcs_idx, rx_gain, num_data_slots, seq_number, module, debug): # Basic Control trx_flag = PHY_RX_ST # TRX Mode. 1 TX - 0 RX; send_to = 0 # Radio ID to send slot to. seq_number = seq_number # Sequence number. bw_idx = bandwidth_idx # By default use BW: 5 MHz. Possible values: 0 - 1.4 MHz, 1 - 3 MHz, 2 - 5 MHz, 3 - 10 MHz. mcs = mcs_idx # It has no meaning for RX. MCS is recognized automatically by receiver. MCS varies from 0 to 28. rxchannel = chan # By default use rxchannel 0. slot = 0 # Slot number (not used now, for future use) frame = 0 gain = rx_gain # RX gain. We use -1 for AGC mode. num_slots = num_data_slots # Number of slots. How many data slots we expect to receive from peer. # Create an Internal message for RX procedure. internal = interf.Internal() # Add sequence number to internal message. internal.transaction_index = seq_number # Add values to the Basic Control Message for RX procedure. internal.receive.basic_ctrl.trx_flag = trx_flag internal.receive.basic_ctrl.send_to = send_to internal.receive.basic_ctrl.bw_index = bw_idx internal.receive.basic_ctrl.ch = rxchannel internal.receive.basic_ctrl.frame = frame internal.receive.basic_ctrl.slot = slot internal.receive.basic_ctrl.mcs = mcs internal.receive.basic_ctrl.gain = gain internal.receive.basic_ctrl.length = num_slots # Print the basic control structure sent to PHY. if (debug == True): printBasicControl(internal.receive.basic_ctrl, internal.transaction_index) # Send basic control to PHY. if (debug == True): print("Sending basic control to PHY.") lc.send(Message(module, interf.MODULE_PHY, internal))
def sendRxCtrlToPhy(lc, chan, rx_gain, num_data_slots, seq_number, source_module): # Basic Control trx_flag = TRX_FLAG_RX # TRX Mode. 2->TX - 1->RX seq_number = seq_number # Sequence number. bw_idx = BW_INDEX_5_MHZ # By default use BW: 5 MHz. Possible values: 0 - 1.4 MHz, 1 - 3 MHz, 2 - 5 MHz, 3 - 10 MHz. mcs = 0 # It has no meaning for RX. MCS is recognized automatically by receiver. MCS varies from 0 to 28. channel = chan # By default use channel 0. slot = 0 # Slot number (not used now, for future use) frame = 0 # Frame number (not used now, for future use) gain = rx_gain # RX gain. We use -1 for AGC mode. num_slots = num_data_slots # Number of slots. How many data slots we expect to receive from peer. send_to = 0 # Create an Internal message for RX procedure. internal = interf.Internal() # Add sequence number to internal message. internal.transaction_index = seq_number # Add values to the Basic Control Message for RX procedure. internal.receive.basic_ctrl.trx_flag = trx_flag internal.receive.basic_ctrl.send_to = send_to internal.receive.basic_ctrl.bw_index = bw_idx internal.receive.basic_ctrl.ch = channel internal.receive.basic_ctrl.slot = slot internal.receive.basic_ctrl.frame = frame internal.receive.basic_ctrl.mcs = mcs internal.receive.basic_ctrl.gain = gain internal.receive.basic_ctrl.length = num_slots # Print the basic control structure sent to PHY. printBasicControl(internal.receive.basic_ctrl, internal.transaction_index) # Send basic control to PHY. print("Sending basic control to PHY.") lc.send(Message(source_module, interf.MODULE_PHY, internal))
from communicator.python.Communicator import Message from communicator.python.LayerCommunicator import LayerCommunicator import communicator.python.interf_pb2 as interf if __name__ == '__main__': #LOAD THE LAERY COMMUNICATOR module = interf.MODULE_PHY lc = LayerCommunicator(module, [interf.MODULE_MAC]) #SLEEP FOR 4 SECS, TO SETUP THE OTHER MODULES sleep(4) print("START SENDING") #CREATE A PHY_STAT MESSAGE stat = interf.Internal() stat.transaction_index stat.get.attribute = interf.Get.MAC_STATS #ADD MESSAGE TO THE SENDING QUEUE lc.send(Message(module, interf.MODULE_MAC, stat)) #GET THE HIGH PRIORITY QUEUE AND WAIT FOR A MESSAGE m = lc.get_high_queue().get() print("Get message " + str(m)) #print("TRX Flag: "+str(m.message.trx_flag)+"\nseq_number: "+str(m.message.seq_number)+"\ncenter_freq: "+str(m.message.center_freq)+"\nbw_index: "+str(m.message.bw_index)+"\nch: "+str(m.message.ch)+"\nslot: "+str(m.message.slot)+"\nmcs: "+str(m.message.mcs)+"\ngain: "+str(m.message.gain)+"\nlength: "+str(m.message.length)) try: #TRY TO GET THE NEXT MESSAGE WITHOUT WAITING m = lc.get_high_queue().get_nowait() print("Get message " + str(m))
printBasicControl(basic_control, seq_num, tx_data) trx_flag = basic_control.trx_flag if (trx_flag == 0): # RX length = basic_control.length elif (trx_flag == 1): # TX length = 1 else: print("Error: Invalid TRX Flag.") exit(-1) for packet in range(0, length, 1): # Create PHY Statistics object. stats = interf.Internal() stats.transaction_index = seq_num # Decide which kind of PHY Stats should be sent upwards. if (trx_flag == 0): # RX stats.receiver.result = 0 # PHY_SUCCESS stats.receiver.stat.host_timestamp = int( str(time.time()).split('.')[0]) stats.receiver.stat.fpga_timestamp = int( str(time.time()).split('.')[0]) stats.receiver.stat.frame = basic_control.frame stats.receiver.stat.slot = basic_control.slot stats.receiver.stat.ch = basic_control.ch stats.receiver.stat.mcs = basic_control.mcs stats.receiver.stat.num_cb_total = 0 stats.receiver.stat.num_cb_err = 0
sys.path.append('../../communicator/python/') from communicator.python.Communicator import Message from communicator.python.LayerCommunicator import LayerCommunicator import communicator.python.interf_pb2 as interf print = functools.partial(print, flush=True) ipc_location = "/tmp/IPC_" my_module = interf.MODULE_ENVIRONMENT target_modules = [ interf.MODULE_AI, interf.MODULE_COLLAB_CLIENT, interf.MODULE_PHY ] # Create the message message = interf.Internal() message.owner_module = my_module message.set.environment_updated = True serialized = message.SerializeToString() context = zmq.Context(1) for target in target_modules: target_str = interf.MODULE.Name(target) print("Send out message to {}".format(target_str)) ipcfile = "ipc://{}{}_{}".format(ipc_location, my_module, target) socket = context.socket(zmq.PUSH) socket.bind(ipcfile) # Apparently we need some time here to let the other module to connect time.sleep(0.5) try: socket.send(serialized, flags=zmq.NOBLOCK)
def _deserializedData(self, data): data_recoverd = interf.Internal() data_recoverd.ParseFromString(data) return data_recoverd