RP-77A/cva_asw_m0128/src/hod/hod_touchonly_20ms.c
2024-12-27 14:26:13 +08:00

212 lines
7.3 KiB
C

#include "hod.h"
volatile uint8_t g_touchIrqFlag = 0;
volatile uint32_t g_touch_state = 0;
static TouchDrvType touchDrv;
#define HEAT_HIGH_SIDE_INIT() PinsDrv_SetMuxModeSel(hod_high_side1_pin.port, hod_high_side1_pin.pin, PINSDRV_MUX_AS_GPIO);PinsDrv_SetPinDirection(hod_high_side1_pin.port, hod_high_side1_pin.pin, 1)
#define HEAT_HIGH_SIDE_ON() PinsDrv_SetPin(hod_high_side1_pin.port, hod_high_side1_pin.pin)
#define HEAT_HIGH_SIDE_OFF() PinsDrv_ClearPin(hod_high_side1_pin.port, hod_high_side1_pin.pin)
#define HEAT_HIGH_SIDE2_INIT() PinsDrv_SetMuxModeSel(hod_high_side2_pin.port, hod_high_side2_pin.pin, PINSDRV_MUX_AS_GPIO);PinsDrv_SetPinDirection(hod_high_side2_pin.port, hod_high_side2_pin.pin, 1)
#define HEAT_HIGH_SIDE2_ON() PinsDrv_SetPin(hod_high_side2_pin.port, hod_high_side2_pin.pin)
#define HEAT_HIGH_SIDE2_OFF() PinsDrv_ClearPin(hod_high_side2_pin.port, hod_high_side2_pin.pin)
#define HEAT_LOW_SIDE_INIT() PinsDrv_SetMuxModeSel(hod_low_side_pin.port, hod_low_side_pin.pin, PINSDRV_MUX_AS_GPIO);PinsDrv_SetPinDirection(hod_low_side_pin.port, hod_low_side_pin.pin, 1)
#define HEAT_LOW_SIDE_ON() PinsDrv_SetPin(hod_low_side_pin.port, hod_low_side_pin.pin)
#define HEAT_LOW_SIDE_OFF() PinsDrv_ClearPin(hod_low_side_pin.port, hod_low_side_pin.pin)
#define HEAT_SHD_INIT() PinsDrv_SetMuxModeSel(hod_heat_shd_pin.port, hod_heat_shd_pin.pin, PINSDRV_MUX_AS_GPIO);PinsDrv_SetPinDirection(hod_heat_shd_pin.port, hod_heat_shd_pin.pin, 1)
#define HEAT_SHD_ON() PinsDrv_ClearPin(hod_heat_shd_pin.port, hod_heat_shd_pin.pin)
#define HEAT_SHD_OFF() PinsDrv_SetPin(hod_heat_shd_pin.port, hod_heat_shd_pin.pin)
static uint32_t hod_init_ticks = 0;
static uint32_t hod_init_idx = 0;
bool hod_init(uint32_t ticks)
{
bool ret = false;
if (hod_init_ticks != ticks)
{
hod_init_ticks = ticks;
switch (hod_init_idx)
{
case 0:
HEAT_HIGH_SIDE_INIT();
HEAT_HIGH_SIDE2_INIT();
HEAT_LOW_SIDE_INIT();
HEAT_SHD_INIT();
HEAT_HIGH_SIDE_OFF();
HEAT_HIGH_SIDE2_OFF();
HEAT_LOW_SIDE_OFF();
HEAT_SHD_ON();
break;
case 5:
/* Initialize touch */
PinsDrv_SetMuxModeSel(hod_sensor_pin.port, hod_sensor_pin.pin, PINSDRV_PIN_DISABLED);
PinsDrv_SetMuxModeSel(hod_shd_pin.port, hod_shd_pin.pin, PINSDRV_PIN_DISABLED);
ButtonDrv_Init(NULL, &g_button_cfg);
TouchDrv_Init(&touchDrv);
TouchDrv_Configure(&touchDrv, &g_touchCfg);
TouchDrv_Calibration(&touchDrv, 8192);
TouchDrv_CleanIrqState(&touchDrv);
g_touchIrqFlag = 0;
NVIC_EnableIRQ(TOUCH_IRQn);
break;
case 1000:
ret = true;
break;
default:
break;
}
hod_init_idx++;
}
if (ret == true)
{
hod_init_ticks = 0;
hod_init_idx = 0;
}
return ret;
}
void TOUCH_Handler(void)
{
TouchDrv_CleanIrqState(&touchDrv);
g_touchIrqFlag = 1;
}
volatile static uint32_t hod_task_main_idx = 0;
volatile static uint32_t hod_task_sub_idx = 0;
volatile static uint32_t hod_task_last_ticks = 0;
volatile static uint32_t hod_task_heating_idx = 0;
void hod_task(uint32_t ticks)
{
TouchDrv_InfoType info = {0};
int16_t raw [TOUCH_SCAN_PHASE_NUM] = {0};
int16_t base[TOUCH_SCAN_PHASE_NUM] = {0};
int16_t diff[TOUCH_SCAN_PHASE_NUM] = {0};
if (hod_task_last_ticks != ticks)
{
hod_task_last_ticks = ticks;
if (hod_task_main_idx == 0)
{
hod_task_heating_idx++;
switch (hod_task_sub_idx)
{
case 0:
TouchDrv_Start(&touchDrv, TOUCHDRV_AUTO_MODE);
hod_task_sub_idx++;
break;
case 1:
if (g_touchIrqFlag) hod_task_sub_idx++;
break;
case 2:
TouchDrv_Stop(&touchDrv);
info.irqState = TouchDrv_GetIrqState(&touchDrv);
info.proxState = TouchDrv_GetProxState(&touchDrv);
TouchDrv_GetRawdata(&touchDrv, 0, APP_TOUCH_SCAN_PHASE_NUM, raw);
info.raw = raw;
info.base = base;
info.diff = diff;
ButtonDrv_Process(NULL, &info);
if (ButtonDrv_GetButtonEvent(NULL, 0) == BUTTON_STATE_ON)
{
if (g_touch_state == 0)
{
hod_touch_on_cb();
}
g_touch_state = 1;
}
else if (ButtonDrv_GetButtonEvent(NULL, 0) == BUTTON_STATE_OFF)
{
if (g_touch_state == 1)
{
hod_touch_off_cb();
}
g_touch_state = 0;
}
raw[0] = ButtonDrv_GetButtonElemRawData(NULL, 0, 0);
base[0] = ButtonDrv_GetButtonElemBaseData(NULL, 0, 0);
diff[0] = ButtonDrv_GetButtonElemDiffData(NULL, 0, 0);
hod_upload_info_cb(raw[0], base[0], diff[0]);
break;
default:
break;
}
if (hod_task_heating_idx >= 10 && hod_task_sub_idx == 2)//hod speed 20ms,50hz;10ms==100hz(>=10)
{
hod_task_heating_idx = 0;
hod_task_sub_idx = 0;
hod_task_main_idx = heating > 0 ? 1 : 0;
}
}
else
{
switch (hod_task_sub_idx)
{
case 3:
HEAT_SHD_OFF();
break;
case 6:
HEAT_LOW_SIDE_ON();
break;
case 9:
if (heating > 0)
{
HEAT_HIGH_SIDE2_ON();
}
break;
case 12:
if (heating > 0)
{
HEAT_HIGH_SIDE_ON();
}
break;
case 100:
HEAT_HIGH_SIDE_OFF();
break;
case 103:
HEAT_HIGH_SIDE2_OFF();
break;
case 106:
HEAT_LOW_SIDE_OFF();
break;
case 109:
HEAT_SHD_ON();
break;
case 112:
hod_task_sub_idx = 0;
hod_task_main_idx = 0;
hod_task_heating_idx = 0;
break;
default:
if (hod_task_sub_idx > 15
&& hod_task_sub_idx > hod_heating_duty
&& hod_task_sub_idx < 100)
{
hod_task_heating_idx++;
if (hod_task_heating_idx == 3)
{
HEAT_HIGH_SIDE_OFF();
}
else if (hod_task_heating_idx == 6)
{
HEAT_HIGH_SIDE2_OFF();
}
}
break;
}
if (hod_task_main_idx == 1) hod_task_sub_idx++;
}
}
}