linux-安防监控实现之网页控制ZigBee和A9上的硬件LED灯蜂鸣器和风扇

LED



#include "data_global.h"
#include "chrdev.h"
#include <unistd.h>

extern pthread_mutex_t  	mutex_led;
extern pthread_cond_t      	cond_led;

//:A9LED模块线程.
void* pthread_led(void* arg)
{
	printf("pthread_led\n");
	int i, j;
	int led_fd;
	led_desc_t led;

	led_fd = open(LED_DEV, O_RDWR);//打开设备节点
	if (led_fd == -1)
	{
		printf("open failed.\n");
	}
	printf("led_fd ;%d.\n", led_fd);

	while (1)
	{
		pthread_mutex_lock(&mutex_led);
		pthread_cond_wait(&cond_led, &mutex_led);
		printf("led ioctl:***********\n");
		if (cmd_led == 0x41)
		{
			for (j = 0;j < 1;j++)
			{
				for (i = 2;i < 6;i++)
				{
					led.which = i;
					ioctl(led_fd, FSLEDON, &led);
					usleep(500000);

					led.which = i;
					ioctl(led_fd, FSLEDOFF, &led);
					usleep(500000);
				}
			}
		}
		pthread_mutex_unlock(&mutex_led);
	}

	close(led_fd);

}

#include "data_global.h"

extern int msgid;
extern key_t key;

extern pthread_mutex_t mutex_client_request,
mutex_refresh,
mutex_sqlite,
mutex_transfer,
mutex_analysis,
mutex_sms,
mutex_buzzer,
mutex_led,
mutex_camera;

extern pthread_cond_t  cond_client_request,
cond_refresh,
cond_sqlite,
cond_transfer,
cond_analysis,
cond_sms,
cond_buzzer,
cond_led,
cond_camera;

extern unsigned char cmd_led;

extern char recive_phone[12];
extern char center_phone[12];


struct msg msgbuf;


void* pthread_client_request(void* arg)
{
	if ((key = ftok("/tmp", 'g')) < 0)
	{
		perror("ftok failed .\n");
		exit(-1);
	}

	msgid = msgget(key, IPC_CREAT | IPC_EXCL | 0666);
	if (msgid == -1)
	{
		if (errno == EEXIST)
		{
			msgid = msgget(key, 0777);
		}
		else
		{
			perror("fail to msgget");
			exit(1);
		}
	}
	printf("pthread_client_request\n");

	while (1)
	{
		bzero(&msgbuf, sizeof(msgbuf));
		printf("wait form client request...\n");
		msgrcv(msgid, &msgbuf, sizeof(msgbuf) - sizeof(long), 1L, 0);
		printf("Get %ldL msg\n", msgbuf.msgtype);
		printf("text[0] = %#x\n", msgbuf.text[0]);

		switch (msgbuf.msgtype)
		{
		case 1L:
			pthread_mutex_lock(&mutex_led);
			printf("hello led\n");
			cmd_led = msgbuf.text[0];//将命令赋值给led条件变量
			pthread_mutex_unlock(&mutex_led);	//解锁
			pthread_cond_signal(&cond_led);//通知led线程
			break;
		case 2L:
			printf("hello beep\n");
			break;
		case 3L:
			printf("hello seg\n");
			break;
		case 4L:
			printf("hello fan\n");
			break;
		case 5L:
			printf("set env data\n");
			printf("temMAX: %d\n", *((int*)&msgbuf.text[1]));
			printf("temMIN: %d\n", *((int*)&msgbuf.text[5]));
			printf("humMAX: %d\n", *((int*)&msgbuf.text[9]));
			printf("humMAX: %d\n", *((int*)&msgbuf.text[13]));
			printf("illMAX: %d\n", *((int*)&msgbuf.text[17]));
			printf("illMAX: %d\n", *((int*)&msgbuf.text[21]));

			break;
		case 6L:
		case 7L:
		case 8L:
		case 9L:
			printf("你可以将这些作为扩展来学习,加油.\n");
			break;
		case 10L:
		{
			int i = 0, j = 0;
			for (i = 0; i < 11; i++)
			{
				recive_phone[i] = msgbuf.text[i];
			}
			recive_phone[i] = '\0';
			printf("recive:%s\n", recive_phone);
			for (j = 0;msgbuf.text[i] != '\0' && j < 12; i++, j++)
			{
				center_phone[j] = msgbuf.text[i];
			}
			center_phone[j] = '\0';
			printf("center:%s\n", center_phone);
#if 0
			pthread_mutex_lock(&mutex_slinklist);
			sqlite_InsertLinknode(ENV_UPDATE, all_info_RT, sto_no, 0);//0,0鍒嗗埆鏄�浠撳簱鍙峰拰璐х墿绉嶇被鍙�
			pthread_mutex_unlock(&mutex_slinklist);
			pthread_cond_signal(&cond_sqlite);
#endif 
		}
		break;
		default:
			break;

		}
	}

}


