From c057b7da49848d45a57b69269f5e7959a0957784 Mon Sep 17 00:00:00 2001
From: Federico Mandelli <federicomandelli@skywarder.eu>
Date: Mon, 31 Jul 2023 10:42:26 +0200
Subject: [PATCH] [CanProtocol] Fixed bug when calculating bus velocity

---
 .../drivers/canbus/CanDriver/BusLoadEstimation.h  |  4 ++--
 .../drivers/canbus/CanProtocol/CanProtocol.cpp    |  5 +++++
 .../drivers/canbus/CanDriver/test-can-2way.cpp    | 11 +++++------
 .../canbus/CanProtocol/test-can-protocol-2way.cpp |  6 +-----
 .../CanProtocol/test-can-protocol-loopback.cpp    | 15 ---------------
 5 files changed, 13 insertions(+), 28 deletions(-)

diff --git a/src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h b/src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h
index a68da6aeb..1a0d00366 100644
--- a/src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h
+++ b/src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h
@@ -46,7 +46,7 @@ struct BusLoadInfo
 };
 class BusLoadEstimation
 {
-    static constexpr uint16_t BUFFER_LEN = 20;
+    static constexpr uint16_t BUFFER_LEN = 50;
 
 public:
     BusLoadEstimation(uint32_t baudRate) : baudRate(baudRate) {}
@@ -90,7 +90,7 @@ private:
     };
 
     CircularBuffer<PacketInfo, BUFFER_LEN> c;
-    mutable FastMutex mutex;
+    FastMutex mutex;
     uint32_t baudRate;
 };
 
diff --git a/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp b/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
index 546d5879b..2884c27a4 100644
--- a/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
+++ b/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
@@ -22,6 +22,8 @@
 
 #include "CanProtocol.h"
 
+#include <drivers/timer/TimestampTimer.h>
+
 using namespace miosix;
 
 namespace Boardcore
@@ -134,6 +136,8 @@ void CanProtocol::sendMessage(const CanMessage& msg)
                  static_cast<uint32_t>(CanProtocolIdMask::LEFT_TO_SEND));
     packet.length = byteForUint64(msg.payload[0]);
 
+    packet.timestamp = Boardcore::TimestampTimer::getTimestamp();
+
     // Splits payload[0] in the right number of uint8_t
     for (int i = 0; i < packet.length; i++)
         packet.data[i] = msg.payload[0] >> (8 * i);
@@ -262,6 +266,7 @@ void CanProtocol::runReceiver()
 
                     // Add the data to the message
                     msg.payload[msg.length - leftToReceive - 1] = payload;
+                    loadEstimator->addPacket(pkt);
                     nReceived++;
                 }
             }
diff --git a/src/tests/drivers/canbus/CanDriver/test-can-2way.cpp b/src/tests/drivers/canbus/CanDriver/test-can-2way.cpp
index 1bcb2e3e7..56be5fefd 100644
--- a/src/tests/drivers/canbus/CanDriver/test-can-2way.cpp
+++ b/src/tests/drivers/canbus/CanDriver/test-can-2way.cpp
@@ -195,11 +195,10 @@ int main()
 
     CanbusDriver::CanbusConfig cfg{};
     CanbusDriver::AutoBitTiming bt;
-    bt.baudRate      = BAUD_RATE;
-    bt.samplePoint   = SAMPLE_POINT;
-    CanbusDriver* c1 = new CanbusDriver(CAN1, cfg, bt);
-    CanbusDriver* c  = new CanbusDriver(CAN2, cfg, bt);
-    canManager       = new SimpleCanManager(*c, BAUD_RATE, handleCanMessage);
+    bt.baudRate     = BAUD_RATE;
+    bt.samplePoint  = SAMPLE_POINT;
+    CanbusDriver* c = new CanbusDriver(CAN2, cfg, bt);
+    canManager      = new SimpleCanManager(*c, BAUD_RATE, handleCanMessage);
 
     // Allow every message
     Mask32FilterBank f2(0, 0, 0, 0, 0, 0, 0);
@@ -208,7 +207,7 @@ int main()
 
     canManager->start();
     mc.start();
-    const int slp = 5;
+    const int slp = 100;
     for (;;)
     {
         sendNewRequest();
diff --git a/src/tests/drivers/canbus/CanProtocol/test-can-protocol-2way.cpp b/src/tests/drivers/canbus/CanProtocol/test-can-protocol-2way.cpp
index 1d62c6ec7..37d4b9e86 100644
--- a/src/tests/drivers/canbus/CanProtocol/test-can-protocol-2way.cpp
+++ b/src/tests/drivers/canbus/CanProtocol/test-can-protocol-2way.cpp
@@ -202,10 +202,6 @@ int main()
     bt.baudRate    = BAUD_RATE;
     bt.samplePoint = SAMPLE_POINT;
 
-    CanbusDriver* c1 = new CanbusDriver(CAN1, cfg, bt);
-    if (false && c1)
-    {
-    }
     CanbusDriver* c = new CanbusDriver(CAN2, cfg, bt);
     protocol = new CanProtocol(c, bind(&handleCanMessage, _1), BAUD_RATE);
 
@@ -216,7 +212,7 @@ int main()
     protocol->start();
 
     mc.start();
-    const int slp = 20;
+    const int slp = 10;
     for (;;)
     {
         sendNewRequest();
diff --git a/src/tests/drivers/canbus/CanProtocol/test-can-protocol-loopback.cpp b/src/tests/drivers/canbus/CanProtocol/test-can-protocol-loopback.cpp
index 686ebd184..e245245af 100644
--- a/src/tests/drivers/canbus/CanProtocol/test-can-protocol-loopback.cpp
+++ b/src/tests/drivers/canbus/CanProtocol/test-can-protocol-loopback.cpp
@@ -42,21 +42,6 @@ void print(const CanMessage& msg)
 
 int main()
 {
-    GpioPin canA{GPIOB_BASE, 8};
-    GpioPin canB{GPIOB_BASE, 9};
-
-    canA.mode(Mode::ALTERNATE);
-    canB.mode(Mode::ALTERNATE);
-    canA.alternateFunction(9);
-    canB.alternateFunction(9);
-
-    GpioPin can2A{GPIOB_BASE, 12};
-    GpioPin can2B{GPIOB_BASE, 13};
-
-    can2A.mode(Mode::ALTERNATE);
-    can2B.mode(Mode::ALTERNATE);
-    can2A.alternateFunction(9);
-    can2B.alternateFunction(9);
 
     printf("provolone fritto\n");
 
-- 
GitLab