SmartSens.h:
#ifndef __SMARTSENS_H#define __SMARTSENS_H#include "AF.h"/********************************************************************* * MACROS */#define OPEN_SMARTSENS 0x01#define CLOSE_SMARTSENS 0x00#define TOGGLE_SMARTSENS 0x02#define STATUS_SMARTSENS_ON 0x01#define STATUS_SMARTSENS_OFF 0x00#define OCCUPIED 1#define UNOCCUPIED 0/********************************************************************* * CONSTANTS *//********************************************************************* * TYPEDEFS *//********************************************************************* * FUNCTIONS *//** 初始化 AM312 的 GPIO 口*/void Init_AM312_GPIO(void);/** 控制红外传感开关*/void Set_SmartSens(uint8_t state);/** 获取红外传感的开关状态*/uint8_t Get_SmartSensState(void);/** 红外感应装置中断处理函数*/void SmartSens_Isr(void);void Send_Infrared(void);#endif
SmartSens.c:
#include <iocc2530.h>#include "hal_mcu.h"#include "hal_defs.h"#include "hal_types.h"#include "hal_board.h"#include "hal_drivers.h"#include "hal_adc.h"#include "hal_key.h"#include "osal.h"#include "AF.h"#include "SmartSens.h"#include "Coordinator.h"/********************************************************************* * MACROS */#define ATTRID_OCCUPANCY 0x0000/********************************************************************* * CONSTANTS *//********************************************************************* * TYPEDEFS *//********************************************************************* * GLOBAL VARIABLES */uint8_t g_smartsens_onoff = 0;/********************************************************************* * GLOBAL FUNCTIONS *//********************************************************************* * LOCAL VARIABLES *//********************************************************************* * LOCAL FUNCTIONS *//********************************************************************* * EXTERN VARIABLES *//********************************************************************* * EXTERN FUNCTIONS *//************************************************************************* 函数名:void Init_AM312_GPIO(void)* 功能:初始化 AM312 的 GPIO 口* 参数:NONE* 返回值:NONE* 调用函数:NONE* 引用全局变量:NONE* 函数全局变量:NONE* 作者:Jesse_嘉伟* 时间:2016/5/17* 最后修改时间:* 说明:Jesse_嘉伟的专栏(https://blog.csdn.net/u012993936) AM312 的数据口为 P0_0 口 设置 P0_0 口为外部中断模式,且为上升沿中断*************************************************************************/void Init_AM312_GPIO(void){ // 清除中断标志位 P0IF = 0; P0IFG &= ~(1<<0); // P0_0寄存器设置 P0SEL &= ~(1<<0); // P0_0通用功能 P0DIR &= ~(1<<0); // P0_0输入方向 P0INP &= ~(1<<0); // P0_0上拉/下拉模式 P2INP |= (1<<5); // 将端口0设为下拉输入 PICTL &= ~(1<<0); //选择端口0的输入选择中断请求条件为“上升沿中断”,捕捉上升沿 // 设置 SFR 寄存器中的中断使能位 P0IEN |= (1<<0); // P0_0中断使能 // 设置IEN1中的中断使能位 IEN1 |= (1<<5); // 使能端口0中断}/************************************************************************* 函数名:void SmartSens_ISR(void)* 功能:红外感应装置的中断处理函数* 参数:NONE* 返回值:NONE* 调用函数:NONE* 引用全局变量:NONE* 函数全局变量:NONE* 作者:Jesse_嘉伟* 时间:2016/5/17* 最后修改时间:* 说明:Jesse_嘉伟的专栏(https://blog.csdn.net/u012993936)*************************************************************************/void SmartSens_Isr(void){ Send_Infrared();}/************************************************************************* 函数名:static void Update_SmartSemsState(uint8_t state)* 功能:更新“红外感应装置”状态* 参数: state:红外感应装置状态* 返回值:NONE* 调用函数:NONE* 引用全局变量: g_smartsens_onoff:红外感应装置状态* 函数全局变量:NONE* 作者:Jesse_嘉伟* 时间:2016/5/17* 最后修改时间:* 说明:Jesse_嘉伟的专栏(https://blog.csdn.net/u012993936)*************************************************************************/static void Update_SmartSemsState(uint8_t state){ g_smartsens_onoff = state;}/************************************************************************* 函数名:static void Toggle_SmartSems(void)* 功能:取反“红外感应装置”* 参数:NONE* 返回值:NONE* 调用函数: uint8_t Get_SmartSensState(void) void Set_SmartSens(uint8_t state)* 引用全局变量:NONE* 函数全局变量:NONE* 作者:Jesse_嘉伟* 时间:2016/5/17* 最后修改时间:* 说明:Jesse_嘉伟的专栏(https://blog.csdn.net/u012993936)*************************************************************************/static void Toggle_SmartSems(void){ if(Get_SmartSensState()==OPEN_SMARTSENS) { Set_SmartSens(CLOSE_SMARTSENS); } else { Set_SmartSens(OPEN_SMARTSENS); }}/************************************************************************* 函数名:uint8_t Get_SmartSensState(void)* 功能:获取红外传感状态* 参数:NONE* 返回值:红外传感状态* 调用函数:NONE* 引用全局变量: smartsens_state:红外传感状态* 函数全局变量:NONE* 作者:Jesse_嘉伟* 时间:2016/5/17* 最后修改时间:* 说明:Jesse_嘉伟的专栏(https://blog.csdn.net/u012993936)*************************************************************************/uint8_t Get_SmartSensState(void){ return (g_smartsens_onoff);}/************************************************************************* 函数名:void Set_SmartSens(uint8_t state)* 功能:控制红外传感开关* 参数: state: OPEN_SMARTSENS:开启红外传感 CLOSE_SMARTSENS:关闭红外传感* 返回值:NONE* 调用函数: static void Update_SmartSemsState(uint8_t state) static void Toggle_SmartSems(void)* 引用全局变量:NONE* 函数全局变量:NONE* 作者:Jesse_嘉伟* 时间:2016/5/17* 最后修改时间:* 说明:Jesse_嘉伟的专栏(https://blog.csdn.net/u012993936)*************************************************************************/void Set_SmartSens(uint8_t state){ switch(state) { case OPEN_SMARTSENS: P0IEN |= (1<<0); // 使能“红外感应装置” Update_SmartSemsState(STATUS_SMARTSENS_ON); // 更新红外感应装置“开关属性” break; case CLOSE_SMARTSENS: P0IEN &= ~(1<<0); // 失能“红外感应装置” Update_SmartSemsState(STATUS_SMARTSENS_OFF); // 更新红外感应装置“开关属性” break; case TOGGLE_SMARTSENS: Toggle_SmartSems(); break; default: break; }}/************************************************************************* 函数名:void Send_Infrared(void)* 功能:发送热红外感应装置状态给协调器* 参数:NONE* 返回值:NONE* 调用函数:* 引用全局变量:NONE* 函数全局变量:NONE* 作者:Jesse_嘉伟* 时间:2016/5/17* 最后修改时间:* 说明:Jesse_嘉伟的专栏(https://blog.csdn.net/u012993936)*************************************************************************/void Send_Infrared(void){ afAddrType_t dstaddr; uint8_t cmd[6] = {0}; uint8_t devtype = DEV_INFRARED; uint16_t nwk = 0; uint16_t pnwk = 0; uint8_t valueinfrared = 0; dstaddr.addr.shortAddr = 0x0000; dstaddr.addrMode = (afAddrMode_t)Addr16Bit; dstaddr.endPoint = GenericApp_SimpleDesc.EndPoint; nwk = NLME_GetShortAddr(); pnwk = NLME_GetCoordShortAddr(); valueinfrared = 1; osal_memcpy(&cmd[0], &devtype, 1); osal_memcpy(&cmd[1], &nwk, 2); osal_memcpy(&cmd[3], &pnwk, 2); osal_memcpy(&cmd[5], &valueinfrared, 1); AF_DataRequest(&dstaddr, &GenericApp_epDesc, GenericApp_epDesc.simpleDesc->pAppOutClusterList[0], sizeof(cmd)/sizeof(uint8_t), cmd, 0, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );}
