RENEWLab  1.1.0
RENEW project
receiver.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2018-2021, Rice University
3  RENEW OPEN SOURCE LICENSE: http://renew-wireless.org/license
4 
5 ----------------------------------------------------------
6  Handles received samples from massive-mimo base station
7 ----------------------------------------------------------
8 */
9 
10 #ifndef DATARECEIVER_HEADER
11 #define DATARECEIVER_HEADER
12 
13 #include <arpa/inet.h>
14 #include <netinet/in.h>
15 #include <pthread.h>
16 #include <sys/socket.h>
17 #include <sys/types.h>
18 
19 #include <algorithm>
20 #include <cassert>
21 #include <chrono>
22 #include <cstring>
23 #include <ctime>
24 #include <exception>
25 #include <iostream>
26 #include <numeric>
27 
28 #include "BaseRadioSet.h"
29 #include "ClientRadioSet.h"
30 #include "concurrentqueue.h"
31 #include "macros.h"
32 
33 class ReceiverException : public std::runtime_error {
34  public:
36  : std::runtime_error("Receiver could not be setup correctly!") {}
37  explicit ReceiverException(const std::string& message)
38  : std::runtime_error(message) {}
39 };
40 
41 class Receiver {
42  public:
43  // use for create pthread
44  struct ReceiverContext {
47  size_t core_id;
48  size_t tid;
49  };
50 
51  public:
52  Receiver(Config* config, moodycamel::ConcurrentQueue<Event_data>* in_queue,
53  std::vector<moodycamel::ConcurrentQueue<Event_data>*> tx_queue,
54  std::vector<moodycamel::ProducerToken*> tx_ptoks,
55  std::vector<moodycamel::ConcurrentQueue<Event_data>*> cl_tx_queue,
56  std::vector<moodycamel::ProducerToken*> cl_tx_ptoks);
57  ~Receiver();
58 
59  std::vector<pthread_t> startRecvThreads(SampleBuffer* rx_buffer,
60  size_t n_rx_threads,
61  SampleBuffer* tx_buffer,
62  unsigned in_core_id = 0);
63  void completeRecvThreads(const std::vector<pthread_t>& recv_thread);
64  std::vector<pthread_t> startClientThreads(SampleBuffer* rx_buffer,
65  SampleBuffer* tx_buffer,
66  unsigned in_core_id = 0);
67  void go();
68  static void* loopRecv_launch(void* in_context);
69  void loopRecv(int tid, int core_id, SampleBuffer* rx_buffer);
70  void baseTxBeacon(int radio_id, int cell, int frame_id, long long base_time);
71  int baseTxData(int radio_id, int cell, int frame_id, long long base_time);
72  void notifyPacket(NodeType node_type, int frame_id, int slot_id, int ant_id,
73  int buff_size, int offset = 0);
74  static void* clientTxRx_launch(void* in_context);
75  void clientTxRx(int tid);
76  void clientSyncTxRx(int tid, int core_id, SampleBuffer* rx_buffer);
77  int syncSearch(std::vector<std::complex<int16_t>> sync_buff,
78  size_t sync_num_samps);
79  void initBuffers();
80  void clientTxPilots(size_t user_id, long long base_time);
81  int clientTxData(int tid, int frame_id, long long base_time);
82 
83  private:
87 
88  size_t thread_num_;
89  // pointer of message_queue_
90  moodycamel::ConcurrentQueue<Event_data>* message_queue_;
91  std::vector<moodycamel::ConcurrentQueue<Event_data>*> tx_queue_;
92  std::vector<moodycamel::ProducerToken*> tx_ptoks_;
93  std::vector<moodycamel::ConcurrentQueue<Event_data>*> cl_tx_queue_;
94  std::vector<moodycamel::ProducerToken*> cl_tx_ptoks_;
95 
96  // Data buffers
99  std::vector<void*> pilotbuffA;
100  std::vector<void*> pilotbuffB;
101  std::vector<void*> zeros;
102  size_t txTimeDelta;
103  size_t txFrameDelta;
104 };
105 
106 #endif
Receiver::syncSearch
int syncSearch(std::vector< std::complex< int16_t >> sync_buff, size_t sync_num_samps)
Definition: receiver.cc:762
Receiver::cl_tx_buffer_
SampleBuffer * cl_tx_buffer_
Definition: receiver.h:97
Receiver::clientTxRx
void clientTxRx(int tid)
Definition: receiver.cc:594
Receiver::zeros
std::vector< void * > zeros
Definition: receiver.h:101
Receiver::pilotbuffA
std::vector< void * > pilotbuffA
Definition: receiver.h:99
Receiver::pilotbuffB
std::vector< void * > pilotbuffB
Definition: receiver.h:100
Receiver::clientTxRx_launch
static void * clientTxRx_launch(void *in_context)
Definition: receiver.cc:580
Receiver::notifyPacket
void notifyPacket(NodeType node_type, int frame_id, int slot_id, int ant_id, int buff_size, int offset=0)
Definition: receiver.cc:279
macros.h
Receiver::~Receiver
~Receiver()
Definition: receiver.cc:79
Receiver::startRecvThreads
std::vector< pthread_t > startRecvThreads(SampleBuffer *rx_buffer, size_t n_rx_threads, SampleBuffer *tx_buffer, unsigned in_core_id=0)
Definition: receiver.cc:151
Receiver::cl_tx_ptoks_
std::vector< moodycamel::ProducerToken * > cl_tx_ptoks_
Definition: receiver.h:94
Receiver::clientSyncTxRx
void clientSyncTxRx(int tid, int core_id, SampleBuffer *rx_buffer)
Definition: receiver.cc:780
Receiver
Definition: receiver.h:41
Receiver::message_queue_
moodycamel::ConcurrentQueue< Event_data > * message_queue_
Definition: receiver.h:90
Receiver::txTimeDelta
size_t txTimeDelta
Definition: receiver.h:102
Receiver::tx_queue_
std::vector< moodycamel::ConcurrentQueue< Event_data > * > tx_queue_
Definition: receiver.h:91
Receiver::startClientThreads
std::vector< pthread_t > startClientThreads(SampleBuffer *rx_buffer, SampleBuffer *tx_buffer, unsigned in_core_id=0)
Definition: receiver.cc:120
Receiver::clientTxPilots
void clientTxPilots(size_t user_id, long long base_time)
Definition: receiver.cc:686
Receiver::baseTxData
int baseTxData(int radio_id, int cell, int frame_id, long long base_time)
Definition: receiver.cc:225
Receiver::clientRadioSet_
ClientRadioSet * clientRadioSet_
Definition: receiver.h:85
Receiver::go
void go()
Definition: receiver.cc:187
Receiver::initBuffers
void initBuffers()
Definition: receiver.cc:98
Receiver::baseTxBeacon
void baseTxBeacon(int radio_id, int cell, int frame_id, long long base_time)
Definition: receiver.cc:193
ReceiverException
Definition: receiver.h:33
NodeType
NodeType
Definition: macros.h:44
Receiver::ReceiverContext::tid
size_t tid
Definition: receiver.h:48
Receiver::completeRecvThreads
void completeRecvThreads(const std::vector< pthread_t > &recv_thread)
Definition: receiver.cc:180
Receiver::loopRecv
void loopRecv(int tid, int core_id, SampleBuffer *rx_buffer)
Definition: receiver.cc:307
Receiver::ReceiverContext::core_id
size_t core_id
Definition: receiver.h:47
Receiver::txFrameDelta
size_t txFrameDelta
Definition: receiver.h:103
ReceiverException::ReceiverException
ReceiverException()
Definition: receiver.h:35
ClientRadioSet.h
Config
Definition: config.h:20
Receiver::ReceiverContext::buffer
SampleBuffer * buffer
Definition: receiver.h:46
ReceiverException::ReceiverException
ReceiverException(const std::string &message)
Definition: receiver.h:37
vector
Maybe you need to transpose bits_matrix before reshaping it to a vector
Definition: syms2bits.m:62
Receiver::bs_tx_buffer_
SampleBuffer * bs_tx_buffer_
Definition: receiver.h:98
BaseRadioSet
Definition: BaseRadioSet.h:16
Receiver::ReceiverContext
Definition: receiver.h:44
Receiver::thread_num_
size_t thread_num_
Definition: receiver.h:88
BaseRadioSet.h
SampleBuffer
Definition: macros.h:47
Receiver::config_
Config * config_
Definition: receiver.h:84
ClientRadioSet
Definition: ClientRadioSet.h:12
Receiver::loopRecv_launch
static void * loopRecv_launch(void *in_context)
Definition: receiver.cc:296
Receiver::Receiver
Receiver(Config *config, moodycamel::ConcurrentQueue< Event_data > *in_queue, std::vector< moodycamel::ConcurrentQueue< Event_data > * > tx_queue, std::vector< moodycamel::ProducerToken * > tx_ptoks, std::vector< moodycamel::ConcurrentQueue< Event_data > * > cl_tx_queue, std::vector< moodycamel::ProducerToken * > cl_tx_ptoks)
Definition: receiver.cc:27
Receiver::base_radio_set_
BaseRadioSet * base_radio_set_
Definition: receiver.h:86
Receiver::tx_ptoks_
std::vector< moodycamel::ProducerToken * > tx_ptoks_
Definition: receiver.h:92
Receiver::clientTxData
int clientTxData(int tid, int frame_id, long long base_time)
Definition: receiver.cc:714
Receiver::ReceiverContext::ptr
Receiver * ptr
Definition: receiver.h:45
Receiver::cl_tx_queue_
std::vector< moodycamel::ConcurrentQueue< Event_data > * > cl_tx_queue_
Definition: receiver.h:93