📄 wsn_coordinator.c
字号:
/****************************************************************************/
/*** Include files ***/
/****************************************************************************/
#include <jendefs.h>
#include <ALSdriver.h>
#include <HTSdriver.h>
#include <LedControl.h>
#include <AppHardwareApi.h>
#include <Utilities.h>
#include <JZ_Api.h>
#include <gdb.h>
#include "..\..\..\Chip\Common\Include\Printf.h"
#include "WSN_Profile.h"
/****************************************************************************/
/*** Macro Definitions ***/
/****************************************************************************/
/* Timing values */
#define APP_TICK_PERIOD_ms 100
#define APP_DATA_SEND_PERIOD_ms 2000 // 改为每2秒显示一次数值
#define APP_DATA_SEND_PERIOD (APP_DATA_SEND_PERIOD_ms / APP_TICK_PERIOD_ms)
/****************************************************************************/
/*** Type Definitions ***/
/****************************************************************************/
/* Battery reading state definitions */
typedef enum
{
E_STATE_READ_BATT_VOLT_IDLE,
E_STATE_READ_BATT_VOLTS_ADC_CONVERTING,
E_STATE_READ_BATT_VOLTS_COMPLETE,
E_STATE_READ_BATT_VOLTS_READY
}teStateReadBattVolt;
/* Temperature/Humidity Sensor - reading state definitions */
typedef enum
{
E_STATE_READ_TEMP_HUMID_IDLE,
E_STATE_READ_HUMID_RUNNING,
E_STATE_READ_TEMP_HUMID_COMPLETE,
E_STATE_READ_TEMP_START,
E_STATE_READ_TEMP_HUMID_RUNNING,
E_STATE_READ_TEMP_COMPLETE,
E_STATE_READ_TEMP_HUMID_READY
}teStateReadTempHumidity;
/* Battery measurement data */
typedef struct
{
uint16 u16Reading;
teStateReadBattVolt eState;
}tsBattSensor;
/* Temp/Humidity measurement data */
typedef struct
{
uint16 u16TempReading;
uint16 u16HumidReading;
teStateReadTempHumidity eState;
}tsTempHumiditySensor;
/****************************************************************************/
/*** Local Function Prototypes ***/
/****************************************************************************/
PRIVATE void vInit(void);
PRIVATE void vInitSensors(void);
PRIVATE void vReadTempHumidity(void);
PRIVATE void vReadBatteryVoltage(void);
PRIVATE void vAppTick(void *pvMsg, uint8 u8Param);
PRIVATE void vTxSerialDataFrame(uint16 u16NodeId,
uint16 u16Humidity,
uint16 u16Temperature,
uint16 u16BattVoltage);
/****************************************************************************/
/*** Exported Variables ***/
/****************************************************************************/
/****************************************************************************/
/*** Local Variables ***/
/****************************************************************************/
PRIVATE bool_t bNwkStarted = FALSE;
PRIVATE bool_t bAppTimerStarted = FALSE;
PRIVATE uint8 u8AppTicks = 0;
PRIVATE tsBattSensor sBattSensor;
PRIVATE tsTempHumiditySensor sTempHumiditySensor;
/****************************************************************************
*
* NAME: AppColdStart
*
* DESCRIPTION:
* Entry point for application from boot loader. Initialises system and runs
* main loop.
*
* RETURNS:
* Never returns.
*
****************************************************************************/
PUBLIC void AppColdStart(void)
{
/* Debug hooks: include these regardless of whether debugging or not */
HAL_GDB_INIT();
HAL_BREAKPOINT();
/* Set network information */
JZS_sConfig.u32Channel = WSN_CHANNEL;
JZS_sConfig.u16PanId = WSN_PAN_ID;
/* General initialisation */
vInit();
/* No return from the above function call */
}
/****************************************************************************
*
* NAME: AppWarmStart
*
* DESCRIPTION:
* Entry point for application from boot loader. Simply jumps to AppColdStart
* as, in this instance, application will never warm start.
*
* RETURNS:
* Never returns.
*
****************************************************************************/
PUBLIC void AppWarmStart(void)
{
AppColdStart();
}
/****************************************************************************/
/*** Local Functions ***/
/****************************************************************************/
/****************************************************************************
*
* NAME: vInit
*
* DESCRIPTION:
* Initialises Zigbee stack and hardware. Final action is to start BOS, from
* which there is no return. Subsequent application actions occur in the
* functions defined above.
*
* RETURNS:
* No return from this function
*
****************************************************************************/
PRIVATE void vInit(void)
{
/* Initialise Zigbee stack */
JZS_u32InitSystem(TRUE);
/* Set DIO for LEDs */
vLedInitFfd();
vLedControl(0,0);
vLedControl(1,0);
vLedControl(2,0);
vLedControl(3,0);
/* Intialise serial comms unless debug mode*/
#ifndef GDB
vUART_printInit();
#endif
/* Set sensors */
vInitSensors();
/* Start BOS */
(void)bBosRun(TRUE);
/* No return from the above function call */
}
/****************************************************************************
*
* NAME: vInitSensors
*
* DESCRIPTION:
* Initialise the temperature/humidity sensor and set the ADC to measure the
* supply voltage.
*
****************************************************************************/
PRIVATE void vInitSensors(void)
{
/* Initialise temp/humidity sensor interface */
vHTSreset();
sTempHumiditySensor.eState = E_STATE_READ_TEMP_HUMID_IDLE;
/* Initialise ADC for internal battery voltage measurement */
sBattSensor.eState = E_STATE_READ_BATT_VOLT_IDLE;
vAHI_ApConfigure(E_AHI_AP_REGULATOR_ENABLE,
E_AHI_AP_INT_DISABLE,
E_AHI_AP_SAMPLE_2,
E_AHI_AP_CLOCKDIV_2MHZ,
E_AHI_AP_INTREF);
/* Wait until the analogue peripheral regulator has come up before setting
the ADC. */
while(!bAHI_APRegulatorEnabled());
vAHI_AdcEnable(E_AHI_ADC_CONVERT_DISABLE,
E_AHI_AP_INPUT_RANGE_2,
E_AHI_ADC_SRC_VOLT);
}
/****************************************************************************
*
* NAME: vTxSerialDataFrame
*
* DESCRIPTION:
* Transmits node data (address and sensor readings) to host via serial port.
*
* PARAMETERS: Name RW Usage
* u16NodeId R Short address of node that generated the data
* u16Humidity R Reading from humidity sensor (%)
* u16Temperature R Reading from temperature sensor (degrees C)
* u16BattVoltage R ADC reading of supply voltage (mv)
*
****************************************************************************/
PRIVATE void vTxSerialDataFrame(uint16 u16NodeId,
uint16 u16Humidity,
uint16 u16Temperature,
uint16 u16BattVoltage)
{
#ifndef GDB
vPrintf("\n\rAddress = %x ", u16NodeId);
vPrintf("Humidity = %d ", u16Humidity);
vPrintf("Temperature = %d ", u16Temperature);
vPrintf("Voltage = %d ", u16BattVoltage);
#endif
}
/****************************************************************************
*
* NAME: vAppTick
*
* DESCRIPTION:
*
* Called by a BOS timer expiry. Reads sensor data and if complete transmits
* to coordinator.
*
****************************************************************************/
PRIVATE void vAppTick(void *pvMsg, uint8 u8Param)
{
uint8 u8Msg;
uint8 u8TimerId;
static bool_t bToggle;
/* Read sensor data */
vReadTempHumidity();
vReadBatteryVoltage();
if (u8AppTicks++ > APP_DATA_SEND_PERIOD) // 每1s发送1次数据
{
/* If sensor reads are compete */
if ((sBattSensor.eState == E_STATE_READ_BATT_VOLTS_READY) &&
(sTempHumiditySensor.eState == E_STATE_READ_TEMP_HUMID_READY))
{
/* Toggle LED1 to show we are alive */
if (bToggle)
{
vLedControl(0,0);
}
else
{
vLedControl(0,1);
}
bToggle = !bToggle;
u8AppTicks = 0;
vTxSerialDataFrame(0x0000, sTempHumiditySensor.u16HumidReading, sTempHumiditySensor.u16TempReading, sBattSensor.u16Reading);
sBattSensor.eState = E_STATE_READ_BATT_VOLT_IDLE;
sTempHumiditySensor.eState = E_STATE_READ_TEMP_HUMID_IDLE;
}
}
(void)bBosCreateTimer(vAppTick, &u8Msg, 0, (APP_TICK_PERIOD_ms / 10), &u8TimerId);
}
/****************************************************************************
*
* NAME: vReadBatteryVoltage
*
* DESCRIPTION:
*
* Uses ADC to read supply voltage. Measurement is performed using a state
* machine to ensure that it never blocks.
*
****************************************************************************/
PRIVATE void vReadBatteryVoltage(void)
{
uint16 u16AdcReading;
switch(sBattSensor.eState)
{
case E_STATE_READ_BATT_VOLT_IDLE:
vAHI_AdcStartSample();
sBattSensor.eState = E_STATE_READ_BATT_VOLTS_ADC_CONVERTING;
break;
case E_STATE_READ_BATT_VOLTS_ADC_CONVERTING:
if (!bAHI_AdcPoll())
{
sBattSensor.eState = E_STATE_READ_BATT_VOLTS_COMPLETE;
}
break;
case E_STATE_READ_BATT_VOLTS_COMPLETE:
u16AdcReading = u16AHI_AdcRead();
/* Input range is 0 to 2.4V. ADC has full scale range of 12 bits.
Therefore a 1 bit change represents a voltage of approx 586uV */
sBattSensor.u16Reading = ((uint32)((uint32)(u16AdcReading * 586) +
((uint32)(u16AdcReading * 586) >> 1))) /
1000;
sBattSensor.eState = E_STATE_READ_BATT_VOLTS_READY;
break;
case E_STATE_READ_BATT_VOLTS_READY:
break;
default:
break;
}
}
/****************************************************************************
*
* NAME: vReadTempHumidity
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -