#ifndef __CD4051_H_
#define __CD4051_H_

#include "TYW_stdint.h"

#define CD4051B_A_MCU CD4051A_A_MCU_OUT
#define CD4051B_B_MCU CD4051A_B_MCU_OUT
#define CD4051B_C_MCU CD4051A_C_MCU_OUT

#define CD4051B_InputGOIO_Com1 CD4051A_COM1_MCU_IN
#define CD4051B_InputGOIO_Com2 CD4051A_COM2_MCU_IN
#define CD4051B_InputGOIO_Com3 CD4051A_COM3_MCU_IN
#define CD4051B_InputGOIO_Com4 CD4051A_COM4_MCU_IN
#define CD4051B_InputGOIO_Com5 CD4051A_COM5_MCU_IN
#define CD4051B_InputGOIO_Com6 CD4051A_COM6_MCU_IN
#define CD4051B_InputGOIO_Com7 CD4051A_COM7_MCU_IN

#define CD4051B_DEBOUNCE_High_TIME 200u
#define CD4051B_DEBOUNCE_Low_TIME 200u
#define CD4051B_DEBOUNCE_High_CNT CD4051B_DEBOUNCE_High_TIME / 20u
#define CD4051B_DEBOUNCE_Low_CNT CD4051B_DEBOUNCE_Low_TIME / 20u
/*通道枚举*/
typedef enum
{
    Channel0 = 0u,
    Channel1,
    Channel2,
    Channel3,
    Channel4,
    Channel5,
    Channel6,
    Channel7,
    MaxChannel,
} CD4051BChannel;
typedef enum
{
    COM1 = 0u,
    COM2,
    COM3,
    COM4,
    COM5,
    COM6,
    COM7,
    COMTotal,
} CD4051B_COMNumber;
/*结构体*/
typedef struct
{
    uint16_t time;
    uint16_t Last;
} CD4051CtrStruct;

