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

#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);
}
}