From 9fa36c9eb1bb294c58b4e4dd7592893f829ce282 Mon Sep 17 00:00:00 2001
From: Justin Fichtner <Justin.Fichtner@lakeshore.com>
Date: 周一, 14 8月 2017 23:36:13 +0800
Subject: [PATCH] Add support for STATus:OPERation:CONDition register and general handling of condition registers

---
 libscpi/inc/scpi/minimal.h |    4 ++
 libscpi/inc/scpi/types.h   |    1 
 libscpi/src/ieee488.c      |   14 +++++++
 libscpi/src/minimal.c      |   52 ++++++++++++++++++++++++++
 libscpi/test/test_parser.c |   20 ++++++++++
 5 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/libscpi/inc/scpi/minimal.h b/libscpi/inc/scpi/minimal.h
index 77b2abd..31713dd 100644
--- a/libscpi/inc/scpi/minimal.h
+++ b/libscpi/inc/scpi/minimal.h
@@ -52,6 +52,10 @@
     scpi_result_t SCPI_StatusQuestionableEventQ(scpi_t * context);
     scpi_result_t SCPI_StatusQuestionableEnableQ(scpi_t * context);
     scpi_result_t SCPI_StatusQuestionableEnable(scpi_t * context);
+    scpi_result_t SCPI_StatusOperationConditionQ(scpi_t * context);
+    scpi_result_t SCPI_StatusOperationEventQ(scpi_t * context);
+    scpi_result_t SCPI_StatusOperationEnableQ(scpi_t * context);
+    scpi_result_t SCPI_StatusOperationEnable(scpi_t * context);
     scpi_result_t SCPI_StatusPreset(scpi_t * context);
 
 
diff --git a/libscpi/inc/scpi/types.h b/libscpi/inc/scpi/types.h
index ac826d2..3584936 100644
--- a/libscpi/inc/scpi/types.h
+++ b/libscpi/inc/scpi/types.h
@@ -74,6 +74,7 @@
         SCPI_REG_ESE, /* Event Status Enable Register */
         SCPI_REG_OPER, /* OPERation Status Register */
         SCPI_REG_OPERE, /* OPERation Status Enable Register */
+        SCPI_REG_OPERC, /* OPERation Status Condition Register */
         SCPI_REG_QUES, /* QUEStionable status register */
         SCPI_REG_QUESE, /* QUEStionable status Enable Register */
 
