65 "M .▄▄▄▄▄▄▄▄▄▄▄..▄▄▄▄▄▄▄▄▄▄▄..▄▄▄▄▄▄▄▄▄▄▄..▄▄▄▄▄▄▄▄▄▄▄.\n"
66 "M ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌\n"
67 "M ▐░█▀▀▀▀▀▀▀▀▀.▐░█▀▀▀▀▀▀▀█░▌.▀▀▀▀█░█▀▀▀▀.▐░█▀▀▀▀▀▀▀▀▀.\n"
68 "M ▐░▌..........▐░▌.......▐░▌.....▐░▌.....▐░▌..........\n"
69 "M ▐░█▄▄▄▄▄▄▄▄▄.▐░█▄▄▄▄▄▄▄█░▌.....▐░▌.....▐░█▄▄▄▄▄▄▄▄▄.\n"
70 "M ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌.....▐░▌.....▐░░░░░░░░░░░▌\n"
71 "M ▐░█▀▀▀▀▀▀▀▀▀.▐░█▀▀▀▀█░█▀▀......▐░▌......▀▀▀▀▀▀▀▀▀█░▌\n"
72 "M ▐░▌..........▐░▌.....▐░▌.......▐░▌...............▐░▌\n"
73 "M ▐░█▄▄▄▄▄▄▄▄▄.▐░▌......▐░▌..▄▄▄▄█░█▄▄▄▄..▄▄▄▄▄▄▄▄▄█░▌\n"
74 "M ▐░░░░░░░░░░░▌▐░▌.......▐░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌\n"
75 "M .▀▀▀▀▀▀▀▀▀▀▀..▀.........▀..▀▀▀▀▀▀▀▀▀▀▀..▀▀▀▀▀▀▀▀▀▀▀.\n"
76 "M ....................................................\n"
77 "M .▄▄▄▄▄▄▄▄▄▄▄..▄▄▄▄▄▄▄▄▄▄▄..▄▄▄▄▄▄▄▄▄▄▄..▄▄▄▄▄▄▄▄▄▄▄.\n"
78 "M ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌\n"
79 "M ▐░█▀▀▀▀▀▀▀▀▀.▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀.\n"
80 "M ▐░▌..........▐░▌.......▐░▌▐░▌.......▐░▌▐░▌..........\n"
81 "M ▐░▌..........▐░▌.......▐░▌▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄.\n"
82 "M ▐░▌..........▐░▌.......▐░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌\n"
83 "M ▐░▌..........▐░▌.......▐░▌▐░█▀▀▀▀█░█▀▀.▐░█▀▀▀▀▀▀▀▀▀.\n"
84 "M ▐░▌..........▐░▌.......▐░▌▐░▌.....▐░▌..▐░▌..........\n"
85 "M ▐░█▄▄▄▄▄▄▄▄▄.▐░█▄▄▄▄▄▄▄█░▌▐░▌......▐░▌.▐░█▄▄▄▄▄▄▄▄▄.\n"
86 "M ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌.......▐░▌▐░░░░░░░░░░░▌\n"
87 "M .▀▀▀▀▀▀▀▀▀▀▀..▀▀▀▀▀▀▀▀▀▀▀..▀.........▀..▀▀▀▀▀▀▀▀▀▀▀.\n"
88 "M Connected to the Serial Command Interface \n";
94 while((ix = strchr(ix, orig)) != NULL) {
104 for(uint16_t i = 0;i<strlen(msg);i++){
116 uint16_t compressed_len,uncompressed_len;
124 char workingBuffer[SERIAL_WORKING_BUFFER_SIZE];
133 Serial.print(
"LZ4 ");
134 Serial.print(uncompressed_len);
171 avail = Serial.availableForWrite();
173 if(avail < SERIAL_THROTTLE_CHECK_CONNECTION_BUFFER_THRESHOLD){
174 uint16_t delta_avail;
175 uint16_t msec_delay_counter = 0;
179 msec_delay_counter += 5;
180 delta_avail = Serial.availableForWrite();
181 if (delta_avail > SERIAL_THROTTLE_CHECK_CONNECTION_BUFFER_THRESHOLD)
break;
182 }
while (msec_delay_counter < SERIAL_THROTTLE_CHECK_CONNECTION_MAX_DELAY);
184 if(avail == delta_avail){
191 if(avail < SERIAL_THROTTLE_BUFFER_THRESHOLD)
return true;
200 while(
token != NULL ) {
206 Serial.print(F(
"\""));
208 Serial.print(F(
",\""));
212 Serial.print(F(
"\""));
232 Serial.println(F(
"M SvcSerialCommandInterface::streamReceiveHandler isCapturingBulkData"));
240 Serial.println(F(
"M SvcSerialCommandInterface::streamReceiveHandler Wren Script ERROR: Input buffer full"));
247 Serial.println(F(
"M SvcSerialCommandInterface::streamReceiveHandler Wren Script Received"));
248 memset(f,0,strlen(
"WREN_SCRIPT_END"));
259 uint16_t payload_len;
266 Serial.println(F(
"M GET_ERR FILE OPEN ERROR"));
277 i =
file.available();
280 if(i > SERIAL_FILESTREAM_PAYLOAD_SIZE) i = SERIAL_FILESTREAM_PAYLOAD_SIZE;
283 if (
file.read(&bufferChr,1) < 0){
284 Serial.println(F(
"\nM GET_ERR FILE READ ERROR"));
291 sprintf(hexBuffer,
"%02X,",(
unsigned int)bufferChr);
299 if (payload_len == 0){
302 Serial.println(
"FS_END");
306 delayMicroseconds(3000);
309 else if (payload_len < SERIAL_FILESTREAM_PAYLOAD_SIZE) {
311 Serial.println(
"FS_END");
316 delayMicroseconds(3000);
325 Serial.print(F(
"M GET_ERR FILE NOT FOUND "));
342 tmp = (
char*)malloc(1000);
347 printf(F(
"RAM {\"RAM1\":{\"addr\":\"%08X\",\"chunk\":\""),0x000000);
349 for(uint32_t i = 0x00070000; i < 0x0007F000; i+=1){
354 if(i%32==0 && i != 0x00070000){
355 print(F(
"\",\"decode\":\""));
363 pct = 100.0 * ((float)(i-0x00070000)/(float)(0x0007F000));
364 Serial.printf(F(
"CLS\nM GET_RAM1 %08X %.0f pct "),i,pct);
365 for(uint16_t div = 0; div < (uint16_t)pct; div += 5){
371 printf(F(
"RAM {\"RAM1\":{\"addr\":\"%08X\",\"chunk\":\""),i);
374 printf(
"%02X ",(uint8_t)c);
375 const char* escape =
"\\";
377 strncat(tmp, escape, 1);
380 strncat(tmp, escape, 1);
382 }
else if (isprint((
int)c)){
384 }
else if (iscntrl((
int)c)){
393 println(F(
"RAM END"));
410 tmp = (
char*)malloc(1000);
415 printf(F(
"RAM {\"RAM2\":{\"addr\":\"%08X\",\"chunk\":\""),0x20000000);
417 for(uint32_t i = 0x20000000; i < 0x20280000; i+=1){
418 if (i == 0x20010000) i = 0x20200000;
422 if(i%32==0 && i != 0x20000000){
423 print(F(
"\",\"decode\":\""));
431 pct = 100.0 * ((float)(i-0x20000000)/(float)(0x20280000-0x20000000));
432 Serial.printf(F(
"CLS\nM GET_RAM2 %08X %.0f pct "),i,pct);
433 for(uint16_t div = 0; div < (uint16_t)pct; div += 5){
439 printf(F(
"RAM {\"RAM2\":{\"addr\":\"%08X\",\"chunk\":\""),i);
442 printf(
"%02X ",(uint8_t)c);
443 const char* escape =
"\\";
445 strncat(tmp, escape, 1);
448 strncat(tmp, escape, 1);
450 }
else if (isprint((
int)c)){
452 }
else if (iscntrl((
int)c)){
461 println(F(
"RAM END"));
472 char cmd[128], param[128];
475 total_read = sscanf(
p_received_chars,
"%127s %127s %d" , cmd, param,(
int*)&val);
477 total_read = sscanf(
p_received_chars,
"%127s %127s %f" , cmd, param,(float32_t*)&fval);
479 Serial.print(F(
"M SvcSerialCommandInterface::messageHandler_UPDATE_DD ERROR WRONG PARAM COUNT"));
480 Serial.println(total_read);
483 total_read = sscanf(
p_received_chars,
"%127s %127s %f" , cmd, param,(float32_t*)&fval);
491 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_SAVE: script save request"));
495 captureBuffer = (
char*)realloc(captureBuffer,0);
496 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_SAVE: captureBuffer released"));
498 }
else Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_SAVE: captureBuffer is NULL"));
503 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_EXECUTE: script execute request"));
507 captureBuffer = (
char*)realloc(captureBuffer,0);
508 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_EXECUTE: captureBuffer released"));
510 }
else Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_EXECUTE: captureBuffer is NULL"));
516 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_COMPILE: script compile request"));
520 captureBuffer = (
char*)realloc(captureBuffer,0);
521 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_COMPILE: captureBuffer released"));
523 }
else Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_COMPILE: captureBuffer is NULL"));
530 tmp = (
char*)realloc(captureBuffer,SERIAL_RX_CAPTURE_BUFFER_SIZE);
534 captureBuffer = (
char*)malloc(SERIAL_RX_CAPTURE_BUFFER_SIZE);
535 }
else captureBuffer = tmp;
540 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_START"));
543 Serial.println(F(
"M SvcSerialCommandInterface::messageHandler_WREN_SCRIPT_START ERROR: realloc(SERIAL_RX_CAPTURE_BUFFER_SIZE) failed"));
550 char cmd[128], param[128],param2[128];
551 total_read = sscanf(
p_received_chars,
"%127s %127s %127s" , cmd, param,param2);
553 Serial.print(F(
"M GET_ERR WRONG PARAM COUNT"));
554 Serial.println(param);
559 Serial.print(F(
"M GET_OK "));
562 Serial.println(param2);
565 Serial.println(F(
"FS_START"));
574 char cmd[128], param[128],param2[128];
575 total_read = sscanf(
p_received_chars,
"%127s %127s %127s" , cmd, param,param2);
576 while(Serial.availableForWrite() < 6000){
588 workingBuffer = (
char*)malloc(SERIAL_WORKING_BUFFER_SIZE);
601 while(
token != NULL ) {
603 else Serial.print(F(
",\""));
605 Serial.print(F(
"\""));
609 Serial.println(F(
"]"));
610 Serial.println(F(
"DIR_EOF"));
630 sd->ls(
this,param,
false);
635 else Serial.print(F(
",\""));
638 Serial.print(F(
"\""));
645 Serial.println(F(
"]"));
646 Serial.println(F(
"DIR_EOF"));
651 char endMarker =
'\n';
652 boolean newRxMsg =
false;
666 if (Serial.available() > 0 &&
false == newRxMsg ){
668 bufferChr = Serial.read();
675 Serial.clearReadError();
679 if (bufferChr == endMarker){
684 }
while (Serial.available() > 0 &&
false == newRxMsg);
690 char cmd[128], param[128],param2[128];
694 if (strncmp(cmd,
"LS",
sizeof(cmd)) == 0){
696 }
else if (strncmp(cmd,
"GET",
sizeof(cmd)) == 0){
698 }
else if (strncmp(cmd,
"ACON",
sizeof(cmd)) == 0){
702 Serial.println(F(
"M ACON START"));
707 Serial.println(csBuffer);
709 Serial.println(F(
"M ACON END"));
711 }
else if (strncmp(cmd,
"CONNECT",
sizeof(cmd)) == 0){
715 total_read = sscanf(
p_received_chars,
"%127s %127s %d %127s %d" , cmd, param,&source_port,param2,&dest_port);
717 Serial.print(F(
"M CONNECT WRONG PARAM COUNT "));
720 ad->
connect(param,source_port,param2,dest_port);
722 }
else if (strncmp(cmd,
"DISCONNECT",
sizeof(cmd)) == 0){
724 total_read = sscanf(
p_received_chars,
"%127s %127s %d" , cmd, param,&dest_port);
726 Serial.print(F(
"M DISCONNECT WRONG PARAM COUNT "));
730 Serial.printf(F(
"M DISCONNECTED %s %d\n"),param,dest_port);
732 Serial.printf(F(
"M FAILED DISCONNECT OF %s %d\n"),param,dest_port);
735 }
else if (strncmp(cmd,
"AA",
sizeof(cmd)) == 0){
737 }
else if (strncmp(cmd,
"APC",
sizeof(cmd)) == 0){
740 }
else if (strncmp(cmd,
"STATS",
sizeof(cmd)) == 0){
744 }
else if (strncmp(cmd,
"CQT_CFG",
sizeof(cmd)) == 0){
746 }
else if (strncmp(cmd,
"GET_DD",
sizeof(cmd)) == 0){
748 }
else if (strncmp(cmd,
"GET_WREN_SCRIPT",
sizeof(cmd)) == 0){
751 println(
"#WREN_START!");
752 println(g_wrenScript);
753 println(
"#WREN_EOF!");
756 }
else if (strncmp(cmd,
"WREN_SCRIPT_START",
sizeof(cmd)) == 0){
758 }
else if (strncmp(cmd,
"WREN_SCRIPT_COMPILE",
sizeof(cmd)) == 0){
760 }
else if (strncmp(cmd,
"WREN_SCRIPT_EXECUTE",
sizeof(cmd)) == 0){
762 }
else if (strncmp(cmd,
"WREN_SCRIPT_SAVE",
sizeof(cmd)) == 0){
764 }
else if (strncmp(cmd,
"UPDATE_DD",
sizeof(cmd)) == 0){
766 }
else if (strncmp(cmd,
"HELO",
sizeof(cmd)) == 0){
771 }
else if (strncmp(cmd,
"GET_RAM",
sizeof(cmd)) == 0){
774 num = strtol(param,NULL,10);
776 Serial.printf(
"M GET_RAM {\"addr\":\"%08X\",\"data\":\"%02X\"}\n",num,(uint8_t)*mp);
777 }
else if (strncmp(cmd,
"GET_RAM2",
sizeof(cmd)) == 0){
779 }
else if (strncmp(cmd,
"GET_RAM1",
sizeof(cmd)) == 0){
781 }
else if (strncmp(cmd,
"AUDIO_NO_INTERRUPTS",
sizeof(cmd)) == 0){
783 }
else if (strncmp(cmd,
"AUDIO_INTERRUPTS",
sizeof(cmd)) == 0){
789 #ifdef SERIAL_AUTO_TRANSMIT_DATA_PERIODICALLY
const char PROGMEM s[][16]
bool safer_strncpy(char *dest, const char *source, uint16_t dest_size)
a safer strncpy
virtual void messageHandler(AppBaseClass *sender, const char *message)
receiver method for inter-app string based communication
AppBaseClass * getAppByName(const char *appName)
Get the App pointer By Name. Returns NULL if not found.
bool sendMessage(AppBaseClass *sender, const char *to_app, const char *message)
provides an interface for apps to send messages to other apps
static AppManager * getInstance()
void printStats()
prints out some stats in JSON format to the serial port
AppBaseClass * getActiveApp()
provides an interface for apps to request the active app object
bool requestArmSetClock(uint32_t requested_cpu_frequency)
provides an interface for apps to request cpu freq change note: this is only a request....
bool getConnectionString(uint16_t connectionIndex, char *connectionStringBuffer)
bool disconnect(AudioStream *destination, int destinationInput)
bool connect(AudioStream *source, int sourceOutput, AudioStream *destination, int destinationInput)
bool increment(const char *key)
increments the value of a global record creates a new record if one does not exist and initializes ...
bool update(const char *key, int32_t val, uint32_t *owner)
update the value of an owned record creates a new record if one does not exist and initializes its ...
void printDictionary(SvcSerialCommandInterface *sci)
prints the dictionary to the SvcSerialCommandInterface
uint16_t checksum(const char *msg)
bool requestStartLZ4Message()
request to start a lz4 compressed message starts the message and returns true if available returns f...
bool throttle()
returns true if the available serial buffer falls below SERIAL_THROTTLE_BUFFER_REMAINING_THRESHOLD if...
void send()
immediately transmit then clear the txBuffer
void messageHandler_WREN_SCRIPT_START()
bool is_periodic_messages_enabled
void messageHandler_WREN_SCRIPT_SAVE()
char * p_multipart_header
void messageHandler_GET_RAM2()
void streamTransmitHandler()
void messageHandler_WREN_SCRIPT_EXECUTE()
void messageHandler_UPDATE_DD()
void streamReceiveHandler()
void empty()
zero out the transmit buffer and reset the write index
void update() override
update loop
volatile bool tx_buffer_overflow_flag
void messageHandler_WREN_SCRIPT_COMPILE()
bool is_capturing_bulk_data
elapsedMillis et_since_periodic_stats_tx
elapsedMillis et_since_periodic_data_dict_tx
void messageHandler_GET_RAM1()
void sendLZ4Message()
Calling this function signals the end of a compressed message. The txBuffer contents are lz4 compres...
void messageHandler_GET()
uint32_t index_capture_buffer
const char * gWelcomeMessage
int FLASHMEM replacechar(char *str, char orig, char rep)