基于ARM的智能灯光控制系统总结(9-主控进程的设备状态更新线程)

独立的线程控制项目中硬件模块的开关状态


sw_pro.h

#ifndef __SL2000_SW_IPC_H_
#define __SL2000_SW_IPC_H_

void * sw_pro(void * arg);//状态更新线程
void area_sw_update(void);//更新区域状态
int dev_sw_update(struct sys_dev * head);//更新设备开关状态

#endif

sw_pro.c

#include "config.h"
#include "sw_pro.h"

extern struct sys_all g_dev[1];
extern struct sys_dev * head_node;
extern struct dev_fd g_dev_fd;

extern int area_update_flag;
extern unsigned char net_cmd;

void*sw_pro(void * arg)
{
	char light_da[2];
	struct sys_dev * new_dev;
	struct sys_dev * find_dev;
	light_da[0]=0;
	new_dev=(struct sys_dev *)malloc(sizeof(struct sys_dev));

	while(1){
		//光感处理
		if(find_id(DEV_T_RAY,head_node,new_dev)==1){
			if(g_dev_fd.light_fd>0) read(g_dev_fd.light_fd,light_da,1);
			if(new_dev->bind_dev>0&&new_dev->bind_dev<10)
				if((find_dev=(struct sys_dev *)get_dev_id(new_dev->bind_dev,head_node))!=NULL) find_dev->sw_sta=light_da[0];
		}

		if(area_update_flag==1) area_sw_update();

		dev_sw_update(head_node);

		sleep(1);		
	}
}

int dev_sw_update(struct sys_dev * head)
{
	struct sys_dev * p;
	p=head;
	char da[8];

	if(NULL==head){
		printf("List of devices is null !\n");
		return -1;
	}

	while(p!=NULL){
		switch(p->node.type)
		{
			case DEV_T_LIGHT1:
				if(p->sw_sta==1){
					da[0]=J1_ON;
				}else{

					da[0]=J1_OFF;
				}
				write(g_dev_fd.relay1_fd,da,1);
				break;

			case DEV_T_LIGHT2:
				if(p->sw_sta==1){
					da[0]=J2_ON;
				}else{

					da[0]=J2_OFF;
				}
				write(g_dev_fd.relay2_fd,da,1);
				break;
			case DEV_T_LIG_NET:		//待补充项,发送net_cmd=0x33命令,需要在设备数据结构再加个控制状态参数
				if(p->sw_sta==1){
					net_cmd=0x31;
				}else{

					net_cmd=0x32;
				}
				break;
			default: 
				break;


		}
		p=p->next;
	}
	return 0;
}

void area_sw_update(void)
{
	int area_loop,dev_loop;
	struct sys_area area_val;
	struct sys_dev * find_dev;

	for(area_loop=0;area_loop<MAX_DEV;area_loop++){
		memcpy(&area_val,&(g_dev->sys_area[area_loop]),sizeof(struct sys_area));
		if(area_val.enable_flag==1){
			if(area_val.sw_sta==1){
				for(dev_loop=0;dev_loop<MAX_DEV;dev_loop++){
					if((find_dev=get_dev_id(area_val.dev_id[dev_loop],head_node))!=NULL) find_dev->sw_sta=ON;
				}
			}else{
				for(dev_loop=0;dev_loop<MAX_DEV;dev_loop++){
					if((find_dev=get_dev_id(area_val.dev_id[dev_loop],head_node))!=NULL) find_dev->sw_sta=OFF;
				}
			}
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值