You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.3 KiB
146 lines
3.3 KiB
6 months ago
|
#include "uart_packet.h"
|
||
|
#include "sw_timer.h"
|
||
|
#include "uart1.h"
|
||
|
#include "driver_ds3231_basic.h"
|
||
|
#include "buzzer.h"
|
||
|
|
||
|
|
||
|
#define PACKET_BUFF_SIZE 100
|
||
|
|
||
|
|
||
|
static void Uart_Packet_Make_Process(void);
|
||
|
static void Uart_Packet_Process(uint8_t* pRxBuff);
|
||
|
|
||
|
static uint8_t Pack_Buff[PACKET_BUFF_SIZE];
|
||
|
static uint8_t Pack_Index;
|
||
|
static uint8_t Pack_CheckSum;
|
||
|
static uint8_t Pack_DataLen;
|
||
|
|
||
|
void Uart_Packet_Initialization(void)
|
||
|
{
|
||
|
Pack_Index = 0;
|
||
|
SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 0, Uart_Packet_Make_Process);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
static void Uart_Packet_Make_Process(void)
|
||
|
{
|
||
|
if(Uart1_Get_RecvDataCount() != 0)
|
||
|
{
|
||
|
uint8_t RxData = Uart1_Get_RecvData();
|
||
|
|
||
|
if(Pack_Index == PACK_INDEX_STX && RxData == STX)
|
||
|
{
|
||
|
Pack_Buff[Pack_Index++] = RxData;
|
||
|
Pack_CheckSum = RxData;
|
||
|
Pack_DataLen = 0;
|
||
|
}
|
||
|
else if(Pack_Index == PACK_INDEX_CMD && (RxData >= UART_CMD_SET_TIME && RxData < UART_CMD_MAX))
|
||
|
{
|
||
|
Pack_Buff[Pack_Index++] = RxData;
|
||
|
Pack_CheckSum += RxData;
|
||
|
}
|
||
|
else if(Pack_Index == PACK_INDEX_LEN && RxData < (PACKET_BUFF_SIZE - PACK_INDEX_ETX))
|
||
|
{
|
||
|
Pack_Buff[Pack_Index++] = RxData;
|
||
|
Pack_CheckSum += RxData;
|
||
|
Pack_DataLen = RxData;
|
||
|
}
|
||
|
else if(Pack_Index == (PACK_INDEX_CHECKSUM + Pack_DataLen))
|
||
|
{
|
||
|
if(RxData != Pack_CheckSum)
|
||
|
{
|
||
|
Pack_Index = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Pack_Buff[Pack_Index++] = RxData;
|
||
|
}
|
||
|
}
|
||
|
else if(Pack_Index == (PACK_INDEX_ETX + Pack_DataLen))
|
||
|
{
|
||
|
if(RxData != ETX)
|
||
|
{
|
||
|
Pack_Index = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Pack_Buff[Pack_Index++] = RxData;
|
||
|
Uart_Packet_Process(Pack_Buff);
|
||
|
Pack_Index = 0;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if(Pack_Index >= PACK_INDEX_DATA && Pack_Index < (PACK_INDEX_DATA + Pack_DataLen))
|
||
|
{
|
||
|
Pack_Buff[Pack_Index++] = RxData;
|
||
|
Pack_CheckSum += RxData;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Pack_Index = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
static void Uart_Packet_Process(uint8_t* pRxBuff)
|
||
|
{
|
||
|
UART_CMD cmd = pRxBuff[PACK_INDEX_CMD];
|
||
|
uint8_t DataLen = pRxBuff[PACK_INDEX_LEN];
|
||
|
|
||
|
if(cmd == UART_CMD_SET_TIME && DataLen == 7)
|
||
|
{
|
||
|
uint16_t Year;
|
||
|
uint8_t Month;
|
||
|
uint8_t Date;
|
||
|
uint8_t Hour;
|
||
|
uint8_t Min;
|
||
|
uint8_t Sec;
|
||
|
uint8_t index = 0;
|
||
|
ds3231_time_t set_time;
|
||
|
ds3231_basic_get_time(&set_time);
|
||
|
|
||
|
Year = pRxBuff[PACK_INDEX_DATA + index++] << 8;
|
||
|
Year += pRxBuff[PACK_INDEX_DATA + index++];
|
||
|
Month = pRxBuff[PACK_INDEX_DATA + index++];
|
||
|
Date = pRxBuff[PACK_INDEX_DATA + index++];
|
||
|
Hour = pRxBuff[PACK_INDEX_DATA + index++];
|
||
|
Min = pRxBuff[PACK_INDEX_DATA + index++];
|
||
|
Sec = pRxBuff[PACK_INDEX_DATA + index++];
|
||
|
|
||
|
set_time.format = DS3231_FORMAT_24H;
|
||
|
set_time.year = Year;
|
||
|
set_time.month = Month;
|
||
|
set_time.date = Date;
|
||
|
set_time.hour = Hour;
|
||
|
set_time.minute = Min;
|
||
|
set_time.second = Sec;
|
||
|
|
||
|
// year 2, mon 1, da 1 , h 1, m1, s 1
|
||
|
ds3231_basic_set_time(&set_time);
|
||
|
|
||
|
Buzzer_On(100);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|