auto_bus/src/bus_io.c

259 lines
6.7 KiB
C
Raw Normal View History

2022-05-06 11:55:30 +08:00
//
// Created by ricardo on 2022/5/6.
//
#include "bus_io.h"
2022-05-19 22:39:45 +08:00
int ReadInput(char *inputString)
2022-05-19 22:39:45 +08:00
{
2022-05-19 22:39:45 +08:00
char src[20];
int num;
sscanf(inputString, "%[a-z] %d", src, &num);
if (0 == strcmp("clock", src))
2022-05-19 22:39:45 +08:00
{
return IO_CLOCK;
}
else if (0 == strcmp("counterclockwise", src))
2022-05-19 22:39:45 +08:00
{
CreateQuery(BUS_COUNTER_CLOCK_WISE, FindNode(rails, num));
2022-05-19 22:39:45 +08:00
return IO_READING;
}
else if (0 == strcmp("clockwise", src))
2022-05-19 22:39:45 +08:00
{
CreateQuery(BUS_CLOCK_WISE, FindNode(rails, num));
2022-05-19 22:39:45 +08:00
return IO_READING;
}
else if (0 == strcmp("target", src))
2022-05-19 22:39:45 +08:00
{
CreateQuery(BUS_TARGET, FindNode(rails, num));
2022-05-19 22:39:45 +08:00
return IO_READING;
}
else if (0 == strcmp("end", src))
2022-05-19 22:39:45 +08:00
{
return IO_END;
}
else
{
// 匹配失败则返回-1
return -1;
}
}
rail_node_t *ReadConfigFile()
{
FILE *config_file = NULL;
char buffer[30];
int total_station = 0;
int distance = 0;
config_file = fopen("dict.dic", "r");
// 循环读取文件的每一行
while (fgets(buffer, sizeof buffer, config_file) != NULL)
{
char first_char = buffer[0];
char *p;
switch (first_char)
{
case '#':
// 如果读取到#什么都不做
break;
case 'T':
// TOTAL_STATION
p = buffer;
// 把数字前面的所有字符全部干掉
while (*p < '0' || *p > '9')
{
p++;
}
// 讲道理,应该只有两位数,所以就这样处理了
if (*(p + 1) == '\n' || *(p + 1) == '\0')
{
total_station = *p - 48;
}
else
{
total_station = (*p - 48) * 10 + *(p + 1) - 48;
}
break;
case 'S':
// STRATEGY
p = buffer;
// 将=前的字符全部略去
while (*p != '=')
{
p++;
}
// =也去掉
p++;
// =和策略之间的空格也去掉
while (*p == ' ')
{
p++;
}
if (*p == 'F' && *(p + 1) == 'C') //FCFS
{
chosen_strategy = BUS_FCFS;
}
else if (*p == 'S' && *(p + 1) == 'S') //SSTF
{
chosen_strategy = BUS_SSTF;
}
else if (*p == 'S' && *(p + 1) == 'C') //SCAN
{
chosen_strategy = BUS_SCAN;
}
else
{
// 读取失败
chosen_strategy = -1;
}
break;
case 'D':
// DISTANCE
p = buffer;
// 把数字前面的所有字符全部干掉
while (*p < '0' || *p > '9')
{
p++;
}
if (*(p + 1) == '\n' || *(p + 1) == '\0')
{
distance = *p - 48;
}
break;
default:
continue;
}
}
// 处理参数去缺省值的情况
if (distance == 0)
{
distance = 2;
}
if (total_station == 0)
{
total_station = 5;
}
if(chosen_strategy == -1)
{
chosen_strategy = BUS_FCFS;
}
rail_node_t *head = CreateRails(distance, total_station);
return head;
2022-05-19 22:39:45 +08:00
}
2022-05-20 17:47:48 +08:00
2022-06-03 12:41:44 +08:00
void PrintState()
{
int count, flag = 1; //flag用于标记为使下面第一个循环能够进入
rail_node_t *p = NULL;
char target[25], clockwise[25], counterclockwise[25];
for (count = 0, p = rails; flag == 1 || p != rails; p = p->next_node, count++)
{
flag=0;
target[count] = '0';
clockwise[count] = '0';
counterclockwise[count] = '0';
} //遍历轨道链表将所有站点初始化为0无任何请求
target[count] = '\0';
clockwise[count] = '\0';
counterclockwise[count] = '\0';
bus_query_t *t = NULL;
int i;
for (t = queries; t != NULL; t = t->next_node)
{
i = t->node->id - 1;
if (t->type == 0)
{
clockwise[i] = '1';
}
else if(t->type==BUS_COUNTER_CLOCK_WISE)
{
counterclockwise[i] = '1';
}
else if(t->type==BUS_TARGET)
{
target[i] = '1';
}
} //遍历请求链表将有请求的站点按照不同类型标记为1
printf("TIME:%d\n", bus_time);
printf("BUS:\n");
printf("position:%d\n", GetBusPosition());
printf("target:%s\n", target);
printf("STATION:\n");
printf("clockwise:%s\n", clockwise);
printf("counterclockwise:%s\n", counterclockwise);
}
void PrintStateInner(char *str)
2022-05-20 17:47:48 +08:00
{
memset(str, 0, 150);
int count, flag = 1; //flag用于标记为使下面第一个循环能够进入
rail_node_t *p = NULL;
char target[25], clockwise[25], counterclockwise[25];
for (count = 0, p = rails; flag == 1 || p != rails; p = p->next_node, count++)
2022-05-20 17:47:48 +08:00
{
2022-05-24 21:16:51 +08:00
flag=0;
target[count] = '0';
clockwise[count] = '0';
counterclockwise[count] = '0';
2022-05-20 17:47:48 +08:00
} //遍历轨道链表将所有站点初始化为0无任何请求
target[count] = '\0';
clockwise[count] = '\0';
counterclockwise[count] = '\0';
2022-06-03 12:41:44 +08:00
bus_query_t *t = NULL;
2022-05-20 17:47:48 +08:00
int i;
for (t = queries; t != NULL; t = t->next_node)
{
i = t->node->id - 1;
if (t->type == 0)
2022-05-20 17:47:48 +08:00
{
clockwise[i] = '1';
2022-05-20 17:47:48 +08:00
}
else if(t->type==BUS_COUNTER_CLOCK_WISE)
2022-05-20 17:47:48 +08:00
{
counterclockwise[i] = '1';
2022-05-20 17:47:48 +08:00
}
else if(t->type==BUS_TARGET)
2022-05-20 17:47:48 +08:00
{
target[i] = '1';
2022-05-20 17:47:48 +08:00
}
} //遍历请求链表将有请求的站点按照不同类型标记为1
char line1[100], line2[10], line3[15], line4[100], line5[10], line6[100], line7[100];
sprintf(line1, "TIME:%d\n", bus_time);
sprintf(line2, "BUS:\n");
sprintf(line3, "position:%d\n", GetBusPosition());
sprintf(line4, "target:%s\n", target);
sprintf(line5, "STATION:\n");
sprintf(line6, "clockwise:%s\n", clockwise);
sprintf(line7, "counterclockwise:%s\n", counterclockwise); //分别得到每一行的字符串
strcat(line1, line2);
strcat(line1, line3);
strcat(line1, line4);
strcat(line1, line5);
strcat(line1, line6);
strcat(line1, line7);//将7行字符串合并在一起
strcat(str, line1);
2022-05-20 17:47:48 +08:00
}