| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #include <stdio.h>
- #define SCPI_ARGS_N 0
- #include "app/scpi/scpi_handler.h"
- #include "app/scpi/commandHandlers/opc.h"
- #include "app/nfm/nfm_base.h"
- // Refer to:
- // [1] SCPI Specification, revision 1999.0
- // "Standard Commands for Programmable Instruments (SCPI), VERSION 1999.0, May 1999"
- // [2] Gpib Programming Tutorial, (http://g2pc1.bu.edu/~qzpeng/gpib/manual/GpibProgTut.pdf)
- // Electronics Group (http://www.few.vu.nl/~elec), 11 January 2000 Electronics Group
- // [3] IEEE 488.2 Standard, revision IEEE Std 488.2-1987 (1992)
- // "IEEE Standard Codes, Formats, Protocols, and Common Commands for Use With IEEE Std 488.1-1987, IEEE
- // Standard Digital Interface for Programmable Instrumentation"
- // =================================================================================
- // @fsqvbl_CommandHandlerOPC
- // State's virtual table
- static void fsqe_CommandHandlerOPC( const struct fFSeqEntry_t * this, tFSeqCtx_t ctx );
- static void fsql_CommandHandlerOPC( const struct fFSeqEntry_t * this, tFSeqCtx_t ctx );
- static const struct fFSeqEntry_t * fsqf_CommandHandlerOPC( const struct fFSeqEntry_t * this, tFSeqCtx_t ctx, const struct fFSeqEntry_t * * pDeferredNext );
- const fFSeqVTable_t fsqvbl_CommandHandlerOPC =
- {
- .f = fsqf_CommandHandlerOPC,
- .enter = fsqe_CommandHandlerOPC,
- .leave = fsql_CommandHandlerOPC
- };
- static void fsqe_CommandHandlerOPC( const struct fFSeqEntry_t * this, tFSeqCtx_t ctx )
- {
- sProcessProgramDataCommonContext_t * common_ctx = ctx;
- SCPI_PARSE_ARGUMENTS( common_ctx ); (void)common_ctx->argsParserStatus; // status is modified
- common_ctx->OPC.idx = 0; // reset position
- }
- static void fsql_CommandHandlerOPC( const struct fFSeqEntry_t * this, tFSeqCtx_t ctx )
- {
- }
- static const struct fFSeqEntry_t * fsqf_CommandHandlerOPC( const struct fFSeqEntry_t * this,
- tFSeqCtx_t ctx,
- const struct fFSeqEntry_t * * pDeferredNext )
- {
- const fFSeqEntry_t * nextstate = NULL;
-
- sProcessProgramDataCommonContext_t * common_ctx = ctx;
- sScpiParserContext_t * global_ctx = common_ctx->global_ctx;
- switch( common_ctx->event )
- {
- case eProgramData_Event_Write:
- {
- if( eScpiStatus_success != common_ctx->argsParserStatus ) // check argument parser status
- {
- common_ctx->status = eProgramDataArgumentSyntax; // parameter syntax error, caller should generate error message
- }
- else
- if( common_ctx->isQuery )
- {
- common_ctx->status = eProgramDataNeedRead; // request processed, wait for reading...
- (void)nextstate; // stay in this state
- }
- else
- {
-
- // "11.2 Status Byte Register", [1]
- // "12.5.2.1.2 Operation Complete Command Active State (OCAS)", [3]
- // "4.1.3.3 *OPC and *WAI", [1]
- // Implementation of the *OPC and *WAI commands is straightforward in devices which
- // implement only sequential commands. When executing *OPC the device simply sets the OPC bit of SESR.
- GPIBMachine.fGPIB_set_event_status_register_operation_complete_state( &global_ctx->sGPIB.registers, true );
- common_ctx->status = eProgramDataDone; // request processed
- }
-
- // Since @done flag is set, this dispatcher shall not be called anymore.
- // Since this handler is implemented as a single-state automat, there no
- // ... other states to go to:
- (void)nextstate;
- }
- break;
- case eProgramData_Event_Read:
- {
- // first call: prepare buffer
- if( 0 == common_ctx->OPC.idx )
- {
- memset( common_ctx->tempBuffer, 0, sizeof(common_ctx->tempBuffer) );
- // "4.1.3.4 *OPC?" [1]
- // Implementation of the *OPC? query is straightforward in devices which implement only
- // sequential commands. When executing *OPC? the device simply places a “1" in the Output Queue.
-
- // "12.5.3 The *OPC? Common Query", [3]
- // The *OPC? query allows synchronization between a controller and a device using the MAV bit in the Status Byte or
- // a read of the Output Queue. Detailed illustrations of the use of this function appear in Appendix B. Note that,
- // unlike the *OPC command described in 12.5.2, the *OPC? query does not in any way affect the OPC Event bit in the
- // Standard Event Status Register (ESR).
- // Since there no asyncronious operations are supported, this command immediately generate the response "1"
- _snprintf( common_ctx->tempBuffer, sizeof(common_ctx->tempBuffer), "1" );
- }
- SCPI_RESPONSE_HELPER( common_ctx, common_ctx->OPC.idx );
- (void)nextstate; // stay in this state
- }
- break;
- }
- return nextstate;
- }
|