6 Star 23 Fork 13

翠微薛之谦/ARM_智能车库管理系统__LinuxC

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
SQLite_demo.c 6.43 KB
一键复制 编辑 原始数据 按行查看 历史
翠微薛之谦 提交于 2019-01-18 16:41 +08:00 . one
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <strings.h>
#include <stdbool.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/fb.h>
#include <linux/un.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "sqlite3.h"
#include "head.h"
/*-------数据库-------*/
int fifo_in, fifo_out;
int fifo_SQLite_V4L2;
int fifo_SQLite_ALSA;
int fifo_SQLite_CARID;
char *err;
char SQL[200];
// 每当得到一行(即一个记录)就会调用一次以下函数
// len: 列数目
// col_val: 每一列的值
// col_name: 每一列的标题
//
// 返回值: 0: 继续对剩下的记录调用该函数
// 非0: 终止调用该函数
bool first = true;
int callback(void *arg, int len, char **col_val, char **col_name)
{
// 1,检测库中是否有相应的卡号
if(arg != NULL)
{
(*(int *)arg) = time(NULL) - atol(col_val[2]);
return 0;
}
// 2,显示当前数据库的信息
// 针对第一行记录调用本函数的时候,就显示标题
if(first)
{
printf("\n");
for(int i=0; i<len; i++)
{
printf("%s\t\t", col_name[i]);
}
first = false;
printf("\n=====================");
printf("=====================\n");
}
for(int i=0; i<len; i++)
{
printf("%s\t", col_val[i]);
}
printf("\n");
return 0;
}
int Sqlite3_exec(sqlite3 *db, char *SQL, int (*callback)(void *,int,char**,char**), void *arg, char **errmsg)
{
int ret = sqlite3_exec(db, SQL, callback, arg, errmsg);
if(ret != SQLITE_OK)
{
printf("执行[%s]失败: %s\n", SQL, *errmsg);
exit(0);
}
}
void beep(int times, float sec)
{
int buz = open("/dev/beep", O_RDWR);
if(buz <= 0)
{
perror("打开蜂鸣器失败");
return;
}
for(int i=0; i<times; i++)
{
// 响
ioctl(buz, 0, 1);
usleep(sec*1000*1000);
// 静
ioctl(buz, 1, 1);
usleep(sec*1000*1000);
}
close(buz);
}
// 处理入库
void *routine(void *arg)
{
sqlite3* db = (sqlite3 *)arg;
while(1)
{
uint32_t id;
read(fifo_in, &id, sizeof(id));
// 判断卡片的合法性
bzero(SQL, 200);
snprintf(SQL, 200, "SELECT * FROM carinfo WHERE 卡号='%u';", id);
int n = 0;
Sqlite3_exec(db, SQL, callback, (void *)&n, &err);
char msg[200];
char *carid = calloc(1,9);
if(n != 0)
{
//通知语音播放
bzero(msg,200);
snprintf(msg,200,"您好,此卡已进场,请勿重刷。");
write(fifo_SQLite_ALSA,msg,strlen(msg));
//beep(5, 0.05);
continue;
}
else
{
// 通知拍照
write(fifo_SQLite_V4L2, "a", 1);
bzero(carid,9);
//等待车牌识别程序发来的识别车牌号
int n = read(fifo_SQLite_CARID,carid,9);
printf("成功从管道读出 %d 字节\n",n);
printf("收到车牌识别程序发来的车牌号 :%s\n",carid);
//通知语音播放
bzero(msg,200);
snprintf(msg,200,"欢迎%s车主入场。", carid);
write(fifo_SQLite_ALSA,msg,strlen(msg));
//beep(1, 0.3);
}
bzero(SQL, 200);
snprintf(SQL, 200, "INSERT INTO carinfo VALUES('%u', '%s', '%ld');", id, carid , time(NULL));
Sqlite3_exec(db, SQL, NULL, NULL, &err);
// 查询当前数据库中的数据
bzero(SQL, 200);
snprintf(SQL, 200, "SELECT * FROM carinfo;");
Sqlite3_exec(db, SQL, callback, NULL, &err);
printf("=====================");
printf("=====================\n");
first = true;
}
}
//计算停车费 为了模拟停车时长 将1秒等价于1分钟
//计费明细
/*------时长----------费用----------
30分钟内 免费
每小时 5元
每天 30元
注释:当停车时长大于6小时后既转为1天,费用为30元,且不会再上涨
*/
char *parking_cost(int n)
{
char *cost = calloc(1,20);
switch(n)
{
case 0 ... 30:
cost = "零元";
break;
case 31 ... 60:
cost = "五元";
break;
case 61 ... 120:
cost = "十元";
break;
case 121 ... 180:
cost = "十五元";
break;
case 181 ... 240:
cost = "二十元";
break;
case 241 ... 360:
cost = "二十五元";
break;
default:
cost = "三十元";
}
return cost;
}
int main(int argc, char **argv)
{
// 1,创建、打开一个数据库文件
sqlite3 *db = NULL;
int ret = sqlite3_open_v2("parking.db", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
if(ret != SQLITE_OK)
{
printf("创建数据库文件失败: %s\n", sqlite3_errmsg(db));
exit(0);
}
// 2,创建表
bzero(SQL, 200);
snprintf(SQL, 200, "%s", "CREATE TABLE IF NOT EXISTS carinfo(卡号 TEXT, 车牌 TEXT, 入库时间 TEXT);");
Sqlite3_exec(db, SQL, NULL, NULL, &err);
// 打开管道
fifo_in = open(RFID_SQLite_in, O_RDWR);
fifo_out = open(RFID_SQLite_out, O_RDWR);
fifo_SQLite_V4L2 = open(SQLite_V4L2, O_RDWR);
fifo_SQLite_ALSA = open(SQLite_ALSA, O_RDWR);
fifo_SQLite_CARID = open(SQLite_CARID, O_RDWR);
// 3,创建线程,等待入库卡号
pthread_t tid;
pthread_create(&tid, NULL, routine, (void *)db);
// 3,主线程,等待出库的卡号
while(1)
{
uint32_t id;
read(fifo_out, &id, sizeof(id));
// 判断卡片是否合法
bzero(SQL, 200);
snprintf(SQL, 200, "SELECT * FROM carinfo WHERE 卡号='%u';", id);
int n = 0;
Sqlite3_exec(db, SQL, callback, (void *)&n, &err);
char msg[200];
if(n == 0)
{
//通知语音播放
bzero(msg,200);
snprintf(msg,200,"您好,此卡未进场。");
write(fifo_SQLite_ALSA,msg,strlen(msg));
//beep(5, 0.05);
continue;
}
else
{
//根据停车时长计算停车费用
char *parking_fee = calloc(1,20);
bzero(parking_fee,20);
parking_fee = parking_cost(n);
bzero(msg,200);
snprintf(msg,200,"停车时长%d分,收费%s,一路平安。", n,parking_fee);
write(fifo_SQLite_ALSA,msg,strlen(msg));
//beep(1, 0.3);
}
// 出库
bzero(SQL, 200);
snprintf(SQL, 200, "DELETE FROM carinfo WHERE 卡号='%u';", id);
Sqlite3_exec(db, SQL, NULL, NULL, &err);
// 查询当前数据库中的数据
bzero(SQL, 200);
snprintf(SQL, 200, "SELECT * FROM carinfo;");
Sqlite3_exec(db, SQL, callback, NULL, &err);
printf("=====================");
printf("=====================\n");
first = true;
}
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/joker_cuiwei/arm_carparking_c.git
[email protected]:joker_cuiwei/arm_carparking_c.git
joker_cuiwei
arm_carparking_c
ARM_智能车库管理系统__LinuxC
master

搜索帮助