📄 starnetdevice.c
字号:
/**************************************************************
* Includes
**************************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include "device_header.h" /* include peripheral declarations */
#include "pub_def.h"
#include "mcu_hw_config.h"
#include "MC13192_hw_config.h"
#include "simple_mac.h"
#include "bootloader user api.h"
#include "lighting_demo_device.h"
#include "freescale_radio_hardware.h"
#include "ascii_utilities.h"
/**************************************************************
* Data definitions
**************************************************************/
byte gu8RTxMode; /* Current mode of the MC13192 XCVR */
byte LEDS; /* LED on/off information */
byte rxcount;
/**************************************************************
* Main Program
**************************************************************/
void main(void)
{
tTxPacket sTxPacket;
tRxPacket sRxPacket;
byte au8RxDataBuffer[26];
byte au8TxDataBuffer[26];
/* Initialize variables */
UINT16 u16LEDOldTime = 0;
UINT16 u16RTXOldTime = 0;
UINT16 u16PBOldTime = 0;
UINT16 u16OldTime = 0;
UINT16 u16NewTime = 0;
UINT16 u16LagTime1 = 0;
UINT16 u16LagTime2 = 0;
UINT16 u16Count = 0;
UINT8 u8PBState = 0;
UINT8 u8AppStatus = 0;
UINT8 u8GetLed = 0;
UINT8 u8Crap = 0;
UINT8 u8XcvrMode = 0;
UINT8 u8LEDStatus = 1;
UINT8 u8DeviceNum = 0;
UINT8 u8DeviceLed = 0;
UINT8 u8LightLed = 0x00; /* initial */
UINT8 u8Garbage = 0;
UINT8 u8Channel = 1;
UINT8 u8LastDsn = 0xFF;
UINT8 u8Count1 = 0;
UINT8 u8RfIcVersion=0;
UINT8 flag=0;
UINT8 i=0;
UINT8 reced=0;
UINT8 u8ED=0x00;
sTxPacket.u8DataLength = 0;
sTxPacket.pu8Data = &au8TxDataBuffer[0];
sRxPacket.u8DataLength = 0;
sRxPacket.pu8Data = &au8RxDataBuffer[0];
sRxPacket.u8MaxDataLength = 30;
sRxPacket.u8Status = 0;
MCUInit();
RadioInit();
/* Begin init */
rxcount = 0x00; /* Number of times device received the same request */
LED1DIR = 1; /* LED directions */
LED2DIR = 1;
LED3DIR = 1;
LED4DIR = 1;
MLMESetMC13192ClockRate(MC13192_CLKO_FREQ); /* 8 MHz bus clock (see lighting_demo_device.h) */
UseExternalClock();
/******************************************************************
To adjust output power call the MLME_MC13192_PA_output_adjust() with:
MAX_POWER (+3 to +5dBm)
NOMINAL_POWER (0 dBm)
MIN_POWER ~(-16dBm)
or somewhere custom ? (0-15, 11 (NOMINAL_POWER) being Default power)
******************************************************************/
//MLMEMC13192PAOutputAdjust(MAX_POWER); //Set MAX power setting
//MLMEMC13192PAOutputAdjust(MIN_POWER); //Set MIN power setting
MLMEMC13192PAOutputAdjust(NOMINAL_POWER); //Set Nominal power setting
/* Application init */
SRTISC=SRTISC&~0x07; /* Disable wake up timer. */
SPMSC2=SPMSC2&~0x03; /* Enable deep sleep mode stop3. */
TPM1SC = 0x0F; /* Timer divide by 128. (16uS timebase for 8MHz bus clock). */
PB0PU = 1; /* Pushbutton directions and pull-ups */
PB0DIR = 0;
PB1PU = 1;
PB1DIR = 0;
PB2PU = 1;
PB2DIR = 0;
PB3PU = 1;
PB3DIR = 0;
KBI1SC_KBIMOD = 0;
KBI1SC_KBI1E =0; /* Pushbutton interrupts not used */
PB0IE =0;
PB1IE =0;
PB2IE =0;
PB3IE =0;
/* Enable all interrupts and ready to go */
MC13192_IRQ_IE_BIT = 1;
EnableInterrupts;
/* "Walk" LEDs to indicate this is a device. */
LedDrive(0x01);
MCUDelay (WALKON);
LedDrive(0x02);
MCUDelay (WALKON);
LedDrive(0x04);
MCUDelay (WALKON);
LedDrive(0x08);
MCUDelay (WALKON);
/* LEDs off for a short */
LedDrive(0x00);
MCUDelay (LONGFLASHOFF);
/* Allow SECURITY LED to glow for a short. Indicates Group. */
LedDrive(SECURITY);
MCUDelay(LONGFLASHON);
/* Now all LEDs off. */
LedDrive(0x00);
u16LEDOldTime = MCUReadTmr1 ();
u16RTXOldTime = u16LEDOldTime;
LEDS = LEDPORT; /* Initialize LEDS to the actual port setting */
for(;;)
{
if(flag==0)
{
u8Channel=u8Channel+1;
if (u8Channel==5)
u8Channel=1;
MLMESetChannelRequest(((u8Channel-1)<<2) + (u8Channel-1));
au8TxDataBuffer[0] = 0xE1;
au8TxDataBuffer[1] = 0xCC;
au8TxDataBuffer[2] = SECURITY;
au8TxDataBuffer[3] = 0x00;
au8TxDataBuffer[4] = u8Channel;
au8TxDataBuffer[5] = 0x01;
au8TxDataBuffer[6] = 0x00;
au8TxDataBuffer[7] = channelREQ;
sTxPacket.u8DataLength = 8;
u16NewTime = MCUReadTmr1 ();
u16RTXOldTime = u16NewTime;
while ((u16NewTime-u16RTXOldTime) < DWELLTIME)
{
u16NewTime = MCUReadTmr1 ();
}
MCPSDataRequest(&sTxPacket);
u16NewTime = MCUReadTmr1 ();
u16RTXOldTime = u16NewTime;
LedDrive(u8Channel);
while ((u16NewTime-u16RTXOldTime) < DWELLTIME2)
{
u16NewTime = MCUReadTmr1 ();
}
MLMERXEnableRequest(&sRxPacket, RXTIMEOUT);
while (gu8RTxMode != IDLE_MODE)
{
LOW_POWER_WHILE();
}
if (sRxPacket.u8Status == SUCCESS)
{
if ((au8RxDataBuffer[0] == 0xE1) && (au8RxDataBuffer[1] == 0xCC) && (au8RxDataBuffer[2] == SECURITY) && (au8RxDataBuffer[4] == u8Channel)&&(au8RxDataBuffer[7] == channelCMD))
{
if (au8RxDataBuffer[5] == u8LastDsn)
rxcount++;
else
{ LedDrive(u8Channel);
//flag=1;
reced= au8RxDataBuffer[3];
u8ED=MLMEEnergyDetect();
u8AppStatus=1;
u8LastDsn = au8RxDataBuffer[5];
}
}
}
if(u8AppStatus==1)
{
for(i=0;i<sRxPacket.u8DataLength+1;i++)
{
au8TxDataBuffer[i]=au8RxDataBuffer[i] ;
}
au8TxDataBuffer[1] = u8ED;
au8TxDataBuffer[3] =reced;
au8TxDataBuffer[7] =numREQ;
sTxPacket.u8DataLength = 8;
u16NewTime = MCUReadTmr1 ();
u16RTXOldTime = u16NewTime;
while ((u16NewTime-u16RTXOldTime) < DWELLTIME)
{
u16NewTime = MCUReadTmr1 ();
}
MCPSDataRequest(&sTxPacket);
u16NewTime = MCUReadTmr1 ();
u16RTXOldTime = u16NewTime;
while ((u16NewTime-u16RTXOldTime) < DWELLTIME2)
{
u16NewTime = MCUReadTmr1 ();
}
// u8AppStatus=2;
MLMERXEnableRequest(&sRxPacket, 0x);
}
while (gu8RTxMode != IDLE_MODE)
{
LOW_POWER_WHILE();
}
if ((sRxPacket.u8Status == SUCCESS) && (au8RxDataBuffer[0] == 0xE1) && (au8RxDataBuffer[1] == u8ED) && (au8RxDataBuffer[2] == SECURITY) && (au8RxDataBuffer[3] == reced)&& (au8RxDataBuffer[7] == deliverCMD))
{
if ((au8RxDataBuffer[5] == u8LastDsn))
{
rxcount++;
}
else
{
u8DeviceNum=au8RxDataBuffer[4];
flag=1;
LedDrive(u8DeviceNum);
rxcount = 1;
u8AppStatus=2;
u8LastDsn = au8RxDataBuffer[5];
}
}
if (u8AppStatus==2)
{
for(i=0;i<sRxPacket.u8DataLength+1;i++)
{
au8TxDataBuffer[i]=au8RxDataBuffer[i] ;
}
au8TxDataBuffer[1] = u8ED;
au8TxDataBuffer[3] = reced;
au8TxDataBuffer[7] = ACKBACK;
sTxPacket.u8DataLength = 8;
u16NewTime = MCUReadTmr1 ();
u16RTXOldTime = u16NewTime;
while ((u16NewTime-u16RTXOldTime) < DWELLTIME)
{
u16NewTime = MCUReadTmr1 ();
}
MCPSDataRequest(&sTxPacket);
u16NewTime = MCUReadTmr1 ();
u16RTXOldTime = u16NewTime;
while ((u16NewTime-u16RTXOldTime) < DWELLTIME2)
{
u16NewTime = MCUReadTmr1 ();
}
u16RTXOldTime = u16NewTime;
u8AppStatus=0;
// MLMERXEnableRequest(&sRxPacket, 0x);
}
}
}
}
/**************************************************************
* Function: LED driver
* Parameters: state. 1-4 is light only that LED. 5 is turn all off, 6 is all on.
* Return: none
**************************************************************/
void LedDrive (UINT8 state)
{
switch (state)
{
case 0x00:
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
break;
case 0x01:
LED1 = 0;
LED2 = 1;
LED3 = 1;
LED4 = 1;
break;
case 0x02:
LED1 = 1;
LED2 = 0;
LED3 = 1;
LED4 = 1;
break;
case 0x03:
LED1 = 0;
LED2 = 0;
LED3 = 1;
LED4 = 1;
break;
case 0x04:
LED1 = 1;
LED2 = 1;
LED3 = 0;
LED4 = 1;
break;
case 0x05:
LED1 = 0;
LED2 = 1;
LED3 = 0;
LED4 = 1;
break;
case 0x06:
LED1 = 1;
LED2 = 0;
LED3 = 0;
LED4 = 1;
break;
case 0x07:
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 1;
break;
case 0x08:
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 0;
break;
case 0x09:
LED1 = 0;
LED2 = 1;
LED3 = 1;
LED4 = 0;
break;
case 0x0a:
LED1 = 1;
LED2 = 0;
LED3 = 1;
LED4 = 0;
break;
case 0x0b:
LED1 = 0;
LED2 = 0;
LED3 = 1;
LED4 = 0;
break;
case 0x0c:
LED1 = 1;
LED2 = 1;
LED3 = 0;
LED4 = 0;
break;
case 0x0d:
LED1 = 0;
LED2 = 1;
LED3 = 0;
LED4 = 0;
break;
case 0x0e:
LED1 = 1;
LED2 = 0;
LED3 = 0;
LED4 = 0;
break;
case 0x0f:
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
break;
}
return;
}
/**************************************************************
* Function: LED state return
* Returns LED state. 0xFF is on, 0x00 is off.
**************************************************************/
/**************************************************************
* Function: Received data handler
* Parameters: tRxPacket
**************************************************************/
void MCPSDataIndication(tRxPacket *sRxPacket)
/* Just a direct return. Main loop will handle it. */
{
}
/**************************************************************
* Function: MC13192 reset handler (not yet implemented)
* Parameters: none
**************************************************************/
void MLMEMC13192ResetIndication (void)
{
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
for(;;);
}
/**************************************************************
* Function: Read MCU timer.
* Parameters: none
* Return: 16-bit timer value.
**************************************************************/
UINT16 MCUReadTmr1(void)
{
UINT16 w; /* w[0] is MSB, w[1] is LSB */
((UINT8*)&w)[0] = TPM1CNTH; /* MSB */
((UINT8*)&w)[1] = TPM1CNTL; /* LSB */
return w;
}
/**************************************************************
* Function: Delay.
* Parameters: Delay u16Count
* Return: none.
**************************************************************/
void MCUDelay (UINT16 delay_t)
{
UINT16 u16MCUOldTime;
UINT16 u16MCUNewTime;
u16MCUOldTime = MCUReadTmr1();
u16MCUNewTime = u16MCUOldTime;
while ((u16MCUNewTime-u16MCUOldTime) < delay_t)
{
u16MCUNewTime = MCUReadTmr1();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -