Skip to content

Commit 561dd14

Browse files
authored
Merge pull request #354 from HyperloopUPV-H8/development
merge develop into main
2 parents 46da66e + 999bb43 commit 561dd14

47 files changed

Lines changed: 1067 additions & 149 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"**/build": true,
1111
"**/cmake_install.cmake": true,
1212
"**/CMakeFiles": true,
13-
"**/CMakeLists.txt": true,
13+
"**/CMakeLists.txt": false,
1414
"**/compile_commands.json": true,
1515
"**/Debug": true,
1616
"**/libst-lib.a": true,

Inc/C++Utilities/CppUtils.hpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
namespace chrono = std::chrono;
4040
namespace placeholders = std::placeholders;
4141

42-
using std::map;
4342
using std::array;
43+
using std::map;
4444
using std::span;
4545
using std::pair;
4646
using std::function;
@@ -57,13 +57,9 @@ using std::integral_constant;
5757
using std::snprintf;
5858
using std::make_unique;
5959
using std::unique_ptr;
60-
using std::unordered_map;
61-
using std::vector;
62-
using std::queue;
6360
using std::hash;
6461
using std::unordered_map;
6562
using std::vector;
6663
using std::queue;
67-
using std::map;
6864
using std::stringstream;
6965
using std::move;

Inc/HALAL/HALAL.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@
2727
#include "CORDIC/CORDIC.hpp"
2828

2929
namespace HALAL {
30-
void start(string ip, string subnet_mask, string gateway, UART::Peripheral& printf_peripheral);
30+
void start(IPV4 ip, IPV4 subnet_mask, IPV4 gateway, UART::Peripheral& printf_peripheral);
3131
}

Inc/HALAL/Models/IPV4/IPV4.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class IPV4{
2626
IPV4();
2727
IPV4(const char* address);
2828
IPV4(string address);
29+
IPV4(ip_addr_t address);
2930

3031
void operator=(const char* address);
3132
};