#if 0

long msgtype;//具体的消息类型
消息类型的分配:
1L: 		LED控制
2L : 蜂鸣器控制
3L : 四路LED灯模拟的数码管
4L : 风扇
5L : 温湿度最值设置
6L - 7L - 8L - 9L, 用于个人的扩展
10L : 3G通信模块 - GPRS
switch (msgbuf.msgtype)
{
case 1L: ...  break;
	....
		default ....  break;
}
#endif 





A9上的硬件LED灯蜂鸣器和风扇

#include "data_global.h"

#include "buzzer.h"
#include "linuxuart.h"

extern int msgid;
extern key_t key;

extern pthread_mutex_t mutex_client_request,
mutex_refresh,
mutex_sqlite,
mutex_transfer,
mutex_analysis,
mutex_sms,
mutex_buzzer,
mutex_led,
mutex_camera;

extern pthread_cond_t  cond_client_request,
cond_refresh,
cond_sqlite,
cond_transfer,
cond_analysis,
cond_sms,
cond_buzzer,
cond_led,
cond_camera;

extern unsigned char cmd_led;
extern unsigned char cmd_buzzer;
extern unsigned char cmd_seg;
extern unsigned char cmd_fan;


extern char recive_phone[12];
extern char center_phone[12];


struct msg msgbuf;


//第2N个元素表示声调   第2N+1个元素表示该声调的时间
unsigned char MUSIC[500] = {
	//祝你平安
	0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
	0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
	0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
	0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
	0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
	0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
	0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
	0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
	0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
	0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
	0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
	0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
	0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
	0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
#if 0
	0x30,0x1c,0x10,0x20,0x40,0x1c,0x10,0x18,0x10,0x20,0x10,0x1c,0x10,0x18,0x40,0x1c,
	0x20,0x20,0x20,0x1c,0x20,0x18,0x20,0x20,0x80,0xff,0x20,0x30,0x1c,0x10,0x18,0x20,
	0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,
	0x30,0x80,0xff,0x20,0x20,0x1c,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,
	0x20,0x2b,0x40,0x20,0x20,0x1c,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,
	0x20,0x2b,0x40,0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,
	0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1c,0x10,0x20,
	0x10,0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x15,0x1f,
	0x05,0x20,0x10,0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,
	0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,
	0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1c,0x10,0x18,0x40,0x1c,0x20,0x20,
	0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,
#endif
};


