Skip to content

Commit

Permalink
pushing up
Browse files Browse the repository at this point in the history
  • Loading branch information
RCMast3r committed May 5, 2024
2 parents 14c4a28 + 14a3ea8 commit 078fb50
Show file tree
Hide file tree
Showing 13 changed files with 327 additions and 85 deletions.
17 changes: 17 additions & 0 deletions ETHERNET.md
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.
18 changes: 18 additions & 0 deletions include/MCU_rev15_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@
#define __MCU15_H__

#include "PedalsSystem.h"
#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, 69);

const uint16_t default_protobuf_send_port = 2000;
const uint16_t default_protobuf_recv_port = 2001;

const IPAddress default_netmask(255, 255, 255, 0);
const IPAddress default_gateway(192, 168, 0, 1);

const uint16_t default_buffer_size = 512;
}

// pindefs
const int ADC1_CS = 34;
Expand Down
45 changes: 45 additions & 0 deletions lib/interfaces/include/ParameterInterface.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef PARAMETERINTERFACE
#define PARAMETERINTERFACE
#include "MCUStateMachine.h"
#include "ht_eth.pb.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_({}) {}

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
78 changes: 78 additions & 0 deletions lib/interfaces/include/ProtobufMsgInterface.h
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
52 changes: 0 additions & 52 deletions lib/library.json

This file was deleted.

1 change: 1 addition & 0 deletions lib/systems/include/CASESystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "DrivetrainSystem.h"
#include "SteeringSystem.h"
#include "MCUStateMachine.h"
#include "ProtobufMsgInterface.h"

struct CASEConfiguration
{
Expand Down
2 changes: 1 addition & 1 deletion lib/systems/include/TorqueControllers.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#include "accel_lookup.h"

#include "TorqueControllersData.h"
#include "PID_TV.h"


/* CONTROLLER CONSTANTS */

Expand Down
47 changes: 44 additions & 3 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ test_ignore=
test_interfaces*
lib_deps=
git+ssh://git@github.com/hytech-racing/CASE_lib.git#v39
https://github.com/tonton81/Circular_Buffer.git
https://github.com/hytech-racing/shared_firmware_systems.git

[env:teensy41]
Expand All @@ -29,7 +30,9 @@ build_src_filter =
-<**/*.cpp>
+<main.cpp>
build_unflags = -std=gnu++11
build_flags = -std=c++17
build_flags =
-std=c++17
-D TEENSY_OPT_SMALLEST_CODE
check_tool = clangtidy
check_src_filters =
+<include/*>
Expand All @@ -42,15 +45,19 @@ board = teensy41
framework = arduino
upload_protocol = teensy-cli
extra_scripts = pre:extra_script.py

lib_deps =
SPI
https://github.com/hytech-racing/shared_firmware_interfaces.git
https://github.com/hytech-racing/shared_firmware_systems.git
https://github.com/RCMast3r/spi_libs
https://github.com/tonton81/FlexCAN_T4
https://github.com/vjmuzik/NativeEthernet
https://github.com/vjmuzik/FNET
https://github.com/RCMast3r/hytech_can#testing_new_inv_ids
https://github.com/hytech-racing/HT_CAN/releases/download/85/can_lib.tar.gz
git+ssh://git@github.com/hytech-racing/CASE_lib.git#v45
Nanopb
https://github.com/hytech-racing/HT_params/releases/download/2024-05-02T01_39_59/ht_eth_pb_lib.tar.gz

[env:test_can_on_teensy]
lib_ignore =
Expand Down Expand Up @@ -79,6 +86,40 @@ upload_protocol = teensy-cli
lib_deps =
https://github.com/tonton81/FlexCAN_T4
https://github.com/RCMast3r/hytech_can
https://github.com/hytech-racing/HT_CAN/releases/latest/download/can_lib.tar.gz
https://github.com/hytech-racing/HT_CAN/releases/download/80/can_lib.tar.gz

[env:test_ethernet_on_teensy]
lib_ignore =
mock_interfaces
mock_systems

; including only the current main file for compiling to keep old main still around for now while
; refactoring
; build_src_filter =
; -<**/*.cpp>
test_ignore=
test_systems*
build_src_filter =
-<**/*.cpp>
+<main_ethernet_test.cpp>
build_unflags = -std=gnu++11
build_flags =
-std=c++17
-D TEENSY_OPT_SMALLEST_CODE
platform = teensy
board = teensy41
framework = arduino
upload_protocol = teensy-cli
lib_deps =
SPI
Nanopb
https://github.com/hytech-racing/HT_params/releases/download/2024-05-02T01_39_59/ht_eth_pb_lib.tar.gz
https://github.com/hytech-racing/shared_firmware_interfaces.git
https://github.com/hytech-racing/shared_firmware_systems.git
https://github.com/tonton81/FlexCAN_T4
https://github.com/vjmuzik/NativeEthernet
https://github.com/vjmuzik/FNET
https://github.com/RCMast3r/hytech_can#testing_new_inv_ids
https://github.com/hytech-racing/HT_CAN/releases/download/80/can_lib.tar.gz
git+ssh://git@github.com/hytech-racing/CASE_lib.git#v39

Loading

0 comments on commit 078fb50

Please sign in to comment.