https://github.com/j123b567/scpi-parser

Dependents:   scpi_sx127x scpi_sx127x_firstTest MLX90418_I2C_master

Committer:
dudmuck
Date:
Fri Aug 07 21:54:11 2015 +0000
Revision:
1:b497f235115a
Parent:
0:aad43948c45c
update from github commit 6e5e3e0e3fc450eaf53feee059824ad85c4f270d

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:aad43948c45c 1 /*-
dudmuck 0:aad43948c45c 2 * Copyright (c) 2012-2013 Jan Breuer,
dudmuck 0:aad43948c45c 3 *
dudmuck 0:aad43948c45c 4 * All Rights Reserved
dudmuck 1:b497f235115a 5 *
dudmuck 0:aad43948c45c 6 * Redistribution and use in source and binary forms, with or without
dudmuck 0:aad43948c45c 7 * modification, are permitted provided that the following conditions are
dudmuck 0:aad43948c45c 8 * met:
dudmuck 0:aad43948c45c 9 * 1. Redistributions of source code must retain the above copyright notice,
dudmuck 0:aad43948c45c 10 * this list of conditions and the following disclaimer.
dudmuck 0:aad43948c45c 11 * 2. Redistributions in binary form must reproduce the above copyright
dudmuck 0:aad43948c45c 12 * notice, this list of conditions and the following disclaimer in the
dudmuck 0:aad43948c45c 13 * documentation and/or other materials provided with the distribution.
dudmuck 1:b497f235115a 14 *
dudmuck 0:aad43948c45c 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
dudmuck 0:aad43948c45c 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
dudmuck 0:aad43948c45c 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
dudmuck 0:aad43948c45c 18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
dudmuck 0:aad43948c45c 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dudmuck 0:aad43948c45c 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
dudmuck 0:aad43948c45c 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
dudmuck 0:aad43948c45c 22 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
dudmuck 0:aad43948c45c 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
dudmuck 0:aad43948c45c 24 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
dudmuck 0:aad43948c45c 25 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dudmuck 0:aad43948c45c 26 */
dudmuck 0:aad43948c45c 27
dudmuck 0:aad43948c45c 28 /**
dudmuck 0:aad43948c45c 29 * @file scpi_error.c
dudmuck 0:aad43948c45c 30 * @date Thu Nov 15 10:58:45 UTC 2012
dudmuck 1:b497f235115a 31 *
dudmuck 0:aad43948c45c 32 * @brief Error handling and storing routines
dudmuck 1:b497f235115a 33 *
dudmuck 1:b497f235115a 34 *
dudmuck 0:aad43948c45c 35 */
dudmuck 0:aad43948c45c 36
dudmuck 0:aad43948c45c 37 #include <stdint.h>
dudmuck 0:aad43948c45c 38
dudmuck 0:aad43948c45c 39 #include "scpi/parser.h"
dudmuck 0:aad43948c45c 40 #include "scpi/ieee488.h"
dudmuck 0:aad43948c45c 41 #include "scpi/error.h"
dudmuck 1:b497f235115a 42 #include "fifo_private.h"
dudmuck 0:aad43948c45c 43
dudmuck 0:aad43948c45c 44 /* basic FIFO */
dudmuck 1:b497f235115a 45 static scpi_fifo_t local_error_queue;
dudmuck 0:aad43948c45c 46
dudmuck 0:aad43948c45c 47
dudmuck 1:b497f235115a 48 /**
dudmuck 1:b497f235115a 49 * Initialize error queue
dudmuck 1:b497f235115a 50 * @param context - scpi context
dudmuck 1:b497f235115a 51 */
dudmuck 0:aad43948c45c 52 void SCPI_ErrorInit(scpi_t * context) {
dudmuck 0:aad43948c45c 53 /*
dudmuck 0:aad43948c45c 54 * // FreeRTOS
dudmuck 0:aad43948c45c 55 * context->error_queue = (scpi_error_queue_t)xQueueCreate(100, sizeof(int16_t));
dudmuck 0:aad43948c45c 56 */
dudmuck 0:aad43948c45c 57
dudmuck 0:aad43948c45c 58 /* basic FIFO */
dudmuck 0:aad43948c45c 59 context->error_queue = (scpi_error_queue_t)&local_error_queue;
dudmuck 1:b497f235115a 60 fifo_init((scpi_fifo_t *)context->error_queue);
dudmuck 1:b497f235115a 61 }
dudmuck 1:b497f235115a 62
dudmuck 1:b497f235115a 63 /**
dudmuck 1:b497f235115a 64 * Emit no error
dudmuck 1:b497f235115a 65 * @param context scpi context
dudmuck 1:b497f235115a 66 */
dudmuck 1:b497f235115a 67 static void SCPI_ErrorEmitEmpty(scpi_t * context) {
dudmuck 1:b497f235115a 68 if ((SCPI_ErrorCount(context) == 0) && (SCPI_RegGet(context, SCPI_REG_STB) & STB_QMA)) {
dudmuck 1:b497f235115a 69 SCPI_RegClearBits(context, SCPI_REG_STB, STB_QMA);
dudmuck 1:b497f235115a 70
dudmuck 1:b497f235115a 71 if (context->interface && context->interface->error) {
dudmuck 1:b497f235115a 72 context->interface->error(context, 0);
dudmuck 1:b497f235115a 73 }
dudmuck 1:b497f235115a 74 }
dudmuck 1:b497f235115a 75 }
dudmuck 1:b497f235115a 76
dudmuck 1:b497f235115a 77 /**
dudmuck 1:b497f235115a 78 * Emit error
dudmuck 1:b497f235115a 79 * @param context scpi context
dudmuck 1:b497f235115a 80 * @param err Error to emit
dudmuck 1:b497f235115a 81 */
dudmuck 1:b497f235115a 82 static void SCPI_ErrorEmit(scpi_t * context, int16_t err) {
dudmuck 1:b497f235115a 83 SCPI_RegSetBits(context, SCPI_REG_STB, STB_QMA);
dudmuck 1:b497f235115a 84
dudmuck 1:b497f235115a 85 if (context->interface && context->interface->error) {
dudmuck 1:b497f235115a 86 context->interface->error(context, err);
dudmuck 1:b497f235115a 87 }
dudmuck 0:aad43948c45c 88 }
dudmuck 0:aad43948c45c 89
dudmuck 0:aad43948c45c 90 /**
dudmuck 0:aad43948c45c 91 * Clear error queue
dudmuck 0:aad43948c45c 92 * @param context - scpi context
dudmuck 0:aad43948c45c 93 */
dudmuck 0:aad43948c45c 94 void SCPI_ErrorClear(scpi_t * context) {
dudmuck 0:aad43948c45c 95 /*
dudmuck 0:aad43948c45c 96 * // FreeRTOS
dudmuck 0:aad43948c45c 97 * xQueueReset((xQueueHandle)context->error_queue);
dudmuck 0:aad43948c45c 98 */
dudmuck 0:aad43948c45c 99
dudmuck 0:aad43948c45c 100 /* basic FIFO */
dudmuck 1:b497f235115a 101 fifo_clear((scpi_fifo_t *)context->error_queue);
dudmuck 1:b497f235115a 102
dudmuck 1:b497f235115a 103 SCPI_ErrorEmitEmpty(context);
dudmuck 0:aad43948c45c 104 }
dudmuck 0:aad43948c45c 105
dudmuck 0:aad43948c45c 106 /**
dudmuck 0:aad43948c45c 107 * Pop error from queue
dudmuck 0:aad43948c45c 108 * @param context - scpi context
dudmuck 0:aad43948c45c 109 * @return error number
dudmuck 0:aad43948c45c 110 */
dudmuck 0:aad43948c45c 111 int16_t SCPI_ErrorPop(scpi_t * context) {
dudmuck 0:aad43948c45c 112 int16_t result = 0;
dudmuck 0:aad43948c45c 113
dudmuck 0:aad43948c45c 114 /*
dudmuck 0:aad43948c45c 115 * // FreeRTOS
dudmuck 0:aad43948c45c 116 * if (pdFALSE == xQueueReceive((xQueueHandle)context->error_queue, &result, 0)) {
dudmuck 0:aad43948c45c 117 * result = 0;
dudmuck 0:aad43948c45c 118 * }
dudmuck 0:aad43948c45c 119 */
dudmuck 0:aad43948c45c 120
dudmuck 0:aad43948c45c 121 /* basic FIFO */
dudmuck 1:b497f235115a 122 fifo_remove((scpi_fifo_t *)context->error_queue, &result);
dudmuck 1:b497f235115a 123
dudmuck 1:b497f235115a 124 SCPI_ErrorEmitEmpty(context);
dudmuck 0:aad43948c45c 125
dudmuck 0:aad43948c45c 126 return result;
dudmuck 0:aad43948c45c 127 }
dudmuck 0:aad43948c45c 128
dudmuck 0:aad43948c45c 129 /**
dudmuck 0:aad43948c45c 130 * Return number of errors/events in the queue
dudmuck 0:aad43948c45c 131 * @param context
dudmuck 1:b497f235115a 132 * @return
dudmuck 0:aad43948c45c 133 */
dudmuck 0:aad43948c45c 134 int32_t SCPI_ErrorCount(scpi_t * context) {
dudmuck 0:aad43948c45c 135 int16_t result = 0;
dudmuck 0:aad43948c45c 136
dudmuck 0:aad43948c45c 137 /*
dudmuck 0:aad43948c45c 138 * // FreeRTOS
dudmuck 0:aad43948c45c 139 * result = uxQueueMessagesWaiting((xQueueHandle)context->error_queue);
dudmuck 0:aad43948c45c 140 */
dudmuck 0:aad43948c45c 141
dudmuck 0:aad43948c45c 142 /* basic FIFO */
dudmuck 1:b497f235115a 143 fifo_count((scpi_fifo_t *)context->error_queue, &result);
dudmuck 0:aad43948c45c 144
dudmuck 0:aad43948c45c 145 return result;
dudmuck 0:aad43948c45c 146 }
dudmuck 0:aad43948c45c 147
dudmuck 0:aad43948c45c 148 static void SCPI_ErrorAddInternal(scpi_t * context, int16_t err) {
dudmuck 0:aad43948c45c 149 /*
dudmuck 0:aad43948c45c 150 * // FreeRTOS
dudmuck 0:aad43948c45c 151 * xQueueSend((xQueueHandle)context->error_queue, &err, 0);
dudmuck 0:aad43948c45c 152 */
dudmuck 0:aad43948c45c 153
dudmuck 0:aad43948c45c 154 /* basic FIFO */
dudmuck 1:b497f235115a 155 fifo_add((scpi_fifo_t *)context->error_queue, err);
dudmuck 0:aad43948c45c 156 }
dudmuck 0:aad43948c45c 157
dudmuck 0:aad43948c45c 158 struct error_reg {
dudmuck 0:aad43948c45c 159 int16_t from;
dudmuck 0:aad43948c45c 160 int16_t to;
dudmuck 0:aad43948c45c 161 scpi_reg_val_t bit;
dudmuck 0:aad43948c45c 162 };
dudmuck 0:aad43948c45c 163
dudmuck 1:b497f235115a 164 #define ERROR_DEFS_N 9
dudmuck 0:aad43948c45c 165
dudmuck 0:aad43948c45c 166 static const struct error_reg errs[ERROR_DEFS_N] = {
dudmuck 0:aad43948c45c 167 {-100, -199, ESR_CER}, /* Command error (e.g. syntax error) ch 21.8.9 */
dudmuck 0:aad43948c45c 168 {-200, -299, ESR_EER}, /* Execution Error (e.g. range error) ch 21.8.10 */
dudmuck 0:aad43948c45c 169 {-300, -399, ESR_DER}, /* Device specific error -300, -399 ch 21.8.11 */
dudmuck 1:b497f235115a 170 { 1,32767, ESR_DER}, /* Device designer provided specific error 1, 32767 ch 21.8.11 */
dudmuck 0:aad43948c45c 171 {-400, -499, ESR_QER}, /* Query error -400, -499 ch 21.8.12 */
dudmuck 0:aad43948c45c 172 {-500, -599, ESR_PON}, /* Power on event -500, -599 ch 21.8.13 */
dudmuck 0:aad43948c45c 173 {-600, -699, ESR_URQ}, /* User Request Event -600, -699 ch 21.8.14 */
dudmuck 0:aad43948c45c 174 {-700, -799, ESR_REQ}, /* Request Control Event -700, -799 ch 21.8.15 */
dudmuck 0:aad43948c45c 175 {-800, -899, ESR_OPC}, /* Operation Complete Event -800, -899 ch 21.8.16 */
dudmuck 0:aad43948c45c 176 };
dudmuck 0:aad43948c45c 177
dudmuck 0:aad43948c45c 178 /**
dudmuck 0:aad43948c45c 179 * Push error to queue
dudmuck 0:aad43948c45c 180 * @param context - scpi context
dudmuck 0:aad43948c45c 181 * @param err - error number
dudmuck 0:aad43948c45c 182 */
dudmuck 0:aad43948c45c 183 void SCPI_ErrorPush(scpi_t * context, int16_t err) {
dudmuck 0:aad43948c45c 184
dudmuck 0:aad43948c45c 185 int i;
dudmuck 0:aad43948c45c 186
dudmuck 0:aad43948c45c 187 SCPI_ErrorAddInternal(context, err);
dudmuck 0:aad43948c45c 188
dudmuck 0:aad43948c45c 189 for(i = 0; i < ERROR_DEFS_N; i++) {
dudmuck 0:aad43948c45c 190 if ((err <= errs[i].from) && (err >= errs[i].to)) {
dudmuck 0:aad43948c45c 191 SCPI_RegSetBits(context, SCPI_REG_ESR, errs[i].bit);
dudmuck 0:aad43948c45c 192 }
dudmuck 0:aad43948c45c 193 }
dudmuck 0:aad43948c45c 194
dudmuck 1:b497f235115a 195 SCPI_ErrorEmit(context, err);
dudmuck 1:b497f235115a 196
dudmuck 0:aad43948c45c 197 if (context) {
dudmuck 0:aad43948c45c 198 context->cmd_error = TRUE;
dudmuck 0:aad43948c45c 199 }
dudmuck 0:aad43948c45c 200 }
dudmuck 0:aad43948c45c 201
dudmuck 0:aad43948c45c 202 /**
dudmuck 0:aad43948c45c 203 * Translate error number to string
dudmuck 0:aad43948c45c 204 * @param err - error number
dudmuck 0:aad43948c45c 205 * @return Error string representation
dudmuck 0:aad43948c45c 206 */
dudmuck 0:aad43948c45c 207 const char * SCPI_ErrorTranslate(int16_t err) {
dudmuck 0:aad43948c45c 208 switch (err) {
dudmuck 0:aad43948c45c 209 case 0: return "No error";
dudmuck 1:b497f235115a 210 #define X(def, val, str) case def: return str;
dudmuck 1:b497f235115a 211 #if USE_FULL_ERROR_LIST
dudmuck 1:b497f235115a 212 #define XE X
dudmuck 1:b497f235115a 213 #else
dudmuck 1:b497f235115a 214 #define XE(def, val, str)
dudmuck 1:b497f235115a 215 #endif
dudmuck 1:b497f235115a 216 LIST_OF_ERRORS
dudmuck 1:b497f235115a 217
dudmuck 1:b497f235115a 218 #if USE_USER_ERROR_LIST
dudmuck 1:b497f235115a 219 LIST_OF_USER_ERRORS
dudmuck 1:b497f235115a 220 #endif
dudmuck 1:b497f235115a 221 #undef X
dudmuck 1:b497f235115a 222 #undef XE
dudmuck 0:aad43948c45c 223 default: return "Unknown error";
dudmuck 0:aad43948c45c 224 }
dudmuck 0:aad43948c45c 225 }