Difference between revisions of "The Queue of Events"

From Hydrover
Jump to: navigation, search
(Structure of an Event)
(Processing Events)
 
(8 intermediate revisions by the same user not shown)
Line 11: Line 11:
 
where:
 
where:
  
* <code>.opcode</code> is used to uniquely identify the event
+
* <code>.opcode</code> is used to uniquely identify the event type
 
* <code>.p0, .p1, .p2, .p3</code> contains informations specific to that event
 
* <code>.p0, .p1, .p2, .p3</code> contains informations specific to that event
  
 
= Events' Library Functions =
 
= Events' Library Functions =
  
 +
The library functions for events management are:
  
 +
* <code>#define BASE_EVENT(%1) Event:%1[.opcode, .p0, .p1, .p2, .p3]</code> is a macro to help in creating an event container
 +
* <code>SysEvEnable()</code> enable the system to post events into the queue
 +
* <code>SysEvDisable()</code> disable the system to post events into the queue
 +
* <code>EventGet( BASE_EVENT(ev) )</code> get an event from the queue, if an event is not available will wait for
 +
* <code>EventSend( BASE_EVENT(ev) )</code> send an event to the queue, can be used to inject custom and/or simulated events
  
 
= Processing Events =
 
= Processing Events =
 +
 +
In [https://en.wikipedia.org/wiki/Event-driven_programming Event-driven programming] the main loop of a program
 +
takes care of fetch, process and/or dispatch incoming events, the following code is an example of a minimal one.
 +
 +
<syntaxhighlight lang="pawn">
 +
/***************************************************************
 +
*
 +
* Minimal Event Processing Loop
 +
*
 +
*      program.p
 +
*
 +
***************************************************************/
 +
 +
// include the library for H6105-D
 +
//
 +
#include <hydlib_cp>
 +
 +
// main function
 +
//
 +
main()
 +
{
 +
// clear display
 +
//
 +
dClear();
 +
 +
// select system font
 +
//
 +
dFont( system5x7 );
 +
 +
// place cursor
 +
//
 +
dCursor( 0, 0 );
 +
 +
// print on display
 +
//
 +
dPrintf("Processing Events");
 +
 +
// declare an event container
 +
//
 +
new BASE_EVENT(ev);
 +
 +
// enable system events
 +
//
 +
SysEvEnable();
 +
 +
// main loop
 +
//
 +
for( ;; )
 +
{
 +
// get new event from queue
 +
//
 +
EventGet( ev );
 +
 +
// process some events
 +
//
 +
switch( ev.opcode )
 +
{
 +
// <script stop> command from console
 +
//
 +
case SevEmergExit:
 +
{
 +
// exit main loop
 +
//
 +
break;
 +
}
 +
 +
// push button activate
 +
//
 +
case SevDinActive:
 +
{
 +
if( ev.p0 == 0 )
 +
{
 +
dCursor( 0, 10 );
 +
dPrintf("Button Pressed");
 +
}
 +
}
 +
 +
// push button deactivate
 +
//
 +
case SevDinInactive:
 +
{
 +
if( ev.p0 == 0 )
 +
{
 +
dCursor( 0, 10 );
 +
dPrintf("Button Released");
 +
}
 +
}
 +
}
 +
}
 +
 +
// program end
 +
}
 +
</syntaxhighlight>
 +
 +
= Type of Events =
 +
 +
This are the system events, declared in the library
 +
 +
<syntaxhighlight lang="pawn" line>
 +
/* events codes */
 +
const
 +
{
 +
SevEmergExit = 1, // receiving this event means that the program must stop execution
 +
 +
SevOnEnter, // the first event sent while entering a state
 +
SevOnExit, // the last event sent while exiting a state
 +
 +
SevTick100mSec, // system tick sent at 100 (ms) rate
 +
SevTick500mSec, // system tick sent at 500 (ms) rate
 +
SevTickOneSec, // system tick sent at 1 (s) rate
 +
 +
SevTimerElapsed, // p0=timer number
 +
 +
SevEncCount, // p0=0, p1=1(count UP), p1=2(count DW)
 +
 +
SevDinChange, // p0= din number (0-19 = CP) (1000-1159 = IO) (2000-2159 = CA) (3000-3119 = CE)
 +
SevDinActive, // p0= din number (0-19 = CP) (1000-1159 = IO) (2000-2159 = CA) (3000-3119 = CE)
 +
SevDinInactive, // p0= din number (0-19 = CP) (1000-1159 = IO) (2000-2159 = CA) (3000-3119 = CE)
 +
SevDinFastRel, // p0= din number (0-19 = CP) (3000-3119 = CE)
 +
SevDinKeep, // p0= din number (0-19 = CP) (3000-3119 = CE)
 +
 +
SevAccMatch, // p0= acc number
 +
 +
SevAxisMoveDone, // p0= board number
 +
SevAxisMoveAbort, // p0= board number p1= abort code ( 0= cil0 stalled max curr, 1= cil1 stalled max curr, 2= cil0 stop by cil1, 3= cil1 stop by cil0, 4= max delta )
 +
 +
SevCsDone, // p0= board number p1= pwm channel p2= cs number p3= step number
 +
SevCsAbort, // p0= board number p1= pwm channel p2= cs number p3= step number
 +
SevCsStep, // p0= board number p1= pwm channel p2= cs number p3= step number
 +
 +
SevMenuChange, // p0= return code of menu item selected
 +
SevMenuClick, // p0= return code of menu item clicked
 +
 +
SevBareditChange, // no params
 +
SevBareditExit, // no params
 +
 +
SevNumeditChange, // p0= numedit
 +
SevNumeditExit, // p0= numedit, p1= exit code ( 0= cancel, 1= ok)
 +
 +
SevCmd, // p0,p1,p2,p3 came from command line eg:(script cmd 0 1 2 3)
 +
SevCustom // opcode to use to feed in custom events
 +
}
 +
</syntaxhighlight>

Latest revision as of 10:39, 6 July 2017

Introduction

The queue of events is the queue where the system send events such as: input change, user action, encoder or transducer match, and from where the user's program get events to process and react to.

Structure of an Event

An event is defined in the library as an array of values:

[.opcode, .p0, .p1, .p2, .p3]

where:

  • .opcode is used to uniquely identify the event type
  • .p0, .p1, .p2, .p3 contains informations specific to that event

Events' Library Functions

The library functions for events management are:

  • #define BASE_EVENT(%1) Event:%1[.opcode, .p0, .p1, .p2, .p3] is a macro to help in creating an event container
  • SysEvEnable() enable the system to post events into the queue
  • SysEvDisable() disable the system to post events into the queue
  • EventGet( BASE_EVENT(ev) ) get an event from the queue, if an event is not available will wait for
  • EventSend( BASE_EVENT(ev) ) send an event to the queue, can be used to inject custom and/or simulated events

Processing Events

In Event-driven programming the main loop of a program takes care of fetch, process and/or dispatch incoming events, the following code is an example of a minimal one.

/***************************************************************
*
*		Minimal Event Processing Loop
*
*       program.p
*
***************************************************************/

// include the library for H6105-D
//
#include <hydlib_cp>

// main function
//
main()
{
	// clear display
	//
	dClear();
	
	// select system font
	//
	dFont( system5x7 );

	// place cursor
	//
	dCursor( 0, 0 );
	
	// print on display
	//
	dPrintf("Processing Events");

	// declare an event container
	//
	new BASE_EVENT(ev);

	// enable system events
	//
	SysEvEnable();
	
	// main loop
	//
	for( ;; )
	{
		// get new event from queue
		//
		EventGet( ev );
		
		// process some events
		//
		switch( ev.opcode )
		{
			// <script stop> command from console
			//
			case SevEmergExit:
			{
				// exit main loop
				//
				break;
			}

			// push button activate
			//
			case SevDinActive:
			{
				if( ev.p0 == 0 )
				{
					dCursor( 0, 10 );
					dPrintf("Button Pressed");
				}
			}

			// push button deactivate
			//
			case SevDinInactive:
			{
				if( ev.p0 == 0 )
				{
					dCursor( 0, 10 );
					dPrintf("Button Released");
				}
			}
		}
	}

	// program end
}

Type of Events

This are the system events, declared in the library

/* events codes */
const
{
	SevEmergExit = 1,	// receiving this event means that the program must stop execution

	SevOnEnter,			// the first event sent while entering a state
	SevOnExit,			// the last event sent while exiting a state

	SevTick100mSec,		// system tick sent at 100 (ms) rate
	SevTick500mSec,		// system tick sent at 500 (ms) rate
	SevTickOneSec,		// system tick sent at 1 (s) rate

	SevTimerElapsed,	// p0=timer number

	SevEncCount,		// p0=0, p1=1(count UP), p1=2(count DW)

	SevDinChange,		// p0= din number (0-19 = CP) (1000-1159 = IO) (2000-2159 = CA) (3000-3119 = CE)
	SevDinActive,		// p0= din number (0-19 = CP) (1000-1159 = IO) (2000-2159 = CA) (3000-3119 = CE)
	SevDinInactive,		// p0= din number (0-19 = CP) (1000-1159 = IO) (2000-2159 = CA) (3000-3119 = CE)
	SevDinFastRel,		// p0= din number (0-19 = CP) (3000-3119 = CE)
	SevDinKeep,			// p0= din number (0-19 = CP) (3000-3119 = CE)

	SevAccMatch,		// p0= acc number

	SevAxisMoveDone,	// p0= board number
	SevAxisMoveAbort,	// p0= board number p1= abort code ( 0= cil0 stalled max curr, 1= cil1 stalled max curr, 2= cil0 stop by cil1, 3= cil1 stop by cil0, 4= max delta )

	SevCsDone,			// p0= board number p1= pwm channel p2= cs number p3= step number
	SevCsAbort,			// p0= board number p1= pwm channel p2= cs number p3= step number
	SevCsStep,			// p0= board number p1= pwm channel p2= cs number p3= step number

	SevMenuChange,		// p0= return code of menu item selected
	SevMenuClick,		// p0= return code of menu item clicked

	SevBareditChange,	// no params
	SevBareditExit,		// no params

	SevNumeditChange,	// p0= numedit
	SevNumeditExit,		// p0= numedit, p1= exit code ( 0= cancel, 1= ok)

	SevCmd,				// p0,p1,p2,p3 came from command line eg:(script cmd 0 1 2 3)
	SevCustom			// opcode to use to feed in custom events
}