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

Dependents:   scpi_sx127x scpi_sx127x_firstTest MLX90418_I2C_master

Committer:
dudmuck
Date:
Thu Apr 09 22:42:15 2015 +0000
Revision:
0:aad43948c45c
Child:
1:b497f235115a
SCPI library

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 0:aad43948c45c 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 0:aad43948c45c 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 0:aad43948c45c 31 *
dudmuck 0:aad43948c45c 32 * @brief Error handling and storing routines
dudmuck 0:aad43948c45c 33 *
dudmuck 0:aad43948c45c 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 0:aad43948c45c 42 #include "scpi/fifo.h"
dudmuck 0:aad43948c45c 43
dudmuck 0:aad43948c45c 44 /* basic FIFO */
dudmuck 0:aad43948c45c 45 static fifo_t local_error_queue;
dudmuck 0:aad43948c45c 46
dudmuck 0:aad43948c45c 47
dudmuck 0:aad43948c45c 48
dudmuck 0:aad43948c45c 49 void SCPI_ErrorInit(scpi_t * context) {
dudmuck 0:aad43948c45c 50 /*
dudmuck 0:aad43948c45c 51 * // FreeRTOS
dudmuck 0:aad43948c45c 52 * context->error_queue = (scpi_error_queue_t)xQueueCreate(100, sizeof(int16_t));
dudmuck 0:aad43948c45c 53 */
dudmuck 0:aad43948c45c 54
dudmuck 0:aad43948c45c 55 /* basic FIFO */
dudmuck 0:aad43948c45c 56 context->error_queue = (scpi_error_queue_t)&local_error_queue;
dudmuck 0:aad43948c45c 57 fifo_init((fifo_t *)context->error_queue);
dudmuck 0:aad43948c45c 58 }
dudmuck 0:aad43948c45c 59
dudmuck 0:aad43948c45c 60 /**
dudmuck 0:aad43948c45c 61 * Clear error queue
dudmuck 0:aad43948c45c 62 * @param context - scpi context
dudmuck 0:aad43948c45c 63 */
dudmuck 0:aad43948c45c 64 void SCPI_ErrorClear(scpi_t * context) {
dudmuck 0:aad43948c45c 65 /*
dudmuck 0:aad43948c45c 66 * // FreeRTOS
dudmuck 0:aad43948c45c 67 * xQueueReset((xQueueHandle)context->error_queue);
dudmuck 0:aad43948c45c 68 */
dudmuck 0:aad43948c45c 69
dudmuck 0:aad43948c45c 70 /* basic FIFO */
dudmuck 0:aad43948c45c 71 fifo_clear((fifo_t *)context->error_queue);
dudmuck 0:aad43948c45c 72 }
dudmuck 0:aad43948c45c 73
dudmuck 0:aad43948c45c 74 /**
dudmuck 0:aad43948c45c 75 * Pop error from queue
dudmuck 0:aad43948c45c 76 * @param context - scpi context
dudmuck 0:aad43948c45c 77 * @return error number
dudmuck 0:aad43948c45c 78 */
dudmuck 0:aad43948c45c 79 int16_t SCPI_ErrorPop(scpi_t * context) {
dudmuck 0:aad43948c45c 80 int16_t result = 0;
dudmuck 0:aad43948c45c 81
dudmuck 0:aad43948c45c 82 /*
dudmuck 0:aad43948c45c 83 * // FreeRTOS
dudmuck 0:aad43948c45c 84 * if (pdFALSE == xQueueReceive((xQueueHandle)context->error_queue, &result, 0)) {
dudmuck 0:aad43948c45c 85 * result = 0;
dudmuck 0:aad43948c45c 86 * }
dudmuck 0:aad43948c45c 87 */
dudmuck 0:aad43948c45c 88
dudmuck 0:aad43948c45c 89 /* basic FIFO */
dudmuck 0:aad43948c45c 90 fifo_remove((fifo_t *)context->error_queue, &result);
dudmuck 0:aad43948c45c 91
dudmuck 0:aad43948c45c 92 return result;
dudmuck 0:aad43948c45c 93 }
dudmuck 0:aad43948c45c 94
dudmuck 0:aad43948c45c 95 /**
dudmuck 0:aad43948c45c 96 * Return number of errors/events in the queue
dudmuck 0:aad43948c45c 97 * @param context
dudmuck 0:aad43948c45c 98 * @return
dudmuck 0:aad43948c45c 99 */
dudmuck 0:aad43948c45c 100 int32_t SCPI_ErrorCount(scpi_t * context) {
dudmuck 0:aad43948c45c 101 int16_t result = 0;
dudmuck 0:aad43948c45c 102
dudmuck 0:aad43948c45c 103 /*
dudmuck 0:aad43948c45c 104 * // FreeRTOS
dudmuck 0:aad43948c45c 105 * result = uxQueueMessagesWaiting((xQueueHandle)context->error_queue);
dudmuck 0:aad43948c45c 106 */
dudmuck 0:aad43948c45c 107
dudmuck 0:aad43948c45c 108 /* basic FIFO */
dudmuck 0:aad43948c45c 109 fifo_count((fifo_t *)context->error_queue, &result);
dudmuck 0:aad43948c45c 110
dudmuck 0:aad43948c45c 111 return result;
dudmuck 0:aad43948c45c 112 }
dudmuck 0:aad43948c45c 113
dudmuck 0:aad43948c45c 114 static void SCPI_ErrorAddInternal(scpi_t * context, int16_t err) {
dudmuck 0:aad43948c45c 115 /*
dudmuck 0:aad43948c45c 116 * // FreeRTOS
dudmuck 0:aad43948c45c 117 * xQueueSend((xQueueHandle)context->error_queue, &err, 0);
dudmuck 0:aad43948c45c 118 */
dudmuck 0:aad43948c45c 119
dudmuck 0:aad43948c45c 120 /* basic FIFO */
dudmuck 0:aad43948c45c 121 fifo_add((fifo_t *)context->error_queue, err);
dudmuck 0:aad43948c45c 122 }
dudmuck 0:aad43948c45c 123
dudmuck 0:aad43948c45c 124 struct error_reg {
dudmuck 0:aad43948c45c 125 int16_t from;
dudmuck 0:aad43948c45c 126 int16_t to;
dudmuck 0:aad43948c45c 127 scpi_reg_val_t bit;
dudmuck 0:aad43948c45c 128 };
dudmuck 0:aad43948c45c 129
dudmuck 0:aad43948c45c 130 #define ERROR_DEFS_N 8
dudmuck 0:aad43948c45c 131
dudmuck 0:aad43948c45c 132 static const struct error_reg errs[ERROR_DEFS_N] = {
dudmuck 0:aad43948c45c 133 {-100, -199, ESR_CER}, /* Command error (e.g. syntax error) ch 21.8.9 */
dudmuck 0:aad43948c45c 134 {-200, -299, ESR_EER}, /* Execution Error (e.g. range error) ch 21.8.10 */
dudmuck 0:aad43948c45c 135 {-300, -399, ESR_DER}, /* Device specific error -300, -399 ch 21.8.11 */
dudmuck 0:aad43948c45c 136 {-400, -499, ESR_QER}, /* Query error -400, -499 ch 21.8.12 */
dudmuck 0:aad43948c45c 137 {-500, -599, ESR_PON}, /* Power on event -500, -599 ch 21.8.13 */
dudmuck 0:aad43948c45c 138 {-600, -699, ESR_URQ}, /* User Request Event -600, -699 ch 21.8.14 */
dudmuck 0:aad43948c45c 139 {-700, -799, ESR_REQ}, /* Request Control Event -700, -799 ch 21.8.15 */
dudmuck 0:aad43948c45c 140 {-800, -899, ESR_OPC}, /* Operation Complete Event -800, -899 ch 21.8.16 */
dudmuck 0:aad43948c45c 141 };
dudmuck 0:aad43948c45c 142
dudmuck 0:aad43948c45c 143 /**
dudmuck 0:aad43948c45c 144 * Push error to queue
dudmuck 0:aad43948c45c 145 * @param context - scpi context
dudmuck 0:aad43948c45c 146 * @param err - error number
dudmuck 0:aad43948c45c 147 */
dudmuck 0:aad43948c45c 148 void SCPI_ErrorPush(scpi_t * context, int16_t err) {
dudmuck 0:aad43948c45c 149
dudmuck 0:aad43948c45c 150 int i;
dudmuck 0:aad43948c45c 151
dudmuck 0:aad43948c45c 152 SCPI_ErrorAddInternal(context, err);
dudmuck 0:aad43948c45c 153
dudmuck 0:aad43948c45c 154 for(i = 0; i < ERROR_DEFS_N; i++) {
dudmuck 0:aad43948c45c 155 if ((err <= errs[i].from) && (err >= errs[i].to)) {
dudmuck 0:aad43948c45c 156 SCPI_RegSetBits(context, SCPI_REG_ESR, errs[i].bit);
dudmuck 0:aad43948c45c 157 }
dudmuck 0:aad43948c45c 158 }
dudmuck 0:aad43948c45c 159
dudmuck 0:aad43948c45c 160 if (context) {
dudmuck 0:aad43948c45c 161 if (context->interface && context->interface->error) {
dudmuck 0:aad43948c45c 162 context->interface->error(context, err);
dudmuck 0:aad43948c45c 163 }
dudmuck 0:aad43948c45c 164
dudmuck 0:aad43948c45c 165 context->cmd_error = TRUE;
dudmuck 0:aad43948c45c 166 }
dudmuck 0:aad43948c45c 167 }
dudmuck 0:aad43948c45c 168
dudmuck 0:aad43948c45c 169 /**
dudmuck 0:aad43948c45c 170 * Translate error number to string
dudmuck 0:aad43948c45c 171 * @param err - error number
dudmuck 0:aad43948c45c 172 * @return Error string representation
dudmuck 0:aad43948c45c 173 */
dudmuck 0:aad43948c45c 174 const char * SCPI_ErrorTranslate(int16_t err) {
dudmuck 0:aad43948c45c 175 switch (err) {
dudmuck 0:aad43948c45c 176 case 0: return "No error";
dudmuck 0:aad43948c45c 177 #define X(def, val, str) case def: return str;
dudmuck 0:aad43948c45c 178 LIST_OF_ERRORS
dudmuck 0:aad43948c45c 179 #undef X
dudmuck 0:aad43948c45c 180 default: return "Unknown error";
dudmuck 0:aad43948c45c 181 }
dudmuck 0:aad43948c45c 182 }
dudmuck 0:aad43948c45c 183
dudmuck 0:aad43948c45c 184