Continue work on the timers module.
diff --git a/Source/timers.c b/Source/timers.c
index e1d464d..5666661 100644
--- a/Source/timers.c
+++ b/Source/timers.c
@@ -65,9 +65,6 @@
 

 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

 

-/* IDs for commands that can be sent/received on the timer queue. */

-#define tmrCOMMAND_START		0

-

 /* Misc definitions. */

 #define tmrNO_DELAY		( portTickType ) 0U

 

@@ -86,9 +83,9 @@
 queue. */

 typedef struct tmrTimerQueueMessage

 {

-	portBASE_TYPE			xMessageID;

-	portTickType			xMessageValue;

-	xTIMER *				pxTimer;

+	portBASE_TYPE			xMessageID;			/*<< The command being sent to the timer service task. */

+	portTickType			xMessageValue;		/*<< An optional value used by a subset of commands, for example, when chaning the period of a timer. */

+	xTIMER *				pxTimer;			/*<< The timer to which the command will be applied. */

 } xTIMER_MESSAGE;

 

 

@@ -102,19 +99,6 @@
 

 /*-----------------------------------------------------------*/

 

-/*

- * Called when a timer is about to be modified.  If the timer is already in the

- * list of active timers then it is removed prior to the modification.

- */

-static void prvRemoveTimerFromActiveList( xTIMER *pxTimer ) PRIVILEGED_FUNCTION;

-

-/*

- * Send pxMessage to xTimerQueue using a block time of xBlockTime if the 

- * scheduler is running, or a block time of zero if the scheduler is not

- * running.

- */

-static portBASE_TYPE prvSendMessageToTimerServiceTask( xTIMER_MESSAGE *pxMessage, portTickType xBlockTime ) PRIVILEGED_FUNCTION;

-

 /* 

  * Initialise the infrustructure used by the timer service task if it has not

  * been initialised already.

@@ -186,20 +170,28 @@
 }

 /*-----------------------------------------------------------*/

 

-portBASE_TYPE xTimerStart( xTimerHandle xTimer, portTickType xBlockTime )

+portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, portTickType xBlockTime )

 {

 portBASE_TYPE xReturn = pdFAIL;

 xTIMER_MESSAGE xMessage;

 

-	/* A timer cannot be started unless it is created, and creating a timer

-	will have resulted in the timer queue also being created. */

+	/* Send a message to the timer service task to perform a particular action

+	on a particular timer definition. */

 	if( xTimerQueue != NULL )

 	{

 		/* Send a command to the timer service task to start the xTimer timer. */

-		xMessage.xMessageID = tmrCOMMAND_START;

+		xMessage.xMessageID = xCommandID;

+		xMessage.xMessageValue = xOptionalValue;

 		xMessage.pxTimer = ( xTIMER * ) xTimer;

 

-		prvSendMessageToTimerServiceTask( &xMessage, xBlockTime );

+		if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )

+		{

+			xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xBlockTime );

+		}

+		else

+		{

+			xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY );

+		}

 	}

 

 	return xReturn;

@@ -288,19 +280,44 @@
 		pxTimer = xMessage.pxTimer;

 

 		/* Is the timer already in the list of active timers? */

-		prvRemoveTimerFromActiveList( pxTimer );

+		if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE )

+		{

+			/* The timer is in the list, remove it. */

+			vListRemove( &( pxTimer->xTimerListItem ) );

+		}

 

 		switch( xMessage.xMessageID )

 		{

-			case tmrCOMMAND_START	:	/* Start or restart a timer. */

-										xTimeToExpire = xTaskGetTickCount() + pxTimer->xTimerPeriodInTicks;

-										listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xTimeToExpire );

-										listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );

-										vListInsert( &xActiveTimerList, &( pxTimer->xTimerListItem ) );

-										break;

+			case tmrCOMMAND_START :	

+				/* Start or restart a timer. */

+				xTimeToExpire = xTaskGetTickCount() + pxTimer->xTimerPeriodInTicks;

+				listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xTimeToExpire );

+				listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );

+				vListInsert( &xActiveTimerList, &( pxTimer->xTimerListItem ) );

+				break;

 

-			default			:			/* Don't expect to get here. */

-										break;

+			case tmrCOMMAND_STOP :	

+				/* The timer has already been removed from the active list.

+				There is nothing to do here. */

+				break;

+

+			case tmrCOMMAND_CHANGE_PERIOD :

+				pxTimer->xTimerPeriodInTicks = xMessage.xMessageValue;

+				xTimeToExpire = xTaskGetTickCount() + pxTimer->xTimerPeriodInTicks;

+				listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xTimeToExpire );

+				listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );

+				vListInsert( &xActiveTimerList, &( pxTimer->xTimerListItem ) );

+				break;

+

+			case tmrCOMMAND_DELETE :

+				/* The timer has already been removed from the active list,

+				just free up the memory. */

+				vPortFree( pxTimer );

+				break;

+

+			default	:			

+				/* Don't expect to get here. */

+				break;

 		}

 	}

 }

@@ -323,6 +340,22 @@
 }

 /*-----------------------------------------------------------*/

 

+portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer )

+{

+portBASE_TYPE xTimerIsInActiveList;

+xTIMER *pxTimer = ( xTIMER * ) xTimer;

+

+	/* Is the timer in the list of active timers? */

+	taskENTER_CRITICAL();

+	{

+		xTimerIsInActiveList = listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) );

+	}

+	taskEXIT_CRITICAL();

+

+	return xTimerIsInActiveList;

+}

+/*-----------------------------------------------------------*/

+

 void *pvTimerGetTimerID( xTimerHandle xTimer )

 {

 xTIMER *pxTimer = ( xTIMER * ) xTimer;

@@ -331,55 +364,3 @@
 }

 /*-----------------------------------------------------------*/

 

-static void prvRemoveTimerFromActiveList( xTIMER *pxTimer )

-{

-	/* Is the timer already in the list of active timers? */

-	if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE )

-	{

-		/* The timer is in the list, remove it. */

-		vListRemove( &( pxTimer->xTimerListItem ) );

-	}

-}

-/*-----------------------------------------------------------*/

-

-static portBASE_TYPE prvSendMessageToTimerServiceTask( xTIMER_MESSAGE *pxMessage, portTickType xBlockTime )

-{

-portBASE_TYPE xReturn;

-

-	if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )

-	{

-		xReturn = xQueueSendToBack( xTimerQueue, pxMessage, xBlockTime );

-	}

-	else

-	{

-		xReturn = xQueueSendToBack( xTimerQueue, pxMessage, tmrNO_DELAY );

-	}

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-

-

-

-

-

-

-portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer )

-{

-	return pdFALSE;

-}

-

-void vTimerStop( xTimerHandle xTimer )

-{

-}

-

-

-void vTimerChangePeriod( xTimerHandle xTimer )

-{

-}

-

-void vTimerDelete( xTimerHandle xTimer )

-{

-}

-/*-----------------------------------------------------------*/