SCPI parser and status register model implementation (device side) written in C
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
scpi_parser/scpi_errors.c

187 lines
5.0 KiB

#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "scpi_errors.h"
typedef struct {
const int16_t errno;
const char *msg;
} SCPI_error_desc;
static const SCPI_error_desc error_table[] = {
{ -100, "Command error"},
{ -101, "Invalid character"},
{ -102, "Syntax error"},
{ -103, "Invalid separator"},
{ -104, "Data type error"},
{ -105, "GET not allowed"},
{ -108, "Parameter not allowed"},
{ -109, "Missing parameter"},
{ -110, "Command header error"},
{ -111, "Header separator error"},
{ -112, "Program mnemonic too long"},
{ -113, "Undefined header"},
{ -114, "Header suffix out of range"},
{ -115, "Unexpected number of parameters"},
{ -120, "Numeric data error"},
{ -121, "Invalid character in number"},
{ -123, "Exponent too large"},
{ -124, "Too many digits"},
{ -128, "Numeric data not allowed"},
{ -130, "Suffix error"},
{ -131, "Invalid suffix"},
{ -134, "Suffix too long"},
{ -138, "Suffix not allowed"},
{ -140, "Character data error"},
{ -141, "Invalid character data"},
{ -144, "Character data too long"},
{ -148, "Character data not allowed"},
{ -150, "String data error"},
{ -151, "Invalid string data"},
{ -158, "String data not allowed"},
{ -160, "Block data error"},
{ -161, "Invalid block data"},
{ -168, "Block data not allowed"},
{ -170, "Expression error"},
{ -171, "Invalid expression"},
{ -178, "Expression data not allowed"},
{ -180, "Macro error"},
{ -181, "Invalid outside macro definition"},
{ -183, "Invalid inside macro definition"},
{ -184, "Macro parameter error"},
{ -200, "Execution error"},
{ -201, "Invalid while in local"},
{ -202, "Settings lost due to rtl"},
{ -203, "Command protected"},
{ -210, "Trigger error"},
{ -211, "Trigger ignored"},
{ -212, "Arm ignored"},
{ -213, "Init ignored"},
{ -214, "Trigger deadlock"},
{ -215, "Arm deadlock"},
{ -220, "Parameter error"},
{ -221, "Settings conflict"},
{ -222, "Data out of range"},
{ -223, "Too much data"},
{ -224, "Illegal parameter value"},
{ -225, "Out of memory"},
{ -226, "Lists not same length"},
{ -230, "Data corrupt or stale"},
{ -231, "Data questionable"},
{ -232, "Invalid format"},
{ -233, "Invalid version"},
{ -240, "Hardware error"},
{ -241, "Hardware missing"},
{ -250, "Mass storage error"},
{ -251, "Missing mass storage"},
{ -252, "Missing media"},
{ -253, "Corrupt media"},
{ -254, "Media full"},
{ -255, "Directory full"},
{ -256, "File name not found"},
{ -257, "File name error"},
{ -258, "Media protected"},
{ -260, "Expression error"},
{ -261, "Math error in expression"},
{ -270, "Macro error"},
{ -271, "Macro syntax error"},
{ -272, "Macro execution error"},
{ -273, "Illegal macro label"},
{ -274, "Macro parameter error"},
{ -275, "Macro definition too long"},
{ -276, "Macro recursion error"},
{ -277, "Macro redefinition not allowed"},
{ -278, "Macro header not found"},
{ -280, "Program error"},
{ -281, "Cannot create program"},
{ -282, "Illegal program name"},
{ -283, "Illegal variable name"},
{ -284, "Program currently running"},
{ -285, "Program syntax error"},
{ -286, "Program runtime error"},
{ -290, "Memory use error"},
{ -291, "Out of memory"},
{ -292, "Referenced name does not exist"},
{ -293, "Referenced name already exists"},
{ -294, "Incompatible type"},
{ -300, "Device-specific error"},
{ -310, "System error"},
{ -311, "Memory error"},
{ -312, "PUD memory lost"},
{ -313, "Calibration memory lost"},
{ -314, "Save/recall memory lost"},
{ -315, "Configuration memory lost"},
{ -320, "Storage fault"},
{ -321, "Out of memory"},
{ -330, "Self-test failed"},
{ -340, "Calibration failed"},
{ -350, "Queue overflow"},
{ -360, "Communication error"},
{ -361, "Parity error in program message"},
{ -362, "Framing error in program message"},
{ -363, "Input buffer overrun"},
{ -365, "Time out error"},
{ -400, "Query error"},
{ -410, "Query INTERRUPTED"},
{ -420, "Query UNTERMINATED"},
{ -430, "Query DEADLOCKED"},
{ -440, "Query UNTERMINATED after indefinite response"},
{ -500, "Power on"},
{ -600, "User request"},
{ -700, "Request control"},
{ -800, "Operation complete"},
{0}
};
const char * scpi_error_message(SCPI_error_t errno)
{
for (int i = 0; error_table[i].errno != 0; i++) {
if (error_table[i].errno == errno) {
return error_table[i].msg;
}
}
return NULL;
}
void scpi_error_string(char *buffer, SCPI_error_t errno, const char *extra)
{
const char *msg = scpi_error_message(errno);
// len - total length, offs - current segment length
int len, offs;
len = offs = sprintf(buffer, "%d,\"", errno); // <code>,"
buffer += offs;
if (msg == NULL) {
msg = "Unknown error";
}
offs = sprintf(buffer, "%s", msg); // Error message
len += offs;
buffer += offs;
if (extra != NULL) {
// extra info
offs = sprintf(buffer, "; "); // ;_
len += offs;
buffer += offs;
// copy in the extra string
int ll = 250 - len - 2;
int xlen = strlen(extra);
if (ll > xlen) ll = xlen;
strncpy(buffer, extra, ll); // Extra msg
len += ll;
buffer += ll;
}
sprintf(buffer, "\""); // "
}