extern uint16_t CD4051B_GeneralCOM_Cache[COMTotal][MaxChannel];
extern uint16_t CD4051B_GeneralCOM_Value[COMTotal][MaxChannel];
//-----------------外部应用需要时调用----------------------
/*COM1映射PCB*/
#define CD4051_COM1_X0_IN (CD4051B_GeneralCOM_Value[COM1][Channel0]) /*A36 - 0*/
#define CD4051_COM1_X1_IN (CD4051B_GeneralCOM_Value[COM1][Channel1]) /*    - 0*/
#define CD4051_COM1_X2_IN (CD4051B_GeneralCOM_Value[COM1][Channel2]) /*    - 1*/
#define CD4051_COM1_X3_IN (CD4051B_GeneralCOM_Value[COM1][Channel3]) /*A34 - 1*/
#define CD4051_COM1_X4_IN (CD4051B_GeneralCOM_Value[COM1][Channel4]) /*A21 - 1*/
#define CD4051_COM1_X5_IN (CD4051B_GeneralCOM_Value[COM1][Channel5]) /*A25 - 0*/
#define CD4051_COM1_X6_IN (CD4051B_GeneralCOM_Value[COM1][Channel6]) /*A22 - 1*/
#define CD4051_COM1_X7_IN (CD4051B_GeneralCOM_Value[COM1][Channel7]) /*A23 - 1*/
/*COM2映射PCB*/
#define CD4051_COM2_X0_IN (CD4051B_GeneralCOM_Value[COM2][Channel0]) /*A31 - 1*/
#define CD4051_COM2_X1_IN (CD4051B_GeneralCOM_Value[COM2][Channel1]) /*A32 - 1*/
#define CD4051_COM2_X2_IN (CD4051B_GeneralCOM_Value[COM2][Channel2]) /*A33 - 1*/
#define CD4051_COM2_X3_IN (CD4051B_GeneralCOM_Value[COM2][Channel3]) /*A30 - 1*/
#define CD4051_COM2_X4_IN (CD4051B_GeneralCOM_Value[COM2][Channel4]) /*A26 - 0*/
#define CD4051_COM2_X5_IN (CD4051B_GeneralCOM_Value[COM2][Channel5]) /*A29 - 0*/
#define CD4051_COM2_X6_IN (CD4051B_GeneralCOM_Value[COM2][Channel6]) /*A27 - 0*/
#define CD4051_COM2_X7_IN (CD4051B_GeneralCOM_Value[COM2][Channel7]) /*A28 - 1*/
/*COM3映射PCB*/
#define CD4051_COM3_X0_IN (CD4051B_GeneralCOM_Value[COM3][Channel0]) /*A19 - 0*/
#define CD4051_COM3_X1_IN (CD4051B_GeneralCOM_Value[COM3][Channel1]) /*B19 - 0*/
#define CD4051_COM3_X2_IN (CD4051B_GeneralCOM_Value[COM3][Channel2]) /*B18 - 0*/
#define CD4051_COM3_X3_IN (CD4051B_GeneralCOM_Value[COM3][Channel3]) /*A15 - 0*/
#define CD4051_COM3_X4_IN (CD4051B_GeneralCOM_Value[COM3][Channel4]) /*A10 - 1*/
#define CD4051_COM3_X5_IN (CD4051B_GeneralCOM_Value[COM3][Channel5]) /*A20 - 1*/
#define CD4051_COM3_X6_IN (CD4051B_GeneralCOM_Value[COM3][Channel6]) /*A06 - 0*/
#define CD4051_COM3_X7_IN (CD4051B_GeneralCOM_Value[COM3][Channel7]) /*A03 - 0*/
/*COM4映射PCB*/
#define CD4051_COM4_X0_IN (CD4051B_GeneralCOM_Value[COM4][Channel0]) /*B35 - 0*/
#define CD4051_COM4_X1_IN (CD4051B_GeneralCOM_Value[COM4][Channel1]) /*B34 - 0*/
#define CD4051_COM4_X2_IN (CD4051B_GeneralCOM_Value[COM4][Channel2]) /*B33 - 1*/
#define CD4051_COM4_X3_IN (CD4051B_GeneralCOM_Value[COM4][Channel3]) /*B36 - 0*/
#define CD4051_COM4_X4_IN (CD4051B_GeneralCOM_Value[COM4][Channel4]) /*B20 - 0*/
#define CD4051_COM4_X5_IN (CD4051B_GeneralCOM_Value[COM4][Channel5]) /*B37 - 0*/
#define CD4051_COM4_X6_IN (CD4051B_GeneralCOM_Value[COM4][Channel6]) /*B40 - 1*/
#define CD4051_COM4_X7_IN (CD4051B_GeneralCOM_Value[COM4][Channel7]) /*B38 - 1*/
/*COM5映射PCB*/
#define CD4051_COM5_X0_IN (CD4051B_GeneralCOM_Value[COM5][Channel0]) /*B23 - 0*/
#define CD4051_COM5_X1_IN (CD4051B_GeneralCOM_Value[COM5][Channel1]) /*B22 - 0*/
#define CD4051_COM5_X2_IN (CD4051B_GeneralCOM_Value[COM5][Channel2]) /*B21 - 0*/
#define CD4051_COM5_X3_IN (CD4051B_GeneralCOM_Value[COM5][Channel3]) /*B24 - 0*/
#define CD4051_COM5_X4_IN (CD4051B_GeneralCOM_Value[COM5][Channel4]) /*B32 - 1*/
#define CD4051_COM5_X5_IN (CD4051B_GeneralCOM_Value[COM5][Channel5]) /*B26 - 0*/
#define CD4051_COM5_X6_IN (CD4051B_GeneralCOM_Value[COM5][Channel6]) /*B31 - 1*/
#define CD4051_COM5_X7_IN (CD4051B_GeneralCOM_Value[COM5][Channel7]) /*B30 - 0*/
/*COM6映射PCB*/
#define CD4051_COM6_X0_IN (CD4051B_GeneralCOM_Value[COM6][Channel0]) /*B06 - 1*/
#define CD4051_COM6_X1_IN (CD4051B_GeneralCOM_Value[COM6][Channel1]) /*B07 - 0*/
#define CD4051_COM6_X2_IN (CD4051B_GeneralCOM_Value[COM6][Channel2]) /*B08 - 0*/
#define CD4051_COM6_X3_IN (CD4051B_GeneralCOM_Value[COM6][Channel3]) /*B05 - 1*/
#define CD4051_COM6_X4_IN (CD4051B_GeneralCOM_Value[COM6][Channel4]) /*B01 - 0*/
#define CD4051_COM6_X5_IN (CD4051B_GeneralCOM_Value[COM6][Channel5]) /*B04 - 0*/
#define CD4051_COM6_X6_IN (CD4051B_GeneralCOM_Value[COM6][Channel6]) /*B02 - 0*/
#define CD4051_COM6_X7_IN (CD4051B_GeneralCOM_Value[COM6][Channel7]) /*B03 - 1*/
/*COM7映射PCB*/
#define CD4051_COM7_X0_IN (CD4051B_GeneralCOM_Value[COM7][Channel0]) /*B15 - 1*/
#define CD4051_COM7_X1_IN (CD4051B_GeneralCOM_Value[COM7][Channel1]) /*B16 - 0*/
#define CD4051_COM7_X2_IN (CD4051B_GeneralCOM_Value[COM7][Channel2]) /*B17 - 0*/
#define CD4051_COM7_X3_IN (CD4051B_GeneralCOM_Value[COM7][Channel3]) /*B14 - 0*/
#define CD4051_COM7_X4_IN (CD4051B_GeneralCOM_Value[COM7][Channel4]) /*B10 - 0*/
#define CD4051_COM7_X5_IN (CD4051B_GeneralCOM_Value[COM7][Channel5]) /*B13 - 0*/
#define CD4051_COM7_X6_IN (CD4051B_GeneralCOM_Value[COM7][Channel6]) /*B11 - 0*/
#define CD4051_COM7_X7_IN (CD4051B_GeneralCOM_Value[COM7][Channel7]) /*B12 - 0*/

/******************************************************************************
函数
******************************************************************************/
extern void CD4051B_KL15Init(void);
extern void CD4051B_ChannelSet(CD4051BChannel Ch);
extern CD4051BChannel CD4051B_ChannelGet(void);
extern void CD4051B_ReadSignal_Serviece(void);
extern void CD4051B_Debounce_Service(void);
extern uint16_t CD4051B_GetComValue(uint8_t num, uint8_t ch);

#endif