diff --git a/libscpi/src/ieee488.c b/libscpi/src/ieee488.c
index 667e9da..f2579a0 100644
--- a/libscpi/src/ieee488.c
+++ b/libscpi/src/ieee488.c
@@ -51,6 +51,17 @@
 }
 
 /**
+* Update latching event register value based on bit transitions from 0 -> 1
+* in the condition register
+* @param context
+* @param condReg - condition register name
+* @param eventReg - event register name
+*/
+static void regUpdateEvent(scpi_t * context, scpi_reg_val_t oldCondVal, scpi_reg_val_t newCondVal, scpi_reg_name_t eventReg) {
+	SCPI_RegSet(context, eventReg, ((oldCondVal ^ newCondVal) & newCondVal) | SCPI_RegGet(context, eventReg));
+}
+
+/**
  * Update STB register according to value and its mask register
  * @param context
  * @param val value of register
@@ -148,6 +159,9 @@
         case SCPI_REG_OPERE:
             regUpdate(context, SCPI_REG_OPER);
             break;
+        case SCPI_REG_OPERC:
+        regUpdateEvent(context, old_val, val, SCPI_REG_OPER);
+            break;
 
 
         case SCPI_REG_COUNT:
diff --git a/libscpi/src/minimal.c b/libscpi/src/minimal.c
index 83ecec7..05e351e 100644
--- a/libscpi/src/minimal.c
+++ b/libscpi/src/minimal.c
@@ -139,6 +139,58 @@
 }
 
 /**
+ * STATus:OPERation:CONDition?
+ * @param context
+ * @return
+ */
+scpi_result_t SCPI_StatusOperationConditionQ(scpi_t * context) {
+    /* return value */
+    SCPI_ResultInt32(context, SCPI_RegGet(context, SCPI_REG_OPERC));
+
+    return SCPI_RES_OK;
+}
+
+/**
+ * STATus:OPERation[:EVENt]?
+ * @param context
+ * @return
+ */
+scpi_result_t SCPI_StatusOperationEventQ(scpi_t * context) {
+    /* return value */
+    SCPI_ResultInt32(context, SCPI_RegGet(context, SCPI_REG_OPER));
+
+    /* clear register */
+    SCPI_RegSet(context, SCPI_REG_OPER, 0);
+
+    return SCPI_RES_OK;
+}
+
+/**
+ * STATus:OPERation:ENABle?
+ * @param context
+ * @return
+ */
+ scpi_result_t SCPI_StatusOperationEnableQ(scpi_t * context) {
+    /* return value */
+    SCPI_ResultInt32(context, SCPI_RegGet(context, SCPI_REG_OPERE));
+
+    return SCPI_RES_OK;
+}
+
+/**
+ * STATus:OPERation:ENABle
+ * @param context
+ * @return
+ */
+scpi_result_t SCPI_StatusOperationEnable(scpi_t * context) {
+    int32_t new_OPERE;
+    if (SCPI_ParamInt32(context, &new_OPERE, TRUE)) {
+        SCPI_RegSet(context, SCPI_REG_OPERE, (scpi_reg_val_t) new_OPERE);
+    }
+    return SCPI_RES_OK;
+}
+
+/**
  * STATus:PRESet
  * @param context
  * @return
diff --git a/libscpi/test/test_parser.c b/libscpi/test/test_parser.c
index 32773f9..6f0d2ca 100644
--- a/libscpi/test/test_parser.c
+++ b/libscpi/test/test_parser.c
@@ -81,6 +81,11 @@
     { .pattern = "STATus:QUEStionable:ENABle", .callback = SCPI_StatusQuestionableEnable,},
     { .pattern = "STATus:QUEStionable:ENABle?", .callback = SCPI_StatusQuestionableEnableQ,},
 
+    {.pattern = "STATus:OPERation[:EVENt]?", .callback = SCPI_StatusOperationEventQ, },
+    {.pattern = "STATus:OPERation:CONDition?", .callback = SCPI_StatusOperationConditionQ, },
+    {.pattern = "STATus:OPERation:ENABle", .callback = SCPI_StatusOperationEnable, },
+    {.pattern = "STATus:OPERation:ENABle?", .callback = SCPI_StatusOperationEnableQ, },
+
     { .pattern = "STATus:PRESet", .callback = SCPI_StatusPreset,},
 
     { .pattern = "TEXTfunction?", .callback = text_function,},
@@ -440,6 +445,21 @@
     TEST_IEEE4882_REG(SCPI_REG_QUES, 0);
     TEST_IEEE4882("STATus:QUEStionable:EVENt?\r\n", "0\r\n");
 
+    TEST_IEEE4882_REG_SET(SCPI_REG_OPERE, 1);
+    TEST_IEEE4882("STATus:OPERation:ENABle?\r\n", "1\r\n");
+    TEST_IEEE4882_REG(SCPI_REG_OPERE, 1);
+    TEST_IEEE4882("STATus:OPERation:ENABle 2\r\n", "");
+    TEST_IEEE4882_REG(SCPI_REG_OPERE, 2);
+
+    TEST_IEEE4882("STATus:OPERation:CONDition?\r\n", "0\r\n");
+    TEST_IEEE4882_REG_SET(SCPI_REG_OPERC, 1);
+    TEST_IEEE4882("STATus:OPERation:CONDition?\r\n", "1\r\n");
+    TEST_IEEE4882("STATus:OPERation:EVENt?\r\n", "1\r\n");
+    TEST_IEEE4882_REG(SCPI_REG_OPERC, 0);
+    TEST_IEEE4882("STATus:OPERation:CONDition?\r\n", "0\r\n");
+    TEST_IEEE4882("STATus:OPERation:EVENt?\r\n", "1\r\n");
+    TEST_IEEE4882("STATus:OPERation:EVENt?\r\n", "0\r\n");
+
     TEST_IEEE4882("STUB\r\n", "");
     TEST_IEEE4882("STUB?\r\n", "0\r\n");
 

--
Gitblit v1.9.1