Задание 1.
Необходимо создать программу эмуляции простой информационно-управляющей системы (ИУС). ИУС управляет тремя виртуальными лампами — Lamp1, Lamp2, Lamp3. При запуске ИУС все лампы выключены. Кнопка клавиатуры «a» должна включать\выключать Lamp1, кнопка клавиатуры «s» должна включать\выключать Lamp2, кнопка клавиатуры «d» должна включать\выключать Lamp3. При нажатии любой клавиши в консоль должно выводится сообщение о статусе ламп (например: Lamp1 is ON Lamp2 is OFF Lamp3 is OFF). При нажатии клавиши «q» программа должна вывести в консоль фамилии выполнявшего работу и завершить работу.
#include
#include
#include
#include
int getch(void)
{
int ch;
struct termios oldt;
struct termios newt;
tcgetattr(STDIN_FILENO, &oldt); /*store old settings */
newt = oldt; /* copy old settings to new settings */
newt.c_lflag &= ~(ICANON | ECHO); /* make one change to old settings in new settings */
tcsetattr(STDIN_FILENO, TCSANOW, &newt); /*apply the new settings immediatly */
ch = getchar(); /* standard getchar call */
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); /*reapply the old settings */
return ch; /*return received char */
}
char ch = ' ';
uint8_t lamp1 = 0, lamp2 = 0, lamp3 = 0;
int main()
{
printf("Starting... Press any key to continue...\n");
do
{
ch = getch();
printf("The key you entered is: %c \n", ch);
switch(ch)
{
case 'a': {if (!lamp1) {lamp1 = 1; puts("LAMP1 is ON\n");} else {lamp1 = 0; puts("LAMP1 is OFF\n");}} break;
case 's': {if (!lamp2) {lamp2 = 1; puts("LAMP2 is ON\n");} else {lamp2 = 0; puts("LAMP2 is OFF\n");}} break;
case 'd': {if (!lamp3) {lamp3 = 1; puts("LAMP3 is ON\n");} else {lamp3 = 0; puts("LAMP3 is OFF\n");}} break;
default:
{if (lamp1) puts("LAMP1 is ON"); else puts("LAMP1 is OFF");
if (lamp2) puts("LAMP2 is ON"); else puts("LAMP2 is OFF");
if (lamp3) puts("LAMP3 is ON"); else puts("LAMP3 is OFF");
puts("\n");} break;
}
} while (ch !='q');
puts("exiting...");
return 0;
}
Задание 2.
Необходимо написать программу, моделирующей систему вызова лифта.
Исходные данные:
• начальное местонахождение лифта — первый этаж,
• лифт обслуживает N + 5 этажей где N – последняя цифра зачетной книжки.
• вызов лифта на этаже осуществляется цифровыми клавишами клавиатуры (на
первом этаже клавиша «1», на втором - «2» и т. д.).
Положение лифта и его статус должны отображаться в консоли или графическом интерфейсе:
• лифт в режиме ожидания — статус выключен,
• лифт двигается — отображает номер этажа, который проходит лифт,
время прохождения одного этажа — 2 секунды,
• лифт достиг этажа назначения — номер этажа назначения выводится с частотой 2
Гц в течении 5 секунд,
• через 5-10 секунд после достижения этажа назначения лифт переходит в режим
Ожидания.
#include /* Standard input/output definitions */
#include /* String function definitions */
#include /* UNIX standard function definitions */
#include /* File control definitions */
#include /* Error number definitions */
#include /* POSIX terminal control definitions */
#include
const int digits_count=16;
// Номера сегментов для индикаторов (вторая цифра)
const int ZERO[] = {1,2,3,4,5,6};
const int ONE[] = {2,3};
const int TWO[] = {1,2,4,5,7};
const int THREE[] = {1,2,3,4,7};
const int FOUR[] = {2,3,6,7};
const int FIVE[] = {1,3,4,6,7};
const int SIX[] = {1,3,4,5,6,7};
const int SEVEN[] = {1,2,3};
const int EIGTH[] = {1,2,3,4,5,6,7};
const int NINE[] = {1,2,3,4,6,7};
const int *digits[] =
{ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGTH, NINE};
const int digits_sizes[] = {6,2,5,5,4,5,6,3,7,6};
int fd; /* File descriptor for the port */
const int floor_count = 9;
char buffer[13];
int current_floor_number = 1; // номер текущего этажа
int next_floor_number; // номер следующего этажа
void clear_digits(void)
{
for (int i=0; i
sprintf(buffer,"$KE,WR,%d,0\r\n",i);
if (write(fd, buffer, strlen(buffer))==-1) printf("ошибка: %s\n",strerror(errno));
};
}
void set_number(int current_floor)
{
for (int i=0; i
sprintf(buffer,"$KE,WR,%d,1\r\n",digits[current_floor][i]);
if (write(fd, buffer, strlen(buffer))==-1) printf("ошибка: %s\n",strerror(errno));
};
}
int getch(void)
{
int ch;
struct termios oldt;
struct termios newt;
tcgetattr(STDIN_FILENO, &oldt); /*store old settings */
newt = oldt; /* copy old settings to new settings */
newt.c_lflag &= ~(ICANON | ECHO); /* make one change to old settings in new settings */
tcsetattr(STDIN_FILENO, TCSANOW, &newt); /*apply the new settings immediatly */
ch = getchar(); /* standard getchar call */
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); /*reapply the old settings */
return ch; /*return received char */
}
void lift_work(void)
{
if (current_floor_number
for (;current_floor_number!=next_floor_number; current_floor_number++)
{
printf("Этаж №%d.\n",current_floor_number);
sleep(2);
clear_digits();
set_number(current_floor_number);
}
else
for (;current_floor_number!=next_floor_number; current_floor_number--)
{
printf("Этаж №%d.\n",current_floor_number);
sleep(2);
clear_digits();
set_number(current_floor_number);
};
usleep(500000);
int t=0;
do {
t++;
usleep(1000000);
clear_digits();
set_number(current_floor_number);
}
while (t!=4);
printf("Лифт прибыл на этаж №%d.\n",current_floor_number);
}
int main(void)
{
struct termios options;
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) { perror("open_port: Unable to open - ");
exit(EXIT_FAILURE);
}
else fcntl(fd, F_SETFL, 0);
tcgetattr(fd, &options);
cfsetispeed(&options, B2400);
cfsetospeed(&options, B2400);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
printf("Программа запущена.\n");
char x;
do {
x = getch();
next_floor_number = atoi(&x);
if (next_floor_number!=0 && next_floor_number!=current_floor_number) {
printf("Следующий этаж №%d\n",next_floor_number);
lift_work();
};
}
while (x!='q');
close(fd);
exit(EXIT_SUCCESS);
}
Достарыңызбен бөлісу: |