NXPCUP-libary
Library for car's control board on NXPCUP competition based on the Mbed framework.
Log.h
Go to the documentation of this file.
1 #pragma once
2 
3 // Header file with logging functions
4 
5 #include "BorderDetector.h"
6 #include "mbed.h"
7 #include <optional>
8 #include <type_traits>
9 
10 template <typename T>
11 void send32bits(Serial& serial, T data)
12 {
13  static_assert(sizeof(T) == 4);
14  int32_t cdata = static_cast<int32_t>(data);
15  serial.putc(cdata >> 24);
16  serial.putc(cdata >> 16);
17  serial.putc(cdata >> 8);
18  serial.putc(cdata);
19 }
20 
21 template <typename T>
22 void send16bits(Serial& serial, T data)
23 {
24  static_assert(sizeof(T) == 2);
25  int16_t cdata = static_cast<int16_t>(data);
26  serial.putc(cdata >> 8);
27  serial.putc(cdata);
28 }
29 
30 template <>
31 void send32bits<float>(Serial& serial, float data)
32 {
33  uint8_t* cdata = reinterpret_cast<uint8_t*>(&data);
34  for (int i : { 0, 1, 2, 3 }) {
35  serial.putc(cdata[i]);
36  }
37 }
38 
39 template <typename T>
40 void send64bits(Serial& serial, T data)
41 {
42  static_assert(sizeof(T) == 8);
43  int64_t cdata = static_cast<int64_t>(data);
44  serial.putc(cdata >> 56);
45  serial.putc(cdata >> 48);
46  serial.putc(cdata >> 40);
47  serial.putc(cdata >> 32);
48  serial.putc(cdata >> 24);
49  serial.putc(cdata >> 16);
50  serial.putc(cdata >> 8);
51  serial.putc(cdata);
52 }
53 
54 template <>
55 void send64bits<double>(Serial& serial, double data)
56 {
57  uint8_t* cdata = reinterpret_cast<uint8_t*>(&data);
58  for (int i : { 0, 1, 2, 3, 4, 5, 6, 7 }) {
59  serial.putc(cdata[i]);
60  }
61 }
62 
63 void sendCameraDataLorris(Serial& serial, const std::array<uint16_t, 128>& data)
64 {
65  serial.putc(0x80); // Header
66  serial.putc(0x01); // Command: 0x01 = camera
67  serial.putc(128); // Packet data length: N bytes data after this packet
68  for (uint16_t elem : data) {
69  serial.putc(elem >> 8);
70  }
71 }
72 
73 void sendDetectorDataLorris(Serial& serial, nxpcup::BorderDetector& detector)
74 {
75  serial.putc(0x80); // Header
76  serial.putc(0x02); // Command: 0x02 = detector
77  serial.putc(9); // Packet data length: 3 bytes data after this packet
78  send32bits(serial, detector.leftBorder());
79  send32bits(serial, detector.rightBorder());
80  serial.putc(detector.error());
81 }
82 
84  Serial& serial, Timer& loopTime, const uint16_t loopTimePeriodOverflowCounter)
85 {
86  serial.putc(0x80); // Header
87  serial.putc(0x03); // Command: 0x03 = time
88  serial.putc(6); // Packet data length
89  send32bits(serial, loopTime.read_us()); // 4 bytes
90  send16bits(serial, loopTimePeriodOverflowCounter); // 2 bytes
91 }
92 
94  Serial& serial, uint16_t dataLeft, uint16_t dataRight)
95 {
96  serial.putc(0x80); // Header
97  serial.putc(0x04); // Command: 0x04 = counter
98  serial.putc(4); // Packet data length: x bytes data (int) after this packet
99  serial.putc(dataLeft >> 8);
100  serial.putc(dataLeft);
101  serial.putc(dataRight >> 8);
102  serial.putc(dataRight);
103 }
104 
105 void sendPeaksDataLorris(Serial& serial, const int16_t peaks)
106 {
107  serial.putc(0x80); // Header
108  serial.putc(0x05); // Command: 0x05 = peaks from border detector
109  serial.putc(2); // Packet data length
110  send16bits(serial, peaks);
111 }
112 
114  Serial& serial,
115  const int obstacleDistance,
116  const int obstacleAngle,
117  const int distanceThatTriggered,
118  const int avoidingObstacle)
119 {
120  serial.putc(0x80); // Header
121  serial.putc(0x06); // Command: 0x06 = distance from obstacle sensors
122  serial.putc(4 * 3 + 1); // Packet data length
123  send32bits(serial, obstacleDistance);
124  send32bits(serial, obstacleAngle);
125  send32bits(serial, distanceThatTriggered);
126  serial.putc(static_cast<int8_t>(avoidingObstacle));
127 }
128 
130  Serial& serial,
131  const int leftSensorValue,
132  const int rightSensorValue,
133  const int avoidingObstacle)
134 {
135  serial.putc(0x80); // Header
136  serial.putc(0x06); // Command: 0x06 = distance from obstacle sensors
137  serial.putc(4 * 2 + 1); // Packet data length
138  send32bits(serial, leftSensorValue);
139  send32bits(serial, rightSensorValue);
140  serial.putc(static_cast<int8_t>(avoidingObstacle));
141 }
142 
144  Serial& serial, nxpcup::BorderDetector& detector, const int roadError)
145 {
146  serial.putc(0x80); // Header
147  serial.putc(0x07); // Command: 0x07 - steering data
148  serial.putc(5);
149  serial.putc(detector.error());
150  send32bits(serial, roadError);
151 }
152 
154  Serial& serial,
155  const float motorLD,
156  const float motorLA,
157  const float motorRD,
158  const float motorRA)
159 {
160  serial.putc(0x80); // Header
161  serial.putc(0x08); // Command: 0x08 - motor data
162  serial.putc(16);
163  send32bits(serial, motorLD * 1000);
164  send32bits(serial, motorLA * 1000);
165  send32bits(serial, motorRD * 1000);
166  send32bits(serial, motorRA * 1000);
167 }
168 
170  Serial& serial, float distanceLeft, float distanceRight)
171 {
172  serial.putc(0x80); // Header
173  serial.putc(0x09); // Command: 0x09 = encoder distance
174  serial.putc(8); // Packet data length: x bytes data (int) after this packet
175  send32bits(serial, int(distanceLeft * 1000));
176  send32bits(serial, int(distanceRight * 1000));
177 }
178 
180  Serial& serial, const std::array<uint16_t, 128>& data)
181 {
182  serial.printf("L:");
183  for (uint16_t d : data) {
184  serial.printf("%X,", d / 16);
185  }
186 }
void sendObstacleDataLorris(Serial &serial, const int obstacleDistance, const int obstacleAngle, const int distanceThatTriggered, const int avoidingObstacle)
Definition: Log.h:113
void sendSteeringDataLorris(Serial &serial, nxpcup::BorderDetector &detector, const int roadError)
Definition: Log.h:143
int rightBorder() const
Definition: BorderDetector.h:131
void sendTimeDataLorris(Serial &serial, Timer &loopTime, const uint16_t loopTimePeriodOverflowCounter)
Definition: Log.h:83
int error(const int percentCoefficient=100) const
Definition: BorderDetector.h:111
Definition: BorderDetector.h:8
void sendCameraDataTerminal(Serial &serial, const std::array< uint16_t, 128 > &data)
Definition: Log.h:179
void sendObstacleDetectorDataLorris(Serial &serial, const int leftSensorValue, const int rightSensorValue, const int avoidingObstacle)
Definition: Log.h:129
void send64bits< double >(Serial &serial, double data)
Definition: Log.h:55
int leftBorder() const
Definition: BorderDetector.h:123
void sendMotorDataLorris(Serial &serial, const float motorLD, const float motorLA, const float motorRD, const float motorRA)
Definition: Log.h:153
void sendEncoderDistanceLorris(Serial &serial, float distanceLeft, float distanceRight)
Definition: Log.h:169
void send16bits(Serial &serial, T data)
Definition: Log.h:22
void sendEncoderDataLorris(Serial &serial, uint16_t dataLeft, uint16_t dataRight)
Definition: Log.h:93
void sendDetectorDataLorris(Serial &serial, nxpcup::BorderDetector &detector)
Definition: Log.h:73
void send32bits< float >(Serial &serial, float data)
Definition: Log.h:31
void send64bits(Serial &serial, T data)
Definition: Log.h:40
void sendPeaksDataLorris(Serial &serial, const int16_t peaks)
Definition: Log.h:105
void send32bits(Serial &serial, T data)
Definition: Log.h:11
void sendCameraDataLorris(Serial &serial, const std::array< uint16_t, 128 > &data)
Definition: Log.h:63