-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #93 from hytech-racing/CASE_testbranch
Case testbranch
- Loading branch information
Showing
27 changed files
with
1,143 additions
and
218 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
```mermaid | ||
flowchart TD | ||
ethernet[ethernet port] --> qnethernet[encoded ethernet data packets] | ||
qnethernet --> port[protobuf union msgs port] | ||
port --> ht_eth[HT ethernet interface] | ||
ht_eth --> union_dec[union msgs splitter] | ||
union_dec --> int1[interface 1 message buffer] | ||
union_dec --> int2[interface 2 message buffer] | ||
union_dec --> intN[interface N message buffer] | ||
``` | ||
|
||
## explanation | ||
|
||
### receiving | ||
Packets stream over ethernet and hit the ethernet port itself. The ethernet library has an internal queue for the UDP packets received. We know that a specific port id (say 4521) all messages will be a protobuf union msg that can contain only one of the types of messages that we will be sending (config control, TCU status, CASE msgs, etc.) and the union decoder method in the ethernet interface itself will handle this. The ethernet shall be able to receive multiple messages in one loop (of a limited number) and in between iterations of the loop the ethernet driver will hold the un-parsed messages in it's queue. | ||
|
||
The union message decoder will handle parsing of all of the messages in the queue and will be able to determine what message the union pb packet holds. If all messages of a specific type are needed, The message decoder will then add the decoded particular protobuf message struct to the message queue in the respective interface that way if multiple messages of the same type appear in one loop iteration they can all be processed by the underlying system / interface. If the interface just needs the latest version of a message each loop, the decoder will just update the message instance in its respective interface. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#ifndef INTERFACEPARAMS | ||
#define INTERFACEPARAMS | ||
#include "NativeEthernet.h" | ||
|
||
namespace EthParams | ||
{ | ||
uint8_t default_MCU_MAC_address[6] = | ||
{0x04, 0xe9, 0xe5, 0x10, 0x1f, 0x22}; | ||
|
||
const IPAddress default_MCU_ip(192, 168, 1, 30); | ||
const IPAddress default_TCU_ip(192, 168, 1, 68); | ||
|
||
const uint16_t default_protobuf_send_port = 2001; | ||
const uint16_t default_protobuf_recv_port = 2000; | ||
|
||
const IPAddress default_netmask(255, 255, 255, 0); | ||
const IPAddress default_gateway(192, 168, 0, 1); | ||
|
||
const uint16_t default_buffer_size = 512; | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
#ifndef PARAMETERINTERFACE | ||
#define PARAMETERINTERFACE | ||
#include "MCUStateMachine.h" | ||
#include "ht_eth.pb.h" | ||
#include "default_config.h" | ||
|
||
// yes, i know this is a singleton. im prototyping rn. | ||
// TODO review if I can just give this a pointer to an ethernet port | ||
class ParameterInterface | ||
{ | ||
public: | ||
ParameterInterface(): current_car_state_(CAR_STATE::STARTUP), params_need_sending_(false), config_(DEFAULT_CONFIG) {} | ||
|
||
void update_car_state(const CAR_STATE& state) | ||
{ | ||
current_car_state_ = state; | ||
} | ||
void update_config(const config &config) | ||
{ | ||
if(static_cast<int>(current_car_state_) < 5 ){ | ||
config_ = config; | ||
} | ||
|
||
} | ||
config get_config() | ||
{ | ||
return config_; | ||
} | ||
void set_params_need_sending() | ||
{ | ||
params_need_sending_ = true; | ||
} | ||
void reset_params_need_sending() | ||
{ | ||
params_need_sending_ = false; | ||
} | ||
bool params_need_sending() { return params_need_sending_; } | ||
|
||
private: | ||
CAR_STATE current_car_state_; | ||
bool params_need_sending_ = false; | ||
config config_; | ||
|
||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
#ifndef PROTOBUFMSGINTERFACE | ||
#define PROTOBUFMSGINTERFACE | ||
|
||
#include "ht_eth.pb.h" | ||
#include "pb_encode.h" | ||
#include "pb_decode.h" | ||
#include "pb_common.h" | ||
#include "ParameterInterface.h" | ||
#include "circular_buffer.h" | ||
#include "NativeEthernet.h" | ||
#include "MCU_rev15_defs.h" | ||
|
||
|
||
struct ETHInterfaces | ||
{ | ||
ParameterInterface* param_interface; | ||
}; | ||
|
||
using recv_function_t = void (*)(const uint8_t* buffer, size_t packet_size, ETHInterfaces& interfaces); | ||
|
||
// this should be usable with arbitrary functions idk something | ||
void handle_ethernet_socket_receive(EthernetUDP* socket, recv_function_t recv_function, ETHInterfaces& interfaces) | ||
{ | ||
int packet_size = socket->parsePacket(); | ||
if(packet_size > 0) | ||
{ | ||
Serial.println("packet size"); | ||
Serial.println(packet_size); | ||
uint8_t buffer[EthParams::default_buffer_size]; | ||
size_t read_bytes = socket->read(buffer, sizeof(buffer)); | ||
socket->read(buffer, UDP_TX_PACKET_MAX_SIZE); | ||
recv_function(buffer, read_bytes, interfaces); | ||
} | ||
} | ||
|
||
template <typename pb_struct> | ||
bool handle_ethernet_socket_send_pb(EthernetUDP* socket, const pb_struct& msg, const pb_msgdesc_t* msg_desc) | ||
{ | ||
socket->beginPacket(EthParams::default_TCU_ip, EthParams::default_protobuf_send_port); | ||
|
||
uint8_t buffer[EthParams::default_buffer_size]; | ||
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); | ||
if (!pb_encode(&stream, msg_desc, &msg)) { | ||
// You can handle error more explicitly by looking at stream.errmsg | ||
return false; | ||
} | ||
auto message_length = stream.bytes_written; | ||
socket->write(buffer, message_length); | ||
socket->endPacket(); | ||
return true; | ||
} | ||
|
||
// | ||
void recv_pb_stream_union_msg(const uint8_t *buffer, size_t packet_size, ETHInterfaces& interfaces) | ||
{ | ||
pb_istream_t stream = pb_istream_from_buffer(buffer, packet_size); | ||
HT_ETH_Union msg = HT_ETH_Union_init_zero; | ||
if (pb_decode(&stream, HT_ETH_Union_fields, &msg)) | ||
{ | ||
Serial.println("decoded!"); | ||
|
||
switch (msg.which_type_union) | ||
{ | ||
case HT_ETH_Union_config__tag: | ||
interfaces.param_interface->update_config(msg.type_union.config_); | ||
break; | ||
case HT_ETH_Union_get_config__tag: | ||
interfaces.param_interface->set_params_need_sending(); | ||
break; | ||
default: | ||
break; | ||
} | ||
} | ||
} | ||
|
||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.