Challenge

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

#include <stdio.h>
#include <stdlib.h>

typedef enum {
GEAR_DOWN,
CHECK_BEFORE_TAKEOFF,
RAISING_GEAR,
GEAR_UP,
CHECK_BEFORE_LANDING,
LOWERING_GEAR
} State;

typedef enum {
OPEN,
CLOSE
} SwitchStatus;

typedef enum {
RAISING,
FALLING,
UP,
DOWN
} LeverStatus;

typedef enum {
WORKING,
MALFUNCTIONING
} HydraulicStatus;

typedef struct {
char* state_status;
char* light_status;
char* direction_status;
char* hydraulic_status;
char* spring_status[2];
} StateTable;

StateTable state_machine[] = {
{"gear down", "green", "down", "enabled", {"disabled", "disabled"}},
{"checking before takeoff", "green", "down", "enabled", {"disabled", "disabled"}},
{"raising gear", "red", "up", "enabled", {"disabled", "enabled"}},
{"gear up", "off", "NULL", "disabled", {"disabled", "disabled"}},
{"checking before landing", "red", "enabled", {"working", "malfunctioning"}, {"working", "malfunctioning"}},
{"lowering gear", "green", "down", "enabled", {"disabled", "enabled"}}
};

State current_state;
SwitchStatus squat_switch;
SwitchStatus limit_switch;
LeverStatus pilot_lever;
HydraulicStatus hydraulic_mechanism;

void gear_down() {
state_machine[GEAR_DOWN].state_status = "gear down";
state_machine[GEAR_DOWN].light_status = "green";
state_machine[GEAR_DOWN].direction_status = "down";
state_machine[GEAR_DOWN].hydraulic_status = "enabled";
state_machine[GEAR_DOWN].spring_status[0] = "disabled";
state_machine[GEAR_DOWN].spring_status[1] = "disabled";
if (squat_switch == OPEN) {
current_state = RAISING_GEAR;
}
}

void checking_before_takeoff() {
state_machine[CHECK_BEFORE_TAKEOFF].state_status = "checking before takeoff";
state_machine[CHECK_BEFORE_TAKEOFF].light_status = "green";
state_machine[CHECK_BEFORE_TAKEOFF].direction_status = "down";
state_machine[CHECK_BEFORE_TAKEOFF].hydraulic_status = "enabled";
state_machine[CHECK_BEFORE_TAKEOFF].spring_status[0] = "disabled";
state_machine[CHECK_BEFORE_TAKEOFF].spring_status[1] = "disabled";
if (squat_switch == OPEN) {
current_state = RAISING_GEAR;
}
}

void raising_gear() {
state_machine[RAISING_GEAR].state_status = "raising gear";
state_machine[RAISING_GEAR].light_status = "red";
state_machine[RAISING_GEAR].direction_status = "up";
state_machine[RAISING_GEAR].hydraulic_status = "enabled";
state_machine[RAISING_GEAR].spring_status[0] = "disabled";
state_machine[RAISING_GEAR].spring_status[1] = "enabled";
if (limit_switch == OPEN) {
current_state = GEAR_UP;
}
}

void gear_up() {
state_machine[GEAR_UP].state_status = "gear up";
state_machine[GEAR_UP].light_status = "off";
state_machine[GEAR_UP].direction_status = "NULL";
state_machine[GEAR_UP].hydraulic_status = "disabled";
state_machine[GEAR_UP].spring_status[0] = "disabled";
state_machine[GEAR_UP].spring_status[1] = "disabled";
if (squat_switch == CLOSE) {
current_state = CHECK_BEFORE_LANDING;
}
}
void checking_before_landing() {
state_machine[CHECK_BEFORE_LANDING].state_status = "checking before landing";
state_machine[CHECK_BEFORE_LANDING].light_status = "red";
state_machine[CHECK_BEFORE_LANDING].direction_status = "down";
state_machine[CHECK_BEFORE_LANDING].hydraulic_status = hydraulic_mechanism == WORKING ? "working" : "malfunctioning";
state_machine[CHECK_BEFORE_LANDING].spring_status[0] = hydraulic_mechanism == WORKING ? "working" : "malfunctioning";
state_machine[CHECK_BEFORE_LANDING].spring_status[1] = hydraulic_mechanism == WORKING ? "working" : "malfunctioning";
if (squat_switch == OPEN) {
current_state = LOWERING_GEAR;
}
}
void lowering_gear() {
state_machine[LOWERING_GEAR].state_status = "lowering gear";
state_machine[LOWERING_GEAR].light_status = "green";
state_machine[LOWERING_GEAR].direction_status = "down";
state_machine[LOWERING_GEAR].hydraulic_status = "enabled";
state_machine[LOWERING_GEAR].spring_status[0] = "disabled";
state_machine[LOWERING_GEAR].spring_status[1] = hydraulic_mechanism == WORKING ? "enabled" : "disabled";
if (squat_switch == CLOSE) {
current_state = GEAR_DOWN;
}
}
void update_status() {
switch (current_state) {
case GEAR_DOWN:
gear_down();
break;
case CHECK_BEFORE_TAKEOFF:
checking_before_takeoff();
break;
case RAISING_GEAR:
raising_gear();
break;
case GEAR_UP:
gear_up();
break;
case CHECK_BEFORE_LANDING:
checking_before_landing();
break;
case LOWERING_GEAR:
lowering_gear();
break;
}
}

int main() {
squat_switch = OPEN;
limit_switch = CLOSE;
pilot_lever = DOWN;
hydraulic_mechanism = WORKING;
current_state = GEAR_DOWN;
for (int i = 0; i < 10; i++) {
printf("Current State: %s\n", state_machine[current_state].state_status);
printf("Light Status: %s\n", state_machine[current_state].light_status);
printf("Direction Status: %s\n", state_machine[current_state].direction_status);
printf("Hydraulic Status: %s\n", state_machine[current_state].hydraulic_status);
printf("Spring Status: %s, %s\n", state_machine[current_state].spring_status[0], state_machine[current_state].spring_status[1]);
printf("\n");

update_status();
}

return 0;
}

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.