Project2
CSC35500 Programming Project 2
Due: 11/11/2021, 11:59 PM
Early Submission Deadline: 11/9/2021, 11:59 PM
Problem Statement
You will be simulating an airport where 8 planes go out on tours repeatedly. Each tour will be
for exactly 12 passengers and last approximately 30 seconds. In performing the simulation,
you must make sure that no plane tries to leave a gate with less (or more) than 12 passengers
and that no plane lands or takes off at the same time as another plane is landing or taking off.
The first thing your program should do is read the following from the command line (in the
order specified):
• the total number of passengers that are in the airport.
• the sum total number of tours that all of the planes are to do. (NOT the number of tours
that each plane is to do, the total number of tours that all planes will do when their
number of completed tours is added together.
You should then create 8 new threads, each one representing a (uniquely numbered) plane; the
main function should wait for all of the threads to complete and then exit. Each thread
epresents an airplane, and should repeatedly follow these steps:
1. board. Waits for 12 passengers to get on the plane. Between each available passenger
oarding a random delay of between 0 and 2 seconds should be enforced. This can be
accomplished by calling sleep(rand()%3) after each passenger boards.
2. The associated plane should then be shown taxi-ing to the runway. See the provided
AirportAnimator class !
3. The associate plane should then use the runway to take off, animating such (see the
provided AirportAnimator class!) Of course, the plane should wait for exclusive access
to the runway.
4. The plane should then go on tour. This basically just sleeps for between 15 and 45
seconds, and can be accomplished by calling sleep(15+rand()%31).
5. The plane should then request to land. Once exclusive access to the runway is granted
land, the plane landing should be animated (See the provided AirportAnimator class!)
6. The plane should then taxi back to its gate. See the provided AirportAnimator class!
7. Each passenger should then deplane and thus Abe returned to the “pool” of available
passengers. There should be a 1 second delay between each passenger deplaning.
After completing the above steps, you should update the number of completed tours (keeping
in mind that two planes could conceivably attempt to do so at the same time) and go back to
step 1 only if the number of tours required was not yet completed! Otherwise, the thread
should return. Don’t forget to use the provided AirportAnimator class!
You should appropriately update the status of the individual planes as each step is being
processed.
Problem Details
• This problem once again requires that you use a Linux machine to complete
• You are being provided with code (the Plane class) to display the requested animations. Do
not wast time trying to re-invent the wheel!
• Should you have to stop your program (via either ctrl-C or ctrl-Z), you may find the resulting
terminal in an unusable state. Typing reset (which may not be visible as you type it) should
fix the underlying problem.
•
Submission
You should post to Canvas both your C++ source code file and a plain text file (not an
MS Word file) called read.me in a zip or tgz file. Make sure the “root” of your
submission is a folder (not just a collection of files.)
The read.me file should contain:
• your name and any other identifying information.
• any special details on how to compile your project
• any special details on how to run your project - note that you cannot circumvent the project
specifications here!
• any known bugs your project has, and possible fixes to those bugs (partial credit abounds
here).
• an overview of how you solved the project.
• You may put any other information you like in this file, although you are not required to do
so - one common additional set of entries is a “software engineering log” that indicates what
you have done every time you sat down and worked on the project. Many programmers find
that such actually helps you to finish projects faster!
The read.me file MUST also contain the answers to the following questions:
1. Try running your program with only 11 passengers. What happens? Why?
2. Try running your program with 12 passengers. What happens? Why?
3. Try running your program with 50 passengers and 100 tours. What happens? why?
4. Try running your program with 100 passengers and 20 tours. What happens? Why?
5. What is the minimum number of passengers that will guarantee avoidance of
deadlock? Why?
Grading Breakdown
Final Notes
• The provided code uses both the ncurses and the pthread li
aries. So, you will need to add
-lncurses and -lpthread options to the end of your link command during compilation.
• Have you started this project yet? If not, start now!
• If you have any questions about this project, see me as soon as possible.
• Have you started this project yet? If not, start NOW !
Co
ect Submission 10%
Successful Compilation 10%
Following Directions 20%
Co
ect Execution 40%
Comments/ read.me, including answers
to required questions!
20%
http:
ead.me
Project2Provided/AirportAnimator.cpp
#include "AirportAnimator.hpp"
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
how far from the left edge of the screen to start drawing the airport
static int left_base=8;
internal lock to make sure no two (or more) threads are drawing at same time
static pthread_mutex_t __screenLock;
internal utility to lock drawing screen.
static void lockScreen()
{
pthread_mutex_lock(&__screenLock);
}
internal utility to unlock drawing screen.
static void unlockScreen()
{
pthread_mutex_unlock(&__screenLock);
}
void
AirportAnimator::init()
{
initialize the lock for drawing on the screen.
if (pthread_mutex_init(&__screenLock, NULL) != 0) {
ce
"mutex init has failed -- contact Dr. Blythe!!!"
endl;
}
initialize screen, ignore newline presses, and clear the screen.
initscr();
nonl();
erase();
draws left "wall" for airport terminal
for (int r=0;
3; r++)
mvprintw(r, left_base-1, "|");
draw in gate and airplane for each airplane.
for(int i=0; i<8; i++)
{
draw in gate right wall
for (int r=0;
3; r++)
mvprintw(r, left_base+8*i+7, "|");
draw in gate info
mvprintw(0, left_base+ 8*i, "Plane:%d", i);
mvprintw(1, left_base+ 8*i, "Pass:%2d", 0);
mvprintw(2, left_base+ 8*i, "[BOARD]");
calculate column for airplane.
int col = i*8+left_base+2;
draw in airplane
mvprintw(3, col, " |");
mvprintw(4, col, "/%1d\\", i);
force all additions to display.
refresh();
}
draw runway
mvprintw(15,10,
"===========================================================");
mvprintw(19,10,
"===========================================================");
force runway to display.
refresh();
draw initial number of tours completed as 0
updateTours(0);
}
void
AirportAnimator::end()
{
lock up screen
lockScreen();
erase();
blank the screen
endwin();
return to regular terminal
unlock the screen.
unlockScreen();
}
void
AirportAnimator::taxiOut(int plane_num)
{
find column number for airplane.
int col = plane_num*8+left_base+2;
lock up screen so we can draw
lockScreen();
draw the airplane heading out
mvprintw(3, col, "\\%1d/", plane_num);
mvprintw(4, col, " |");
refresh();
let others draw if they want to!
unlockScreen();
move the location of this airpalne toward runway
for (int r=3;
=12; r++)
{
lock screen so we can draw on it
lockScreen();
redraw the location of the airplane, leaving blanks "behind" it.
mvprintw(r, col, " ");
mvprintw(r+1, col, "\\%1d/", plane_num);
mvprintw(r+2, col, " |");
refresh();
let others draw
unlockScreen();
show slight delay for each bit of taxi-ing the airplane does.
usleep(7E5);
}
}
void
AirportAnimator::takeoff(int plane_num)
{
int col = plane_num*8+left_base+2;
clear out plane that is doen taxi-ing
lockScreen();
mvprintw(13, col, " ");
mvprintw(14, col, " ");
refresh();
WINDOW *planeWin = newwin(3,9, 16, 10);
mvwaddstr(planeWin, 0,1, " \\\\");
stringstream fuselage;
fuselage
">)"
plane_num
"))))";
mvwaddstr(planeWin, 1,1, fuselage.str().c_str());
mvwaddstr(planeWin, 2,1, "
");
wrefresh(planeWin);
unlockScreen();
long int sleep_time=100000;
for(int col=10; col<=65; col++)
{
int tts=sleep_time;
usleep(tts);
sleep_time= (int) (sleep_time/1.05);
lockScreen();
mvwin(planeWin, 16, col);
wrefresh(planeWin);
unlockScreen();
}
lockScreen();
wclear(planeWin);
wrefresh(planeWin);
delwin(planeWin);
unlockScreen();
}
void
AirportAnimator::land(int plane_num)
{
lockScreen();
WINDOW *planeWin = newwin(3,9, 16, 10);
mvwaddstr(planeWin, 0,0, "
");
stringstream fuselage;