AMU Library 3.0
C/C++ library for communicating with AMU (Aerospace Measurement Unit) devices
Loading...
Searching...
No Matches
ieee488.c
Go to the documentation of this file.
1/*-
2 * Copyright (c) 2012-2013 Jan Breuer,
3 *
4 * All Rights Reserved
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
25 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
36
37#include "parser.h"
38#include "ieee488.h"
39#include "error.h"
40#include "constants.h"
41
42#include <stdio.h>
43
49static void regUpdate(scpi_t * context, scpi_reg_name_t name) {
50 SCPI_RegSet(context, name, SCPI_RegGet(context, name));
51}
52
60static void regUpdateSTB(scpi_t * context, scpi_reg_val_t val, scpi_reg_name_t mask, scpi_reg_val_t stbBits) {
61 if (val & SCPI_RegGet(context, mask)) {
62 SCPI_RegSetBits(context, SCPI_REG_STB, stbBits);
63 } else {
64 SCPI_RegClearBits(context, SCPI_REG_STB, stbBits);
65 }
66}
67
74 if ((name < SCPI_REG_COUNT) && context) {
75 return context->registers[name];
76 } else {
77 return 0;
78 }
79}
80
87static size_t writeControl(scpi_t * context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val) {
88 if (context && context->interface && context->interface->control) {
89 return context->interface->control(context, ctrl, val);
90 } else {
91 return 0;
92 }
93}
94
100void SCPI_RegSet(scpi_t * context, scpi_reg_name_t name, scpi_reg_val_t val) {
101 scpi_bool_t srq = FALSE;
102 scpi_reg_val_t mask;
103 scpi_reg_val_t old_val;
104
105 if ((name >= SCPI_REG_COUNT) || (context == NULL)) {
106 return;
107 }
108
109 /* store old register value */
110 old_val = context->registers[name];
111
112 /* set register value */
113 context->registers[name] = val;
114
116 switch (name) {
117 case SCPI_REG_STB:
118 mask = SCPI_RegGet(context, SCPI_REG_SRE);
119 mask &= ~STB_SRQ;
120 if (val & mask) {
121 val |= STB_SRQ;
122 /* avoid sending SRQ if nothing has changed */
123 if (old_val != val) {
124 srq = TRUE;
125 }
126 } else {
127 val &= ~STB_SRQ;
128 }
129 break;
130 case SCPI_REG_SRE:
131 regUpdate(context, SCPI_REG_STB);
132 break;
133 case SCPI_REG_ESR:
134 regUpdateSTB(context, val, SCPI_REG_ESE, STB_ESR);
135 break;
136 case SCPI_REG_ESE:
137 regUpdate(context, SCPI_REG_ESR);
138 break;
139 case SCPI_REG_QUES:
140 regUpdateSTB(context, val, SCPI_REG_QUESE, STB_QES);
141 break;
142 case SCPI_REG_QUESE:
143 regUpdate(context, SCPI_REG_QUES);
144 break;
145 case SCPI_REG_OPER:
146 regUpdateSTB(context, val, SCPI_REG_OPERE, STB_OPS);
147 break;
148 case SCPI_REG_OPERE:
149 regUpdate(context, SCPI_REG_OPER);
150 break;
151
152
153 case SCPI_REG_COUNT:
154 /* nothing to do */
155 break;
156 }
157
158 /* set updated register value */
159 context->registers[name] = val;
160
161 if (srq) {
163 }
164}
165
171void SCPI_RegSetBits(scpi_t * context, scpi_reg_name_t name, scpi_reg_val_t bits) {
172 SCPI_RegSet(context, name, SCPI_RegGet(context, name) | bits);
173}
174
180void SCPI_RegClearBits(scpi_t * context, scpi_reg_name_t name, scpi_reg_val_t bits) {
181 SCPI_RegSet(context, name, SCPI_RegGet(context, name) & ~bits);
182}
183
188void SCPI_EventClear(scpi_t * context) {
189 /* TODO */
190 SCPI_RegSet(context, SCPI_REG_ESR, 0);
191}
192
199scpi_result_t SCPI_CoreCls(scpi_t * context) {
200 SCPI_EventClear(context);
201 SCPI_ErrorClear(context);
202 SCPI_RegSet(context, SCPI_REG_OPER, 0);
203 SCPI_RegSet(context, SCPI_REG_QUES, 0);
204 return SCPI_RES_OK;
205}
206
212scpi_result_t SCPI_CoreEse(scpi_t * context) {
213 int32_t new_ESE;
214 if (SCPI_ParamInt32(context, &new_ESE, TRUE)) {
215 SCPI_RegSet(context, SCPI_REG_ESE, (scpi_reg_val_t) new_ESE);
216 return SCPI_RES_OK;
217 }
218 return SCPI_RES_ERR;
219}
220
226scpi_result_t SCPI_CoreEseQ(scpi_t * context) {
227 SCPI_ResultInt32(context, SCPI_RegGet(context, SCPI_REG_ESE));
228 return SCPI_RES_OK;
229}
230
236scpi_result_t SCPI_CoreEsrQ(scpi_t * context) {
237 SCPI_ResultInt32(context, SCPI_RegGet(context, SCPI_REG_ESR));
238 SCPI_RegSet(context, SCPI_REG_ESR, 0);
239 return SCPI_RES_OK;
240}
241
253scpi_result_t SCPI_CoreIdnQ(scpi_t * context) {
254 int i;
255 for (i = 0; i < 4; i++) {
256 if (context->idn[i]) {
257 SCPI_ResultMnemonic(context, context->idn[i]);
258 } else {
259 SCPI_ResultMnemonic(context, "0");
260 }
261 }
262 return SCPI_RES_OK;
263}
264
270scpi_result_t SCPI_CoreOpc(scpi_t * context) {
272 return SCPI_RES_OK;
273}
274
280scpi_result_t SCPI_CoreOpcQ(scpi_t * context) {
281 /* Operation is always completed */
282 SCPI_ResultInt32(context, 1);
283 return SCPI_RES_OK;
284}
285
291scpi_result_t SCPI_CoreRst(scpi_t * context) {
292 if (context && context->interface && context->interface->reset) {
293 return context->interface->reset(context);
294 }
295 return SCPI_RES_OK;
296}
297
303scpi_result_t SCPI_CoreSre(scpi_t * context) {
304 int32_t new_SRE;
305 if (SCPI_ParamInt32(context, &new_SRE, TRUE)) {
306 SCPI_RegSet(context, SCPI_REG_SRE, (scpi_reg_val_t) new_SRE);
307 return SCPI_RES_OK;
308 }
309 return SCPI_RES_ERR;
310}
311
317scpi_result_t SCPI_CoreSreQ(scpi_t * context) {
318 SCPI_ResultInt32(context, SCPI_RegGet(context, SCPI_REG_SRE));
319 return SCPI_RES_OK;
320}
321
327scpi_result_t SCPI_CoreStbQ(scpi_t * context) {
328 SCPI_ResultInt32(context, SCPI_RegGet(context, SCPI_REG_STB));
329 return SCPI_RES_OK;
330}
331
337scpi_result_t SCPI_CoreTstQ(scpi_t * context) {
338 (void) context;
339 SCPI_ResultInt32(context, 0);
340 return SCPI_RES_OK;
341}
342
348scpi_result_t SCPI_CoreWai(scpi_t * context) {
349 (void) context;
350 /* NOP */
351 return SCPI_RES_OK;
352}
353
void SCPI_ErrorClear(scpi_t *context)
Definition error.c:90
scpi_result_t SCPI_CoreEsrQ(scpi_t *context)
Definition ieee488.c:236
scpi_result_t SCPI_CoreOpc(scpi_t *context)
Definition ieee488.c:270
scpi_result_t SCPI_CoreIdnQ(scpi_t *context)
Definition ieee488.c:253
scpi_result_t SCPI_CoreEse(scpi_t *context)
Definition ieee488.c:212
static size_t writeControl(scpi_t *context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val)
Definition ieee488.c:87
void SCPI_RegSetBits(scpi_t *context, scpi_reg_name_t name, scpi_reg_val_t bits)
Definition ieee488.c:171
scpi_result_t SCPI_CoreRst(scpi_t *context)
Definition ieee488.c:291
static void regUpdate(scpi_t *context, scpi_reg_name_t name)
Definition ieee488.c:49
scpi_reg_val_t SCPI_RegGet(scpi_t *context, scpi_reg_name_t name)
Definition ieee488.c:73
scpi_result_t SCPI_CoreCls(scpi_t *context)
Definition ieee488.c:199
void SCPI_RegClearBits(scpi_t *context, scpi_reg_name_t name, scpi_reg_val_t bits)
Definition ieee488.c:180
scpi_result_t SCPI_CoreSreQ(scpi_t *context)
Definition ieee488.c:317
scpi_result_t SCPI_CoreSre(scpi_t *context)
Definition ieee488.c:303
void SCPI_RegSet(scpi_t *context, scpi_reg_name_t name, scpi_reg_val_t val)
Definition ieee488.c:100
void SCPI_EventClear(scpi_t *context)
Definition ieee488.c:188
scpi_result_t SCPI_CoreTstQ(scpi_t *context)
Definition ieee488.c:337
static void regUpdateSTB(scpi_t *context, scpi_reg_val_t val, scpi_reg_name_t mask, scpi_reg_val_t stbBits)
Definition ieee488.c:60
scpi_result_t SCPI_CoreOpcQ(scpi_t *context)
Definition ieee488.c:280
scpi_result_t SCPI_CoreEseQ(scpi_t *context)
Definition ieee488.c:226
scpi_result_t SCPI_CoreStbQ(scpi_t *context)
Definition ieee488.c:327
scpi_result_t SCPI_CoreWai(scpi_t *context)
Definition ieee488.c:348
#define STB_QES
Definition ieee488.h:64
#define STB_SRQ
Definition ieee488.h:67
#define STB_ESR
Definition ieee488.h:66
#define STB_OPS
Definition ieee488.h:68
#define ESR_OPC
Definition ieee488.h:71
scpi_bool_t SCPI_ParamInt32(scpi_t *context, int32_t *value, scpi_bool_t mandatory)
Definition parser.c:1158
size_t SCPI_ResultInt32(scpi_t *context, int32_t val)
Definition parser.c:527
#define SCPI_ResultMnemonic(context, data)
Definition parser.h:61
bool scpi_bool_t
Definition types.h:67
@ SCPI_RES_ERR
Definition types.h:111
@ SCPI_RES_OK
Definition types.h:110
@ SCPI_REG_ESE
Definition types.h:75
@ SCPI_REG_SRE
Definition types.h:73
@ SCPI_REG_COUNT
Definition types.h:82
@ SCPI_REG_OPERE
Definition types.h:77
@ SCPI_REG_QUES
Definition types.h:78
@ SCPI_REG_STB
Definition types.h:72
@ SCPI_REG_ESR
Definition types.h:74
@ SCPI_REG_OPER
Definition types.h:76
@ SCPI_REG_QUESE
Definition types.h:79
uint16_t scpi_reg_val_t
Definition types.h:106
enum _scpi_reg_name_t scpi_reg_name_t
Definition types.h:84
#define TRUE
Definition types.h:63
#define FALSE
Definition types.h:60
@ SCPI_CTRL_SRQ
Definition types.h:87
enum _scpi_result_t scpi_result_t
Definition types.h:113
enum _scpi_ctrl_name_t scpi_ctrl_name_t
Definition types.h:104