Challenge

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

Aim:In this project, controlling the retraction and extension of Airplane’s landing gear can be implemented using Finite State Machine (FSM). FSM is the most efficient algorithm which is mathematical model of computation.

Objective:

  • Controlling the direction of valve.
  • Controlling the retraction and extension of airplane’s landing gear.

Principle:

  • The airplane has three gears for landing such as nose gear, left gear and right gear.
  • There is a hydraulic pump which is exerting pressure tothe gears to bring it down or pull it up using electrical driven pump.
  • When the direction of the valve is down then it is landed or gear down position.
  • Similarly when the direction of valve is up then it is in rising gear or taking off.
  • When gear is up then light status is off.
  • Gear is down then the light status is green.
  • Gear is raising or lowering then the colour of light is red.

Code:

State.h file:

/*
* state.h
*
* Created on: Aug 21, 2022
* Author: tpank
*/

#ifndef STATE_H_
#define STATE_H_

void Init_State_Machine();
void Gear_Down();
void Checking_Before_Takeoff();
void Raising_Gear();
void Gear_Up();
void Checking_Before_Landing();
void Lowering_Gear();

typedef enum State
{
GearDown,
CheckBeforeTakeoff,
RaisingGear,
Gearup,
CheckBeforeLanding,
LoweringGear,

}State_Type;

typedef enum Switch
{
Open,
Close

}Switch_Status;

typedef enum Pilot_Lever
{

Rising,
Falling,
UP,
DOWN

}Pilot_Lever_Status;

typedef enum Hydraulic_Mechanism
{
Working,
Malfunctioning

}Hydraulic_Mechanism_Status;

static volatile Switch_Status squat_switch;
static volatile Switch_Status limit_switch;
static volatile Pilot_Lever_Status pilot_lever;
static volatile Hydraulic_Mechanism_Status hydraulic_mechanism;

State_Type current_state;

typedef struct
{
char* current_state_indication;
char* light_status;
char* direction_valve_status;
char* hydraulic_pump_control_status;
char* gas_pressurized_spring_status[2];
}State_Table;

static State_Table State_Machine[6] = {
{"GearDown","Green","Down","Enabled",0,0},
{"Checking Before Take Off","Green","Down","Enabled",0,0},
{"Raising Gear","Red","Up","Enabled",{"Disabled","Enabled"}},
{"Gear Up","Off","Null","Disabled",0,0},
{"Checking Before Landing","Red","Down","Enabled",0,0},
{"Lowering Gear","Green","Down","Enabled",{"Disabled","Enabled"}}

};

#endif /* STATE_H_ */

gearup.c file:

/*
* gearup.c
*
* Created on: Aug 21, 2022
* Author: tpank
*/
#include"State.h"
#include<stdio.h>

