Fix event commands adding semi-colons to output
Prior to this fix having a event-only command follow a query
command will result in a semi-colon being added to the output despite
the event-only command not writing any sort of output.
| | |
| | | scpi_interface_t * interface; |
| | | int_fast16_t output_count; |
| | | int_fast16_t input_count; |
| | | scpi_bool_t first_output; |
| | | scpi_bool_t cmd_error; |
| | | scpi_fifo_t error_queue; |
| | | #if USE_DEVICE_DEPENDENT_ERROR_INFORMATION && !USE_MEMORY_ALLOCATION_FREE |
| | |
| | | * @return number of characters written |
| | | */ |
| | | static size_t writeNewLine(scpi_t * context) { |
| | | if (context->output_count > 0) { |
| | | if (!context->first_output) { |
| | | size_t len; |
| | | #ifndef SCPI_LINE_ENDING |
| | | #error no termination character defined |
| | |
| | | const scpi_command_t * cmd = context->param_list.cmd; |
| | | lex_state_t * state = &context->param_list.lex_state; |
| | | scpi_bool_t result = TRUE; |
| | | scpi_bool_t is_query = context->param_list.cmd_raw.data[context->param_list.cmd_raw.length - 1] == '?'; |
| | | |
| | | /* conditionaly write ; */ |
| | | writeSemicolon(context); |
| | | /* conditionally write ; */ |
| | | if(!context->first_output && is_query) { |
| | | writeData(context, ";", 1); |
| | | } |
| | | |
| | | context->cmd_error = FALSE; |
| | | context->output_count = 0; |
| | |
| | | } else { |
| | | if (context->cmd_error) { |
| | | result = FALSE; |
| | | } else { |
| | | if(context->first_output && is_query) { |
| | | context->first_output = FALSE; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | state = &context->parser_state; |
| | | context->output_count = 0; |
| | | context->first_output = TRUE; |
| | | |
| | | while (1) { |
| | | r = scpiParser_detectProgramMessageUnit(state, data, len); |
| | |
| | | TEST_INPUT("*IDN?;*IDN?;*IDN?;*IDN?\r\n", "MA,IN,0,VER;MA,IN,0,VER;MA,IN,0,VER;MA,IN,0,VER\r\n"); |
| | | output_buffer_clear(); |
| | | |
| | | TEST_INPUT("*IDN?;STUB\r\n", "MA,IN,0,VER\r\n"); |
| | | output_buffer_clear(); |
| | | |
| | | TEST_INPUT("*IDN?;*OPC;*IDN?\r\n", "MA,IN,0,VER;MA,IN,0,VER\r\n"); |
| | | output_buffer_clear(); |
| | | |