Challenge

Project 2 - Implement the Code for controlling the retraction and extension of Airplane’s landing gear

Overview - 

To implement the controlling retraction and extension of Airplane's Landing Gear using Finite State Machine.

Goals - 

  • To control the direction of valve
  • To control the retraction and extension of Airplane's Landing Gear
  • To check the transition is possible or not before gear transition

Key Highlights - 

  • Controlling the direction valve
  • Check the state of Hydraulics Mechanism for Gear Transition
  • Transitioning of Gear 

Deliverables - 

  • Implementing retraction control of Landing Gear
  • Implementing extension control of Landing Gear
  • Implementing different states of switches and gear

Expected Outcome -

  • To control the Airplane Landing Gear mechanism using Finite State Machine.

Code - 

/*
 * Landing_Gear.c
 *
 *  Created on: 22-Jan-2023
 *      Author: Vishal Goyal
 */

// For including standard I/O Functions
#include

// Declaring Functions
void Init_State_Machine();
void GearUp();
void GearDown();
void GearRise();
void GearFall();
void TakeoffCheck();
void LandingCheck();

// State Table
static void(*StateTable[])(void) =
		{GearDown,TakeoffCheck,GearRise,GearUp,LandingCheck,GearFall};

// Different States
typedef enum States
{
	Gear_Down,
	Takeoff_Check,
	Gear_Rise,
	Gear_Up,
	Landing_Check,
	Gear_Fall
}State_Types;

// For Switches State
typedef enum Switch
{
	Closed,
	Open
}Switch_Status;

// For Pilot Lever State
typedef enum Gear_Lever
{
	Rising,
	Falling
}Pilot_Lever;

// Hydraulic Mechanism Control
typedef enum Hydraulic_Mechanism
{
	Working,
	Not_Working
}Hydraulic_Mech;

// Variables to be used throughout the file
static volatile Switch_Status Squat_Switch;
static volatile Switch_Status Limit_Switch;
static volatile Pilot_Lever Lever;
static volatile Hydraulic_Mech Hydraulics;

// Variable defined for current state
State_Types current_state;

// Structure for State Table
typedef struct
{
	char* state;
	char* light;
	char* direction;
	char* landing_gear_control;
	char* Spring_System[2];
}State_Table;

// State Machine definition
static State_Table State_Machine[6] = {
		{"GearDown","Green","Down","Enabled",{NULL,NULL}},
		{"TakeoffCheck","Green","Down","Enabled",{NULL,NULL}},
		{"GearRising","Red","Up","Enabled",{NULL,NULL}},
		{"GearUP","Open","NULL","Disabled",{NULL,NULL}},
		{"LandingCheck","Red","Down","Enabled",{NULL,NULL}},
		{"GearFall","Green","Down","Enabled",{"Disabled","Enabled"}}
		};

// Starting of Main Function
// Logic is written inside the main function
int main()
{
	// Initializing the state mechanism
	Init_State_Machine();

	// Infinite Time Loop
	while(1)
	{
		StateTable[current_state]();
	}

	// After executing this main function, this function will return value 0
	return 0;
}

// Initializing State Machine
void Init_State_Machine()
{
	current_state = Gear_Down;
	printf("Initializing....\n");
	printf("Current State is Gear_Down\n");
	printf("Signal Light is %s\n",State_Machine[current_state].light);
}

// Function for Gear Down
void GearDown()
{
	// Current state
	current_state = Gear_Down;

	// Taking the Pilot Lever State from user
	printf("Enter the state of Pilot's Lever: ");
	fflush(stdout);
	scanf("%d",&Lever);

	// Taking the Squat Switch condition from user
	printf("Enter the state of Squat Switch: ");
	fflush(stdout);
	scanf("%d",&Squat_Switch);

	// Condition for Successful Gear Down Condition
	// Rising Lever and Open Squat Switch
	if((Lever == Rising) && (Squat_Switch == Open))
	{
		current_state = Takeoff_Check;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
	}
	else
	{
		GearDown();
	}
}

