| | |
| | | #include "scpi/ieee488.h" |
| | | #include "scpi/error.h" |
| | | #include "fifo_private.h" |
| | | #include "scpi/constants.h" |
| | | |
| | | #if USE_DEVICE_DEPENDENT_ERROR_INFORMATION |
| | | #define SCPI_ERROR_SETVAL(e, c, i) do { (e)->error_code = (c); (e)->device_dependent_info = (i); } while(0) |
| | |
| | | |
| | | static scpi_bool_t SCPI_ErrorAddInternal(scpi_t * context, int16_t err, char * info, size_t info_len) { |
| | | scpi_error_t error_value; |
| | | SCPI_ERROR_SETVAL(&error_value, err, SCPIDEFINE_strndup(&context->error_info_heap, info, info_len)); |
| | | char * info_ptr = info ? SCPIDEFINE_strndup(&context->error_info_heap, info, info_len) : NULL; |
| | | SCPI_ERROR_SETVAL(&error_value, err, info_ptr); |
| | | if (!fifo_add(&context->error_queue, &error_value)) { |
| | | SCPIDEFINE_free(&context->error_info_heap, error_value.device_dependent_info, true); |
| | | fifo_remove_last(&context->error_queue, &error_value); |
| | |
| | | |
| | | /** |
| | | * Push error to queue |
| | | * @param context - scpi context |
| | | * @param context |
| | | * @param err - error number |
| | | * @param info - additional text information or NULL for no text |
| | | * @param info_len - length of text or 0 for automatic length |
| | | */ |
| | | void SCPI_ErrorPushEx(scpi_t * context, int16_t err, char * info, size_t info_len) { |
| | | int i; |
| | | /* automatic calculation of length */ |
| | | if (info && info_len == 0) { |
| | | info_len = SCPIDEFINE_strnlen(info, SCPI_STD_ERROR_DESC_MAX_STRING_LENGTH); |
| | | } |
| | | scpi_bool_t queue_overflow = !SCPI_ErrorAddInternal(context, err, info, info_len); |
| | | |
| | | for (i = 0; i < ERROR_DEFS_N; i++) { |