forked from fquitin/mmwave_code
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mmwave_array_turnRxOn.cpp
141 lines (104 loc) · 4.96 KB
/
mmwave_array_turnRxOn.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//
// Copyright ULB BEAMS-EE
// Author: François QUITIN
//
#include <uhd/exception.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/utils/thread.hpp>
#include <stdint.h>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
#include <boost/math/special_functions/round.hpp>
#include <boost/program_options.hpp>
#include <chrono>
#include <csignal>
#include <iostream>
#include <string>
#include <thread>
#include <fstream>
#include "constants.h"
#include "aip_functions.h"
#include "/usr/local/include/libserial/SerialPort.h"
using namespace LibSerial ;
namespace po = boost::program_options;
bool stop_signal_called = false;
/***********************************************************************
* Main function
**********************************************************************/
int UHD_SAFE_MAIN(int argc, char* argv[])
{
// variables to be set by po
std::string name_serial_port;
int ver_aip;
int nbr_directions = 3;
float sleeptime;
// The following vector contains the phase shift between antennas (in degrees)
std::string possible_degrees[17] = {"DEG_0","DEG_11_25","DEG_22_25","DEG_33_75","DEG_45","DEG_56_25","DEG_67_5","DEG_78_75","DEG_90","DEG_101_2","DEG_112_5","DEG_123_7","DEG_135","DEG_146_2","DEG_157_5","DEG_168_7","DEG_180"};
// The beam directions corresponding to the previous phase shifts are given below (in degrees)
std::string possible_angles[17] = {"0.00", "4.00", "8.00", "11.50", "15.50", "19.50", "23.50", "28.00", "32.50", "37.00", "41.50", "46.50", "52.00", "57.50", "64.50", "72.00", "78.00"};
std::string possible_directions[4] = {"LEFT", "RIGHT", "UP", "DOWN"};
int gain = 0;
int gain_list[4] = {0,0,0,0};
std::string active_list[4] = {"1111", "1111", "1111", "1111"};
// setup the program options
po::options_description desc("Allowed options");
// clang-format off
desc.add_options()
("help", "help message")
("serialport", po::value<std::string>(&name_serial_port)->default_value("/dev/ttyUSB0"), "Serial port of the mmWave array")
("sleeptime", po::value<float>(&sleeptime)->default_value(10), "Time before arrays shuts down (s)")
("ver-aip", po::value<int>(&ver_aip)->default_value(0), "verbose mmWave arrays on or off")
;
// clang-format on
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
// print the help message
if (vm.count("help")) {
std::cout << boost::format("mmWave array tester") << std::endl;
return ~0;
}
// ======================================
// Open serial port of the mmWave array
// ======================================
// Create and open the serial port for communication with the mmWave array.
std::cout << boost::format("Create and open the serial port for mmWave array on %s...") % name_serial_port << std::endl;
SerialPort my_serial_port( name_serial_port );
std::string my_string;
// Set serial port parameters
std::cout << boost::format("Set serial port parameters ...") << std::endl;
my_serial_port.SetBaudRate( LibSerial::BaudRate::BAUD_115200 );
my_serial_port.SetCharacterSize( LibSerial::CharacterSize::CHAR_SIZE_8 );
my_serial_port.SetStopBits( LibSerial::StopBits::STOP_BITS_1 ) ;
my_serial_port.SetParity( LibSerial::Parity::PARITY_NONE );
int mode_init = 2;
std::cout << boost::format("Setting AiP to %s - %s °") % "UP" % "0" << std::endl;
send_to_aip(&my_serial_port, "DEG_0", "UP", gain_list, gain, active_list, mode_init, ver_aip);
std::cout << boost::format("Setting AiP to %s - %s °") % "UP" % "0" << std::endl;
send_to_aip(&my_serial_port, "DEG_0", "UP", gain_list, gain, active_list, mode_init, ver_aip);
std::cout << boost::format("Setting AiP to %s - %s °") % "LEFT" % "0" << std::endl;
send_to_aip(&my_serial_port, "DEG_0", "LEFT", gain_list, gain, active_list, mode_init, ver_aip);
// ==============================================================
// Start looping over all AiP directions and Rx baseband samples
// ==============================================================
init_aip(&my_serial_port, ver_aip);
std::string degrees;
std::string angle;
std::string direction;
int mode = 2; // 0 for TX/RX off, 1 for TX, 2 for RX
direction = possible_directions[0];
angle = possible_angles[0];
std::cout << boost::format("Setting AiP to %s - %s °") % direction % angle << std::endl;
send_to_aip_fast(&my_serial_port, degrees, direction, gain_list, gain, active_list, mode, ver_aip);
sleep(sleeptime);
// Disable AiP
disable_aip(&my_serial_port, ver_aip);
// Close serial port
std::cout << std::endl << "Close serial port ..." << std::endl << std::endl;
my_serial_port.Close();
// finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
return EXIT_SUCCESS;
}