Skip to content

Commit 3d482e9

Browse files
authored
AUX Serial Throttling (#113)
* feat: Serial AUX Throttling * fix: missing define (various platforms) provides a compiler message indicating SERIAL_RX_BUFFER_SIZE was not found, and provides a default value.
1 parent a027d5f commit 3d482e9

File tree

5 files changed

+279
-0
lines changed

5 files changed

+279
-0
lines changed

src/Notecard.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@
4444

4545
#include "NoteTime.h"
4646

47+
// AUX serial throttling is based on the Arduino define `SERIAL_RX_BUFFER_SIZE`.
48+
// Unfortunately, some platforms do NOT specify the define. In this case, 64
49+
// bytes is selected as the default value, because it is a common buffer size
50+
// across several platforms.
51+
#ifndef SERIAL_RX_BUFFER_SIZE
52+
#define SERIAL_RX_BUFFER_SIZE 64
53+
#pragma message "\n\x1B[0;33mSERIAL_RX_BUFFER_SIZE has not been specified for this platform!\n\nThe value is used to set the default Notecard AUX Serial write speeds.\nA value (" NOTE_C_STRINGIZE(SERIAL_RX_BUFFER_SIZE) ") has been specified on your behalf. Use the 'card.aux.serial'\nrequest to tailor the AUX Serial speed to your board and/or application.\nhttps://dev.blues.io/api-reference/notecard-api/card-requests/#card-aux-serial\x1B[0;0m"
54+
#endif
55+
4756
/***************************************************************************
4857
SINGLETON ABSTRACTION (REQUIRED BY NOTE-C)
4958
***************************************************************************/
@@ -245,6 +254,15 @@ void Notecard::begin(NoteSerial * noteSerial_)
245254
if (noteSerial) {
246255
NoteSetFnSerial(noteSerialReset, noteSerialTransmit,
247256
noteSerialAvailable, noteSerialReceive);
257+
258+
// Set the default debug serial throttling
259+
J *req = NoteNewRequest("card.aux.serial");
260+
if (req != NULL)
261+
{
262+
JAddIntToObject(req, "max", SERIAL_RX_BUFFER_SIZE - 1);
263+
JAddIntToObject(req, "ms", 1);
264+
NoteRequestWithRetry(req, 15);
265+
}
248266
} else {
249267
NoteSetFnSerial(nullptr, nullptr, nullptr, nullptr);
250268
}

test/Notecard.test.cpp

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,6 +1372,209 @@ int test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_w
13721372
return result;
13731373
}
13741374