void* pthread_client_request(void* arg)
{
	if ((key = ftok("/tmp", 'g')) < 0)
	{
		perror("ftok failed .\n");
		exit(-1);
	}

	msgid = msgget(key, IPC_CREAT | IPC_EXCL | 0666);
	if (msgid == -1)
	{
		if (errno == EEXIST)
		{
			msgid = msgget(key, 0777);
		}
		else
		{
			perror("fail to msgget");
			exit(1);
		}
	}
	printf("pthread_client_request\n");

	while (1)
	{
		bzero(&msgbuf, sizeof(msgbuf));
		printf("wait form client request...\n");
		msgrcv(msgid, &msgbuf, sizeof(msgbuf) - sizeof(long), 1L, 0);
		printf("Get %ldL msg\n", msgbuf.msgtype);
		printf("text[0] = %#x\n", msgbuf.text[0]);

		switch (msgbuf.msgtype)
		{
		case 1L:
			pthread_mutex_lock(&mutex_led);
			printf("hello led\n");
			cmd_led = msgbuf.text[0];
			pthread_mutex_unlock(&mutex_led);
			pthread_cond_signal(&cond_led);
			break;
		case 2L:
			pthread_mutex_lock(&mutex_buzzer);
			printf("hello beep\n");
			cmd_buzzer = msgbuf.text[0];
			printf("cmd_buzzer :%#x.\n", cmd_buzzer);

			int i = 0;
			int buzzer_fd;
			beep_desc_t beeper;
			buzzer_fd = open(BEEPER_DEV, O_RDWR | O_NONBLOCK);
			if (buzzer_fd == -1)
			{
				perror("open beeper failed.\n");
				//return -1;
			}
			printf("buzzer_fd ;%d.\n", buzzer_fd);
			if (cmd_buzzer == 0x51)
			{
				ioctl(buzzer_fd, BEEP_ON);
#if 1
				for (i = 0;i < sizeof(MUSIC) / sizeof(MUSIC[0]); i += 2)
				{
					beeper.tcnt = MUSIC[i];
					beeper.tcmp = MUSIC[i] / 2;
					ioctl(buzzer_fd, BEEP_FREQ, &beeper);
					usleep(MUSIC[i + 1] * 20000);
				} //耗时操作,尽可能在线程的处理函数中避免耗时操作,该段代码执行过程中会导致网页下发的其他命令无法响应
				printf("music play over....\n");
				close(buzzer_fd);
#endif 
			}
			else if (cmd_buzzer == 0x50)
			{
				ioctl(buzzer_fd, BEEP_OFF);
			}
			else
			{
				printf("cmd_buzzer error.\n");
			}

			pthread_mutex_unlock(&mutex_buzzer);
			break;
		case 3L:
			pthread_mutex_lock(&mutex_led);
			printf("hello seg\n");
			cmd_seg = msgbuf.text[0];
			pthread_mutex_unlock(&mutex_led);
			pthread_cond_signal(&cond_led);
			break;
		case 4L:
			pthread_mutex_lock(&mutex_sqlite);
			printf("hello fan\n");
			cmd_fan = msgbuf.text[0];

			int fan_fd = open_port("/dev/ttyUSB0"); //打开设备
			if (fan_fd < 0)
			{
				printf("open failed\n");
			}
			set_com_config(fan_fd, 115200, 8, 'N', 1); //设置串口参数

			char cmdbuf[4] = { 0 };
			if (cmd_fan == 0x21)
			{
				strcpy(cmdbuf, "1\n"); //注意点 命令增加换行符,串口调试需注意
				write(fan_fd, cmdbuf, sizeof(cmdbuf) / sizeof(cmdbuf[0]));
				sleep(2);
			}
			if (cmd_fan == 0x20)
			{
				strcpy(cmdbuf, "0\n");
				write(fan_fd, cmdbuf, sizeof(cmdbuf) / sizeof(cmdbuf[0]));
				sleep(2);
			}
			char buf[32] = { 0 };
			//get data from zigbee
			read(fan_fd, &buf, sizeof(buf));
			printf("sizeof(buf) = %d.\n", sizeof(buf));
			printf(">>>>>>%s\n", buf);
			sleep(1);
			pthread_mutex_unlock(&mutex_sqlite);
			break;
		case 5L:
			printf("set env data\n");
			printf("temMAX: %d\n", *((int*)&msgbuf.text[1]));
			printf("temMIN: %d\n", *((int*)&msgbuf.text[5]));
			printf("humMAX: %d\n", *((int*)&msgbuf.text[9]));
			printf("humMAX: %d\n", *((int*)&msgbuf.text[13]));
			printf("illMAX: %d\n", *((int*)&msgbuf.text[17]));
			printf("illMAX: %d\n", *((int*)&msgbuf.text[21]));

			break;
		case 6L:
		case 7L:
		case 8L:
		case 9L:
			printf("你可以将这些作为扩展来学习,加油.\n");
			break;
		case 10L:
		{
			int i = 0, j = 0;
			for (i = 0; i < 11; i++)
			{
				recive_phone[i] = msgbuf.text[i];
			}
			recive_phone[i] = '\0';
			printf("recive:%s\n", recive_phone);
			for (j = 0;msgbuf.text[i] != '\0' && j < 12; i++, j++)
			{
				center_phone[j] = msgbuf.text[i];
			}
			center_phone[j] = '\0';
			printf("center:%s\n", center_phone);
#if 0
			pthread_mutex_lock(&mutex_slinklist);
			sqlite_InsertLinknode(ENV_UPDATE, all_info_RT, sto_no, 0);//0,0鍒嗗埆鏄�浠撳簱鍙峰拰璐х墿绉嶇被鍙�
			pthread_mutex_unlock(&mutex_slinklist);
			pthread_cond_signal(&cond_sqlite);
#endif 
		}
		break;
		default:
			break;

		}
		}

	}


