#include <stdio.h>
#include <string.h>
#include "Hal_Usart/hal_uart.h"
#include "gizwits_protocol.h"
#include "public/public.h"
/**@} */
/**@name Gizwits 用户API接口
* @{
*/
extern dataPoint_t currentDataPoint;
/**
* @brief 事件处理接口
* 说明:
* 1.用户可以对WiFi模组状态的变化进行自定义的处理
* 2.用户可以在该函数内添加数据点事件处理逻辑,如调用相关硬件外设的操作接口
* @param[in] info : 事件队列
* @param[in] data : 协议数据
* @param[in] len : 协议数据长度
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)
{
uint8_t i = 0;
dataPoint_t *dataPointPtr = (dataPoint_t *)data;
moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)data;
protocolTime_t *ptime = (protocolTime_t *)data;
if((NULL == info) || (NULL == data))
{
return -1;
}
for(i=0; i<info->num; i++)
{
switch(info->event)
{
case EVENT_LAMP_POWER:
currentDataPoint.valueLamp_Power = dataPointPtr->valueLamp_Power;
GIZWITS_LOG("Evt: EVENT_LAMP_POWER %d \n", currentDataPoint.valueLamp_Power);
if(0x01 == currentDataPoint.valueLamp_Power)
{
//app 开灯命令
led_app_flag=1;
led_flag=1;
}
else
{
//app 关灯命令
led_app_flag=1;
led_flag=0;
}
break;
case EVENT_LAMP_AUTO_CONTROL:
currentDataPoint.valueLamp_Auto_Control = dataPointPtr->valueLamp_Auto_Control;
GIZWITS_LOG("Evt: EVENT_LAMP_AUTO_CONTROL %d \n", currentDataPoint.valueLamp_Auto_Control);
if(0x01 == currentDataPoint.valueLamp_Auto_Control)
{
//app模式切换 自动模式
mode_flag=1;
}
else
{
//手动模式
mode_flag=0;
}
break;
case EVENT_POLE_SWITCH:
currentDataPoint.valuePole_Switch = dataPointPtr->valuePole_Switch;
GIZWITS_LOG("Evt: EVENT_POLE_SWITCH %d \n", currentDataPoint.valuePole_Switch);
if(0x01 == currentDataPoint.valuePole_Switch)
{
//user handle
}
else
{
//user handle
}
break;
case EVENT_HUMAN_BODY_SWITCH:
currentDataPoint.valueHuman_Body_Switch = dataPointPtr->valueHuman_Body_Switch;
GIZWITS_LOG("Evt: EVENT_HUMAN_BODY_SWITCH %d \n", currentDataPoint.valueHuman_Body_Switch);
if(0x01 == currentDataPoint.valueHuman_Body_Switch)
{
//user handle
}
else
{
//user handle
}
break;
case EVENT_TIMING_SWITCH:
currentDataPoint.valueTiming_Switch = dataPointPtr->valueTiming_Switch;
GIZWITS_LOG("Evt: EVENT_TIMING_SWITCH %d \n", currentDataPoint.valueTiming_Switch);
if(0x01 == currentDataPoint.valueTiming_Switch)
{
//user handle
}
else
{
//user handle
}
break;
case EVENT_LAMP_SIZE:
currentDataPoint.valueLamp_Size = dataPointPtr->valueLamp_Size;
GIZWITS_LOG("Evt:EVENT_LAMP_SIZE %d\n",currentDataPoint.valueLamp_Size);
//app 调光标志位
led_app_flag=1;
break;
case EVENT_TIMING_SIZE:
currentDataPoint.valueTiming_Size = dataPointPtr->valueTiming_Size;
GIZWITS_LOG("Evt:EVENT_TIMING_SIZE %4f\n",currentDataPoint.valueTiming_Size);
//user handle
break;
case EVENT_LAMP_MODEL:
currentDataPoint.valueLamp_Model = dataPointPtr->valueLamp_Model;
GIZWITS_LOG("Evt:EVENT_LAMP_MODEL %d\n",currentDataPoint.valueLamp_Model);
//user handle
break;
case EVENT_TODAY_DATE:
currentDataPoint.valueToday_Date = dataPointPtr->valueToday_Date;
GIZWITS_LOG("Evt:EVENT_TODAY_DATE %d\n",currentDataPoint.valueToday_Date);
//user handle
break;
case EVENT_NOW_TIME:
currentDataPoint.valueNow_Time = dataPointPtr->valueNow_Time;
GIZWITS_LOG("Evt:EVENT_NOW_TIME %d\n",currentDataPoint.valueNow_Time);
// settime_flag=1;
//user handle
break;
case WIFI_SOFTAP:
break;
case WIFI_AIRLINK:
break;
case WIFI_STATION:
break;
case WIFI_CON_ROUTER:
break;
case WIFI_DISCON_ROUTER:
break;
case WIFI_CON_M2M:
break;
case WIFI_DISCON_M2M:
break;
case WIFI_RSSI:
GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
break;
case TRANSPARENT_DATA:
GIZWITS_LOG("TRANSPARENT_DATA \n");
//user handle , Fetch data from [data] , size is [len]
break;
case WIFI_NTP:
GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
break;
default:
break;
}
}
return 0;
}
/**
* @brief 系统毫秒计时维护函数,毫秒自增,溢出归零
* @param none
* @return none
*/
static uint32_t timerMsCount;
void gizTimerMs(void)
{
timerMsCount++;
}
/**
* @brief 读取系统时间毫秒计时数
* @param none
* @return 系统时间毫秒数
*/
uint32_t gizGetTimerCount(void)
{
return timerMsCount;
}
/**
* @brief MCU复位函数
* @param none
* @return none
*/
void mcuRestart(void)
{
__set_FAULTMASK(1);
NVIC_SystemReset();
}
/**@} */
/**
* @brief 定时器TIM3中断处理函数
* @param none
* @return none
*/
void TIMER_IRQ_FUN(void)
{
if (TIM_GetITStatus(TIMER, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIMER, TIM_IT_Update );
gizTimerMs();
}
}
/**
* @brief 定时器TIM3定时器初始化
* @param none
* @return none
*/
void timerInit(void)
{
u16 arr = 7199;
u16 psc = 9;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(TIMER_RCC, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIMER, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位0
TIM_ITConfig(TIMER, TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIMER_IRQ; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //优占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIMER, ENABLE); //使能TIMx
}
/**
* @brief USART2串口中断函数
* 接收功能,用于接收与WiFi模组间的串口协议数据
* @param none
* @return none
*/
void UART_IRQ_FUN(void)
{
uint8_t value = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
value = USART_ReceiveData(USART2);
gizPutData(&value, 1);
}
}
/**
* @brief 串口写操作,发送数据到WiFi模组
*
* @param buf : 数据地址
* @param len : 数据长度
*
* @return : 正确返回有效数据长度;-1,错误返回
*/
int32_t uartWrite(uint8_t *buf, uint32_t len)
{
uint32_t i = 0;
if(NULL == buf)
{
return -1;
}
#ifdef PROTOCOL_DEBUG
GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
#endif
for(i=0; i<len; i++)
{
USART_SendData(UART, buf);
while (USART_GetFlagStatus(UART, USART_FLAG_TXE) == RESET);//Loop until the end of transmission
#ifdef PROTOCOL_DEBUG
GIZWITS_LOG("%02x ", buf);
#endif
if(i >=2 && buf == 0xFF)
{
USART_SendData(UART,0x55);
while (USART_GetFlagStatus(UART, USART_FLAG_TXE) == RESET);//Loop until the end of transmission
#ifdef PROTOCOL_DEBUG
GIZWITS_LOG("%02x ", 0x55);
#endif
}
}
#ifdef PROTOCOL_DEBUG
GIZWITS_LOG("\n");
#endif
return len;
}
/**
* @brief USART串口初始化
* 用于与WiFi模组间的串口通信
* @param none
* @return none
*/
void uartInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
UART_GPIO_Cmd(UART_GPIO_CLK, ENABLE);
UART_CLK_Cmd(UART_CLK, ENABLE);
UART_AFIO_Cmd(UART_AFIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = UART_TxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = UART_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = UART_BAUDRATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART, &USART_InitStructure);
USART_ITConfig(UART,USART_IT_RXNE,ENABLE);
USART_Cmd(UART, ENABLE);
USART_ClearFlag(UART, USART_FLAG_TC); /*清空发送完成标志,Transmission Complete flag */
/*使能串口中断,并设置优先级*/
NVIC_InitStructure.NVIC_IRQChannel = UART_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
|