Jan Breuer
2012-11-27 884a288cc0f15f5ab9ea36077b08ff002ff7eac2
scpi/scpi_error.c
@@ -34,52 +34,37 @@
 * 
 */
#include "scpi.h"
#include "scpi_ieee488.h"
#include "scpi_error.h"
#include <stdint.h>
static int16_t scpi_err = 0;
#include "scpi_parser.h"
#include "scpi_ieee488.h"
#include "scpi_error.h"
#include "scpi_fifo.h"
// basic FIFO
static fifo_t local_error_queue;
void SCPI_ErrorInit(scpi_t * context) {
    //// FreeRTOS
    // context->error_queue = (scpi_error_queue_t)xQueueCreate(100, sizeof(int16_t));
    // basic FIFO
    context->error_queue = (scpi_error_queue_t)&local_error_queue;
    fifo_init((fifo_t *)context->error_queue);
}
/**
 * Clear error queue
 * @param context - scpi context
 */
void SCPI_ErrorClear(scpi_t * context) {
    (void) context;
    scpi_err = 0;
}
    //// FreeRTOS
    //xQueueReset((xQueueHandle)context->error_queue);
/**
 * Push error to queue
 * @param context - scpi context
 * @param err - error number
 */
void SCPI_ErrorPush(scpi_t * context, int16_t err) {
    scpi_err = err;
    // Command error (e.g. syntax error)
    if ((err < -101) && (err > -158)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_CER);
    }
    // Execution Error (e.g. range error)
    if ((err < -211) && (err > -230)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_EER);
    }
    // Device Dependent Error
    if ((err < -501) && (err > -748)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_DER);
    }
    if (context) {
        if (context->interface && context->interface->error) {
            context->interface->error(context, err);
        }
        context->error = TRUE;
    }
    // basic FIFO
    fifo_clear((fifo_t *)context->error_queue);
}
/**
@@ -88,10 +73,99 @@
 * @return error number
 */
int16_t SCPI_ErrorPop(scpi_t * context) {
    (void) context;
    int16_t result = scpi_err;
    scpi_err = 0;
    int16_t result = 0;
    //// FreeRTOS
    //if (pdFALSE == xQueueReceive((xQueueHandle)context->error_queue, &result, 0)) {
    //    result = 0;
    //}
    // basic FIFO
    fifo_pop((fifo_t *)context->error_queue, &result);
    return result;
}
/**
 * Return number of errors/events in the queue
 * @param context
 * @return
 */
int32_t SCPI_ErrorCount(scpi_t * context) {
    int16_t result = 0;
    //// FreeRTOS
    //result = uxQueueMessagesWaiting((xQueueHandle)context->error_queue);
    //basic FIFO
    fifo_count((fifo_t *)context->error_queue, &result);
    return result;
}
static void SCPI_ErrorPushInternal(scpi_t * context, int16_t err) {
    //// FreeRTOS
    //xQueueSend((xQueueHandle)context->error_queue, &err, 0);
    // basic FIFO
    fifo_push((fifo_t *)context->error_queue, err);
}
/**
 * Push error to queue
 * @param context - scpi context
 * @param err - error number
 */
void SCPI_ErrorPush(scpi_t * context, int16_t err) {
    SCPI_ErrorPushInternal(context, err);
    // Command error (e.g. syntax error) ch 21.8.9
    if ((err < -100) && (err > -199)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_CER);
    }
    // Execution Error (e.g. range error) ch 21.8.10
    if ((err < -200) && (err > -299)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_EER);
    }
    // Device specific error -300, -399 ch 21.8.11
    if ((err < -300) && (err > -399)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_DER);
    }
    // Query error -400, -499 ch 21.8.12
    if ((err < -400) && (err > -499)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_QER);
    }
    // Power on event -500, -599 ch 21.8.13
    if ((err < -500) && (err > -599)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_PON);
    }
    // User Request Event -600, -699 ch 21.8.14
    if ((err < -600) && (err > -699)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_URQ);
    }
    // Request Control Event -700, -799 ch 21.8.15
    if ((err < -700) && (err > -799)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_REQ);
    }
    // Operation Complete Event -800, -899 ch 21.8.16
    if ((err < -800) && (err > -899)) {
        SCPI_RegSetBits(SCPI_REG_ESR, ESR_OPC);
    }
    if (context) {
        if (context->interface && context->interface->error) {
            context->interface->error(context, err);
        }
        context->cmd_error = TRUE;
    }
}
/**
@@ -112,3 +186,5 @@
        default: return "Unknown error";
    }
}