1375+
int test_notecard_begin_serial_sends_a_card_aux_serial_request_to_throttle_aux_serial_data()
1376+
{
1377+
int result;
1378+
1379+
// Arrange
1380+
////////////
1381+
1382+
Notecard notecard;
1383+
NoteSerial_Mock mockSerial; // Instantiate NoteSerial (mocked)
1384+
jAddNumberToObject_Parameters.reset();
1385+
noteNewRequest_Parameters.reset();
1386+
noteRequestWithRetry_Parameters.reset();
1387+
noteSetFnDefault_Parameters.reset();
1388+
1389+
noteNewRequest_Parameters.result = reinterpret_cast<J *>(malloc(sizeof(J)));
1390+
1391+
// Action
1392+
///////////
1393+
1394+
notecard.begin(&mockSerial);
1395+
1396+
// Assert
1397+
///////////
1398+
1399+
if (noteRequestWithRetry_Parameters.invoked)
1400+
{
1401+
result = 0;
1402+
}
1403+
else
1404+
{
1405+
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
1406+
std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl;
1407+
std::cout << "\tnoteRequestWithRetry_Parameters.invoked == " << std::dec << noteRequestWithRetry_Parameters.invoked << ", EXPECTED: > 0" << std::endl;
1408+
std::cout << "[";
1409+
}
1410+
1411+
free(noteNewRequest_Parameters.result);
1412+
return result;
1413+
}
1414+
1415+
int test_notecard_begin_serial_sends_a_card_aux_serial_request_with_15_second_retry()
1416+
{
1417+
int result;
1418+
1419+
// Arrange
1420+
////////////
1421+
1422+
Notecard notecard;
1423+
NoteSerial_Mock mockSerial; // Instantiate NoteSerial (mocked)
1424+
jAddNumberToObject_Parameters.reset();
1425+
noteNewRequest_Parameters.reset();
1426+
noteRequestWithRetry_Parameters.reset();
1427+
noteSetFnDefault_Parameters.reset();
1428+
1429+
noteNewRequest_Parameters.result = reinterpret_cast<J *>(malloc(sizeof(J)));
1430+
1431+
// Action
1432+
///////////
1433+
1434+
notecard.begin(&mockSerial);
1435+
1436+
// Assert
1437+
///////////
1438+
1439+
if (15 == noteRequestWithRetry_Parameters.timeoutSeconds)
1440+
{
1441+
result = 0;
1442+
}
1443+
else
1444+
{
1445+
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
1446+
std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl;
1447+
std::cout << "\tnoteRequestWithRetry_Parameters.timeoutSeconds == " << std::dec << noteRequestWithRetry_Parameters.timeoutSeconds << ", EXPECTED: 15" << std::endl;
1448+
std::cout << "[";
1449+
}
1450+
1451+
free(noteNewRequest_Parameters.result);
1452+
return result;
1453+
}
1454+
1455+
int test_notecard_begin_serial_sends_a_card_aux_serial_request_with_max_parameter_set_to_arduino_serial_rx_buffer_size_constant_minus_one()
1456+
{
1457+
int result;
1458+
1459+
// Arrange
1460+
////////////
1461+
1462+
Notecard notecard;
1463+
NoteSerial_Mock mockSerial; // Instantiate NoteSerial (mocked)
1464+
jAddNumberToObject_Parameters.reset();
1465+
noteNewRequest_Parameters.reset();
1466+
noteRequestWithRetry_Parameters.reset();
1467+
noteSetFnDefault_Parameters.reset();
1468+
1469+
noteNewRequest_Parameters.result = reinterpret_cast<J *>(malloc(sizeof(J)));
1470+
1471+
// Action
1472+
///////////
1473+
1474+
notecard.begin(&mockSerial);
1475+
1476+
// Assert
1477+
///////////
1478+
1479+
if ("max" == jAddNumberToObject_Parameters.name[0]
1480+
&& (SERIAL_RX_BUFFER_SIZE - 1) == jAddNumberToObject_Parameters.number[0]
1481+
) {
1482+
result = 0;
1483+
}
1484+
else
1485+
{
1486+
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
1487+
std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl;
1488+
std::cout << "\tjAddNumberToObject_Parameters.name == \"" << std::dec << jAddNumberToObject_Parameters.name[0] << "\", EXPECTED: \"max\"" << std::endl;
1489+
std::cout << "\tjAddNumberToObject_Parameters.number == " << std::dec << jAddNumberToObject_Parameters.number[0] << ", EXPECTED: " << (SERIAL_RX_BUFFER_SIZE - 1) << std::endl;
1490+
std::cout << "[";
1491+
}
1492+
1493+
free(noteNewRequest_Parameters.result);
1494+
return result;
1495+
}
1496+
1497+
int test_notecard_begin_serial_sends_a_card_aux_serial_request_with_ms_parameter_set_to_one()
1498+
{
1499+
int result;
1500+
1501+
// Arrange
1502+
////////////
1503+
1504+
Notecard notecard;
1505+
NoteSerial_Mock mockSerial; // Instantiate NoteSerial (mocked)
1506+
jAddNumberToObject_Parameters.reset();
1507+
noteNewRequest_Parameters.reset();
1508+
noteRequestWithRetry_Parameters.reset();
1509+
noteSetFnDefault_Parameters.reset();
1510+
1511+
noteNewRequest_Parameters.result = reinterpret_cast<J *>(malloc(sizeof(J)));
1512+
1513+
// Action
1514+
///////////
1515+
1516+
notecard.begin(&mockSerial);
1517+
1518+
// Assert
1519+
///////////
1520+
1521+
if ("ms" == jAddNumberToObject_Parameters.name[1]
1522+
&& 1 == jAddNumberToObject_Parameters.number[1]
1523+
) {
1524+
result = 0;
1525+
}
1526+
else
1527+
{
1528+
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
1529+
std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl;
1530+
std::cout << "\tjAddNumberToObject_Parameters.name == \"" << std::dec << jAddNumberToObject_Parameters.name[1] << "\", EXPECTED: \"ms\"" << std::endl;
1531+
std::cout << "\tjAddNumberToObject_Parameters.number == " << std::dec << jAddNumberToObject_Parameters.number[1] << ", EXPECTED: 1" << std::endl;
1532+
std::cout << "[";
1533+
}
1534+
1535+
free(noteNewRequest_Parameters.result);
1536+
return result;
1537+
}
1538+
1539+
int test_notecard_begin_serial_does_not_send_a_card_aux_serial_request_when_interface_has_not_been_instantiated()
1540+
{
1541+
int result;
1542+
1543+
// Arrange
1544+
////////////
1545+
1546+
Notecard notecard;
1547+
jAddNumberToObject_Parameters.reset();
1548+
noteNewRequest_Parameters.reset();
1549+
noteRequestWithRetry_Parameters.reset();
1550+
noteSetFnDefault_Parameters.reset();
1551+
1552+
noteNewRequest_Parameters.result = reinterpret_cast<J *>(malloc(sizeof(J)));
1553+
1554+
// Action
1555+
///////////
1556+
1557+
notecard.begin(static_cast<NoteSerial *>(nullptr));
1558+
1559+
// Assert
1560+
///////////
1561+
1562+
if (!noteRequestWithRetry_Parameters.invoked)
1563+
{
1564+
result = 0;
1565+
}
1566+
else
1567+
{
1568+
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
1569+
std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl;
1570+
std::cout << "\tnoteRequestWithRetry_Parameters.invoked == " << std::dec << noteRequestWithRetry_Parameters.invoked << ", EXPECTED: 0" << std::endl;
1571+
std::cout << "[";
1572+
}
1573+
1574+
free(noteNewRequest_Parameters.result);
1575+
return result;
1576+
}
1577+
13751578
int test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer()
13761579
{
13771580
int result;
@@ -4635,6 +4838,11 @@ int main(void)
46354838
{test_notecard_begin_serial_sets_serial_available_function_pointer_to_nullptr_when_interface_has_not_been_instantiated, "test_notecard_begin_serial_sets_serial_available_function_pointer_to_nullptr_when_interface_has_not_been_instantiated"},
46364839
{test_notecard_begin_serial_shares_a_serial_receive_function_pointer, "test_notecard_begin_serial_shares_a_serial_receive_function_pointer"},
46374840
{test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_when_interface_has_not_been_instantiated, "test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_when_interface_has_not_been_instantiated"},
4841+
{test_notecard_begin_serial_sends_a_card_aux_serial_request_to_throttle_aux_serial_data, "test_notecard_begin_serial_sends_a_card_aux_serial_request_to_throttle_aux_serial_data"},
4842+
{test_notecard_begin_serial_sends_a_card_aux_serial_request_with_15_second_retry, "test_notecard_begin_serial_sends_a_card_aux_serial_request_with_15_second_retry"},
4843+
{test_notecard_begin_serial_sends_a_card_aux_serial_request_with_max_parameter_set_to_arduino_serial_rx_buffer_size_constant_minus_one, "test_notecard_begin_serial_sends_a_card_aux_serial_request_with_max_parameter_set_to_arduino_serial_rx_buffer_size_constant_minus_one"},
4844+
{test_notecard_begin_serial_sends_a_card_aux_serial_request_with_ms_parameter_set_to_one, "test_notecard_begin_serial_sends_a_card_aux_serial_request_with_ms_parameter_set_to_one"},
4845+
{test_notecard_begin_serial_does_not_send_a_card_aux_serial_request_when_interface_has_not_been_instantiated, "test_notecard_begin_serial_does_not_send_a_card_aux_serial_request_when_interface_has_not_been_instantiated"},
46384846
{test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer, "test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer"},
46394847
{test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided, "test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided"},
46404848
{test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer, "test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer"},

test/mock/mock-arduino.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <string>
99
#include <vector>
1010

11+
#define SERIAL_RX_BUFFER_SIZE 79
12+
1113
enum PinMode {
1214
INPUT = 0x19,
1315
INPUT_PULLUP,

test/mock/mock-note-c-note.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "mock-parameters.hpp"
22

3+
JAddNumberToObject_Parameters jAddNumberToObject_Parameters;
34
NoteDebug_Parameters noteDebug_Parameters;
45
NoteDebugSyncStatus_Parameters noteDebugSyncStatus_Parameters;
56
NoteDeleteResponse_Parameters noteDeleteResponse_Parameters;
@@ -19,6 +20,28 @@ NoteSetFnSerial_Parameters noteSetFnSerial_Parameters;
1920
NoteSetFnTransaction_Parameters noteSetFnTransaction_Parameters;
2021
NoteSetUserAgent_Parameters noteSetUserAgent_Parameters;
2122

23+
J *
24+
JAddNumberToObject (
25+
J * const object_,
26+
const char * const name_,
27+
const JNUMBER number_
28+
) {
29+
// Record invocation(s)
30+
++jAddNumberToObject_Parameters.invoked;
31+
32+
// Stash parameter(s)
33+
jAddNumberToObject_Parameters.object.push_back(object_);
34+
jAddNumberToObject_Parameters.name.push_back(name_);
35+
jAddNumberToObject_Parameters.number.push_back(number_);
36+
37+
// Return user-supplied result
38+
if (jAddNumberToObject_Parameters.result.size() < jAddNumberToObject_Parameters.invoked) {
39+
return jAddNumberToObject_Parameters.default_result;
40+
} else {
41+
return jAddNumberToObject_Parameters.result[(jAddNumberToObject_Parameters.invoked - 1)];
42+
}
43+
}
44+
2245
void
2346
MockNoteDeleteResponse (
2447
J * response_

test/mock/mock-parameters.hpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define MOCK_PARAMETERS_HPP
33

44
#include <string>
5+
#include <vector>
56

67
#include "note-c/note.h"
78

@@ -19,6 +20,32 @@ void MockNoteDeleteResponse(J*);
1920
bool MockNoteResponseError(J*);
2021
#define NoteResponseError(x) MockNoteResponseError(x)
2122

23+
struct JAddNumberToObject_Parameters {
24+
JAddNumberToObject_Parameters(
25+
void
26+
) :
27+
invoked(0),
28+
default_result(nullptr)
29+
{ }
30+
void
31+
reset (
32+
void
33+
) {
34+
invoked = 0;
35+
object.clear();
36+
name.clear();
37+
number.clear();
38+
result.clear();
39+
default_result = nullptr;
40+
}
41+
size_t invoked;
42+
std::vector<J *> object;
43+
std::vector<std::string> name;
44+
std::vector<JNUMBER> number;
45+
std::vector<J *> result;
46+
J *default_result;
47+
};
48+
2249
struct NoteDebug_Parameters {
2350
NoteDebug_Parameters(
2451
void
@@ -423,6 +450,7 @@ struct NoteSetUserAgent_Parameters {
423450
std::string agent_cache;
424451
};
425452

453+
extern JAddNumberToObject_Parameters jAddNumberToObject_Parameters;
426454
extern NoteDebug_Parameters noteDebug_Parameters;
427455
extern NoteDebugSyncStatus_Parameters noteDebugSyncStatus_Parameters;
428456
extern NoteDeleteResponse_Parameters noteDeleteResponse_Parameters;

0 commit comments

Comments
 (0)