void Gear_Up()
{
current_state = Gearup;
printf("\nEnter the Pilot's Lever Position:");
fflush(stdout);
scanf("%d",&pilot_lever);
if(pilot_lever == Falling)
{
current_state = CheckBeforeLanding;
printf("\nCurrent State: %s\n",State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n", State_Machine[current_state].light_status);
printf("Hydraulic Control for Landing Gear Status:%s\n",State_Machine[current_state].hydraulic_pump_control_status);
}
else
{Gear_Up();

}
}

geardown.c file:

/*
* geardown.c
*
* Created on: Aug 21, 2022
* Author: tpank
*/
#include"State.h"
#include<stdio.h>

void Gear_Down(void)
{
current_state = GearDown;
printf("\n Enter the Pilot's Lever Position and Squat Switch Status:");
fflush(stdout);
scanf("%d %d",&pilot_lever,&squat_switch);
if(pilot_lever == Rising && squat_switch == Open)
{
current_state = CheckBeforeTakeoff;
printf("\nCurrent State: %s\n",State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n", State_Machine[current_state].light_status);

}
else
{
Gear_Down();
}
}

/*
* geardown.c
*
* Created on: Aug 21, 2022
* Author: tpank
*/
#include"State.h"
#include<stdio.h>

void Gear_Down(void)
{
current_state = GearDown;
printf("\n Enter the Pilot's Lever Position and Squat Switch Status:");
fflush(stdout);
scanf("%d %d",&pilot_lever,&squat_switch);
if(pilot_lever == Rising && squat_switch == Open)
{
current_state = CheckBeforeTakeoff;
printf("\nCurrent State: %s\n",State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n", State_Machine[current_state].light_status);

}
else
{
Gear_Down();
}
}

loweringgear.c file:

/*
* loweringgear.c
*
* Created on: Aug 21, 2022
* Author: tpank
*/

#include "State.h"
#include<stdio.h>
void Lowering_Gear()
{
current_state = LoweringGear;
printf("\nEnter the Limit Switch Status,Pilots Leaver Status:");
fflush(stdout);
scanf("%d %d",&limit_switch,&pilot_lever);
if(limit_switch == Close && pilot_lever == Rising )
{
current_state = CheckBeforeTakeoff;
printf("\nCurrent State:%s\n",State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n",State_Machine[current_state].light_status);

}
if(limit_switch == Open && pilot_lever == DOWN)
{
current_state = GearDown;
printf("\nCurrent State:%s\n",State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n",State_Machine[current_state].light_status);
printf("Hydraulic Controlfor Landing Gear Status:%s\n",State_Machine[current_state].hydraulic_pump_control_status);

}
else
{
Lowering_Gear();
}
}

raisinggear.c file:

/*
* raisinggear.c
*
* Created on: Aug 21, 2022
* Author: tpank
*/
#include"State.h"
#include<stdio.h>

void Raising_Gear()
{
current_state = RaisingGear;
printf("\nEnter the Limit Switch Status,Pilots Leaver Status:");
fflush(stdout);
scanf("%d %d",&limit_switch,&pilot_lever);
printf("\nWait for 1 sec\n");
if(pilot_lever == Falling && limit_switch == Open)
{
current_state = CheckBeforeLanding;
printf("\nCurrent State: %s\n",State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n",State_Machine[current_state].light_status);
printf("Hydraulic Control for Landing Gear Status:%s\n",State_Machine[current_state].hydraulic_pump_control_status);

}
else if(limit_switch == Close && pilot_lever == UP)
{
current_state = Gearup;
printf("\nCurrent State: %s\n",State_Machine[current_state].current_state_indication);
printf("Light Status: %s\n", State_Machine[current_state].light_status);
printf("Hydraulic Control for Landing Gear Status:%s\n", State_Machine[current_state].hydraulic_pump_control_status);

}
else
{
Raising_Gear();

}

}

checkingbeforetakeoff.c file:

/*
* checkbeforetakeoff.c
*
* Created on: Aug 21, 2022
* Author: PankajTiwari
*/
#include "State.h"
#include<stdio.h>

void Checking_Before_Takeoff()
{
current_state = CheckBeforeTakeoff;
printf("\nEnter the Pilot's Lever Position,Squat Switch Status and Hydraulic Mechanism Status:");
fflush(stdout);
scanf("%d %d %d",&pilot_lever,&squat_switch,&hydraulic_mechanism);
printf("\nWait for 2 secs\n");
if(pilot_lever == Falling || squat_switch == Close)
{
Gear_Down();
}
else if(pilot_lever == UP && squat_switch == Open && hydraulic_mechanism == Working)
{
current_state = RaisingGear;
printf("\nCurrent State :%s\n",State_Machine[current_state].current_state_indication);
printf("Light Status: %s\n", State_Machine[current_state].light_status);
printf("Direction Valve Status:%s\n\n", State_Machine[current_state].direction_valve_status);
}
else if(pilot_lever == UP && squat_switch == Open && hydraulic_mechanism == Malfunctioning)
{
current_state = RaisingGear;
printf("\nCurrent State :%s\n",State_Machine[current_state].current_state_indication);
printf("Light Status: %s\n", State_Machine[current_state].light_status);
printf("Direction Valve Status:%s\n", State_Machine[current_state].direction_valve_status);
printf("Gas Pressurized Spring System Status:%s\n",State_Machine[current_state].gas_pressurized_spring_status[hydraulic_mechanism]);
}
}

checkingbeforelanding.c file:

/*
* checkbeforelanding.c
*
* Created on: Aug 21, 2022
* Author: tpank
*/
#include "State.h"
#include<stdio.h>
void Checking_Before_Landing()

{

current_state = CheckBeforeLanding;
printf("\nEnter the Pilot's Lever Position and Status of Hydraulic Mechanism:");
fflush(stdout);
scanf("%d %d",&pilot_lever,&hydraulic_mechanism);
if(pilot_lever == DOWN && hydraulic_mechanism == Working)
{
current_state = LoweringGear;
printf("\nCurrent State:%s\n", State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n", State_Machine[current_state].light_status);
printf("Direction Valve Status:%s\n", State_Machine[current_state].direction_valve_status);
}
else if(pilot_lever == DOWN && hydraulic_mechanism == Malfunctioning)
{
current_state = LoweringGear;
printf("\nCurrent State:%s\n",State_Machine[current_state].current_state_indication);
printf("Light Status:%s\n", State_Machine[current_state].light_status);
printf("Direction Valve Status:%s\n", State_Machine[current_state].direction_valve_status);
printf("Gas Pressurized Spring System Status:%s\n",State_Machine[current_state].gas_pressurized_spring_status[hydraulic_mechanism]);

}
else if(pilot_lever == (UP || Rising || Falling))

{
Checking_Before_Landing();
}
}

initialstatemachine.c file:

/*
* initialstatemachine.c
*
* Created on: Aug 21, 2022
* Author: tpank
*/

#include"State.h"
#include<stdio.h>

void Init_State_Machine()
{
current_state = GearDown;
printf("\nState Machine is initialized & Program is in Gear_Down State & Light Status: %s\n"
,State_Machine[current_state].light_status);
}

fsm.c file:

/*
* fsm.c
*
* Created on: Aug 20, 2022
* Author: Pankaj Tiwari
*/
#include<stdio.h>
#include "State.h"

static void(*state_table[])(void) = {Gear_Down, Checking_Before_Takeoff,Raising_Gear,
Gear_Up, Checking_Before_Landing, Lowering_Gear};

int main()
{
Init_State_Machine();
while(1)
{
state_table[current_state]();
}
}

Makefile:

all:fsm.c geardown.c gearup.c checkbeforelanding.c checkbeforetakeoff.c loweringgear.c raisinggear.c state.h
gcc fsm.c geardown.c gearup.c checkbeforelanding.c checkbeforetakeoff.c loweringgear.c raisinggear.c state.h -o main -I.

clean:
rm main.exe

Output:

geardown:

checking before takeoff:

Raising gear:

Gearup:

Checking before landing:

Lowering gear:

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.