| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #ifndef SCPI_CORE_PRIVATE_H
- #define SCPI_CORE_PRIVATE_H
- #ifdef SCPI_CORE_PRIVATE
- #include "app/fseq/fseq.h"
- #include "app/scpi/scpi_parser.h"
- #include "app/tlst/tree_list.h" // sTreeList_t
- #include "app/scpi/scpi_errq.h"
- #include "app/scpi/scpi_errs.h"
- #include "app/scpi/scpi_gpib_core.h"
- // -----------------------------------------------------------
- // @sScpiParserStateEntry_t
- // SCPI Parser state-machine's state entry:
- // Includes the function-table @entry and the
- // ... state context reference @ctx_ref
- typedef struct
- {
- fFSeqEntry_t entry;
- void * const ctx_ref;
- }
- sScpiParserStateEntry_t;
- // -----------------------------------------------------------
- // @DECLARE_SCPI_STATE_ENTRY
- // Declares the state entry to initialize @sScpiCommandHandlerEntry_t
- #define DECLARE_SCPI_STATE_ENTRY(vtable_, ctx_)\
- { .entry = { .vtbl = &vtable_ }, .ctx_ref = ctx_ }
- // -----------------------------------------------------------
- // @sScpiCommandHandlerEntry_t
- // SCPI Command handler entry.
- // Links the state machine entry (function-object) and
- // ... the data context together to form the functor-object.
- typedef struct
- {
- fFSeqEntry_t entry; // state-machine's state entry
- const void * ctx; // state's data
- }
- sScpiCommandHandlerEntry_t;
- // -----------------------------------------------------------
- // eScpiParserStateId_t
- // SCPI Parser States
- typedef enum
- {
- eParserResetState, // restart parser for new SCPI message
- eSearchForCommandHeader, // searching for program command header
- eProcessCommandHeader, // interpreting the command header
- eProcessProgramData, // processing the command, processing the program data
- eProcessEndOfProgramData, // end of processing the program data, search message separator
- eHandleError, // error condition
- }
- eScpiParserStateId_t;
- // -----------------------------------------------------------
- typedef enum
- {
- // ---------------------// Common event codes:
- eScpiEventEmpty, // - No event;
- eScpiEventWrite, // - Chunk write / processing (eProcessProgramData);
- eScpiEventRead, // - Read chunk / processing (eProcessProgramData);
- eScpiEventRestart, // - Restart event
- eScpiEventContinue, // - Parse continue event (Error Handle Specific code)
- eScpiEventError, // - Special event (exception)
- }
- eScpiEventType_t;
- // -----------------------------------------------------------
- // The following block is disgned to grant exclusive write access to
- // some variables in the common context to prevent modifing by mistake.
- // Some variables marked as 'guarded' using _GUARD_ macro.
- // This means that this variable is only allowed to be modified if a special
- // guarding macro is defined in the module that includes this file.
- // This guarding macro is different for each file, and the following block can
- // select what file grant the access to.
- #if !defined(SCPI_CORE_C) && !defined(SCPI_RESET_STATE_C)
- #define _GUARD_ const // all files but excluding 'scpi_core.c' and 'reset_state.c'
- #else
- #define _GUARD_ // only 'scpi_core.c' and 'reset_state.c'
- #endif
- #if !defined(SCPI_END_OF_PROCESS_DATA_C) && !defined(SCPI_PROCESS_DATA_C)
- #define _GUARD_01_ _GUARD_ // all files but excluding 'endof_process_data.c' or 'process_data.c'
- #else
- #define _GUARD_01_ // only 'endof_process_data.c' or 'process_data.c'
- #endif
-
- #if !defined(SCPI_PROCESS_DATA_C) && !defined(SCPI_HANDLE_ERROR_C) && !defined(SCPI_PROCESS_COMMAND_C) && !defined(SCPI_END_OF_PROCESS_DATA_C)
- #define _GUARD_02_ _GUARD_ // all files but excluding 'process_data.c', 'endof_process_data.c', 'process_command.c' and 'handle_error.c'
- #else
- #define _GUARD_02_ // only 'process_data.c', 'process_command.c' and 'handle_error.c', 'endof_process_data.c'
- #endif
- #if !defined(SCPI_HANDLE_ERROR_C) && !defined(SCPI_END_OF_PROCESS_DATA_C)
- #define _GUARD_03_ _GUARD_ // all files but excluding 'endof_process_data.c' and 'handle_error.c'
- #else
- #define _GUARD_03_ // only 'handle_error.c' and 'endof_process_data.c'
- #endif
- //
- //
- // -----------------------------------------------------------
- // ==============================================================================================
- typedef struct
- {
- struct
- {
- const uint8_t * _GUARD_ pData; // [IN]
- size_t _GUARD_ nDataLength; // [IN]
- }
- sWrite;
-
- struct
- {
- uint8_t * _GUARD_ pBuffer; // [IN]
- size_t _GUARD_01_ nBufferSize; // [IN]
- uint8_t * pBufferIdx; // [IN, OUT]
- size_t nDataLength; // [IN, OUT], shall be modified by writer
- size_t nTotalLength; // [IN, OUT], shall be modified by writer
- const void * vLastBufferIdx; // [OUT]
- }
- sRead;
- struct
- {
- //bool bNewTransfer; // [IN]
- uint8_t _GUARD_03_ eCode; // [IN], refer to @eScpiEventType_t
- int8_t eStatus; // [OUT], refer to @eScpiStatus_t
- }
- sEvent;
- struct
- {
- const uint8_t * pStr; // [IN, OUT], current iterator in sWrite.pData[]
- const uint8_t * pEnd; // [IN, OUT], end-of-string in sWrite.pData[]
- bool _GUARD_ w_bEndOfMessage; // [IN], Write Event
- bool r_bEndOfMessage; // [IN, OUT], Read Event
- bool bQuery; // [IN, OUT]
- bool bLeadResponseSep; // [IN, OUT] place leading response separator
- }
- sMessage;
- struct
- {
- errq_t xScpiErrorQueue; // SCPI Log queue object
- int runtimeError; // SCPI Error code
- char xScpiErrorMessage[ SCPI_ERRORMSG_MAX ]; // SCPI Error description
- uint8_t xScpiErrorLogStorage[ SCPI_ERRORLOG_CAPACITY ]; // SCPI Log queue storage buffer
- bool errorQueueOverflow; // Error Queue Overflow indicator
- }
- sExecution;
- struct
- {
- // @xCtxObj: SCPI tokens parser object
- xParseEntry_t xCtxObj; // [IN, OUT]
-
- // @xCmdBranch: SCPI command tree branch
- sTreeList_t * xCmdBranch; // [IN, OUT]
-
- // @xHandler: SCPI command handler entry
- const sScpiCommandHandlerEntry_t * xHandler; // [OUT]
- // @xHandlerToken: linked handler string token
- sStrToken_t xHandlerToken; // [OUT]
- // @xArgToken: current argument token
- sStrToken_t xArgToken; // [OUT]
- // @bFirstCommandIndicator - the first command in the line indicator
- bool bFirstCommandIndicator; // [IN, OUT]
- }
- sParser;
- struct
- {
- xGPIBRegisters_t registers;
- }
- sGPIB;
- struct
- {
- uint8_t inputCommand[ SCPI_MAX_INPUT_COMMAND ];
- size_t nBytes;
- }
- sCache;
- }
- sScpiParserContext_t;
- // ==============================================================================================
- // @fsq_GetStateById
- // Get the state entry by state identifier @sid
- // @this - current state pointer
- // @sid - the state identifier (eScpiParserStateId_t)
- // Returns: the state entry pointer
- // Note: the caller must be the state from the same entity
- const struct fFSeqEntry_t * fsq_GetStateById( const struct fFSeqEntry_t * this, eScpiParserStateId_t sid );
- // ==============================================================================================
- // @fsq_RaiseError
- // Generate internal error event to place it into SCPI Error Log
- // @scpiError - SCPI error code
- // @msgHandler - optional null-terminated string prefix
- // @msgDescription - optional string message with @msgDescLength length
- // @msgDescriptionEnd - end of optional message string, is used to determine the string length (@msgDescription)
- void fsq_RaiseError( int scpiError, const char * msgHeader, const char * msgDescription, const char * msgDescEnd );
- #endif
- #endif
|