You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
FreeRTOS-Kernel/Demo/MB96350_Softune_Dice_Kit/DiceTask.c

182 lines
5.1 KiB
C

/*
FreeRTOS.org V5.1.1 - Copyright (C) 2003-2008 Richard Barry.
This file is part of the FreeRTOS.org distribution.
FreeRTOS.org is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
FreeRTOS.org is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with FreeRTOS.org; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
A special exception to the GPL can be applied should you wish to distribute
a combined work that includes FreeRTOS.org, without being obliged to provide
the source code for any proprietary components. See the licensing section
of http://www.FreeRTOS.org for full details of how and when the exception
can be applied.
***************************************************************************
***************************************************************************
* *
* SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *
* and even write all or part of your application on your behalf. *
* See http://www.OpenRTOS.com for details of the services we provide to *
* expedite your project. *
* *
***************************************************************************
***************************************************************************
Please ensure to read the configuration and relevant port sections of the
online documentation.
http://www.FreeRTOS.org - Documentation, latest information, license and
contact details.
http://www.SafeRTOS.com - A version that is certified for use in safety
critical systems.
http://www.OpenRTOS.com - Commercial support, development, porting,
licensing and training services.
*/
#include "FreeRTOS.h"
#include "task.h"
#define diceMIN 1
#define diceMAX 6
#define diceRUN_MIN 600000L
#define diceRUN_MAX 1200000L
#define diceSTATE_STOPPED 0
#define diceSTATE_STARTUP 1
#define diceSTATE_RUNNING 2
#define diceEND_DELAY ( 5000 / portTICK_RATE_MS )
#define dice7SEG_Value( x ) *( pucDisplayOutput[ x ] )
static unsigned char prvButtonHit( unsigned char ucIndex );
static const char cDisplaySegments[ 2 ][ 11 ] =
{
{ 0x48, 0xeb, 0x8c, 0x89, 0x2b, 0x19, 0x18, 0xcb, 0x08, 0x09, 0xf7 },
{ 0xa0, 0xf3, 0xc4, 0xc1, 0x93, 0x89, 0x88, 0xe3, 0x80, 0x81, 0x7f }
};
extern volatile unsigned char *pucDisplayOutput[ 2 ];
/*-----------------------------------------------------------*/
void vDiceTask( void *pvParameters )
{
char cDiceState = diceSTATE_STOPPED;
unsigned char ucDiceValue, ucIndex;
unsigned long ulDiceRunTime, ulDiceDelay, ulDiceDelayReload;
extern void vToggleFlashTaskSuspendState( void );
ucIndex = ( unsigned char ) pvParameters;
for( ;; )
{
switch( cDiceState )
{
case diceSTATE_STOPPED:
if( prvButtonHit( ucIndex ) == pdTRUE )
{
ulDiceRunTime = diceRUN_MIN;
srand( ( unsigned char ) ulDiceRunTime );
cDiceState = diceSTATE_STARTUP;
}
break;
case diceSTATE_STARTUP:
if( ulDiceRunTime < diceRUN_MAX ) // variable running time
{
ulDiceRunTime++;
}
else
{
ulDiceRunTime = diceRUN_MIN;
}
if( prvButtonHit( ucIndex ) == pdFALSE )
{
if( ucIndex == 0 )
{
vToggleFlashTaskSuspendState();
}
ulDiceDelay = 1;
ulDiceDelayReload = 1;
cDiceState = diceSTATE_RUNNING;
}
break;
case diceSTATE_RUNNING:
ulDiceRunTime--;
ulDiceDelay--;
if( !ulDiceDelay )
{
ucDiceValue = rand() % 6 + 1;
dice7SEG_Value( ucIndex ) = ( dice7SEG_Value( ucIndex ) | 0xf7 ) & cDisplaySegments[ ucIndex ][ ucDiceValue ];
ulDiceDelayReload = ulDiceDelayReload + 100;
ulDiceDelay = ulDiceDelayReload;
}
if( ulDiceRunTime == 0 )
{
dice7SEG_Value( ucIndex ) = ( dice7SEG_Value( ucIndex ) | 0xf7 ) & cDisplaySegments[ ucIndex ][ rand() % 6 + 1 ];
cDiceState = diceSTATE_STOPPED;
if( ucIndex == 0 )
{
vTaskDelay( diceEND_DELAY );
*pucDisplayOutput[ ucIndex ] = 0xff;
vToggleFlashTaskSuspendState();
}
}
break;
}
}
}
/*-----------------------------------------------------------*/
static unsigned char prvButtonHit( unsigned char ucIndex )
{
if( ( ucIndex == 0 ) && PDR00_P0 )
{
return pdTRUE;
}
else if( ( ucIndex == 1 ) && PDR00_P1 )
{
return pdTRUE;
}
else
{
return pdFALSE;
}
}
/*-----------------------------------------------------------*/