https://static.assets-stash.eet-china.com/album/old-resources/2009/2/19/9168dcb5-a068-4d90-b200-f4513205ff07.rar工程下载
编译环境:IAR7.30B
硬件环境:C51RF-CC2520-PK或C51RF-WSN-CC2520
/***********************************************************************************
Filename: light_switch.c
***********************************************************************************/
/***********************************************************************************
* INCLUDES
*/
#include <hal_led.h>
#include <hal_joystick.h>
#include <hal_assert.h>
#include <hal_board.h>
#include <hal_int.h>
#include "hal_mcu.h"
#include "hal_button.h"
#include "hal_rf.h"
#include "util_lcd.h"
#include "basic_rf.h"
#include "OLED.h"
/***********************************************************************************
* CONSTANTS
*/
// Application parameters
#define RF_CHANNEL 25 // 2.4 GHz RF channel
// BasicRF address definitions
#define PAN_ID 0x2007
#define SWITCH_ADDR 0x2520
#define LIGHT_ADDR 0xBEEF
#define APP_PAYLOAD_LENGTH 1
#define LIGHT_TOGGLE_CMD1 1
#define LIGHT_TOGGLE_CMD2 2
#define LIGHT_TOGGLE_CMD3 3
#define LIGHT_TOGGLE_CMD4 4
// Application states
#define IDLE 0
#define SEND_CMD 1
// Application role
#define NONE 0
#define SWITCH 1
#define LIGHT 2
#define APP_MODES 2
/***********************************************************************************
* LOCAL VARIABLES
*/
static uint8 pTxData[APP_PAYLOAD_LENGTH];
static uint8 pRxData[APP_PAYLOAD_LENGTH];
static basicRfCfg_t basicRfConfig;
#ifdef SECURITY_CCM
// Security key
static uint8 key[]= {
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
};
#endif
/***********************************************************************************
* LOCAL FUNCTIONS
*/
static void appLight();
static void appSwitch();
static uint8 appSelectMode(void);
/***********************************************************************************
* @fn appLight
*
* @brief Application code for light application. Puts MCU in endless
* loop waiting for user input from joystick.
*
* @param basicRfConfig - file scope variable. Basic RF configuration data
* pRxData - file scope variable. Pointer to buffer for RX data
*
* @return none
*/
static void appLight()
{
print(20,0,"Light Ready",1);
// Initialize BasicRF
basicRfConfig.myAddr = LIGHT_ADDR;
if(basicRfInit(&basicRfConfig)==FAILED) {
HAL_ASSERT(FALSE);
}
basicRfReceiveOn();
// Main loop
while (TRUE) {
while(!basicRfPacketIsReady());
if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {
switch(pRxData[0])
{
case LIGHT_TOGGLE_CMD1:
halLedToggle(1);
break;
case LIGHT_TOGGLE_CMD2:
halLedToggle(2);
break;
case LIGHT_TOGGLE_CMD3:
halLedToggle(3);
break;
case LIGHT_TOGGLE_CMD4:
halLedToggle(4);
break;
}
}
}
}
/***********************************************************************************
* @fn appSwitch
*
* @brief Application code for switch application. Puts MCU in
* endless loop to wait for commands from from switch
*
* @param basicRfConfig - file scope variable. Basic RF configuration data
* pTxData - file scope variable. Pointer to buffer for TX
* payload
* appState - file scope variable. Holds application state
*
* @return none
*/
void appSwitch()
{
uint8 keytemp;
print(20,0,"Switch",1);
print(0,2,"Joystick Push",1);
print(0,4,"Send Command",1);
pTxData[0] = LIGHT_TOGGLE_CMD1;
// Initialize BasicRF
basicRfConfig.myAddr = SWITCH_ADDR;
if(basicRfInit(&basicRfConfig)==FAILED) {
HAL_ASSERT(FALSE);
}
// Keep Receiver off when not needed to save power
basicRfReceiveOff();
// Main loop
while (TRUE)
{
keytemp = redJoystick();
if( keytemp)
{
if(keytemp == JOYSTICK_UP) pTxData[0] = LIGHT_TOGGLE_CMD1;
if(keytemp == JOYSTICK_DN) pTxData[0] = LIGHT_TOGGLE_CMD2;
if(keytemp == JOYSTICK_LF) pTxData[0] = LIGHT_TOGGLE_CMD3;
if(keytemp == JOYSTICK_RT) pTxData[0] = LIGHT_TOGGLE_CMD4;
basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);
halLedToggle(keytemp);
}
}
}
/***********************************************************************************
* @fn main
*
* @brief This is the main entry of the "Light Switch" application.
* After the application modes are chosen the switch can
* send toggle commands to a light device.
*
* @param basicRfConfig - file scope variable. Basic RF configuration
* data
* appState - file scope variable. Holds application state
*
* @return none
*/
void main(void)
{
uint8 appMode = NONE;
// Config basicRF
basicRfConfig.panId = PAN_ID;
basicRfConfig.channel = RF_CHANNEL;
basicRfConfig.ackRequest = TRUE;
#ifdef SECURITY_CCM
basicRfConfig.securityKey = key;
#endif
// Initalise board peripherals
halBoardInit();
halJoystickInit();
// Initalise hal_rf
if(halRfInit()==FAILED) {
HAL_ASSERT(FALSE);
}
// Indicate that device is powered
//halLedSet(1);
halMcuWaitMs(350);
// Set application role
appMode = appSelectMode();
// Transmitter application
if(appMode == SWITCH)
// No return from here
appSwitch();
// Receiver application
if(appMode == LIGHT)
// No return from here
appLight();
// Role is undefined. This code should not be reached
HAL_ASSERT(FALSE);
}
/****************************************************************************************
* @fn appSelectMode
*
* @brief Select application mode
*
* @param none
*
* @return uint8 - Application mode chosen
*/
static uint8 appSelectMode(void)
{
UINT8 mode = 0;
print(0,0,"Press S2 Select:",1);
print(40,2,"Light",1);
print(0,4,"Press S3 Select:",1);
print(40,6,"Switch",1);
while(!mode)
{
if(halButtonPushed() == HAL_BUTTON_1)
{
mode = SWITCH;
}
if(halButtonPushed() == HAL_BUTTON_2)
{
mode = LIGHT;
}
}
ClearScreen();
return mode;
}
文章评论(0条评论)
登录后参与讨论