From ed07df16da675c4c123e02a996822daf13d69c63 Mon Sep 17 00:00:00 2001 From: lhoerl <coder@lolux.de> Date: 周一, 03 8月 2015 22:42:07 +0800 Subject: [PATCH] added full SCPI error messages added list for device dependent error messages some minor changes to get rid of compiler warnings added support for Keil ARM compiler added support for National Instruments CVI compiler removed bug if(c = '\0')... --- examples/test-LwIP-netconn/scpi_server.c | 192 ++++++++++++++++++++++++++++------------------- 1 files changed, 115 insertions(+), 77 deletions(-) diff --git a/examples/test-LwIP-netconn/scpi_server.c b/examples/test-LwIP-netconn/scpi_server.c index adce100..872d1f5 100644 --- a/examples/test-LwIP-netconn/scpi_server.c +++ b/examples/test-LwIP-netconn/scpi_server.c @@ -54,6 +54,15 @@ #define SCPI_THREAD_PRIO (tskIDLE_PRIORITY + 2) +#define SCPI_MSG_TIMEOUT 0 +#define SCPI_MSG_TEST 1 +#define SCPI_MSG_IO_LISTEN 2 +#define SCPI_MSG_CONTROL_IO_LISTEN 3 +#define SCPI_MSG_IO 4 +#define SCPI_MSG_CONTROL_IO 5 +#define SCPI_MSG_SET_ESE_REQ 6 +#define SCPI_MSG_SET_ERROR 7 + typedef struct { struct netconn *io_listen; struct netconn *control_io_listen; @@ -64,14 +73,22 @@ //fd_set fds; } user_data_t; +struct _queue_event_t +{ + uint8_t cmd; + uint8_t param1; + int16_t param2; +} __attribute__ ((__packed__)); +typedef struct _queue_event_t queue_event_t; + + user_data_t user_data = { .io_listen = NULL, - .io = NULL, + .io = NULL, .control_io_listen = NULL, .control_io = NULL, .evtQueue = 0, -}; - +}; size_t SCPI_Write(scpi_t * context, const char * data, size_t len) { if (context->user_context != NULL) { @@ -83,7 +100,7 @@ return 0; } -scpi_result_t SCPI_Flush(scpi_t * context) { +scpi_result_t SCPI_Flush(scpi_t * context) { if (context->user_context != NULL) { user_data_t * u = (user_data_t *)(context->user_context); if (u->io) { @@ -98,9 +115,16 @@ (void) context; // BEEP iprintf("**ERROR: %ld, \"%s\"\r\n", (int32_t) err, SCPI_ErrorTranslate(err)); + if (err != 0) { + /* New error */ + /* Beep */ + /* Error LED ON */ + } else { + /* No more errors in the queue */ + /* Error LED OFF */ + } return 0; } - scpi_result_t SCPI_Control(scpi_t * context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val) { char b[16]; @@ -117,13 +141,7 @@ snprintf(b, sizeof(b), "SRQ%d\r\n", val); return netconn_write(u->control_io, b, strlen(b), NETCONN_NOCOPY) == ERR_OK ? SCPI_RES_OK : SCPI_RES_ERR; } - } - return SCPI_RES_OK; -} - -scpi_result_t SCPI_Test(scpi_t * context) { - (void) context; - iprintf("**Test\r\n"); + } return SCPI_RES_OK; } @@ -139,27 +157,50 @@ } -#define SCPI_MSG_TEST 1 -#define SCPI_MSG_IO_LISTEN 2 -#define SCPI_MSG_CONTROL_IO_LISTEN 3 -#define SCPI_MSG_IO 4 -#define SCPI_MSG_CONTROL_IO 5 +static void setEseReq(void) { + SCPI_RegSetBits(&scpi_context, SCPI_REG_ESR, ESR_REQ); +} + +static void setError(int16_t err) { + SCPI_ErrorPush(&scpi_context, err); +} + +void SCPI_RequestControl(void) { + queue_event_t msg; + msg.cmd = SCPI_MSG_SET_ESE_REQ; + + /* Avoid sending evtQueue message if ESR_REQ is already set + if((SCPI_RegGet(&scpi_context, SCPI_REG_ESR) & ESR_REQ) == 0) { + xQueueSend(user_data.evtQueue, &msg, 1000); + } + */ + + xQueueSend(user_data.evtQueue, &msg, 1000); +} + +void SCPI_AddError(int16_t err) { + queue_event_t msg; + msg.cmd = SCPI_MSG_SET_ERROR; + msg.param2 = err; + + xQueueSend(user_data.evtQueue, &msg, 1000); +} void scpi_netconn_callback(struct netconn * conn, enum netconn_evt evt, u16_t len) { - uint32_t msg; + queue_event_t msg; (void) len; - - + + if (evt == NETCONN_EVT_RCVPLUS) { - msg = SCPI_MSG_TEST; + msg.cmd = SCPI_MSG_TEST; if (conn == user_data.io) { - msg = SCPI_MSG_IO; + msg.cmd = SCPI_MSG_IO; } else if (conn == user_data.io_listen) { - msg = SCPI_MSG_IO_LISTEN; + msg.cmd = SCPI_MSG_IO_LISTEN; } else if (conn == user_data.control_io) { - msg = SCPI_MSG_CONTROL_IO; + msg.cmd = SCPI_MSG_CONTROL_IO; } else if (conn == user_data.control_io_listen) { - msg = SCPI_MSG_CONTROL_IO_LISTEN; + msg.cmd = SCPI_MSG_CONTROL_IO_LISTEN; } xQueueSend(user_data.evtQueue, &msg, 1000); } @@ -168,40 +209,34 @@ static struct netconn * createServer(int port) { struct netconn * conn; err_t err; - + conn = netconn_new_with_callback(NETCONN_TCP, scpi_netconn_callback); if (conn == NULL) { return NULL; } - + err = netconn_bind(conn, NULL, port); if (err != ERR_OK) { netconn_delete(conn); return NULL; } - + netconn_listen(conn); - + return conn; } -static int waitServer(user_data_t * user_data) { - - uint32_t rc; - +static void waitServer(user_data_t * user_data, queue_event_t * evt) { /* 5s timeout */ - if (xQueueReceive(user_data->evtQueue, &rc, 5000 * portTICK_RATE_MS) != pdPASS) { - rc = 0; + if (xQueueReceive(user_data->evtQueue, evt, 5000 * portTICK_RATE_MS) != pdPASS) { + evt->cmd = SCPI_MSG_TIMEOUT; } - - return rc; } - static int processIoListen(user_data_t * user_data) { struct netconn *newconn; - + if (netconn_accept(user_data->io_listen, &newconn) == ERR_OK) { if (user_data->io) { // Close unwanted connection @@ -212,14 +247,14 @@ iprintf("***Connection established %s\r\n", inet_ntoa(newconn->pcb.ip->remote_ip)); user_data->io = newconn; } - } - + } + return 0; } static int processSrqIoListen(user_data_t * user_data) { struct netconn *newconn; - + if (netconn_accept(user_data->control_io_listen, &newconn) == ERR_OK) { if (user_data->control_io) { netconn_close(newconn); @@ -229,8 +264,8 @@ iprintf("***Control Connection established %s\r\n", inet_ntoa(newconn->pcb.ip->remote_ip)); user_data->control_io = newconn; } - } - + } + return 0; } @@ -247,13 +282,13 @@ netconn_close(user_data->control_io); netconn_delete(user_data->control_io); user_data->control_io = NULL; - iprintf("***Control Connection closed\r\n"); + iprintf("***Control Connection closed\r\n"); } static int processIo(user_data_t * user_data) { struct netbuf *inbuf; char* buf; - u16_t buflen; + u16_t buflen; if (netconn_recv(user_data->io, &inbuf) != ERR_OK) { goto fail1; @@ -261,7 +296,7 @@ if (netconn_err(user_data->io) != ERR_OK) { goto fail2; } - + netbuf_data(inbuf, (void**) &buf, &buflen); if (buflen > 0) { @@ -269,23 +304,23 @@ } else { //goto fail2; } - + netbuf_delete(inbuf); - + return 0; - + fail2: netbuf_delete(inbuf); fail1: closeIo(user_data); - + return 0; } static int processSrqIo(user_data_t * user_data) { struct netbuf *inbuf; char* buf; - u16_t buflen; + u16_t buflen; if (netconn_recv(user_data->control_io, &inbuf) != ERR_OK) { goto fail1; @@ -293,7 +328,7 @@ if (netconn_err(user_data->control_io) != ERR_OK) { goto fail2; } - + netbuf_data(inbuf, (void**) &buf, &buflen); if (buflen > 0) { @@ -301,16 +336,16 @@ } else { //goto fail2; } - + netbuf_delete(inbuf); return 0; - + fail2: netbuf_delete(inbuf); fail1: closeSrqIo(user_data); - + return 0; } @@ -318,50 +353,53 @@ * */ static void scpi_server_thread(void *arg) { - int rc; + queue_event_t evt; (void)arg; - user_data.evtQueue = xQueueCreate(10, sizeof(uint32_t)); - + user_data.evtQueue = xQueueCreate(10, sizeof(queue_event_t)); + // user_context will be pointer to socket scpi_context.user_context = &user_data; - + SCPI_Init(&scpi_context); user_data.io_listen = createServer(DEVICE_PORT); user_data.control_io_listen = createServer(CONTROL_PORT); - + while(1) { - rc = waitServer(&user_data); - - if (rc < 0) { // failed - iprintf("select failed"); - break; + waitServer(&user_data, &evt); + + if (evt.cmd == SCPI_MSG_TIMEOUT) { // timeout + SCPI_Input(&scpi_context, NULL, 0); } - if (rc == 0) { // timeout - SCPI_Input(&scpi_context, NULL, 0); - } - - if ((user_data.io_listen != NULL) && (rc == SCPI_MSG_IO_LISTEN)) { + if ((user_data.io_listen != NULL) && (evt.cmd == SCPI_MSG_IO_LISTEN)) { processIoListen(&user_data); } - if ((user_data.control_io_listen != NULL) && (rc == SCPI_MSG_CONTROL_IO_LISTEN)) { + if ((user_data.control_io_listen != NULL) && (evt.cmd == SCPI_MSG_CONTROL_IO_LISTEN)) { processSrqIoListen(&user_data); } - - if ((user_data.io != NULL) && (rc == SCPI_MSG_IO)) { + + if ((user_data.io != NULL) && (evt.cmd == SCPI_MSG_IO)) { processIo(&user_data); } - - if ((user_data.control_io != NULL) && (rc == SCPI_MSG_CONTROL_IO)) { + + if ((user_data.control_io != NULL) && (evt.cmd == SCPI_MSG_CONTROL_IO)) { processSrqIo(&user_data); } + + if (evt.cmd == SCPI_MSG_SET_ESE_REQ) { + setEseReq(); + } + if (evt.cmd == SCPI_MSG_SET_ERROR) { + setError(evt.param2); + } + } - + vTaskDelete(NULL); } -- Gitblit v1.9.1