#include "xbee_server.h"
#include "lcd.h"
#include "delay.h"
#include "int_uart.h"
//#define DEBUG
struct XBeeModuleHeader XBeeMeasModule; // 雕� 鍊痢摘�� 鋼蝕麴� 慚糟 � 憐溴雒
struct XBeeFrameStruct XBeeFrame; // 羲樽蜘曖� � 繈筮憐�
//--------------------------------------------------
// 鞣錶綏 褕閑� 憐溴�� 熱 蜻影獎� � 頜�憐� 擇詬慮
bit XBeeReadOK()
{
unsigned char buf[6],i=0;
while(1)
{
uart_getchar(buf + i);
if (buf[i] == 0x0D) break;
i++;
if (i>5) i = 0;
}
if (buf[0]!='O')
return XBEE_ERROR;
if (buf[1]!='K')
return XBEE_ERROR;
return XBEE_OK;
}
//--------------------------------------------------
// 慚摟廓鞅頑甕� 慚鋼樸筮築
unsigned char XBeeInit()
{
InitUART();// 慚摟廓鞅僮綏�� 頜蝶擋慾磋� UART FIFO
return 1;
}
//--------------------------------------------------
// 閱擇隆� � 擇詬� AT 蜻慾痢�
unsigned char XBeeSetAtMode()
{
XBeeSendCommand("+++\0");
delay_ms(50);
return XBeeReadOK();
}
//--------------------------------------------------
// 褕頜琵蒙 痞 蜻慾痢煬 � 頜�憐� 擇詬慮
void XBeeSendCommand(char * command)
{
unsigned char i;
for(i=0;command[i]!=0;i++)
{
uart_putchar(command[i]);
}
DriveUART();
}
//--------------------------------------------------
// 褕頜琵蒙 鋒擋慮隧� 蜻慾痢煬 � 頜�憐� 擇詬慮
void XBeeSendParam(unsigned short param)
{
unsigned char f1,i=0;
for(i=4;i>0;i--)
{
f1 = (param >> ((i-1) << 2) )& 0x0F;
if ( f1 < 10 ) uart_putchar(f1+0x30);
if ( f1 > 9 ) uart_putchar(f1+0x30+7);
}
DriveUART();
}
/*
//--------------------------------------------------
bit XBeeWaitCR()
{
while (!uart_test_hit())
{
if(uart_getcharm()==0x0D)
return 1;
else
return 0;
}
}
//------------------------------------------------------
void XBeeReadLine(unsigned char * buffer,unsigned char cnt)
{
unsigned char i = 0;
for (i = 0; i < cnt; ++i)
{
buffer[i] = uart_getcharm();
if (buffer[i]=='\r')
{
buffer[i]=0;
break;
}
}
}
//------------------------------------------------------
bit XBeeEstablishConnect(unsigned short address)
{
if (XBeeSetAtMode()==XBEE_OK)
{
XBeeSendCommand("ATDN");
XBeeSendParam(0x0002);
uart_putcharm('\r');
delay_ms(50);
if ( XBeeReadOK() == XBEE_OK )
{
OutStringXY("OK!",5,5);
}
return 1;
}
return 0;
} */
//------------------------------------------------------------------
// 閱擇隆� � 痣� 擇詬�
bit XBeeSetApiMode()
{
if (XBeeSetAtMode()==XBEE_OK)
{
XBeeSendCommand("ATAP1");
uart_putchar('\r');
DriveUART();
if ( XBeeReadOK() == XBEE_OK )
return 1;
}
}
//------------------------------------------------------------------
// 頡溪雛� 蜻瘢曉鼻瘟� 翰慾� 繈筮影
unsigned char XBeeChecksum(unsigned char * buf, unsigned short length)
{
unsigned char ck = 0;
unsigned short i;
// add all the bytes:
for (i = 0; i < length; i++)
{
ck += (buf[i]);
}
// subtract the result from 0xFF.
// note that it should be only one byte, that's why we
// convert it to a byte. then back to an int to return it
ck = (0xFF - ck);
return ck;
}
//------------------------------------------------------------------
// 膳摘權痢徹 繈筮影
// 誅綏 篦蝕獎�, 綁鞅 繈筮� 獗 頜摸蝠摘 順滓綏 誕廖蝕
bit XBeeGetFrame()
{
unsigned short length = 0;
unsigned int i = 0;
unsigned char checksum,tmp=0;
// 誅粳 熱闐餃 繈筮影
while(tmp!=0x7E)
{
uart_getchar(&tmp);
delay_ms(1);
i++;
if (i > 1000)
{
ResetUART();
return 0;
}
}
#ifdef DEBUG
OutStringXY(" begin ",2,7);
#endif
// 鞣錶粳 溫慚� 繈筮影
if (!uart_getchar(&tmp)) return 0;
length = tmp << 8 ;
if (!uart_getchar(&tmp)) return 0;
length |= tmp;
#ifdef DEBUG
OutStringXY(" length ",2,7);
#endif
if (length > XBEE_MAX_FRAME_DATA_LENGTH)
{
XBeeFrame.DataLength = 0;
return 0;
}
#ifdef DEBUG
OutStringXY(" data ",2,7);
#endif
// 順鞣靜鈇粳 滓瘩灘
for(i = 0; i < length; i++)
{
if (!uart_getchar(&tmp)) return 0;
XBeeFrame.FrameData[i] = tmp;
}
//鞣錶粳 蜻瘢�. 翰慾� � 頜蝴綑�粳
#ifdef DEBUG
OutStringXY(" checksum ",2,7);
#endif
if (!uart_getchar(&tmp)) return 0;
checksum = tmp;
if (checksum != XBeeChecksum(XBeeFrame.FrameData,length))
{
#ifdef DEBUG
OutStringXY(" all bad ",2,7);
#endif
XBeeFrame.DataLength = 0;
return 0;
}
else
{
#ifdef DEBUG
OutStringXY(" all good ",2,7);
#endif
XBeeFrame.DataLength = length;
return 1;
}
}
//------------------------------------------------------------------
// 褕頜琵��綏 繈筮�(滓瘩灘 繈筮影 頑頡颱���� 頑擋獗�!!!11)
bit XBeeSendFrame()
{
unsigned short i;
// ResetUART();
XBeeFrame.Checksum = XBeeChecksum(XBeeFrame.FrameData,XBeeFrame.DataLength);
uart_putchar(0x7E); // 熱闐餃 繈筮影
uart_putchar( (XBeeFrame.DataLength >> 8) & 0xFF);// 溫慚� 繈筮影
uart_putchar( (XBeeFrame.DataLength) & 0xFF);
for (i = 0; i < XBeeFrame.DataLength; i++)
{
uart_putchar(XBeeFrame.FrameData[i]);
}
uart_putchar(XBeeFrame.Checksum);
DriveUART();
return 1;
}
//------------------------------------------------------------------
//
// 膳摘權琯� 羲痞檀 閱擇滓鞣 繈筮影
bit XBeeReadTXStatus()
{
if( XBeeFrame.FrameData[0] != XBEE_TXSTATUS )
{
return 0;
}
if( XBeeFrame.FrameData[2] != 0)
{
return 0;
}
return 1;
}
//------------------------------------------------------------------
// 褕頜琵��綏 滓瘩灘 *dat 溫慚瘟� length 憐溴億 � 琴擇縝� addr
bit XBeeSendData(unsigned char * dat,unsigned short length, unsigned short addr)
{
unsigned char i;
XBeeFrame.DataLength = 5 + length;
XBeeFrame.FrameData[0] = XBEE_TX16;// frame type - apiID
XBeeFrame.FrameData[1] = 0x01;// frame ID: 1 - with response; 0 - without;
// 16-bit Network Address
XBeeFrame.FrameData[2] = (addr >> 8) & 0xFF;
XBeeFrame.FrameData[3] = addr & 0xFF;
XBeeFrame.FrameData[4] = 0x00;// options must be 0
// Data
for (i = 0; i < length; i++)
{
XBeeFrame.FrameData[i+5] = dat[i];
}
#ifdef DEBUG
OutStringXY("send frame ",2,6);
#endif
if (!XBeeSendFrame()) return 0;
#ifdef DEBUG
OutStringXY(" get frame ",2,6);
#endif
delay_ms(50);
if (!XBeeGetFrame()) return 0;// read response
#ifdef DEBUG
OutStringXY(" read stat ",2,6);
#endif
delay_ms(50);
return XBeeReadTXStatus();
}
//------------------------------------------------------------------
// 順鞣靜鈇綏 滓瘩灘 愿 擋獗� 頜慚�錙廈 蛭繆擋
// 滓瘩灘 鞣錶��� � *dat, length 頑滓� 影蜴慟畫贛毚 溫慚� 蛭繆擋
// addr - 琴擇� 憐溴��
bit XBeeReadData(unsigned char * dat,unsigned short length, unsigned short addr)
{
unsigned short tmp=0;
unsigned char i;
if (XBeeFrame.FrameData[0] != XBEE_RX16)
return 0;
tmp = XBeeFrame.FrameData[1] << 8 | XBeeFrame.FrameData[2];
if ( tmp != addr)
return 0;
if (XBeeFrame.DataLength > length)
return 0;
XBeeMeasModule.RSSI = XBeeFrame.FrameData[3];
for( i = 0; i < XBeeFrame.DataLength - 5 ; i++)
{
dat[i] = XBeeFrame.FrameData[i+5];
}
return 1;
}
//------------------------------------------------------------------
// 頜蝴綑蒙 羲痞檀� 憐滇影
bit XBeeCoordStart()
{
if (!XBeeGetFrame()) return 0;
if (XBeeFrame.FrameData[0] != XBEE_MODEM_STATUS) return 0;
if (XBeeFrame.FrameData[1] != XBEE_MODEM_COORD_START) return 0;
return 1;
}
//------------------------------------------------------------------
// 擇篦�
bit XBeeReset()
{
RST_XBEE = 0;// reset xbee
delay_ms(50);
RST_XBEE = 1;
if (!XBeeGetFrame()) return 0;
if (XBeeFrame.FrameData[0] != XBEE_MODEM_STATUS) return 0;
if (XBeeFrame.FrameData[1] != XBEE_MODEM_RESET) return 0;
return 1;
}