8 #include "DriverStation.h"
9 #include "NetworkCommunication/UsageReporting.h"
10 #include "Synchronized.h"
11 #include "WPIErrors.h"
14 const int32_t Dashboard::kMaxDashboardDataSize;
22 : m_userStatusData (NULL)
23 , m_userStatusDataSize (0)
24 , m_localBuffer (NULL)
25 , m_localPrintBuffer (NULL)
27 , m_printSemaphore (0)
28 , m_statusDataSemaphore (statusDataSem)
30 m_userStatusData =
new char[kMaxDashboardDataSize];
31 m_localBuffer =
new char[kMaxDashboardDataSize];
32 m_localPrintBuffer =
new char[kMaxDashboardDataSize * 2];
33 m_localPrintBuffer[0] = 0;
34 m_packPtr = m_localBuffer;
35 m_printSemaphore = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE | SEM_INVERSION_SAFE);
45 semDelete(m_printSemaphore);
47 delete [] m_localPrintBuffer;
48 m_localPrintBuffer = NULL;
49 delete [] m_localBuffer;
51 delete [] m_userStatusData;
52 m_userStatusData = NULL;
61 if (!ValidateAdd(
sizeof(int8_t)))
return;
62 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
63 m_packPtr +=
sizeof(value);
73 if (!ValidateAdd(
sizeof(int16_t)))
return;
74 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
75 m_packPtr +=
sizeof(value);
85 if (!ValidateAdd(
sizeof(int32_t)))
return;
86 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
87 m_packPtr +=
sizeof(value);
97 if (!ValidateAdd(
sizeof(uint8_t)))
return;
98 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
99 m_packPtr +=
sizeof(value);
109 if (!ValidateAdd(
sizeof(uint16_t)))
return;
110 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
111 m_packPtr +=
sizeof(value);
121 if (!ValidateAdd(
sizeof(uint32_t)))
return;
122 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
123 m_packPtr +=
sizeof(value);
133 if (!ValidateAdd(
sizeof(
float)))
return;
134 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
135 m_packPtr +=
sizeof(value);
136 AddedElement(kFloat);
145 if (!ValidateAdd(
sizeof(
double)))
return;
146 memcpy(m_packPtr, (
char*)&value,
sizeof(value));
147 m_packPtr +=
sizeof(value);
148 AddedElement(kDouble);
157 if (!ValidateAdd(
sizeof(
char)))
return;
158 *m_packPtr = value ? 1 : 0;
159 m_packPtr +=
sizeof(char);
160 AddedElement(kBoolean);
179 if (!ValidateAdd(length +
sizeof(length)))
return;
180 memcpy(m_packPtr, (
char*)&length,
sizeof(length));
181 m_packPtr +=
sizeof(length);
182 memcpy(m_packPtr, value, length);
184 AddedElement(kString);
198 if (!ValidateAdd(
sizeof(int32_t)))
return;
199 m_complexTypeStack.push(kArray);
200 m_arrayElementCount.push_back(0);
201 m_arraySizePtr.push_back((int32_t*)m_packPtr);
202 m_packPtr +=
sizeof(int32_t);
213 if (m_complexTypeStack.top() != kArray)
215 wpi_setWPIError(MismatchedComplexTypeClose);
218 m_complexTypeStack.pop();
219 *(m_arraySizePtr.back()) = m_arrayElementCount.back();
220 m_arraySizePtr.pop_back();
221 if (m_arrayElementCount.back() != 0)
223 m_expectedArrayElementType.pop_back();
225 m_arrayElementCount.pop_back();
226 AddedElement(kOther);
238 m_complexTypeStack.push(kCluster);
249 if (m_complexTypeStack.top() != kCluster)
251 wpi_setWPIError(MismatchedComplexTypeClose);
254 m_complexTypeStack.pop();
255 AddedElement(kOther);
270 if (m_packPtr != m_localBuffer)
272 wpi_setWPIError(DashboardDataCollision);
275 va_start (args, writeFmt);
278 vsprintf(m_localPrintBuffer + strlen(m_localPrintBuffer), writeFmt, args);
279 size = strlen(m_localPrintBuffer);
281 if (size > kMaxDashboardDataSize)
283 wpi_setWPIError(DashboardDataOverflow);
300 if (!m_complexTypeStack.empty())
302 wpi_setWPIError(MismatchedComplexTypeClose);
306 static bool reported =
false;
309 nUsageReporting::report(nUsageReporting::kResourceType_Dashboard, 0);
319 m_userStatusDataSize = m_packPtr - m_localBuffer;
320 memcpy(m_userStatusData, m_localBuffer, m_userStatusDataSize);
321 m_packPtr = m_localBuffer;
323 return m_userStatusDataSize;
334 if (m_localPrintBuffer[0] != 0)
341 printSize = strlen(m_localPrintBuffer);
342 m_userStatusDataSize = printSize;
343 memcpy(m_userStatusData, m_localPrintBuffer, m_userStatusDataSize);
344 m_localPrintBuffer[0] = 0;
347 *userStatusData = m_userStatusData;
348 *userStatusDataSize = m_userStatusDataSize;
354 bool Dashboard::ValidateAdd(int32_t size)
356 if ((m_packPtr - m_localBuffer) + size > kMaxDashboardDataSize)
358 wpi_setWPIError(DashboardDataOverflow);
362 if (m_localPrintBuffer[0] != 0)
364 wpi_setWPIError(DashboardDataCollision);
373 void Dashboard::AddedElement(Type type)
377 if (m_arrayElementCount.back() == 0)
379 m_expectedArrayElementType.push_back(type);
383 if (type != m_expectedArrayElementType.back())
385 wpi_setWPIError(InconsistentArrayValueAdded);
388 m_arrayElementCount.back() = m_arrayElementCount.back() + 1;
395 bool Dashboard::IsArrayRoot()
397 return !m_complexTypeStack.empty() && m_complexTypeStack.top() == kArray;
void AddBoolean(bool value)
void AddU8(uint8_t value)
void AddI32(int32_t value)
void AddU16(uint16_t value)
void AddI16(int16_t value)
void Printf(const char *writeFmt,...)
static DriverStation * GetInstance()
void AddU32(uint32_t value)
void AddString(char *value)
void AddDouble(double value)
void GetStatusBuffer(char **userStatusData, int32_t *userStatusDataSize)
void AddFloat(float value)
Dashboard(SEM_ID statusDataSemaphore)