#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); } void Variable_Init(void) { } static uint8_t 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_KB_QIAN: uart_buf[5] = 0x12; break; case KEY_KB_HOU: uart_buf[5] = 0x14; break; case KEY_HG_QIAN: uart_buf[5] = 0x16; break; case KEY_HG_HOU: uart_buf[5] = 0x18; break; case KEY_TT_SHENG: uart_buf[5] = 0x22; break; case KEY_TT_JIANG: uart_buf[5] = 0x24; break; case KEY_AM: uart_buf[4] = motor_state?0x0a:0x0b; break; case KEY_FAN: uart_buf[3] = fan_state + 0x03; break; case KEY_HEAT: uart_buf[3] = (heat_state + 0x03) << 4; 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]; } 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; #ifdef USE_DAPING uint16_t crc,crcRx; if (len <= 7) { return; } crc = crc16_make(Rxdata,len-2); crcRx = Rxdata[len-1]; crcRx <<= 8; crcRx |= Rxdata[len-2]; if (crc == crcRx) { if (Rxdata[2] == 0x60)//加热 { switch (Rxdata[5]) { case 1: heat_state = 0; fan_state = 0; break; case 2: heat_state = 3; fan_state = 0; break; case 3: heat_state = 2; fan_state = 0; break; case 4: heat_state = 1; fan_state = 0; break; default: break; } } else if(Rxdata[2] == 0x50)//fan { switch (Rxdata[5]) { case 1: fan_state = 0; heat_state = 0; break; case 2: fan_state = 3; heat_state = 0; break; case 3: fan_state = 2; heat_state = 0; break; case 4: fan_state = 1; heat_state = 0; break; default: break; } } } #else //不用大屏协议 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 = 1; fan_state = 0; break; case 0x70: heat_state = 2; fan_state = 0; break; case 0x80: heat_state = 3; fan_state = 0; break; case 0x01: fan_state = 0; heat_state = 0; break; case 0x02: fan_state = 1; heat_state = 0; break; case 0x07: fan_state = 2; heat_state = 0; break; case 0x08: fan_state = 3; heat_state = 0; break; default: break; } switch (Rxdata[1]) { case 0x0C: motor_state = 1; break; case 0x0D: motor_state = 0; break; default: break; } } #endif RxFlag = 0; RxTimeoutCount = 0; datacount = 0; } void keyLogic(uint8_t keyno) { switch (keyno) { case KEY_AM: if (motor_state == 0) { motor_state = 1; } else { motor_state = 0; } break; case KEY_HEAT: heat_state++; if (heat_state > 3) { heat_state = 0; } fan_state = 0; break; case KEY_FAN: fan_state++; if (fan_state > 3) { fan_state = 0; } heat_state = 0; break; default: break; } UART_Tx_Pro(keyno); } #define KEY_DELAY_TIME 6 void keyScan(void)//5ms { static uint16_t keydelay[9]={0,0,0,0,0,0,0,0,0}; static uint8_t keyflag[9]={0,0,0,0,0,0,0,0,0}; static uint8_t keep_count[9]={0,0,0,0,0,0,0,0,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; } } //持续发送 for (i = 0; i < 6; i++) { if (keyflag[i] == 1) { keep_count[i]++; if (keep_count[i] > 20) { keep_count[i] = 0; keyLogic(i); break; } } else { keep_count[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; /* LED_Ctrl1LED(ledno,LED_ON); LED_Ctrl1LED(last,LED_OFF); last = ledno; ledno++; if (ledno > 9) { ledno = 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; }