Loading...
Searching...
No Matches
master_board_interface.h
Go to the documentation of this file.
1#ifndef MASTERBOARDINTERFACE_H
2#define MASTERBOARDINTERFACE_H
3
4#include <mutex>
5#include <chrono>
6
7#ifndef __APPLE__
9#endif
14
15#define MAX_HIST 20
16
18{
19public:
20 MasterBoardInterface(const std::string &if_name, bool listener_mode = false);
23 int Init();
24 int Stop();
25 static void KeyboardStop(int signum);
26 void SetMasterboardTimeoutMS(uint8_t); //Set the Master board timeout in ms
27 int SendInit();
28 int SendCommand(); //Send the command packet to the master board
29
30 void ParseSensorData(); //Parse and convert the latest received sensor data. User need to call this before reading any field.
31
32 void PrintIMU(); //Print IMU data on stdout. Usefull for debug.
33 void PrintPowerBoard();
34 void PrintADC(); //Print ACD data on stdout. Usefull for debug.
35 void PrintMotors(); //Print motors data on stdout. Usefull for debug.
36 void PrintMotorDrivers(); //Print motor drivers data on stdout. Usefull for debug. void PrintMotors(); //Print Motors data on stdout. Usefull for debug.
37 void PrintStats();
38
39 void ResetTimeout(); // Reset the interface after at timeout to send packets again
40 bool IsTimeout(); // Check if a timeout has been triggered because the master board did not respond
41
42 bool IsAckMsgReceived();
43
44 int GetSessionId();
46
47 uint32_t GetSensorsSent();
48 uint32_t GetSensorsLost();
49 uint32_t GetCmdSent();
50 uint32_t GetCmdLost();
51 uint16_t GetLastRecvCmdIndex();
52 uint16_t GetCmdPacketIndex();
53 int GetSensorHistogram(int index);
54 int GetCmdHistogram(int index);
55
57
58private:
59 static MasterBoardInterface* instance;
60 void callback(uint8_t src_mac[6], uint8_t *data, int len);
61 uint8_t my_mac_[6]; // = {0xa0, 0x1d, 0x48, 0x12, 0xa0, 0xc5}; //{0xF8, 0x1A, 0x67, 0xb7, 0xEB, 0x0B};
62 uint8_t dest_mac_[6]; //Broatcast to prevent acknoledgment behaviour
63 LINK_manager *link_handler_ = NULL;
64 uint8_t payload_[127];
65 std::string if_name_;
66 bool listener_mode = false; // listener mode, allows to gather sensor packets data and to get rid of session id checking
67 // doesn't allow to send commands
68 struct command_packet_t command_packet;
69 struct sensor_packet_t sensor_packet;
70 struct dual_motor_driver_sensor_data_t dual_motor_driver_sensor_data[N_SLAVES];
71 struct imu_data_t imu_data;
72 struct powerboard_data_t powerboard_data;
73
74 bool first_sensor_received = false;
75
76 // PACKET LOSS STATS
77 //SENSOR PACKETS
78 uint16_t nb_sensors_recv = 0;
79 uint16_t last_sensor_index = 0;
80 uint32_t nb_sensors_sent = 0;
81 uint32_t nb_sensors_lost = 0;
82 uint16_t last_recv_cmd_index = 0;
83 int histogram_lost_sensor_packets[MAX_HIST]; //histogram_lost_packets[0] is the number of single packet loss, histogram_lost_packets[1] is the number of two consecutive packet loss, etc...
84
85
86 //COMMAND PACKETS
87 uint16_t cmd_packet_index = 0;
88 uint16_t last_cmd_packet_loss = 0;
89 uint32_t nb_cmd_sent = 0;
90 uint32_t nb_cmd_lost = 0;
91 int histogram_lost_cmd_packets[MAX_HIST]; //histogram_lost_packets[0] is the number of single packet loss, histogram_lost_packets[1] is the number of two consecutive packet loss, etc...
92
93
94 std::mutex received_packet_mutex;
95
96 // Time duration [ms] after which the MasterBoardInterface shuts down if the
97 // master board is not responding while waiting for acknowledge msg (timeout)
98 std::chrono::milliseconds t_before_shutdown_ack{2500};
99
100 // Time duration [ms] after which the MasterBoardInterface shuts down if the
101 // master board is not responding (timeout)
102 std::chrono::milliseconds t_before_shutdown_control{50};
103
104 // Time point that is updated each time a packet is received
105 std::chrono::high_resolution_clock::time_point t_last_packet =
106 std::chrono::high_resolution_clock::now();
107 // We initialize this value only upon the first call of SendCommand
108 bool first_command_sent_ = false;
109
110
111 // Is true if the MasterBoardInterface has been shut down due to timeout
112 bool timeout = false;
113
114 struct init_packet_t init_packet;
115 struct ack_packet_t ack_packet;
116
117 int session_id = -1; // -1 means not set
118
119 void GenerateSessionId();
120
121 bool init_sent = false;
122 bool ack_received = false;
123
124public:
127
128 // Set functions for Python binding with Boost
129 void set_motors(Motor motors []); // See definition in .cpp
130 void set_motor_drivers(MotorDriver motor_drivers []); // See definition in .cpp
131
132 // Get functions for Python binding with Boost
133 MotorDriver* GetDriver(int i) { return &(this->motor_drivers[i]); };
134 Motor* GetMotor(int i) { return &(this->motors[i]); };
135 float imu_data_accelerometer(int i) { return (this->imu_data.accelerometer[i]); };
136 float imu_data_gyroscope(int i) { return (this->imu_data.gyroscope[i]); };
137 float imu_data_attitude(int i) { return (this->imu_data.attitude[i]); };
138 float imu_data_linear_acceleration(int i) { return (this->imu_data.linear_acceleration[i]); };
139 float powerboard_current() { return powerboard_data.current_bus; };
140 float powerboard_voltage() { return powerboard_data.voltage_bus; };
141 float powerboard_energy() { return powerboard_data.energy_bus; };
142 imu_data_t get_imu_data() const { return imu_data; }
143
144};
145
146#endif
uint8_t src_mac[6]
Definition ETHERNET_types.h:1
Definition master_board_interface.h:18
uint32_t GetCmdSent()
Definition master_board_interface.cpp:592
int Init()
Definition master_board_interface.cpp:39
float imu_data_attitude(int i)
Definition master_board_interface.h:137
void PrintADC()
Definition master_board_interface.cpp:451
Motor * GetMotor(int i)
Definition master_board_interface.h:134
void PrintIMU()
Definition master_board_interface.cpp:425
MotorDriver motor_drivers[N_SLAVES]
Definition master_board_interface.h:126
bool IsAckMsgReceived()
Definition master_board_interface.cpp:525
uint32_t GetSensorsLost()
Definition master_board_interface.cpp:590
void set_motor_drivers(MotorDriver motor_drivers[])
Definition master_board_interface.cpp:549
bool IsTimeout()
Definition master_board_interface.cpp:519
MotorDriver * GetDriver(int i)
Definition master_board_interface.h:133
~MasterBoardInterface()
Definition master_board_interface.cpp:28
void PrintStats()
Definition master_board_interface.cpp:558
imu_data_t get_imu_data() const
Definition master_board_interface.h:142
void PrintPowerBoard()
Definition master_board_interface.cpp:443
float imu_data_accelerometer(int i)
Definition master_board_interface.h:135
float powerboard_voltage()
Definition master_board_interface.h:140
void ResetTimeout()
Definition master_board_interface.cpp:511
void ParseSensorData()
Definition master_board_interface.cpp:361
void PrintMotorDrivers()
Definition master_board_interface.cpp:490
float imu_data_gyroscope(int i)
Definition master_board_interface.h:136
void PrintMotors()
Definition master_board_interface.cpp:467
int SendCommand()
Definition master_board_interface.cpp:143
int GetProtocolVersion()
Definition master_board_interface.cpp:535
float imu_data_linear_acceleration(int i)
Definition master_board_interface.h:138
int GetSessionId()
Definition master_board_interface.cpp:530
int SendInit()
Definition master_board_interface.cpp:104
int GetSensorHistogram(int index)
Definition master_board_interface.cpp:600
void SetMasterboardTimeoutMS(uint8_t)
Motor motors[N_SLAVES *2]
Definition master_board_interface.h:125
float powerboard_energy()
Definition master_board_interface.h:141
int Stop()
Definition master_board_interface.cpp:87
void set_motors(Motor motors[])
Definition master_board_interface.cpp:540
int GetCmdHistogram(int index)
Definition master_board_interface.cpp:609
uint16_t GetCmdPacketIndex()
Definition master_board_interface.cpp:598
void ResetPacketLossStats()
Definition master_board_interface.cpp:618
float powerboard_current()
Definition master_board_interface.h:139
static void KeyboardStop(int signum)
Definition master_board_interface.cpp:95
uint32_t GetSensorsSent()
Definition master_board_interface.cpp:588
uint32_t GetCmdLost()
Definition master_board_interface.cpp:594
uint16_t GetLastRecvCmdIndex()
Definition master_board_interface.cpp:596
Definition motor_driver.h:8
Definition motor.h:6
#define N_SLAVES
Definition defines.h:5
uint16_t session_id
Definition defines.h:0
#define MAX_HIST
Definition master_board_interface.h:15
Definition defines.h:100
Definition defines.h:87
Definition defines.h:59
Definition defines.h:38
float attitude[3]
Definition defines.h:41
float accelerometer[3]
Definition defines.h:39
float gyroscope[3]
Definition defines.h:40
float linear_acceleration[3]
Definition defines.h:42
Definition defines.h:95
Definition defines.h:52
float voltage_bus
Definition defines.h:54
float energy_bus
Definition defines.h:55
float current_bus
Definition defines.h:53
Definition defines.h:76