1.将A27新UI文件夹重命名为CANUI 2.A272O新版本发布
This commit is contained in:
@ -0,0 +1,251 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "FreeRTOS.h"
|
||||
#include "chip.h"
|
||||
#include "board.h"
|
||||
#include "keypad.h"
|
||||
|
||||
#if !defined(VG_ONLY) && !defined(AWTK)
|
||||
#include "lvgl/lvgl.h"
|
||||
#else
|
||||
typedef int16_t lv_coord_t;
|
||||
typedef uint8_t lv_indev_state_t;
|
||||
typedef struct {
|
||||
lv_coord_t x;
|
||||
lv_coord_t y;
|
||||
} lv_point_t;
|
||||
|
||||
enum { LV_INDEV_STATE_REL = 0, LV_INDEV_STATE_PR };
|
||||
|
||||
enum {
|
||||
LV_KEY_UP = 17, /*0x11*/
|
||||
LV_KEY_DOWN = 18, /*0x12*/
|
||||
LV_KEY_RIGHT = 19, /*0x13*/
|
||||
LV_KEY_LEFT = 20, /*0x14*/
|
||||
LV_KEY_ESC = 27, /*0x1B*/
|
||||
LV_KEY_DEL = 127, /*0x7F*/
|
||||
LV_KEY_BACKSPACE = 8, /*0x08*/
|
||||
LV_KEY_ENTER = 10, /*0x0A, '\n'*/
|
||||
LV_KEY_NEXT = 9, /*0x09, '\t'*/
|
||||
LV_KEY_PREV = 11, /*0x0B, '*/
|
||||
LV_KEY_HOME = 2, /*0x02, STX*/
|
||||
LV_KEY_END = 3, /*0x03, ETX*/
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/
|
||||
uint32_t key; /**< For LV_INDEV_TYPE_KEYPAD the currently pressed key*/
|
||||
uint32_t btn_id; /**< For LV_INDEV_TYPE_BUTTON the currently pressed button*/
|
||||
int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/
|
||||
|
||||
lv_indev_state_t state; /**< LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/
|
||||
} lv_indev_data_t;
|
||||
#endif
|
||||
|
||||
#define KEYAD_1 10
|
||||
#define KEYAD_2 530
|
||||
#define KEYAD_3 1150
|
||||
#define KEYAD_4 1665
|
||||
#define KEYAD_5 2278
|
||||
#define KEYAD_6 2845
|
||||
#define KEYAD_7 3372
|
||||
#define KEYAD_NUM 7
|
||||
|
||||
#define KEYAD_RANGE 10
|
||||
|
||||
|
||||
static int KeyAdcValue[KEYAD_NUM] =
|
||||
{
|
||||
KEYAD_1,
|
||||
KEYAD_2,
|
||||
KEYAD_3,
|
||||
KEYAD_4,
|
||||
KEYAD_5,
|
||||
KEYAD_6,
|
||||
KEYAD_7,
|
||||
};
|
||||
|
||||
static unsigned int KeypadMap[KEYAD_NUM] =
|
||||
{
|
||||
LV_KEY_HOME,
|
||||
LV_KEY_ENTER,
|
||||
LV_KEY_ESC,
|
||||
LV_KEY_UP,
|
||||
LV_KEY_DOWN,
|
||||
LV_KEY_LEFT,
|
||||
LV_KEY_RIGHT,
|
||||
};
|
||||
|
||||
#define NULL_KEY 0xFFFF
|
||||
#define KEY_STATE_IDLE 0
|
||||
#define KEY_STATE_START 1
|
||||
#define KEY_STATE_PRESS 2
|
||||
|
||||
static UINT32 lg_ulKeyMachineState = KEY_STATE_IDLE;
|
||||
static UINT32 lg_ulLastKey = NULL_KEY;
|
||||
|
||||
#define KEY_POOL_SIZE 8
|
||||
static UINT32 lg_arrKeyAvgPool[KEY_POOL_SIZE];
|
||||
static UINT32 lg_ulKeyIndex = 0;
|
||||
|
||||
extern void SendKeypadInputEventFromISR(lv_indev_data_t *indata);
|
||||
|
||||
static void PushKeyToAVGPool(UINT32 ulKeyValue)
|
||||
{
|
||||
if(lg_ulKeyIndex < KEY_POOL_SIZE)
|
||||
{
|
||||
lg_arrKeyAvgPool[lg_ulKeyIndex] = ulKeyValue;
|
||||
lg_ulKeyIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
static UINT32 AVGPoolIsFull(void)
|
||||
{
|
||||
return lg_ulKeyIndex == KEY_POOL_SIZE;
|
||||
}
|
||||
|
||||
static UINT32 GetKeyAVGValue(void)
|
||||
{
|
||||
UINT32 i;
|
||||
UINT32 ulSum;
|
||||
|
||||
ulSum = 0;
|
||||
for(i=0;i<lg_ulKeyIndex;i++)
|
||||
{
|
||||
ulSum += lg_arrKeyAvgPool[i];
|
||||
}
|
||||
|
||||
return ulSum/lg_ulKeyIndex;
|
||||
}
|
||||
|
||||
|
||||
static void ResetKeyAVGPool(void)
|
||||
{
|
||||
lg_ulKeyIndex = 0;
|
||||
}
|
||||
|
||||
|
||||
static UINT32 CheckKey(UINT32 ulSampleValue)
|
||||
{
|
||||
UINT32 i;
|
||||
|
||||
for(i = 0; i < (sizeof(KeyAdcValue) / sizeof(KeyAdcValue[0])); i++ )
|
||||
{
|
||||
if((ulSampleValue >= KeyAdcValue[i] - KEYAD_RANGE) && (ulSampleValue <= KeyAdcValue[i] + KEYAD_RANGE))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL_KEY;
|
||||
}
|
||||
|
||||
static void SendKeyPress(UINT32 key)
|
||||
{
|
||||
lv_indev_data_t indata = {0};
|
||||
indata.key = key;
|
||||
indata.state = LV_INDEV_STATE_PR;
|
||||
SendKeypadInputEventFromISR(&indata);
|
||||
}
|
||||
|
||||
static void SendKeyRelease(UINT32 key)
|
||||
{
|
||||
lv_indev_data_t indata = {0};
|
||||
indata.key = key;
|
||||
indata.state = LV_INDEV_STATE_REL;
|
||||
SendKeypadInputEventFromISR(&indata);
|
||||
}
|
||||
extern char key_value;
|
||||
void KeyEventHandler(UINT32 ulEvent, UINT32 lpParam, UINT32 wParam)
|
||||
{
|
||||
switch(lg_ulKeyMachineState)
|
||||
{
|
||||
case KEY_STATE_IDLE:
|
||||
if(ulEvent == KEY_START_EVENT)
|
||||
{
|
||||
lg_ulKeyMachineState = KEY_STATE_START;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_STATE_START:
|
||||
key_value = !key_value;
|
||||
if(ulEvent == KEY_SAMPLE_EVENT)
|
||||
{
|
||||
ResetKeyAVGPool();
|
||||
PushKeyToAVGPool(lpParam);
|
||||
lg_ulKeyMachineState = KEY_STATE_PRESS;
|
||||
}
|
||||
else if(ulEvent == KEY_STOP_EVENT)
|
||||
{
|
||||
lg_ulKeyMachineState = KEY_STATE_IDLE;
|
||||
lg_ulLastKey = NULL_KEY;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_STATE_PRESS:
|
||||
if(ulEvent == KEY_SAMPLE_EVENT)
|
||||
{
|
||||
PushKeyToAVGPool(lpParam);
|
||||
if(AVGPoolIsFull())
|
||||
{
|
||||
UINT32 ulKeySampleValue;
|
||||
UINT32 ulNewKeyCode;
|
||||
|
||||
ulKeySampleValue = GetKeyAVGValue();
|
||||
ulNewKeyCode = CheckKey(ulKeySampleValue);
|
||||
ResetKeyAVGPool();
|
||||
|
||||
if(ulNewKeyCode != NULL_KEY)
|
||||
{
|
||||
if(lg_ulLastKey != ulNewKeyCode && lg_ulLastKey != NULL_KEY)
|
||||
{
|
||||
lg_ulKeyMachineState = KEY_STATE_IDLE;
|
||||
//send key release event;
|
||||
SendKeyRelease(KeypadMap[lg_ulLastKey]);
|
||||
lg_ulLastKey = NULL_KEY;
|
||||
}
|
||||
else if (lg_ulLastKey == ulNewKeyCode)
|
||||
{
|
||||
//Send repeat key event;
|
||||
SendKeyPress(KeypadMap[lg_ulLastKey]);
|
||||
}
|
||||
else if (lg_ulLastKey == NULL_KEY)
|
||||
{
|
||||
//Send key press event;
|
||||
SendKeyPress(KeypadMap[ulNewKeyCode]);
|
||||
}
|
||||
lg_ulLastKey = ulNewKeyCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
lg_ulKeyMachineState = KEY_STATE_IDLE;
|
||||
if(lg_ulLastKey != NULL_KEY)
|
||||
{
|
||||
//send key release event
|
||||
SendKeyRelease(KeypadMap[lg_ulLastKey]);
|
||||
lg_ulLastKey = NULL_KEY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(ulEvent == KEY_STOP_EVENT)
|
||||
{
|
||||
lg_ulKeyMachineState = KEY_STATE_IDLE;
|
||||
if(lg_ulLastKey != NULL_KEY)
|
||||
{
|
||||
//send key release event
|
||||
SendKeyRelease(KeypadMap[lg_ulLastKey]);
|
||||
lg_ulLastKey = NULL_KEY;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void KeypadInit(void)
|
||||
{
|
||||
adc_channel_enable(ADC_CH_AUX0);
|
||||
}
|
Reference in New Issue
Block a user