Inc/HALAL/Models/Packets/Order.hpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ template<size_t BufferLength,class... Types> requires NotCallablePack<Types*...>
3636
class StackOrder : public StackPacket<BufferLength,Types...>, public Order{
3737
public:
3838
StackOrder(uint16_t id,void(*callback)(void), Types*... values) : StackPacket<BufferLength,Types...>(id,values...), callback(callback) {orders[id] = this;}
39-
// StackOrder(uint16_t id, Types*... values) : StackPacket<BufferLength,Types...>(id,values...) {orders[id] = this;}
39+
StackOrder(uint16_t id, Types*... values) : StackPacket<BufferLength,Types...>(id,values...) {orders[id] = this;}
4040
void(*callback)(void) = nullptr;
4141
void set_callback(void(*callback)(void)) override {
4242
this->callback = callback;
@@ -50,7 +50,7 @@ class StackOrder : public StackPacket<BufferLength,Types...>, public Order{
5050
void parse(void* data) override {
5151
StackPacket<BufferLength,Types...>::parse(data);
5252
}
53-
void parse(OrderProtocol* socket, void* data){
53+
void parse(OrderProtocol* socket, void* data) override{
5454
parse(data);
5555
}
5656
size_t get_size() override {
@@ -59,14 +59,18 @@ class StackOrder : public StackPacket<BufferLength,Types...>, public Order{
5959
uint16_t get_id() override {
6060
return StackPacket<BufferLength,Types...>::get_id();
6161
}
62+
63+
void set_pointer(size_t index, void* pointer) override{
64+
StackPacket<BufferLength,Types...>::set_pointer(index, pointer);
65+
}
6266
};
6367

6468
#if __cpp_deduction_guides >= 201606
6569
template<class... Types> requires NotCallablePack<Types*...>
6670
StackOrder(uint16_t id,void(*callback)(void), Types*... values)->StackOrder<(!has_container<Types...>::value)*total_sizeof<Types...>::value, Types...>;
6771

68-
//template<class... Types> requires NotCallablePack<Types*...>
69-
//StackOrder(uint16_t id, Types*... values)->StackOrder<(!has_container<Types...>::value)*total_sizeof<Types...>::value, Types...>;
72+
template<class... Types> requires NotCallablePack<Types*...>
73+
StackOrder(uint16_t id, Types*... values)->StackOrder<(!has_container<Types...>::value)*total_sizeof<Types...>::value, Types...>;
7074
#endif
7175

7276
class HeapOrder : public HeapPacket, public Order{
@@ -99,4 +103,8 @@ class HeapOrder : public HeapPacket, public Order{
99103
uint16_t get_id() override {
100104
return HeapPacket::get_id();
101105
}
106+
void set_pointer(size_t index, void* pointer) override{
107+
HeapPacket::set_pointer(index, pointer);
108+
}
109+
102110
};

Inc/HALAL/Models/Packets/Packet.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class Packet{
1010
virtual void parse(void* data) = 0;
1111
virtual size_t get_size() = 0;
1212
virtual uint16_t get_id() = 0;
13+
virtual void set_pointer(size_t index, void* pointer) = 0;
1314
static uint16_t get_id(void* data) {
1415
return *((uint16_t*)data);
1516
}
@@ -61,6 +62,10 @@ class StackPacket : public Packet{
6162
uint16_t get_id() override {
6263
return id;
6364
}
65+
66+
void set_pointer(size_t index, void* pointer) override{
67+
values[index]->set_pointer(pointer);
68+
}
6469
};
6570

6671
template<class... Types>
@@ -123,6 +128,10 @@ class StackPacket<0, Types...> : public Packet{
123128
return id;
124129
}
125130

131+
void set_pointer(size_t index, void* pointer) override{
132+
values[index]->set_pointer(pointer);
133+
}
134+
126135
~StackPacket() {
127136
if (buffer != nullptr) delete[] buffer;
128137
}
@@ -145,6 +154,8 @@ class StackPacket<0> : public Packet{
145154
size_t get_size() override {
146155
return sizeof(id);
147156
}
157+
158+
void set_pointer(size_t index, void* pointer) override {};
148159
};
149160

150161

@@ -210,6 +221,10 @@ class HeapPacket : public Packet{
210221
return id;
211222
}
212223

224+
void set_pointer(size_t index, void* pointer) override{
225+
values[index]->set_pointer(pointer);
226+
}
227+
213228
~HeapPacket() {
214229
if(buffer != nullptr) delete[] buffer;
215230
}

Inc/HALAL/Models/Packets/PacketValue.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class PacketValue<> {
1414
PacketValue() = default;
1515
~PacketValue() = default;
1616
virtual void* get_pointer() = 0;
17+
virtual void set_pointer(void* pointer) = 0;
1718
virtual size_t get_size() = 0;
1819
virtual void parse(void* data) = 0;
1920
virtual void copy_to(void* data) = 0;
@@ -30,6 +31,11 @@ class PacketValue<Type>: public PacketValue<> {
3031
void* get_pointer() override {
3132
return src;
3233
}
34+
35+
void set_pointer(void* pointer){
36+
src = (Type*)pointer;
37+
}
38+
3339
size_t get_size() override {
3440
return sizeof(Type);
3541
}
@@ -53,6 +59,11 @@ class PacketValue<double>: public PacketValue<> {
5359
void* get_pointer() override {
5460
return src;
5561
}
62+
63+
void set_pointer(void* pointer){
64+
src = (double*)pointer;
65+
}
66+
5667
size_t get_size() override {
5768
return sizeof(double);
5869
}
@@ -79,6 +90,11 @@ class PacketValue<Type>: public PacketValue<> {
7990
void* get_pointer() override {
8091
return src->data();
8192
}
93+
94+
void set_pointer(void* pointer){
95+
src = (Type*)pointer;
96+
}
97+
8298
size_t get_size() override {
8399
return src->size()*sizeof(typename Type::value_type);
84100
}
@@ -106,6 +122,11 @@ class PacketValue<string> : public PacketValue<>{
106122
void* get_pointer() override {
107123
return src->data();
108124
}
125+
126+
void set_pointer(void* pointer){
127+
src = (string*)pointer;
128+
}
129+
109130
size_t get_size() override {
110131
return strlen(src->c_str()) + 1;
111132
}
@@ -128,6 +149,11 @@ class PacketValue<Type(&)[N]>: public PacketValue<> {
128149
void* get_pointer() override {
129150
return src;
130151
}
152+
153+
void set_pointer(void* pointer){
154+
src = (Type(*)[N])pointer;
155+
}
156+
131157
size_t get_size() override {
132158
return N*sizeof(Type);
133159
}
@@ -155,6 +181,11 @@ class PacketValue<Type*(&)[N]>: public PacketValue<> {
155181
void* get_pointer() override {
156182
return src;
157183
}
184+
185+
void set_pointer(void* pointer){
186+
src = (Type*(*)[N])pointer;
187+
}
188+
158189
size_t get_size() override {
159190
return N*sizeof(Type);
160191
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* SpiPacket.hpp
3+
*
4+
* Created on: 15 nov. 2023
5+
* Author: ricardo
6+
*/
7+
8+
#pragma once
9+
10+
#include "ErrorHandler/ErrorHandler.hpp"
11+
12+
13+
class SPIPacket{
14+
public:
15+
static map<uint16_t, SPIPacket*> SPIPacketsByID;
16+
uint16_t id;
17+
uint8_t* master_data;
18+
uint16_t master_data_size;
19+
uint8_t* slave_data;
20+
uint16_t slave_data_size;
21+
uint16_t greater_data_size;
22+
23+
/**
24+
* @brief constructor of SPIPacket. The SPIPacket uses the first byte of the data arrays to coordinate the packet id, and builds the arrays with 1 more byte of space.
25+
*
26+
*/
27+
SPIPacket(uint16_t id, uint16_t master_data_size, uint16_t slave_data_size) : id(id), master_data_size(master_data_size), slave_data_size(slave_data_size){
28+
if(id == 0){
29+
ErrorHandler("Cannot use 0 as the SPIPacketID, as it is reserved to the no packet ready signal");
30+
}
31+
if(master_data_size > slave_data_size){
32+
greater_data_size = master_data_size+2;
33+
}else{
34+
greater_data_size = slave_data_size+2;
35+
}
36+
master_data = new uint8_t[greater_data_size];
37+
slave_data = new uint8_t[greater_data_size];
38+
master_data[0] = (uint8_t) id;
39+
master_data[1] = (uint8_t) (id>>8);
40+
slave_data[0] = (uint8_t) id;
41+
slave_data[1] = (uint8_t) (id>>8);
42+
SPIPacket::SPIPacketsByID[id] = this;
43+
}
44+
45+
SPIPacket(uint16_t id, uint8_t* master_data, uint8_t* slave_data, uint16_t shared_data_size) :
46+
id(id), master_data(master_data), master_data_size(shared_data_size), slave_data(slave_data), slave_data_size(shared_data_size){
47+
if(id == 0){
48+
ErrorHandler("Cannot use 0 as the SPIPacketID, as it is reserved to the no packet ready signal");
49+
}
50+
51+
}
52+
53+
};
54+
55+

Inc/HALAL/Services/Communication/Ethernet/TCP/ServerSocket.hpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,18 @@
1515

1616
#define PBUF_POOL_MEMORY_DESC_POSITION 8
1717

18+
/**
19+
* @brief ServerSocket class
20+
*/
1821
class ServerSocket : public OrderProtocol{
1922
public:
2023

2124
enum ServerState{
2225
INACTIVE,
2326
LISTENING,
2427
ACCEPTED,
25-
CLOSING
28+
CLOSING,
29+
CLOSED
2630
};
2731

2832
static unordered_map<uint32_t,ServerSocket*> listening_sockets;
@@ -31,6 +35,7 @@ class ServerSocket : public OrderProtocol{
3135
queue<struct pbuf*> rx_packet_buffer;
3236
IPV4 local_ip;
3337
uint32_t local_port;
38+
IPV4 remote_ip;
3439
ServerState state;
3540
static uint8_t priority;
3641
struct tcp_pcb* client_control_block;
@@ -39,16 +44,39 @@ class ServerSocket : public OrderProtocol{
3944
ServerSocket();
4045
ServerSocket(ServerSocket&& other);
4146
ServerSocket(IPV4 local_ip, uint32_t local_port);
42-
ServerSocket(string local_ip, uint32_t local_port);
4347
ServerSocket(EthernetNode local_node);
4448
~ServerSocket();
4549

4650
void operator=(ServerSocket&& other);
4751

52+
/**
53+
* @brief ends the connection between the server and the client.
54+
*/
4855
void close();
4956

57+
/**
58+
* @brief process the data received by the client orders. It is meant to be called only by Lwip on the receive_callback
59+
*
60+
* reads all the data received by the server in the ethernet buffer, packet by packet.
61+
* Then, for each packet, it processes it depending on the order id (default behavior is not process) and removes it from the buffer.
62+
* This makes so the receive_callback (and thus the Socket) can only process declared orders, and ignores all other packets.
63+
*/
5064
void process_data();
5165

66+
/**
67+
* @brief saves the order data into the tx_packet_buffer so it can be sent when a connection is accepted
68+
*
69+
* @param order the order to send, which contains the data and id of the message
70+
* @return true if the data could be allocated in the buffer, false otherwise
71+
*/
72+
bool add_order_to_queue(Order& order);
73+
74+
/**
75+
* @brief puts the order data into the tx_packet_buffer and sends all the data in the buffer to the client
76+
*
77+
* @param order the order to send, which contains the data and id of the message
78+
* @return true if the data was sent successfully, false otherwise
79+
*/
5280
bool send_order(Order& order) override{
5381
if(state != ACCEPTED){
5482
return false;
@@ -75,8 +103,14 @@ class ServerSocket : public OrderProtocol{
75103
return true;
76104
}
77105

106+
/**
107+
* @brief sends all the binary data saved in the tx_packet_buffer to the connected client.
108+
*/
78109
void send();
79110

111+
/**
112+
* @return true if a connection with the client was established, false otherwise
113+
*/
80114
bool is_connected();
81115

82116
private:

0 commit comments

Comments
 (0)