#include #include #include #include #include #include "scpi_errors.h" typedef struct { const int16_t errno; const char *msg; } SCPI_error_desc; static const SCPI_error_desc error_table[] = { { 0, "No error"}, { -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"}, { -9999} // end mark }; const char * scpi_error_message(SCPI_error_t errno) { for (int i = 0; error_table[i].errno != -9999; 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); // ," 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, "\""); // " }