Bluenet  5.7.0
Bluenet, firmware for nRF52 smart home devices
Loading...
Searching...
No Matches
cs_Test.h
Go to the documentation of this file.
1/*
2 * Author: Crownstone Team
3 * Copyright: Crownstone (https://crownstone.rocks)
4 * Date: Jan 15, 2020
5 * License: LGPLv3+, Apache License 2.0, and/or MIT (triple-licensed)
6 */
7
8#pragma once
9
10#include <uart/cs_UartHandler.h>
11
12#include <cstdarg>
13
14#ifdef DEBUG
15inline int cs_write_test(const char* str, ...) {
16 char buffer[128];
17 va_list ap;
18 va_start(ap, str);
19 int16_t len = vsnprintf(NULL, 0, str, ap);
20 va_end(ap);
21
22 if (len < 0) return len;
23
24 // if strings are small we do not need to allocate by malloc
25 if (sizeof buffer >= len + 1UL) {
26 va_start(ap, str);
27 len = vsprintf(buffer, str, ap);
28 va_end(ap);
30 }
31 else {
32 char* p_buf = (char*)malloc(len + 1);
33 if (!p_buf) return -1;
34 va_start(ap, str);
35 len = vsprintf(p_buf, str, ap);
36 va_end(ap);
38 free(p_buf);
39 }
40 return len;
41}
42#else
43// when debug is not defined, define the centralized method
44// as empty symbol so that all calls to it result in no generated code.
45#define cs_write_test(...)
46#endif
47
51template <class U>
52inline long int OptionalUnsignedToInt(std::optional<U> opt) {
53 return (opt ? static_cast<long int>(opt.value()) : -1);
54}
55
61// folds in pretty_function name
62#define TEST_PUSH_DATA(form, self, expressionnamestr, expr) \
63 cs_write_test(form, self, __PRETTY_FUNCTION__, expressionnamestr, expr)
64
68#if CS_UART_BINARY_PROTOCOL_ENABLED == 0
69#define TEST_PUSH_EXPR_S(self, expressionnamestr, expr) \
70 TEST_PUSH_DATA("%x@%s@%s@%s\r\n", self, expressionnamestr, expr) // string
71#define TEST_PUSH_EXPR_D(self, expressionnamestr, expr) \
72 TEST_PUSH_DATA("%x@%s@%s@%d\r\n", self, expressionnamestr, expr) // decimal
73#define TEST_PUSH_EXPR_X(self, expressionnamestr, expr) \
74 TEST_PUSH_DATA("%x@%s@%s@%x\r\n", self, expressionnamestr, expr) // hexadecimal
75#else
76#define TEST_PUSH_EXPR_S(self, expressionnamestr, expr) \
77 TEST_PUSH_DATA("%x@%s@%s@%s", self, expressionnamestr, expr) // string
78#define TEST_PUSH_EXPR_D(self, expressionnamestr, expr) \
79 TEST_PUSH_DATA("%x@%s@%s@%d", self, expressionnamestr, expr) // decimal
80#define TEST_PUSH_EXPR_X(self, expressionnamestr, expr) \
81 TEST_PUSH_DATA("%x@%s@%s@%x", self, expressionnamestr, expr) // hexadecimal
82#endif
83
84// boolean remap to string
85#define TEST_PUSH_EXPR_B(self, expressionnamestr, expr) \
86 TEST_PUSH_EXPR_S(self, expressionnamestr, (expr ? "True" : "False"))
87
88// std::optional<uint*_t> remap to Decimal
89#define TEST_PUSH_EXPR_O(self, expressionnamestr, expr) \
90 TEST_PUSH_EXPR_D(self, expressionnamestr, OptionalUnsignedToInt(expr))
91
95#define TEST_PUSH_S(self, variablename) TEST_PUSH_EXPR_S(self, #variablename, self->variablename)
96#define TEST_PUSH_D(self, variablename) TEST_PUSH_EXPR_D(self, #variablename, self->variablename)
97#define TEST_PUSH_X(self, variablename) TEST_PUSH_EXPR_X(self, #variablename, self->variablename)
98#define TEST_PUSH_B(self, variablename) TEST_PUSH_EXPR_B(self, #variablename, self->variablename)
99#define TEST_PUSH_O(self, variablename) TEST_PUSH_EXPR_O(self, #variablename, self->variablename)
100
106#if CS_UART_BINARY_PROTOCOL_ENABLED == 0
107#define TEST_PUSH_STATIC_S(context, expressionnamestr, expr) \
108 TEST_PUSH_DATA("%s@%s@%s@%s\r\n", context, expressionnamestr, expr)
109#define TEST_PUSH_STATIC_D(context, expressionnamestr, expr) \
110 TEST_PUSH_DATA("%s@%s@%s@%d\r\n", context, expressionnamestr, expr)
111#define TEST_PUSH_STATIC_X(context, expressionnamestr, expr) \
112 TEST_PUSH_DATA("%s@%s@%s@%x\r\n", context, expressionnamestr, expr)
113#define TEST_PUSH_STATIC_B(context, expressionnamestr, expr) \
114 TEST_PUSH_DATA("%s@%s@%s@%s\r\n", context, expressionnamestr, (expr ? "True" : "False"))
115#else
116#define TEST_PUSH_STATIC_S(context, expressionnamestr, expr) \
117 TEST_PUSH_DATA("%s@%s@%s@%s", context, expressionnamestr, expr)
118#define TEST_PUSH_STATIC_D(context, expressionnamestr, expr) \
119 TEST_PUSH_DATA("%s@%s@%s@%d", context, expressionnamestr, expr)
120#define TEST_PUSH_STATIC_X(context, expressionnamestr, expr) \
121 TEST_PUSH_DATA("%s@%s@%s@%x", context, expressionnamestr, expr)
122#define TEST_PUSH_STATIC_B(context, expressionnamestr, expr) \
123 TEST_PUSH_DATA("%s@%s@%s@%s", context, expressionnamestr, (expr ? "True" : "False"))
124#endif
ret_code_t writeMsg(UartOpcodeTx opCode, uint8_t *data, uint16_t size, UartProtocol::Encrypt encrypt=UartProtocol::ENCRYPT_ACCORDING_TO_TYPE)
Write a msg over UART.
static UartHandler & getInstance()
Gets a static singleton (no dynamic memory allocation) of this class.
Definition: cs_UartHandler.h:31
#define cs_write_test(...)
Definition: cs_Test.h:45
long int OptionalUnsignedToInt(std::optional< U > opt)
Cast optional into integer for easy printing.
Definition: cs_Test.h:52
@ UART_OPCODE_TX_FIRMWARESTATE
Definition: cs_UartOpcodes.h:143