Project 2 - Implement the Code for controlling the retraction and extension of Airplane’s landing gear
// Shrividya Madam
#include <stdio.h>
#include <stdlib.h>
/* Functions used in our projects */
void Initial_state_machine(); // function declaration
void Gear_down();
void Checking_before_takeoff();
void Raising_gear();
void Gear_up();
void Checking_before_landing();
void Lowering_gear();
typedef enum states
{
GEAR_DOWN,
CHECK_BEFORE_TAKEOFF,
RAISING_GEAR,
GEAR_UP,
CHECK_BEFORE_LANDING,
LOWERING_GEAR
} state_type;
typedef enum Switch
{
open = 0,
close = 1
} Switch_status;
typedef enum pilot_lever
{
raising = 0,
falling = 1,
up = 2,
down = 3
} pilot_lever_status;
typedef enum hydraulic_mechanism
{
working = 0,
malfunctioning = 1
} hydraulic_mechanism_status;
/* input used in order to change the state */
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 // structure is used to have different types of data type
{
char *current_state_status; // output which we want to visualize are given under structure as structure member.
char *light_status;
char *direction_value_status;
char *hydraulic_pump_ctrl_status;
char *gas_pressurized_spring_status[2];
} state_table;
/* State table of the required system */
static state_table state_machine[6] = {
{"gear down", "green", "down", "enables", {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"}},
};
static void (*State_Table[])(void) = {Gear_down, Checking_before_takeoff, Raising_gear, Gear_up, Checking_before_landing, Lowering_gear};
// initial state machine
void Initial_state_machine()
{
current_state = GEAR_DOWN;
// during initialization, the system is at gear down.
printf("\n state machine is initialized and at first program is in gear down and its light status is:%s\n", state_machine[current_state].light_status);
}
// Gear down
void Gear_down(void)
{
current_state = GEAR_DOWN;
printf("\n Current state:Gear down\n");
// getting pilot lever and squat switch value from input
printf("\n Enter the pilot's lever position and squat switch status:\n");
fflush(stdout);
scanf("%d %d", (int *)&pilot_lever, (int *)&squat_switch);
// if pilot lever raising(0) and squat switch is open(0)
if (pilot_lever == raising && squat_switch == open)
{
current_state = CHECK_BEFORE_TAKEOFF;
// current status value is printed from the state table
printf("\n The current state of the machine is:%s\n", state_machine[current_state].current_state_status);
// light status value is taken from state table current state
printf("\n Light status of the current machine state is:%s\n", state_machine[current_state].light_status);
}
else
{
Gear_down();
// gear down function is called
}
}
// Checking before takeoff
void Checking_before_takeoff()
{
current_state = CHECK_BEFORE_TAKEOFF; // current state is check before takeoff
printf("\n Enter the pilot lever position, squat switch and hydraulic mechanism:\n");
// getting pilot lever, squat switch and hydraulic mechanism as input
fflush(stdout);
scanf("%d %d %d", (int *)&pilot_lever, (int *)&squat_switch, (int *)&hydraulic_mechanism);
printf("\n just wait 2secs\n");
if (pilot_lever == up && squat_switch == close)
// pilot lever is up and squat switch is closed it get into the if loop
{
Gear_down();
// gear down function is called
}
else if (pilot_lever == up && squat_switch == open && hydraulic_mechanism == working) //
{
current_state = RAISING_GEAR;
printf("\n Current state:%s\n", state_machine[current_state].current_state_status);
printf("light status: %s\n", state_machine[current_state].light_status);
printf("\n direction status:%s\n\n", state_machine[current_state].direction_value_status);
}
else if (pilot_lever == up && squat_switch == open && hydraulic_mechanism == malfunctioning)
{
current_state = RAISING_GEAR;
printf("\n Current state: %s\n", state_machine[current_state].current_state_status);
printf("light status: %s\n", state_machine[current_state].light_status);
printf("\n direction status:%s\n\n", state_machine[current_state].direction_value_status);
printf("\n Gas pressurized spring status:%s\n", state_machine[current_state].gas_pressurized_spring_status[hydraulic_mechanism]);
}
}
// Raising gear
void Raising_gear()
{
current_state = RAISING_GEAR;
printf("\n if Raising_grar: Enter the switch status and pilot lever status:\n");
fflush(stdout);
scanf("%d %d", (int *)&limit_switch, (int *)&pilot_lever);
printf("\n wait for 1 sec\n");
if (pilot_lever == falling && limit_switch == open)
{
current_state = CHECK_BEFORE_LANDING;
printf("\n current state is:%s\n", state_machine[current_state].current_state_status);
printf("\n Light status:%s\n", state_machine[current_state].light_status);
printf("\n Hydraulic condition for landing gear status is %s\n", state_machine[current_state].hydraulic_pump_ctrl_status);
}
else if (limit_switch == close && pilot_lever == up)
{
current_state = GEAR_UP;
printf("\n current state is:%s\n", state_machine[current_state].current_state_status);
printf("\n Light status:%s\n", state_machine[current_state].light_status);
printf("\n Hydraulic condition for landing gear status is %s\n", state_machine[current_state].hydraulic_pump_ctrl_status);
}
else
{
Raising_gear();
}
}
// Gear up
void Gear_up()
{
current_state = GEAR_UP;
printf("\n If gear_up Enter the pilot lever position :\n");
fflush(stdout);
scanf("%d", (int *)&pilot_lever);
if (pilot_lever == falling)
{
current_state = CHECK_BEFORE_LANDING;
printf("\n Current state: %s\n", state_machine[current_state].current_state_status);
printf("\n light status: %s\n", state_machine[current_state].light_status);
printf("\n Hydraulic condition for landing gear status is %s\n", state_machine[current_state].hydraulic_pump_ctrl_status);
}
else
{
Gear_up();
}
}
// Checking before landing
void Checking_before_landing()
{
current_state = CHECK_BEFORE_LANDING;
printf("\n Enter the pilot lever position, status of hydraulic mechanism:\n");
fflush(stdout);
scanf("%d %d ", (int *)&pilot_lever, (int *)&hydraulic_mechanism);
if (pilot_lever == down && hydraulic_mechanism == working)
{
current_state = LOWERING_GEAR;
printf("\n Current state: %s\n", state_machine[current_state].current_state_status);
printf("light status: %s\n", state_machine[current_state].light_status);
printf("\n direction status:%s\n\n", state_machine[current_state].direction_value_status);
}
else if (pilot_lever == down && hydraulic_mechanism == malfunctioning)
{
current_state = LOWERING_GEAR;
printf("\n Current state: %s\n", state_machine[current_state].current_state_status);
printf("light status: %s\n", state_machine[current_state].light_status);
printf("\n direction status:%s\n\n", state_machine[current_state].direction_value_status);
printf("\n Gas pressurized spring status:%s\n", state_machine[current_state].gas_pressurized_spring_status[hydraulic_mechanism]);
}
if (pilot_lever == (up || raising || falling))
{
Checking_before_landing();
}
}
// Lowering gear
void Lowering_gear()
{
current_state = LOWERING_GEAR;
printf("\n Enter the pilot lever position, limit switch :");
fflush(stdout);
scanf("%d %d", (int *)&pilot_lever, (int *)&limit_switch);
if (pilot_lever == raising && limit_switch == close)
{
current_state = CHECK_BEFORE_TAKEOFF;
printf("\n Current state: %s\n", state_machine[current_state].current_state_status);
printf("\n light status: %s\n", state_machine[current_state].light_status);
}
if (pilot_lever == down && limit_switch == open)
{
current_state = GEAR_DOWN;
printf("\n Current state: %s\n", state_machine[current_state].current_state_status);
printf("\n light status: %s\n", state_machine[current_state].light_status);
printf("\n Hydraulic condition for landing gear status is%s\n", state_machine[current_state].hydraulic_pump_ctrl_status);
}
else
{
Lowering_gear();
}
}
// main function
int main()
{
Initial_state_machine();
while (1)
{
State_Table[current_state]();
}
return 0;
}
output:-
state machine is initialized and at first program is in gear down and its light status is:green
Current state:Gear down
Enter the pilot's lever position and squat switch status:
0
0
The current state of the machine is:checking before take off
Light status of the current machine state is:green
Enter the pilot lever position, squat switch and hydraulic mechanism:
2 0
0
just wait 2secs
Current state:raising gear
light status: red
direction status:up
if Raising_grar: Enter the switch status and pilot lever status:
0
1
wait for 1 sec
current state is:checking before landing
Light status:red
Hydraulic condition for landing gear status is enabled
Enter the pilot lever position, status of hydraulic mechanism:
3
0
0
Current state: lowering gear
light status: green
direction status:down