Example #1
0
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))
Example #2
0
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))
Example #3
0
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))
Example #4
0
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
Example #6
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)
Example #7
0
 def _deserializedData(self, data):
     data_recoverd = interf.Internal()
     data_recoverd.ParseFromString(data)
     return data_recoverd