@@ -88,10 +88,10 @@ static volatile uint16_t tx_num_elements = 0;
8888// We keep two buffers for identifier and data so that data won't be overwritten
8989// whilst we are looking for a new URC. In that way the data buffer will only be
9090// overwritten if we find an URC we are looking for.
91- static uint8_t urc_identifier_buffer[URC_IDENTIFIER_BUFFER_SIZE];
92- static char urc_data_buffer[URC_DATA_BUFFER_SIZE];
93- static volatile uint8_t urc_identifier_buffer_length = 0 ;
94- static volatile uint8_t urc_data_buffer_length = 0 ;
91+ static volatile uint8_t urc_identifier_buffer[URC_IDENTIFIER_BUFFER_SIZE];
92+ static volatile char urc_data_buffer[URC_DATA_BUFFER_SIZE];
93+ static volatile uint16_t urc_identifier_buffer_length = 0 ;
94+ static volatile uint16_t urc_data_buffer_length = 0 ;
9595
9696typedef enum {
9797 URC_PARSING_IDENTIFIER,
@@ -101,8 +101,11 @@ typedef enum {
101101
102102static UrcParseState urc_parse_state = URC_NOT_PARSING;
103103
104- static char urc_lookup_table[MAX_URC_CALLBACKS][URC_IDENTIFIER_BUFFER_SIZE];
105- static uint8_t urc_lookup_table_length[MAX_URC_CALLBACKS];
104+ static volatile uint8_t urc_index = 0 ;
105+ static volatile char urc_lookup_table[MAX_URC_CALLBACKS]
106+ [URC_IDENTIFIER_BUFFER_SIZE];
107+ static volatile uint8_t urc_lookup_table_length[MAX_URC_CALLBACKS];
108+ static volatile bool urc_lookup_table_clear_data[MAX_URC_CALLBACKS];
106109void (*urc_callbacks[MAX_URC_CALLBACKS])(char *);
107110
108111// Used to keep a pointer to the URC we are processing and found to be matching,
@@ -215,6 +218,8 @@ ISR(USART1_RXC_vect) {
215218 if (memcmp (urc_identifier_buffer,
216219 urc_lookup_table[i],
217220 urc_lookup_table_length[i]) == 0 ) {
221+
222+ urc_index = i;
218223 urc_current_callback = urc_callbacks[i];
219224 urc_parse_state = URC_PARSING_DATA;
220225
@@ -243,9 +248,11 @@ ISR(USART1_RXC_vect) {
243248 if (urc_current_callback != NULL ) {
244249 // Clear the buffer for the URC since we're passing the data
245250 // with the URC callback
246- rx_head_index =
247- (rx_head_index - urc_data_buffer_length) & RX_BUFFER_MASK;
248- rx_num_elements -= urc_data_buffer_length;
251+ if (urc_lookup_table_clear_data[urc_index]) {
252+ rx_head_index = (rx_head_index - urc_data_buffer_length) &
253+ RX_BUFFER_MASK;
254+ rx_num_elements -= urc_data_buffer_length;
255+ }
249256
250257 urc_current_callback (urc_data_buffer);
251258 urc_current_callback = NULL ;
@@ -623,14 +630,16 @@ bool SequansControllerClass::extractValueFromCommandResponse(
623630}
624631
625632bool SequansControllerClass::registerCallback (const char *urc_identifier,
626- void (*urc_callback)(char *)) {
633+ void (*urc_callback)(char *),
634+ const bool clear_data) {
627635
628636 // Check if we can override first
629637 uint8_t urc_identifier_length = strlen (urc_identifier);
630638 for (uint8_t i = 0 ; i < MAX_URC_CALLBACKS; i++) {
631639 if (urc_lookup_table_length[i] == urc_identifier_length &&
632640 strcmp (urc_identifier, urc_lookup_table[i]) == 0 ) {
633641 urc_callbacks[i] = urc_callback;
642+ urc_lookup_table_clear_data[i] = clear_data;
634643 return true ;
635644 }
636645 }
@@ -641,6 +650,7 @@ bool SequansControllerClass::registerCallback(const char *urc_identifier,
641650 strcpy (urc_lookup_table[i], urc_identifier);
642651 urc_lookup_table_length[i] = strlen (urc_identifier);
643652 urc_callbacks[i] = urc_callback;
653+ urc_lookup_table_clear_data[i] = clear_data;
644654 return true ;
645655 }
646656 }
0 commit comments