#if 0

long msgtype;//具体的消息类型
消息类型的分配:
1L: 		LED控制
2L : 蜂鸣器控制
3L : 四路LED灯模拟的数码管
4L : 风扇
5L : 温湿度最值设置
6L - 7L - 8L - 9L, 用于个人的扩展
10L : 3G通信模块 - GPRS
switch (msgbuf.msgtype)
{
case 1L: ...  break;
	....
		default ....  break;
}
#endif 







#include "data_global.h"
#include "chrdev.h"
#include <unistd.h>

extern pthread_mutex_t  	mutex_led;
extern pthread_cond_t      	cond_led;

extern unsigned char cmd_seg;

int fswaterled_control(int led_fd, int times);//流水灯
int fsled_control(int led_fd, unsigned char led_control_cmd);  //led_control_cmd发送的数字
int fsled_close_all(int led_fd);//全部关闭

//:A9LED模块线程.
void* pthread_led(void* arg)
{
	printf("pthread_led\n");
	int i, j;
	int led_fd;
	led_desc_t led;

	led_fd = open(LED_DEV, O_RDWR);
	if (led_fd == -1)
	{
		printf("open failed.\n");
	}
	printf("led_fd ;%d.\n", led_fd);

	while (1)
	{
		pthread_mutex_lock(&mutex_led);
		pthread_cond_wait(&cond_led, &mutex_led);
		printf("led ioctl:***********\n");
		//	fswaterled_control(led_fd,2); //流水灯
		if (cmd_led == 0x41)
		{
			fswaterled_control(led_fd, 2); //流水灯
		}
		int tmp = cmd_seg & 0xf0;
		if (!(tmp ^ 0x70))
		{
			fsled_control(led_fd, cmd_seg);  //数码管	
		}
		pthread_mutex_unlock(&mutex_led);
	}

	close(led_fd);

}



int fsled_control(int led_fd, unsigned char led_control_cmd)
{
	int i = 0;
	led_desc_t led;
	led_control_cmd &= 0x0f;
	int shift_count = 1; //第0位,第1 - 3位 

	printf("led_control_cmd = %d.\n", led_control_cmd);
	fsled_close_all(led_fd);
	sleep(3);
	while (led_control_cmd)
	{
		if (shift_count >= 5)
			break;
		if ((led_control_cmd & 0x1) == 1)
		{ //第0位开始 = LED2
			shift_count++;  // = 2  LED2 
			printf("if shift_count :%d.\n", shift_count);
			led.which = shift_count; //led2 3 4 5 灯
			ioctl(led_fd, FSLEDON, &led);
			usleep(50000);  //让驱动响应的时间 50ms
		}
		else
		{
			shift_count++;
			printf("else shift_count :%d.\n", shift_count);
			led.which = shift_count; //led2 3 4 5 灯
			ioctl(led_fd, FSLEDOFF, &led);
			usleep(50000);
		}
		led_control_cmd >>= 1;
	}

	return 0;
}


int fsled_close_all(int led_fd)
{
	int i = 0;
	led_desc_t led;

	for (i = 2;i < 6;i++)
	{
		led.which = i;
		ioctl(led_fd, FSLEDOFF, &led);
		usleep(50000);
	}

	return 0;
}



int fswaterled_control(int led_fd, int times)
{
	int i = 0, j = 0;
	led_desc_t led;

	for (j = 0;j < times;j++)
	{
		for (i = 2;i < 6;i++)
		{
			led.which = i;
			ioctl(led_fd, FSLEDON, &led);
			usleep(500000);

			led.which = i;
			ioctl(led_fd, FSLEDOFF, &led);
			usleep(500000);
		}
	}

	return 0;
}














  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值