// Checking before Takeoff
void TakeoffCheck()
{
	// Current state is TakeoffCheck
	current_state = Takeoff_Check;

	// Taking user input for Pilot's Lever
	printf("Enter the state of Pilot's Lever: ");
	fflush(stdout);
	scanf("%d",&Lever);

	// Taking user input for Squat Switch
	printf("Enter the state of Squat Switch: ");
	fflush(stdout);
	scanf("%d",&Squat_Switch);

	// Taking user input for Hydraulics Mechanism
	printf("Enter the state of Hydraulics Mechanism: ");
	fflush(stdout);
	scanf("%d",&Hydraulics);

	// Conditions Check before Takeoff
	if((Lever == Falling) && (Squat_Switch == Open))
	{
		GearDown();
	}
	else if((Lever == Rising) && (Squat_Switch == Closed) && (Hydraulics == Working))
	{
		current_state = Gear_Rise;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Direction State: %s\n",State_Machine[current_state].direction);
	}
	else if((Lever == Rising) && (Squat_Switch == Closed) && (Hydraulics == Not_Working))
	{
		current_state = Gear_Rise;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Direction State: %s\n",State_Machine[current_state].direction);
		printf("Gas Pressurized Spring System State: %s\n",State_Machine[current_state].Spring_System);
	}
}

// Gear Up
void GearRise()
{
	// Current State is Gear Rise
	current_state = Gear_Rise;

	// Taking user input of Pilot's Lever
	printf("Enter the state of Pilot's Lever: ");
	fflush(stdout);
	scanf("%d",&Lever);

	// Taking user input of Limit Switch
	printf("Enter the state of Limit Switch: ");
	fflush(stdout);
	scanf("%d",&Limit_Switch);

	// Conditions
	if((Lever == Falling) && (Limit_Switch == Closed))
	{
		current_state = Landing_Check;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Landing Gear Hydraulic Control State: %s\n",State_Machine[current_state].landing_gear_control);
	}
	else if((Lever == Rising) && (Limit_Switch == Open))
	{
		current_state = Gear_Up;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Landing Gear Hydraulic Control: %s\n",State_Machine[current_state].landing_gear_control);
	}
	else
	{
		GearRise();
	}
}

// Gear Transition from Down to Up
void GearUp()
{
	// Current State is Gear Up
	current_state = Gear_Up;

	// Taking user input of Pilot's Lever
	printf("Enter the state of Pilot's Lever: ");
	fflush(stdout);
	scanf("%d",&Lever);

	// Conditions
	if(Lever == Falling)
	{
		current_state = Landing_Check;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Landing Gear Hydraulic Control: %s\n",State_Machine[current_state].landing_gear_control);
	}
	else
	{
		GearUp();
	}
}

// Check before Landing
void LandingCheck()
{
	// Current state is Landing Check
	current_state = Landing_Check;

	// Taking user input of Pilot's Lever
	printf("Enter the status of Pilot's Lever: ");
	fflush(stdout);
	scanf("%d",&Lever);

	// Taking user input of Hydraulics Mechanism
	printf("Enter the status of Hydraulics Mechanism: ");
	fflush(stdout);
	scanf("%d",&Hydraulics);

	// Conditions
	if((Lever == Falling) && (Hydraulics == Working))
	{
		current_state = Gear_Fall;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Direction State: %s\n",State_Machine[current_state].direction);
	}
	else if((Lever == Falling) && (Hydraulics == Not_Working))
	{
		current_state = Gear_Fall;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Direction State: %s\n",State_Machine[current_state].direction);
		printf("Gas Pressurized Spring System State: %s\n",State_Machine[current_state].Spring_System);
	}
	else if(Lever == Rising)
	{
		LandingCheck();
	}
}

// Gear Transition from Up to Downl
void GearFall()
{
	// Current state is Gear Fall
	current_state = Gear_Fall;

	// Taking user input of Pilot's lever
	printf("Enter the status of Pilot's Lever: ");
	fflush(stdout);
	scanf("%d",&Lever);

	// Taking user input of Limit Switch
	printf("Enter the status of Limit Switch: ");
	fflush(stdout);
	scanf("%d",&Limit_Switch);

	// Conditions
	if((Lever == Rising) && (Limit_Switch == Closed))
	{
		current_state = Takeoff_Check;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Landing Gear Hydraulic Control: %s\n",State_Machine[current_state].landing_gear_control);
	}
	else if((Lever == Rising) && (Limit_Switch == Open))
	{
		current_state = Gear_Down;
		printf("Current State: %s\n",State_Machine[current_state].state);
		printf("Signal Light: %s\n",State_Machine[current_state].light);
		printf("Landing Gear Hydraulic Control: %s\n",State_Machine[current_state].landing_gear_control);
	}
	else if(Limit_Switch == Open)
	{
		GearFall();
	}
}

Output - 

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.