Sie sind auf Seite 1von 6

/****************************************************************************

Module
ObstacleStateMachine.c
Revision
1.0
Description
This is the ObstacleStateMachine for Team 9 ME218b final project. It is a sub
state machine of GameStateMachine.
Notes
History
When
Who
What/Why
----------------------02/10/2015
15:08 Sky
Added racing strategy
02/09/2015
10:46 Sky
Initial version
****************************************************************************/
#include "ES_Configure.h"
#include "ES_Framework.h"
#include "ES_DeferRecall.h"
#include
#include
#include
#include
#include
#include
#include

"inc/hw_memmap.h"
"inc/hw_types.h"
"inc/hw_gpio.h"
"inc/hw_sysctl.h"
"driverlib/sysctl.h"
"driverlib/pin_map.h" // Define PART_TM4C123GH6PM in project
"driverlib/gpio.h"

#include
#include
#include
#include
#include

"MasterMachine.h"
"GameStateMachine.h"
"ObstacleStateMachine.h"
"Motion.h"
"RaceStateMachine.h"

#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

SPEEDLV1 0
SPEEDLV2 1
SPEEDLV3 2
TargetObstacleX 1
TargetObstacleY 2
SHOOT 0
OBSTACLE 1
MASTER 2
LEFT0 0
LEFT1 1
LEFT2 2

#define RIGHT0 3
#define RIGHT1 4
#define RIGHT2 5
#define LEFT
0
#define RIGHT 1
#define SPEEDLVCLIMB 2
/****************************Module Variables*********************************/

ObstacleState CurrentState, HistoryState;


/*************************Private Functions Prototype*************************/
static ES_Event DuringToObstacleState(ES_Event);
static ES_Event DuringRegion9State(ES_Event);
/****************************Public Functions*********************************/
/**************************************************
FUNCTION RunObstacleSM
ARGUMENT: ES_Event CurrentEvent
RETURN: ES_Event
DESCRIPTION: Run function for obstacle state machine
**************************************************/
ES_Event RunObstacleSM(ES_Event CurrentEvent)
{
ObstacleState NextState;
bool MakeTransition;
ES_Event LocalEvent;
ES_Event ReturnEvent;
NextState = CurrentState;
MakeTransition = false;
LocalEvent = CurrentEvent;
ReturnEvent = CurrentEvent;
//switch CurrentState
switch (CurrentState)
{
case Obstacle_ToObstacle

{
//pass down the event to any lower level state machine
LocalEvent = DuringToObstacleState(CurrentEvent);
if (ES_NO_EVENT != LocalEvent.EventType) //if there is still an active event
{
switch (LocalEvent.EventType)
{
case ES_InPosition
//update CurrentTarget
SetTarget(9);
//Start rotation, do not move forward
RotateLeft();
ReturnEvent.EventType = ES_NO_EVENT;
break;
}

case ES_RightDirection

//stop rotation
//start moving forward
MoveForward(SPEEDLV2);
ReturnEvent.EventType = ES_NO_EVENT;
break;
}
case ES_InRegion9

MakeTransition = true;
NextState = Obstacle_Region9;
ReturnEvent.EventType = ES_NO_EVENT;
break;
}
default
:
break;
}
}
break;
}
case Obstacle_Region9
:

//pass down the event to any lower level state machine


LocalEvent = DuringRegion9State(CurrentEvent);
if (ES_NO_EVENT != LocalEvent.EventType) //if there is still an active event
{
switch (LocalEvent.EventType)
{
case ES_InRegion2

{
LocalEve

nt.EventType = ES_ToRace;
LocalEvent.EventParam = OBSTACLE;
PostToMasterSM(LocalEvent);

ReturnEvent.EventType = ES_NO_EVENT;
break;
}
case ES_InRegion1

LocalEvent.EventType = ES_ToRace;
LocalEvent.EventParam = OBSTACLE;
PostToMasterSM(LocalEvent);
ReturnEvent.EventType = ES_NO_EVENT;
break;
}
default
:
break;
}
}
}
default
: break;
}
//if we are still making transition
if (MakeTransition == true)
{
//execute the exit function current state
LocalEvent.EventType = ES_EXIT;
RunObstacleSM(LocalEvent);
//execute the entry function next state
CurrentState = NextState;
LocalEvent.EventType = ES_ENTRY;
RunObstacleSM(LocalEvent);
}
return ReturnEvent;
}
/**************************************************
FUNCTION StartObstacleSM
ARGUMENT: ES_Event CurrentEvent
RETURN: no return
DESCRIPTION: start obstacle state machine
**************************************************/
void StartObstacleSM(ES_Event Event)
{
volatile ES_Event LocalEvent;
LocalEvent = Event;
if (LocalEvent.EventType == ES_ENTRY)
{

CurrentState = Obstacle_Region9;
HistoryState = CurrentState;
RunObstacleSM(LocalEvent);
}
else if (LocalEvent.EventType == ES_ENTRY_HISTORY)
{
//enter historystate
CurrentState = HistoryState;
RunObstacleSM(LocalEvent);
}
}
/****************************************Private Functions**********************
******************/
/**************************************************
FUNCTION DuringToObstacleState
ARGUMENT: ES_Event CurrentEvent
RETURN: ES_Event
DESCRIPTION: during function for Obstacle_ToObstacle state
**************************************************/
static ES_Event DuringToObstacleState(ES_Event CurrentEvent)
{
ES_Event LocalEvent;
LocalEvent = CurrentEvent;
if ((LocalEvent.EventType == ES_ENTRY)||
(LocalEvent.EventType == ES_ENTRY_HISTORY))
{
//start moving forward
MoveForward(SPEEDLV2);
}
else if (LocalEvent.EventType == ES_EXIT)
{
HistoryState = CurrentState;
}
else
{
//nothing to do here since there is no lower level state machine
}
return LocalEvent;
}
/**************************************************
FUNCTION DuringRegion9State
ARGUMENT: ES_Event CurrentEvent
RETURN: ES_Event
DESCRIPTION: during function for Obstacle_Region9 state
**************************************************/
static ES_Event DuringRegion9State(ES_Event CurrentEvent)
{
ES_Event LocalEvent;
LocalEvent = CurrentEvent;
if ((LocalEvent.EventType == ES_ENTRY)||
(LocalEvent.EventType == ES_ENTRY_HISTORY))
{
//speed down to climb the obstacle
MoveForward(SPEEDLV1);
}

else if (LocalEvent.EventType == ES_EXIT)


{
HistoryState = CurrentState;
Stop();
}
else
{
//nothing to do here since there is no lower level state machine
}
return LocalEvent;
}

Das könnte Ihnen auch gefallen