[go: up one dir, main page]

Menu

[r999]: / trunk / VTS3 / ScriptExecutor.h  Maximize  Restore  History

Download this file

431 lines (336 with data), 17.1 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
// ScriptExecutor.h: interface for the ScriptExecutor class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SCRIPTEXECUTOR_H__AC59C5B2_BAFF_11D4_BEF7_00A0C95A9812__INCLUDED_)
#define AFX_SCRIPTEXECUTOR_H__AC59C5B2_BAFF_11D4_BEF7_00A0C95A9812__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxmt.h>
#include <afxtempl.h>
#include <float.h>
#include "VTSDoc.h"
#include "ScriptBase.h"
#include "ScriptDocument.h"
#include "ScriptPacket.h"
#include "ScriptExecMsg.h"
#include "BACnet.hpp"
#include "VTSQueue.h"
// madanner, 9/30/02
// equates for priority arrays inside internal EPICS store
// already defined in stdobj.h for dudtool.
// had to include here for Create helper functions
#ifndef fpaNULL
#define fpaNULL FLT_MIN //too bad we can't use NAN
#define bpaNULL 2 //binary present values are 0 and 1
#define upaNULL 0xFFFF //can't use more than 65534 enumerations, too bad
#define nPRIO 16 // size of priority arrays
#endif
// Status equates
#define SCRIPT_STATUS_NONE 0
#define SCRIPT_STATUS_OK 1
#define SCRIPT_STATUS_WARN 2
#define SCRIPT_STATUS_FAIL 3
class ScriptMsgStatus : public ScriptExecMsg
{
public:
ScriptDocumentPtr m_pdoc; // current script document
ScriptBasePtr m_pbase; // section/test/deps/packet
int m_nStatus; // common status code
ScriptMsgStatus( ScriptDocumentPtr pDoc, ScriptBasePtr pbase, int nStatus );
virtual ~ScriptMsgStatus();
};
//typedef VTSQueue<ScriptExecMsg> ScriptExecMsgQueue;
// now defined in VTSQueue.h
//
// ScriptFilter
//
const int kMaxScriptFilterNameLen = 32;
enum ScriptFilterType
{ scriptNPDUFilter
, scriptAPDUFilter
};
class ScriptFilter {
public:
ScriptFilter( ScriptFilterType typ, const char *name );
virtual ~ScriptFilter( void );
ScriptFilterType filterType;
char filterName[kMaxScriptFilterNameLen]; // filter name
};
typedef ScriptFilter *ScriptFilterPtr;
//
// ScriptFilterList
//
class ScriptFilterList : public CList<ScriptFilterPtr,ScriptFilterPtr> {
friend class ScriptFilter;
protected:
void AddFilter( ScriptFilterPtr fp ); // add a filter
void RemoveFilter( ScriptFilterPtr fp ); // remove a filter
public:
ScriptFilterList( void );
~ScriptFilterList( void );
ScriptFilterPtr FindFilter( const char *name ); // find a filter
int Length( void ); // number of defined filters
ScriptFilterPtr operator []( int i ); // index into filter list
};
typedef ScriptFilterList *ScriptFilterListPtr;
extern ScriptFilterList gMasterFilterList; // global list of all filters
//
// ScriptNetFilter
//
class ScriptNetFilter : public ScriptFilter, public BACnetNetClient, public BACnetNetServer {
public:
ScriptNetFilter( const char *name );
virtual ~ScriptNetFilter( void );
virtual void Indication( const BACnetNPDU &npdu );
virtual void Confirmation( const BACnetNPDU &npdu );
};
typedef ScriptNetFilter *ScriptNetFilterPtr;
//
// ScriptNetPacket
//
class ScriptNetPacket : public BACnetTask {
protected:
ScriptFilterPtr packetFilter; // where this came from
FILETIME packetTime; // receive time
BACnetOctet *packetData; // copy of the data
BACnetNPDU packetNPDU; // other content
void ProcessTask( void ); // deliver to executor
public:
ScriptNetPacket( ScriptFilterPtr fp, const BACnetNPDU &npdu );
virtual ~ScriptNetPacket( void );
private:
ScriptNetPacket( const ScriptNetPacket &pkt ); // no copy ctor
void operator =( const ScriptNetPacket &pkt ); // no assignment
};
typedef ScriptNetPacket *ScriptNetPacketPtr;
//
// ScriptDebugNetFilter
//
class ScriptDebugNetFilter : public ScriptFilter, public BACnetNetServer {
public:
ScriptDebugNetFilter *filterPeer;
ScriptDebugNetFilter( char *name );
virtual ~ScriptDebugNetFilter( void );
virtual void Indication( const BACnetNPDU &npdu );
};
typedef ScriptDebugNetFilter *ScriptDebugNetFilterPtr;
void Bind( ScriptDebugNetFilterPtr fp1, ScriptDebugNetFilterPtr fp2 );
//
// ScriptAppFilter
//
class ScriptAppFilter : public ScriptFilter, public BACnetAppClient, public BACnetAppServer {
public:
ScriptAppFilter( char *name );
virtual ~ScriptAppFilter( void );
virtual void Indication( const BACnetAPDU &apdu );
virtual void Confirmation( const BACnetAPDU &apdu );
};
typedef ScriptAppFilter *ScriptAppFilterPtr;
//
// ScriptAppPacket
//
class ScriptAppPacket : public BACnetTask {
protected:
FILETIME packetTime; // receive time
BACnetOctet *packetData; // copy of the data
BACnetAPDU packetAPDU; // other content
void ProcessTask( void ); // deliver to executor
public:
ScriptAppPacket( const BACnetNPDU &npdu );
private:
ScriptAppPacket( const ScriptAppPacket &pkt ); // no copy ctor
void operator =( const ScriptAppPacket &pkt ); // no assignment
};
typedef ScriptAppPacket *ScriptAppPacketPtr;
//
// ScriptExecutor
//
enum ScriptExecutorState
{ execIdle
, execRunning
, execStopped
};
class ScriptExecutor : public BACnetTask {
private:
class ExecError {
public:
CString errMsg;
int errLineNo;
ExecError( const char *msg, int lineNo = -1 );
};
ScriptExecMsgQueue execMsgQueue; // messages to application
CCriticalSection execCS; // app/task control
ScriptExecutorState execState; // execution state
int execRootTime; // time group started
bool execPending; // timer set during execution
VTSDocPtr execDB; // database to receive test information
ScriptDocumentPtr execDoc; // current script document
ScriptTestPtr execTest; // current test
ScriptPacketPtr execPacket; // current packet
ScriptCommandPtr execCommand; // current command... could be packet or something else
int execStepForced; // packet forced to pass (=1) or fail (=2)
unsigned long execObjID; // object context for property references
void ProcessTask( void ); // timer went off
void NextPacket( bool okPacket, bool fHanging = false ); // move to next in sequence
void ResolveExpr( const char *expr, int exprLine, ScriptTokenList &lst, ScriptParmPtr * ppScriptParm = NULL );
// void* GetReferenceData( int prop, int *typ, BACnetAPDUDecoder *dp = 0 );
void StuffScriptParameter(BACnetEncodeable &rbacnet, ScriptParmPtr pp, LPCSTR lpstrValue );
bool SendPacket( void ); // send execPacket, return true iff success
void SendBVLCResult( ScriptTokenList &tlist, CByteArray &packet );
void SendWriteBDT( ScriptTokenList &tlist, CByteArray &packet );
void SendReadBDTAck( ScriptTokenList &tlist, CByteArray &packet );
void SendForwardedNPDU( ScriptTokenList &tlist, CByteArray &packet );
void SendRegisterFD( ScriptTokenList &tlist, CByteArray &packet );
void SendReadFDTAck( ScriptTokenList &tlist, CByteArray &packet );
void SendDeleteFDTEntry( ScriptTokenList &tlist, CByteArray &packet );
void SendWhoIsRouterToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendIAmRouterToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendICouldBeRouterToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendRejectMessageToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendRouterBusyToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendRouterAvailableToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendInitializeRoutingTable( ScriptTokenList &tlist, CByteArray &packet );
void SendInitializeRoutingTableAck( ScriptTokenList &tlist, CByteArray &packet );
void SendEstablishConnectionToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendDisconnectConnectionToNetwork( ScriptTokenList &tlist, CByteArray &packet );
void SendDevPacket( void );
void SendDevConfirmedRequest( BACnetAPDU &apdu );
void SendDevUnconfirmedRequest( BACnetAPDU &apdu );
void SendDevSimpleACK( BACnetAPDU &apdu );
void SendDevComplexACK( BACnetAPDU &apdu );
void SendDevSegmentACK( BACnetAPDU &apdu );
void SendDevError( BACnetAPDU &apdu );
void SendDevReject( BACnetAPDU &apdu );
void SendDevAbort( BACnetAPDU &apdu );
void SendConfirmedRequest( CByteArray &packet );
void SendUnconfirmedRequest( CByteArray &packet );
void SendSimpleACK( CByteArray &packet );
void SendComplexACK( CByteArray &packet );
void SendSegmentACK( CByteArray &packet );
void SendError( CByteArray &packet );
void SendReject( CByteArray &packet );
void SendAbort( CByteArray &packet );
void SendALData( CByteArray &packet );
void SendALNull( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALBoolean( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALUnsigned( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALInteger( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALReal( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALDouble( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALOctetString( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALCharacterString( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALBitString( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALEnumerated( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALDate( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALTime( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALObjectIdentifier( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALDeviceIdentifier( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALPropertyIdentifier( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALOpeningTag( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALClosingTag( ScriptPacketExprPtr spep, CByteArray &packet );
void SendALAny( ScriptPacketExprPtr spep, CByteArray &packet );
bool ExpectPacket( ScriptNetFilterPtr fp, const BACnetNPDU &npdu ); // match execPacket, return true iff success
void ExpectBVLCResult( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectWriteBDT( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectReadBDTAck( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectForwardedNPDU( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectRegisterFD( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectReadFDTAck( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectDeleteFDTEntry( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectWhoIsRouterToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectIAmRouterToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectICouldBeRouterToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectRejectMessageToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectRouterBusyToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectRouterAvailableToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectInitializeRoutingTable( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectEstablishConnectionToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
void ExpectDisconnectConnectionToNetwork( ScriptTokenList &tlist, BACnetAPDUDecoder &dec );
bool ExpectDevPacket( const BACnetAPDU &apdu );
void ExpectDevConfirmedRequest( const BACnetAPDU &apdu );
void ExpectDevUnconfirmedRequest( const BACnetAPDU &apdu );
void ExpectDevSimpleACK( const BACnetAPDU &apdu );
void ExpectDevComplexACK( const BACnetAPDU &apdu );
void ExpectDevSegmentACK( const BACnetAPDU &apdu );
void ExpectDevError( const BACnetAPDU &apdu );
void ExpectDevReject( const BACnetAPDU &apdu );
void ExpectDevAbort( const BACnetAPDU &apdu );
void ExpectConfirmedRequest( BACnetAPDUDecoder &dec );
void ExpectUnconfirmedRequest( BACnetAPDUDecoder &dec );
void ExpectSimpleACK( BACnetAPDUDecoder &dec );
void ExpectComplexACK( BACnetAPDUDecoder &dec );
void ExpectSegmentACK( BACnetAPDUDecoder &dec );
void ExpectError( BACnetAPDUDecoder &dec );
void ExpectReject( BACnetAPDUDecoder &dec );
void ExpectAbort( BACnetAPDUDecoder &dec );
void ExpectALData( BACnetAPDUDecoder &dec );
void ExpectALNull( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALBoolean( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALUnsigned( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALInteger( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALReal( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALDouble( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALOctetString( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALCharacterString( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALBitString( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALEnumerated( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALDate( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALTime( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALObjectIdentifier( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALDeviceIdentifier( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALPropertyIdentifier( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALOpeningTag( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALClosingTag( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
void ExpectALAny( ScriptPacketExprPtr spep, BACnetAPDUDecoder &dec );
// madanner 9/25/02
void GetEPICSProperty( int prop, BACnetAnyValue * pbacnetAny, int nIndex = -1 );
// GJB 24/12/2003
void GetEPICSDeviceProperty( int prop, BACnetAnyValue * pbacnetAny, int nIndex = -1 );
void CompareAndThrowError( BACnetEncodeable & rbacnet1, BACnetEncodeable & rbacnet2, int iOperator, unsigned int nError );
// madanner 11/9/02
void ExpectALTag( BACnetAPDUDecoder &dec, ScriptToken * ptok, BACnetApplicationTag tagNumber, const char * pszDataType );
int CheckExpressionParams( int nMinParms, int nMaxParms, int nSuppliedParms, const char * pszDataType );
void ThrowPDUBitsError( unsigned char b, char * pszPDUType, ScriptPacketExprPtr pep );
ScriptPacketExprPtr GetKeywordValue( ScriptParmPtr * ppScriptParm, int keyword, BACnetEncodeable &enc, ScriptTranslateTablePtr tp = 0 );
void TestOrAssign( ScriptPacketExprPtr pScriptExpr, BACnetEncodeable & rbacnetData, BACnetEncodeable & rbacnetScript, ScriptParmPtr pScriptParm, const char * pszErrorPrefix );
void TestOrAssignOptionValue( int kw, const char * pszErrorPrefix, BACnetAPDUDecoder * pdec = NULL );
void MatchEnumExpression( int nKeyword, BACnetEnumerated &rbacnetData, ScriptTranslateTablePtr pMap, const char * pszErrorPrefix );
void MatchBoolExpression( int nKeyword, BACnetBoolean &rbacnetData, const char * pszErrorPrefix );
void ExpectNoMore( BACnetAPDUDecoder & dec );
void ResetFamily( ScriptBasePtr sbp );
void ResetTest( ScriptTestPtr stp );
void SetTestStatus( ScriptTestPtr stp, int stat ); // change the test status
// void SetPacketStatus( ScriptPacketPtr spp, int stat ); // change the packet status
void SetPacketStatus( ScriptBasePtr spp, int stat ); // change the packet status
int CalcTestStatus( ScriptTestPtr stp ); // check deps and return status
void VerifySectionStatus( ScriptSectionPtr ssp );
void SetImageStatus( ScriptBasePtr sbp, int stat ); // change section/test/deps/packet status
public:
ScriptExecutor( void );
virtual ~ScriptExecutor();
void Setup( VTSDocPtr vdp, ScriptDocumentPtr sdp, ScriptTestPtr stp );
void Cleanup( void );
bool execAllTests; // true iff all tests
bool execSingleStep; // break after current packet
bool execFailContinue; // iff checking all tests and one failed, keep going anyway
void Msg( int sc, int line, const char *msg, int testStatus = SCRIPT_STATUS_OK ); // save a message in the database
void Run( void ); // continue running
void Halt( void ); // set to not running
void Step( void ); // exec current packet, set up next one
void Step( bool pass ); // act like packet being processed
void Resume( void ); // go back to running
void Kill( bool closingDoc ); // fail test and exit
ScriptExecMsg * ReadMsg( void ); // read a message from the queue
inline bool IsIdle( void ) { return (execState == execIdle); }
inline bool IsRunning( void ) { return (execState == execRunning); }
inline bool IsStopped( void ) { return (execState == execStopped); }
bool IsBound( VTSDocPtr sdp );
bool IsBound( ScriptDocumentPtr sdp );
void SendNPDU( ScriptNetFilterPtr fp, const BACnetNPDU &npdu );
void ReceiveNPDU( ScriptNetFilterPtr fp, const BACnetNPDU &npdu );
bool ReceiveAPDU( const BACnetAPDU &apdu );
};
typedef ScriptExecutor *ScriptExecutorPtr;
extern ScriptExecutor gExecutor;
#endif // !defined(AFX_SCRIPTEXECUTOR_H__AC59C5B2_BAFF_11D4_BEF7_00A0C95A9812__INCLUDED_)