#include "common.h"
int g_buz;
extern sem_t s, ss;
char *province[] = {"粤", "赣", "湘", "鄂", "贵",
"黑", "沪", "京", "蒙", "藏",
"甘", "豫", "鲁", "晋", "桂",
"云", "滇", "辽", "川", "闵",
"徽", "苏", "津", "吉", "冀",
"陕", "宁", "浙", "渝", "琼",
"港", "澳", "台"};
char alphanumeric[] = { 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y',
'Z', '0', '1', '2', '3',
'4', '5', '6', '7', '8',
'9', '0'};
char *CHIESE_NUM[] = {"零", "一", "二", "三", "四",
"五", "六", "七", "八", "九",
"十"};
char *random_alphanumeric(void)
{
static char license_num[7];
srand(time(NULL));
license_num[0] = alphanumeric[rand() % 26];
license_num[1] = alphanumeric[rand() % 37];
srand(license_num[1]);
license_num[2] = alphanumeric[rand() % 37];
srand(license_num[2]);
license_num[3] = alphanumeric[rand() % 37];
srand(license_num[3]);
license_num[4] = alphanumeric[rand() % 37];
srand(license_num[4]);
license_num[5] = alphanumeric[rand() % 37];
return license_num;
}
char *get_license(void)
{
// 返回车牌号作为照片的文件名存入数据库
char *license = calloc(1, 10);
snprintf(license, 10, "%s%s", province[rand()%33], random_alphanumeric());
return license; // license举例:"粤B9MK48"
}
char *total_time(char *time_in, char *now)
{
assert(time_in);
assert(now);
#define YEAR 0
#define MON 1
#define MDAY 2
#define HOUR 3
#define MIN 4
#define SEC 5
int val_time_in[6], val_now[6];
char *delim = "-: \t";
char *p = strtok(time_in, delim);
int i;
for(i=0; i<6; i++)
{
if(p != NULL)
{
val_time_in[i] = atoi(p);
p = strtok(NULL, delim);
}
}
p = strtok(now, delim);
for(i=0; i<6; i++)
{
if(p != NULL)
{
val_now[i] = atoi(p);
p = strtok(NULL, delim);
}
}
int year = val_now[YEAR] - val_time_in[YEAR];
int mon = val_now[MON] - val_time_in[MON];
int mday = val_now[MDAY] - val_time_in[MDAY];
int hour = val_now[HOUR] - val_time_in[HOUR];
int min = val_now[MIN] - val_time_in[MIN];
int sec = val_now[SEC] - val_time_in[SEC];
static char dis[64];
bzero(dis, 64);
if(year != 0)
{
snprintf(dis+strlen(dis), 64-strlen(dis), "%d年", year);
}
if(mon != 0)
{
snprintf(dis+strlen(dis), 64-strlen(dis), "%d月", mon);
}
if(mday != 0)
{
snprintf(dis+strlen(dis), 64-strlen(dis), "%d日", mday);
}
if(hour != 0)
{
snprintf(dis+strlen(dis), 64-strlen(dis), "%d时", hour);
}
if(min != 0)
{
snprintf(dis+strlen(dis), 64-strlen(dis), "%d分", min);
}
if(sec != 0)
{
switch(sec)
{
case 0 ... 9:
snprintf(dis+strlen(dis), 64-strlen(dis), "%s秒", CHIESE_NUM[sec]);
break;
case 10 ... 19:
snprintf(dis+strlen(dis), 64-strlen(dis), "十%s秒", CHIESE_NUM[sec-10]);
break;
case 20 ... 29:
snprintf(dis+strlen(dis), 64-strlen(dis), "二十%s秒", CHIESE_NUM[sec-20]);
break;
case 30 ... 39:
snprintf(dis+strlen(dis), 64-strlen(dis), "三十%s秒", CHIESE_NUM[sec-30]);
break;
}
}
return dis;
}
char *cal_fee(char *total)
{
assert(total);
// 停车费用政策:¥1/秒,四十元封顶
int fee = atoi(strtok(total, "S"));
static char val[20];
bzero(val, 20);
switch(fee)
{
case 0 ... 9:
snprintf(val, 20, "%s元", CHIESE_NUM[fee]);
break;
case 10 ... 19:
snprintf(val, 20, "十%s元", CHIESE_NUM[fee-10]);
break;
case 20 ... 29:
snprintf(val, 20, "二十%s元", CHIESE_NUM[fee-20]);
break;
case 30 ... 39:
snprintf(val, 20, "三十%s元", CHIESE_NUM[fee-30]);
break;
default:
snprintf(val, 20, "四十元");
}
return val;
}
int main(int argc, char **argv)
{
// 打开/创建数据库parking.db,并创建表carinfo
sqlite3 *db;
sqlite3_open_v2("parking.db", &db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
NULL);
char *errmsg;
char *create = "CREATE TABLE IF NOT EXISTS "
"carinfo(cardid TEXT PRIMARY KEY, "
"license TEXT, "
"time_in TEXT NOT NULL, "
"photo TEXT);";
if(Sqlite3_exec(db, create, NULL, NULL, &errmsg) != SQLITE_OK)
{
exit(0);
}
while(1)
{
// 从管道读取卡号
char card_num[10] = {0};
read(0, card_num, 10);
printf("数据库得到的卡号:%#x\n", atoi(card_num));
unsigned int cardid = atoi(card_num);
// 随机生成车牌号
char *license = get_license();
if(cardid > 0)
{
if(start_charging(db, license, cardid, "1.bmp"))
{
// 将欢迎辞和车牌号发送给主机合成语音并播放出来
char welcome_msg[200] = {0};
snprintf(welcome_msg, 200, "欢迎%s入场", license);
}
else
{
fprintf(stderr, "\n此卡【已进场】.\n");
}
}
else if(cardid < 0)
{
cardid = -cardid;
char *license, *time_in;
if(stop_charging(db, cardid, &license, &time_in))
{
time_t t = time(NULL);
char *now = calloc(1, 64);
struct tm *p = localtime(&t);
snprintf(now, 64, "%d-%d-%d %02d:%02d:%02d",
p->tm_year+1900, p->tm_mon+1, p->tm_mday,
p->tm_hour, p->tm_min, p->tm_sec);
fprintf(stderr, "入场时间: %s\n", time_in);
char *total = total_time(time_in, now);
fprintf(stderr, "停车时长: %s\n", total);
fprintf(stderr, "车费: %s\n\n", cal_fee(total));
}
else
{
fprintf(stderr, "\n此卡【未进场】.\n");
}
}
}
return 0 ;
}
|