BLSJ/bl_fc/appTask.c

299 lines
5.3 KiB
C
Raw Normal View History

2025-01-17 15:39:34 +08:00
#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"
void KeyPressPro(uint8_t keyno);
void KeyReleasePro(uint8_t keyno);
static uint8_t autoflag = 0;
static uint8_t updown = 0,stopflag = 0;
static uint16_t keydelay[5]={0,0,0,0,0};
static uint8_t keyflag[5]={0,0,0,0,0};
static uint8_t shoudong = 0;
#define UPDOWN_UP 1
#define UPDOWN_DOWN 2
#define UPDOWN_NO 0
#define KEY_DELAY_TIME 6
#define KEY_DELAY_TIME_50ms 10
#define KEY_DELAY_TIME_8000ms 1600
uint8_t shortflag;
void HardWare_Init(void)
{
//time base init
R_TAU0_Channel0_Start();
//output init
RLY1_Ctrl(OFF);
RLY2_Ctrl(OFF);
MOS_Ctrl(OFF);
//adc init
R_ADC_Start();
R_ADC_Set_OperationOn();
R_TAU0_Channel1_Start();//for adc scan
}
void Variable_Init(void)
{
autoflag = 0;
updown = 0;
shortflag = 1;
}
void KeyPressPro(uint8_t keyno)
{
if(autoflag != UPDOWN_NO)
{
autoflag = 0;
shoudong = keyno+1;
return;
}
if (keyno == KEY_UP || keyno == KEY_L_UP)
{
updown = UPDOWN_UP;
}
else if (keyno == KEY_DOWN || keyno == KEY_L_DOWN)
{
updown = UPDOWN_DOWN;
}
}
void KeyReleasePro(uint8_t keyno)
{
if (keyno+1 == shoudong)
{
shoudong = 0;
return;
}
switch (keyno)
{
case KEY_UP:
//NO
break;
case KEY_DOWN:
if (keydelay[KEY_AUTO]>=KEY_DELAY_TIME_50ms && keydelay[KEY_AUTO] < KEY_DELAY_TIME_8000ms && shortflag == 0)
{
autoflag = UPDOWN_DOWN;
}
break;
default:
break;
}
}
void keyScan(void)//5ms
{
uint8_t i;
for (i = 0; i < 4; i++)
{
if (GetKeyState(i) == KEY_PRESSED)
{
keydelay[i]++;
if (keydelay[i] > KEY_DELAY_TIME)
{
keydelay[i] = KEY_DELAY_TIME;
if (keyflag[i] == 0)
{
keyflag[i] = 1;
KeyPressPro(i);
}
}
}
else
{
if (keydelay[i] > 0)
{
keydelay[i]--;
if (keydelay[i] == 0 && keyflag[i] == 1)//减到0且按下过
{
keyflag[i] = 0;
KeyReleasePro(i);
}
}
}
}
if (keyflag[KEY_UP] == 0 && keyflag[KEY_DOWN] == 0 && keyflag[KEY_L_UP] == 0 && keyflag[KEY_L_DOWN] == 0)
{
updown = 0;
stopflag = 0;
shoudong = 0;
shortflag = 0;
}
if (GetKeyState(KEY_AUTO) == KEY_PRESSED)
{
keydelay[KEY_AUTO]++;
if (keydelay[KEY_AUTO] >= 2000)
{
keydelay[KEY_AUTO] = 2000;
}
}
else
{
if (keyflag[KEY_UP]==0 && keyflag[KEY_DOWN]==0)
{
keydelay[KEY_AUTO] = 0;
}
}
}
#define MOTOR_NONE 0
#define MOTOR_UP 1
#define MOTOR_DOWN 2
#define MOTOR_BREAK 3
void Motor_Ctrl(uint8_t state)
{
switch (state)
{
case MOTOR_UP:
RLY2_Ctrl(ON);
RLY1_Ctrl(OFF);
MOS_Ctrl(ON);
break;
case MOTOR_DOWN:
RLY2_Ctrl(OFF);
RLY1_Ctrl(ON);
MOS_Ctrl(ON);
break;
case MOTOR_BREAK:
RLY1_Ctrl(ON);
RLY2_Ctrl(ON);
MOS_Ctrl(ON);
break;
default:
RLY1_Ctrl(OFF);
RLY2_Ctrl(OFF);
MOS_Ctrl(OFF);
break;
}
}
#define OC_9A 21
#define OC_13A 30
#define OC_6A 12
extern uint16_t g_adcval;
void Output_Ctrl(void)//10mS
{
static uint16_t autotime=0;
static uint8_t oc_delay = 0;
if (g_adcval > OC_9A)
{
oc_delay++;
if (oc_delay > 20)//200 ms
{
Motor_Ctrl(MOTOR_NONE);
shortflag = 1;
}
}
else
{
oc_delay = 0;
}
if (shortflag == 1)
{
autoflag = 0;
Motor_Ctrl(MOTOR_NONE);
return;
}
if (stopflag == 1)
{
Motor_Ctrl(MOTOR_NONE);
return;
}
if (updown == UPDOWN_UP)
{
Motor_Ctrl(MOTOR_UP);
autotime++;
}
else if (updown == UPDOWN_DOWN)
{
Motor_Ctrl(MOTOR_DOWN);
autotime++;
}
else
{
if (autoflag == UPDOWN_DOWN)
{
Motor_Ctrl(MOTOR_DOWN);
autotime++;
}
else
{
Motor_Ctrl(MOTOR_NONE);
autotime = 0;
}
}
if (autotime > 800)//8s
{
Motor_Ctrl(MOTOR_NONE);
autotime = 0;
autoflag = 0;
stopflag = 1;
}
}
void AppTask(void)
{
static uint8_t ledno = 1,last = 0;
if (TimeBase5msFlag == 1)
{
TimeBase5msFlag = 0;
keyScan();
}
if (TimeBase10msFlag == 1)
{
TimeBase10msFlag = 0;
Output_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;
}
*/
}
}