k80/appTask.c
2024-05-24 17:09:44 +08:00

360 lines
6.6 KiB
C

#include "r_cg_macrodriver.h"
#include "appTask.h"
#include "event.h"
#include "r_cg_port.h"
#include "r_cg_timer.h"
//#include "r_cg_wdt.h"
#include "hwCtrl.h"
#include "r_cg_adc.h"
#include "r_cg_serial.h"
uint8_t g_rx_buf[3];
extern uint16_t g_AdVal[3];
void HardWare_Init(void)
{
//时基初始化
R_TAU0_Channel0_Start();
//LED初始化
FanLED_Ctrl(0);
HeatLED_Ctrl(0);
//AnmoLED_Ctrl(0);
//AD 初始化
//R_ADC_Start();
//R_ADC_Set_OperationOn();
//R_TAU0_Channel1_Start();
//UART初始化
R_UART0_Start();
R_UART0_Receive(g_rx_buf,1);
}
uint8_t uart_sendend;
void Variable_Init(void)
{
uart_sendend = 1;
}
static uint8_t heat_txstate=0,fan_txstate=0,motor_txstate=0,heat_state=0,fan_state=0,motor_state=0;
uint8_t g_tx_buf[7] = {0};
void UART_Tx_Pro(uint8_t keyid)
{
uint8_t uart_buf[7] = {0x5a,0xa5,0x04,0x00,0x00,0x00,0x00};
uint8_t i;
switch (keyid)
{
case KEY_JR:
uart_buf[3] = (0x03 + heat_txstate)<<4;
break;
case KEY_FAN:
uart_buf[3] = 0x03 + fan_txstate;
break;
case KEY_AM:
if (motor_txstate == 0)
{
uart_buf[4] = 0x0d;
}
else
{
uart_buf[4] = 0x09 + motor_txstate;
}
break;
default:
return;
}
//checksum
uart_buf[6] = uart_buf[3] + uart_buf[5] + uart_buf[4];
for ( i = 0; i < 7; i++)
{
g_tx_buf[i] = uart_buf[i];
}
if (uart_sendend == 1)
{
uart_sendend = 0;
R_UART0_Send(g_tx_buf,7);
}
}
uint8_t datacount=0;
uint8_t RxTimeoutCount=0;
static uint8_t Rxdata[10];
uint8_t RxFlag=0;
void UART_Rx_Pro(uint8_t data)
{
static uint8_t last_data=0,datalen=0;
if (last_data == 0x5A && data == 0xA5)
{
RxFlag = 1;
datacount = 0;
datalen=0;
g_tx_buf[0] = 1;
//R_UART0_Send(g_tx_buf,1);
}
else
{
if (RxFlag == 1)
{
datalen = data;
RxFlag = 2;
g_tx_buf[0] = 2;
//R_UART0_Send(g_tx_buf,1);
}
else if (RxFlag == 2)
{
Rxdata[datacount++] = data;
if (datacount >= datalen)
{
MsgPro(datalen);
}
}
}
last_data = data;
RxTimeoutCount = 0;
}
void MsgPro(uint8_t len)
{
uint8_t i;
//不用大屏协议
uint8_t crc,crcRx;
if (len <= 3)
{
return;
}
crc = 0;
for(i=0;i<3;i++)
{
crc += Rxdata[i];
}
crcRx = Rxdata[3];
if (crc == crcRx)
{
switch (Rxdata[0])
{
case 0x10:
heat_state = 0;
//fan_state = 0;
break;
case 0x20:
heat_state = 3;
fan_state = 0;
break;
case 0x70:
heat_state = 2;
fan_state = 0;
break;
case 0x80:
heat_state = 1;
fan_state = 0;
break;
case 0x01:
fan_state = 0;
//heat_state = 0;
break;
case 0x02:
fan_state = 3;
heat_state = 0;
break;
case 0x07:
fan_state = 2;
heat_state = 0;
break;
case 0x08:
fan_state = 1;
heat_state = 0;
break;
case 0x11:
fan_state = 0;
heat_state = 0;
default:
break;
}
switch (Rxdata[1])
{
case 0x1a:
motor_state = 1;
break;
case 0x1b:
motor_state = 2;
break;
case 0x1c:
motor_state = 3;
break;
case 0x1d:
motor_state = 0;
break;
default:
break;
}
}
RxFlag = 0;
RxTimeoutCount = 0;
datacount = 0;
}
void keyLogic(uint8_t keyno)
{
switch (keyno)
{
case KEY_JR:
heat_txstate = heat_state + 1;
if (heat_txstate > 3)
{
heat_txstate = 0;
}
heat_state = heat_txstate;
fan_state = 0;
break;
case KEY_FAN:
fan_txstate = fan_state + 1;
if (fan_txstate > 3)
{
fan_txstate = 0;
}
fan_state = fan_txstate;
heat_state = 0;
break;
case KEY_AM:
motor_txstate = motor_state + 1;
if (motor_txstate > 3)
{
motor_txstate = 0;
}
motor_state = motor_txstate;
break;
default:
break;
}
UART_Tx_Pro(keyno);
}
#define KEY_DELAY_TIME 6
void keyScan(void)//5ms
{
static uint16_t keydelay[KEY_NUM]={0};
static uint8_t keyflag[KEY_NUM]={0};
static uint8_t keep_count[KEY_NUM]={0};
uint8_t keyval,i;
for (i = 0; i < KEY_NUM; i++)
{
keyval = GetKeyState(i);
if (keyval == 1 && keyflag[i] == 0)
{
keydelay[i]++;
if (keydelay[i] > KEY_DELAY_TIME)//30ms
{
keyflag[i] = 1;
keydelay[i] = KEY_DELAY_TIME;
keyLogic(i);
keep_count[i] = 0;
}
}
else if (keyval == 0)
{
keyflag[i] = 0;
keydelay[i] = 0;
}
}
//持续发送
}
void LED_Ctrl(void)
{
FanLED_Ctrl(fan_state);
HeatLED_Ctrl(heat_state);
AnmoLED_Ctrl(motor_state);
}
void AppTask(void)
{
static uint8_t ledno = 1,last = 0;
if (TimeBase5msFlag == 1)
{
TimeBase5msFlag = 0;
keyScan();
if (RxFlag)
{
RxTimeoutCount++;
if (RxTimeoutCount > 6)
{
RxFlag = 0;
}
}
else
{
RxTimeoutCount = 0;
}
}
if (TimeBase10msFlag == 1)
{
TimeBase10msFlag = 0;
LED_Ctrl();
}
if (TimeBase100msFlag == 1)
{
TimeBase100msFlag = 0;
R_WDT_Restart();
}
if (TimeBase1000msFlag == 1)
{
TimeBase1000msFlag = 0;
//UART_Tx_Pro(1);
}
}
#define POLYNOMINAL 0xA001
#define PRESET_VALUE 0xFFFF
unsigned int crc16_make(unsigned char *Buffer, unsigned char size)
{
unsigned int Cur_CRC_Value;
unsigned char i,j;
Cur_CRC_Value = PRESET_VALUE;
for(i = 0x00; i < size; i++)
{
Cur_CRC_Value ^= *Buffer++;
for(j = 0x00; j < 8; j++)
{
if(Cur_CRC_Value & 0x0001)
{
Cur_CRC_Value = (Cur_CRC_Value >> 1) ^ POLYNOMINAL;
}
else
{
Cur_CRC_Value = (Cur_CRC_Value >> 1);
}
}
}
return Cur_CRC_Value;
}