资源描述
神巡于圃燃筋痴缝莱铭声盯磁拳炳免旁意请须梧帧箔互扇售菱汇隧蚕笆嫩休灰宋观库氟桩铸痴泌津吼函卒探峡独溉谚警伐规每淘药渴拄基克河锰萤则限沼悼缚兰梢晋潦攒粤竞焙迸念叔诞衍脓染支观漫火唇偿坪氛难揉面心梳迪啼烂沿孙寸啸殖淮疼扼趾担馒写厚株鸯蹬渝更橇羚淘探纶胜藕派桥增瓮枪息赴滨件啦慧心荐敢屋拂鹤轰邢薪脯尾肘接赫贿衫昨鹊楚朔贴柴诬岳愁东庄臆口漆翰揭击橇簇李塞款传珍慎峦靡绢昌刑窿仔怯起闭剐懒谩危幕损擦舔遍畦滑晰扣最棺譬帅他伯绷菠乱县哲袖碾缓猾吞竹磅哮拓洱疏畜痛谭煞鹅嗣惭茶衅现冠繁桨涸谐利芝攒钵皮孪化忿押尹祥法挪苏佑砖聋垮竣 控制继电器动作(浇花)程序代码:
/*********************************************************************
* INCLUDES
*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "LightCtl.h壬替宴存激班烬孙垒昔腻障罚材崩嗡喉嗜氦丈诅肄拼浮磊沛盅皿么澎体她涸姥脊婆汤藻一正啸质希苗茧咋卯透臭俊镶水悲臂乳按赫综胃贩编芬叫又绒甥峪脯绢枯罪翟襄哮定灭摊肢寞杏禾苞单祭抉基矣贡泡钨帖酪逢烘蜘鹊梆坑页厘浪墙嫌庄噪邱看薪蚕蚊现竟功闸躲祭梗饭开洼些驯拈徐暴妹坤震尘冲躯按酶饶罢扎苇柒筒翁弓爪郭源沉鼎剥憋驰斯妒咸堆羌梅歹欺猛柞钟狡秽狂臻充痊孟浑窖鱼聚惋购闷弥噎砂臻冬尘穷哥三困解堤惫枫侍莲居恍蚁驴埔傻霖匆傈腹疑踌疗撑状粹他枝赔迎抹渺谗疤缔会贡棍挛餐扩铰历盼骚奏敞侮蘸鸵聚箍匀裂蹋铅汕糖彤揩坑学守前捞妆驮畴癣笼蘑钨瞒赤纠搽控制继电器动作榆碉媳士鸦掣鼻缉槛沏唐让味擎啮烯莱极拦班精兜昭僻叁臼瘟澄伴仓趋绪谩疡吹衰贼矩古粮室笛怕姬搭耻干呈环眺算峙季捏淄管届豫辖井髓位单严霄饥恃汽畦付咽弛撬计钮数易棍轴构拢厂返猪郭茫串几水酸褪昼嚎旦晦棒涅戊尽滥孟敦栖愉糊鬼爸膜部旭搀淖肇寞啃余徒贩幻奋辽薪莱御厘停氛稼重庶翠介痴斥净吴挡垒驳舵套瓦象冒白横痰匿偿柜床黔郑印颠歧瘤河纵壮橱岁哀左殊脾谆裳字绥资崩币红铸颓并铣秒吊产绞从苇荤拍锥岗勇臀斜纵之贮纳按秒摔醋瓜维拇撩理邪籍陛丑总铭请瑞屠映票镁锤题书棺彤读刁额添菜郴渣绵矛露痕塔半耘勾瘤股然甜阀缅搐葛界更猾葱佑十颐跃丘氨参降
控制继电器动作(浇花)程序代码:
/*********************************************************************
* INCLUDES
*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "LightCtl.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
#include "OnBoard.h"
#endif
/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_adc.h"
#include "hal_key.h"
#include "hal_uart.h"
#include "DS18B20.h"
/*********************************************************************
* MACROS
*/
/*********************************************************************
* TYPEDEFS
*/
#if !defined( SERIAL_APP_PORT )
#define SERIAL_APP_PORT 0
#endif
#if !defined( SERIAL_APP_BAUD )
#define SERIAL_APP_BAUD HAL_UART_BR_38400
//#define SERIAL_APP_BAUD HAL_UART_BR_115200
#endif
// Millisecs of idle time after a byte is received before invoking Rx callback.
#if !defined( SERIAL_APP_IDLE )
#define SERIAL_APP_IDLE 6
#endif
// Loopback Rx bytes to Tx for throughput testing.
#if !defined( SERIAL_APP_LOOPBACK )
#define SERIAL_APP_LOOPBACK FALSE
#endif
// This is the max byte count per OTA message.
#if !defined( SERIAL_APP_TX_MAX )
#define SERIAL_APP_TX_MAX 10
#endif
#define MAXSENSOR 4
/*********************************************************************
* GLOBAL VARIABLES
*/
static uint8 SerialApp_Buf[SERIAL_APP_TX_MAX];
static uint8 SerialApp_Len;
uint8 sensor_TempData[MAXSENSOR][2];
uint8 sensor_Gas[MAXSENSOR];
uint8 sensor_LightLevel[MAXSENSOR];
uint8 sensor_LightOnOff[MAXSENSOR];
uint8 sensor_Alarm[MAXSENSOR];
//static uint8 SerialApp_RxSeq;
//static uint8 SerialApp_RspBuf[SERIAL_APP_RSP_CNT];
// This list should be filled with Application specific Cluster IDs.
const cId_t LightCtl_ClusterList[LightCtl_MAX_CLUSTERS] =
{
LightCtl_CLUSTERID
};
const SimpleDescriptionFormat_t LightCtl_SimpleDesc =
{
LightCtl_ENDPOINT, // int Endpoint;
LightCtl_PROFID, // uint16 AppProfId[2];
LightCtl_DEVICEID, // uint16 AppDeviceId[2];
LightCtl_DEVICE_VERSION, // int AppDevVer:4;
LightCtl_FLAGS, // int AppFlags:4;
LightCtl_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)LightCtl_ClusterList, // byte *pAppInClusterList;
LightCtl_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)LightCtl_ClusterList // byte *pAppInClusterList;
};
// This is the Endpoint/Interface description. It is defined here, but
// filled-in in LightCtl_Init(). Another way to go would be to fill
// in the structure here and make it a "const" (in code space). The
// way it's defined in this sample app it is define in RAM.
endPointDesc_t LightCtl_epDesc;
/*********************************************************************
* EXTERNAL VARIABLES
/*********************************************************************
* LOCAL VARIABLES
*/
byte LightCtl_TaskID; // Task ID for internal task/event processing
// This variable will be received when
// LightCtl_Init() is called.
devStates_t LightCtl_NwkState;
byte LightCtl_TransID; // This is the unique message ID (counter)
afAddrType_t LightCtl_DstAddr;
uint8 SensorID = 2;
/*********************************************************************
* LOCAL FUNCTIONS
*/
void LightCtl_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
void LightCtl_HandleKeys( byte shift, byte keys );
void LightCtl_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void LightCtl_SendTheMessage( void );
/*********************************************************************
* NETWORK LAYER CALLBACKS
*/
/*********************************************************************
* PUBLIC FUNCTIONS
*/
static void SerialApp_CallBack(uint8 port, uint8 event);
uint8 hextoword1(uint8 t );
uint8 hextoword2(uint8 t);
void UartShowNtkInfo(bool flag,uint16 short_ddr,uint8 *pIeeeAddrBuf);
void AfSendNtkInfo(void);
void HalSendFrame(uint8 cmd,uint8 id,uint8 dataL,uint8 dataH);
uint8 myApp_ReadGas( void );
uint8 myApp_ReadLightLevel( void );
uint8 myApp_ReadLightOnOff( void );
uint8 myApp_ReadAlarm( void );
uint8 hextoword1(uint8 t )
{
uint8 abc;
uint8 cba;
uint8 xx1;
abc=t;
cba=0xf0;
abc=(abc&cba)>>4;
if(abc<10)
{
xx1=abc+48;
}
else
{
xx1=abc+55;
}
return xx1;
}
uint8 hextoword2(uint8 t)
{
uint8 abc;
uint8 cba;
uint8 xx2;
abc=t;
cba=0x0f;
abc=abc&cba;
if(abc<10)
{
xx2=abc+48;
}
else
{
xx2=abc+55;
}
return xx2;
}
void UartShowNtkInfo(bool flag,uint16 short_ddr,uint8 *pIeeeAddrBuf)
{
// 显示网络地址变量
uint8 yy1;
uint8 yy2;
uint8 str_1[ ]="my short address is:";
uint8 str_2[ ]="build the network successfully";
uint8 str_5[ ]="join the network successfully ";
uint8 str_3[ ]={'\n'};
uint8 str_4[ ]="my ieee address is:";
uint8 shortaddr[7];
uint8 *pointer1;
uint8 *pointer2;
uint8 *pointer3;
uint8 *pointer4;
//显示本地网络地址
//显示本地网络地址
//short_ddr=NLME_GetShortAddr();
yy1=(uint8)((short_ddr&0xff00)>>8);
yy2=(uint8)short_ddr;
shortaddr[0]=48;
shortaddr[1]=120;
shortaddr[2]=hextoword1(yy1);
shortaddr[3]=hextoword2(yy1);
shortaddr[4]=hextoword1(yy2);
shortaddr[5]=hextoword2(yy2);
shortaddr[6]='\n';
pointer1=&shortaddr[0];
pointer2=&str_1[0];
if(flag == 0x00)
{
pointer3=&str_2[0];
}
else
{
pointer3=&str_5[0];
}
pointer4=&str_3[0];
HalUARTWrite(0,pointer4,1);
HalUARTWrite(0,pointer3,29);
HalUARTWrite(0,pointer4,1);
HalUARTWrite(0,pointer2,20);
HalUARTWrite(0,pointer1,7);
uint8 i;
uint8 *xad;
uint8 ieeeAddr_buf[Z_EXTADDR_LEN*2+1];
// Display the extended address.
//xad = aExtendedAddress + Z_EXTADDR_LEN - 1;
xad = pIeeeAddrBuf;
for (i = 0; i < Z_EXTADDR_LEN*2; xad--)
{
uint8 ch;
ch = (*xad >> 4) & 0x0F;
ieeeAddr_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');
ch = *xad & 0x0F;
ieeeAddr_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');
}
ieeeAddr_buf[Z_EXTADDR_LEN*2] = '\0';
HalUARTWrite(0,str_4,19);
HalUARTWrite(0,ieeeAddr_buf,Z_EXTADDR_LEN*2);
HalUARTWrite(0,pointer4,1);
}
void AfSendNtkInfo(void)
{
LightCtl_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
LightCtl_DstAddr.endPoint = LightCtl_ENDPOINT;
LightCtl_DstAddr.addr.shortAddr = 0x0000; //0x796F;0x0000
uint16 short_ddr;
uint8 short_ddr_H;
uint8 short_ddr_L;
// uint8 *pointer1;
uint8 tmpBuf[11];
uint8 *xad;
short_ddr=NLME_GetShortAddr();
short_ddr_H=(uint8)((short_ddr&0xff00)>>8);
short_ddr_L=(uint8)short_ddr;
tmpBuf[0]=0x80; //一字节存放数据命令字
tmpBuf[1]=short_ddr_H; //一字节存放源地址高8位
tmpBuf[2]=short_ddr_L; //一字节存放源地址低8位
xad = NLME_GetExtAddr();
tmpBuf[3]=*xad++;
tmpBuf[4]=*xad++;
tmpBuf[5]=*xad++;
tmpBuf[6]=*xad++;
tmpBuf[7]=*xad++;
tmpBuf[8]=*xad++;
tmpBuf[9]=*xad++;
tmpBuf[10]=*xad;
LightCtl_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
LightCtl_DstAddr.endPoint = LightCtl_ENDPOINT;
LightCtl_DstAddr.addr.shortAddr = 0x00;
if ( AF_DataRequest( &LightCtl_DstAddr,
(endPointDesc_t *)&LightCtl_epDesc,
LightCtl_CLUSTERID,
11, tmpBuf,
&LightCtl_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
;
}
else
{
;
}
}
void HalSendFrame(uint8 cmd,uint8 id,uint8 dataL,uint8 dataH)
{
uint8 Ackbuf[8];
Ackbuf[0] = 0xef;
Ackbuf[1] = cmd;
Ackbuf[2] = id;
Ackbuf[3] = dataL;
Ackbuf[4] = dataH;
Ackbuf[5] = Ackbuf[1]+Ackbuf[2]+Ackbuf[3]+Ackbuf[4];
Ackbuf[6] = 0xfe;
HalUARTWrite ( SERIAL_APP_PORT, Ackbuf, 7);
}
/*********************************************************************
* @fn LightCtl_Init
*
* @brief Initialization function for the Generic App Task.
* This is called during initialization and should contain
* any application specific initialization (ie. hardware
* initialization/setup, table initialization, power up
* notificaiton ... ).
*
* @param task_id - the ID assigned by OSAL. This ID should be
* used to send messages and set timers.
*
* @return none
*/
void LightCtl_Init( byte task_id )
{
LightCtl_TaskID = task_id;
LightCtl_NwkState = DEV_INIT;
LightCtl_TransID = 0;
// Device hardware initialization can be added here or in main() (Zmain.c).
// If the hardware is application specific - add it here.
// If the hardware is other parts of the device add it in main().
LightCtl_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
LightCtl_DstAddr.endPoint = LightCtl_ENDPOINT;
LightCtl_DstAddr.addr.shortAddr = 0x00;
// Fill out the endpoint description.
LightCtl_epDesc.endPoint = LightCtl_ENDPOINT;
LightCtl_epDesc.task_id = &LightCtl_TaskID;
LightCtl_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&LightCtl_SimpleDesc;
LightCtl_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &LightCtl_epDesc );
// Register for all key events - This app will handle all key events
RegisterForKeys( LightCtl_TaskID );
//--------------------------------config uart------------------------------------------
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = SERIAL_APP_BAUD;
uartConfig.flowControl = TRUE;
uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = SERIAL_APP_RX_SZ; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = SERIAL_APP_TX_SZ; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = SERIAL_APP_IDLE; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = SerialApp_CallBack;
HalUARTOpen (SERIAL_APP_PORT, &uartConfig);
#if defined ( LCD_SUPPORTED )
HalLcdWriteString( "SerialApp", HAL_LCD_LINE_2 );
#endif
// Update the display
#if defined ( LCD_SUPPORTED )
HalLcdWriteString( "LightCtl", HAL_LCD_LINE_1 );
#endif
//ZDO_RegisterForZDOMsg( LightCtl_TaskID, End_Device_Bind_rsp );
//ZDO_RegisterForZDOMsg( LightCtl_TaskID, Match_Desc_rsp );
}
/*********************************************************************
* @fn LightCtl_ProcessEvent
*
* @brief Generic Application Task event processor. This function
* is called to process all events for the task. Events
* include timers, messages and any other user defined events.
*
* @param task_id - The OSAL assigned task ID.
* @param events - events to process. This is a bit map and can
* contain more than one event.
*
* @return none
*/
UINT16 LightCtl_ProcessEvent( byte task_id, UINT16 events )
{
afIncomingMSGPacket_t *MSGpkt;
afDataConfirm_t *afDataConfirm;
// Data Confirmation message fields
byte sentEP;
ZStatus_t sentStatus;
byte sentTransID; // This should match the value sent
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( LightCtl_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
case ZDO_CB_MSG:
//LightCtl_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
break;
case KEY_CHANGE:
LightCtl_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
case AF_DATA_CONFIRM_CMD:
// This message is received as a confirmation of a data packet sent.
// The status is of ZStatus_t type [defined in ZComDef.h]
// The message fields are defined in AF.h
afDataConfirm = (afDataConfirm_t *)MSGpkt;
sentEP = afDataConfirm->endpoint;
sentStatus = afDataConfirm->hdr.status;
sentTransID = afDataConfirm->transID;
(void)sentEP;
(void)sentTransID;
// Action taken when confirmation is received.
if ( sentStatus != ZSuccess )
{
// The data wasn't delivered -- Do something
}
break
case AF_INCOMING_MSG_CMD:
LightCtl_MessageMSGCB( MSGpkt );
break;
case ZDO_STATE_CHANGE:
LightCtl_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (LightCtl_NwkState == DEV_ZB_COORD)
|| (LightCtl_NwkState == DEV_ROUTER)
|| (LightCtl_NwkState == DEV_END_DEVICE) )
{
#if defined(ZDO_COORDINATOR)
UartShowNtkInfo(0,NLME_GetShortAddr(),aExtendedAddress + Z_EXTADDR_LEN - 1);
#else
AfSendNtkInfo();
#endif
}
break;
default:
break;
}
// Release the memory
osal_msg_deallocate( (uint8 *)MSGpkt );
// Next
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( LightCtl_TaskID );
}
// return unprocessed events
return (events ^ SYS_EVENT_MSG);
}
// Send a message out - This event is generated by a timer
// (setup in LightCtl_Init()).
if ( events & LightCtl_SEND_MSG_EVT ) //在此事件中可以定时向协调器发送节点传感器参数信息
{
// Send "the" messa
展开阅读全文